From 7f4c3232efc52a09be2504e99d2f8f9e391eb7d7 Mon Sep 17 00:00:00 2001 From: Tony Mack Date: Tue, 27 Jan 2009 01:50:47 +0000 Subject: [PATCH] formatting --- geni/aggregate.py | 489 +++++++++++++++++++++++----------------------- geni/slicemgr.py | 430 ++++++++++++++++++++-------------------- 2 files changed, 459 insertions(+), 460 deletions(-) diff --git a/geni/aggregate.py b/geni/aggregate.py index 78bb9beb..d8982733 100644 --- a/geni/aggregate.py +++ b/geni/aggregate.py @@ -4,14 +4,14 @@ import datetime import time import xmlrpclib -from util.geniserver import * -from util.geniclient import * -from util.cert import * -from util.trustedroot import * -from util.excep import * -from util.misc import * -from util.config import Config -from util.rspec import Rspec +from geni.util.geniserver import * +from geni.util.geniclient import * +from geni.util.cert import * +from geni.util.trustedroot import * +from geni.util.excep import * +from geni.util.misc import * +from geni.util.config import Config +from geni.util.rspec import Rspec class Aggregate(GeniServer): @@ -20,10 +20,10 @@ class Aggregate(GeniServer): components_ttl = None components = [] whitelist_file = None - blacklist_file = None + blacklist_file = None policy = {} timestamp = None - threshold = None + threshold = None shell = None registry = None @@ -37,318 +37,317 @@ class Aggregate(GeniServer): def __init__(self, ip, port, key_file, cert_file, config = "/usr/share/geniwrapper/util/geni_config"): GeniServer.__init__(ip, port, keyfile, cert_file) - - conf = Config(config) + conf = Config(config) basedir = conf.GENI_BASE_DIR + os.sep server_basedir = basedir + os.sep + "plc" + os.sep - self.hrn = conf.GENI_INTERFACE_HRN - self.components_file = os.sep.join([server_basedir, 'components', hrn + '.comp']) - self.whitelist_file = os.sep.join([server_basedir, 'policy', 'whitelist']) - self.blacklist_file = os.sep.join([server_basedir, 'policy', 'blacklist']) - self.timestamp_file = os.sep.join([server_basedir, 'components', hrn + '.timestamp']) - self.components_ttl = components_ttl - self.policy['whitelist'] = [] - self.policy['blacklist'] = [] - self.connectPLC() - self.connectRegistry() + self.hrn = conf.GENI_INTERFACE_HRN + self.components_file = os.sep.join([server_basedir, 'components', hrn + '.comp']) + self.whitelist_file = os.sep.join([server_basedir, 'policy', 'whitelist']) + self.blacklist_file = os.sep.join([server_basedir, 'policy', 'blacklist']) + self.timestamp_file = os.sep.join([server_basedir, 'components', hrn + '.timestamp']) + self.components_ttl = components_ttl + self.policy['whitelist'] = [] + self.policy['blacklist'] = [] + self.connectPLC() + self.connectRegistry() def connectRegistry(self): - """ - Connect to the registry - """ - - + """ + Connect to the registry + """ + pass + def connectPLC(self): - """ - Connect to the plc api interface. First attempt to impor thte shell, if that fails - try to connect to the xmlrpc server. - """ - self.auth = {'Username': conf.GENI_PLC_USER, + """ + Connect to the plc api interface. First attempt to impor thte shell, if that fails + try to connect to the xmlrpc server. + """ + self.auth = {'Username': conf.GENI_PLC_USER, 'AuthMethod': 'password', 'AuthString': conf.GENI_PLC_PASSWORD} - try: - # try to import PLC.Shell directly - sys.path.append(conf.GENI_PLC_SHELL_PATH) - import PLC.Shell - self.shell = PLC.Shell.Shell(globals()) - self.shell.AuthCheck() - except ImportError: + try: + # try to import PLC.Shell directly + sys.path.append(conf.GENI_PLC_SHELL_PATH) + import PLC.Shell + self.shell = PLC.Shell.Shell(globals()) + self.shell.AuthCheck() + except ImportError: # connect to plc api via xmlrpc - plc_host = conf.GENI_PLC_HOST - plc_port = conf.GENI_PLC_PORT - plc_api_path = conf.GENI_PLC_API_PATH - url = "https://%(plc_host)s:%(plc_port)s/%(plc_api_path)s/" % locals() + plc_host = conf.GENI_PLC_HOST + plc_port = conf.GENI_PLC_PORT + plc_api_path = conf.GENI_PLC_API_PATH + url = "https://%(plc_host)s:%(plc_port)s/%(plc_api_path)s/" % locals() self.auth = {'Username': conf.GENI_PLC_USER, - 'AuthMethod': 'password', - 'AuthString': conf.GENI_PLC_PASSWORD} + 'AuthMethod': 'password', + 'AuthString': conf.GENI_PLC_PASSWORD} - self.shell = xmlrpclib.Server(url, verbose = 0, allow_none = True) - self.shell.AuthCheck(self.auth) + self.shell = xmlrpclib.Server(url, verbose = 0, allow_none = True) + self.shell.AuthCheck(self.auth) def hostname_to_hrn(self, login_base, hostname): - """ - Convert hrn to plantelab name. - """ + """ + Convert hrn to plantelab name. + """ genihostname = "_".join(hostname.split(".")) return ".".join([self.hrn, login_base, genihostname]) def slicename_to_hrn(self, slicename): - """ - Convert hrn to planetlab name. - """ + """ + Convert hrn to planetlab name. + """ slicename = slicename.replace("_", ".") return ".".join([self.hrn, slicename]) def refresh_components(self): - """ - Update the cached list of nodes. - """ - # resolve component hostnames - nodes = self.shell.GetNodes(self.auth, {}, ['hostname', 'site_id']) - - # resolve site login_bases - site_ids = [node['site_id'] for node in nodes] - sites = self.shell.GetSites(self.auth, site_ids, ['site_id', 'login_base']) - site_dict = {} - for site in sites: - site_dict[site['site_id']] = site['login_base'] - - # convert plc names to geni hrn - self.components = [self.hostname_to_hrn(site_dict[node['site_id']], node['hostname']) for node in nodes] - - # apply policy. Do not allow nodes found in blacklist, only allow nodes found in whitelist - whitelist_policy = lambda node: node in self.policy['whitelist'] - blacklist_policy = lambda node: node not in self.policy['blacklist'] - - if self.policy['blacklist']: - self.components = blacklist_policy(self.components) - if self.policy['whitelist']: - self.components = whitelist_policy(self.components) - - # update timestamp and threshold - self.timestamp = datetime.datetime.now() - delta = datetime.timedelta(hours=self.components_ttl) - self.threshold = self.timestamp + delta - - f = open(self.components_file, 'w') - f.write(str(self.components)) - f.close() - f = open(self.timestamp_file, 'w') - f.write(str(self.threshold)) - f.close() + """ + Update the cached list of nodes. + """ + # resolve component hostnames + nodes = self.shell.GetNodes(self.auth, {}, ['hostname', 'site_id']) + + # resolve site login_bases + site_ids = [node['site_id'] for node in nodes] + sites = self.shell.GetSites(self.auth, site_ids, ['site_id', 'login_base']) + site_dict = {} + for site in sites: + site_dict[site['site_id']] = site['login_base'] + + # convert plc names to geni hrn + self.components = [self.hostname_to_hrn(site_dict[node['site_id']], node['hostname']) for node in nodes] + + # apply policy. Do not allow nodes found in blacklist, only allow nodes found in whitelist + whitelist_policy = lambda node: node in self.policy['whitelist'] + blacklist_policy = lambda node: node not in self.policy['blacklist'] + + if self.policy['blacklist']: + self.components = blacklist_policy(self.components) + if self.policy['whitelist']: + self.components = whitelist_policy(self.components) + + # update timestamp and threshold + self.timestamp = datetime.datetime.now() + delta = datetime.timedelta(hours=self.components_ttl) + self.threshold = self.timestamp + delta + + f = open(self.components_file, 'w') + f.write(str(self.components)) + f.close() + f = open(self.timestamp_file, 'w') + f.write(str(self.threshold)) + f.close() def load_components(self): - """ - Read cached list of nodes. - """ - # Read component list from cached file - if os.path.exists(self.components_file): - f = open(self.components_file, 'r') - self.components = eval(f.read()) - f.close() - - time_format = "%Y-%m-%d %H:%M:%S" - if os.path.exists(self.timestamp_file): - f = open(self.timestamp_file, 'r') - timestamp = str(f.read()).split(".")[0] - self.timestamp = datetime.datetime.fromtimestamp(time.mktime(time.strptime(timestamp, time_format))) - delta = datetime.timedelta(hours=self.components_ttl) + """ + Read cached list of nodes. + """ + # Read component list from cached file + if os.path.exists(self.components_file): + f = open(self.components_file, 'r') + self.components = eval(f.read()) + f.close() + + time_format = "%Y-%m-%d %H:%M:%S" + if os.path.exists(self.timestamp_file): + f = open(self.timestamp_file, 'r') + timestamp = str(f.read()).split(".")[0] + self.timestamp = datetime.datetime.fromtimestamp(time.mktime(time.strptime(timestamp, time_format))) + delta = datetime.timedelta(hours=self.components_ttl) self.threshold = self.timestamp + delta - f.close() + f.close() def load_policy(self): - """ - Read the list of blacklisted and whitelisted nodes. - """ - whitelist = [] - blacklist = [] - if os.path.exists(self.whitelist_file): + """ + Read the list of blacklisted and whitelisted nodes. + """ + whitelist = [] + blacklist = [] + if os.path.exists(self.whitelist_file): f = open(self.whitelist_file, 'r') - lines = f.readlines() + lines = f.readlines() f.close() - for line in lines: - line = line.strip().replace(" ", "").replace("\n", "") - whitelist.extend(line.split(",")) - - - if os.path.exists(self.blacklist_file): + for line in lines: + line = line.strip().replace(" ", "").replace("\n", "") + whitelist.extend(line.split(",")) + + + if os.path.exists(self.blacklist_file): f = open(self.blacklist_file, 'r') lines = f.readlines() f.close() - for line in lines: + for line in lines: line = line.strip().replace(" ", "").replace("\n", "") blacklist.extend(line.split(",")) - self.policy['whitelist'] = whitelist - self.policy['blacklist'] = blacklist + self.policy['whitelist'] = whitelist + self.policy['blacklist'] = blacklist def get_components(self): - """ - Return a list of components at this aggregate. - """ - # Reload components list - now = datetime.datetime.now() - #self.load_components() - if not self.threshold or not self.timestamp or now > self.threshold: - self.refresh_components() - elif now < self.threshold and not self.components: - self.load_components() - return self.components + """ + Return a list of components at this aggregate. + """ + # Reload components list + now = datetime.datetime.now() + #self.load_components() + if not self.threshold or not self.timestamp or now > self.threshold: + self.refresh_components() + elif now < self.threshold and not self.components: + self.load_components() + return self.components def get_rspec(self, hrn, type): - rspec = Rspec() - rspec['nodespec'] = {'name': self.conf.GENI_INTERFACE_HRN} - rsepc['nodespec']['nodes'] = [] - if type in ['node']: - nodes = self.shell.GetNodes(self.auth) - elif type in ['slice']: - slicename = hrn_to_pl_slicename(hrn) - slices = self.shell.GetSlices(self.auth, [slicename]) - node_ids = slices[0]['node_ids'] - nodes = self.shell.GetNodes(self.auth, node_ids) - for node in nodes: - nodespec = {'name': node['hostname'], 'type': 'std'} - elif type in ['aggregate']: - pass - - return rspec + rspec = Rspec() + rspec['nodespec'] = {'name': self.conf.GENI_INTERFACE_HRN} + rsepc['nodespec']['nodes'] = [] + if type in ['node']: + nodes = self.shell.GetNodes(self.auth) + elif type in ['slice']: + slicename = hrn_to_pl_slicename(hrn) + slices = self.shell.GetSlices(self.auth, [slicename]) + node_ids = slices[0]['node_ids'] + nodes = self.shell.GetNodes(self.auth, node_ids) + for node in nodes: + nodespec = {'name': node['hostname'], 'type': 'std'} + elif type in ['aggregate']: + pass + + return rspec def get_resources(self, slice_hrn): - """ - Return the current rspec for the specified slice. - """ - slicename = hrn_to_plcslicename(slice_hrn) - rspec = self.get_rspec(slicenamem, 'slice') + """ + Return the current rspec for the specified slice. + """ + slicename = hrn_to_plcslicename(slice_hrn) + rspec = self.get_rspec(slicenamem, 'slice') - return rspec + return rspec def create_slice(self, slice_hrn, rspec, attributes = []): - """ - Instantiate the specified slice according to whats defined in the rspec. - """ - slicename = self.hrn_to_plcslicename(slice_hrn) - spec = Rspec(rspec) - nodespecs = spec.getDictsByTagName('NodeSpec') - nodes = [nodespec['name'] for nodespec in nodespecs] - self.shell.AddSliceToNodes(self.auth, slicename, nodes) - for attribute in attributes: - type, value, node, nodegroup = attribute['type'], attribute['value'], attribute['node'], attribute['nodegroup'] - shell.AddSliceAttribute(self.auth, slicename, type, value, node, nodegroup) - - # XX contact the registry to get the list of users on this slice and - # their keys. - #slice_record = self.registry.resolve(slice_hrn) - #person_records = slice_record['users'] - # for person in person_record: - # email = person['email'] - # self.shell.AddPersonToSlice(self.auth, email, slicename) - - - return 1 + """ + Instantiate the specified slice according to whats defined in the rspec. + """ + slicename = self.hrn_to_plcslicename(slice_hrn) + spec = Rspec(rspec) + nodespecs = spec.getDictsByTagName('NodeSpec') + nodes = [nodespec['name'] for nodespec in nodespecs] + self.shell.AddSliceToNodes(self.auth, slicename, nodes) + for attribute in attributes: + type, value, node, nodegroup = attribute['type'], attribute['value'], attribute['node'], attribute['nodegroup'] + shell.AddSliceAttribute(self.auth, slicename, type, value, node, nodegroup) + + # XX contact the registry to get the list of users on this slice and + # their keys. + #slice_record = self.registry.resolve(slice_hrn) + #person_records = slice_record['users'] + # for person in person_record: + # email = person['email'] + # self.shell.AddPersonToSlice(self.auth, email, slicename) + + + return 1 def update_slice(self, slice_hrn, rspec, attributes = []): - """ - Update the specified slice. - """ - # Get slice info - slicename = self.hrn_to_plcslicename(slice_hrn) + """ + Update the specified slice. + """ + # Get slice info + slicename = self.hrn_to_plcslicename(slice_hrn) slices = self.shell.GetSlices(self.auth, [slicename], ['node_ids']) if not slice: raise RecordNotFound(slice_hrn) slice = slices[0] - # find out where this slice is currently running + # find out where this slice is currently running nodes = self.shell.GetNodes(self.auth, slice['node_ids'], ['hostname']) hostnames = [node['hostname'] for node in nodes] - # get netspec details - spec = Rspec(rspec) - nodespecs = spec.getDictsByTagName('NodeSpec') - nodes = [nodespec['name'] for nodespec in nodespecs] - # remove nodes not in rspec - delete_nodes = set(hostnames).difference(nodes) - # add nodes from rspec - added_nodes = set(nodes).difference(hostnames) - + # get netspec details + spec = Rspec(rspec) + nodespecs = spec.getDictsByTagName('NodeSpec') + nodes = [nodespec['name'] for nodespec in nodespecs] + # remove nodes not in rspec + delete_nodes = set(hostnames).difference(nodes) + # add nodes from rspec + added_nodes = set(nodes).difference(hostnames) + shell.AddSliceToNodes(self.auth, slicename, added_nodes) - shell.DeleteSliceFromNodes(self.auth, slicename, deleted_nodes) + shell.DeleteSliceFromNodes(self.auth, slicename, deleted_nodes) for attribute in attributes: type, value, node, nodegroup = attribute['type'], attribute['value'], attribute['node'], attribute['nodegroup'] shell.AddSliceAttribute(self.auth, slicename, type, value, node, nodegroup) - - # contact registry to get slice users and add them to the slice - # slice_record = self.registry.resolve(slice_hrn) - # persons = slice_record['users'] - - #for person in persons: - # shell.AddPersonToSlice(person['email'], slice_name) + + # contact registry to get slice users and add them to the slice + # slice_record = self.registry.resolve(slice_hrn) + # persons = slice_record['users'] + + #for person in persons: + # shell.AddPersonToSlice(person['email'], slice_name) def delete_slice_(self, slice_hrn): - """ - Remove this slice from all components it was previouly associated with and - free up the resources it was using. - """ - slicename = self.hrn_to_plcslicename(slice_hrn) - slices = shell.GetSlices(self.auth, [slicename]) - if not slice: - raise RecordNotFound(slice_hrn) - slice = slices[0] - - shell.DeleteSliceFromNodes(self.auth, slicename, slice['node_ids']) - return 1 + """ + Remove this slice from all components it was previouly associated with and + free up the resources it was using. + """ + slicename = self.hrn_to_plcslicename(slice_hrn) + slices = shell.GetSlices(self.auth, [slicename]) + if not slice: + raise RecordNotFound(slice_hrn) + slice = slices[0] + + shell.DeleteSliceFromNodes(self.auth, slicename, slice['node_ids']) + return 1 def start_slice(self, slice_hrn): - """ - Stop the slice at plc. - """ - slicename = hrn_to_plcslicename(slice_hrn) - slices = self.shell.GetSlices(self.auth, {'name': slicename}, ['slice_id']) - if not slices: - raise RecordNotFound(slice_hrn) - slice_id = slices[0] - atrribtes = self.shell.GetSliceAttributes({'slice_id': slice_id, 'name': 'enabled'}, ['slice_attribute_id']) - attribute_id = attreibutes[0] - self.shell.UpdateSliceAttribute(self.auth, attribute_id, "1" ) - return 1 + """ + Stop the slice at plc. + """ + slicename = hrn_to_plcslicename(slice_hrn) + slices = self.shell.GetSlices(self.auth, {'name': slicename}, ['slice_id']) + if not slices: + raise RecordNotFound(slice_hrn) + slice_id = slices[0] + atrribtes = self.shell.GetSliceAttributes({'slice_id': slice_id, 'name': 'enabled'}, ['slice_attribute_id']) + attribute_id = attreibutes[0] + self.shell.UpdateSliceAttribute(self.auth, attribute_id, "1" ) + return 1 def stop_slice(self, slice_hrn): - """ - Stop the slice at plc - """ - slicename = hrn_to_plcslicename(slice_hrn) - slices = self.shell.GetSlices(self.auth, {'name': slicename}, ['slice_id']) + """ + Stop the slice at plc + """ + slicename = hrn_to_plcslicename(slice_hrn) + slices = self.shell.GetSlices(self.auth, {'name': slicename}, ['slice_id']) if not slices: raise RecordNotFound(slice_hrn) slice_id = slices[0] atrribtes = self.shell.GetSliceAttributes({'slice_id': slice_id, 'name': 'enabled'}, ['slice_attribute_id']) attribute_id = attreibutes[0] - self.shell.UpdateSliceAttribute(self.auth, attribute_id, "0") - return 1 + self.shell.UpdateSliceAttribute(self.auth, attribute_id, "0") + return 1 def reset_slice(self, slice_hrn): - """ - Reset the slice - """ - slicename = self.hrn_to_plcslicename(slice_hrn) - return 1 + """ + Reset the slice + """ + slicename = self.hrn_to_plcslicename(slice_hrn) + return 1 def get_policy(self): - """ - Return this aggregates policy. - """ - - return self.policy - - + """ + Return this aggregates policy. + """ + + return self.policy + + ############################## ## Server methods here for now ############################## def nodes(self): - return self..get_components() + return self.get_components() #def slices(self): # return self.get_slices() @@ -367,7 +366,7 @@ class Aggregate(GeniServer): def update(self, cred, hrn, rspec): self.decode_authentication(cred, 'embed') self.verify_object_belongs_to_me(hrn) - return self.update(hrn) + return self.update(hrn) def delete(self, cred, hrn): self.decode_authentication(cred, 'embed') @@ -403,4 +402,4 @@ class Aggregate(GeniServer): self.server.register_function(self.stop) self.server.register_function(self.reset) self.server.register_function(self.policy) - + diff --git a/geni/slicemgr.py b/geni/slicemgr.py index 0f28d544..8b9e925b 100644 --- a/geni/slicemgr.py +++ b/geni/slicemgr.py @@ -3,13 +3,13 @@ import sys import datetime import time -from util.geniserver import * -from util.geniclient import * -from util.cert import * -from util.trustedroot import * -from util.excep import * -from util.misc import * -from util.config import Config +from geni.util.geniserver import * +from geni.util.geniclient import * +from geni.util.cert import * +from geni.util.trustedroot import * +from geni.util.excep import * +from geni.util.misc import * +from geni.util.config import Config class SliceMgr(GeniServer): @@ -17,16 +17,16 @@ class SliceMgr(GeniServer): key_file = None cert_file = None components_file = None - slices_file = None + slices_file = None components_ttl = None components = [] - slices = [] + slices = [] policy = {} timestamp = None - threshold = None + threshold = None shell = None aggregates = {} - + ## # Create a new slice manager object. @@ -38,133 +38,133 @@ class SliceMgr(GeniServer): def __init__(self, ip, port, key_file, cert_file, config = "/usr/share/geniwrapper/util/geni_config"): GeniServer.__init__(ip, port, key_file, cert_file) - self.key_file = key_file - self.cert_file = cert_file - self.conf = Config(config) + self.key_file = key_file + self.cert_file = cert_file + self.conf = Config(config) basedir = self.conf.GENI_BASE_DIR + os.sep server_basedir = basedir + os.sep + "plc" + os.sep - self.hrn = conf.GENI_INTERFACE_HRN - - # Get list of aggregates this sm talks to - aggregates_file = server_basedir + os.sep + 'aggregates' - self.load_aggregates(aggregates_file) - self.components_file = os.sep.join([server_basedir, 'components', 'slicemgr.' + hrn + '.comp']) - self.slices_file = os.sep.join([server_basedir, 'components', 'slicemgr' + hrn + '.slices']) - self.timestamp_file = os.sep.join([server_basedir, 'components', 'slicemgr' + hrn + '.timestamp']) - self.components_ttl = components_ttl - self.policy['whitelist'] = [] + self.hrn = conf.GENI_INTERFACE_HRN + + # Get list of aggregates this sm talks to + aggregates_file = server_basedir + os.sep + 'aggregates' + self.load_aggregates(aggregates_file) + self.components_file = os.sep.join([server_basedir, 'components', 'slicemgr.' + hrn + '.comp']) + self.slices_file = os.sep.join([server_basedir, 'components', 'slicemgr' + hrn + '.slices']) + self.timestamp_file = os.sep.join([server_basedir, 'components', 'slicemgr' + hrn + '.timestamp']) + self.components_ttl = components_ttl + self.policy['whitelist'] = [] self.policy['blacklist'] = [] - self.connect() + self.connect() def load_aggregates(self, aggregates_file): - """ - Get info about the aggregates available to us from file and create + """ + Get info about the aggregates available to us from file and create an xmlrpc connection to each. If any info is invalid, skip it. - """ - lines = [] + """ + lines = [] try: - f = open(aggregates_file, 'r') - lines = f.readlines() - f.close() - except: raise - - for line in lines: - # Skip comments - if line.strip.startswith("#"): - continue - agg_info = line.split("\t").split(" ") - - # skip invalid info - if len(agg_info) != 3: - continue - - # create xmlrpc connection using GeniClient - hrn, address, port = agg_info[0], agg_info[1], agg_info[2] - url = 'https://%(address)s:%(port)s' % locals() - self.aggregates[hrn] = GeniClient(url, self.key_file, self.cert_file) + f = open(aggregates_file, 'r') + lines = f.readlines() + f.close() + except: raise + + for line in lines: + # Skip comments + if line.strip.startswith("#"): + continue + agg_info = line.split("\t").split(" ") + + # skip invalid info + if len(agg_info) != 3: + continue + + # create xmlrpc connection using GeniClient + hrn, address, port = agg_info[0], agg_info[1], agg_info[2] + url = 'https://%(address)s:%(port)s' % locals() + self.aggregates[hrn] = GeniClient(url, self.key_file, self.cert_file) def item_hrns(self, items): - """ - Take a list of items (components or slices) and return a dictionary where - the key is the authoritative hrn and the value is a list of items at that - hrn. - """ - item_hrns = {} - agg_hrns = self.aggregates.keys() - for agg_hrn in agg_hrns: - item_hrns[agg_hrn] = [] - for item in items: - for agg_hrn in agg_hrns: - if item.startswith(agg_hrn): - item_hrns[agg_hrn] = item - - return item_hrns - + """ + Take a list of items (components or slices) and return a dictionary where + the key is the authoritative hrn and the value is a list of items at that + hrn. + """ + item_hrns = {} + agg_hrns = self.aggregates.keys() + for agg_hrn in agg_hrns: + item_hrns[agg_hrn] = [] + for item in items: + for agg_hrn in agg_hrns: + if item.startswith(agg_hrn): + item_hrns[agg_hrn] = item + + return item_hrns + def hostname_to_hrn(self, login_base, hostname): - """ - Convert hrn to plantelab name. - """ + """ + Convert hrn to plantelab name. + """ genihostname = "_".join(hostname.split(".")) return ".".join([self.hrn, login_base, genihostname]) def slicename_to_hrn(self, slicename): - """ - Convert hrn to planetlab name. - """ + """ + Convert hrn to planetlab name. + """ slicename = slicename.replace("_", ".") return ".".join([self.hrn, slicename]) def refresh_components(self): - """ - Update the cached list of nodes. - """ - print "refreshing" - - aggregates = self.aggregates.keys() - all_nodes = [] - all_slices = [] - for aggregate in aggregates: - try: - # resolve components hostnames - nodes = self.aggregates[aggregate].get_components() - all_nodes.extend(nodes) - # update timestamp and threshold - self.timestamp = datetime.datetime.now() - delta = datetime.timedelta(hours=self.components_ttl) - self.threshold = self.timestamp + delta - except: - # XX print out to some error log - pass + """ + Update the cached list of nodes. + """ + print "refreshing" + + aggregates = self.aggregates.keys() + all_nodes = [] + all_slices = [] + for aggregate in aggregates: + try: + # resolve components hostnames + nodes = self.aggregates[aggregate].get_components() + all_nodes.extend(nodes) + # update timestamp and threshold + self.timestamp = datetime.datetime.now() + delta = datetime.timedelta(hours=self.components_ttl) + self.threshold = self.timestamp + delta + except: + # XX print out to some error log + pass - self.components = all_nodes - f = open(self.components_file, 'w') - f.write(str(self.components)) - f.close() - f = open(self.timestamp_file, 'w') - f.write(str(self.threshold)) - f.close() + self.components = all_nodes + f = open(self.components_file, 'w') + f.write(str(self.components)) + f.close() + f = open(self.timestamp_file, 'w') + f.write(str(self.threshold)) + f.close() def load_components(self): - """ - Read cached list of nodes and slices. - """ - print "loading nodes" - # Read component list from cached file - if os.path.exists(self.components_file): - f = open(self.components_file, 'r') - self.components = eval(f.read()) - f.close() - - time_format = "%Y-%m-%d %H:%M:%S" - if os.path.exists(self.timestamp_file): - f = open(self.timestamp_file, 'r') - timestamp = str(f.read()).split(".")[0] - self.timestamp = datetime.datetime.fromtimestamp(time.mktime(time.strptime(timestamp, time_format))) - delta = datetime.timedelta(hours=self.components_ttl) + """ + Read cached list of nodes and slices. + """ + print "loading nodes" + # Read component list from cached file + if os.path.exists(self.components_file): + f = open(self.components_file, 'r') + self.components = eval(f.read()) + f.close() + + time_format = "%Y-%m-%d %H:%M:%S" + if os.path.exists(self.timestamp_file): + f = open(self.timestamp_file, 'r') + timestamp = str(f.read()).split(".")[0] + self.timestamp = datetime.datetime.fromtimestamp(time.mktime(time.strptime(timestamp, time_format))) + delta = datetime.timedelta(hours=self.components_ttl) self.threshold = self.timestamp + delta - f.close() + f.close() def load_policy(self): """ @@ -193,14 +193,14 @@ class SliceMgr(GeniServer): self.policy['blacklist'] = blacklist def load_slices(self): - """ - Read current slice instantiation states. - """ - print "loading slices" - if os.path.exists(self.slices_file): + """ + Read current slice instantiation states. + """ + print "loading slices" + if os.path.exists(self.slices_file): f = open(self.components_file, 'r') self.slices = eval(f.read()) - f.close() + f.close() def write_slices(self): """ @@ -213,127 +213,127 @@ class SliceMgr(GeniServer): def get_components(self): - """ - Return a list of components managed by this slice manager. - """ - # Reload components list - now = datetime.datetime.now() - #self.load_components() - if not self.threshold or not self.timestamp or now > self.threshold: - self.refresh_components() - elif now < self.threshold and not self.components: - self.load_components() - return self.components + """ + Return a list of components managed by this slice manager. + """ + # Reload components list + now = datetime.datetime.now() + #self.load_components() + if not self.threshold or not self.timestamp or now > self.threshold: + self.refresh_components() + elif now < self.threshold and not self.components: + self.load_components() + return self.components def get_slices(self): - """ - Return a list of instnatiated managed by this slice manager. - """ - now = datetime.datetime.now() - #self.load_components() - if not self.threshold or not self.timestamp or now > self.threshold: - self.refresh_components() - elif now < self.threshold and not self.slices: - self.load_components() - return self.slices + """ + Return a list of instnatiated managed by this slice manager. + """ + now = datetime.datetime.now() + #self.load_components() + if not self.threshold or not self.timestamp or now > self.threshold: + self.refresh_components() + elif now < self.threshold and not self.slices: + self.load_components() + return self.slices def get_slivers(self, hrn): - """ - Return the list of slices instantiated at the specified component. - """ + """ + Return the list of slices instantiated at the specified component. + """ - # hrn is assumed to be a component hrn - if hrn not in self.slices: - raise RecordNotFound(hrn) - - return self.slices[hrn] + # hrn is assumed to be a component hrn + if hrn not in self.slices: + raise RecordNotFound(hrn) + + return self.slices[hrn] def get_rspec(self, hrn, type): - #rspec = Rspec() - if type in ['node']: - nodes = self.shell.GetNodes(self.auth) - elif type in ['slice']: - slices = self.shell.GetSlices(self.auth) - elif type in ['aggregate']: - pass + #rspec = Rspec() + if type in ['node']: + nodes = self.shell.GetNodes(self.auth) + elif type in ['slice']: + slices = self.shell.GetSlices(self.auth) + elif type in ['aggregate']: + pass def get_resources(self, slice_hrn): - """ - Return the current rspec for the specified slice. - """ - slicename = hrn_to_plcslicename(slice_hrn) - rspec = self.get_rspec(slicenamem, 'slice' ) + """ + Return the current rspec for the specified slice. + """ + slicename = hrn_to_plcslicename(slice_hrn) + rspec = self.get_rspec(slicenamem, 'slice' ) - return rspec + return rspec def create_slice(self, slice_hrn, rspec, attributes): - """ - Instantiate the specified slice according to whats defined in the rspec. - """ - slicename = self.hrn_to_plcslicename(slice_hrn) - #spec = Rspec(rspec) - node_hrns = [] - #for netspec in spec['networks]: - # networkname = netspec['name'] - # nodespec = spec['networks']['nodes'] - # nodes = [nspec['name'] for nspec in nodespec] - # node_hrns = [networkname + node for node in nodes] - # - self.db.AddSliceToNodes(slice_hrn, node_hrns) - return 1 - + """ + Instantiate the specified slice according to whats defined in the rspec. + """ + slicename = self.hrn_to_plcslicename(slice_hrn) + #spec = Rspec(rspec) + node_hrns = [] + #for netspec in spec['networks]: + # networkname = netspec['name'] + # nodespec = spec['networks']['nodes'] + # nodes = [nspec['name'] for nspec in nodespec] + # node_hrns = [networkname + node for node in nodes] + # + self.db.AddSliceToNodes(slice_hrn, node_hrns) + return 1 + def delete_slice_(self, slice_hrn): - """ - Remove this slice from all components it was previouly associated with and - free up the resources it was using. - """ - self.db.DeleteSliceFromNodes(self.auth, slicename, self.components) - return 1 + """ + Remove this slice from all components it was previouly associated with and + free up the resources it was using. + """ + self.db.DeleteSliceFromNodes(self.auth, slicename, self.components) + return 1 def start_slice(self, slice_hrn): - """ - Stop the slice at plc. - """ - slicename = hrn_to_plcslicename(slice_hrn) - slices = self.shell.GetSlices(self.auth, {'name': slicename}, ['slice_id']) - if not slices: - raise RecordNotFound(slice_hrn) - slice_id = slices[0] - atrribtes = self.shell.GetSliceAttributes({'slice_id': slice_id, 'name': 'enabled'}, ['slice_attribute_id']) - attribute_id = attreibutes[0] - self.shell.UpdateSliceAttribute(self.auth, attribute_id, "1" ) - return 1 + """ + Stop the slice at plc. + """ + slicename = hrn_to_plcslicename(slice_hrn) + slices = self.shell.GetSlices(self.auth, {'name': slicename}, ['slice_id']) + if not slices: + raise RecordNotFound(slice_hrn) + slice_id = slices[0] + atrribtes = self.shell.GetSliceAttributes({'slice_id': slice_id, 'name': 'enabled'}, ['slice_attribute_id']) + attribute_id = attreibutes[0] + self.shell.UpdateSliceAttribute(self.auth, attribute_id, "1" ) + return 1 def stop_slice(self, slice_hrn): - """ - Stop the slice at plc - """ - slicename = hrn_to_plcslicename(slice_hrn) - slices = self.shell.GetSlices(self.auth, {'name': slicename}, ['slice_id']) + """ + Stop the slice at plc + """ + slicename = hrn_to_plcslicename(slice_hrn) + slices = self.shell.GetSlices(self.auth, {'name': slicename}, ['slice_id']) if not slices: raise RecordNotFound(slice_hrn) slice_id = slices[0] atrribtes = self.shell.GetSliceAttributes({'slice_id': slice_id, 'name': 'enabled'}, ['slice_attribute_id']) attribute_id = attreibutes[0] - self.shell.UpdateSliceAttribute(self.auth, attribute_id, "0") - return 1 + self.shell.UpdateSliceAttribute(self.auth, attribute_id, "0") + return 1 def reset_slice(self, slice_hrn): - """ - Reset the slice - """ - slicename = self.hrn_to_plcslicename(slice_hrn) - return 1 + """ + Reset the slice + """ + slicename = self.hrn_to_plcslicename(slice_hrn) + return 1 def get_policy(self): - """ - Return the policy of this slice manager. - """ - - return self.policy - - + """ + Return the policy of this slice manager. + """ + + return self.policy + + ############################## ## Server methods here for now @@ -390,4 +390,4 @@ class SliceMgr(GeniServer): self.server.register_function(self.stop) self.server.register_function(self.reset) self.server.register_function(self.policy) - + -- 2.47.0