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.")
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()
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'])
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")
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")
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