def _build_storage_pool(self, pool): """Build a storage pool from a Cinder storage pool :param pool: A storage pool :type pool: :py:class:`~cinderclient.v2.pools.Pool` :raises: exception.InvalidPoolAttributeValue """ # build up the storage pool. attrs = ["total_volumes", "total_capacity_gb", "free_capacity_gb", "provisioned_capacity_gb", "allocated_capacity_gb"] node_attributes = {"name": pool.name} for attr in attrs: try: node_attributes[attr] = int(getattr(pool, attr)) except AttributeError: LOG.debug("Attribute %s for pool %s is not provided", attr, pool.name) except ValueError: raise exception.InvalidPoolAttributeValue( name=pool.name, attribute=attr) storage_pool = element.Pool(**node_attributes) return storage_pool
def from_xml(cls, data): model = cls() root = etree.fromstring(data) for cn in root.findall('.//StorageNode'): node = element.StorageNode(**cn.attrib) model.add_node(node) for p in root.findall('.//Pool'): pool = element.Pool(**p.attrib) model.add_pool(pool) parent = p.getparent() if parent.tag == 'StorageNode': node = model.get_node_by_name(parent.get('host')) model.map_pool(pool, node) else: model.add_pool(pool) for vol in root.findall('.//Volume'): volume = element.Volume(**vol.attrib) model.add_volume(volume) parent = vol.getparent() if parent.tag == 'Pool': pool = model.get_pool_by_pool_name(parent.get('name')) model.map_volume(volume, pool) else: model.add_volume(volume) return model
def _build_storage_pool(self, pool): """Build a storage pool from a Cinder storage pool :param pool: A storage pool :type pool: :py:class:`~cinderlient.v2.capabilities.Capabilities` :raises: exception.InvalidPoolAttributeValue """ # build up the storage pool. attrs = [ "total_volumes", "total_capacity_gb", "free_capacity_gb", "provisioned_capacity_gb", "allocated_capacity_gb" ] for attr in attrs: try: int(getattr(pool, attr)) except ValueError: raise exception.InvalidPoolAttributeValue(name=pool.name, attribute=attr) node_attributes = { "name": pool.name, "total_volumes": pool.total_volumes, "total_capacity_gb": pool.total_capacity_gb, "free_capacity_gb": pool.free_capacity_gb, "provisioned_capacity_gb": pool.provisioned_capacity_gb, "allocated_capacity_gb": pool.allocated_capacity_gb } storage_pool = element.Pool(**node_attributes) return storage_pool
def test_remove_pool(self): model = model_root.StorageModelRoot() pool_name = "host@backend#pool" pool = element.Pool(name=pool_name) model.add_pool(pool) self.assertEqual(pool, model.get_pool_by_pool_name(pool_name)) model.remove_pool(pool) self.assertRaises(exception.PoolNotFound, model.get_pool_by_pool_name, pool_name)
def test_get_pool_volumes(self): model = model_root.StorageModelRoot() pool_name = "host@backend#pool" pool = element.Pool(name=pool_name) model.add_pool(pool) self.assertEqual(pool, model.get_pool_by_pool_name(pool_name)) uuid_ = "{0}".format(uuidutils.generate_uuid()) volume = element.Volume(uuid=uuid_) model.add_volume(volume) self.assertEqual(volume, model.get_volume_by_uuid(uuid_)) model.map_volume(volume, pool) self.assertEqual([volume], model.get_pool_volumes(pool))
def test_get_node_pools(self): model = model_root.StorageModelRoot() hostname = "host@backend" node = element.StorageNode(host=hostname) model.add_node(node) self.assertEqual(node, model.get_node_by_name(hostname)) pool_name = "host@backend#pool" pool = element.Pool(name=pool_name) model.add_pool(pool) self.assertEqual(pool, model.get_pool_by_pool_name(pool_name)) model.map_pool(pool, node) self.assertEqual([pool], model.get_node_pools(node))
def test_map_unmap_volume(self): model = model_root.StorageModelRoot() pool_name = "host@backend#pool" pool = element.Pool(name=pool_name) model.add_pool(pool) self.assertEqual(pool, model.get_pool_by_pool_name(pool_name)) uuid_ = "{0}".format(uuidutils.generate_uuid()) volume = element.Volume(uuid=uuid_) model.add_volume(volume) self.assertEqual(volume, model.get_volume_by_uuid(uuid_)) model.map_volume(volume, pool) self.assertTrue(volume.uuid in model.predecessors(pool.name)) model.unmap_volume(volume, pool) self.assertFalse(volume.uuid in model.predecessors(pool.name))
def test_map_unmap_pool(self): model = model_root.StorageModelRoot() hostname = "host@backend" node = element.StorageNode(host=hostname) model.add_node(node) self.assertEqual(node, model.get_node_by_name(hostname)) pool_name = "host@backend#pool" pool = element.Pool(name=pool_name) model.add_pool(pool) self.assertEqual(pool, model.get_pool_by_pool_name(pool_name)) model.map_pool(pool, node) self.assertTrue(pool.name in model.predecessors(node.host)) model.unmap_pool(pool, node) self.assertFalse(pool.name in model.predecessors(node.host))
def create_pool(self, pool_name): """Create the storage pool by querying the Cinder API.""" try: _pool = self.cinder.get_storage_pool_by_name(pool_name) pool = element.Pool( name=_pool.name, total_volumes=_pool.total_volumes, total_capacity_gb=_pool.total_capacity_gb, free_capacity_gb=_pool.free_capacity_gb, provisioned_capacity_gb=_pool.provisioned_capacity_gb, allocated_capacity_gb=_pool.allocated_capacity_gb) return pool except Exception as exc: LOG.exception(exc) LOG.debug("Could not refresh the pool %s.", pool_name) raise exception.PoolNotFound(name=pool_name)
def _build_storage_pool(self, pool): """Build a storage pool from a Cinder storage pool :param pool: A storage pool :type pool: :py:class:`~cinderlient.v2.capabilities.Capabilities` """ # build up the storage pool. node_attributes = { "name": pool.name, "total_volumes": pool.total_volumes, "total_capacity_gb": pool.total_capacity_gb, "free_capacity_gb": pool.free_capacity_gb, "provisioned_capacity_gb": pool.provisioned_capacity_gb, "allocated_capacity_gb": pool.allocated_capacity_gb } storage_pool = element.Pool(**node_attributes) return storage_pool
def test_add_pool(self): model = model_root.StorageModelRoot() pool_name = "host@backend#pool" pool = element.Pool(name=pool_name) model.add_pool(pool) self.assertEqual(pool, model.get_pool_by_pool_name(pool_name))
def test_assert_pool_raise(self): model = model_root.StorageModelRoot() pool = element.Pool(name="host@backend#pool") model.add_pool(pool) self.assertRaises(exception.IllegalArgumentException, model.assert_pool, "obj")
def build_scenario_1(self): model = modelroot.StorageModelRoot() # number of nodes node_count = 2 # number of pools per node pool_count = 2 # number of volumes volume_count = 9 for i in range(0, node_count): host = "host_{0}@backend_{0}".format(i) zone = "zone_{0}".format(i) volume_type = "type_{0}".format(i) node_attributes = { "host": host, "zone": zone, "status": 'enabled', "state": 'up', "volume_type": volume_type, } node = element.StorageNode(**node_attributes) model.add_node(node) for j in range(0, pool_count): name = "host_{0}@backend_{0}#pool_{1}".format(i, j) pool_attributes = { "name": name, "total_volumes": 2, "total_capacity_gb": 500, "free_capacity_gb": 420, "provisioned_capacity_gb": 80, "allocated_capacity_gb": 80, "virtual_free": 420, } pool = element.Pool(**pool_attributes) model.add_pool(pool) mappings = [ ("host_0@backend_0#pool_0", "host_0@backend_0"), ("host_0@backend_0#pool_1", "host_0@backend_0"), ("host_1@backend_1#pool_0", "host_1@backend_1"), ("host_1@backend_1#pool_1", "host_1@backend_1"), ] for pool_name, node_name in mappings: model.map_pool( model.get_pool_by_pool_name(pool_name), model.get_node_by_name(node_name), ) for k in range(volume_count): uuid = "VOLUME_{0}".format(k) name = "name_{0}".format(k) project_id = "project_{0}".format(k) volume_attributes = { "size": 40, "status": "in-use", "uuid": uuid, "attachments": '[{"server_id": "server","attachment_id": "attachment"}]', "name": name, "multiattach": 'True', "snapshot_id": uuid, "project_id": project_id, "metadata": '{"readonly": false,"attached_mode": "rw"}', "bootable": 'False' } volume = element.Volume(**volume_attributes) model.add_volume(volume) mappings = [ ("VOLUME_0", "host_0@backend_0#pool_0"), ("VOLUME_1", "host_0@backend_0#pool_0"), ("VOLUME_2", "host_0@backend_0#pool_1"), ("VOLUME_3", "host_0@backend_0#pool_1"), ("VOLUME_4", "host_1@backend_1#pool_0"), ("VOLUME_5", "host_1@backend_1#pool_0"), ("VOLUME_6", "host_1@backend_1#pool_1"), ("VOLUME_7", "host_1@backend_1#pool_1"), ] for volume_uuid, pool_name in mappings: model.map_volume( model.get_volume_by_uuid(volume_uuid), model.get_pool_by_pool_name(pool_name), ) return model
def build_scenario_1(self): model = modelroot.StorageModelRoot() # number of nodes node_count = 2 # number of pools per node pool_count = 2 # number of volumes volume_count = 9 for i in range(0, node_count): host = "host_{0}@backend_{0}".format(i) zone = "zone_{0}".format(i) volume_type = ["type_{0}".format(i)] node_attributes = { "host": host, "zone": zone, "status": 'enabled', "state": 'up', "volume_type": volume_type, } node = element.StorageNode(**node_attributes) model.add_node(node) for j in range(0, pool_count): name = "host_{0}@backend_{0}#pool_{1}".format(i, j) pool_attributes = { "name": name, "total_volumes": 2, "total_capacity_gb": 500, "free_capacity_gb": 420, "provisioned_capacity_gb": 80, "allocated_capacity_gb": 80, "virtual_free": 420, } pool = element.Pool(**pool_attributes) model.add_pool(pool) mappings = [ ("host_0@backend_0#pool_0", "host_0@backend_0"), ("host_0@backend_0#pool_1", "host_0@backend_0"), ("host_1@backend_1#pool_0", "host_1@backend_1"), ("host_1@backend_1#pool_1", "host_1@backend_1"), ] for pool_name, node_name in mappings: model.map_pool( model.get_pool_by_pool_name(pool_name), model.get_node_by_name(node_name), ) volume_uuid_mapping = [ "5028b1eb-8749-48ae-a42c-5bdd1323976f", "74454247-a064-4b34-8f43-89337987720e", "a16c811e-2521-4fd3-8779-6a94ccb3be73", "37856b95-5be4-4864-8a49-c83f55c66780", "694f8fb1-df96-46be-b67d-49f2c14a495e", "66b094b0-8fc3-4a94-913f-a5f9312b11a5", "e9013810-4b4c-4b94-a056-4c36702d51a3", "07976191-6a57-4c35-9f3c-55b3b5ecd6d5", "4d1c952d-95d0-4aac-82aa-c3cb509af9f3", ] for k in range(volume_count): uuid = volume_uuid_mapping[k] name = "name_{0}".format(k) volume_attributes = { "size": 40, "status": "in-use", "uuid": uuid, "attachments": '[{"server_id": "server","attachment_id": "attachment"}]', "name": name, "multiattach": 'True', "snapshot_id": uuid, "project_id": "91FFFE30-78A0-4152-ACD2-8310FF274DC9", "metadata": '{"readonly": false,"attached_mode": "rw"}', "bootable": 'False' } volume = element.Volume(**volume_attributes) model.add_volume(volume) mappings = [ (volume_uuid_mapping[0], "host_0@backend_0#pool_0"), (volume_uuid_mapping[1], "host_0@backend_0#pool_0"), (volume_uuid_mapping[2], "host_0@backend_0#pool_1"), (volume_uuid_mapping[3], "host_0@backend_0#pool_1"), (volume_uuid_mapping[4], "host_1@backend_1#pool_0"), (volume_uuid_mapping[5], "host_1@backend_1#pool_0"), (volume_uuid_mapping[6], "host_1@backend_1#pool_1"), (volume_uuid_mapping[7], "host_1@backend_1#pool_1"), ] for volume_uuid, pool_name in mappings: model.map_volume( model.get_volume_by_uuid(volume_uuid), model.get_pool_by_pool_name(pool_name), ) return model