def __init__(self): self._session = None self.log = KeyAdapter("ConfigDB", logging.getLogger("foam")) self._updateFuncs = {None: self._writeThrough} self._cfgItemsByKey = {} self._cfgItemsByID = {} self._attributesByID = {} self._attributesByName = {} self._usersByID = {} self._usersByName = {} self._rolesByID = {} self._rolesByName = {} if not os.path.exists(CONFIGDB_PATH): self.__initDBCore() self.importing = False
def __init__(self): self.session = scoped_session( sessionmaker(autocommit=False, autoflush=False, bind=engine, expire_on_commit=False)) self.log = KeyAdapter("GeniDB", logging.getLogger("foam")) if not os.path.exists(DB_PATH): self.__initDB()
def __init__(self, log): super(AMLegExpAPI, self).__init__("legacyexpedientapi", log) self._actionLog = KeyAdapter("expedient", logging.getLogger('legexpapi-actions')) #retrieve updated dict as a json file from foam db folder filedir = './opt/ofelia/ofam/local/db' filename = os.path.join(filedir, 'expedient_slices_info.json') if os.path.isfile(filename): f = open(filename, 'r') self.slice_info_dict = json.load(f) f.close() else: self.slice_info_dict = {} #if ConfigDB.getConfigItemByKey("flowvisor.hostname").getValue() is None: self.switch_dpid_list = None self.link_list = None self.callback_http_attr_list = [ ] #we have multiple expedients communicating with foam! self.callback_cred_attr_list = [ ] #we have multiple expedients communicating with foam!
class Dispatcher(object): def __init__ (self, key, logger, app): self._log = KeyAdapter(key, logger) self._app = app for k in dir(self): try: val = getattr(self, k) (path, methods) = val.route except TypeError: continue except AttributeError: continue try: app.add_url_rule(path, path.replace("/", "_"), val, methods=methods) self._log.debug("Added route for: %s with method <%s>" % (path, k)) except Exception, e: self._log.exception("Adding URL Rule") continue
def __init__(self, key, logger, app): self._log = KeyAdapter(key, logger) self._app = app for k in dir(self): try: val = getattr(self, k) (path, methods) = val.route except TypeError: continue except AttributeError: continue try: app.add_url_rule(path, path.replace("/", "_"), val, methods=methods) self._log.debug("Added route for: %s with method <%s>" % (path, k)) except Exception, e: self._log.exception("Adding URL Rule") continue
def __init__ (self, log): super(AMLegExpAPI, self).__init__("legacyexpedientapi", log) self._actionLog = KeyAdapter("expedient", logging.getLogger('legexpapi-actions')) #retrieve updated dict as a json file from foam db folder filedir = './opt/ofelia/ofam/local/db' filename = os.path.join(filedir, 'expedient_slices_info.json') if os.path.isfile(filename): f = open(filename, 'r') self.slice_info_dict = json.load(f) f.close() else: self.slice_info_dict = {} #if ConfigDB.getConfigItemByKey("flowvisor.hostname").getValue() is None: self.switch_dpid_list = None self.link_list = None self.callback_http_attr_list = [] #we have multiple expedients communicating with foam! self.callback_cred_attr_list = [] #we have multiple expedients communicating with foam!
def __init__(self, log): super(SfaApi, self).__init__("sfaapi", log) self._actionLog = KeyAdapter("expedient-sfa", logging.getLogger("sfaapi-actions")) # retrieve updated dict as a json file from foam db folder filedir = "./opt/ofelia/ofam/local/db" filename = os.path.join(filedir, "expedient_slices_info.json") if os.path.isfile(filename): f = open(filename, "r") self.slice_info_dict = json.load(f) f.close() else: self.slice_info_dict = {} # if ConfigDB.getConfigItemByKey("flowvisor.hostname").getValue() is None: self.switch_dpid_list = None self.link_list = None self.callback_http_attr_list = [] # we have multiple expedients communicating with foam! self.callback_cred_attr_list = [] # we have multiple expedients communicating with foam! self.driver = OFSfaDriver() self.pm = PermissionManager()
class Dispatcher(object): def __init__ (self, key, log): self._key = key self._log = KeyAdapter(key, log) def _dispatch (self, method, params): self._log.info("Called: <%s>" % (method)) if XMLRPC_LOGPARAMS: self._log.debug("Parameters: <%s>" % (str(params))) try: meth = getattr(self, "pub_%s" % (method)) except AttributeError, e: self._log.warning("Client called unknown method: <%s>" % (method)) try: return meth(*params) except Exception, e: if not hasattr(e, "_foam_logged"): self._log.exception("Call to known method <%s> failed!" % (method)) raise Exception(str(e))
class Dispatcher(object): def __init__(self, key, log): self._key = key self._log = KeyAdapter(key, log) def _dispatch(self, method, params): self._log.info("Called: <%s>" % (method)) if XMLRPC_LOGPARAMS: self._log.debug("Parameters: <%s>" % (str(params))) try: meth = getattr(self, "pub_%s" % (method)) except AttributeError, e: self._log.warning("Client called unknown method: <%s>" % (method)) try: return meth(*params) except Exception, e: if not hasattr(e, "_foam_logged"): self._log.exception("Call to known method <%s> failed!" % (method)) raise Exception(str(e))
def __init__ (self, log): super(AMAPIv2, self).__init__("GAPIv2", log) self._actionLog = KeyAdapter("v2", logging.getLogger('gapi-actions')) #self._auto_priority = ConfigDB.getConfigItemByKey("geni.auto-sliver-priority").getValue() self._auto_priority = AUTO_SLIVER_PRIORITY
class AMAPIv2(foam.api.xmlrpc.Dispatcher): """Implementation of GENI AM API v2""" def __init__ (self, log): super(AMAPIv2, self).__init__("GAPIv2", log) self._actionLog = KeyAdapter("v2", logging.getLogger('gapi-actions')) #self._auto_priority = ConfigDB.getConfigItemByKey("geni.auto-sliver-priority").getValue() self._auto_priority = AUTO_SLIVER_PRIORITY def recordAction (self, action, credentials = [], urn = None): cred_ids = [] self._actionLog.info("Sliver: %s Action: %s" % (urn, action)) for cred in credentials: self._actionLog.info("Credential: %s" % (cred)) def buildPropertyList(self, geni_code, value=None, output=None): """Return XML-RPC struct (aka property list)""" result = {} result["code"] = {'geni_code': geni_code} # Non-zero geni_code implies error: output is required, value is optional if geni_code: result["output"] = output if value: result["value"] = value # Zero geni_code implies success: value is required, output is optional else: result["value"] = value return result def pub_GetVersion (self, options=None): """Return the version of the GENI AM API and RSpecs supported Get static version and configuration information about this aggregate. """ self.recordAction("getversion") url = "https://%s:%s" % (request.environ['SERVER_ADDR'], request.environ['SERVER_PORT']) d = { 'geni_api': '2', 'geni_request_rspec_versions': [ { 'extensions': ['http://www.geni.net/resources/rspec/ext/openflow/3'], 'namespace' : 'http://www.geni.net/resources/rspec/3', 'schema': 'http://www.geni.net/resources/rspec/3/request.xsd', 'type': 'GENI', 'version': '3' } ], 'geni_ad_rspec_versions': [ { 'extensions': [ 'http://www.geni.net/resources/rspec/ext/openflow/3' ], 'namespace': 'http://www.geni.net/resources/rspec/3', 'schema': 'http://www.geni.net/resources/rspec/3/ad.xsd', 'type': 'GENI', 'version': '3' } ], 'geni_api_versions': { '1': url + '/foam/gapi/1', '2': url + '/foam/gapi/2' } } #if ConfigDB.getConfigItemByKey("geni.report-foam-version").getValue(): # d["foam_version"] = foam.version.VERSION #if ConfigDB.getConfigItemByKey("geni.report-site-info").getValue(): # d["site_info"] = self.generateSiteInfo() if GAPI_REPORTFOAMVERSION: d["foam_version"] = foam.version.VERSION d["site_info"] = self.generateSiteInfo() result = self.buildPropertyList(GENI_ERROR_CODE.SUCCESS, value=d) # geni_api is duplicated under value to allow v1 clients to determine the AM API version result["geni_api"] = 2 return result def generateSiteInfo (self): """Generate site's admin, location and description info""" dmap = [("site.admin.name", "admin-name"), ("site.admin.email", "admin-email"), ("site.admin.phone", "admin-phone"), ("site.location.address", "org-address"), ("site.location.organization", "org-name"), ("site.description", "description")] sinfo = {} for ckey, vkey in dmap: val = ConfigDB.getConfigItemByKey(ckey).getValue() if val is not None: sinfo[vkey] = val return sinfo def pub_ListResources (self, credentials, options): """Return information about available resources or resources allocated to a slice List the resources at this aggregate in an RSpec: may be all resources, only those available for reservation, or only those already reserved for the given slice. """ try: CredVerifier.checkValid(credentials, []) # Parse options compressed = options.get("geni_compressed", False) urn = options.get("geni_slice_urn", None) spec_version = options.get("geni_rspec_version") supported_spec = {'version': '3', 'type': 'GENI'} if spec_version: if spec_version != supported_spec: msg = "RSpec type/version not supported" propertyList = self.buildPropertyList(GENI_ERROR_CODE.BADVERSION, output=msg) return propertyList else: msg = "Required option geni_rspec_version missing" propertyList = self.buildPropertyList(GENI_ERROR_CODE.BADARGS, output=msg) return propertyList if urn: CredVerifier.checkValid(credentials, "getsliceresources", urn) self.recordAction("listresources", credentials, urn) sliver_urn = GeniDB.getSliverURN(urn) if sliver_urn is None: raise Exception("Sliver for slice URN (%s) does not exist" % (urn)) else: rspec = GeniDB.getManifest(sliver_urn) else: self.recordAction("listresources", credentials) rspec = foam.geni.lib.getAdvertisement() if compressed: zrspec = zlib.compress(rspec) rspec = base64.b64encode(zrspec) propertyList = self.buildPropertyList(GENI_ERROR_CODE.SUCCESS, value=rspec) except ExpatError: msg = "Error parsing credential strings" propertyList = self.buildPropertyList(GENI_ERROR_CODE.BADARGS, output=msg) self._log.error(msg) except UnknownSlice as x: # Raised by GeniDB.getSliverURN() msg = "Attempt to list resources on sliver for unknown slice %s" % (urn) propertyList = self.buildPropertyList(GENI_ERROR_CODE.ERROR, output=msg) x.log(self._log, msg, logging.INFO) except xmlrpclib.Fault as x: # Something thrown via GCF, we'll presume it was something related to credentials msg = "GCF credential check failure: <%s>" % (x) propertyList = self.buildPropertyList(GENI_ERROR_CODE.ERROR, output=msg) self._log.info(msg) self._log.debug(x, exc_info=True) except AttributeError as x: # New GCF problem with user creds that have no gid_caller, probably msg = "GCF credential check failure: <%s>" % (x) propertyList = self.buildPropertyList(GENI_ERROR_CODE.ERROR, output=msg) self._log.info(msg) self._log.debug(x, exc_info=True) except Exception as e: msg = "Exception: %s" % str(e) propertyList = self.buildPropertyList(GENI_ERROR_CODE.ERROR, output=msg) self._log.exception(msg) finally: return propertyList def pub_CreateSliver (self, slice_urn, credentials, rspec, users, options): """Allocate resources to a slice Reserve the resources described in the given RSpec for the given slice, returning a manifest RSpec of what has been reserved. """ user_info = {} try: if CredVerifier.checkValid(credentials, "createsliver"): self.recordAction("createsliver", credentials, slice_urn) try: cert = Certificate(request.environ['CLIENT_RAW_CERT']) user_info["urn"] = cert.getURN() user_info["email"] = cert.getEmailAddress() self._log.debug("Parsed user cert with URN (%(urn)s) and email (%(email)s)" % user_info) except Exception as e: self._log.exception("UNFILTERED EXCEPTION") user_info["urn"] = None user_info["email"] = None sliver = foam.geni.lib.createSliver(slice_urn, credentials, rspec, user_info) approve = foam.geni.approval.analyzeForApproval(sliver) style = ConfigDB.getConfigItemByKey("geni.approval.approve-on-creation").getValue() if style == foam.geni.approval.NEVER: approve = False elif style == foam.geni.approval.ALWAYS: approve = True if approve: pid = foam.task.approveSliver(sliver.getURN(), self._auto_priority) self._log.debug("task.py launched for approve-sliver (PID: %d)" % pid) data = GeniDB.getSliverData(sliver.getURN(), True) foam.task.emailCreateSliver(data) propertyList = self.buildPropertyList(GENI_ERROR_CODE.SUCCESS, value=GeniDB.getManifest(sliver.getURN())) except foam.geni.lib.RspecParseError as e: msg = str(e) propertyList = self.buildPropertyList(GENI_ERROR_CODE.BADARGS, output=msg) e.log(self._log, msg, logging.INFO) except foam.geni.lib.RspecValidationError as e: msg = str(e) propertyList = self.buildPropertyList(GENI_ERROR_CODE.BADARGS, output=msg) e.log(self._log, msg, logging.INFO) except foam.geni.lib.DuplicateSliver as ds: msg = "Attempt to create multiple slivers for slice [%s]" % (ds.slice_urn) propertyList = self.buildPropertyList(GENI_ERROR_CODE.ERROR, output=msg) ds.log(self._log, msg, logging.INFO) except foam.geni.lib.UnknownComponentManagerID as ucm: msg = "Component Manager ID specified in %s does not match this aggregate." % (ucm.cid) propertyList = self.buildPropertyList(GENI_ERROR_CODE.ERROR, output=msg) ucm.log(self._log, msg, logging.INFO) except (foam.geni.lib.UnmanagedComponent, UnknownNode) as uc: msg = "DPID in component %s is unknown to this aggregate." % (uc.cid) propertyList = self.buildPropertyList(GENI_ERROR_CODE.ERROR, output=msg) uc.log(self._log, msg, logging.INFO) except Exception: msg = "Exception" propertyList = self.buildPropertyList(GENI_ERROR_CODE.ERROR, output=msg) self._log.exception(msg) finally: return propertyList def pub_DeleteSliver (self, slice_urn, credentials, options): """Delete a sliver Stop all the slice's resources and remove the reservation. Returns True or False indicating whether it did this successfully. """ try: if CredVerifier.checkValid(credentials, "deletesliver", slice_urn): self.recordAction("deletesliver", credentials, slice_urn) if GeniDB.getSliverURN(slice_urn) is None: raise UnkownSlice(slice_urn) sliver_urn = GeniDB.getSliverURN(slice_urn) data = GeniDB.getSliverData(sliver_urn, True) foam.geni.lib.deleteSliver(sliver_urn = sliver_urn) foam.task.emailGAPIDeleteSliver(data) propertyList = self.buildPropertyList(GENI_ERROR_CODE.SUCCESS, value=True) except UnknownSlice as e: msg = "Attempt to delete unknown sliver for slice URN %s" % (slice_urn) propertyList = self.buildPropertyList(GENI_ERROR_CODE.SEARCHFAILED, output=msg) e.log(self._log, msg, logging.INFO) except Exception as e: msg = "Exception: %s" % str(e) propertyList = self.buildPropertyList(GENI_ERROR_CODE.ERROR, output=msg) self._log.exception("Exception") finally: return propertyList def pub_SliverStatus (self, slice_urn, credentials, options): """Returns the status of the reservation for this slice at this aggregate""" try: if CredVerifier.checkValid(credentials, "sliverstatus", slice_urn): self.recordAction("sliverstatus", credentials, slice_urn) result = {} sliver_urn = GeniDB.getSliverURN(slice_urn) if not sliver_urn: raise Exception("Sliver for slice URN (%s) does not exist" % (slice_urn)) sdata = GeniDB.getSliverData(sliver_urn, True) status = foam.geni.lib.getSliverStatus(sliver_urn) result["geni_urn"] = sliver_urn result["geni_status"] = status result["geni_resources"] = [{"geni_urn" : sliver_urn, "geni_status": status, "geni_error" : ""}] result["foam_status"] = sdata["status"] result["foam_expires"] = sdata["expiration"] result["foam_pend_reason"] = sdata["pend_reason"] propertyList = self.buildPropertyList(GENI_ERROR_CODE.SUCCESS, value=result) except UnknownSlice as e: msg = "Attempt to get status on unknown sliver for slice %s" % (slice_urn) propertyList = self.buildPropertyList(GENI_ERROR_CODE.SEARCHFAILED, output=msg) e.log(self._log, msg, logging.INFO) except Exception as e: msg = "Exception: %s" % str(e) propertyList = self.buildPropertyList(GENI_ERROR_CODE.ERROR, output=msg) self._log.exception(msg) finally: return propertyList def pub_RenewSliver (self, slice_urn, credentials, exptime, options): """Renew the reservation for resources in this slice""" try: if CredVerifier.checkValid(credentials, "renewsliver", slice_urn): self.recordAction("renewsliver", credentials, slice_urn) creds = CredVerifier.fromStrings(credentials, "renewsliver", slice_urn) sliver_urn = foam.lib.renewSliver(slice_urn, creds, exptime) data = GeniDB.getSliverData(sliver_urn, True) foam.task.emailRenewSliver(data) propertyList = self.buildPropertyList(GENI_ERROR_CODE.SUCCESS, value=True) except foam.lib.BadSliverExpiration as e: msg = "Bad expiration request: %s" % (e.msg) propertyList = self.buildPropertyList(GENI_ERROR_CODE.ERROR, output=msg) e.log(self._log, msg, logging.INFO) except Exception: msg = "Exception" propertyList = self.buildPropertyList(GENI_ERROR_CODE.ERROR, output=msg) self._log.exception("Exception") finally: return propertyList def pub_Shutdown (self, slice_urn, credentials, options): """Perform an emergency shutdown of the resources in a slice at this aggregate""" if CredVerifier.checkValid(credentials, "shutdown", slice_urn): self.recordAction("shutdown", credentials, slice_urn) #foam.lib.shutdown(slice_urn) sliver_urn = GeniDB.getSliverURN(slice_urn) data = GeniDB.getSliverData(sliver_urn, True) foam.geni.lib.deleteSliver(sliver_urn = sliver_urn) return self.buildPropertyList(GENI_ERROR_CODE.SUCCESS, value=True) return self.buildPropertyList(GENI_ERROR_CODE.SUCCESS, value=False)
class SfaApi(foam.api.xmlrpc.Dispatcher): def __init__(self, log): super(SfaApi, self).__init__("sfaapi", log) self._actionLog = KeyAdapter("expedient-sfa", logging.getLogger('sfaapi-actions')) #retrieve updated dict as a json file from foam db folder filedir = './opt/ofelia/ofam/local/db' filename = os.path.join(filedir, 'expedient_slices_info.json') if os.path.isfile(filename): f = open(filename, 'r') self.slice_info_dict = json.load(f) f.close() else: self.slice_info_dict = {} #if ConfigDB.getConfigItemByKey("flowvisor.hostname").getValue() is None: self.switch_dpid_list = None self.link_list = None self.callback_http_attr_list = [ ] #we have multiple expedients communicating with foam! self.callback_cred_attr_list = [ ] #we have multiple expedients communicating with foam! self.driver = OFSfaDriver() self.pm = PermissionManager() def pub_GetVersion(self, api=None, options={}): #FIXME: SFA seems not accept the error GENI structure when exceptions are rised. version = { 'urn': CONFIG.URN, 'hostname': CONFIG.HOSTNAME, 'code_tag': CONFIG.CODE_TAG, 'hrn': CONFIG.HRN, 'testbed': CONFIG.TESTBED, 'geni_api_versions': CONFIG.GENI_API_VERSIONS, 'interface': CONFIG.INTERFACE, 'geni_api': int(CONFIG.GENI_API_VERSION), 'geni_ad_rspec_versions': CONFIG.GENI_AD_RSPEC_VERSIONS, 'code_url': CONFIG.CODE_URL, 'geni_request_rspec_versions': CONFIG.GENI_REQUEST_RSPEC_VERSIONS, 'sfa': int(CONFIG.SFA_VERSION), #F4F required params 'f4f_describe_testbed': CONFIG.DESCRIBE_TESTBED, 'f4f_testbed_homepage': CONFIG.TESTBED_HOMEPAGE, 'f4f_testbed_picture': CONFIG.TESTBED_PICTURE, 'f4f_endorsed_tools': CONFIG.ENDORSED_TOOLS, } return self.buildPropertyList(GENI_ERROR_CODE.SUCCESS, value=version) def pub_ListResources(self, creds=[], options={}): self.pm.check_permissions('ListResources', locals()) slice_xrn = options.get('geni_slice_urn', None) propertyList = None if slice_xrn: xrn = Xrn(slice_xrn, 'slice') slice_urn = xrn.get_urn() slice_leaf = xrn.get_leaf() options['slice'] = slice_leaf else: slice_leaf = None slice_urn = None try: rspec = self.driver.list_resources(slice_urn, slice_leaf, options) if options.has_key( 'geni_compressed') and options['geni_compressed'] == True: rspec = zlib.compress(rspec).encode('base64') propertyList = self.buildPropertyList(GENI_ERROR_CODE.SUCCESS, value=rspec) except ExpatError: msg = "Error parsing credential strings" propertyList = self.buildPropertyList(GENI_ERROR_CODE.BADARGS, output=msg) self._log.error(msg) except UnknownSlice as x: # Raised by GeniDB.getSliverURN() msg = "Attempt to list resources on sliver for unknown slice %s" % ( urn) propertyList = self.buildPropertyList(GENI_ERROR_CODE.ERROR, output=msg) x.log(self._log, msg, logging.INFO) except xmlrpclib.Fault as x: # Something thrown via GCF, we'll presume it was something related to credentials msg = "GCF credential check failure: <%s>" % (x) propertyList = self.buildPropertyList(GENI_ERROR_CODE.ERROR, output=msg) self._log.info(msg) self._log.debug(x, exc_info=True) except AttributeError as x: # New GCF problem with user creds that have no gid_caller, probably msg = "GCF credential check failure: <%s>" % (x) propertyList = self.buildPropertyList(GENI_ERROR_CODE.ERROR, output=msg) self._log.info(msg) self._log.debug(x, exc_info=True) except Exception as e: msg = "Exception: %s" % str(e) propertyList = self.buildPropertyList(GENI_ERROR_CODE.ERROR, output=msg) self._log.exception(msg) self._log.info(propertyList) return propertyList def pub_CreateSliver(self, slice_xrn, creds, rspec, users, options): """Allocate resources to a slice Reserve the resources described in the given RSpec for the given slice, returning a manifest RSpec of what has been reserved. """ try: self.pm.check_permissions('CreateSliver', locals()) except Exception as e: return self.buildPropertyList(GENI_ERROR_CODE.CREDENTIAL_INVALID, output=e) self.recordAction("createsliver", creds, slice_xrn) user_info = {} user_info["urn"] = None user_info["email"] = None request.environ.pop("CLIENT_RAW_CERT", None) sliver = foam.geni.lib.createSliver(slice_xrn, creds, rspec, user_info) try: approve = foam.geni.approval.analyzeForApproval(sliver) style = ConfigDB.getConfigItemByKey( "geni.approval.approve-on-creation").getValue() if style == foam.geni.approval.NEVER: approve = False elif style == foam.geni.approval.ALWAYS: approve = True if approve: pid = foam.task.approveSliver(sliver.getURN(), self._auto_priority) data = GeniDB.getSliverData(sliver.getURN(), True) #foam.task.emailCreateSliver(data) propertyList = self.buildPropertyList(GENI_ERROR_CODE.SUCCESS, value=GeniDB.getManifest( sliver.getURN())) except foam.geni.lib.RspecParseError as e: msg = str(e) self._log.info(e) return msg propertyList = self.buildPropertyList(GENI_ERROR_CODE.BADARGS, output=msg) except foam.geni.lib.RspecValidationError as e: self._log.info(e) msg = str(e) return msg propertyList = self.buildPropertyList(GENI_ERROR_CODE.BADARGS, output=msg) except foam.geni.lib.DuplicateSliver as ds: msg = "Attempt to create multiple slivers for slice [%s]" % ( ds.slice_urn) self._log.info(msg) propertyList = self.buildPropertyList(GENI_ERROR_CODE.ERROR, output=msg) except foam.geni.lib.UnknownComponentManagerID as ucm: msg = "Component Manager ID specified in %s does not match this aggregate." % ( ucm.cid) self._log.info(msg) propertyList = self.buildPropertyList(GENI_ERROR_CODE.ERROR, output=msg) except (foam.geni.lib.UnmanagedComponent, UnknownNode) as uc: msg = "DPID in component %s is unknown to this aggregate." % ( uc.cid) self._log.info(msg) propertyList = self.buildPropertyList(GENI_ERROR_CODE.ERROR, output=msg) except Exception as e: msg = "Exception %s" % str(e) self._log.info(e) propertyList = self.buildPropertyList(GENI_ERROR_CODE.ERROR, output=msg) finally: return propertyList def pub_DeleteSliver(self, xrn, creds, options={}): """Delete a sliver Stop all the slice's resources and remove the reservation. Returns True or False indicating whether it did this successfully. """ try: self.pm.check_permissions('DeleteSliver', locals()) except Exception as e: return self.buildPropertyList(GENI_ERROR_CODE.CREDENTIAL_INVALID, output=e) self._log.info("Is HERE:") try: slivers = GeniDB.getSliverList() self._log.info("Is HERE:") sliver = get_slice_details_from_slivers(slivers, xrn) self._log.info("Deleteing Sliver") self._log.info(sliver["slice_urn"]) data = GeniDB.getSliverData(sliver["sliver_urn"], True) foam.geni.lib.deleteSliver(sliver_urn=sliver["sliver_urn"]) #foam.task.emailGAPIDeleteSliver(data) propertyList = self.buildPropertyList(GENI_ERROR_CODE.SUCCESS, value=True) except UnknownSlice as e: propertyList = self.buildPropertyList(GENI_ERROR_CODE.SEARCHFAILED, output=msg) except Exception as e: msg = "Exception: %s" % str(e) propertyList = self.buildPropertyList(GENI_ERROR_CODE.ERROR, output=msg) finally: return propertyList def pub_RenewSliver(self, slice_xrn=None, creds=[], expiration_time=None, options={}): try: self.pm.check_permissions('Start', locals()) except Exception as e: return self.buildPropertyList(GENI_ERROR_CODE.CREDENTIAL_INVALID, output=e) try: sliver_urn = foam.lib.renewSliver(slice_xrn, creds, expiration_time) data = GeniDB.getSliverData(sliver_xrn, True) #foam.task.emailRenewSliver(data) propertyList = self.buildPropertyList(GENI_ERROR_CODE.SUCCESS, value=True) except foam.lib.BadSliverExpiration as e: msg = "Bad expiration request: %s" % (e.msg) propertyList = self.buildPropertyList(GENI_ERROR_CODE.ERROR, output=msg) e.log(self._log, msg, logging.INFO) except Exception as e: msg = "Exception: %s" % str(e) propertyList = self.buildPropertyList(GENI_ERROR_CODE.ERROR, output=msg) self._log.exception(msg) finally: return propertyList def pub_Start(self, xrn, creds): try: self.pm.check_permissions('Start', locals()) except Exception as e: return self.buildPropertyList(GENI_ERROR_CODE.CREDENTIAL_INVALID, output=e) xrn = Xrn(xrn) slice_urn = xrn.get_urn() slice_leaf = xrn.get_leaf() authority = xrn.get_authority_hrn() return self.buildPropertyList(GENI_ERROR_CODE.SUCCESS, value=True) def pub_Stop(self, xrn, creds): try: self.pm.check_permissions('Start', locals()) except Exception as e: return self.buildPropertyList(GENI_ERROR_CODE.CREDENTIAL_INVALID, output=e) xrn = Xrn(xrn) slice_urn = xrn.get_urn() slice_leaf = xrn.get_leaf() authority = xrn.get_authority_hrn() return self.buildPropertyList(GENI_ERROR_CODE.SUCCESS, value=True) def pub_reset_slice(self, xrn): xrn = Xrn(xrn) slice_urn = xrn.get_urn() slice_leaf = xrn.get_leaf() authority = xrn.get_authority_hrn() return self.buildPropertyList(GENI_ERROR_CODE.SUCCESS, value=True) def pub_GetTicket(self, api, xrn, creds, rspec, users, options): # ticket is dead. raise 'Method GetTicket was deprecated.' def pub_SliverStatus(self, slice_xrn=None, creds=[], options={}): try: self.pm.check_permissions('SliverStatus', locals()) except Exception as e: return self.buildPropertyList(GENI_ERROR_CODE.CREDENTIAL_INVALID, output=e) try: slivers = GeniDB.getSliverList() try: sliver = get_slice_details_from_slivers(slivers, slice_xrn) except: raise Exception("Sliver for slice URN (%s) does not exist" % (slice_xrn)) result = dict() result["slice_urn"] = slice_xrn result["sliver_urn"] = sliver["sliver_urn"] result["status"] = sliver["status"] result["created"] = sliver["creation"] result["description"] = sliver["desc"] result["expires"] = sliver["expiration"] propertyList = self.buildPropertyList(GENI_ERROR_CODE.SUCCESS, value=result) except UnknownSlice as e: msg = "Attempt to get status on unknown sliver for slice %s" % ( slice_xrn) propertyList = self.buildPropertyList(GENI_ERROR_CODE.SEARCHFAILED, output=msg) e.log(self._log, msg, logging.INFO) except Exception as e: msg = "Exception: %s" % str(e) propertyList = self.buildPropertyList(GENI_ERROR_CODE.ERROR, output=msg) self._log.exception(msg) finally: return propertyList def pub_Ping(self, message): return message def buildPropertyList(self, geni_code, value="", output=""): #{'output': '', 'geni_api': 2, 'code': {'am_type': 'sfa', 'geni_code': 0}, 'value': rspec} result = {} result["geni_api"] = 2 result["code"] = {'geni_code': geni_code, "am_type": "sfa"} # Non-zero geni_code implies error: output is required, value is optional if geni_code: result["output"] = output if value: result["value"] = value # Zero geni_code implies success: value is required, output is optional else: result["value"] = value return result def recordAction(self, action, credentials=[], urn=None): cred_ids = [] self._actionLog.info("Sliver: %s LegExpAPI Action: %s" % (urn, action)) for cred in credentials: self._actionLog.info("Credential: %s" % (cred))
class AMAPIv2(foam.api.xmlrpc.Dispatcher): """Implementation of GENI AM API v2""" def __init__(self, log): super(AMAPIv2, self).__init__("GAPIv2", log) self._actionLog = KeyAdapter("v2", logging.getLogger('gapi-actions')) #self._auto_priority = ConfigDB.getConfigItemByKey("geni.auto-sliver-priority").getValue() self._auto_priority = AUTO_SLIVER_PRIORITY def recordAction(self, action, credentials=[], urn=None): cred_ids = [] self._actionLog.info("Sliver: %s Action: %s" % (urn, action)) for cred in credentials: self._actionLog.info("Credential: %s" % (cred)) def buildPropertyList(self, geni_code, value=None, output=None): """Return XML-RPC struct (aka property list)""" result = {} result["code"] = {'geni_code': geni_code} # Non-zero geni_code implies error: output is required, value is optional if geni_code: result["output"] = output if value: result["value"] = value # Zero geni_code implies success: value is required, output is optional else: result["value"] = value return result def pub_GetVersion(self, options=None): """Return the version of the GENI AM API and RSpecs supported Get static version and configuration information about this aggregate. """ self.recordAction("getversion") url = "https://%s:%s" % (request.environ['SERVER_ADDR'], request.environ['SERVER_PORT']) d = { 'geni_api': '2', 'geni_request_rspec_versions': [{ 'extensions': ['http://www.geni.net/resources/rspec/ext/openflow/3'], 'namespace': 'http://www.geni.net/resources/rspec/3', 'schema': 'http://www.geni.net/resources/rspec/3/request.xsd', 'type': 'GENI', 'version': '3' }], 'geni_ad_rspec_versions': [{ 'extensions': ['http://www.geni.net/resources/rspec/ext/openflow/3'], 'namespace': 'http://www.geni.net/resources/rspec/3', 'schema': 'http://www.geni.net/resources/rspec/3/ad.xsd', 'type': 'GENI', 'version': '3' }], 'geni_api_versions': { '1': url + '/foam/gapi/1', '2': url + '/foam/gapi/2' } } #if ConfigDB.getConfigItemByKey("geni.report-foam-version").getValue(): # d["foam_version"] = foam.version.VERSION #if ConfigDB.getConfigItemByKey("geni.report-site-info").getValue(): # d["site_info"] = self.generateSiteInfo() if GAPI_REPORTFOAMVERSION: d["foam_version"] = foam.version.VERSION d["site_info"] = self.generateSiteInfo() result = self.buildPropertyList(GENI_ERROR_CODE.SUCCESS, value=d) # geni_api is duplicated under value to allow v1 clients to determine the AM API version result["geni_api"] = 2 return result def generateSiteInfo(self): """Generate site's admin, location and description info""" dmap = [("site.admin.name", "admin-name"), ("site.admin.email", "admin-email"), ("site.admin.phone", "admin-phone"), ("site.location.address", "org-address"), ("site.location.organization", "org-name"), ("site.description", "description")] sinfo = {} for ckey, vkey in dmap: val = ConfigDB.getConfigItemByKey(ckey).getValue() if val is not None: sinfo[vkey] = val return sinfo def pub_ListResources(self, credentials, options): """Return information about available resources or resources allocated to a slice List the resources at this aggregate in an RSpec: may be all resources, only those available for reservation, or only those already reserved for the given slice. """ try: CredVerifier.checkValid(credentials, []) # Parse options compressed = options.get("geni_compressed", False) urn = options.get("geni_slice_urn", None) spec_version = options.get("geni_rspec_version") supported_spec = {'version': '3', 'type': 'GENI'} if spec_version: if spec_version != supported_spec: msg = "RSpec type/version not supported" propertyList = self.buildPropertyList( GENI_ERROR_CODE.BADVERSION, output=msg) return propertyList else: msg = "Required option geni_rspec_version missing" propertyList = self.buildPropertyList(GENI_ERROR_CODE.BADARGS, output=msg) return propertyList if urn: CredVerifier.checkValid(credentials, "getsliceresources", urn) self.recordAction("listresources", credentials, urn) sliver_urn = GeniDB.getSliverURN(urn) if sliver_urn is None: raise Exception( "Sliver for slice URN (%s) does not exist" % (urn)) else: rspec = GeniDB.getManifest(sliver_urn) else: self.recordAction("listresources", credentials) rspec = foam.geni.lib.getAdvertisement() if compressed: zrspec = zlib.compress(rspec) rspec = base64.b64encode(zrspec) propertyList = self.buildPropertyList(GENI_ERROR_CODE.SUCCESS, value=rspec) except ExpatError: msg = "Error parsing credential strings" propertyList = self.buildPropertyList(GENI_ERROR_CODE.BADARGS, output=msg) self._log.error(msg) except UnknownSlice as x: # Raised by GeniDB.getSliverURN() msg = "Attempt to list resources on sliver for unknown slice %s" % ( urn) propertyList = self.buildPropertyList(GENI_ERROR_CODE.ERROR, output=msg) x.log(self._log, msg, logging.INFO) except xmlrpclib.Fault as x: # Something thrown via GCF, we'll presume it was something related to credentials msg = "GCF credential check failure: <%s>" % (x) propertyList = self.buildPropertyList(GENI_ERROR_CODE.ERROR, output=msg) self._log.info(msg) self._log.debug(x, exc_info=True) except AttributeError as x: # New GCF problem with user creds that have no gid_caller, probably msg = "GCF credential check failure: <%s>" % (x) propertyList = self.buildPropertyList(GENI_ERROR_CODE.ERROR, output=msg) self._log.info(msg) self._log.debug(x, exc_info=True) except Exception as e: msg = "Exception: %s" % str(e) propertyList = self.buildPropertyList(GENI_ERROR_CODE.ERROR, output=msg) self._log.exception(msg) finally: return propertyList def pub_CreateSliver(self, slice_urn, credentials, rspec, users, options): """Allocate resources to a slice Reserve the resources described in the given RSpec for the given slice, returning a manifest RSpec of what has been reserved. """ user_info = {} try: if CredVerifier.checkValid(credentials, "createsliver"): self.recordAction("createsliver", credentials, slice_urn) try: cert = Certificate(request.environ['CLIENT_RAW_CERT']) user_info["urn"] = cert.getURN() user_info["email"] = cert.getEmailAddress() self._log.debug( "Parsed user cert with URN (%(urn)s) and email (%(email)s)" % user_info) except Exception as e: self._log.exception("UNFILTERED EXCEPTION") user_info["urn"] = None user_info["email"] = None sliver = foam.geni.lib.createSliver(slice_urn, credentials, rspec, user_info) approve = foam.geni.approval.analyzeForApproval(sliver) style = ConfigDB.getConfigItemByKey( "geni.approval.approve-on-creation").getValue() if style == foam.geni.approval.NEVER: approve = False elif style == foam.geni.approval.ALWAYS: approve = True if approve: pid = foam.task.approveSliver(sliver.getURN(), self._auto_priority) self._log.debug( "task.py launched for approve-sliver (PID: %d)" % pid) data = GeniDB.getSliverData(sliver.getURN(), True) foam.task.emailCreateSliver(data) propertyList = self.buildPropertyList(GENI_ERROR_CODE.SUCCESS, value=GeniDB.getManifest( sliver.getURN())) except foam.geni.lib.RspecParseError as e: msg = str(e) propertyList = self.buildPropertyList(GENI_ERROR_CODE.BADARGS, output=msg) e.log(self._log, msg, logging.INFO) except foam.geni.lib.RspecValidationError as e: msg = str(e) propertyList = self.buildPropertyList(GENI_ERROR_CODE.BADARGS, output=msg) e.log(self._log, msg, logging.INFO) except foam.geni.lib.DuplicateSliver as ds: msg = "Attempt to create multiple slivers for slice [%s]" % ( ds.slice_urn) propertyList = self.buildPropertyList(GENI_ERROR_CODE.ERROR, output=msg) ds.log(self._log, msg, logging.INFO) except foam.geni.lib.UnknownComponentManagerID as ucm: msg = "Component Manager ID specified in %s does not match this aggregate." % ( ucm.cid) propertyList = self.buildPropertyList(GENI_ERROR_CODE.ERROR, output=msg) ucm.log(self._log, msg, logging.INFO) except (foam.geni.lib.UnmanagedComponent, UnknownNode) as uc: msg = "DPID in component %s is unknown to this aggregate." % ( uc.cid) propertyList = self.buildPropertyList(GENI_ERROR_CODE.ERROR, output=msg) uc.log(self._log, msg, logging.INFO) except Exception: msg = "Exception" propertyList = self.buildPropertyList(GENI_ERROR_CODE.ERROR, output=msg) self._log.exception(msg) finally: return propertyList def pub_DeleteSliver(self, slice_urn, credentials, options): """Delete a sliver Stop all the slice's resources and remove the reservation. Returns True or False indicating whether it did this successfully. """ try: if CredVerifier.checkValid(credentials, "deletesliver", slice_urn): self.recordAction("deletesliver", credentials, slice_urn) if GeniDB.getSliverURN(slice_urn) is None: raise UnkownSlice(slice_urn) sliver_urn = GeniDB.getSliverURN(slice_urn) data = GeniDB.getSliverData(sliver_urn, True) foam.geni.lib.deleteSliver(sliver_urn=sliver_urn) foam.task.emailGAPIDeleteSliver(data) propertyList = self.buildPropertyList(GENI_ERROR_CODE.SUCCESS, value=True) except UnknownSlice as e: msg = "Attempt to delete unknown sliver for slice URN %s" % ( slice_urn) propertyList = self.buildPropertyList(GENI_ERROR_CODE.SEARCHFAILED, output=msg) e.log(self._log, msg, logging.INFO) except Exception as e: msg = "Exception: %s" % str(e) propertyList = self.buildPropertyList(GENI_ERROR_CODE.ERROR, output=msg) self._log.exception("Exception") finally: return propertyList def pub_SliverStatus(self, slice_urn, credentials, options): """Returns the status of the reservation for this slice at this aggregate""" try: if CredVerifier.checkValid(credentials, "sliverstatus", slice_urn): self.recordAction("sliverstatus", credentials, slice_urn) result = {} sliver_urn = GeniDB.getSliverURN(slice_urn) if not sliver_urn: raise Exception( "Sliver for slice URN (%s) does not exist" % (slice_urn)) sdata = GeniDB.getSliverData(sliver_urn, True) status = foam.geni.lib.getSliverStatus(sliver_urn) result["geni_urn"] = sliver_urn result["geni_status"] = status result["geni_resources"] = [{ "geni_urn": sliver_urn, "geni_status": status, "geni_error": "" }] result["foam_status"] = sdata["status"] result["foam_expires"] = sdata["expiration"] result["foam_pend_reason"] = sdata["pend_reason"] propertyList = self.buildPropertyList(GENI_ERROR_CODE.SUCCESS, value=result) except UnknownSlice as e: msg = "Attempt to get status on unknown sliver for slice %s" % ( slice_urn) propertyList = self.buildPropertyList(GENI_ERROR_CODE.SEARCHFAILED, output=msg) e.log(self._log, msg, logging.INFO) except Exception as e: msg = "Exception: %s" % str(e) propertyList = self.buildPropertyList(GENI_ERROR_CODE.ERROR, output=msg) self._log.exception(msg) finally: return propertyList def pub_RenewSliver(self, slice_urn, credentials, exptime, options): """Renew the reservation for resources in this slice""" try: if CredVerifier.checkValid(credentials, "renewsliver", slice_urn): self.recordAction("renewsliver", credentials, slice_urn) creds = CredVerifier.fromStrings(credentials, "renewsliver", slice_urn) sliver_urn = foam.lib.renewSliver(slice_urn, creds, exptime) data = GeniDB.getSliverData(sliver_urn, True) foam.task.emailRenewSliver(data) propertyList = self.buildPropertyList(GENI_ERROR_CODE.SUCCESS, value=True) except foam.lib.BadSliverExpiration as e: msg = "Bad expiration request: %s" % (e.msg) propertyList = self.buildPropertyList(GENI_ERROR_CODE.ERROR, output=msg) e.log(self._log, msg, logging.INFO) except Exception: msg = "Exception" propertyList = self.buildPropertyList(GENI_ERROR_CODE.ERROR, output=msg) self._log.exception("Exception") finally: return propertyList def pub_Shutdown(self, slice_urn, credentials, options): """Perform an emergency shutdown of the resources in a slice at this aggregate""" if CredVerifier.checkValid(credentials, "shutdown", slice_urn): self.recordAction("shutdown", credentials, slice_urn) #foam.lib.shutdown(slice_urn) sliver_urn = GeniDB.getSliverURN(slice_urn) data = GeniDB.getSliverData(sliver_urn, True) foam.geni.lib.deleteSliver(sliver_urn=sliver_urn) return self.buildPropertyList(GENI_ERROR_CODE.SUCCESS, value=True) return self.buildPropertyList(GENI_ERROR_CODE.SUCCESS, value=False)
def __init__ (self, log): super(AMAPIv1, self).__init__("GAPIv1", log) self._actionLog = KeyAdapter("v1", logging.getLogger('gapi-actions'))
class AMAPIv1(foam.api.xmlrpc.Dispatcher): def __init__ (self, log): super(AMAPIv1, self).__init__("GAPIv1", log) self._actionLog = KeyAdapter("v1", logging.getLogger('gapi-actions')) def recordAction (self, action, credentials = [], urn = None): cred_ids = [] self._actionLog.info("Sliver: %s Action: %s" % (urn, action)) for cred in credentials: self._actionLog.info("Credential: %s" % (cred)) def pub_GetVersion (self): self.recordAction("getversion") d = {"geni_api" : 1, "request_rspec_versions" : [ { 'extensions': [ 'http://www.geni.net/resources/rspec/ext/openflow/3', 'http://www.geni.net/resources/rspec/ext/openflow/4', 'http://www.geni.net/resources/rspec/ext/flowvisor/1', ], 'namespace': 'http://www.geni.net/resources/rspec/3', 'schema': 'http://www.geni.net/resources/rspec/3/request.xsd', 'type': 'GENI', 'version': '3'} ], "ad_rspec_versions" : [ { 'extensions': [ 'http://www.geni.net/resources/rspec/ext/openflow/3' ], 'namespace': 'http://www.geni.net/resources/rspec/3', 'schema': 'http://www.geni.net/resources/rspec/3/ad.xsd', 'type': 'GENI', 'version': '3'} ], } if GAPI_REPORTFOAMVERSION: d["foam_version"] = foam.version.VERSION d["site_info"] = self.generateSiteInfo() return d def generateSiteInfo (self): dmap = [("site.admin.name", "admin-name"), ("site.admin.email", "admin-email"), ("site.admin.phone", "admin-phone"), ("site.location.address", "org-address"), ("site.location.organization", "org-name"), ("site.description", "description")] sinfo = {} for ckey, vkey in dmap: val = ConfigDB.getConfigItemByKey(ckey).getValue() if val is not None: sinfo[vkey] = val return sinfo def pub_ListResources (self, credentials, options): try: CredVerifier.checkValid(credentials, []) compressed = options.get("geni_compressed", False) urn = options.get("geni_slice_urn", None) if urn: CredVerifier.checkValid(credentials, "getsliceresources", urn) self.recordAction("listresources", credentials, urn) sliver_urn = GeniDB.getSliverURN(urn) if sliver_urn is None: raise Fault("ListResources", "Sliver for slice URN (%s) does not exist" % (urn)) rspec = GeniDB.getManifest(sliver_urn) else: self.recordAction("listresources", credentials) rspec = foam.geni.lib.getAdvertisement() if compressed: zrspec = zlib.compress(rspec) rspec = base64.b64encode(zrspec) return rspec except ExpatError, e: self._log.error("Error parsing credential strings") e._foam_logged = True raise e except UnknownSlice, x: x.log(self._log, "Attempt to list resources on sliver for unknown slice %s" % (urn), logging.INFO) x._foam_logged = True raise x
class _DB(object): def __init__(self): self._session = None self.log = KeyAdapter("ConfigDB", logging.getLogger("foam")) self._updateFuncs = {None: self._writeThrough} self._cfgItemsByKey = {} self._cfgItemsByID = {} self._attributesByID = {} self._attributesByName = {} self._usersByID = {} self._usersByName = {} self._rolesByID = {} self._rolesByName = {} if not os.path.exists(CONFIGDB_PATH): self.__initDBCore() self.importing = False @property def session(self): if self._session == None: self._session = scoped_session( sessionmaker(autocommit=False, autoflush=False, bind=engine, expire_on_commit=False)) if not self._session.is_active: self.log.warn("Rolling back inactive session") self._session.rollback() return self._session @session.deleter def session(self): self._session.remove() def close(self, sender, **extra): if self._session is not None: self._session.remove() self._session = None def connection(self): return self.session.connection() def commit(self): self.session.commit() def _writeThrough(self, key, newval): self.log.debug("Writing item (%s) with value (%s)" % (key, str(newval))) return newval def __initDBCore(self): self.log.info("No database found: initializing schema") metadata.drop_all() metadata.create_all() self.__addDefaultVars() def __addDefaultVars(self): try: import socket site_tag = None site_tag = socket.getfqdn() except Exception: pass citems = [] citems.append(ConfigItem().setKey("geni.max-lease").setValue( datetime.timedelta(weeks=2)).setDesc("Max sliver lease time"). setUpdateFuncName("foam.geni.lib.updateMaxLease")) citems.append( ConfigItem().setKey("geni.cert-dir").setValue(GENICERTDIR).setDesc( "Directory for trusted SLL root certificates.")) citems.append(ConfigItem().setKey("geni.site-tag").setValue( site_tag).setDesc("Site tag for GENI aggregates (used in URNs)"). setUpdateFuncName("foam.geni.lib.siteTagChange")) citems.append( ConfigItem().setKey("geni.approval.approve-on-creation").setValue( 0).setDesc("Approve slivers on creation.").setUpdateFuncName( "foam.geni.approval.setMode")) citems.append( ConfigItem().setKey("geni.openflow.analysis-engine").setValue( True).setDesc("Run analysis engine for openflow slivers"). setUpdateFuncName("foam.core.configdb.coerceBool")) citems.append(ConfigItem().setKey("geni.openflow.portgroups").setValue( None).setDesc("Internal Portgroups Storage").setUpdateFuncName( "foam.geni.approval.updatePortGroups")) citems.append(ConfigItem().setKey("geni.approval.user-urns").setValue( None).setDesc("Internal User URN Storage").setUpdateFuncName( "foam.geni.approval.updateUserURNs")) citems.append( ConfigItem().setKey("email.admin-addr").setValue(None).setDesc("")) citems.append(ConfigItem().setKey("email.smtp-server").setValue( None).setDesc("")) citems.append( ConfigItem().setKey("email.reply-to").setValue(None).setDesc("")) citems.append( ConfigItem().setKey("email.from").setValue(None).setDesc("")) citems.append(ConfigItem().setKey( "email.event.createsliver.admin").setValue(True).setDesc( "").setUpdateFuncName("foam.core.configdb.coerceBool")) citems.append(ConfigItem().setKey( "email.event.disablesliver.admin").setValue(True).setDesc( "").setUpdateFuncName("foam.core.configdb.coerceBool")) citems.append(ConfigItem().setKey( "email.event.rejectsliver.admin").setValue(True).setDesc( "").setUpdateFuncName("foam.core.configdb.coerceBool")) citems.append(ConfigItem().setKey( "email.event.json-deletesliver.admin").setValue(True).setDesc( "").setUpdateFuncName("foam.core.configdb.coerceBool")) citems.append(ConfigItem().setKey( "email.event.gapi-deletesliver.admin").setValue(True).setDesc( "").setUpdateFuncName("foam.core.configdb.coerceBool")) citems.append( ConfigItem().setKey("email.event.renewsliver.admin").setValue(True) .setDesc("").setUpdateFuncName("foam.core.configdb.coerceBool")) citems.append(ConfigItem().setKey( "email.event.approvesliver.admin").setValue(True).setDesc( "").setUpdateFuncName("foam.core.configdb.coerceBool")) citems.append(ConfigItem().setKey( "email.event.expiresliver.admin").setValue(True).setDesc( "").setUpdateFuncName("foam.core.configdb.coerceBool")) citems.append(ConfigItem().setKey( "email.event.expiresliverday.admin").setValue(True).setDesc( "").setUpdateFuncName("foam.core.configdb.coerceBool")) citems.append(ConfigItem().setKey( "email.event.expiresliverweek.admin").setValue(True).setDesc( "").setUpdateFuncName("foam.core.configdb.coerceBool")) citems.append(ConfigItem().setKey( "email.event.shutdownsliver.admin").setValue(True).setDesc( "").setUpdateFuncName("foam.core.configdb.coerceBool")) citems.append(ConfigItem().setKey( "email.event.pendingqueue.admin").setValue(True).setDesc( "").setUpdateFuncName("foam.core.configdb.coerceBool")) citems.append( ConfigItem().setKey("email.event.createsliver.exp").setValue(True). setDesc("").setUpdateFuncName("foam.core.configdb.coerceBool")) citems.append( ConfigItem().setKey("email.event.disablesliver.exp").setValue(True) .setDesc("").setUpdateFuncName("foam.core.configdb.coerceBool")) citems.append( ConfigItem().setKey("email.event.rejectsliver.exp").setValue(True). setDesc("").setUpdateFuncName("foam.core.configdb.coerceBool")) citems.append(ConfigItem().setKey( "email.event.json-deletesliver.exp").setValue(True).setDesc( "").setUpdateFuncName("foam.core.configdb.coerceBool")) citems.append(ConfigItem().setKey( "email.event.gapi-deletesliver.exp").setValue(True).setDesc( "").setUpdateFuncName("foam.core.configdb.coerceBool")) citems.append( ConfigItem().setKey("email.event.renewsliver.exp").setValue(True). setDesc("").setUpdateFuncName("foam.core.configdb.coerceBool")) citems.append( ConfigItem().setKey("email.event.approvesliver.exp").setValue(True) .setDesc("").setUpdateFuncName("foam.core.configdb.coerceBool")) citems.append( ConfigItem().setKey("email.event.expiresliver.exp").setValue(True). setDesc("").setUpdateFuncName("foam.core.configdb.coerceBool")) citems.append(ConfigItem().setKey( "email.event.expiresliverday.exp").setValue(True).setDesc( "").setUpdateFuncName("foam.core.configdb.coerceBool")) citems.append(ConfigItem().setKey( "email.event.expiresliverweek.exp").setValue(True).setDesc( "").setUpdateFuncName("foam.core.configdb.coerceBool")) citems.append(ConfigItem().setKey( "email.event.shutdownsliver.exp").setValue(True).setDesc( "").setUpdateFuncName("foam.core.configdb.coerceBool")) citems.append( ConfigItem().setKey("site.admin.name").setValue(None).setDesc("")) citems.append( ConfigItem().setKey("site.admin.email").setValue(None).setDesc("")) citems.append( ConfigItem().setKey("site.admin.phone").setValue(None).setDesc("")) citems.append(ConfigItem().setKey("site.location.address").setValue( None).setDesc("")) citems.append(ConfigItem().setKey( "site.location.organization").setValue(None).setDesc("")) citems.append( ConfigItem().setKey("site.description").setValue(None).setDesc("")) citems.append(ConfigItem().setKey("site.attachments").setValue( {}).setDesc("").setUpdateFuncName( "foam.geni.peerdb.updateAttachments")) # citems.append(ConfigItem().setKey().setValue(None) # .setDesc("")) [self.createConfigItem(x) for x in citems] def initDB(self): self.__initDBCore() # Call init_config_db for all plugins def getConfigItemByID(self, cid): return self._cfgItemsByID.setdefault(cid, self.loadConfigItem(cid=cid)) def getConfigItemByKey(self, key): return self._cfgItemsByKey.setdefault(key, self.loadConfigItem(key=key)) def writeValue(self, item, value): u = tconfig.update().where(tconfig.c.id == item.id).values(value=value) conn = self.connection() result = conn.execute(u) self.commit() def updateDefinition(self, item): u = tconfig.update().where(tconfig.c.id == item.id).values( key=self.key, desc=item.desc, updatefunc=item.updatefunc) conn = self.connection() result = conn.execute(u) self.commit() def installConfigItem(self, item): try: oitem = self.getConfigItemByKey(item.key) if item.hasEquivalentDefinition(oitem): return else: oitem.updateDefinition(item) return except UnknownConfigKey, e: self.createConfigItem(item)
def __init__(self, log): super(AMAPIv2, self).__init__("GAPIv2", log) self._actionLog = KeyAdapter("v2", logging.getLogger('gapi-actions')) #self._auto_priority = ConfigDB.getConfigItemByKey("geni.auto-sliver-priority").getValue() self._auto_priority = AUTO_SLIVER_PRIORITY
class of_ApprovalData(object): def __init__ (self, slivers = None): self._log = KeyAdapter("OFELIA Approval", logging.getLogger("foam")) self._initCore() self._build(slivers) def _build (self, slivers): self._loadSlivers(slivers) self._loadPortGroups() self._loadUserURNs() self._buildIValTrees(slivers) def _buildIValTrees(self, slivers): #dl type and NW proto not needed to ne handled by a tree structure MACTree = MACIValTree([]) VLANTree = VLANIValTree([]) IPSubnetTree = IPSubnetIValTree([]) TPPortTree = TPPortIValTree([]) for sliv in slivers: fspecs = sliv.getFlowspecs() for fs in fspecs: #build MAC tree from pool of MACS newInterval = True previntmac = None for mac in sorted(fs.getMACs()): intmac = mac_to_int(mac) if newInterval == True: #new interval encountered MACstart = intmac MACstop = intmac else: if previntmac != None: if (intmac - previntmac) == 1: #still within the interval MACstop = intmac newInterval = False else: #register the interval MACTree.addIVal(MACTree.root, MACstart, MACstop, sliv.getURN()) newInterval = True previntmac = intmac #build VLAN tree from pool of VLANs newInterval = True previntvlanid = None for vlanid in sorted(fs.getVLANs()): intvlanid = int(vlanid) if newInterval == True: #new interval encountered VLANstart = intvlanid VLANstop = intvlanid else: if previntvlanid != None: if (intvlanid - previntvlanid) == 1: #still within the interval VLANstop = intvlanid newInterval = False else: #register the interval VLANTree.addIVal(VLANTree.root, VLANstart, VLANstop, sliv.getURN()) newInterval = True previntvlanid = intvlanid #build IP address tree from pool of IP subnets (first make them intervals) for IPSub in fs.getIPSubnets(): IPSubparsed = self.parseSubnet(IPSub) IPSubLen = IP(IPSubparsed).len() IPstart = int(IP(IPSubparsed[0]).strDec()) IPstop = IPstart + IPSubLen - 1 IPSubnetTree.addIVal(IPSubnetTree.root, IPstart, IPstop, sliv.getURN()) #build TP port tree from pool of TP ports newInterval = True previnttpport = None for tpport in sorted(fs.getTPPorts()): inttpport = int(tpport) if newInterval == True: #new interval encountered TPPortstart = inttpport TPPortstop = inttpport else: if previnttpport != None: if (inttpport - prevtpport) == 1: #still within the interval TPPortstop = tpport newInterval = False else: #register the interval TPPortTree.addIVal(TPPortTree.root, TPPortstart, TPPortstop, sliv.getURN()) newInterval = True previnttpport = inttpport self._macivtree = MACTree self._vlanivtree = VLANTree self._subnetivtree = IPSubnetTree self._tpportivtree = TPPortTree def _initCore (self): self._macs = set() self._macivtree = set() self._ethertypes = set() self._vlans = set() self._vlanivtree = set() self._subnets = set() self._subnetivtree = set() self._nwprotos = set() self._tpports = set() self._tpportivtree = set() self._portgroups = {} self._urns = set() def _loadSlivers (self, slivers): for sliver in slivers: self.addSliver(sliver) def _loadPortGroups (self): groups = ConfigDB.getConfigItemByKey("geni.openflow.portgroups").getValue() if groups is None: return self._portgroups = groups def _updatePGData (self): groups = ConfigDB.getConfigItemByKey("geni.openflow.portgroups").write(self._portgroups) def rebuild (self): self._log.info("Rebuilding approval database") self._initCore() self._build(GeniDB.getSliverList(False, True, True)) def _loadUserURNs (self): urns = ConfigDB.getConfigItemByKey("geni.approval.user-urns").getValue() if urns is None: return for urn in urns: self._urns.add(urn) def createPortGroup (self, name, desc): pg = PortGroup() pg.name = name pg.desc = desc self._portgroups[str(pg.uuid)] = pg self._updatePGData() return pg def getPortGroup (self, pgid): return self._portgroups[pgid] def getPortGroups (self): return self._portgroups def addUserURN (self, urn, user = None): item = ConfigDB.getConfigItemByKey("geni.approval.user-urns") if user: user.assertPrivilege(item.getRWAttrs()) self._urns.add(urn) item.write(self._urns) def removeUserURN (self, urn, user = None): item = ConfigDB.getConfigItemByKey("geni.approval.user-urns") if user: user.assertPrivilege(item.getRWAttrs()) self._urns.discard(urn) item.write(self._urns) def approveUser (self, urn): if urn in self._urns: return True else: return False def parseSubnet (self, netstr): (i,pl) = netstr.split("/") net = IP(i) nm = IP(_prefixlenToNetmask(int(pl), 4)) net.make_net(nm) return net def validateSliver (self, sliver): if not ConfigDB.getConfigItemByKey("geni.openflow.analysis-engine").getValue(): return fspecs = sliver.getFlowspecs() uncovered_fs = [] for fs in fspecs: covered = False if fs.hasVLANs(): #check VLAN clash covered = True newInterval = True previntvlanid = None for vlanid in sorted(fs.getVLANs()): intvlanid = int(vlanid) if newInterval == True: #new interval encountered VLANstart = intvlanid VLANstop = intvlanid else: if previntvlanid != None: if (intvlanid - previntvlanid) == 1: #still within the interval VLANstop = intvlanid newInterval = False else: #find overlap if exists ovList = self._vlanivtree.findOverlapIVal(self._vlanivtree.root, VLANstart, VLANstop, []) if ovList != []: raise IValVLANConflict(VLANstart, VLANstop) newInterval = True previntvlanid = intvlanid #check MAC clash newInterval = True previntmac = None for mac in sorted(fs.getMACs()): covered = True intmac = mac_to_int(mac) if newInterval == True: #new interval encountered MACstart = intmac MACstop = intmac else: if previntmac != None: if (intmac - previntmac) == 1: #still within the interval MACstop = intmac newInterval = False else: #find overlap if exists ovList = self._macivtree.findOverlapIVal(self._macivtree.root, MACstart, MACstop, []) if ovList != []: raise IvalMACConflict(MACstart, MACstop) newInterval = True previntmac = intmac #check dl type clash for dltype in fs.getEtherTypes(): covered = True if dltype == "0x806" or dltype == "0x800": continue if dltype in self._ethertypes: raise EtherTypeConflict(dltype) #check IP subnet clash for IPSub in fs.getIPSubnets(): covered = True IPsubparsed = self.parseSubnet(IPSub) IPSubLen = IP(IPSubparsed).len() IPstart = int(IP(IPSubparsed[0]).strDec()) IPstop = IPstart + IPSubLen - 1 ovList = self._subnetivtree.findOverlapIVal(self._subnetivtree.root, IPstart, IPstop, []) if ovList != []: raise IvalIPSubnetConflict(IP(IPsub)) #check TP port clash newInterval = True previnttpport = None for tpport in sorted(fs.getTPPorts()): covered = True inttpport = int(tpport) if newInterval == True: #new interval encountered TPPortstart = inttpport TPPortstop = inttpport else: if previnttpport != None: if (inttpport - prevtpport) == 1: #still within the interval TPPortstop = tpport newInterval = False else: #find overlap if exists ovList = self._tpportivtree.findOverlapIVal(self._tpportivtree.root, TPPortstart, TPPortstop, []) if ovList != []: raise IvalTPPortConflict(TPPortstart, TPPortstop) newInterval = True previnttpport = inttpport has_dps = False dps = fs.getDatapaths() if not dps: raise NoDatapaths(fs) pl = PortAlyzer(self._portgroups) pl.validate(dps) if not covered: uncovered_fs.append(fs) if uncovered_fs: raise UncoveredFlowspecs(uncovered_fs) def addSliver (self, sliver): fspecs = sliver.getFlowspecs() for fs in fspecs: #add macs old style for mac in fs.getMACs(): self._macs.add(mac) #add intervalized macs (new style) newInterval = True previntmac = None for mac in sorted(fs.getMACs()): intmac = mac_to_int(mac) if newInterval == True: #new interval encountered MACstart = intmac MACstop = intmac else: if previntmac != None: if (intmac - previntmac) == 1: #still within the interval MACstop = intmac newInterval = False else: #register the interval self._macivtree.addIVal(self._macivtree.root, MACstart, MACstop, sliver.getURN()) newInterval = True previntmac = intmac #add dltypes old style for dltype in fs.getEtherTypes(): if ((dltype == "0x806") or (dltype == "0x800")): continue self._ethertypes.add(dltype) #add vlans old style for vlanid in fs.getVLANs(): self._vlans.add(vlanid) #add intervalized vlans (new style) newInterval = True previntvlanid = None for vlanid in sorted(fs.getVLANs()): intvlanid = int(vlanid) if newInterval == True: #new interval encountered VLANstart = intvlanid VLANstop = intvlanid else: if previntvlanid != None: if (intvlanid - previntvlanid) == 1: #still within the interval VLANstop = intvlanid newInterval = False else: #register the interval self._vlanivtree.addIVal(self._vlanivtree.root, VLANstart, VLANstop, sliver.getURN()) newInterval = True previntvlanid = intvlanid #add IP subnets old style for subnet in fs.getIPSubnets(): net = IP(subnet) self._subnets.add(net) #add intervalized IP subnets for IPSub in fs.getIPSubnets(): IPsubparsed = self.parseSubnet(IPSub) IPSubLen = IP(IPSubparsed).len() IPstart = int(IP(IPSubparsed[0]).strDec()) IPstop = IPstart + IPSubLen - 1 self._subnetivtree.addIVal(self._subnetivtree.root, IPstart, IPstop, sliver.getURN()) #add NW protos old style for nwprot in fs.getNWProtos(): self._nwprotos.add(nwprot) #add TP ports old style for tpp in fs.getTPPorts(): self._tpports.add(tpp) #add intervalized TP ports (new style) newInterval = True previnttpport = None for tpport in sorted(fs.getTPPorts()): inttpport = int(tpport) if newInterval == True: #new interval encountered TPPortstart = inttpport TPPortstop = inttpport else: if previnttpport != None: if (inttpport - prevtpport) == 1: #still within the interval TPPortstop = tpport newInterval = False else: #register the interval self._tpportivtree.addIVal(self._tpportivtree.root, TPPortstart, TPPortstop, sliver.getURN()) newInterval = True previnttpport = inttpport def iterMACs (self): for x in self._macs: yield x def iterEthertypes (self): for x in self._ethertypes: yield x def iterVLANs (self): for x in self._vlans: yield x def iterSubnets (self): for x in self._subnets: yield x def iterNWProtos (self): for x in self._nwprotos: yield x def iterTPPorts (self): for x in self._tpports: yield x
def __init__ (self, key, log): self._key = key self._log = KeyAdapter(key, log)
class AMLegExpAPI(foam.api.xmlrpc.Dispatcher): def __init__ (self, log): super(AMLegExpAPI, self).__init__("legacyexpedientapi", log) self._actionLog = KeyAdapter("expedient", logging.getLogger('legexpapi-actions')) #retrieve updated dict as a json file from foam db folder filedir = './opt/ofelia/ofam/local/db' filename = os.path.join(filedir, 'expedient_slices_info.json') if os.path.isfile(filename): f = open(filename, 'r') self.slice_info_dict = json.load(f) f.close() else: self.slice_info_dict = {} #if ConfigDB.getConfigItemByKey("flowvisor.hostname").getValue() is None: self.switch_dpid_list = None self.link_list = None self.callback_http_attr_list = [] #we have multiple expedients communicating with foam! self.callback_cred_attr_list = [] #we have multiple expedients communicating with foam! def recordAction (self, action, credentials = [], urn = None): cred_ids = [] self._actionLog.info("Sliver: %s LegExpAPI Action: %s" % (urn, action)) for cred in credentials: self._actionLog.info("Credential: %s" % (cred)) def priv_CreateSliver(self, slice_urn, credentials, rspec, users, force_approval=False, options=None): #user_info = {} user_info = users try: #if CredVerifier.checkValid(credentials, "createsliver"): if True: self.recordAction("createsliver", credentials, slice_urn) try: #cert = Certificate(request.environ['CLIENT_RAW_CERT']) #user_info["urn"] = cert.getURN() #user_info["email"] = cert.getEmailAddress() self._log.debug("Parsed user cert with URN (%(urn)s) and email (%(email)s)" % users) except Exception, e: self._log.exception("UNFILTERED EXCEPTION") user_info["urn"] = None user_info["email"] = None from foam.app import admin_apih if not admin_apih.vlan_automation_on: sliver = foam.geni.lib.createSliver(slice_urn, credentials, rspec, user_info) style = ConfigDB.getConfigItemByKey("geni.approval.approve-on-creation").getValue() if style == foam.geni.approval.NEVER: approve = False elif style == foam.geni.approval.ALWAYS: approve = True else: approve = foam.geni.ofeliaapproval.of_analyzeForApproval(sliver) if approve or force_approval: pid = foam.task.approveSliver(sliver.getURN(), AUTO_SLIVER_PRIORITY) self._log.debug("task.py launched for approve-sliver (PID: %d)" % pid) else: free_vlan_list = self.pub_get_offered_vlans(1) free_vlan = free_vlan_list[0] slice_id = slice_urn.split("+slice+")[1].split(":")[0].split("id_")[1].split("name_")[0] #filedir = './opt/ofelia/ofam/local/db' #filename = os.path.join(filedir, 'expedient_slices_info.json') #f = open(filename, 'r') #self.slice_info_dict = json.load(f) #f.close() if (slice_id == "") or (slice_id not in self.slice_info_dict): self._log.exception("The slice id you specified is non-existent") raise Exception updated_slice_info_dict = self.slice_info_dict.copy() for sliv_pos, sliver in enumerate(self.slice_info_dict[slice_id]['switch_slivers']): for sfs_pos, sfs in enumerate(sliver['flowspace']): updated_slice_info_dict[slice_id]['switch_slivers'][sliv_pos]['flowspace'][sfs_pos]['vlan_id_start'] = free_vlan updated_slice_info_dict[slice_id]['switch_slivers'][sliv_pos]['flowspace'][sfs_pos]['vlan_id_end'] = free_vlan all_efs = self.create_slice_fs(updated_slice_info_dict[slice_id]['switch_slivers']) new_slice_of_rspec = create_ofv3_rspec(slice_id, updated_slice_info_dict[slice_id]['project_name'], updated_slice_info_dict[slice_id]['project_desc'], \ updated_slice_info_dict[slice_id]['slice_name'], updated_slice_info_dict[slice_id]['slice_desc'], \ updated_slice_info_dict[slice_id]['controller_url'], updated_slice_info_dict[slice_id]['owner_email'], \ updated_slice_info_dict[slice_id]['owner_password'], \ updated_slice_info_dict[slice_id]['switch_slivers'], all_efs) self.slice_info_dict = updated_slice_info_dict.copy() sliver = foam.geni.lib.createSliver(slice_urn, credentials, new_slice_of_rspec, user_info) pid = foam.task.approveSliver(sliver.getURN(), AUTO_SLIVER_PRIORITY) self._log.debug("task.py launched for approve-sliver (PID: %d)" % pid) data = GeniDB.getSliverData(sliver.getURN(), True) foam.task.emailCreateSliver(data) return self.successResult(GeniDB.getManifest(sliver.getURN())) return except foam.geni.lib.RspecParseError, e: self._log.info(str(e)) e._foam_logged = True raise e
class SfaApi(foam.api.xmlrpc.Dispatcher): def __init__(self, log): super(SfaApi, self).__init__("sfaapi", log) self._actionLog = KeyAdapter("expedient-sfa", logging.getLogger("sfaapi-actions")) # retrieve updated dict as a json file from foam db folder filedir = "./opt/ofelia/ofam/local/db" filename = os.path.join(filedir, "expedient_slices_info.json") if os.path.isfile(filename): f = open(filename, "r") self.slice_info_dict = json.load(f) f.close() else: self.slice_info_dict = {} # if ConfigDB.getConfigItemByKey("flowvisor.hostname").getValue() is None: self.switch_dpid_list = None self.link_list = None self.callback_http_attr_list = [] # we have multiple expedients communicating with foam! self.callback_cred_attr_list = [] # we have multiple expedients communicating with foam! self.driver = OFSfaDriver() self.pm = PermissionManager() def pub_GetVersion(self, api=None, options={}): # FIXME: SFA seems not accept the error GENI structure when exceptions are rised. version = { "urn": CONFIG.URN, "hostname": CONFIG.HOSTNAME, "code_tag": CONFIG.CODE_TAG, "hrn": CONFIG.HRN, "testbed": CONFIG.TESTBED, "geni_api_versions": CONFIG.GENI_API_VERSIONS, "interface": CONFIG.INTERFACE, "geni_api": int(CONFIG.GENI_API_VERSION), "geni_ad_rspec_versions": CONFIG.GENI_AD_RSPEC_VERSIONS, "code_url": CONFIG.CODE_URL, "geni_request_rspec_versions": CONFIG.GENI_REQUEST_RSPEC_VERSIONS, "sfa": int(CONFIG.SFA_VERSION), # F4F required params "f4f_describe_testbed": CONFIG.DESCRIBE_TESTBED, "f4f_testbed_homepage": CONFIG.TESTBED_HOMEPAGE, "f4f_testbed_picture": CONFIG.TESTBED_PICTURE, "f4f_endorsed_tools": CONFIG.ENDORSED_TOOLS, } return self.buildPropertyList(GENI_ERROR_CODE.SUCCESS, value=version) def pub_ListResources(self, creds=[], options={}): self.pm.check_permissions("ListResources", locals()) slice_xrn = options.get("geni_slice_urn", None) propertyList = None if slice_xrn: xrn = Xrn(slice_xrn, "slice") slice_urn = xrn.get_urn() slice_leaf = xrn.get_leaf() options["slice"] = slice_leaf else: slice_leaf = None slice_urn = None try: rspec = self.driver.list_resources(slice_urn, slice_leaf, options) if options.has_key("geni_compressed") and options["geni_compressed"] == True: rspec = zlib.compress(rspec).encode("base64") propertyList = self.buildPropertyList(GENI_ERROR_CODE.SUCCESS, value=rspec) except ExpatError: msg = "Error parsing credential strings" propertyList = self.buildPropertyList(GENI_ERROR_CODE.BADARGS, output=msg) self._log.error(msg) except UnknownSlice as x: # Raised by GeniDB.getSliverURN() msg = "Attempt to list resources on sliver for unknown slice %s" % (urn) propertyList = self.buildPropertyList(GENI_ERROR_CODE.ERROR, output=msg) x.log(self._log, msg, logging.INFO) except xmlrpclib.Fault as x: # Something thrown via GCF, we'll presume it was something related to credentials msg = "GCF credential check failure: <%s>" % (x) propertyList = self.buildPropertyList(GENI_ERROR_CODE.ERROR, output=msg) self._log.info(msg) self._log.debug(x, exc_info=True) except AttributeError as x: # New GCF problem with user creds that have no gid_caller, probably msg = "GCF credential check failure: <%s>" % (x) propertyList = self.buildPropertyList(GENI_ERROR_CODE.ERROR, output=msg) self._log.info(msg) self._log.debug(x, exc_info=True) except Exception as e: msg = "Exception: %s" % str(e) propertyList = self.buildPropertyList(GENI_ERROR_CODE.ERROR, output=msg) self._log.exception(msg) self._log.info(propertyList) return propertyList def pub_CreateSliver(self, slice_xrn, creds, rspec, users, options): """Allocate resources to a slice Reserve the resources described in the given RSpec for the given slice, returning a manifest RSpec of what has been reserved. """ try: self.pm.check_permissions("CreateSliver", locals()) except Exception as e: return self.buildPropertyList(GENI_ERROR_CODE.CREDENTIAL_INVALID, output=e) self.recordAction("createsliver", creds, slice_xrn) user_info = {} user_info["urn"] = None user_info["email"] = None request.environ.pop("CLIENT_RAW_CERT", None) sliver = foam.geni.lib.createSliver(slice_xrn, creds, rspec, user_info) try: approve = foam.geni.approval.analyzeForApproval(sliver) style = ConfigDB.getConfigItemByKey("geni.approval.approve-on-creation").getValue() if style == foam.geni.approval.NEVER: approve = False elif style == foam.geni.approval.ALWAYS: approve = True if approve: pid = foam.task.approveSliver(sliver.getURN(), self._auto_priority) data = GeniDB.getSliverData(sliver.getURN(), True) # foam.task.emailCreateSliver(data) propertyList = self.buildPropertyList(GENI_ERROR_CODE.SUCCESS, value=GeniDB.getManifest(sliver.getURN())) except foam.geni.lib.RspecParseError as e: msg = str(e) self._log.info(e) return msg propertyList = self.buildPropertyList(GENI_ERROR_CODE.BADARGS, output=msg) except foam.geni.lib.RspecValidationError as e: self._log.info(e) msg = str(e) return msg propertyList = self.buildPropertyList(GENI_ERROR_CODE.BADARGS, output=msg) except foam.geni.lib.DuplicateSliver as ds: msg = "Attempt to create multiple slivers for slice [%s]" % (ds.slice_urn) self._log.info(msg) propertyList = self.buildPropertyList(GENI_ERROR_CODE.ERROR, output=msg) except foam.geni.lib.UnknownComponentManagerID as ucm: msg = "Component Manager ID specified in %s does not match this aggregate." % (ucm.cid) self._log.info(msg) propertyList = self.buildPropertyList(GENI_ERROR_CODE.ERROR, output=msg) except (foam.geni.lib.UnmanagedComponent, UnknownNode) as uc: msg = "DPID in component %s is unknown to this aggregate." % (uc.cid) self._log.info(msg) propertyList = self.buildPropertyList(GENI_ERROR_CODE.ERROR, output=msg) except Exception as e: msg = "Exception %s" % str(e) self._log.info(e) propertyList = self.buildPropertyList(GENI_ERROR_CODE.ERROR, output=msg) finally: return propertyList def pub_DeleteSliver(self, xrn, creds, options={}): """Delete a sliver Stop all the slice's resources and remove the reservation. Returns True or False indicating whether it did this successfully. """ try: self.pm.check_permissions("DeleteSliver", locals()) except Exception as e: return self.buildPropertyList(GENI_ERROR_CODE.CREDENTIAL_INVALID, output=e) self._log.info("Is HERE:") try: slivers = GeniDB.getSliverList() self._log.info("Is HERE:") sliver = get_slice_details_from_slivers(slivers, xrn) self._log.info("Deleteing Sliver") self._log.info(sliver["slice_urn"]) data = GeniDB.getSliverData(sliver["sliver_urn"], True) foam.geni.lib.deleteSliver(sliver_urn=sliver["sliver_urn"]) # foam.task.emailGAPIDeleteSliver(data) propertyList = self.buildPropertyList(GENI_ERROR_CODE.SUCCESS, value=True) except UnknownSlice as e: propertyList = self.buildPropertyList(GENI_ERROR_CODE.SEARCHFAILED, output=msg) except Exception as e: msg = "Exception: %s" % str(e) propertyList = self.buildPropertyList(GENI_ERROR_CODE.ERROR, output=msg) finally: return propertyList def pub_RenewSliver(self, slice_xrn=None, creds=[], expiration_time=None, options={}): try: self.pm.check_permissions("Start", locals()) except Exception as e: return self.buildPropertyList(GENI_ERROR_CODE.CREDENTIAL_INVALID, output=e) try: sliver_urn = foam.lib.renewSliver(slice_xrn, creds, expiration_time) data = GeniDB.getSliverData(sliver_xrn, True) # foam.task.emailRenewSliver(data) propertyList = self.buildPropertyList(GENI_ERROR_CODE.SUCCESS, value=True) except foam.lib.BadSliverExpiration as e: msg = "Bad expiration request: %s" % (e.msg) propertyList = self.buildPropertyList(GENI_ERROR_CODE.ERROR, output=msg) e.log(self._log, msg, logging.INFO) except Exception as e: msg = "Exception: %s" % str(e) propertyList = self.buildPropertyList(GENI_ERROR_CODE.ERROR, output=msg) self._log.exception(msg) finally: return propertyList def pub_Start(self, xrn, creds): try: self.pm.check_permissions("Start", locals()) except Exception as e: return self.buildPropertyList(GENI_ERROR_CODE.CREDENTIAL_INVALID, output=e) xrn = Xrn(xrn) slice_urn = xrn.get_urn() slice_leaf = xrn.get_leaf() authority = xrn.get_authority_hrn() return self.buildPropertyList(GENI_ERROR_CODE.SUCCESS, value=True) def pub_Stop(self, xrn, creds): try: self.pm.check_permissions("Start", locals()) except Exception as e: return self.buildPropertyList(GENI_ERROR_CODE.CREDENTIAL_INVALID, output=e) xrn = Xrn(xrn) slice_urn = xrn.get_urn() slice_leaf = xrn.get_leaf() authority = xrn.get_authority_hrn() return self.buildPropertyList(GENI_ERROR_CODE.SUCCESS, value=True) def pub_reset_slice(self, xrn): xrn = Xrn(xrn) slice_urn = xrn.get_urn() slice_leaf = xrn.get_leaf() authority = xrn.get_authority_hrn() return self.buildPropertyList(GENI_ERROR_CODE.SUCCESS, value=True) def pub_GetTicket(self, api, xrn, creds, rspec, users, options): # ticket is dead. raise "Method GetTicket was deprecated." def pub_SliverStatus(self, slice_xrn=None, creds=[], options={}): try: self.pm.check_permissions("SliverStatus", locals()) except Exception as e: return self.buildPropertyList(GENI_ERROR_CODE.CREDENTIAL_INVALID, output=e) try: slivers = GeniDB.getSliverList() try: sliver = get_slice_details_from_slivers(slivers, slice_xrn) except: raise Exception("Sliver for slice URN (%s) does not exist" % (slice_xrn)) result = dict() result["slice_urn"] = slice_xrn result["sliver_urn"] = sliver["sliver_urn"] result["status"] = sliver["status"] result["created"] = sliver["creation"] result["description"] = sliver["desc"] result["expires"] = sliver["expiration"] propertyList = self.buildPropertyList(GENI_ERROR_CODE.SUCCESS, value=result) except UnknownSlice as e: msg = "Attempt to get status on unknown sliver for slice %s" % (slice_xrn) propertyList = self.buildPropertyList(GENI_ERROR_CODE.SEARCHFAILED, output=msg) e.log(self._log, msg, logging.INFO) except Exception as e: msg = "Exception: %s" % str(e) propertyList = self.buildPropertyList(GENI_ERROR_CODE.ERROR, output=msg) self._log.exception(msg) finally: return propertyList def pub_Ping(self, message): return message def buildPropertyList(self, geni_code, value="", output=""): # {'output': '', 'geni_api': 2, 'code': {'am_type': 'sfa', 'geni_code': 0}, 'value': rspec} result = {} result["geni_api"] = 2 result["code"] = {"geni_code": geni_code, "am_type": "sfa"} # Non-zero geni_code implies error: output is required, value is optional if geni_code: result["output"] = output if value: result["value"] = value # Zero geni_code implies success: value is required, output is optional else: result["value"] = value return result def recordAction(self, action, credentials=[], urn=None): cred_ids = [] self._actionLog.info("Sliver: %s LegExpAPI Action: %s" % (urn, action)) for cred in credentials: self._actionLog.info("Credential: %s" % (cred))
def __init__(self, slivers=None): self._log = KeyAdapter("OFELIA Approval", logging.getLogger("foam")) self._initCore() self._build(slivers)
class ApprovalData(object): def __init__ (self, slivers = None): self._log = KeyAdapter("GENI Approval", logging.getLogger("foam")) self._initCore() self._build(slivers) def _build (self, slivers): self._loadSlivers(slivers) self._loadPortGroups() self._loadUserURNs() #self._loadAdminVLANs() def _initCore (self): self._subnets = set() self._macs = set() self._ethertypes = set() self._portgroups = {} self._urns = set() #self._vlans = set() #self._admin_vlans = set() #self._shared_vlans = set() def _loadSlivers (self, slivers): for sliver in slivers: self.addSliver(sliver) def _loadPortGroups (self): groups = ConfigDB.getConfigItemByKey("geni.openflow.portgroups").getValue() if groups is None: return self._portgroups = groups def _updatePGData (self): groups = ConfigDB.getConfigItemByKey("geni.openflow.portgroups").write(self._portgroups) def rebuild (self): self._log.info("Rebuilding approval database") self._initCore() self._build(GeniDB.getSliverList(False, True, True)) def _loadUserURNs (self): urns = ConfigDB.getConfigItemByKey("geni.approval.user-urns").getValue() if urns is None: return for urn in urns: self._urns.add(urn) ''' def _loadAdminVLANs (self): vlans = ConfigDB.getConfigItemByKey("geni.approval.admin-vlans").getValue() if vlans is not None: self._admin_vlans = vlans vlans = ConfigDB.getConfigItemByKey("geni.approval.shared-vlans").getValue() if vlans is not None: self._shared_vlans = vlans ''' def createPortGroup (self, name, desc): pg = PortGroup() pg.name = name pg.desc = desc self._portgroups[str(pg.uuid)] = pg self._updatePGData() return pg def getPortGroup (self, pgid): return self._portgroups[pgid] def getPortGroups (self): return self._portgroups def addUserURN (self, urn, user = None): item = ConfigDB.getConfigItemByKey("geni.approval.user-urns") if user: user.assertPrivilege(item.getRWAttrs()) self._urns.add(urn) item.write(self._urns) def removeUserURN (self, urn, user = None): item = ConfigDB.getConfigItemByKey("geni.approval.user-urns") if user: user.assertPrivilege(item.getRWAttrs()) self._urns.discard(urn) item.write(self._urns) ''' def addAdminVLAN (self, vlan, user = None): item = ConfigDB.getConfigItemByKey("geni.approval.admin-vlans") if user: user.assertPrivilege(item.getRWAttrs()) self._admin_vlans.add(vlan) item.write(self._admin_vlans) def removeAdminVLAN (self, vlan, user = None): item = ConfigDB.getConfigItemByKey("geni.approval.admin-vlans") if user: user.assertPrivilege(item.getRWAttrs()) self._admin_vlans.discard(vlan) item.write(self._admin_vlans) def addSharedVLAN (self, vlan, user = None): item = ConfigDB.getConfigItemByKey("geni.approval.shared-vlans") if user: user.assertPrivilege(item.getRWAttrs()) self._shared_vlans.add(vlan) item.write(self._shared_vlans) def removeSharedVLAN (self, vlan, user = None): item = ConfigDB.getConfigItemByKey("geni.approval.shared-vlans") if user: user.assertPrivilege(item.getRWAttrs()) self._shared_vlans.discard(vlan) item.write(self._shared_vlans) ''' def approveUser (self, urn): if urn in self._urns: return True else: return False def parseSubnet (self, netstr): (i,pl) = netstr.split("/") net = IP(i) nm = IP(IPy._prefixlenToNetmask(int(pl), 4)) net = net.make_net(nm) return net def validateSliver (self, sliver): if not ConfigDB.getConfigItemByKey("geni.openflow.analysis-engine").getValue(): return fspecs = sliver.getFlowspecs() uncovered_fs = [] for fs in fspecs: covered = False subnet_covered = False # This must come first - if you request only VLANs which are not shared, you # don't have to pass the rest of the rules checks (in the context of those VLANs) ''' if ConfigDB.getConfigItemByKey("geni.approval.check-vlans").getValue(): vlan_covered = None for vlan in fs.getVLANs(): if vlan in self._vlans: raise VLANConflictError(vlan) if vlan in self._admin_vlans: raise ReservedVLANError(vlan) if vlan in self._shared_vlans: vlan_covered = False elif vlan_covered is None: vlan_covered = True if vlan_covered: continue elif fs.hasVLANs(): raise VLANPresence(fs) ''' for mac in fs.getMACs(): covered = True if mac in self._macs: raise MACConflict(mac) for dltype in fs.getEtherTypes(): covered = True if dltype == "0x806" or dltype == "0x800": continue if dltype in self._ethertypes: raise EtherTypeConflict(dltype) for subnet in fs.getIPSubnets(): covered = True subnet_covered = True net = self.parseSubnet(subnet) if net in self._subnets: raise IPSubnetConflict(net) for onet in self._subnets: if net.overlaps(onet): raise IPSubnetConflict(net) has_dps = False dps = fs.getDatapaths() if not dps: raise NoDatapaths(fs) pl = PortAlyzer(self._portgroups) pl.validate(dps) if fs.hasVLANs(): raise VLANPresence(fs) if not covered: uncovered_fs.append(fs) if uncovered_fs: raise UncoveredFlowspecs(uncovered_fs) def addSliver (self, sliver): fspecs = sliver.getFlowspecs() for fs in fspecs: for mac in fs.getMACs(): self._macs.add(mac) for dltype in fs.getEtherTypes(): if dltype == "0x806" or dltype == "0x800": continue self._ethertypes.add(dltype) for subnet in fs.getIPSubnets(): if subnet is None: self._log.info("Flowspec with None subnets: %s" % (sliver)) continue net = self.parseSubnet(subnet) #net = IP(subnet) self._subnets.add(net) #for vid in fs.getVLANs(): # self._vlans.add(vid) def iterMACs (self): for x in self._macs: yield x def iterEthertypes (self): for x in self._ethertypes: yield x def iterSubnets (self): for x in self._subnets: yield x
def __init__ (self): self._log = KeyAdapter("GENI-TopoDB", logging.getLogger("foam")) self._attachments = ConfigDB.getConfigItemByKey("site.attachments").getValue() self._attachmentsByDPID = {} for k,v in self._attachments.iteritems(): self._attachmentsByDPID.getdefault(v.dpid, []).append(v)
def __init__ (self, slivers = None): self._log = KeyAdapter("OFELIA Approval", logging.getLogger("foam")) self._initCore() self._build(slivers)
class of_ApprovalData(object): def __init__(self, slivers=None): self._log = KeyAdapter("OFELIA Approval", logging.getLogger("foam")) self._initCore() self._build(slivers) def _build(self, slivers): self._loadSlivers(slivers) self._loadPortGroups() self._loadUserURNs() self._buildIValTrees(slivers) def _buildIValTrees( self, slivers ): #dl type and NW proto not needed to ne handled by a tree structure MACTree = MACIValTree([]) VLANTree = VLANIValTree([]) IPSubnetTree = IPSubnetIValTree([]) TPPortTree = TPPortIValTree([]) for sliv in slivers: fspecs = sliv.getFlowspecs() for fs in fspecs: #build MAC tree from pool of MACS newInterval = True previntmac = None for mac in sorted(fs.getMACs()): intmac = mac_to_int(mac) if newInterval == True: #new interval encountered MACstart = intmac MACstop = intmac else: if previntmac != None: if (intmac - previntmac ) == 1: #still within the interval MACstop = intmac newInterval = False else: #register the interval MACTree.addIVal(MACTree.root, MACstart, MACstop, sliv.getURN()) newInterval = True previntmac = intmac #build VLAN tree from pool of VLANs newInterval = True previntvlanid = None for vlanid in sorted(fs.getVLANs()): intvlanid = int(vlanid) if newInterval == True: #new interval encountered VLANstart = intvlanid VLANstop = intvlanid else: if previntvlanid != None: if (intvlanid - previntvlanid ) == 1: #still within the interval VLANstop = intvlanid newInterval = False else: #register the interval VLANTree.addIVal(VLANTree.root, VLANstart, VLANstop, sliv.getURN()) newInterval = True previntvlanid = intvlanid #build IP address tree from pool of IP subnets (first make them intervals) for IPSub in fs.getIPSubnets(): IPSubparsed = self.parseSubnet(IPSub) IPSubLen = IP(IPSubparsed).len() IPstart = int(IP(IPSubparsed[0]).strDec()) IPstop = IPstart + IPSubLen - 1 IPSubnetTree.addIVal(IPSubnetTree.root, IPstart, IPstop, sliv.getURN()) #build TP port tree from pool of TP ports newInterval = True previnttpport = None for tpport in sorted(fs.getTPPorts()): inttpport = int(tpport) if newInterval == True: #new interval encountered TPPortstart = inttpport TPPortstop = inttpport else: if previnttpport != None: if (inttpport - prevtpport ) == 1: #still within the interval TPPortstop = tpport newInterval = False else: #register the interval TPPortTree.addIVal(TPPortTree.root, TPPortstart, TPPortstop, sliv.getURN()) newInterval = True previnttpport = inttpport self._macivtree = MACTree self._vlanivtree = VLANTree self._subnetivtree = IPSubnetTree self._tpportivtree = TPPortTree def _initCore(self): self._macs = set() self._macivtree = set() self._ethertypes = set() self._vlans = set() self._vlanivtree = set() self._subnets = set() self._subnetivtree = set() self._nwprotos = set() self._tpports = set() self._tpportivtree = set() self._portgroups = {} self._urns = set() def _loadSlivers(self, slivers): for sliver in slivers: self.addSliver(sliver) def _loadPortGroups(self): groups = ConfigDB.getConfigItemByKey( "geni.openflow.portgroups").getValue() if groups is None: return self._portgroups = groups def _updatePGData(self): groups = ConfigDB.getConfigItemByKey("geni.openflow.portgroups").write( self._portgroups) def rebuild(self): self._log.info("Rebuilding approval database") self._initCore() self._build(GeniDB.getSliverList(False, True, True)) def _loadUserURNs(self): urns = ConfigDB.getConfigItemByKey( "geni.approval.user-urns").getValue() if urns is None: return for urn in urns: self._urns.add(urn) def createPortGroup(self, name, desc): pg = PortGroup() pg.name = name pg.desc = desc self._portgroups[str(pg.uuid)] = pg self._updatePGData() return pg def getPortGroup(self, pgid): return self._portgroups[pgid] def getPortGroups(self): return self._portgroups def addUserURN(self, urn, user=None): item = ConfigDB.getConfigItemByKey("geni.approval.user-urns") if user: user.assertPrivilege(item.getRWAttrs()) self._urns.add(urn) item.write(self._urns) def removeUserURN(self, urn, user=None): item = ConfigDB.getConfigItemByKey("geni.approval.user-urns") if user: user.assertPrivilege(item.getRWAttrs()) self._urns.discard(urn) item.write(self._urns) def approveUser(self, urn): if urn in self._urns: return True else: return False def parseSubnet(self, netstr): (i, pl) = netstr.split("/") net = IP(i) nm = IP(_prefixlenToNetmask(int(pl), 4)) net.make_net(nm) return net def validateSliver(self, sliver): if not ConfigDB.getConfigItemByKey( "geni.openflow.analysis-engine").getValue(): return fspecs = sliver.getFlowspecs() uncovered_fs = [] for fs in fspecs: covered = False if fs.hasVLANs(): #check VLAN clash covered = True newInterval = True previntvlanid = None for vlanid in sorted(fs.getVLANs()): intvlanid = int(vlanid) if newInterval == True: #new interval encountered VLANstart = intvlanid VLANstop = intvlanid else: if previntvlanid != None: if (intvlanid - previntvlanid ) == 1: #still within the interval VLANstop = intvlanid newInterval = False else: #find overlap if exists ovList = self._vlanivtree.findOverlapIVal( self._vlanivtree.root, VLANstart, VLANstop, []) if ovList != []: raise IValVLANConflict(VLANstart, VLANstop) newInterval = True previntvlanid = intvlanid #check MAC clash newInterval = True previntmac = None for mac in sorted(fs.getMACs()): covered = True intmac = mac_to_int(mac) if newInterval == True: #new interval encountered MACstart = intmac MACstop = intmac else: if previntmac != None: if (intmac - previntmac) == 1: #still within the interval MACstop = intmac newInterval = False else: #find overlap if exists ovList = self._macivtree.findOverlapIVal( self._macivtree.root, MACstart, MACstop, []) if ovList != []: raise IvalMACConflict(MACstart, MACstop) newInterval = True previntmac = intmac #check dl type clash for dltype in fs.getEtherTypes(): covered = True if dltype == "0x806" or dltype == "0x800": continue if dltype in self._ethertypes: raise EtherTypeConflict(dltype) #check IP subnet clash for IPSub in fs.getIPSubnets(): covered = True IPsubparsed = self.parseSubnet(IPSub) IPSubLen = IP(IPSubparsed).len() IPstart = int(IP(IPSubparsed[0]).strDec()) IPstop = IPstart + IPSubLen - 1 ovList = self._subnetivtree.findOverlapIVal( self._subnetivtree.root, IPstart, IPstop, []) if ovList != []: raise IvalIPSubnetConflict(IP(IPsub)) #check TP port clash newInterval = True previnttpport = None for tpport in sorted(fs.getTPPorts()): covered = True inttpport = int(tpport) if newInterval == True: #new interval encountered TPPortstart = inttpport TPPortstop = inttpport else: if previnttpport != None: if (inttpport - prevtpport) == 1: #still within the interval TPPortstop = tpport newInterval = False else: #find overlap if exists ovList = self._tpportivtree.findOverlapIVal( self._tpportivtree.root, TPPortstart, TPPortstop, []) if ovList != []: raise IvalTPPortConflict( TPPortstart, TPPortstop) newInterval = True previnttpport = inttpport has_dps = False dps = fs.getDatapaths() if not dps: raise NoDatapaths(fs) pl = PortAlyzer(self._portgroups) pl.validate(dps) if not covered: uncovered_fs.append(fs) if uncovered_fs: raise UncoveredFlowspecs(uncovered_fs) def addSliver(self, sliver): fspecs = sliver.getFlowspecs() for fs in fspecs: #add macs old style for mac in fs.getMACs(): self._macs.add(mac) #add intervalized macs (new style) newInterval = True previntmac = None for mac in sorted(fs.getMACs()): intmac = mac_to_int(mac) if newInterval == True: #new interval encountered MACstart = intmac MACstop = intmac else: if previntmac != None: if (intmac - previntmac) == 1: #still within the interval MACstop = intmac newInterval = False else: #register the interval self._macivtree.addIVal(self._macivtree.root, MACstart, MACstop, sliver.getURN()) newInterval = True previntmac = intmac #add dltypes old style for dltype in fs.getEtherTypes(): if ((dltype == "0x806") or (dltype == "0x800")): continue self._ethertypes.add(dltype) #add vlans old style for vlanid in fs.getVLANs(): self._vlans.add(vlanid) #add intervalized vlans (new style) newInterval = True previntvlanid = None for vlanid in sorted(fs.getVLANs()): intvlanid = int(vlanid) if newInterval == True: #new interval encountered VLANstart = intvlanid VLANstop = intvlanid else: if previntvlanid != None: if (intvlanid - previntvlanid ) == 1: #still within the interval VLANstop = intvlanid newInterval = False else: #register the interval self._vlanivtree.addIVal( self._vlanivtree.root, VLANstart, VLANstop, sliver.getURN()) newInterval = True previntvlanid = intvlanid #add IP subnets old style for subnet in fs.getIPSubnets(): net = IP(subnet) self._subnets.add(net) #add intervalized IP subnets for IPSub in fs.getIPSubnets(): IPsubparsed = self.parseSubnet(IPSub) IPSubLen = IP(IPSubparsed).len() IPstart = int(IP(IPSubparsed[0]).strDec()) IPstop = IPstart + IPSubLen - 1 self._subnetivtree.addIVal(self._subnetivtree.root, IPstart, IPstop, sliver.getURN()) #add NW protos old style for nwprot in fs.getNWProtos(): self._nwprotos.add(nwprot) #add TP ports old style for tpp in fs.getTPPorts(): self._tpports.add(tpp) #add intervalized TP ports (new style) newInterval = True previnttpport = None for tpport in sorted(fs.getTPPorts()): inttpport = int(tpport) if newInterval == True: #new interval encountered TPPortstart = inttpport TPPortstop = inttpport else: if previnttpport != None: if (inttpport - prevtpport ) == 1: #still within the interval TPPortstop = tpport newInterval = False else: #register the interval self._tpportivtree.addIVal( self._tpportivtree.root, TPPortstart, TPPortstop, sliver.getURN()) newInterval = True previnttpport = inttpport def iterMACs(self): for x in self._macs: yield x def iterEthertypes(self): for x in self._ethertypes: yield x def iterVLANs(self): for x in self._vlans: yield x def iterSubnets(self): for x in self._subnets: yield x def iterNWProtos(self): for x in self._nwprotos: yield x def iterTPPorts(self): for x in self._tpports: yield x
def __init__(self, key, log): self._key = key self._log = KeyAdapter(key, log)
class AMLegExpAPI(foam.api.xmlrpc.Dispatcher): def __init__(self, log): super(AMLegExpAPI, self).__init__("legacyexpedientapi", log) self._actionLog = KeyAdapter("expedient", logging.getLogger('legexpapi-actions')) #retrieve updated dict as a json file from foam db folder filedir = './opt/ofelia/ofam/local/db' filename = os.path.join(filedir, 'expedient_slices_info.json') if os.path.isfile(filename): f = open(filename, 'r') self.slice_info_dict = json.load(f) f.close() else: self.slice_info_dict = {} #if ConfigDB.getConfigItemByKey("flowvisor.hostname").getValue() is None: self.switch_dpid_list = None self.link_list = None self.callback_http_attr_list = [ ] #we have multiple expedients communicating with foam! self.callback_cred_attr_list = [ ] #we have multiple expedients communicating with foam! def recordAction(self, action, credentials=[], urn=None): cred_ids = [] self._actionLog.info("Sliver: %s LegExpAPI Action: %s" % (urn, action)) for cred in credentials: self._actionLog.info("Credential: %s" % (cred)) def priv_CreateSliver(self, slice_urn, credentials, rspec, users, force_approval=False, options=None): #user_info = {} user_info = users try: #if CredVerifier.checkValid(credentials, "createsliver"): if True: self.recordAction("createsliver", credentials, slice_urn) try: #cert = Certificate(request.environ['CLIENT_RAW_CERT']) #user_info["urn"] = cert.getURN() #user_info["email"] = cert.getEmailAddress() self._log.debug( "Parsed user cert with URN (%(urn)s) and email (%(email)s)" % users) except Exception, e: self._log.exception("UNFILTERED EXCEPTION") user_info["urn"] = None user_info["email"] = None from foam.app import admin_apih if not admin_apih.vlan_automation_on: sliver = foam.geni.lib.createSliver( slice_urn, credentials, rspec, user_info) style = ConfigDB.getConfigItemByKey( "geni.approval.approve-on-creation").getValue() if style == foam.geni.approval.NEVER: approve = False elif style == foam.geni.approval.ALWAYS: approve = True else: approve = foam.geni.ofeliaapproval.of_analyzeForApproval( sliver) if approve or force_approval: pid = foam.task.approveSliver(sliver.getURN(), AUTO_SLIVER_PRIORITY) self._log.debug( "task.py launched for approve-sliver (PID: %d)" % pid) else: free_vlan_list = self.pub_get_offered_vlans(1) free_vlan = free_vlan_list[0] slice_id = slice_urn.split("+slice+")[1].split( ":")[0].split("id_")[1].split("name_")[0] #filedir = './opt/ofelia/ofam/local/db' #filename = os.path.join(filedir, 'expedient_slices_info.json') #f = open(filename, 'r') #self.slice_info_dict = json.load(f) #f.close() if (slice_id == "") or (slice_id not in self.slice_info_dict): self._log.exception( "The slice id you specified is non-existent") raise Exception updated_slice_info_dict = self.slice_info_dict.copy() for sliv_pos, sliver in enumerate( self.slice_info_dict[slice_id]['switch_slivers']): for sfs_pos, sfs in enumerate(sliver['flowspace']): updated_slice_info_dict[slice_id][ 'switch_slivers'][sliv_pos]['flowspace'][ sfs_pos]['vlan_id_start'] = free_vlan updated_slice_info_dict[slice_id][ 'switch_slivers'][sliv_pos]['flowspace'][ sfs_pos]['vlan_id_end'] = free_vlan all_efs = self.create_slice_fs( updated_slice_info_dict[slice_id]['switch_slivers']) new_slice_of_rspec = create_ofv3_rspec(slice_id, updated_slice_info_dict[slice_id]['project_name'], updated_slice_info_dict[slice_id]['project_desc'], \ updated_slice_info_dict[slice_id]['slice_name'], updated_slice_info_dict[slice_id]['slice_desc'], \ updated_slice_info_dict[slice_id]['controller_url'], updated_slice_info_dict[slice_id]['owner_email'], \ updated_slice_info_dict[slice_id]['owner_password'], \ updated_slice_info_dict[slice_id]['switch_slivers'], all_efs) self.slice_info_dict = updated_slice_info_dict.copy() sliver = foam.geni.lib.createSliver( slice_urn, credentials, new_slice_of_rspec, user_info) pid = foam.task.approveSliver(sliver.getURN(), AUTO_SLIVER_PRIORITY) self._log.debug( "task.py launched for approve-sliver (PID: %d)" % pid) data = GeniDB.getSliverData(sliver.getURN(), True) foam.task.emailCreateSliver(data) return self.successResult(GeniDB.getManifest(sliver.getURN())) return except foam.geni.lib.RspecParseError, e: self._log.info(str(e)) e._foam_logged = True raise e