Skip to content

Commit b925f91

Browse files
author
gentele
committed
several improvements for gke and gcr
1 parent 367e9e4 commit b925f91

5 files changed

Lines changed: 158 additions & 61 deletions

File tree

cmd/init.go

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"io/ioutil"
55
"os"
66
"path/filepath"
7+
"regexp"
78
"strconv"
89
"strings"
910

@@ -480,6 +481,9 @@ func (cmd *InitCmd) configureRegistry() {
480481
}
481482
}
482483
}
484+
googleRegistryRegex := regexp.MustCompile("^(.+\\.)?gcr.io$")
485+
isGoogleRegistry := googleRegistryRegex.Match([]byte(*registryURL))
486+
isDockerHub := *registryURL == "hub.docker.com"
483487

484488
if dockerUsername == "" {
485489
if cmd.defaultImage.Build.Engine.Docker != nil {
@@ -519,11 +523,10 @@ func (cmd *InitCmd) configureRegistry() {
519523
})
520524
}
521525
}
526+
defaultImageName := *cmd.defaultImage.Name
527+
defaultImageNameParts := strings.Split(defaultImageName, "/")
522528

523-
if *registryURL == "hub.docker.com" {
524-
defaultImageName := *cmd.defaultImage.Name
525-
defaultImageNameParts := strings.Split(defaultImageName, "/")
526-
529+
if isDockerHub {
527530
if len(defaultImageNameParts) < 2 {
528531
defaultImageName = dockerUsername + "/" + strings.TrimPrefix(defaultImageName, dockerUsername)
529532
}
@@ -534,6 +537,17 @@ func (cmd *InitCmd) configureRegistry() {
534537
ValidationRegexPattern: "^[a-zA-Z0-9/]{4,30}$",
535538
})
536539
}
540+
541+
if isGoogleRegistry {
542+
if len(defaultImageNameParts) < 2 {
543+
gcloudProjectName := stdinutil.GetFromStdin(&stdinutil.GetFromStdinParams{
544+
Question: "What is the name of your Google Cloud Project? (run 'gcloud config get-value project' to get the project name)",
545+
DefaultValue: "",
546+
ValidationRegexPattern: "^.*$",
547+
})
548+
cmd.defaultImage.Name = configutil.String(*gcloudProjectName + "/" + strings.TrimPrefix(defaultImageName, *gcloudProjectName))
549+
}
550+
}
537551
} else {
538552
imageMap := *cmd.config.Images
539553
defaultImageConf, defaultImageExists := imageMap["default"]

cmd/reset.go

Lines changed: 35 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import (
1212
"github.com/covexo/devspace/pkg/devspace/config/configutil"
1313

1414
"github.com/spf13/cobra"
15+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1516
"k8s.io/client-go/kubernetes"
1617
)
1718

@@ -25,12 +26,13 @@ type ResetCmd struct {
2526

2627
// ResetCmdFlags holds the command flags
2728
type ResetCmdFlags struct {
28-
deleteDockerfile bool
29-
deleteChart bool
30-
deleteRegistry bool
31-
deleteTiller bool
32-
deleteDevspaceFolder bool
33-
deleteRelease bool
29+
deleteDockerfile bool
30+
deleteChart bool
31+
deleteRegistry bool
32+
deleteTiller bool
33+
deleteDevspaceFolder bool
34+
deleteRelease bool
35+
deleteClusterRoleBinding bool
3436
}
3537

3638
func init() {
@@ -67,6 +69,13 @@ command: devspace down
6769
// Run executes the reset command logic
6870
func (cmd *ResetCmd) Run(cobraCmd *cobra.Command, args []string) {
6971
var err error
72+
73+
if cmd.kubectl == nil || cmd.helm == nil {
74+
cmd.kubectl, err = kubectl.NewClient()
75+
if err != nil {
76+
log.Failf("Failed to initialize kubectl client: ", err.Error())
77+
}
78+
}
7079
cmd.determineResetExtent()
7180

7281
if cmd.flags.deleteRelease {
@@ -148,6 +157,13 @@ func (cmd *ResetCmd) Run(cobraCmd *cobra.Command, args []string) {
148157
log.Done("Successfully deleted .devspace folder")
149158
}
150159
}
160+
161+
if cmd.flags.deleteClusterRoleBinding {
162+
err = cmd.kubectl.RbacV1beta1().ClusterRoleBindings().Delete(clusterRoleBindingName, &metav1.DeleteOptions{})
163+
if err != nil {
164+
log.Failf("Failed to remove ClusterRoleBinding: ", err.Error())
165+
}
166+
}
151167
}
152168

153169
func (cmd *ResetCmd) determineResetExtent() {
@@ -163,24 +179,34 @@ func (cmd *ResetCmd) determineResetExtent() {
163179
}) == "y"
164180

165181
cmd.flags.deleteChart = *stdinutil.GetFromStdin(&stdinutil.GetFromStdinParams{
166-
Question: "Should the Chart (chart/*) be removed ? (y/n)",
182+
Question: "Should the Chart (chart/*) be removed? (y/n)",
167183
DefaultValue: "y",
168184
ValidationRegexPattern: "^(y|n)$",
169185
}) == "y"
170186

171187
if config.Services.InternalRegistry != nil {
172188
cmd.flags.deleteRegistry = *stdinutil.GetFromStdin(&stdinutil.GetFromStdinParams{
173-
Question: "Should the internal registry be removed ? (y/n)",
189+
Question: "Should the internal registry be removed? (y/n)",
174190
DefaultValue: "y",
175191
ValidationRegexPattern: "^(y|n)$",
176192
}) == "y"
177193
}
178194

179195
cmd.flags.deleteTiller = *stdinutil.GetFromStdin(&stdinutil.GetFromStdinParams{
180-
Question: "Should the tiller server be removed ? (y/n)",
196+
Question: "Should the tiller server be removed? (y/n)",
181197
DefaultValue: "y",
182198
ValidationRegexPattern: "^(y|n)$",
183199
}) == "y"
200+
201+
_, err := cmd.kubectl.RbacV1beta1().ClusterRoleBindings().Get(clusterRoleBindingName, metav1.GetOptions{})
202+
203+
if err == nil {
204+
cmd.flags.deleteClusterRoleBinding = *stdinutil.GetFromStdin(&stdinutil.GetFromStdinParams{
205+
Question: "Should the ClusterRoleBinding '" + clusterRoleBindingName + "' be removed? (y/n)",
206+
DefaultValue: "y",
207+
ValidationRegexPattern: "^(y|n)$",
208+
}) == "y"
209+
}
184210
}
185211

186212
func (cmd *ResetCmd) shouldContinue() bool {
@@ -198,12 +224,6 @@ func (cmd *ResetCmd) deleteRelease() error {
198224
releaseName := *config.DevSpace.Release.Name
199225

200226
if cmd.kubectl == nil || cmd.helm == nil {
201-
cmd.kubectl, err = kubectl.NewClient()
202-
203-
if err != nil {
204-
return err
205-
}
206-
207227
isDeployed := helmClient.IsTillerDeployed(cmd.kubectl, config.Services.Tiller)
208228

209229
if isDeployed == false {
@@ -229,12 +249,6 @@ func (cmd *ResetCmd) deleteRegistry() error {
229249
registryReleaseName := *config.Services.InternalRegistry.Release.Name
230250

231251
if cmd.kubectl == nil || cmd.helm == nil {
232-
cmd.kubectl, err = kubectl.NewClient()
233-
234-
if err != nil {
235-
return err
236-
}
237-
238252
isDeployed := helmClient.IsTillerDeployed(cmd.kubectl, config.Services.Tiller)
239253

240254
if isDeployed == false {
@@ -254,17 +268,8 @@ func (cmd *ResetCmd) deleteRegistry() error {
254268
}
255269

256270
func (cmd *ResetCmd) deleteTiller() error {
257-
var err error
258271
config := configutil.GetConfig(false)
259272

260-
if cmd.kubectl == nil {
261-
cmd.kubectl, err = kubectl.NewClient()
262-
263-
if err != nil {
264-
return err
265-
}
266-
}
267-
268273
return helmClient.DeleteTiller(cmd.kubectl, config.Services.Tiller)
269274
}
270275

cmd/up.go

Lines changed: 78 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,14 @@ package cmd
33
import (
44
"fmt"
55
"os"
6+
"os/exec"
67
"path/filepath"
78
"strconv"
89
"strings"
910
"time"
1011

12+
"github.com/covexo/devspace/pkg/util/stdinutil"
13+
1114
"github.com/covexo/devspace/pkg/util/yamlutil"
1215

1316
"github.com/covexo/devspace/pkg/devspace/builder"
@@ -33,8 +36,9 @@ import (
3336
"github.com/covexo/devspace/pkg/devspace/config/configutil"
3437
"github.com/spf13/cobra"
3538
k8sv1 "k8s.io/api/core/v1"
39+
k8sv1beta1 "k8s.io/api/rbac/v1beta1"
3640
"k8s.io/client-go/kubernetes"
37-
"k8s.io/client-go/util/exec"
41+
kubectlExec "k8s.io/client-go/util/exec"
3842
)
3943

4044
// UpCmd is a struct that defines a command call for "up"
@@ -72,6 +76,8 @@ var UpFlagsDefault = &UpCmdFlags{
7276
noSleep: false,
7377
}
7478

79+
const clusterRoleBindingName = "devspace-users"
80+
7581
func init() {
7682
cmd := &UpCmd{
7783
flags: UpFlagsDefault,
@@ -136,6 +142,11 @@ func (cmd *UpCmd) Run(cobraCmd *cobra.Command, args []string) {
136142
log.Fatalf("Unable to create release namespace: %v", err)
137143
}
138144

145+
err = cmd.ensureClusterRoleBinding()
146+
if err != nil {
147+
log.Fatalf("Unable to create ClusterRoleBinding: %v", err)
148+
}
149+
139150
cmd.initHelm()
140151

141152
if cmd.flags.initRegistries {
@@ -194,6 +205,68 @@ func (cmd *UpCmd) ensureNamespace() error {
194205
return nil
195206
}
196207

208+
func (cmd *UpCmd) ensureClusterRoleBinding() error {
209+
_, err := cmd.kubectl.RbacV1beta1().ClusterRoleBindings().Get(clusterRoleBindingName, metav1.GetOptions{})
210+
211+
if err != nil {
212+
createRoleBinding := stdinutil.GetFromStdin(&stdinutil.GetFromStdinParams{
213+
Question: "Do you want the ClusterRoleBinding '" + clusterRoleBindingName + "' to be created automatically? (yes|no)",
214+
DefaultValue: "yes",
215+
ValidationRegexPattern: "^(yes)|(no)$",
216+
})
217+
218+
if *createRoleBinding == "no" {
219+
log.Fatal("Please create ClusterRoleBinding '" + clusterRoleBindingName + "' manually")
220+
}
221+
username := configutil.String("")
222+
223+
clusterConfig, _ := kubectl.GetClientConfig()
224+
225+
if clusterConfig.Username == "" {
226+
gcloudOutput, gcloudErr := exec.Command("gcloud", "config", "list", "account", "--format", "value(core.account)").Output()
227+
228+
if gcloudErr == nil {
229+
gcloudEmail := strings.TrimSuffix(strings.TrimSuffix(string(gcloudOutput), "\r\n"), "\n")
230+
231+
if gcloudEmail != "" {
232+
username = &gcloudEmail
233+
}
234+
}
235+
} else {
236+
username = &clusterConfig.Username
237+
}
238+
239+
username = stdinutil.GetFromStdin(&stdinutil.GetFromStdinParams{
240+
Question: "What is your cluster username? (Email address of the Google account for GKE clusters)",
241+
DefaultValue: *username,
242+
ValidationRegexPattern: ".+",
243+
})
244+
245+
rolebinding := &k8sv1beta1.ClusterRoleBinding{
246+
ObjectMeta: metav1.ObjectMeta{
247+
Name: clusterRoleBindingName,
248+
},
249+
Subjects: []k8sv1beta1.Subject{
250+
{
251+
Kind: "User",
252+
Name: *username,
253+
},
254+
},
255+
RoleRef: k8sv1beta1.RoleRef{
256+
APIGroup: "rbac.authorization.k8s.io",
257+
Kind: "ClusterRole",
258+
Name: "cluster-admin",
259+
},
260+
}
261+
262+
_, roleBindingErr := cmd.kubectl.RbacV1beta1().ClusterRoleBindings().Create(rolebinding)
263+
if roleBindingErr != nil {
264+
return roleBindingErr
265+
}
266+
}
267+
return nil
268+
}
269+
197270
func (cmd *UpCmd) initRegistries() {
198271
config := configutil.GetConfig(false)
199272
registryMap := *config.Registries
@@ -351,12 +424,12 @@ func (cmd *UpCmd) buildImages(buildFlagChanged bool) bool {
351424

352425
log.Infof(buildInfo, imageName, engineName)
353426

354-
username := ""
355-
password := ""
356-
357427
if registryConf.URL != nil {
358428
registryURL = *registryConf.URL
359429
}
430+
431+
username := ""
432+
password := ""
360433
if registryConf.Auth != nil {
361434
if registryConf.Auth.Username != nil {
362435
username = *registryConf.Auth.Username
@@ -668,7 +741,7 @@ func (cmd *UpCmd) enterTerminal() {
668741
_, _, _, terminalErr := kubectl.Exec(cmd.kubectl, cmd.pod, cmd.pod.Spec.Containers[0].Name, shell, true, nil)
669742

670743
if terminalErr != nil {
671-
if _, ok := terminalErr.(exec.CodeExitError); ok == false {
744+
if _, ok := terminalErr.(kubectlExec.CodeExitError); ok == false {
672745
log.Fatalf("Unable to start terminal session: %s", terminalErr.Error())
673746
}
674747
}

0 commit comments

Comments
 (0)