def createInjectionSpec(self, injectionData): """ _createInjectionSpec_ Transform the data structure returned from the database into an XML string for the PhEDEx Data Service. The injectionData parameter must be a dictionary keyed by dataset path. Each dataset path will map to a list of blocks, each block being a dict. The block dicts will have three keys: name, is-open and files. The files key will be a list of dicts, each of which have the following keys: lfn, size and checksum. The following is an example object: {"dataset1": {"block1": {"is-open": "y", "files": [{"lfn": "lfn1", "size": 10, "checksum": {"cksum": "1234"}}, {"lfn": "lfn2", "size": 20, "checksum": {"cksum": "4321"}}]}}} """ injectionSpec = XMLDrop.XMLInjectionSpec(self.dbsUrl) for datasetPath in injectionData: datasetSpec = injectionSpec.getDataset(datasetPath) for fileBlockName, fileBlock in injectionData[ datasetPath].iteritems(): blockSpec = datasetSpec.getFileblock(fileBlockName, fileBlock["is-open"]) for f in fileBlock["files"]: blockSpec.addFile(f["lfn"], f["checksum"], f["size"]) return injectionSpec.save()
def testA_XMLDrop(self): """ _XMLDrop_ Um...test that it does what it does? """ datasetPath = "/Cosmics/CRUZET09-PromptReco-v1/RECO" fileBlockName = "/Cosmics/CRUZET09-PromptReco-v1/RAW#1" spec = XMLDrop.XMLInjectionSpec(self.dbsURL) datasetSpec = spec.getDataset(datasetPath) fileBlock = datasetSpec.getFileblock(fileBlockName) fileBlock.addFile("lfn", {'adler32': '201', 'cksum': '101'}, '100') output = spec.save() self.assertTrue(re.search('<data version="2">', output) > 0) self.assertTrue( re.search('<dbs dls="dbs" name="%s">' % self.dbsURL, output) > 0) self.assertTrue( re.search( '<dataset is-open="y" is-transient="n" name="%s">' % datasetPath, output) > 0) self.assertTrue( re.search('<block is-open="y" name="%s">' % fileBlockName, output) > 0) self.assertTrue( re.search( '<file bytes="100" checksum="adler32:201,cksum:101" name="lfn"/>', output) > 0) self.assertTrue(re.search('</block>', output) > 0) self.assertTrue(re.search('</dataset>', output) > 0) return
def testGetSubscriptionMapping(self): """ _testGetSubscriptionMapping_ Verify that the subscription mapping API works correctly. """ testDataset = "/%s/WMCorePhEDExTest/RECO" % makeUUID() blockA = "%s#%s" % (testDataset, makeUUID()) blockB = "%s#%s" % (testDataset, makeUUID()) injectionSpec = XMLDrop.XMLInjectionSpec(self.dbsTestUrl) datasetSpec = injectionSpec.getDataset(testDataset) datasetSpec.getFileblock(blockA, 'y') datasetSpec.getFileblock(blockB, 'y') blockSpec = injectionSpec.save() self.phedexApi.injectBlocks("T1_US_FNAL_MSS", blockSpec) # Create a dataset level subscription to a node testDatasetSub = PhEDExSubscription([testDataset], "T1_UK_RAL_MSS", "Saturn", requestOnly="n") datasetSpec = XMLDrop.makePhEDExXMLForDatasets( self.dbsTestUrl, testDatasetSub.getDatasetPaths()) self.phedexApi.subscribe(testDatasetSub, datasetSpec) # Create a block level subscrtion to a different node testBlockSub = PhEDExSubscription([testDataset], "T1_DE_KIT_MSS", "Saturn", level="block", requestOnly="n") self.phedexApi.subscribe(testBlockSub, blockSpec) subs = self.phedexApi.getSubscriptionMapping(testDataset) self.assertEqual(subs[testDataset], set(["T1_UK_RAL_MSS"]), "Error: Dataset subscription is wrong.") subs = self.phedexApi.getSubscriptionMapping(blockA) self.assertEqual( len(subs[blockA]), 2, "Error: Wrong number of nodes in block subscription.") self.assertTrue("T1_UK_RAL_MSS" in subs[blockA], "Error: RAL missing from block sub.") self.assertTrue("T1_DE_KIT_MSS" in subs[blockA], "Error: KIT missing from block sub.") return