Refactor jenkins jobs structure

Change-Id: Ia54cc5a76e3de06f16fd602b78891826d73a4c01
diff --git a/jenkins/client/job/deploy/init.yml b/jenkins/client/job/deploy/init.yml
index 62c92b4..d725c20 100644
--- a/jenkins/client/job/deploy/init.yml
+++ b/jenkins/client/job/deploy/init.yml
@@ -1,5 +1,3 @@
 classes:
-  - system.jenkins.client.job.deploy.mk_lab
-  - system.jenkins.client.job.deploy.cicd_lab
-  - system.jenkins.client.job.deploy.demo
-  - system.jenkins.client.job.deploy.reclass_update
+  - system.jenkins.client.job.deploy.lab
+  - system.jenkins.client.job.deploy.update
diff --git a/jenkins/client/job/deploy/cicd_lab.yml b/jenkins/client/job/deploy/lab/cicd.yml
similarity index 100%
rename from jenkins/client/job/deploy/cicd_lab.yml
rename to jenkins/client/job/deploy/lab/cicd.yml
diff --git a/jenkins/client/job/deploy/demo.yml b/jenkins/client/job/deploy/lab/demo.yml
similarity index 100%
rename from jenkins/client/job/deploy/demo.yml
rename to jenkins/client/job/deploy/lab/demo.yml
diff --git a/jenkins/client/job/deploy/lab/init.yml b/jenkins/client/job/deploy/lab/init.yml
new file mode 100644
index 0000000..24cdcab
--- /dev/null
+++ b/jenkins/client/job/deploy/lab/init.yml
@@ -0,0 +1,6 @@
+classes:
+  - system.jenkins.client.job.deploy.lab.mk.physical
+  - system.jenkins.client.job.deploy.lab.mk.virtual
+  - system.jenkins.client.job.deploy.lab.mk.cleanup
+  - system.jenkins.client.job.deploy.lab.cicd
+  - system.jenkins.client.job.deploy.lab.demo
diff --git a/jenkins/client/job/deploy/lab/mk/cleanup.yml b/jenkins/client/job/deploy/lab/mk/cleanup.yml
new file mode 100644
index 0000000..72e40f5
--- /dev/null
+++ b/jenkins/client/job/deploy/lab/mk/cleanup.yml
@@ -0,0 +1,37 @@
+parameters:
+  jenkins:
+    client:
+      job:
+        deploy-heat-cleanup:
+          type: workflow-scm
+          concurrent: true
+          display_name: "Deploy - heat cleanup"
+          discard:
+            build:
+              keep_num: 20
+          scm:
+            type: git
+            url: "${_param:jenkins_gerrit_url}/mk/mk-pipelines"
+            credentials: "gerrit"
+            script: cleanup-pipeline.groovy
+          param:
+            # openstack api
+            OPENSTACK_API_URL:
+              type: string
+              default: "https://vpc.tcpisek.cz:5000/v2.0"
+            OPENSTACK_API_CREDENTIALS:
+              type: string
+              default: "openstack-qa-credentials"
+            OPENSTACK_API_PROJECT:
+              type: string
+              default: "mirantis_mk20_qa"
+            OPENSTACK_API_CLIENT:
+              type: string
+              default: "liberty"
+            OPENSTACK_API_VERSION:
+              type: string
+              default: "2"
+            # heat
+            HEAT_STACK_NAME:
+              type: string
+              description: This stack will be deleted.
diff --git a/jenkins/client/job/deploy/lab/mk/init.yml b/jenkins/client/job/deploy/lab/mk/init.yml
new file mode 100644
index 0000000..a625bf6
--- /dev/null
+++ b/jenkins/client/job/deploy/lab/mk/init.yml
@@ -0,0 +1,103 @@
+parameters:
+  _param:
+    jenkins_deploy_lab_mk_jobs: []
+  jenkins:
+    client:
+      job_template:
+        deploy_heat_template:
+          name: deploy-{{stack_type}}-{{lab}}
+          jobs: ${_param:jenkins_deploy_lab_mk_jobs}
+          template:
+            type: workflow-scm
+            discard:
+              build:
+                keep_num: 20
+            concurrent: true
+            display_name: "Deploy - {{lab}} {{stack_type}} lab"
+            scm:
+              type: git
+              url: "${_param:jenkins_gerrit_url}/mk/mk-pipelines"
+              credentials: "gerrit"
+              script: lab-pipeline.groovy
+            param:
+              # deployments and test settings
+              STACK_TYPE:
+                type: string
+                default: "{{stack_type}}"
+              INSTALL:
+                type: string
+                default: "{{install}}"
+              TEST:
+                type: string
+                default: ""
+
+              # heat
+              HEAT_TEMPLATE_URL:
+                type: string
+                default: "git@github.com:Mirantis/mk-lab-heat-templates.git"
+              HEAT_TEMPLATE_CREDENTIALS:
+                type: string
+                default: "gerrit"
+              HEAT_TEMPLATE_BRANCH:
+                type: string
+                default: "composite"
+              HEAT_STACK_NAME:
+                type: string
+                description: Heat stack name. Will be generated if missing.
+              HEAT_STACK_TEMPLATE:
+                type: string
+                default: "{{lab}}"
+              HEAT_STACK_ENVIRONMENT:
+                type: string
+                default: "tcpisek"
+              HEAT_STACK_ZONE:
+                type: string
+                default: "mirantis-zone-qa"
+              HEAT_STACK_PUBLIC_NET:
+                type: string
+                default: "mirantis-private"
+              HEAT_STACK_DELETE:
+                type: boolean
+                default: 'true'
+              HEAT_STACK_REUSE:
+                type: boolean
+                default: 'false'
+
+              # salt master
+              SALT_MASTER_CREDENTIALS:
+                type: string
+                default: "salt-qa-credentials"
+              SALT_MASTER_URL:
+                type: string
+                default: ""
+
+              # openstack api
+              OPENSTACK_API_URL:
+                type: string
+                default: "https://vpc.tcpisek.cz:5000/v2.0"
+              OPENSTACK_API_CREDENTIALS:
+                type: string
+                default: "openstack-qa-credentials"
+              OPENSTACK_API_PROJECT:
+                type: string
+                default: "mirantis_mk20_qa"
+              OPENSTACK_API_CLIENT:
+                type: string
+                default: "liberty"
+              OPENSTACK_API_VERSION:
+                type: string
+                default: "2"
+
+              # k8s setttings
+              K8S_API_SERVER:
+                type: string
+                default: "http://127.0.0.1:8080"
+              K8S_CONFORMANCE_IMAGE:
+                type: string
+                default: "docker-dev-virtual.docker.mirantis.net/mirantis/kubernetes/k8s-conformance:v1.5.1-3_1482332392819"
+
+              # Tempest settings
+              TEMPEST_IMAGE_LINK:
+                type: string
+                default: "sandbox-docker-prod-local.docker.mirantis.net/mirantis/rally_tempest:0.1"
+
diff --git a/jenkins/client/job/deploy/lab/mk/physical.yml b/jenkins/client/job/deploy/lab/mk/physical.yml
new file mode 100644
index 0000000..a66909d
--- /dev/null
+++ b/jenkins/client/job/deploy/lab/mk/physical.yml
@@ -0,0 +1,17 @@
+classes:
+  - system.jenkins.client.job.deploy.lab.mk
+parameters:
+  _param:
+    jenkins_deploy_lab_mk_jobs:
+      - lab: mcp10_contrail
+        install: core,kvm,openstack,contrail
+        stack_type: physical
+      - lab: mcp10_opencontrail_nfv
+        install: core,kvm,openstack,nfv
+        stack_type: physical
+      - lab: mcp10_dvr
+        install: core,kvm,openstack,dvr
+        stack_type: physical
+      - lab: mcp10_non_dvr
+        install: core,kvm,openstack
+        stack_type: physical
diff --git a/jenkins/client/job/deploy/lab/mk/virtual.yml b/jenkins/client/job/deploy/lab/mk/virtual.yml
new file mode 100644
index 0000000..af65a4d
--- /dev/null
+++ b/jenkins/client/job/deploy/lab/mk/virtual.yml
@@ -0,0 +1,32 @@
+classes:
+  - system.jenkins.client.job.deploy.lab.mk
+parameters:
+  _param:
+    jenkins_deploy_lab_mk_jobs:
+      - lab: virtual_mcp05_dvr
+        install: core,openstack,dvr
+        stack_type: heat
+      - lab: virtual_mcp05_ovs
+        install: core,openstack,ovs
+        stack_type: heat
+      - lab: virtual_mcp10_contrail
+        install: core,openstack,contrail
+        stack_type: heat
+      - lab: virtual_mcp10_dvr
+        install: core,openstack,dvr
+        stack_type: heat
+      - lab: virtual_mcp10_ovs
+        install: core,openstack,ovs
+        stack_type: heat
+      - lab: virtual_mk20_advanced
+        install: core,openstack
+        stack_type: heat
+      - lab: virtual_mk20_basic
+        install: core,openstack
+        stack_type: heat
+      - lab: virtual_mk22_advanced
+        install: core,openstack
+        stack_type: heat
+      - lab: virtual_mk22_basic
+        install: core,openstack
+        stack_type: heat
diff --git a/jenkins/client/job/deploy/maas_lab.yml b/jenkins/client/job/deploy/maas_lab.yml
deleted file mode 100644
index b4b61e4..0000000
--- a/jenkins/client/job/deploy/maas_lab.yml
+++ /dev/null
@@ -1,67 +0,0 @@
-parameters:
-  jenkins:
-    client:
-      job:
-        heat_maas_lab:
-          type: workflow
-          concurrent: false
-          display_name: "[Heat] Deploy MAAS lab"
-          param:
-            HEAT_TEMPLATE_URL:
-              type: string
-              default: "git@github.com:Mirantis/mk-lab-heat-templates.git"
-            HEAT_TEMPLATE_CREDENTIALS:
-              type: string
-              default: "git-qa"
-            HEAT_TEMPLATE_BRANCH:
-              type: string
-              default: "master"
-            OPENSTACK_API_CLIENT:
-              type: string
-              default: "liberty"
-            OPENSTACK_API_VERSION:
-              type: string
-              default: "2"
-            OPENSTACK_API_URL:
-              type: string
-              default: "https://vpc.tcpisek.cz:5000/v2.0"
-            OPENSTACK_API_CREDENTIALS:
-              type: string
-              default: "openstack-qa"
-            OPENSTACK_API_PROJECT:
-              type: string
-              default: "mirantis_mk20_qa"
-            SALT_MASTER_CREDENTIALS:
-              type: string
-              default: "salt-qa-credentials"
-            HEAT_STACK_NAME:
-              type: string
-              default: "maas_gate"
-            HEAT_STACK_TEMPLATE:
-              type: string
-              default: "maas_lab"
-            HEAT_STACK_ENVIRONMENT:
-              type: string
-              default: "tcpisek"
-            HEAT_STACK_ZONE:
-              type: string
-              default: "mirantis-zone-qa"
-            HEAT_STACK_PUBLIC_NET:
-              type: string
-              default: "inet2"
-          libs:
-          - repository: pipeline_libs
-            file: macro/common.groovy
-          - repository: pipeline_libs
-            file: macro/git.groovy
-          - repository: pipeline_libs
-            file: macro/http.groovy
-          - repository: pipeline_libs
-            file: macro/openstack.groovy
-          - repository: pipeline_libs
-            file: macro/python.groovy
-          - repository: pipeline_libs
-            file: macro/salt.groovy
-          script:
-            repository: pipeline_libs
-            file: pipeline/provision/heat_maas_lab.groovy
diff --git a/jenkins/client/job/deploy/mk_lab.yml b/jenkins/client/job/deploy/mk_lab.yml
deleted file mode 100644
index a36d26e..0000000
--- a/jenkins/client/job/deploy/mk_lab.yml
+++ /dev/null
@@ -1,205 +0,0 @@
-parameters:
-  jenkins:
-    client:
-      job:
-        deploy-update-package:
-          type: workflow-scm
-          concurrent: true
-          display_name: "Update system package(s)"
-          scm:
-            type: git
-            url: "${_param:jenkins_gerrit_url}/mk/mk-pipelines"
-            credentials: "gerrit"
-            script: update-package.groovy
-          param:
-            SALT_MASTER_URL:
-              type: string
-              default: "http://10.10.10.1:8000"
-            SALT_MASTER_CREDENTIALS:
-              type: string
-              default: "salt"
-            UPDATE_SERVERS:
-              type: string
-              default: "*"
-              description: Salt compound target to match nodes to be updated.
-            UPDATE_PACKAGES:
-              type: string
-              default: ""
-              description: Space delimited list of packages to be updates [package1=version package2=version], empty string means all updating all packages to the latest version.
-            UPDATE_COMMIT:
-              type: boolean
-              default: false
-
-        deploy-heat-cleanup:
-          type: workflow-scm
-          concurrent: true
-          display_name: "Deploy - heat cleanup"
-          discard:
-            build:
-              keep_num: 20
-          scm:
-            type: git
-            url: "${_param:jenkins_gerrit_url}/mk/mk-pipelines"
-            credentials: "gerrit"
-            script: cleanup-pipeline.groovy
-          param:
-            # openstack api
-            OPENSTACK_API_URL:
-              type: string
-              default: "https://vpc.tcpisek.cz:5000/v2.0"
-            OPENSTACK_API_CREDENTIALS:
-              type: string
-              default: "openstack-qa-credentials"
-            OPENSTACK_API_PROJECT:
-              type: string
-              default: "mirantis_mk20_qa"
-            OPENSTACK_API_CLIENT:
-              type: string
-              default: "liberty"
-            OPENSTACK_API_VERSION:
-              type: string
-              default: "2"
-            # heat
-            HEAT_STACK_NAME:
-              type: string
-              description: This stack will be deleted.
-
-      job_template:
-        deploy_heat_template:
-          name: deploy-{{stack_type}}-{{lab}}
-          jobs:
-            # virtual
-            - lab: virtual_mcp05_dvr
-              install: core,openstack,dvr
-              stack_type: heat
-            - lab: virtual_mcp05_ovs
-              install: core,openstack,ovs
-              stack_type: heat
-            - lab: virtual_mcp10_contrail
-              install: core,openstack,contrail
-              stack_type: heat
-            - lab: virtual_mcp10_dvr
-              install: core,openstack,dvr
-              stack_type: heat
-            - lab: virtual_mcp10_ovs
-              install: core,openstack,ovs
-              stack_type: heat
-            - lab: virtual_mk20_advanced
-              install: core,openstack
-              stack_type: heat
-            - lab: virtual_mk20_basic
-              install: core,openstack
-              stack_type: heat
-            - lab: virtual_mk22_advanced
-              install: core,openstack
-              stack_type: heat
-            - lab: virtual_mk22_basic
-              install: core,openstack
-              stack_type: heat
-            # physical
-            - lab: mcp10_contrail
-              install: core,kvm,openstack,contrail
-              stack_type: physical
-            - lab: mcp10_opencontrail_nfv
-              install: core,kvm,openstack,nfv
-              stack_type: physical
-            - lab: mcp10_dvr
-              install: core,kvm,openstack,dvr
-              stack_type: physical
-            - lab: mcp10_non_dvr
-              install: core,kvm,openstack
-              stack_type: physical
-          template:
-            type: workflow-scm
-            discard:
-              build:
-                keep_num: 20
-            concurrent: true
-            display_name: "Deploy - {{lab}} {{stack_type}} lab"
-            scm:
-              type: git
-              url: "${_param:jenkins_gerrit_url}/mk/mk-pipelines"
-              credentials: "gerrit"
-              script: lab-pipeline.groovy
-            param:
-              # deployments and test settings
-              STACK_TYPE:
-                type: string
-                default: "{{stack_type}}"
-              INSTALL:
-                type: string
-                default: "{{install}}"
-              TEST:
-                type: string
-                default: ""
-
-              # heat
-              HEAT_TEMPLATE_URL:
-                type: string
-                default: "git@github.com:Mirantis/mk-lab-heat-templates.git"
-              HEAT_TEMPLATE_CREDENTIALS:
-                type: string
-                default: "gerrit"
-              HEAT_TEMPLATE_BRANCH:
-                type: string
-                default: "composite"
-              HEAT_STACK_NAME:
-                type: string
-                description: Heat stack name. Will be generated if missing.
-              HEAT_STACK_TEMPLATE:
-                type: string
-                default: "{{lab}}"
-              HEAT_STACK_ENVIRONMENT:
-                type: string
-                default: "tcpisek"
-              HEAT_STACK_ZONE:
-                type: string
-                default: "mirantis-zone-qa"
-              HEAT_STACK_PUBLIC_NET:
-                type: string
-                default: "mirantis-private"
-              HEAT_STACK_DELETE:
-                type: boolean
-                default: 'true'
-              HEAT_STACK_REUSE:
-                type: boolean
-                default: 'false'
-
-              # salt master
-              SALT_MASTER_CREDENTIALS:
-                type: string
-                default: "salt-qa-credentials"
-              SALT_MASTER_URL:
-                type: string
-                default: ""
-
-              # openstack api
-              OPENSTACK_API_URL:
-                type: string
-                default: "https://vpc.tcpisek.cz:5000/v2.0"
-              OPENSTACK_API_CREDENTIALS:
-                type: string
-                default: "openstack-qa-credentials"
-              OPENSTACK_API_PROJECT:
-                type: string
-                default: "mirantis_mk20_qa"
-              OPENSTACK_API_CLIENT:
-                type: string
-                default: "liberty"
-              OPENSTACK_API_VERSION:
-                type: string
-                default: "2"
-
-              # k8s setttings
-              K8S_API_SERVER:
-                type: string
-                default: "http://127.0.0.1:8080"
-              K8S_CONFORMANCE_IMAGE:
-                type: string
-                default: "docker-dev-virtual.docker.mirantis.net/mirantis/kubernetes/k8s-conformance:v1.5.1-3_1482332392819"
-
-              # Tempest settings
-              TEMPEST_IMAGE_LINK:
-                type: string
-                default: "sandbox-docker-prod-local.docker.mirantis.net/mirantis/rally_tempest:0.1"
-
diff --git a/jenkins/client/job/deploy/update/config.yml b/jenkins/client/job/deploy/update/config.yml
new file mode 100644
index 0000000..9beabfb
--- /dev/null
+++ b/jenkins/client/job/deploy/update/config.yml
@@ -0,0 +1,45 @@
+#
+# Jobs to run given states on given Salt master environment's
+#
+parameters:
+  _param:
+    jenkins_salt_api_url: "http://${_param:salt_master_host}:6969"
+  jenkins:
+    client:
+      job:
+        deploy-update-service-config:
+          type: workflow-scm
+          concurrent: true
+          display_name: "Deploy - update service(s) config"
+          scm:
+            type: git
+            url: "${_param:jenkins_gerrit_url}/mk/mk-pipelines"
+            credentials: "gerrit"
+            script: change-config.groovy
+          param:
+            SALT_MASTER_URL:
+              type: string
+              default: "${_param:jenkins_salt_api_url}"
+              description: Full Salt API address [https://10.10.10.1:8000].
+            SALT_MASTER_CREDENTIALS:
+              type: string
+              default: "salt"
+              description: Credentials to the Salt API.
+            TARGET_SERVERS:
+              type: string
+              default: "*"
+              description: Salt compound target to match nodes to be updated [*, G@osfamily:debian].
+            TARGET_STATES:
+              type: string
+              description: Config changes to be applied, empty string means running highstate [linux, linux,openssh, salt.minion.grains].
+            TARGET_SUBSET_TEST:
+              type: string
+              description: Number of nodes to test config changes, empty string means all targetted nodes.
+            TARGET_SUBSET_LIVE:
+              type: string
+              default: '1'
+              description: Number of selected noded to live apply selected config changes.
+            TARGET_BATCH_LIVE:
+              type: string
+              description: Batch size for the complete live config changes on all nodes, empty string means apply to all targetted nodes.
+
diff --git a/jenkins/client/job/deploy/update/init.yml b/jenkins/client/job/deploy/update/init.yml
new file mode 100644
index 0000000..af87dcf
--- /dev/null
+++ b/jenkins/client/job/deploy/update/init.yml
@@ -0,0 +1,4 @@
+classes:
+  - system.jenkins.client.job.deploy.update.package
+  - system.jenkins.client.job.deploy.update.config
+  - system.jenkins.client.job.deploy.update.saltenv
diff --git a/jenkins/client/job/deploy/update/package.yml b/jenkins/client/job/deploy/update/package.yml
new file mode 100644
index 0000000..273796c
--- /dev/null
+++ b/jenkins/client/job/deploy/update/package.yml
@@ -0,0 +1,42 @@
+#
+# Jobs to update packages on given Salt master environment
+#
+parameters:
+  _param:
+    jenkins_salt_api_url: "http://${_param:salt_master_host}:6969"
+  jenkins:
+    client:
+      job:
+        deploy-update-package:
+          type: workflow-scm
+          concurrent: true
+          display_name: "Deploy - update system package(s)"
+          scm:
+            type: git
+            url: "${_param:jenkins_gerrit_url}/mk/mk-pipelines"
+            credentials: "gerrit"
+            script: update-package.groovy
+          param:
+            SALT_MASTER_URL:
+              type: string
+              default: "${_param:jenkins_salt_api_url}"
+            SALT_MASTER_CREDENTIALS:
+              type: string
+              default: "salt"
+            TARGET_SERVERS:
+              type: string
+              default: "*"
+              description: Salt compound target to match nodes to be updated [*, G@osfamily:debian].
+            TARGET_PACKAGES:
+              type: string
+              description: Space delimited list of packages to be updates [package1=version package2=version], empty string means all updating all packages to the latest version.
+            TARGET_SUBSET_TEST:
+              type: string
+              description: Number of nodes to list package updates, empty string means all targetted nodes.
+            TARGET_SUBSET_LIVE:
+              type: string
+              default: '1'
+              description: Number of selected noded to live apply selected package update.
+            TARGET_BATCH_LIVE:
+              type: string
+              description: Batch size for the complete live package update on all nodes, empty string means apply to all targetted nodes.
diff --git a/jenkins/client/job/deploy/reclass_update.yml b/jenkins/client/job/deploy/update/saltenv.yml
similarity index 64%
rename from jenkins/client/job/deploy/reclass_update.yml
rename to jenkins/client/job/deploy/update/saltenv.yml
index 1f99ddc..5b55f82 100644
--- a/jenkins/client/job/deploy/reclass_update.yml
+++ b/jenkins/client/job/deploy/update/saltenv.yml
@@ -1,13 +1,19 @@
+#
+# Following job is about to simply execute Jenkinsfile of given Reclass model
+#
 parameters:
+  _param:
+    jenkins_salt_api_url: "http://${_param:salt_master_host}:6969"
+    jenkins_salt_model_name: "salt"
   jenkins:
     client:
       job_template:
-        reclass_update:
+        update_salt_env:
           name: deploy-update-{{name}}
           jobs:
-            - name: mk-ci
-              salt_url: "http://10.10.100.81:8000"
-              salt_credentials: salt-mk-ci
+            - name: ${_param:jenkins_salt_env_name}
+              salt_url: "${_param:jenkins_salt_api_url}"
+              salt_credentials: salt
           template:
             display_name: "Deploy - update {{name}} environment"
             type: workflow-scm
diff --git a/jenkins/client/job/git-mirrors/upstream.yml b/jenkins/client/job/git-mirrors/downstream/init.yml
similarity index 73%
copy from jenkins/client/job/git-mirrors/upstream.yml
copy to jenkins/client/job/git-mirrors/downstream/init.yml
index f4f7f50..9333e6a 100644
--- a/jenkins/client/job/git-mirrors/upstream.yml
+++ b/jenkins/client/job/git-mirrors/downstream/init.yml
@@ -1,18 +1,12 @@
 parameters:
+  _param:
+    jenkins_git_mirror_downstream_jobs: []
   jenkins:
     client:
       job_template:
-        git_mirror_upstream_common:
-          name: git-mirror-upstream-{{name}}
-          jobs:
-            - name: pipeline-library
-              downstream: mcp-ci/pipeline-library.git
-              upstream: "git@github.com:Mirantis/pipeline-library.git"
-              branches: master
-            - name: mk-pipelines
-              downstream: mk/mk-pipelines.git
-              upstream: "git@github.com:Mirantis/mk-pipelines.git"
-              branches: master
+        git_mirror_downstream_common:
+          name: git-mirror-downstream-{{name}}
+          jobs: ${_param:jenkins_git_mirror_downstream_jobs}
           template:
             discard:
               build:
@@ -42,10 +36,10 @@
             param:
               SOURCE_URL:
                 type: string
-                default: "${_param:jenkins_gerrit_url}/{{downstream}}"
+                default: "{{upstream}}"
               TARGET_URL:
                 type: string
-                default: "{{upstream}}"
+                default: "${_param:jenkins_gerrit_url}/{{downstream}}"
               CREDENTIALS_ID:
                 type: string
                 default: "gerrit"
diff --git a/jenkins/client/job/git-mirrors/downstream/pipelines.yml b/jenkins/client/job/git-mirrors/downstream/pipelines.yml
new file mode 100644
index 0000000..8f7858e
--- /dev/null
+++ b/jenkins/client/job/git-mirrors/downstream/pipelines.yml
@@ -0,0 +1,13 @@
+classes:
+  - system.jenkins.client.job.git-mirrors.downstream
+parameters:
+  _param:
+    jenkins_git_mirror_downstream_jobs:
+      - name: pipeline-library
+        downstream: mcp-ci/pipeline-library.git
+        upstream: "git@github.com:Mirantis/pipeline-library.git"
+        branches: master
+      - name: mk-pipelines
+        downstream: mk/mk-pipelines.git
+        upstream: "git@github.com:Mirantis/mk-pipelines.git"
+        branches: master
diff --git a/jenkins/client/job/git-mirrors/upstream.yml b/jenkins/client/job/git-mirrors/upstream/init.yml
similarity index 77%
rename from jenkins/client/job/git-mirrors/upstream.yml
rename to jenkins/client/job/git-mirrors/upstream/init.yml
index f4f7f50..e11e63c 100644
--- a/jenkins/client/job/git-mirrors/upstream.yml
+++ b/jenkins/client/job/git-mirrors/upstream/init.yml
@@ -1,18 +1,12 @@
 parameters:
+  _param:
+    jenkins_git_mirror_upstream_jobs: []
   jenkins:
     client:
       job_template:
         git_mirror_upstream_common:
           name: git-mirror-upstream-{{name}}
-          jobs:
-            - name: pipeline-library
-              downstream: mcp-ci/pipeline-library.git
-              upstream: "git@github.com:Mirantis/pipeline-library.git"
-              branches: master
-            - name: mk-pipelines
-              downstream: mk/mk-pipelines.git
-              upstream: "git@github.com:Mirantis/mk-pipelines.git"
-              branches: master
+          jobs: ${_param:jenkins_git_mirror_upstream_jobs}
           template:
             discard:
               build:
diff --git a/jenkins/client/job/git-mirrors/upstream/pipelines.yml b/jenkins/client/job/git-mirrors/upstream/pipelines.yml
new file mode 100644
index 0000000..35f7df1
--- /dev/null
+++ b/jenkins/client/job/git-mirrors/upstream/pipelines.yml
@@ -0,0 +1,13 @@
+classes:
+  - system.jenkins.client.job.git-mirrors.upstream
+parameters:
+  _param:
+    jenkins_git_mirror_upstream_jobs:
+      - name: pipeline-library
+        downstream: mcp-ci/pipeline-library.git
+        upstream: "git@github.com:Mirantis/pipeline-library.git"
+        branches: master
+      - name: mk-pipelines
+        downstream: mk/mk-pipelines.git
+        upstream: "git@github.com:Mirantis/mk-pipelines.git"
+        branches: master
diff --git a/jenkins/client/job/image/ubuntu.yml b/jenkins/client/job/image/ubuntu.yml
old mode 100755
new mode 100644