Add support for putting releases in different namespaces

Change-Id: Ia27ede7289857db3aef866ca6ef63cb22cd7fe68
diff --git a/_modules/helm.py b/_modules/helm.py
index 23e28c4..f6d7088 100644
--- a/_modules/helm.py
+++ b/_modules/helm.py
@@ -12,18 +12,19 @@
     }
 
 
-def release_exists(name):
-    cmd = _helm_cmd('list', '--short', '--all', name)
+def release_exists(name, namespace):
+    cmd = _helm_cmd('list', '--short', '--all', '--namespace', namespace, name)
     return __salt__['cmd.run_stdout'](**cmd) == name
 
 
-def release_create(name, chart_name, version=None, values=None):
+def release_create(name, namespace, chart_name, version=None, values=None):
     args = []
     if version is not None:
         args += ['--version', version]
     if values is not None:
         args += ['--values', '/dev/stdin']
-    cmd = _helm_cmd('install', '--name', name, chart_name, *args)
+    cmd = _helm_cmd('install', '--namespace', namespace,
+                    '--name', name, chart_name, *args)
     if values is not None:
         cmd['stdin'] = yaml.serialize(values, default_flow_style=False)
     LOG.debug('Creating release with args: %s', cmd)
@@ -35,13 +36,14 @@
     return __salt__['cmd.retcode'](**cmd) == 0
 
 
-def release_upgrade(name, chart_name, version=None, values=None):
+def release_upgrade(name, namespace, chart_name, version=None, values=None):
     args = []
     if version is not None:
         args += ['--version', version]
     if values is not None:
         args += ['--values', '/dev/stdin']
-    cmd = _helm_cmd('upgrade', name, chart_name, *args)
+    cmd = _helm_cmd('upgrade', '--namespace', namespace,
+                    name, chart_name, *args)
     if values is not None:
         cmd['stdin'] = yaml.serialize(values, default_flow_style=False)
     LOG.debug('Upgrading release with args: %s', cmd)
diff --git a/_states/helm_release.py b/_states/helm_release.py
index 1004afb..b3b4fac 100644
--- a/_states/helm_release.py
+++ b/_states/helm_release.py
@@ -13,11 +13,11 @@
     }
 
 
-def present(name, chart_name, version=None, values=None):
-    exists =  __salt__['helm.release_exists'](name)
+def present(name, chart_name, namespace, version=None, values=None):
+    exists =  __salt__['helm.release_exists'](name, namespace)
     if not exists:
         result = __salt__['helm.release_create'](
-            name, chart_name, version, values)
+            name, namespace, chart_name, version, values)
         if not result:
             return failure(name, 'Failed to create release "{}"'.format(name))
         return {
@@ -29,7 +29,7 @@
 
     old_values = __salt__['helm.get_values'](name)
     result = __salt__['helm.release_upgrade'](
-        name, chart_name, version, values)
+        name, namespace, chart_name, version, values)
     if not result:
         return failure(name, 'Failed to create release "{}"'.format(name))
 
@@ -54,8 +54,8 @@
     }
 
 
-def absent(name):
-    exists =  __salt__['helm.release_exists'](name)
+def absent(name, namespace):
+    exists =  __salt__['helm.release_exists'](name, namespace)
     if not exists:
         return {
             'name': name,
diff --git a/helm/client.sls b/helm/client.sls
index 4f83105..0d0678c 100644
--- a/helm/client.sls
+++ b/helm/client.sls
@@ -74,27 +74,40 @@
       - cmd: prepare_client
 {%- endfor %}
 
+{%- set namespaces = [] %}
 {%- for release_id, release in client.releases.items() %}
 {%- set release_name = release.get('name', release_id) %}
+{%- set namespace = release.get('namespace', 'default') %}
 {%- if release.get('enabled', True) %}
 ensure_{{ release_id }}_release:
   helm_release.present:
     - name: {{ release_name }}
     - chart_name: {{ release['chart'] }}
+    - namespace: {{ namespace }}
     {%- if release.get('version') %}
     - version: {{ release['version'] }}
-    {% endif %}
+    {%- endif %}
     {%- if release.get('values') %}
     - values:
         {{ release['values']|yaml(False)|indent(8) }}
-    {% endif %}
+    {%- endif %}
     - require:
       - cmd: wait_for_tiller
+      - cmd: ensure_{{ namespace }}_namespace
+    {%- do namespaces.append(namespace) %}
 {%- else %}{# not release.enabled #}
 absent_{{ release_id }}_release:
   helm_release.absent:
     - name: {{ release_name }}
+    - namespace: {{ namespace }}
 {%- endif %}{# release.enabled #}
 {%- endfor %}{# release_id, release in client.releases #}
 
+{%- for namespace in namespaces %}
+ensure_{{ namespace }}_namespace:
+  cmd.run:
+    - name: kubectl create namespace {{ namespace }}
+    - unless: kubectl get namespace {{ namespace }}
+{%- endfor %}
+
 {%- endif %}