Skip to content

Commit cae0f6c

Browse files
committed
Adjusted OpenShift istio gateway usage to be per-cluster.
1 parent 1f728f2 commit cae0f6c

4 files changed

Lines changed: 91 additions & 57 deletions

File tree

clusterdef/cluster.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,8 @@ type CaoCluster struct {
7676

7777
GatewayLogLevel string `yaml:"gateway-log-level,omitempty"`
7878
GatewayOtlpEndpoint string `yaml:"gateway-otlp-endpoint,omitempty"`
79+
80+
Ingress string `yaml:"ingress,omitempty"`
7981
}
8082

8183
type CloudCluster struct {

cmd/ingresses-enable.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,16 @@ var ingressesEnableCmd = &cobra.Command{
1515
logger := helper.GetLogger()
1616
ctx := helper.GetContext()
1717

18+
ingressMode, _ := cmd.Flags().GetString("ingress")
19+
1820
_, deployer, cluster := helper.IdentifyCluster(ctx, args[0])
1921

2022
caoDeployer, ok := deployer.(*caodeploy.Deployer)
2123
if !ok {
2224
logger.Fatal("ingresses are only supported for cao deployer")
2325
}
2426

25-
err := caoDeployer.EnableIngresses(ctx, cluster.GetID())
27+
err := caoDeployer.EnableIngresses(ctx, cluster.GetID(), ingressMode)
2628
if err != nil {
2729
logger.Fatal("failed to enable ingresses", zap.Error(err))
2830
}
@@ -31,4 +33,5 @@ var ingressesEnableCmd = &cobra.Command{
3133

3234
func init() {
3335
ingressesCmd.AddCommand(ingressesEnableCmd)
36+
ingressesEnableCmd.Flags().String("ingress", "", "Ingress mode to use (route or gateway)")
3437
}

deployment/caodeploy/deployer.go

Lines changed: 67 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package caodeploy
33
import (
44
"context"
55
"fmt"
6+
"log"
67
"time"
78

89
"github.com/couchbase/gocbcorex"
@@ -442,7 +443,9 @@ func (d *Deployer) NewCluster(ctx context.Context, def *clusterdef.Cluster) (dep
442443
if isOpenShift {
443444
// In OpenShift, the only way to access the cluster is through a route, so we
444445
// set it up by default every time the cluster is allocated.
445-
err = d.EnableIngresses(ctx, clusterID.String())
446+
ingressMode := def.Cao.Ingress
447+
448+
err = d.EnableIngresses(ctx, clusterID.String(), ingressMode)
446449
if err != nil {
447450
return nil, errors.Wrap(err, "failed to enable ingresses")
448451
}
@@ -654,7 +657,7 @@ func (d *Deployer) enableIngressesViaVirtualService(ctx context.Context, cluster
654657
return nil
655658
}
656659

657-
func (d *Deployer) EnableIngresses(ctx context.Context, clusterID string) error {
660+
func (d *Deployer) EnableIngresses(ctx context.Context, clusterID string, ingressMode string) error {
658661
isOpenShift, err := d.client.IsOpenShift(ctx)
659662
if err != nil {
660663
return errors.Wrap(err, "failed to detect whether we are using openshift")
@@ -664,12 +667,20 @@ func (d *Deployer) EnableIngresses(ctx context.Context, clusterID string) error
664667
return errors.New("ingresses are currently only supported with openshift")
665668
}
666669

670+
if ingressMode == "" {
671+
ingressMode = "route"
672+
}
673+
674+
if ingressMode == "gateway" && d.sharedGateway == "" {
675+
return errors.New("ingress mode 'gateway' requires a shared gateway to be configured at init time")
676+
}
677+
667678
namespace, err := d.getClusterNamespace(ctx, clusterID)
668679
if err != nil {
669680
return err
670681
}
671682

672-
if d.sharedGateway != "" {
683+
if ingressMode == "gateway" {
673684
return d.enableIngressesViaVirtualService(ctx, clusterID, namespace)
674685
}
675686

@@ -735,39 +746,31 @@ func (d *Deployer) DisableIngresses(ctx context.Context, clusterID string) error
735746
return err
736747
}
737748

738-
if d.sharedGateway != "" {
739-
allDeletesFailed := true
740-
741-
err = d.client.DeleteVirtualService(ctx, namespace, "cng")
742-
if err != nil {
743-
d.logger.Debug("failed to delete cng virtual service", zap.Error(err))
744-
} else {
745-
allDeletesFailed = false
746-
}
747-
748-
err = d.client.DeleteVirtualService(ctx, namespace, "ui")
749-
if err != nil {
750-
d.logger.Debug("failed to delete ui virtual service", zap.Error(err))
751-
} else {
752-
allDeletesFailed = false
753-
}
754-
755-
err = d.client.DeleteDestinationRule(ctx, namespace, "cng-tls")
756-
if err != nil {
757-
d.logger.Debug("failed to delete cng destination rule", zap.Error(err))
758-
} else {
759-
allDeletesFailed = false
760-
}
749+
allDeletesFailed := true
761750

762-
if allDeletesFailed {
763-
return errors.New("virtual service deletions failed")
764-
}
751+
// Try deleting virtual service resources (gateway mode)
752+
err = d.client.DeleteVirtualService(ctx, namespace, "cng")
753+
if err != nil {
754+
d.logger.Debug("failed to delete cng virtual service", zap.Error(err))
755+
} else {
756+
allDeletesFailed = false
757+
}
765758

766-
return nil
759+
err = d.client.DeleteVirtualService(ctx, namespace, "ui")
760+
if err != nil {
761+
d.logger.Debug("failed to delete ui virtual service", zap.Error(err))
762+
} else {
763+
allDeletesFailed = false
767764
}
768765

769-
allDeletesFailed := true
766+
err = d.client.DeleteDestinationRule(ctx, namespace, "cng-tls")
767+
if err != nil {
768+
d.logger.Debug("failed to delete cng destination rule", zap.Error(err))
769+
} else {
770+
allDeletesFailed = false
771+
}
770772

773+
// Try deleting route resources (route mode)
771774
err = d.client.DeleteRoute(ctx, namespace, "ui")
772775
if err != nil {
773776
d.logger.Debug("failed to delete ui route", zap.Error(err))
@@ -783,7 +786,7 @@ func (d *Deployer) DisableIngresses(ctx context.Context, clusterID string) error
783786
}
784787

785788
if allDeletesFailed {
786-
return errors.New("route deletions failed")
789+
return errors.New("ingress deletions failed")
787790
}
788791

789792
return nil
@@ -878,24 +881,6 @@ func (d *Deployer) GetConnectInfo(ctx context.Context, clusterID string) (*deplo
878881
}
879882

880883
func (d *Deployer) GetIngressConnectInfo(ctx context.Context, clusterID string) (*deployment.ConnectInfo, error) {
881-
if d.sharedGateway != "" {
882-
baseDomain, err := d.getSharedGatewayBaseDomain(ctx)
883-
if err != nil {
884-
return nil, err
885-
}
886-
887-
cngHost := fmt.Sprintf("cng-%s.%s", clusterID, baseDomain)
888-
uiHost := fmt.Sprintf("ui-%s.%s", clusterID, baseDomain)
889-
890-
return &deployment.ConnectInfo{
891-
ConnStr: "",
892-
ConnStrTls: "",
893-
ConnStrCb2: fmt.Sprintf("couchbase2://%s:443", cngHost),
894-
Mgmt: "",
895-
MgmtTls: fmt.Sprintf("https://%s:443", uiHost),
896-
}, nil
897-
}
898-
899884
namespaceName, err := d.getClusterNamespace(ctx, clusterID)
900885
if err != nil {
901886
return nil, err
@@ -904,14 +889,40 @@ func (d *Deployer) GetIngressConnectInfo(ctx context.Context, clusterID string)
904889
var mgmtTlsAddr string
905890
var connstrCb2 string
906891

907-
uiHost, err := d.client.GetRouteHost(ctx, namespaceName, "ui")
908-
if err == nil {
909-
mgmtTlsAddr = fmt.Sprintf("https://%s:443", uiHost)
892+
// Try route mode first (default)
893+
if mgmtTlsAddr == "" {
894+
uiHost, err := d.client.GetRouteHost(ctx, namespaceName, "ui")
895+
log.Printf("uiHost: %s %+v", uiHost, err)
896+
if err == nil {
897+
mgmtTlsAddr = fmt.Sprintf("https://%s:443", uiHost)
898+
}
910899
}
911900

912-
cngHost, err := d.client.GetRouteHost(ctx, namespaceName, "cng")
913-
if err == nil {
914-
connstrCb2 = fmt.Sprintf("couchbase2://%s:443", cngHost)
901+
if connstrCb2 == "" {
902+
cngHost, err := d.client.GetRouteHost(ctx, namespaceName, "cng")
903+
log.Printf("cngHost: %s %+v", cngHost, err)
904+
if err == nil {
905+
connstrCb2 = fmt.Sprintf("couchbase2://%s:443", cngHost)
906+
}
907+
}
908+
909+
// if shared gateway is configured, check that too
910+
if d.sharedGateway != "" {
911+
baseDomain, err := d.getSharedGatewayBaseDomain(ctx)
912+
913+
if mgmtTlsAddr == "" {
914+
err = d.client.GetVirtualService(ctx, namespaceName, "ui")
915+
if err == nil {
916+
mgmtTlsAddr = fmt.Sprintf("https://ui-%s.%s:443", clusterID, baseDomain)
917+
}
918+
}
919+
920+
if connstrCb2 == "" {
921+
err = d.client.GetVirtualService(ctx, namespaceName, "cng")
922+
if err == nil {
923+
connstrCb2 = fmt.Sprintf("couchbase2://cng-%s.%s:443", clusterID, baseDomain)
924+
}
925+
}
915926
}
916927

917928
return &deployment.ConnectInfo{

utils/caocontrol/controller.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1274,6 +1274,24 @@ func (c *Controller) CreateVirtualService(ctx context.Context, namespace string,
12741274
return nil
12751275
}
12761276

1277+
func (c *Controller) GetVirtualService(ctx context.Context, namespace string, name string) error {
1278+
dyna, err := dynamic.NewForConfig(c.restConfig)
1279+
if err != nil {
1280+
return errors.Wrap(err, "failed to create dynamic client")
1281+
}
1282+
1283+
_, err = dyna.Resource(schema.GroupVersionResource{
1284+
Group: "networking.istio.io",
1285+
Version: "v1beta1",
1286+
Resource: "virtualservices",
1287+
}).Namespace(namespace).Get(ctx, name, metav1.GetOptions{})
1288+
if err != nil {
1289+
return errors.Wrap(err, "failed to get virtual service")
1290+
}
1291+
1292+
return nil
1293+
}
1294+
12771295
func (c *Controller) DeleteVirtualService(ctx context.Context, namespace string, name string) error {
12781296
c.logger.Info("deleting virtual service",
12791297
zap.String("namespace", namespace),

0 commit comments

Comments
 (0)