diff --git a/cmd/copsctl/namespace.go b/cmd/copsctl/namespace.go index 2316793..53bbdfc 100644 --- a/cmd/copsctl/namespace.go +++ b/cmd/copsctl/namespace.go @@ -37,6 +37,7 @@ func createNamespaceCreateCommand(o *namespace.Orchestrator, cmd cli.Command) { addUsersParam(namespaceCreateCmd) addServiceAccountsParam(namespaceCreateCmd) addNameParam(namespaceCreateCmd) + addProjectParam(namespaceCreateCmd) } func createNamespaceDeleteCommand(o *namespace.Orchestrator, cmd cli.Command) { @@ -138,3 +139,8 @@ func addServiceAccountsParam(cmd cli.Command) { func addNameParam(cmd cli.Command) { cmd.AddPersistentParameterString(flags.Name, "", true, "n", "Name of the namespace") } + +func addProjectParam(cmd cli.Command) { + cmd.AddPersistentParameterString(flags.ProjectName, "", true, "p", "Name of the project hosted within namespace") + cmd.AddPersistentParameterString(flags.ProjectCostCenter, "", true, "c", "Costcenter project is billed") +} diff --git a/internal/adapters/kubernetes/cops_namespace.go b/internal/adapters/kubernetes/cops_namespace.go index ebc155d..16a0247 100644 --- a/internal/adapters/kubernetes/cops_namespace.go +++ b/internal/adapters/kubernetes/cops_namespace.go @@ -4,7 +4,8 @@ type CopsNamespaceResponse struct { APIVersion string `yaml:"apiVersion"` Kind string `yaml:"kind"` Metadata struct { - Name string `yaml:"name"` + Name string `yaml:"name"` + Labels map[string]string `yaml:"labels"` } `yaml:"metadata"` Spec struct { NamespaceAdminUsers []string `yaml:"namespaceAdminUsers"` @@ -16,3 +17,11 @@ type CopsServiceAccount struct { ServiceAccount string `yaml:"serviceAccount"` Namespace string `yaml:"namespace"` } + +func (o CopsNamespaceResponse) GetProjectName() string { + return o.Metadata.Labels["conplement.de/projectName"] +} + +func (o CopsNamespaceResponse) GetProjectCostCenter() string { + return o.Metadata.Labels["conplement.de/projectCostCenter"] +} diff --git a/internal/cmd/flags/constants.go b/internal/cmd/flags/constants.go index 275d40c..3c06825 100644 --- a/internal/cmd/flags/constants.go +++ b/internal/cmd/flags/constants.go @@ -6,6 +6,9 @@ const Name = "name" const Users = "users" const ServiceAccounts = "service-accounts" +const ProjectName = "projectname" +const ProjectCostCenter = "projectcostcenter" + const EnvironmentTag = "environment-tag" const ConnectionString = "connection-string" diff --git a/internal/namespace/namespace.go b/internal/namespace/namespace.go index 1d6e54f..e4233a2 100644 --- a/internal/namespace/namespace.go +++ b/internal/namespace/namespace.go @@ -32,7 +32,7 @@ func (o *Orchestrator) Create() { users := parseUsernames(viper.GetString("users")) serviceAccounts := parseServiceAccounts(viper.GetString("service-accounts")) - copsNamespace := renderTemplate(namespaceName, users, serviceAccounts) + copsNamespace := renderTemplate(namespaceName, users, serviceAccounts, viper.GetString(flags.ProjectName), viper.GetString(flags.ProjectCostCenter)) _, err := kubernetes.ApplyString(o.executor, copsNamespace) @@ -55,7 +55,7 @@ func (o *Orchestrator) Delete() { return } - copsNamespace := renderTemplate(namespaceName, namespace.Spec.NamespaceAdminUsers, namespace.Spec.NamespaceAdminServiceAccounts) + copsNamespace := renderTemplate(namespaceName, namespace.Spec.NamespaceAdminUsers, namespace.Spec.NamespaceAdminServiceAccounts, namespace.GetProjectName(), namespace.GetProjectCostCenter()) _, error := kubernetes.DeleteString(o.executor, copsNamespace) diff --git a/internal/namespace/serviceaccounts.go b/internal/namespace/serviceaccounts.go index 213210a..a4c5b80 100644 --- a/internal/namespace/serviceaccounts.go +++ b/internal/namespace/serviceaccounts.go @@ -69,7 +69,7 @@ func (o *Orchestrator) AddServiceAccounts() { } } - copsNamespace := renderTemplate(namespaceName, existingUsers, relevantAccounts) + copsNamespace := renderTemplate(namespaceName, existingUsers, relevantAccounts, namespace.GetProjectName(), namespace.GetProjectCostCenter()) _, err = kubernetes.ApplyString(o.executor, copsNamespace) @@ -113,7 +113,7 @@ func (o *Orchestrator) RemoveServiceAccounts() { } } - copsnamespace := renderTemplate(namespaceName, existingUsers, resultingAccounts) + copsnamespace := renderTemplate(namespaceName, existingUsers, resultingAccounts, namespace.GetProjectName(), namespace.GetProjectCostCenter()) _, err = kubernetes.ApplyString(o.executor, copsnamespace) diff --git a/internal/namespace/template.go b/internal/namespace/template.go index 84d2daa..b30a124 100644 --- a/internal/namespace/template.go +++ b/internal/namespace/template.go @@ -44,18 +44,23 @@ func renderServiceAccounts(serviceAccounts []kubernetes.CopsServiceAccount) stri return accountsList } -func renderTemplate(namespaceName string, userNames []string, serviceAccounts []kubernetes.CopsServiceAccount) string { +func renderTemplate(namespaceName string, userNames []string, serviceAccounts []kubernetes.CopsServiceAccount, projectName string, projectCostCenter string) string { copsnamespace := strings.Replace(copsNamespaceTemplate, "{{ namespaceName }}", namespaceName, -1) copsnamespace = strings.Replace(copsnamespace, "{{ usernames }}", renderUsernames(userNames), -1) copsnamespace = strings.Replace(copsnamespace, "{{ serviceAccounts }}", renderServiceAccounts(serviceAccounts), -1) + copsnamespace = strings.Replace(copsnamespace, "{{ projectCostCenter }}", projectCostCenter, -1) + copsnamespace = strings.Replace(copsnamespace, "{{ projectName }}", projectName, -1) return copsnamespace } const copsNamespaceTemplate string = ` -apiVersion: coreops.conplement.cloud/v1 +apiVersion: coreops.conplement.cloud/v2 kind: CopsNamespace metadata: name: {{ namespaceName }} spec: {{ usernames }} -{{ serviceAccounts }}` +{{ serviceAccounts }} + projectCostCenter: "{{ projectCostCenter }}" + projectName: "{{ projectName }}" +` diff --git a/internal/namespace/users.go b/internal/namespace/users.go index 8401418..4b241a6 100644 --- a/internal/namespace/users.go +++ b/internal/namespace/users.go @@ -52,7 +52,7 @@ func (o *Orchestrator) AddUsers() { } } - copsNamespace := renderTemplate(namespaceName, relevantUsers, existingServiceAccounts) + copsNamespace := renderTemplate(namespaceName, relevantUsers, existingServiceAccounts, namespace.GetProjectName(), namespace.GetProjectCostCenter()) _, err = kubernetes.ApplyString(o.executor, copsNamespace) @@ -96,7 +96,7 @@ func (o *Orchestrator) RemoveUsers() { } } - copsNamespace := renderTemplate(namespaceName, relevantUsers, existingServiceAccounts) + copsNamespace := renderTemplate(namespaceName, relevantUsers, existingServiceAccounts, namespace.GetProjectName(), namespace.GetProjectCostCenter()) _, err = kubernetes.ApplyString(o.executor, copsNamespace)