Browse code

oc set env must respect --overwrite=false

Fabiano Franz authored on 2016/06/23 06:17:41
Showing 2 changed files
... ...
@@ -92,10 +92,10 @@ func NewCmdEnv(fullName string, f *clientcmd.Factory, in io.Reader, out io.Write
92 92
 	return cmd
93 93
 }
94 94
 
95
-func validateNoOverwrites(meta *kapi.ObjectMeta, labels map[string]string) error {
96
-	for key := range labels {
97
-		if value, found := meta.Labels[key]; found {
98
-			return fmt.Errorf("'%s' already has a value (%s), and --overwrite is false", key, value)
95
+func validateNoOverwrites(existing []kapi.EnvVar, env []kapi.EnvVar) error {
96
+	for _, e := range env {
97
+		if current, exists := findEnv(existing, e.Name); exists && current.Value != e.Value {
98
+			return fmt.Errorf("'%s' already has a value (%s), and --overwrite is false", current.Name, current.Value)
99 99
 		}
100 100
 	}
101 101
 	return nil
... ...
@@ -116,7 +116,7 @@ func RunEnv(f *clientcmd.Factory, in io.Reader, out io.Writer, cmd *cobra.Comman
116 116
 	list := kcmdutil.GetFlagBool(cmd, "list")
117 117
 	selector := kcmdutil.GetFlagString(cmd, "selector")
118 118
 	all := kcmdutil.GetFlagBool(cmd, "all")
119
-	//overwrite := kcmdutil.GetFlagBool(cmd, "overwrite")
119
+	overwrite := kcmdutil.GetFlagBool(cmd, "overwrite")
120 120
 	resourceVersion := kcmdutil.GetFlagString(cmd, "resource-version")
121 121
 	outputFormat := kcmdutil.GetFlagString(cmd, "output")
122 122
 
... ...
@@ -177,6 +177,7 @@ func RunEnv(f *clientcmd.Factory, in io.Reader, out io.Writer, cmd *cobra.Comman
177 177
 	}
178 178
 
179 179
 	skipped := 0
180
+	errored := 0
180 181
 	for _, info := range infos {
181 182
 		ok, err := f.UpdatePodSpecForObject(info.Object, func(spec *kapi.PodSpec) error {
182 183
 			containers, _ := selectContainers(spec.Containers, containerMatch)
... ...
@@ -185,6 +186,13 @@ func RunEnv(f *clientcmd.Factory, in io.Reader, out io.Writer, cmd *cobra.Comman
185 185
 				return nil
186 186
 			}
187 187
 			for _, c := range containers {
188
+				if !overwrite {
189
+					if err := validateNoOverwrites(c.Env, env); err != nil {
190
+						errored++
191
+						return err
192
+					}
193
+				}
194
+
188 195
 				c.Env = updateEnv(c.Env, env, remove)
189 196
 
190 197
 				if list {
... ...
@@ -207,6 +215,12 @@ func RunEnv(f *clientcmd.Factory, in io.Reader, out io.Writer, cmd *cobra.Comman
207 207
 				if vars == nil {
208 208
 					return fmt.Errorf("no environment variables provided")
209 209
 				}
210
+				if !overwrite {
211
+					if err := validateNoOverwrites(*vars, env); err != nil {
212
+						errored++
213
+						return err
214
+					}
215
+				}
210 216
 				*vars = updateEnv(*vars, env, remove)
211 217
 				if list {
212 218
 					fmt.Fprintf(out, "# %s %s\n", info.Mapping.Resource, info.Name)
... ...
@@ -229,6 +243,9 @@ func RunEnv(f *clientcmd.Factory, in io.Reader, out io.Writer, cmd *cobra.Comman
229 229
 	if one && skipped == len(infos) {
230 230
 		return fmt.Errorf("%s/%s is not a pod or does not have a pod template", infos[0].Mapping.Resource, infos[0].Name)
231 231
 	}
232
+	if errored == len(infos) {
233
+		return fmt.Errorf("no environment variable has been set")
234
+	}
232 235
 
233 236
 	if list {
234 237
 		return nil
... ...
@@ -214,7 +214,10 @@ os::test::junit::declare_suite_end
214 214
 os::test::junit::declare_suite_start "cmd/basicresources/setenv"
215 215
 os::cmd::expect_success "oc create -f test/integration/testdata/test-deployment-config.yaml"
216 216
 os::cmd::expect_success "oc create -f test/integration/testdata/test-buildcli.json"
217
-os::cmd::expect_success_and_text "oc set env dc/test-deployment-config FOO=bar" "updated"
217
+os::cmd::expect_success_and_text "oc set env dc/test-deployment-config FOO=1st" "updated"
218
+os::cmd::expect_success_and_text "oc set env dc/test-deployment-config FOO=2nd" "updated"
219
+os::cmd::expect_success_and_text "oc set env dc/test-deployment-config FOO=bar --overwrite" "updated"
220
+os::cmd::expect_failure_and_text "oc set env dc/test-deployment-config FOO=zee --overwrite=false" "already has a value"
218 221
 os::cmd::expect_success_and_text "oc set env dc/test-deployment-config --list" "FOO=bar"
219 222
 os::cmd::expect_success_and_text "oc set env bc --all FOO=bar" "updated"
220 223
 os::cmd::expect_success_and_text "oc set env bc --all --list" "FOO=bar"