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: {}