diff --git a/deployment/caodeploy/deployer.go b/deployment/caodeploy/deployer.go index 237ae8e..3ccbd11 100644 --- a/deployment/caodeploy/deployer.go +++ b/deployment/caodeploy/deployer.go @@ -249,11 +249,18 @@ func (d *Deployer) NewCluster(ctx context.Context, def *clusterdef.Cluster) (dep if err != nil { d.logger.Info("no cng service detected") } else { + d.logger.Info("cng service detected, waiting for endpoints to be available") + + err := d.client.WaitServiceHasEndpoints(ctx, namespace, cngServiceName) + if err != nil { + return nil, errors.Wrap(err, "failed to wait for cng service to have endpoints") + } + hasCng = true } if hasCng { - d.logger.Info("cng service detected, creating NodePort service") + d.logger.Info("creating cbdc cng NodePort service") err = d.client.CreateCbdcCngService(ctx, namespace, CouchbaseClusterName) if err != nil { return nil, errors.Wrap(err, "failed to create dino cng service") @@ -261,8 +268,10 @@ func (d *Deployer) NewCluster(ctx context.Context, def *clusterdef.Cluster) (dep } if def.Cao.UseIngress { + d.logger.Info("ingresses enabled") + if isOpenShift { - d.logger.Info("cng service detected, creating ui route") + d.logger.Info("creating ui route") // this must be a short name or we hit dns name length limits err = d.client.CreateRoute(ctx, namespace, "ui", map[string]interface{}{ @@ -282,7 +291,7 @@ func (d *Deployer) NewCluster(ctx context.Context, def *clusterdef.Cluster) (dep } if hasCng { - d.logger.Info("cng service detected, creating cng route") + d.logger.Info("creating cng route") // this must be a short name or we hit dns name length limits err = d.client.CreateRoute(ctx, namespace, "cng", map[string]interface{}{ diff --git a/utils/caocontrol/controller.go b/utils/caocontrol/controller.go index 723de13..84a8078 100644 --- a/utils/caocontrol/controller.go +++ b/utils/caocontrol/controller.go @@ -969,3 +969,37 @@ func (c *Controller) GetService( return service, nil } + +func (c *Controller) WaitServiceHasEndpoints( + ctx context.Context, + namespace string, + name string, +) error { + kubes, err := kubernetes.NewForConfig(c.restConfig) + if err != nil { + return errors.Wrap(err, "failed to create kubernetes client") + } + + err = waitForFunc(ctx, func(ctx context.Context) (bool, error) { + endpoint, err := kubes.CoreV1().Endpoints(namespace).Get(ctx, name, metav1.GetOptions{}) + if err != nil { + return false, errors.Wrap(err, "failed to get endpoints resource") + } + + numEndpoints := 0 + for _, subset := range endpoint.Subsets { + numEndpoints += len(subset.Addresses) + } + + if numEndpoints == 0 { + return false, nil + } + + return true, nil + }, 10*time.Minute) + if err != nil { + return errors.Wrap(err, "failed to wait for couchbase cluster") + } + + return nil +}