From d6da55448c3857f16b7b43b37fa703907c3f4a09 Mon Sep 17 00:00:00 2001 From: Alay Patel Date: Fri, 1 Nov 2019 22:22:48 -0400 Subject: [PATCH 1/6] install: seed configmap and image-references with ceo images This is necessary to prevent races --- .../0000_80_machine-config-operator_02_images.configmap.yaml | 2 +- install/image-references | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/install/0000_80_machine-config-operator_02_images.configmap.yaml b/install/0000_80_machine-config-operator_02_images.configmap.yaml index 038b6b6d18..583a8d4c3c 100644 --- a/install/0000_80_machine-config-operator_02_images.configmap.yaml +++ b/install/0000_80_machine-config-operator_02_images.configmap.yaml @@ -11,7 +11,7 @@ data: "etcd": "registry.svc.ci.openshift.org/openshift:etcd", "infraImage": "registry.svc.ci.openshift.org/openshift:pod", "kubeClientAgentImage": "registry.svc.ci.openshift.org/openshift:kube-client-agent", - "clusterEtcdOperatorImage": "", + "clusterEtcdOperatorImage": "registry.svc.ci.openshift.org/openshift:cluster-etcd-operator", "keepalivedImage": "registry.svc.ci.openshift.org/openshift:keepalived-ipfailover", "corednsImage": "registry.svc.ci.openshift.org/openshift:coredns", "mdnsPublisherImage": "registry.svc.ci.openshift.org/openshift:mdns-publisher", diff --git a/install/image-references b/install/image-references index b0a41d9d13..a13ee4731e 100644 --- a/install/image-references +++ b/install/image-references @@ -31,6 +31,10 @@ spec: from: kind: DockerImage name: registry.svc.ci.openshift.org/openshift:kube-client-agent + - name: cluster-etcd-operator + from: + kind: DockerImage + name: registry.svc.ci.openshift.org/openshift:cluster-etcd-operator - name: cli from: kind: DockerImage From 12a3ea98c16d46f69ebb32146035a5568ee615a6 Mon Sep 17 00:00:00 2001 From: Alay Patel Date: Fri, 6 Dec 2019 15:40:49 -0500 Subject: [PATCH 2/6] *: get etcd CR from kube api to check if it managed/unmanaged --- cmd/machine-config-operator/start.go | 2 ++ .../machineconfigcontroller/clusterrole.yaml | 3 ++ pkg/controller/common/controller_context.go | 21 ++++++++++++ pkg/operator/assets/bindata.go | 3 ++ pkg/operator/operator.go | 20 +++++++++++- pkg/operator/sync.go | 32 +++++++++++++++++++ 6 files changed, 80 insertions(+), 1 deletion(-) diff --git a/cmd/machine-config-operator/start.go b/cmd/machine-config-operator/start.go index efdb958ea4..249cba516a 100644 --- a/cmd/machine-config-operator/start.go +++ b/cmd/machine-config-operator/start.go @@ -74,6 +74,7 @@ func runStartCmd(cmd *cobra.Command, args []string) { ctrlctx.ClientBuilder.APIExtClientOrDie(componentName), ctrlctx.ClientBuilder.ConfigClientOrDie(componentName), ctrlctx.OpenShiftKubeAPIServerKubeNamespacedInformerFactory.Core().V1().ConfigMaps(), + ctrlctx.EtcdInformer, ) ctrlctx.NamespacedInformerFactory.Start(ctrlctx.Stop) @@ -82,6 +83,7 @@ func runStartCmd(cmd *cobra.Command, args []string) { ctrlctx.APIExtInformerFactory.Start(ctrlctx.Stop) ctrlctx.ConfigInformerFactory.Start(ctrlctx.Stop) ctrlctx.OpenShiftKubeAPIServerKubeNamespacedInformerFactory.Start(ctrlctx.Stop) + ctrlctx.OperatorInformerFactory.Start(ctrlctx.Stop) close(ctrlctx.InformersStarted) go controller.Run(2, ctrlctx.Stop) diff --git a/manifests/machineconfigcontroller/clusterrole.yaml b/manifests/machineconfigcontroller/clusterrole.yaml index d9a1aa973b..18bfcc9a31 100644 --- a/manifests/machineconfigcontroller/clusterrole.yaml +++ b/manifests/machineconfigcontroller/clusterrole.yaml @@ -22,3 +22,6 @@ rules: - apiGroups: ["operator.openshift.io"] resources: ["imagecontentsourcepolicies"] verbs: ["get", "list", "watch"] +- apiGroups: ["operator.openshift.io"] + resources: ["etcds"] + verbs: ["get", "list", "watch"] diff --git a/pkg/controller/common/controller_context.go b/pkg/controller/common/controller_context.go index 74d6a28f81..3a52af1ec6 100644 --- a/pkg/controller/common/controller_context.go +++ b/pkg/controller/common/controller_context.go @@ -6,7 +6,9 @@ import ( "github.com/golang/glog" configinformers "github.com/openshift/client-go/config/informers/externalversions" + operatorclientset "github.com/openshift/client-go/operator/clientset/versioned" operatorinformers "github.com/openshift/client-go/operator/informers/externalversions" + operatorv1 "github.com/openshift/client-go/operator/informers/externalversions/operator/v1" "github.com/openshift/machine-config-operator/internal/clients" daemonconsts "github.com/openshift/machine-config-operator/pkg/daemon/constants" mcfginformers "github.com/openshift/machine-config-operator/pkg/generated/informers/externalversions" @@ -42,6 +44,7 @@ type ControllerContext struct { APIExtInformerFactory apiextinformers.SharedInformerFactory ConfigInformerFactory configinformers.SharedInformerFactory OperatorInformerFactory operatorinformers.SharedInformerFactory + EtcdInformer operatorv1.EtcdInformer AvailableResources map[schema.GroupVersionResource]bool @@ -86,6 +89,8 @@ func CreateControllerContext(cb *clients.Builder, stop <-chan struct{}, targetNa configSharedInformer := configinformers.NewSharedInformerFactory(configClient, resyncPeriod()()) operatorSharedInformer := operatorinformers.NewSharedInformerFactory(operatorClient, resyncPeriod()()) + etcdInformer := getEtcdInformer(operatorClient, operatorSharedInformer) + return &ControllerContext{ ClientBuilder: cb, NamespacedInformerFactory: sharedNamespacedInformers, @@ -97,8 +102,24 @@ func CreateControllerContext(cb *clients.Builder, stop <-chan struct{}, targetNa APIExtInformerFactory: apiExtSharedInformer, ConfigInformerFactory: configSharedInformer, OperatorInformerFactory: operatorSharedInformer, + EtcdInformer: etcdInformer, Stop: stop, InformersStarted: make(chan struct{}), ResyncPeriod: resyncPeriod(), } } + +func getEtcdInformer(operatorClient operatorclientset.Interface, operatorSharedInformer operatorinformers.SharedInformerFactory) operatorv1.EtcdInformer { + operatorGroups, err := operatorClient.Discovery().ServerResourcesForGroupVersion("operator.openshift.io/v1") + if err != nil { + glog.Errorf("unable to get operatorGroups: %#v", err) + return nil + } + + for _, o := range operatorGroups.APIResources { + if o.Kind == "Etcd" { + return operatorSharedInformer.Operator().V1().Etcds() + } + } + return nil +} diff --git a/pkg/operator/assets/bindata.go b/pkg/operator/assets/bindata.go index bc13149294..40e93e158e 100644 --- a/pkg/operator/assets/bindata.go +++ b/pkg/operator/assets/bindata.go @@ -867,6 +867,9 @@ rules: - apiGroups: ["operator.openshift.io"] resources: ["imagecontentsourcepolicies"] verbs: ["get", "list", "watch"] +- apiGroups: ["operator.openshift.io"] + resources: ["etcds"] + verbs: ["get", "list", "watch"] `) func manifestsMachineconfigcontrollerClusterroleYamlBytes() ([]byte, error) { diff --git a/pkg/operator/operator.go b/pkg/operator/operator.go index 0c7007969e..4201845159 100644 --- a/pkg/operator/operator.go +++ b/pkg/operator/operator.go @@ -8,6 +8,8 @@ import ( "github.com/golang/glog" configclientset "github.com/openshift/client-go/config/clientset/versioned" + operatorv1 "github.com/openshift/client-go/operator/informers/externalversions/operator/v1" + operatorlisterv1 "github.com/openshift/client-go/operator/listers/operator/v1" corev1 "k8s.io/api/core/v1" apiextclientset "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset" apiextinformersv1beta1 "k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/apiextensions/v1beta1" @@ -23,6 +25,7 @@ import ( coreclientsetv1 "k8s.io/client-go/kubernetes/typed/core/v1" appslisterv1 "k8s.io/client-go/listers/apps/v1" corelisterv1 "k8s.io/client-go/listers/core/v1" + "k8s.io/client-go/tools/cache" "k8s.io/client-go/tools/leaderelection/resourcelock" "k8s.io/client-go/tools/record" @@ -79,6 +82,7 @@ type Operator struct { clusterCmLister corelisterv1.ConfigMapLister proxyLister configlistersv1.ProxyLister oseKubeAPILister corelisterv1.ConfigMapLister + etcdLister operatorlisterv1.EtcdLister crdListerSynced cache.InformerSynced deployListerSynced cache.InformerSynced @@ -95,6 +99,7 @@ type Operator struct { clusterRoleBindingInformerSynced cache.InformerSynced proxyListerSynced cache.InformerSynced oseKubeAPIListerSynced cache.InformerSynced + etcdSynced cache.InformerSynced // queue only ever has one item, but it has nice error handling backoff/retry semantics queue workqueue.RateLimitingInterface @@ -126,6 +131,7 @@ func New( apiExtClient apiextclientset.Interface, configClient configclientset.Interface, oseKubeAPIInformer coreinformersv1.ConfigMapInformer, + etcdInformer operatorv1.EtcdInformer, ) *Operator { eventBroadcaster := record.NewBroadcaster() eventBroadcaster.StartLogging(glog.Infof) @@ -192,6 +198,17 @@ func New( optr.infraListerSynced = infraInformer.Informer().HasSynced optr.networkLister = networkInformer.Lister() optr.networkListerSynced = networkInformer.Informer().HasSynced + if etcdInformer != nil { + optr.etcdLister = etcdInformer.Lister() + optr.etcdSynced = etcdInformer.Informer().HasSynced + etcdInformer.Informer().AddEventHandler(optr.eventHandler()) + } else { + optr.etcdLister = nil + optr.etcdSynced = func() bool { + // if etcd is not part of CVO it will return true immediately + return true + } + } optr.vStore.Set("operator", os.Getenv("RELEASE_VERSION")) @@ -226,7 +243,8 @@ func (optr *Operator) Run(workers int, stopCh <-chan struct{}) { optr.clusterRoleBindingInformerSynced, optr.networkListerSynced, optr.proxyListerSynced, - optr.oseKubeAPIListerSynced) { + optr.oseKubeAPIListerSynced, + optr.etcdSynced) { glog.Error("failed to sync caches") return } diff --git a/pkg/operator/sync.go b/pkg/operator/sync.go index cbde0331e5..ca1913dd01 100644 --- a/pkg/operator/sync.go +++ b/pkg/operator/sync.go @@ -22,6 +22,7 @@ import ( "k8s.io/client-go/tools/cache" configv1 "github.com/openshift/api/config/v1" + operatorv1 "github.com/openshift/api/operator/v1" "github.com/openshift/machine-config-operator/lib/resourceapply" "github.com/openshift/machine-config-operator/lib/resourceread" mcfgv1 "github.com/openshift/machine-config-operator/pkg/apis/machineconfiguration.openshift.io/v1" @@ -206,6 +207,11 @@ func (optr *Operator) syncRenderConfig(_ *renderConfig) error { spec.CloudProviderConfig = cc } + //TODO: alaypatel07 remove after cluster-etcd-operator deployed via CVO as Managed + if err = optr.setEtcdOperatorImage(&imgs); err != nil { + glog.Errorf("error setting etcd operator images: %#v", err) + } + spec.KubeAPIServerServingCAData = kubeAPIServerServingCABytes spec.EtcdCAData = etcdCA spec.EtcdMetricCAData = etcdMetricCA @@ -743,6 +749,32 @@ func (optr *Operator) getGlobalConfig() (*configv1.Infrastructure, *configv1.Net return infra, network, proxy, nil } +func (optr *Operator) setEtcdOperatorImage(imgs *Images) error { + if optr.etcdLister == nil { + // if the resource is not found, i.e. it is not created by CVO + // which means cluster-etcd-operator images is not part of CVO + imgs.ControllerConfigImages.ClusterEtcdOperator = "" + glog.V(4).Info("etcd cr not found") + return nil + } + etcd, err := optr.etcdLister.Get("cluster") + if err != nil { + if apierrors.IsNotFound(err) { + imgs.ControllerConfigImages.ClusterEtcdOperator = "" + return nil + } + imgs.ControllerConfigImages.ClusterEtcdOperator = "" + return fmt.Errorf("error getting etcd CR: %#v", err) + } + + if etcd.Spec.ManagementState == operatorv1.Unmanaged { + glog.V(4).Info("etcd cluster in unmanaged") + imgs.ControllerConfigImages.ClusterEtcdOperator = "" + return nil + } + return nil +} + func getRenderConfig(tnamespace, kubeAPIServerServingCA string, ccSpec *mcfgv1.ControllerConfigSpec, imgs *RenderConfigImages, apiServerURL string) *renderConfig { return &renderConfig{ TargetNamespace: tnamespace, From bfe5af796ecbe2269df880b8b023bae0d0a14537 Mon Sep 17 00:00:00 2001 From: Alay Patel Date: Sat, 11 Jan 2020 01:30:15 +0530 Subject: [PATCH 3/6] controller_context.go: terminate MCO pod for transient apiserver errors --- pkg/controller/common/controller_context.go | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/pkg/controller/common/controller_context.go b/pkg/controller/common/controller_context.go index 3a52af1ec6..521d4dda16 100644 --- a/pkg/controller/common/controller_context.go +++ b/pkg/controller/common/controller_context.go @@ -89,7 +89,12 @@ func CreateControllerContext(cb *clients.Builder, stop <-chan struct{}, targetNa configSharedInformer := configinformers.NewSharedInformerFactory(configClient, resyncPeriod()()) operatorSharedInformer := operatorinformers.NewSharedInformerFactory(operatorClient, resyncPeriod()()) - etcdInformer := getEtcdInformer(operatorClient, operatorSharedInformer) + etcdInformer, err := getEtcdInformer(operatorClient, operatorSharedInformer) + if err != nil { + // MCO pod needs to restart for transient apiserver errors + glog.Errorf("unable to query discovery API %#v", err) + WriteTerminationError(err) + } return &ControllerContext{ ClientBuilder: cb, @@ -109,17 +114,17 @@ func CreateControllerContext(cb *clients.Builder, stop <-chan struct{}, targetNa } } -func getEtcdInformer(operatorClient operatorclientset.Interface, operatorSharedInformer operatorinformers.SharedInformerFactory) operatorv1.EtcdInformer { +func getEtcdInformer(operatorClient operatorclientset.Interface, operatorSharedInformer operatorinformers.SharedInformerFactory) (operatorv1.EtcdInformer, error) { operatorGroups, err := operatorClient.Discovery().ServerResourcesForGroupVersion("operator.openshift.io/v1") if err != nil { glog.Errorf("unable to get operatorGroups: %#v", err) - return nil + return nil, err } for _, o := range operatorGroups.APIResources { if o.Kind == "Etcd" { - return operatorSharedInformer.Operator().V1().Etcds() + return operatorSharedInformer.Operator().V1().Etcds(), nil } } - return nil + return nil, nil } From 5a585cafc36093d31569654c8cc0b4544cffe64f Mon Sep 17 00:00:00 2001 From: Alay Patel Date: Sun, 19 Jan 2020 08:13:30 -0500 Subject: [PATCH 4/6] *: undo the change to controller_context EtcdInformer is only used by the MCO pod to reconcile image names. This pulls out the logic of creating etcd informer from the generic controller context to MCO pod start method. --- cmd/machine-config-operator/start.go | 28 ++++++++++++++++++++- pkg/controller/common/controller_context.go | 26 ------------------- 2 files changed, 27 insertions(+), 27 deletions(-) diff --git a/cmd/machine-config-operator/start.go b/cmd/machine-config-operator/start.go index 249cba516a..3bf6fd13e9 100644 --- a/cmd/machine-config-operator/start.go +++ b/cmd/machine-config-operator/start.go @@ -5,6 +5,9 @@ import ( "flag" "github.com/golang/glog" + operatorclientset "github.com/openshift/client-go/operator/clientset/versioned" + operatorinformers "github.com/openshift/client-go/operator/informers/externalversions" + operatorv1 "github.com/openshift/client-go/operator/informers/externalversions/operator/v1" "github.com/openshift/machine-config-operator/cmd/common" "github.com/openshift/machine-config-operator/internal/clients" controllercommon "github.com/openshift/machine-config-operator/pkg/controller/common" @@ -51,6 +54,14 @@ func runStartCmd(cmd *cobra.Command, args []string) { } run := func(ctx context.Context) { ctrlctx := controllercommon.CreateControllerContext(cb, ctx.Done(), componentNamespace) + operatorClient := cb.OperatorClientOrDie("operator-shared-informer") + + etcdInformer, err := getEtcdInformer(operatorClient, ctrlctx.OperatorInformerFactory) + if err != nil { + // MCO pod needs to restart for transient apiserver errors + glog.Errorf("unable to query discovery API %#v", err) + controllercommon.WriteTerminationError(err) + } controller := operator.New( componentNamespace, componentName, @@ -74,7 +85,7 @@ func runStartCmd(cmd *cobra.Command, args []string) { ctrlctx.ClientBuilder.APIExtClientOrDie(componentName), ctrlctx.ClientBuilder.ConfigClientOrDie(componentName), ctrlctx.OpenShiftKubeAPIServerKubeNamespacedInformerFactory.Core().V1().ConfigMaps(), - ctrlctx.EtcdInformer, + etcdInformer, ) ctrlctx.NamespacedInformerFactory.Start(ctrlctx.Stop) @@ -105,3 +116,18 @@ func runStartCmd(cmd *cobra.Command, args []string) { }) panic("unreachable") } + +func getEtcdInformer(operatorClient operatorclientset.Interface, operatorSharedInformer operatorinformers.SharedInformerFactory) (operatorv1.EtcdInformer, error) { + operatorGroups, err := operatorClient.Discovery().ServerResourcesForGroupVersion("operator.openshift.io/v1") + if err != nil { + glog.Errorf("unable to get operatorGroups: %#v", err) + return nil, err + } + + for _, o := range operatorGroups.APIResources { + if o.Kind == "Etcd" { + return operatorSharedInformer.Operator().V1().Etcds(), nil + } + } + return nil, nil +} diff --git a/pkg/controller/common/controller_context.go b/pkg/controller/common/controller_context.go index 521d4dda16..74d6a28f81 100644 --- a/pkg/controller/common/controller_context.go +++ b/pkg/controller/common/controller_context.go @@ -6,9 +6,7 @@ import ( "github.com/golang/glog" configinformers "github.com/openshift/client-go/config/informers/externalversions" - operatorclientset "github.com/openshift/client-go/operator/clientset/versioned" operatorinformers "github.com/openshift/client-go/operator/informers/externalversions" - operatorv1 "github.com/openshift/client-go/operator/informers/externalversions/operator/v1" "github.com/openshift/machine-config-operator/internal/clients" daemonconsts "github.com/openshift/machine-config-operator/pkg/daemon/constants" mcfginformers "github.com/openshift/machine-config-operator/pkg/generated/informers/externalversions" @@ -44,7 +42,6 @@ type ControllerContext struct { APIExtInformerFactory apiextinformers.SharedInformerFactory ConfigInformerFactory configinformers.SharedInformerFactory OperatorInformerFactory operatorinformers.SharedInformerFactory - EtcdInformer operatorv1.EtcdInformer AvailableResources map[schema.GroupVersionResource]bool @@ -89,13 +86,6 @@ func CreateControllerContext(cb *clients.Builder, stop <-chan struct{}, targetNa configSharedInformer := configinformers.NewSharedInformerFactory(configClient, resyncPeriod()()) operatorSharedInformer := operatorinformers.NewSharedInformerFactory(operatorClient, resyncPeriod()()) - etcdInformer, err := getEtcdInformer(operatorClient, operatorSharedInformer) - if err != nil { - // MCO pod needs to restart for transient apiserver errors - glog.Errorf("unable to query discovery API %#v", err) - WriteTerminationError(err) - } - return &ControllerContext{ ClientBuilder: cb, NamespacedInformerFactory: sharedNamespacedInformers, @@ -107,24 +97,8 @@ func CreateControllerContext(cb *clients.Builder, stop <-chan struct{}, targetNa APIExtInformerFactory: apiExtSharedInformer, ConfigInformerFactory: configSharedInformer, OperatorInformerFactory: operatorSharedInformer, - EtcdInformer: etcdInformer, Stop: stop, InformersStarted: make(chan struct{}), ResyncPeriod: resyncPeriod(), } } - -func getEtcdInformer(operatorClient operatorclientset.Interface, operatorSharedInformer operatorinformers.SharedInformerFactory) (operatorv1.EtcdInformer, error) { - operatorGroups, err := operatorClient.Discovery().ServerResourcesForGroupVersion("operator.openshift.io/v1") - if err != nil { - glog.Errorf("unable to get operatorGroups: %#v", err) - return nil, err - } - - for _, o := range operatorGroups.APIResources { - if o.Kind == "Etcd" { - return operatorSharedInformer.Operator().V1().Etcds(), nil - } - } - return nil, nil -} From 523f153716efebf7509835661ab4bb1861e826f0 Mon Sep 17 00:00:00 2001 From: Sam Batschelet Date: Mon, 9 Dec 2019 20:02:56 -0500 Subject: [PATCH 5/6] templates: add wait-for-kube Signed-off-by: Sam Batschelet --- .../files/etc-kubernetes-manifests-etcd-member.yaml | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/templates/master/00-master/_base/files/etc-kubernetes-manifests-etcd-member.yaml b/templates/master/00-master/_base/files/etc-kubernetes-manifests-etcd-member.yaml index a57975070e..39c6e9b6e8 100644 --- a/templates/master/00-master/_base/files/etc-kubernetes-manifests-etcd-member.yaml +++ b/templates/master/00-master/_base/files/etc-kubernetes-manifests-etcd-member.yaml @@ -12,6 +12,18 @@ contents: k8s-app: etcd spec: initContainers: + {{if .Images.clusterEtcdOperatorImageKey}} + - name: wait-for-kube + image: "{{.Images.clusterEtcdOperatorImageKey}}" + command: ["/usr/bin/cluster-etcd-operator"] + args: + - "wait-for-kube" + securityContext: + privileged: true + volumeMounts: + - name: sa + mountPath: /var/run/secrets/kubernetes.io/serviceaccount/ + {{end}} - name: discovery image: "{{.Images.setupEtcdEnvKey}}" command: ["/usr/bin/setup-etcd-environment"] From f097d9802b437e7a121a0ee7a271064f30c32a1a Mon Sep 17 00:00:00 2001 From: Alay Patel Date: Fri, 24 Jan 2020 14:49:00 -0500 Subject: [PATCH 6/6] setup-etcd-environment/run.go: fix upgrade path On an upgrade from a 4.3 cluster to a cluster-etcd-operator enabled cluster discovery fails because the expected operator environment is not getting created. --- cmd/setup-etcd-environment/run.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/cmd/setup-etcd-environment/run.go b/cmd/setup-etcd-environment/run.go index 31128c1651..f8c82ac89b 100644 --- a/cmd/setup-etcd-environment/run.go +++ b/cmd/setup-etcd-environment/run.go @@ -193,7 +193,9 @@ func runRunCmd(cmd *cobra.Command, args []string) error { func (s *SetupEnv) getExportEnv() (map[string]string, error) { // if etcd is managed by the operator populate ENV from configmap - if s.isEtcdScaling() { + // TODO: alaypatel07/hexfusion figure out a better way of implementing isScaling + // if s.isEtcdScaling() { + if inCluster() && !s.opts.bootstrapSRV { return s.getOperatorEnv() } // initialize envs used to bootstrap etcd using SRV discovery or disaster recovery. @@ -315,6 +317,7 @@ func (s *SetupEnv) getBootstrapEnv() (map[string]string, error) { // `cluster-etcd-operator` and returns true if yes. If false we can conclude that the member is already // part of the cluster or we have/are bootstrapping etcd using SRV discovery. func (s *SetupEnv) isEtcdScaling() bool { + // TODO: reimplement me! if _, err := os.Stat(fmt.Sprintf("%s/member", s.etcdDataDir)); os.IsNotExist(err) && !s.opts.bootstrapSRV && inCluster() { return true } @@ -339,6 +342,7 @@ func (s *SetupEnv) setClient() error { return fmt.Errorf("error creating client: %v", err) } s.Client = client + return nil } glog.Infof("no client set") return nil