From 403f967f6b7e8e06ec463ad397f71967d7648857 Mon Sep 17 00:00:00 2001 From: Thierry Parmentelat Date: Fri, 1 Apr 2016 11:51:29 +0200 Subject: [PATCH] offically terminate eucalyptus & xmlbuilder --- sfa.spec | 2 - sfa/managers/aggregate_manager_eucalyptus.py | 701 ------------------ xmlbuilder-0.9/LICENSE | 21 - xmlbuilder-0.9/MANIFEST.in | 2 - xmlbuilder-0.9/PKG-INFO | 80 -- xmlbuilder-0.9/README.txt | 1 - xmlbuilder-0.9/setup.cfg | 5 - xmlbuilder-0.9/setup.py | 43 -- xmlbuilder-0.9/xmlbuilder.egg-info/PKG-INFO | 80 -- .../xmlbuilder.egg-info/SOURCES.txt | 13 - .../xmlbuilder.egg-info/dependency_links.txt | 1 - .../xmlbuilder.egg-info/top_level.txt | 1 - xmlbuilder-0.9/xmlbuilder/__init__.py | 153 ---- xmlbuilder-0.9/xmlbuilder/docs/long_descr.rst | 68 -- xmlbuilder-0.9/xmlbuilder/tests/__init__.py | 99 --- 15 files changed, 1270 deletions(-) delete mode 100644 sfa/managers/aggregate_manager_eucalyptus.py delete mode 100644 xmlbuilder-0.9/LICENSE delete mode 100644 xmlbuilder-0.9/MANIFEST.in delete mode 100644 xmlbuilder-0.9/PKG-INFO delete mode 100644 xmlbuilder-0.9/README.txt delete mode 100644 xmlbuilder-0.9/setup.cfg delete mode 100644 xmlbuilder-0.9/setup.py delete mode 100644 xmlbuilder-0.9/xmlbuilder.egg-info/PKG-INFO delete mode 100644 xmlbuilder-0.9/xmlbuilder.egg-info/SOURCES.txt delete mode 100644 xmlbuilder-0.9/xmlbuilder.egg-info/dependency_links.txt delete mode 100644 xmlbuilder-0.9/xmlbuilder.egg-info/top_level.txt delete mode 100644 xmlbuilder-0.9/xmlbuilder/__init__.py delete mode 100644 xmlbuilder-0.9/xmlbuilder/docs/long_descr.rst delete mode 100644 xmlbuilder-0.9/xmlbuilder/tests/__init__.py diff --git a/sfa.spec b/sfa.spec index 39aa4947..047de43e 100644 --- a/sfa.spec +++ b/sfa.spec @@ -33,8 +33,6 @@ Requires: python-psycopg2 # f8=0.4 - f12=0.5 f14=0.6 f16=0.7 Requires: python-sqlalchemy Requires: python-migrate -# the eucalyptus aggregate uses this module -#Requires: python-xmlbuilder # for uuidgen - used in db password generation # on f8 this actually comes with e2fsprogs, go figure Requires: util-linux-ng diff --git a/sfa/managers/aggregate_manager_eucalyptus.py b/sfa/managers/aggregate_manager_eucalyptus.py deleted file mode 100644 index 2356f333..00000000 --- a/sfa/managers/aggregate_manager_eucalyptus.py +++ /dev/null @@ -1,701 +0,0 @@ -from __future__ import with_statement - -import sys -import os, errno -import logging -import datetime -from multiprocessing import Process -from time import sleep - -import boto -from boto.ec2.regioninfo import RegionInfo -from boto.exception import EC2ResponseError -from ConfigParser import ConfigParser -from xmlbuilder import XMLBuilder -from lxml import etree as ET -from sqlobject import * - -from sfa.util.faults import InvalidRSpec -from sfa.util.xrn import urn_to_hrn, Xrn -from sfa.util.callids import Callids -#comes with its own logging -#from sfa.util.sfalogging import logger -from sfa.util.version import version_core - -from sfa.trust.credential import Credential - -from sfa.rspecs.version_manager import VersionManager -from sfa.rspecs.rspec import RSpec - -from sfa.planetlab.plaggregate import PlAggregate -from sfa.planetlab.plslices import PlSlices -from sfa.planetlab.plxrn import slicename_to_hrn - -## -# Meta data of an instance. -# -class Meta(SQLObject): - instance = SingleJoin('EucaInstance') - state = StringCol(default = 'new') - pub_addr = StringCol(default = None) - pri_addr = StringCol(default = None) - start_time = DateTimeCol(default = None) - -## -# A representation of an Eucalyptus instance. This is a support class -# for instance <-> slice mapping. -# -class EucaInstance(SQLObject): - instance_id = StringCol(unique=True, default=None) - kernel_id = StringCol() - image_id = StringCol() - ramdisk_id = StringCol() - inst_type = StringCol() - key_pair = StringCol() - slice = ForeignKey('Slice') - meta = ForeignKey('Meta') - - ## - # Contacts Eucalyptus and tries to reserve this instance. - # - # @param botoConn A connection to Eucalyptus. - # @param pubKeys A list of public keys for the instance. - # - def reserveInstance(self, botoConn, pubKeys): - logger = logging.getLogger('EucaAggregate') - logger.info('Reserving an instance: image: %s, kernel: ' \ - '%s, ramdisk: %s, type: %s, key: %s' % \ - (self.image_id, self.kernel_id, self.ramdisk_id, - self.inst_type, self.key_pair)) - - try: - reservation = botoConn.run_instances(self.image_id, - kernel_id = self.kernel_id, - ramdisk_id = self.ramdisk_id, - instance_type = self.inst_type, - key_name = self.key_pair, - user_data = pubKeys) - for instance in reservation.instances: - self.instance_id = instance.id - - # If there is an error, destroy itself. - except EC2ResponseError as ec2RespErr: - errTree = ET.fromstring(ec2RespErr.body) - msg = errTree.find('.//Message') - logger.error(msg.text) - self.destroySelf() - -## -# A representation of a PlanetLab slice. This is a support class -# for instance <-> slice mapping. -# -class Slice(SQLObject): - slice_hrn = StringCol() - #slice_index = DatabaseIndex('slice_hrn') - instances = MultipleJoin('EucaInstance') - -## -# A class that builds the RSpec for Eucalyptus. -# -class EucaRSpecBuilder(object): - ## - # Initizes a RSpec builder - # - # @param cloud A dictionary containing data about a - # cloud (ex. clusters, ip) - def __init__(self, cloud): - self.eucaRSpec = XMLBuilder(format = True, tab_step = " ") - self.cloudInfo = cloud - - ## - # Creates a request stanza. - # - # @param num The number of instances to create. - # @param image The disk image id. - # @param kernel The kernel image id. - # @param keypair Key pair to embed. - # @param ramdisk Ramdisk id (optional). - # - def __requestXML(self, num, image, kernel, keypair, ramdisk = ''): - xml = self.eucaRSpec - with xml.request: - with xml.instances: - xml << str(num) - with xml.kernel_image(id=kernel): - xml << '' - if ramdisk == '': - with xml.ramdisk: - xml << '' - else: - with xml.ramdisk(id=ramdisk): - xml << '' - with xml.disk_image(id=image): - xml << '' - with xml.keypair: - xml << keypair - - ## - # Creates the cluster stanza. - # - # @param clusters Clusters information. - # - def __clustersXML(self, clusters): - cloud = self.cloudInfo - xml = self.eucaRSpec - - for cluster in clusters: - instances = cluster['instances'] - with xml.cluster(id=cluster['name']): - with xml.ipv4: - xml << cluster['ip'] - with xml.vm_types: - for inst in instances: - with xml.vm_type(name=inst[0]): - with xml.free_slots: - xml << str(inst[1]) - with xml.max_instances: - xml << str(inst[2]) - with xml.cores: - xml << str(inst[3]) - with xml.memory(unit='MB'): - xml << str(inst[4]) - with xml.disk_space(unit='GB'): - xml << str(inst[5]) - if 'instances' in cloud and inst[0] in cloud['instances']: - existingEucaInstances = cloud['instances'][inst[0]] - with xml.euca_instances: - for eucaInst in existingEucaInstances: - with xml.euca_instance(id=eucaInst['id']): - with xml.state: - xml << eucaInst['state'] - with xml.public_dns: - xml << eucaInst['public_dns'] - - def __imageBundleXML(self, bundles): - xml = self.eucaRSpec - with xml.bundles: - for bundle in bundles.keys(): - with xml.bundle(id=bundle): - xml << '' - - ## - # Creates the Images stanza. - # - # @param images A list of images in Eucalyptus. - # - def __imagesXML(self, images): - xml = self.eucaRSpec - with xml.images: - for image in images: - with xml.image(id=image.id): - with xml.type: - xml << image.type - with xml.arch: - xml << image.architecture - with xml.state: - xml << image.state - with xml.location: - xml << image.location - - ## - # Creates the KeyPairs stanza. - # - # @param keypairs A list of key pairs in Eucalyptus. - # - def __keyPairsXML(self, keypairs): - xml = self.eucaRSpec - with xml.keypairs: - for key in keypairs: - with xml.keypair: - xml << key.name - - ## - # Generates the RSpec. - # - def toXML(self): - logger = logging.getLogger('EucaAggregate') - if not self.cloudInfo: - logger.error('No cloud information') - return '' - - xml = self.eucaRSpec - cloud = self.cloudInfo - with xml.RSpec(type='eucalyptus'): - with xml.network(name=cloud['name']): - with xml.ipv4: - xml << cloud['ip'] - #self.__keyPairsXML(cloud['keypairs']) - #self.__imagesXML(cloud['images']) - self.__imageBundleXML(cloud['imageBundles']) - self.__clustersXML(cloud['clusters']) - return str(xml) - -## -# A parser to parse the output of availability-zones. -# -# Note: Only one cluster is supported. If more than one, this will -# not work. -# -class ZoneResultParser(object): - def __init__(self, zones): - self.zones = zones - - def parse(self): - if len(self.zones) < 3: - return - clusterList = [] - cluster = {} - instList = [] - - cluster['name'] = self.zones[0].name - cluster['ip'] = self.zones[0].state - - for i in range(2, len(self.zones)): - currZone = self.zones[i] - instType = currZone.name.split()[1] - - stateString = currZone.state.split('/') - rscString = stateString[1].split() - - instFree = int(stateString[0]) - instMax = int(rscString[0]) - instNumCpu = int(rscString[1]) - instRam = int(rscString[2]) - instDiskSpace = int(rscString[3]) - - instTuple = (instType, instFree, instMax, instNumCpu, instRam, instDiskSpace) - instList.append(instTuple) - cluster['instances'] = instList - clusterList.append(cluster) - - return clusterList - -class AggregateManagerEucalyptus: - - # The data structure used to represent a cloud. - # It contains the cloud name, its ip address, image information, - # key pairs, and clusters information. - cloud = {} - - # The location of the RelaxNG schema. - EUCALYPTUS_RSPEC_SCHEMA='/etc/sfa/eucalyptus.rng' - - _inited=False - - # the init_server mechanism has vanished - def __init__ (self, config): - if AggregateManagerEucalyptus._inited: return - AggregateManagerEucalyptus.init_server() - - # Initialize the aggregate manager by reading a configuration file. - @staticmethod - def init_server(): - logger = logging.getLogger('EucaAggregate') - fileHandler = logging.FileHandler('/var/log/euca.log') - fileHandler.setFormatter(logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')) - logger.addHandler(fileHandler) - fileHandler.setLevel(logging.DEBUG) - logger.setLevel(logging.DEBUG) - - configParser = ConfigParser() - configParser.read(['/etc/sfa/eucalyptus_aggregate.conf', 'eucalyptus_aggregate.conf']) - if len(configParser.sections()) < 1: - logger.error('No cloud defined in the config file') - raise Exception('Cannot find cloud definition in configuration file.') - - # Only read the first section. - cloudSec = configParser.sections()[0] - AggregateManagerEucalyptus.cloud['name'] = cloudSec - AggregateManagerEucalyptus.cloud['access_key'] = configParser.get(cloudSec, 'access_key') - AggregateManagerEucalyptus.cloud['secret_key'] = configParser.get(cloudSec, 'secret_key') - AggregateManagerEucalyptus.cloud['cloud_url'] = configParser.get(cloudSec, 'cloud_url') - cloudURL = AggregateManagerEucalyptus.cloud['cloud_url'] - if cloudURL.find('https://') >= 0: - cloudURL = cloudURL.replace('https://', '') - elif cloudURL.find('http://') >= 0: - cloudURL = cloudURL.replace('http://', '') - (AggregateManagerEucalyptus.cloud['ip'], parts) = cloudURL.split(':') - - # Create image bundles - images = self.getEucaConnection().get_all_images() - AggregateManagerEucalyptus.cloud['images'] = images - AggregateManagerEucalyptus.cloud['imageBundles'] = {} - for i in images: - if i.type != 'machine' or i.kernel_id is None: continue - name = os.path.dirname(i.location) - detail = {'imageID' : i.id, 'kernelID' : i.kernel_id, 'ramdiskID' : i.ramdisk_id} - AggregateManagerEucalyptus.cloud['imageBundles'][name] = detail - - # Initialize sqlite3 database and tables. - dbPath = '/etc/sfa/db' - dbName = 'euca_aggregate.db' - - if not os.path.isdir(dbPath): - logger.info('%s not found. Creating directory ...' % dbPath) - os.mkdir(dbPath) - - conn = connectionForURI('sqlite://%s/%s' % (dbPath, dbName)) - sqlhub.processConnection = conn - Slice.createTable(ifNotExists=True) - EucaInstance.createTable(ifNotExists=True) - Meta.createTable(ifNotExists=True) - - # Start the update process to keep track of the meta data - # about Eucalyptus instance. - Process(target=AggregateManagerEucalyptus.updateMeta).start() - - # Make sure the schema exists. - if not os.path.exists(AggregateManagerEucalyptus.EUCALYPTUS_RSPEC_SCHEMA): - err = 'Cannot location schema at %s' % AggregateManagerEucalyptus.EUCALYPTUS_RSPEC_SCHEMA - logger.error(err) - raise Exception(err) - - # - # A separate process that will update the meta data. - # - @staticmethod - def updateMeta(): - logger = logging.getLogger('EucaMeta') - fileHandler = logging.FileHandler('/var/log/euca_meta.log') - fileHandler.setFormatter(logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')) - logger.addHandler(fileHandler) - fileHandler.setLevel(logging.DEBUG) - logger.setLevel(logging.DEBUG) - - while True: - sleep(30) - - # Get IDs of the instances that don't have IPs yet. - dbResults = Meta.select( - AND(Meta.q.pri_addr == None, - Meta.q.state != 'deleted') - ) - dbResults = list(dbResults) - logger.debug('[update process] dbResults: %s' % dbResults) - instids = [] - for r in dbResults: - if not r.instance: - continue - instids.append(r.instance.instance_id) - logger.debug('[update process] Instance Id: %s' % ', '.join(instids)) - - # Get instance information from Eucalyptus - conn = self.getEucaConnection() - vmInstances = [] - reservations = conn.get_all_instances(instids) - for reservation in reservations: - vmInstances += reservation.instances - - # Check the IPs - instIPs = [ {'id':i.id, 'pri_addr':i.private_dns_name, 'pub_addr':i.public_dns_name} - for i in vmInstances if i.private_dns_name != '0.0.0.0' ] - logger.debug('[update process] IP dict: %s' % str(instIPs)) - - # Update the local DB - for ipData in instIPs: - dbInst = EucaInstance.select(EucaInstance.q.instance_id == ipData['id']).getOne(None) - if not dbInst: - logger.info('[update process] Could not find %s in DB' % ipData['id']) - continue - dbInst.meta.pri_addr = ipData['pri_addr'] - dbInst.meta.pub_addr = ipData['pub_addr'] - dbInst.meta.state = 'running' - - self.dumpinstanceInfo() - - ## - # Creates a connection to Eucalytpus. This function is inspired by - # the make_connection() in Euca2ools. - # - # @return A connection object or None - # - def getEucaConnection(): - accessKey = AggregateManagerEucalyptus.cloud['access_key'] - secretKey = AggregateManagerEucalyptus.cloud['secret_key'] - eucaURL = AggregateManagerEucalyptus.cloud['cloud_url'] - useSSL = False - srvPath = '/' - eucaPort = 8773 - logger = logging.getLogger('EucaAggregate') - - if not accessKey or not secretKey or not eucaURL: - logger.error('Please set ALL of the required environment ' \ - 'variables by sourcing the eucarc file.') - return None - - # Split the url into parts - if eucaURL.find('https://') >= 0: - useSSL = True - eucaURL = eucaURL.replace('https://', '') - elif eucaURL.find('http://') >= 0: - useSSL = False - eucaURL = eucaURL.replace('http://', '') - (eucaHost, parts) = eucaURL.split(':') - if len(parts) > 1: - parts = parts.split('/') - eucaPort = int(parts[0]) - parts = parts[1:] - srvPath = '/'.join(parts) - - return boto.connect_ec2(aws_access_key_id=accessKey, - aws_secret_access_key=secretKey, - is_secure=useSSL, - region=RegionInfo(None, 'eucalyptus', eucaHost), - port=eucaPort, - path=srvPath) - - def ListResources(api, creds, options): - call_id = options.get('call_id') - if Callids().already_handled(call_id): return "" - # get slice's hrn from options - xrn = options.get('geni_slice_urn', '') - hrn, type = urn_to_hrn(xrn) - logger = logging.getLogger('EucaAggregate') - - # get hrn of the original caller - origin_hrn = options.get('origin_hrn', None) - if not origin_hrn: - origin_hrn = Credential(string=creds[0]).get_gid_caller().get_hrn() - - conn = self.getEucaConnection() - - if not conn: - logger.error('Cannot create a connection to Eucalyptus') - return 'Cannot create a connection to Eucalyptus' - - try: - # Zones - zones = conn.get_all_zones(['verbose']) - p = ZoneResultParser(zones) - clusters = p.parse() - AggregateManagerEucalyptus.cloud['clusters'] = clusters - - # Images - images = conn.get_all_images() - AggregateManagerEucalyptus.cloud['images'] = images - AggregateManagerEucalyptus.cloud['imageBundles'] = {} - for i in images: - if i.type != 'machine' or i.kernel_id is None: continue - name = os.path.dirname(i.location) - detail = {'imageID' : i.id, 'kernelID' : i.kernel_id, 'ramdiskID' : i.ramdisk_id} - AggregateManagerEucalyptus.cloud['imageBundles'][name] = detail - - # Key Pairs - keyPairs = conn.get_all_key_pairs() - AggregateManagerEucalyptus.cloud['keypairs'] = keyPairs - - if hrn: - instanceId = [] - instances = [] - - # Get the instances that belong to the given slice from sqlite3 - # XXX use getOne() in production because the slice's hrn is supposed - # to be unique. For testing, uniqueness is turned off in the db. - # If the slice isn't found in the database, create a record for the - # slice. - matchedSlices = list(Slice.select(Slice.q.slice_hrn == hrn)) - if matchedSlices: - theSlice = matchedSlices[-1] - else: - theSlice = Slice(slice_hrn = hrn) - for instance in theSlice.instances: - instanceId.append(instance.instance_id) - - # Get the information about those instances using their ids. - if len(instanceId) > 0: - reservations = conn.get_all_instances(instanceId) - else: - reservations = [] - for reservation in reservations: - for instance in reservation.instances: - instances.append(instance) - - # Construct a dictionary for the EucaRSpecBuilder - instancesDict = {} - for instance in instances: - instList = instancesDict.setdefault(instance.instance_type, []) - instInfoDict = {} - - instInfoDict['id'] = instance.id - instInfoDict['public_dns'] = instance.public_dns_name - instInfoDict['state'] = instance.state - instInfoDict['key'] = instance.key_name - - instList.append(instInfoDict) - AggregateManagerEucalyptus.cloud['instances'] = instancesDict - - except EC2ResponseError as ec2RespErr: - errTree = ET.fromstring(ec2RespErr.body) - errMsgE = errTree.find('.//Message') - logger.error(errMsgE.text) - - rspec = EucaRSpecBuilder(AggregateManagerEucalyptus.cloud).toXML() - - # Remove the instances records so next time they won't - # show up. - if 'instances' in AggregateManagerEucalyptus.cloud: - del AggregateManagerEucalyptus.cloud['instances'] - - return rspec - - """ - Hook called via 'sfi.py create' - """ - def CreateSliver(api, slice_xrn, creds, xml, users, options): - call_id = options.get('call_id') - if Callids().already_handled(call_id): return "" - - logger = logging.getLogger('EucaAggregate') - logger.debug("In CreateSliver") - - aggregate = PlAggregate(self.driver) - slices = PlSlices(self.driver) - (hrn, type) = urn_to_hrn(slice_xrn) - peer = slices.get_peer(hrn) - sfa_peer = slices.get_sfa_peer(hrn) - slice_record=None - if users: - slice_record = users[0].get('slice_record', {}) - - conn = self.getEucaConnection() - if not conn: - logger.error('Cannot create a connection to Eucalyptus') - return "" - - # Validate RSpec - schemaXML = ET.parse(AggregateManagerEucalyptus.EUCALYPTUS_RSPEC_SCHEMA) - rspecValidator = ET.RelaxNG(schemaXML) - rspecXML = ET.XML(xml) - for network in rspecXML.iterfind("./network"): - if network.get('name') != AggregateManagerEucalyptus.cloud['name']: - # Throw away everything except my own RSpec - # sfa_logger().error("CreateSliver: deleting %s from rspec"%network.get('id')) - network.getparent().remove(network) - if not rspecValidator(rspecXML): - error = rspecValidator.error_log.last_error - message = '%s (line %s)' % (error.message, error.line) - raise InvalidRSpec(message) - - """ - Create the sliver[s] (slice) at this aggregate. - Verify HRN and initialize the slice record in PLC if necessary. - """ - - # ensure site record exists - site = slices.verify_site(hrn, slice_record, peer, sfa_peer) - # ensure slice record exists - slice = slices.verify_slice(hrn, slice_record, peer, sfa_peer) - # ensure person records exists - persons = slices.verify_persons(hrn, slice, users, peer, sfa_peer) - - # Get the slice from db or create one. - s = Slice.select(Slice.q.slice_hrn == hrn).getOne(None) - if s is None: - s = Slice(slice_hrn = hrn) - - # Process any changes in existing instance allocation - pendingRmInst = [] - for sliceInst in s.instances: - pendingRmInst.append(sliceInst.instance_id) - existingInstGroup = rspecXML.findall(".//euca_instances") - for instGroup in existingInstGroup: - for existingInst in instGroup: - if existingInst.get('id') in pendingRmInst: - pendingRmInst.remove(existingInst.get('id')) - for inst in pendingRmInst: - dbInst = EucaInstance.select(EucaInstance.q.instance_id == inst).getOne(None) - if dbInst.meta.state != 'deleted': - logger.debug('Instance %s will be terminated' % inst) - # Terminate instances one at a time for robustness - conn.terminate_instances([inst]) - # Only change the state but do not remove the entry from the DB. - dbInst.meta.state = 'deleted' - #dbInst.destroySelf() - - # Process new instance requests - requests = rspecXML.findall(".//request") - if requests: - # Get all the public keys associate with slice. - keys = [] - for user in users: - keys += user['keys'] - logger.debug("Keys: %s" % user['keys']) - pubKeys = '\n'.join(keys) - logger.debug('Passing the following keys to the instance:\n%s' % pubKeys) - for req in requests: - vmTypeElement = req.getparent() - instType = vmTypeElement.get('name') - numInst = int(req.find('instances').text) - - bundleName = req.find('bundle').text - if not AggregateManagerEucalyptus.cloud['imageBundles'][bundleName]: - logger.error('Cannot find bundle %s' % bundleName) - bundleInfo = AggregateManagerEucalyptus.cloud['imageBundles'][bundleName] - instKernel = bundleInfo['kernelID'] - instDiskImg = bundleInfo['imageID'] - instRamDisk = bundleInfo['ramdiskID'] - instKey = None - - # Create the instances - for i in range(0, numInst): - eucaInst = EucaInstance(slice = s, - kernel_id = instKernel, - image_id = instDiskImg, - ramdisk_id = instRamDisk, - key_pair = instKey, - inst_type = instType, - meta = Meta(start_time=datetime.datetime.utcnow())) - eucaInst.reserveInstance(conn, pubKeys) - - # xxx - should return altered rspec - # with enough data for the client to understand what's happened - return xml - - ## - # Return information on the IP addresses bound to each slice's instances - # - def dumpInstanceInfo(): - logger = logging.getLogger('EucaMeta') - outdir = "/var/www/html/euca/" - outfile = outdir + "instances.txt" - - try: - os.makedirs(outdir) - except OSError as e: - if e.errno != errno.EEXIST: - raise - - dbResults = Meta.select( - AND(Meta.q.pri_addr != None, - Meta.q.state == 'running') - ) - dbResults = list(dbResults) - f = open(outfile, "w") - for r in dbResults: - instId = r.instance.instance_id - ipaddr = r.pri_addr - hrn = r.instance.slice.slice_hrn - logger.debug('[dumpInstanceInfo] %s %s %s' % (instId, ipaddr, hrn)) - f.write("%s %s %s\n" % (instId, ipaddr, hrn)) - f.close() - - def GetVersion(api, options): - - version_manager = VersionManager() - ad_rspec_versions = [] - request_rspec_versions = [] - for rspec_version in version_manager.versions: - if rspec_version.content_type in ['*', 'ad']: - ad_rspec_versions.append(rspec_version.to_dict()) - if rspec_version.content_type in ['*', 'request']: - request_rspec_versions.append(rspec_version.to_dict()) - xrn=Xrn(api.hrn) - version_more = {'interface':'aggregate', - 'sfa': 1, - 'geni_api': '2', - 'testbed':'myplc', - 'hrn':xrn.get_hrn(), - 'geni_request_rspec_versions': request_rspec_versions, - 'geni_ad_rspec_versions': ad_rspec_versions, - } - return version_core(version_more) diff --git a/xmlbuilder-0.9/LICENSE b/xmlbuilder-0.9/LICENSE deleted file mode 100644 index 0d0f57c4..00000000 --- a/xmlbuilder-0.9/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License - -Copyright (c) 2008 Konstantin Danilov aka koder - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/xmlbuilder-0.9/MANIFEST.in b/xmlbuilder-0.9/MANIFEST.in deleted file mode 100644 index 207725e9..00000000 --- a/xmlbuilder-0.9/MANIFEST.in +++ /dev/null @@ -1,2 +0,0 @@ -include xmlbuild/docs *.rst -include . LICENSE \ No newline at end of file diff --git a/xmlbuilder-0.9/PKG-INFO b/xmlbuilder-0.9/PKG-INFO deleted file mode 100644 index d931c15a..00000000 --- a/xmlbuilder-0.9/PKG-INFO +++ /dev/null @@ -1,80 +0,0 @@ -Metadata-Version: 1.0 -Name: xmlbuilder -Version: 0.9 -Summary: Pythonic way to create xml files -Home-page: http://pypi.python.org/pypi/xmlbuilder -Author: koder -Author-email: koder_dot_mail@gmail_dot_com -License: MIT -Download-URL: http://pypi.python.org/pypi/xmlbuilder -Description: Example of usage: - ----------------- - - - from __future__ import with_statement - from xmlbuilder import XMLBuilder - x = XMLBuilder(format=True) - with x.root(a = 1): - with x.data: - [x << ('node',{'val':i}) for i in range(10)] - - print str(x) - - will print - - <root a="1"> - <data> - <node val="0" /> - <node val="1" /> - <node val="2" /> - <node val="3" /> - <node val="4" /> - <node val="5" /> - <node val="6" /> - <node val="7" /> - <node val="8" /> - <node val="9" /> - </data> - </root> - - Mercurial repo:http://hg.assembla.com/MyPackages/ - - Documentations - -------------- - `XMLBuilder` is simple library build on top of `ElementTree.TreeBuilder` to - simplify xml files creation as much as possible. Althow it can produce - structured result with identated child tags. `XMLBuilder` use python `with` - statement to define xml tag levels and `<<` operator for simple cases - - text and tag without childs. - - First we need to create xmlbuilder - - from xmlbuilder import XMLBuilder - # params - encoding = 'utf8', - # builder = None, - ElementTree.TreeBuilder - # tab_level = None, - current tab l;evel - for formatted output only - # format = False, - create formatted output - # tab_step = " " * 4 - indentation step - xml = XMLBuilder() - - - Use `with` statement to make document structure - #create and open tag 'root_tag' with text 'text' and attributes - with xml.root_tag(text,attr1=val1,attr2=val2): - #create and open tag 'sub_tag' - with xml.sub_tag(text,attr3=val3): - #create tag which are not valid python identificator - with xml('one-more-sub-tag',attr7=val37): - xml << "Some textual data" - #here tag 'one-more-sub-tag' are closed - #Tags without children can be created using `<<` operator - for val in range(15): - xml << ('message',"python rocks!"[:i]) - #create 15 child tag like <message> python r</message> - #all tags closed - node = ~x # get etree.ElementTree object - xml_data = str(x) - unicode_xml_data = unicode(x) - -Keywords: xml -Platform: UNKNOWN diff --git a/xmlbuilder-0.9/README.txt b/xmlbuilder-0.9/README.txt deleted file mode 100644 index 7a7131fc..00000000 --- a/xmlbuilder-0.9/README.txt +++ /dev/null @@ -1 +0,0 @@ -Pythonic way to build xml files \ No newline at end of file diff --git a/xmlbuilder-0.9/setup.cfg b/xmlbuilder-0.9/setup.cfg deleted file mode 100644 index b14b0bc3..00000000 --- a/xmlbuilder-0.9/setup.cfg +++ /dev/null @@ -1,5 +0,0 @@ -[egg_info] -tag_build = -tag_date = 0 -tag_svn_revision = 0 - diff --git a/xmlbuilder-0.9/setup.py b/xmlbuilder-0.9/setup.py deleted file mode 100644 index bac4b123..00000000 --- a/xmlbuilder-0.9/setup.py +++ /dev/null @@ -1,43 +0,0 @@ -#!/usr/bin/env python -#------------------------------------------------------------------------------- -import os -import sys -import glob -import os.path -from setuptools import setup -#from distutils.core import setup -#------------------------------------------------------------------------------- -if 'upload' in sys.argv: - # for .pypirc file - try: - os.environ['HOME'] - except KeyError: - os.environ['HOME'] = '..\\' -#------------------------------------------------------------------------------- -fpath = lambda x : os.path.join(*x.split('/')) -#------------------------------------------------------------------------------- -PYPI_URL = 'http://pypi.python.org/pypi/xmlbuilder' -ld = open(fpath('xmlbuilder/docs/long_descr.rst')).read() -ld = ld.replace('&','&').replace('<','<').replace('>','>') -setup( - name = "xmlbuilder", - fullname = "xmlbuilder", - version = "0.9", - packages = ["xmlbuilder"], - package_dir = {'xmlbuilder':'xmlbuilder'}, - author = "koder", - author_email = "koder_dot_mail@gmail_dot_com", - maintainer = 'koder', - maintainer_email = "koder_dot_mail@gmail_dot_com", - description = "Pythonic way to create xml files", - license = "MIT", - keywords = "xml", - test_suite = "xml_buider.tests", - url = PYPI_URL, - download_url = PYPI_URL, - long_description = ld, - #include_package_data = True, - #package_data = {'xmlbuilder':["docs/*.rst"]}, - #data_files = [('', ['xmlbuilder/docs/long_descr.rst'])] -) -#------------------------------------------------------------------------------- diff --git a/xmlbuilder-0.9/xmlbuilder.egg-info/PKG-INFO b/xmlbuilder-0.9/xmlbuilder.egg-info/PKG-INFO deleted file mode 100644 index 569b8aba..00000000 --- a/xmlbuilder-0.9/xmlbuilder.egg-info/PKG-INFO +++ /dev/null @@ -1,80 +0,0 @@ -Metadata-Version: 1.1 -Name: xmlbuilder -Version: 0.9 -Summary: Pythonic way to create xml files -Home-page: http://pypi.python.org/pypi/xmlbuilder -Author: koder -Author-email: koder_dot_mail@gmail_dot_com -License: MIT -Download-URL: http://pypi.python.org/pypi/xmlbuilder -Description: Example of usage: - ----------------- - - - from __future__ import with_statement - from xmlbuilder import XMLBuilder - x = XMLBuilder(format=True) - with x.root(a = 1): - with x.data: - [x << ('node',{'val':i}) for i in range(10)] - - print str(x) - - will print - - <root a="1"> - <data> - <node val="0" /> - <node val="1" /> - <node val="2" /> - <node val="3" /> - <node val="4" /> - <node val="5" /> - <node val="6" /> - <node val="7" /> - <node val="8" /> - <node val="9" /> - </data> - </root> - - Mercurial repo:http://hg.assembla.com/MyPackages/ - - Documentations - -------------- - `XMLBuilder` is simple library build on top of `ElementTree.TreeBuilder` to - simplify xml files creation as much as possible. Althow it can produce - structured result with identated child tags. `XMLBuilder` use python `with` - statement to define xml tag levels and `<<` operator for simple cases - - text and tag without childs. - - First we need to create xmlbuilder - - from xmlbuilder import XMLBuilder - # params - encoding = 'utf8', - # builder = None, - ElementTree.TreeBuilder - # tab_level = None, - current tab l;evel - for formatted output only - # format = False, - create formatted output - # tab_step = " " * 4 - indentation step - xml = XMLBuilder() - - - Use `with` statement to make document structure - #create and open tag 'root_tag' with text 'text' and attributes - with xml.root_tag(text,attr1=val1,attr2=val2): - #create and open tag 'sub_tag' - with xml.sub_tag(text,attr3=val3): - #create tag which are not valid python identificator - with xml('one-more-sub-tag',attr7=val37): - xml << "Some textual data" - #here tag 'one-more-sub-tag' are closed - #Tags without children can be created using `<<` operator - for val in range(15): - xml << ('message',"python rocks!"[:i]) - #create 15 child tag like <message> python r</message> - #all tags closed - node = ~x # get etree.ElementTree object - xml_data = str(x) - unicode_xml_data = unicode(x) - -Keywords: xml -Platform: UNKNOWN diff --git a/xmlbuilder-0.9/xmlbuilder.egg-info/SOURCES.txt b/xmlbuilder-0.9/xmlbuilder.egg-info/SOURCES.txt deleted file mode 100644 index 4cc27de9..00000000 --- a/xmlbuilder-0.9/xmlbuilder.egg-info/SOURCES.txt +++ /dev/null @@ -1,13 +0,0 @@ -LICENSE -MANIFEST.in -PKG-INFO -README.txt -setup.cfg -setup.py -xmlbuilder/__init__.py -xmlbuilder.egg-info/PKG-INFO -xmlbuilder.egg-info/SOURCES.txt -xmlbuilder.egg-info/dependency_links.txt -xmlbuilder.egg-info/top_level.txt -xmlbuilder/docs/long_descr.rst -xmlbuilder/tests/__init__.py \ No newline at end of file diff --git a/xmlbuilder-0.9/xmlbuilder.egg-info/dependency_links.txt b/xmlbuilder-0.9/xmlbuilder.egg-info/dependency_links.txt deleted file mode 100644 index 8b137891..00000000 --- a/xmlbuilder-0.9/xmlbuilder.egg-info/dependency_links.txt +++ /dev/null @@ -1 +0,0 @@ - diff --git a/xmlbuilder-0.9/xmlbuilder.egg-info/top_level.txt b/xmlbuilder-0.9/xmlbuilder.egg-info/top_level.txt deleted file mode 100644 index 9f1d4861..00000000 --- a/xmlbuilder-0.9/xmlbuilder.egg-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -xmlbuilder diff --git a/xmlbuilder-0.9/xmlbuilder/__init__.py b/xmlbuilder-0.9/xmlbuilder/__init__.py deleted file mode 100644 index 24ce7a54..00000000 --- a/xmlbuilder-0.9/xmlbuilder/__init__.py +++ /dev/null @@ -1,153 +0,0 @@ -#!/usr/bin/env python -#------------------------------------------------------------------------------- -from __future__ import with_statement -#------------------------------------------------------------------------------- -from xml.etree.ElementTree import TreeBuilder,tostring -#------------------------------------------------------------------------------- -__all__ = ["XMLBuilder"] -__doc__ = """ -XMLBuilder is simple library build on top of ElementTree.TreeBuilder to -simplify xml files creation as much as possible. Althow it can produce -structured result with identated child tags. `XMLBuilder` use python `with` -statement to define xml tag levels and `<<` operator for simple cases - -text and tag without childs. - -from __future__ import with_statement -from xmlbuilder import XMLBuilder -x = XMLBuilder(format=True) -with x.root(a = 1): - with x.data: - [x << ('node',{'val':i}) for i in range(10)] - -etree_node = ~x -print str(x) -""" -#------------------------------------------------------------------------------- -class _XMLNode(object): - """Class for internal usage""" - def __init__(self,parent,name,builder): - self.builder = builder - self.name = name - self.text = [] - self.attrs = {} - self.entered = False - self.parent = parent - def __call__(self,*dt,**mp): - text = "".join(dt) - if self.entered: - self.builder.data(text) - else: - self.text.append(text) - if self.entered: - raise ValueError("Can't add attributes to already opened element") - smp = dict((k,str(v)) for k,v in mp.items()) - self.attrs.update(smp) - return self - def __enter__(self): - self.parent += 1 - self.builder.start(self.name,self.attrs) - self.builder.data("".join(self.text)) - self.entered = True - return self - def __exit__(self,x,y,z): - self.parent -= 1 - self.builder.end(self.name) - return False -#------------------------------------------------------------------------------- -class XMLBuilder(object): - """XmlBuilder(encoding = 'utf-8', # result xml file encoding - builder = None, #etree.TreeBuilder or compatible class - tab_level = None, #current tabulation level - string - format = False, # make formatted output - tab_step = " " * 4) # tabulation step - use str(builder) or unicode(builder) to get xml text or - ~builder to obtaine etree.ElementTree - """ - def __init__(self,encoding = 'utf-8', - builder = None, - tab_level = None, - format = False, - tab_step = " " * 4): - self.__builder = builder or TreeBuilder() - self.__encoding = encoding - if format : - if tab_level is None: - tab_level = "" - if tab_level is not None: - if not format: - raise ValueError("format is False, but tab_level not None") - self.__tab_level = tab_level # current format level - self.__tab_step = tab_step # format step - self.__has_sub_tag = False # True, if current tag had childrens - self.__node = None - # called from _XMLNode when tag opened - def __iadd__(self,val): - self.__has_sub_tag = False - if self.__tab_level is not None: - self.__builder.data("\n" + self.__tab_level) - self.__tab_level += self.__tab_step - return self - # called from XMLNode when tag closed - def __isub__(self,val): - if self.__tab_level is not None: - self.__tab_level = self.__tab_level[:-len(self.__tab_step)] - if self.__has_sub_tag: - self.__builder.data("\n" + self.__tab_level) - self.__has_sub_tag = True - return self - def __getattr__(self,name): - return _XMLNode(self,name,self.__builder) - def __call__(self,name,*dt,**mp): - x = _XMLNode(self,name,self.__builder) - x(*dt,**mp) - return x - #create new tag or add text - #possible shift values - #string - text - #tuple(string1,string2,dict) - new tag with name string1,attrs = dict,and text string2 - #dict and string2 are optional - def __lshift__(self,val): - if isinstance(val,basestring): - self.__builder.data(val) - else: - self.__has_sub_tag = True - assert hasattr(val,'__len__'),\ - 'Shifted value should be tuple or list like object not %r' % val - assert hasattr(val,'__getitem__'),\ - 'Shifted value should be tuple or list like object not %r' % val - name = val[0] - if len(val) == 3: - text = val[1] - attrs = val[2] - elif len(val) == 1: - text = "" - attrs = {} - elif len(val) == 2: - if isinstance(val[1],basestring): - text = val[1] - attrs = {} - else: - text = "" - attrs = val[1] - if self.__tab_level is not None: - self.__builder.data("\n" + self.__tab_level) - self.__builder.start(name, - dict((k,str(v)) for k,v in attrs.items())) - if text: - self.__builder.data(text) - self.__builder.end(name) - return self # to allow xml << some1 << some2 << some3 - #close builder - def __invert__(self): - if self.__node is not None: - return self.__node - self.__node = self.__builder.close() - return self.__node - def __str__(self): - """return generated xml""" - return tostring(~self,self.__encoding) - def __unicode__(self): - """return generated xml""" - res = tostring(~self,self.__encoding) - return res.decode(self.__encoding) -#------------------------------------------------------------------------------- diff --git a/xmlbuilder-0.9/xmlbuilder/docs/long_descr.rst b/xmlbuilder-0.9/xmlbuilder/docs/long_descr.rst deleted file mode 100644 index 4e82bc85..00000000 --- a/xmlbuilder-0.9/xmlbuilder/docs/long_descr.rst +++ /dev/null @@ -1,68 +0,0 @@ -Example of usage: ------------------ - - -from __future__ import with_statement -from xmlbuilder import XMLBuilder -x = XMLBuilder(format=True) -with x.root(a = 1): - with x.data: - [x << ('node',{'val':i}) for i in range(10)] - -print str(x) - -will print - - - - - - - - - - - - - - - - -Mercurial repo:http://hg.assembla.com/MyPackages/ - -Documentations --------------- -`XMLBuilder` is simple library build on top of `ElementTree.TreeBuilder` to -simplify xml files creation as much as possible. Althow it can produce -structured result with identated child tags. `XMLBuilder` use python `with` -statement to define xml tag levels and `<<` operator for simple cases - -text and tag without childs. - -First we need to create xmlbuilder - - from xmlbuilder import XMLBuilder - # params - encoding = 'utf8', - # builder = None, - ElementTree.TreeBuilder - # tab_level = None, - current tab l;evel - for formatted output only - # format = False, - create formatted output - # tab_step = " " * 4 - indentation step - xml = XMLBuilder() - - -Use `with` statement to make document structure - #create and open tag 'root_tag' with text 'text' and attributes - with xml.root_tag(text,attr1=val1,attr2=val2): - #create and open tag 'sub_tag' - with xml.sub_tag(text,attr3=val3): - #create tag which are not valid python identificator - with xml('one-more-sub-tag',attr7=val37): - xml << "Some textual data" - #here tag 'one-more-sub-tag' are closed - #Tags without children can be created using `<<` operator - for val in range(15): - xml << ('message',"python rocks!"[:i]) - #create 15 child tag like python r - #all tags closed - node = ~x # get etree.ElementTree object - xml_data = str(x) - unicode_xml_data = unicode(x) diff --git a/xmlbuilder-0.9/xmlbuilder/tests/__init__.py b/xmlbuilder-0.9/xmlbuilder/tests/__init__.py deleted file mode 100644 index 43a67b12..00000000 --- a/xmlbuilder-0.9/xmlbuilder/tests/__init__.py +++ /dev/null @@ -1,99 +0,0 @@ -#!/usr/bin/env python -from __future__ import with_statement -#------------------------------------------------------------------------------- -import unittest -from xml.etree.ElementTree import fromstring -#------------------------------------------------------------------------------- -from xmlbuilder import XMLBuilder -#------------------------------------------------------------------------------- -def xmlStructureEqual(xml1,xml2): - tree1 = fromstring(xml1) - tree2 = fromstring(xml2) - return _xmlStructureEqual(tree1,tree2) -#------------------------------------------------------------------------------- -def _xmlStructureEqual(tree1,tree2): - if tree1.tag != tree2.tag: - return False - attr1 = list(tree1.attrib.items()) - attr1.sort() - attr2 = list(tree2.attrib.items()) - attr2.sort() - if attr1 != attr2: - return False - return tree1.getchildren() == tree2.getchildren() -#------------------------------------------------------------------------------- -result1 = \ -""" - - - - - xyz - abc - - - - test - - -""".strip() -#------------------------------------------------------------------------------- -class TestXMLBuilder(unittest.TestCase): - def testShift(self): - xml = (XMLBuilder() << ('root',)) - self.assertEqual(str(xml),"") - - xml = XMLBuilder() - xml << ('root',"some text") - self.assertEqual(str(xml),"some text") - - xml = XMLBuilder() - xml << ('root',{'x':1,'y':'2'}) - self.assert_(xmlStructureEqual(str(xml),"some text")) - - xml = XMLBuilder() - xml << ('root',{'x':1,'y':'2'}) - self.assert_(xmlStructureEqual(str(xml),"")) - - xml = XMLBuilder() - xml << ('root',{'x':1,'y':'2'}) - self.assert_(not xmlStructureEqual(str(xml),"")) - - - xml = XMLBuilder() - xml << ('root',"gonduras.ua",{'x':1,'y':'2'}) - self.assert_(xmlStructureEqual(str(xml),"gonduras.ua")) - - xml = XMLBuilder() - xml << ('root',"gonduras.ua",{'x':1,'y':'2'}) - self.assert_(xmlStructureEqual(str(xml),"gonduras.com")) - #--------------------------------------------------------------------------- - def testWith(self): - xml = XMLBuilder() - with xml.root(lenght = 12): - pass - self.assertEqual(str(xml),'') - - xml = XMLBuilder() - with xml.root(): - xml << "text1" << "text2" << ('some_node',) - self.assertEqual(str(xml),"text1text2") - #--------------------------------------------------------------------------- - def testFormat(self): - x = XMLBuilder('utf-8',format = True) - with x.root(): - x << ('array',) - with x.array(len = 10): - with x.el(val = 0): - pass - with x.el('xyz',val = 1): - pass - x << ("el","abc",{'val':2}) << ('el',dict(val=3)) - x << ('el',dict(val=4)) << ('el',dict(val='5')) - with x('sup-el',val = 23): - x << "test " - self.assertEqual(str(x),result1) -#------------------------------------------------------------------------------- -if __name__ == '__main__': - unittest.main() -#------------------------------------------------------------------------------- -- 2.43.0