Skip to content

Commit

Permalink
provider: dynamically load external cloud provider plugin
Browse files Browse the repository at this point in the history
- Enabling dynamically loaded plugins via env CLOUD_PROVIDER_PLUGIN_ENABLE
- check sha256sum with CLOUD_PROVIDER_PLUGIN_HASH
- add guide about how to use cloud proivder plugin feature

Signed-off-by: Da Li Liu <[email protected]>
  • Loading branch information
liudalibj authored and Qi Feng Huo committed Apr 18, 2024
1 parent d32c2e6 commit 549673b
Show file tree
Hide file tree
Showing 16 changed files with 575 additions and 70 deletions.
387 changes: 384 additions & 3 deletions src/cloud-api-adaptor/docs/addnewprovider.md

Large diffs are not rendered by default.

3 changes: 3 additions & 0 deletions src/cloud-api-adaptor/entrypoint.sh
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
#!/bin/bash

CLOUD_PROVIDER=${1:-$CLOUD_PROVIDER}
# Enabling dynamically loaded cloud provider external plugin feature, disabled by default
ENABLE_CLOUD_PROVIDER_EXTERNAL_PLUGIN=${ENABLE_CLOUD_PROVIDER_EXTERNAL_PLUGIN:-false}

CRI_RUNTIME_ENDPOINT=${CRI_RUNTIME_ENDPOINT:-/run/cri-runtime.sock}
optionals+=""

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ configMapGenerator:
namespace: confidential-containers-system
literals:
- CLOUD_PROVIDER="aws"
- ENABLE_CLOUD_PROVIDER_EXTERNAL_PLUGIN="false" # flag to enable/disable dynamically load cloud provider external plugin feature
- CLOUD_CONFIG_VERIFY="false" # It's better set as true to enable could config verify in production env
#- PAUSE_IMAGE="" # Uncomment and set if you want to use a specific pause image
#- VXLAN_PORT="" # Uncomment and set if you want to use a specific vxlan port. Defaults to 4789
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ configMapGenerator:
namespace: confidential-containers-system
literals:
- CLOUD_PROVIDER="azure"
- ENABLE_CLOUD_PROVIDER_EXTERNAL_PLUGIN="false" # flag to enable/disable dynamically load cloud provider external plugin feature
- CLOUD_CONFIG_VERIFY="false" # It's better set as true to enable could config verify in production env
- AZURE_SUBSCRIPTION_ID="" #set
- AZURE_REGION="eastus" #set
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ configMapGenerator:
namespace: confidential-containers-system
literals:
- CLOUD_PROVIDER="ibmcloud-powervs"
- ENABLE_CLOUD_PROVIDER_EXTERNAL_PLUGIN="false" # flag to enable/disable dynamically load cloud provider external plugin feature
- CLOUD_CONFIG_VERIFY="false" # It's better set as true to enable could config verify in production env
- POWERVS_SERVICE_INSTANCE_ID="" #set
- POWERVS_NETWORK_ID="" #set
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ configMapGenerator:
namespace: confidential-containers-system
literals:
- CLOUD_PROVIDER="ibmcloud"
- ENABLE_CLOUD_PROVIDER_EXTERNAL_PLUGIN="false" # flag to enable/disable dynamically load cloud provider external plugin feature
- CLOUD_CONFIG_VERIFY="false" # It's better set as true to enable could config verify in production env
- IBMCLOUD_VPC_ENDPOINT="" #set
- IBMCLOUD_RESOURCE_GROUP_ID="" #set
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ configMapGenerator:
namespace: confidential-containers-system
literals:
- CLOUD_PROVIDER="libvirt"
- ENABLE_CLOUD_PROVIDER_EXTERNAL_PLUGIN="false" # flag to enable/disable dynamically load cloud provider external plugin feature
- CLOUD_CONFIG_VERIFY="false" # It's better set as true to enable could config verify in production env
- LIBVIRT_URI="qemu+ssh://[email protected]/system?no_verify=1" #set
- LIBVIRT_NET="default" # set
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ configMapGenerator:
namespace: confidential-containers-system
literals:
- CLOUD_PROVIDER="vsphere"
- ENABLE_CLOUD_PROVIDER_EXTERNAL_PLUGIN="false" # flag to enable/disable dynamically load cloud provider external plugin feature
- CLOUD_CONFIG_VERIFY="false" # It's better set as true to enable could config verify in production env
- GOVC_URL="" # Setting the vCenter URL is required.
- GOVC_DATACENTER="" # Setting the vCenter datacenter is required.
Expand Down
10 changes: 10 additions & 0 deletions src/cloud-api-adaptor/install/yamls/caa-pod.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,10 @@ spec:
- mountPath: /run/netns
mountPropagation: HostToContainer
name: netns
# # setting for cloud provider external plugin
# - mountPath: /cloud-providers
# name: provider-dir
# # setting for cloud provider external plugin
hostNetwork: true
dnsPolicy: ClusterFirstWithHostNet
nodeSelector:
Expand All @@ -79,3 +83,9 @@ spec:
- hostPath:
path: /run/netns
name: netns
# # setting for cloud provider external plugin
# - hostPath:
# path: /opt/cloud-api-adaptor/plugins
# type: Directory
# name: provider-dir
# # setting for cloud provider external plugin
10 changes: 5 additions & 5 deletions src/cloud-providers/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -11,20 +11,20 @@ require (
github.com/IBM/go-sdk-core/v5 v5.13.1
github.com/IBM/platform-services-go-sdk v0.36.0
github.com/IBM/vpc-go-sdk v0.35.0
github.com/avast/retry-go/v4 v4.3.3
github.com/avast/retry-go/v4 v4.5.1
github.com/aws/aws-sdk-go-v2 v1.21.0
github.com/aws/aws-sdk-go-v2/config v1.15.11
github.com/aws/aws-sdk-go-v2/credentials v1.12.6
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.6
github.com/aws/aws-sdk-go-v2/service/ec2 v1.117.0
github.com/kdomanski/iso9660 v0.3.5
github.com/kdomanski/iso9660 v0.4.0
github.com/stretchr/testify v1.8.4
github.com/vmware/govmomi v0.29.0
github.com/vmware/govmomi v0.33.1
gopkg.in/yaml.v2 v2.4.0
k8s.io/apimachinery v0.26.0
k8s.io/client-go v0.26.0
libvirt.org/go/libvirt v1.8002.0
libvirt.org/go/libvirtxml v1.9004.0
libvirt.org/go/libvirt v1.9008.0
libvirt.org/go/libvirtxml v1.9007.0
)

require (
Expand Down
20 changes: 10 additions & 10 deletions src/cloud-providers/go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,8 @@ github.com/apparentlymart/go-cidr v1.1.0 h1:2mAhrMoF+nhXqxTzSZMUzDHkLjmIHC+Zzn4t
github.com/asaskevich/govalidator v0.0.0-20200907205600-7a23bdc65eef/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw=
github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 h1:DklsrG3dyBCFEj5IhUbnKptjxatkF07cF2ak3yi77so=
github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw=
github.com/avast/retry-go/v4 v4.3.3 h1:G56Bp6mU0b5HE1SkaoVjscZjlQb0oy4mezwY/cGH19w=
github.com/avast/retry-go/v4 v4.3.3/go.mod h1:rg6XFaiuFYII0Xu3RDbZQkxCofFwruZKW8oEF1jpWiU=
github.com/avast/retry-go/v4 v4.5.1 h1:AxIx0HGi4VZ3I02jr78j5lZ3M6x1E0Ivxa6b0pUUh7o=
github.com/avast/retry-go/v4 v4.5.1/go.mod h1:/sipNsvNB3RRuT5iNcb6h73nw3IBmXJ/H3XrCQYSOpc=
github.com/aws/aws-sdk-go-v2 v1.16.5/go.mod h1:Wh7MEsmEApyL5hrWzpDkba4gwAPc5/piwLVLFnCxp48=
github.com/aws/aws-sdk-go-v2 v1.21.0 h1:gMT0IW+03wtYJhRqTVYn0wLzwdnK9sRMcxmtfGzRdJc=
github.com/aws/aws-sdk-go-v2 v1.21.0/go.mod h1:/RfNgGmRxI+iFOB1OeJUyxiU+9s88k3pfHvDagGEp0M=
Expand Down Expand Up @@ -213,8 +213,8 @@ github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnr
github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
github.com/karrick/godirwalk v1.8.0/go.mod h1:H5KPZjojv4lE+QYImBI8xVtrBRgYrIVsaRPx4tDPEn4=
github.com/karrick/godirwalk v1.10.3/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0LhBygSwrAsHA=
github.com/kdomanski/iso9660 v0.3.5 h1:LO1n75zPjLeDQkz0Pyk1eZ7JGinjKjk2C174GSABVwY=
github.com/kdomanski/iso9660 v0.3.5/go.mod h1:K+UlIGxKgtrdAWyoigPnFbeQLVs/Xudz4iztWFThBwo=
github.com/kdomanski/iso9660 v0.4.0 h1:BPKKdcINz3m0MdjIMwS0wx1nofsOjxOq8TOr45WGHFg=
github.com/kdomanski/iso9660 v0.4.0/go.mod h1:OxUSupHsO9ceI8lBLPJKWBTphLemjrCQY8LPXM7qSzU=
github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk=
Expand Down Expand Up @@ -307,8 +307,8 @@ github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcU
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
github.com/tidwall/pretty v1.0.0 h1:HsD+QiTn7sK6flMKIvNmpqz1qrpP3Ps6jOKIKMooyg4=
github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk=
github.com/vmware/govmomi v0.29.0 h1:SHJQ7DUc4fltFZv16znJNGHR1/XhiDK5iKxm2OqwkuU=
github.com/vmware/govmomi v0.29.0/go.mod h1:F7adsVewLNHsW/IIm7ziFURaXDaHEwcc+ym4r3INMdY=
github.com/vmware/govmomi v0.33.1 h1:qS2VpEBd/WLbzLO5McI6h5o5zaKsrezUxRY5r9jkW8A=
github.com/vmware/govmomi v0.33.1/go.mod h1:QuzWGiEMA/FYlu5JXKjytiORQoxv2hTHdS2lWnIqKMM=
github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI=
github.com/xdg-go/scram v1.0.2/go.mod h1:1WAq6h33pAW+iRreB34OORO2Nf7qel3VV3fjBj+hCSs=
github.com/xdg-go/scram v1.1.1/go.mod h1:RaEWvsqvNKKvBPvcKeFjrG2cJqOkHTiyTpzz23ni57g=
Expand Down Expand Up @@ -474,10 +474,10 @@ k8s.io/kube-openapi v0.0.0-20221012153701-172d655c2280 h1:+70TFaan3hfJzs+7VK2o+O
k8s.io/kube-openapi v0.0.0-20221012153701-172d655c2280/go.mod h1:+Axhij7bCpeqhklhUTe3xmOn6bWxolyZEeyaFpjGtl4=
k8s.io/utils v0.0.0-20221128185143-99ec85e7a448 h1:KTgPnR10d5zhztWptI952TNtt/4u5h3IzDXkdIMuo2Y=
k8s.io/utils v0.0.0-20221128185143-99ec85e7a448/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
libvirt.org/go/libvirt v1.8002.0 h1:X8gz2Sa1ek4S5FznpDpeRz6JpNb7NdkfzTii5GMIwDY=
libvirt.org/go/libvirt v1.8002.0/go.mod h1:1WiFE8EjZfq+FCVog+rvr1yatKbKZ9FaFMZgEqxEJqQ=
libvirt.org/go/libvirtxml v1.9004.0 h1:h+nhEZCABCnK4go0GLRN2WZhIhRrLAqsz84t553oiM4=
libvirt.org/go/libvirtxml v1.9004.0/go.mod h1:7Oq2BLDstLr/XtoQD8Fr3mfDNrzlI3utYKySXF2xkng=
libvirt.org/go/libvirt v1.9008.0 h1:LLpjuSQm9gChnx7I/44SLLg/eyvTnJpcMAFmKot65Zc=
libvirt.org/go/libvirt v1.9008.0/go.mod h1:1WiFE8EjZfq+FCVog+rvr1yatKbKZ9FaFMZgEqxEJqQ=
libvirt.org/go/libvirtxml v1.9007.0 h1:NjFBpv5aDutbtuem7VP9s8ZW8XEuCKIO7kkvx+sildQ=
libvirt.org/go/libvirtxml v1.9007.0/go.mod h1:7Oq2BLDstLr/XtoQD8Fr3mfDNrzlI3utYKySXF2xkng=
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.4.1 h1:150L+0vs/8DA78h1u02ooW1/fFq/Lwr+sGiqlzvrtq4=
Expand Down
93 changes: 93 additions & 0 deletions src/cloud-providers/table.go
Original file line number Diff line number Diff line change
@@ -1,7 +1,14 @@
package provider

import (
"crypto/sha256"
"flag"
"fmt"
"io"
"os"
"path/filepath"
"plugin"
"strings"
)

type CloudProvider interface {
Expand All @@ -12,7 +19,93 @@ type CloudProvider interface {

var providerTable map[string]CloudProvider = make(map[string]CloudProvider)

func getFileNameAndSha256sum(providerPath string) (string, string, error) {
file, err := os.Open(providerPath)
if err != nil {
return "", "", err
}
defer file.Close()

// Get the base filename without the directory path
filename := filepath.Base(providerPath)

hash := sha256.New()
if _, err := io.Copy(hash, file); err != nil {
return filename, "", err
}
sum := hash.Sum(nil)
return filename, fmt.Sprintf("%x", sum), nil
}

func hasExecutePermission(providerPath string) (bool, error) {
// Get the parent directory of the specified file path
dir := filepath.Dir(providerPath)

// Stat the directory to get its file info
dirInfo, err := os.Stat(dir)
if err != nil {
return false, err
}

// Check if the directory has execute permission for the current user
mode := dirInfo.Mode()
executePermission := mode&os.ModeDir != 0 && mode&0100 != 0

return executePermission, nil
}

// LoadCloudProvider loads cloud provider external plugin from the given path CLOUD_PROVIDER_EXTERNAL_PLUGIN_PATH
// The values of 1) ${CLOUD_PROVIDER}, 2) the filename of the cloud provider external plugin
// and 3) the provider defined within the external plugin must all match
func LoadCloudProvider(name string) {
if os.Getenv("ENABLE_CLOUD_PROVIDER_EXTERNAL_PLUGIN") != "true" {
logger.Printf("Cloud provider external plugin loading is disabled, skipping plugin loading")
return
}
externalPluginPath := os.Getenv("CLOUD_PROVIDER_EXTERNAL_PLUGIN_PATH")
executePermission, err := hasExecutePermission(externalPluginPath)
if err != nil {
logger.Printf("Failed to retrieve file information for the parent directory of CLOUD_PROVIDER_EXTERNAL_PLUGIN_PATH %s", err)
return
}
if !executePermission {
logger.Printf("The parent directory of the external plugin %s lacks execute permissions", filepath.Dir(externalPluginPath))
return
}
cloudProviderPluginHash := os.Getenv("CLOUD_PROVIDER_EXTERNAL_PLUGIN_HASH")
if externalPluginPath == "" {
logger.Printf("Env CLOUD_PROVIDER_EXTERNAL_PLUGIN_PATH is not set")
return
}
if cloudProviderPluginHash == "" {
logger.Printf("Env CLOUD_PROVIDER_EXTERNAL_PLUGIN_HASH is not set")
return
}
filename, realPluginHash, err := getFileNameAndSha256sum(externalPluginPath)
if !strings.EqualFold(filename, name+".so") {
logger.Printf("Filename of the external plugin: %s, is not match with CLOUD_PROVIDER: %s", filename, name)
return
}
logger.Printf("Loading external plugin %s from %s", name, externalPluginPath)

if err != nil {
logger.Printf("Failed to calculate the SHA256 checksum of the external plugin %s", err)
return
}
if cloudProviderPluginHash != realPluginHash {
logger.Printf("The sha256sum of the external plugin: %s doesn't match the one from configmap: %s", realPluginHash, cloudProviderPluginHash)
return
}
_, err = plugin.Open(externalPluginPath)
if err != nil {
logger.Printf("Failed to open the external plugin %s", err)
} else {
logger.Printf("Successfully opened the external plugin %s", externalPluginPath)
}
}

func Get(name string) CloudProvider {
LoadCloudProvider(name)
return providerTable[name]
}

Expand Down
8 changes: 4 additions & 4 deletions src/peerpod-ctrl/Dockerfile
Original file line number Diff line number Diff line change
@@ -1,19 +1,19 @@
# Build the manager binary
FROM --platform=$TARGETPLATFORM quay.io/confidential-containers/golang-fedora:1.20.8-38 as builder
FROM --platform=$TARGETPLATFORM quay.io/confidential-containers/golang-fedora:1.21.9-38 as builder
ARG TARGETOS
ARG TARGETARCH
ARG CGO_ENABLED=1
ARG GOFLAGS

WORKDIR /workspace/
WORKDIR /work
RUN if [ "$CGO_ENABLED" = 1 ] ; then dnf install -y libvirt-devel && dnf clean all; fi
# Copy the Go Modules manifests
COPY peerpod-ctrl/go.mod peerpod-ctrl/go.mod
COPY peerpod-ctrl/go.sum peerpod-ctrl/go.sum
COPY cloud-providers cloud-providers
# cache deps before building and copying source so that we don't need to re-download as much
# and so that source changes don't invalidate our downloaded layer
WORKDIR /workspace/peerpod-ctrl/
WORKDIR /work/peerpod-ctrl/
RUN go mod download

# Copy the go source
Expand All @@ -35,6 +35,6 @@ ARG CGO_ENABLED=1

RUN if [ "$CGO_ENABLED" = 1 ] ; then dnf install -y libvirt-libs openssh-clients && dnf clean all; fi
WORKDIR /
COPY --from=builder /workspace/peerpod-ctrl/manager .
COPY --from=builder /work/peerpod-ctrl/manager .

ENTRYPOINT ["/manager"]
10 changes: 10 additions & 0 deletions src/peerpod-ctrl/config/manager/manager.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,12 @@ spec:
defaultMode: 384
optional: true
secretName: ssh-key-secret
# setting for cloud provider external plugin
# - hostPath:
# path: /opt/cloud-api-adaptor/plugins
# type: Directory
# name: provider-dir
# setting for cloud provider external plugin
securityContext:
runAsNonRoot: false
# TODO(user): For common cases that do not require escalating privileges
Expand All @@ -80,6 +86,10 @@ spec:
- mountPath: /root/.ssh/
name: ssh
readOnly: true
# # setting for cloud provider external plugin
# - mountPath: /cloud-providers
# name: provider-dir
# # setting for cloud provider external plugin
envFrom:
- secretRef:
name: peer-pods-secret
Expand Down
26 changes: 13 additions & 13 deletions src/peerpodconfig-ctrl/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ module github.com/confidential-containers/cloud-api-adaptor/src/peerpodconfig-ct
go 1.20

require (
github.com/go-logr/logr v1.2.3
github.com/go-logr/logr v1.3.0
github.com/onsi/ginkgo/v2 v2.6.1
github.com/onsi/gomega v1.24.2
k8s.io/api v0.26.0
Expand All @@ -16,24 +16,24 @@ require (
github.com/beorn7/perks v1.0.1 // indirect
github.com/cespare/xxhash/v2 v2.1.2 // indirect
github.com/davecgh/go-spew v1.1.1 // indirect
github.com/emicklei/go-restful/v3 v3.9.0 // indirect
github.com/emicklei/go-restful/v3 v3.11.0 // indirect
github.com/evanphx/json-patch/v5 v5.6.0 // indirect
github.com/fsnotify/fsnotify v1.6.0 // indirect
github.com/go-logr/zapr v1.2.3 // indirect
github.com/go-openapi/jsonpointer v0.19.5 // indirect
github.com/go-openapi/jsonreference v0.20.0 // indirect
github.com/go-openapi/swag v0.19.14 // indirect
github.com/go-openapi/jsonpointer v0.19.6 // indirect
github.com/go-openapi/jsonreference v0.20.2 // indirect
github.com/go-openapi/swag v0.22.4 // indirect
github.com/gogo/protobuf v1.3.2 // indirect
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
github.com/golang/protobuf v1.5.2 // indirect
github.com/golang/protobuf v1.5.3 // indirect
github.com/google/gnostic v0.5.7-v3refs // indirect
github.com/google/go-cmp v0.5.9 // indirect
github.com/google/gofuzz v1.1.0 // indirect
github.com/google/uuid v1.1.2 // indirect
github.com/google/go-cmp v0.6.0 // indirect
github.com/google/gofuzz v1.2.0 // indirect
github.com/google/uuid v1.3.1 // indirect
github.com/imdario/mergo v0.3.6 // indirect
github.com/josharian/intern v1.0.0 // indirect
github.com/json-iterator/go v1.1.12 // indirect
github.com/mailru/easyjson v0.7.6 // indirect
github.com/mailru/easyjson v0.7.7 // indirect
github.com/matttproud/golang_protobuf_extensions v1.0.2 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.2 // indirect
Expand Down Expand Up @@ -61,11 +61,11 @@ require (
gopkg.in/yaml.v3 v3.0.1 // indirect
k8s.io/apiextensions-apiserver v0.26.0 // indirect
k8s.io/component-base v0.26.0 // indirect
k8s.io/klog/v2 v2.80.1 // indirect
k8s.io/klog/v2 v2.110.1 // indirect
k8s.io/kube-openapi v0.0.0-20221012153701-172d655c2280 // indirect
k8s.io/utils v0.0.0-20221128185143-99ec85e7a448 // indirect
sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 // indirect
sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect
sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect
sigs.k8s.io/structured-merge-diff/v4 v4.4.1 // indirect
sigs.k8s.io/yaml v1.3.0 // indirect
)

Expand Down
Loading

0 comments on commit 549673b

Please sign in to comment.