-
Notifications
You must be signed in to change notification settings - Fork 351
/
create.go
127 lines (103 loc) · 3.83 KB
/
create.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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
package registry
import (
"errors"
"fmt"
"strconv"
"time"
"k8s.io/client-go/kubernetes"
"github.com/covexo/devspace/pkg/devspace/config/v1"
"github.com/covexo/devspace/pkg/devspace/helm"
"github.com/foomo/htpasswd"
k8sv1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)
func createRegistry(kubectl *kubernetes.Clientset, helm *helm.ClientWrapper, internalRegistry *v1.InternalRegistryConfig, registryConfig *v1.RegistryConfig) error {
registryReleaseNamespace := *internalRegistry.Namespace
if registryReleaseNamespace != "default" {
_, err := kubectl.CoreV1().Namespaces().Get(registryReleaseNamespace, metav1.GetOptions{})
if err != nil {
// Create registryReleaseNamespace
_, err = kubectl.CoreV1().Namespaces().Create(&k8sv1.Namespace{
ObjectMeta: metav1.ObjectMeta{
Name: registryReleaseNamespace,
},
})
if err != nil {
return err
}
}
}
values := map[interface{}]interface{}{}
// Deploy the registry
_, err := helm.InstallChartByName(InternalRegistryName, registryReleaseNamespace, "stable/docker-registry", "", &values)
if err != nil {
return fmt.Errorf("Unable to initialize docker registry: %s", err.Error())
}
// Create/Update secret if necessary
if registryConfig != nil && registryConfig.Auth != nil {
// Update registry secret
err = createOrUpdateRegistrySecret(kubectl, internalRegistry, registryConfig)
if err != nil {
return err
}
}
return nil
}
func createOrUpdateRegistrySecret(kubectl *kubernetes.Clientset, internalRegistry *v1.InternalRegistryConfig, registryConfig *v1.RegistryConfig) error {
registryReleaseNamespace := *internalRegistry.Namespace
registryAuth := registryConfig.Auth
htpasswdSecretName := InternalRegistryName + "-docker-registry-secret"
htpasswdSecret, err := kubectl.Core().Secrets(registryReleaseNamespace).Get(htpasswdSecretName, metav1.GetOptions{})
if err != nil {
return fmt.Errorf("Unable to retrieve secret for docker registry: %s", err.Error())
}
if htpasswdSecret == nil || htpasswdSecret.Data == nil {
htpasswdSecret = &k8sv1.Secret{
ObjectMeta: metav1.ObjectMeta{
Name: htpasswdSecretName,
},
Data: map[string][]byte{},
}
}
oldHtpasswdData := htpasswdSecret.Data["htpasswd"]
newHtpasswdData := htpasswd.HashedPasswords{}
if len(oldHtpasswdData) != 0 {
oldHtpasswdDataBytes := []byte(oldHtpasswdData)
newHtpasswdData, _ = htpasswd.ParseHtpasswd(oldHtpasswdDataBytes)
}
err = newHtpasswdData.SetPassword(*registryAuth.Username, *registryAuth.Password, htpasswd.HashBCrypt)
if err != nil {
return fmt.Errorf("Unable to set password in htpasswd: %s", err.Error())
}
newHtpasswdDataBytes := newHtpasswdData.Bytes()
htpasswdSecret.Data["htpasswd"] = newHtpasswdDataBytes
_, err = kubectl.Core().Secrets(registryReleaseNamespace).Get(htpasswdSecretName, metav1.GetOptions{})
if err != nil {
_, err = kubectl.Core().Secrets(registryReleaseNamespace).Create(htpasswdSecret)
} else {
_, err = kubectl.Core().Secrets(registryReleaseNamespace).Update(htpasswdSecret)
}
if err != nil {
return fmt.Errorf("Unable to update htpasswd secret: %s", err.Error())
}
return nil
}
func getRegistryURL(kubectl *kubernetes.Clientset, registryReleaseNamespace, registryServiceName string) (string, error) {
maxServiceWaiting := 60 * time.Second
serviceWaitingInterval := 3 * time.Second
for true {
registryService, err := kubectl.Core().Services(registryReleaseNamespace).Get(registryServiceName, metav1.GetOptions{})
if err != nil {
return "", err
}
if len(registryService.Spec.ClusterIP) > 0 {
return registryService.Spec.ClusterIP + ":" + strconv.Itoa(registryPort), nil
}
time.Sleep(serviceWaitingInterval)
maxServiceWaiting = maxServiceWaiting - serviceWaitingInterval
if maxServiceWaiting <= 0 {
return "", errors.New("Timeout waiting for registry service to start")
}
}
return "", nil
}