From ba6e889dfbdfc53bc2e1a0aa15271bcf3213b058 Mon Sep 17 00:00:00 2001 From: charles zheng Date: Mon, 25 Jan 2021 23:52:59 -0800 Subject: [PATCH] implement the NestedEtcd controller --- Makefile | 10 +- .../v1alpha4/nestedcomponentspec_types.go | 10 +- .../controlplane/v1alpha4/nestedetcd_types.go | 18 +- .../v1alpha4/zz_generated.deepcopy.go | 131 +++++- .../nested-etcd-service-template.yaml | 12 + .../nested-etcd-statefulset-template.yaml | 87 ++++ ...rolplane.cluster.x-k8s.io_nestedetcds.yaml | 14 +- config/rbac/role.yaml | 20 + .../controlplane/nestedetcd_controller.go | 378 +++++++++++++++++- .../nestedetcd_controller_test.go | 315 +++++++++++++++ go.mod | 6 +- go.sum | 51 +-- 12 files changed, 982 insertions(+), 70 deletions(-) create mode 100644 config/component-templates/nested-etcd/nested-etcd-service-template.yaml create mode 100644 config/component-templates/nested-etcd/nested-etcd-statefulset-template.yaml create mode 100644 controllers/controlplane/nestedetcd_controller_test.go diff --git a/Makefile b/Makefile index 8a555b67..dfd5774b 100644 --- a/Makefile +++ b/Makefile @@ -143,7 +143,7 @@ apidiff: $(GO_APIDIFF) ## Check for API differences generate: ## Generate code $(MAKE) generate-manifests $(MAKE) generate-go - $(MAKE) generate-bindata + # $(MAKE) generate-bindata .PHONY: generate-go generate-go: ## Runs Go related generate targets @@ -163,8 +163,8 @@ generate-manifests: ## Generate manifests e.g. CRD, RBAC etc. output:webhook:dir=./config/webhook \ webhook ## Copy files in CI folders. - cp -f ./config/rbac/*.yaml ./config/ci/rbac/ - cp -f ./config/manager/manager*.yaml ./config/ci/manager/ + # cp -f ./config/rbac/*.yaml ./config/ci/rbac/ + # cp -f ./config/manager/manager*.yaml ./config/ci/manager/ .PHONY: modules modules: ## Runs go mod to ensure modules are up to date. @@ -184,8 +184,8 @@ docker-pull-prerequisites: .PHONY: docker-build docker-build: docker-pull-prerequisites ## Build the docker images for controller managers DOCKER_BUILDKIT=1 docker build --build-arg goproxy=$(GOPROXY) --build-arg ARCH=$(ARCH) --build-arg ldflags="$(LDFLAGS)" . -t $(CONTROLLER_IMG)-$(ARCH):$(TAG) - $(MAKE) set-manifest-image MANIFEST_IMG=$(CONTROLLER_IMG)-$(ARCH) MANIFEST_TAG=$(TAG) TARGET_RESOURCE="./config/manager/manager_image_patch.yaml" - $(MAKE) set-manifest-pull-policy TARGET_RESOURCE="./config/manager/manager_pull_policy.yaml" + # $(MAKE) set-manifest-image MANIFEST_IMG=$(CONTROLLER_IMG)-$(ARCH) MANIFEST_TAG=$(TAG) TARGET_RESOURCE="./config/manager/manager_image_patch.yaml" + # $(MAKE) set-manifest-pull-policy TARGET_RESOURCE="./config/manager/manager_pull_policy.yaml" .PHONY: docker-push docker-push: ## Push the docker images diff --git a/apis/controlplane/v1alpha4/nestedcomponentspec_types.go b/apis/controlplane/v1alpha4/nestedcomponentspec_types.go index a68e9264..4a51f889 100644 --- a/apis/controlplane/v1alpha4/nestedcomponentspec_types.go +++ b/apis/controlplane/v1alpha4/nestedcomponentspec_types.go @@ -22,7 +22,8 @@ import ( ) type NestedComponentSpec struct { - // NestedComponentSpec defines the common information for creating the component + // NestedComponentSpec defines the common information for creating the + // component // +optional addonv1alpha1.CommonSpec `json:",inline"` @@ -30,11 +31,12 @@ type NestedComponentSpec struct { // +optional addonv1alpha1.PatchSpec `json:",inline"` - // Resources defines the amount of computing resources that will be used by this component + // Resources defines the amount of computing resources that will be used + // by this component // +optional - Resources corev1.ResourceRequirements `json:"resources",omitempty` + Resources corev1.ResourceRequirements `json:"resources,omitempty"` // Replicas defines the number of replicas in the component's workload // +optional - Replicas int32 `json:"replicas",omitempty` + Replicas int32 `json:"replicas,omitempty"` } diff --git a/apis/controlplane/v1alpha4/nestedetcd_types.go b/apis/controlplane/v1alpha4/nestedetcd_types.go index d1bea4e7..71900f98 100644 --- a/apis/controlplane/v1alpha4/nestedetcd_types.go +++ b/apis/controlplane/v1alpha4/nestedetcd_types.go @@ -21,19 +21,23 @@ import ( addonv1alpha1 "sigs.k8s.io/kubebuilder-declarative-pattern/pkg/patterns/addon/pkg/apis/v1alpha1" ) +type NestedEtcdPhase string + +const ( + NestedEtcdReady NestedEtcdPhase = "ready" + NestedEtcdUnready NestedEtcdPhase = "unready" +) + // NestedEtcdSpec defines the desired state of NestedEtcd type NestedEtcdSpec struct { - // NestedComponentSpec contains the common and user-specified information that are - // required for creating the component + // NestedComponentSpec contains the common and user-specified information + // that are required for creating the component // +optional NestedComponentSpec `json:",inline"` } // NestedEtcdStatus defines the observed state of NestedEtcd type NestedEtcdStatus struct { - // Ready is set if all resources have been created - Ready bool `json:"ready,omitempty"` - // EtcdDomain defines how to address the etcd instance Addresses []NestedEtcdAddress `json:"addresses,omitempty"` @@ -56,6 +60,10 @@ type NestedEtcdAddress struct { } //+kubebuilder:object:root=true +//+kubebuilder:resource:scope=Namespaced,path=nestedetcds,shortName=netcd +//+kubebuilder:categories=capi,capn +//+kubebuilder:printcolumn:name="Phase",type="string",JSONPath=".status.phase" +//+kubebuilder:printcolumn:name="Age",type="date",JSONPath=".metadata.creationTimestamp" //+kubebuilder:subresource:status // NestedEtcd is the Schema for the nestedetcds API diff --git a/apis/controlplane/v1alpha4/zz_generated.deepcopy.go b/apis/controlplane/v1alpha4/zz_generated.deepcopy.go index f0a8ba8e..1eb454b9 100644 --- a/apis/controlplane/v1alpha4/zz_generated.deepcopy.go +++ b/apis/controlplane/v1alpha4/zz_generated.deepcopy.go @@ -1,7 +1,7 @@ // +build !ignore_autogenerated /* -Copyright 2020 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -24,6 +24,24 @@ import ( runtime "k8s.io/apimachinery/pkg/runtime" ) +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *NestedComponentSpec) DeepCopyInto(out *NestedComponentSpec) { + *out = *in + out.CommonSpec = in.CommonSpec + in.PatchSpec.DeepCopyInto(&out.PatchSpec) + in.Resources.DeepCopyInto(&out.Resources) +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NestedComponentSpec. +func (in *NestedComponentSpec) DeepCopy() *NestedComponentSpec { + if in == nil { + return nil + } + out := new(NestedComponentSpec) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *NestedControlPlane) DeepCopyInto(out *NestedControlPlane) { *out = *in @@ -112,3 +130,114 @@ func (in *NestedControlPlaneStatus) DeepCopy() *NestedControlPlaneStatus { in.DeepCopyInto(out) return out } + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *NestedEtcd) DeepCopyInto(out *NestedEtcd) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + in.Spec.DeepCopyInto(&out.Spec) + in.Status.DeepCopyInto(&out.Status) +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NestedEtcd. +func (in *NestedEtcd) DeepCopy() *NestedEtcd { + if in == nil { + return nil + } + out := new(NestedEtcd) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *NestedEtcd) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *NestedEtcdAddress) DeepCopyInto(out *NestedEtcdAddress) { + *out = *in +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NestedEtcdAddress. +func (in *NestedEtcdAddress) DeepCopy() *NestedEtcdAddress { + if in == nil { + return nil + } + out := new(NestedEtcdAddress) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *NestedEtcdList) DeepCopyInto(out *NestedEtcdList) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ListMeta.DeepCopyInto(&out.ListMeta) + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]NestedEtcd, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NestedEtcdList. +func (in *NestedEtcdList) DeepCopy() *NestedEtcdList { + if in == nil { + return nil + } + out := new(NestedEtcdList) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *NestedEtcdList) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *NestedEtcdSpec) DeepCopyInto(out *NestedEtcdSpec) { + *out = *in + in.NestedComponentSpec.DeepCopyInto(&out.NestedComponentSpec) +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NestedEtcdSpec. +func (in *NestedEtcdSpec) DeepCopy() *NestedEtcdSpec { + if in == nil { + return nil + } + out := new(NestedEtcdSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *NestedEtcdStatus) DeepCopyInto(out *NestedEtcdStatus) { + *out = *in + if in.Addresses != nil { + in, out := &in.Addresses, &out.Addresses + *out = make([]NestedEtcdAddress, len(*in)) + copy(*out, *in) + } + in.CommonStatus.DeepCopyInto(&out.CommonStatus) +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NestedEtcdStatus. +func (in *NestedEtcdStatus) DeepCopy() *NestedEtcdStatus { + if in == nil { + return nil + } + out := new(NestedEtcdStatus) + in.DeepCopyInto(out) + return out +} diff --git a/config/component-templates/nested-etcd/nested-etcd-service-template.yaml b/config/component-templates/nested-etcd/nested-etcd-service-template.yaml new file mode 100644 index 00000000..e5bd63bc --- /dev/null +++ b/config/component-templates/nested-etcd/nested-etcd-service-template.yaml @@ -0,0 +1,12 @@ +apiVersion: v1 +kind: Service +metadata: + name: {{.nestedetcdName}} + namespace: {{.nestedetcdNamespace}} + labels: + component-name: {{.nestedetcdName}} +spec: + publishNotReadyAddresses: true + clusterIP: None + selector: + component-name: {{.nestedetcdName}} diff --git a/config/component-templates/nested-etcd/nested-etcd-statefulset-template.yaml b/config/component-templates/nested-etcd/nested-etcd-statefulset-template.yaml new file mode 100644 index 00000000..00037889 --- /dev/null +++ b/config/component-templates/nested-etcd/nested-etcd-statefulset-template.yaml @@ -0,0 +1,87 @@ +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: {{.nestedetcdName}} + namespace: {{.nestedetcdNamespace}} +spec: + replicas: {{.nestedetcdStsReplicas}} + revisionHistoryLimit: 10 + serviceName: {{.nestedetcdName}} + selector: + matchLabels: + component-name: {{.nestedetcdName}} + # etcd will not be updated, unless it is deleted + updateStrategy: + type: OnDelete + template: + metadata: + labels: + component-name: {{.nestedetcdName}} + spec: + subdomain: etcd + containers: + - name: {{.nestedetcdName}} + image: virtualcluster/etcd-v3.4.0 + imagePullPolicy: Always + command: + - etcd + # pass the pod name(hostname) to container for composing the advertise-urls args + env: + - name: HOSTNAME + valueFrom: + fieldRef: + fieldPath: metadata.name + args: + - --name=$(HOSTNAME) + - --trusted-ca-file=/etc/kubernetes/pki/root/tls.crt + - --client-cert-auth + - --cert-file=/etc/kubernetes/pki/etcd/tls.crt + - --key-file=/etc/kubernetes/pki/etcd/tls.key + - --peer-client-cert-auth + - --peer-trusted-ca-file=/etc/kubernetes/pki/root/tls.crt + - --peer-cert-file=/etc/kubernetes/pki/etcd/tls.crt + - --peer-key-file=/etc/kubernetes/pki/etcd/tls.key + - --listen-peer-urls=https://0.0.0.0:2380 + - --listen-client-urls=https://0.0.0.0:2379 + - --initial-advertise-peer-urls=https://$(HOSTNAME).{{.nestedetcdName}}:2380 + # we use a headless service to encapsulate each pod + - --advertise-client-urls=https://$(HOSTNAME).{{.nestedetcdName}}:2379 + - --initial-cluster-state=new + - --initial-cluster-token=vc-etcd + - --data-dir=/var/lib/etcd/data + # --initial-cluster option will be set during runtime based on the number of replicas + livenessProbe: + exec: + command: + - sh + - -c + - ETCDCTL_API=3 etcdctl --endpoints=https://127.0.0.1:2379 --cacert=/etc/kubernetes/pki/root/tls.crt --cert=/etc/kubernetes/pki/etcd/tls.crt --key=/etc/kubernetes/pki/etcd/tls.key endpoint health + failureThreshold: 8 + initialDelaySeconds: 60 + timeoutSeconds: 15 + readinessProbe: + exec: + command: + - sh + - -c + - ETCDCTL_API=3 etcdctl --endpoints=https://127.0.0.1:2379 --cacert=/etc/kubernetes/pki/root/tls.crt --cert=/etc/kubernetes/pki/etcd/tls.crt --key=/etc/kubernetes/pki/etcd/tls.key endpoint health + failureThreshold: 8 + initialDelaySeconds: 15 + periodSeconds: 2 + timeoutSeconds: 15 + volumeMounts: + - mountPath: /etc/kubernetes/pki/etcd + name: {{.nestedControlPlaneName}}-etcd-client-cert + readOnly: true + - mountPath: /etc/kubernetes/pki/root + name: {{.nestedControlPlaneName}}-etcd + readOnly: true + volumes: + - name: {{.nestedControlPlaneName}}-etcd-client-cert + secret: + defaultMode: 420 + secretName: {{.nestedControlPlaneName}}-etcd-client-cert + - name: {{.nestedControlPlaneName}}-etcd + secret: + defaultMode: 420 + secretName: {{.nestedControlPlaneName}}-etcd diff --git a/config/crd/bases/controlplane.cluster.x-k8s.io_nestedetcds.yaml b/config/crd/bases/controlplane.cluster.x-k8s.io_nestedetcds.yaml index 06d9b4d5..2e7893f0 100644 --- a/config/crd/bases/controlplane.cluster.x-k8s.io_nestedetcds.yaml +++ b/config/crd/bases/controlplane.cluster.x-k8s.io_nestedetcds.yaml @@ -13,10 +13,19 @@ spec: kind: NestedEtcd listKind: NestedEtcdList plural: nestedetcds + shortNames: + - netcd singular: nestedetcd scope: Namespaced versions: - - name: v1alpha4 + - additionalPrinterColumns: + - jsonPath: .status.phase + name: Phase + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1alpha4 schema: openAPIV3Schema: description: NestedEtcd is the Schema for the nestedetcds API @@ -97,9 +106,6 @@ spec: type: boolean phase: type: string - ready: - description: Ready is set if all resources have been created - type: boolean required: - healthy type: object diff --git a/config/rbac/role.yaml b/config/rbac/role.yaml index 17ca8f3f..618451dc 100644 --- a/config/rbac/role.yaml +++ b/config/rbac/role.yaml @@ -6,6 +6,26 @@ metadata: creationTimestamp: null name: manager-role rules: +- apiGroups: + - apps + resources: + - statefulset + verbs: + - create + - delete + - get + - list + - patch + - update + - watch +- apiGroups: + - apps + resources: + - statefulset/status + verbs: + - get + - patch + - update - apiGroups: - controlplane.cluster.x-k8s.io resources: diff --git a/controllers/controlplane/nestedetcd_controller.go b/controllers/controlplane/nestedetcd_controller.go index 8b66c5a1..1b6f7c6f 100644 --- a/controllers/controlplane/nestedetcd_controller.go +++ b/controllers/controlplane/nestedetcd_controller.go @@ -1,5 +1,5 @@ /* -Copyright 2020 The Kubernetes Authors. +Copyright 2021 The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -17,12 +17,27 @@ limitations under the License. package controlplane import ( + "bytes" "context" + "fmt" + "io/ioutil" + "net/http" + "strconv" + "text/template" "github.com/go-logr/logr" + + appsv1 "k8s.io/api/apps/v1" + corev1 "k8s.io/api/core/v1" + apierrors "k8s.io/apimachinery/pkg/api/errors" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/serializer" + "k8s.io/apimachinery/pkg/types" + "k8s.io/client-go/kubernetes/scheme" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/client" + ctrlcli "sigs.k8s.io/controller-runtime/pkg/client" controlplanev1alpha4 "sigs.k8s.io/cluster-api-provider-nested/apis/controlplane/v1alpha4" ) @@ -34,20 +49,377 @@ type NestedEtcdReconciler struct { Scheme *runtime.Scheme } +var ( + statefulsetOwnerKey = ".metadata.controller" + apiGVStr = controlplanev1alpha4.GroupVersion.String() + defaultStatefulSetURL = "https://raw.githubusercontent.com/kubernetes-sigs/" + + "cluster-api-provider-nested/master/config/component-templates/" + + "nestedetcd/nested-etcd-statefulset-template.yaml" + defaultServiceURL = "https://raw.githubusercontent.com/kubernetes-sigs/" + + "cluster-api-provider-nested/master/config/component-templates/" + + "nestedetcd/nested-etcd-service-template.yaml" +) + //+kubebuilder:rbac:groups=controlplane.cluster.x-k8s.io,resources=nestedetcds,verbs=get;list;watch;create;update;patch;delete //+kubebuilder:rbac:groups=controlplane.cluster.x-k8s.io,resources=nestedetcds/status,verbs=get;update;patch +//+kubebuilder:rbac:groups=apps,resources=statefulset,verbs=get;list;watch;create;update;patch;delete +//+kubebuilder:rbac:groups=apps,resources=statefulset/status,verbs=get;update;patch func (r *NestedEtcdReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) { - _ = r.Log.WithValues("nestedetcd", req.NamespacedName) + log := r.Log.WithValues("nestedetcd", req.NamespacedName) + log.Info("Reconciling NestedEtcd...") + var netcd controlplanev1alpha4.NestedEtcd + if err := r.Get(ctx, req.NamespacedName, &netcd); err != nil { + return ctrl.Result{}, ctrlcli.IgnoreNotFound(err) + } + log.Info("creating NestedEtcd", + "namespace", netcd.GetNamespace(), + "name", netcd.GetName()) + + // check if the ownerreference has been set by the NestedControlPlane controller. + owner := getOwner(netcd) + if owner == (metav1.OwnerReference{}) { + // requeue the request if the owner NestedControlPlane has + // not been set yet. + log.Info("the owner has not been set yet, will retry later", + "namespace", netcd.GetNamespace(), + "name", netcd.GetName()) + return ctrl.Result{Requeue: true}, nil + } + + var netcdSts appsv1.StatefulSet + if err := r.Get(ctx, types.NamespacedName{ + Namespace: netcd.GetNamespace(), + Name: netcd.GetName(), + }, &netcdSts); err != nil { + if apierrors.IsNotFound(err) { + // as the statefulset is not found, mark the NestedEtcd as unready + if IsNetcdReady(netcd.Status) { + netcd.Status.Phase = + string(controlplanev1alpha4.NestedEtcdUnready) + log.V(5).Info("The corresponding statefulset is not found, " + + "will mark the NestedEtcd as unready") + if err := r.Status().Update(ctx, &netcd); err != nil { + log.Error(err, "fail to update the status of the NestedEtcd Object") + return ctrl.Result{}, err + } + } + // the statefulset is not found, create one + if err := createNestedEtcdStatefulSet(ctx, + r.Client, netcd, owner.Name, log); err != nil { + log.Error(err, "fail to create NestedEtcd StatefulSet") + return ctrl.Result{}, err + } + log.Info("successfully create the NestedEtcd StatefulSet") + return ctrl.Result{}, nil + } + log.Error(err, "fail to get NestedEtcd StatefulSet") + return ctrl.Result{}, err + } - // your logic here + if netcdSts.Status.ReadyReplicas == netcdSts.Status.Replicas { + log.Info("The NestedEtcd StatefulSet is ready") + if !IsNetcdReady(netcd.Status) { + // As the NestedEtcd StatefulSet is ready, update NestedEtcd status + ip, err := getNestedEtcdSvcClusterIP(ctx, r.Client, netcd) + if err != nil { + log.Error(err, "fail to get NestedEtcd Service ClusterIP") + return ctrl.Result{}, err + } + netcd.Status.Phase = string(controlplanev1alpha4.NestedEtcdReady) + netcd.Status.Addresses = []controlplanev1alpha4.NestedEtcdAddress{ + { + IP: ip, + Port: 2379, + }, + } + log.V(5).Info("The corresponding statefulset is ready, " + + "will mark the NestedEtcd as ready") + if err := r.Status().Update(ctx, &netcd); err != nil { + log.Error(err, "fail to update NestedEtcd Object") + return ctrl.Result{}, err + } + log.Info("Successfully set the NestedEtcd object to ready", + "address", netcd.Status.Addresses) + } + return ctrl.Result{}, nil + } + + // As the NestedEtcd StatefulSet is unready, mark the NestedEtcd as unready + // if its current status is ready + if IsNetcdReady(netcd.Status) { + netcd.Status.Phase = string(controlplanev1alpha4.NestedEtcdUnready) + if err := r.Status().Update(ctx, &netcd); err != nil { + log.Error(err, "fail to update NestedEtcd Object") + return ctrl.Result{}, err + } + log.Info("Successfully set the NestedEtcd object to unready") + } return ctrl.Result{}, nil } // SetupWithManager sets up the controller with the Manager. func (r *NestedEtcdReconciler) SetupWithManager(mgr ctrl.Manager) error { + if err := mgr.GetFieldIndexer().IndexField(context.TODO(), + &appsv1.StatefulSet{}, + statefulsetOwnerKey, + func(rawObj ctrlcli.Object) []string { + // grab the statefulset object, extract the owner + sts := rawObj.(*appsv1.StatefulSet) + owner := metav1.GetControllerOf(sts) + if owner == nil { + return nil + } + // make sure it's a NestedEtcd + if owner.APIVersion != apiGVStr || owner.Kind != "NestedEtcd" { + return nil + } + + // and if so, return it + return []string{owner.Name} + }); err != nil { + return err + } + return ctrl.NewControllerManagedBy(mgr). For(&controlplanev1alpha4.NestedEtcd{}). + Owns(&appsv1.StatefulSet{}). Complete(r) } + +func genServiceObject(netcd controlplanev1alpha4.NestedEtcd, + clusterName, templateURL string, + log logr.Logger) (netcdSvc corev1.Service, retErr error) { + defaultSvcTmpl, err := fetchTemplate(defaultServiceURL) + if err != nil { + retErr = fmt.Errorf("fail to fetch the default template "+ + "for the nestedetcd service: %v", err) + return + } + svcStr, err := substituteTemplate(map[string]string{ + "nestedetcdName": netcd.GetName(), + "nestedetcdNamespace": netcd.GetNamespace(), + "nestedetcdStsReplicas": strconv.FormatInt(int64(netcd.Spec.Replicas), 10), + }, defaultSvcTmpl) + if err != nil { + retErr = fmt.Errorf("fail to substitute the default template "+ + "for the nestedetcd Service: %v", err) + return + } + rawSvcObj, err := yamlToObject([]byte(svcStr)) + if err != nil { + retErr = fmt.Errorf("fail to convert yaml file to Serivce: %v", err) + return + } + log.Info("deserialize yaml to runtime object(Service)") + svcObj, ok := rawSvcObj.(*corev1.Service) + if !ok { + retErr = fmt.Errorf("fail to convert runtime object to Serivce") + return + } + netcdSvc = *svcObj + log.Info("convert runtime object to Service.") + return +} + +func genStatefulSetObject(netcd controlplanev1alpha4.NestedEtcd, + clusterName, templateURL string, + log logr.Logger) (netcdSts appsv1.StatefulSet, retErr error) { + // 1 fetch the statefulset template + defaultStsTmpl, err := fetchTemplate(defaultStatefulSetURL) + if err != nil { + retErr = fmt.Errorf("fail to fetch the default template "+ + "for the nestedetcd StatefulSet: %v", err) + return + } + // 2 substitute the statefulset template + stsStr, err := substituteTemplate(map[string]string{ + "nestedetcdName": netcd.GetName(), + "nestedetcdNamespace": netcd.GetNamespace(), + "nestedControlPlaneName": clusterName, + }, defaultStsTmpl) + if err != nil { + retErr = fmt.Errorf("fail to substitute the default template "+ + "for the nestedetcd StatefulSet: %v", err) + return + } + // 3 deserialize the yaml string to the StatefulSet object + rawObj, err := yamlToObject([]byte(stsStr)) + if err != nil { + retErr = fmt.Errorf("fail to convert yaml file to StatefulSet: %v", err) + return + } + log.V(5).Info("deserialize yaml to runtime object(StatefulSet)") + // 4 convert runtime Object to StatefulSet + stsObj, ok := rawObj.(*appsv1.StatefulSet) + if !ok { + retErr = fmt.Errorf("fail to convert runtime object to StatefulSet") + return + } + netcdSts = *stsObj + log.V(5).Info("convert runtime object to StatefulSet.") + // 5 apply NestedEtcd.Spec.Resources and NestedEtcd.Spec.Replicas + // to the NestedEtcd StatefulSet + for i := range netcdSts.Spec.Template.Spec.Containers { + netcdSts.Spec.Template.Spec.Containers[i].Resources = + netcd.Spec.Resources + } + if netcd.Spec.Replicas != 0 { + *netcdSts.Spec.Replicas = netcd.Spec.Replicas + } + log.V(5).Info("The NestedEtcd StatefulSet's Resources and "+ + "Replicas fields are set", + "StatefulSet", netcdSts.GetName()) + + // 6 set the "--initial-cluster" command line flag for the Etcd container + icaVal := genInitialClusterArgs(1, netcd.GetName(), netcd.GetName()) + stsArgs := append(netcdSts.Spec.Template.Spec.Containers[0].Args, + "--initial-cluster", icaVal) + netcdSts.Spec.Template.Spec.Containers[0].Args = stsArgs + log.V(5).Info("The '--initial-cluster' command line option is set") + + // 7 TODO validate the patch and apply it to the template. + return netcdSts, nil +} + +func createNestedEtcdStatefulSet(ctx context.Context, + cli ctrlcli.Client, netcd controlplanev1alpha4.NestedEtcd, + clusterName string, log logr.Logger) error { + var ( + netcdSts appsv1.StatefulSet + netcdSvc corev1.Service + err error + ) + // 1. Using the template defined by version/channel to create the + // StatefulSet and the Service + // TODO check the template version/channel, if not set, use the default. + if netcd.Spec.Version == "" && netcd.Spec.Channel == "" { + log.V(4).Info("The Version and Channel are not set, " + + "will use the default template.") + netcdSts, err = genStatefulSetObject(netcd, clusterName, + defaultStatefulSetURL, log) + if err != nil { + return fmt.Errorf("fail to generate the "+ + "NestedEtcd Statefulset object: %v", err) + } + + netcdSvc, err = genServiceObject(netcd, clusterName, + defaultServiceURL, log) + if err != nil { + return fmt.Errorf("fail to generate the "+ + "NesteEtcd Service object: %v", err) + } + + } else { + panic("NOT IMPLEMENT YET") + } + // 2. set the NestedEtcd object as the owner of the StatefulSet + or := metav1.NewControllerRef(&netcd, + controlplanev1alpha4.GroupVersion.WithKind("NestedEtcd")) + netcdSts.OwnerReferences = append(netcdSts.OwnerReferences, *or) + + if err := cli.Create(ctx, &netcdSvc); err != nil { + return err + } + log.Info("successfully create the service for NestedEtcd StatefulSet") + // 3. as we need to use the assigned ClusterIP to generate the TLS + // certificate, we get the latest NestedEtcd Service object + if err := cli.Get(ctx, types.NamespacedName{ + Name: netcdSvc.GetName(), + Namespace: netcdSvc.GetNamespace(), + }, &netcdSvc); err != nil { + return err + } + log.Info("get the latest Service") + + // 4. create the NestedEtcd StatefulSet + return cli.Create(ctx, &netcdSts) +} + +func IsNetcdReady(status controlplanev1alpha4.NestedEtcdStatus) bool { + return status.Phase == string(controlplanev1alpha4.NestedEtcdReady) +} + +func getNestedEtcdSvcClusterIP(ctx context.Context, cli ctrlcli.Client, + netcd controlplanev1alpha4.NestedEtcd) (string, error) { + var svc corev1.Service + if err := cli.Get(ctx, types.NamespacedName{ + Namespace: netcd.GetNamespace(), + Name: netcd.GetName(), + }, &svc); err != nil { + return "", err + } + return svc.Spec.ClusterIP, nil +} + +func yamlToObject(yamlContent []byte) (runtime.Object, error) { + decode := serializer.NewCodecFactory(scheme.Scheme). + UniversalDeserializer().Decode + obj, _, err := decode(yamlContent, nil, nil) + if err != nil { + return nil, err + } + return obj, nil +} + +func substituteTemplate(context interface{}, tmpl string) (string, error) { + t, tmplPrsErr := template.New("test"). + Option("missingkey=zero").Parse(tmpl) + if tmplPrsErr != nil { + return "", tmplPrsErr + } + writer := bytes.NewBuffer([]byte{}) + if err := t.Execute(writer, context); nil != err { + return "", err + } + + return writer.String(), nil +} + +func fetchTemplate(templateURL string) (string, error) { + rep, err := http.Get(templateURL) + if err != nil { + return "", err + } + + defer rep.Body.Close() + + bodyBytes, err := ioutil.ReadAll(rep.Body) + if err != nil { + return "", err + } + + return string(bodyBytes), nil +} + +func getOwner(netcd controlplanev1alpha4.NestedEtcd) metav1.OwnerReference { + owners := netcd.GetOwnerReferences() + if len(owners) == 0 { + return metav1.OwnerReference{} + } + for _, owner := range owners { + if owner.APIVersion == apiGVStr && owner.Kind == "NestedControlPlane" { + return owner + } + } + return metav1.OwnerReference{} +} + +// genInitialClusterArgs generates the values for `--inital-cluster` option of +// etcd based on the number of replicas specified in etcd StatefulSet +func genInitialClusterArgs(replicas int32, + stsName, svcName string) (argsVal string) { + for i := int32(0); i < replicas; i++ { + // use 2380 as the default port for etcd peer communication + peerAddr := fmt.Sprintf("%s-%d=https://%s-%d.%s:%d", + stsName, i, stsName, i, svcName, 2380) + if i == replicas-1 { + argsVal = argsVal + peerAddr + break + } + argsVal = argsVal + peerAddr + "," + } + + return argsVal +} diff --git a/controllers/controlplane/nestedetcd_controller_test.go b/controllers/controlplane/nestedetcd_controller_test.go new file mode 100644 index 00000000..c8ec3c6a --- /dev/null +++ b/controllers/controlplane/nestedetcd_controller_test.go @@ -0,0 +1,315 @@ +/* +Copyright 2021 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package controlplane + +import ( + "reflect" + "testing" + + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" + controlplanev1alpha4 "sigs.k8s.io/cluster-api-provider-nested/apis/controlplane/v1alpha4" + addonv1alpha1 "sigs.k8s.io/kubebuilder-declarative-pattern/pkg/patterns/addon/pkg/apis/v1alpha1" +) + +const ( + failed = "\u2717" + succeed = "\u2713" +) + +func TestSubstituteTemplate(t *testing.T) { + tests := []struct { + name string + template string + context interface{} + expect string + }{ + { + "empty template", + "", + map[string]interface{}{}, + "", + }, + { + "normal template", + "name: {{.name}},\nage: {{.age}}", + map[string]interface{}{ + "name": "test", + "age": "1", + }, + "name: test,\nage: 1", + }, + } + for _, tt := range tests { + st := tt + tf := func(t *testing.T) { + t.Parallel() + t.Logf("\tTestCase: %s", st.name) + { + get, err := substituteTemplate(st.context, st.template) + if err != nil { + t.Fatalf("case %s failed: %v", st.name, err) + } + if get != st.expect { + t.Fatalf("\t%s\texpect %v, but get %v", failed, st.expect, get) + } + t.Logf("\t%s\texpect %v, get %v", succeed, st.expect, get) + + } + } + t.Run(st.name, tf) + } +} + +func TestGetOwner(t *testing.T) { + tests := []struct { + name string + netcd controlplanev1alpha4.NestedEtcd + expect metav1.OwnerReference + }{ + { + "no owner", + controlplanev1alpha4.NestedEtcd{ + ObjectMeta: metav1.ObjectMeta{ + Name: "test-netcd", + OwnerReferences: []metav1.OwnerReference{}, + }, + }, + metav1.OwnerReference{}, + }, + { + "owner APIVersion not matched", + controlplanev1alpha4.NestedEtcd{ + ObjectMeta: metav1.ObjectMeta{ + Name: "test-netcd", + OwnerReferences: []metav1.OwnerReference{ + { + APIVersion: "controlplane.cluster.x-k8s.io/v1", + Kind: "test-kind", + Name: "test-name", + UID: "xxxxx-xxxxx-xxxxx-xxxxx", + }, + }, + }, + }, + metav1.OwnerReference{}, + }, + { + "owner kind not matched", + controlplanev1alpha4.NestedEtcd{ + ObjectMeta: metav1.ObjectMeta{ + Name: "test-netcd", + OwnerReferences: []metav1.OwnerReference{ + { + APIVersion: controlplanev1alpha4.GroupVersion.String(), + Kind: "test-kind", + Name: "test-name", + UID: "xxxxx-xxxxx-xxxxx-xxxxx", + }, + }, + }, + }, + metav1.OwnerReference{}, + }, + { + "owner found", + controlplanev1alpha4.NestedEtcd{ + ObjectMeta: metav1.ObjectMeta{ + Name: "test-netcd", + OwnerReferences: []metav1.OwnerReference{ + { + APIVersion: controlplanev1alpha4.GroupVersion.String(), + Kind: "NestedControlPlane", + Name: "test-name", + UID: "xxxxx-xxxxx-xxxxx-xxxxx", + }, + }, + }, + }, + metav1.OwnerReference{ + APIVersion: controlplanev1alpha4.GroupVersion.String(), + Kind: "NestedControlPlane", + Name: "test-name", + UID: "xxxxx-xxxxx-xxxxx-xxxxx", + }, + }, + } + + for _, tt := range tests { + st := tt + tf := func(t *testing.T) { + t.Parallel() + t.Logf("\tTestCase: %s", st.name) + { + get := getOwner(st.netcd) + if !reflect.DeepEqual(get, st.expect) { + t.Fatalf("\t%s\texpect %v, but get %v", failed, st.expect, get) + } + t.Logf("\t%s\texpect %v, get %v", succeed, st.expect, get) + + } + } + t.Run(st.name, tf) + } +} + +func TestGenInitialClusterArgs(t *testing.T) { + tests := []struct { + name string + replicas int32 + stsName string + svcName string + expect string + }{ + { + "1 replicas", + 1, + "netcdSts", + "netcdSvc", + "netcdSts-0=https://netcdSts-0.netcdSvc:2380", + }, + { + "2 replicas", + 2, + "netcdSts", + "netcdSvc", + "netcdSts-0=https://netcdSts-0.netcdSvc:2380,netcdSts-1=https://netcdSts-1.netcdSvc:2380", + }, + } + for _, tt := range tests { + st := tt + tf := func(t *testing.T) { + t.Parallel() + t.Logf("\tTestCase: %s", st.name) + { + get := genInitialClusterArgs(st.replicas, st.stsName, st.svcName) + if !reflect.DeepEqual(get, st.expect) { + t.Fatalf("\t%s\texpect %v, but get %v", failed, st.expect, get) + } + t.Logf("\t%s\texpect %v, get %v", succeed, st.expect, get) + + } + } + t.Run(st.name, tf) + } +} + +func TestIsNetcdReady(t *testing.T) { + tests := []struct { + name string + status controlplanev1alpha4.NestedEtcdStatus + expect bool + }{ + { + "ready", + controlplanev1alpha4.NestedEtcdStatus{ + CommonStatus: addonv1alpha1.CommonStatus{ + Phase: string(controlplanev1alpha4.NestedEtcdReady), + }, + }, + true, + }, + { + "unready", + controlplanev1alpha4.NestedEtcdStatus{ + CommonStatus: addonv1alpha1.CommonStatus{ + Phase: string(controlplanev1alpha4.NestedEtcdUnready), + }, + }, + false, + }, + } + + for _, tt := range tests { + st := tt + tf := func(t *testing.T) { + t.Parallel() + t.Logf("\tTestCase: %s", st.name) + { + get := IsNetcdReady(st.status) + if get != st.expect { + t.Fatalf("\t%s\texpect %v, but get %v", failed, st.expect, get) + } + t.Logf("\t%s\texpect %v, get %v", succeed, st.expect, get) + + } + } + t.Run(st.name, tf) + } +} + +func TestYamlToObject(t *testing.T) { + tests := []struct { + name string + yaml string + expect runtime.Object + }{ + { + "pod", + ` +apiVersion: v1 +kind: Pod +metadata: + name: busybox +spec: + containers: + - name: busybox + image: busybox + command: + - top`, + &corev1.Pod{ + TypeMeta: metav1.TypeMeta{ + Kind: "Pod", + APIVersion: "v1", + }, + ObjectMeta: metav1.ObjectMeta{ + Name: "busybox", + }, + Spec: corev1.PodSpec{ + Containers: []corev1.Container{ + { + Name: "busybox", + Image: "busybox", + Command: []string{"top"}, + }, + }, + }, + }, + }, + } + + for _, tt := range tests { + st := tt + tf := func(t *testing.T) { + t.Parallel() + t.Logf("\tTestCase: %s", st.name) + { + get, err := yamlToObject([]byte(st.yaml)) + if err != nil { + t.Fatalf("case %s failed: %v", st.name, err) + } + if !reflect.DeepEqual(get, st.expect) { + t.Fatalf("\t%s\texpect %v, but get %v\n", failed, get, st.expect) + } + t.Logf("\tTestcase: %s %s\t", st.name, succeed) + + } + } + t.Run(st.name, tf) + } +} diff --git a/go.mod b/go.mod index 5c4e0e61..0d6dd515 100644 --- a/go.mod +++ b/go.mod @@ -7,11 +7,13 @@ require ( github.com/onsi/ginkgo v1.14.1 github.com/onsi/gomega v1.10.2 github.com/spf13/pflag v1.0.5 - k8s.io/api v0.19.2 + k8s.io/api v0.19.4 k8s.io/apimachinery v0.19.4 - k8s.io/client-go v0.19.2 + k8s.io/client-go v0.19.4 k8s.io/klog/v2 v2.2.0 sigs.k8s.io/cluster-api v0.3.11-0.20201112165251-91b70900dbaf sigs.k8s.io/controller-runtime v0.7.0 sigs.k8s.io/kubebuilder-declarative-pattern v0.0.0-20210120001158-a905f3c7cf41 ) + +replace sigs.k8s.io/controller-runtime => sigs.k8s.io/controller-runtime v0.7.0-alpha.5 diff --git a/go.sum b/go.sum index 3dde4af6..779f5fa0 100644 --- a/go.sum +++ b/go.sum @@ -79,10 +79,8 @@ github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMn github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= github.com/coredns/corefile-migration v1.0.11/go.mod h1:RMy/mXdeDlYwzt0vdMEJvT2hGJ2I86/eO0UdXmH9XNI= -github.com/coreos/bbolt v1.3.1-coreos.6/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/etcd v3.3.15+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= @@ -157,7 +155,6 @@ github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTg github.com/go-logr/logr v0.2.1/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= github.com/go-logr/logr v0.3.0 h1:q4c+kbcR0d5rSurhBR8dIgieOaYpXtsdTYfx22Cu6rs= github.com/go-logr/logr v0.3.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= -github.com/go-logr/zapr v0.1.0/go.mod h1:tabnROwaDl0UNxkVeFRbY8bwB37GwRv0P8lg6aAiEnk= github.com/go-logr/zapr v0.2.0 h1:v6Ji8yBW77pva6NkJKQdHLAJKrIJKRHz0RXwPqCHSR4= github.com/go-logr/zapr v0.2.0/go.mod h1:qhKdvif7YF5GI9NWEpyxTSSBdGmzkNguibrdCNVPunU= github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8= @@ -233,7 +230,6 @@ github.com/gogo/protobuf v1.3.1 h1:DqDEcV5aeaTmdFBePNpYsp3FlcVH/2ISVVM9Qf8PSls= github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20180513044358-24b0969c4cb7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= 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= @@ -243,7 +239,6 @@ github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfb 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/protobuf v0.0.0-20161109072736-4bd1920723d7/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.0.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= 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= @@ -303,7 +298,6 @@ github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+ github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/googleapis/gnostic v0.1.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= -github.com/googleapis/gnostic v0.3.1/go.mod h1:on+2t9HRStVgn95RSsFWFz+6Q0Snyqv1awfrALZdbtU= github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= github.com/googleapis/gnostic v0.5.1 h1:A8Yhf6EtqTv9RMsU6MQTyrtV1TjWlR6xU9BsZIwuTCM= github.com/googleapis/gnostic v0.5.1/go.mod h1:6U4PtQXGIEt/Z3h5MAT7FNofLnw9vXk2cUuW7uA/OeU= @@ -312,13 +306,10 @@ github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORR github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gostaticanalysis/analysisutil v0.0.0-20190318220348-4088753ea4d3/go.mod h1:eEOZF4jCKGi+aprrirO9e7WKB3beBRtWgqGunKl6pKE= -github.com/gregjones/httpcache v0.0.0-20170728041850-787624de3eb7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= -github.com/grpc-ecosystem/go-grpc-middleware v0.0.0-20190222133341-cfaf5686ec79/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= -github.com/grpc-ecosystem/grpc-gateway v1.3.0/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw= github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= @@ -331,7 +322,6 @@ github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imdario/mergo v0.3.6/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.9/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.10/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= github.com/imdario/mergo v0.3.11 h1:3tnifQM4i+fbajXKBHXWEH+KvNHqojZ778UH75j3bGA= @@ -429,7 +419,6 @@ github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.4.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= @@ -438,7 +427,6 @@ github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108 github.com/onsi/ginkgo v1.14.1 h1:jMU0WaQrP0a/YAEq8eJmJKjBoMs+pClEr1vDMlM/Do4= github.com/onsi/ginkgo v1.14.1/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v1.3.0/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= @@ -462,7 +450,6 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.2/go.mod h1:OsXs2jCmiKlQ1lTBmv21f2mNfw4xf/QclQDMrYNZzcM= github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.7.1 h1:NTGy1Ja9pByO+xAeH/qiWnLrKtr3hJPNjaVUwnjpdpA= @@ -473,13 +460,11 @@ github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1: 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.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.0.0-20181126121408-4724e9255275/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.10.0 h1:RyRA7RzGXQZiW+tGMr7sxa85G1z0yOpM1qq5c8lNawc= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20181204211112-1dc9a6cbc91a/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.1.3 h1:F0+tqvhOksq22sc6iCHF5WGlWjdwj92p0udFh1VFBS8= @@ -506,7 +491,6 @@ github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6Mwd github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/soheilhy/cmux v0.1.3/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= github.com/sourcegraph/go-diff v0.5.1/go.mod h1:j2dHj3m8aZgQO8lMTcTnBcXkRRRqi34cd2MNlA9u1mE= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= @@ -553,7 +537,6 @@ github.com/valyala/quicktemplate v1.2.0/go.mod h1:EH+4AkTd43SvgIbQHYu59/cJyxDoOV github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio= github.com/vektah/gqlparser v1.1.2/go.mod h1:1ycwN7Ij5njmMkPPAOaRFY4rET2Enx7IkVv3vaXspKw= github.com/xanzy/ssh-agent v0.2.1/go.mod h1:mLlQY/MoOhWBj+gOGMQkOeiEvkx+8pJSI+0Bx9h2kr4= -github.com/xiang90/probing v0.0.0-20160813154853-07dd2e8dfe18/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xlab/handysort v0.0.0-20150421192137-fb3537ed64a1/go.mod h1:QcJo0QPSfTONNIgpN5RA8prR7fF8nkF6cTWTcNerRO8= github.com/xlab/treeprint v0.0.0-20181112141820-a009c3971eca/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg= @@ -573,22 +556,18 @@ go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.starlark.net v0.0.0-20190528202925-30ae18b8564f/go.mod h1:c1/X6cHgvdXj6pUlmWKMkuqRnW4K8x2vwt6JAaaircg= go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5/go.mod h1:nmDLcffg48OtT/PSW0Hg7FvpRQsQh5OSqIylirxKC7o= -go.uber.org/atomic v0.0.0-20181018215023-8dc6146f7569/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.6.0 h1:Ezj3JGmsOnG1MoRWQkPBsKLe9DwWD9QeXzTRzzldNVk= go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/goleak v1.1.10 h1:z+mqJhf6ss6BSfSM671tgKyZBFPTTJM+HLxnhPC3wu0= go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= -go.uber.org/multierr v0.0.0-20180122172545-ddea229ff1df/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.5.0 h1:KCa4XfM8CWFCpxXRGok+Q0SS/0XBhMDbHHGABQLvD2A= go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee h1:0mgffUl7nfd+FpvXMVz4IDEaUSmT1ysygQC7qYo7sG4= go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= -go.uber.org/zap v0.0.0-20180814183419-67bc79d13d15/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.8.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.15.0 h1:ZZCA22JRF2gQE5FoNmhmrf7jeJJ2uhqDUNRYKm8dvmM= go.uber.org/zap v1.15.0/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc= @@ -638,7 +617,6 @@ golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0 h1:RM4zey1++hCTbCVQfnWeKs9/IEsaBLA8vTkd0WVtmH4= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180112015858-5ccada7d0a7b/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180218175443-cbe0f9307d01/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 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= @@ -646,7 +624,6 @@ golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73r golang.org/x/net v0.0.0-20180911220305-26e67e76b6c3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181005035420-146acd28ed58/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-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181220203305-927f97764cc3/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-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -661,7 +638,6 @@ golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR 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-20190812203447-cdfb69ac37fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/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-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -688,7 +664,6 @@ golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180117170059-2c42eef0765b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 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-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -731,7 +706,6 @@ golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed h1:J22ig1FUekjjkmZUM7pTKixYm golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/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.20171227012246-e19ae1496984/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 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k= @@ -790,7 +764,6 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -gomodules.xyz/jsonpatch/v2 v2.0.1/go.mod h1:IhYNNY4jnS53ZnfE4PAmpKtDpTCj1JFXc+3mwe7XcUU= gomodules.xyz/jsonpatch/v2 v2.1.0 h1:Phva6wqu+xR//Njw6iorylFFgn/z547tw5Ne3HZPQ+k= gomodules.xyz/jsonpatch/v2 v2.1.0/go.mod h1:IhYNNY4jnS53ZnfE4PAmpKtDpTCj1JFXc+3mwe7XcUU= gonum.org/v1/gonum v0.0.0-20190331200053-3d26580ed485/go.mod h1:2ltnJ7xHfj0zHS40VVPYEAAMTa3ZGguvHGBSJeRWqE0= @@ -845,7 +818,6 @@ gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8 gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/inf.v0 v0.9.0/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= @@ -857,7 +829,6 @@ gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkep gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= -gopkg.in/yaml.v2 v2.0.0/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= 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.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -877,17 +848,15 @@ honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWh 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 h1:3JgtbtFHMiCmsznwGVTUWbgGov+pVqnlf1dEJTNAXeM= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -k8s.io/api v0.0.0-20190918155943-95b840bb6a1f/go.mod h1:uWuOHnjmNrtQomJrvEBg0c0HRNyQ+8KTEERVsK0PW48= k8s.io/api v0.0.0-20191214185829-ca1d04f8b0d3/go.mod h1:itOjKREfmUTvcjantxOsyYU5mbFsU7qUnyUuRfF5+5M= k8s.io/api v0.17.0/go.mod h1:npsyOePkeP0CPwyGfXDHxvypiYMJxBWAMpQxCaJ4ZxI= k8s.io/api v0.17.2/go.mod h1:BS9fjjLc4CMuqfSO8vgbHPKMt5+SF0ET6u/RVDihTo4= -k8s.io/api v0.19.2 h1:q+/krnHWKsL7OBZg/rxnycsl9569Pud76UJ77MvKXms= k8s.io/api v0.19.2/go.mod h1:IQpK0zFQ1xc5iNIQPqzgoOwuFugaYHK4iCknlAQP9nI= -k8s.io/apiextensions-apiserver v0.0.0-20190918161926-8f644eb6e783/go.mod h1:xvae1SZB3E17UpV59AWc271W/Ph25N+bjPyR63X6tPY= +k8s.io/api v0.19.4 h1:I+1I4cgJYuCDgiLNjKx7SLmIbwgj9w7N7Zr5vSIdwpo= +k8s.io/api v0.19.4/go.mod h1:SbtJ2aHCItirzdJ36YslycFNzWADYH3tgOhvBEFtZAk= k8s.io/apiextensions-apiserver v0.17.2/go.mod h1:4KdMpjkEjjDI2pPfBA15OscyNldHWdBCfsWMDWAmSTs= k8s.io/apiextensions-apiserver v0.19.2 h1:oG84UwiDsVDu7dlsGQs5GySmQHCzMhknfhFExJMz9tA= k8s.io/apiextensions-apiserver v0.19.2/go.mod h1:EYNjpqIAvNZe+svXVx9j4uBaVhTB4C94HkY3w058qcg= -k8s.io/apimachinery v0.0.0-20190913080033-27d36303b655/go.mod h1:nL6pwRT8NgfF8TT68DBI8uEePRt89cSvoXUVqbkWHq4= k8s.io/apimachinery v0.0.0-20191214185652-442f8fb2f03a/go.mod h1:Ng1IY8TS7sC44KJxT/WUR6qFRfWwahYYYpNXyYRKOCY= k8s.io/apimachinery v0.0.0-20191216025728-0ee8b4573e3a/go.mod h1:Ng1IY8TS7sC44KJxT/WUR6qFRfWwahYYYpNXyYRKOCY= k8s.io/apimachinery v0.17.0/go.mod h1:b9qmWdKlLuU9EBh+06BtLcSf/Mu89rWL33naRxs1uZg= @@ -896,25 +865,22 @@ k8s.io/apimachinery v0.18.8/go.mod h1:6sQd+iHEqmOtALqOFjSWp2KZ9F0wlU/nWm0ZgsYWMi k8s.io/apimachinery v0.19.2/go.mod h1:DnPGDnARWFvYa3pMHgSxtbZb7gpzzAZ1pTfaUNDVlmA= k8s.io/apimachinery v0.19.4 h1:+ZoddM7nbzrDCp0T3SWnyxqf8cbWPT2fkZImoyvHUG0= k8s.io/apimachinery v0.19.4/go.mod h1:DnPGDnARWFvYa3pMHgSxtbZb7gpzzAZ1pTfaUNDVlmA= -k8s.io/apiserver v0.0.0-20190918160949-bfa5e2e684ad/go.mod h1:XPCXEwhjaFN29a8NldXA901ElnKeKLrLtREO9ZhFyhg= k8s.io/apiserver v0.17.2/go.mod h1:lBmw/TtQdtxvrTk0e2cgtOxHizXI+d0mmGQURIHQZlo= k8s.io/apiserver v0.19.2/go.mod h1:FreAq0bJ2vtZFj9Ago/X0oNGC51GfubKK/ViOKfVAOA= k8s.io/cli-runtime v0.0.0-20191214191754-e6dc6d5c8724/go.mod h1:wzlq80lvjgHW9if6MlE4OIGC86MDKsy5jtl9nxz/IYY= k8s.io/cli-runtime v0.17.2/go.mod h1:aa8t9ziyQdbkuizkNLAw3qe3srSyWh9zlSB7zTqRNPI= k8s.io/cli-runtime v0.19.2/go.mod h1:CMynmJM4Yf02TlkbhKxoSzi4Zf518PukJ5xep/NaNeY= -k8s.io/client-go v0.0.0-20190918160344-1fbdaa4c8d90/go.mod h1:J69/JveO6XESwVgG53q3Uz5OSfgsv4uxpScmmyYOOlk= k8s.io/client-go v0.0.0-20191214190045-a32a6f7a3052/go.mod h1:tAaoc/sYuIL0+njJefSAmE28CIcxyaFV4kbIujBlY2s= k8s.io/client-go v0.0.0-20191219150334-0b8da7416048/go.mod h1:ZEe8ZASDUAuqVGJ+UN0ka0PfaR+b6a6E1PGsSNZRui8= k8s.io/client-go v0.17.0/go.mod h1:TYgR6EUHs6k45hb6KWjVD6jFZvJV4gHDikv/It0xz+k= k8s.io/client-go v0.17.2/go.mod h1:QAzRgsa0C2xl4/eVpeVAZMvikCn8Nm81yqVx3Kk9XYI= -k8s.io/client-go v0.19.2 h1:gMJuU3xJZs86L1oQ99R4EViAADUPMHHtS9jFshasHSc= k8s.io/client-go v0.19.2/go.mod h1:S5wPhCqyDNAlzM9CnEdgTGV4OqhsW3jGO1UM1epwfJA= +k8s.io/client-go v0.19.4 h1:85D3mDNoLF+xqpyE9Dh/OtrJDyJrSRKkHmDXIbEzer8= +k8s.io/client-go v0.19.4/go.mod h1:ZrEy7+wj9PjH5VMBCuu/BDlvtUAku0oVFk4MmnW9mWA= k8s.io/cluster-bootstrap v0.19.2/go.mod h1:bzngsppPfdt9vAHUnDIEoMNsxD2b6XArVVH/W9PDDFk= -k8s.io/code-generator v0.0.0-20190912054826-cd179ad6a269/go.mod h1:V5BD6M4CyaN5m+VthcclXWsVcT1Hu+glwa1bi3MIsyE= k8s.io/code-generator v0.0.0-20191214185510-0b9b3c99f9f2/go.mod h1:BjGKcoq1MRUmcssvHiSxodCco1T6nVIt4YeCT5CMSao= k8s.io/code-generator v0.17.2/go.mod h1:DVmfPQgxQENqDIzVR2ddLXMH34qeszkKSdH/N+s+38s= k8s.io/code-generator v0.19.2/go.mod h1:moqLn7w0t9cMs4+5CQyxnfA/HV8MF6aAVENF+WZZhgk= -k8s.io/component-base v0.0.0-20190918160511-547f6c5d7090/go.mod h1:933PBGtQFJky3TEwYx4aEPZ4IxqhWh3R6DCmzqIn1hA= k8s.io/component-base v0.0.0-20191214190519-d868452632e2/go.mod h1:wupxkh1T/oUDqyTtcIjiEfpbmIHGm8By/vqpSKC6z8c= k8s.io/component-base v0.17.2/go.mod h1:zMPW3g5aH7cHJpKYQ/ZsGMcgbsA/VyhEugF3QT1awLs= k8s.io/component-base v0.19.2 h1:jW5Y9RcZTb79liEhW3XDVTW7MuvEGP0tQZnfSX6/+gs= @@ -925,13 +891,11 @@ k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8 k8s.io/gengo v0.0.0-20200428234225-8167cfdcfc14/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= -k8s.io/klog v0.4.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= k8s.io/klog v1.0.0 h1:Pt+yjF5aB1xDSVbau4VsWe+dQNzA0qv1LlXdC2dF6Q8= k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= k8s.io/klog/v2 v2.2.0 h1:XRvcwJozkgZ1UQJmfMGpvRthQHOvihEhYtDfAaxMz/A= k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= -k8s.io/kube-openapi v0.0.0-20190816220812-743ec37842bf/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E= k8s.io/kube-openapi v0.0.0-20191107075043-30be4d16710a/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E= k8s.io/kube-openapi v0.0.0-20200410145947-61e04a5be9a6/go.mod h1:GRQhZsXIAJ1xR0C9bd8UpWHZ5plfAS9fzPjJuQ6JL3E= k8s.io/kube-openapi v0.0.0-20200805222855-6aeccd4b50c6 h1:+WnxoVtG8TMiudHBSEtrVL1egv36TkkJm+bA8AxicmQ= @@ -940,7 +904,6 @@ k8s.io/kubectl v0.0.0-20191219154910-1528d4eea6dd/go.mod h1:9ehGcuUGjXVZh0qbYSB0 k8s.io/kubectl v0.19.2/go.mod h1:4ib3oj5ma6gF95QukTvC7ZBMxp60+UEAhDPjLuBIrV4= k8s.io/metrics v0.0.0-20191214191643-6b1944c9f765/go.mod h1:5V7rewilItwK0cz4nomU0b3XCcees2Ka5EBYWS1HBeM= k8s.io/metrics v0.19.2/go.mod h1:IlLaAGXN0q7yrtB+SV0q3JIraf6VtlDr+iuTcX21fCU= -k8s.io/utils v0.0.0-20190801114015-581e00157fb1/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= k8s.io/utils v0.0.0-20191114184206-e782cd3c129f/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= k8s.io/utils v0.0.0-20200729134348-d5654de09c73/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= k8s.io/utils v0.0.0-20200912215256-4140de9c8800 h1:9ZNvfPvVIEsp/T1ez4GQuzCcCTEQWhovSofhqR73A6g= @@ -958,10 +921,8 @@ sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.9/go.mod h1:dzAXnQb sigs.k8s.io/cli-utils v0.16.0/go.mod h1:9Jqm9K2W6ShhCxsEuaz6HSRKKOXigPUx3ZfypGgxBLY= sigs.k8s.io/cluster-api v0.3.11-0.20201112165251-91b70900dbaf h1:EPeZjqKnCYKOY6s6qqMNMYe6itO19I5AEJOH0iRn2XQ= sigs.k8s.io/cluster-api v0.3.11-0.20201112165251-91b70900dbaf/go.mod h1:siDh36v14xqSH6Z8Zkyiu0d7ead80C0RfkLgWtCeVCM= -sigs.k8s.io/controller-runtime v0.4.0/go.mod h1:ApC79lpY3PHW9xj/w9pj+lYkLgwAAUZwfXkME1Lajns= +sigs.k8s.io/controller-runtime v0.7.0-alpha.5 h1:U0eZrtiuLMLE6RJTPCjr/CsrauJZc5gxqZxDE8HlBpg= sigs.k8s.io/controller-runtime v0.7.0-alpha.5/go.mod h1:03b1n6EtlDvuBPPEOHadJUusruwLWgoT4BDCybMibnA= -sigs.k8s.io/controller-runtime v0.7.0 h1:bU20IBBEPccWz5+zXpLnpVsgBYxqclaHu1pVDl/gEt8= -sigs.k8s.io/controller-runtime v0.7.0/go.mod h1:pJ3YBrJiAqMAZKi6UVGuE98ZrroV1p+pIhoHsMm9wdU= sigs.k8s.io/kind v0.9.0/go.mod h1:cxKQWwmbtRDzQ+RNKnR6gZG6fjbeTtItp5cGf+ww+1Y= sigs.k8s.io/kubebuilder-declarative-pattern v0.0.0-20210120001158-a905f3c7cf41 h1:dSJwEgwFEfJIrkmBWx7srUdIUhfj2iI6YGSI7FcV3R4= sigs.k8s.io/kubebuilder-declarative-pattern v0.0.0-20210120001158-a905f3c7cf41/go.mod h1:cuCCW8N0IzYvLuE6IgL6sCiA4QwxO0JBlyGKGnoLr2I= @@ -969,14 +930,12 @@ sigs.k8s.io/kustomize v2.0.3+incompatible/go.mod h1:MkjgH3RdOWrievjo6c9T245dYlB5 sigs.k8s.io/kustomize/api v0.3.2/go.mod h1:A+ATnlHqzictQfQC1q3KB/T6MSr0UWQsrrLxMWkge2E= sigs.k8s.io/kustomize/kyaml v0.4.0/go.mod h1:XJL84E6sOFeNrQ7CADiemc1B0EjIxHo3OhW4o1aJYNw= sigs.k8s.io/structured-merge-diff v0.0.0-20190525122527-15d366b2352e/go.mod h1:wWxsB5ozmmv/SG7nM11ayaAW51xMvak/t1r0CSlcokI= -sigs.k8s.io/structured-merge-diff v0.0.0-20190817042607-6149e4549fca/go.mod h1:IIgPezJWb76P0hotTxzDbWsMYB8APh18qZnxkomBpxA= sigs.k8s.io/structured-merge-diff v1.0.1-0.20191108220359-b1b620dd3f06 h1:zD2IemQ4LmOcAumeiyDWXKUI2SO0NYDe3H6QGvPOVgU= sigs.k8s.io/structured-merge-diff v1.0.1-0.20191108220359-b1b620dd3f06/go.mod h1:/ULNhyfzRopfcjskuui0cTITekDduZ7ycKN3oUT9R18= sigs.k8s.io/structured-merge-diff/v3 v3.0.0-20200116222232-67a7b8c61874/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw= sigs.k8s.io/structured-merge-diff/v3 v3.0.0/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw= sigs.k8s.io/structured-merge-diff/v4 v4.0.1 h1:YXTMot5Qz/X1iBRJhAt+vI+HVttY0WkSqqhKxQ0xVbA= sigs.k8s.io/structured-merge-diff/v4 v4.0.1/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/testing_frameworks v0.1.2/go.mod h1:ToQrwSC3s8Xf/lADdZp3Mktcql9CG0UAmdJG9th5i0w= sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= sigs.k8s.io/yaml v1.2.0 h1:kr/MCeFWJWTwyaHoR9c8EjH9OumOmoF9YGiZd7lFm/Q= sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc=