From: Tony Mack Date: Mon, 26 Jan 2009 23:02:23 +0000 (+0000) Subject: formatting X-Git-Tag: sfa-0.9-0@14641~712 X-Git-Url: http://git.onelab.eu/?a=commitdiff_plain;h=d10c7675a1a98a5cbfc366c78a87e30d52129d40;p=sfa.git formatting --- diff --git a/plc/aggregate.py b/plc/aggregate.py index bc32b0db..78bb9beb 100644 --- a/plc/aggregate.py +++ b/plc/aggregate.py @@ -5,6 +5,7 @@ import time import xmlrpclib from util.geniserver import * +from util.geniclient import * from util.cert import * from util.trustedroot import * from util.excep import * @@ -24,6 +25,7 @@ class Aggregate(GeniServer): timestamp = None threshold = None shell = None + registry = None ## # Create a new aggregate object. @@ -36,311 +38,308 @@ 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 + """ + 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} - 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. - """ - print "refreshing" - # resolve component hostnames - nodes = self.shell.GetNodes(self.auth, {}, ['hostname', 'site_id']) + """ + 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) + # 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 + # 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() + 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. - """ - print "loading components" - # 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() + """ + 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) + 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(",")) + line = line.strip().replace(" ", "").replace("\n", "") + whitelist.extend(line.split(",")) - if os.path.exists(self.blacklist_file): + if os.path.exists(self.blacklist_file): f = open(self.blacklist_file, 'r') lines = f.readlines() f.close() for line in lines: - line = line.strip().replace(" ", "").replace("\n", "") - blacklist.extend(line.split(",")) + 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'} - # rspec['nodespec']['nodes'].append(nodespec) - - 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) + """ + 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 + 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') + # 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) + # 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'] + # 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) + #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] + """ + 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 + 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 this aggregates policy. + """ - return self.policy + return self.policy