Skip to content

Commit 5693a5d

Browse files
author
Jan Wozniak
committed
oc new-app: allow 'dot' in ENV variable names and annotations
fixes: openshift#8771 reuses validators from kubernetes/kubernetes#48986
1 parent 8af9b16 commit 5693a5d

File tree

4 files changed

+19
-20
lines changed

4 files changed

+19
-20
lines changed

pkg/oc/generate/app/env.go

+4-5
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import (
99
"strings"
1010

1111
"github.com/joho/godotenv"
12-
utilenv "github.com/openshift/origin/pkg/oc/util/env"
12+
"k8s.io/apimachinery/pkg/util/validation"
1313
kapi "k8s.io/kubernetes/pkg/apis/core"
1414
)
1515

@@ -39,10 +39,9 @@ func ParseEnvironment(vals ...string) (Environment, []string, []error) {
3939
duplicates := []string{}
4040
env := make(Environment)
4141
for _, s := range vals {
42-
valid := utilenv.IsValidEnvironmentArgument(s)
4342
p := strings.SplitN(s, "=", 2)
44-
if !valid || len(p) != 2 {
45-
errs = append(errs, fmt.Errorf("invalid parameter assignment in %q", s))
43+
if err := validation.IsEnvVarName(p[0]); len(err) != 0 || len(p) != 2 {
44+
errs = append(errs, fmt.Errorf("invalid parameter assignment in %q, %v", s, err))
4645
continue
4746
}
4847
key, val := p[0], p[1]
@@ -166,7 +165,7 @@ func LoadEnvironmentFile(filename string, stdin io.Reader) (Environment, error)
166165
return nil, fmt.Errorf("Cannot read variables from file %q: %s", errorFilename, err)
167166
}
168167
for k, v := range env {
169-
if !utilenv.IsValidEnvironmentArgument(fmt.Sprintf("%s=%s", k, v)) {
168+
if err := validation.IsEnvVarName(k); len(err) != 0 {
170169
return nil, fmt.Errorf("invalid parameter assignment in %s=%s", k, v)
171170
}
172171
}

pkg/oc/util/env/env.go

+8-13
Original file line numberDiff line numberDiff line change
@@ -8,20 +8,16 @@ import (
88
"strings"
99

1010
"k8s.io/apimachinery/pkg/util/sets"
11+
"k8s.io/apimachinery/pkg/util/validation"
1112
kapi "k8s.io/kubernetes/pkg/apis/core"
1213
)
1314

1415
var argumentEnvironment = regexp.MustCompile(`(?ms)^(.+)\=(.*)$`)
15-
var validArgumentEnvironment = regexp.MustCompile(`(?ms)^(\w+)\=(.*)$`)
1616

1717
func IsEnvironmentArgument(s string) bool {
1818
return argumentEnvironment.MatchString(s)
1919
}
2020

21-
func IsValidEnvironmentArgument(s string) bool {
22-
return validArgumentEnvironment.MatchString(s)
23-
}
24-
2521
func SplitEnvironmentFromResources(args []string) (resources, envArgs []string, ok bool) {
2622
first := true
2723
for _, s := range args {
@@ -50,8 +46,6 @@ func parseIntoEnvVar(spec []string, defaultReader io.Reader, envVarType string)
5046
var remove []string
5147
for _, envSpec := range spec {
5248
switch {
53-
case !IsValidEnvironmentArgument(envSpec) && !strings.HasSuffix(envSpec, "-"):
54-
return nil, nil, fmt.Errorf("%ss must be of the form key=value and can only contain letters, numbers, and underscores", envVarType)
5549
case envSpec == "-":
5650
if defaultReader == nil {
5751
return nil, nil, fmt.Errorf("when '-' is used, STDIN must be open")
@@ -63,18 +57,19 @@ func parseIntoEnvVar(spec []string, defaultReader io.Reader, envVarType string)
6357
env = append(env, fileEnv...)
6458
case strings.Contains(envSpec, "="):
6559
parts := strings.SplitN(envSpec, "=", 2)
66-
if len(parts) != 2 {
67-
return nil, nil, fmt.Errorf("invalid %s: %v", envVarType, envSpec)
60+
n, v := parts[0], parts[1]
61+
if errs := validation.IsEnvVarName(n); len(errs) != 0 {
62+
return nil, nil, fmt.Errorf("%ss must be of the form key=value, but is %q", envVarType, envSpec)
6863
}
69-
exists.Insert(parts[0])
64+
exists.Insert(n)
7065
env = append(env, kapi.EnvVar{
71-
Name: parts[0],
72-
Value: parts[1],
66+
Name: n,
67+
Value: v,
7368
})
7469
case strings.HasSuffix(envSpec, "-"):
7570
remove = append(remove, envSpec[:len(envSpec)-1])
7671
default:
77-
return nil, nil, fmt.Errorf("unknown %s: %v", envVarType, envSpec)
72+
return nil, nil, fmt.Errorf("%ss must be of the form key=value, but is %q", envVarType, envSpec)
7873
}
7974
}
8075
for _, removeLabel := range remove {

test/cmd/env.sh

+5-1
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,17 @@ os::cmd::expect_success_and_text 'oc set env dc/node --list' 'deploymentconfigs
1111
os::cmd::expect_success_and_text 'oc set env dc --all --containers="node" key-' 'deploymentconfig "node" updated'
1212
os::cmd::expect_failure_and_text 'oc set env dc --all --containers="node"' 'error: at least one environment variable must be provided'
1313
os::cmd::expect_failure_and_not_text 'oc set env --from=secret/mysecret dc/node' 'error: at least one environment variable must be provided'
14-
os::cmd::expect_failure_and_text 'oc set env dc/node test#abc=1234' 'environment variables must be of the form key=value'
14+
os::cmd::expect_failure_and_text 'oc set env dc/node test#abc=1234' 'environment variables must be of the form key=value, but is "test#abc=1234"'
1515

1616
# ensure deleting a var through --env does not result in an error message
1717
os::cmd::expect_success_and_text 'oc set env dc/node key=value' 'deploymentconfig "node" updated'
18+
os::cmd::expect_success_and_text 'oc set env dc/node dots.in.a.key=dots.in.a.value' 'deploymentconfig "node" updated'
1819
os::cmd::expect_success_and_text 'oc set env dc --all --containers="node" --env=key-' 'deploymentconfig "node" updated'
1920
# ensure deleting a var through --env actually deletes the env var
2021
os::cmd::expect_success_and_not_text "oc get dc/node -o jsonpath='{ .spec.template.spec.containers[?(@.name==\"node\")].env }'" 'name\:key'
22+
os::cmd::expect_success_and_text "oc get dc/node -o jsonpath='{ .spec.template.spec.containers[?(@.name==\"node\")].env }'" 'name\:key.with.dots'
23+
os::cmd::expect_success_and_text 'oc set env dc --all --containers="node" --env=dots.in.a.key-' 'deploymentconfig "node" updated'
24+
os::cmd::expect_success_and_not_text "oc get dc/node -o jsonpath='{ .spec.template.spec.containers[?(@.name==\"node.with.dots\")].env }'" 'name\:dots.in.a.key'
2125

2226
# check that env vars are not split at commas
2327
os::cmd::expect_success_and_text 'oc set env -o yaml dc/node PASS=x,y=z' 'value: x,y=z'

test/cmd/images.sh

+2-1
Original file line numberDiff line numberDiff line change
@@ -98,9 +98,10 @@ os::cmd::try_until_success 'oc get imagestreamtags tag:8'
9898
os::cmd::expect_success 'oc create imagestreamtag tag:9 --scheduled --reference-policy=Local --from-image=mysql:latest'
9999
os::cmd::expect_success 'oc create imagestream tag-b'
100100
os::cmd::expect_success 'oc create imagestreamtag tag-b:1 --from=wildfly:12.0'
101+
os::cmd::expect_success 'oc create imagestreamtag tag-c:1 -A annotation.with.dots=are.ok'
101102

102103
os::cmd::expect_failure_and_text 'oc create imagestreamtag tag-c --from-image=mysql:latest' 'must be of the form <stream_name>:<tag>'
103-
os::cmd::expect_failure_and_text 'oc create imagestreamtag tag-c:1 -A foo' 'annotations must be of the form key=value'
104+
os::cmd::expect_failure_and_text 'oc create imagestreamtag tag-c:1 -A foo' 'annotations must be of the form key=value, but is "foo"'
104105
os::cmd::expect_failure_and_text 'oc create imagestreamtag tag-c:2 --from=mysql --from-image=mysql:latest' '\--from and --from-image may not be used together'
105106

106107
os::cmd::expect_success_and_text 'oc get istag/tag:1 -o jsonpath={.image.dockerImageReference}' 'wildfly.*@sha256:'

0 commit comments

Comments
 (0)