X-Git-Url: https://osm.etsi.org/gitweb/?p=osm%2FRO.git;a=blobdiff_plain;f=RO-SDN-odl_openflow%2Fosm_rosdn_odlof%2Fodl_of.py;h=ed1bca4b99853bf3400058eca2f99e0126efbc80;hp=329cb6621f873731e68cdac82cc2da5d298d00dd;hb=1ec592d80c7f07874b08a14984deb21fddb31441;hpb=d60bdd09bf04c8e7add7c7bfe2cfd0d74113db40 diff --git a/RO-SDN-odl_openflow/osm_rosdn_odlof/odl_of.py b/RO-SDN-odl_openflow/osm_rosdn_odlof/odl_of.py index 329cb662..ed1bca4b 100644 --- a/RO-SDN-odl_openflow/osm_rosdn_odlof/odl_of.py +++ b/RO-SDN-odl_openflow/osm_rosdn_odlof/odl_of.py @@ -32,12 +32,12 @@ import json import requests import base64 import logging -from osm_ro_plugin.openflow_conn import OpenflowConn, OpenflowConnException, OpenflowConnConnectionException, \ - OpenflowConnUnexpectedResponse, OpenflowConnAuthException, OpenflowConnNotFoundException, \ - OpenflowConnConflictException, OpenflowConnNotSupportedException, OpenflowConnNotImplemented +from osm_ro_plugin.openflow_conn import OpenflowConn, OpenflowConnConnectionException, OpenflowConnUnexpectedResponse +# OpenflowConnException, OpenflowConnAuthException, OpenflowConnNotFoundException, +# OpenflowConnConflictException, OpenflowConnNotSupportedException, OpenflowConnNotImplemented __author__ = "Pablo Montes, Alfonso Tierno" -__date__ = "$28-oct-2014 12:07:15$" +__date__ = "$28-oct-2014 12:07:15$" class OfConnOdl(OpenflowConn): @@ -77,7 +77,7 @@ class OfConnOdl(OpenflowConn): self.dpid = str(params["of_dpid"]) self.id = 'openflow:'+str(int(self.dpid.replace(':', ''), 16)) if params and params.get("of_user"): - of_password=params.get("of_password", "") + of_password = params.get("of_password", "") self.auth = base64.b64encode(bytes(params["of_user"] + ":" + of_password, "utf-8")) self.auth = self.auth.decode() self.headers['authorization'] = 'Basic ' + self.auth @@ -90,7 +90,7 @@ class OfConnOdl(OpenflowConn): """ Obtain a a list of switches or DPID detected by this controller :return: list length, and a list where each element a tuple pair (DPID, IP address) - Raise an OpenflowconnConnectionException exception if fails with text_error + Raise an OpenflowConnConnectionException exception if fails with text_error """ try: of_response = requests.get(self.url + "restconf/operational/opendaylight-inventory:nodes", @@ -98,27 +98,27 @@ class OfConnOdl(OpenflowConn): error_text = "Openflow response {}: {}".format(of_response.status_code, of_response.text) if of_response.status_code != 200: self.logger.warning("get_of_switches " + error_text) - raise OpenflowconnUnexpectedResponse("Error get_of_switches " + error_text) + raise OpenflowConnUnexpectedResponse("Error get_of_switches " + error_text) self.logger.debug("get_of_switches " + error_text) info = of_response.json() if not isinstance(info, dict): self.logger.error("get_of_switches. Unexpected response, not a dict: %s", str(info)) - raise OpenflowconnUnexpectedResponse("Unexpected response, not a dict. Wrong version?") + raise OpenflowConnUnexpectedResponse("Unexpected response, not a dict. Wrong version?") nodes = info.get('nodes') if type(nodes) is not dict: self.logger.error("get_of_switches. Unexpected response at 'nodes', not found or not a dict: %s", str(type(info))) - raise OpenflowconnUnexpectedResponse("Unexpected response at 'nodes', not found or not a dict." + raise OpenflowConnUnexpectedResponse("Unexpected response at 'nodes', not found or not a dict." " Wrong version?") node_list = nodes.get('node') if type(node_list) is not list: self.logger.error("get_of_switches. Unexpected response, at 'nodes':'node', " "not found or not a list: %s", str(type(node_list))) - raise OpenflowconnUnexpectedResponse("Unexpected response, at 'nodes':'node', not found " + raise OpenflowConnUnexpectedResponse("Unexpected response, at 'nodes':'node', not found " "or not a list. Wrong version?") switch_list = [] @@ -127,7 +127,7 @@ class OfConnOdl(OpenflowConn): if node_id is None: self.logger.error("get_of_switches. Unexpected response at 'nodes':'node'[]:'id', not found: %s", str(node)) - raise OpenflowconnUnexpectedResponse("Unexpected response at 'nodes':'node'[]:'id', not found. " + raise OpenflowConnUnexpectedResponse("Unexpected response at 'nodes':'node'[]:'id', not found. " "Wrong version?") if node_id == 'controller-config': @@ -137,28 +137,29 @@ class OfConnOdl(OpenflowConn): if node_ip_address is None: self.logger.error("get_of_switches. Unexpected response at 'nodes':'node'[]:'flow-node-inventory:" "ip-address', not found: %s", str(node)) - raise OpenflowconnUnexpectedResponse("Unexpected response at 'nodes':'node'[]:" + raise OpenflowConnUnexpectedResponse("Unexpected response at 'nodes':'node'[]:" "'flow-node-inventory:ip-address', not found. Wrong version?") node_id_hex = hex(int(node_id.split(':')[1])).split('x')[1].zfill(16) - switch_list.append((':'.join(a+b for a,b in zip(node_id_hex[::2], node_id_hex[1::2])), node_ip_address)) + switch_list.append((':'.join(a+b for a, b in zip(node_id_hex[::2], node_id_hex[1::2])), + node_ip_address)) return switch_list except requests.exceptions.RequestException as e: error_text = type(e).__name__ + ": " + str(e) self.logger.error("get_of_switches " + error_text) - raise OpenflowconnConnectionException(error_text) + raise OpenflowConnConnectionException(error_text) except ValueError as e: # ValueError in the case that JSON can not be decoded error_text = type(e).__name__ + ": " + str(e) self.logger.error("get_of_switches " + error_text) - raise OpenflowconnUnexpectedResponse(error_text) + raise OpenflowConnUnexpectedResponse(error_text) def obtain_port_correspondence(self): """ Obtain the correspondence between physical and openflow port names :return: dictionary: with physical name as key, openflow name as value, - Raise a OpenflowconnConnectionException expection in case of failure + Raise a OpenflowConnConnectionException expection in case of failure """ try: of_response = requests.get(self.url + "restconf/operational/opendaylight-inventory:nodes", @@ -166,26 +167,26 @@ class OfConnOdl(OpenflowConn): error_text = "Openflow response {}: {}".format(of_response.status_code, of_response.text) if of_response.status_code != 200: self.logger.warning("obtain_port_correspondence " + error_text) - raise OpenflowconnUnexpectedResponse(error_text) + raise OpenflowConnUnexpectedResponse(error_text) self.logger.debug("obtain_port_correspondence " + error_text) info = of_response.json() if not isinstance(info, dict): self.logger.error("obtain_port_correspondence. Unexpected response not a dict: %s", str(info)) - raise OpenflowconnUnexpectedResponse("Unexpected openflow response, not a dict. Wrong version?") + raise OpenflowConnUnexpectedResponse("Unexpected openflow response, not a dict. Wrong version?") nodes = info.get('nodes') if not isinstance(nodes, dict): self.logger.error("obtain_port_correspondence. Unexpected response at 'nodes', " "not found or not a dict: %s", str(type(nodes))) - raise OpenflowconnUnexpectedResponse("Unexpected response at 'nodes',not found or not a dict. " + raise OpenflowConnUnexpectedResponse("Unexpected response at 'nodes',not found or not a dict. " "Wrong version?") node_list = nodes.get('node') if not isinstance(node_list, list): self.logger.error("obtain_port_correspondence. Unexpected response, at 'nodes':'node', " "not found or not a list: %s", str(type(node_list))) - raise OpenflowconnUnexpectedResponse("Unexpected response, at 'nodes':'node', not found or not a list." + raise OpenflowConnUnexpectedResponse("Unexpected response, at 'nodes':'node', not found or not a list." " Wrong version?") for node in node_list: @@ -193,7 +194,7 @@ class OfConnOdl(OpenflowConn): if node_id is None: self.logger.error("obtain_port_correspondence. Unexpected response at 'nodes':'node'[]:'id', " "not found: %s", str(node)) - raise OpenflowconnUnexpectedResponse("Unexpected response at 'nodes':'node'[]:'id', not found. " + raise OpenflowConnUnexpectedResponse("Unexpected response at 'nodes':'node'[]:'id', not found. " "Wrong version?") if node_id == 'controller-config': @@ -209,7 +210,7 @@ class OfConnOdl(OpenflowConn): if not isinstance(node_connector_list, list): self.logger.error("obtain_port_correspondence. Unexpected response at " "'nodes':'node'[]:'node-connector', not found or not a list: %s", str(node)) - raise OpenflowconnUnexpectedResponse("Unexpected response at 'nodes':'node'[]:'node-connector', " + raise OpenflowConnUnexpectedResponse("Unexpected response at 'nodes':'node'[]:'node-connector', " "not found or not a list. Wrong version?") for node_connector in node_connector_list: @@ -220,7 +221,7 @@ class OfConnOdl(OpenflowConn): if node_ip_address is None: self.logger.error("obtain_port_correspondence. Unexpected response at 'nodes':'node'[]:" "'flow-node-inventory:ip-address', not found: %s", str(node)) - raise OpenflowconnUnexpectedResponse("Unexpected response at 'nodes':'node'[]:" + raise OpenflowConnUnexpectedResponse("Unexpected response at 'nodes':'node'[]:" "'flow-node-inventory:ip-address', not found. Wrong version?") # If we found the appropriate dpid no need to continue in the for loop @@ -231,12 +232,12 @@ class OfConnOdl(OpenflowConn): except requests.exceptions.RequestException as e: error_text = type(e).__name__ + ": " + str(e) self.logger.error("obtain_port_correspondence " + error_text) - raise OpenflowconnConnectionException(error_text) + raise OpenflowConnConnectionException(error_text) except ValueError as e: # ValueError in the case that JSON can not be decoded error_text = type(e).__name__ + ": " + str(e) self.logger.error("obtain_port_correspondence " + error_text) - raise OpenflowconnUnexpectedResponse(error_text) + raise OpenflowConnUnexpectedResponse(error_text) def get_of_rules(self, translate_of_ports=True): """ @@ -252,7 +253,7 @@ class OfConnOdl(OpenflowConn): (vlan, None/int): for stripping/setting a vlan tag (out, port): send to this port switch: DPID, all - Raise a OpenflowconnConnectionException exception in case of failure + Raise a OpenflowConnConnectionException exception in case of failure """ @@ -271,7 +272,7 @@ class OfConnOdl(OpenflowConn): elif of_response.status_code != 200: self.logger.warning("get_of_rules " + error_text) - raise OpenflowconnUnexpectedResponse(error_text) + raise OpenflowConnUnexpectedResponse(error_text) self.logger.debug("get_of_rules " + error_text) @@ -279,13 +280,13 @@ class OfConnOdl(OpenflowConn): if not isinstance(info, dict): self.logger.error("get_of_rules. Unexpected response not a dict: %s", str(info)) - raise OpenflowconnUnexpectedResponse("Unexpected openflow response, not a dict. Wrong version?") + raise OpenflowConnUnexpectedResponse("Unexpected openflow response, not a dict. Wrong version?") table = info.get('flow-node-inventory:table') if not isinstance(table, list): self.logger.error("get_of_rules. Unexpected response at 'flow-node-inventory:table', " "not a list: %s", str(type(table))) - raise OpenflowconnUnexpectedResponse("Unexpected response at 'flow-node-inventory:table', not a list. " + raise OpenflowConnUnexpectedResponse("Unexpected response at 'flow-node-inventory:table', not a list. " "Wrong version?") flow_list = table[0].get('flow') @@ -295,7 +296,7 @@ class OfConnOdl(OpenflowConn): if not isinstance(flow_list, list): self.logger.error("get_of_rules. Unexpected response at 'flow-node-inventory:table'[0]:'flow', not a " "list: %s", str(type(flow_list))) - raise OpenflowconnUnexpectedResponse("Unexpected response at 'flow-node-inventory:table'[0]:'flow', " + raise OpenflowConnUnexpectedResponse("Unexpected response at 'flow-node-inventory:table'[0]:'flow', " "not a list. Wrong version?") # TODO translate ports according to translate_of_ports parameter @@ -303,10 +304,10 @@ class OfConnOdl(OpenflowConn): rules = [] # Response list for flow in flow_list: if not ('id' in flow and 'match' in flow and 'instructions' in flow and - 'instruction' in flow['instructions'] and - 'apply-actions' in flow['instructions']['instruction'][0] and - 'action' in flow['instructions']['instruction'][0]['apply-actions']): - raise OpenflowconnUnexpectedResponse("unexpected openflow response, one or more elements are " + 'instruction' in flow['instructions'] and + 'apply-actions' in flow['instructions']['instruction'][0] and + 'action' in flow['instructions']['instruction'][0]['apply-actions']): + raise OpenflowConnUnexpectedResponse("unexpected openflow response, one or more elements are " "missing. Wrong version?") flow['instructions']['instruction'][0]['apply-actions']['action'] @@ -319,7 +320,7 @@ class OfConnOdl(OpenflowConn): if 'in-port' in flow['match']: in_port = flow['match']['in-port'] if in_port not in self.ofi2pp: - raise OpenflowconnUnexpectedResponse("Error: Ingress port {} is not in switch port list". + raise OpenflowConnUnexpectedResponse("Error: Ingress port {} is not in switch port list". format(in_port)) if translate_of_ports: @@ -330,7 +331,7 @@ class OfConnOdl(OpenflowConn): if 'vlan-match' in flow['match'] and 'vlan-id' in flow['match']['vlan-match'] and \ 'vlan-id' in flow['match']['vlan-match']['vlan-id'] and \ 'vlan-id-present' in flow['match']['vlan-match']['vlan-id'] and \ - flow['match']['vlan-match']['vlan-id']['vlan-id-present'] == True: + flow['match']['vlan-match']['vlan-id']['vlan-id-present'] is True: rule['vlan_id'] = flow['match']['vlan-match']['vlan-id']['vlan-id'] if 'ethernet-match' in flow['match'] and 'ethernet-destination' in flow['match']['ethernet-match'] \ @@ -348,12 +349,12 @@ class OfConnOdl(OpenflowConn): for instruction in instructions: if 'output-action' in instruction: if 'output-node-connector' not in instruction['output-action']: - raise OpenflowconnUnexpectedResponse("unexpected openflow response, one or more elementa " + raise OpenflowConnUnexpectedResponse("unexpected openflow response, one or more elementa " "are missing. Wrong version?") out_port = instruction['output-action']['output-node-connector'] if out_port not in self.ofi2pp: - raise OpenflowconnUnexpectedResponse("Error: Output port {} is not in switch port list". + raise OpenflowConnUnexpectedResponse("Error: Output port {} is not in switch port list". format(out_port)) if translate_of_ports: @@ -368,7 +369,7 @@ class OfConnOdl(OpenflowConn): if not ('vlan-match' in instruction['set-field'] and 'vlan-id' in instruction['set-field']['vlan-match'] and 'vlan-id' in instruction['set-field']['vlan-match']['vlan-id']): - raise OpenflowconnUnexpectedResponse("unexpected openflow response, one or more elements " + raise OpenflowConnUnexpectedResponse("unexpected openflow response, one or more elements " "are missing. Wrong version?") actions[instruction['order']] = ('vlan', @@ -383,18 +384,18 @@ class OfConnOdl(OpenflowConn): except requests.exceptions.RequestException as e: error_text = type(e).__name__ + ": " + str(e) self.logger.error("get_of_rules " + error_text) - raise OpenflowconnConnectionException(error_text) + raise OpenflowConnConnectionException(error_text) except ValueError as e: # ValueError in the case that JSON can not be decoded error_text = type(e).__name__ + ": " + str(e) self.logger.error("get_of_rules " + error_text) - raise OpenflowconnUnexpectedResponse(error_text) + raise OpenflowConnUnexpectedResponse(error_text) def del_flow(self, flow_name): """ Delete an existing rule :param flow_name: flow_name, this is the rule name - :return: Raise a OpenflowconnConnectionException expection in case of failure + :return: Raise a OpenflowConnConnectionException expection in case of failure """ try: @@ -403,14 +404,14 @@ class OfConnOdl(OpenflowConn): error_text = "Openflow response {}: {}".format(of_response.status_code, of_response.text) if of_response.status_code != 200: self.logger.warning("del_flow " + error_text) - raise OpenflowconnUnexpectedResponse(error_text) + raise OpenflowConnUnexpectedResponse(error_text) self.logger.debug("del_flow OK " + error_text) return None except requests.exceptions.RequestException as e: # raise an exception in case of contection error error_text = type(e).__name__ + ": " + str(e) self.logger.error("del_flow " + error_text) - raise OpenflowconnConnectionException(error_text) + raise OpenflowConnConnectionException(error_text) def new_flow(self, data): """ @@ -424,7 +425,7 @@ class OfConnOdl(OpenflowConn): actions: list of actions, composed by a pair tuples with these posibilities: ('vlan', None/int): for stripping/setting a vlan tag ('out', port): send to this port - :return: Raise a OpenflowconnConnectionException exception in case of failure + :return: Raise a OpenflowConnConnectionException exception in case of failure """ try: @@ -446,7 +447,7 @@ class OfConnOdl(OpenflowConn): if not data['ingress_port'] in self.pp2ofi: error_text = 'Error. Port ' + data['ingress_port'] + ' is not present in the switch' self.logger.warning("new_flow " + error_text) - raise OpenflowconnUnexpectedResponse(error_text) + raise OpenflowConnUnexpectedResponse(error_text) flow['match']['in-port'] = self.pp2ofi[data['ingress_port']] if data.get('dst_mac'): flow['match']['ethernet-match'] = { @@ -487,13 +488,13 @@ class OfConnOdl(OpenflowConn): new_action['output-action'] = {} if not action[1] in self.pp2ofi: error_msg = 'Port ' + action[1] + ' is not present in the switch' - raise OpenflowconnUnexpectedResponse(error_msg) + raise OpenflowConnUnexpectedResponse(error_msg) new_action['output-action']['output-node-connector'] = self.pp2ofi[action[1]] else: - error_msg = "Unknown item '%s' in action list".format(action[0]) + error_msg = "Unknown item '{}' in action list".format(action[0]) self.logger.error("new_flow " + error_msg) - raise OpenflowconnUnexpectedResponse(error_msg) + raise OpenflowConnUnexpectedResponse(error_msg) actions.append(new_action) order += 1 @@ -504,7 +505,7 @@ class OfConnOdl(OpenflowConn): error_text = "Openflow response {}: {}".format(of_response.status_code, of_response.text) if of_response.status_code != 200: self.logger.warning("new_flow " + error_text) - raise OpenflowconnUnexpectedResponse(error_text) + raise OpenflowConnUnexpectedResponse(error_text) self.logger.debug("new_flow OK " + error_text) return None @@ -512,12 +513,12 @@ class OfConnOdl(OpenflowConn): # raise an exception in case of contection error error_text = type(e).__name__ + ": " + str(e) self.logger.error("new_flow " + error_text) - raise OpenflowconnConnectionException(error_text) + raise OpenflowConnConnectionException(error_text) def clear_all_flows(self): """ Delete all existing rules - :return: Raise a OpenflowconnConnectionException expection in case of failure + :return: Raise a OpenflowConnConnectionException expection in case of failure """ try: of_response = requests.delete(self.url + "restconf/config/opendaylight-inventory:nodes/node/" + self.id + @@ -525,10 +526,10 @@ class OfConnOdl(OpenflowConn): error_text = "Openflow response {}: {}".format(of_response.status_code, of_response.text) if of_response.status_code != 200 and of_response.status_code != 404: # HTTP_Not_Found self.logger.warning("clear_all_flows " + error_text) - raise OpenflowconnUnexpectedResponse(error_text) + raise OpenflowConnUnexpectedResponse(error_text) self.logger.debug("clear_all_flows OK " + error_text) return None except requests.exceptions.RequestException as e: error_text = type(e).__name__ + ": " + str(e) self.logger.error("clear_all_flows " + error_text) - raise OpenflowconnConnectionException(error_text) + raise OpenflowConnConnectionException(error_text)