diff --git a/api/external/github.com/nutanix-cloud-native/cluster-api-provider-nutanix/api/v1beta1/nutanix_types.go b/api/external/github.com/nutanix-cloud-native/cluster-api-provider-nutanix/api/v1beta1/nutanix_types.go index 95da63220..b609bc183 100644 --- a/api/external/github.com/nutanix-cloud-native/cluster-api-provider-nutanix/api/v1beta1/nutanix_types.go +++ b/api/external/github.com/nutanix-cloud-native/cluster-api-provider-nutanix/api/v1beta1/nutanix_types.go @@ -61,6 +61,8 @@ const ( // NutanixResourceIdentifier holds the identity of a Nutanix PC resource (cluster, image, subnet, etc.) // +union +// +kubebuilder:validation:XValidation:rule="self.type == 'name' ? has(self.name) : !has(self.name)",message="'name' must be set when type is 'name', and forbidden otherwise" +// +kubebuilder:validation:XValidation:rule="self.type == 'uuid' ? has(self.uuid) && self.uuid.contains('-') : !has(self.uuid)",message="'uuid' must be set when type is 'uuid', and forbidden otherwise" type NutanixResourceIdentifier struct { // Type is the identifier type to use for this resource. // +kubebuilder:validation:Required @@ -69,10 +71,14 @@ type NutanixResourceIdentifier struct { // uuid is the UUID of the resource in the PC. // +optional + // +kubebuilder:validation:Format=uuid + // +kubebuilder:validation:MaxLength=36 + // +kubebuilder:validation:MinLength=36 UUID *string `json:"uuid,omitempty"` // name is the resource name in the PC // +optional + // +kubebuilder:validation:MinLength=1 Name *string `json:"name,omitempty"` } diff --git a/api/external/github.com/nutanix-cloud-native/cluster-api-provider-nutanix/api/v1beta1/nutanixfailuredomain_types.go b/api/external/github.com/nutanix-cloud-native/cluster-api-provider-nutanix/api/v1beta1/nutanixfailuredomain_types.go index d7a063fc2..49597ac68 100644 --- a/api/external/github.com/nutanix-cloud-native/cluster-api-provider-nutanix/api/v1beta1/nutanixfailuredomain_types.go +++ b/api/external/github.com/nutanix-cloud-native/cluster-api-provider-nutanix/api/v1beta1/nutanixfailuredomain_types.go @@ -31,6 +31,7 @@ const ( ) // NutanixFailureDomainSpec defines the desired state of NutanixFailureDomain. +// +kubebuilder:validation:XValidation:rule="size(self.subnets) > 1 ? self.subnets.all(x, self.subnets.exists_one(y, x == y)) : true",message="each subnet must be unique" type NutanixFailureDomainSpec struct { // prismElementCluster is to identify the Prism Element cluster in the Prism Central for the failure domain. // +kubebuilder:validation:XValidation:rule="self == oldSelf",message="prismElementCluster is immutable once set" @@ -42,6 +43,7 @@ type NutanixFailureDomainSpec struct { // +kubebuilder:validation:XValidation:rule="self == oldSelf",message="subnets is immutable once set" // +kubebuilder:validation:Required // +kubebuilder:validation:MinItems=1 + // +kubebuilder:validation:MaxItems=32 Subnets []NutanixResourceIdentifier `json:"subnets"` } diff --git a/api/external/github.com/nutanix-cloud-native/cluster-api-provider-nutanix/api/v1beta1/nutanixmachine_types.go b/api/external/github.com/nutanix-cloud-native/cluster-api-provider-nutanix/api/v1beta1/nutanixmachine_types.go index e0fcab89f..a16fbc4ec 100644 --- a/api/external/github.com/nutanix-cloud-native/cluster-api-provider-nutanix/api/v1beta1/nutanixmachine_types.go +++ b/api/external/github.com/nutanix-cloud-native/cluster-api-provider-nutanix/api/v1beta1/nutanixmachine_types.go @@ -98,6 +98,7 @@ type NutanixImageLookup struct { // NutanixMachineSpec defines the desired state of NutanixMachine // +kubebuilder:validation:XValidation:rule="has(self.image) != has(self.imageLookup)",message="Either 'image' or 'imageLookup' must be set, but not both" +// +kubebuilder:validation:XValidation:rule="has(self.subnet) && size(self.subnet) > 1 ? self.subnet.all(x, self.subnet.exists_one(y, x == y)) : true",message="each subnet must be unique" type NutanixMachineSpec struct { // SPEC FIELDS - desired state of NutanixMachine // Important: Run "make" to regenerate code after modifying this file @@ -136,6 +137,7 @@ type NutanixMachineSpec struct { // subnet is to identify the cluster's network subnet to use for the Machine's VM // The cluster identifier (uuid or name) can be obtained from the Prism Central console // or using the prism_central API. + // +kubebuilder:validation:MaxItems=32 // +kubebuilder:validation:Optional Subnets []NutanixResourceIdentifier `json:"subnet,omitempty"` // List of categories that need to be added to the machines. Categories must already exist in Prism Central diff --git a/api/v1alpha1/crds/caren.nutanix.com_nutanixclusterconfigs.yaml b/api/v1alpha1/crds/caren.nutanix.com_nutanixclusterconfigs.yaml index 49aa3f6dd..8dd85b83f 100644 --- a/api/v1alpha1/crds/caren.nutanix.com_nutanixclusterconfigs.yaml +++ b/api/v1alpha1/crds/caren.nutanix.com_nutanixclusterconfigs.yaml @@ -376,6 +376,7 @@ spec: properties: name: description: name is the resource name in the PC + minLength: 1 type: string type: description: Type is the identifier type to use for this resource. @@ -385,10 +386,18 @@ spec: type: string uuid: description: uuid is the UUID of the resource in the PC. + format: uuid + maxLength: 36 + minLength: 36 type: string required: - type type: object + x-kubernetes-validations: + - message: '''name'' must be set when type is ''name'', and forbidden otherwise' + rule: 'self.type == ''name'' ? has(self.name) : !has(self.name)' + - message: '''uuid'' must be set when type is ''uuid'', and forbidden otherwise' + rule: 'self.type == ''uuid'' ? has(self.uuid) && self.uuid.contains(''-'') : !has(self.uuid)' gpus: description: List of GPU devices that need to be added to the machines. items: @@ -418,6 +427,7 @@ spec: properties: name: description: name is the resource name in the PC + minLength: 1 type: string type: description: Type is the identifier type to use for this resource. @@ -427,10 +437,18 @@ spec: type: string uuid: description: uuid is the UUID of the resource in the PC. + format: uuid + maxLength: 36 + minLength: 36 type: string required: - type type: object + x-kubernetes-validations: + - message: '''name'' must be set when type is ''name'', and forbidden otherwise' + rule: 'self.type == ''name'' ? has(self.name) : !has(self.name)' + - message: '''uuid'' must be set when type is ''uuid'', and forbidden otherwise' + rule: 'self.type == ''uuid'' ? has(self.uuid) && self.uuid.contains(''-'') : !has(self.uuid)' imageLookup: description: imageLookup is a container that holds how to look up vm images for the cluster. properties: @@ -470,6 +488,7 @@ spec: properties: name: description: name is the resource name in the PC + minLength: 1 type: string type: description: Type is the identifier type to use for this resource. @@ -479,10 +498,18 @@ spec: type: string uuid: description: uuid is the UUID of the resource in the PC. + format: uuid + maxLength: 36 + minLength: 36 type: string required: - type type: object + x-kubernetes-validations: + - message: '''name'' must be set when type is ''name'', and forbidden otherwise' + rule: 'self.type == ''name'' ? has(self.name) : !has(self.name)' + - message: '''uuid'' must be set when type is ''uuid'', and forbidden otherwise' + rule: 'self.type == ''uuid'' ? has(self.uuid) && self.uuid.contains(''-'') : !has(self.uuid)' subnets: description: |- subnet identifies the network subnet to use for the machine. @@ -492,6 +519,7 @@ spec: properties: name: description: name is the resource name in the PC + minLength: 1 type: string type: description: Type is the identifier type to use for this resource. @@ -501,10 +529,18 @@ spec: type: string uuid: description: uuid is the UUID of the resource in the PC. + format: uuid + maxLength: 36 + minLength: 36 type: string required: - type type: object + x-kubernetes-validations: + - message: '''name'' must be set when type is ''name'', and forbidden otherwise' + rule: 'self.type == ''name'' ? has(self.name) : !has(self.name)' + - message: '''uuid'' must be set when type is ''uuid'', and forbidden otherwise' + rule: 'self.type == ''uuid'' ? has(self.uuid) && self.uuid.contains(''-'') : !has(self.uuid)' maxItems: 16 type: array systemDiskSize: diff --git a/api/v1alpha1/crds/caren.nutanix.com_nutanixworkernodeconfigs.yaml b/api/v1alpha1/crds/caren.nutanix.com_nutanixworkernodeconfigs.yaml index 1c51bfe37..afb1a1776 100644 --- a/api/v1alpha1/crds/caren.nutanix.com_nutanixworkernodeconfigs.yaml +++ b/api/v1alpha1/crds/caren.nutanix.com_nutanixworkernodeconfigs.yaml @@ -90,6 +90,7 @@ spec: properties: name: description: name is the resource name in the PC + minLength: 1 type: string type: description: Type is the identifier type to use for this resource. @@ -99,10 +100,18 @@ spec: type: string uuid: description: uuid is the UUID of the resource in the PC. + format: uuid + maxLength: 36 + minLength: 36 type: string required: - type type: object + x-kubernetes-validations: + - message: '''name'' must be set when type is ''name'', and forbidden otherwise' + rule: 'self.type == ''name'' ? has(self.name) : !has(self.name)' + - message: '''uuid'' must be set when type is ''uuid'', and forbidden otherwise' + rule: 'self.type == ''uuid'' ? has(self.uuid) && self.uuid.contains(''-'') : !has(self.uuid)' gpus: description: List of GPU devices that need to be added to the machines. items: @@ -132,6 +141,7 @@ spec: properties: name: description: name is the resource name in the PC + minLength: 1 type: string type: description: Type is the identifier type to use for this resource. @@ -141,10 +151,18 @@ spec: type: string uuid: description: uuid is the UUID of the resource in the PC. + format: uuid + maxLength: 36 + minLength: 36 type: string required: - type type: object + x-kubernetes-validations: + - message: '''name'' must be set when type is ''name'', and forbidden otherwise' + rule: 'self.type == ''name'' ? has(self.name) : !has(self.name)' + - message: '''uuid'' must be set when type is ''uuid'', and forbidden otherwise' + rule: 'self.type == ''uuid'' ? has(self.uuid) && self.uuid.contains(''-'') : !has(self.uuid)' imageLookup: description: imageLookup is a container that holds how to look up vm images for the cluster. properties: @@ -184,6 +202,7 @@ spec: properties: name: description: name is the resource name in the PC + minLength: 1 type: string type: description: Type is the identifier type to use for this resource. @@ -193,10 +212,18 @@ spec: type: string uuid: description: uuid is the UUID of the resource in the PC. + format: uuid + maxLength: 36 + minLength: 36 type: string required: - type type: object + x-kubernetes-validations: + - message: '''name'' must be set when type is ''name'', and forbidden otherwise' + rule: 'self.type == ''name'' ? has(self.name) : !has(self.name)' + - message: '''uuid'' must be set when type is ''uuid'', and forbidden otherwise' + rule: 'self.type == ''uuid'' ? has(self.uuid) && self.uuid.contains(''-'') : !has(self.uuid)' subnets: description: |- subnet identifies the network subnet to use for the machine. @@ -206,6 +233,7 @@ spec: properties: name: description: name is the resource name in the PC + minLength: 1 type: string type: description: Type is the identifier type to use for this resource. @@ -215,10 +243,18 @@ spec: type: string uuid: description: uuid is the UUID of the resource in the PC. + format: uuid + maxLength: 36 + minLength: 36 type: string required: - type type: object + x-kubernetes-validations: + - message: '''name'' must be set when type is ''name'', and forbidden otherwise' + rule: 'self.type == ''name'' ? has(self.name) : !has(self.name)' + - message: '''uuid'' must be set when type is ''uuid'', and forbidden otherwise' + rule: 'self.type == ''uuid'' ? has(self.uuid) && self.uuid.contains(''-'') : !has(self.uuid)' maxItems: 16 type: array systemDiskSize: diff --git a/charts/cluster-api-runtime-extensions-nutanix/defaultclusterclasses/nutanix-cluster-class.yaml b/charts/cluster-api-runtime-extensions-nutanix/defaultclusterclasses/nutanix-cluster-class.yaml index e190820fe..537351612 100644 --- a/charts/cluster-api-runtime-extensions-nutanix/defaultclusterclasses/nutanix-cluster-class.yaml +++ b/charts/cluster-api-runtime-extensions-nutanix/defaultclusterclasses/nutanix-cluster-class.yaml @@ -344,7 +344,7 @@ spec: spec: bootType: legacy image: - name: "" + name: placeholder-image type: name memorySize: 4Gi systemDiskSize: 40Gi @@ -362,7 +362,7 @@ spec: spec: bootType: legacy image: - name: "" + name: placeholder-image type: name memorySize: 4Gi systemDiskSize: 40Gi diff --git a/hack/examples/overlays/clusterclasses/nutanix/kustomization.yaml.tmpl b/hack/examples/overlays/clusterclasses/nutanix/kustomization.yaml.tmpl index 5498b19b4..86b301c45 100644 --- a/hack/examples/overlays/clusterclasses/nutanix/kustomization.yaml.tmpl +++ b/hack/examples/overlays/clusterclasses/nutanix/kustomization.yaml.tmpl @@ -72,7 +72,3 @@ patches: kind: KubeadmConfigTemplate path: ../../../patches/cis/kubeadmconfigtemplate/kubelet-file-permissions.yaml # END CIS patches - - - target: - kind: NutanixMachineTemplate - path: ../../../patches/nutanix/remove-cluster-and-subnet-from-machinetemplates.yaml diff --git a/hack/examples/patches/nutanix/remove-cluster-and-subnet-from-machinetemplates.yaml b/hack/examples/patches/nutanix/remove-cluster-and-subnet-from-machinetemplates.yaml deleted file mode 100644 index da95fe143..000000000 --- a/hack/examples/patches/nutanix/remove-cluster-and-subnet-from-machinetemplates.yaml +++ /dev/null @@ -1,4 +0,0 @@ -- op: remove - path: /spec/template/spec/cluster -- op: remove - path: /spec/template/spec/subnet diff --git a/hack/third-party/capx/go.mod b/hack/third-party/capx/go.mod index 4203d5a31..5be0dd45b 100644 --- a/hack/third-party/capx/go.mod +++ b/hack/third-party/capx/go.mod @@ -7,7 +7,7 @@ go 1.24.0 toolchain go1.24.3 -require github.com/nutanix-cloud-native/cluster-api-provider-nutanix v1.7.0 +require github.com/nutanix-cloud-native/cluster-api-provider-nutanix v1.7.1 require ( github.com/emicklei/go-restful/v3 v3.12.2 // indirect diff --git a/hack/third-party/capx/go.sum b/hack/third-party/capx/go.sum index 947b5d579..a9e0b9eb9 100644 --- a/hack/third-party/capx/go.sum +++ b/hack/third-party/capx/go.sum @@ -19,12 +19,16 @@ github.com/emicklei/go-restful/v3 v3.12.2 h1:DhwDP0vY3k8ZzE0RunuJy8GhNpPL6zqLkDf github.com/emicklei/go-restful/v3 v3.12.2/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= github.com/evanphx/json-patch v5.7.0+incompatible h1:vgGkfT/9f8zE6tvSCe74nfpAVDQ2tG6yudJd8LBksgI= github.com/evanphx/json-patch v5.7.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/evanphx/json-patch/v5 v5.9.11 h1:/8HVnzMq13/3x9TPvjG08wUGqBTmZBsCWzjTM0wiaDU= +github.com/evanphx/json-patch/v5 v5.9.11/go.mod h1:3j+LviiESTElxA4p3EMKAB9HXj3/XEtnUf6OZxqIQTM= github.com/fxamacker/cbor/v2 v2.7.0 h1:iM5WgngdRBanHcxugY4JySA0nk1wZorNOpTgCMedv5E= github.com/fxamacker/cbor/v2 v2.7.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ= github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/zapr v1.3.0 h1:XGdV8XW8zdwFiwOA2Dryh1gj2KRQyOOoNmBy4EplIcQ= +github.com/go-logr/zapr v1.3.0/go.mod h1:YKepepNBd1u/oyhd/yQmtjVXmm9uML4IXUgMOwR8/Gg= github.com/go-openapi/jsonpointer v0.21.0 h1:YgdVicSA9vH5RiHs9TZW5oyafXZFc6+2Vc1rr/O9oNQ= github.com/go-openapi/jsonpointer v0.21.0/go.mod h1:IUyH9l/+uyhIYQ/PXVA41Rexl+kOkAPDdXEYns6fzUY= github.com/go-openapi/jsonreference v0.21.0 h1:Rs+Y7hSXT83Jacb7kFyjn4ijOuVGSvOdF2+tg1TRrwQ= @@ -51,6 +55,8 @@ github.com/google/pprof v0.0.0-20250403155104-27863c87afa6 h1:BHT72Gu3keYf3ZEu2J github.com/google/pprof v0.0.0-20250403155104-27863c87afa6/go.mod h1:boTsfXsheKC2y+lKOCMpSfarhxDeIzfZG1jqGcPl3cA= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/imdario/mergo v0.3.13 h1:lFzP57bqS/wsqKssCGmtLAb8A0wKjLGrve2q3PPVcBk= github.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK2O4oXg= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= @@ -76,8 +82,8 @@ github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00 h1:n6/ github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00/go.mod h1:Pm3mSP3c5uWn86xMLZ5Sa7JB9GsEZySvHYXCTK4E9q4= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/nutanix-cloud-native/cluster-api-provider-nutanix v1.7.0 h1:HLfiahNib53AzH5frN5OG5Xoimr8G4DqnpR/inpBnXg= -github.com/nutanix-cloud-native/cluster-api-provider-nutanix v1.7.0/go.mod h1:6AJwae8W/nGmITlnuTnvMxCxxztctEAUJulxC9z/jgU= +github.com/nutanix-cloud-native/cluster-api-provider-nutanix v1.7.1 h1:uOS59KRqI442jIRrTtEN212SPsfDvqSDxJf0e9xHaGU= +github.com/nutanix-cloud-native/cluster-api-provider-nutanix v1.7.1/go.mod h1:6AJwae8W/nGmITlnuTnvMxCxxztctEAUJulxC9z/jgU= github.com/nutanix-cloud-native/prism-go-client v0.5.0 h1:aSNuKDOK7+q676MQyetYXcySY41IjSvN2UmrDIU3+6s= github.com/nutanix-cloud-native/prism-go-client v0.5.0/go.mod h1:QhLX+sEep0cStzHVYU6mPgIlnA8U3DySskagrbDprRk= github.com/onsi/ginkgo/v2 v2.23.4 h1:ktYTpKJAVZnDT4VjxSbiBenUjmlL/5QkBEocaWXiQus= @@ -123,6 +129,10 @@ go.starlark.net v0.0.0-20230525235612-a134d8f9ddca h1:VdD38733bfYv5tUZwEIskMM93V go.starlark.net v0.0.0-20230525235612-a134d8f9ddca/go.mod h1:jxU+3+j+71eXOW14274+SmmuW82qJzl6iZSeqEtTGds= go.uber.org/automaxprocs v1.6.0 h1:O3y2/QNTOdbF+e/dpXNNW7Rx2hZ4sTIPyybbxyNqTUs= go.uber.org/automaxprocs v1.6.0/go.mod h1:ifeIMSnPZuznNm6jmdzmU3/bfk01Fe2fotchwEFJ8r8= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= @@ -136,6 +146,8 @@ golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.38.0 h1:vRMAPTMaeGqVhG5QyLJHqNDwecKTomGeqbnfZyKlBI8= golang.org/x/net v0.38.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8= +golang.org/x/oauth2 v0.28.0 h1:CrgCKl8PPAVtLnU3c+EDw6x11699EWlsDeWNWKdIOkc= +golang.org/x/oauth2 v0.28.0/go.mod h1:onh5ek6nERTohokkhCD/y2cV4Do3fxFHFuAejCkRWT8= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -144,10 +156,14 @@ golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.32.0 h1:s77OFDvIQeibCmezSnk/q6iAfkdiQaJi4VzroCFrN20= golang.org/x/sys v0.32.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/term v0.30.0 h1:PQ39fJZ+mfadBm0y5WlL4vlM7Sx1Hgf13sMIY2+QS9Y= +golang.org/x/term v0.30.0/go.mod h1:NYYFdzHoI5wRh/h5tDMdMqCqPJZEuNqVR5xJLd/n67g= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.23.0 h1:D71I7dUrlY+VX0gQShAThNGHFxZ13dGLBHQLVl1mJlY= golang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4= +golang.org/x/time v0.8.0 h1:9i3RxcPv3PZnitoVGMPDKZSq1xW1gK1Xy3ArNOGZfEg= +golang.org/x/time v0.8.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= @@ -168,6 +184,8 @@ google.golang.org/protobuf v1.36.5/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojt gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/evanphx/json-patch.v4 v4.12.0 h1:n6jtcsulIzXPJaxegRbvFNNrZDjbij7ny3gmSPG+6V4= +gopkg.in/evanphx/json-patch.v4 v4.12.0/go.mod h1:p8EYWUEYMpynmqDbY58zCKCFZw8pRWMG4EsWvDvM72M= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=