예제 #1
0
    def reserve(self, resv):
        # logger.info("ovsgre:OvsManager:reserve: enter")
        # This just only reserve vlans for source/destination/tunnel interfaces
        if resv is None:
            raise ManagerException("OvsManager:reserve",
                                   "The reservation parameter is null.")

        self.check_stp(resv)

        resv_id = uuid.uuid4()
        logger.info("ovsManager:reserve: new resv_id=%s." % resv_id)

        if dict_resvParameter.has_key(resv_id):
            logger.error("Never here. Reservation id is duplicated(%s)." %
                         (resv_id))
            raise ManagerException("OvsManager:reserve",
                                   "The reservation id is already used.")

        resvp = resvParameter(self.ovs_id, resv)

        (s_vlan, d_vlan, t_vlan) = resvp.allocate()
        resv.trans_vlan = t_vlan

        dict_resvParameter[resv_id] = resvp
        self.dict_isSetRule[resv_id] = False
        logger.info("ovsManager:reserve: done. resv_id=%s" % (resv_id))
        return resv_id
예제 #2
0
def get_port(urlbase, dpid, tnrmp, name):
    # url = "http://localhost:8080/ovsdb/0000000000000010/ports"
    # tnrmp["ovsdb"] = address pvsdb

    params = {}
    url = "%s/ovsdb/%s/%s" % (urlbase, dpid, "ports")
    logger.info("get_port: url=%s" % url)

    params["tnrm"] = tnrmp
    logger.info("get_port: request url=%s, dict=%s" % (url, params))

    rc = None
    try:
        req = urllib2.Request(url, "%s" % json.dumps(params))
        rs = urllib2.urlopen(req)

        rc = json.load(rs)
        logger.info("get_port: reply dict=%s" % rc)
    except Exception as ex:
        raise ManagerException(
            "ovsif:get_port",
            "error in call ryu-manager. url=%s, ex=%s" % (url, ex))
    try:
        port = rc["tnrm"]["ports"][name]
        logger.info("get_port: ovs ofport=%s" % port)
        return port
    except:
        raise ManagerException(
            "ovsif:get_port",
            "This port (%s) dose not exist in Open vSwitch(%s)." %
            (name, dpid))
예제 #3
0
    def status (self, resv):
        if resv is None or not dict_resvParameter.has_key(resv.resv_id):
            logger.info("ovsManager:status: resv_id=%s" % (resv.resv_id))
            for key in dict_resvParameter:
                logger.info("ovsManager:status: resvp=%s" % (key))
            raise ManagerException("OvsManager:status", "The reservation is null.")

        resvp = dict_resvParameter[resv.resv_id]
        if resvp is None:
            raise ManagerException("OvsManager:status", "The ResvParameter is null.")

        rc = self.check_rule(self.src_if, resvp.s_vlan, resvp.t_vlan)
        if not rc:
            ### This operation is caused we can not remove flow rules 
            ### and teardown gre tunnel in a normal island.
            # self.dict_isSetRule[resv.resv_id] = False
            return False

        rc = self.check_rule(self.dst_if, resvp.d_vlan, resvp.t_vlan)
        if not rc:
            ### This operation is caused we can not remove flow rules 
            ### and teardown gre tunnel in a normal island.
            # self.dict_isSetRule[resv.resv_id] = False
            return False
        return True
예제 #4
0
    def find_dev(self, src_if, dst_if):
        urlbase = src_if.ryu_url
        dpid = src_if.dpid

        params = {}
        params["ovsdb"] = src_if.ovsdb
        if (src_if.gtype == "ovsgre"):
            params["type"] = "gre"
        else:
            raise ManagerException("OvsManager:find_dev", 
                                   "Type (%s) is unknown, must be \"ovsgre\"." % (src_if.gtype))
        params["local_ip"] = src_if.address
        params["remote_ip"] = dst_if.address

        logger.info("search gre link. url=%s, dpid=%s, ovsdb=%s, type=%s, local=%s, remote=%s" % (urlbase, dpid, params["ovsdb"], params["type"], params["local_ip"], params["remote_ip"]));

        finds = ovsif.get_tunnel_info(urlbase, dpid, params)
        if len(finds) == 0:
            return (None, None)
        elif len(finds) == 1:
            for p in finds.keys():
                logger.info("find gre link. dev=%s, ofport=%s" % (p, finds[p]))
                return (p, finds[p])
        else:
            raise ManagerException("OvsManager:init", "Duplicate path is exist. %s" % finds)
예제 #5
0
    def allocate(self, vlan=None):
        logger.info("ovsgre:vlanManager:allocate: vlan=%s" % (vlan))
        ivlan = 0
        if vlan is not None:
            try:
                ivlan = int(vlan)
            except Exception:
                raise ManagerException(
                    "ovsgre:allocate",
                    "This vlan (%s) can not convert to integer." % vlan)

            # if (ivlan < self.vlan_min or ivlan > self.vlan_max):
            #   raise ManagerException("ovsgre:allocate", "This vlan (%s) is outof vlan range." % vlan)

        if vlan is None:
            if self.isTunnel:
                vlan = self.search()
                logger.info("VlanManagter: new allocate vlan is %s." % (vlan))
            else:
                raise ManagerException("ovsgre:allocate",
                                       "Vlan is unset for STP.")

        if self.dict_vlans.has_key(vlan):
            raise ManagerException("ovsgre:allocate",
                                   "This vlan (%s) is already used." % vlan)

        self.dict_vlans[vlan] = vlan
        return vlan
예제 #6
0
    def provision (self, resv):
        # provison:nsiv2, poa geni_start
        if resv is None or not dict_resvParameter.has_key(resv.resv_id):
            logger.info("ovsManager:provision: resv_id=%s" % (resv.resv_id))
            for key in dict_resvParameter:
                logger.info("ovsManager:provision: resvp=%s" % (key))
            raise ManagerException("OvsManager:provision", "The reservation is null.")
        
        resvp = dict_resvParameter[resv.resv_id]
        if resvp is None:
            raise ManagerException("OvsManager:privision", "The ResvParameter is null.")

        if self.isSetup:
            # already setup
            pass
        else:
            try:
                ### setup src->dst
                self.setup_tunnel(self.src_if, self.dst_if)
            except:
                raise

            try:
                ### setup dst->src
                self.setup_tunnel(self.dst_if, self.src_if)
            except:
                ### teardown tunnel by setup_tunnel(self.src_if, self.dst_if)
                self.teardown_tunnel(self.src_if, self.dst_if)
                raise
                
            self.isSetup = True

        self.dict_used[resv.resv_id] = resv.resv_id

        if self.dict_isSetRule[resv.resv_id]:
            # already set flow rule
            pass
        else:
            #### add code for set rule
            logger.info("set flow rule. %s?vlan=%s:%s?vlan=%s, gre?vlan=%s." % 
                        (resvp.s_stp, resvp.s_vlan, resvp.d_stp, resvp.d_vlan, resvp.t_vlan))
            try:
                ### add src
                self.add_rule(self.src_if, resvp.s_vlan, resvp.t_vlan)
            except Exception as ex:
                logger.error("provision: error in add rule: src_if=%s sevlan=%s, ofvlan=%s, ex=%s" % (self.src_if, resvp.s_vlan, resvp.t_vlan, ex))
                raise ex

            try:
                ### add dst
                self.add_rule(self.dst_if, resvp.d_vlan, resvp.t_vlan)
            except Exception as ex:
                logger.error("provision: error in add rule: dst_if=%s sevlan=%s, ofvlan=%s, ex=%s" % (self.dst_if, resvp.s_vlan, resvp.t_vlan, ex))
                self.del_rule(self.src_if, resvp.s_vlan, resvp.t_vlan)
                raise ex

            self.dict_isSetRule[resv.resv_id] = True

        return resv.resv_id
예제 #7
0
    def check_stp (self, resv):
        if resv.src_if == self.src_if and resv.dst_if == self.dst_if:
            return True
        if resv.src_if == self.dst_if and resv.dst_if == self.src_if:
            return True

        raise ManagerException("ovs manager:check_stp", "Mismatch interface between OvsManager and Reservation. %s:%s, %s:%s" % (self.src_if, self.dst_if, resv.src_if, resv.dst_if))
예제 #8
0
    def get_port(self, dev):
        if self.dict_dev.has_key(dev):
            port = self.dict_dev[dev]
            logger.info("swManager: get_port: dev=%s, ofport=%s" % (dev, port))
            return self.dict_dev[dev]

        raise ManagerException("ovsgre:swManager:get_port", "This dev(%s) does not exist." % dev)
예제 #9
0
def add_tunnel(urlbase, dpid, tnrmp):
    # url = "http://localhost:8080/ovsdb/0000000000000010/tunnel/create"
    # tnrmp["ovsdb"] = address pvsdb
    # tnrmp["name"] = name of gre tunnel
    # tnrmp["type"] = "gre"
    # tnrmp["local_ip"] = local ip address
    # tnrmp["remote_ip"] = remote ip address

    params = {}
    url = "%s/ovsdb/%s/%s" % (urlbase, dpid, "tunnel/create")
    logger.info("add_tunnel: url=%s" % url)

    params["tnrm"] = tnrmp
    logger.info("add_tunnel: request url=%s, dict=%s" % (url, params))

    rc = None
    try:
        req = urllib2.Request(url, "%s" % json.dumps(params))
        rs = urllib2.urlopen(req)

        rc = json.load(rs)
        logger.info("add_tunnel: reply dict=%s" % rc)
    except Exception as ex:
        raise ManagerException(
            "ovsif:add_tunnel",
            "error in call ryu-manager. url=%s, ex=%s" % (url, ex))

    port = rc["tnrm"]["tunnel"]["ofport"]
    logger.info("add_tunnel: ovs ofport=%s" % port)
    return port
예제 #10
0
    def swap_id (self, resv, new_id, old_id):
        if resv is None:
            raise ManagerException("OvsManager:swap_id", "The reservation is null.")
        if not dict_resvParameter.has_key(resv.resv_id):
            resvp = dict_resvParameter[new_id]
            del dict_resvParameter[new_id]
            dict_resvParameter[old_id] = resvp

        return resv.resv_id
예제 #11
0
    def terminate (self, resv):
        if resv is None or not dict_resvParameter.has_key(resv.resv_id):
            raise ManagerException("OvsManager:terminate", "The reservation is null.")

        resvp = dict_resvParameter[resv.resv_id]
        if resvp is None:
            raise ManagerException("OvsManager:terminate", "The ResvParameter is null.")

        self.release(resv)

        resvp.free()
        del dict_resvParameter[resv.resv_id]

        if self.dict_used.has_key(resv.resv_id):
            del self.dict_used[resv.resv_id]
        if self.dict_isSetRule.has_key(resv.resv_id):
            del self.dict_isSetRule[resv.resv_id]

        return resv.resv_id
예제 #12
0
    def re_provision (self, resv):
        # provison:nsiv2, poa geni_start
        logger.info("ovsManager:re_provision has_key(%s)=%s" %
                    (resv.resv_id, dict_resvParameter.has_key(resv.resv_id)))
        if resv is None or not dict_resvParameter.has_key(resv.resv_id):
            logger.info("ovsManager:re_provision: resv_id=%s" % (resv.resv_id))
            for key in dict_resvParameter:
                logger.info("ovsManager:re_provision: resvp=%s" % (key))
            raise ManagerException("OvsManager:re_provision", "The reservation is null.")

        resvp = dict_resvParameter[resv.resv_id]
        if resvp is None:
            raise ManagerException("OvsManager:re_privision", "The ResvParameter is null.")

        self.isSetup = True
        self.dict_used[resv.resv_id] = resv.resv_id
        self.dict_isSetRule[resv.resv_id] = True

        logger.info("ovsManager:re_provision: done. resv_id=%s" % (resv.resv_id))
        return resv.resv_id
예제 #13
0
def get_vlanManager (s_stp, d_stp):
    if s_stp is None:
        raise ManagerException("ovsgre:get_vlanMamager", "The source stp is None.")
    if d_stp is None:
        raise ManagerException("ovsgre:get_vlanMamager", "The destination stp is None.")

    key = getKey(s_stp, d_stp)
    if dict_vlanManager.has_key(key):
        if not dict_vlanManager.has_key(s_stp):
            raise ManagerException("Never here. This is a fatal error to manage vlanManager. stp=%s" % (s_stp))
        if not dict_vlanManager.has_key(d_stp):
            raise ManagerException("Never here. This is a fatal error to manage vlanManager. stp=%s" % (d_stp))
        return (dict_vlanManager[s_stp], dict_vlanManager[d_stp], dict_vlanManager[key])

    key = getKey(d_stp, s_stp)
    if dict_vlanManager.has_key(key):
        if not dict_vlanManager.has_key(d_stp):
            raise ManagerException("Never here. This is a fatal error to manage vlanManager. stp=%s" % (d_stp))
        if not dict_vlanManager.has_key(s_stp):
            raise ManagerException("Never here. This is a fatal error to manage vlanManager. stp=%s" % (s_stp))
        return (dict_vlanManager[d_stp], dict_vlanManager[s_stp], dict_vlanManager[key])

    key = getKey(s_stp, d_stp)
    dict_vlanManager[key] = vlanManager(key, True)
    if not dict_vlanManager.has_key(s_stp):
        dict_vlanManager[s_stp] = vlanManager(s_stp)
    if not dict_vlanManager.has_key(d_stp):
        dict_vlanManager[d_stp] = vlanManager(d_stp)

    return  (dict_vlanManager[s_stp], dict_vlanManager[d_stp], dict_vlanManager[key])
예제 #14
0
def list_flows(urlbase, params):
    url = "%s/stats/flow/%d" % (urlbase, params['dpid'])
    rc = None
    try:
        rs = urllib2.urlopen(url)

        rc = json.load(rs)
        logger.info("flow entry: reply dict=%s" % rc)

    except Exception as ex:
        raise ManagerException(
            "ovsif:list_flow",
            "error in call ryu-manager. url=%s, ex=%s" % (url, ex))
    return rc
예제 #15
0
    def setup_tunnel(self, src_if, dst_if):
        logger.info("setup src_if=%s" % src_if)
        logger.info("setup dst_if=%s" % dst_if)

        sw = get_swManager(src_if)
        ofport = None

        try:
            # ofport = sw.get_port(src_if.ofdev)
            ofdev, ofport = src_if.get_of(self.ovs_id)
            ofport2 = sw.get_port(ofdev)
            if ofport != ofport2:
                logger.error(
                    "setup_tunnel:ofdev=%s: mismatch ofport=%s, ofport2=%s" %
                    (ofdev, ofport, ofport2))
                ofport = ofport2
        except Exception as ex:
            logger.info("setup_tunnel:gre port is None")

        if ofport is None:
            urlbase = src_if.ryu_url
            dpid = src_if.dpid

            logger.info(
                "setup gre link here. url=%s, dpid=%s, ovsdb=%s, dev=%s, type=%s, local=%s, remote=%s"
                % (urlbase, dpid, src_if.ovsdb, ofdev, src_if.gtype,
                   src_if.address, dst_if.address))

            params = {}
            params["ovsdb"] = src_if.ovsdb
            params["name"] = ofdev
            if (src_if.gtype == "ovsgre"):
                params["type"] = "gre"
            else:
                raise ManagerException(
                    "OvsManager:setup_tunnel",
                    "Type (%s) is unknown, must be \"ovsgre\"." %
                    (src_if.gtype))
            params["local_ip"] = src_if.address
            params["remote_ip"] = dst_if.address

            ofport = ovsif.add_tunnel(urlbase, dpid, params)

        # src_if.ofport = ofport
        src_if.set_of(self.ovs_id, ofdev, ofport)
        sw.set_used(ofdev, ofport)
예제 #16
0
def del_flow(urlbase, params):
    url = "%s/stats/flowentry/delete" % (urlbase)
    logger.info("del_flow: url=%s" % url)

    logger.info("del_flow: request url=%s, dict=%s" % (url, params))

    rc = None
    try:
        req = urllib2.Request(url, "%s" % json.dumps(params))
        rs = urllib2.urlopen(req)

        url = "%s/stats/flow/%d" % (urlbase, params['dpid'])
        rs = urllib2.urlopen(url)

        rc = json.load(rs)
        logger.info("flow entry: reply dict=%s" % rc)

    except Exception as ex:
        raise ManagerException(
            "ovsif:del_flow",
            "error in call ryu-manager. url=%s, ex=%s" % (url, ex))
    return rc
예제 #17
0
    def search (self):
        for v in xrange(self.vlan_pos, self.vlan_max):
            logger.info("ovsgre:vlanManager:search: vlan=%d" % (v))
            if self.dict_vlans.has_key(str(v)):
                continue
            else:
                self.vlan_pos = v + 1
                if self.vlan_pos == self.vlan_max:
                    self.vlan_pos = self.vlan_min
                return str(v)
                
        for v in xrange(self.vlan_min, self.vlan_pos):
            logger.info("ovsgre:vlanManager:search: vlan=%d" % (v))
            if self.dict_vlans.has_key(str(v)):
                continue
            else:
                self.vlan_pos = v + 1
                if self.vlan_pos == self.vlan_max:
                    self.vlan_pos = self.vlan_min
                return str(v)

        raise ManagerException("proxy:allocate_vlan", "New vlan is not allocated.")
예제 #18
0
    def allocate_dev(self, dst_if):
        lkey = self.key + ":" + dst_if.ryu_url + "/" + dst_if.dpid
        logger.info("swManager:allocate_dev: lkey=%s." % lkey)

        if self.dict_path.has_key(lkey):
            dev = self.dict_key[lkey]
            logger.info("swManager:allocate_dev: old device is %s." % dev)
            # return self.dict_dev[lkey]
            return dev

        for v in xrange(dev_min, dev_max):
            dev = "%s%03d" % (ovsif.PREFIX_DEV, v)
            if dev in self.dict_dev:
                continue
            else:
                logger.info("swManager:allocate_dev: new device is %s." % dev)
                self.dict_path[lkey] = dev
                self.set_used(dev, None)
                return dev

        raise ManagerException("OvsManager:swManager:allocate_dev", 
                               "There is no resources for device in openvSwitch.")
예제 #19
0
def add_flow(urlbase, params):
    # url = "http://localhost:8080/stats/flowentry/add
    # params["dpid"] = int dpid of open vSwitch
    # params["match"] = {"in_port":1, "dl_vlan":1795}
    # params["action"] = [{"type":"SET_VLAN_VID", "vlan_vid":795}, {"type":"OUTPUT", "port":2}]'
    #
    # params["priority"] = priority: matching precedence of the ow entry. int
    # params["idel_timeout"] = 0 not expired
    # params["hard_timeout"] = 0 not expired
    # params["cookie"] = 1 : opaque data value chosen by the controller.
    #                   May be used by the controller to lter owstatistics,
    #                   ow modication and ow deletion. Not used when processing packets. int 0
    # params["cookie_mask"] = 0
    # params["table_id"] = 0 , Table 0 signies the rst table in the pipeline.
    # params["flags"] = 1, Send flow removed message when flow expires or is deleted.

    url = "%s/stats/flowentry/add" % (urlbase)
    logger.info("add_flow: url=%s" % url)

    logger.info("add_flow: request url=%s, dict=%s" % (url, params))

    rc = None
    try:
        req = urllib2.Request(url, "%s" % json.dumps(params))
        rs = urllib2.urlopen(req)

        logger.info("flow entry: return=%s" % rs)

        url = "%s/stats/flow/%d" % (urlbase, params['dpid'])
        rs = urllib2.urlopen(url)

        rc = json.load(rs)
        logger.info("flow entry: reply dict=%s" % rc)
    except Exception as ex:
        raise ManagerException(
            "ovsif:add_flow",
            "error in call ryu-manager. url=%s, ex=%s" % (url, ex))
    return rc
예제 #20
0
def del_tunnel(urlbase, dpid, tnrmp):
    # url = "http://localhost:8080/ovsdb/0000000000000010/tunnel/delete"
    # tnrmp["ovsdb"] = address pvsdb
    # tnrmp["remote_ip"] = remote ip address

    params = {}
    url = "%s/ovsdb/%s/%s" % (urlbase, dpid, "tunnel/delete")
    logger.info("delete_tunnel: url=%s" % url)

    params["tnrm"] = tnrmp
    logger.info("delete_tunnel: request url=%s, dict=%s" % (url, params))

    rc = None
    try:
        req = urllib2.Request(url, "%s" % json.dumps(params))
        rs = urllib2.urlopen(req)

        rc = json.load(rs)
        logger.info("delete_tunnel: reply dict=%s" % rc)

    except Exception as ex:
        raise ManagerException(
            "ovsif:del_tunnel",
            "error in call ryu-manager. url=%s, ex=%s" % (url, ex))
예제 #21
0
    def allocate(self,
                 slice_urn,
                 client_cert,
                 credentials,
                 rspec,
                 end_time=None):
        """Documentation see [geniv3rpc] GENIv3DelegateBase."""
        # logger.info("slice_urn=%s" % (slice_urn))
        # logger.info("client_cert=%s" % (client_cert))
        # logger.info("credentials=%s" % (credentials))
        # logger.info("request rspec=%s" % (rspec))
        # logger.info("end_time=%s" % (end_time))
        self.restart_from_db()
        logger.info(">>>>> allocate <<<<< urn=%s" % slice_urn)

        # start_time = datetime.now()
        start_time = get_time_now()
        start_time += timedelta(minutes=2)
        if (isinstance(end_time, type(None)) == True):
            end_time = start_time + timedelta(minutes=10)
            end_time = start_time + timedelta(hours=3)
        else:
            delta = end_time - start_time
            logger.debug("delta days=%s, seconds=%s" %
                         (delta.days, delta.seconds))
            if (delta.days * 24 * 3600 + delta.seconds < 60):
                end_time = start_time + timedelta(seconds=60)
                logger.debug("re-set end_time=%s" % (end_time))

        if slice_urn in dict_slice_urn:
            req = dict_slice_urn[slice_urn]
            for urn in req.urns:
                resv = req.get_reservation(urn)
                logger.info(
                    "delete service=%s: urn=%s, reservation=%s, status=%s" %
                    (resv.service, urn, resv, resv.astatus))
            raise geni_ex.GENIv3GeneralError("slice_urn(%s) is already exit." %
                                             (slice_urn))

        logger.info("allocate: add dict_slice_urn[%s]." % slice_urn)

        start_time_sec = unix_time_sec(start_time)
        end_time_sec = unix_time_sec(end_time)

        req = Request(slice_urn, rspec, start_time, end_time)
        req, error = req.parse_reservations()
        if error is not None:
            raise geni_ex.GENIv3GeneralError(error)

        logger.info("slice=%s, urns=%s" % (slice_urn, str(req.urns)))
        dict_slice_urn[slice_urn] = req

        isError = False
        manifest_body = ""
        for urn in req.urns:
            logger.info("allocate:loop: urn=%s" % urn)
            resv = req.get_reservation(urn)
            resv.ostatus = self.OPERATIONAL_STATE_NOTREADY
            resv.astatus = self.ALLOCATION_STATE_UNALLOCATED
            resv.action = self.OPERATIONAL_ACTION_STOP

            if resv.error is not None:
                isError = True
            manifest_body += resv.get_manifest()

        slice_status = req.get_status()
        req.set_manifest(manifest_body)
        manifest = req.get_manifest()
        # logger.info("manifest=%s" % manifest)

        if isError:
            self.__slice_delete_status(req, get_time_now())
            return (manifest, slice_status)

        for urn in req.urns:
            resv = req.get_reservation(urn)
            logger.info("call reserve %s" % (resv))

            #
            # VLAN range check in Reservation
            #

            try:
                if resv.service == "NSI":
                    rid = nsi_proxy.reserve(
                        resv.gid,
                        resv.path.sep.stp,
                        resv.path.dep.stp,
                        # int(resv.path.sep.vlantag),
                        int(resv.src_vlan),
                        # int(resv.path.dep.vlantag),
                        int(resv.dst_vlan),
                        int(resv.path.sd_bw),
                        unix_time_sec(start_time),
                        unix_time_sec(end_time))

                elif resv.service == "GRE":
                    rid = gre_proxy.reserve(resv)

                else:
                    emes = "Unknown service=%s: urn=%s, reservation=%s" % (
                        resv.service, slice_urn, resv)
                    logger.error(emes)
                    raise ManagerException("tn_rm_delegate:allocate", emes)

                logger.info("urns=%s, rid=%s" % (slice_urn, rid))

                resv.resv_id = rid
                resv.astatus = self.ALLOCATION_STATE_ALLOCATED
                resv.ostatus = self.OPERATIONAL_STATE_READY
                resv.action = self.OPERATIONAL_ACTION_STOP

            except Exception as e:
                logger.error("ex=%s" % (e))
                resv.error = "%s" % (e)
                #resv.src_if.vman.putVlanYellow(resv.path.sep.vlantag)
                #resv.dst_if.vman.putVlanYellow(resv.path.dep.vlantag)
                resv.src_if.vman.putVlanYellow(resv.src_vlan)
                resv.dst_if.vman.putVlanYellow(resv.dst_vlan)
                isError = True

        slice_status = req.get_status()
        manifest = req.get_manifest()

        if isError:
            self.__slice_delete_status(req, get_time_now())
        else:
            for urn in req.urns:
                resv = req.get_reservation(urn)
                self.db.insert(resv)

        return (manifest, slice_status)
예제 #22
0
def get_tunnel_info(urlbase, dpid, tnrmp):
    # url = "http://localhost:8080/ovsdb/0000000000000010/info"
    # tnrmp["ovsdb"] = address ovsdb
    # tnrmp["remote_ip"] = tunnel remote address
    # tnrmp["local_ip"] = tunnel local address

    params = {}
    url = "%s/ovsdb/%s/%s" % (urlbase, dpid, "ports")
    logger.info("get_tunnel_info: url=%s" % url)

    tnrmp["name"] = PREFIX_DEV
    params["tnrm"] = tnrmp
    logger.info("get_tunnel_info: request url=%s, dict=%s" % (url, params))

    rc = None
    try:
        req = urllib2.Request(url, "%s" % json.dumps(params))
        rs = urllib2.urlopen(req)

        rc = json.load(rs)
        logger.info("get_tunnel_info: reply dict=%s" % rc)
    except Exception as ex:
        raise ManagerException(
            "ovsif:get_tunnel_info",
            "error in call ryu-manager. url=%s, ex=%s" % (url, ex))

    ports = {}
    try:
        for p in rc["tnrm"]["ports"].keys():
            if tnrmp["name"] in p:
                logger.info("get_tunnel_info: dev=%s, port=%s" %
                            (p, rc["tnrm"]["ports"][p]))
                ports[p] = rc["tnrm"]["ports"][p]

    except:
        # raise ManagerException("ovsif:get_tunnel_port",
        #                        "This port (%s) dose not exist in Open vSwitch(%s)." % (name, dpid))
        logger.info(
            "get_tunnel_info: This port (%s) dose not exist in Open vSwitch(%s)."
            % (tnrmp["name"], dpid))
        return ports

    find = {}
    for p in ports:
        url = "%s/ovsdb/%s/%s" % (urlbase, dpid, "tunnel/info")
        logger.info("get_tunnel_info: url=%s" % url)

        param = {}
        tnrmp["name"] = p
        param["tnrm"] = tnrmp

        logger.info("get_tunnel_info: request url=%s, dict=%s" % (url, params))

        rc = None
        try:
            req = urllib2.Request(url, "%s" % json.dumps(params))
            rs = urllib2.urlopen(req)

            rc = json.load(rs)
        except Exception as ex:
            raise ManagerException(
                "ovsif:get_tunnel_info",
                "error in call ryu-manager. url=%s, ex=%s" % (url, ex))

        tp = rc["tnrm"]["tunnel"]
        logger.info("get_tunnel_info: reply dict=%s" % tp)

        if tnrmp.has_key(
                "remote_ip") and tnrmp["remote_ip"] != tp["remote_ip"]:
            pass
        elif tnrmp.has_key("type") and tnrmp["type"] != tp["type"]:
            pass
        else:
            logger.info(
                "get_tunnel_info: find name=%s, remote_ip=%s, type=%s, port=%s"
                % (p, tp["remote_ip"], tp["type"], ports[p]))
            find[p] = ports[p]
    return find
예제 #23
0
 def modify (self, resv, end_time_sec):
     # This do nothing here.
     if resv is None or not dict_resvParameter.has_key(resv.resv_id):
         raise ManagerException("OvsManager:modify", "The reservation is null.")
     return resv.resv_id
예제 #24
0
    def release (self, resv):
        e = None
        ### release:nsiv2, poa geni_stop
        if resv is None or not dict_resvParameter.has_key(resv.resv_id):
            raise ManagerException("OvsManager:release", "The reservation is null.")
        
        resvp = dict_resvParameter[resv.resv_id]
        if resvp is None:
            raise ManagerException("OvsManager:release", "The ResvParameter is null.")

        if self.dict_isSetRule.has_key(resv.resv_id):
            if self.dict_isSetRule[resv.resv_id]:
                logger.info("delete flow rule here. %s?vlan=%s:%s?vlan=%s, gre?vlan=%s." % 
                            (resvp.s_stp, resvp.s_vlan, resvp.d_stp, resvp.d_vlan, resvp.t_vlan))

                try:
                    ### delete src
                    self.del_rule(self.src_if, resvp.s_vlan, resvp.t_vlan)
                except Exception as ex:
                    e = ex
                    logger.error("release: error in delete rule: src_if=%s sevlan=%s, ofvlan=%s, ex=%s" % (self.src_if, resvp.s_vlan, resvp.t_vlan, ex))

                try:
                    ### delete dst
                    self.del_rule(self.dst_if, resvp.d_vlan, resvp.t_vlan)
                except Exception as ex:
                    e = ex
                    logger.error("release: error in delete rule: dst_if=%s sevlan=%s, ofvlan=%s, ex=%s" % (self.dst_if, resvp.d_vlan, resvp.t_vlan, ex))

                self.dict_isSetRule[resv.resv_id] = False
                
            else:
                # already delete flow rule
                pass

        else:
            logger.info("OvsManager:release: This reservation (%s) does not have isSetRule." %
                        (resv.resv_id))

        if self.dict_used.has_key(resv.resv_id):
            del self.dict_used[resv.resv_id]
        else:
            logger.info("OvsManager:release: This reservation (%s) does not used this gre link." %
                        (resv.resv_id))

        if self.isSetup:
            if len(self.dict_used) > 0:
                logger.info("This gre link is shared other reservtion. Do not teardown now.")
            else:
                e = None
                ### teardown src->dst
                try:
                    self.teardown_tunnel(self.src_if, self.dst_if)
                except Exception as ex:
                    e = ex
                    logger.error("release: error in teardown: src_if=%s, dst_if=%s ex=%s" % (self.src_if, self.dst_if, ex))

                ### teardown dst->src
                try:
                    self.teardown_tunnel(self.dst_if, self.src_if)
                except Exception as ex:
                    e = ex
                    logger.error("release: error in teardown: src_if=%s, dst_if=%s ex=%s" % (self.dst_if, self.src_if, ex))

                self.isSetup = False
                self.isSetup = False

        else:
            logger.info("This link is already teardown.");
            
        if e is not None:
            raise e

        return resv.resv_id