diff --git a/assets/k8s/serviceAccount/cluster-role.yaml b/assets/k8s/serviceAccount/cluster-role.yaml index 7094f4a..61b793b 100644 --- a/assets/k8s/serviceAccount/cluster-role.yaml +++ b/assets/k8s/serviceAccount/cluster-role.yaml @@ -15,6 +15,7 @@ rules: - ingresses - services - secrets + - configmaps verbs: - create - delete diff --git a/src/cli/init.go b/src/cli/init.go index 7397bc0..602bc59 100644 --- a/src/cli/init.go +++ b/src/cli/init.go @@ -13,6 +13,8 @@ import ( "github.com/nearform/initium-cli/src/services/project" "github.com/nearform/initium-cli/src/utils/defaults" "github.com/urfave/cli/v2" + + knative "github.com/nearform/initium-cli/src/services/k8s" ) const ( @@ -101,6 +103,32 @@ func (c icli) InitServiceAccountCMD(ctx *cli.Context) error { return k8s.GetServiceAccount(c.Resources) } +func (c icli) InitKnativeDomainCMD(cCtx *cli.Context) error { + config, err := knative.Config( + cCtx.String(endpointFlag), + cCtx.String(tokenFlag), + []byte(cCtx.String(caCRTFlag)), + ) + + if err != nil { + return err + } + + if cCtx.NArg() < 1 { + return fmt.Errorf("Knative domain argument is required!") + } + + knativeDomain := cCtx.Args().Get(0) + + err = knative.DomainUpd(knativeDomain, config) + + if err != nil { + return err + } + + return nil +} + func (c icli) InitCMD() *cli.Command { configFlags := c.CommandFlags([]FlagsType{Shared}) configFlags = append(configFlags, &cli.BoolFlag{ @@ -133,6 +161,21 @@ func (c icli) InitCMD() *cli.Command { Action: c.InitServiceAccountCMD, Before: c.baseBeforeFunc, }, + { + Name: "knative-domain", + Usage: "updates knative service default domain", + Flags: c.CommandFlags([]FlagsType{Kubernetes}), + Action: c.InitKnativeDomainCMD, + Before: func(ctx *cli.Context) error { + if err := c.loadFlagsFromConfig(ctx); err != nil { + return err + } + + ignoredFlags := []string{namespaceFlag} + + return c.checkRequiredFlags(ctx, ignoredFlags) + }, + }, }, } } diff --git a/src/cli/init_test.go b/src/cli/init_test.go index 333c2a5..bb453b4 100644 --- a/src/cli/init_test.go +++ b/src/cli/init_test.go @@ -129,3 +129,13 @@ func TestAppName(t *testing.T) { t.Errorf("the error message should contain %s and %s", appNameFlag, repoNameFlag) } } + +func TestKnativeDomain(t *testing.T) { + cli := GeticliForTesting(os.DirFS("../..")) + + err := cli.Run([]string{"initium", "init", "knative-domain"}) + if err == nil { + t.Errorf("CLI should ask for an argument (knative new domain) if not detected") + } + +} diff --git a/src/services/k8s/knative.go b/src/services/k8s/knative.go index 2056850..53a9ca5 100644 --- a/src/services/k8s/knative.go +++ b/src/services/k8s/knative.go @@ -232,3 +232,36 @@ func Clean(namespace string, config *rest.Config, project *project.Project) erro log.Info("The Knative service was successfully deleted", "host", config.Host, "name", project.Name, "namespace", namespace) return nil } + +func DomainUpd(kn_domain string, config *rest.Config) error { + // Default Knative values + configMapName := "config-domain" + namespace := "knative-serving" + + log.Info("Updating Knative default domain name...", "new domain", kn_domain, "configMap", configMapName, "namespace", namespace) + ctx := context.Background() + + client, err := kubernetes.NewForConfig(config) + if err != nil { + return fmt.Errorf("Creating Kubernetes client %v", err) + } + + configMap, err := client.CoreV1().ConfigMaps(namespace).Get(ctx, configMapName, metav1.GetOptions{}) + + if err != nil { + return fmt.Errorf("Getting ConfigMaps: %v", err) + } + + configMap.Data = make(map[string]string) + + configMap.Data[kn_domain] = "" + + _, err = client.CoreV1().ConfigMaps(namespace).Update(ctx, configMap, metav1.UpdateOptions{}) + if err != nil { + return err + } + + log.Info("Knative default domain name was successfully updated!", "new domain", kn_domain, "configMap", configMapName, "namespace", namespace) + + return nil +} diff --git a/src/services/k8s/knative_test.go b/src/services/k8s/knative_test.go index 6f95106..2a122ae 100644 --- a/src/services/k8s/knative_test.go +++ b/src/services/k8s/knative_test.go @@ -80,4 +80,3 @@ func TestLoadManifest(t *testing.T) { assert.Assert(t, annotations[UpdateTimestampAnnotationName] != "", "Missing %s annotation", UpdateTimestampAnnotationName) assert.Assert(t, annotations[UpdateShaAnnotationName] == commitSha, "Expected %s SHA, got %s", commitSha, annotations[UpdateShaAnnotationName]) } -