X-Git-Url: https://osm.etsi.org/gitweb/?a=blobdiff_plain;f=src%2Femuvim%2Fapi%2Fopenstack%2Fresources%2Fport_chain.py;h=c061a1eed6bb64c664c966f90b8f80e77c63c570;hb=HEAD;hp=7dcd834239061821d9ca9eb5aaec01d7a016e34d;hpb=ce776393dccaf31ad47f21b06dcf0a2ba56b4874;p=osm%2Fvim-emu.git diff --git a/src/emuvim/api/openstack/resources/port_chain.py b/src/emuvim/api/openstack/resources/port_chain.py index 7dcd834..c061a1e 100644 --- a/src/emuvim/api/openstack/resources/port_chain.py +++ b/src/emuvim/api/openstack/resources/port_chain.py @@ -53,41 +53,53 @@ class PortChain(object): } return representation + def _get_port_pair(self, port_pair_group_id, compute): + port_pair_group = compute.find_port_pair_group_by_name_or_id(port_pair_group_id) + if len(port_pair_group.port_pairs) != 1: + raise RuntimeError("Only port pair groups with a single port pair are supported!") + return compute.find_port_pair_by_name_or_id(port_pair_group.port_pairs[0]) + def install(self, compute): + + port_pair_chain = map(lambda port_pair_group_id: self._get_port_pair(port_pair_group_id, compute), + self.port_pair_groups) + ingress_ports = list(map(lambda port_pair: port_pair.ingress, port_pair_chain)) + egress_ports = list(map(lambda port_pair: port_pair.ingress, port_pair_chain)) + chain_start = ingress_ports[0] + chain_rest = ingress_ports[1:] + for flow_classifier_id in self.flow_classifiers: - flow_classifier = compute.find_flow_classifier_by_name_or_id( - flow_classifier_id) - if flow_classifier: - pass - # TODO: for every flow classifier create match and pass it to - # setChain + flow_classifier = compute.find_flow_classifier_by_name_or_id(flow_classifier_id) + if not flow_classifier: + raise RuntimeError("Unable to find flow_classifier %s" % flow_classifier_id) - for group_id in self.port_pair_groups: - port_pair_group = compute.find_port_pair_group_by_name_or_id( - group_id) - for port_pair_id in port_pair_group.port_pairs: - port_pair = compute.find_port_pair_by_name_or_id(port_pair_id) + port = compute.find_port_by_name_or_id(flow_classifier.logical_source_port) - server_ingress = None + chain = [(port, chain_start)] + list(zip(egress_ports, chain_rest)) + + for (egress_port, ingress_port) in chain: server_egress = None + server_ingress = None for server in compute.computeUnits.values(): - if port_pair.ingress.name in server.port_names or port_pair.ingress.id in server.port_names: - server_ingress = server - if port_pair.egress.name in server.port_names or port_pair.egress.id in server.port_names: + if egress_port.name in server.port_names or egress_port.id in server.port_names: server_egress = server + if ingress_port.name in server.port_names or ingress_port.id in server.port_names: + server_ingress = server - if not server_ingress: - raise RuntimeError("Neutron SFC: ingress port %s not connected to any server." % - port_pair.ingress.name) if not server_egress: raise RuntimeError("Neutron SFC: egress port %s not connected to any server." % - port_pair.egress.name) + egress_port.name) + if not server_ingress: + raise RuntimeError("Neutron SFC: ingress port %s not connected to any server." % + ingress_port.name) compute.dc.net.setChain( - server_ingress.name, server_egress.name, - port_pair.ingress.intf_name, port_pair.egress.intf_name, + server_egress.name, server_ingress.name, + egress_port.intf_name, ingress_port.intf_name, + match=flow_classifier.to_match(), + mod_dl_dst=ingress_port.mac_address, cmd="add-flow", cookie=self.cookie, priority=10, bidirectional=False, - monitor=False + monitor=False, skip_vlan_tag=True ) def uninstall(self, compute):