Allow to provide custom kubectl config
Allows to connect to any cluster, not just local one.
Change-Id: I75f17ac26a72d7f9ef555e53d3bbe6a08beec15d
diff --git a/_modules/helm.py b/_modules/helm.py
index 80632d1..a71c53c 100644
--- a/_modules/helm.py
+++ b/_modules/helm.py
@@ -20,25 +20,32 @@
tiller_args = ('--host', tiller_kwargs['tiller_host'])
else:
tiller_args = ('--tiller-namespace', tiller_kwargs['tiller_namespace'])
+ env = {'HELM_HOME': HELM_HOME}
+ if tiller_kwargs['kube_config']:
+ env['KUBECONFIG'] = tiller_kwargs['kube_config']
return {
'cmd': ('helm',) + tiller_args + args,
- 'env': {'HELM_HOME': HELM_HOME},
+ 'env': env,
}
def release_exists(name, namespace='default',
- tiller_namespace='kube-system', tiller_host=None):
+ tiller_namespace='kube-system', tiller_host=None,
+ kube_config=None):
cmd = _helm_cmd('list', '--short', '--all', '--namespace', namespace, name,
- tiller_namespace=tiller_namespace, tiller_host=tiller_host)
+ tiller_namespace=tiller_namespace, tiller_host=tiller_host,
+ kube_config=kube_config)
return __salt__['cmd.run_stdout'](**cmd) == name
def release_create(name, chart_name, namespace='default',
version=None, values=None,
- tiller_namespace='kube-system', tiller_host=None):
+ tiller_namespace='kube-system', tiller_host=None,
+ kube_config=None):
tiller_args = {
'tiller_namespace': tiller_namespace,
'tiller_host': tiller_host,
+ 'kube_config': kube_config,
}
args = []
if version is not None:
@@ -53,18 +60,22 @@
return ok_or_output(cmd, 'Failed to create release "{}"'.format(name))
-def release_delete(name, tiller_namespace='kube-system', tiller_host=None):
+def release_delete(name, tiller_namespace='kube-system', tiller_host=None,
+ kube_config=None):
cmd = _helm_cmd('delete', '--purge', name,
- tiller_namespace=tiller_namespace, tiller_host=tiller_host)
+ tiller_namespace=tiller_namespace, tiller_host=tiller_host,
+ kube_config=kube_config)
return ok_or_output(cmd, 'Failed to delete release "{}"'.format(name))
def release_upgrade(name, chart_name, namespace='default',
version=None, values=None,
- tiller_namespace='kube-system', tiller_host=None):
+ tiller_namespace='kube-system', tiller_host=None,
+ kube_config=None):
tiller_args = {
'tiller_namespace': tiller_namespace,
'tiller_host': tiller_host,
+ 'kube_config': kube_config,
}
args = []
if version is not None:
@@ -79,7 +90,9 @@
return ok_or_output(cmd, 'Failed to upgrade release "{}"'.format(name))
-def get_values(name, tiller_namespace='kube-system', tiller_host=None):
+def get_values(name, tiller_namespace='kube-system', tiller_host=None,
+ kube_config=None):
cmd = _helm_cmd('get', 'values', '--all', name,
- tiller_namespace=tiller_namespace, tiller_host=tiller_host)
+ tiller_namespace=tiller_namespace, tiller_host=tiller_host,
+ kube_config=kube_config)
return yaml.deserialize(__salt__['cmd.run_stdout'](**cmd))
diff --git a/_states/helm_release.py b/_states/helm_release.py
index e60c6dc..464e6d6 100644
--- a/_states/helm_release.py
+++ b/_states/helm_release.py
@@ -13,10 +13,12 @@
def present(name, chart_name, namespace, version=None, values=None,
- tiller_namespace='kube-system', tiller_host=None):
+ tiller_namespace='kube-system', tiller_host=None,
+ kube_config=None):
tiller_args = {
'tiller_namespace': tiller_namespace,
'tiller_host': tiller_host,
+ 'kube_config': kube_config,
}
exists = __salt__['helm.release_exists'](name, namespace, **tiller_args)
if not exists:
@@ -58,10 +60,12 @@
}
-def absent(name, namespace, tiller_namespace='kube-system', tiller_host=None):
+def absent(name, namespace, tiller_namespace='kube-system', tiller_host=None,
+ kube_config=None):
tiller_args = {
'tiller_namespace': tiller_namespace,
'tiller_host': tiller_host,
+ 'kube_config': kube_config,
}
exists = __salt__['helm.release_exists'](name, namespace, **tiller_args)
if not exists:
diff --git a/helm/client.sls b/helm/client.sls
index d441da5..07b3d3d 100644
--- a/helm/client.sls
+++ b/helm/client.sls
@@ -4,6 +4,7 @@
{%- set helm_tmp = "/tmp/helm-" + client.version %}
{%- set helm_bin = "/usr/bin/helm-" + client.version %}
{%- set kubectl_bin = "/usr/bin/kubectl" %}
+{%- set kube_config = "/srv/helm/kubeconfig.yaml" %}
{%- set helm_home = "/srv/helm/home" %}
{%- if client.tiller.host %}
{%- set helm_run = "helm --host '{}'".format(client.tiller.host) %}
@@ -54,21 +55,34 @@
- require:
- file: /usr/bin/helm
+{{ kube_config }}:
+ file.managed:
+ - source: salt://helm/files/kubeconfig.yaml.j2
+ - mode: 400
+ - user: root
+ - group: root
+ - template: jinja
+
{%- if client.tiller.install %}
install_tiller:
cmd.run:
- name: {{ helm_run }} init --upgrade
- env:
- HELM_HOME: {{ helm_home }}
+ - KUBECONFIG: {{ kube_config }}
- unless: "{{ helm_run }} version --server --short | grep -E 'Server: v{{ client.version }}(\\+|$)'"
- require:
- cmd: prepare_client
+ - file: {{ kube_config }}
wait_for_tiller:
cmd.run:
- name: while ! {{ helm_run }} list; do sleep 3; done
- env:
- HELM_HOME: {{ helm_home }}
+ - KUBECONFIG: {{ kube_config }}
+ - require:
+ - file: {{ kube_config }}
- onchanges:
- cmd: install_tiller
{%- endif %}
@@ -94,6 +108,7 @@
- name: {{ release_name }}
- chart_name: {{ release['chart'] }}
- namespace: {{ namespace }}
+ - kube_config: {{ kube_config }}
{{ tiller_arg }}
{%- if release.get('version') %}
- version: {{ release['version'] }}
@@ -113,6 +128,7 @@
helm_release.absent:
- name: {{ release_name }}
- namespace: {{ namespace }}
+ - kube_config: {{ kube_config }}
{{ tiller_arg }}
- require:
{%- if client.tiller.install %}
@@ -153,8 +169,11 @@
cmd.run:
- name: kubectl create namespace {{ namespace }}
- unless: kubectl get namespace {{ namespace }}
- {%- if client.kubectl.install %}
+ - env:
+ - KUBECONFIG: {{ kube_config }}
- require:
+ - file: {{ kube_config }}
+ {%- if client.kubectl.install %}
- file: {{ kubectl_bin }}
{%- endif %}
{%- endfor %}
diff --git a/helm/files/kubeconfig.yaml.j2 b/helm/files/kubeconfig.yaml.j2
new file mode 100644
index 0000000..753362b
--- /dev/null
+++ b/helm/files/kubeconfig.yaml.j2
@@ -0,0 +1,19 @@
+{%- from "helm/map.jinja" import client with context %}
+{%- set config = client.kubectl.config %}
+apiVersion: v1
+clusters:
+- cluster:
+ {{ config.cluster|yaml|indent(4) }}
+ name: thecluster
+contexts:
+- context:
+ cluster: thecluster
+ user: theuser
+ name: thecontext
+current-context: thecontext
+kind: Config
+preferences: {}
+users:
+- name: theuser
+ user:
+ {{ config.user|yaml|indent(4) }}
diff --git a/metadata/service/client.yml b/metadata/service/client.yml
index 512e99a..1822dd8 100644
--- a/metadata/service/client.yml
+++ b/metadata/service/client.yml
@@ -18,5 +18,8 @@
download_url: https://dl.k8s.io/v1.6.7/kubernetes-client-linux-amd64.tar.gz
download_hash: sha256=54947ef84181e89f9dbacedd54717cbed5cc7f9c36cb37bc8afc9097648e2c91
tarball_path: kubernetes/client/bin/kubectl
+ config:
+ cluster: {}
+ user: {}
repos: {}
releases: {}