Skip to content

Commit adf44af

Browse files
authored
Merge pull request #292 from covexo/configure
Configure
2 parents 59a610e + 6510344 commit adf44af

16 files changed

Lines changed: 895 additions & 650 deletions

File tree

cmd/add.go

Lines changed: 52 additions & 346 deletions
Large diffs are not rendered by default.

cmd/init.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ func (cmd *InitCmd) Run(cobraCmd *cobra.Command, args []string) {
134134
}
135135

136136
configutil.Merge(config, &v1.Config{
137-
Version: configutil.String("v1"),
137+
Version: configutil.String(configutil.CurrentConfigVersion),
138138
DevSpace: &v1.DevSpaceConfig{
139139
Deployments: &[]*v1.DeploymentConfig{},
140140
},

cmd/remove.go

Lines changed: 43 additions & 198 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,17 @@
11
package cmd
22

33
import (
4-
"path/filepath"
5-
"strconv"
6-
"strings"
7-
8-
"github.com/covexo/devspace/pkg/devspace/config/configutil"
9-
"github.com/covexo/devspace/pkg/devspace/config/v1"
10-
helmClient "github.com/covexo/devspace/pkg/devspace/helm"
11-
"github.com/covexo/devspace/pkg/devspace/kubectl"
4+
"github.com/covexo/devspace/pkg/devspace/configure"
125
"github.com/covexo/devspace/pkg/util/log"
13-
"github.com/covexo/devspace/pkg/util/yamlutil"
146
"github.com/spf13/cobra"
157
)
168

179
// RemoveCmd holds the information needed for the remove command
1810
type RemoveCmd struct {
19-
syncFlags *removeSyncCmdFlags
20-
portFlags *removePortCmdFlags
21-
packageFlags *removePackageCmdFlags
11+
syncFlags *removeSyncCmdFlags
12+
portFlags *removePortCmdFlags
13+
packageFlags *removePackageCmdFlags
14+
deploymentFlags *removeDeploymentCmdFlags
2215
}
2316

2417
type removeSyncCmdFlags struct {
@@ -38,11 +31,16 @@ type removePackageCmdFlags struct {
3831
Deployment string
3932
}
4033

34+
type removeDeploymentCmdFlags struct {
35+
RemoveAll bool
36+
}
37+
4138
func init() {
4239
cmd := &RemoveCmd{
43-
syncFlags: &removeSyncCmdFlags{},
44-
portFlags: &removePortCmdFlags{},
45-
packageFlags: &removePackageCmdFlags{},
40+
syncFlags: &removeSyncCmdFlags{},
41+
portFlags: &removePortCmdFlags{},
42+
packageFlags: &removePackageCmdFlags{},
43+
deploymentFlags: &removeDeploymentCmdFlags{},
4644
}
4745

4846
removeCmd := &cobra.Command{
@@ -131,213 +129,60 @@ func init() {
131129
removePackageCmd.Flags().BoolVar(&cmd.packageFlags.RemoveAll, "all", false, "Remove all packages")
132130
removePackageCmd.Flags().StringVarP(&cmd.packageFlags.Deployment, "deployment", "d", "", "The deployment name to use")
133131
removeCmd.AddCommand(removePackageCmd)
134-
}
135-
136-
// RunRemovePackage executes the remove package command logic
137-
func (cmd *RemoveCmd) RunRemovePackage(cobraCmd *cobra.Command, args []string) {
138-
config := configutil.GetConfig()
139-
if config.DevSpace.Deployments == nil || (len(*config.DevSpace.Deployments) != 1 && cmd.packageFlags.Deployment == "") {
140-
log.Fatalf("Please specify the deployment via the -d flag")
141-
}
142-
143-
var deploymentConfig *v1.DeploymentConfig
144-
for _, deployConfig := range *config.DevSpace.Deployments {
145-
if cmd.packageFlags.Deployment == "" || cmd.packageFlags.Deployment == *deployConfig.Name {
146-
if deployConfig.Helm == nil || deployConfig.Helm.ChartPath == nil {
147-
log.Fatalf("Selected deployment %s is not a valid helm deployment", *deployConfig.Name)
148-
}
149132

150-
deploymentConfig = deployConfig
151-
break
152-
}
153-
}
154-
155-
if deploymentConfig == nil {
156-
log.Fatalf("Deployment %s not found", cmd.packageFlags.Deployment)
133+
removeDeploymentCmd := &cobra.Command{
134+
Use: "deployment",
135+
Short: "Removes one or all deployments from the devspace",
136+
Long: `
137+
#######################################################
138+
############ devspace remove deployment ###############
139+
#######################################################
140+
Removes one or all deployments from a devspace:
141+
devspace remove deployment devspace-default
142+
devspace remove deployment --all
143+
#######################################################
144+
`,
145+
Args: cobra.MaximumNArgs(1),
146+
Run: cmd.RunRemoveDeployment,
157147
}
158148

159-
chartPath, err := filepath.Abs(*deploymentConfig.Helm.ChartPath)
160-
if err != nil {
161-
log.Fatal(err)
162-
}
149+
removeDeploymentCmd.Flags().BoolVar(&cmd.deploymentFlags.RemoveAll, "all", false, "Remove all deployments")
150+
removeCmd.AddCommand(removeDeploymentCmd)
151+
}
163152

164-
if len(args) == 0 && cmd.packageFlags.RemoveAll == false {
165-
log.Fatal("You need to specify a package name or the --all flag")
153+
// RunRemoveDeployment executes the specified deployment
154+
func (cmd *RemoveCmd) RunRemoveDeployment(cobraCmd *cobra.Command, args []string) {
155+
name := ""
156+
if len(args) > 0 {
157+
name = args[0]
166158
}
167159

168-
requirementsPath := filepath.Join(chartPath, "requirements.yaml")
169-
yamlContents := map[interface{}]interface{}{}
170-
171-
err = yamlutil.ReadYamlFromFile(requirementsPath, yamlContents)
160+
err := configure.RemoveDeployment(cmd.deploymentFlags.RemoveAll, name)
172161
if err != nil {
173162
log.Fatal(err)
174163
}
175-
176-
if dependencies, ok := yamlContents["dependencies"]; ok {
177-
dependenciesArr, ok := dependencies.([]interface{})
178-
if ok == false {
179-
log.Fatalf("Error parsing yaml: %v", dependencies)
180-
}
181-
182-
if cmd.packageFlags.RemoveAll == false {
183-
for key, dependency := range dependenciesArr {
184-
dependencyMap, ok := dependency.(map[interface{}]interface{})
185-
if ok == false {
186-
log.Fatalf("Error parsing yaml: %v", dependencies)
187-
}
188-
189-
if name, ok := dependencyMap["name"]; ok {
190-
if name == args[0] {
191-
dependenciesArr = append(dependenciesArr[:key], dependenciesArr[key+1:]...)
192-
yamlContents["dependencies"] = dependenciesArr
193-
194-
cmd.rebuildDependencies(chartPath, yamlContents)
195-
break
196-
}
197-
}
198-
}
199-
200-
log.Donef("Successfully removed dependency %s", args[0])
201-
return
202-
}
203-
204-
yamlContents["dependencies"] = []interface{}{}
205-
206-
cmd.rebuildDependencies(chartPath, yamlContents)
207-
log.Done("Successfully removed all dependencies")
208-
return
209-
}
210-
211-
log.Done("No dependencies found")
212164
}
213165

214-
func (cmd *RemoveCmd) rebuildDependencies(chartPath string, newYamlContents map[interface{}]interface{}) {
215-
err := yamlutil.WriteYamlToFile(newYamlContents, filepath.Join(chartPath, "requirements.yaml"))
216-
if err != nil {
217-
log.Fatal(err)
218-
}
219-
220-
// Rebuild dependencies
221-
kubectl, err := kubectl.NewClient()
222-
if err != nil {
223-
log.Fatalf("Unable to create new kubectl client: %v", err)
224-
}
225-
226-
helm, err := helmClient.NewClient(kubectl, log.GetInstance(), false)
227-
if err != nil {
228-
log.Fatalf("Error initializing helm client: %v", err)
229-
}
230-
231-
log.StartWait("Update chart dependencies")
232-
err = helm.UpdateDependencies(chartPath)
233-
log.StopWait()
234-
166+
// RunRemovePackage executes the remove package command logic
167+
func (cmd *RemoveCmd) RunRemovePackage(cobraCmd *cobra.Command, args []string) {
168+
err := configure.RemovePackage(cmd.packageFlags.RemoveAll, cmd.packageFlags.Deployment, args, log.GetInstance())
235169
if err != nil {
236170
log.Fatal(err)
237171
}
238172
}
239173

240174
// RunRemoveSync executes the remove sync command logic
241175
func (cmd *RemoveCmd) RunRemoveSync(cobraCmd *cobra.Command, args []string) {
242-
config := configutil.GetConfig()
243-
labelSelectorMap, err := parseSelectors(cmd.syncFlags.Selector)
244-
176+
err := configure.RemoveSyncPath(cmd.syncFlags.RemoveAll, cmd.syncFlags.LocalPath, cmd.syncFlags.ContainerPath, cmd.syncFlags.Selector)
245177
if err != nil {
246-
log.Fatalf("Error parsing selectors: %s", err.Error())
247-
}
248-
249-
if len(labelSelectorMap) == 0 && cmd.syncFlags.RemoveAll == false && cmd.syncFlags.LocalPath == "" && cmd.syncFlags.ContainerPath == "" {
250-
log.Errorf("You have to specify at least one of the supported flags")
251-
cobraCmd.Help()
252-
253-
return
254-
}
255-
256-
if config.DevSpace.Sync != nil && len(*config.DevSpace.Sync) > 0 {
257-
newSyncPaths := make([]*v1.SyncConfig, 0, len(*config.DevSpace.Sync)-1)
258-
259-
for _, v := range *config.DevSpace.Sync {
260-
if cmd.syncFlags.RemoveAll ||
261-
cmd.syncFlags.LocalPath == *v.LocalSubPath ||
262-
cmd.syncFlags.ContainerPath == *v.ContainerPath ||
263-
isMapEqual(labelSelectorMap, *v.LabelSelector) {
264-
continue
265-
}
266-
267-
newSyncPaths = append(newSyncPaths, v)
268-
}
269-
270-
config.DevSpace.Sync = &newSyncPaths
271-
272-
err = configutil.SaveConfig()
273-
if err != nil {
274-
log.Fatalf("Couldn't save config file: %s", err.Error())
275-
}
178+
log.Fatal(err)
276179
}
277180
}
278181

279182
// RunRemovePort executes the remove port command logic
280183
func (cmd *RemoveCmd) RunRemovePort(cobraCmd *cobra.Command, args []string) {
281-
config := configutil.GetConfig()
282-
283-
labelSelectorMap, err := parseSelectors(cmd.portFlags.Selector)
184+
err := configure.RemovePort(cmd.portFlags.RemoveAll, cmd.portFlags.Selector, args)
284185
if err != nil {
285-
log.Fatalf("Error parsing selectors: %s", err.Error())
286-
}
287-
288-
argPorts := ""
289-
if len(args) == 1 {
290-
argPorts = args[0]
291-
}
292-
293-
if len(labelSelectorMap) == 0 && cmd.portFlags.RemoveAll == false && argPorts == "" {
294-
log.Errorf("You have to specify at least one of the supported flags")
295-
cobraCmd.Help()
296-
297-
return
298-
}
299-
300-
ports := strings.Split(argPorts, ",")
301-
302-
if config.DevSpace.Ports != nil && len(*config.DevSpace.Ports) > 0 {
303-
newPortForwards := make([]*v1.PortForwardingConfig, 0, len(*config.DevSpace.Ports)-1)
304-
305-
for _, v := range *config.DevSpace.Ports {
306-
if cmd.portFlags.RemoveAll || isMapEqual(labelSelectorMap, *v.LabelSelector) {
307-
continue
308-
}
309-
310-
newPortMappings := []*v1.PortMapping{}
311-
312-
for _, pm := range *v.PortMappings {
313-
if containsPort(strconv.Itoa(*pm.LocalPort), ports) || containsPort(strconv.Itoa(*pm.RemotePort), ports) {
314-
continue
315-
}
316-
317-
newPortMappings = append(newPortMappings, pm)
318-
}
319-
320-
if len(newPortMappings) > 0 {
321-
v.PortMappings = &newPortMappings
322-
newPortForwards = append(newPortForwards, v)
323-
}
324-
}
325-
326-
config.DevSpace.Ports = &newPortForwards
327-
328-
err = configutil.SaveConfig()
329-
if err != nil {
330-
log.Fatalf("Couldn't save config file: %s", err.Error())
331-
}
332-
}
333-
}
334-
335-
func containsPort(port string, ports []string) bool {
336-
for _, v := range ports {
337-
if strings.TrimSpace(v) == port {
338-
return true
339-
}
186+
log.Fatal(err)
340187
}
341-
342-
return false
343188
}

cmd/reset.go

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ func (cmd *ResetCmd) deleteInternalRegistry() {
8181

8282
if config.InternalRegistry != nil {
8383
shouldRegistryRemoved := *stdinutil.GetFromStdin(&stdinutil.GetFromStdinParams{
84-
Question: "Should the internal registry be removed? (y/n)",
84+
Question: "\n\nShould the internal registry be removed? (y/n)",
8585
DefaultValue: "y",
8686
ValidationRegexPattern: "^(y|n)$",
8787
}) == "y"
@@ -112,7 +112,7 @@ func (cmd *ResetCmd) deleteTiller() {
112112

113113
if config.Tiller != nil {
114114
shouldRemoveTiller := *stdinutil.GetFromStdin(&stdinutil.GetFromStdinParams{
115-
Question: "Should the tiller server be removed? (y/n)",
115+
Question: "\n\nShould the tiller server be removed? (y/n)",
116116
DefaultValue: "y",
117117
ValidationRegexPattern: "^(y|n)$",
118118
}) == "y"
@@ -143,7 +143,7 @@ func (cmd *ResetCmd) deleteDeploymentFiles() {
143143
_, err := os.Stat(absChartPath)
144144
if os.IsNotExist(err) == false {
145145
deleteChart := *stdinutil.GetFromStdin(&stdinutil.GetFromStdinParams{
146-
Question: "Should the Chart (" + *deployConfig.Helm.ChartPath + "/*) be removed? (y/n)",
146+
Question: "\n\nShould the Chart (" + *deployConfig.Helm.ChartPath + "/*) be removed? (y/n)",
147147
DefaultValue: "y",
148148
ValidationRegexPattern: "^(y|n)$",
149149
}) == "y"
@@ -176,7 +176,7 @@ func (cmd *ResetCmd) deleteImageFiles() {
176176
_, err = os.Stat(absDockerfilePath)
177177
if os.IsNotExist(err) == false {
178178
deleteDockerfile := *stdinutil.GetFromStdin(&stdinutil.GetFromStdinParams{
179-
Question: "Should " + dockerfilePath + " be removed? (y/n)",
179+
Question: "\n\nShould " + dockerfilePath + " be removed? (y/n)",
180180
DefaultValue: "y",
181181
ValidationRegexPattern: "^(y|n)$",
182182
}) == "y"
@@ -201,7 +201,7 @@ func (cmd *ResetCmd) deleteImageFiles() {
201201
_, err = os.Stat(absDockerIgnorePath)
202202
if os.IsNotExist(err) == false {
203203
deleteDockerIgnore := *stdinutil.GetFromStdin(&stdinutil.GetFromStdinParams{
204-
Question: "Should " + absDockerIgnorePath + " be removed? (y/n)",
204+
Question: "\n\nShould " + absDockerIgnorePath + " be removed? (y/n)",
205205
DefaultValue: "y",
206206
ValidationRegexPattern: "^(y|n)$",
207207
}) == "y"
@@ -218,7 +218,7 @@ func (cmd *ResetCmd) deleteClusterRoleBinding() {
218218
_, err := cmd.kubectl.RbacV1beta1().ClusterRoleBindings().Get(clusterRoleBindingName, metav1.GetOptions{})
219219
if err == nil {
220220
deleteRoleBinding := *stdinutil.GetFromStdin(&stdinutil.GetFromStdinParams{
221-
Question: "Should the ClusterRoleBinding '" + clusterRoleBindingName + "' be removed? (y/n)",
221+
Question: "\n\nShould the ClusterRoleBinding '" + clusterRoleBindingName + "' be removed? (y/n)",
222222
DefaultValue: "y",
223223
ValidationRegexPattern: "^(y|n)$",
224224
}) == "y"
@@ -239,7 +239,7 @@ func (cmd *ResetCmd) deleteClusterRoleBinding() {
239239

240240
func (cmd *ResetCmd) deleteDevspaceFolder() {
241241
deleteDevspaceFolder := *stdinutil.GetFromStdin(&stdinutil.GetFromStdinParams{
242-
Question: "Should the .devspace folder be removed? (y/n)",
242+
Question: "\n\nShould the .devspace folder be removed? (y/n)",
243243
DefaultValue: "y",
244244
ValidationRegexPattern: "^(y|n)$",
245245
}) == "y"

cmd/up.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,7 @@ func (cmd *UpCmd) Run(cobraCmd *cobra.Command, args []string) {
150150

151151
defer func() {
152152
for _, v := range syncConfigs {
153-
v.Stop()
153+
v.Stop(nil)
154154
}
155155
}()
156156
}

pkg/devspace/config/configutil/get.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,9 @@ const OverwriteConfigPath = "/.devspace/overwrite.yaml"
2828
// DefaultDevspaceDeploymentName is the name of the initial default deployment
2929
const DefaultDevspaceDeploymentName = "devspace-default"
3030

31+
// CurrentConfigVersion has the value of the current config version
32+
const CurrentConfigVersion = "v1alpha1"
33+
3134
// Global config vars
3235
var config *v1.Config
3336
var configRaw *v1.Config
@@ -84,6 +87,10 @@ func GetConfig() *v1.Config {
8487
merge(overwriteConfig, overwriteConfigRaw, unsafe.Pointer(&overwriteConfig), unsafe.Pointer(overwriteConfigRaw))
8588
merge(config, overwriteConfig, unsafe.Pointer(&config), unsafe.Pointer(overwriteConfig))
8689

90+
if config.Version == nil || *config.Version != CurrentConfigVersion {
91+
log.Fatal("Your config is out of date. Please run `devspace init -r` to update your config")
92+
}
93+
8794
SetDefaults(config)
8895
})
8996

0 commit comments

Comments
 (0)