Esempio n. 1
0
 def _test_flow_fetcher(self, request, arg):
     try:
         flow_stats_request = json_parse_message_body(request)
         dpid = datapathid.from_host(long(flow_stats_request['dpid'], 16))
         ff = self.ffa.fetch(dpid, flow_stats_request,
                             lambda: report_results(ff))
     except Exception, e:
         return self.err(Failure(), request, "_test_flow_fetcher",
                         "Could not request flows.")
Esempio n. 2
0
def ws_deny_group(request, args):
    """ WS interface to permit(). """
    content = webservice.json_parse_message_body(request)
    if content == None:
        print "error in getting state"
        return  webservice.badRequest(request, "missing eaddr")

    for eaddr in content:
        if not is_valid_eth(eaddr):
            return   webservice.badRequest(request, "malformed eaddr " + eaddr)

    for eaddr in content:
        deny(eaddr)
    return status()
Esempio n. 3
0
def ws_dns_deny_group(request, args):
    """ WS interface to dns_deny_group(). """
    
    print request
    print args

    content = webservice.json_parse_message_body(request)
    if content == None:
        print "error in getting state"
        return  webservice.badRequest(request, "missing eaddr")

    for permititem in content:
        if not is_valid_eth(permititem['eaddr']):
            return   webservice.badRequest(request, "malformed eaddr " + eaddr)

    for permititem in content:
        dns_deny(permititem['eaddr'], permititem['hostname'])
Esempio n. 4
0
def ws_permit_group(request, args):
    """ WS interface to permit(). """
    content = webservice.json_parse_message_body(request)
    if content == None:
        print "error in getting state"
        return  webservice.badRequest(request, "missing eaddr")

    for eaddr in content:
        if not is_valid_eth(eaddr):
            return   webservice.badRequest(request, "malformed eaddr " + eaddr)

    for eaddr in content:
        permit(eaddr)
    return status()

#    eaddr = args.get('eaddr')
#    if not eaddr: return webservice.badRequest(request, "missing eaddr")

    return '{"status" : "success"}' #permit(eaddr)
 def handle_add(self, request, data):
     try:
         if authorization_failed(request, [set(["add-network-events"])]):
             return NOT_DONE_YET
         content = json_parse_message_body(request)
         if content == None:
             content = {}
         app = "via-netevent-webservice"
         if "app" in content:
             app = str(content["app"])
         msg = "default webservice message"
         if "msg" in content:
             msg = str(content["msg"])
         level = LogEntry.INFO
         if "level" in content:
             level = int(content["level"])
         self.uel.log(app, level, msg)
     except Exception, e:
         err(Failure(), request, "handle_add", "Could not add log message")
Esempio n. 6
0
 def handle_add(self,request,data):
   try:
     if authorization_failed(request, [set(["add-network-events"])]):
       return NOT_DONE_YET
     content = json_parse_message_body(request)
     if content == None:
       content = {} 
     app = "via-netevent-webservice"
     if "app" in content: 
       app = str(content["app"])
     msg = "default webservice message"
     if "msg" in content: 
       msg = str(content["msg"])
     level = LogEntry.INFO
     if "level" in content: 
       level = int(content["level"])
     self.uel.log(app,level, msg)
   except Exception, e:
     err(Failure(), request, "handle_add",
         "Could not add log message")
Esempio n. 7
0
    def handle_ws_request(self, request, data):
        if self.current_session != None:
            return webservice.conflictError(request, "Outstanding request pending. Try again later.")

        oscars_request = None

        try:
            json_content = webservice.json_parse_message_body(request)
            if json_content == None:
                raise ValueError('Invalid JSON request')

            oscars_request = OSCARSRequest(json_content)

            for path_element in oscars_request.path:
                dpid = None

                lg.debug("Trying to find switch in known_switches")
                for (curr_dpid, switch) in self.known_switches.items():
                    if switch["ip"] == path_element["switch"]:
                        dpid = switch["dpip"]
                        lg.debug("Found dpid for %s in existing switches" % (path_element["switch"]))
                        break

                if not dpid:
                    lg.debug("Trying to find switch in config")
                    try:
                        dpid = long(config.get(path_element["switch"], "datapath_id"), 0)
                    except Exception as e:
                        lg.error("Problem finding 'datapath_id' for '%s': %s" % (element["switch"], e.__str__()))
                        raise ValueError("Unknown switch '%s'" % element["switch"])

                curr_switch = None
                if dpid and self.known_switches.has_key(dpid):
                    curr_switch = self.known_switches[dpid]

                if not curr_switch:
                    error_msg = "Switch '%s' is not a known switch" % (path_element["switch"])
                    lg.error(error_msg)
                    raise ValueError(error_msg)

                lg.debug("Checking for commands")
                for key in "del-flows", "add-flows":
                    if key in path_element:
                        if len(path_element[key]) != 2:
                            raise ValueError("The flow needs to have two elements")
 
                        lg.debug("Trying %s" % key)
                        for i in range(0,1):
                            lg.debug("Parsing port")
                            port = int(path_element[key][i]["port"])
                            lg.debug("Checking ports_by_id")
                            if port in curr_switch["ports_by_id"]:
                                continue
                            lg.debug("Checking ports_by_name")
                            if str(port) in curr_switch["ports_by_name"]:
                                path_element[key][i]["port"] = curr_switch["ports_by_name"][str(port)]["port_no"]
                                continue
                            raise ValueError("Unknown port: %s in %s" % (path_element[key][i]["port"], hex(dpid)))
 
        except Exception as e:
            lg.error("Invalid request: %s" % e.__str__())
            return webservice.badRequest(request, e.__str__())

        self.current_session = OSCARSSession(request=oscars_request, raw_request=request)

        successful = True
        error_msg = ""
        try:
            if self.current_session.request.path:
                logger.debug("Request has a path")
                for path_element in self.current_session.request.path:
                    dpid = long(config.get(path_element["switch"], "datapath_id"), 0)

                    logger.debug("Configuring switch %s: %s" % (path_element["switch"], dpid))

                    for key in "del-flows", "add-flows":

                        logger.debug("Handling %s for switch %s/%s" % (key, path_element["switch"], dpid))
    
                        if key in path_element:
                            if key == "del-flows":
                                action = "delete"
                            else:
                                action = "add"
                    
                            logger.debug("Handling %s for switch %s" % (action, path_element["switch"]))
 
                            self.modify_flow(action, dpid, path_element[key][0], path_element[key][1]);
    
                            self.modify_flow(action, dpid, path_element[key][1], path_element[key][0]);
        except Exception as e:
            error_msg = "Problem handling request: %s" % e
            logger.error(error_msg)
            successful = False

        if successful:
            # wait 5 seconds and then check that the changes propagated
            self.post_callback(5, lambda: self.verify_changes(self.verify_changes_timeout_cb))
        else:
            self.undo_changes()

        return webservice.NOT_DONE_YET