import requests
import base64
import logging
-from osm_ro.wim.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):
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
"""
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",
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 = []
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':
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",
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:
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':
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:
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
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):
"""
(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
"""
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)
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')
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
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']
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:
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'] \
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:
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',
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:
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):
"""
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:
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'] = {
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
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
# 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 +
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)