diff --git a/Dockerfile b/Dockerfile index 37081217965a8e9c8db6db06e70abb2f2be32681..d8d5b6e68fa003ea0f01e0baa28486b83a10cbc2 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM golang:1.11.4 as builder +FROM golang:1.14.3-stretch as builder WORKDIR / RUN apt-get update && apt-get install unzip RUN wget https://github.com/protocolbuffers/protobuf/releases/download/v3.6.1/protoc-3.6.1-linux-x86_64.zip diff --git a/pkg/service/v1/config-service.go b/pkg/service/v1/config-service.go index 7f9689587fcece68dfdb812965379de11c172369..25747d95b9c83c5ac1c6e3c99a34e484abbe29af 100644 --- a/pkg/service/v1/config-service.go +++ b/pkg/service/v1/config-service.go @@ -184,7 +184,7 @@ func (s *configServiceServer) CreateOrReplace(ctx context.Context, req *v1.Insta } //check if configmap already exists - _, err = s.kubeAPI.CoreV1().ConfigMaps(depl.Namespace).Get(depl.Uid, metav1.GetOptions{}) + _, err = s.kubeAPI.CoreV1().ConfigMaps(depl.Namespace).Get(depl.Uid, metav1.GetOptions{}) if err != nil { //Not exists, we create new _, err = s.kubeAPI.CoreV1().ConfigMaps(depl.Namespace).Create(&cm) @@ -414,16 +414,25 @@ func (s *readinessServiceServer) CheckIfReady(ctx context.Context, req *v1.Insta return prepareResponse(v1.Status_FAILED, namespaceNotFound), err } - app, err := s.kubeAPI.ExtensionsV1beta1().Deployments(depl.Namespace).Get(depl.Uid, metav1.GetOptions{}) - if err != nil { - return prepareResponse(v1.Status_FAILED, "Deployment not found!"), err - } - - if *app.Spec.Replicas == app.Status.ReadyReplicas { - return prepareResponse(v1.Status_OK, "Deployment is ready"), nil + //looking for deployment and checking its status + dep, err := s.kubeAPI.ExtensionsV1beta1().Deployments(depl.Namespace).Get(depl.Uid, metav1.GetOptions{}) + if err == nil { + if *dep.Spec.Replicas == dep.Status.ReadyReplicas { + return prepareResponse(v1.Status_OK, "Deployment is ready"), nil + } + return prepareResponse(v1.Status_PENDING, "Waiting for deployment"), err + } else { + //deployment not found, looking for statefulset and checking its status + sts, err2 := s.kubeAPI.AppsV1().StatefulSets(depl.Namespace).Get(depl.Uid, metav1.GetOptions{}) + if err2 == nil { + if *sts.Spec.Replicas == sts.Status.ReadyReplicas { + return prepareResponse(v1.Status_OK, "StatefulSet is ready"), nil + } + return prepareResponse(v1.Status_PENDING, "Waiting for deployment"), err + } } - return prepareResponse(v1.Status_PENDING, "Waiting for deployment"), err + return prepareResponse(v1.Status_FAILED, "Neither Deployment nor StatefulSet found!"), err } func (s *informationServiceServer) RetrieveServiceIp(ctx context.Context, req *v1.InstanceRequest) (*v1.InfoServiceResponse, error) { diff --git a/pkg/service/v1/config-service_test.go b/pkg/service/v1/config-service_test.go index 4ed3c31a66d851ab84c9649ec9a60ebe91bc0f6c..d536e353f034ee82c4aef2e34caefe0d058e97a8 100644 --- a/pkg/service/v1/config-service_test.go +++ b/pkg/service/v1/config-service_test.go @@ -6,6 +6,7 @@ import ( "github.com/xanzy/go-gitlab" extension "k8s.io/api/extensions/v1beta1" corev1 "k8s.io/api/core/v1" + appsv1 "k8s.io/api/apps/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "testing" testclient "k8s.io/client-go/kubernetes/fake" @@ -84,6 +85,48 @@ func TestReadinessServiceServer_CheckIfReady(t *testing.T) { } } +func TestReadinessServiceServer_CheckIfReadyWithStatefulSet(t *testing.T) { + client := testclient.NewSimpleClientset() + server := NewReadinessServiceServer(client) + + //Fail on API version check + res, err := server.CheckIfReady(context.Background(), &illegal_req) + if err == nil || res != nil { + t.Fail() + } + + //Fail on namespace check + freq := v1.InstanceRequest{Api:apiVersion, Deployment:&fake_ns_inst} + res, err = server.CheckIfReady(context.Background(), &freq) + if err == nil || res.Status != v1.Status_FAILED { + t.Fail() + } + + //create mock namespace + ns := corev1.Namespace{} + ns.Name = "test-namespace" + _, _ = client.CoreV1().Namespaces().Create(&ns) + + //Fail on missing deployment + res, err = server.CheckIfReady(context.Background(), &req) + if err == nil || res.Status != v1.Status_FAILED { + t.Fail() + } + + //create mock statefulset that is fully deployed + sts := appsv1.StatefulSet{} + sts.Name = "test-uid" + q := int32(5) + sts.Spec.Replicas = &q + sts.Status.ReadyReplicas = q + _, _ = client.AppsV1().StatefulSets("test-namespace").Create(&sts) + + res, err = server.CheckIfReady(context.Background(), &req) + if err != nil || res.Status != v1.Status_OK { + t.Fail() + } +} + func TestInformationServiceServer_RetrieveServiceIp(t *testing.T) { client := testclient.NewSimpleClientset() server := NewInformationServiceServer(client)