Add support for replacing more params using job templates

Change-Id: Ib5ef66a2a5504dee190f65912c910bd5131f71ab
diff --git a/README.rst b/README.rst
old mode 100755
new mode 100644
index fe3421d..b24514d
--- a/README.rst
+++ b/README.rst
@@ -352,6 +352,8 @@
 
 Interpolating parameters for job templates.
 
+.. code-block:: yaml
+
     _param:
       salt_formulas:
       - aodh
@@ -368,6 +370,22 @@
             param:
               formula: ${_param:salt_formulas}
 
+Or simply define multiple jobs and it's parameters to replace from template:
+
+.. code-block:: yaml
+
+   jenkins:
+     client:
+       job_template:
+         test_workflow_template:
+           name: test-{{name}}-{{myparam}}
+           template:
+             ...
+           jobs:
+             - name: firstjob
+               myparam: dummy
+             - name: secondjob
+               myparam: dummyaswell
 
 Purging undefined jobs from Jenkins
 
diff --git a/jenkins/client/_job.sls b/jenkins/client/_job.sls
new file mode 100644
index 0000000..003a11a
--- /dev/null
+++ b/jenkins/client/_job.sls
@@ -0,0 +1,39 @@
+{%- if job.enabled|default(True) %}
+
+jenkins_job_{{ job_name }}_definition:
+  file.managed:
+  - name: {{ client.dir.jenkins_jobs_root }}/{{ job_name }}.xml
+  - source: salt://jenkins/files/jobs/{{ job.type }}.xml
+  - mode: 400
+  - template: jinja
+  - defaults:
+      job_name: {{ job_name }}
+      {%- if job is defined %}
+      job: {{ job|yaml }}
+      {%- endif %}
+  - require:
+    - file: jenkins_client_dirs
+
+jenkins_job_{{ job_name }}_present:
+  jenkins_job.present:
+  - name: {{ job_name }}
+  - config: {{ client.dir.jenkins_jobs_root }}/{{ job_name }}.xml
+  - watch:
+    - file: jenkins_job_{{ job_name }}_definition
+    - file: /etc/salt/minion.d/_jenkins.conf
+
+{%- else %}
+
+jenkins_job_{{ job_name }}_definition:
+  file.absent:
+  - name: {{ client.dir.jenkins_jobs_root }}/{{ job_name }}.xml
+  - require:
+    - file: jenkins_client_dirs
+
+jenkins_job_{{ job_name }}_absent:
+  jenkins_job.absent:
+  - name: {{ job_name }}
+  - watch:
+    - file: /etc/salt/minion.d/_jenkins.conf
+
+{%- endif %}
diff --git a/jenkins/client/job.sls b/jenkins/client/job.sls
index 217278d..821fff8 100644
--- a/jenkins/client/job.sls
+++ b/jenkins/client/job.sls
@@ -4,44 +4,7 @@
   - jenkins.client
 
 {%- for job_name, job in client.get('job', {}).iteritems() %}
-
-{%- if job.enabled|default(True) %}
-
-jenkins_job_{{ job_name }}_definition:
-  file.managed:
-  - name: {{ client.dir.jenkins_jobs_root }}/{{ job_name }}.xml
-  - source: salt://jenkins/files/jobs/{{ job.type }}.xml
-  - mode: 400
-  - template: jinja
-  - defaults:
-      job_name: {{ job_name }}
-  - require:
-    - file: jenkins_client_dirs
-
-jenkins_job_{{ job_name }}_present:
-  jenkins_job.present:
-  - name: {{ job_name }}
-  - config: {{ client.dir.jenkins_jobs_root }}/{{ job_name }}.xml
-  - watch:
-    - file: jenkins_job_{{ job_name }}_definition
-    - file: /etc/salt/minion.d/_jenkins.conf
-
-{%- else %}
-
-jenkins_job_{{ job_name }}_definition:
-  file.absent:
-  - name: {{ client.dir.jenkins_jobs_root }}/{{ job_name }}.xml
-  - require:
-    - file: jenkins_client_dirs
-
-jenkins_job_{{ job_name }}_absent:
-  jenkins_job.absent:
-  - name: {{ job_name }}
-  - watch:
-    - file: /etc/salt/minion.d/_jenkins.conf
-
-{%- endif %}
-
+  {%- include "jenkins/client/_job.sls" %}
 {%- endfor %}
 
 {%- if client.get('purge_jobs', False) %}
@@ -57,6 +20,15 @@
           {%- do jobs.append(job_name) %}
         {%- endfor %}
       {%- endfor %}
+
+      {%- for job_params in job_template.get('jobs', []) %}
+        {%- set job_name = job.template.name %}
+        {%- for key, value in job_params.iteritems() %}
+          {%- set replacer = "{{" + key + "}}" %}
+          {%- set job_name = job_name|replace(replacer, value) %}
+          {%- do jobs.append(job_name) %}
+        {%- endfor %}
+      {%- endfor %}
     {%- endif %}
   {%- endfor %}
 
diff --git a/jenkins/client/job_template.sls b/jenkins/client/job_template.sls
index e974656..8d519cd 100644
--- a/jenkins/client/job_template.sls
+++ b/jenkins/client/job_template.sls
@@ -5,36 +5,34 @@
 
 {%- for job_template_name, job_template in client.get('job_template', {}).iteritems() %}
   {%- if job_template.get('enabled', true) %}
-    {# now just 1 defined param is supported #}
-    {%- if job_template.param|length == 1 %}
-      {%- for param_name, params in job_template.param.iteritems() %}
-        {%- set replacer = "{{" + param_name + "}}" %}
-        {%- for param in params %}
-          {%- set job_name = job_template.name|replace(replacer, param) %}
-          {%- set job = job_template.template|yaml|replace(replacer, param)|load_yaml %}
-
-jenkins_job_{{ job_name }}_definition:
-  file.managed:
-  - name: {{ client.dir.jenkins_jobs_root }}/{{ job_name }}.xml
-  - source: salt://jenkins/files/jobs/{{ job.type }}.xml
-  - mode: 400
-  - template: jinja
-  - defaults:
-      job_name: {{ job_name }}
-      job: {{ job|yaml }}
-  - require:
-    - file: jenkins_client_dirs
-
-jenkins_job_{{ job_name }}_present:
-  jenkins_job.present:
-  - name: {{ job_name }}
-  - config: {{ client.dir.jenkins_jobs_root }}/{{ job_name }}.xml
-  - watch:
-    - file: jenkins_job_{{ job_name }}_definition
-    - file: /etc/salt/minion.d/_jenkins.conf
-
-        {%- endfor %}
+    {#- Matrix way, simulating behavior of Jenkins job builder, not fully
+        supported at the moment #}
+    {%- for param_name, params in job_template.get('param', {}).iteritems() %}
+      {%- set replacer = "{{" + param_name + "}}" %}
+      {%- for param in params %}
+        {%- set job_name = job_template.name|replace(replacer, param) %}
+        {%- set job = job_template.template|yaml|replace(replacer, param)|load_yaml %}
+        {%- include "jenkins/client/_job.sls" %}
       {%- endfor %}
-    {%- endif %}
+    {%- endfor %}
+
+    {#- Simple list of jobs togenerate with multiple parameters to replace #}
+    {%- for job_params in job_template.get('jobs', []) %}
+      {%- set _job_name = [job_template.name] %}
+      {%- set _job = [job_template.template] %}
+
+      {%- for key, value in job_params.iteritems() %}
+        {#- You may think WTF hack is this but we can't update variables in
+            inner scope to replace all parameters. But we can abuse lists for
+            this purpose }:-) #}
+        {%- set replacer = "{{" + key + "}}" %}
+        {%- do _job_name.append(_job_name|last|replace(replacer, value)) %}
+        {%- do _job.append(_job|last|yaml|replace(replacer, value)|load_yaml) %}
+      {%- endfor %}
+
+      {%- set job_name = _job_name|last %}
+      {%- set job = _job|last %}
+      {%- include "jenkins/client/_job.sls" %}
+    {%- endfor %}
   {%- endif %}
 {%- endfor %}