def test_iso2seconds(self): """iso2seconds should be able to parse most iso 8601 duration strings""" durations = (('P1Y', 3600*24*365), ('P1M', 2628000), ('P1W', 3600*24*7), ('P1D', 3600*24), ('PT10H20M30S', 10*3600+20*60+30), ('PT1H2M4.567S', 3600+2*60+5), ('PT1H2M4,567S', 3600+2*60+5), ) for iso_in, seconds_out in durations: self.assertEqual(iso2seconds(iso_in), seconds_out, "Duration '%s' converts to %s when it should be %s" % (iso_in, iso2seconds(iso_in), seconds_out))
def parse_car(self, xml_record): ''' Main function for parsing CAR record. Interesting data can be fetched from 2 places: * as a content of node (here called text node) * as a attribute value (extracted by getAttr) ''' functions = { 'Site' : lambda nodes: self.getText(nodes['Site'][0].childNodes), 'SubmitHost' : lambda nodes: self.getText(nodes['SubmitHost'][0].childNodes), 'MachineName' : lambda nodes: self.getText(nodes['MachineName'][0].childNodes), 'Queue' : lambda nodes: self.getText(nodes['Queue'][0].childNodes), 'LocalJobId' : lambda nodes: self.getText(nodes['LocalJobId'][0].childNodes), 'LocalUserId' : lambda nodes: self.getText(nodes['LocalUserId'][0].childNodes), 'GlobalUserName' : lambda nodes: self.getText(nodes['GlobalUserName'][0].childNodes), 'FQAN' : lambda nodes: self.getText( self.getTagByAttr(nodes['GroupAttribute'], 'type', 'FQAN')[0].childNodes), 'VO' : lambda nodes: self.getText(nodes['Group'][0].childNodes), 'VOGroup' : lambda nodes: self.getText( self.getTagByAttr(nodes['GroupAttribute'], 'type', 'group')[0].childNodes), 'VORole' : lambda nodes: self.getText( self.getTagByAttr(nodes['GroupAttribute'], 'type', 'role')[0].childNodes), 'WallDuration' : lambda nodes: iso2seconds(self.getText( nodes['WallDuration'][0].childNodes)), 'CpuDuration' : lambda nodes: iso2seconds(self.retrieve_cpu(nodes)), 'Processors' : lambda nodes: self.getText(nodes['Processors'][0].childNodes), 'NodeCount' : lambda nodes: self.getText(nodes['NodeCount'][0].childNodes), 'MemoryReal' : lambda nodes: None, 'MemoryVirtual' : lambda nodes: None, 'StartTime' : lambda nodes: parse_timestamp(self.getText( nodes['StartTime'][0].childNodes)), 'EndTime' : lambda nodes: parse_timestamp(self.getText( nodes['EndTime'][0].childNodes)), 'InfrastructureDescription' : lambda nodes: self.getAttr(nodes['Infrastructure'][0], 'description'), 'InfrastructureType' : lambda nodes: self.getAttr(nodes['Infrastructure'][0], 'type'), 'ServiceLevelType' : lambda nodes: self.getAttr( nodes['ServiceLevel'][0], 'type'), 'ServiceLevel' : lambda nodes: self.getText( nodes['ServiceLevel'][0].childNodes), } tags = ['Site', 'SubmitHost', 'MachineName', 'Queue', 'LocalJobId', 'LocalUserId', 'GlobalUserName', 'GroupAttribute', 'Group', 'WallDuration', 'CpuDuration', 'Memory', 'Processors', 'NodeCount', 'StartTime', 'EndTime', 'Infrastructure', 'ServiceLevel'] # Create a dictionary of all the tags we want to retrieve from the XML nodes = {}.fromkeys(tags) data = {} for node in nodes: # Create a list of nodes which match the tags we want. # Note that this only matches the one namespace we have defined. nodes[node] = xml_record.getElementsByTagNameNS(self.NAMESPACE, node) for field in functions: try: data[field] = functions[field](nodes) except (IndexError, KeyError, AttributeError), e: log.debug('Failed to parse field %s: %s' % (field, e))
def parseAurRecord(self, xml_record): ''' Main function for parsing AUR record. Interesting data can be fetched from 2 places: * as a content of node (here called text node) * as a attribute value (extracted by getAttr) ''' functions = { 'Site' : lambda nodes: self.getText(nodes['Site'][0].childNodes), 'Month' : lambda nodes: self.getText(nodes['Month'][0].childNodes), 'Year' : lambda nodes: self.getText(nodes['Year'][0].childNodes), 'GlobalUserName' : lambda nodes: self.getText(nodes['GlobalUserName'][0].childNodes), 'VO' : lambda nodes: self.getText(nodes['Group'][0].childNodes), 'VOGroup' : lambda nodes: self.getText( self.getTagByAttr(nodes['GroupAttribute'], 'type', 'vo-group', CarParser.NAMESPACE)[0].childNodes), 'VORole' : lambda nodes: self.getText( self.getTagByAttr(nodes['GroupAttribute'], 'type', 'role', CarParser.NAMESPACE)[0].childNodes), 'MachineName' : lambda nodes: self.getText(nodes['MachineName'][0].childNodes), 'SubmitHost' : lambda nodes: self.getText(nodes['SubmitHost'][0].childNodes), 'Infrastructure' : lambda nodes: self.getAttr(nodes['Infrastructure'][0], 'type', CarParser.NAMESPACE), 'EarliestEndTime' : lambda nodes: parse_timestamp(self.getText( nodes['EarliestEndTime'][0].childNodes)), 'LatestEndTime' : lambda nodes: parse_timestamp(self.getText( nodes['LatestEndTime'][0].childNodes)), 'WallDuration' : lambda nodes: iso2seconds(self.getText( nodes['WallDuration'][0].childNodes)), 'CpuDuration' : lambda nodes: iso2seconds(self.getText( nodes['CpuDuration'][0].childNodes)), 'NormalisedWallDuration': lambda nodes: iso2seconds(self.getText( nodes['NormalisedWallDuration'][0].childNodes)), 'NormalisedCpuDuration': lambda nodes: iso2seconds(self.getText( nodes['NormalisedCpuDuration'][0].childNodes)), 'NumberOfJobs' : lambda nodes: self.getText(nodes['NumberOfJobs'][0].childNodes), 'NodeCount' : lambda nodes: self.getText(nodes['NodeCount'][0].childNodes), 'Processors' : lambda nodes: self.getText(nodes['Processors'][0].childNodes), } tags = ['Site', 'Month', 'Year', 'GlobalUserName', 'Group', 'GroupAttribute', 'SubmitHost', 'Infrastructure', 'EarliestEndTime', 'LatestEndTime', 'WallDuration', 'CpuDuration', 'NormalisedWallDuration', 'NormalisedCpuDuration', 'NumberOfJobs', 'NodeCount', 'Processors'] nodes = {}.fromkeys(tags) data = {} for node in nodes: if node in ('GroupAttribute',): # For these attributes we need to dig into the GroupAttribute # elements to get the values so we save the whole elements. nodes[node] = xml_record.getElementsByTagNameNS( CarParser.NAMESPACE, 'GroupAttribute') else: nodes[node] = xml_record.getElementsByTagNameNS(self.NAMESPACE, node) # Some of the nodes are in the CAR namespace. nodes[node].extend(xml_record.getElementsByTagNameNS(CarParser.NAMESPACE, node)) for field in functions: try: data[field] = functions[field](nodes) except IndexError, e: log.debug('Failed to parse field %s: %s', field, e) except KeyError, e: log.debug('Failed to parse field %s: %s', field, e)
def test_iso2seconds(self): txt1, txt2, txt3 = 'P1Y', 'P1M', 'P1D' self.assertTrue(iso2seconds(txt1), 3600*24*365) self.assertTrue(iso2seconds(txt2), 3600*24*30) self.assertTrue(iso2seconds(txt3), 3600*24)
def test_iso2seconds(self): txt1, txt2, txt3 = 'P1Y', 'P1M', 'P1D' self.assertTrue(iso2seconds(txt1), 3600 * 24 * 365) self.assertTrue(iso2seconds(txt2), 3600 * 24 * 30) self.assertTrue(iso2seconds(txt3), 3600 * 24)