Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions agent/api/task/task.go
Original file line number Diff line number Diff line change
Expand Up @@ -1945,13 +1945,15 @@ func (task *Task) dockerHostConfig(container *apicontainer.Container, dockerCont

resources := task.getDockerResources(container, cfg)

supplementaryGroups := task.getSupplementaryGroups(container)
// Populate hostConfig
hostConfig := &dockercontainer.HostConfig{
Links: dockerLinkArr,
Binds: binds,
PortBindings: dockerPortMap,
VolumesFrom: volumesFrom,
Resources: resources,
GroupAdd: supplementaryGroups,
}

if err := task.overrideContainerRuntime(container, hostConfig, cfg); err != nil {
Expand Down
32 changes: 29 additions & 3 deletions agent/api/task/task_linux.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,19 +19,22 @@ package task
import (
"fmt"
"path/filepath"
"strconv"
"time"

"github.com/aws/amazon-ecs-agent/ecs-agent/logger"
"github.com/aws/amazon-ecs-agent/ecs-agent/logger/field"

apicontainer "github.com/aws/amazon-ecs-agent/agent/api/container"
"github.com/aws/amazon-ecs-agent/agent/config"
"github.com/aws/amazon-ecs-agent/agent/ecscni"
"github.com/aws/amazon-ecs-agent/agent/taskresource"
"github.com/aws/amazon-ecs-agent/agent/taskresource/cgroup"
resourcestatus "github.com/aws/amazon-ecs-agent/agent/taskresource/status"
resourcetype "github.com/aws/amazon-ecs-agent/agent/taskresource/types"
taskresourcevolume "github.com/aws/amazon-ecs-agent/agent/taskresource/volume"
apicontainerstatus "github.com/aws/amazon-ecs-agent/ecs-agent/api/container/status"
"github.com/aws/amazon-ecs-agent/ecs-agent/credentials"
"github.com/aws/amazon-ecs-agent/ecs-agent/daemonimages/csidriver/util"
"github.com/aws/amazon-ecs-agent/ecs-agent/logger"
"github.com/aws/amazon-ecs-agent/ecs-agent/logger/field"
ni "github.com/aws/amazon-ecs-agent/ecs-agent/netlib/model/networkinterface"
"github.com/aws/amazon-ecs-agent/ecs-agent/utils/arn"
"github.com/cihub/seelog"
Expand All @@ -53,6 +56,29 @@ const (
bytesPerMegabyte = 1024 * 1024
)

// getSupplementaryGroups returns the supplementary groups for a container
// if it has EBS Task Attach volumes mounted
func (task *Task) getSupplementaryGroups(container *apicontainer.Container) []string {

if !task.IsEBSTaskAttachEnabled() {
return nil
}

// Check container's mount points against task volumes
for _, mp := range container.MountPoints {
if vol, ok := task.HostVolumeByName(mp.SourceVolume); ok {
if ebsConfig, ok := vol.(*taskresourcevolume.EBSTaskVolumeConfig); ok {
// This container mounts an EBS volume, generate GID from SourceVolumeHostPath
gid := util.GenerateGIDFromPath(ebsConfig.SourceVolumeHostPath)
logger.Debug("Generated a GID from EBS volume's host path",
logger.Fields{field.TaskID: task.GetID(), "EBS SourceVolumeHostPath": ebsConfig.SourceVolumeHostPath, "GID": strconv.Itoa(gid)})
return []string{strconv.Itoa(gid)}
}
}
}
return nil
}

// PlatformFields consists of fields specific to Linux for a task
type PlatformFields struct{}

Expand Down
108 changes: 108 additions & 0 deletions agent/api/task/task_linux_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ package task
import (
"encoding/json"
"fmt"
"strconv"
"testing"
"time"

Expand All @@ -33,8 +34,10 @@ import (
"github.com/aws/amazon-ecs-agent/agent/taskresource/cgroup/control/mock_control"
"github.com/aws/amazon-ecs-agent/agent/taskresource/firelens"
"github.com/aws/amazon-ecs-agent/agent/taskresource/ssmsecret"
"github.com/aws/amazon-ecs-agent/agent/taskresource/volume"
mock_ioutilwrapper "github.com/aws/amazon-ecs-agent/agent/utils/ioutilwrapper/mocks"
apicontainerstatus "github.com/aws/amazon-ecs-agent/ecs-agent/api/container/status"
"github.com/aws/amazon-ecs-agent/ecs-agent/daemonimages/csidriver/util"
"github.com/aws/amazon-ecs-agent/ecs-agent/netlib/model/appmesh"
nlappmesh "github.com/aws/amazon-ecs-agent/ecs-agent/netlib/model/appmesh"
ni "github.com/aws/amazon-ecs-agent/ecs-agent/netlib/model/networkinterface"
Expand Down Expand Up @@ -1763,3 +1766,108 @@ func TestDockerCPUShares(t *testing.T) {
})
}
}

func TestGetSupplementaryGroups(t *testing.T) {
testCases := []struct {
name string
task *Task
container *apicontainer.Container
expectedGroups []string
ebsTaskAttachEnabled bool
}{
{
name: "EBS Task Attach not enabled",
task: &Task{
Arn: validTaskArn,
},
container: &apicontainer.Container{
Name: "container",
MountPoints: []apicontainer.MountPoint{
{
SourceVolume: "ebs-volume",
ContainerPath: "/data",
},
},
},
ebsTaskAttachEnabled: false,
expectedGroups: nil,
},
{
name: "container has no mount points",
task: &Task{
Arn: validTaskArn,
},
container: &apicontainer.Container{
Name: "container",
MountPoints: []apicontainer.MountPoint{},
},
ebsTaskAttachEnabled: true,
expectedGroups: nil,
},
{
name: "container has EBS volume mount point",
task: &Task{
Arn: validTaskArn,
Volumes: []TaskVolume{
{
Name: "ebs-volume",
Type: "docker",
Volume: &volume.EBSTaskVolumeConfig{
SourceVolumeHostPath: "/var/lib/ecs/data/ebs-volume",
},
},
},
},
container: &apicontainer.Container{
Name: "container",
MountPoints: []apicontainer.MountPoint{
{
SourceVolume: "ebs-volume",
ContainerPath: "/data",
},
},
},
ebsTaskAttachEnabled: true,
expectedGroups: []string{
strconv.Itoa(util.GenerateGIDFromPath("/var/lib/ecs/data/ebs-volume")),
},
},
{
name: "container has non-EBS volume mount point",
task: &Task{
Arn: validTaskArn,
Volumes: []TaskVolume{
{
Name: "non-ebs-volume",
Type: "docker",
Volume: &volume.FSHostVolume{
FSSourcePath: "/var/lib/ecs/data/non-ebs-volume",
},
},
},
},
container: &apicontainer.Container{
Name: "container",
MountPoints: []apicontainer.MountPoint{
{
SourceVolume: "non-ebs-volume",
ContainerPath: "/data",
},
},
},
ebsTaskAttachEnabled: true,
expectedGroups: nil,
},
}

for _, tc := range testCases {
t.Run(tc.name, func(t *testing.T) {

// Call the function under test
groups := tc.task.getSupplementaryGroups(tc.container)

// Verify the results
assert.Equal(t, tc.expectedGroups, groups)
})
}
}
6 changes: 6 additions & 0 deletions agent/api/task/task_windows.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ package task
import (
"time"

apicontainer "github.com/aws/amazon-ecs-agent/agent/api/container"
"github.com/aws/amazon-ecs-agent/agent/config"
"github.com/aws/amazon-ecs-agent/agent/ecscni"
"github.com/aws/amazon-ecs-agent/agent/taskresource"
Expand Down Expand Up @@ -266,3 +267,8 @@ func (task *Task) BuildCNIConfigAwsvpc(includeIPAMConfig bool, cniConfig *ecscni
func (task *Task) BuildCNIConfigBridgeMode(cniConfig *ecscni.Config, containerName string) (*ecscni.Config, error) {
return nil, errors.New("unsupported platform")
}

// Not Supported for Windows
func (task *Task) getSupplementaryGroups(container *apicontainer.Container) []string {
return nil
}
5 changes: 5 additions & 0 deletions agent/app/agent_capability.go
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,7 @@ const (
capabilityServiceConnect = "service-connect-v1"
capabilityGpuDriverVersion = "gpu-driver-version"
capabilityEBSTaskAttach = "storage.ebs-task-volume-attach"
capabilityEBSTANonRootUser = "storage.ebsta-non-root-user"
capabilityContainerRestartPolicy = "container-restart-policy"
capabilityFaultInjection = "fault-injection"
capabilityIPv6Only = "ipv6-only"
Expand Down Expand Up @@ -137,6 +138,7 @@ var (
attributePrefix + taskEIAWithOptimizedCPU,
attributePrefix + capabilityServiceConnect,
attributePrefix + capabilityEBSTaskAttach,
attributePrefix + capabilityEBSTANonRootUser,
attributePrefix + capabilityFaultInjection,
}
// List of capabilities that are only supported on external capaciity. Currently only one but keep as a list
Expand Down Expand Up @@ -202,6 +204,8 @@ var (
// ecs.capability.execute-command
// ecs.capability.external
// ecs.capability.service-connect-v1
// ecs.capability.storage.ebs-task-volume-attach
// ecs.capability.storage.ebsta-non-root-user
// ecs.capability.network.container-port-range
// ecs.capability.container-restart-policy
// ecs.capability.fault-injection
Expand Down Expand Up @@ -312,6 +316,7 @@ func (agent *ecsAgent) capabilities() ([]types.Attribute, error) {
if agent.cfg.EBSTASupportEnabled {
// add ebs-task-attach attribute if applicable
capabilities = agent.appendEBSTaskAttachCapabilities(capabilities)
capabilities = agent.appendEBSTANonRootUserCapabilities(capabilities)
}

if agent.cfg.External.Enabled() {
Expand Down
1 change: 1 addition & 0 deletions agent/app/agent_capability_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,7 @@ func TestCapabilities(t *testing.T) {
AppArmorCapable: config.BooleanDefaultFalse{Value: config.ExplicitlyEnabled},
TaskENIEnabled: config.BooleanDefaultFalse{Value: config.ExplicitlyEnabled},
AWSVPCBlockInstanceMetdata: config.BooleanDefaultFalse{Value: config.ExplicitlyEnabled},
EBSTASupportEnabled: true,
TaskCleanupWaitDuration: config.DefaultConfig(ipcompatibility.NewIPv4OnlyCompatibility()).TaskCleanupWaitDuration,
}

Expand Down
4 changes: 4 additions & 0 deletions agent/app/agent_capability_unix.go
Original file line number Diff line number Diff line change
Expand Up @@ -198,6 +198,10 @@ func (agent *ecsAgent) appendFirelensNonRootUserCapability(capabilities []types.
return appendNameOnlyAttribute(capabilities, attributePrefix+capabilityFirelensNonRootUser)
}

func (agent *ecsAgent) appendEBSTANonRootUserCapabilities(capabilities []types.Attribute) []types.Attribute {
return appendNameOnlyAttribute(capabilities, attributePrefix+capabilityEBSTANonRootUser)
}

func (agent *ecsAgent) appendFirelensLoggingDriverCapabilities(capabilities []types.Attribute) []types.Attribute {
return appendNameOnlyAttribute(capabilities, capabilityPrefix+capabilityFirelensLoggingDriver)
}
Expand Down
2 changes: 2 additions & 0 deletions agent/app/agent_capability_unix_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -870,6 +870,7 @@ func TestCapabilitiesUnix(t *testing.T) {
conf := &config.Config{
PrivilegedDisabled: config.BooleanDefaultFalse{Value: config.ExplicitlyEnabled},
VolumePluginCapabilities: []string{capabilityEFSAuth},
EBSTASupportEnabled: true,
}

mockPauseLoader.EXPECT().IsLoaded(gomock.Any()).Return(true, nil)
Expand Down Expand Up @@ -914,6 +915,7 @@ func TestCapabilitiesUnix(t *testing.T) {
attributePrefix + capabilityEnvFilesS3,
attributePrefix + capabilityContainerPortRange,
attributePrefix + capabilityContainerRestartPolicy,
attributePrefix + capabilityEBSTANonRootUser,
}

var expectedCapabilities []types.Attribute
Expand Down
4 changes: 4 additions & 0 deletions agent/app/agent_capability_unspecified.go
Original file line number Diff line number Diff line change
Expand Up @@ -125,6 +125,10 @@ func (agent *ecsAgent) appendFirelensNonRootUserCapability(capabilities []types.
return capabilities
}

func (agent *ecsAgent) appendEBSTANonRootUserCapabilities(capabilities []types.Attribute) []types.Attribute {
return capabilities
}

func (agent *ecsAgent) appendGMSACapabilities(capabilities []types.Attribute) []types.Attribute {
return capabilities
}
Expand Down
4 changes: 4 additions & 0 deletions agent/app/agent_capability_windows.go
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,10 @@ func (agent *ecsAgent) appendFirelensNonRootUserCapability(capabilities []types.
return capabilities
}

func (agent *ecsAgent) appendEBSTANonRootUserCapabilities(capabilities []types.Attribute) []types.Attribute {
return capabilities
}

func (agent *ecsAgent) appendEFSCapabilities(capabilities []types.Attribute) []types.Attribute {
return capabilities
}
Expand Down
12 changes: 7 additions & 5 deletions agent/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ toolchain go1.23.7

require (
github.com/aws/amazon-ecs-agent/ecs-agent v0.0.0
github.com/aws/amazon-ecs-agent/ecs-agent/daemonimages/csidriver v0.0.0-20250814231752-7d5ec06fbcec
github.com/aws/aws-sdk-go v1.55.7
github.com/aws/aws-sdk-go-v2 v1.36.6
github.com/aws/aws-sdk-go-v2/config v1.29.14
Expand All @@ -23,7 +24,7 @@ require (
github.com/aws/smithy-go v1.22.4
github.com/awslabs/go-config-generator-for-fluentd-and-fluentbit v0.0.0-20210308162251-8959c62cb8f9
github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575
github.com/container-storage-interface/spec v1.8.0
github.com/container-storage-interface/spec v1.9.0
github.com/containerd/cgroups/v3 v3.0.4
github.com/containernetworking/cni v1.2.3
github.com/containernetworking/plugins v1.4.1
Expand Down Expand Up @@ -111,14 +112,15 @@ require (
gopkg.in/inf.v0 v0.9.1 // indirect
gopkg.in/yaml.v2 v2.4.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
k8s.io/apimachinery v0.28.1 // indirect
k8s.io/klog/v2 v2.100.1 // indirect
k8s.io/utils v0.0.0-20230726121419-3b25d923346b // indirect
k8s.io/apimachinery v0.30.1 // indirect
k8s.io/klog/v2 v2.120.1 // indirect
k8s.io/utils v0.0.0-20240502163921-fe8a2dddb1d0 // indirect
sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect
sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect
sigs.k8s.io/structured-merge-diff/v4 v4.4.1 // indirect
)

replace (
github.com/aws/amazon-ecs-agent/ecs-agent => ../ecs-agent
github.com/aws/amazon-ecs-agent/ecs-agent/daemonimages/csidriver => ../ecs-agent/daemonimages/csidriver
github.com/aws/aws-sdk-go-v2/service/ecs => ../aws-sdk-go-v2/service/ecs
)
22 changes: 11 additions & 11 deletions agent/go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -64,8 +64,8 @@ github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 h1:kHaBemcxl8o/pQ5VM1
github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575/go.mod h1:9d6lWj8KzO/fd/NrVaLscBKmPigpZpn5YawRPw+e3Yo=
github.com/cilium/ebpf v0.16.0 h1:+BiEnHL6Z7lXnlGUsXQPPAE7+kenAd4ES8MQ5min0Ok=
github.com/cilium/ebpf v0.16.0/go.mod h1:L7u2Blt2jMM/vLAVgjxluxtBKlz3/GWjB0dMOEngfwE=
github.com/container-storage-interface/spec v1.8.0 h1:D0vhF3PLIZwlwZEf2eNbpujGCNwspwTYf2idJRJx4xI=
github.com/container-storage-interface/spec v1.8.0/go.mod h1:ROLik+GhPslwwWRNFF1KasPzroNARibH2rfz1rkg4H0=
github.com/container-storage-interface/spec v1.9.0 h1:zKtX4STsq31Knz3gciCYCi1SXtO2HJDecIjDVboYavY=
github.com/container-storage-interface/spec v1.9.0/go.mod h1:ZfDu+3ZRyeVqxZM0Ds19MVLkN2d1XJ5MAfi1L3VjlT0=
github.com/containerd/cgroups/v3 v3.0.4 h1:2fs7l3P0Qxb1nKWuJNFiwhp2CqiKzho71DQkDrHJIo4=
github.com/containerd/cgroups/v3 v3.0.4/go.mod h1:SA5DLYnXO8pTGYiAHXz94qvLQTKfVM5GEVisn4jpins=
github.com/containerd/containerd v1.7.27 h1:yFyEyojddO3MIGVER2xJLWoCIn+Up4GaHFquP7hsFII=
Expand Down Expand Up @@ -97,7 +97,6 @@ github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2
github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY=
github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw=
github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY=
github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
Expand All @@ -119,6 +118,7 @@ github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5y
github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk=
github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
Expand Down Expand Up @@ -310,15 +310,15 @@ gotest.tools/v3 v3.5.0 h1:Ljk6PdHdOhAb5aDMWXjDLMMhph+BpztA4v1QdqEW2eY=
gotest.tools/v3 v3.5.0/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU=
k8s.io/api v0.28.1 h1:i+0O8k2NPBCPYaMB+uCkseEbawEt/eFaiRqUx8aB108=
k8s.io/api v0.28.1/go.mod h1:uBYwID+66wiL28Kn2tBjBYQdEU0Xk0z5qF8bIBqk/Dg=
k8s.io/apimachinery v0.28.1 h1:EJD40og3GizBSV3mkIoXQBsws32okPOy+MkRyzh6nPY=
k8s.io/apimachinery v0.28.1/go.mod h1:X0xh/chESs2hP9koe+SdIAcXWcQ+RM5hy0ZynB+yEvw=
k8s.io/klog/v2 v2.100.1 h1:7WCHKK6K8fNhTqfBhISHQ97KrnJNFZMcQvKp7gP/tmg=
k8s.io/klog/v2 v2.100.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0=
k8s.io/utils v0.0.0-20230726121419-3b25d923346b h1:sgn3ZU783SCgtaSJjpcVVlRqd6GSnlTLKgpAAttJvpI=
k8s.io/utils v0.0.0-20230726121419-3b25d923346b/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
k8s.io/apimachinery v0.30.1 h1:ZQStsEfo4n65yAdlGTfP/uSHMQSoYzU/oeEbkmF7P2U=
k8s.io/apimachinery v0.30.1/go.mod h1:iexa2somDaxdnj7bha06bhb43Zpa6eWH8N8dbqVjTUc=
k8s.io/klog/v2 v2.120.1 h1:QXU6cPEOIslTGvZaXvFWiP9VKyeet3sawzTOvdXb4Vw=
k8s.io/klog/v2 v2.120.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE=
k8s.io/utils v0.0.0-20240502163921-fe8a2dddb1d0 h1:jgGTlFYnhF1PM1Ax/lAlxUPE+KfCIXHaathvJg1C3ak=
k8s.io/utils v0.0.0-20240502163921-fe8a2dddb1d0/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo=
sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0=
sigs.k8s.io/structured-merge-diff/v4 v4.2.3 h1:PRbqxJClWWYMNV1dhaG4NsibJbArud9kFxnAMREiWFE=
sigs.k8s.io/structured-merge-diff/v4 v4.2.3/go.mod h1:qjx8mGObPmV2aSZepjQjbmb2ihdVs8cGKBraizNC69E=
sigs.k8s.io/structured-merge-diff/v4 v4.4.1 h1:150L+0vs/8DA78h1u02ooW1/fFq/Lwr+sGiqlzvrtq4=
sigs.k8s.io/structured-merge-diff/v4 v4.4.1/go.mod h1:N8hJocpFajUSSeSJ9bOZ77VzejKZaXsTtZo4/u7Io08=
sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo=
sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8=
Loading
Loading