From 1a9718ae903eef6c6485c851a81c2f794e971ea2 Mon Sep 17 00:00:00 2001 From: Thierry Parmentelat Date: Mon, 28 May 2018 08:40:14 +0200 Subject: [PATCH] the big cleanup: remove unused relating to nitos --- config/default_config.xml | 14 - config/sfa-config-tty | 1 - setup.py | 1 - sfa.spec | 11 - sfa/client/client_helper.py | 4 +- sfa/generic/nitos.py | 41 - sfa/importer/nitosimporter.py | 363 --------- sfa/managers/v2_to_v3_adapter.py | 201 ----- sfa/nitos/__init__.py | 0 sfa/nitos/nitosaggregate.py | 302 ------- sfa/nitos/nitosdriver.py | 766 ------------------ sfa/nitos/nitosshell.py | 46 -- sfa/nitos/nitosslices.py | 278 ------- sfa/nitos/nitosxrn.py | 139 ---- .../elements/versions/nitosv1Channel.py | 77 -- sfa/rspecs/elements/versions/nitosv1Lease.py | 113 --- sfa/rspecs/elements/versions/nitosv1Node.py | 200 ----- sfa/rspecs/elements/versions/nitosv1PLTag.py | 22 - sfa/rspecs/elements/versions/nitosv1Sliver.py | 61 -- sfa/rspecs/versions/nitosv1.py | 244 ------ 20 files changed, 1 insertion(+), 2883 deletions(-) delete mode 100644 sfa/generic/nitos.py delete mode 100644 sfa/importer/nitosimporter.py delete mode 100644 sfa/managers/v2_to_v3_adapter.py delete mode 100644 sfa/nitos/__init__.py delete mode 100644 sfa/nitos/nitosaggregate.py delete mode 100644 sfa/nitos/nitosdriver.py delete mode 100644 sfa/nitos/nitosshell.py delete mode 100644 sfa/nitos/nitosslices.py delete mode 100644 sfa/nitos/nitosxrn.py delete mode 100644 sfa/rspecs/elements/versions/nitosv1Channel.py delete mode 100644 sfa/rspecs/elements/versions/nitosv1Lease.py delete mode 100644 sfa/rspecs/elements/versions/nitosv1Node.py delete mode 100644 sfa/rspecs/elements/versions/nitosv1PLTag.py delete mode 100644 sfa/rspecs/elements/versions/nitosv1Sliver.py delete mode 100644 sfa/rspecs/versions/nitosv1.py diff --git a/config/default_config.xml b/config/default_config.xml index 33f89016..0c7c526c 100644 --- a/config/default_config.xml +++ b/config/default_config.xml @@ -258,20 +258,6 @@ Thierry Parmentelat - - - - The settings that tell this SFA instance how to interact with the NITOS testbed. - - - - XMLRPC URL - http://195.251.17.239:8080/RPC2 - URL for the NITOS Scheduler xmlrpc API - - - - diff --git a/config/sfa-config-tty b/config/sfa-config-tty index e28d60b5..ce25b567 100755 --- a/config/sfa-config-tty +++ b/config/sfa-config-tty @@ -34,7 +34,6 @@ usual_variables = [ flavour_xml_section_hash = { 'pl': 'sfa_plc', - 'nitos': 'sfa_nitos', 'dummy': 'sfa_dummy', } configuration = { diff --git a/setup.py b/setup.py index 3c34a17d..3c132579 100755 --- a/setup.py +++ b/setup.py @@ -53,7 +53,6 @@ packages = [ 'sfa/rspecs/versions', 'sfa/client', 'sfa/planetlab', - 'sfa/nitos', 'sfa/dummy', 'sfa/iotlab', 'sfatables', diff --git a/sfa.spec b/sfa.spec index 23cea716..5c8b72ab 100644 --- a/sfa.spec +++ b/sfa.spec @@ -62,11 +62,6 @@ Summary: the SFA layer around MyPLC Group: Applications/System Requires: sfa -%package nitos -Summary: the SFA layer around NITOS -Group: Applications/System -Requires: sfa - %package iotlab Summary: the SFA layer around IotLab Group: Applications/System @@ -103,9 +98,6 @@ sfi.py, together with other utilities. This package implements the SFA interface which serves as a layer between the existing PlanetLab interfaces and the SFA API. -%description nitos -The SFA driver for NITOS. - %description iotlab The SFA driver for IotLab. @@ -185,9 +177,6 @@ rm -rf $RPM_BUILD_ROOT /etc/sfa/protogeni-rspec-common.xsd /etc/sfa/topology -%files nitos -%{python_sitelib}/sfa/nitos - %files iotlab %{python_sitelib}/sfa/iotlab diff --git a/sfa/client/client_helper.py b/sfa/client/client_helper.py index fd15c0fe..82b5f199 100644 --- a/sfa/client/client_helper.py +++ b/sfa/client/client_helper.py @@ -41,10 +41,8 @@ def sfa_users_arg(records, slice_record): # note that reg-email is not yet available pl_fields = ['email', 'person_id', 'first_name', 'last_name', 'key_ids'] - nitos_fields = ['email', 'user_id'] - extra_fields = list(set(pl_fields).union(set(nitos_fields))) # try to fill all these in - for field in extra_fields: + for field in pl_fields: if field in record: user[field] = record[field] users.append(user) diff --git a/sfa/generic/nitos.py b/sfa/generic/nitos.py deleted file mode 100644 index 3d8f394f..00000000 --- a/sfa/generic/nitos.py +++ /dev/null @@ -1,41 +0,0 @@ -from sfa.generic import Generic - - -class nitos (Generic): - - # the importer class - def importer_class(self): - import sfa.importer.nitosimporter - return sfa.importer.nitosimporter.NitosImporter - - # use the standard api class - def api_class(self): - import sfa.server.sfaapi - return sfa.server.sfaapi.SfaApi - - # the manager classes for the server-side services - def registry_manager_class(self): - import sfa.managers.registry_manager - return sfa.managers.registry_manager.RegistryManager - - def slicemgr_manager_class(self): - import sfa.managers.slice_manager - return sfa.managers.slice_manager.SliceManager - - def aggregate_manager_class(self): - import sfa.managers.aggregate_manager - return sfa.managers.aggregate_manager.AggregateManager - - # driver class for server-side services, talk to the whole testbed - def driver_class(self): - import sfa.managers.v2_to_v3_adapter - return sfa.managers.v2_to_v3_adapter.V2ToV3Adapter - - # for the component mode, to be run on board planetlab nodes - # manager class - def component_manager_class(self): - return None - # driver_class - - def component_driver_class(self): - return None diff --git a/sfa/importer/nitosimporter.py b/sfa/importer/nitosimporter.py deleted file mode 100644 index aa7a9781..00000000 --- a/sfa/importer/nitosimporter.py +++ /dev/null @@ -1,363 +0,0 @@ - -import os - -from sfa.util.config import Config -from sfa.util.xrn import Xrn, get_leaf, get_authority, hrn_to_urn - -from sfa.trust.gid import create_uuid -from sfa.trust.certificate import convert_public_key, Keypair - -# using global alchemy.session() here is fine -# as importer is on standalone one-shot process -from sfa.storage.alchemy import global_dbsession -from sfa.storage.model import RegRecord, RegAuthority, RegSlice, RegNode, RegUser, RegKey - -from sfa.nitos.nitosshell import NitosShell -from sfa.nitos.nitosxrn import hostname_to_hrn, slicename_to_hrn, email_to_hrn, hrn_to_nitos_slicename, username_to_hrn - - -def _get_site_hrn(interface_hrn, site): - hrn = ".".join([interface_hrn, site['name']]) - return hrn - - -class NitosImporter: - - def __init__(self, auth_hierarchy, logger): - self.auth_hierarchy = auth_hierarchy - self.logger = logger - - def add_options(self, parser): - # we don't have any options for now - pass - - # hrn hash is initialized from current db - # remember just-created records as we go - # xxx might make sense to add a UNIQUE constraint in the db itself - def remember_record_by_hrn(self, record): - tuple = (record.type, record.hrn) - if tuple in self.records_by_type_hrn: - self.logger.warning( - "NitosImporter.remember_record_by_hrn: duplicate (%s,%s)" % tuple) - return - self.records_by_type_hrn[tuple] = record - - # ditto for pointer hash - def remember_record_by_pointer(self, record): - if record.pointer == -1: - self.logger.warning( - "NitosImporter.remember_record_by_pointer: pointer is void") - return - tuple = (record.type, record.pointer) - if tuple in self.records_by_type_pointer: - self.logger.warning( - "NitosImporter.remember_record_by_pointer: duplicate (%s,%s)" % tuple) - return - self.records_by_type_pointer[(record.type, record.pointer,)] = record - - def remember_record(self, record): - self.remember_record_by_hrn(record) - self.remember_record_by_pointer(record) - - def locate_by_type_hrn(self, type, hrn): - return self.records_by_type_hrn.get((type, hrn), None) - - def locate_by_type_pointer(self, type, pointer): - return self.records_by_type_pointer.get((type, pointer), None) - - # a convenience/helper function to see if a record is already known - # a former, broken, attempt (in 2.1-9) had been made - # to try and use 'pointer' as a first, most significant attempt - # the idea being to preserve stuff as much as possible, and thus - # to avoid creating a new gid in the case of a simple hrn rename - # however this of course doesn't work as the gid depends on the hrn... - # def locate (self, type, hrn=None, pointer=-1): - # if pointer!=-1: - # attempt = self.locate_by_type_pointer (type, pointer) - # if attempt : return attempt - # if hrn is not None: - # attempt = self.locate_by_type_hrn (type, hrn,) - # if attempt : return attempt - # return None - - # this makes the run method a bit abtruse - out of the way - - def run(self, options): - config = Config() - interface_hrn = config.SFA_INTERFACE_HRN - root_auth = config.SFA_REGISTRY_ROOT_AUTH - shell = NitosShell(config) - - # retrieve all existing SFA objects - all_records = global_dbsession.query(RegRecord).all() - - # create hash by (type,hrn) - # we essentially use this to know if a given record is already known to - # SFA - self.records_by_type_hrn = \ - dict([((record.type, record.hrn), record) - for record in all_records]) - # create hash by (type,pointer) - self.records_by_type_pointer = \ - dict([((record.type, record.pointer), record) for record in all_records - if record.pointer != -1]) - - # initialize record.stale to True by default, then mark stale=False on - # the ones that are in use - for record in all_records: - record.stale = True - - # retrieve NITOS data - # Get site info - # retrieve only required stuf - site = shell.getTestbedInfo() - sites = [site] - # create a hash of sites by login_base -# # sites_by_login_base = dict ( [ ( site['login_base'], site ) for site in sites ] ) - # Get all NITOS users - users = shell.getUsers() - # create a hash of users by user_id - users_by_id = dict([(user['user_id'], user) for user in users]) - # Get all NITOS public keys - # accumulate key ids for keys retrieval -# key_ids = [] -# for person in persons: -# key_ids.extend(person['key_ids']) -# keys = shell.GetKeys( {'peer_id': None, 'key_id': key_ids, -# 'key_type': 'ssh'} ) -# # create a hash of keys by key_id -# keys_by_id = dict ( [ ( key['key_id'], key ) for key in keys ] ) - # create a dict user_id -> [ (nitos)keys ] - keys_by_user_id = dict( - [(user['user_id'], user['keys']) for user in users]) - # Get all nitos nodes - nodes = shell.getNodes({}, []) - # create hash by node_id - nodes_by_id = dict([(node['node_id'], node) for node in nodes]) - # Get all nitos slices - slices = shell.getSlices({}, []) - # create hash by slice_id - slices_by_id = dict([(slice['slice_id'], slice) for slice in slices]) - - # start importing - for site in sites: - # for i in [0]: - site_hrn = _get_site_hrn(interface_hrn, site) - # import if hrn is not in list of existing hrns or if the hrn exists - # but its not a site record - site_record = self.locate_by_type_hrn('authority', site_hrn) - if not site_record: - try: - urn = hrn_to_urn(site_hrn, 'authority') - if not self.auth_hierarchy.auth_exists(urn): - self.auth_hierarchy.create_auth(urn) - auth_info = self.auth_hierarchy.get_auth_info(urn) - site_record = RegAuthority(hrn=site_hrn, gid=auth_info.get_gid_object(), - pointer=0, - authority=get_authority(site_hrn)) - site_record.just_created() - global_dbsession.add(site_record) - global_dbsession.commit() - self.logger.info( - "NitosImporter: imported authority (site) : %s" % site_record) - self.remember_record(site_record) - except: - # if the site import fails then there is no point in trying to import the - # site's child records (node, slices, persons), so skip - # them. - self.logger.log_exc( - "NitosImporter: failed to import site. Skipping child records") - continue - else: - # xxx update the record ... - pass - site_record.stale = False - - # import node records - for node in nodes: - site_auth = get_authority(site_hrn) - site_name = site['name'] - node_hrn = hostname_to_hrn( - site_auth, site_name, node['hostname']) - # xxx this sounds suspicious - if len(node_hrn) > 64: - node_hrn = node_hrn[:64] - node_record = self.locate_by_type_hrn('node', node_hrn) - if not node_record: - try: - pkey = Keypair(create=True) - urn = hrn_to_urn(node_hrn, 'node') - node_gid = self.auth_hierarchy.create_gid( - urn, create_uuid(), pkey) - node_record = RegNode(hrn=node_hrn, gid=node_gid, - pointer=node['node_id'], - authority=get_authority(node_hrn)) - node_record.just_created() - global_dbsession.add(node_record) - global_dbsession.commit() - self.logger.info( - "NitosImporter: imported node: %s" % node_record) - self.remember_record(node_record) - except: - self.logger.log_exc( - "NitosImporter: failed to import node") - else: - # xxx update the record ... - pass - - node_record.stale = False - - # import users - for user in users: - user_hrn = username_to_hrn( - interface_hrn, site['name'], user['username']) - # xxx suspicious again - if len(user_hrn) > 64: - user_hrn = user_hrn[:64] - user_urn = hrn_to_urn(user_hrn, 'user') - - user_record = self.locate_by_type_hrn('user', user_hrn) - - # return a tuple pubkey (a nitos key object) and pkey (a - # Keypair object) - def init_user_key(user): - pubkey = None - pkey = None - if user['keys']: - # randomly pick first key in set - for key in user['keys']: - pubkey = key - try: - pkey = convert_public_key(pubkey) - break - except: - continue - if not pkey: - self.logger.warning( - 'NitosImporter: unable to convert public key for %s' % user_hrn) - pkey = Keypair(create=True) - else: - # the user has no keys. Creating a random keypair for - # the user's gid - self.logger.warning( - "NitosImporter: user %s does not have a NITOS public key" % user_hrn) - pkey = Keypair(create=True) - return (pubkey, pkey) - - # new user - try: - if not user_record: - (pubkey, pkey) = init_user_key(user) - user_gid = self.auth_hierarchy.create_gid( - user_urn, create_uuid(), pkey) - user_gid.set_email(user['email']) - user_record = RegUser(hrn=user_hrn, gid=user_gid, - pointer=user['user_id'], - authority=get_authority( - user_hrn), - email=user['email']) - if pubkey: - user_record.reg_keys = [RegKey(pubkey)] - else: - self.logger.warning( - "No key found for user %s" % user_record) - user_record.just_created() - global_dbsession.add(user_record) - global_dbsession.commit() - self.logger.info( - "NitosImporter: imported user: %s" % user_record) - self.remember_record(user_record) - else: - # update the record ? - # if user's primary key has changed then we need to update the - # users gid by forcing an update here - sfa_keys = user_record.reg_keys - - def sfa_key_in_list(sfa_key, nitos_user_keys): - for nitos_key in nitos_user_keys: - if nitos_key == sfa_key: - return True - return False - # are all the SFA keys known to nitos ? - new_keys = False - if not sfa_keys and user['keys']: - new_keys = True - else: - for sfa_key in sfa_keys: - if not sfa_key_in_list(sfa_key.key, user['keys']): - new_keys = True - - if new_keys: - (pubkey, pkey) = init_user_key(user) - user_gid = self.auth_hierarchy.create_gid( - user_urn, create_uuid(), pkey) - if not pubkey: - user_record.reg_keys = [] - else: - user_record.reg_keys = [RegKey(pubkey)] - user_record.gid = user_gid - user_record.just_updated() - self.logger.info( - "NitosImporter: updated user: %s" % user_record) - user_record.email = user['email'] - global_dbsession.commit() - user_record.stale = False - except: - self.logger.log_exc("NitosImporter: failed to import user %s %s" % ( - user['user_id'], user['email'])) - - # import slices - for slice in slices: - slice_hrn = slicename_to_hrn( - interface_hrn, site['name'], slice['slice_name']) - slice_record = self.locate_by_type_hrn('slice', slice_hrn) - if not slice_record: - try: - pkey = Keypair(create=True) - urn = hrn_to_urn(slice_hrn, 'slice') - slice_gid = self.auth_hierarchy.create_gid( - urn, create_uuid(), pkey) - slice_record = RegSlice(hrn=slice_hrn, gid=slice_gid, - pointer=slice['slice_id'], - authority=get_authority(slice_hrn)) - slice_record.just_created() - global_dbsession.add(slice_record) - global_dbsession.commit() - self.logger.info( - "NitosImporter: imported slice: %s" % slice_record) - self.remember_record(slice_record) - except: - self.logger.log_exc( - "NitosImporter: failed to import slice") - else: - # xxx update the record ... - self.logger.warning("Slice update not yet implemented") - pass - # record current users affiliated with the slice - slice_record.reg_researchers = \ - [self.locate_by_type_pointer('user', int( - user_id)) for user_id in slice['user_ids']] - global_dbsession.commit() - slice_record.stale = False - - # remove stale records - # special records must be preserved - system_hrns = [interface_hrn, root_auth, - interface_hrn + '.slicemanager'] - for record in all_records: - if record.hrn in system_hrns: - record.stale = False - if record.peer_authority: - record.stale = False - - for record in all_records: - try: - stale = record.stale - except: - stale = True - self.logger.warning("stale not found with %s" % record) - if stale: - self.logger.info( - "NitosImporter: deleting stale record: %s" % record) - global_dbsession.delete(record) - global_dbsession.commit() diff --git a/sfa/managers/v2_to_v3_adapter.py b/sfa/managers/v2_to_v3_adapter.py deleted file mode 100644 index e37c2c82..00000000 --- a/sfa/managers/v2_to_v3_adapter.py +++ /dev/null @@ -1,201 +0,0 @@ -# -# an adapter on top of driver implementing AM API v2 to be AM API v3 compliant -# -import sys -from sfa.util.sfalogging import logger -from sfa.util.xrn import Xrn, urn_to_hrn, hrn_to_urn, get_leaf, get_authority -from sfa.util.cache import Cache -from sfa.rspecs.rspec import RSpec -from sfa.storage.model import SliverAllocation - - -class V2ToV3Adapter: - - def __init__(self, api): - config = api.config - flavour = config.SFA_GENERIC_FLAVOUR - # to be cleaned - if flavour == "nitos": - from sfa.nitos.nitosdriver import NitosDriver - self.driver = NitosDriver(api) - else: - logger.error( - "V2ToV3Adapter: Unknown Flavour !!!\n Supported Flavours: nitos") - - # Caching - if config.SFA_AGGREGATE_CACHING: - if self.driver.cache: - self.cache = self.driver.cache - else: - self.cache = Cache() - - def __getattr__(self, name): - def func(*args, **kwds): - if name == "list_resources": - (version, options) = args - slice_urn = slice_hrn = None - creds = [] - rspec = getattr(self.driver, "list_resources")( - slice_urn, slice_hrn, [], options) - result = rspec - - elif name == "describe": - (urns, version, options) = args - slice_urn = urns[0] - slice_hrn, type = urn_to_hrn(slice_urn) - creds = [] - rspec = getattr(self.driver, "list_resources")( - slice_urn, slice_hrn, creds, options) - - # SliverAllocation - if len(urns) == 1 and Xrn(xrn=urns[0]).type == 'slice': - constraint = SliverAllocation.slice_urn.in_(urns) - else: - constraint = SliverAllocation.sliver_id.in_(urns) - - sliver_allocations = self.driver.api.dbsession().query( - SliverAllocation).filter(constraint) - sliver_status = getattr(self.driver, "sliver_status")( - slice_urn, slice_hrn) - if 'geni_expires' in sliver_status.keys(): - geni_expires = sliver_status['geni_expires'] - else: - geni_expires = '' - - geni_slivers = [] - for sliver_allocation in sliver_allocations: - geni_sliver = {} - geni_sliver['geni_expires'] = geni_expires - geni_sliver[ - 'geni_allocation'] = sliver_allocation.allocation_state - geni_sliver[ - 'geni_sliver_urn'] = sliver_allocation.sliver_id - geni_sliver['geni_error'] = '' - if geni_sliver['geni_allocation'] == 'geni_allocated': - geni_sliver[ - 'geni_operational_status'] = 'geni_pending_allocation' - else: - geni_sliver['geni_operational_status'] = 'geni_ready' - geni_slivers.append(geni_sliver) - - result = {'geni_urn': slice_urn, - 'geni_rspec': rspec, - 'geni_slivers': geni_slivers} - - elif name == "allocate": - (slice_urn, rspec_string, expiration, options) = args - slice_hrn, type = urn_to_hrn(slice_urn) - creds = [] - users = options.get('sfa_users', []) - manifest_string = getattr(self.driver, "create_sliver")( - slice_urn, slice_hrn, creds, rspec_string, users, options) - - # slivers allocation - rspec = RSpec(manifest_string) - slivers = rspec.version.get_nodes_with_slivers() - - # SliverAllocation - for sliver in slivers: - client_id = sliver['client_id'] - component_id = sliver['component_id'] - component_name = sliver['component_name'] - slice_name = slice_hrn.replace('.', '-') - component_short_name = component_name.split('.')[0] - # self.driver.hrn - sliver_hrn = '%s.%s-%s' % (self.driver.hrn, - slice_name, component_short_name) - sliver_id = Xrn(sliver_hrn, type='sliver').urn - record = SliverAllocation(sliver_id=sliver_id, - client_id=client_id, - component_id=component_id, - slice_urn=slice_urn, - allocation_state='geni_allocated') - - record.sync(self.driver.api.dbsession()) - - # return manifest - rspec_version = RSpec(rspec_string).version - rspec_version_str = "%s" % rspec_version - options['geni_rspec_version'] = {'version': rspec_version_str.split( - ' ')[1], 'type': rspec_version_str.lower().split(' ')[0]} - result = self.describe([slice_urn], rspec_version, options) - - elif name == "provision": - (urns, options) = args - if len(urns) == 1 and Xrn(xrn=urns[0]).type == 'slice': - constraint = SliverAllocation.slice_urn.in_(urns) - else: - constraint = SliverAllocation.sliver_id.in_(urns) - - dbsession = self.driver.api.dbsession() - sliver_allocations = dbsession.query( - SliverAllocation).filter(constraint) - for sliver_allocation in sliver_allocations: - sliver_allocation.allocation_state = 'geni_provisioned' - - dbsession.commit() - result = self.describe(urns, '', options) - - elif name == "status": - urns = args - options = {} - options['geni_rspec_version'] = { - 'version': '3', 'type': 'GENI'} - descr = self.describe(urns[0], '', options) - result = {'geni_urn': descr['geni_urn'], - 'geni_slivers': descr['geni_slivers']} - - elif name == "delete": - (urns, options) = args - slice_urn = urns[0] - slice_hrn, type = urn_to_hrn(slice_urn) - creds = [] - options['geni_rspec_version'] = { - 'version': '3', 'type': 'GENI'} - descr = self.describe(urns, '', options) - result = [] - for sliver_allocation in descr['geni_slivers']: - geni_sliver = {'geni_sliver_urn': sliver_allocation['geni_sliver_urn'], - 'geni_allocation_status': 'geni_unallocated', - 'geni_expires': sliver_allocation['geni_expires'], - 'geni_error': sliver_allocation['geni_error']} - - result.append(geni_sliver) - - getattr(self.driver, "delete_sliver")( - slice_urn, slice_hrn, creds, options) - - # SliverAllocation - constraints = SliverAllocation.slice_urn.in_(urns) - dbsession = self.driver.api.dbsession() - sliver_allocations = dbsession.query( - SliverAllocation).filter(constraints) - sliver_ids = [ - sliver_allocation.sliver_id for sliver_allocation in sliver_allocations] - SliverAllocation.delete_allocations(sliver_ids, dbsession) - - elif name == "renew": - (urns, expiration_time, options) = args - slice_urn = urns[0] - slice_hrn, type = urn_to_hrn(slice_urn) - creds = [] - - getattr(self.driver, "renew_sliver")( - slice_urn, slice_hrn, creds, expiration_time, options) - - options['geni_rspec_version'] = { - 'version': '3', 'type': 'GENI'} - descr = self.describe(urns, '', options) - result = descr['geni_slivers'] - - elif name == "perform_operational_action": - (urns, action, options) = args - options['geni_rspec_version'] = { - 'version': '3', 'type': 'GENI'} - result = self.describe(urns, '', options)['geni_slivers'] - - else: - # same as v2 ( registry methods) - result = getattr(self.driver, name)(*args, **kwds) - return result - return func diff --git a/sfa/nitos/__init__.py b/sfa/nitos/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/sfa/nitos/nitosaggregate.py b/sfa/nitos/nitosaggregate.py deleted file mode 100644 index 4201a897..00000000 --- a/sfa/nitos/nitosaggregate.py +++ /dev/null @@ -1,302 +0,0 @@ -#!/usr/bin/python -from sfa.util.xrn import Xrn, hrn_to_urn, urn_to_hrn -from sfa.util.sfatime import utcparse, datetime_to_string -from sfa.util.sfalogging import logger - -from sfa.rspecs.rspec import RSpec -from sfa.rspecs.elements.hardware_type import HardwareType -from sfa.rspecs.elements.node import NodeElement -from sfa.rspecs.elements.link import Link -from sfa.rspecs.elements.sliver import Sliver -from sfa.rspecs.elements.login import Login -from sfa.rspecs.elements.location import Location -from sfa.rspecs.elements.position_3d import Position3D -from sfa.rspecs.elements.interface import Interface -from sfa.rspecs.elements.pltag import PLTag -from sfa.rspecs.elements.lease import Lease -from sfa.rspecs.elements.granularity import Granularity -from sfa.rspecs.elements.channel import Channel -from sfa.rspecs.version_manager import VersionManager - -from sfa.nitos.nitosxrn import NitosXrn, hostname_to_urn, hrn_to_nitos_slicename, slicename_to_hrn, channel_to_urn -from sfa.planetlab.vlink import get_tc_rate -from sfa.planetlab.topology import Topology - -import time - - -class NitosAggregate: - - def __init__(self, driver): - self.driver = driver - - def get_slice_and_slivers(self, slice_xrn): - """ - Returns a dict of slivers keyed on the sliver's node_id - """ - slivers = {} - slice = None - if not slice_xrn: - return (slice, slivers) - slice_urn = hrn_to_urn(slice_xrn, 'slice') - slice_hrn, _ = urn_to_hrn(slice_xrn) - slice_name = hrn_to_nitos_slicename(slice_hrn) - slices = self.driver.shell.getSlices({'slice_name': slice_name}, []) - # filter results - for slc in slices: - if slc['slice_name'] == slice_name: - slice = slc - break - - if not slice: - return (slice, slivers) - - reserved_nodes = self.driver.shell.getReservedNodes( - {'slice_id': slice['slice_id']}, []) - reserved_node_ids = [] - # filter on the slice - for node in reserved_nodes: - if node['slice_id'] == slice['slice_id']: - reserved_node_ids.append(node['node_id']) - # get all the nodes - all_nodes = self.driver.shell.getNodes({}, []) - - for node in all_nodes: - if node['node_id'] in reserved_node_ids: - slivers[node['node_id']] = node - - return (slice, slivers) - - def get_nodes(self, slice_xrn, slice=None, slivers=None, options=None): - if slivers is None: - slivers = {} - if options is None: - options = {} - # if we are dealing with a slice that has no node just return - # and empty list - if slice_xrn: - if not slice or not slivers: - return [] - else: - nodes = [slivers[sliver] for sliver in slivers] - else: - nodes = self.driver.shell.getNodes({}, []) - - # get the granularity in second for the reservation system - grain = self.driver.testbedInfo['grain'] - #grain = 1800 - - rspec_nodes = [] - for node in nodes: - rspec_node = NodeElement() - site_name = self.driver.testbedInfo['name'] - rspec_node['component_id'] = hostname_to_urn( - self.driver.hrn, site_name, node['hostname']) - rspec_node['component_name'] = node['hostname'] - rspec_node['component_manager_id'] = Xrn( - self.driver.hrn, 'authority+cm').get_urn() - rspec_node['authority_id'] = hrn_to_urn( - NitosXrn.site_hrn(self.driver.hrn, site_name), 'authority+sa') - # do not include boot state ( element) in the manifest rspec - # if not slice: - # rspec_node['boot_state'] = node['boot_state'] - rspec_node['exclusive'] = 'true' - # site location - longitude = self.driver.testbedInfo['longitude'] - latitude = self.driver.testbedInfo['latitude'] - if longitude and latitude: - location = Location( - {'longitude': longitude, 'latitude': latitude, 'country': 'unknown'}) - rspec_node['location'] = location - # 3D position - position_3d = Position3D({'x': node['position']['X'], 'y': node[ - 'position']['Y'], 'z': node['position']['Z']}) - #position_3d = Position3D({'x': 1, 'y': 2, 'z': 3}) - rspec_node['position_3d'] = position_3d - # Granularity - granularity = Granularity({'grain': grain}) - rspec_node['granularity'] = granularity - - # HardwareType - rspec_node['hardware_type'] = node['node_type'] - #rspec_node['hardware_type'] = "orbit" - - # slivers - if node['node_id'] in slivers: - # add sliver info - sliver = slivers[node['node_id']] - rspec_node['sliver_id'] = sliver['node_id'] - rspec_node['client_id'] = node['hostname'] - rspec_node['slivers'] = [sliver] - - rspec_nodes.append(rspec_node) - return rspec_nodes - - def get_leases_and_channels(self, slice=None, slice_xrn=None, options=None): - - if options is None: - options = {} - slices = self.driver.shell.getSlices({}, []) - nodes = self.driver.shell.getNodes({}, []) - leases = self.driver.shell.getReservedNodes({}, []) - channels = self.driver.shell.getChannels({}, []) - reserved_channels = self.driver.shell.getReservedChannels() - grain = self.driver.testbedInfo['grain'] - - if slice_xrn and not slice: - return ([], []) - - if slice: - all_leases = [] - all_leases.extend(leases) - all_reserved_channels = [] - all_reserved_channels.extend(reserved_channels) - for lease in all_leases: - if lease['slice_id'] != slice['slice_id']: - leases.remove(lease) - for channel in all_reserved_channels: - if channel['slice_id'] != slice['slice_id']: - reserved_channels.remove(channel) - - rspec_channels = [] - for channel in reserved_channels: - - rspec_channel = {} - # retrieve channel number - for chl in channels: - if chl['channel_id'] == channel['channel_id']: - channel_number = chl['channel'] - break - - rspec_channel['channel_num'] = channel_number - rspec_channel['start_time'] = channel['start_time'] - rspec_channel['duration'] = ( - int(channel['end_time']) - int(channel['start_time'])) / int(grain) - rspec_channel['component_id'] = channel_to_urn( - self.driver.hrn, self.driver.testbedInfo['name'], channel_number) - - # retreive slicename - for slc in slices: - if slc['slice_id'] == channel['slice_id']: - slicename = slc['slice_name'] - break - - if slice_xrn: - slice_urn = slice_xrn - slice_hrn = urn_to_hrn(slice_urn) - else: - slice_hrn = slicename_to_hrn( - self.driver.hrn, self.driver.testbedInfo['name'], slicename) - slice_urn = hrn_to_urn(slice_hrn, 'slice') - - rspec_channel['slice_id'] = slice_urn - rspec_channels.append(rspec_channel) - - rspec_leases = [] - for lease in leases: - - rspec_lease = Lease() - - rspec_lease['lease_id'] = lease['reservation_id'] - # retreive node name - for node in nodes: - if node['node_id'] == lease['node_id']: - nodename = node['hostname'] - break - - rspec_lease['component_id'] = hostname_to_urn( - self.driver.hrn, self.driver.testbedInfo['name'], nodename) - # retreive slicename - for slc in slices: - if slc['slice_id'] == lease['slice_id']: - slicename = slc['slice_name'] - break - - if slice_xrn: - slice_urn = slice_xrn - slice_hrn = urn_to_hrn(slice_urn) - else: - slice_hrn = slicename_to_hrn( - self.driver.hrn, self.driver.testbedInfo['name'], slicename) - slice_urn = hrn_to_urn(slice_hrn, 'slice') - - rspec_lease['slice_id'] = slice_urn - rspec_lease['start_time'] = lease['start_time'] - rspec_lease['duration'] = ( - int(lease['end_time']) - int(lease['start_time'])) / int(grain) - rspec_leases.append(rspec_lease) - - return (rspec_leases, rspec_channels) - - def get_channels(self, slice=None, options=None): - if options is None: - options = {} - - all_channels = self.driver.shell.getChannels({}, []) - channels = [] - if slice: - reserved_channels = self.driver.shell.getReservedChannels() - reserved_channel_ids = [] - for channel in reserved_channels: - if channel['slice_id'] == slice['slice_id']: - reserved_channel_ids.append(channel['channel_id']) - - for channel in all_channels: - if channel['channel_id'] in reserved_channel_ids: - channels.append(channel) - else: - channels = all_channels - - rspec_channels = [] - for channel in channels: - rspec_channel = Channel() - rspec_channel['channel_num'] = channel['channel'] - rspec_channel['frequency'] = channel['frequency'] - rspec_channel['standard'] = channel['modulation'] - rspec_channel['component_id'] = channel_to_urn( - self.driver.hrn, self.driver.testbedInfo['name'], channel['channel']) - rspec_channels.append(rspec_channel) - return rspec_channels - - def get_rspec(self, slice_xrn=None, version=None, options=None): - if options is None: - options = {} - - version_manager = VersionManager() - version = version_manager.get_version(version) - - if not slice_xrn: - rspec_version = version_manager._get_version( - version.type, version.version, 'ad') - else: - rspec_version = version_manager._get_version( - version.type, version.version, 'manifest') - - slice, slivers = self.get_slice_and_slivers(slice_xrn) - - rspec = RSpec(version=rspec_version, user_options=options) - - if slice and 'expires' in slice: - rspec.xml.set('expires', datetime_to_string( - utcparse(slice['expires']))) - - if not options.get('list_leases') or options.get('list_leases') and options['list_leases'] != 'leases': - nodes = self.get_nodes(slice_xrn, slice, slivers, options) - rspec.version.add_nodes(nodes) - # add sliver defaults - default_sliver = slivers.get(None, []) - if default_sliver: - default_sliver_attribs = default_sliver.get('tags', []) - for attrib in default_sliver_attribs: - logger.info(attrib) - rspec.version.add_default_sliver_attribute( - attrib['tagname'], attrib['value']) - # add wifi channels - channels = self.get_channels(slice, options) - rspec.version.add_channels(channels) - - if not options.get('list_leases') or options.get('list_leases') and options['list_leases'] != 'resources': - leases_channels = self.get_leases_and_channels(slice, slice_xrn) - rspec.version.add_leases(leases_channels) - - return rspec.toxml() diff --git a/sfa/nitos/nitosdriver.py b/sfa/nitos/nitosdriver.py deleted file mode 100644 index 8bbf1153..00000000 --- a/sfa/nitos/nitosdriver.py +++ /dev/null @@ -1,766 +0,0 @@ -import time -import datetime -# -from sfa.util.faults import MissingSfaInfo, UnknownSfaType, \ - RecordNotFound, SfaNotImplemented, SliverDoesNotExist - -from sfa.util.sfalogging import logger -from sfa.util.defaultdict import defaultdict -from sfa.util.sfatime import utcparse, datetime_to_string, datetime_to_epoch -from sfa.util.xrn import Xrn, hrn_to_urn, get_leaf, urn_to_hrn -from sfa.util.cache import Cache - -# one would think the driver should not need to mess with the SFA db, but.. -from sfa.storage.model import RegRecord - -# used to be used in get_ticket -#from sfa.trust.sfaticket import SfaTicket - -from sfa.rspecs.version_manager import VersionManager -from sfa.rspecs.rspec import RSpec - -# the driver interface, mostly provides default behaviours -from sfa.managers.driver import Driver - -from sfa.nitos.nitosshell import NitosShell -from sfa.nitos.nitosaggregate import NitosAggregate -from sfa.nitos.nitosslices import NitosSlices - -from sfa.nitos.nitosxrn import NitosXrn, slicename_to_hrn, hostname_to_hrn, hrn_to_nitos_slicename, xrn_to_hostname - - -def list_to_dict(recs, key): - """ - convert a list of dictionaries into a dictionary keyed on the - specified dictionary key - """ - return dict([(rec[key], rec) for rec in recs]) - -# -# NitosShell is just an xmlrpc serverproxy where methods -# can be sent as-is; it takes care of authentication -# from the global config -# - - -class NitosDriver (Driver): - - # the cache instance is a class member so it survives across incoming - # requests - cache = None - - def __init__(self, api): - Driver.__init__(self, api) - config = api.config - self.shell = NitosShell(config) - self.cache = None - self.testbedInfo = self.shell.getTestbedInfo() -# un-comment below lines to enable caching -# if config.SFA_AGGREGATE_CACHING: -# if NitosDriver.cache is None: -# NitosDriver.cache = Cache() -# self.cache = NitosDriver.cache - - ########################################### - # utility methods for NITOS driver - ########################################### - - def filter_nitos_results(self, listo, filters_dict): - """ - the Nitos scheduler API does not provide a get result filtring so we do it here - """ - mylist = [] - mylist.extend(listo) - for dicto in mylist: - for filter in filters_dict: - if filter not in dicto or dicto[filter] != filters_dict[filter]: - listo.remove(dicto) - break - return listo - - def convert_id(self, list_of_dict): - """ - convert object id retrived in string format to int format - """ - for dicto in list_of_dict: - for key in dicto: - if key in ['node_id', 'slice_id', 'user_id', 'channel_id', 'reservation_id'] and isinstance(dicto[key], str): - dicto[key] = int(dicto[key]) - elif key in ['user_ids']: - user_ids2 = [] - for user_id in dicto['user_ids']: - user_ids2.append(int(user_id)) - dicto['user_ids'] = user_ids2 - return list_of_dict - - ######################################## - # registry oriented - ######################################## - - def augment_records_with_testbed_info(self, sfa_records): - return self.fill_record_info(sfa_records) - - ########## - def register(self, sfa_record, hrn, pub_key): - type = sfa_record['type'] - nitos_record = self.sfa_fields_to_nitos_fields(type, hrn, sfa_record) - - if type == 'authority': - pointer = -1 - - elif type == 'slice': - slices = self.shell.getSlices() - # filter slices - for slice in slices: - if slice['slice_name'] == nitos_record['name']: - slice_id = slice['slice_id'] - break - - if not slice_id: - pointer = self.shell.addSlice( - {'slice_name': nitos_record['name']}) - else: - pointer = slice_id - - elif type == 'user': - users = self.shell.getUsers() - # filter users - for user in users: - if user['user_name'] == nitos_record['name']: - user_id = user['user_id'] - break - if not user_id: - pointer = self.shell.addUser( - {'username': nitos_record['name'], 'email': nitos_record['email']}) - else: - pointer = user_id - - # Add the user's key - if pub_key: - self.shell.addUserKey({'user_id': pointer, 'key': pub_key}) - - elif type == 'node': - nodes = self.shell.GetNodes({}, []) - # filter nodes - for node in nodes: - if node['hostname'] == nitos_record['name']: - node_id = node['node_id'] - break - - if not node_id: - pointer = self.shell.addNode(nitos_record) - else: - pointer = node_id - - return pointer - - ########## - def update(self, old_sfa_record, new_sfa_record, hrn, new_key): - - pointer = old_sfa_record['pointer'] - type = old_sfa_record['type'] - new_nitos_record = self.sfa_fields_to_nitos_fields( - type, hrn, new_sfa_record) - - # new_key implemented for users only - if new_key and type not in ['user']: - raise UnknownSfaType(type) - - if type == "slice": - if 'name' in new_sfa_record: - self.shell.updateSlice({'slice_id': pointer, 'fields': { - 'slice_name': new_sfa_record['name']}}) - - elif type == "user": - update_fields = {} - if 'name' in new_sfa_record: - update_fields['username'] = new_sfa_record['name'] - if 'email' in new_sfa_record: - update_fields['email'] = new_sfa_record['email'] - - self.shell.updateUser( - {'user_id': pointer, 'fields': update_fields}) - - if new_key: - # needs to be improved - self.shell.addUserKey({'user_id': pointer, 'key': new_key}) - - elif type == "node": - self.shell.updateNode( - {'node_id': pointer, 'fields': new_sfa_record}) - - return True - - ########## - def remove(self, sfa_record): - - type = sfa_record['type'] - pointer = sfa_record['pointer'] - if type == 'user': - self.shell.deleteUser({'user_id': pointer}) - elif type == 'slice': - self.shell.deleteSlice({'slice_id': pointer}) - elif type == 'node': - self.shell.deleteNode({'node_id': pointer}) - - return True - - ## - # Convert SFA fields to NITOS fields for use when registering or updating - # registry record in the NITOS Scheduler database - # - - def sfa_fields_to_nitos_fields(self, type, hrn, sfa_record): - - nitos_record = {} - - if type == "slice": - nitos_record["slice_name"] = hrn_to_nitos_slicename(hrn) - elif type == "node": - if "hostname" not in sfa_record: - raise MissingSfaInfo("hostname") - nitos_record["node_name"] = sfa_record["hostname"] - - return nitos_record - - #################### - def fill_record_info(self, records): - """ - Given a (list of) SFA record, fill in the NITOS specific - and SFA specific fields in the record. - """ - if not isinstance(records, list): - records = [records] - - self.fill_record_nitos_info(records) - self.fill_record_hrns(records) - self.fill_record_sfa_info(records) - return records - - def fill_record_nitos_info(self, records): - """ - Fill in the nitos specific fields of a SFA record. This - involves calling the appropriate NITOS API method to retrieve the - database record for the object. - - @param record: record to fill in field (in/out param) - """ - - # get ids by type - node_ids, slice_ids = [], [] - user_ids, key_ids = [], [] - type_map = {'node': node_ids, 'slice': slice_ids, 'user': user_ids} - - for record in records: - for type in type_map: - if type == record['type']: - type_map[type].append(record['pointer']) - - # get nitos records - nodes, slices, users, keys = {}, {}, {}, {} - if node_ids: - all_nodes = self.convert_id(self.shell.getNodes({}, [])) - node_list = [node for node in all_nodes if node[ - 'node_id'] in node_ids] - nodes = list_to_dict(node_list, 'node_id') - if slice_ids: - all_slices = self.convert_id(self.shell.getSlices({}, [])) - slice_list = [slice for slice in all_slices if slice[ - 'slice_id'] in slice_ids] - slices = list_to_dict(slice_list, 'slice_id') - if user_ids: - all_users = self.convert_id(self.shell.getUsers()) - user_list = [user for user in all_users if user[ - 'user_id'] in user_ids] - users = list_to_dict(user_list, 'user_id') - - nitos_records = {'node': nodes, 'slice': slices, 'user': users} - - # fill record info - for record in records: - if record['pointer'] == -1: - continue - - for type in nitos_records: - if record['type'] == type: - if record['pointer'] in nitos_records[type]: - record.update(nitos_records[type][record['pointer']]) - break - # fill in key info - if record['type'] == 'user': - if record['pointer'] in nitos_records['user']: - record['keys'] = nitos_records[ - 'user'][record['pointer']]['keys'] - - return records - - def fill_record_hrns(self, records): - """ - convert nitos ids to hrns - """ - - # get ids - slice_ids, user_ids, node_ids = [], [], [] - for record in records: - if 'user_ids' in record: - user_ids.extend(record['user_ids']) - if 'slice_ids' in record: - slice_ids.extend(record['slice_ids']) - if 'node_ids' in record: - node_ids.extend(record['node_ids']) - - # get nitos records - slices, users, nodes = {}, {}, {} - if node_ids: - all_nodes = self.convert_id(self.shell.getNodes({}, [])) - node_list = [node for node in all_nodes if node[ - 'node_id'] in node_ids] - nodes = list_to_dict(node_list, 'node_id') - if slice_ids: - all_slices = self.convert_id(self.shell.getSlices({}, [])) - slice_list = [slice for slice in all_slices if slice[ - 'slice_id'] in slice_ids] - slices = list_to_dict(slice_list, 'slice_id') - if user_ids: - all_users = self.convert_id(self.shell.getUsers()) - user_list = [user for user in all_users if user[ - 'user_id'] in user_ids] - users = list_to_dict(user_list, 'user_id') - - # convert ids to hrns - for record in records: - # get all relevant data - type = record['type'] - pointer = record['pointer'] - auth_hrn = self.hrn - testbed_name = self.testbedInfo['name'] - if pointer == -1: - continue - if 'user_ids' in record: - usernames = [users[user_id]['username'] for user_id in record['user_ids'] - if user_id in users] - user_hrns = [".".join([auth_hrn, testbed_name, username]) - for username in usernames] - record['users'] = user_hrns - if 'slice_ids' in record: - slicenames = [slices[slice_id]['slice_name'] for slice_id in record['slice_ids'] - if slice_id in slices] - slice_hrns = [slicename_to_hrn( - auth_hrn, slicename) for slicename in slicenames] - record['slices'] = slice_hrns - if 'node_ids' in record: - hostnames = [nodes[node_id]['hostname'] for node_id in record['node_ids'] - if node_id in nodes] - node_hrns = [hostname_to_hrn( - auth_hrn, login_base, hostname) for hostname in hostnames] - record['nodes'] = node_hrns - - if 'expires' in record: - date = utcparse(record['expires']) - datestring = datetime_to_string(date) - record['expires'] = datestring - - return records - - def fill_record_sfa_info(self, records): - - def startswith(prefix, values): - return [value for value in values if value.startswith(prefix)] - - # get user ids - user_ids = [] - for record in records: - user_ids.extend(record.get("user_ids", [])) - - # get the registry records - user_list, users = [], {} - user_list = self.api.dbsession().query(RegRecord).filter( - RegRecord.pointer.in_(user_ids)).all() - # create a hrns keyed on the sfa record's pointer. - # Its possible for multiple records to have the same pointer so - # the dict's value will be a list of hrns. - users = defaultdict(list) - for user in user_list: - users[user.pointer].append(user) - - # get the nitos records - nitos_user_list, nitos_users = [], {} - nitos_all_users = self.convert_id(self.shell.getUsers()) - nitos_user_list = [ - user for user in nitos_all_users if user['user_id'] in user_ids] - nitos_users = list_to_dict(nitos_user_list, 'user_id') - - # fill sfa info - for record in records: - if record['pointer'] == -1: - continue - - sfa_info = {} - type = record['type'] - logger.info( - "fill_record_sfa_info - incoming record typed %s" % type) - if (type == "slice"): - # all slice users are researchers - record['geni_urn'] = hrn_to_urn(record['hrn'], 'slice') - record['researcher'] = [] - for user_id in record.get('user_ids', []): - hrns = [user.hrn for user in users[user_id]] - record['researcher'].extend(hrns) - - elif (type == "node"): - sfa_info['dns'] = record.get("hostname", "") - # xxx TODO: URI, LatLong, IP, DNS - - elif (type == "user"): - logger.info('setting user.email') - sfa_info['email'] = record.get("email", "") - sfa_info['geni_urn'] = hrn_to_urn(record['hrn'], 'user') - sfa_info['geni_certificate'] = record['gid'] - # xxx TODO: PostalAddress, Phone - record.update(sfa_info) - - #################### - def update_relation(self, subject_type, target_type, relation_name, subject_id, target_ids): - - if subject_type == 'slice' and target_type == 'user' and relation_name == 'researcher': - subject = self.shell.getSlices({'slice_id': subject_id}, [])[0] - current_target_ids = subject['user_ids'] - add_target_ids = list( - set(target_ids).difference(current_target_ids)) - del_target_ids = list( - set(current_target_ids).difference(target_ids)) - logger.debug("subject_id = %s (type=%s)" % - (subject_id, type(subject_id))) - for target_id in add_target_ids: - self.shell.addUserToSlice( - {'user_id': target_id, 'slice_id': subject_id}) - logger.debug("add_target_id = %s (type=%s)" % - (target_id, type(target_id))) - for target_id in del_target_ids: - logger.debug("del_target_id = %s (type=%s)" % - (target_id, type(target_id))) - self.shell.deleteUserFromSlice( - {'user_id': target_id, 'slice_id': subject_id}) - else: - logger.info('unexpected relation %s to maintain, %s -> %s' % - (relation_name, subject_type, target_type)) - - ######################################## - # aggregate oriented - ######################################## - - def testbed_name(self): return "nitos" - - # 'geni_request_rspec_versions' and 'geni_ad_rspec_versions' are mandatory - def aggregate_version(self): - 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()) - return { - 'testbed': self.testbed_name(), - 'geni_request_rspec_versions': request_rspec_versions, - 'geni_ad_rspec_versions': ad_rspec_versions, - } - - def list_slices(self, creds, options): - # look in cache first - if self.cache: - slices = self.cache.get('slices') - if slices: - logger.debug("NitosDriver.list_slices returns from cache") - return slices - - # get data from db - slices = self.shell.getSlices({}, []) - testbed_name = self.testbedInfo['name'] - slice_hrns = [slicename_to_hrn(self.hrn, testbed_name, slice[ - 'slice_name']) for slice in slices] - slice_urns = [hrn_to_urn(slice_hrn, 'slice') - for slice_hrn in slice_hrns] - - # cache the result - if self.cache: - logger.debug("NitosDriver.list_slices stores value in cache") - self.cache.add('slices', slice_urns) - - return slice_urns - - # first 2 args are None in case of resource discovery - def list_resources(self, slice_urn, slice_hrn, creds, options): - cached_requested = options.get('cached', True) - version_manager = VersionManager() - # get the rspec's return format from options - #rspec_version = version_manager.get_version(options.get('geni_rspec_version')) - # rspec's return format for nitos aggregate is version NITOS 1 - rspec_version = version_manager.get_version('NITOS 1') - version_string = "rspec_%s" % (rspec_version) - - # panos adding the info option to the caching key (can be improved) - if options.get('info'): - version_string = version_string + \ - "_" + options.get('info', 'default') - - # Adding the list_leases option to the caching key - if options.get('list_leases'): - version_string = version_string + "_" + \ - options.get('list_leases', 'default') - - # Adding geni_available to caching key - if options.get('geni_available'): - version_string = version_string + "_" + \ - str(options.get('geni_available')) - - # look in cache first - if cached_requested and self.cache and not slice_hrn: - rspec = self.cache.get(version_string) - if rspec: - logger.debug( - "NitosDriver.ListResources: returning cached advertisement") - return rspec - - # panos: passing user-defined options - # print "manager options = ",options - aggregate = NitosAggregate(self) - rspec = aggregate.get_rspec(slice_xrn=slice_urn, version=rspec_version, - options=options) - - # cache the result - if self.cache and not slice_hrn: - logger.debug( - "NitosDriver.ListResources: stores advertisement in cache") - self.cache.add(version_string, rspec) - - return rspec - - def sliver_status(self, slice_urn, slice_hrn): - # find out where this slice is currently running - slicename = hrn_to_nitos_slicename(slice_hrn) - - slices = self.shell.getSlices({}, []) - # filter slicename - if len(slices) == 0: - raise SliverDoesNotExist( - "%s (used %s as slicename internally)" % (slice_hrn, slicename)) - - for slice in slices: - if slice['slice_name'] == slicename: - user_slice = slice - break - - if not user_slice: - raise SliverDoesNotExist( - "%s (used %s as slicename internally)" % (slice_hrn, slicename)) - - # report about the reserved nodes only - reserved_nodes = self.shell.getReservedNodes({}, []) - nodes = self.shell.getNodes({}, []) - - slice_reserved_nodes = [] - for r_node in reserved_nodes: - if r_node['slice_id'] == slice['slice_id']: - for node in nodes: - if node['node_id'] == r_node['node_id']: - slice_reserved_nodes.append(node) - - if len(slice_reserved_nodes) == 0: - raise SliverDoesNotExist("You have not allocated any slivers here") - -# continue from here - # get login info - user = {} - keys = [] - if slice['user_ids']: - users = self.shell.getUsers() - # filter users on slice['user_ids'] - for usr in users: - if usr['user_id'] in slice['user_ids']: - keys.extend(usr['keys']) - - user.update({'urn': slice_urn, - 'login': slice['slice_name'], - 'protocol': ['ssh'], - 'port': ['22'], - 'keys': keys}) - - result = {} - top_level_status = 'unknown' - if slice_reserved_nodes: - top_level_status = 'ready' - result['geni_urn'] = slice_urn - result['nitos_gateway_login'] = slice['slice_name'] - #result['pl_expires'] = datetime_to_string(utcparse(slice['expires'])) - #result['geni_expires'] = datetime_to_string(utcparse(slice['expires'])) - - resources = [] - for node in slice_reserved_nodes: - res = {} - res['nitos_hostname'] = node['hostname'] - sliver_id = Xrn(slice_urn, type='slice', id=node['node_id']).urn - res['geni_urn'] = sliver_id - res['geni_status'] = 'ready' - res['geni_error'] = '' - res['users'] = [user] - - resources.append(res) - - result['geni_status'] = top_level_status - result['geni_resources'] = resources - - return result - - def create_sliver(self, slice_urn, slice_hrn, creds, rspec_string, users, options): - - aggregate = NitosAggregate(self) - slices = NitosSlices(self) - sfa_peer = slices.get_sfa_peer(slice_hrn) - slice_record = None - if users: - slice_record = users[0].get('slice_record', {}) - - # parse rspec - rspec = RSpec(rspec_string, version='NITOS 1') - - # ensure slice record exists - slice = slices.verify_slice( - slice_hrn, slice_record, sfa_peer, options=options) - # ensure user records exists - users = slices.verify_users( - slice_hrn, slice, users, sfa_peer, options=options) - - # add/remove leases (nodes and channels) - # a lease in Nitos RSpec case is a reservation of nodes and channels - # grouped by (slice,timeslot) - rspec_requested_leases = rspec.version.get_leases() - rspec_requested_nodes = [] - rspec_requested_channels = [] - for lease in rspec_requested_leases: - if lease['type'] == 'node': - lease.pop('type', None) - rspec_requested_nodes.append(lease) - else: - lease.pop('type', None) - rspec_requested_channels.append(lease) - - nodes = slices.verify_slice_leases_nodes(slice, rspec_requested_nodes) - channels = slices.verify_slice_leases_channels( - slice, rspec_requested_channels) - - return aggregate.get_rspec(slice_xrn=slice_urn, version=rspec.version) - - def delete_sliver(self, slice_urn, slice_hrn, creds, options): - slicename = hrn_to_nitos_slicename(slice_hrn) - slices = self.filter_nitos_results( - self.shell.getSlices({}, []), {'slice_name': slicename}) - if not slices: - return 1 - slice = slices[0] - - slice_reserved_nodes = self.filter_nitos_results( - self.shell.getReservedNodes({}, []), {'slice_id': slice['slice_id']}) - slice_reserved_channels = self.filter_nitos_results( - self.shell.getReservedChannels(), {'slice_id': slice['slice_id']}) - - slice_reserved_nodes_ids = [node['reservation_id'] - for node in slice_reserved_nodes] - slice_reserved_channels_ids = [ - channel['reservation_id'] for channel in slice_reserved_channels] - - # release all reserved nodes and channels for that slice - try: - released_nodes = self.shell.releaseNodes( - {'reservation_ids': slice_reserved_nodes_ids}) - released_channels = self.shell.releaseChannels( - {'reservation_ids': slice_reserved_channels_ids}) - except: - pass - return 1 - - def renew_sliver(self, slice_urn, slice_hrn, creds, expiration_time, options): - slicename = hrn_to_nitos_slicename(slice_hrn) - slices = self.shell.GetSlices({'slicename': slicename}, ['slice_id']) - if not slices: - raise RecordNotFound(slice_hrn) - slice = slices[0] - requested_time = utcparse(expiration_time) - record = {'expires': int(datetime_to_epoch(requested_time))} - try: - self.shell.UpdateSlice(slice['slice_id'], record) - - return True - except: - return False - - # xxx this code is quite old and has not run for ages - # it is obviously totally broken and needs a rewrite - def get_ticket(self, slice_urn, slice_hrn, creds, rspec_string, options): - raise SfaNotImplemented("NitosDriver.get_ticket needs a rewrite") -# please keep this code for future reference -# slices = PlSlices(self) -# peer = slices.get_peer(slice_hrn) -# sfa_peer = slices.get_sfa_peer(slice_hrn) -# -# # get the slice record -# credential = api.getCredential() -# interface = api.registries[api.hrn] -# registry = api.server_proxy(interface, credential) -# records = registry.Resolve(xrn, credential) -# -# # make sure we get a local slice record -# record = None -# for tmp_record in records: -# if tmp_record['type'] == 'slice' and \ -# not tmp_record['peer_authority']: -# #Error (E0602, GetTicket): Undefined variable 'SliceRecord' -# slice_record = SliceRecord(dict=tmp_record) -# if not record: -# raise RecordNotFound(slice_hrn) -# -# # similar to CreateSliver, we must verify that the required records exist -# # at this aggregate before we can issue a ticket -# # parse rspec -# rspec = RSpec(rspec_string) -# requested_attributes = rspec.version.get_slice_attributes() -# -# # ensure site record exists -# site = slices.verify_site(slice_hrn, slice_record, peer, sfa_peer) -# # ensure slice record exists -# slice = slices.verify_slice(slice_hrn, slice_record, peer, sfa_peer) -# # ensure person records exists -# # xxx users is undefined in this context -# persons = slices.verify_persons(slice_hrn, slice, users, peer, sfa_peer) -# # ensure slice attributes exists -# slices.verify_slice_attributes(slice, requested_attributes) -# -# # get sliver info -# slivers = slices.get_slivers(slice_hrn) -# -# if not slivers: -# raise SliverDoesNotExist(slice_hrn) -# -# # get initscripts -# initscripts = [] -# data = { -# 'timestamp': int(time.time()), -# 'initscripts': initscripts, -# 'slivers': slivers -# } -# -# # create the ticket -# object_gid = record.get_gid_object() -# new_ticket = SfaTicket(subject = object_gid.get_subject()) -# new_ticket.set_gid_caller(api.auth.client_gid) -# new_ticket.set_gid_object(object_gid) -# new_ticket.set_issuer(key=api.key, subject=self.hrn) -# new_ticket.set_pubkey(object_gid.get_pubkey()) -# new_ticket.set_attributes(data) -# new_ticket.set_rspec(rspec) -# #new_ticket.set_parent(api.auth.hierarchy.get_auth_ticket(auth_hrn)) -# new_ticket.encode() -# new_ticket.sign() -# -# return new_ticket.save_to_string(save_parents=True) diff --git a/sfa/nitos/nitosshell.py b/sfa/nitos/nitosshell.py deleted file mode 100644 index 8142b1e4..00000000 --- a/sfa/nitos/nitosshell.py +++ /dev/null @@ -1,46 +0,0 @@ -import sys -import socket -from urlparse import urlparse - -from sfa.util.sfalogging import logger -from sfa.util.py23 import xmlrpc_client - - -class NitosShell: - """ - A simple xmlrpc shell to a NITOS Scheduler instance - This class can receive all NITOS API calls to the underlying testbed - For safety this is limited to a set of hard-coded calls - """ - - direct_calls = ['getNodes', 'getChannels', 'getSlices', 'getUsers', 'getReservedNodes', - 'getReservedChannels', 'getTestbedInfo', - 'reserveNodes', 'reserveChannels', 'addSlice', 'addUser', 'addUserToSlice', - 'addUserKey', 'addNode', 'addChannel', - 'updateReservedNodes', 'updateReservedChannels', 'updateSlice', 'updateUser', - 'updateNode', 'updateChannel', - 'deleteNode', 'deleteChannel', 'deleteSlice', 'deleteUser', 'deleteUserFromSLice', - 'deleteKey', 'releaseNodes', 'releaseChannels' - ] - - # use the 'capability' auth mechanism for higher performance when the PLC - # db is local - def __init__(self, config): - url = config.SFA_NITOS_URL - self.proxy = xmlrpc_client.ServerProxy( - url, verbose=False, allow_none=True) - - def __getattr__(self, name): - def func(*args, **kwds): - actual_name = None - if name in NitosShell.direct_calls: - actual_name = name - if not actual_name: - raise Exception( - "Illegal method call %s for NITOS driver" % (name)) - actual_name = "scheduler.server." + actual_name - result = getattr(self.proxy, actual_name)(*args, **kwds) - logger.debug('NitosShell %s (%s) returned ... ' % - (name, actual_name)) - return result - return func diff --git a/sfa/nitos/nitosslices.py b/sfa/nitos/nitosslices.py deleted file mode 100644 index 46005cce..00000000 --- a/sfa/nitos/nitosslices.py +++ /dev/null @@ -1,278 +0,0 @@ -from collections import defaultdict - -from sfa.util.sfatime import utcparse, datetime_to_epoch -from sfa.util.sfalogging import logger -from sfa.util.xrn import Xrn, get_leaf, get_authority, urn_to_hrn - -from sfa.rspecs.rspec import RSpec - -from sfa.nitos.nitosxrn import NitosXrn, hrn_to_nitos_slicename, xrn_to_hostname, xrn_to_channel - -MAXINT = 2L**31 - 1 - - -class NitosSlices: - - def __init__(self, driver): - self.driver = driver - - def get_sfa_peer(self, xrn): - hrn, type = urn_to_hrn(xrn) - - # return the authority for this hrn or None if we are the authority - sfa_peer = None - slice_authority = get_authority(hrn) - site_authority = get_authority(slice_authority) - - if site_authority != self.driver.hrn: - sfa_peer = site_authority - - return sfa_peer - - def verify_slice_leases_nodes(self, slice, rspec_requested_nodes): - nodes = self.driver.shell.getNodes({}, []) - - requested_nodes = [] - for node in rspec_requested_nodes: - requested_node = {} - nitos_nodes = [] - nitos_nodes.extend(nodes) - slice_name = hrn_to_nitos_slicename(node['slice_id']) - if slice_name != slice['slice_name']: - continue - hostname = xrn_to_hostname(node['component_id']) - nitos_node = self.driver.filter_nitos_results( - nitos_nodes, {'hostname': hostname}) - if not nitos_node: - continue - nitos_node = nitos_node[0] - # fill the requested node with nitos ids - requested_node['slice_id'] = slice['slice_id'] - requested_node['node_id'] = nitos_node['node_id'] - requested_node['start_time'] = node['start_time'] - requested_node['end_time'] = str(int( - node['duration']) * int(self.driver.testbedInfo['grain']) + int(node['start_time'])) - requested_nodes.append(requested_node) - - # get actual nodes reservation data for the slice - reserved_nodes = self.driver.filter_nitos_results( - self.driver.shell.getReservedNodes({}, []), {'slice_id': slice['slice_id']}) - - reserved_nodes_by_id = {} - for node in reserved_nodes: - reserved_nodes_by_id[node['reservation_id']] = {'slice_id': node['slice_id'], - 'node_id': node['node_id'], 'start_time': node['start_time'], - 'end_time': node['end_time']} - - added_nodes = [] - kept_nodes_id = [] - deleted_nodes_id = [] - for reservation_id in reserved_nodes_by_id: - if reserved_nodes_by_id[reservation_id] not in requested_nodes: - deleted_nodes_id.append(reservation_id) - else: - kept_nodes_id.append(reservation_id) - requested_nodes.remove(reserved_nodes_by_id[reservation_id]) - added_nodes = requested_nodes - - try: - deleted = self.driver.shell.releaseNodes( - {'reservation_ids': deleted_nodes_id}) - for node in added_nodes: - added = self.driver.shell.reserveNodes({'slice_id': slice['slice_id'], 'start_time': node[ - 'start_time'], 'end_time': node['end_time'], 'nodes': [node['node_id']]}) - - except: - logger.log_exc('Failed to add/remove slice leases nodes') - - return added_nodes - - def verify_slice_leases_channels(self, slice, rspec_requested_channels): - channels = self.driver.shell.getChannels({}, []) - - requested_channels = [] - for channel in rspec_requested_channels: - requested_channel = {} - nitos_channels = [] - nitos_channels.extend(channels) - slice_name = hrn_to_nitos_slicename(channel['slice_id']) - if slice_name != slice['slice_name']: - continue - channel_num = xrn_to_channel(channel['component_id']) - nitos_channel = self.driver.filter_nitos_results( - nitos_channels, {'channel': channel_num})[0] - # fill the requested channel with nitos ids - requested_channel['slice_id'] = slice['slice_id'] - requested_channel['channel_id'] = nitos_channel['channel_id'] - requested_channel['start_time'] = channel['start_time'] - requested_channel['end_time'] = str(int( - channel['duration']) * int(self.driver.testbedInfo['grain']) + int(channel['start_time'])) - requested_channels.append(requested_channel) - - # get actual channel reservation data for the slice - reserved_channels = self.driver.filter_nitos_results( - self.driver.shell.getReservedChannels(), {'slice_id': slice['slice_id']}) - - reserved_channels_by_id = {} - for channel in reserved_channels: - reserved_channels_by_id[channel['reservation_id']] = {'slice_id': channel['slice_id'], - 'channel_id': channel['channel_id'], 'start_time': channel['start_time'], - 'end_time': channel['end_time']} - - added_channels = [] - kept_channels_id = [] - deleted_channels_id = [] - for reservation_id in reserved_channels_by_id: - if reserved_channels_by_id[reservation_id] not in requested_channels: - deleted_channels_id.append(reservation_id) - else: - kept_channels_id.append(reservation_id) - requested_channels.remove( - reserved_channels_by_id[reservation_id]) - added_channels = requested_channels - - try: - deleted = self.driver.shell.releaseChannels( - {'reservation_ids': deleted_channels_id}) - for channel in added_channels: - added = self.driver.shell.reserveChannels({'slice_id': slice['slice_id'], 'start_time': channel[ - 'start_time'], 'end_time': channel['end_time'], 'channels': [channel['channel_id']]}) - - except: - logger.log_exc('Failed to add/remove slice leases channels') - - return added_channels - - def free_egre_key(self): - used = set() - for tag in self.driver.shell.GetSliceTags({'tagname': 'egre_key'}): - used.add(int(tag['value'])) - - for i in range(1, 256): - if i not in used: - key = i - break - else: - raise KeyError("No more EGRE keys available") - - return str(key) - - def verify_slice(self, slice_hrn, slice_record, sfa_peer, options=None): - if options is None: - options = {} - slicename = hrn_to_nitos_slicename(slice_hrn) - slices = self.driver.shell.getSlices({}, []) - slices = self.driver.filter_nitos_results( - slices, {'slice_name': slicename}) - if not slices: - slice = {'slice_name': slicename} - # add the slice - slice['slice_id'] = self.driver.shell.addSlice(slice) - slice['node_ids'] = [] - slice['user_ids'] = [] - else: - slice = slices[0] - - return slice - - def verify_users(self, slice_hrn, slice_record, users, sfa_peer, options=None): - if options is None: - options = {} - # get slice info - slicename = hrn_to_nitos_slicename(slice_hrn) - slices = self.driver.shell.getSlices({}, []) - slice = self.driver.filter_nitos_results( - slices, {'slice_name': slicename})[0] - added_users = [] - # get users info - users_info = [] - for user in users: - user_urn = user['urn'] - user_hrn, type = urn_to_hrn(user_urn) - username = str(user_hrn).split('.')[-1] - email = user['email'] - # look for the user according to his username, email... - nitos_users = self.driver.filter_nitos_results( - self.driver.shell.getUsers(), {'username': username}) - if not nitos_users: - nitos_users = self.driver.filter_nitos_results( - self.driver.shell.getUsers(), {'email': email}) - - if not nitos_users: - # create the user - user_id = self.driver.shell.addUser( - {'username': email.split('@')[0], 'email': email}) - added_users.append(user_id) - # add user keys - for key in user['keys']: - self.driver.shell.addUserKey( - {'user_id': user_id, 'key': key, 'slice_id': slice['slice_id']}) - # add the user to the slice - self.driver.shell.addUserToSlice( - {'slice_id': slice['slice_id'], 'user_id': user_id}) - else: - # check if the users are in the slice - for user in nitos_users: - if not user['user_id'] in slice['user_ids']: - self.driver.shell.addUserToSlice( - {'slice_id': slice['slice_id'], 'user_id': user['user_id']}) - - return added_users - - def verify_keys(self, persons, users, options=None): - if options is None: - options = {} - # existing keys - key_ids = [] - for person in persons: - key_ids.extend(person['key_ids']) - keylist = self.driver.shell.GetKeys(key_ids, ['key_id', 'key']) - keydict = {} - for key in keylist: - keydict[key['key']] = key['key_id'] - existing_keys = keydict.keys() - persondict = {} - for person in persons: - persondict[person['email']] = person - - # add new keys - requested_keys = [] - updated_persons = [] - for user in users: - user_keys = user.get('keys', []) - updated_persons.append(user) - for key_string in user_keys: - requested_keys.append(key_string) - if key_string not in existing_keys: - key = {'key': key_string, 'key_type': 'ssh'} - try: - if peer: - person = persondict[user['email']] - self.driver.shell.UnBindObjectFromPeer( - 'person', person['person_id'], peer['shortname']) - key['key_id'] = self.driver.shell.AddPersonKey( - user['email'], key) - if peer: - key_index = user_keys.index(key['key']) - remote_key_id = user['key_ids'][key_index] - self.driver.shell.BindObjectToPeer('key', key['key_id'], peer[ - 'shortname'], remote_key_id) - - finally: - if peer: - self.driver.shell.BindObjectToPeer('person', person['person_id'], peer[ - 'shortname'], user['person_id']) - - # remove old keys (only if we are not appending) - append = options.get('append', True) - if append == False: - removed_keys = set(existing_keys).difference(requested_keys) - for existing_key_id in keydict: - if keydict[existing_key_id] in removed_keys: - try: - if peer: - self.driver.shell.UnBindObjectFromPeer( - 'key', existing_key_id, peer['shortname']) - self.driver.shell.DeleteKey(existing_key_id) - except: - pass diff --git a/sfa/nitos/nitosxrn.py b/sfa/nitos/nitosxrn.py deleted file mode 100644 index 375a75fe..00000000 --- a/sfa/nitos/nitosxrn.py +++ /dev/null @@ -1,139 +0,0 @@ -from __future__ import print_function - -# specialized Xrn class for NITOS -import re -from sfa.util.xrn import Xrn - -# temporary helper functions to use this module instead of namespace - - -def hostname_to_hrn(auth, login_base, hostname): - return NitosXrn(auth=auth + '.' + login_base, hostname=hostname).get_hrn() - - -def hostname_to_urn(auth, login_base, hostname): - return NitosXrn(auth=auth + '.' + login_base, hostname=hostname).get_urn() - - -def slicename_to_hrn(auth_hrn, site_name, slicename): - return NitosXrn(auth=auth_hrn + '.' + site_name, slicename=slicename).get_hrn() -# hack to convert nitos user name to hrn - - -def username_to_hrn(auth_hrn, site_name, username): - return NitosXrn(auth=auth_hrn + '.' + site_name, slicename=username).get_hrn() - - -def email_to_hrn(auth_hrn, email): - return NitosXrn(auth=auth_hrn, email=email).get_hrn() - - -def hrn_to_nitos_slicename(hrn): - return NitosXrn(xrn=hrn, type='slice').nitos_slicename() -# removed-dangerous - was used for non-slice objects -# def hrn_to_nitos_login_base (hrn): -# return NitosXrn(xrn=hrn,type='slice').nitos_login_base() - - -def hrn_to_nitos_authname(hrn): - return NitosXrn(xrn=hrn, type='any').nitos_authname() - - -def xrn_to_hostname(hrn): - return Xrn.unescape(NitosXrn(xrn=hrn, type='node').get_leaf()) - - -def channel_to_hrn(auth, login_base, channel): - return NitosXrn(auth=auth + '.' + login_base, channel=channel).get_hrn() - - -def channel_to_urn(auth, login_base, channel): - return NitosXrn(auth=auth + '.' + login_base, channel=channel).get_urn() - - -def xrn_to_channel(hrn): - return Xrn.unescape(NitosXrn(xrn=hrn, type='channel').get_leaf()) - - -class NitosXrn (Xrn): - - @staticmethod - def site_hrn(auth, login_base): - return '.'.join([auth, login_base]) - - def __init__(self, auth=None, hostname=None, slicename=None, email=None, interface=None, channel=None, **kwargs): - # def hostname_to_hrn(auth_hrn, login_base, hostname): - if hostname is not None: - self.type = 'node' - # keep only the first part of the DNS name - #self.hrn='.'.join( [auth,hostname.split(".")[0] ] ) - # escape the '.' in the hostname - self.hrn = '.'.join([auth, Xrn.escape(hostname)]) - self.hrn_to_urn() - # def slicename_to_hrn(auth_hrn, slicename): - elif slicename is not None: - self.type = 'slice' - self.hrn = ".".join([auth] + [slicename.replace(".", "_")]) - self.hrn_to_urn() - # def email_to_hrn(auth_hrn, email): - elif email is not None: - self.type = 'person' - # keep only the part before '@' and replace special chars into _ - self.hrn = '.'.join( - [auth, email.split('@')[0].replace(".", "_").replace("+", "_")]) - self.hrn_to_urn() - elif interface is not None: - self.type = 'interface' - self.hrn = auth + '.' + interface - self.hrn_to_urn() - elif channel is not None: - self.type = 'channel' - self.hrn = ".".join([auth] + [channel]) - self.hrn_to_urn() - else: - Xrn.__init__(self, **kwargs) - - # def hrn_to_pl_slicename(hrn): - def nitos_slicename(self): - self._normalize() - leaf = self.leaf - sliver_id_parts = leaf.split(':') - name = sliver_id_parts[0] - name = re.sub('[^a-zA-Z0-9_]', '', name) - # return self.nitos_login_base() + '_' + name - return name - - # def hrn_to_pl_authname(hrn): - def nitos_authname(self): - self._normalize() - return self.authority[-1] - - def interface_name(self): - self._normalize() - return self.leaf - - def nitos_login_base(self): - self._normalize() - if self.type and self.type.startswith('authority'): - base = self.leaf - else: - base = self.authority[-1] - - # Fix up names of GENI Federates - base = base.lower() - base = re.sub('\\\[^a-zA-Z0-9]', '', base) - - if len(base) > 20: - base = base[len(base) - 20:] - - return base - - -if __name__ == '__main__': - - #nitosxrn = NitosXrn(auth="omf.nitos",slicename="aminesl") - #slice_hrn = nitosxrn.get_hrn() - #slice_name = NitosXrn(xrn="omf.nitos.aminesl",type='slice').nitos_slicename() - slicename = "giorgos_n" - hrn = slicename_to_hrn("pla", "nitos", slicename) - print(hrn) diff --git a/sfa/rspecs/elements/versions/nitosv1Channel.py b/sfa/rspecs/elements/versions/nitosv1Channel.py deleted file mode 100644 index 04f4aa6e..00000000 --- a/sfa/rspecs/elements/versions/nitosv1Channel.py +++ /dev/null @@ -1,77 +0,0 @@ -from sfa.util.sfalogging import logger -from sfa.util.xml import XpathFilter -from sfa.util.xrn import Xrn - -from sfa.rspecs.elements.element import Element -from sfa.rspecs.elements.node import NodeElement -from sfa.rspecs.elements.sliver import Sliver -from sfa.rspecs.elements.location import Location -from sfa.rspecs.elements.hardware_type import HardwareType -from sfa.rspecs.elements.disk_image import DiskImage -from sfa.rspecs.elements.interface import Interface -from sfa.rspecs.elements.bwlimit import BWlimit -from sfa.rspecs.elements.pltag import PLTag -from sfa.rspecs.elements.versions.nitosv1Sliver import NITOSv1Sliver -from sfa.rspecs.elements.versions.nitosv1PLTag import NITOSv1PLTag -from sfa.rspecs.elements.versions.pgv2Services import PGv2Services -from sfa.rspecs.elements.lease import Lease -from sfa.rspecs.elements.spectrum import Spectrum -from sfa.rspecs.elements.channel import Channel - - -class NITOSv1Channel: - - @staticmethod - def add_channels(xml, channels): - - network_elems = xml.xpath('//network') - if len(network_elems) > 0: - network_elem = network_elems[0] - elif len(channels) > 0: - # dirty hack that handles no resource manifest rspec - network_urn = "omf" - network_elem = xml.add_element('network', name=network_urn) - else: - network_elem = xml - -# spectrum_elems = xml.xpath('//spectrum') -# spectrum_elem = xml.add_element('spectrum') - -# if len(spectrum_elems) > 0: -# spectrum_elem = spectrum_elems[0] -# elif len(channels) > 0: -# spectrum_elem = xml.add_element('spectrum') -# else: -# spectrum_elem = xml - - spectrum_elem = network_elem.add_instance('spectrum', []) - - channel_elems = [] - for channel in channels: - channel_fields = ['channel_num', - 'frequency', 'standard', 'component_id'] - channel_elem = spectrum_elem.add_instance( - 'channel', channel, channel_fields) - channel_elems.append(channel_elem) - - @staticmethod - def get_channels(xml, filter=None): - if filter is None: - filter = {} - xpath = '//channel%s | //default:channel%s' % ( - XpathFilter.xpath(filter), XpathFilter.xpath(filter)) - channel_elems = xml.xpath(xpath) - return NITOSv1Channel.get_channel_objs(channel_elems) - - @staticmethod - def get_channel_objs(channel_elems): - channels = [] - for channel_elem in channel_elems: - channel = Channel(channel_elem.attrib, channel_elem) - channel['channel_num'] = channel_elem.attrib['channel_num'] - channel['frequency'] = channel_elem.attrib['frequency'] - channel['standard'] = channel_elem.attrib['standard'] - channel['component_id'] = channel_elem.attrib['component_id'] - - channels.append(channel) - return channels diff --git a/sfa/rspecs/elements/versions/nitosv1Lease.py b/sfa/rspecs/elements/versions/nitosv1Lease.py deleted file mode 100644 index b5cb319c..00000000 --- a/sfa/rspecs/elements/versions/nitosv1Lease.py +++ /dev/null @@ -1,113 +0,0 @@ -from sfa.util.sfalogging import logger -from sfa.util.xml import XpathFilter -from sfa.util.xrn import Xrn -from sfa.util.sfatime import utcparse, datetime_to_string, datetime_to_epoch - -from sfa.rspecs.elements.element import Element -from sfa.rspecs.elements.node import NodeElement -from sfa.rspecs.elements.sliver import Sliver -from sfa.rspecs.elements.location import Location -from sfa.rspecs.elements.hardware_type import HardwareType -from sfa.rspecs.elements.disk_image import DiskImage -from sfa.rspecs.elements.interface import Interface -from sfa.rspecs.elements.bwlimit import BWlimit -from sfa.rspecs.elements.pltag import PLTag -from sfa.rspecs.elements.versions.nitosv1Sliver import NITOSv1Sliver -from sfa.rspecs.elements.versions.nitosv1PLTag import NITOSv1PLTag -from sfa.rspecs.elements.versions.pgv2Services import PGv2Services -from sfa.rspecs.elements.lease import Lease -from sfa.rspecs.elements.channel import Channel - - -class NITOSv1Lease: - - @staticmethod - def add_leases(xml, leases, channels): - - network_elems = xml.xpath('//network') - if len(network_elems) > 0: - network_elem = network_elems[0] - elif len(leases) > 0: - network_urn = Xrn(leases[0]['component_id'] - ).get_authority_urn().split(':')[0] - network_elem = xml.add_element('network', name=network_urn) - else: - network_elem = xml - - # group the leases by slice and timeslots - grouped_leases = [] - - while leases: - slice_id = leases[0]['slice_id'] - start_time = leases[0]['start_time'] - duration = leases[0]['duration'] - group = [] - - for lease in leases: - if slice_id == lease['slice_id'] and start_time == lease['start_time'] and duration == lease['duration']: - group.append(lease) - - grouped_leases.append(group) - - for lease1 in group: - leases.remove(lease1) - - lease_elems = [] - for lease in grouped_leases: - #lease[0]['start_time'] = datetime_to_string(utcparse(lease[0]['start_time'])) - - lease_fields = ['slice_id', 'start_time', 'duration'] - lease_elem = network_elem.add_instance( - 'lease', lease[0], lease_fields) - lease_elems.append(lease_elem) - - # add nodes of this lease - for node in lease: - lease_elem.add_instance('node', node, ['component_id']) - - # add reserved channels of this lease - #channels = [{'channel_id': 1}, {'channel_id': 2}] - for channel in channels: - #channel['start_time'] = datetime_to_string(utcparse(channel['start_time'])) - if channel['slice_id'] == lease[0]['slice_id'] and channel['start_time'] == lease[0]['start_time'] and channel['duration'] == lease[0]['duration']: - lease_elem.add_instance( - 'channel', channel, ['component_id']) - - @staticmethod - def get_leases(xml, filter=None): - if filter is None: - filter = {} - xpath = '//lease%s | //default:lease%s' % ( - XpathFilter.xpath(filter), XpathFilter.xpath(filter)) - lease_elems = xml.xpath(xpath) - return NITOSv1Lease.get_lease_objs(lease_elems) - - @staticmethod - def get_lease_objs(lease_elems): - leases = [] - channels = [] - for lease_elem in lease_elems: - # get nodes - node_elems = lease_elem.xpath('./default:node | ./node') - for node_elem in node_elems: - lease = Lease(lease_elem.attrib, lease_elem) - lease['slice_id'] = lease_elem.attrib['slice_id'] - #lease['start_time'] = datetime_to_epoch(utcparse(lease_elem.attrib['start_time'])) - lease['start_time'] = lease_elem.attrib['start_time'] - lease['duration'] = lease_elem.attrib['duration'] - lease['component_id'] = node_elem.attrib['component_id'] - lease['type'] = 'node' - leases.append(lease) - # get channels - channel_elems = lease_elem.xpath('./default:channel | ./channel') - for channel_elem in channel_elems: - channel = Channel(channel_elem.attrib, channel_elem) - channel['slice_id'] = lease_elem.attrib['slice_id'] - #channel['start_time'] = datetime_to_epoch(utcparse(lease_elem.attrib['start_time'])) - channel['start_time'] = lease_elem.attrib['start_time'] - channel['duration'] = lease_elem.attrib['duration'] - channel['component_id'] = channel_elem.attrib['component_id'] - channel['type'] = 'channel' - channels.append(channel) - - return leases + channels diff --git a/sfa/rspecs/elements/versions/nitosv1Node.py b/sfa/rspecs/elements/versions/nitosv1Node.py deleted file mode 100644 index c4349398..00000000 --- a/sfa/rspecs/elements/versions/nitosv1Node.py +++ /dev/null @@ -1,200 +0,0 @@ -from sfa.util.sfalogging import logger -from sfa.util.xml import XpathFilter -from sfa.util.xrn import Xrn - -from sfa.rspecs.elements.element import Element -from sfa.rspecs.elements.node import NodeElement -from sfa.rspecs.elements.sliver import Sliver -from sfa.rspecs.elements.location import Location -from sfa.rspecs.elements.position_3d import Position3D -from sfa.rspecs.elements.hardware_type import HardwareType -from sfa.rspecs.elements.disk_image import DiskImage -from sfa.rspecs.elements.interface import Interface -from sfa.rspecs.elements.bwlimit import BWlimit -from sfa.rspecs.elements.pltag import PLTag -from sfa.rspecs.elements.versions.nitosv1Sliver import NITOSv1Sliver -from sfa.rspecs.elements.versions.nitosv1PLTag import NITOSv1PLTag -from sfa.rspecs.elements.versions.pgv2Services import PGv2Services - - -class NITOSv1Node: - - @staticmethod - def add_nodes(xml, nodes, rspec_content_type=None): - network_elems = xml.xpath('//network') - if len(network_elems) > 0: - network_elem = network_elems[0] - elif len(nodes) > 0 and nodes[0].get('component_manager_id'): - network_urn = nodes[0]['component_manager_id'] - network_elem = xml.add_element( - 'network', name=Xrn(network_urn).get_hrn()) - else: - network_elem = xml - - # needs to be improuved to retreive the gateway addr dynamically. - gateway_addr = 'nitlab.inf.uth.gr' - - node_elems = [] - for node in nodes: - node_fields = ['component_manager_id', - 'component_id', 'boot_state'] - node_elem = network_elem.add_instance('node', node, node_fields) - node_elems.append(node_elem) - - # determine network hrn - network_hrn = None - if 'component_manager_id' in node and node['component_manager_id']: - network_hrn = Xrn(node['component_manager_id']).get_hrn() - - # set component_name attribute and hostname element - if 'component_id' in node and node['component_id']: - component_name = Xrn(xrn=node['component_id']).get_leaf() - node_elem.set('component_name', component_name) - hostname_elem = node_elem.add_element('hostname') - hostname_elem.set_text(component_name) - - # set site id - if 'authority_id' in node and node['authority_id']: - node_elem.set('site_id', node['authority_id']) - - # add locaiton - location = node.get('location') - if location: - node_elem.add_instance('location', location, Location.fields) - - # add 3D Position of the node - position_3d = node.get('position_3d') - if position_3d: - node_elem.add_instance( - 'position_3d', position_3d, Position3D.fields) - - # all nitos nodes are exculsive - exclusive_elem = node_elem.add_element('exclusive') - exclusive_elem.set_text('TRUE') - - # In order to access nitos nodes, one need to pass through the nitos gateway - # here we advertise Nitos access gateway address - gateway_elem = node_elem.add_element('gateway') - gateway_elem.set_text(gateway_addr) - - # add granularity of the reservation system - granularity = node.get('granularity')['grain'] - if granularity: - #node_elem.add_instance('granularity', granularity, granularity.fields) - granularity_elem = node_elem.add_element('granularity') - granularity_elem.set_text(str(granularity)) - # add hardware type - #hardware_type = node.get('hardware_type') - # if hardware_type: - # node_elem.add_instance('hardware_type', hardware_type) - hardware_type_elem = node_elem.add_element('hardware_type') - hardware_type_elem.set_text(node.get('hardware_type')) - - if isinstance(node.get('interfaces'), list): - for interface in node.get('interfaces', []): - node_elem.add_instance('interface', interface, [ - 'component_id', 'client_id', 'ipv4']) - - # if 'bw_unallocated' in node and node['bw_unallocated']: - # bw_unallocated = etree.SubElement(node_elem, 'bw_unallocated', units='kbps').text = str(int(node['bw_unallocated'])/1000) - - PGv2Services.add_services(node_elem, node.get('services', [])) - tags = node.get('tags', []) - if tags: - for tag in tags: - tag_elem = node_elem.add_element(tag['tagname']) - tag_elem.set_text(tag['value']) - NITOSv1Sliver.add_slivers(node_elem, node.get('slivers', [])) - - # add sliver tag in Request Rspec - if rspec_content_type == "request": - node_elem.add_instance('sliver', '', []) - - @staticmethod - def add_slivers(xml, slivers): - component_ids = [] - for sliver in slivers: - filter = {} - if isinstance(sliver, str): - filter['component_id'] = '*%s*' % sliver - sliver = {} - elif 'component_id' in sliver and sliver['component_id']: - filter['component_id'] = '*%s*' % sliver['component_id'] - if not filter: - continue - nodes = NITOSv1Node.get_nodes(xml, filter) - if not nodes: - continue - node = nodes[0] - NITOSv1Sliver.add_slivers(node, sliver) - - @staticmethod - def remove_slivers(xml, hostnames): - for hostname in hostnames: - nodes = NITOSv1Node.get_nodes( - xml, {'component_id': '*%s*' % hostname}) - for node in nodes: - slivers = NITOSv1Sliver.get_slivers(node.element) - for sliver in slivers: - node.element.remove(sliver.element) - - @staticmethod - def get_nodes(xml, filter=None): - if filter is None: - filter = {} - xpath = '//node%s | //default:node%s' % ( - XpathFilter.xpath(filter), XpathFilter.xpath(filter)) - node_elems = xml.xpath(xpath) - return NITOSv1Node.get_node_objs(node_elems) - - @staticmethod - def get_nodes_with_slivers(xml): - xpath = '//node[count(sliver)>0] | //default:node[count(default:sliver)>0]' - node_elems = xml.xpath(xpath) - return NITOSv1Node.get_node_objs(node_elems) - - @staticmethod - def get_node_objs(node_elems): - nodes = [] - for node_elem in node_elems: - node = NodeElement(node_elem.attrib, node_elem) - if 'site_id' in node_elem.attrib: - node['authority_id'] = node_elem.attrib['site_id'] - # get location - location_elems = node_elem.xpath('./default:location | ./location') - locations = [loc_elem.get_instance( - Location) for loc_elem in location_elems] - if len(locations) > 0: - node['location'] = locations[0] - # get bwlimit - bwlimit_elems = node_elem.xpath('./default:bw_limit | ./bw_limit') - bwlimits = [bwlimit_elem.get_instance( - BWlimit) for bwlimit_elem in bwlimit_elems] - if len(bwlimits) > 0: - node['bwlimit'] = bwlimits[0] - # get interfaces - iface_elems = node_elem.xpath('./default:interface | ./interface') - ifaces = [iface_elem.get_instance( - Interface) for iface_elem in iface_elems] - node['interfaces'] = ifaces - # get services - node['services'] = PGv2Services.get_services(node_elem) - # get slivers - node['slivers'] = NITOSv1Sliver.get_slivers(node_elem) - # get tags - node['tags'] = NITOSv1PLTag.get_pl_tags( - node_elem, ignore=NodeElement.fields + ["hardware_type"]) - # get hardware types - hardware_type_elems = node_elem.xpath( - './default:hardware_type | ./hardware_type') - node['hardware_types'] = [hw_type.get_instance( - HardwareType) for hw_type in hardware_type_elems] - - # temporary... play nice with old slice manager rspec - if not node['component_name']: - hostname_elem = node_elem.find("hostname") - if hostname_elem != None: - node['component_name'] = hostname_elem.text - - nodes.append(node) - return nodes diff --git a/sfa/rspecs/elements/versions/nitosv1PLTag.py b/sfa/rspecs/elements/versions/nitosv1PLTag.py deleted file mode 100644 index cca22af3..00000000 --- a/sfa/rspecs/elements/versions/nitosv1PLTag.py +++ /dev/null @@ -1,22 +0,0 @@ -from sfa.rspecs.elements.element import Element -from sfa.rspecs.elements.pltag import PLTag - - -class NITOSv1PLTag: - - @staticmethod - def add_pl_tag(xml, name, value): - for pl_tag in pl_tags: - pl_tag_elem = xml.add_element(name) - pl_tag_elem.set_text(value) - - @staticmethod - def get_pl_tags(xml, ignore=None): - if ignore is None: - ignore = [] - pl_tags = [] - for elem in xml.iterchildren(): - if elem.tag not in ignore: - pl_tag = PLTag({'tagname': elem.tag, 'value': elem.text}) - pl_tags.append(pl_tag) - return pl_tags diff --git a/sfa/rspecs/elements/versions/nitosv1Sliver.py b/sfa/rspecs/elements/versions/nitosv1Sliver.py deleted file mode 100644 index 6ceb87fc..00000000 --- a/sfa/rspecs/elements/versions/nitosv1Sliver.py +++ /dev/null @@ -1,61 +0,0 @@ -from sfa.util.xrn import Xrn -from sfa.util.xml import XmlElement - -from sfa.rspecs.elements.element import Element -from sfa.rspecs.elements.sliver import Sliver -from sfa.rspecs.elements.versions.nitosv1PLTag import NITOSv1PLTag - -#from sfa.planetlab.plxrn import PlXrn - - -class NITOSv1Sliver: - - @staticmethod - def add_slivers(xml, slivers): - if not slivers: - return - if not isinstance(slivers, list): - slivers = [slivers] - for sliver in slivers: - sliver_elem = xml.add_instance('sliver', sliver, ['name']) - tags = sliver.get('tags', []) - if tags: - for tag in tags: - NITOSv1Sliver.add_sliver_attribute( - sliver_elem, tag['tagname'], tag['value']) - if sliver.get('sliver_id'): - name = Xrn(xrn=sliver.get('sliver_id') - ).get_hrn().split('.')[-1] - sliver_elem.set('name', name) - - @staticmethod - def add_sliver_attribute(xml, name, value): - elem = xml.add_element(name) - elem.set_text(value) - - @staticmethod - def get_sliver_attributes(xml): - attribs = [] - for elem in xml.iterchildren(): - if elem.tag not in Sliver.fields: - xml_element = XmlElement(elem, xml.namespaces) - instance = Element(fields=xml_element, element=elem) - instance['name'] = elem.tag - instance['value'] = elem.text - attribs.append(instance) - return attribs - - @staticmethod - def get_slivers(xml, filter=None): - if filter is None: - filter = {} - xpath = './default:sliver | ./sliver' - sliver_elems = xml.xpath(xpath) - slivers = [] - for sliver_elem in sliver_elems: - sliver = Sliver(sliver_elem.attrib, sliver_elem) - if 'component_id' in xml.attrib: - sliver['component_id'] = xml.attrib['component_id'] - sliver['tags'] = NITOSv1Sliver.get_sliver_attributes(sliver_elem) - slivers.append(sliver) - return slivers diff --git a/sfa/rspecs/versions/nitosv1.py b/sfa/rspecs/versions/nitosv1.py deleted file mode 100644 index 99485c6f..00000000 --- a/sfa/rspecs/versions/nitosv1.py +++ /dev/null @@ -1,244 +0,0 @@ -from __future__ import print_function - -from copy import deepcopy -from lxml import etree - -from sfa.util.sfalogging import logger -from sfa.util.xrn import hrn_to_urn, urn_to_hrn -from sfa.rspecs.version import RSpecVersion -from sfa.rspecs.elements.element import Element -from sfa.rspecs.elements.versions.pgv2Link import PGv2Link -from sfa.rspecs.elements.versions.nitosv1Node import NITOSv1Node -from sfa.rspecs.elements.versions.nitosv1Sliver import NITOSv1Sliver -from sfa.rspecs.elements.versions.nitosv1Lease import NITOSv1Lease -from sfa.rspecs.elements.versions.nitosv1Channel import NITOSv1Channel - - -class NITOSv1(RSpecVersion): - enabled = True - type = 'NITOS' - content_type = '*' - version = '1' - schema = None - namespace = None - extensions = {} - namespaces = None - template = '' % type - - # Network - def get_networks(self): - network_elems = self.xml.xpath('//network') - networks = [network_elem.get_instance(fields=['name', 'slice']) for - network_elem in network_elems] - return networks - - def add_network(self, network): - network_tags = self.xml.xpath('//network[@name="%s"]' % network) - if not network_tags: - network_tag = self.xml.add_element('network', name=network) - else: - network_tag = network_tags[0] - return network_tag - - # Nodes - - def get_nodes(self, filter=None): - return NITOSv1Node.get_nodes(self.xml, filter) - - def get_nodes_with_slivers(self): - return NITOSv1Node.get_nodes_with_slivers(self.xml) - - def add_nodes(self, nodes, network=None, no_dupes=False, rspec_content_type=None): - NITOSv1Node.add_nodes(self.xml, nodes, rspec_content_type) - - def merge_node(self, source_node_tag, network, no_dupes=False): - if no_dupes and self.get_node_element(node['hostname']): - # node already exists - return - - network_tag = self.add_network(network) - network_tag.append(deepcopy(source_node_tag)) - - # Slivers - - def add_slivers(self, hostnames, attributes=None, sliver_urn=None, append=False): - if attributes is None: - attributes = [] - # add slice name to network tag - network_tags = self.xml.xpath('//network') - if network_tags: - network_tag = network_tags[0] - network_tag.set('slice', urn_to_hrn(sliver_urn)[0]) - - # add slivers - sliver = {'name': sliver_urn, - 'pl_tags': attributes} - for hostname in hostnames: - if sliver_urn: - sliver['name'] = sliver_urn - node_elems = self.get_nodes({'component_id': '*%s*' % hostname}) - if not node_elems: - continue - node_elem = node_elems[0] - NITOSv1Sliver.add_slivers(node_elem.element, sliver) - - # remove all nodes without slivers - if not append: - for node_elem in self.get_nodes(): - if not node_elem['slivers']: - parent = node_elem.element.getparent() - parent.remove(node_elem.element) - - def remove_slivers(self, slivers, network=None, no_dupes=False): - NITOSv1Node.remove_slivers(self.xml, slivers) - - def get_slice_attributes(self, network=None): - attributes = [] - nodes_with_slivers = self.get_nodes_with_slivers() - for default_attribute in self.get_default_sliver_attributes(network): - attribute = default_attribute.copy() - attribute['node_id'] = None - attributes.append(attribute) - for node in nodes_with_slivers: - nodename = node['component_name'] - sliver_attributes = self.get_sliver_attributes(nodename, network) - for sliver_attribute in sliver_attributes: - sliver_attribute['node_id'] = nodename - attributes.append(sliver_attribute) - return attributes - - def add_sliver_attribute(self, component_id, name, value, network=None): - nodes = self.get_nodes({'component_id': '*%s*' % component_id}) - if nodes is not None and isinstance(nodes, list) and len(nodes) > 0: - node = nodes[0] - slivers = NITOSv1Sliver.get_slivers(node) - if slivers: - sliver = slivers[0] - NITOSv1Sliver.add_sliver_attribute(sliver, name, value) - else: - # should this be an assert / raise an exception? - logger.error("WARNING: failed to find component_id %s" % - component_id) - - def get_sliver_attributes(self, component_id, network=None): - nodes = self.get_nodes({'component_id': '*%s*' % component_id}) - attribs = [] - if nodes is not None and isinstance(nodes, list) and len(nodes) > 0: - node = nodes[0] - slivers = NITOSv1Sliver.get_slivers(node.element) - if slivers is not None and isinstance(slivers, list) and len(slivers) > 0: - sliver = slivers[0] - attribs = NITOSv1Sliver.get_sliver_attributes(sliver.element) - return attribs - - def remove_sliver_attribute(self, component_id, name, value, network=None): - attribs = self.get_sliver_attributes(component_id) - for attrib in attribs: - if attrib['name'] == name and attrib['value'] == value: - # attrib.element.delete() - parent = attrib.element.getparent() - parent.remove(attrib.element) - - def add_default_sliver_attribute(self, name, value, network=None): - if network: - defaults = self.xml.xpath( - "//network[@name='%s']/sliver_defaults" % network) - else: - defaults = self.xml.xpath("//sliver_defaults") - if not defaults: - if network: - network_tag = self.xml.xpath("//network[@name='%s']" % network) - else: - network_tag = self.xml.xpath("//network") - if isinstance(network_tag, list): - network_tag = network_tag[0] - defaults = network_tag.add_element('sliver_defaults') - elif isinstance(defaults, list): - defaults = defaults[0] - NITOSv1Sliver.add_sliver_attribute(defaults, name, value) - - def get_default_sliver_attributes(self, network=None): - if network: - defaults = self.xml.xpath( - "//network[@name='%s']/sliver_defaults" % network) - else: - defaults = self.xml.xpath("//sliver_defaults") - if not defaults: - return [] - return NITOSv1Sliver.get_sliver_attributes(defaults[0]) - - def remove_default_sliver_attribute(self, name, value, network=None): - attribs = self.get_default_sliver_attributes(network) - for attrib in attribs: - if attrib['name'] == name and attrib['value'] == value: - # attrib.element.delete() - parent = attrib.element.getparent() - parent.remove(attrib.element) - - # Links - - def get_links(self, network=None): - return [] - - def get_link_requests(self): - return [] - - def add_links(self, links): - pass - - def add_link_requests(self, links): - pass - - # utility - - def merge(self, in_rspec): - """ - Merge contents for specified rspec with current rspec - """ - - if not in_rspec: - return - - from sfa.rspecs.rspec import RSpec - if isinstance(in_rspec, RSpec): - rspec = in_rspec - else: - rspec = RSpec(in_rspec) - if rspec.version.type.lower() == 'protogeni': - from sfa.rspecs.rspec_converter import RSpecConverter - in_rspec = RSpecConverter.to_sfa_rspec(rspec.toxml()) - rspec = RSpec(in_rspec) - - # just copy over all networks - current_networks = self.get_networks() - networks = rspec.version.get_networks() - for network in networks: - current_network = network.get('name') - if current_network and current_network not in current_networks: - self.xml.append(network.element) - current_networks.append(current_network) - - # Leases - - def get_leases(self, filter=None): - return NITOSv1Lease.get_leases(self.xml, filter) - - def add_leases(self, leases_channels, network=None, no_dupes=False): - leases, channels = leases_channels - NITOSv1Lease.add_leases(self.xml, leases, channels) - - # Spectrum - - def get_channels(self, filter=None): - return NITOSv1Channel.get_channels(self.xml, filter) - - def add_channels(self, channels, network=None, no_dupes=False): - NITOSv1Channel.add_channels(self.xml, channels) - - -if __name__ == '__main__': - from sfa.rspecs.rspec import RSpec - from sfa.rspecs.rspec_elements import * - r = RSpec('/tmp/resources.rspec') - r.load_rspec_elements(SFAv1.elements) - print(r.get(RSpecElements.NODE)) -- 2.43.0