From b258fbbbe6bf9d05f1eab5bce1994f9366d34471 Mon Sep 17 00:00:00 2001 From: "Alex T. Iannicelli" Date: Sun, 9 Jun 2019 20:25:59 -0400 Subject: [PATCH 1/5] Add Curl Image parameter --- pkg/apis/etcd/v1beta2/cluster.go | 7 ++++++- pkg/util/k8sutil/k8sutil.go | 12 +++++++++++- pkg/util/k8sutil/k8sutils_test.go | 28 ++++++++++++++++++++++++++++ 3 files changed, 45 insertions(+), 2 deletions(-) diff --git a/pkg/apis/etcd/v1beta2/cluster.go b/pkg/apis/etcd/v1beta2/cluster.go index 889534b6b..45d232b02 100644 --- a/pkg/apis/etcd/v1beta2/cluster.go +++ b/pkg/apis/etcd/v1beta2/cluster.go @@ -18,7 +18,7 @@ import ( "errors" "strings" - "k8s.io/api/core/v1" + v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) @@ -162,6 +162,11 @@ type PodPolicy struct { // '.cluster.local'. // The default is to not set a cluster domain explicitly. ClusterDomain string `json:"ClusterDomain"` + + // curl init container image. default is tutum/curl. + // pulling tutum/curl:latest requires external access. + // More info: https://github.com/coreos/etcd-operator/issues/1933 + CurlImage string `json:"curlImage,omitempty"` } // TODO: move this to initializer diff --git a/pkg/util/k8sutil/k8sutil.go b/pkg/util/k8sutil/k8sutil.go index 8db36f18a..5ae8dff33 100644 --- a/pkg/util/k8sutil/k8sutil.go +++ b/pkg/util/k8sutil/k8sutil.go @@ -63,6 +63,7 @@ const ( MaxNameLength = 63 - randomSuffixLength - 1 defaultBusyboxImage = "busybox:1.28.0-glibc" + defaultCurlImage = "tutum/curl:latest" // AnnotationScope annotation name for defining instance scope. Used for specifying cluster wide clusters. AnnotationScope = "etcd.database.coreos.com/scope" @@ -104,7 +105,8 @@ func makeRestoreInitContainers(backupURL *url.URL, token, repo, version string, return []v1.Container{ { Name: "fetch-backup", - Image: "tutum/curl", + //Image default: "tutum/curl:latest", + Image: imageNameCurl(cs.Pod), Command: []string{ "/bin/bash", "-ec", fmt.Sprintf(` @@ -147,6 +149,14 @@ func imageNameBusybox(policy *api.PodPolicy) string { return defaultBusyboxImage } +// imageNameCurl returns the default image for curl init container, or the image specified in the PodPolicy +func imageNameCurl(policy *api.PodPolicy) string { + if policy != nil && len(policy.CurlImage) > 0 { + return policy.CurlImage + } + return defaultCurlImage +} + func PodWithNodeSelector(p *v1.Pod, ns map[string]string) *v1.Pod { p.Spec.NodeSelector = ns return p diff --git a/pkg/util/k8sutil/k8sutils_test.go b/pkg/util/k8sutil/k8sutils_test.go index cce491401..4983d0200 100644 --- a/pkg/util/k8sutil/k8sutils_test.go +++ b/pkg/util/k8sutil/k8sutils_test.go @@ -47,3 +47,31 @@ func TestSetBusyboxImageName(t *testing.T) { t.Errorf("expect image=%s, get=%s", expected, image) } } + +func TestDefaultCurlImageName(t *testing.T) { + policy := &api.PodPolicy{} + image := imageNameCurl(policy) + expected := defaultCurlImage + if image != expected { + t.Errorf("expect image=%s, get=%s", expected, image) + } +} + +func TestDefaultNilCurlImageName(t *testing.T) { + image := imageNameCurl(nil) + expected := defaultCurlImage + if image != expected { + t.Errorf("expect image=%s, get=%s", expected, image) + } +} + +func TestSetBusyboxImageName(t *testing.T) { + policy := &api.PodPolicy{ + CurlImage: "myRepo/curl:1.3.2", + } + image := imageNameCurl(policy) + expected := "myRepo/curl:1.3.2" + if image != expected { + t.Errorf("expect image=%s, get=%s", expected, image) + } +} From 4c287255e6ba6d686226c567894c571c4c7da0b5 Mon Sep 17 00:00:00 2001 From: "Alex T. Iannicelli" Date: Sun, 9 Jun 2019 20:25:59 -0400 Subject: [PATCH 2/5] cluster: add option to specify curl image add an option in EtcdCluster.spec: CurlImage. Defaults to "tutum/curl:latest" --- pkg/apis/etcd/v1beta2/cluster.go | 7 ++++++- pkg/util/k8sutil/k8sutil.go | 12 +++++++++++- pkg/util/k8sutil/k8sutils_test.go | 28 ++++++++++++++++++++++++++++ 3 files changed, 45 insertions(+), 2 deletions(-) diff --git a/pkg/apis/etcd/v1beta2/cluster.go b/pkg/apis/etcd/v1beta2/cluster.go index 889534b6b..45d232b02 100644 --- a/pkg/apis/etcd/v1beta2/cluster.go +++ b/pkg/apis/etcd/v1beta2/cluster.go @@ -18,7 +18,7 @@ import ( "errors" "strings" - "k8s.io/api/core/v1" + v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) @@ -162,6 +162,11 @@ type PodPolicy struct { // '.cluster.local'. // The default is to not set a cluster domain explicitly. ClusterDomain string `json:"ClusterDomain"` + + // curl init container image. default is tutum/curl. + // pulling tutum/curl:latest requires external access. + // More info: https://github.com/coreos/etcd-operator/issues/1933 + CurlImage string `json:"curlImage,omitempty"` } // TODO: move this to initializer diff --git a/pkg/util/k8sutil/k8sutil.go b/pkg/util/k8sutil/k8sutil.go index 8db36f18a..5ae8dff33 100644 --- a/pkg/util/k8sutil/k8sutil.go +++ b/pkg/util/k8sutil/k8sutil.go @@ -63,6 +63,7 @@ const ( MaxNameLength = 63 - randomSuffixLength - 1 defaultBusyboxImage = "busybox:1.28.0-glibc" + defaultCurlImage = "tutum/curl:latest" // AnnotationScope annotation name for defining instance scope. Used for specifying cluster wide clusters. AnnotationScope = "etcd.database.coreos.com/scope" @@ -104,7 +105,8 @@ func makeRestoreInitContainers(backupURL *url.URL, token, repo, version string, return []v1.Container{ { Name: "fetch-backup", - Image: "tutum/curl", + //Image default: "tutum/curl:latest", + Image: imageNameCurl(cs.Pod), Command: []string{ "/bin/bash", "-ec", fmt.Sprintf(` @@ -147,6 +149,14 @@ func imageNameBusybox(policy *api.PodPolicy) string { return defaultBusyboxImage } +// imageNameCurl returns the default image for curl init container, or the image specified in the PodPolicy +func imageNameCurl(policy *api.PodPolicy) string { + if policy != nil && len(policy.CurlImage) > 0 { + return policy.CurlImage + } + return defaultCurlImage +} + func PodWithNodeSelector(p *v1.Pod, ns map[string]string) *v1.Pod { p.Spec.NodeSelector = ns return p diff --git a/pkg/util/k8sutil/k8sutils_test.go b/pkg/util/k8sutil/k8sutils_test.go index cce491401..4983d0200 100644 --- a/pkg/util/k8sutil/k8sutils_test.go +++ b/pkg/util/k8sutil/k8sutils_test.go @@ -47,3 +47,31 @@ func TestSetBusyboxImageName(t *testing.T) { t.Errorf("expect image=%s, get=%s", expected, image) } } + +func TestDefaultCurlImageName(t *testing.T) { + policy := &api.PodPolicy{} + image := imageNameCurl(policy) + expected := defaultCurlImage + if image != expected { + t.Errorf("expect image=%s, get=%s", expected, image) + } +} + +func TestDefaultNilCurlImageName(t *testing.T) { + image := imageNameCurl(nil) + expected := defaultCurlImage + if image != expected { + t.Errorf("expect image=%s, get=%s", expected, image) + } +} + +func TestSetBusyboxImageName(t *testing.T) { + policy := &api.PodPolicy{ + CurlImage: "myRepo/curl:1.3.2", + } + image := imageNameCurl(policy) + expected := "myRepo/curl:1.3.2" + if image != expected { + t.Errorf("expect image=%s, get=%s", expected, image) + } +} From dc40303cbf3781e56edf66b668b62fb3c0ff21e8 Mon Sep 17 00:00:00 2001 From: "Alex T. Iannicelli" Date: Wed, 12 Jun 2019 13:17:44 -0400 Subject: [PATCH 3/5] small fix to pass tests. --- pkg/util/k8sutil/k8sutil.go | 2 +- pkg/util/k8sutil/k8sutils_test.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/util/k8sutil/k8sutil.go b/pkg/util/k8sutil/k8sutil.go index 5ae8dff33..add7afa1a 100644 --- a/pkg/util/k8sutil/k8sutil.go +++ b/pkg/util/k8sutil/k8sutil.go @@ -106,7 +106,7 @@ func makeRestoreInitContainers(backupURL *url.URL, token, repo, version string, { Name: "fetch-backup", //Image default: "tutum/curl:latest", - Image: imageNameCurl(cs.Pod), + Image: imageNameCurl(podPolicy), Command: []string{ "/bin/bash", "-ec", fmt.Sprintf(` diff --git a/pkg/util/k8sutil/k8sutils_test.go b/pkg/util/k8sutil/k8sutils_test.go index 4983d0200..54edd765c 100644 --- a/pkg/util/k8sutil/k8sutils_test.go +++ b/pkg/util/k8sutil/k8sutils_test.go @@ -65,7 +65,7 @@ func TestDefaultNilCurlImageName(t *testing.T) { } } -func TestSetBusyboxImageName(t *testing.T) { +func TestSetCurlImageName(t *testing.T) { policy := &api.PodPolicy{ CurlImage: "myRepo/curl:1.3.2", } From ed031093f6491f8406678ff9ca46a94ffc164455 Mon Sep 17 00:00:00 2001 From: "Alex T. Iannicelli" Date: Fri, 14 Jun 2019 12:26:22 -0400 Subject: [PATCH 4/5] add pod policy to call to makeRestoreInitContainers --- pkg/util/k8sutil/k8sutil.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/util/k8sutil/k8sutil.go b/pkg/util/k8sutil/k8sutil.go index add7afa1a..2fb70a3b1 100644 --- a/pkg/util/k8sutil/k8sutil.go +++ b/pkg/util/k8sutil/k8sutil.go @@ -101,7 +101,7 @@ func PVCNameFromMember(memberName string) string { return memberName } -func makeRestoreInitContainers(backupURL *url.URL, token, repo, version string, m *etcdutil.Member) []v1.Container { +func makeRestoreInitContainers(backupURL *url.URL, token, repo, version string, m *etcdutil.Member, podPolicy *api.PodPolicy) []v1.Container { return []v1.Container{ { Name: "fetch-backup", @@ -271,7 +271,7 @@ func AddEtcdVolumeToPod(pod *v1.Pod, pvc *v1.PersistentVolumeClaim) { func addRecoveryToPod(pod *v1.Pod, token string, m *etcdutil.Member, cs api.ClusterSpec, backupURL *url.URL) { pod.Spec.InitContainers = append(pod.Spec.InitContainers, - makeRestoreInitContainers(backupURL, token, cs.Repository, cs.Version, m)...) + makeRestoreInitContainers(backupURL, token, cs.Repository, cs.Version, m, cs.Pod)...) } func addOwnerRefToObject(o metav1.Object, r metav1.OwnerReference) { From 1dfe75b10b79cacef68efd0f643fb230984dad19 Mon Sep 17 00:00:00 2001 From: atiannicelli Date: Fri, 12 Jul 2019 16:09:06 -0400 Subject: [PATCH 5/5] Fixing formatting issues seem during testing. --- pkg/util/k8sutil/k8sutil.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/util/k8sutil/k8sutil.go b/pkg/util/k8sutil/k8sutil.go index 2fb70a3b1..ee9a83318 100644 --- a/pkg/util/k8sutil/k8sutil.go +++ b/pkg/util/k8sutil/k8sutil.go @@ -63,7 +63,7 @@ const ( MaxNameLength = 63 - randomSuffixLength - 1 defaultBusyboxImage = "busybox:1.28.0-glibc" - defaultCurlImage = "tutum/curl:latest" + defaultCurlImage = "tutum/curl:latest" // AnnotationScope annotation name for defining instance scope. Used for specifying cluster wide clusters. AnnotationScope = "etcd.database.coreos.com/scope" @@ -104,7 +104,7 @@ func PVCNameFromMember(memberName string) string { func makeRestoreInitContainers(backupURL *url.URL, token, repo, version string, m *etcdutil.Member, podPolicy *api.PodPolicy) []v1.Container { return []v1.Container{ { - Name: "fetch-backup", + Name: "fetch-backup", //Image default: "tutum/curl:latest", Image: imageNameCurl(podPolicy), Command: []string{