#!/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)