Merge "Add tcp-qa configuration to testrail-reporter"
diff --git a/tcp_tests/fixtures/reclass_fixtures.py b/tcp_tests/fixtures/reclass_fixtures.py
index a2d84cb..c28de1d 100644
--- a/tcp_tests/fixtures/reclass_fixtures.py
+++ b/tcp_tests/fixtures/reclass_fixtures.py
@@ -6,7 +6,7 @@
 LOG = logger.logger
 
 
-@pytest.fixture(scope='function')
+@pytest.fixture(scope='session')
 def reclass_actions(config, underlay_actions):
     """Fixture that provides various actions for salt
 
diff --git a/tcp_tests/fixtures/salt_fixtures.py b/tcp_tests/fixtures/salt_fixtures.py
index 226ab22..d662180 100644
--- a/tcp_tests/fixtures/salt_fixtures.py
+++ b/tcp_tests/fixtures/salt_fixtures.py
@@ -21,7 +21,7 @@
 LOG = logger.logger
 
 
-@pytest.fixture(scope='function')
+@pytest.fixture(scope='session')
 def salt_actions(config, underlay_actions):
     """Fixture that provides various actions for salt
 
diff --git a/tcp_tests/fixtures/underlay_fixtures.py b/tcp_tests/fixtures/underlay_fixtures.py
index a8856d6..1cfae51 100644
--- a/tcp_tests/fixtures/underlay_fixtures.py
+++ b/tcp_tests/fixtures/underlay_fixtures.py
@@ -158,7 +158,7 @@
     request.addfinalizer(test_fin)
 
 
-@pytest.fixture(scope="function")
+@pytest.fixture(scope="session")
 def underlay_actions(config):
     """Fixture that provides SSH access to underlay objects.
 
diff --git a/tcp_tests/managers/reclass_manager.py b/tcp_tests/managers/reclass_manager.py
index 8448169..f8895c6 100644
--- a/tcp_tests/managers/reclass_manager.py
+++ b/tcp_tests/managers/reclass_manager.py
@@ -11,7 +11,6 @@
 #    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 #    License for the specific language governing permissions and limitations
 #    under the License.
-
 from tcp_tests import logger
 from tcp_tests.managers.execute_commands import ExecuteCommandsMixin
 
@@ -69,18 +68,40 @@
                 path=short_path
             ))
 
-    def get_key(self, key, short_path):
+    def get_key(self, key, file_name):
         """Find a key in a YAML
 
         :param key: string, parameter to add
-        :param short_path: path to reclass yaml file.
-            It takes into account default path where the reclass is located.
-            May look like cluster/*/cicd/control/leader.yml
+        :param file_name: name of YAML file to find a key
         :return: str, key if found
         """
-        return self.ssh.check_call(
-            "{reclass_tools} get-key {key} /srv/salt/reclass/classes".format(
-                reclass_tools=self.reclass_tools_cmd, key=key))
+        request_key = self.ssh.check_call(
+            "{reclass_tools} get-key {key} /srv/salt/reclass/*/{file_name}".
+            format(reclass_tools=self.reclass_tools_cmd,
+                   key=key,
+                   file_name=file_name))['stdout']
+
+        # Reclass-tools returns result to stdout, so we get it as
+        #     ['\n',
+        #      '---\n',
+        #      '# Found parameters._param.jenkins_pipelines_branch in \
+        #          /srv/salt/reclass/classes/cluster/../infra/init.yml\n',
+        #      'release/proposed/2019.2.0\n',
+        #      '...\n',
+        #      '\n']
+        # So we have no chance to get value without dirty code like `stdout[3]`
+
+        LOG.info("From reclass.get_key {}".format(request_key))
+        if len(request_key) < 4:
+            assert "Can't find {key} in {file_name}. Got stdout {stdout}".\
+                format(
+                    key=key,
+                    file_name=file_name,
+                    stdout=request_key
+                )
+        value = request_key[3].strip('\n')
+        LOG.info("From reclass.get_key {}".format(value))
+        return value
 
     def add_bool_key(self, key, value, short_path):
         """
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 96af1d4..4a7286e 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,13 +1,16 @@
 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_address_baremetal: 10.14.0.10
+  openstack_baremetal_node01_baremetal_address: 10.14.0.11
+  openstack_baremetal_node02_baremetal_address: 10.14.0.12
+  openstack_baremetal_node03_baremetal_address: 10.14.0.13
   openstack_baremetal_node01_address: 10.167.11.21
   openstack_baremetal_node02_address: 10.167.11.22
   openstack_baremetal_node03_address: 10.167.11.23
+  openstack_baremetal_neutron_subnet_cidr: 10.14.0.0/24
+  openstack_baremetal_neutron_subnet_allocation_start: 10.14.0.100
+  openstack_baremetal_neutron_subnet_allocation_end: 10.14.0.200
   openstack_baremetal_address: 10.167.11.20
   openstack_baremetal_interface: ens7
   openstack_baremetal_vip_interface: phy-baremetal
@@ -708,8 +711,8 @@
   openstack_nova_cpu_pinning: 6,7,8,9,10,11
   openstack_nova_compute_reserved_host_memory_mb: '900'
   openstack_ovs_dvr_enabled: 'True'
-  openstack_ovs_encapsulation_type: vlan
-  openstack_ovs_encapsulation_vlan_range: 2402:2406
+  openstack_ovs_encapsulation_type: vxlan
+  ironic_vlan_range: 2402:2402
   openstack_proxy_address: 10.167.11.80
   openstack_proxy_hostname: prx
   openstack_proxy_node01_address: 10.167.11.81
diff --git a/tcp_tests/templates/bm-cicd-queens-ovs-maas/salt-context-environment.yaml b/tcp_tests/templates/bm-cicd-queens-ovs-maas/salt-context-environment.yaml
index c687eac..7722eaa 100644
--- a/tcp_tests/templates/bm-cicd-queens-ovs-maas/salt-context-environment.yaml
+++ b/tcp_tests/templates/bm-cicd-queens-ovs-maas/salt-context-environment.yaml
@@ -24,6 +24,10 @@
           role: bond_ctl_lacp
         sten2:
           role: bond_ctl_lacp
+        ten1:
+          role: bond_baremetal_lacp
+        sten1:
+          role: bond_baremetal_lacp
 
     kvm02.bm-cicd-queens-ovs-maas.local:
       reclass_storage_name: infra_kvm_node02
@@ -37,6 +41,10 @@
           role: bond_ctl_lacp
         sten2:
           role: bond_ctl_lacp
+        ten1:
+          role: bond_baremetal_lacp
+        sten1:
+          role: bond_baremetal_lacp
 
     kvm03.bm-cicd-queens-ovs-maas.local:
       reclass_storage_name: infra_kvm_node03
@@ -50,6 +58,10 @@
           role: bond_ctl_lacp
         sten2:
           role: bond_ctl_lacp
+        ten1:
+          role: bond_baremetal_lacp
+        sten1:
+          role: bond_baremetal_lacp
 
     kvm04.bm-cicd-queens-ovs-maas.local:
       reclass_storage_name: infra_kvm_node04
@@ -133,11 +145,11 @@
         one1:
           role: single_mgm_dhcp
         ten1:
-          role: bond_ctl_lacp
+          role: bond_ctl_baremetal_lacp
         ten2:
           role: bond_prv_lacp
         sten1:
-          role: bond_ctl_lacp
+          role: bond_ctl_baremetal_lacp
         sten2:
           role: bond_prv_lacp
 
@@ -150,11 +162,11 @@
         one1:
           role: single_mgm_dhcp
         ten1:
-          role: bond_ctl_lacp
+          role: bond_ctl_baremetal_lacp
         ten2:
           role: bond_prv_lacp
         sten1:
-          role: bond_ctl_lacp
+          role: bond_ctl_baremetal_lacp
         sten2:
           role: bond_prv_lacp
 
@@ -167,10 +179,10 @@
         one1:
           role: single_mgm_dhcp
         ten1:
-          role: bond_ctl_lacp
+          role: bond_ctl_baremetal_lacp
         ten2:
           role: bond_prv_lacp
         sten1:
-          role: bond_ctl_lacp
+          role: bond_ctl_baremetal_lacp
         sten2:
           role: bond_prv_lacp
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 1cefe2f..c274129 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
@@ -4,8 +4,6 @@
       roles:
       - openstack_control_leader
       - linux_system_codename_xenial
-      - features_ironic_baremetal_nodes
-      - features_ironic_switch
       interfaces:
         ens2:
           role: single_dhcp
@@ -17,7 +15,6 @@
       roles:
       - openstack_control
       - linux_system_codename_xenial
-      - features_ironic_switch
       interfaces:
         ens2:
           role: single_dhcp
@@ -29,7 +26,6 @@
       roles:
       - openstack_control
       - linux_system_codename_xenial
-      - features_ironic_switch
       interfaces:
         ens2:
           role: single_dhcp
@@ -420,6 +416,8 @@
           role: single_dhcp
         ens3:
           role: single_ctl
+        ens4:
+          role: single_baremetal
 
     bmt02.bm-cicd-queens-ovs-maas.local:
       reclass_storage_name: openstack_baremetal_node02
@@ -431,6 +429,8 @@
           role: single_dhcp
         ens3:
           role: single_ctl
+        ens4:
+          role: single_baremetal
 
     bmt03.bm-cicd-queens-ovs-maas.local:
       reclass_storage_name: openstack_baremetal_node03
@@ -442,4 +442,6 @@
           role: single_dhcp
         ens3:
           role: single_ctl
+        ens4:
+          role: single_baremetal
 
diff --git a/tcp_tests/templates/cookied-model-generator/salt_bm-cicd-queens-ovs-maas.yaml b/tcp_tests/templates/cookied-model-generator/salt_bm-cicd-queens-ovs-maas.yaml
index 5aee981..f34cc38 100644
--- a/tcp_tests/templates/cookied-model-generator/salt_bm-cicd-queens-ovs-maas.yaml
+++ b/tcp_tests/templates/cookied-model-generator/salt_bm-cicd-queens-ovs-maas.yaml
@@ -36,6 +36,7 @@
     sed -i 's/br\-ctl/br\_ctl/g' /srv/salt/reclass/classes/cluster/{{ LAB_CONFIG_NAME }}/infra/kvm.yml;
     sed -i 's/br\-mgm/br\_mgm/g' /srv/salt/reclass/classes/cluster/{{ LAB_CONFIG_NAME }}/infra/kvm.yml;
     sed -i 's/br\-ctl/br\_ctl/g' /srv/salt/reclass/classes/cluster/{{ LAB_CONFIG_NAME }}/openstack/gateway.yml;
+    sed -i 's/br\-baremetal/br\_baremetal/g' /srv/salt/reclass/classes/cluster/{{ LAB_CONFIG_NAME }}/infra/kvm.yml;
     salt '*' saltutil.refresh_pillar;
   node_name: {{ HOSTNAME_CFG01 }}
   retry: {count: 1, delay: 10}
diff --git a/tcp_tests/tests/system/test_mcp_update.py b/tcp_tests/tests/system/test_mcp_update.py
index 4a1cfa2..1ff7642 100644
--- a/tcp_tests/tests/system/test_mcp_update.py
+++ b/tcp_tests/tests/system/test_mcp_update.py
@@ -54,29 +54,49 @@
     return targets
 
 
-@pytest.fixture
+@pytest.fixture(scope='class')
 def switch_to_proposed_pipelines(reclass_actions, salt_actions):
-    reclass_actions.add_key(
-        "parameters._param.jenkins_pipelines_branch",
-        "release/proposed/2019.2.0",
-        "cluster/*/infra/init.yml"
-    )
+    reclass = reclass_actions
+    proposed_repo = "http://mirror.mirantis.com/update/proposed/"
+    repo_param = "parameters._param.linux_system_repo_update_url"
 
-    proposed_branch = "http://mirror.mirantis.com/update/proposed/"
-    url_param = "parameters._param.linux_system_repo_update_url"
-    reclass_actions.add_key(url_param, proposed_branch,
-                            "cluster/*/infra/init.yml")
-    reclass_actions.add_key(url_param, proposed_branch,
-                            "cluster/*/openstack/init.yml")
-    reclass_actions.add_key(url_param, proposed_branch,
-                            "cluster/*/stacklight/init.yml")
-    reclass_actions.add_key(url_param, proposed_branch,
-                            "cluster/*/ceph/init.yml")
+    proposed_pipeline_branch = "release/proposed/2019.2.0"
+    pipeline_branch_param = "parameters._param.jenkins_pipelines_branch"
+    infra_yml = "cluster/*/infra/init.yml"
+
+    LOG.info("Check reclass has release/proposed/2019.2.0 branches")
+    if reclass.get_key(pipeline_branch_param,
+                       infra_yml) == proposed_pipeline_branch \
+            and reclass.get_key(repo_param, infra_yml) == proposed_repo:
+        return True
+
+    LOG.info("Switch to release/proposed/2019.2.0 branches")
+    reclass.add_key(pipeline_branch_param, proposed_pipeline_branch, infra_yml)
+
+    reclass.add_key(repo_param, proposed_repo, infra_yml)
+    reclass.add_key(repo_param, proposed_repo, "cluster/*/openstack/init.yml")
+    reclass.add_key(repo_param, proposed_repo, "cluster/*/stacklight/init.yml")
+    reclass.add_key(repo_param, proposed_repo, "cluster/*/ceph/init.yml")
 
     salt_actions.run_state("*", "saltutil.refresh_pillar")
     salt_actions.enforce_state("I@jenkins:client", "jenkins.client")
 
 
+@pytest.fixture(scope='class')
+def enable_openstack_update(reclass_actions, salt_actions):
+    param = "parameters._param.openstack_upgrade_enabled"
+    context_file = "cluster/*/infra/init.yml"
+
+    LOG.info("Enable openstack_upgrade_enabled in reclass")
+    reclass_actions.add_bool_key(param, "True", context_file)
+    salt_actions.run_state("*", "saltutil.refresh_pillar")
+    yield True
+    LOG.info("Disable openstack_upgrade_enabled in reclass")
+    reclass_actions.add_bool_key(param, "False", context_file)
+    salt_actions.run_state("*", "saltutil.refresh_pillar")
+
+
+@pytest.mark.usefixtures("switch_to_proposed_pipelines")
 class TestUpdateMcpCluster(object):
     """
     Following the steps in
@@ -87,7 +107,7 @@
     @pytest.mark.parametrize("_", [settings.ENV_NAME])
     @pytest.mark.run_mcp_update
     def test_update_drivetrain(self, salt_actions, drivetrain_actions,
-                               show_step, _, switch_to_proposed_pipelines):
+                               show_step, _):
         """Updating DriveTrain component to release/proposed/2019.2.0 version
 
         Scenario:
@@ -144,7 +164,7 @@
         update_drivetrain = dt.start_job_on_cid_jenkins(
             job_name=job_name,
             job_parameters=job_parameters,
-            build_timeout=90*60)
+            build_timeout=90 * 60)
 
         assert update_drivetrain == 'SUCCESS'
 
@@ -193,7 +213,7 @@
             "I@glusterfs:server",
             "glusterd --version|head -n1")[0]
 
-        assert has_only_similar(gluster_server_versions_by_nodes),\
+        assert has_only_similar(gluster_server_versions_by_nodes), \
             gluster_server_versions_by_nodes
 
         # ################ Check GlusterFS version for clients ##############
@@ -266,6 +286,7 @@
         On each OpenStack controller node, modify the neutron.conf file
         Restart the neutron-server service
         """
+
         def comment_line(node, file_name, word):
             """
             Adds '#' before the specific line in specific file
@@ -290,8 +311,8 @@
             :return: None
             """
             salt_actions.cmd_run(node, "echo {line} >> {file}".format(
-                    line=line,
-                    file=file_name))
+                line=line,
+                file=file_name))
 
         neutron_conf = '/etc/neutron/neutron.conf'
         neutron_server = "I@neutron:server"
@@ -302,7 +323,7 @@
 
         # ## Change parameters in neutron.conf'
         comment_line(neutron_server, neutron_conf,
-                     "allow_automatic_l3agent_failover",)
+                     "allow_automatic_l3agent_failover", )
         comment_line(neutron_server, neutron_conf,
                      "allow_automatic_dhcp_failover")
         add_line(neutron_server, neutron_conf,
@@ -427,12 +448,35 @@
         show_step(3)
 
         ceph_version_by_nodes = salt.cmd_run(
-          "I@ceph:* and not I@ceph:monitoring and not I@ceph:backup:server",
-          "ceph version")[0]
+            "I@ceph:* and not I@ceph:monitoring and not I@ceph:backup:server",
+            "ceph version")[0]
 
         assert has_only_similar(ceph_version_by_nodes), ceph_version_by_nodes
 
+    @pytest.mark.grab_versions
+    @pytest.mark.parametrize("_", [settings.ENV_NAME])
+    @pytest.mark.run_mcp_update
+    def test_update_stacklight(self, _, drivetrain_actions):
+        """ Update packages for Stacklight
+        Scenario:
+        1. Start Deploy - upgrade Stacklight job
+        """
+        drivetrain = drivetrain_actions
 
+        job_parameters = {
+            "STAGE_UPGRADE_DOCKER_COMPONENTS": True,
+            "STAGE_UPGRADE_ES_KIBANA": True,
+            "STAGE_UPGRADE_SYSTEM_PART": True
+        }
+        upgrade_control_pipeline = drivetrain.start_job_on_cid_jenkins(
+            job_name="stacklight-upgrade",
+            job_parameters=job_parameters)
+
+        assert upgrade_control_pipeline == 'SUCCESS'
+
+
+@pytest.mark.usefixtures("switch_to_proposed_pipelines",
+                         "enable_openstack_update")
 class TestOpenstackUpdate(object):
 
     @pytest.mark.grab_versions
@@ -468,8 +512,7 @@
     @pytest.mark.grab_versions
     @pytest.mark.parametrize('target', get_control_plane_targets())
     @pytest.mark.run_mcp_update
-    def test__update__control_plane(self, drivetrain_actions,
-                                    switch_to_proposed_pipelines, target):
+    def test__update__control_plane(self, drivetrain_actions, target):
         """Start 'Deploy - upgrade control VMs' for specific node
         """
         job_parameters = {
@@ -493,3 +536,16 @@
             job_parameters=job_parameters)
 
         assert upgrade_data_pipeline == 'SUCCESS'
+
+    @pytest.mark.grab_versions
+    @pytest.mark.run_mcp_update
+    def test__update__computes(self, drivetrain_actions):
+        """Start 'Deploy - upgrade computes'
+        """
+        job_parameters = {
+            "INTERACTIVE": False}
+        upgrade_compute_pipeline = drivetrain_actions.start_job_on_cid_jenkins(
+            job_name="deploy-upgrade-compute",
+            job_parameters=job_parameters)
+
+        assert upgrade_compute_pipeline == 'SUCCESS'