iwanhae %!s(int64=2) %!d(string=hai) anos
pai
achega
0f0c8efd9c
Modificáronse 2 ficheiros con 44 adicións e 34 borrados
  1. 24 21
      controllers/bluegreen_controller.go
  2. 20 13
      controllers/bluegreen_controller_test.go

+ 24 - 21
controllers/bluegreen_controller.go

@@ -55,10 +55,7 @@ func (r *BlueGreenReconciler) Reconcile(ctx context.Context, req ctrl.Request) (
 	}
 
 	// Create or Update Service
-	svc := &corev1.Service{ObjectMeta: metav1.ObjectMeta{Namespace: req.Namespace, Name: req.Name}}
-	if _, err := ctrl.CreateOrUpdate(ctx, r.Client, svc,
-		r.mutateBlueGreenService(bluegreen, svc, req.Name, bluegreen.Spec.RouteTo),
-	); err != nil {
+	if err := r.CreateOrUpdateService(ctx, bluegreen); err != nil {
 		return ctrl.Result{}, err
 	}
 
@@ -107,23 +104,29 @@ func (r *BlueGreenReconciler) SetupWithManager(mgr ctrl.Manager) error {
 		Complete(r)
 }
 
-func deploymentName(name string, phase v1.BlueOrGreen) string {
-	return fmt.Sprintf("%s-%s", name, strings.ToLower(string(phase)))
+func (r *BlueGreenReconciler) CreateOrUpdateService(ctx context.Context, owner *v1.BlueGreen) error {
+	svc := &corev1.Service{ObjectMeta: metav1.ObjectMeta{Namespace: owner.Namespace, Name: owner.Name}}
+	if _, err := ctrl.CreateOrUpdate(ctx, r.Client, svc,
+		func() error {
+			if err := ctrl.SetControllerReference(owner, svc, r.Scheme); err != nil {
+				return err
+			}
+			svc.Spec.Ports = []corev1.ServicePort{
+				{Name: "http", Protocol: corev1.ProtocolTCP, Port: 80},
+			}
+			svc.Spec.Selector = map[string]string{
+				"app.kubernetes.io/managed-by": "app.demo.kakao.com",
+				"app.kubernetes.io/name":       owner.Name,
+				"app.kubernetes.io/phase":      string(owner.Spec.RouteTo),
+			}
+			return nil
+		},
+	); err != nil {
+		return err
+	}
+	return nil
 }
 
-func (r *BlueGreenReconciler) mutateBlueGreenService(owner metav1.Object, svc *corev1.Service, appName string, routeTo v1.BlueOrGreen) func() error {
-	return func() error {
-		if err := ctrl.SetControllerReference(owner, svc, r.Scheme); err != nil {
-			return err
-		}
-		svc.Spec.Ports = []corev1.ServicePort{
-			{Name: "http", Protocol: corev1.ProtocolTCP, Port: 80},
-		}
-		svc.Spec.Selector = map[string]string{
-			"app.kubernetes.io/managed-by": "app.demo.kakao.com",
-			"app.kubernetes.io/name":       appName,
-			"app.kubernetes.io/phase":      string(routeTo),
-		}
-		return nil
-	}
+func deploymentName(name string, phase v1.BlueOrGreen) string {
+	return fmt.Sprintf("%s-%s", name, strings.ToLower(string(phase)))
 }

+ 20 - 13
controllers/bluegreen_controller_test.go

@@ -17,14 +17,15 @@ limitations under the License.
 package controllers
 
 import (
+	"context"
 	"testing"
 
 	appv1 "github.com/kakao/bluegreen/api/v1"
-	v1 "github.com/kakao/bluegreen/api/v1"
 	"github.com/stretchr/testify/assert"
 	corev1 "k8s.io/api/core/v1"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/apimachinery/pkg/runtime"
+	"k8s.io/apimachinery/pkg/types"
 	utilruntime "k8s.io/apimachinery/pkg/util/runtime"
 	clientgoscheme "k8s.io/client-go/kubernetes/scheme"
 	"sigs.k8s.io/controller-runtime/pkg/client/fake"
@@ -39,25 +40,31 @@ func init() {
 	utilruntime.Must(appv1.AddToScheme(testScheme))
 }
 
-func TestBlueGreenReconciler_mutateBlueGreenService(t *testing.T) {
-	t.Run("Should add proper labels and OwnerReferences", func(t *testing.T) {
-		r := &BlueGreenReconciler{
-			Client: fake.NewClientBuilder().WithScheme(testScheme).WithRuntimeObjects().Build(),
-			Scheme: testScheme,
+func TestBlueGreenReconciler_CreateOrUpdateService(t *testing.T) {
+	t.Run("Should Create a New Service", func(t *testing.T) {
+		c := fake.NewClientBuilder().WithScheme(testScheme).Build()
+		r := &BlueGreenReconciler{Client: c, Scheme: c.Scheme()}
+		NN := types.NamespacedName{
+			Namespace: "test-namespace",
+			Name:      "test-name",
 		}
 
-		const Name = "bluegreen-test"
-		const Namespace = "test"
-		svc := &corev1.Service{ObjectMeta: metav1.ObjectMeta{Namespace: Namespace, Name: Name}}
-		err := r.mutateBlueGreenService(
-			&v1.BlueGreen{ObjectMeta: metav1.ObjectMeta{Namespace: Namespace, Name: Name, UID: "0000-0000"}},
-			svc, "test", appv1.Blue)()
+		svc := new(corev1.Service)
+		assert.Error(t, c.Get(context.TODO(), NN, svc))
+
+		err := r.CreateOrUpdateService(
+			context.TODO(),
+			&appv1.BlueGreen{
+				ObjectMeta: metav1.ObjectMeta{Namespace: NN.Namespace, Name: NN.Name},
+				Spec:       appv1.BlueGreenSpec{RouteTo: appv1.Blue},
+			})
 
 		assert.NoError(t, err)
+		assert.NoError(t, c.Get(context.TODO(), NN, svc))
 		assert.Equal(t, 1, len(svc.ObjectMeta.OwnerReferences))
 		assert.Equal(t, "app.demo.kakao.com", svc.Spec.Selector["app.kubernetes.io/managed-by"])
 		assert.Equal(t, "Blue", svc.Spec.Selector["app.kubernetes.io/phase"])
-		assert.Equal(t, "test", svc.Spec.Selector["app.kubernetes.io/name"])
+		assert.Equal(t, NN.Name, svc.Spec.Selector["app.kubernetes.io/name"])
 		/* more validation here */
 	})
 }