Merge "Add scenario which updates GlusterFS"
diff --git a/src/com/mirantis/system_qa/SharedPipeline.groovy b/src/com/mirantis/system_qa/SharedPipeline.groovy
index bbf8415..0e0fdda 100644
--- a/src/com/mirantis/system_qa/SharedPipeline.groovy
+++ b/src/com/mirantis/system_qa/SharedPipeline.groovy
@@ -190,7 +190,7 @@
         run_cmd("""\
             if [ -n "$TCP_QA_REFS" ]; then
                 set -e
-                git fetch https://review.gerrithub.io/Mirantis/tcp-qa $TCP_QA_REFS && git checkout FETCH_HEAD || exit \$?
+                git reset --hard && git fetch https://review.gerrithub.io/Mirantis/tcp-qa $TCP_QA_REFS && git checkout FETCH_HEAD || exit \$?
             fi""")
         if (updateRequirements) {
             run_cmd("""\
diff --git a/tcp_tests/templates/_heat_environments/fragments/Networks.yaml b/tcp_tests/templates/_heat_environments/fragments/Networks.yaml
index 5840d80..11cc4a5 100644
--- a/tcp_tests/templates/_heat_environments/fragments/Networks.yaml
+++ b/tcp_tests/templates/_heat_environments/fragments/Networks.yaml
@@ -11,16 +11,19 @@
 
 resources:
   control_net:
+    depends_on: tenant_net
     type: OS::Neutron::Net
     properties:
       port_security_enabled: false
       name: { list_join: ['-', [ 'control_net', { get_param: env_name } ]] }
   tenant_net:
+    depends_on: management_net
     type: OS::Neutron::Net
     properties:
       port_security_enabled: false
       name: { list_join: ['-', [ 'tenant_net', { get_param: env_name } ]] }
   management_net:
+    depends_on: external_net
     type: OS::Neutron::Net
     properties:
       port_security_enabled: false
diff --git a/tcp_tests/templates/bm-cicd-queens-ovs-maas/salt-context-cookiecutter-openstack_ovs.yaml b/tcp_tests/templates/bm-cicd-queens-ovs-maas/salt-context-cookiecutter-openstack_ovs.yaml
index 2e368b9..ec9fc66 100644
--- a/tcp_tests/templates/bm-cicd-queens-ovs-maas/salt-context-cookiecutter-openstack_ovs.yaml
+++ b/tcp_tests/templates/bm-cicd-queens-ovs-maas/salt-context-cookiecutter-openstack_ovs.yaml
@@ -1,4 +1,12 @@
 default_context:
+  ironic_enabled: True
+  openstack_baremetal_hostname: bmt
+  openstack_baremetal_address_baremetal: 10.167.11.20
+  openstack_baremetal_node01_baremetal_address: 10.167.11.21
+  openstack_baremetal_node02_baremetal_address: 10.167.11.22
+  openstack_baremetal_node03_baremetal_address: 10.167.11.23
+  openstack_baremetal_interface: ens7
+  openstack_baremetal_vip_interface: phy-baremetal
   jenkins_cfg_admin_password: r00tme
   bmk_enabled: 'False'
   cicd_control_node01_address: 10.167.11.91
diff --git a/tcp_tests/templates/bm-cicd-queens-ovs-maas/salt-context-vcp-environment.yaml b/tcp_tests/templates/bm-cicd-queens-ovs-maas/salt-context-vcp-environment.yaml
index e73344e..32f567a 100644
--- a/tcp_tests/templates/bm-cicd-queens-ovs-maas/salt-context-vcp-environment.yaml
+++ b/tcp_tests/templates/bm-cicd-queens-ovs-maas/salt-context-vcp-environment.yaml
@@ -405,3 +405,37 @@
           role: single_dhcp
         ens3:
           role: single_ctl
+
+    bmt01.bm-cicd-queens-ovs-maas.local:
+      reclass_storage_name: openstack_baremetal_node01
+      roles:
+      - openstack_baremetal
+      - linux_system_codename_xenial
+      interfaces:
+        ens2:
+          role: single_dhcp
+        ens3:
+          role: single_ctl
+
+    bmt02.bm-cicd-queens-ovs-maas.local:
+      reclass_storage_name: openstack_baremetal_node02
+      roles:
+      - openstack_baremetal
+      - linux_system_codename_xenial
+      interfaces:
+        ens2:
+          role: single_dhcp
+        ens3:
+          role: single_ctl
+
+    bmt03.bm-cicd-queens-ovs-maas.local:
+      reclass_storage_name: openstack_baremetal_node03
+      roles:
+      - openstack_baremetal
+      - linux_system_codename_xenial
+      interfaces:
+        ens2:
+          role: single_dhcp
+        ens3:
+          role: single_ctl
+
diff --git a/tcp_tests/templates/heat-bm-cicd-pike-contrail-sl/underlay.hot b/tcp_tests/templates/heat-bm-cicd-pike-contrail-sl/underlay.hot
index 0afbd66..cffb044 100644
--- a/tcp_tests/templates/heat-bm-cicd-pike-contrail-sl/underlay.hot
+++ b/tcp_tests/templates/heat-bm-cicd-pike-contrail-sl/underlay.hot
@@ -1,6 +1,6 @@
 ---
 
-heat_template_version: pike
+heat_template_version: queens
 
 description: MCP environment for heat-bm-cicd-pike-contrail-sl
 
diff --git a/tcp_tests/tests/system/test_backup_restore_galera.py b/tcp_tests/tests/system/test_backup_restore_galera.py
new file mode 100644
index 0000000..9309466
--- /dev/null
+++ b/tcp_tests/tests/system/test_backup_restore_galera.py
@@ -0,0 +1,222 @@
+import pytest
+
+from tcp_tests import logger
+from tcp_tests import settings
+from tcp_tests.utils import run_jenkins_job
+from tcp_tests.utils import get_jenkins_job_stages
+
+LOG = logger.logger
+
+
+class TestBackupRestoreGalera(object):
+    """
+    Created by https://mirantis.jira.com/browse/PROD-32674
+    """
+
+    @pytest.mark.grab_versions
+    @pytest.mark.parametrize("_", [settings.ENV_NAME])
+    @pytest.mark.run_galera_backup_restore
+    def test_backup_restore_galera(self, salt_actions, show_step, _):
+        """Execute backup/restore for galera
+
+        Scenario:
+            1. Get CICD Jenkins access credentials from salt
+            2. Run job galera_backup_database
+            3. Run tests with cvp-sanity job
+            4. Run tests with cvp-tempest job
+            5. Run job galera_verify_restore
+            6. If jobs are passed then start tests with cvp-sanity job
+            7. Run tests with cvp-tempest job
+        """
+        salt = salt_actions
+        jenkins_creds = salt.get_cluster_jenkins_creds()
+
+        # ################### Login Jenkins on cid01 node ###################
+        show_step(1)
+
+        jenkins_url = jenkins_creds.get('url')
+        jenkins_user = jenkins_creds.get('user')
+        jenkins_pass = jenkins_creds.get('pass')
+        jenkins_start_timeout = 60
+        jenkins_build_timeout = 1800
+
+        # ################## Run backup job #########################
+        show_step(2)
+        job_name = 'galera_backup_database'
+        job_parameters = {
+            'ASK_CONFIRMATION': False
+        }
+        backup_galera_pipeline = run_jenkins_job.run_job(
+            host=jenkins_url,
+            username=jenkins_user,
+            password=jenkins_pass,
+            start_timeout=jenkins_start_timeout,
+            build_timeout=jenkins_build_timeout,
+            verbose=False,
+            job_name=job_name,
+            job_parameters=job_parameters)
+
+        (description, stages) = get_jenkins_job_stages.get_deployment_result(
+            host=jenkins_url,
+            username=jenkins_user,
+            password=jenkins_pass,
+            job_name=job_name,
+            build_number='lastBuild')
+
+        LOG.info(description)
+        LOG.info('\n'.join(stages))
+
+        assert backup_galera_pipeline == 'SUCCESS', "{0}\n{1}".format(
+            description, '\n'.join(stages))
+        # ######################## Run CPV ###########################
+        show_step(3)
+        job_name = 'cvp-sanity'
+        job_cvp_sanity_parameters = {
+            'EXTRA_PARAMS': '''
+
+                envs:
+                  - skipped_packages='{},{},{},{},{},{}'
+                  - skipped_modules='xunitmerge,setuptools'
+                  - skipped_services='docker,containerd'
+                  - ntp_skipped_nodes=''
+                  - tests_set=-k "not {} and not {} and not {}"
+            '''.format('python-setuptools', 'python-pkg-resources',
+                       'xunitmerge', 'python-gnocchiclient',
+                       'python-ujson', 'python-octaviaclient',
+                       'test_ceph_status', 'test_prometheus_alert_count',
+                       'test_uncommited_changes')
+        }
+        job_parameters = job_cvp_sanity_parameters
+        run_cvp_sanity = run_jenkins_job.run_job(
+            host=jenkins_url,
+            username=jenkins_user,
+            password=jenkins_pass,
+            start_timeout=jenkins_start_timeout,
+            build_timeout=jenkins_build_timeout,
+            verbose=False,
+            job_name=job_name,
+            job_parameters=job_parameters)
+
+        (description, stages) = get_jenkins_job_stages.get_deployment_result(
+            host=jenkins_url,
+            username=jenkins_user,
+            password=jenkins_pass,
+            job_name=job_name,
+            build_number='lastBuild')
+
+        LOG.info(description)
+        LOG.info('\n'.join(stages))
+
+        assert run_cvp_sanity == 'SUCCESS', "{0}\n{1}".format(
+            description, '\n'.join(stages))
+        # ######################## Run Tempest ###########################
+        show_step(4)
+        job_name = 'cvp-tempest'
+        job_parameters = {
+             'TEMPEST_ENDPOINT_TYPE': 'internalURL'
+        }
+        run_cvp_tempest = run_jenkins_job.run_job(
+            host=jenkins_url,
+            username=jenkins_user,
+            password=jenkins_pass,
+            start_timeout=jenkins_start_timeout,
+            build_timeout=jenkins_build_timeout,
+            verbose=False,
+            job_name=job_name,
+            job_parameters=job_parameters)
+
+        (description, stages) = get_jenkins_job_stages.get_deployment_result(
+            host=jenkins_url,
+            username=jenkins_user,
+            password=jenkins_pass,
+            job_name=job_name,
+            build_number='lastBuild')
+
+        LOG.info(description)
+        LOG.info('\n'.join(stages))
+
+        assert run_cvp_tempest == 'SUCCESS', "{0}\n{1}".format(
+            description, '\n'.join(stages))
+        # ######################## Run Restore ###########################
+        show_step(5)
+        job_name = 'galera_verify_restore'
+        job_parameters = {
+             'RESTORE_TYPE': 'ONLY_RESTORE',
+             'ASK_CONFIRMATION': False
+        }
+        run_galera_verify_restore = run_jenkins_job.run_job(
+            host=jenkins_url,
+            username=jenkins_user,
+            password=jenkins_pass,
+            start_timeout=jenkins_start_timeout,
+            build_timeout=jenkins_build_timeout,
+            verbose=False,
+            job_name=job_name,
+            job_parameters=job_parameters)
+
+        (description, stages) = get_jenkins_job_stages.get_deployment_result(
+            host=jenkins_url,
+            username=jenkins_user,
+            password=jenkins_pass,
+            job_name=job_name,
+            build_number='lastBuild')
+
+        LOG.info(description)
+        LOG.info('\n'.join(stages))
+
+        assert run_galera_verify_restore == 'SUCCESS', "{0}\n{1}".format(
+            description, '\n'.join(stages))
+        # ######################## Run CPV ###########################
+        show_step(6)
+        job_name = 'cvp-sanity'
+        job_parameters = job_cvp_sanity_parameters
+        run_cvp_sanity = run_jenkins_job.run_job(
+            host=jenkins_url,
+            username=jenkins_user,
+            password=jenkins_pass,
+            start_timeout=jenkins_start_timeout,
+            build_timeout=jenkins_build_timeout,
+            verbose=False,
+            job_name=job_name,
+            job_parameters=job_parameters)
+
+        (description, stages) = get_jenkins_job_stages.get_deployment_result(
+            host=jenkins_url,
+            username=jenkins_user,
+            password=jenkins_pass,
+            job_name=job_name,
+            build_number='lastBuild')
+
+        LOG.info(description)
+        LOG.info('\n'.join(stages))
+
+        assert run_cvp_sanity == 'SUCCESS', "{0}\n{1}".format(
+            description, '\n'.join(stages))
+        # ######################## Run Tempest ###########################
+        show_step(7)
+        job_name = 'cvp-tempest'
+        job_parameters = {
+             'TEMPEST_ENDPOINT_TYPE': 'internalURL'
+        }
+        run_cvp_tempest = run_jenkins_job.run_job(
+            host=jenkins_url,
+            username=jenkins_user,
+            password=jenkins_pass,
+            start_timeout=jenkins_start_timeout,
+            build_timeout=jenkins_build_timeout,
+            verbose=False,
+            job_name=job_name,
+            job_parameters=job_parameters)
+
+        (description, stages) = get_jenkins_job_stages.get_deployment_result(
+            host=jenkins_url,
+            username=jenkins_user,
+            password=jenkins_pass,
+            job_name=job_name,
+            build_number='lastBuild')
+
+        LOG.info(description)
+        LOG.info('\n'.join(stages))
+
+        assert run_cvp_tempest == 'SUCCESS', "{0}\n{1}".format(
+            description, '\n'.join(stages))