Beispiel #1
0
    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
Beispiel #2
0
 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!
Beispiel #4
0
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
Beispiel #5
0
    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
Beispiel #6
0
 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!
Beispiel #7
0
 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()
Beispiel #8
0
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))
Beispiel #9
0
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))
Beispiel #10
0
 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
Beispiel #11
0
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)
Beispiel #12
0
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))
Beispiel #13
0
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)
Beispiel #14
0
 def __init__ (self, log):
   super(AMAPIv1, self).__init__("GAPIv1", log)
   self._actionLog = KeyAdapter("v1", logging.getLogger('gapi-actions'))
Beispiel #15
0
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
Beispiel #16
0
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)
Beispiel #17
0
 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
Beispiel #18
0
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
Beispiel #19
0
 def __init__ (self, key, log):
   self._key = key
   self._log = KeyAdapter(key, log)
Beispiel #20
0
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
Beispiel #21
0
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)
Beispiel #23
0
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
Beispiel #24
0
 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)
Beispiel #25
0
	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
Beispiel #27
0
 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