Skip to content

Commit

Permalink
Merge "Fixes: ST: allow the same vmi to be referenced in multiple ser…
Browse files Browse the repository at this point in the history
…vice-instances" into R3.2
  • Loading branch information
Zuul authored and opencontrail-ci-admin committed Apr 18, 2017
2 parents 9f5b1e7 + ae73f86 commit fc5349d
Show file tree
Hide file tree
Showing 3 changed files with 252 additions and 105 deletions.
9 changes: 6 additions & 3 deletions src/config/common/tests/test_common.py
Expand Up @@ -700,7 +700,8 @@ def create_virtual_network(self, vn_name, vn_subnet):
return vn_obj
# end create_virtual_network

def _create_service(self, vn_list, si_name, auto_policy, **kwargs):
def _create_service(self, vn_list, si_name, auto_policy,
create_right_port=True, **kwargs):
sa_set = None
if kwargs.get('service_virtualization_type') == 'physical-device':
pr = PhysicalRouter(si_name)
Expand Down Expand Up @@ -748,6 +749,8 @@ def _create_service(self, vn_list, si_name, auto_policy, **kwargs):
pt = PortTuple('pt-'+si_name, parent_obj=service_instance)
self._vnc_lib.port_tuple_create(pt)
for if_type, vn_name in vn_list:
if if_type == 'right' and not create_right_port:
continue
port = VirtualMachineInterface(si_name+if_type, parent_obj=proj)
vmi_props = VirtualMachineInterfacePropertiesType(
service_interface_type=if_type)
Expand All @@ -764,7 +767,7 @@ def _create_service(self, vn_list, si_name, auto_policy, **kwargs):
return service_instance.get_fq_name_str()

def create_network_policy(self, vn1, vn2, service_list=None, mirror_service=None,
auto_policy=False, **kwargs):
auto_policy=False, create_right_port = True, **kwargs):
vn1_name = vn1 if isinstance(vn1, basestring) else vn1.get_fq_name_str()
vn2_name = vn2 if isinstance(vn2, basestring) else vn2.get_fq_name_str()

Expand All @@ -778,7 +781,7 @@ def create_network_policy(self, vn1, vn2, service_list=None, mirror_service=None
for service in si_list:
service_name_list.append(self._create_service(
[('left', vn1_name), ('right', vn2_name)], service,
auto_policy, **kwargs))
auto_policy, create_right_port, **kwargs))
if mirror_service:
mirror_si = self._create_service(
[('left', vn1_name), ('right', vn2_name)], mirror_service, False,
Expand Down
201 changes: 104 additions & 97 deletions src/config/schema-transformer/config_db.py
Expand Up @@ -2347,12 +2347,10 @@ def delete_obj(self):
for vmi_name in list(self.virtual_machine_interfaces):
vmi = VirtualMachineInterfaceST.get(vmi_name)
if vmi:
vm_pt = PortTupleST.get(vmi.port_tuple)
if vm_pt is None:
vm_pt = VirtualMachineST.get(vmi.virtual_machine)
if vm_pt is not None:
vm_pt_list = vmi.get_virtual_machine_or_port_tuple()
for vm_pt in vm_pt_list:
self._cassandra.free_service_chain_vlan(vm_pt.uuid,
service_chain)
service_chain)
vmi.delete_routing_instance(self)
# end for vmi_name

Expand Down Expand Up @@ -3308,7 +3306,7 @@ def __init__(self, name, obj=None):
self.interface_mirror = None
self.virtual_network = None
self.virtual_machine = None
self.port_tuple = None
self.port_tuples = set()
self.logical_router = None
self.bgp_as_a_service = None
self.uuid = None
Expand All @@ -3330,6 +3328,7 @@ def update(self, obj=None):
self.set_properties()
if 'routing_instance' in changed:
self.update_routing_instances(self.obj.get_routing_instance_refs())
self.update_multiple_refs('port_tuple', self.obj)
return changed
# end update

Expand All @@ -3338,6 +3337,7 @@ def delete_obj(self):
self.update_single_ref('virtual_machine', {})
self.update_single_ref('logical_router', {})
self.update_multiple_refs('instance_ip', {})
self.update_multiple_refs('port_tuple', {})
self.update_multiple_refs('floating_ip', {})
self.update_multiple_refs('alias_ip', {})
self.update_single_ref('bgp_as_a_service', {})
Expand Down Expand Up @@ -3431,42 +3431,46 @@ def delete_routing_instance(self, ri):
# end delete_routing_instance

def get_virtual_machine_or_port_tuple(self):
if self.port_tuple:
return PortTupleST.get(self.port_tuple)
if self.port_tuples:
pt_list = [PortTupleST.get(x) for x in self.port_tuples if x is not None]
return pt_list
elif self.virtual_machine:
return VirtualMachineST.get(self.virtual_machine)
return None
# end get_service_instance
vm = VirtualMachineST.get(self.virtual_machine)
return [vm] if vm is not None else []
return []
# end get_virtual_machine_or_port_tuple

def _add_pbf_rules(self):
if self.service_interface_type not in ['left', 'right']:
return

vm_pt = self.get_virtual_machine_or_port_tuple()
if not vm_pt or vm_pt.get_service_mode() != 'transparent':
return
for service_chain in ServiceChain.values():
if vm_pt.service_instance not in service_chain.service_list:
continue
if not service_chain.created:
continue
if self.service_interface_type == 'left':
vn_obj = VirtualNetworkST.locate(service_chain.left_vn)
vn1_obj = vn_obj
else:
vn1_obj = VirtualNetworkST.locate(service_chain.left_vn)
vn_obj = VirtualNetworkST.locate(service_chain.right_vn)
vm_pt_list = self.get_virtual_machine_or_port_tuple()
for vm_pt in vm_pt_list:
if not vm_pt or vm_pt.get_service_mode() != 'transparent':
return
for service_chain in ServiceChain.values():
if vm_pt.service_instance not in service_chain.service_list:
continue
if not service_chain.created:
continue
if self.service_interface_type == 'left':
vn_obj = VirtualNetworkST.locate(service_chain.left_vn)
vn1_obj = vn_obj
else:
vn1_obj = VirtualNetworkST.locate(service_chain.left_vn)
vn_obj = VirtualNetworkST.locate(service_chain.right_vn)

service_name = vn_obj.get_service_name(service_chain.name,
vm_pt.service_instance)
service_ri = RoutingInstanceST.get(service_name)
v4_address, v6_address = vn1_obj.allocate_service_chain_ip(
service_name)
vlan = self._cassandra.allocate_service_chain_vlan(
vm_pt.uuid, service_chain.name)
service_name = vn_obj.get_service_name(service_chain.name,
vm_pt.service_instance)
service_ri = RoutingInstanceST.get(service_name)
v4_address, v6_address = vn1_obj.allocate_service_chain_ip(
service_name)
vlan = self._cassandra.allocate_service_chain_vlan(
vm_pt.uuid, service_chain.name)

service_chain.add_pbf_rule(self, service_ri, v4_address,
v6_address, vlan)
service_chain.add_pbf_rule(self, service_ri, v4_address,
v6_address, vlan)
#end for vm_pt
# end _add_pbf_rules

def set_virtual_network(self):
Expand Down Expand Up @@ -3508,78 +3512,81 @@ def recreate_vrf_assign_table(self):
if vn is None:
self._set_vrf_assign_table(None)
return
vm_pt = self.get_virtual_machine_or_port_tuple()
if not vm_pt:
self._set_vrf_assign_table(None)
return
smode = vm_pt.get_service_mode()
if smode not in ['in-network', 'in-network-nat']:
vm_pt_list = self.get_virtual_machine_or_port_tuple()
if not vm_pt_list:
self._set_vrf_assign_table(None)
return

policy_rule_count = 0
vrf_table = VrfAssignTableType()
ip_list = []
for ip_name in self.instance_ips:
ip = InstanceIpST.get(ip_name)
if ip and ip.instance_ip_address:
ip_list.append((ip.ip_version, ip.instance_ip_address))
for ip_name in self.floating_ips:
ip = FloatingIpST.get(ip_name)
if ip and ip.floating_ip_address:
ip_list.append((ip.ip_version, ip.floating_ip_address))
for ip_name in self.alias_ips:
ip = AliasIpST.get(ip_name)
if ip and ip.alias_ip_address:
ip_list.append((ip.ip_version, ip.alias_ip_address))
for (ip_version, ip_address) in ip_list:
if ip_version == 6:
address = AddressType(subnet=SubnetType(ip_address, 128))
else:
address = AddressType(subnet=SubnetType(ip_address, 32))
for vm_pt in vm_pt_list:
smode = vm_pt.get_service_mode()
if smode not in ['in-network', 'in-network-nat']:
self._set_vrf_assign_table(None)
return

mc = MatchConditionType(src_address=address,
protocol='any',
src_port=PortType(),
dst_port=PortType())
vrf_table = VrfAssignTableType()
ip_list = []
for ip_name in self.instance_ips:
ip = InstanceIpST.get(ip_name)
if ip and ip.instance_ip_address:
ip_list.append((ip.ip_version, ip.instance_ip_address))
for ip_name in self.floating_ips:
ip = FloatingIpST.get(ip_name)
if ip and ip.floating_ip_address:
ip_list.append((ip.ip_version, ip.floating_ip_address))
for ip_name in self.alias_ips:
ip = AliasIpST.get(ip_name)
if ip and ip.alias_ip_address:
ip_list.append((ip.ip_version, ip.alias_ip_address))
for (ip_version, ip_address) in ip_list:
if ip_version == 6:
address = AddressType(subnet=SubnetType(ip_address, 128))
else:
address = AddressType(subnet=SubnetType(ip_address, 32))

vrf_rule = VrfAssignRuleType(match_condition=mc,
routing_instance=vn._default_ri_name,
ignore_acl=False)
vrf_table.add_vrf_assign_rule(vrf_rule)
mc = MatchConditionType(src_address=address,
protocol='any',
src_port=PortType(),
dst_port=PortType())

policy_rule_count = 0
si_name = vm_pt.service_instance
if smode == 'in-network-nat' and self.service_interface_type == 'right':
vn_service_chains = []
else:
vn_service_chains = vn.service_chains.values()
vrf_rule = VrfAssignRuleType(match_condition=mc,
routing_instance=vn._default_ri_name,
ignore_acl=False)
vrf_table.add_vrf_assign_rule(vrf_rule)

for service_chain_list in vn_service_chains:
for service_chain in service_chain_list:
if not service_chain.created:
continue
if si_name not in service_chain.service_list:
continue
ri_name = vn.get_service_name(service_chain.name, si_name)
for sp in service_chain.sp_list:
for dp in service_chain.dp_list:
if self.service_interface_type == 'left':
mc = MatchConditionType(src_port=dp,
dst_port=sp,
protocol=service_chain.protocol)
else:
mc = MatchConditionType(src_port=sp,
dst_port=dp,
protocol=service_chain.protocol)

vrf_rule = VrfAssignRuleType(match_condition=mc,
routing_instance=ri_name,
ignore_acl=True)
vrf_table.add_vrf_assign_rule(vrf_rule)
policy_rule_count += 1
# end for service_chain
# end for service_chain_list
si_name = vm_pt.service_instance
if smode == 'in-network-nat' and self.service_interface_type == 'right':
vn_service_chains = []
else:
vn_service_chains = vn.service_chains.values()

for service_chain_list in vn_service_chains:
for service_chain in service_chain_list:
if not service_chain.created:
continue
if si_name not in service_chain.service_list:
continue
ri_name = vn.get_service_name(service_chain.name, si_name)
for sp in service_chain.sp_list:
for dp in service_chain.dp_list:
if self.service_interface_type == 'left':
mc = MatchConditionType(src_port=dp,
dst_port=sp,
protocol=service_chain.protocol)
else:
mc = MatchConditionType(src_port=sp,
dst_port=dp,
protocol=service_chain.protocol)

vrf_rule = VrfAssignRuleType(match_condition=mc,
routing_instance=ri_name,
ignore_acl=True)
vrf_table.add_vrf_assign_rule(vrf_rule)
policy_rule_count += 1
# end for service_chain
# end for service_chain_list
#end for vm_pt_list
if policy_rule_count == 0:
vrf_table = None
self._set_vrf_assign_table(vrf_table)
Expand Down

0 comments on commit fc5349d

Please sign in to comment.