Skip to content

Commit

Permalink
cluster: remove operator sidecar limitation (#134)
Browse files Browse the repository at this point in the history
Fixes #134
  • Loading branch information
zimnx committed Nov 23, 2020
1 parent 2e74596 commit 8f0ee82
Show file tree
Hide file tree
Showing 2 changed files with 73 additions and 7 deletions.
25 changes: 18 additions & 7 deletions pkg/controllers/cluster/cluster_controller.go
Expand Up @@ -19,6 +19,7 @@ package cluster
import (
"context"
"reflect"
"strings"

"github.com/scylladb/go-log"
"github.com/scylladb/scylla-operator/pkg/cmd/options"
Expand Down Expand Up @@ -72,12 +73,17 @@ func New(ctx context.Context, mgr ctrl.Manager, logger log.Logger) (*ClusterReco
return nil, errors.Wrap(err, "get dynamic uncached client")
}

operatorImage, err := getOperatorImage(ctx, kubeClient)
if err != nil {
return nil, errors.Wrap(err, "get operator image")
}

return &ClusterReconciler{
Client: mgr.GetClient(),
UncachedClient: uncachedClient,
KubeClient: kubeClient,
Recorder: mgr.GetEventRecorderFor("scylla-cluster-controller"),
OperatorImage: getOperatorImage(ctx, kubeClient, logger),
OperatorImage: operatorImage,
Scheme: mgr.GetScheme(),
Logger: logger,
}, nil
Expand Down Expand Up @@ -203,19 +209,24 @@ func (r *ClusterReconciler) SetupWithManager(mgr ctrl.Manager) error {
return nil
}

func getOperatorImage(ctx context.Context, kubeClient kubernetes.Interface, l log.Logger) string {
func getOperatorImage(ctx context.Context, kubeClient kubernetes.Interface) (string, error) {
opts := options.GetOperatorOptions()
if opts.Image != "" {
return opts.Image
return opts.Image, nil
}

pod, err := kubeClient.CoreV1().Pods(opts.Namespace).Get(ctx, opts.Name, metav1.GetOptions{})
if err != nil {
l.Fatal(ctx, "Failed to get operator image", "error", err)
return "", errors.Wrap(err, "list pods")
}

if len(pod.Spec.Containers) != 1 {
l.Fatal(ctx, "Operator Pod must have exactly 1 container", "count", len(pod.Spec.Containers))
// Scylla Operator image must contain two words: "scylla" and "operator"
for _, c := range pod.Spec.Containers {
img := strings.ToLower(c.Image)
if strings.Contains(img, "scylla") && strings.Contains(img, "operator") {
return c.Image, nil
}
}
return pod.Spec.Containers[0].Image

return "", errors.New("cannot find scylla operator container in pod spec")
}
55 changes: 55 additions & 0 deletions pkg/controllers/cluster/cluster_controller_test.go
@@ -0,0 +1,55 @@
// Copyright (C) 2017 ScyllaDB

package cluster

import (
"context"

. "github.com/onsi/ginkgo"
. "github.com/onsi/ginkgo/extensions/table"
. "github.com/onsi/gomega"
"github.com/scylladb/scylla-operator/pkg/cmd/options"
corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
kubefake "k8s.io/client-go/kubernetes/fake"
)

var _ = Describe("Cluster controller", func() {

DescribeTable("Operator image", func(containerImages []string, expectedImage string) {
const (
namespace = "ns"
name = "name"
)
opts := options.GetOperatorOptions()
opts.Namespace = namespace
opts.Name = name

pod := &corev1.Pod{
ObjectMeta: metav1.ObjectMeta{
Namespace: namespace,
Name: name,
},
}
for _, ci := range containerImages {
pod.Spec.Containers = append(pod.Spec.Containers, corev1.Container{
Image: ci,
})
}

kubeClientFake := kubefake.NewSimpleClientset(pod)
image, err := getOperatorImage(context.Background(), kubeClientFake)
if expectedImage == "" {
Expect(err).To(HaveOccurred())
} else {
Expect(err).ToNot(HaveOccurred())
Expect(image).To(Equal(expectedImage))
}
},
Entry("single correct", []string{"scylladb/scylla-operator:0.3.0"}, "scylladb/scylla-operator:0.3.0"),
Entry("operator with sidecar", []string{"scylladb/scylla-operator:0.3.0", "random/sidecar:latest"}, "scylladb/scylla-operator:0.3.0"),
Entry("custom operator", []string{"random/my-scylla-operator:0.3.0"}, "random/my-scylla-operator:0.3.0"),
Entry("incorrect operator", []string{"random/my-operator:0.3.0"}, ""),
)

})

0 comments on commit 8f0ee82

Please sign in to comment.