onos-assembly.py
2.81 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#!/usr/bin/env python
'''
Builds synthetic feature file that includes all core, provider, and application
features, so that we can pre-stage all bundles required to run ONOS off-line.
'''
import os
import xml.etree.ElementTree as ET
FEATURE_TAG = '{http://karaf.apache.org/xmlns/features/v1.2.0}feature'
STAGED_REPOS = 'target/staged-repos.xml'
if 'ONOS_ROOT' in os.environ:
ONOS_ROOT = os.environ['ONOS_ROOT']
else:
# fallback to working directory if ONOS_ROOT is not set
ONOS_ROOT = os.getcwd()
def findFeatureFiles(path=ONOS_ROOT):
#only descend into target directories that have pom
for root, dirs, files in os.walk(path):
if 'pom.xml' not in files:
if 'target' in dirs:
#pruning target dir with no pom.xml
dirs.remove('target')
if '/target' in root:
if '/classes/' in root:
#filter out features.xml for maven-plugin
continue
for f in files:
if f.endswith('features.xml'):
yield os.path.join(root, f)
def featuresFromFile(file):
features = []
tree = ET.parse(file)
root = tree.getroot()
for feature in root.findall(FEATURE_TAG):
features.append(feature.attrib['name'])
return features
if __name__ == '__main__':
outputTree = ET.Element('features')
uberFeature = ET.Element('feature', attrib={'name' : 'onos-uber-synthetic'})
for file in findFeatureFiles():
features = featuresFromFile(file)
if len(features) > 0:
ET.SubElement(outputTree, 'repository').text = 'file:%s' % file
for feature in features:
ET.SubElement(uberFeature, 'feature').text = feature
outputTree.append(uberFeature)
outputFile = os.path.join(os.path.dirname(os.path.realpath(__file__)), STAGED_REPOS)
outputDir = os.path.dirname(outputFile)
if not os.path.exists(outputDir):
os.mkdir(outputDir)
ET.ElementTree(outputTree).write(outputFile)
import sys
if '-d' in sys.argv:
# -------- TODO for debug only --------
def indent(elem, level=0):
#function borrowed from: http://effbot.org/zone/element-lib.htm#prettyprint
i = "\n" + level*" "
if len(elem):
if not elem.text or not elem.text.strip():
elem.text = i + " "
if not elem.tail or not elem.tail.strip():
elem.tail = i
for elem in elem:
indent(elem, level+1)
if not elem.tail or not elem.tail.strip():
elem.tail = i
else:
if level and (not elem.tail or not elem.tail.strip()):
elem.tail = i
print 'Writing to file:', outputFile
indent(outputTree)
ET.dump(outputTree)