ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/COMP/CRAB/python/FjrParser.py
Revision: 1.1
Committed: Wed Feb 29 17:16:25 2012 UTC (13 years, 2 months ago) by fanzago
Content type: text/x-python
Branch: MAIN
CVS Tags: CRAB_2_9_1, CRAB_2_9_1_pre2, CRAB_2_9_1_pre1, CRAB_2_9_0, CRAB_2_9_0_pre2, CRAB_2_9_0_pre1, CRAB_2_8_8, CRAB_2_8_8_pre1, CRAB_2_8_7_patch3, CRAB_2_8_7_patch2, CRAB_2_8_7_patch1, CRAB_2_8_7, CRAB_2_8_7_pre2, CRAB_2_8_7_pre1, CRAB_2_8_6, CRAB_2_8_6_pre1, CRAB_2_8_5_patch3, CRAB_2_8_5_patch2, CRAB_2_8_5_patch1, CRAB_2_8_5, CRAB_2_8_5_pre5, CRAB_2_8_5_pre4, CRAB_2_8_5_pre3, CRAB_2_8_4_patch3, CRAB_2_8_5_pre2, CRAB_2_8_4_patch2, CRAB_2_8_5_pre1, CRAB_2_8_4_patch1, CRAB_2_8_4, CRAB_2_8_4_pre5, CRAB_2_8_4_pre4, CRAB_2_8_4_pre3, CRAB_2_8_4_pre2, CRAB_2_8_4_pre1, CRAB_2_8_3, CRAB_2_8_3_pre4, CRAB_2_8_3_pre3, CRAB_2_8_3_pre2, CRAB_2_8_3_pre1, CRAB_2_8_2_patch1, CRAB_2_8_2, CRAB_2_8_2_pre5, CRAB_2_8_2_pre4, CRAB_2_8_2_pre3, CRAB_2_8_2_pre2, CRAB_2_8_2_pre1, CRAB_2_8_1, HEAD
Log Message:
A simple fjr parsing framework that is used by retry_stageout.py & find_goodfiles.py

File Contents

# Content
1 import os, commands, re
2 import xml.dom.minidom
3 from xml.dom.minidom import Node
4
5 # we use this function for popen calls so that we can control verbosity
6 def getstatusoutput (cmd):
7 (stat, output) = commands.getstatusoutput(cmd)
8 return stat, output
9
10 def get_fjrs (directory):
11 cmd = '/bin/ls ' + directory + '/res/*.xml'
12 (stat, fjrs) = getstatusoutput(cmd)
13 if stat != 0:
14 print ">>> aborting retrieval, error:", fjrs
15 return []
16 return fjrs.split('\n')
17
18 def get_nodes ():
19 cmd = "wget --no-check-certificate -O- -q https://cmsweb.cern.ch/phedex/datasvc/xml/prod/nodes"
20 (stat, nodes) = getstatusoutput(cmd)
21 if stat != 0:
22 print ">>> aborting retrieval, error:", nodes
23 raise RuntimeError('command ' + cmd + ' execution error')
24 return nodes
25
26 def parse_xml(file):
27 return xml.dom.minidom.parse(file)
28
29 def parse_nodes():
30 datasvc_nodes = get_nodes()
31 return xml.dom.minidom.parseString(datasvc_nodes)
32
33 def is_goodfile (doc):
34 ns = 0
35 for node in doc.getElementsByTagName("FrameworkJobReport"):
36 key = node.attributes.keys()[0].encode('ascii')
37 value = node.attributes[key].value
38 if value == "Success":
39 for node2 in doc.getElementsByTagName("FrameworkError"):
40 exitStatus = node2.attributes["ExitStatus"].value
41 type = node2.attributes["Type"].value
42 if exitStatus == "0" and (type == "WrapperExitCode" or type == "ExeExitCode"):
43 ns = ns + 1
44 if (ns > 1): return True
45 return False
46
47 def has_local_stageout (doc):
48 for node in doc.getElementsByTagName("FrameworkJobReport"):
49 key = node.attributes.keys()[0].encode('ascii')
50 value = node.attributes[key].value
51 if value == "Failed":
52 for node2 in doc.getElementsByTagName("FrameworkError"):
53 exitStatus = node2.attributes["ExitStatus"].value
54 type = node2.attributes["Type"].value
55 if exitStatus == "60308" and type == "WrapperExitCode":
56 node.attributes[key].value = "Success"
57 node2.attributes["ExitStatus"].value = "0"
58 return True
59 return False
60
61 def get_filenames (doc):
62 lfn = ""
63 for node in doc.getElementsByTagName("LFN"):
64 if node.parentNode.tagName == "AnalysisFile":
65 lfn = node.attributes["Value"].value.strip()
66
67 pfn = ""
68 for node in doc.getElementsByTagName("PFN"):
69 if node.parentNode.tagName == "AnalysisFile":
70 pfn = node.attributes["Value"].value.strip()
71
72 surl = ""
73 for node in doc.getElementsByTagName("SurlForGrid"):
74 if node.parentNode.tagName == "AnalysisFile":
75 surl = node.attributes["Value"].value.strip()
76
77 return (lfn, pfn, surl)
78
79 def local_stageout_filenames_from_datasvc (doc, nodes):
80 # convert SEName into node
81 seName = ""
82 for node in doc.getElementsByTagName("SEName"):
83 if node.parentNode.tagName == "File":
84 seName = node.firstChild.nodeValue.strip()
85 if seName == "":
86 print ">>> could not find SEName in fjr, aborting retrieval"
87 raise RuntimeError('Failed to find SE name in fjr')
88 nodeName = ""
89 for node in nodes.getElementsByTagName("node"):
90 se = ""
91 name = ""
92 for key in node.attributes.keys():
93 if key.encode("ascii") == "se":
94 se = node.attributes[key].value
95 if key.encode("ascii") == "name":
96 name = node.attributes[key].value
97 if se == seName:
98 nodeName = name
99 break
100 if verbosity > 0:
101 print ">>> local stageout nodeName =", nodeName
102 lfn = ""
103 for node in doc.getElementsByTagName("LFN"):
104 if node.parentNode.tagName == "File":
105 lfn = node.firstChild.nodeValue.strip()
106 cmd = "wget --no-check-certificate -O- -q \"https://cmsweb.cern.ch/phedex/datasvc/xml/prod/lfn2pfn?node=" + nodeName + "&lfn=" + lfn + "&protocol=srmv2\""
107 (stat, pfnXml) = getstatusoutput(cmd)
108 if stat != 0:
109 print ">>> aborting retrieval, error:", pfnXml
110 raise RuntimeError('command ' + cmd + ' execution error')
111 try:
112 pfnDoc = xml.dom.minidom.parseString(pfnXml)
113 except:
114 print ">>> aborting retrieval, could not parse pfn xml for node/lfn:", nodeName, lfn
115 raise RuntimeError('xml parsing error')
116 pfn = ""
117 for node in pfnDoc.getElementsByTagName("mapping"):
118 for key in node.attributes.keys():
119 if key.encode("ascii") == "pfn":
120 pfn = node.attributes[key].value.encode("ascii")
121 return lfn, pfn
122
123 def cp_target (directory):
124 # this is a bit trickier; we need to parse CMSSW.sh to get $endpoint
125 cmd = "grep 'export endpoint=' " + directory + "/job/CMSSW.sh"
126 (stat, grep_output) = getstatusoutput(cmd)
127 if stat != 0:
128 print ">>> aborting retrieval, error:", grep_output
129 raise RuntimeError('Command ' + cmd + ' execution error')
130 return grep_output.replace("export endpoint=", "")
131
132 def cp_ui_target(directory):
133 path = os.getcwd() + '/' + directory + '/res/'
134 endpoint = 'file:/' + path
135 return path, endpoint
136
137 def rewrite_fjr (file, doc, quiet=True):
138 if not quiet:
139 print ">>> rewriting fjr to indicate remote stageout success"
140 (bkup_path, bkup_file) = os.path.split(file)
141 bkup_path += "/retry_backup"
142 if not quiet:
143 print ">>> backup path is", bkup_path
144 try:
145 stat_result = os.stat(bkup_path)
146 except OSError as err:
147 if err.errno == os.errno.ENOENT:
148 if not quiet:
149 print ">>> backup directory does not exist, creating ..."
150 os.mkdir(bkup_path)
151 else:
152 raise RuntimeError('Error: ' + err.errno)
153 bkup_file = os.path.join(bkup_path, bkup_file)
154 if not quiet:
155 print ">>> \told fjr will be backed up to", bkup_file
156 (bkup_cp_output_stat, bkup_cp_output) = getstatusoutput("mv " + file + " " + bkup_file)
157 if bkup_cp_output_stat != 0:
158 print ">>> could not back up fjr, error:", bkup_cp_output, "(fjr not rewritten)"
159 raise RuntimeError('failed to backup fjr')
160
161 out = open(file, "w")
162 doc.writexml(out)