Beispiel #1
0
 def setUpClass(cls):
     super(TestPvResizeClass, cls).setUpClass()
     cls.node = cls.ocp_master_node[0]
     if get_openshift_version() < "3.9":
         cls.skip_me = True
         return
     enable_pvc_resize(cls.node)
 def setUpClass(cls):
     super(TestPvResizeClass, cls).setUpClass()
     cls.node = cls.ocp_master_node[0]
     if get_openshift_version() < "3.9":
         cls.skip_me = True
         return
     enable_pvc_resize(cls.node)
Beispiel #3
0
    def test_pvc_placement_and_expansion_with_zone_check_set_in_dc(
            self, zone_count, is_arbiter):
        heketi_zone_checking, expand_size = "strict", 2

        # Create storage class setting expansion and arbiter option up
        sc_name = self.create_storage_class(sc_name_prefix=self.prefix,
                                            vol_name_prefix=self.prefix,
                                            allow_volume_expansion=True,
                                            is_arbiter_vol=True)

        # Create PVC using above storage class
        pvc_name = self.create_and_wait_for_pvc(pvc_name_prefix=self.prefix,
                                                sc_name=sc_name)

        # Check amount of available online heketi zones
        self._check_for_available_zones(zone_count)

        # Set "user.heketi.zone-checking" to strict inside heketi dc
        self._set_zone_check_env_in_heketi_dc(heketi_zone_checking)

        # Expand PVC
        openshift_storage_libs.enable_pvc_resize(self.node)
        openshift_ops.resize_pvc(self.node, pvc_name, expand_size)
        openshift_ops.verify_pvc_size(self.node, pvc_name, expand_size)

        # Make sure that gluster vol has appropriate option set
        vol_info = openshift_ops.get_gluster_vol_info_by_pvc_name(
            self.node, pvc_name)
        if is_arbiter:
            self.assertIn('user.heketi.arbiter', vol_info['options'])
            self.assertEqual(vol_info['options']['user.heketi.arbiter'],
                             'true')

        # Create app DC with the above PVC
        self.create_dc_with_pvc(pvc_name, timeout=120, wait_step=3)
    def _validate_brick_placement_in_correct_zone_or_with_expand_pvc(
            self, heketi_zone_checking, pvc_name, zone_count, expand=False):
        online_nodes = self._get_online_nodes()

        for i in range(2):
            # Validate brick placement if heketi zone checking is 'strict'
            if heketi_zone_checking == 'strict':
                brick_hosts_ips = (
                    openshift_ops.get_gluster_host_ips_by_pvc_name(
                        self.node, pvc_name))
                placement_zones = {}
                for brick_host_ip in brick_hosts_ips:
                    for node_zone, node_ips in online_nodes:
                        if brick_host_ip not in node_ips:
                            continue
                        placement_zones[node_zone] = placement_zones.get(
                            node_zone, 0) + 1
                        break
                actual_zone_count = len(placement_zones)
                # NOTE(vponomar): '3' is default amount of volume replicas.
                # And it is just impossible to find more actual zones than
                # amount of replicas/bricks.
                brick_number = len(brick_hosts_ips)
                expected_zone_count = (
                    brick_number if brick_number < zone_count else zone_count)
                self.assertEqual(
                    expected_zone_count, actual_zone_count,
                    "PVC '%s' is incorrectly placed on the Heketi nodes "
                    "according to their zones. Expected '%s' unique zones, "
                    "got '%s'." % (pvc_name, zone_count, actual_zone_count))

            # Expand PVC if needed
            if expand:
                expand_size, expand = 2, False
                openshift_storage_libs.enable_pvc_resize(self.node)
                openshift_ops.resize_pvc(self.node, pvc_name, expand_size)
                openshift_ops.verify_pvc_size(self.node, pvc_name, expand_size)
            else:
                break
    def test_check_pvc_placement_based_on_the_heketi_zones(
            self,
            zone_count,
            heketi_zone_checking,
            is_arbiter_vol,
            expand=False):
        # TODO(vponomar): implement setting env vars for the Heketi dc.

        # Check amount of available online heketi nodes
        online_nodes = self._get_online_nodes()
        node_count = len(online_nodes)

        # Check current amount of the Heketi zones
        actual_heketi_zones_amount = len(set([n[0] for n in online_nodes]))
        if zone_count != actual_heketi_zones_amount:
            if self.allow_heketi_zones_update:
                if zone_count > node_count:
                    self.skipTest("Not enough online nodes '%s' to test '%s' "
                                  "unique Heketi zones." %
                                  (node_count, zone_count))
                heketi_db_data = self._set_heketi_zones(zone_count)
                online_nodes = [
                    (n['Info']['zone'], n['Info']['hostnames']['storage'])
                    for n in heketi_db_data['nodeentries'].values()
                ]
            else:
                self.skipTest(
                    "Required amount of the Heketi zones (%s < %s) is not "
                    "satisfied and 'common.allow_heketi_zones_update' config "
                    "option is set to 'False'." %
                    (zone_count, actual_heketi_zones_amount))

        # Create storage class setting "user.heketi.zone-checking" option up
        prefix = "autotests-heketi-zones"
        sc_name = self.create_storage_class(
            sc_name_prefix=prefix,
            vol_name_prefix=prefix,
            allow_volume_expansion=expand,
            is_arbiter_vol=is_arbiter_vol,
            heketi_zone_checking=heketi_zone_checking)

        # Create PVC using above storage class
        pvc_name = self.create_and_wait_for_pvc(pvc_name_prefix=prefix,
                                                sc_name=sc_name)

        for i in range(2):
            # Validate brick placement if heketi zone checking is 'strict'
            if heketi_zone_checking == 'strict':
                brick_hosts_ips = (
                    openshift_ops.get_gluster_host_ips_by_pvc_name(
                        self.node, pvc_name))
                placement_zones = {}
                for brick_host_ip in brick_hosts_ips:
                    for node_zone, node_ips in online_nodes:
                        if brick_host_ip not in node_ips:
                            continue
                        placement_zones[node_zone] = placement_zones.get(
                            node_zone, 0) + 1
                        break
                actual_zone_count = len(placement_zones)
                # NOTE(vponomar): '3' is default amount of volume replicas.
                # And it is just impossible to find more actual zones than
                # amount of replicas/bricks.
                brick_number = len(brick_hosts_ips)
                expected_zone_count = (
                    brick_number if brick_number < zone_count else zone_count)
                self.assertEqual(
                    expected_zone_count, actual_zone_count,
                    "PVC '%s' is incorrectly placed on the Heketi nodes "
                    "according to their zones. Expected '%s' unique zones, "
                    "got '%s'." % (pvc_name, zone_count, actual_zone_count))

            # Expand PVC if needed
            if expand:
                expand_size, expand = 2, False
                openshift_storage_libs.enable_pvc_resize(self.node)
                openshift_ops.resize_pvc(self.node, pvc_name, expand_size)
                openshift_ops.verify_pvc_size(self.node, pvc_name, expand_size)
            else:
                break

        # Make sure that gluster vol has appropriate option set
        vol_info = openshift_ops.get_gluster_vol_info_by_pvc_name(
            self.node, pvc_name)
        self.assertIn('user.heketi.zone-checking', vol_info['options'])
        self.assertEqual(vol_info['options']['user.heketi.zone-checking'],
                         heketi_zone_checking)
        if is_arbiter_vol:
            self.assertIn('user.heketi.arbiter', vol_info['options'])
            self.assertEqual(vol_info['options']['user.heketi.arbiter'],
                             'true')

        # Create app DC with the above PVC
        self.create_dc_with_pvc(pvc_name, timeout=120, wait_step=3)