diff --git a/.github/workflows/pr_size.yml b/.github/workflows/pr_size.yml index 0f72a29..c4cee6b 100644 --- a/.github/workflows/pr_size.yml +++ b/.github/workflows/pr_size.yml @@ -2,6 +2,10 @@ name: pr_size on: [pull_request] +permissions: + contents: read + pull-requests: write + jobs: labeler: runs-on: ubuntu-latest @@ -15,4 +19,4 @@ jobs: m_max_size: '1500' l_max_size: '5000' fail_if_xl: 'false' - message_if_xl: 'This PR is so big! Please, split it 😊' \ No newline at end of file + message_if_xl: 'This PR is so big! Please, split it 😊' diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 510d4e2..b69d108 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -7,10 +7,10 @@ jobs: name: test runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 - - uses: actions/setup-go@v2 + - uses: actions/checkout@v5 + - uses: actions/setup-go@v6 with: - go-version: '1.19' + go-version-file: go.mod - name: Build run: make build - name: Test diff --git a/Dockerfile b/Dockerfile index 8f9cca1..a9163b1 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,5 @@ # Build the manager binary -FROM golang:1.19 as builder +FROM golang:1.26 AS builder ARG TARGETOS ARG TARGETARCH @@ -15,6 +15,7 @@ RUN go mod download COPY main.go main.go COPY api/ api/ COPY controllers/ controllers/ +COPY internal/ internal/ # Build # the GOARCH has not a default value to allow the binary be built according to the host where the command diff --git a/Makefile b/Makefile index b591b3b..cd3a076 100644 --- a/Makefile +++ b/Makefile @@ -2,7 +2,7 @@ # Image URL to use all building/pushing image targets IMG ?= controller:latest # ENVTEST_K8S_VERSION refers to the version of kubebuilder assets to be downloaded by envtest binary. -ENVTEST_K8S_VERSION = 1.25.0 +ENVTEST_K8S_VERSION = 1.36.0 # Get the currently used golang install path (in GOPATH/bin, unless GOBIN is set) ifeq (,$(shell go env GOBIN)) @@ -134,8 +134,9 @@ ENVTEST ?= $(LOCALBIN)/setup-envtest COUNTERFEITER := $(LOCALBIN)/counterfeiter ## Tool Versions -KUSTOMIZE_VERSION ?= v3.8.7 -CONTROLLER_TOOLS_VERSION ?= v0.9.2 +KUSTOMIZE_VERSION ?= v5.8.3 +CONTROLLER_TOOLS_VERSION ?= v0.23.0 +COUNTERFEITER_VERSION ?= v6.14.0 KUSTOMIZE_INSTALL_SCRIPT ?= "https://raw.githubusercontent.com/kubernetes-sigs/kustomize/master/hack/install_kustomize.sh" .PHONY: kustomize @@ -151,9 +152,9 @@ $(CONTROLLER_GEN): $(LOCALBIN) .PHONY: counterfeiter counterfeiter: $(COUNTERFEITER) $(COUNTERFEITER): $(LOCALBIN) - cd $(LOCALBIN); go build -o . github.com/maxbrunsfeld/counterfeiter/v6 + test -s $(LOCALBIN)/counterfeiter || GOBIN=$(LOCALBIN) go install github.com/maxbrunsfeld/counterfeiter/v6@$(COUNTERFEITER_VERSION) .PHONY: envtest envtest: $(ENVTEST) ## Download envtest-setup locally if necessary. $(ENVTEST): $(LOCALBIN) - test -s $(LOCALBIN)/setup-envtest || GOBIN=$(LOCALBIN) go install sigs.k8s.io/controller-runtime/tools/setup-envtest@latest + test -s $(LOCALBIN)/setup-envtest || GOBIN=$(LOCALBIN) go install sigs.k8s.io/controller-runtime/tools/setup-envtest@release-0.24 diff --git a/README.md b/README.md index 0a19d81..d2e3137 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,23 @@ devices. For now refer to the auto-generated [kubebuilder docs](/docs/kubebuilder.md). +### Microvm spec + +The `Microvm` spec (and the `template.spec` of `MicrovmReplicaSet`, +`MicrovmDeployment` and `MicrovmTemplate`) embeds the shared +[controller-pkg](https://github.com/liquidmetal-dev/controller-pkg) microvm spec. +As well as the usual `vcpu`, `memoryMb`, `kernel`, `rootVolume`, +`additionalVolumes` and `networkInterfaces` fields it supports: + +- `provider`: the microvm provider to use on the host. Unset means the host's default. +- `allowGuestAgent`: attach a vsock device so the in-guest guest-agent can talk to the host. +- `cpuConfig.featuresToEnable` / `cpuConfig.kvmCapabilitiesToDisable`: CPU feature tuning; values are provider specific. +- `additionalVolumes[].mountPoint`: guest path at which to mount the volume. +- `additionalVolumes[].virtiofsPath`: back the volume with a virtiofs share instead of a container `image`. + +These fields need flintlock v0.16.0 or newer on the host. See +[config/samples](/config/samples) for examples. + ## Contributing Refer to the general [Liquid Metal contribution guides](https://weaveworks-liquidmetal.github.io/site/docs/category/guide-for-contributors/). diff --git a/api/v1alpha1/condition_consts.go b/api/v1alpha1/condition_consts.go index ce43590..d3743e7 100644 --- a/api/v1alpha1/condition_consts.go +++ b/api/v1alpha1/condition_consts.go @@ -3,7 +3,7 @@ package v1alpha1 -import clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" +import clusterv1 "sigs.k8s.io/cluster-api/api/core/v1beta2" const ( // MicrovmReadyCondition indicates that the microvm is in a running state. diff --git a/api/v1alpha1/microvm_types.go b/api/v1alpha1/microvm_types.go index 9bcd449..b842bd7 100644 --- a/api/v1alpha1/microvm_types.go +++ b/api/v1alpha1/microvm_types.go @@ -17,10 +17,10 @@ limitations under the License. package v1alpha1 import ( - flclient "github.com/weaveworks-liquidmetal/controller-pkg/client" - microvm "github.com/weaveworks-liquidmetal/controller-pkg/types/microvm" + flclient "github.com/liquidmetal-dev/controller-pkg/client" + microvm "github.com/liquidmetal-dev/controller-pkg/types/microvm" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" + clusterv1 "sigs.k8s.io/cluster-api/api/core/v1beta2" ) const ( @@ -190,12 +190,12 @@ func init() { SchemeBuilder.Register(&Microvm{}, &MicrovmList{}) } -// GetConditions returns the observations of the operational state of the MicrovmMachine resource. -func (r *Microvm) GetConditions() clusterv1.Conditions { +// GetV1Beta1Conditions returns the observations of the operational state of the MicrovmMachine resource. +func (r *Microvm) GetV1Beta1Conditions() clusterv1.Conditions { return r.Status.Conditions } -// SetConditions sets the underlying service state of the MicrovmMachine to the predescribed clusterv1.Conditions. -func (r *Microvm) SetConditions(conditions clusterv1.Conditions) { +// SetV1Beta1Conditions sets the underlying service state of the MicrovmMachine to the predescribed clusterv1.Conditions. +func (r *Microvm) SetV1Beta1Conditions(conditions clusterv1.Conditions) { r.Status.Conditions = conditions } diff --git a/api/v1alpha1/microvmdeployment_types.go b/api/v1alpha1/microvmdeployment_types.go index c8db06d..06552b5 100644 --- a/api/v1alpha1/microvmdeployment_types.go +++ b/api/v1alpha1/microvmdeployment_types.go @@ -17,9 +17,9 @@ limitations under the License. package v1alpha1 import ( - microvm "github.com/weaveworks-liquidmetal/controller-pkg/types/microvm" + microvm "github.com/liquidmetal-dev/controller-pkg/types/microvm" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" + clusterv1 "sigs.k8s.io/cluster-api/api/core/v1beta2" ) const ( @@ -93,12 +93,12 @@ func init() { SchemeBuilder.Register(&MicrovmDeployment{}, &MicrovmDeploymentList{}) } -// GetConditions returns the observations of the operational state of the MicrovmMachine resource. -func (r *MicrovmDeployment) GetConditions() clusterv1.Conditions { +// GetV1Beta1Conditions returns the observations of the operational state of the MicrovmMachine resource. +func (r *MicrovmDeployment) GetV1Beta1Conditions() clusterv1.Conditions { return r.Status.Conditions } -// SetConditions sets the underlying service state of the MicrovmMachine to the predescribed clusterv1.Conditions. -func (r *MicrovmDeployment) SetConditions(conditions clusterv1.Conditions) { +// SetV1Beta1Conditions sets the underlying service state of the MicrovmMachine to the predescribed clusterv1.Conditions. +func (r *MicrovmDeployment) SetV1Beta1Conditions(conditions clusterv1.Conditions) { r.Status.Conditions = conditions } diff --git a/api/v1alpha1/microvmreplicaset_types.go b/api/v1alpha1/microvmreplicaset_types.go index 4a8c0c1..6094c08 100644 --- a/api/v1alpha1/microvmreplicaset_types.go +++ b/api/v1alpha1/microvmreplicaset_types.go @@ -17,9 +17,9 @@ limitations under the License. package v1alpha1 import ( - microvm "github.com/weaveworks-liquidmetal/controller-pkg/types/microvm" + microvm "github.com/liquidmetal-dev/controller-pkg/types/microvm" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" + clusterv1 "sigs.k8s.io/cluster-api/api/core/v1beta2" ) const ( @@ -91,12 +91,12 @@ func init() { SchemeBuilder.Register(&MicrovmReplicaSet{}, &MicrovmReplicaSetList{}) } -// GetConditions returns the observations of the operational state of the MicrovmMachine resource. -func (r *MicrovmReplicaSet) GetConditions() clusterv1.Conditions { +// GetV1Beta1Conditions returns the observations of the operational state of the MicrovmMachine resource. +func (r *MicrovmReplicaSet) GetV1Beta1Conditions() clusterv1.Conditions { return r.Status.Conditions } -// SetConditions sets the underlying service state of the MicrovmMachine to the predescribed clusterv1.Conditions. -func (r *MicrovmReplicaSet) SetConditions(conditions clusterv1.Conditions) { +// SetV1Beta1Conditions sets the underlying service state of the MicrovmMachine to the predescribed clusterv1.Conditions. +func (r *MicrovmReplicaSet) SetV1Beta1Conditions(conditions clusterv1.Conditions) { r.Status.Conditions = conditions } diff --git a/api/v1alpha1/zz_generated.deepcopy.go b/api/v1alpha1/zz_generated.deepcopy.go index e0ec948..21ee85e 100644 --- a/api/v1alpha1/zz_generated.deepcopy.go +++ b/api/v1alpha1/zz_generated.deepcopy.go @@ -1,5 +1,4 @@ //go:build !ignore_autogenerated -// +build !ignore_autogenerated /* Copyright 2022 Weaveworks. @@ -22,10 +21,10 @@ limitations under the License. package v1alpha1 import ( - "github.com/weaveworks-liquidmetal/controller-pkg/client" - "github.com/weaveworks-liquidmetal/controller-pkg/types/microvm" + "github.com/liquidmetal-dev/controller-pkg/client" + "github.com/liquidmetal-dev/controller-pkg/types/microvm" runtime "k8s.io/apimachinery/pkg/runtime" - "sigs.k8s.io/cluster-api/api/v1beta1" + "sigs.k8s.io/cluster-api/api/core/v1beta2" ) // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. @@ -166,7 +165,7 @@ func (in *MicrovmDeploymentStatus) DeepCopyInto(out *MicrovmDeploymentStatus) { *out = *in if in.Conditions != nil { in, out := &in.Conditions, &out.Conditions - *out = make(v1beta1.Conditions, len(*in)) + *out = make(v1beta2.Conditions, len(*in)) for i := range *in { (*in)[i].DeepCopyInto(&(*out)[i]) } @@ -301,7 +300,7 @@ func (in *MicrovmReplicaSetStatus) DeepCopyInto(out *MicrovmReplicaSetStatus) { *out = *in if in.Conditions != nil { in, out := &in.Conditions, &out.Conditions - *out = make(v1beta1.Conditions, len(*in)) + *out = make(v1beta2.Conditions, len(*in)) for i := range *in { (*in)[i].DeepCopyInto(&(*out)[i]) } @@ -377,7 +376,7 @@ func (in *MicrovmStatus) DeepCopyInto(out *MicrovmStatus) { } if in.Conditions != nil { in, out := &in.Conditions, &out.Conditions - *out = make(v1beta1.Conditions, len(*in)) + *out = make(v1beta2.Conditions, len(*in)) for i := range *in { (*in)[i].DeepCopyInto(&(*out)[i]) } diff --git a/config/crd/bases/infrastructure.liquid-metal.io_microvmdeployments.yaml b/config/crd/bases/infrastructure.liquid-metal.io_microvmdeployments.yaml index ca5a7b6..52fe35e 100644 --- a/config/crd/bases/infrastructure.liquid-metal.io_microvmdeployments.yaml +++ b/config/crd/bases/infrastructure.liquid-metal.io_microvmdeployments.yaml @@ -3,8 +3,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.9.2 - creationTimestamp: null + controller-gen.kubebuilder.io/version: v0.23.0 name: microvmdeployments.infrastructure.liquid-metal.io spec: group: infrastructure.liquid-metal.io @@ -21,14 +20,19 @@ spec: description: MicrovmDeployment is the Schema for the microvmdeployments API properties: apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + description: |- + APIVersion defines the versioned schema of this representation of an object. + Servers should convert recognized schemas to the latest internal value, and + may reject unrecognized values. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources type: string kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + description: |- + Kind is a string value representing the REST resource this object represents. + Servers may infer this from the endpoint the client submits requests to. + Cannot be updated. + In CamelCase. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds type: string metadata: type: object @@ -40,8 +44,9 @@ spec: items: properties: endpoint: - description: Endpoint is the API endpoint for the microvm service - (i.e. flintlock) including the port. + description: |- + Endpoint is the API endpoint for the microvm service (i.e. flintlock) + including the port. type: string name: description: Name is an optional name for the host. @@ -52,36 +57,71 @@ spec: type: array replicas: default: 1 - description: Replicas is the number of Microvms to create on the given - Host with the given Microvm spec + description: |- + Replicas is the number of Microvms to create on the given Host with the given + Microvm spec format: int32 type: integer template: - description: 'Template is the object that describes the Microvm that - will be created if insufficient replicas are detected. More info: - https://kubernetes.io/docs/concepts/workloads/controllers/replicationcontroller#pod-template' + description: |- + Template is the object that describes the Microvm that will be created if + insufficient replicas are detected. + More info: https://kubernetes.io/docs/concepts/workloads/controllers/replicationcontroller#pod-template properties: metadata: type: object spec: description: Specification of the desired behavior of the Microvm. properties: + allowGuestAgent: + description: |- + AllowGuestAgent, when true, attaches a vsock device to the microvm so the in-guest + guest-agent can communicate with the host. + type: boolean basicAuthSecret: - description: "TODO this needs to go and be pulled off the - owning object probably needs to be part of Hosts once that - becomes an array BasicAuthSecret is the name of the secret - containing basic auth info for the host The secret should - be created in the same namespace as the MicroVM. \n apiVersion: - v1 kind: Secret metadata: name: mybasicauthsecret namespace: - same-as-microvm type: Opaque data: token: YWRtaW4=" + description: |- + probably needs to be part of Hosts once that becomes an array + BasicAuthSecret is the name of the secret containing basic auth info for the host + The secret should be created in the same namespace as the MicroVM. + + apiVersion: v1 + kind: Secret + metadata: + name: mybasicauthsecret + namespace: same-as-microvm + type: Opaque + data: + token: YWRtaW4= type: string + cpuConfig: + description: |- + CPUConfig allows customising the CPU features presented to the guest. + Support and semantics vary by provider. + properties: + featuresToEnable: + description: |- + FeaturesToEnable is a list of optional CPU features to enable. Accepted values are + provider specific (e.g. named features such as "amx" for Cloud Hypervisor, or numeric + KVM capability IDs for Firecracker). The "!" prefix is not allowed here. + items: + type: string + type: array + kvmCapabilitiesToDisable: + description: |- + KVMCapabilitiesToDisable is a list of KVM capability IDs to disable. Only supported by + providers that declare the KVMCapabilitiesDisable capability (currently Firecracker only). + items: + type: string + type: array + type: object host: description: Host sets the host device address for Microvm creation. properties: endpoint: - description: Endpoint is the API endpoint for the microvm - service (i.e. flintlock) including the port. + description: |- + Endpoint is the API endpoint for the microvm service (i.e. flintlock) + including the port. type: string name: description: Name is an optional name for the host. @@ -119,10 +159,10 @@ spec: kernelCmdline: additionalProperties: type: string - description: KernelCmdLine are the additional args to use - for the kernel cmdline. Each MicroVM provider has its own - recommended list, they will be used automatically. This - field is for additional values. + description: |- + KernelCmdLine are the additional args to use for the kernel cmdline. + Each MicroVM provider has its own recommended list, they will be used + automatically. This field is for additional values. type: object labels: additionalProperties: @@ -137,10 +177,9 @@ spec: minimum: 1024 type: integer microvmProxy: - description: MicrovmProxy is the proxy server details to use - when calling the microvm service. This is an alternative - to using the http proxy environment variables and applied - purely to the grpc service. + description: |- + MicrovmProxy is the proxy server details to use when calling the microvm service. This is an + alternative to using the http proxy environment variables and applied purely to the grpc service. properties: endpoint: description: Endpoint is the address of the proxy. @@ -165,9 +204,9 @@ spec: interface to create in the microvm. type: string guestMac: - description: GuestMAC allows the specifying of a specific - MAC address to use for the interface. If not supplied - a autogenerated MAC address will be used. + description: |- + GuestMAC allows the specifying of a specific MAC address to use for the interface. If + not supplied a autogenerated MAC address will be used. type: string type: description: Type is the type of host network interface @@ -182,9 +221,17 @@ spec: type: object minItems: 1 type: array + provider: + description: |- + Provider allows you to specify the name of the microvm provider to use. + If this isn't supplied then the default provider will be used. + NOTE that the default provider cannot be controlled here: it would have been + chosen by the operator configuring Flintlock on the remote host. + type: string providerID: - description: ProviderID is the unique identifier as specified - by the cloud provider. Do not supply this field as a user. + description: |- + ProviderID is the unique identifier as specified by the cloud provider. + Do not supply this field as a user. type: string rootVolume: description: RootVolume specifies the volume to use for the @@ -194,17 +241,25 @@ spec: description: ID is a unique identifier for this volume. type: string image: - description: Image is the container image to use for the - volume. + description: Image is the container image to use as the + source for the volume. + type: string + mountPoint: + description: |- + MountPoint specifies the guest mountpoint for the volume. + This will only be applied to additional volumes. type: string readOnly: default: false description: ReadOnly specifies that the volume is to be mounted readonly. type: boolean + virtiofsPath: + description: VirtioFSPath specifies the path in the guest + where virtiofs is mounted. + type: string required: - id - - image type: object sshPublicKeys: description: SSHPublicKeys is list of SSH public keys which @@ -221,35 +276,38 @@ spec: description: User is the name of the user to add keys for (eg root, ubuntu). type: string + required: + - authorizedKeys + - user type: object type: array tlsSecretRef: - description: "TODO this needs to go and be pulled off the - owning object probably needs to be part of Hosts once that - becomes an array mTLS Configuration: \n It is recommended - that each flintlock host is configured with its own cert - signed by a common CA, and set to use mTLS. The flintlock-operator - should be provided with the CA, and a client cert and key - signed by that CA. TLSSecretRef is a reference to the name - of a secret which contains TLS cert information for connecting - to Flintlock hosts. The secret should be created in the - same namespace as the MicroVMCluster. The secret should - be of type Opaque with the addition of a ca.crt key. \n - apiVersion: v1 kind: Secret metadata: name: secret-tls namespace: - default <- same as Cluster type: Opaque data: tls.crt: - | -----BEGIN CERTIFICATE----- MIIC2DCCAcCgAwIBAgIBATANBgkqh - ... -----END CERTIFICATE----- tls.key: | -----BEGIN EC PRIVATE - KEY----- MIIEpgIBAAKCAQEA7yn3bRHQ5FHMQ ... -----END EC PRIVATE - KEY----- ca.crt: | -----BEGIN CERTIFICATE----- MIIEpgIBAAKCAQEA7yn3bRHQ5FHMQ - ... -----END CERTIFICATE-----" + description: "probably needs to be part of Hosts once that + becomes an array\nmTLS Configuration:\n\nIt is recommended + that each flintlock host is configured with its own cert\nsigned + by a common CA, and set to use mTLS.\nThe flintlock-operator + should be provided with the CA, and a client cert and key\nsigned + by that CA.\nTLSSecretRef is a reference to the name of + a secret which contains TLS cert information\nfor connecting + to Flintlock hosts.\nThe secret should be created in the + same namespace as the MicroVMCluster.\nThe secret should + be of type Opaque\nwith the addition of a ca.crt key.\n\napiVersion: + v1\nkind: Secret\nmetadata:\n\tname: secret-tls\n\tnamespace: + default <- same as Cluster\ntype: Opaque\ndata:\n\ttls.crt: + |\n\t\t-----BEGIN CERTIFICATE-----\n\t\tMIIC2DCCAcCgAwIBAgIBATANBgkqh + ...\n\t\t-----END CERTIFICATE-----\n\ttls.key: |\n\t\t-----BEGIN + EC PRIVATE KEY-----\n\t\tMIIEpgIBAAKCAQEA7yn3bRHQ5FHMQ ...\n\t\t-----END + EC PRIVATE KEY-----\n\tca.crt: |\n\t\t-----BEGIN CERTIFICATE-----\n\t\tMIIEpgIBAAKCAQEA7yn3bRHQ5FHMQ + ...\n\t\t-----END CERTIFICATE-----" type: string userdata: description: "UserData is additional userdata script to execute - in the Microvm's cloud init. This can be in the form of - a raw shell script, eg: userdata: | #!/bin/bash echo \"hi - from my microvm\" \n or in valid cloud-config, eg: userdata: - | #cloud-config write_files: - content: \"hello\" path: - \"/root/FINDME\" owner: \"root:root\" permissions: \"0755\"" + in the Microvm's cloud init.\nThis can be in the form of + a raw shell script, eg:\nuserdata: |\n #!/bin/bash\n echo + \"hi from my microvm\"\n\nor in valid cloud-config, eg:\nuserdata: + |\n\t#cloud-config\n\twrite_files:\n\t- content: \"hello\"\n\t\tpath: + \"/root/FINDME\"\n\t\towner: \"root:root\"\n\t\tpermissions: + \"0755\"" type: string vcpu: description: VCPU specifies how many vcpu's the microvm will @@ -268,20 +326,29 @@ spec: description: ID is a unique identifier for this volume. type: string image: - description: Image is the container image to use for - the volume. + description: Image is the container image to use as + the source for the volume. + type: string + mountPoint: + description: |- + MountPoint specifies the guest mountpoint for the volume. + This will only be applied to additional volumes. type: string readOnly: default: false description: ReadOnly specifies that the volume is to be mounted readonly. type: boolean + virtiofsPath: + description: VirtioFSPath specifies the path in the + guest where virtiofs is mounted. + type: string required: - id - - image type: object type: array required: + - "" - kernel - memoryMb - networkInterfaces @@ -289,6 +356,8 @@ spec: - vcpu type: object type: object + required: + - hosts type: object status: description: MicrovmDeploymentStatus defines the observed state of MicrovmDeployment @@ -297,41 +366,50 @@ spec: description: Represents the latest available observations of a deployments's current state. items: - description: Condition defines an observation of a Cluster API resource - operational state. + description: |- + Condition defines an observation of a Cluster API resource operational state. + + Deprecated: This type is deprecated and is going to be removed when support for v1beta1 will be dropped. Please see https://github.com/kubernetes-sigs/cluster-api/blob/main/docs/proposals/20240916-improve-status-in-CAPI-resources.md for more details. properties: lastTransitionTime: - description: Last time the condition transitioned from one status - to another. This should be when the underlying condition changed. - If that is not known, then using the time when the API field - changed is acceptable. + description: |- + lastTransitionTime is the last time the condition transitioned from one status to another. + This should be when the underlying condition changed. If that is not known, then using the time when + the API field changed is acceptable. format: date-time type: string message: - description: A human readable message indicating details about - the transition. This field may be empty. + description: |- + message is a human readable message indicating details about the transition. + This field may be empty. + maxLength: 10240 + minLength: 1 type: string reason: - description: The reason for the condition's last transition - in CamelCase. The specific API may choose whether or not this - field is considered a guaranteed API. This field may not be - empty. + description: |- + reason is the reason for the condition's last transition in CamelCase. + The specific API may choose whether or not this field is considered a guaranteed API. + This field may be empty. + maxLength: 256 + minLength: 1 type: string severity: - description: Severity provides an explicit classification of - Reason code, so the users or machines can immediately understand - the current situation and act accordingly. The Severity field - MUST be set only when Status=False. + description: |- + severity provides an explicit classification of Reason code, so the users or machines can immediately + understand the current situation and act accordingly. + The Severity field MUST be set only when Status=False. + maxLength: 32 type: string status: - description: Status of the condition, one of True, False, Unknown. + description: status of the condition, one of True, False, Unknown. type: string type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. - Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. + description: |- + type of condition in CamelCase or in foo.example.com/CamelCase. + Many .condition.type values are consistent across resources like Available, but because arbitrary conditions + can be useful (see .node.status.conditions), the ability to deconflict is important. + maxLength: 256 + minLength: 1 type: string required: - lastTransitionTime diff --git a/config/crd/bases/infrastructure.liquid-metal.io_microvmreplicasets.yaml b/config/crd/bases/infrastructure.liquid-metal.io_microvmreplicasets.yaml index d04741a..2c64b18 100644 --- a/config/crd/bases/infrastructure.liquid-metal.io_microvmreplicasets.yaml +++ b/config/crd/bases/infrastructure.liquid-metal.io_microvmreplicasets.yaml @@ -3,8 +3,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.9.2 - creationTimestamp: null + controller-gen.kubebuilder.io/version: v0.23.0 name: microvmreplicasets.infrastructure.liquid-metal.io spec: group: infrastructure.liquid-metal.io @@ -21,14 +20,19 @@ spec: description: MicrovmReplicaSet is the Schema for the microvmreplicasets API properties: apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + description: |- + APIVersion defines the versioned schema of this representation of an object. + Servers should convert recognized schemas to the latest internal value, and + may reject unrecognized values. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources type: string kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + description: |- + Kind is a string value representing the REST resource this object represents. + Servers may infer this from the endpoint the client submits requests to. + Cannot be updated. + In CamelCase. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds type: string metadata: type: object @@ -39,8 +43,9 @@ spec: description: Host sets the host device address for Microvm creation. properties: endpoint: - description: Endpoint is the API endpoint for the microvm service - (i.e. flintlock) including the port. + description: |- + Endpoint is the API endpoint for the microvm service (i.e. flintlock) + including the port. type: string name: description: Name is an optional name for the host. @@ -50,36 +55,71 @@ spec: type: object replicas: default: 1 - description: Replicas is the number of Microvms to create on the given - Host with the given Microvm spec + description: |- + Replicas is the number of Microvms to create on the given Host with the given + Microvm spec format: int32 type: integer template: - description: 'Template is the object that describes the Microvm that - will be created if insufficient replicas are detected. More info: - https://kubernetes.io/docs/concepts/workloads/controllers/replicationcontroller#pod-template' + description: |- + Template is the object that describes the Microvm that will be created if + insufficient replicas are detected. + More info: https://kubernetes.io/docs/concepts/workloads/controllers/replicationcontroller#pod-template properties: metadata: type: object spec: description: Specification of the desired behavior of the Microvm. properties: + allowGuestAgent: + description: |- + AllowGuestAgent, when true, attaches a vsock device to the microvm so the in-guest + guest-agent can communicate with the host. + type: boolean basicAuthSecret: - description: "TODO this needs to go and be pulled off the - owning object probably needs to be part of Hosts once that - becomes an array BasicAuthSecret is the name of the secret - containing basic auth info for the host The secret should - be created in the same namespace as the MicroVM. \n apiVersion: - v1 kind: Secret metadata: name: mybasicauthsecret namespace: - same-as-microvm type: Opaque data: token: YWRtaW4=" + description: |- + probably needs to be part of Hosts once that becomes an array + BasicAuthSecret is the name of the secret containing basic auth info for the host + The secret should be created in the same namespace as the MicroVM. + + apiVersion: v1 + kind: Secret + metadata: + name: mybasicauthsecret + namespace: same-as-microvm + type: Opaque + data: + token: YWRtaW4= type: string + cpuConfig: + description: |- + CPUConfig allows customising the CPU features presented to the guest. + Support and semantics vary by provider. + properties: + featuresToEnable: + description: |- + FeaturesToEnable is a list of optional CPU features to enable. Accepted values are + provider specific (e.g. named features such as "amx" for Cloud Hypervisor, or numeric + KVM capability IDs for Firecracker). The "!" prefix is not allowed here. + items: + type: string + type: array + kvmCapabilitiesToDisable: + description: |- + KVMCapabilitiesToDisable is a list of KVM capability IDs to disable. Only supported by + providers that declare the KVMCapabilitiesDisable capability (currently Firecracker only). + items: + type: string + type: array + type: object host: description: Host sets the host device address for Microvm creation. properties: endpoint: - description: Endpoint is the API endpoint for the microvm - service (i.e. flintlock) including the port. + description: |- + Endpoint is the API endpoint for the microvm service (i.e. flintlock) + including the port. type: string name: description: Name is an optional name for the host. @@ -117,10 +157,10 @@ spec: kernelCmdline: additionalProperties: type: string - description: KernelCmdLine are the additional args to use - for the kernel cmdline. Each MicroVM provider has its own - recommended list, they will be used automatically. This - field is for additional values. + description: |- + KernelCmdLine are the additional args to use for the kernel cmdline. + Each MicroVM provider has its own recommended list, they will be used + automatically. This field is for additional values. type: object labels: additionalProperties: @@ -135,10 +175,9 @@ spec: minimum: 1024 type: integer microvmProxy: - description: MicrovmProxy is the proxy server details to use - when calling the microvm service. This is an alternative - to using the http proxy environment variables and applied - purely to the grpc service. + description: |- + MicrovmProxy is the proxy server details to use when calling the microvm service. This is an + alternative to using the http proxy environment variables and applied purely to the grpc service. properties: endpoint: description: Endpoint is the address of the proxy. @@ -163,9 +202,9 @@ spec: interface to create in the microvm. type: string guestMac: - description: GuestMAC allows the specifying of a specific - MAC address to use for the interface. If not supplied - a autogenerated MAC address will be used. + description: |- + GuestMAC allows the specifying of a specific MAC address to use for the interface. If + not supplied a autogenerated MAC address will be used. type: string type: description: Type is the type of host network interface @@ -180,9 +219,17 @@ spec: type: object minItems: 1 type: array + provider: + description: |- + Provider allows you to specify the name of the microvm provider to use. + If this isn't supplied then the default provider will be used. + NOTE that the default provider cannot be controlled here: it would have been + chosen by the operator configuring Flintlock on the remote host. + type: string providerID: - description: ProviderID is the unique identifier as specified - by the cloud provider. Do not supply this field as a user. + description: |- + ProviderID is the unique identifier as specified by the cloud provider. + Do not supply this field as a user. type: string rootVolume: description: RootVolume specifies the volume to use for the @@ -192,17 +239,25 @@ spec: description: ID is a unique identifier for this volume. type: string image: - description: Image is the container image to use for the - volume. + description: Image is the container image to use as the + source for the volume. + type: string + mountPoint: + description: |- + MountPoint specifies the guest mountpoint for the volume. + This will only be applied to additional volumes. type: string readOnly: default: false description: ReadOnly specifies that the volume is to be mounted readonly. type: boolean + virtiofsPath: + description: VirtioFSPath specifies the path in the guest + where virtiofs is mounted. + type: string required: - id - - image type: object sshPublicKeys: description: SSHPublicKeys is list of SSH public keys which @@ -219,35 +274,38 @@ spec: description: User is the name of the user to add keys for (eg root, ubuntu). type: string + required: + - authorizedKeys + - user type: object type: array tlsSecretRef: - description: "TODO this needs to go and be pulled off the - owning object probably needs to be part of Hosts once that - becomes an array mTLS Configuration: \n It is recommended - that each flintlock host is configured with its own cert - signed by a common CA, and set to use mTLS. The flintlock-operator - should be provided with the CA, and a client cert and key - signed by that CA. TLSSecretRef is a reference to the name - of a secret which contains TLS cert information for connecting - to Flintlock hosts. The secret should be created in the - same namespace as the MicroVMCluster. The secret should - be of type Opaque with the addition of a ca.crt key. \n - apiVersion: v1 kind: Secret metadata: name: secret-tls namespace: - default <- same as Cluster type: Opaque data: tls.crt: - | -----BEGIN CERTIFICATE----- MIIC2DCCAcCgAwIBAgIBATANBgkqh - ... -----END CERTIFICATE----- tls.key: | -----BEGIN EC PRIVATE - KEY----- MIIEpgIBAAKCAQEA7yn3bRHQ5FHMQ ... -----END EC PRIVATE - KEY----- ca.crt: | -----BEGIN CERTIFICATE----- MIIEpgIBAAKCAQEA7yn3bRHQ5FHMQ - ... -----END CERTIFICATE-----" + description: "probably needs to be part of Hosts once that + becomes an array\nmTLS Configuration:\n\nIt is recommended + that each flintlock host is configured with its own cert\nsigned + by a common CA, and set to use mTLS.\nThe flintlock-operator + should be provided with the CA, and a client cert and key\nsigned + by that CA.\nTLSSecretRef is a reference to the name of + a secret which contains TLS cert information\nfor connecting + to Flintlock hosts.\nThe secret should be created in the + same namespace as the MicroVMCluster.\nThe secret should + be of type Opaque\nwith the addition of a ca.crt key.\n\napiVersion: + v1\nkind: Secret\nmetadata:\n\tname: secret-tls\n\tnamespace: + default <- same as Cluster\ntype: Opaque\ndata:\n\ttls.crt: + |\n\t\t-----BEGIN CERTIFICATE-----\n\t\tMIIC2DCCAcCgAwIBAgIBATANBgkqh + ...\n\t\t-----END CERTIFICATE-----\n\ttls.key: |\n\t\t-----BEGIN + EC PRIVATE KEY-----\n\t\tMIIEpgIBAAKCAQEA7yn3bRHQ5FHMQ ...\n\t\t-----END + EC PRIVATE KEY-----\n\tca.crt: |\n\t\t-----BEGIN CERTIFICATE-----\n\t\tMIIEpgIBAAKCAQEA7yn3bRHQ5FHMQ + ...\n\t\t-----END CERTIFICATE-----" type: string userdata: description: "UserData is additional userdata script to execute - in the Microvm's cloud init. This can be in the form of - a raw shell script, eg: userdata: | #!/bin/bash echo \"hi - from my microvm\" \n or in valid cloud-config, eg: userdata: - | #cloud-config write_files: - content: \"hello\" path: - \"/root/FINDME\" owner: \"root:root\" permissions: \"0755\"" + in the Microvm's cloud init.\nThis can be in the form of + a raw shell script, eg:\nuserdata: |\n #!/bin/bash\n echo + \"hi from my microvm\"\n\nor in valid cloud-config, eg:\nuserdata: + |\n\t#cloud-config\n\twrite_files:\n\t- content: \"hello\"\n\t\tpath: + \"/root/FINDME\"\n\t\towner: \"root:root\"\n\t\tpermissions: + \"0755\"" type: string vcpu: description: VCPU specifies how many vcpu's the microvm will @@ -266,20 +324,29 @@ spec: description: ID is a unique identifier for this volume. type: string image: - description: Image is the container image to use for - the volume. + description: Image is the container image to use as + the source for the volume. + type: string + mountPoint: + description: |- + MountPoint specifies the guest mountpoint for the volume. + This will only be applied to additional volumes. type: string readOnly: default: false description: ReadOnly specifies that the volume is to be mounted readonly. type: boolean + virtiofsPath: + description: VirtioFSPath specifies the path in the + guest where virtiofs is mounted. + type: string required: - id - - image type: object type: array required: + - "" - kernel - memoryMb - networkInterfaces @@ -287,6 +354,8 @@ spec: - vcpu type: object type: object + required: + - host type: object status: description: MicrovmReplicaSetStatus defines the observed state of MicrovmReplicaSet @@ -295,41 +364,50 @@ spec: description: Represents the latest available observations of a replica set's current state. items: - description: Condition defines an observation of a Cluster API resource - operational state. + description: |- + Condition defines an observation of a Cluster API resource operational state. + + Deprecated: This type is deprecated and is going to be removed when support for v1beta1 will be dropped. Please see https://github.com/kubernetes-sigs/cluster-api/blob/main/docs/proposals/20240916-improve-status-in-CAPI-resources.md for more details. properties: lastTransitionTime: - description: Last time the condition transitioned from one status - to another. This should be when the underlying condition changed. - If that is not known, then using the time when the API field - changed is acceptable. + description: |- + lastTransitionTime is the last time the condition transitioned from one status to another. + This should be when the underlying condition changed. If that is not known, then using the time when + the API field changed is acceptable. format: date-time type: string message: - description: A human readable message indicating details about - the transition. This field may be empty. + description: |- + message is a human readable message indicating details about the transition. + This field may be empty. + maxLength: 10240 + minLength: 1 type: string reason: - description: The reason for the condition's last transition - in CamelCase. The specific API may choose whether or not this - field is considered a guaranteed API. This field may not be - empty. + description: |- + reason is the reason for the condition's last transition in CamelCase. + The specific API may choose whether or not this field is considered a guaranteed API. + This field may be empty. + maxLength: 256 + minLength: 1 type: string severity: - description: Severity provides an explicit classification of - Reason code, so the users or machines can immediately understand - the current situation and act accordingly. The Severity field - MUST be set only when Status=False. + description: |- + severity provides an explicit classification of Reason code, so the users or machines can immediately + understand the current situation and act accordingly. + The Severity field MUST be set only when Status=False. + maxLength: 32 type: string status: - description: Status of the condition, one of True, False, Unknown. + description: status of the condition, one of True, False, Unknown. type: string type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. - Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. + description: |- + type of condition in CamelCase or in foo.example.com/CamelCase. + Many .condition.type values are consistent across resources like Available, but because arbitrary conditions + can be useful (see .node.status.conditions), the ability to deconflict is important. + maxLength: 256 + minLength: 1 type: string required: - lastTransitionTime diff --git a/config/crd/bases/infrastructure.liquid-metal.io_microvms.yaml b/config/crd/bases/infrastructure.liquid-metal.io_microvms.yaml index e57b978..a9b5451 100644 --- a/config/crd/bases/infrastructure.liquid-metal.io_microvms.yaml +++ b/config/crd/bases/infrastructure.liquid-metal.io_microvms.yaml @@ -3,8 +3,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.9.2 - creationTimestamp: null + controller-gen.kubebuilder.io/version: v0.23.0 name: microvms.infrastructure.liquid-metal.io spec: group: infrastructure.liquid-metal.io @@ -21,34 +20,73 @@ spec: description: Microvm is the Schema for the microvms API properties: apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + description: |- + APIVersion defines the versioned schema of this representation of an object. + Servers should convert recognized schemas to the latest internal value, and + may reject unrecognized values. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources type: string kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + description: |- + Kind is a string value representing the REST resource this object represents. + Servers may infer this from the endpoint the client submits requests to. + Cannot be updated. + In CamelCase. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds type: string metadata: type: object spec: description: MicrovmSpec defines the desired state of Microvm properties: + allowGuestAgent: + description: |- + AllowGuestAgent, when true, attaches a vsock device to the microvm so the in-guest + guest-agent can communicate with the host. + type: boolean basicAuthSecret: - description: "TODO this needs to go and be pulled off the owning object - probably needs to be part of Hosts once that becomes an array BasicAuthSecret - is the name of the secret containing basic auth info for the host + description: |- + probably needs to be part of Hosts once that becomes an array + BasicAuthSecret is the name of the secret containing basic auth info for the host The secret should be created in the same namespace as the MicroVM. - \n apiVersion: v1 kind: Secret metadata: name: mybasicauthsecret - namespace: same-as-microvm type: Opaque data: token: YWRtaW4=" + + apiVersion: v1 + kind: Secret + metadata: + name: mybasicauthsecret + namespace: same-as-microvm + type: Opaque + data: + token: YWRtaW4= type: string + cpuConfig: + description: |- + CPUConfig allows customising the CPU features presented to the guest. + Support and semantics vary by provider. + properties: + featuresToEnable: + description: |- + FeaturesToEnable is a list of optional CPU features to enable. Accepted values are + provider specific (e.g. named features such as "amx" for Cloud Hypervisor, or numeric + KVM capability IDs for Firecracker). The "!" prefix is not allowed here. + items: + type: string + type: array + kvmCapabilitiesToDisable: + description: |- + KVMCapabilitiesToDisable is a list of KVM capability IDs to disable. Only supported by + providers that declare the KVMCapabilitiesDisable capability (currently Firecracker only). + items: + type: string + type: array + type: object host: description: Host sets the host device address for Microvm creation. properties: endpoint: - description: Endpoint is the API endpoint for the microvm service - (i.e. flintlock) including the port. + description: |- + Endpoint is the API endpoint for the microvm service (i.e. flintlock) + including the port. type: string name: description: Name is an optional name for the host. @@ -85,9 +123,10 @@ spec: kernelCmdline: additionalProperties: type: string - description: KernelCmdLine are the additional args to use for the - kernel cmdline. Each MicroVM provider has its own recommended list, - they will be used automatically. This field is for additional values. + description: |- + KernelCmdLine are the additional args to use for the kernel cmdline. + Each MicroVM provider has its own recommended list, they will be used + automatically. This field is for additional values. type: object labels: additionalProperties: @@ -101,10 +140,9 @@ spec: minimum: 1024 type: integer microvmProxy: - description: MicrovmProxy is the proxy server details to use when - calling the microvm service. This is an alternative to using the - http proxy environment variables and applied purely to the grpc - service. + description: |- + MicrovmProxy is the proxy server details to use when calling the microvm service. This is an + alternative to using the http proxy environment variables and applied purely to the grpc service. properties: endpoint: description: Endpoint is the address of the proxy. @@ -128,9 +166,9 @@ spec: to create in the microvm. type: string guestMac: - description: GuestMAC allows the specifying of a specific MAC - address to use for the interface. If not supplied a autogenerated - MAC address will be used. + description: |- + GuestMAC allows the specifying of a specific MAC address to use for the interface. If + not supplied a autogenerated MAC address will be used. type: string type: description: Type is the type of host network interface type @@ -145,9 +183,17 @@ spec: type: object minItems: 1 type: array + provider: + description: |- + Provider allows you to specify the name of the microvm provider to use. + If this isn't supplied then the default provider will be used. + NOTE that the default provider cannot be controlled here: it would have been + chosen by the operator configuring Flintlock on the remote host. + type: string providerID: - description: ProviderID is the unique identifier as specified by the - cloud provider. Do not supply this field as a user. + description: |- + ProviderID is the unique identifier as specified by the cloud provider. + Do not supply this field as a user. type: string rootVolume: description: RootVolume specifies the volume to use for the root of @@ -157,16 +203,25 @@ spec: description: ID is a unique identifier for this volume. type: string image: - description: Image is the container image to use for the volume. + description: Image is the container image to use as the source + for the volume. + type: string + mountPoint: + description: |- + MountPoint specifies the guest mountpoint for the volume. + This will only be applied to additional volumes. type: string readOnly: default: false description: ReadOnly specifies that the volume is to be mounted readonly. type: boolean + virtiofsPath: + description: VirtioFSPath specifies the path in the guest where + virtiofs is mounted. + type: string required: - id - - image type: object sshPublicKeys: description: SSHPublicKeys is list of SSH public keys which will be @@ -183,33 +238,36 @@ spec: description: User is the name of the user to add keys for (eg root, ubuntu). type: string + required: + - authorizedKeys + - user type: object type: array tlsSecretRef: - description: "TODO this needs to go and be pulled off the owning object - probably needs to be part of Hosts once that becomes an array mTLS - Configuration: \n It is recommended that each flintlock host is - configured with its own cert signed by a common CA, and set to use - mTLS. The flintlock-operator should be provided with the CA, and - a client cert and key signed by that CA. TLSSecretRef is a reference - to the name of a secret which contains TLS cert information for - connecting to Flintlock hosts. The secret should be created in the - same namespace as the MicroVMCluster. The secret should be of type - Opaque with the addition of a ca.crt key. \n apiVersion: v1 kind: - Secret metadata: name: secret-tls namespace: default <- same as - Cluster type: Opaque data: tls.crt: | -----BEGIN CERTIFICATE----- - MIIC2DCCAcCgAwIBAgIBATANBgkqh ... -----END CERTIFICATE----- tls.key: - | -----BEGIN EC PRIVATE KEY----- MIIEpgIBAAKCAQEA7yn3bRHQ5FHMQ ... - -----END EC PRIVATE KEY----- ca.crt: | -----BEGIN CERTIFICATE----- - MIIEpgIBAAKCAQEA7yn3bRHQ5FHMQ ... -----END CERTIFICATE-----" + description: "probably needs to be part of Hosts once that becomes + an array\nmTLS Configuration:\n\nIt is recommended that each flintlock + host is configured with its own cert\nsigned by a common CA, and + set to use mTLS.\nThe flintlock-operator should be provided with + the CA, and a client cert and key\nsigned by that CA.\nTLSSecretRef + is a reference to the name of a secret which contains TLS cert information\nfor + connecting to Flintlock hosts.\nThe secret should be created in + the same namespace as the MicroVMCluster.\nThe secret should be + of type Opaque\nwith the addition of a ca.crt key.\n\napiVersion: + v1\nkind: Secret\nmetadata:\n\tname: secret-tls\n\tnamespace: default + \ <- same as Cluster\ntype: Opaque\ndata:\n\ttls.crt: |\n\t\t-----BEGIN + CERTIFICATE-----\n\t\tMIIC2DCCAcCgAwIBAgIBATANBgkqh ...\n\t\t-----END + CERTIFICATE-----\n\ttls.key: |\n\t\t-----BEGIN EC PRIVATE KEY-----\n\t\tMIIEpgIBAAKCAQEA7yn3bRHQ5FHMQ + ...\n\t\t-----END EC PRIVATE KEY-----\n\tca.crt: |\n\t\t-----BEGIN + CERTIFICATE-----\n\t\tMIIEpgIBAAKCAQEA7yn3bRHQ5FHMQ ...\n\t\t-----END + CERTIFICATE-----" type: string userdata: description: "UserData is additional userdata script to execute in - the Microvm's cloud init. This can be in the form of a raw shell - script, eg: userdata: | #!/bin/bash echo \"hi from my microvm\" - \n or in valid cloud-config, eg: userdata: | #cloud-config write_files: - - content: \"hello\" path: \"/root/FINDME\" owner: \"root:root\" - permissions: \"0755\"" + the Microvm's cloud init.\nThis can be in the form of a raw shell + script, eg:\nuserdata: |\n #!/bin/bash\n echo \"hi from my microvm\"\n\nor + in valid cloud-config, eg:\nuserdata: |\n\t#cloud-config\n\twrite_files:\n\t- + content: \"hello\"\n\t\tpath: \"/root/FINDME\"\n\t\towner: \"root:root\"\n\t\tpermissions: + \"0755\"" type: string vcpu: description: VCPU specifies how many vcpu's the microvm will be allocated. @@ -226,19 +284,29 @@ spec: description: ID is a unique identifier for this volume. type: string image: - description: Image is the container image to use for the volume. + description: Image is the container image to use as the source + for the volume. + type: string + mountPoint: + description: |- + MountPoint specifies the guest mountpoint for the volume. + This will only be applied to additional volumes. type: string readOnly: default: false description: ReadOnly specifies that the volume is to be mounted readonly. type: boolean + virtiofsPath: + description: VirtioFSPath specifies the path in the guest where + virtiofs is mounted. + type: string required: - id - - image type: object type: array required: + - "" - kernel - memoryMb - networkInterfaces @@ -251,41 +319,50 @@ spec: conditions: description: Conditions defines current service state of the Microvm. items: - description: Condition defines an observation of a Cluster API resource - operational state. + description: |- + Condition defines an observation of a Cluster API resource operational state. + + Deprecated: This type is deprecated and is going to be removed when support for v1beta1 will be dropped. Please see https://github.com/kubernetes-sigs/cluster-api/blob/main/docs/proposals/20240916-improve-status-in-CAPI-resources.md for more details. properties: lastTransitionTime: - description: Last time the condition transitioned from one status - to another. This should be when the underlying condition changed. - If that is not known, then using the time when the API field - changed is acceptable. + description: |- + lastTransitionTime is the last time the condition transitioned from one status to another. + This should be when the underlying condition changed. If that is not known, then using the time when + the API field changed is acceptable. format: date-time type: string message: - description: A human readable message indicating details about - the transition. This field may be empty. + description: |- + message is a human readable message indicating details about the transition. + This field may be empty. + maxLength: 10240 + minLength: 1 type: string reason: - description: The reason for the condition's last transition - in CamelCase. The specific API may choose whether or not this - field is considered a guaranteed API. This field may not be - empty. + description: |- + reason is the reason for the condition's last transition in CamelCase. + The specific API may choose whether or not this field is considered a guaranteed API. + This field may be empty. + maxLength: 256 + minLength: 1 type: string severity: - description: Severity provides an explicit classification of - Reason code, so the users or machines can immediately understand - the current situation and act accordingly. The Severity field - MUST be set only when Status=False. + description: |- + severity provides an explicit classification of Reason code, so the users or machines can immediately + understand the current situation and act accordingly. + The Severity field MUST be set only when Status=False. + maxLength: 32 type: string status: - description: Status of the condition, one of True, False, Unknown. + description: status of the condition, one of True, False, Unknown. type: string type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. - Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. + description: |- + type of condition in CamelCase or in foo.example.com/CamelCase. + Many .condition.type values are consistent across resources like Available, but because arbitrary conditions + can be useful (see .node.status.conditions), the ability to deconflict is important. + maxLength: 256 + minLength: 1 type: string required: - lastTransitionTime @@ -294,34 +371,42 @@ spec: type: object type: array failureMessage: - description: "FailureMessage will be set in the event that there is - a terminal problem reconciling the Microvm and will contain a more - verbose string suitable for logging and human consumption. \n This - field should not be set for transitive errors that a controller - faces that are expected to be fixed automatically over time (like - service outages), but instead indicate that something is fundamentally - wrong with the Microvm's spec or the configuration of the controller, - and that manual intervention is required. Examples of terminal errors - would be invalid combinations of settings in the spec, values that - are unsupported by the controller, or the responsible controller - itself being critically misconfigured. \n Any transient errors that - occur during the reconciliation of Microvm can be added as events - to the Microvm object and/or logged in the controller's output." + description: |- + FailureMessage will be set in the event that there is a terminal problem + reconciling the Microvm and will contain a more verbose string suitable + for logging and human consumption. + + This field should not be set for transitive errors that a controller + faces that are expected to be fixed automatically over + time (like service outages), but instead indicate that something is + fundamentally wrong with the Microvm's spec or the configuration of + the controller, and that manual intervention is required. Examples + of terminal errors would be invalid combinations of settings in the + spec, values that are unsupported by the controller, or the + responsible controller itself being critically misconfigured. + + Any transient errors that occur during the reconciliation of Microvm + can be added as events to the Microvm object and/or logged in the + controller's output. type: string failureReason: - description: "FailureReason will be set in the event that there is - a terminal problem reconciling the Microvm and will contain a succinct - value suitable for machine interpretation. \n This field should - not be set for transitive errors that a controller faces that are - expected to be fixed automatically over time (like service outages), - but instead indicate that something is fundamentally wrong with - the Microvm's spec or the configuration of the controller, and that - manual intervention is required. Examples of terminal errors would - be invalid combinations of settings in the spec, values that are - unsupported by the controller, or the responsible controller itself - being critically misconfigured. \n Any transient errors that occur - during the reconciliation of Microvm can be added as events to the - Microvm object and/or logged in the controller's output." + description: |- + FailureReason will be set in the event that there is a terminal problem + reconciling the Microvm and will contain a succinct value suitable + for machine interpretation. + + This field should not be set for transitive errors that a controller + faces that are expected to be fixed automatically over + time (like service outages), but instead indicate that something is + fundamentally wrong with the Microvm's spec or the configuration of + the controller, and that manual intervention is required. Examples + of terminal errors would be invalid combinations of settings in the + spec, values that are unsupported by the controller, or the + responsible controller itself being critically misconfigured. + + Any transient errors that occur during the reconciliation of Microvm + can be added as events to the Microvm object and/or logged in the + controller's output. type: string ready: default: false diff --git a/config/crd/bases/infrastructure.liquid-metal.io_microvmtemplates.yaml b/config/crd/bases/infrastructure.liquid-metal.io_microvmtemplates.yaml index 2f1b4d2..5c23a40 100644 --- a/config/crd/bases/infrastructure.liquid-metal.io_microvmtemplates.yaml +++ b/config/crd/bases/infrastructure.liquid-metal.io_microvmtemplates.yaml @@ -3,8 +3,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.9.2 - creationTimestamp: null + controller-gen.kubebuilder.io/version: v0.23.0 name: microvmtemplates.infrastructure.liquid-metal.io spec: group: infrastructure.liquid-metal.io @@ -21,14 +20,19 @@ spec: description: MicrovmTemplate is the Schema for the microvmtemplates API properties: apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + description: |- + APIVersion defines the versioned schema of this representation of an object. + Servers should convert recognized schemas to the latest internal value, and + may reject unrecognized values. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources type: string kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + description: |- + Kind is a string value representing the REST resource this object represents. + Servers may infer this from the endpoint the client submits requests to. + Cannot be updated. + In CamelCase. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds type: string metadata: type: object @@ -41,21 +45,54 @@ spec: spec: description: Specification of the desired behavior of the Microvm. properties: + allowGuestAgent: + description: |- + AllowGuestAgent, when true, attaches a vsock device to the microvm so the in-guest + guest-agent can communicate with the host. + type: boolean basicAuthSecret: - description: "TODO this needs to go and be pulled off the owning - object probably needs to be part of Hosts once that becomes - an array BasicAuthSecret is the name of the secret containing - basic auth info for the host The secret should be created in - the same namespace as the MicroVM. \n apiVersion: v1 kind: Secret - metadata: name: mybasicauthsecret namespace: same-as-microvm - type: Opaque data: token: YWRtaW4=" + description: |- + probably needs to be part of Hosts once that becomes an array + BasicAuthSecret is the name of the secret containing basic auth info for the host + The secret should be created in the same namespace as the MicroVM. + + apiVersion: v1 + kind: Secret + metadata: + name: mybasicauthsecret + namespace: same-as-microvm + type: Opaque + data: + token: YWRtaW4= type: string + cpuConfig: + description: |- + CPUConfig allows customising the CPU features presented to the guest. + Support and semantics vary by provider. + properties: + featuresToEnable: + description: |- + FeaturesToEnable is a list of optional CPU features to enable. Accepted values are + provider specific (e.g. named features such as "amx" for Cloud Hypervisor, or numeric + KVM capability IDs for Firecracker). The "!" prefix is not allowed here. + items: + type: string + type: array + kvmCapabilitiesToDisable: + description: |- + KVMCapabilitiesToDisable is a list of KVM capability IDs to disable. Only supported by + providers that declare the KVMCapabilitiesDisable capability (currently Firecracker only). + items: + type: string + type: array + type: object host: description: Host sets the host device address for Microvm creation. properties: endpoint: - description: Endpoint is the API endpoint for the microvm - service (i.e. flintlock) including the port. + description: |- + Endpoint is the API endpoint for the microvm service (i.e. flintlock) + including the port. type: string name: description: Name is an optional name for the host. @@ -93,10 +130,10 @@ spec: kernelCmdline: additionalProperties: type: string - description: KernelCmdLine are the additional args to use for - the kernel cmdline. Each MicroVM provider has its own recommended - list, they will be used automatically. This field is for additional - values. + description: |- + KernelCmdLine are the additional args to use for the kernel cmdline. + Each MicroVM provider has its own recommended list, they will be used + automatically. This field is for additional values. type: object labels: additionalProperties: @@ -110,10 +147,9 @@ spec: minimum: 1024 type: integer microvmProxy: - description: MicrovmProxy is the proxy server details to use when - calling the microvm service. This is an alternative to using - the http proxy environment variables and applied purely to the - grpc service. + description: |- + MicrovmProxy is the proxy server details to use when calling the microvm service. This is an + alternative to using the http proxy environment variables and applied purely to the grpc service. properties: endpoint: description: Endpoint is the address of the proxy. @@ -137,9 +173,9 @@ spec: interface to create in the microvm. type: string guestMac: - description: GuestMAC allows the specifying of a specific - MAC address to use for the interface. If not supplied - a autogenerated MAC address will be used. + description: |- + GuestMAC allows the specifying of a specific MAC address to use for the interface. If + not supplied a autogenerated MAC address will be used. type: string type: description: Type is the type of host network interface @@ -154,9 +190,17 @@ spec: type: object minItems: 1 type: array + provider: + description: |- + Provider allows you to specify the name of the microvm provider to use. + If this isn't supplied then the default provider will be used. + NOTE that the default provider cannot be controlled here: it would have been + chosen by the operator configuring Flintlock on the remote host. + type: string providerID: - description: ProviderID is the unique identifier as specified - by the cloud provider. Do not supply this field as a user. + description: |- + ProviderID is the unique identifier as specified by the cloud provider. + Do not supply this field as a user. type: string rootVolume: description: RootVolume specifies the volume to use for the root @@ -166,16 +210,25 @@ spec: description: ID is a unique identifier for this volume. type: string image: - description: Image is the container image to use for the volume. + description: Image is the container image to use as the source + for the volume. + type: string + mountPoint: + description: |- + MountPoint specifies the guest mountpoint for the volume. + This will only be applied to additional volumes. type: string readOnly: default: false description: ReadOnly specifies that the volume is to be mounted readonly. type: boolean + virtiofsPath: + description: VirtioFSPath specifies the path in the guest + where virtiofs is mounted. + type: string required: - id - - image type: object sshPublicKeys: description: SSHPublicKeys is list of SSH public keys which will @@ -192,34 +245,36 @@ spec: description: User is the name of the user to add keys for (eg root, ubuntu). type: string + required: + - authorizedKeys + - user type: object type: array tlsSecretRef: - description: "TODO this needs to go and be pulled off the owning - object probably needs to be part of Hosts once that becomes - an array mTLS Configuration: \n It is recommended that each - flintlock host is configured with its own cert signed by a common - CA, and set to use mTLS. The flintlock-operator should be provided - with the CA, and a client cert and key signed by that CA. TLSSecretRef - is a reference to the name of a secret which contains TLS cert - information for connecting to Flintlock hosts. The secret should - be created in the same namespace as the MicroVMCluster. The - secret should be of type Opaque with the addition of a ca.crt - key. \n apiVersion: v1 kind: Secret metadata: name: secret-tls - namespace: default <- same as Cluster type: Opaque data: tls.crt: - | -----BEGIN CERTIFICATE----- MIIC2DCCAcCgAwIBAgIBATANBgkqh - ... -----END CERTIFICATE----- tls.key: | -----BEGIN EC PRIVATE - KEY----- MIIEpgIBAAKCAQEA7yn3bRHQ5FHMQ ... -----END EC PRIVATE - KEY----- ca.crt: | -----BEGIN CERTIFICATE----- MIIEpgIBAAKCAQEA7yn3bRHQ5FHMQ - ... -----END CERTIFICATE-----" + description: "probably needs to be part of Hosts once that becomes + an array\nmTLS Configuration:\n\nIt is recommended that each + flintlock host is configured with its own cert\nsigned by a + common CA, and set to use mTLS.\nThe flintlock-operator should + be provided with the CA, and a client cert and key\nsigned by + that CA.\nTLSSecretRef is a reference to the name of a secret + which contains TLS cert information\nfor connecting to Flintlock + hosts.\nThe secret should be created in the same namespace as + the MicroVMCluster.\nThe secret should be of type Opaque\nwith + the addition of a ca.crt key.\n\napiVersion: v1\nkind: Secret\nmetadata:\n\tname: + secret-tls\n\tnamespace: default <- same as Cluster\ntype: + Opaque\ndata:\n\ttls.crt: |\n\t\t-----BEGIN CERTIFICATE-----\n\t\tMIIC2DCCAcCgAwIBAgIBATANBgkqh + ...\n\t\t-----END CERTIFICATE-----\n\ttls.key: |\n\t\t-----BEGIN + EC PRIVATE KEY-----\n\t\tMIIEpgIBAAKCAQEA7yn3bRHQ5FHMQ ...\n\t\t-----END + EC PRIVATE KEY-----\n\tca.crt: |\n\t\t-----BEGIN CERTIFICATE-----\n\t\tMIIEpgIBAAKCAQEA7yn3bRHQ5FHMQ + ...\n\t\t-----END CERTIFICATE-----" type: string userdata: description: "UserData is additional userdata script to execute - in the Microvm's cloud init. This can be in the form of a raw - shell script, eg: userdata: | #!/bin/bash echo \"hi from my - microvm\" \n or in valid cloud-config, eg: userdata: | #cloud-config - write_files: - content: \"hello\" path: \"/root/FINDME\" owner: - \"root:root\" permissions: \"0755\"" + in the Microvm's cloud init.\nThis can be in the form of a raw + shell script, eg:\nuserdata: |\n #!/bin/bash\n echo \"hi from + my microvm\"\n\nor in valid cloud-config, eg:\nuserdata: |\n\t#cloud-config\n\twrite_files:\n\t- + content: \"hello\"\n\t\tpath: \"/root/FINDME\"\n\t\towner: \"root:root\"\n\t\tpermissions: + \"0755\"" type: string vcpu: description: VCPU specifies how many vcpu's the microvm will be @@ -238,20 +293,29 @@ spec: description: ID is a unique identifier for this volume. type: string image: - description: Image is the container image to use for the - volume. + description: Image is the container image to use as the + source for the volume. + type: string + mountPoint: + description: |- + MountPoint specifies the guest mountpoint for the volume. + This will only be applied to additional volumes. type: string readOnly: default: false description: ReadOnly specifies that the volume is to be mounted readonly. type: boolean + virtiofsPath: + description: VirtioFSPath specifies the path in the guest + where virtiofs is mounted. + type: string required: - id - - image type: object type: array required: + - "" - kernel - memoryMb - networkInterfaces diff --git a/config/crd/kustomization.yaml b/config/crd/kustomization.yaml index 952818e..cfbbe21 100644 --- a/config/crd/kustomization.yaml +++ b/config/crd/kustomization.yaml @@ -8,21 +8,21 @@ resources: - bases/infrastructure.liquid-metal.io_microvmdeployments.yaml #+kubebuilder:scaffold:crdkustomizeresource -patchesStrategicMerge: +patches: # [WEBHOOK] To enable webhook, uncomment all the sections with [WEBHOOK] prefix. # patches here are for enabling the conversion webhook for each CRD -#- patches/webhook_in_microvms.yaml -#- patches/webhook_in_microvmreplicasets.yaml -#- patches/webhook_in_microvmtemplates.yaml -#- patches/webhook_in_microvmdeployments.yaml +#- path: patches/webhook_in_microvms.yaml +#- path: patches/webhook_in_microvmreplicasets.yaml +#- path: patches/webhook_in_microvmtemplates.yaml +#- path: patches/webhook_in_microvmdeployments.yaml #+kubebuilder:scaffold:crdkustomizewebhookpatch # [CERTMANAGER] To enable cert-manager, uncomment all the sections with [CERTMANAGER] prefix. # patches here are for enabling the CA injection for each CRD -#- patches/cainjection_in_microvms.yaml -#- patches/cainjection_in_microvmreplicasets.yaml -#- patches/cainjection_in_microvmtemplates.yaml -#- patches/cainjection_in_microvmdeployments.yaml +#- path: patches/cainjection_in_microvms.yaml +#- path: patches/cainjection_in_microvmreplicasets.yaml +#- path: patches/cainjection_in_microvmtemplates.yaml +#- path: patches/cainjection_in_microvmdeployments.yaml #+kubebuilder:scaffold:crdkustomizecainjectionpatch # the following config is for teaching kustomize how to do kustomization for CRDs. diff --git a/config/default/kustomization.yaml b/config/default/kustomization.yaml index 7a93856..c92ffac 100644 --- a/config/default/kustomization.yaml +++ b/config/default/kustomization.yaml @@ -12,7 +12,7 @@ namePrefix: microvm-operator- #commonLabels: # someName: someValue -bases: +resources: - ../crd - ../rbac - ../manager @@ -24,49 +24,19 @@ bases: # [PROMETHEUS] To enable prometheus monitor, uncomment all sections with 'PROMETHEUS'. #- ../prometheus -patchesStrategicMerge: +patches: # Protect the /metrics endpoint by putting it behind auth. # If you want your controller-manager to expose the /metrics # endpoint w/o any authn/z, please comment the following line. -- manager_auth_proxy_patch.yaml +- path: manager_auth_proxy_patch.yaml # [WEBHOOK] To enable webhook, uncomment all the sections with [WEBHOOK] prefix including the one in # crd/kustomization.yaml -#- manager_webhook_patch.yaml +#- path: manager_webhook_patch.yaml # [CERTMANAGER] To enable cert-manager, uncomment all sections with 'CERTMANAGER'. # Uncomment 'CERTMANAGER' sections in crd/kustomization.yaml to enable the CA injection in the admission webhooks. # 'CERTMANAGER' needs to be enabled to use ca injection -#- webhookcainjection_patch.yaml - -# the following config is for teaching kustomize how to do var substitution -vars: -# [CERTMANAGER] To enable cert-manager, uncomment all sections with 'CERTMANAGER' prefix. -#- name: CERTIFICATE_NAMESPACE # namespace of the certificate CR -# objref: -# kind: Certificate -# group: cert-manager.io -# version: v1 -# name: serving-cert # this name should match the one in certificate.yaml -# fieldref: -# fieldpath: metadata.namespace -#- name: CERTIFICATE_NAME -# objref: -# kind: Certificate -# group: cert-manager.io -# version: v1 -# name: serving-cert # this name should match the one in certificate.yaml -#- name: SERVICE_NAMESPACE # namespace of the service -# objref: -# kind: Service -# version: v1 -# name: webhook-service -# fieldref: -# fieldpath: metadata.namespace -#- name: SERVICE_NAME -# objref: -# kind: Service -# version: v1 -# name: webhook-service +#- path: webhookcainjection_patch.yaml diff --git a/config/rbac/role.yaml b/config/rbac/role.yaml index 33128a8..ead03a6 100644 --- a/config/rbac/role.yaml +++ b/config/rbac/role.yaml @@ -2,64 +2,13 @@ apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: - creationTimestamp: null name: manager-role rules: - apiGroups: - infrastructure.liquid-metal.io resources: - microvmdeployments - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - infrastructure.liquid-metal.io - resources: - - microvmdeployments/finalizers - verbs: - - update -- apiGroups: - - infrastructure.liquid-metal.io - resources: - - microvmdeployments/status - verbs: - - get - - patch - - update -- apiGroups: - - infrastructure.liquid-metal.io - resources: - microvmreplicasets - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - infrastructure.liquid-metal.io - resources: - - microvmreplicasets/finalizers - verbs: - - update -- apiGroups: - - infrastructure.liquid-metal.io - resources: - - microvmreplicasets/status - verbs: - - get - - patch - - update -- apiGroups: - - infrastructure.liquid-metal.io - resources: - microvms verbs: - create @@ -72,12 +21,16 @@ rules: - apiGroups: - infrastructure.liquid-metal.io resources: + - microvmdeployments/finalizers + - microvmreplicasets/finalizers - microvms/finalizers verbs: - update - apiGroups: - infrastructure.liquid-metal.io resources: + - microvmdeployments/status + - microvmreplicasets/status - microvms/status verbs: - get diff --git a/config/samples/infrastructure_v1alpha1_microvm.yaml b/config/samples/infrastructure_v1alpha1_microvm.yaml index f93738c..2eb495d 100644 --- a/config/samples/infrastructure_v1alpha1_microvm.yaml +++ b/config/samples/infrastructure_v1alpha1_microvm.yaml @@ -31,3 +31,23 @@ spec: rootVolume: id: root image: ghcr.io/weaveworks-liquidmetal/capmvm-kubernetes:1.21.8 + # The fields below require flintlock v0.16.0 or newer on the host. + # provider selects the microvm provider on the host (e.g. firecracker, + # cloudhypervisor). Leave unset to use the host's default provider. + # provider: firecracker + # allowGuestAgent attaches a vsock device so the in-guest guest-agent can + # talk to the host. + # allowGuestAgent: true + # cpuConfig tunes the CPU features presented to the guest; accepted values + # are provider specific. + # cpuConfig: + # featuresToEnable: ["amx"] + # kvmCapabilitiesToDisable: [] + # Additional volumes can come from a container image or a virtiofs share and + # may be mounted at a guest path. + # additionalVolumes: + # - id: data + # image: ghcr.io/example/data:latest + # mountPoint: /mnt/data + # - id: shared + # virtiofsPath: /mnt/shared diff --git a/config/samples/infrastructure_v1alpha1_microvmdeployment.yaml b/config/samples/infrastructure_v1alpha1_microvmdeployment.yaml index 0273463..9fe66e3 100644 --- a/config/samples/infrastructure_v1alpha1_microvmdeployment.yaml +++ b/config/samples/infrastructure_v1alpha1_microvmdeployment.yaml @@ -34,3 +34,23 @@ spec: rootVolume: id: root image: ghcr.io/weaveworks-liquidmetal/capmvm-kubernetes:1.21.8 + # The fields below require flintlock v0.16.0 or newer on the host. + # provider selects the microvm provider on the host (e.g. firecracker, + # cloudhypervisor). Leave unset to use the host's default provider. + # provider: firecracker + # allowGuestAgent attaches a vsock device so the in-guest guest-agent can + # talk to the host. + # allowGuestAgent: true + # cpuConfig tunes the CPU features presented to the guest; accepted values + # are provider specific. + # cpuConfig: + # featuresToEnable: ["amx"] + # kvmCapabilitiesToDisable: [] + # Additional volumes can come from a container image or a virtiofs share and + # may be mounted at a guest path. + # additionalVolumes: + # - id: data + # image: ghcr.io/example/data:latest + # mountPoint: /mnt/data + # - id: shared + # virtiofsPath: /mnt/shared diff --git a/config/samples/infrastructure_v1alpha1_microvmreplicaset.yaml b/config/samples/infrastructure_v1alpha1_microvmreplicaset.yaml index fe062db..fb8d6df 100644 --- a/config/samples/infrastructure_v1alpha1_microvmreplicaset.yaml +++ b/config/samples/infrastructure_v1alpha1_microvmreplicaset.yaml @@ -34,3 +34,23 @@ spec: rootVolume: id: root image: ghcr.io/weaveworks-liquidmetal/capmvm-kubernetes:1.21.8 + # The fields below require flintlock v0.16.0 or newer on the host. + # provider selects the microvm provider on the host (e.g. firecracker, + # cloudhypervisor). Leave unset to use the host's default provider. + # provider: firecracker + # allowGuestAgent attaches a vsock device so the in-guest guest-agent can + # talk to the host. + # allowGuestAgent: true + # cpuConfig tunes the CPU features presented to the guest; accepted values + # are provider specific. + # cpuConfig: + # featuresToEnable: ["amx"] + # kvmCapabilitiesToDisable: [] + # Additional volumes can come from a container image or a virtiofs share and + # may be mounted at a guest path. + # additionalVolumes: + # - id: data + # image: ghcr.io/example/data:latest + # mountPoint: /mnt/data + # - id: shared + # virtiofsPath: /mnt/shared diff --git a/controllers/fakes/fake_client.go b/controllers/fakes/fake_client.go index d51b765..bcd29db 100644 --- a/controllers/fakes/fake_client.go +++ b/controllers/fakes/fake_client.go @@ -5,25 +5,20 @@ import ( "context" "sync" - "github.com/weaveworks-liquidmetal/controller-pkg/client" - "github.com/weaveworks-liquidmetal/flintlock/api/services/microvm/v1alpha1" + "github.com/liquidmetal-dev/controller-pkg/client" + "github.com/liquidmetal-dev/flintlock/api/services/microvm/v1alpha1" "google.golang.org/grpc" "google.golang.org/protobuf/types/known/emptypb" ) type FakeClient struct { - CloseStub func() - closeMutex sync.RWMutex - closeArgsForCall []struct { - } + CloseStub func() + closeMutex sync.RWMutex + closeArgsForCall []struct{} CreateMicroVMStub func(context.Context, *v1alpha1.CreateMicroVMRequest, ...grpc.CallOption) (*v1alpha1.CreateMicroVMResponse, error) createMicroVMMutex sync.RWMutex - createMicroVMArgsForCall []struct { - arg1 context.Context - arg2 *v1alpha1.CreateMicroVMRequest - arg3 []grpc.CallOption - } - createMicroVMReturns struct { + createMicroVMArgsForCall []FakeClientCreateMicroVMArgs + createMicroVMReturns struct { result1 *v1alpha1.CreateMicroVMResponse result2 error } @@ -33,12 +28,8 @@ type FakeClient struct { } DeleteMicroVMStub func(context.Context, *v1alpha1.DeleteMicroVMRequest, ...grpc.CallOption) (*emptypb.Empty, error) deleteMicroVMMutex sync.RWMutex - deleteMicroVMArgsForCall []struct { - arg1 context.Context - arg2 *v1alpha1.DeleteMicroVMRequest - arg3 []grpc.CallOption - } - deleteMicroVMReturns struct { + deleteMicroVMArgsForCall []FakeClientDeleteMicroVMArgs + deleteMicroVMReturns struct { result1 *emptypb.Empty result2 error } @@ -48,12 +39,8 @@ type FakeClient struct { } GetMicroVMStub func(context.Context, *v1alpha1.GetMicroVMRequest, ...grpc.CallOption) (*v1alpha1.GetMicroVMResponse, error) getMicroVMMutex sync.RWMutex - getMicroVMArgsForCall []struct { - arg1 context.Context - arg2 *v1alpha1.GetMicroVMRequest - arg3 []grpc.CallOption - } - getMicroVMReturns struct { + getMicroVMArgsForCall []FakeClientGetMicroVMArgs + getMicroVMReturns struct { result1 *v1alpha1.GetMicroVMResponse result2 error } @@ -63,12 +50,8 @@ type FakeClient struct { } ListMicroVMsStub func(context.Context, *v1alpha1.ListMicroVMsRequest, ...grpc.CallOption) (*v1alpha1.ListMicroVMsResponse, error) listMicroVMsMutex sync.RWMutex - listMicroVMsArgsForCall []struct { - arg1 context.Context - arg2 *v1alpha1.ListMicroVMsRequest - arg3 []grpc.CallOption - } - listMicroVMsReturns struct { + listMicroVMsArgsForCall []FakeClientListMicroVMsArgs + listMicroVMsReturns struct { result1 *v1alpha1.ListMicroVMsResponse result2 error } @@ -76,34 +59,83 @@ type FakeClient struct { result1 *v1alpha1.ListMicroVMsResponse result2 error } - ListMicroVMsStreamStub func(context.Context, *v1alpha1.ListMicroVMsRequest, ...grpc.CallOption) (v1alpha1.MicroVM_ListMicroVMsStreamClient, error) + ListMicroVMsStreamStub func(context.Context, *v1alpha1.ListMicroVMsRequest, ...grpc.CallOption) (grpc.ServerStreamingClient[v1alpha1.ListMessage], error) listMicroVMsStreamMutex sync.RWMutex - listMicroVMsStreamArgsForCall []struct { - arg1 context.Context - arg2 *v1alpha1.ListMicroVMsRequest - arg3 []grpc.CallOption - } - listMicroVMsStreamReturns struct { - result1 v1alpha1.MicroVM_ListMicroVMsStreamClient + listMicroVMsStreamArgsForCall []FakeClientListMicroVMsStreamArgs + listMicroVMsStreamReturns struct { + result1 grpc.ServerStreamingClient[v1alpha1.ListMessage] result2 error } listMicroVMsStreamReturnsOnCall map[int]struct { - result1 v1alpha1.MicroVM_ListMicroVMsStreamClient + result1 grpc.ServerStreamingClient[v1alpha1.ListMessage] + result2 error + } + ServerInfoStub func(context.Context, *emptypb.Empty, ...grpc.CallOption) (*v1alpha1.ServerInfoResponse, error) + serverInfoMutex sync.RWMutex + serverInfoArgsForCall []FakeClientServerInfoArgs + serverInfoReturns struct { + result1 *v1alpha1.ServerInfoResponse + result2 error + } + serverInfoReturnsOnCall map[int]struct { + result1 *v1alpha1.ServerInfoResponse result2 error } invocations map[string][][]interface{} + callOrder []string invocationsMutex sync.RWMutex } +// FakeClientCreateMicroVMArgs holds the arguments of one call to CreateMicroVM. +type FakeClientCreateMicroVMArgs struct { + Arg1 context.Context + Arg2 *v1alpha1.CreateMicroVMRequest + Arg3 []grpc.CallOption +} + +// FakeClientDeleteMicroVMArgs holds the arguments of one call to DeleteMicroVM. +type FakeClientDeleteMicroVMArgs struct { + Arg1 context.Context + Arg2 *v1alpha1.DeleteMicroVMRequest + Arg3 []grpc.CallOption +} + +// FakeClientGetMicroVMArgs holds the arguments of one call to GetMicroVM. +type FakeClientGetMicroVMArgs struct { + Arg1 context.Context + Arg2 *v1alpha1.GetMicroVMRequest + Arg3 []grpc.CallOption +} + +// FakeClientListMicroVMsArgs holds the arguments of one call to ListMicroVMs. +type FakeClientListMicroVMsArgs struct { + Arg1 context.Context + Arg2 *v1alpha1.ListMicroVMsRequest + Arg3 []grpc.CallOption +} + +// FakeClientListMicroVMsStreamArgs holds the arguments of one call to ListMicroVMsStream. +type FakeClientListMicroVMsStreamArgs struct { + Arg1 context.Context + Arg2 *v1alpha1.ListMicroVMsRequest + Arg3 []grpc.CallOption +} + +// FakeClientServerInfoArgs holds the arguments of one call to ServerInfo. +type FakeClientServerInfoArgs struct { + Arg1 context.Context + Arg2 *emptypb.Empty + Arg3 []grpc.CallOption +} + func (fake *FakeClient) Close() { fake.closeMutex.Lock() - fake.closeArgsForCall = append(fake.closeArgsForCall, struct { - }{}) + fake.closeArgsForCall = append(fake.closeArgsForCall, struct{}{}) stub := fake.CloseStub fake.recordInvocation("Close", []interface{}{}) fake.closeMutex.Unlock() if stub != nil { - fake.CloseStub() + stub() } } @@ -120,16 +152,17 @@ func (fake *FakeClient) CloseCalls(stub func()) { } func (fake *FakeClient) CreateMicroVM(arg1 context.Context, arg2 *v1alpha1.CreateMicroVMRequest, arg3 ...grpc.CallOption) (*v1alpha1.CreateMicroVMResponse, error) { + var arg3Copy []grpc.CallOption + if arg3 != nil { + arg3Copy = make([]grpc.CallOption, len(arg3)) + copy(arg3Copy, arg3) + } fake.createMicroVMMutex.Lock() ret, specificReturn := fake.createMicroVMReturnsOnCall[len(fake.createMicroVMArgsForCall)] - fake.createMicroVMArgsForCall = append(fake.createMicroVMArgsForCall, struct { - arg1 context.Context - arg2 *v1alpha1.CreateMicroVMRequest - arg3 []grpc.CallOption - }{arg1, arg2, arg3}) + fake.createMicroVMArgsForCall = append(fake.createMicroVMArgsForCall, FakeClientCreateMicroVMArgs{arg1, arg2, arg3Copy}) stub := fake.CreateMicroVMStub fakeReturns := fake.createMicroVMReturns - fake.recordInvocation("CreateMicroVM", []interface{}{arg1, arg2, arg3}) + fake.recordInvocation("CreateMicroVM", []interface{}{arg1, arg2, arg3Copy}) fake.createMicroVMMutex.Unlock() if stub != nil { return stub(arg1, arg2, arg3...) @@ -156,7 +189,15 @@ func (fake *FakeClient) CreateMicroVMArgsForCall(i int) (context.Context, *v1alp fake.createMicroVMMutex.RLock() defer fake.createMicroVMMutex.RUnlock() argsForCall := fake.createMicroVMArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3 + return argsForCall.Arg1, argsForCall.Arg2, argsForCall.Arg3 +} + +func (fake *FakeClient) CreateMicroVMArgs() []FakeClientCreateMicroVMArgs { + fake.createMicroVMMutex.RLock() + defer fake.createMicroVMMutex.RUnlock() + args := make([]FakeClientCreateMicroVMArgs, len(fake.createMicroVMArgsForCall)) + copy(args, fake.createMicroVMArgsForCall) + return args } func (fake *FakeClient) CreateMicroVMReturns(result1 *v1alpha1.CreateMicroVMResponse, result2 error) { @@ -186,16 +227,17 @@ func (fake *FakeClient) CreateMicroVMReturnsOnCall(i int, result1 *v1alpha1.Crea } func (fake *FakeClient) DeleteMicroVM(arg1 context.Context, arg2 *v1alpha1.DeleteMicroVMRequest, arg3 ...grpc.CallOption) (*emptypb.Empty, error) { + var arg3Copy []grpc.CallOption + if arg3 != nil { + arg3Copy = make([]grpc.CallOption, len(arg3)) + copy(arg3Copy, arg3) + } fake.deleteMicroVMMutex.Lock() ret, specificReturn := fake.deleteMicroVMReturnsOnCall[len(fake.deleteMicroVMArgsForCall)] - fake.deleteMicroVMArgsForCall = append(fake.deleteMicroVMArgsForCall, struct { - arg1 context.Context - arg2 *v1alpha1.DeleteMicroVMRequest - arg3 []grpc.CallOption - }{arg1, arg2, arg3}) + fake.deleteMicroVMArgsForCall = append(fake.deleteMicroVMArgsForCall, FakeClientDeleteMicroVMArgs{arg1, arg2, arg3Copy}) stub := fake.DeleteMicroVMStub fakeReturns := fake.deleteMicroVMReturns - fake.recordInvocation("DeleteMicroVM", []interface{}{arg1, arg2, arg3}) + fake.recordInvocation("DeleteMicroVM", []interface{}{arg1, arg2, arg3Copy}) fake.deleteMicroVMMutex.Unlock() if stub != nil { return stub(arg1, arg2, arg3...) @@ -222,7 +264,15 @@ func (fake *FakeClient) DeleteMicroVMArgsForCall(i int) (context.Context, *v1alp fake.deleteMicroVMMutex.RLock() defer fake.deleteMicroVMMutex.RUnlock() argsForCall := fake.deleteMicroVMArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3 + return argsForCall.Arg1, argsForCall.Arg2, argsForCall.Arg3 +} + +func (fake *FakeClient) DeleteMicroVMArgs() []FakeClientDeleteMicroVMArgs { + fake.deleteMicroVMMutex.RLock() + defer fake.deleteMicroVMMutex.RUnlock() + args := make([]FakeClientDeleteMicroVMArgs, len(fake.deleteMicroVMArgsForCall)) + copy(args, fake.deleteMicroVMArgsForCall) + return args } func (fake *FakeClient) DeleteMicroVMReturns(result1 *emptypb.Empty, result2 error) { @@ -252,16 +302,17 @@ func (fake *FakeClient) DeleteMicroVMReturnsOnCall(i int, result1 *emptypb.Empty } func (fake *FakeClient) GetMicroVM(arg1 context.Context, arg2 *v1alpha1.GetMicroVMRequest, arg3 ...grpc.CallOption) (*v1alpha1.GetMicroVMResponse, error) { + var arg3Copy []grpc.CallOption + if arg3 != nil { + arg3Copy = make([]grpc.CallOption, len(arg3)) + copy(arg3Copy, arg3) + } fake.getMicroVMMutex.Lock() ret, specificReturn := fake.getMicroVMReturnsOnCall[len(fake.getMicroVMArgsForCall)] - fake.getMicroVMArgsForCall = append(fake.getMicroVMArgsForCall, struct { - arg1 context.Context - arg2 *v1alpha1.GetMicroVMRequest - arg3 []grpc.CallOption - }{arg1, arg2, arg3}) + fake.getMicroVMArgsForCall = append(fake.getMicroVMArgsForCall, FakeClientGetMicroVMArgs{arg1, arg2, arg3Copy}) stub := fake.GetMicroVMStub fakeReturns := fake.getMicroVMReturns - fake.recordInvocation("GetMicroVM", []interface{}{arg1, arg2, arg3}) + fake.recordInvocation("GetMicroVM", []interface{}{arg1, arg2, arg3Copy}) fake.getMicroVMMutex.Unlock() if stub != nil { return stub(arg1, arg2, arg3...) @@ -288,7 +339,15 @@ func (fake *FakeClient) GetMicroVMArgsForCall(i int) (context.Context, *v1alpha1 fake.getMicroVMMutex.RLock() defer fake.getMicroVMMutex.RUnlock() argsForCall := fake.getMicroVMArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3 + return argsForCall.Arg1, argsForCall.Arg2, argsForCall.Arg3 +} + +func (fake *FakeClient) GetMicroVMArgs() []FakeClientGetMicroVMArgs { + fake.getMicroVMMutex.RLock() + defer fake.getMicroVMMutex.RUnlock() + args := make([]FakeClientGetMicroVMArgs, len(fake.getMicroVMArgsForCall)) + copy(args, fake.getMicroVMArgsForCall) + return args } func (fake *FakeClient) GetMicroVMReturns(result1 *v1alpha1.GetMicroVMResponse, result2 error) { @@ -318,16 +377,17 @@ func (fake *FakeClient) GetMicroVMReturnsOnCall(i int, result1 *v1alpha1.GetMicr } func (fake *FakeClient) ListMicroVMs(arg1 context.Context, arg2 *v1alpha1.ListMicroVMsRequest, arg3 ...grpc.CallOption) (*v1alpha1.ListMicroVMsResponse, error) { + var arg3Copy []grpc.CallOption + if arg3 != nil { + arg3Copy = make([]grpc.CallOption, len(arg3)) + copy(arg3Copy, arg3) + } fake.listMicroVMsMutex.Lock() ret, specificReturn := fake.listMicroVMsReturnsOnCall[len(fake.listMicroVMsArgsForCall)] - fake.listMicroVMsArgsForCall = append(fake.listMicroVMsArgsForCall, struct { - arg1 context.Context - arg2 *v1alpha1.ListMicroVMsRequest - arg3 []grpc.CallOption - }{arg1, arg2, arg3}) + fake.listMicroVMsArgsForCall = append(fake.listMicroVMsArgsForCall, FakeClientListMicroVMsArgs{arg1, arg2, arg3Copy}) stub := fake.ListMicroVMsStub fakeReturns := fake.listMicroVMsReturns - fake.recordInvocation("ListMicroVMs", []interface{}{arg1, arg2, arg3}) + fake.recordInvocation("ListMicroVMs", []interface{}{arg1, arg2, arg3Copy}) fake.listMicroVMsMutex.Unlock() if stub != nil { return stub(arg1, arg2, arg3...) @@ -354,7 +414,15 @@ func (fake *FakeClient) ListMicroVMsArgsForCall(i int) (context.Context, *v1alph fake.listMicroVMsMutex.RLock() defer fake.listMicroVMsMutex.RUnlock() argsForCall := fake.listMicroVMsArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3 + return argsForCall.Arg1, argsForCall.Arg2, argsForCall.Arg3 +} + +func (fake *FakeClient) ListMicroVMsArgs() []FakeClientListMicroVMsArgs { + fake.listMicroVMsMutex.RLock() + defer fake.listMicroVMsMutex.RUnlock() + args := make([]FakeClientListMicroVMsArgs, len(fake.listMicroVMsArgsForCall)) + copy(args, fake.listMicroVMsArgsForCall) + return args } func (fake *FakeClient) ListMicroVMsReturns(result1 *v1alpha1.ListMicroVMsResponse, result2 error) { @@ -383,17 +451,18 @@ func (fake *FakeClient) ListMicroVMsReturnsOnCall(i int, result1 *v1alpha1.ListM }{result1, result2} } -func (fake *FakeClient) ListMicroVMsStream(arg1 context.Context, arg2 *v1alpha1.ListMicroVMsRequest, arg3 ...grpc.CallOption) (v1alpha1.MicroVM_ListMicroVMsStreamClient, error) { +func (fake *FakeClient) ListMicroVMsStream(arg1 context.Context, arg2 *v1alpha1.ListMicroVMsRequest, arg3 ...grpc.CallOption) (grpc.ServerStreamingClient[v1alpha1.ListMessage], error) { + var arg3Copy []grpc.CallOption + if arg3 != nil { + arg3Copy = make([]grpc.CallOption, len(arg3)) + copy(arg3Copy, arg3) + } fake.listMicroVMsStreamMutex.Lock() ret, specificReturn := fake.listMicroVMsStreamReturnsOnCall[len(fake.listMicroVMsStreamArgsForCall)] - fake.listMicroVMsStreamArgsForCall = append(fake.listMicroVMsStreamArgsForCall, struct { - arg1 context.Context - arg2 *v1alpha1.ListMicroVMsRequest - arg3 []grpc.CallOption - }{arg1, arg2, arg3}) + fake.listMicroVMsStreamArgsForCall = append(fake.listMicroVMsStreamArgsForCall, FakeClientListMicroVMsStreamArgs{arg1, arg2, arg3Copy}) stub := fake.ListMicroVMsStreamStub fakeReturns := fake.listMicroVMsStreamReturns - fake.recordInvocation("ListMicroVMsStream", []interface{}{arg1, arg2, arg3}) + fake.recordInvocation("ListMicroVMsStream", []interface{}{arg1, arg2, arg3Copy}) fake.listMicroVMsStreamMutex.Unlock() if stub != nil { return stub(arg1, arg2, arg3...) @@ -410,7 +479,7 @@ func (fake *FakeClient) ListMicroVMsStreamCallCount() int { return len(fake.listMicroVMsStreamArgsForCall) } -func (fake *FakeClient) ListMicroVMsStreamCalls(stub func(context.Context, *v1alpha1.ListMicroVMsRequest, ...grpc.CallOption) (v1alpha1.MicroVM_ListMicroVMsStreamClient, error)) { +func (fake *FakeClient) ListMicroVMsStreamCalls(stub func(context.Context, *v1alpha1.ListMicroVMsRequest, ...grpc.CallOption) (grpc.ServerStreamingClient[v1alpha1.ListMessage], error)) { fake.listMicroVMsStreamMutex.Lock() defer fake.listMicroVMsStreamMutex.Unlock() fake.ListMicroVMsStreamStub = stub @@ -420,31 +489,114 @@ func (fake *FakeClient) ListMicroVMsStreamArgsForCall(i int) (context.Context, * fake.listMicroVMsStreamMutex.RLock() defer fake.listMicroVMsStreamMutex.RUnlock() argsForCall := fake.listMicroVMsStreamArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3 + return argsForCall.Arg1, argsForCall.Arg2, argsForCall.Arg3 +} + +func (fake *FakeClient) ListMicroVMsStreamArgs() []FakeClientListMicroVMsStreamArgs { + fake.listMicroVMsStreamMutex.RLock() + defer fake.listMicroVMsStreamMutex.RUnlock() + args := make([]FakeClientListMicroVMsStreamArgs, len(fake.listMicroVMsStreamArgsForCall)) + copy(args, fake.listMicroVMsStreamArgsForCall) + return args } -func (fake *FakeClient) ListMicroVMsStreamReturns(result1 v1alpha1.MicroVM_ListMicroVMsStreamClient, result2 error) { +func (fake *FakeClient) ListMicroVMsStreamReturns(result1 grpc.ServerStreamingClient[v1alpha1.ListMessage], result2 error) { fake.listMicroVMsStreamMutex.Lock() defer fake.listMicroVMsStreamMutex.Unlock() fake.ListMicroVMsStreamStub = nil fake.listMicroVMsStreamReturns = struct { - result1 v1alpha1.MicroVM_ListMicroVMsStreamClient + result1 grpc.ServerStreamingClient[v1alpha1.ListMessage] result2 error }{result1, result2} } -func (fake *FakeClient) ListMicroVMsStreamReturnsOnCall(i int, result1 v1alpha1.MicroVM_ListMicroVMsStreamClient, result2 error) { +func (fake *FakeClient) ListMicroVMsStreamReturnsOnCall(i int, result1 grpc.ServerStreamingClient[v1alpha1.ListMessage], result2 error) { fake.listMicroVMsStreamMutex.Lock() defer fake.listMicroVMsStreamMutex.Unlock() fake.ListMicroVMsStreamStub = nil if fake.listMicroVMsStreamReturnsOnCall == nil { fake.listMicroVMsStreamReturnsOnCall = make(map[int]struct { - result1 v1alpha1.MicroVM_ListMicroVMsStreamClient + result1 grpc.ServerStreamingClient[v1alpha1.ListMessage] result2 error }) } fake.listMicroVMsStreamReturnsOnCall[i] = struct { - result1 v1alpha1.MicroVM_ListMicroVMsStreamClient + result1 grpc.ServerStreamingClient[v1alpha1.ListMessage] + result2 error + }{result1, result2} +} + +func (fake *FakeClient) ServerInfo(arg1 context.Context, arg2 *emptypb.Empty, arg3 ...grpc.CallOption) (*v1alpha1.ServerInfoResponse, error) { + var arg3Copy []grpc.CallOption + if arg3 != nil { + arg3Copy = make([]grpc.CallOption, len(arg3)) + copy(arg3Copy, arg3) + } + fake.serverInfoMutex.Lock() + ret, specificReturn := fake.serverInfoReturnsOnCall[len(fake.serverInfoArgsForCall)] + fake.serverInfoArgsForCall = append(fake.serverInfoArgsForCall, FakeClientServerInfoArgs{arg1, arg2, arg3Copy}) + stub := fake.ServerInfoStub + fakeReturns := fake.serverInfoReturns + fake.recordInvocation("ServerInfo", []interface{}{arg1, arg2, arg3Copy}) + fake.serverInfoMutex.Unlock() + if stub != nil { + return stub(arg1, arg2, arg3...) + } + if specificReturn { + return ret.result1, ret.result2 + } + return fakeReturns.result1, fakeReturns.result2 +} + +func (fake *FakeClient) ServerInfoCallCount() int { + fake.serverInfoMutex.RLock() + defer fake.serverInfoMutex.RUnlock() + return len(fake.serverInfoArgsForCall) +} + +func (fake *FakeClient) ServerInfoCalls(stub func(context.Context, *emptypb.Empty, ...grpc.CallOption) (*v1alpha1.ServerInfoResponse, error)) { + fake.serverInfoMutex.Lock() + defer fake.serverInfoMutex.Unlock() + fake.ServerInfoStub = stub +} + +func (fake *FakeClient) ServerInfoArgsForCall(i int) (context.Context, *emptypb.Empty, []grpc.CallOption) { + fake.serverInfoMutex.RLock() + defer fake.serverInfoMutex.RUnlock() + argsForCall := fake.serverInfoArgsForCall[i] + return argsForCall.Arg1, argsForCall.Arg2, argsForCall.Arg3 +} + +func (fake *FakeClient) ServerInfoArgs() []FakeClientServerInfoArgs { + fake.serverInfoMutex.RLock() + defer fake.serverInfoMutex.RUnlock() + args := make([]FakeClientServerInfoArgs, len(fake.serverInfoArgsForCall)) + copy(args, fake.serverInfoArgsForCall) + return args +} + +func (fake *FakeClient) ServerInfoReturns(result1 *v1alpha1.ServerInfoResponse, result2 error) { + fake.serverInfoMutex.Lock() + defer fake.serverInfoMutex.Unlock() + fake.ServerInfoStub = nil + fake.serverInfoReturns = struct { + result1 *v1alpha1.ServerInfoResponse + result2 error + }{result1, result2} +} + +func (fake *FakeClient) ServerInfoReturnsOnCall(i int, result1 *v1alpha1.ServerInfoResponse, result2 error) { + fake.serverInfoMutex.Lock() + defer fake.serverInfoMutex.Unlock() + fake.ServerInfoStub = nil + if fake.serverInfoReturnsOnCall == nil { + fake.serverInfoReturnsOnCall = make(map[int]struct { + result1 *v1alpha1.ServerInfoResponse + result2 error + }) + } + fake.serverInfoReturnsOnCall[i] = struct { + result1 *v1alpha1.ServerInfoResponse result2 error }{result1, result2} } @@ -452,18 +604,6 @@ func (fake *FakeClient) ListMicroVMsStreamReturnsOnCall(i int, result1 v1alpha1. func (fake *FakeClient) Invocations() map[string][][]interface{} { fake.invocationsMutex.RLock() defer fake.invocationsMutex.RUnlock() - fake.closeMutex.RLock() - defer fake.closeMutex.RUnlock() - fake.createMicroVMMutex.RLock() - defer fake.createMicroVMMutex.RUnlock() - fake.deleteMicroVMMutex.RLock() - defer fake.deleteMicroVMMutex.RUnlock() - fake.getMicroVMMutex.RLock() - defer fake.getMicroVMMutex.RUnlock() - fake.listMicroVMsMutex.RLock() - defer fake.listMicroVMsMutex.RUnlock() - fake.listMicroVMsStreamMutex.RLock() - defer fake.listMicroVMsStreamMutex.RUnlock() copiedInvocations := map[string][][]interface{}{} for key, value := range fake.invocations { copiedInvocations[key] = value @@ -471,9 +611,18 @@ func (fake *FakeClient) Invocations() map[string][][]interface{} { return copiedInvocations } +func (fake *FakeClient) CallOrder() []string { + fake.invocationsMutex.RLock() + defer fake.invocationsMutex.RUnlock() + order := make([]string, len(fake.callOrder)) + copy(order, fake.callOrder) + return order +} + func (fake *FakeClient) recordInvocation(key string, args []interface{}) { fake.invocationsMutex.Lock() defer fake.invocationsMutex.Unlock() + fake.callOrder = append(fake.callOrder, key) if fake.invocations == nil { fake.invocations = map[string][][]interface{}{} } diff --git a/controllers/fakes/generate.go b/controllers/fakes/generate.go index 7f25d7d..3a0675d 100644 --- a/controllers/fakes/generate.go +++ b/controllers/fakes/generate.go @@ -4,4 +4,4 @@ package fakes // Run go generate to regenerate this mock. -//go:generate ../../bin/counterfeiter -o fake_client.go github.com/weaveworks-liquidmetal/controller-pkg/client.Client +//go:generate ../../bin/counterfeiter -o fake_client.go github.com/liquidmetal-dev/controller-pkg/client.Client diff --git a/controllers/helpers_test.go b/controllers/helpers_test.go index 00c681d..9cbeabc 100644 --- a/controllers/helpers_test.go +++ b/controllers/helpers_test.go @@ -15,19 +15,19 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/types" - "k8s.io/utils/pointer" + "k8s.io/utils/ptr" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/client/fake" - clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" - "sigs.k8s.io/cluster-api/util/conditions" + clusterv1 "sigs.k8s.io/cluster-api/api/core/v1beta2" + conditions "sigs.k8s.io/cluster-api/util/conditions/deprecated/v1beta1" - flclient "github.com/weaveworks-liquidmetal/controller-pkg/client" - "github.com/weaveworks-liquidmetal/controller-pkg/types/microvm" - flintlockv1 "github.com/weaveworks-liquidmetal/flintlock/api/services/microvm/v1alpha1" - flintlocktypes "github.com/weaveworks-liquidmetal/flintlock/api/types" - "github.com/weaveworks-liquidmetal/flintlock/client/cloudinit/userdata" + flclient "github.com/liquidmetal-dev/controller-pkg/client" + "github.com/liquidmetal-dev/controller-pkg/types/microvm" + flintlockv1 "github.com/liquidmetal-dev/flintlock/api/services/microvm/v1alpha1" + flintlocktypes "github.com/liquidmetal-dev/flintlock/api/types" + "github.com/liquidmetal-dev/flintlock/client/cloudinit/userdata" infrav1 "github.com/weaveworks-liquidmetal/microvm-operator/api/v1alpha1" "github.com/weaveworks-liquidmetal/microvm-operator/controllers" "github.com/weaveworks-liquidmetal/microvm-operator/controllers/fakes" @@ -177,7 +177,11 @@ func createFakeClient(g *WithT, objects []runtime.Object) client.Client { g.Expect(infrav1.AddToScheme(scheme)).To(Succeed()) g.Expect(corev1.AddToScheme(scheme)).To(Succeed()) - return fake.NewClientBuilder().WithScheme(scheme).WithRuntimeObjects(objects...).Build() + return fake.NewClientBuilder(). + WithScheme(scheme). + WithRuntimeObjects(objects...). + WithStatusSubresource(&infrav1.Microvm{}, &infrav1.MicrovmReplicaSet{}, &infrav1.MicrovmDeployment{}). + Build() } func createMicrovm() *infrav1.Microvm { @@ -190,7 +194,7 @@ func createMicrovm() *infrav1.Microvm { Host: microvm.Host{ Endpoint: "127.0.0.1:9090", }, - ProviderID: pointer.String(testMicrovmUID), + ProviderID: ptr.To(testMicrovmUID), VMSpec: microvm.VMSpec{ VCPU: 2, MemoryMb: 2048, @@ -232,7 +236,7 @@ func createMicrovmReplicaSet(reps int32) *infrav1.MicrovmReplicaSet { Host: microvm.Host{ Endpoint: "127.0.0.1:9090", }, - Replicas: pointer.Int32(reps), + Replicas: ptr.To[int32](reps), Template: infrav1.MicrovmTemplateSpec{ Spec: mvm.Spec, }, @@ -259,7 +263,7 @@ func createMicrovmDeployment(reps int32, hostCount int) *infrav1.MicrovmDeployme }, Spec: infrav1.MicrovmDeploymentSpec{ Hosts: hosts, - Replicas: pointer.Int32(reps), + Replicas: ptr.To[int32](reps), Template: infrav1.MicrovmTemplateSpec{ Spec: mvm.Spec, }, @@ -271,7 +275,7 @@ func withExistingMicrovm(fc *fakes.FakeClient, mvmState flintlocktypes.MicroVMSt fc.GetMicroVMReturns(&flintlockv1.GetMicroVMResponse{ Microvm: &flintlocktypes.MicroVM{ Spec: &flintlocktypes.MicroVMSpec{ - Uid: pointer.String(testMicrovmUID), + Uid: ptr.To(testMicrovmUID), }, Status: &flintlocktypes.MicroVMStatus{ State: mvmState, @@ -288,7 +292,7 @@ func withCreateMicrovmSuccess(fc *fakes.FakeClient) { fc.CreateMicroVMReturns(&flintlockv1.CreateMicroVMResponse{ Microvm: &flintlocktypes.MicroVM{ Spec: &flintlocktypes.MicroVMSpec{ - Uid: pointer.String(testMicrovmUID), + Uid: ptr.To(testMicrovmUID), }, Status: &flintlocktypes.MicroVMStatus{ State: flintlocktypes.MicroVMStatus_PENDING, @@ -360,7 +364,7 @@ func ensureMicrovmState(g *WithT, c client.Client) { for _, mvm := range mvmList.Items { mvm.Status.Ready = true - g.Expect(c.Update(context.TODO(), &mvm)).To(Succeed()) + g.Expect(c.Status().Update(context.TODO(), &mvm)).To(Succeed()) } } @@ -373,7 +377,7 @@ func ensureMicrovmReplicaSetState(g *WithT, c client.Client, r, rr int32) { mvm.Status.Ready = true mvm.Status.ReadyReplicas = rr mvm.Status.Replicas = r - g.Expect(c.Update(context.TODO(), &mvm)).To(Succeed()) + g.Expect(c.Status().Update(context.TODO(), &mvm)).To(Succeed()) } } diff --git a/controllers/microvm_controller.go b/controllers/microvm_controller.go index c5e931d..3ae29f7 100644 --- a/controllers/microvm_controller.go +++ b/controllers/microvm_controller.go @@ -22,10 +22,10 @@ import ( "strings" "time" - flclient "github.com/weaveworks-liquidmetal/controller-pkg/client" - flservice "github.com/weaveworks-liquidmetal/controller-pkg/services/microvm" - "github.com/weaveworks-liquidmetal/controller-pkg/types/microvm" - flintlocktypes "github.com/weaveworks-liquidmetal/flintlock/api/types" + flclient "github.com/liquidmetal-dev/controller-pkg/client" + flservice "github.com/liquidmetal-dev/controller-pkg/services/microvm" + "github.com/liquidmetal-dev/controller-pkg/types/microvm" + flintlocktypes "github.com/liquidmetal-dev/flintlock/api/types" apierrors "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/runtime" ctrl "sigs.k8s.io/controller-runtime" @@ -266,6 +266,7 @@ func (r *MicrovmReconciler) parseMicroVMState( mvmScope.MicroVM.Status.VMState = µvm.VMStateFailed mvmScope.SetNotReady(infrav1.MicrovmProvisionFailedReason, "Error", + "%s", errMicrovmFailed.Error(), ) @@ -281,6 +282,7 @@ func (r *MicrovmReconciler) parseMicroVMState( mvmScope.SetNotReady( infrav1.MicrovmUnknownStateReason, "Error", + "%s", errMicrovmUnknownState.Error(), ) diff --git a/controllers/microvm_controller_test.go b/controllers/microvm_controller_test.go index b26aa51..7d2bbf3 100644 --- a/controllers/microvm_controller_test.go +++ b/controllers/microvm_controller_test.go @@ -6,14 +6,14 @@ import ( "testing" "time" + "github.com/liquidmetal-dev/controller-pkg/types/microvm" + flintlocktypes "github.com/liquidmetal-dev/flintlock/api/types" . "github.com/onsi/gomega" - "github.com/weaveworks-liquidmetal/controller-pkg/types/microvm" - flintlocktypes "github.com/weaveworks-liquidmetal/flintlock/api/types" infrav1 "github.com/weaveworks-liquidmetal/microvm-operator/api/v1alpha1" "github.com/weaveworks-liquidmetal/microvm-operator/controllers/fakes" apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/utils/pointer" + "k8s.io/utils/ptr" ) func TestMicrovm_Reconcile_MissingObject(t *testing.T) { @@ -154,7 +154,7 @@ func TestMicrovm_ReconcileNormal_NoVmCreateSucceeds(t *testing.T) { g.Expect(err).NotTo(HaveOccurred(), "Getting microvm should not fail") expectedProviderID := fmt.Sprintf("microvm://127.0.0.1:9090/%s", testMicrovmUID) - g.Expect(reconciled.Spec.ProviderID).To(Equal(pointer.String(expectedProviderID))) + g.Expect(reconciled.Spec.ProviderID).To(Equal(ptr.To(expectedProviderID))) assertConditionFalse(g, reconciled, infrav1.MicrovmReadyCondition, infrav1.MicrovmPendingReason) assertVMState(g, reconciled, microvm.VMStatePending) @@ -167,7 +167,7 @@ func TestMicrovm_ReconcileNormal_NoVmCreateWithUserdataSucceeds(t *testing.T) { mvm := createMicrovm() mvm.Spec.ProviderID = nil - mvm.Spec.UserData = pointer.String(testBootstrapData) + mvm.Spec.UserData = ptr.To(testBootstrapData) fakeAPIClient := fakes.FakeClient{} withMissingMicrovm(&fakeAPIClient) @@ -279,7 +279,7 @@ func TestMicrovm_ReconcileDelete_Succeeds(t *testing.T) { mvm.DeletionTimestamp = &metav1.Time{ Time: time.Now(), } - mvm.Spec.ProviderID = pointer.String(fmt.Sprintf("microvm://127.0.0.1:9090/%s", testMicrovmUID)) + mvm.Spec.ProviderID = ptr.To(fmt.Sprintf("microvm://127.0.0.1:9090/%s", testMicrovmUID)) mvm.Finalizers = []string{infrav1.MvmFinalizer} fakeAPIClient := fakes.FakeClient{} diff --git a/controllers/microvmdeployment_controller.go b/controllers/microvmdeployment_controller.go index e86269e..194ad38 100644 --- a/controllers/microvmdeployment_controller.go +++ b/controllers/microvmdeployment_controller.go @@ -23,14 +23,14 @@ import ( apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" - "k8s.io/utils/pointer" + "k8s.io/utils/ptr" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" "sigs.k8s.io/controller-runtime/pkg/log" "sigs.k8s.io/controller-runtime/pkg/reconcile" - "github.com/weaveworks-liquidmetal/controller-pkg/types/microvm" + "github.com/liquidmetal-dev/controller-pkg/types/microvm" "github.com/weaveworks-liquidmetal/microvm-operator/api/v1alpha1" infrastructurev1alpha1 "github.com/weaveworks-liquidmetal/microvm-operator/api/v1alpha1" infrav1 "github.com/weaveworks-liquidmetal/microvm-operator/api/v1alpha1" @@ -273,7 +273,7 @@ func (r *MicrovmDeploymentReconciler) createReplicaSet( }, Spec: infrav1.MicrovmReplicaSetSpec{ Host: host, - Replicas: pointer.Int32(mvmDeploymentScope.DesiredReplicas()), + Replicas: ptr.To[int32](mvmDeploymentScope.DesiredReplicas()), Template: infrav1.MicrovmTemplateSpec{ Spec: mvmDeploymentScope.MicrovmSpec(), }, diff --git a/controllers/microvmdeployment_controller_test.go b/controllers/microvmdeployment_controller_test.go index 4a9032b..a81ddf5 100644 --- a/controllers/microvmdeployment_controller_test.go +++ b/controllers/microvmdeployment_controller_test.go @@ -4,8 +4,8 @@ import ( "context" "testing" + "github.com/liquidmetal-dev/controller-pkg/types/microvm" . "github.com/onsi/gomega" - "github.com/weaveworks-liquidmetal/controller-pkg/types/microvm" infrav1 "github.com/weaveworks-liquidmetal/microvm-operator/api/v1alpha1" "k8s.io/apimachinery/pkg/runtime" ) diff --git a/controllers/microvmreplicaset_controller_test.go b/controllers/microvmreplicaset_controller_test.go index 473391a..2975d5d 100644 --- a/controllers/microvmreplicaset_controller_test.go +++ b/controllers/microvmreplicaset_controller_test.go @@ -7,7 +7,7 @@ import ( . "github.com/onsi/gomega" infrav1 "github.com/weaveworks-liquidmetal/microvm-operator/api/v1alpha1" "k8s.io/apimachinery/pkg/runtime" - "k8s.io/utils/pointer" + "k8s.io/utils/ptr" ) func TestMicrovmRS_Reconcile_MissingObject(t *testing.T) { @@ -99,7 +99,7 @@ func TestMicrovmRS_ReconcileNormal_UpdateSucceeds(t *testing.T) { g.Expect(reconciled.Status.ReadyReplicas).To(Equal(initialReplicaCount), "Expected all replicas to be ready") // update, scale down to 1 - reconciled.Spec.Replicas = pointer.Int32(scaledReplicaCount) + reconciled.Spec.Replicas = ptr.To[int32](scaledReplicaCount) g.Expect(client.Update(context.TODO(), reconciled)).To(Succeed()) // first reconciliation diff --git a/go.mod b/go.mod index 64dcec8..e233f1b 100644 --- a/go.mod +++ b/go.mod @@ -1,95 +1,91 @@ module github.com/weaveworks-liquidmetal/microvm-operator -go 1.19 +go 1.26.0 require ( - github.com/go-logr/logr v1.2.3 - github.com/onsi/ginkgo/v2 v2.1.4 - github.com/onsi/gomega v1.20.0 - github.com/weaveworks-liquidmetal/controller-pkg/client v0.0.0-20221118161315-83de77687232 - github.com/weaveworks-liquidmetal/controller-pkg/services/microvm v0.0.0-20221118161315-83de77687232 - github.com/weaveworks-liquidmetal/controller-pkg/types/microvm v0.0.0-20221118161315-83de77687232 - github.com/weaveworks-liquidmetal/flintlock/api v0.0.0-20221108110312-4cf137879fb2 - github.com/weaveworks-liquidmetal/flintlock/client v0.0.0-20221108110312-4cf137879fb2 - google.golang.org/grpc v1.50.1 - google.golang.org/protobuf v1.28.1 + github.com/go-logr/logr v1.4.4 + github.com/liquidmetal-dev/controller-pkg/client v0.0.0-20261026124423-f0cc821094ae + github.com/liquidmetal-dev/controller-pkg/services/microvm v0.0.0-20261026124423-f0cc821094ae + github.com/liquidmetal-dev/controller-pkg/types/microvm v0.0.0-20261026124423-f0cc821094ae + github.com/liquidmetal-dev/flintlock/api v0.0.0-20261019094127-d84063e5e219 + github.com/liquidmetal-dev/flintlock/client v0.0.0-20261019094127-d84063e5e219 + github.com/onsi/gomega v1.44.0 + google.golang.org/grpc v1.84.0 + google.golang.org/protobuf v1.36.12 gopkg.in/yaml.v2 v2.4.0 - k8s.io/api v0.25.0 - k8s.io/apimachinery v0.25.0 - k8s.io/client-go v0.25.0 - k8s.io/utils v0.0.0-20221108210102-8e77b1f39fe2 - sigs.k8s.io/cluster-api v1.2.5 - sigs.k8s.io/controller-runtime v0.13.0 + k8s.io/api v0.36.3 + k8s.io/apimachinery v0.36.3 + k8s.io/client-go v0.36.3 + k8s.io/utils v0.0.0-20261023123148-ca04ba58ecab + sigs.k8s.io/cluster-api v1.14.3 + sigs.k8s.io/cluster-api/api v1.14.3 + sigs.k8s.io/controller-runtime v0.24.1 ) require ( - cloud.google.com/go v0.97.0 // indirect - github.com/Azure/go-autorest v14.2.0+incompatible // indirect - github.com/Azure/go-autorest/autorest v0.11.27 // indirect - github.com/Azure/go-autorest/autorest/adal v0.9.20 // indirect - github.com/Azure/go-autorest/autorest/date v0.3.0 // indirect - github.com/Azure/go-autorest/logger v0.2.1 // indirect - github.com/Azure/go-autorest/tracing v0.6.0 // indirect - github.com/PuerkitoBio/purell v1.1.1 // indirect - github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 // indirect github.com/beorn7/perks v1.0.1 // indirect - github.com/blang/semver v3.5.1+incompatible // 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.8.0 // indirect - github.com/evanphx/json-patch v4.12.0+incompatible // indirect - github.com/evanphx/json-patch/v5 v5.6.0 // indirect - github.com/fsnotify/fsnotify v1.5.4 // 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.19.5 // indirect - github.com/go-openapi/swag v0.19.14 // indirect - github.com/gobuffalo/flect v0.2.5 // indirect - github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang-jwt/jwt/v4 v4.2.0 // indirect - github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect - github.com/golang/protobuf v1.5.2 // indirect - github.com/google/gnostic v0.5.7-v3refs // indirect - github.com/google/go-cmp v0.5.8 // indirect - github.com/google/gofuzz v1.2.0 // indirect - github.com/google/uuid v1.2.0 // indirect - github.com/grpc-ecosystem/grpc-gateway/v2 v2.6.0 // indirect - github.com/imdario/mergo v0.3.12 // indirect - github.com/josharian/intern v1.0.0 // indirect + github.com/blang/semver/v4 v4.0.0 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/emicklei/go-restful/v3 v3.13.0 // indirect + github.com/evanphx/json-patch/v5 v5.9.11 // indirect + github.com/fsnotify/fsnotify v1.9.0 // indirect + github.com/fxamacker/cbor/v2 v2.9.0 // indirect + github.com/go-logr/zapr v1.3.0 // indirect + github.com/go-openapi/jsonpointer v1.0.1 // indirect + github.com/go-openapi/jsonreference v1.0.1 // indirect + github.com/go-openapi/swag v0.29.2 // indirect + github.com/go-openapi/swag/cmdutils v0.29.2 // indirect + github.com/go-openapi/swag/conv v0.29.2 // indirect + github.com/go-openapi/swag/fileutils v0.29.2 // indirect + github.com/go-openapi/swag/jsonutils v0.29.2 // indirect + github.com/go-openapi/swag/loading v0.29.2 // indirect + github.com/go-openapi/swag/mangling v0.29.2 // indirect + github.com/go-openapi/swag/netutils v0.29.2 // indirect + github.com/go-openapi/swag/pools v0.29.2 // indirect + github.com/go-openapi/swag/stringutils v0.29.2 // indirect + github.com/go-openapi/swag/typeutils v0.29.2 // indirect + github.com/go-openapi/swag/yamlutils v0.29.2 // indirect + github.com/gobuffalo/flect v1.0.3 // indirect + github.com/google/gnostic-models v0.7.0 // indirect + github.com/google/go-cmp v0.7.0 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.31.0 // indirect github.com/json-iterator/go v1.1.12 // indirect - github.com/mailru/easyjson v0.7.6 // indirect - github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect - github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect + github.com/onsi/ginkgo/v2 v2.33.1 // indirect github.com/pkg/errors v0.9.1 // indirect - github.com/prometheus/client_golang v1.12.2 // indirect - github.com/prometheus/client_model v0.2.0 // indirect - github.com/prometheus/common v0.32.1 // indirect - github.com/prometheus/procfs v0.7.3 // indirect - github.com/spf13/pflag v1.0.5 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/prometheus/client_golang v1.23.2 // indirect + github.com/prometheus/client_model v0.6.2 // indirect + github.com/prometheus/common v0.67.5 // indirect + github.com/prometheus/procfs v0.19.2 // indirect + github.com/spf13/pflag v1.0.10 // indirect + github.com/x448/float16 v0.8.4 // indirect github.com/yitsushi/macpot v1.0.2 // indirect - go.uber.org/atomic v1.7.0 // indirect - go.uber.org/multierr v1.6.0 // indirect - go.uber.org/zap v1.21.0 // indirect - golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4 // indirect - golang.org/x/net v0.0.0-20220906165146-f3363e06e74c // indirect - golang.org/x/oauth2 v0.0.0-20220608161450-d0670ef3b1eb // indirect - golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10 // indirect - golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 // indirect - golang.org/x/text v0.3.7 // indirect - golang.org/x/time v0.0.0-20220609170525-579cf78fd858 // indirect - gomodules.xyz/jsonpatch/v2 v2.2.0 // indirect - google.golang.org/appengine v1.6.7 // indirect - google.golang.org/genproto v0.0.0-20220519153652-3a47de7e79bd // indirect - gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect + go.uber.org/multierr v1.11.0 // indirect + go.uber.org/zap v1.28.0 // indirect + go.yaml.in/yaml/v2 v2.4.3 // indirect + go.yaml.in/yaml/v3 v3.0.5 // indirect + golang.org/x/net v0.59.0 // indirect + golang.org/x/oauth2 v0.36.0 // indirect + golang.org/x/sync v0.23.0 // indirect + golang.org/x/sys v0.48.0 // indirect + golang.org/x/term v0.46.0 // indirect + golang.org/x/text v0.42.0 // indirect + golang.org/x/time v0.14.0 // indirect + gomodules.xyz/jsonpatch/v2 v2.5.0 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20261012220534-4341edf3f941 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20261012220534-4341edf3f941 // indirect + gopkg.in/evanphx/json-patch.v4 v4.13.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect - gopkg.in/yaml.v3 v3.0.1 // indirect - k8s.io/apiextensions-apiserver v0.25.0 // indirect - k8s.io/component-base v0.25.0 // indirect - k8s.io/klog/v2 v2.80.1 // indirect - k8s.io/kube-openapi v0.0.0-20220803162953-67bda5d908f1 // 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/yaml v1.3.0 // indirect + k8s.io/apiextensions-apiserver v0.36.3 // indirect + k8s.io/klog/v2 v2.140.0 // indirect + k8s.io/kube-openapi v0.0.0-20260317180543-43fb72c5454a // indirect + sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730 // indirect + sigs.k8s.io/randfill v1.0.0 // indirect + sigs.k8s.io/structured-merge-diff/v6 v6.4.2 // indirect + sigs.k8s.io/yaml v1.6.0 // indirect ) diff --git a/go.sum b/go.sum index 077f52f..bfd4da0 100644 --- a/go.sum +++ b/go.sum @@ -1,857 +1,223 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= -cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= -cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= -cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= -cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= -cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= -cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= -cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= -cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= -cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= -cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= -cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= -cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= -cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= -cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= -cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= -cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= -cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= -cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= -cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= -cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= -cloud.google.com/go v0.97.0 h1:3DXvAyifywvq64LfkKaMOmkWPS1CikIQdMe2lY9vxU8= -cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= -cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= -cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= -cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= -cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= -cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= -cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= -cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= -cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= -cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= -cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= -cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= -cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= -cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= -cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= -cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/Azure/go-autorest v14.2.0+incompatible h1:V5VMDjClD3GiElqLWO7mz2MxNAK/vTfRHdAubSIPRgs= -github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest/autorest v0.11.27 h1:F3R3q42aWytozkV8ihzcgMO4OA4cuqr3bNlsEuF6//A= -github.com/Azure/go-autorest/autorest v0.11.27/go.mod h1:7l8ybrIdUmGqZMTD0sRtAr8NvbHjfofbf8RSP2q7w7U= -github.com/Azure/go-autorest/autorest/adal v0.9.18/go.mod h1:XVVeme+LZwABT8K5Lc3hA4nAe8LDBVle26gTrguhhPQ= -github.com/Azure/go-autorest/autorest/adal v0.9.20 h1:gJ3E98kMpFB1MFqQCvA1yFab8vthOeD4VlFRQULxahg= -github.com/Azure/go-autorest/autorest/adal v0.9.20/go.mod h1:XVVeme+LZwABT8K5Lc3hA4nAe8LDBVle26gTrguhhPQ= -github.com/Azure/go-autorest/autorest/date v0.3.0 h1:7gUk1U5M/CQbp9WoqinNzJar+8KY+LPI6wiWrP/myHw= -github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= -github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= -github.com/Azure/go-autorest/autorest/mocks v0.4.2 h1:PGN4EDXnuQbojHbU0UWoNvmu9AGVwYHG9/fkDYhtAfw= -github.com/Azure/go-autorest/autorest/mocks v0.4.2/go.mod h1:Vy7OitM9Kei0i1Oj+LvyAWMXJHeKH1MVlzFugfVrmyU= -github.com/Azure/go-autorest/logger v0.2.1 h1:IG7i4p/mDa2Ce4TRyAO8IHnVhAVF3RFU+ZtXWSmf4Tg= -github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= -github.com/Azure/go-autorest/tracing v0.6.0 h1:TYi4+3m5t6K48TGI9AUdb+IzbnSxvnvUMfuitfgcfuo= -github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/MakeNowJust/heredoc v1.0.0 h1:cXCdzVdstXyiTqTvfqk9SDHpKNjxuom+DOlyEeQ4pzQ= -github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI= -github.com/Masterminds/semver/v3 v3.1.1 h1:hLg3sBzpNErnxhQtUy/mmLR2I9foDujNK030IGemrRc= -github.com/Masterminds/sprig/v3 v3.2.2 h1:17jRggJu518dr3QaafizSXOjKYp94wKfABxUmyxvxX8= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI= -github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= -github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20220418222510-f25a4f6275ed h1:ue9pVfIcP+QMEjfgo/Ez4ZjNZfonGgR6NgjMaJMu1Cg= -github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a h1:idn718Q4B6AGu/h5Sxe66HYVdqdGu2l9Iebqhi/AEoA= -github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= -github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= -github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= +github.com/Masterminds/semver/v3 v3.4.0 h1:Zog+i5UMtVoCU8oKka5P7i9q9HgrJeGzI9SA1Xbatp0= +github.com/Masterminds/semver/v3 v3.4.0/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdnnjpJbkM4JQ= -github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= -github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= -github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= -github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= -github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/coredns/caddy v1.1.0 h1:ezvsPrT/tA/7pYDBZxu0cT0VmWk75AfIaf6GSYCNMf0= -github.com/coredns/corefile-migration v1.0.17 h1:tNwh8+4WOANV6NjSljwgW7qViJfhvPUt1kosj4rR8yg= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/docker/distribution v2.8.1+incompatible h1:Q50tZOPR6T/hjNsyc9g8/syEs6bk8XXApsHjKukMl68= -github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= -github.com/emicklei/go-restful/v3 v3.8.0 h1:eCZ8ulSerjdAiaNpF7GxXIE7ZCMo1moN1qX+S609eVw= -github.com/emicklei/go-restful/v3 v3.8.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= -github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= -github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= -github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/evanphx/json-patch v0.5.2/go.mod h1:ZWS5hhDbVDyob71nXKNL0+PWn6ToqBHMikGIFbs31qQ= -github.com/evanphx/json-patch v4.12.0+incompatible h1:4onqiflcdA9EOZ4RxV643DvftH5pOlLGNtQ5lPWQu84= -github.com/evanphx/json-patch v4.12.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch/v5 v5.6.0 h1:b91NhWfaz02IuVxO9faSllyAtNXHMPkC5J8sJCLunww= -github.com/evanphx/json-patch/v5 v5.6.0/go.mod h1:G79N1coSVB93tBe7j6PhzjmR3/2VvlbKOFpnXhI9Bw4= -github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI= -github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= -github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= -github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= -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.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0= -github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/zapr v1.2.3 h1:a9vnzlIBPQBBkeaR9IuMUfmVOrQlkoC4YfPoFkX3T7A= -github.com/go-logr/zapr v1.2.3/go.mod h1:eIauM6P8qSvTw5o2ez6UEAfGjQKrxQTl5EoK+Qa2oG4= -github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY= -github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonreference v0.19.5 h1:1WJP/wi4OjB4iV8KVbH73rQaoialJrqv8gitZLxGLtM= -github.com/go-openapi/jsonreference v0.19.5/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg= -github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.14 h1:gm3vOOXfiuw5i9p5N9xJvfjvuofpyvLA9Wr6QfK5Fng= -github.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/gobuffalo/flect v0.2.5 h1:H6vvsv2an0lalEaCDRThvtBfmg44W/QHXBCYUXf/6S4= -github.com/gobuffalo/flect v0.2.5/go.mod h1:1ZyCLIbg0YD7sDkzvFdPoOydPtD8y9JQnrOROolUcM8= -github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= -github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= -github.com/golang-jwt/jwt/v4 v4.2.0 h1:besgBTC8w8HjP6NzQdxwKH9Z5oQMZ24ThTrHp3cZ8eU= -github.com/golang-jwt/jwt/v4 v4.2.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.0.0 h1:nfP3RFugxnNRyKgeWd4oI1nYvXpxrx8ck8ZrcizshdQ= -github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= -github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= -github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= -github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= -github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= -github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= -github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= -github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= -github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= -github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/cel-go v0.12.4 h1:YINKfuHZ8n72tPOqSPZBwGiDpew2CJS48mdM5W8LZQU= -github.com/google/gnostic v0.5.7-v3refs h1:FhTMOKj2VhjpouxvWJAV1TL304uMlb9zcDqkl6cEI54= -github.com/google/gnostic v0.5.7-v3refs/go.mod h1:73MKFl6jIHelAJNaBGFzt3SPtZULs9dYrGFt8OiIsHQ= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= -github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/emicklei/go-restful/v3 v3.13.0 h1:C4Bl2xDndpU6nJ4bc1jXd+uTmYPVUwkD6bFY/oTyCes= +github.com/emicklei/go-restful/v3 v3.13.0/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/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k= +github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= +github.com/fxamacker/cbor/v2 v2.9.0 h1:NpKPmjDBgUfBms6tr6JZkTHtfFGcMKsw3eGcmD/sapM= +github.com/fxamacker/cbor/v2 v2.9.0/go.mod h1:vM4b+DJCtHn+zz7h3FFp/hDAI9WNWCsZj23V5ytsSxQ= +github.com/go-logr/logr v1.4.4 h1:tG4xh9yMsRCAiodLVTxyrkzSZ9+o0L1Kg/+cPVcbP/8= +github.com/go-logr/logr v1.4.4/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 v1.0.1 h1:2KxywRmNwJkT/FMBa3iRNHEaAxSJvjqoufQZy3au1Mg= +github.com/go-openapi/jsonpointer v1.0.1/go.mod h1:wI7ZYsFmbIi9nBXOZqgDaS/bqOchRGZjqxFli7FBYxY= +github.com/go-openapi/jsonreference v1.0.1 h1:4zJ7AmYDKNmD3aSpfPnFNCFA5E80/xMHUNKgydaLh38= +github.com/go-openapi/jsonreference v1.0.1/go.mod h1:dYplQXa6p5lXprLcJ8LE2iU7vNpXsAHDQ5ZAgL+Qx3A= +github.com/go-openapi/swag v0.29.2 h1:9n8frkcsuQRA0INU31VbxNxt1zBaHxrHYGEf5BUjFi4= +github.com/go-openapi/swag v0.29.2/go.mod h1:RkCiX1gCVXWgLOavDXE3ALJrQ/VO2ziiIzOUs3z10xo= +github.com/go-openapi/swag/cmdutils v0.29.2 h1:cXEzX/nWCODon251f+1HgL75/R4XXML5IZxgLCWMoro= +github.com/go-openapi/swag/cmdutils v0.29.2/go.mod h1:XziaSVzYqkDvpWXzASfWajw2YvJrLscq610O2XiyqJw= +github.com/go-openapi/swag/conv v0.29.2 h1:8c9shoB8l0QRSR6ymq1llHdBWDqpIgJfjTGHx3Vuhm0= +github.com/go-openapi/swag/conv v0.29.2/go.mod h1:AZS0YigTNf8qNtD6WqJz/N4RUNmpr76SyjFGkq4+p6Q= +github.com/go-openapi/swag/fileutils v0.29.2 h1:mdUL+Vw5ah1fO1AvFCoHeIyv7YZsCz2MN3KNqd/lLVI= +github.com/go-openapi/swag/fileutils v0.29.2/go.mod h1:7QKmmodjAebaq61lGVJa8ldLdGeMF4DSgYv8tXOGGo0= +github.com/go-openapi/swag/jsonutils v0.29.2 h1:uZNSD2/rJDYAfvsLYkykTzXuyxM3QpDKV9jhRHrMu6k= +github.com/go-openapi/swag/jsonutils v0.29.2/go.mod h1:ONTdNvj3Y+IXRzfa17E+Rgt2ns/qiSOYjIo2K7v2yDs= +github.com/go-openapi/swag/jsonutils/fixtures_test v0.29.2 h1:w+Fd6EBOMGlC74GYGHqCLGyb3Bpams8TtNrgM/SG4jo= +github.com/go-openapi/swag/jsonutils/fixtures_test v0.29.2/go.mod h1:HC2egPORFzbj/gf05Zrfgz8Mgplx3oW7hgGi7pjZVhM= +github.com/go-openapi/swag/loading v0.29.2 h1:QU1ry24e6r6Shoxe380Nx0X5iKkpRO+hJffsyJ2dVlY= +github.com/go-openapi/swag/loading v0.29.2/go.mod h1:DqilDjuiJKETecsS4TRopWG1acUDsfqN39ZmQhPu6uI= +github.com/go-openapi/swag/mangling v0.29.2 h1:ltdo3K0tTP4P6zWhVVWDU9D37/YYBuMJRdZxiS2Dtog= +github.com/go-openapi/swag/mangling v0.29.2/go.mod h1:RjDi4TnItAenS3cgCXSpIl1kKbjG7il6pnmQVl/8bp8= +github.com/go-openapi/swag/netutils v0.29.2 h1:dBli6jyUa93sDS/XYWShJzf4+nnVfFKfvY9SLUaUzB8= +github.com/go-openapi/swag/netutils v0.29.2/go.mod h1:1pM6Xg/Um8E1eps3umWl8Hme3ByWXOtHsvFC0CULHUE= +github.com/go-openapi/swag/pools v0.29.2 h1:PlGoDRF8WtSyXkedZZkpW3f9wDhFf3u8KtaBcmgmh8c= +github.com/go-openapi/swag/pools v0.29.2/go.mod h1:V3lhxVT4qDYRqc2MRSSbLsTYIYV/2HlHafhyEkmzLIc= +github.com/go-openapi/swag/stringutils v0.29.2 h1:lcnBxwAaysT3bMUVBfn9V/PkfVqkurpqufKU6rTUMGk= +github.com/go-openapi/swag/stringutils v0.29.2/go.mod h1:i9cdh7sGaa0nm3CqIvH5IM5h2QClk1wns2ktKeILvRI= +github.com/go-openapi/swag/typeutils v0.29.2 h1:O7aVvkTs3pXwikgtrPLenigEMdQFgONKRooQA9pgf2I= +github.com/go-openapi/swag/typeutils v0.29.2/go.mod h1:7+GDG+uz9Ke+eVt4rClZg7wklSDp8hT/mKNh/pC26TE= +github.com/go-openapi/swag/yamlutils v0.29.2 h1:IFKFFeDnuIwzfsuWRQU+rI8iL3g4XyAYjV/RlnlxPLM= +github.com/go-openapi/swag/yamlutils v0.29.2/go.mod h1:7MGqtcrK73sxQ4ceiyIf8qiXS/s09JLMdR5esK5euYQ= +github.com/go-openapi/testify/enable/yaml/v2 v2.7.0 h1:wPW6YRgx3+SID1yUy/Xwa17L8kFEaEKod2VRbJDZNUs= +github.com/go-openapi/testify/enable/yaml/v2 v2.7.0/go.mod h1:mI1M88etYbc3PhgHsWQK2kwvNwW5aGFqMPbmib+SGIs= +github.com/go-openapi/testify/v2 v2.7.0 h1:bycOreEj6wfBvijg3YFogZ/sFjTCDmQnwSodSzHa3X8= +github.com/go-openapi/testify/v2 v2.7.0/go.mod h1:SgsVHtfooshd0tublTtJ50FPKhujf47YRqauXXOUxfw= +github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= +github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= +github.com/gobuffalo/flect v1.0.3 h1:xeWBM2nui+qnVvNM4S3foBhCAL2XgPU+a7FdpelbTq4= +github.com/gobuffalo/flect v1.0.3/go.mod h1:A5msMlrHtLqh9umBSnvabjsMrCcCpAyzglnDvkbYKHs= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/google/gnostic-models v0.7.0 h1:qwTtogB15McXDaNqTZdzPJRHvaVJlAl+HVQnLmJEJxo= +github.com/google/gnostic-models v0.7.0/go.mod h1:whL5G0m6dmc5cPxKc5bdKdEN3UjI7OUGxBlw57miDrQ= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= -github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.2.0 h1:qJYtXnJRWmpe7m/3XlyhrsLrEURqHRM2kxzoxXqyUDs= -github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= -github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.6.0 h1:rgxjzoDmDXw5q8HONgyHhBas4to0/XWRo/gPpJhsUNQ= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.6.0/go.mod h1:qrJPVzv9YlhsrxJc3P/Q85nr0w1lIRikTl4JlhdDH5w= -github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/huandu/xstrings v1.3.2 h1:L18LIDzqlW6xN2rEkpdV8+oL/IXWJ1APd+vsdYy4Wdw= -github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU= -github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= -github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= -github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= -github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= -github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= -github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/google/pprof v0.0.0-20260402051712-545e8a4df936 h1:EwtI+Al+DeppwYX2oXJCETMO23COyaKGP6fHVpkpWpg= +github.com/google/pprof v0.0.0-20260402051712-545e8a4df936/go.mod h1:MxpfABSjhmINe3F1It9d+8exIHFvUqtLIRCdOGNXqiI= +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/grpc-ecosystem/grpc-gateway/v2 v2.31.0 h1:Bd7KaOxzULLxtZ/K5s1aLbWhR0+5RToO65TXHsf3bqQ= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.31.0/go.mod h1:nN7ts3dFXKtCZWc//yfkpcQNKJABg16/uDVAZpLDalo= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= -github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= -github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= -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/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= -github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= +github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.7.6 h1:8yTIVnZgCoiM1TgqoeTl+LfU5Jg6/xL3QhGQnimLYnA= -github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI= -github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= -github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= -github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= -github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= +github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= +github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= +github.com/liquidmetal-dev/controller-pkg/client v0.0.0-20261026124423-f0cc821094ae h1:APKEiJ3AwhzworF9wUPzbV5vGEOn7+/PQd3XY9X5B2E= +github.com/liquidmetal-dev/controller-pkg/client v0.0.0-20261026124423-f0cc821094ae/go.mod h1:7Blh7X/ks1uy9r5nm0UbAQf5KNl7P0FK64fZcOijqWI= +github.com/liquidmetal-dev/controller-pkg/services/microvm v0.0.0-20261026124423-f0cc821094ae h1:R9HkmrTsmagdfy+rHOLAwpT5idMFR2kDUBuzpWCPDyY= +github.com/liquidmetal-dev/controller-pkg/services/microvm v0.0.0-20261026124423-f0cc821094ae/go.mod h1:1mzC/qxrw3PmfFdEX8UafCRRCd8D8+hdLae3q+es4Nk= +github.com/liquidmetal-dev/controller-pkg/types/microvm v0.0.0-20261026124423-f0cc821094ae h1:o3JfAVmjiIvxB02OhC6bQcDr08QiB+Ob3bc8MtYGjgo= +github.com/liquidmetal-dev/controller-pkg/types/microvm v0.0.0-20261026124423-f0cc821094ae/go.mod h1:WtVMaW23bVAY5G5Gv2h4PKMQ6+MEyAX/runKS1uEgEQ= +github.com/liquidmetal-dev/flintlock/api v0.0.0-20261019094127-d84063e5e219 h1:skMLqGJ8dF6M9xkOKns7qv/x6y6n/2gCnLsIkYA/fP0= +github.com/liquidmetal-dev/flintlock/api v0.0.0-20261019094127-d84063e5e219/go.mod h1:+MX1HsjB9LnSYysNwANCYa0bTnx2tuCzycyqa8XUG9A= +github.com/liquidmetal-dev/flintlock/client v0.0.0-20261019094127-d84063e5e219 h1:JNVdaLQU9rpps/yzcTw+IhYxNDUtPExF14pvdYJk2N0= +github.com/liquidmetal-dev/flintlock/client v0.0.0-20261019094127-d84063e5e219/go.mod h1:5yLcwzaJr9XVbDoq3KPyu8H0XvF6hqnKVPQ4hyJpBKw= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFdJifH4BDsTlE89Zl93FEloxaWZfGcifgq8= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= 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/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= -github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= -github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= -github.com/onsi/ginkgo/v2 v2.1.4 h1:GNapqRSid3zijZ9H77KrgVG4/8KqiyRsxcSxe+7ApXY= -github.com/onsi/ginkgo/v2 v2.1.4/go.mod h1:um6tUpWM/cxCK3/FK8BXqEiUMUwRgSM4JXG47RKZmLU= -github.com/onsi/gomega v1.20.0 h1:8W0cWlwFkflGPLltQvLRB7ZVD5HuP6ng320w2IS245Q= -github.com/onsi/gomega v1.20.0/go.mod h1:DtrZpjmvpn2mPm4YWQa0/ALMDj9v4YxLgojwPeREyVo= -github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= -github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/onsi/ginkgo/v2 v2.33.1 h1:62XfWJbEIjPSCSDYrsCPP/SHcmH7O0M8ne8zfqQ2iz4= +github.com/onsi/ginkgo/v2 v2.33.1/go.mod h1:+aXOY+vzZ5mu2iI2HpTZUPmM//oQfsNFX6gU9kNcA44= +github.com/onsi/gomega v1.44.0 h1:eAiGl3Pw5jz5GQdDff0BcxYpAX1JxW8xD7mFUuwNfZQ= +github.com/onsi/gomega v1.44.0/go.mod h1:e/C2HwaZ1DhvjzXXuFhcR7hY7Sh9pl7MmoWKEjzwcdA= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= -github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.12.2 h1:51L9cDoUHVrXx4zWYlcLQIZ+d+VXHgqnYKkIuq4g/34= -github.com/prometheus/client_golang v1.12.2/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= -github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= -github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= -github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= -github.com/prometheus/common v0.32.1 h1:hWIdL3N2HoUx3B8j3YN9mWor0qhY/NlEKZEaXxuIRh4= -github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= -github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU= -github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/shopspring/decimal v1.2.0 h1:abSATXmQEYyShuxI4/vyW3tV1MrKAJzCZ/0zLUXYbsQ= -github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= -github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= -github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/stoewer/go-strcase v1.2.0 h1:Z2iHWqGXH00XYgqDmNgQbIBxf3wrNq0F3feEy0ainaU= -github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/prometheus/client_golang v1.23.2 h1:Je96obch5RDVy3FDMndoUsjAhG5Edi49h0RJWRi/o0o= +github.com/prometheus/client_golang v1.23.2/go.mod h1:Tb1a6LWHB3/SPIzCoaDXI4I8UHKeFTEQ1YCr+0Gyqmg= +github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk= +github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE= +github.com/prometheus/common v0.67.5 h1:pIgK94WWlQt1WLwAC5j2ynLaBRDiinoAb86HZHTUGI4= +github.com/prometheus/common v0.67.5/go.mod h1:SjE/0MzDEEAyrdr5Gqc6G+sXI67maCxzaT3A2+HqjUw= +github.com/prometheus/procfs v0.19.2 h1:zUMhqEW66Ex7OXIiDkll3tl9a1ZdilUOd/F6ZXw4Vws= +github.com/prometheus/procfs v0.19.2/go.mod h1:M0aotyiemPhBCM0z5w87kL22CxfcH05ZpYlu+b4J7mw= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= +github.com/spf13/pflag v1.0.10 h1:4EBh2KAYBwaONj6b2Ye1GiHfwjqyROoF4RwYO+vPwFk= +github.com/spf13/pflag v1.0.10/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.1 h1:5TQK59W5E3v0r2duFAb7P95B6hEeOyEnHRa8MjYSMTY= -github.com/weaveworks-liquidmetal/controller-pkg/client v0.0.0-20221118161315-83de77687232 h1:ODvIKIfUzOYEOsMiUkIOSjKF7CzveE29/L46GsDLp40= -github.com/weaveworks-liquidmetal/controller-pkg/client v0.0.0-20221118161315-83de77687232/go.mod h1:0snthlwNQ731b4CPJtSZ8I76FgS02wAOfyar9ss+X+U= -github.com/weaveworks-liquidmetal/controller-pkg/services/microvm v0.0.0-20221118161315-83de77687232 h1:Nsd0XLPPizVY8oXR+D34GR5JzTpu4XGC3oVFaxudH5Q= -github.com/weaveworks-liquidmetal/controller-pkg/services/microvm v0.0.0-20221118161315-83de77687232/go.mod h1:jld9hBa9YZ4ujs9+mpQ+QWWRq/aQ+t7Rlv9C70I3bes= -github.com/weaveworks-liquidmetal/controller-pkg/types/microvm v0.0.0-20221118161315-83de77687232 h1:896AcgVPh5xcPCAnvC5WR5wyPFOz53+rndKsoeFQ6Vg= -github.com/weaveworks-liquidmetal/controller-pkg/types/microvm v0.0.0-20221118161315-83de77687232/go.mod h1:KPlbfZsmo9xlfzl98cFBqGYc9hpgSYljICR+LrqKJUA= -github.com/weaveworks-liquidmetal/flintlock/api v0.0.0-20221108110312-4cf137879fb2 h1:6BACjW2rZrpWvzK+T7sQ0dn0LOWw8u8LduoTkan58Ts= -github.com/weaveworks-liquidmetal/flintlock/api v0.0.0-20221108110312-4cf137879fb2/go.mod h1:JPML9O56MoPKGX97jfj++BtuFFS84jm4T+jWQBjO5Uc= -github.com/weaveworks-liquidmetal/flintlock/client v0.0.0-20221108110312-4cf137879fb2 h1:lC8NG5ka+MSXktrSgpmiDKvkr5kVB62vcWhU1XRahk4= -github.com/weaveworks-liquidmetal/flintlock/client v0.0.0-20221108110312-4cf137879fb2/go.mod h1:d65mpsT+pbMnMJZhUqeNtt7lcQnsX8cowl9dTRkniSI= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= +github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= github.com/yitsushi/macpot v1.0.2 h1:LSiBfVKRhzrvUTBDO2GZYAQvS+gG9wdzPaaiNeR29KM= github.com/yitsushi/macpot v1.0.2/go.mod h1:7KBzokvUNbcsR1VcmKwmYRWB2FyAWcIll4L93b2A8q4= -github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= -go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= -go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= -go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= -go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= -go.uber.org/goleak v1.1.12 h1:gZAh5/EyT/HQwlpkCy6wTpqfH9H8Lz8zbm3dZh+OyzA= -go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4= -go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -go.uber.org/zap v1.19.0/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= -go.uber.org/zap v1.21.0 h1:WefMeulhovoZ2sYXz7st6K0sLj7bBhpiFaud4r4zST8= -go.uber.org/zap v1.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw= -go4.org v0.0.0-20201209231011-d4a079459e60 h1:iqAGo78tVOJXELHQFRjR6TMwItrvXH4hrGJ32I/NFF8= -go4.org/intern v0.0.0-20211027215823-ae77deb06f29 h1:UXLjNohABv4S58tHmeuIZDO6e3mHpW2Dx33gaNt03LE= -go4.org/unsafe/assume-no-moving-gc v0.0.0-20220617031537-928513b29760 h1:FyBZqvoA/jbNzuAWLQE2kG820zMAkcilx6BMjGbL/E4= -golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -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= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4 h1:kUhD7nTDoI3fVd9G4ORWrbV5NY0liEs/Jg2pv5f+bBA= -golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= -golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= -golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= -golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220906165146-f3363e06e74c h1:yKufUcDwucU5urd+50/Opbt4AYpqthk7wHpHok8f1lo= -golang.org/x/net v0.0.0-20220906165146-f3363e06e74c/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20220608161450-d0670ef3b1eb h1:8tDJ3aechhddbdPAxpycgXHJRMLpk/Ab+aa4OgdN5/g= -golang.org/x/oauth2 v0.0.0-20220608161450-d0670ef3b1eb/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -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-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10 h1:WIoqL4EROvwiPdUtaip4VcDdpZ4kha7wBWZrbVKCIZg= -golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 h1:JGgROgKl9N8DuW20oFS5gxc+lE67/N3FcwmBPMe7ArY= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20220609170525-579cf78fd858 h1:Dpdu/EMxGMFgq0CeYMh4fazTD2vtlZRYE7wyynxJb9U= -golang.org/x/time v0.0.0-20220609170525-579cf78fd858/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -gomodules.xyz/jsonpatch/v2 v2.2.0 h1:4pT439QV83L+G9FkcCriY6EkpcK6r6bK+A5FBUMI7qY= -gomodules.xyz/jsonpatch/v2 v2.2.0/go.mod h1:WXp+iVDkoLQqPudfQ9GBlwB2eZ5DKOnjQZCYdOS8GPY= -google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= -google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= -google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= -google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= -google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= -google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= -google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= -google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= -google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= -google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= -google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= -google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= -google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= -google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= -google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= -google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= -google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= -google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220519153652-3a47de7e79bd h1:e0TwkXOdbnH/1x5rc5MZ/VYyiZ4v+RdVfrGMqEwT68I= -google.golang.org/genproto v0.0.0-20220519153652-3a47de7e79bd/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= -google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= -google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= -google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= -google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.50.1 h1:DS/BukOZWp8s6p4Dt/tOaJaTQyPyOoCcrjroHuCeLzY= -google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= -google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= -google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= -google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= -google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= -google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= -google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= -google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +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.28.0 h1:IZzaP1Fv73/T/pBMLk4VutPl36uNC+OSUh3JLG3FIjo= +go.uber.org/zap v1.28.0/go.mod h1:rDLpOi171uODNm/mxFcuYWxDsqWSAVkFdX4XojSKg/Q= +go.yaml.in/yaml/v2 v2.4.3 h1:6gvOSjQoTB3vt1l+CU+tSyi/HOjfOjRLJ4YwYZGwRO0= +go.yaml.in/yaml/v2 v2.4.3/go.mod h1:zSxWcmIDjOzPXpjlTTbAsKokqkDNAVtZO0WOMiT90s8= +go.yaml.in/yaml/v3 v3.0.5 h1:N6y/pJk8buWs9NY5ERU2HSMfm+IuD/OtfdAnq6kESPw= +go.yaml.in/yaml/v3 v3.0.5/go.mod h1:HVTZu1O7/Vkt2N+BFy8Zza+lnLsABggaTM2ZpNIGuKg= +golang.org/x/mod v0.41.0 h1:qJmnOUb4YB+FsEuM3HcWucdZASCPGhsX6uljO6pog0c= +golang.org/x/mod v0.41.0/go.mod h1:Ek9pY8RKWXwsWvd3rQiHYtMqkjSUV+s1Rj7j4H5Ur6o= +golang.org/x/net v0.59.0 h1:5zfYln+w5XCxwrnMMJPufRgNoXEaGxl0wo5GqPXyues= +golang.org/x/net v0.59.0/go.mod h1:2DA/G1UfVbCpQPeWTmMPGY7Cs2PkBkwu743bVX5PIVg= +golang.org/x/oauth2 v0.36.0 h1:peZ/1z27fi9hUOFCAZaHyrpWG5lwe0RJEEEeH0ThlIs= +golang.org/x/oauth2 v0.36.0/go.mod h1:YDBUJMTkDnJS+A4BP4eZBjCqtokkg1hODuPjwiGPO7Q= +golang.org/x/sync v0.23.0 h1:KameEIfc1IkluZyXWLn39Wd4tURc6GbCiISGiZm2bQk= +golang.org/x/sync v0.23.0/go.mod h1:sUUOizhqBxiL6pEWpqNLUiaJn1ShEbZ6BBqskPbjZm0= +golang.org/x/sys v0.48.0 h1:bbX/i/6MgT9BVLM9RT1thmxL04yeTAhbEz4SyadbXoo= +golang.org/x/sys v0.48.0/go.mod h1:hNLxWAXmnKAxqDtdwIYC4bM9oQPEecfsnNMuSxOs3og= +golang.org/x/term v0.46.0 h1:3+OXuTbaKDgwk8jTi3aSLHRlmWqHEUDUtxnbFigO4YE= +golang.org/x/term v0.46.0/go.mod h1:+K02xbkittuwc0Am4abfA3Fc+XRGXkvBXNO88NCXPoc= +golang.org/x/text v0.42.0 h1:JbOZXgfeCPU9gacVtYliJqOhD+zhrEqK4LfdpmlUZqI= +golang.org/x/text v0.42.0/go.mod h1:ojzP1Z+2QtioaF8DTtO8K5q7JWVVYwZKenzujK0Zd0E= +golang.org/x/time v0.14.0 h1:MRx4UaLrDotUKUdCIqzPC48t1Y9hANFKIRpNx+Te8PI= +golang.org/x/time v0.14.0/go.mod h1:eL/Oa2bBBK0TkX57Fyni+NgnyQQN4LitPmob2Hjnqw4= +golang.org/x/tools v0.50.0 h1:c2ifzfcuY7L90lZ2aKd8S4K2NpASF08SZx9ZuJkHmSU= +golang.org/x/tools v0.50.0/go.mod h1:7ulVMw3831Mwi5EZD6RomGyffr4VFjuNYXf2BbCEAV0= +gomodules.xyz/jsonpatch/v2 v2.5.0 h1:JELs8RLM12qJGXU4u/TO3V25KW8GreMKl9pdkk14RM0= +gomodules.xyz/jsonpatch/v2 v2.5.0/go.mod h1:AH3dM2RI6uoBZxn3LVrfvJ3E0/9dG4cSrbuBJT4moAY= +gonum.org/v1/gonum v0.17.0 h1:VbpOemQlsSMrYmn7T2OUvQ4dqxQXU+ouZFQsZOx50z4= +gonum.org/v1/gonum v0.17.0/go.mod h1:El3tOrEuMpv2UdMrbNlKEh9vd86bmQ6vqIcDwxEOc1E= +google.golang.org/genproto/googleapis/api v0.0.0-20261012220534-4341edf3f941 h1:DS/w3N8rsfrwxwgGSj6WhMsPo7aNQGmDx74J81zd0NQ= +google.golang.org/genproto/googleapis/api v0.0.0-20261012220534-4341edf3f941/go.mod h1:AuGAdi9KnXss7xbLxIKhCvk+Ro/SxpET/iS45DNYN+M= +google.golang.org/genproto/googleapis/rpc v0.0.0-20261012220534-4341edf3f941 h1:QG6hS4zFplRZvOQedzei4t2pT/zkQc3VR1u+S9/rcAw= +google.golang.org/genproto/googleapis/rpc v0.0.0-20261012220534-4341edf3f941/go.mod h1:OaIUM3+LpYcK2GXM4FTmhWoIq371Owdr+Cc7/BsYHHc= +google.golang.org/grpc v1.84.0 h1:soMyaPJ8pAak5PIQ0DGBUir0XRo2fRoMqhNWMLlLxO0= +google.golang.org/grpc v1.84.0/go.mod h1:ljCht0DrxQrXBDRTZp52Qxh3Ffk8CdYm2sj4O2QN2C0= +google.golang.org/protobuf v1.36.12 h1:pJOKDDOyeXErUroCihFAd5LQuwXBSpVnKGrj5o/fwxc= +google.golang.org/protobuf v1.36.12/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/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/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/evanphx/json-patch.v4 v4.13.0 h1:czT3CmqEaQ1aanPc5SdlgQrrEIb8w/wwCvWWnfEbYzo= +gopkg.in/evanphx/json-patch.v4 v4.13.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/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -inet.af/netaddr v0.0.0-20220617031823-097006376321 h1:B4dC8ySKTQXasnjDTMsoCMf1sQG4WsMej0WXaHxunmU= -k8s.io/api v0.25.0 h1:H+Q4ma2U/ww0iGB78ijZx6DRByPz6/733jIuFpX70e0= -k8s.io/api v0.25.0/go.mod h1:ttceV1GyV1i1rnmvzT3BST08N6nGt+dudGrquzVQWPk= -k8s.io/apiextensions-apiserver v0.25.0 h1:CJ9zlyXAbq0FIW8CD7HHyozCMBpDSiH7EdrSTCZcZFY= -k8s.io/apiextensions-apiserver v0.25.0/go.mod h1:3pAjZiN4zw7R8aZC5gR0y3/vCkGlAjCazcg1me8iB/E= -k8s.io/apimachinery v0.25.0 h1:MlP0r6+3XbkUG2itd6vp3oxbtdQLQI94fD5gCS+gnoU= -k8s.io/apimachinery v0.25.0/go.mod h1:qMx9eAk0sZQGsXGu86fab8tZdffHbwUfsvzqKn4mfB0= -k8s.io/apiserver v0.25.0 h1:8kl2ifbNffD440MyvHtPaIz1mw4mGKVgWqM0nL+oyu4= -k8s.io/client-go v0.25.0 h1:CVWIaCETLMBNiTUta3d5nzRbXvY5Hy9Dpl+VvREpu5E= -k8s.io/client-go v0.25.0/go.mod h1:lxykvypVfKilxhTklov0wz1FoaUZ8X4EwbhS6rpRfN8= -k8s.io/cluster-bootstrap v0.24.0 h1:MTs2x3Vfcl/PWvB5bfX7gzTFRyi4ZSbNSQgGJTCb6Sw= -k8s.io/component-base v0.25.0 h1:haVKlLkPCFZhkcqB6WCvpVxftrg6+FK5x1ZuaIDaQ5Y= -k8s.io/component-base v0.25.0/go.mod h1:F2Sumv9CnbBlqrpdf7rKZTmmd2meJq0HizeyY/yAFxk= -k8s.io/klog/v2 v2.80.1 h1:atnLQ121W371wYYFawwYx1aEY2eUfs4l3J72wtgAwV4= -k8s.io/klog/v2 v2.80.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= -k8s.io/kube-openapi v0.0.0-20220803162953-67bda5d908f1 h1:MQ8BAZPZlWk3S9K4a9NCkIFQtZShWqoha7snGixVgEA= -k8s.io/kube-openapi v0.0.0-20220803162953-67bda5d908f1/go.mod h1:C/N6wCaBHeBHkHUesQOQy2/MZqGgMAFPqGsGQLdbZBU= -k8s.io/utils v0.0.0-20221108210102-8e77b1f39fe2 h1:GfD9OzL11kvZN5iArC6oTS7RTj7oJOIfnislxYlqTj8= -k8s.io/utils v0.0.0-20221108210102-8e77b1f39fe2/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= -rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= -rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -sigs.k8s.io/cluster-api v1.2.5 h1:Am4W5ITO0v5FUNkfCuD6gwE29phDt1gyQY9EGWnTYIU= -sigs.k8s.io/cluster-api v1.2.5/go.mod h1:Ye5gn15u+q6VcE+Se7nBMSo6INm55F+zBcCiWzrjxFc= -sigs.k8s.io/controller-runtime v0.13.0 h1:iqa5RNciy7ADWnIc8QxCbOX5FEKVR3uxVxKHRMc2WIQ= -sigs.k8s.io/controller-runtime v0.13.0/go.mod h1:Zbz+el8Yg31jubvAEyglRZGdLAjplZl+PgtYNI6WNTI= -sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 h1:iXTIw73aPyC+oRdyqqvVJuloN1p0AC/kzH07hu3NE+k= -sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2/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/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= -sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= +k8s.io/api v0.36.3 h1:NxB+05W2UGqXWFXcLO0RB5cnqnUPP5v5sVlaOH0Iz4w= +k8s.io/api v0.36.3/go.mod h1:JzLQKqRHC5+I8RVj/lS3lCg0mg6nWI9Fo/Sk3ElxHzg= +k8s.io/apiextensions-apiserver v0.36.3 h1:dPmOAPhwTtqb1bTxbFPsy18KHPhktQeO3WUPXunZIB0= +k8s.io/apiextensions-apiserver v0.36.3/go.mod h1:KTXFqgXiuw2pRoL+Wpmttqc+up9Xt/GohadPWeLLOa4= +k8s.io/apimachinery v0.36.3 h1:PkzMRBRG8joFD8EhCuQAtNPvJlxb82FwplP26HIzvAM= +k8s.io/apimachinery v0.36.3/go.mod h1:cTSjBWgPe/6CQyBKzY/hDIRWCQQQeK0mfLbml0UYFHE= +k8s.io/client-go v0.36.3 h1:M4JdVzXxYcZk4fGpfDdYnxSwhLKWCFoQsHW6t+z8Hfg= +k8s.io/client-go v0.36.3/go.mod h1:gcPwr0c87vjjG6HB6pWEqOeuYVoXSsREjzux2j6GF30= +k8s.io/klog/v2 v2.140.0 h1:Tf+J3AH7xnUzZyVVXhTgGhEKnFqye14aadWv7bzXdzc= +k8s.io/klog/v2 v2.140.0/go.mod h1:o+/RWfJ6PwpnFn7OyAG3QnO47BFsymfEfrz6XyYSSp0= +k8s.io/kube-openapi v0.0.0-20260317180543-43fb72c5454a h1:xCeOEAOoGYl2jnJoHkC3hkbPJgdATINPMAxaynU2Ovg= +k8s.io/kube-openapi v0.0.0-20260317180543-43fb72c5454a/go.mod h1:uGBT7iTA6c6MvqUvSXIaYZo9ukscABYi2btjhvgKGZ0= +k8s.io/utils v0.0.0-20261023123148-ca04ba58ecab h1:pjQrNLaF//ytZtWwCAHtW+pqwSKjtWDqzA8+TCX37RI= +k8s.io/utils v0.0.0-20261023123148-ca04ba58ecab/go.mod h1:DdQ0BJxlQtuMlKDqdg7X5IMMQCXIk2b3d1/4M9OhUYo= +sigs.k8s.io/cluster-api v1.14.3 h1:xc2krMm7SfUV7/sVo3XcHwNz33fkYupy+iSD/W/TA/Q= +sigs.k8s.io/cluster-api v1.14.3/go.mod h1:NB3GmqTA/hlMaGDv01gt36/5k0DJ+ixGTJFHUe5Ib3Q= +sigs.k8s.io/cluster-api/api v1.14.3 h1:lTjHLULtlJHRXvroECdeiM2fXZOsvu93y+LYRjm/5II= +sigs.k8s.io/cluster-api/api v1.14.3/go.mod h1:LJ/5hdS9tqTBi9YqyLRnd1t53Sn/cXsa7rEVaY0bBms= +sigs.k8s.io/controller-runtime v0.24.1 h1:miPEwrmirImAvgME1L9qebGHrOnGJoVmVdtOU9fRfo4= +sigs.k8s.io/controller-runtime v0.24.1/go.mod h1:vFkfY5fGt5xAC/sKb8IBFKgWPNKG9OUG29dR8Y2wImw= +sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730 h1:IpInykpT6ceI+QxKBbEflcR5EXP7sU1kvOlxwZh5txg= +sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730/go.mod h1:mdzfpAEoE6DHQEN0uh9ZbOCuHbLK5wOm7dK4ctXE9Tg= +sigs.k8s.io/randfill v1.0.0 h1:JfjMILfT8A6RbawdsK2JXGBR5AQVfd+9TbzrlneTyrU= +sigs.k8s.io/randfill v1.0.0/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY= +sigs.k8s.io/structured-merge-diff/v6 v6.4.2 h1:qdOxHwrl2Kaag1aQEarlYcOA9vSyGCp3CIki3aW8c4Q= +sigs.k8s.io/structured-merge-diff/v6 v6.4.2/go.mod h1:M3W8sfWvn2HhQDIbGWj3S099YozAsymCo/wrT5ohRUE= +sigs.k8s.io/yaml v1.6.0 h1:G8fkbMSAFqgEFgh4b1wmtzDnioxFCUgTZhlbj5P9QYs= +sigs.k8s.io/yaml v1.6.0/go.mod h1:796bPqUfzR/0jLAl6XjHl3Ck7MiyVv8dbTdyT3/pMf4= diff --git a/internal/scope/mvm.go b/internal/scope/mvm.go index 212fbec..b3667d7 100644 --- a/internal/scope/mvm.go +++ b/internal/scope/mvm.go @@ -6,14 +6,14 @@ package scope import ( "context" "fmt" + "strings" - flclient "github.com/weaveworks-liquidmetal/controller-pkg/client" - microvm "github.com/weaveworks-liquidmetal/controller-pkg/types/microvm" + flclient "github.com/liquidmetal-dev/controller-pkg/client" + microvm "github.com/liquidmetal-dev/controller-pkg/types/microvm" corev1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/types" - clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" - "sigs.k8s.io/cluster-api/controllers/noderefutil" - "sigs.k8s.io/cluster-api/util/conditions" + clusterv1 "sigs.k8s.io/cluster-api/api/core/v1beta2" + conditions "sigs.k8s.io/cluster-api/util/conditions/deprecated/v1beta1" "sigs.k8s.io/cluster-api/util/patch" "sigs.k8s.io/controller-runtime/pkg/client" @@ -87,12 +87,24 @@ func (m *MicrovmScope) Namespace() string { // GetInstanceID gets the instance ID (i.e. UID) of the mvm. func (m *MicrovmScope) GetInstanceID() string { - parsed, err := noderefutil.NewProviderID(m.GetProviderID()) - if err != nil { + return instanceIDFromProviderID(m.GetProviderID()) +} + +// instanceIDFromProviderID extracts the microvm UID from a provider ID of the +// form "microvm:///". It returns an empty string when the +// provider ID is empty, has the wrong prefix or carries no UID. +func instanceIDFromProviderID(providerID string) string { + rest, ok := strings.CutPrefix(providerID, ProviderPrefix) + if !ok || rest == "" { + return "" + } + + idx := strings.LastIndex(rest, "/") + if idx < 0 || idx == len(rest)-1 { return "" } - return parsed.ID() + return rest[idx+1:] } // GetMicrovmSpec returns the spec for the MicroVM diff --git a/internal/scope/mvm_test.go b/internal/scope/mvm_test.go index ae0698b..92994c4 100644 --- a/internal/scope/mvm_test.go +++ b/internal/scope/mvm_test.go @@ -6,13 +6,12 @@ import ( "github.com/go-logr/logr/testr" . "github.com/onsi/gomega" - flclient "github.com/weaveworks-liquidmetal/controller-pkg/client" - "github.com/weaveworks-liquidmetal/controller-pkg/types/microvm" + flclient "github.com/liquidmetal-dev/controller-pkg/client" + "github.com/liquidmetal-dev/controller-pkg/types/microvm" corev1 "k8s.io/api/core/v1" v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" - clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/client/fake" @@ -29,7 +28,7 @@ func TestMicrovmProviderID(t *testing.T) { mvmName := "m-1" mvm := newMicrovm(mvmName, "") - client := fake.NewClientBuilder().WithScheme(scheme).WithObjects(mvm).Build() + client := fake.NewClientBuilder().WithScheme(scheme).WithObjects(mvm).WithStatusSubresource(&infrav1.Microvm{}).Build() mvmScope, err := scope.NewMicrovmScope(scope.MicrovmScopeParams{ Client: client, MicroVM: mvm, @@ -51,7 +50,7 @@ func TestMicrovmGetInstanceID(t *testing.T) { providerID := "microvm://fd1/" + uid mvm := newMicrovm(mvmName, providerID) - client := fake.NewClientBuilder().WithScheme(scheme).WithObjects(mvm).Build() + client := fake.NewClientBuilder().WithScheme(scheme).WithObjects(mvm).WithStatusSubresource(&infrav1.Microvm{}).Build() mvmScope, err := scope.NewMicrovmScope(scope.MicrovmScopeParams{ Client: client, MicroVM: mvm, @@ -62,6 +61,26 @@ func TestMicrovmGetInstanceID(t *testing.T) { Expect(instanceID).To(Equal(uid)) } +func TestMicrovmGetInstanceIDMalformed(t *testing.T) { + RegisterTestingT(t) + + scheme, err := setupScheme() + Expect(err).NotTo(HaveOccurred()) + + for _, providerID := range []string{"", "microvm://", "microvm://fd1/", "aws://fd1/abcdef"} { + mvm := newMicrovm("m-1", providerID) + + client := fake.NewClientBuilder().WithScheme(scheme).WithObjects(mvm).WithStatusSubresource(&infrav1.Microvm{}).Build() + mvmScope, err := scope.NewMicrovmScope(scope.MicrovmScopeParams{ + Client: client, + MicroVM: mvm, + }) + Expect(err).NotTo(HaveOccurred()) + + Expect(mvmScope.GetInstanceID()).To(BeEmpty(), "providerID %q", providerID) + } +} + // This is all temporary func TestMicrovmGetBasicAuthToken(t *testing.T) { RegisterTestingT(t) @@ -133,7 +152,7 @@ func TestMicrovmGetBasicAuthToken(t *testing.T) { for _, tc := range tt { t.Run(tc.name, func(t *testing.T) { RegisterTestingT(t) - client := fake.NewClientBuilder().WithScheme(scheme).WithObjects(tc.initObjects...).Build() + client := fake.NewClientBuilder().WithScheme(scheme).WithObjects(tc.initObjects...).WithStatusSubresource(&infrav1.Microvm{}).Build() mvmScope, err := scope.NewMicrovmScope(scope.MicrovmScopeParams{ Client: client, MicroVM: tc.mvm, @@ -230,7 +249,7 @@ func TestMicrovmGetTLSConfig(t *testing.T) { for _, tc := range tt { t.Run(tc.name, func(t *testing.T) { RegisterTestingT(t) - client := fake.NewClientBuilder().WithScheme(scheme).WithObjects(tc.initObjects...).Build() + client := fake.NewClientBuilder().WithScheme(scheme).WithObjects(tc.initObjects...).WithStatusSubresource(&infrav1.Microvm{}).Build() mvm, err := scope.NewMicrovmScope(scope.MicrovmScopeParams{ Client: client, MicroVM: tc.mvm, @@ -248,39 +267,12 @@ func setupScheme() (*runtime.Scheme, error) { if err := infrav1.AddToScheme(scheme); err != nil { return nil, err } - if err := clusterv1.AddToScheme(scheme); err != nil { - return nil, err - } if err := corev1.AddToScheme(scheme); err != nil { return nil, err } return scheme, nil } -func newCluster(name string, failureDomains []string) *clusterv1.Cluster { - cluster := &clusterv1.Cluster{ - ObjectMeta: metav1.ObjectMeta{ - Name: name, - Namespace: "default", - }, - } - - if len(failureDomains) > 0 { - cluster.Status = clusterv1.ClusterStatus{ - FailureDomains: make(clusterv1.FailureDomains), - } - - for i := range failureDomains { - fd := failureDomains[i] - cluster.Status.FailureDomains[fd] = clusterv1.FailureDomainSpec{ - ControlPlane: true, - } - } - } - - return cluster -} - func newMicrovm(name string, providerID string) *infrav1.Microvm { mvm := &infrav1.Microvm{ ObjectMeta: metav1.ObjectMeta{ diff --git a/internal/scope/mvmd.go b/internal/scope/mvmd.go index 8e13e73..64d6dc7 100644 --- a/internal/scope/mvmd.go +++ b/internal/scope/mvmd.go @@ -8,13 +8,13 @@ import ( "errors" "fmt" - clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" - "sigs.k8s.io/cluster-api/util/conditions" + clusterv1 "sigs.k8s.io/cluster-api/api/core/v1beta2" + conditions "sigs.k8s.io/cluster-api/util/conditions/deprecated/v1beta1" "sigs.k8s.io/cluster-api/util/patch" "sigs.k8s.io/controller-runtime/pkg/client" "github.com/go-logr/logr" - microvm "github.com/weaveworks-liquidmetal/controller-pkg/types/microvm" + microvm "github.com/liquidmetal-dev/controller-pkg/types/microvm" infrav1 "github.com/weaveworks-liquidmetal/microvm-operator/api/v1alpha1" "github.com/weaveworks-liquidmetal/microvm-operator/internal/defaults" ) diff --git a/internal/scope/mvmd_test.go b/internal/scope/mvmd_test.go index 9104349..0702857 100644 --- a/internal/scope/mvmd_test.go +++ b/internal/scope/mvmd_test.go @@ -9,7 +9,7 @@ import ( "sigs.k8s.io/controller-runtime/pkg/client/fake" - microvm "github.com/weaveworks-liquidmetal/controller-pkg/types/microvm" + microvm "github.com/liquidmetal-dev/controller-pkg/types/microvm" infrav1 "github.com/weaveworks-liquidmetal/microvm-operator/api/v1alpha1" "github.com/weaveworks-liquidmetal/microvm-operator/internal/scope" ) @@ -60,7 +60,7 @@ func TestDetermineHost(t *testing.T) { t.Run(tc.name, func(t *testing.T) { mvmDep := newDeployment(mvmDepName, tc.hostCount) - client := fake.NewClientBuilder().WithScheme(scheme).WithObjects(mvmDep).Build() + client := fake.NewClientBuilder().WithScheme(scheme).WithObjects(mvmDep).WithStatusSubresource(&infrav1.MicrovmDeployment{}).Build() mvmScope, err := scope.NewMicrovmDeploymentScope(scope.MicrovmDeploymentScopeParams{ Client: client, MicrovmDeployment: mvmDep, @@ -88,7 +88,7 @@ func TestExpiredHosts(t *testing.T) { {Endpoint: "1"}, {Endpoint: "2"}, } - client := fake.NewClientBuilder().WithScheme(scheme).WithObjects(mvmDep).Build() + client := fake.NewClientBuilder().WithScheme(scheme).WithObjects(mvmDep).WithStatusSubresource(&infrav1.MicrovmDeployment{}).Build() mvmScope, err := scope.NewMicrovmDeploymentScope(scope.MicrovmDeploymentScopeParams{ Client: client, MicrovmDeployment: mvmDep, diff --git a/internal/scope/mvmrs.go b/internal/scope/mvmrs.go index 6942f20..69d752c 100644 --- a/internal/scope/mvmrs.go +++ b/internal/scope/mvmrs.go @@ -7,13 +7,13 @@ import ( "context" "fmt" - clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" - "sigs.k8s.io/cluster-api/util/conditions" + clusterv1 "sigs.k8s.io/cluster-api/api/core/v1beta2" + conditions "sigs.k8s.io/cluster-api/util/conditions/deprecated/v1beta1" "sigs.k8s.io/cluster-api/util/patch" "sigs.k8s.io/controller-runtime/pkg/client" "github.com/go-logr/logr" - microvm "github.com/weaveworks-liquidmetal/controller-pkg/types/microvm" + microvm "github.com/liquidmetal-dev/controller-pkg/types/microvm" infrav1 "github.com/weaveworks-liquidmetal/microvm-operator/api/v1alpha1" "github.com/weaveworks-liquidmetal/microvm-operator/internal/defaults" ) diff --git a/main.go b/main.go index e05c672..3b92141 100644 --- a/main.go +++ b/main.go @@ -30,8 +30,9 @@ import ( ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/healthz" "sigs.k8s.io/controller-runtime/pkg/log/zap" + metricsserver "sigs.k8s.io/controller-runtime/pkg/metrics/server" - "github.com/weaveworks-liquidmetal/controller-pkg/client" + "github.com/liquidmetal-dev/controller-pkg/client" infrastructurev1alpha1 "github.com/weaveworks-liquidmetal/microvm-operator/api/v1alpha1" "github.com/weaveworks-liquidmetal/microvm-operator/controllers" @@ -69,8 +70,7 @@ func main() { mgr, err := ctrl.NewManager(ctrl.GetConfigOrDie(), ctrl.Options{ Scheme: scheme, - MetricsBindAddress: metricsAddr, - Port: 9443, + Metrics: metricsserver.Options{BindAddress: metricsAddr}, HealthProbeBindAddress: probeAddr, LeaderElection: enableLeaderElection, LeaderElectionID: "controller-leader-elect-microvm", diff --git a/mise.toml b/mise.toml new file mode 100644 index 0000000..6736014 --- /dev/null +++ b/mise.toml @@ -0,0 +1,2 @@ +[tools] +go = "1.26.7"