Skip to content

Commit

Permalink
Add label-based discovery options to dashboard bootstrap
Browse files Browse the repository at this point in the history
Signed-off-by: Burak Sekili <buraksekili@gmail.com>
  • Loading branch information
buraksekili committed Oct 12, 2023
1 parent 0d1550d commit 7ee731b
Show file tree
Hide file tree
Showing 3 changed files with 97 additions and 8 deletions.
6 changes: 6 additions & 0 deletions constants/constants.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,4 +23,10 @@ const (
DashboardEnabledEnvVar = "DASHBOARD_ENABLED"
TykOrgNameEnvVar = "TYK_ORG_NAME"
TykOrgCnameEnvVar = "TYK_ORG_CNAME"
ReleaseNameEnvVar = "RELEASE_NAME"

TykBootstrapLabel = "tyk.tyk.io/k8s-bootstrap"
TykBootstrapDashboardDeployLabel = "tyk-dashboard"
TykBootstrapDashboardSvcLabel = "tyk-dashboard"
TykBootstrapReleaseLabel = "release"
)
50 changes: 49 additions & 1 deletion data/app.go
Original file line number Diff line number Diff line change
@@ -1,7 +1,12 @@
package data

import (
"context"
"fmt"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/labels"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/rest"
"os"
"strconv"
"tyk/tyk/bootstrap/constants"
Expand Down Expand Up @@ -34,6 +39,7 @@ type AppArguments struct {
GatewayAdress string
BootstrapPortal bool
DashboardDeploymentName string
ReleaseName string
}

var AppConfig = AppArguments{
Expand Down Expand Up @@ -89,7 +95,7 @@ func InitAppDataPostInstall() error {
AppConfig.TykAdminSecret = os.Getenv(constants.TykAdminSecretEnvVar)
AppConfig.CurrentOrgName = os.Getenv(constants.TykOrgNameEnvVar)
AppConfig.Cname = os.Getenv(constants.TykOrgCnameEnvVar)
AppConfig.DashboardUrl = GetDashboardUrl()
AppConfig.ReleaseName = os.Getenv(constants.ReleaseNameEnvVar)
dashEnabledRaw := os.Getenv(constants.DashboardEnabledEnvVar)
if dashEnabledRaw != "" {
AppConfig.IsDashboardEnabled, err = strconv.ParseBool(os.Getenv(constants.DashboardEnabledEnvVar))
Expand All @@ -98,6 +104,11 @@ func InitAppDataPostInstall() error {
}
}

if AppConfig.IsDashboardEnabled {
discoverDashboardSvc()
AppConfig.DashboardUrl = GetDashboardUrl()
}

operatorSecretEnabledRaw := os.Getenv(constants.OperatorSecretEnabledEnvVar)
if operatorSecretEnabledRaw != "" {
AppConfig.OperatorSecretEnabled, err = strconv.ParseBool(operatorSecretEnabledRaw)
Expand Down Expand Up @@ -137,6 +148,43 @@ func InitAppDataPostInstall() error {
return nil
}

func discoverDashboardSvc() error {
config, err := rest.InClusterConfig()
if err != nil {
return err
}

c, err := kubernetes.NewForConfig(config)
if err != nil {
return err
}

ls := metav1.LabelSelector{MatchLabels: map[string]string{
constants.TykBootstrapLabel: constants.TykBootstrapDashboardSvcLabel,
}}
if AppConfig.ReleaseName != "" {
ls.MatchLabels[constants.TykBootstrapReleaseLabel] = AppConfig.ReleaseName
}

services, err := c.
CoreV1().
Services(AppConfig.TykPodNamespace).
List(context.TODO(),
metav1.ListOptions{
LabelSelector: labels.Set(ls.MatchLabels).String(),
},
)
if err != nil {
return err
}

for _, service := range services.Items {
AppConfig.DashboardSvc = service.Name
}

return nil
}

func GetDashboardUrl() string {
return fmt.Sprintf("%s://%s.%s.svc.cluster.local:%d",
AppConfig.DashboardProto,
Expand Down
49 changes: 42 additions & 7 deletions helpers/portal.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,15 +6,17 @@ import (
"errors"
"fmt"
"io"
"net/http"
"time"
"tyk/tyk/bootstrap/data"

metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/labels"
"k8s.io/apimachinery/pkg/types"
"k8s.io/apimachinery/pkg/util/json"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/rest"
"net/http"
"time"
"tyk/tyk/bootstrap/constants"
"tyk/tyk/bootstrap/data"
)

func BoostrapPortal(client http.Client) error {
Expand Down Expand Up @@ -239,12 +241,45 @@ func RestartDashboard() error {
return err
}

deploymentsClient := clientset.AppsV1().Deployments(data.AppConfig.TykPodNamespace)
if data.AppConfig.DashboardDeploymentName == "" {
ls := metav1.LabelSelector{MatchLabels: map[string]string{
constants.TykBootstrapLabel: constants.TykBootstrapDashboardDeployLabel,
}}

if data.AppConfig.ReleaseName != "" {
ls.MatchLabels[constants.TykBootstrapReleaseLabel] = data.AppConfig.ReleaseName
}

deployments, err := clientset.
AppsV1().
Deployments(data.AppConfig.TykPodNamespace).
List(
context.TODO(),
metav1.ListOptions{
LabelSelector: labels.Set(ls.MatchLabels).String(),
},
)
if err != nil {
return errors.New(fmt.Sprintf("failed to list Tyk Dashboard Deployment, err: %v", err))
}

for _, deployment := range deployments.Items {
data.AppConfig.DashboardDeploymentName = deployment.ObjectMeta.Name
}
}

timeStamp := fmt.Sprintf(`{"spec": {"template": {"metadata": {"annotations": {"kubectl.kubernetes.io/restartedAt": "%s"}}}}}`,
time.Now().Format("20060102150405"))

_, err = deploymentsClient.Patch(context.TODO(), data.AppConfig.DashboardDeploymentName,
types.StrategicMergePatchType, []byte(timeStamp), metav1.PatchOptions{})

_, err = clientset.
AppsV1().
Deployments(data.AppConfig.TykPodNamespace).
Patch(
context.TODO(),
data.AppConfig.DashboardDeploymentName,
types.StrategicMergePatchType,
[]byte(timeStamp),
metav1.PatchOptions{},
)
return err
}

0 comments on commit 7ee731b

Please sign in to comment.