This repository has been archived by the owner on Jan 19, 2024. It is now read-only.
/
namespace_manager.go
76 lines (65 loc) · 2.43 KB
/
namespace_manager.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
package namespacemanager
import (
"context"
"errors"
"fmt"
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"github.com/keptn/go-utils/pkg/common/kubeutils"
keptn "github.com/keptn/go-utils/pkg/lib/keptn"
)
// INamespaceManager defines operations for initializing and configuring namespaces
type INamespaceManager interface {
CreateNamespaceIfNotExists(nsName string) error
InjectIstio(project string, stage string) error
}
// NamespaceManager is an implementation of INamespaceManager
type NamespaceManager struct {
logger keptn.LoggerInterface
}
// NewNamespaceManager creates a new instance of a NamespaceManager
func NewNamespaceManager(logger keptn.LoggerInterface) *NamespaceManager {
return &NamespaceManager{logger: logger}
}
// InitNamespaces initializes namespaces if they do not exist yet
func (p *NamespaceManager) CreateNamespaceIfNotExists(nsName string) error {
namespaceManager, err := kubeutils.NewNamespaceManager(true)
if err != nil {
return err
}
exists, err := namespaceManager.ExistsNamespace(context.TODO(), nsName)
if err != nil {
return fmt.Errorf("error when checking availability of namespace: %v", err)
}
if exists {
p.logger.Debug(fmt.Sprintf("Reuse existing namespace %s", nsName))
} else {
p.logger.Debug(fmt.Sprintf("Create new namespace %s", nsName))
if err != namespaceManager.CreateNamespace(context.TODO(), nsName) {
return fmt.Errorf("error when creating namespace %s: %v", nsName, err)
}
}
return nil
}
// InjectIstio injects Istio into the namespace used for the project and stage by adding the label istio-injection
func (p *NamespaceManager) InjectIstio(project string, stage string) error {
kubeClient, err := kubeutils.GetClientSet(true)
if err != nil {
return fmt.Errorf("error when getting kube API: %v", err)
}
namespaceName := project + "-" + stage
namespace, err := kubeClient.CoreV1().Namespaces().Get(context.TODO(), namespaceName, v1.GetOptions{})
if err != nil {
return err
}
if namespace == nil {
return errors.New("error when getting namespace")
}
p.logger.Info(fmt.Sprintf("Inject Istio to the %s namespace for blue-green deployments", namespaceName))
if namespace.ObjectMeta.Labels == nil {
namespace.ObjectMeta.Labels = make(map[string]string)
}
// add the label istio-injection to the namespace
namespace.ObjectMeta.Labels["istio-injection"] = "enabled"
_, err = kubeClient.CoreV1().Namespaces().Update(context.TODO(), namespace, v1.UpdateOptions{})
return err
}