def make_blocksd_manifest(tmpdir, fake_lvm, sduuid=None, devices=None, sd_version=3): if sduuid is None: sduuid = make_uuid() if devices is None: devices = get_random_devices() spuuid = make_uuid() fake_lvm.createVG(sduuid, devices, blockSD.STORAGE_DOMAIN_TAG, blockSD.VG_METADATASIZE) fake_lvm.createLV(sduuid, sd.METADATA, blockSD.SD_METADATA_SIZE) # Create the rest of the special LVs special = blockSD.BlockStorageDomainManifest.special_volumes(sd_version) for name, size_mb in sd.SPECIAL_VOLUME_SIZES_MIB.iteritems(): if name in special: fake_lvm.createLV(sduuid, name, size_mb) fake_lvm.createLV(sduuid, blockSD.MASTERLV, blockSD.MASTER_LV_SIZE_MB) # We'll store the domain metadata in the VG's tags metadata = make_sd_metadata(sduuid, version=sd_version, pools=[spuuid]) assert(metadata[sd.DMDK_VERSION] >= 3) # Tag based MD is V3 and above tag_md = blockSD.TagBasedSDMetadata(sduuid) tag_md.update(metadata) manifest = blockSD.BlockStorageDomainManifest(sduuid, tag_md) os.makedirs(os.path.join(manifest.domaindir, sd.DOMAIN_IMAGES)) # Make the repo directory structure repo_pool_dir = os.path.join(tmpdir, spuuid) os.mkdir(repo_pool_dir) os.symlink(manifest.domaindir, os.path.join(repo_pool_dir, sduuid)) return manifest
def test_domain_metadata_io_block_env(): with fake_block_env() as env: desc = 'foo' set_domain_metaparams(env.sd_manifest, {sd.DMDK_DESCRIPTION: desc}) # Test that metadata is persisted to our temporary storage area. sd_id = env.sd_manifest.sdUUID manifest = blockSD.BlockStorageDomainManifest(sd_id) assert desc == manifest.getMetaParam(sd.DMDK_DESCRIPTION)
def test_overwrite_blocksize(self): metadata = {sd.DMDK_VERSION: 3, blockSD.DMDK_LOGBLKSIZE: 2048, blockSD.DMDK_PHYBLKSIZE: 1024} with self.env() as env: # Replacing the metadata will not overwrite these values since they # are set only in the manifest constructor. env.sd_manifest.replaceMetadata(metadata) self.assertEqual(512, env.sd_manifest.logBlkSize) self.assertEqual(512, env.sd_manifest.phyBlkSize) # If we supply values in the metadata used to construct the # manifest then those values will apply. new_manifest = blockSD.BlockStorageDomainManifest( env.sd_manifest.sdUUID, metadata) self.assertEqual(2048, new_manifest.logBlkSize) self.assertEqual(1024, new_manifest.phyBlkSize)
def test_metadata_offset(monkeypatch): sd_uuid = str(uuid.uuid4()) fake_metadata = { sd.DMDK_VERSION: 4, sd.DMDK_LOGBLKSIZE: 512, sd.DMDK_PHYBLKSIZE: 512, } monkeypatch.setattr(sd.StorageDomainManifest, "_makeDomainLock", lambda _: None) sd_manifest = blockSD.BlockStorageDomainManifest(sd_uuid, fake_metadata) assert 0 == sd_manifest.metadata_offset(0) assert 51200 == sd_manifest.metadata_offset(100) assert 0 == sd_manifest.metadata_offset(0, version=4) assert 51200 == sd_manifest.metadata_offset(100, version=4) assert 1048576 == sd_manifest.metadata_offset(0, version=5) assert 1867776 == sd_manifest.metadata_offset(100, version=5)