github.com/navikt/knorten@v0.0.0-20240419132333-1333f46ed8b6/pkg/team/k8s.go (about) 1 package team 2 3 import ( 4 "context" 5 "fmt" 6 7 v1 "k8s.io/api/core/v1" 8 k8sErrors "k8s.io/apimachinery/pkg/api/errors" 9 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" 10 ) 11 12 func (c Client) k8sNamespaceExists(ctx context.Context, namespace string) (bool, error) { 13 if c.dryRun { 14 return false, nil 15 } 16 17 _, err := c.k8sClient.CoreV1().Namespaces().Get(ctx, namespace, metav1.GetOptions{}) 18 if err != nil { 19 if k8sErrors.IsNotFound(err) { 20 return false, nil 21 } 22 23 return false, err 24 } 25 26 return true, nil 27 } 28 29 func (c Client) createK8sNamespace(ctx context.Context, name string) error { 30 if c.dryRun { 31 return nil 32 } 33 34 namespace := &v1.Namespace{ 35 ObjectMeta: metav1.ObjectMeta{ 36 Name: name, 37 Labels: map[string]string{ 38 "team-namespace": "true", 39 }, 40 }, 41 } 42 43 _, err := c.k8sClient.CoreV1().Namespaces().Create(ctx, namespace, metav1.CreateOptions{}) 44 if err != nil && !k8sErrors.IsAlreadyExists(err) { 45 return err 46 } 47 48 return nil 49 } 50 51 func (c Client) deleteK8sNamespace(ctx context.Context, namespace string) error { 52 if c.dryRun { 53 return nil 54 } 55 56 err := c.k8sClient.CoreV1().Namespaces().Delete(ctx, namespace, metav1.DeleteOptions{}) 57 if err != nil && !k8sErrors.IsNotFound(err) { 58 return err 59 } 60 61 return nil 62 } 63 64 func (c Client) k8sServiceAccountExists(ctx context.Context, teamID, namespace string) (bool, error) { 65 if c.dryRun { 66 return false, nil 67 } 68 69 _, err := c.k8sClient.CoreV1().ServiceAccounts(namespace).Get(ctx, teamID, metav1.GetOptions{}) 70 if err != nil { 71 if k8sErrors.IsNotFound(err) { 72 return false, nil 73 } 74 75 return false, err 76 } 77 78 return true, nil 79 } 80 81 func (c Client) createK8sServiceAccount(ctx context.Context, teamID, namespace string) error { 82 if c.dryRun { 83 return nil 84 } 85 86 saSpec := &v1.ServiceAccount{ 87 ObjectMeta: metav1.ObjectMeta{ 88 Name: teamID, 89 Namespace: namespace, 90 Annotations: map[string]string{ 91 "iam.gke.io/gcp-service-account": fmt.Sprintf("%v@%v.iam.gserviceaccount.com", teamID, c.gcpProject), 92 }, 93 }, 94 } 95 96 _, err := c.k8sClient.CoreV1().ServiceAccounts(namespace).Create(ctx, saSpec, metav1.CreateOptions{}) 97 if err != nil && !k8sErrors.IsAlreadyExists(err) { 98 return err 99 } 100 101 return nil 102 }