From 2f8582de24a57186bb34231310397054c22b3194 Mon Sep 17 00:00:00 2001 From: Richard Case Date: Mon, 26 Oct 2026 13:08:28 +0000 Subject: [PATCH 1/2] Update controller-pkg, Go, and dependencies The operator uses the newest controller-pkg from the liquidmetal-dev organization. The new fields of the microvm spec are available in the Microvm, MicrovmReplicaSet, MicrovmDeployment, and MicrovmTemplate CRDs. The new fields are provider, allowGuestAgent, cpuConfig, and the mountPoint and virtiofsPath fields of additional volumes. These fields are available only with flintlock v0.16.0 or a newer version on the host. The project now builds with Go 1.26. The dependencies cluster-api, controller-runtime, and the k8s.io modules are at their newest versions. The tools controller-gen, kustomize, and counterfeiter are at their current versions. Changes to the code: - The conditions use the v1beta1 helpers in cluster-api and the condition types in api/core/v1beta2. The status schema of the CRDs does not change. - A local function reads the instance ID from the provider ID. The function noderefutil.NewProviderID is not in cluster-api v1.14. - The manager uses the metrics server options of controller-runtime. - The tests register the status subresource with the fake client. - The counterfeiter fake has the new ServerInfo method. - The Dockerfile copies the internal directory. Before this change, the image build failed. - The kustomization files use the kustomize v5 syntax. - The README and the samples show the new spec fields. --- .github/workflows/test.yml | 6 +- Dockerfile | 3 +- Makefile | 11 +- README.md | 17 + api/v1alpha1/condition_consts.go | 2 +- api/v1alpha1/microvm_types.go | 14 +- api/v1alpha1/microvmdeployment_types.go | 12 +- api/v1alpha1/microvmreplicaset_types.go | 12 +- api/v1alpha1/zz_generated.deepcopy.go | 13 +- ...re.liquid-metal.io_microvmdeployments.yaml | 254 +++-- ...re.liquid-metal.io_microvmreplicasets.yaml | 254 +++-- ...frastructure.liquid-metal.io_microvms.yaml | 285 +++-- ...ture.liquid-metal.io_microvmtemplates.yaml | 178 ++- config/crd/kustomization.yaml | 18 +- config/default/kustomization.yaml | 40 +- config/rbac/role.yaml | 55 +- .../infrastructure_v1alpha1_microvm.yaml | 20 + ...astructure_v1alpha1_microvmdeployment.yaml | 20 + ...astructure_v1alpha1_microvmreplicaset.yaml | 20 + controllers/fakes/fake_client.go | 341 ++++-- controllers/fakes/generate.go | 2 +- controllers/helpers_test.go | 36 +- controllers/microvm_controller.go | 10 +- controllers/microvm_controller_test.go | 12 +- controllers/microvmdeployment_controller.go | 6 +- .../microvmdeployment_controller_test.go | 2 +- .../microvmreplicaset_controller_test.go | 4 +- go.mod | 154 ++- go.sum | 1010 +++-------------- internal/scope/mvm.go | 28 +- internal/scope/mvm_test.go | 60 +- internal/scope/mvmd.go | 6 +- internal/scope/mvmd_test.go | 6 +- internal/scope/mvmrs.go | 6 +- main.go | 6 +- mise.toml | 2 + 36 files changed, 1377 insertions(+), 1548 deletions(-) create mode 100644 mise.toml 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" From adf18bcbd6f9cf89f711f1e6f5b40ef60ba71133 Mon Sep 17 00:00:00 2001 From: Richard Case Date: Mon, 26 Oct 2026 15:06:52 +0000 Subject: [PATCH 2/2] Give the pr_size workflow permission to write labels The default token for workflows in this repository is read-only. Because of this, the size labeler received a 403 error when it added the size label to the PR. This change gives the workflow read access to the contents and write access to the pull requests. --- .github/workflows/pr_size.yml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) 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 😊'