Skip to content

Commit 58883a6

Browse files
committed
Support config_path and config_paths
1 parent 5a16a65 commit 58883a6

File tree

3 files changed

+48
-77
lines changed

3 files changed

+48
-77
lines changed

kubernetes/provider.go

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,12 @@ func Provider() *schema.Provider {
7676
Optional: true,
7777
Description: "A list of paths to kube config files. Can be set with KUBE_CONFIG_PATHS environment variable.",
7878
},
79+
"config_path": {
80+
Type: schema.TypeString,
81+
Optional: true,
82+
DefaultFunc: schema.EnvDefaultFunc("KUBE_CONFIG_PATH", ""),
83+
Description: "Path to the kube config file. Can be set with KUBE_CONFIG_PATH.",
84+
},
7985
"config_context": {
8086
Type: schema.TypeString,
8187
Optional: true,
@@ -263,7 +269,10 @@ func initializeConfiguration(d *schema.ResourceData) (*restclient.Config, error)
263269
loader := &clientcmd.ClientConfigLoadingRules{}
264270

265271
configPaths := []string{}
266-
if v, ok := d.Get("config_paths").([]string); ok && len(v) > 0 {
272+
273+
if v, ok := d.Get("config_path").(string); ok && v != "" {
274+
configPaths = []string{v}
275+
} else if v, ok := d.Get("config_paths").([]string); ok && len(v) > 0 {
267276
configPaths = v
268277
} else if v := os.Getenv("KUBE_CONFIG_PATHS"); v != "" {
269278
// NOTE we have to do this here because the schema
@@ -281,7 +290,12 @@ func initializeConfiguration(d *schema.ResourceData) (*restclient.Config, error)
281290
log.Printf("[DEBUG] Using kubeconfig: %s", path)
282291
expandedPaths = append(expandedPaths, path)
283292
}
284-
loader.Precedence = expandedPaths
293+
294+
if len(expandedPaths) == 1 {
295+
loader.ExplicitPath = expandedPaths[0]
296+
} else {
297+
loader.Precedence = expandedPaths
298+
}
285299

286300
ctxSuffix := "; default context"
287301

kubernetes/provider_test.go

Lines changed: 30 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ func TestProvider_configure(t *testing.T) {
7373
resetEnv := unsetEnv(t)
7474
defer resetEnv()
7575

76-
os.Setenv("KUBE_CONFIG_PATHS", "test-fixtures/kube-config.yaml")
76+
os.Setenv("KUBE_CONFIG_PATH", "test-fixtures/kube-config.yaml")
7777
os.Setenv("KUBE_CTX", "gcp")
7878

7979
rc := terraform.NewResourceConfigRaw(map[string]interface{}{})
@@ -87,79 +87,33 @@ func TestProvider_configure(t *testing.T) {
8787
func unsetEnv(t *testing.T) func() {
8888
e := getEnv()
8989

90-
if err := os.Unsetenv("KUBE_CONFIG_PATHS"); err != nil {
91-
t.Fatalf("Error unsetting env var KUBE_CONFIG_PATHS: %s", err)
90+
envVars := map[string]string{
91+
"KUBE_CONFIG_PATH": e.ConfigPath,
92+
"KUBE_CONFIG_PATHS": strings.Join(e.ConfigPaths, ":"),
93+
"KUBE_CTX": e.Ctx,
94+
"KUBE_CTX_AUTH_INFO": e.CtxAuthInfo,
95+
"KUBE_CTX_CLUSTER": e.CtxCluster,
96+
"KUBE_HOST": e.Host,
97+
"KUBE_USER": e.User,
98+
"KUBE_PASSWORD": e.Password,
99+
"KUBE_CLIENT_CERT_DATA": e.ClientCertData,
100+
"KUBE_CLIENT_KEY_DATA": e.ClientKeyData,
101+
"KUBE_CLUSTER_CA_CERT_DATA": e.ClusterCACertData,
102+
"KUBE_INSECURE": e.Insecure,
103+
"KUBE_TOKEN": e.Token,
92104
}
93-
if err := os.Unsetenv("KUBE_CTX"); err != nil {
94-
t.Fatalf("Error unsetting env var KUBE_CTX: %s", err)
95-
}
96-
if err := os.Unsetenv("KUBE_CTX_AUTH_INFO"); err != nil {
97-
t.Fatalf("Error unsetting env var KUBE_CTX_AUTH_INFO: %s", err)
98-
}
99-
if err := os.Unsetenv("KUBE_CTX_CLUSTER"); err != nil {
100-
t.Fatalf("Error unsetting env var KUBE_CTX_CLUSTER: %s", err)
101-
}
102-
if err := os.Unsetenv("KUBE_HOST"); err != nil {
103-
t.Fatalf("Error unsetting env var KUBE_HOST: %s", err)
104-
}
105-
if err := os.Unsetenv("KUBE_USER"); err != nil {
106-
t.Fatalf("Error unsetting env var KUBE_USER: %s", err)
107-
}
108-
if err := os.Unsetenv("KUBE_PASSWORD"); err != nil {
109-
t.Fatalf("Error unsetting env var KUBE_PASSWORD: %s", err)
110-
}
111-
if err := os.Unsetenv("KUBE_CLIENT_CERT_DATA"); err != nil {
112-
t.Fatalf("Error unsetting env var KUBE_CLIENT_CERT_DATA: %s", err)
113-
}
114-
if err := os.Unsetenv("KUBE_CLIENT_KEY_DATA"); err != nil {
115-
t.Fatalf("Error unsetting env var KUBE_CLIENT_KEY_DATA: %s", err)
116-
}
117-
if err := os.Unsetenv("KUBE_CLUSTER_CA_CERT_DATA"); err != nil {
118-
t.Fatalf("Error unsetting env var KUBE_CLUSTER_CA_CERT_DATA: %s", err)
119-
}
120-
if err := os.Unsetenv("KUBE_INSECURE"); err != nil {
121-
t.Fatalf("Error unsetting env var KUBE_INSECURE: %s", err)
122-
}
123-
if err := os.Unsetenv("KUBE_TOKEN"); err != nil {
124-
t.Fatalf("Error unsetting env var KUBE_TOKEN: %s", err)
105+
106+
for k, _ := range envVars {
107+
if err := os.Unsetenv(k); err != nil {
108+
t.Fatalf("Error unsetting env var %s: %s", k, err)
109+
}
125110
}
126111

127112
return func() {
128-
if err := os.Setenv("KUBE_CONFIG_PATHS", strings.Join(e.ConfigPaths, ":")); err != nil {
129-
t.Fatalf("Error resetting env var KUBE_CONFIG_PATHS: %s", err)
130-
}
131-
if err := os.Setenv("KUBE_CTX", e.Ctx); err != nil {
132-
t.Fatalf("Error resetting env var KUBE_CTX: %s", err)
133-
}
134-
if err := os.Setenv("KUBE_CTX_AUTH_INFO", e.CtxAuthInfo); err != nil {
135-
t.Fatalf("Error resetting env var KUBE_CTX_AUTH_INFO: %s", err)
136-
}
137-
if err := os.Setenv("KUBE_CTX_CLUSTER", e.CtxCluster); err != nil {
138-
t.Fatalf("Error resetting env var KUBE_CTX_CLUSTER: %s", err)
139-
}
140-
if err := os.Setenv("KUBE_HOST", e.Host); err != nil {
141-
t.Fatalf("Error resetting env var KUBE_HOST: %s", err)
142-
}
143-
if err := os.Setenv("KUBE_USER", e.User); err != nil {
144-
t.Fatalf("Error resetting env var KUBE_USER: %s", err)
145-
}
146-
if err := os.Setenv("KUBE_PASSWORD", e.Password); err != nil {
147-
t.Fatalf("Error resetting env var KUBE_PASSWORD: %s", err)
148-
}
149-
if err := os.Setenv("KUBE_CLIENT_CERT_DATA", e.ClientCertData); err != nil {
150-
t.Fatalf("Error resetting env var KUBE_CLIENT_CERT_DATA: %s", err)
151-
}
152-
if err := os.Setenv("KUBE_CLIENT_KEY_DATA", e.ClientKeyData); err != nil {
153-
t.Fatalf("Error resetting env var KUBE_CLIENT_KEY_DATA: %s", err)
154-
}
155-
if err := os.Setenv("KUBE_CLUSTER_CA_CERT_DATA", e.ClusterCACertData); err != nil {
156-
t.Fatalf("Error resetting env var KUBE_CLUSTER_CA_CERT_DATA: %s", err)
157-
}
158-
if err := os.Setenv("KUBE_INSECURE", e.Insecure); err != nil {
159-
t.Fatalf("Error resetting env var KUBE_INSECURE: %s", err)
160-
}
161-
if err := os.Setenv("KUBE_TOKEN", e.Token); err != nil {
162-
t.Fatalf("Error resetting env var KUBE_TOKEN: %s", err)
113+
for k, v := range envVars {
114+
if err := os.Setenv(k, v); err != nil {
115+
t.Fatalf("Error resetting env var %s: %s", k, err)
116+
}
163117
}
164118
}
165119
}
@@ -178,7 +132,10 @@ func getEnv() *currentEnv {
178132
Insecure: os.Getenv("KUBE_INSECURE"),
179133
Token: os.Getenv("KUBE_TOKEN"),
180134
}
181-
if v := os.Getenv("KUBE_CONFIG_PATHS"); v != "" {
135+
if v := os.Getenv("KUBE_CONFIG_PATH"); v != "" {
136+
e.ConfigPath = v
137+
}
138+
if v := os.Getenv("KUBE_CONFIG_PATH"); v != "" {
182139
e.ConfigPaths = strings.Split(v, ":")
183140
}
184141
return e
@@ -188,7 +145,7 @@ func testAccPreCheck(t *testing.T) {
188145
ctx := context.TODO()
189146
hasFileCfg := (os.Getenv("KUBE_CTX_AUTH_INFO") != "" && os.Getenv("KUBE_CTX_CLUSTER") != "") ||
190147
os.Getenv("KUBE_CTX") != "" ||
191-
os.Getenv("KUBE_CONFIG_PATHS") != ""
148+
os.Getenv("KUBE_CONFIG_PATH") != ""
192149
hasUserCredentials := os.Getenv("KUBE_USER") != "" && os.Getenv("KUBE_PASSWORD") != ""
193150
hasClientCert := os.Getenv("KUBE_CLIENT_CERT_DATA") != "" && os.Getenv("KUBE_CLIENT_KEY_DATA") != ""
194151
hasStaticCfg := (os.Getenv("KUBE_HOST") != "" &&
@@ -424,6 +381,7 @@ func clusterVersionLessThan(vs string) bool {
424381
}
425382

426383
type currentEnv struct {
384+
ConfigPath string
427385
ConfigPaths []string
428386
Ctx string
429387
CtxAuthInfo string

website/docs/index.html.markdown

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,7 @@ Use the navigation to the left to read about the available resources.
1515

1616
```hcl
1717
provider "kubernetes" {
18-
config_paths = [
19-
"~/.kube/config"
20-
]
18+
config_path = "~/.kube/config"
2119
config_context = "my-context"
2220
}
2321
@@ -124,6 +122,7 @@ The following arguments are supported:
124122
* `client_certificate` - (Optional) PEM-encoded client certificate for TLS authentication. Can be sourced from `KUBE_CLIENT_CERT_DATA`.
125123
* `client_key` - (Optional) PEM-encoded client certificate key for TLS authentication. Can be sourced from `KUBE_CLIENT_KEY_DATA`.
126124
* `cluster_ca_certificate` - (Optional) PEM-encoded root certificates bundle for TLS authentication. Can be sourced from `KUBE_CLUSTER_CA_CERT_DATA`.
125+
* `config_path` - (Optional) A path to a kube config files. Can be sourced from `KUBE_CONFIG_PATH`.
127126
* `config_paths` - (Optional) A list of paths to the kube config files. Can be sourced from `KUBE_CONFIG_PATHS`, which allows `:` to be used to delimit multiple paths.
128127
* `config_context` - (Optional) Context to choose from the config file. Can be sourced from `KUBE_CTX`.
129128
* `config_context_auth_info` - (Optional) Authentication info context of the kube config (name of the kubeconfig user, `--user` flag in `kubectl`). Can be sourced from `KUBE_CTX_AUTH_INFO`.

0 commit comments

Comments
 (0)