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"
  • Loading branch information
Zuul authored and opencontrail-ci-admin committed Apr 7, 2017
2 parents 0876422 + e47f515 commit fafae7b
Show file tree
Hide file tree
Showing 3 changed files with 105 additions and 70 deletions.
9 changes: 6 additions & 3 deletions src/config/common/tests/test_common.py
Original file line number Diff line number Diff line change
Expand Up @@ -736,7 +736,8 @@ def create_virtual_network(self, vn_name, vn_subnet='10.0.0.0/24'):
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 @@ -784,6 +785,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 @@ -800,7 +803,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 @@ -814,7 +817,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
4 changes: 2 additions & 2 deletions src/config/schema-transformer/config_db.py
Original file line number Diff line number Diff line change
Expand Up @@ -3588,13 +3588,14 @@ def recreate_vrf_assign_table(self):
self._set_vrf_assign_table(None)
return

policy_rule_count = 0
vrf_table = VrfAssignTableType()
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

vrf_table = VrfAssignTableType()
ip_list = []
for ip_name in self.instance_ips:
ip = InstanceIpST.get(ip_name)
Expand Down Expand Up @@ -3624,7 +3625,6 @@ def recreate_vrf_assign_table(self):
ignore_acl=False)
vrf_table.add_vrf_assign_rule(vrf_rule)

policy_rule_count = 0
si_name = vm_pt.service_instance
if smode == 'in-network-nat' and self.service_interface_type == 'right':
vn_service_chains = []
Expand Down
162 changes: 97 additions & 65 deletions src/config/schema-transformer/test/test_service_policy.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,9 @@
VirtualMachineInterface, InterfaceMirrorType, MirrorActionType,
ServiceChainInfo, RoutingPolicy, RoutingPolicyServiceInstanceType,
RouteListType, RouteAggregate,RouteTargetList, ServiceInterfaceTag,
PolicyBasedForwardingRuleType, PortTuple, Project)
PolicyBasedForwardingRuleType)

from cfgm_common.exceptions import RefsExistError
from test_case import STTestCase, retries
from test_policy import VerifyPolicy
sys.path.append("../common/tests")
Expand Down Expand Up @@ -279,15 +280,6 @@ def check_acl_match_subnets(self, fq_name, subnet1, subnet2, sc_ri_fq_name):
raise Exception('subnets assigned not matched in ACL rules for %s; sc: %s' %
(fq_name, sc_ri_fq_name))

@retries(5)
def check_vmi_port_tuple(self, vmi_fq_name, pt_uuid):
vmi_obj = self._vnc_lib.virtual_machine_interface_read(fq_name=vmi_fq_name)
for pt in vmi_obj.get_port_tuple_refs():
if pt['uuid'] == pt_uuid:
return
raise Exception('Port Tuple with UUID %s not attached with VMI %s' %
(pt_uuid, vmi_fq_name))

@retries(10)
def get_si_vm_obj(self, si_obj):
vm_ref = si_obj.get_virtual_machine_back_refs()
Expand Down Expand Up @@ -1809,14 +1801,6 @@ def test_vrf_assign_rules(self):
self.delete_vn(fq_name=vn2_obj.get_fq_name())
#end test vrf_assign_rules

@retries(5)
def delete_vmis(self, vmis=[]):
for vmi in vmis or []:
try:
self._vnc_lib.virtual_machine_interface_delete(id=vmi['uuid'])
except RefsExistError:
raise Exception('virtual machine interface %s still exists' % vmi['uuid'])

def test_service_policy_vmi_with_multi_port_tuples(self):

# -------
Expand All @@ -1842,63 +1826,111 @@ def test_service_policy_vmi_with_multi_port_tuples(self):
vn3_obj = self.create_virtual_network(vn3_name, '30.0.0.0/24')

si1 = [self.id() + '_s1']
np = self.create_network_policy(vn1_obj, vn3_obj, si1,
auto_policy=False,
service_mode='in-network',
version=2)
right_vmi = self._vnc_lib.virtual_machine_interface_read(fq_name=[u'default-domain',
u'default-project',
si1[0] + 'right'])

# Creating a service instance SI2 but the right network being the
# same VMI as the one created earlier.
si2_name = self.id() + '_s2'
si2 = self._create_service([('left', vn2_obj.get_fq_name_str()), ('right', vn3_obj.get_fq_name_str())],
si2_name, False)
si2_obj = self._vnc_lib.service_instance_read(fq_name_str=si2)

proj = Project()
pt = PortTuple('pt-'+si2_name, parent_obj=si2_obj)
self._vnc_lib.port_tuple_create(pt)
port = VirtualMachineInterface(si2_name+'left', parent_obj=proj)
vmi_props = VirtualMachineInterfacePropertiesType(service_interface_type='left')
port.set_virtual_machine_interface_properties(vmi_props)
port.add_virtual_network(vn2_obj)
port.add_port_tuple(pt)
self._vnc_lib.virtual_machine_interface_create(port)
right_vmi.add_port_tuple(pt)
self._vnc_lib.virtual_machine_interface_update(right_vmi)

pt1_obj = self._vnc_lib.port_tuple_read(fq_name=[u'default-domain',
u'default-project',
si1[0],
'pt-'+si1[0]])
pt2_obj = self._vnc_lib.port_tuple_read(fq_name=[u'default-domain',
u'default-project',
si2_name,
'pt-'+si2_name])
# Creating a SI(ver2) between VN1 and VN3
np1 = self.create_network_policy(vn1_obj, vn3_obj, si1,
auto_policy=False,
service_mode='in-network',
version=2)

seq = SequenceType(1, 1)
vnp = VirtualNetworkPolicyType(seq)

self.check_vmi_port_tuple(right_vmi.fq_name, pt1_obj.uuid)
self.check_vmi_port_tuple(right_vmi.fq_name, pt2_obj.uuid)
vn1_obj.set_network_policy(np1, vnp)
vn3_obj.set_network_policy(np1, vnp)
vn1_obj.set_multi_policy_service_chains_enabled(True)
vn3_obj.set_multi_policy_service_chains_enabled(True)
self._vnc_lib.virtual_network_update(vn1_obj)
self._vnc_lib.virtual_network_update(vn3_obj)

self._vnc_lib.service_instance_delete(fq_name=[u'default-domain',
u'default-project',
si1[0]])
self._vnc_lib.service_instance_delete(fq_name=[u'default-domain',
u'default-project',
si2_name])
si1_sc_ri_uuid = self.wait_to_get_sc(check_create=True)
si1_sc_ri_name = 'service-' +\
si1_sc_ri_uuid +\
'-default-domain_default-project_' +\
si1[0]

vmis = self._vnc_lib.virtual_machine_interfaces_list().get('virtual-machine-interfaces')
self.delete_vmis(vmis)
right_vmi = self._vnc_lib.virtual_machine_interface_read(fq_name=[u'default-domain',
u'default-project',
si1[0] + 'right'])
# Creating a network policy between VN2 and VN3 but with the
# right VMI for the SI skipped.
np2 = self.create_network_policy(vn2_obj, vn3_obj,
[self.id() + '_s2'],
auto_policy = False,
create_right_port = False,
service_mode = 'in-network',
version =2)
# Adding the Right VMI of SI1 to SI2.
si2_pt_fqdn = [u'default-domain',
u'default-project',
si2_name,
u'pt-' + si2_name]
si2_pt_obj = self._vnc_lib.port_tuple_read(fq_name = si2_pt_fqdn)
right_vmi.add_port_tuple(si2_pt_obj)
self._vnc_lib.virtual_machine_interface_update(right_vmi)

vn1_obj.del_network_policy(np)
vn2_obj.del_network_policy(np)
vn3_obj.del_network_policy(np)
vn2_obj.set_network_policy(np2, vnp)
vn3_obj.add_network_policy(np2, vnp)
vn2_obj.set_multi_policy_service_chains_enabled(True)
self._vnc_lib.virtual_network_update(vn2_obj)
self._vnc_lib.virtual_network_update(vn3_obj)

si2_sc_ri_uuid = self.wait_to_get_sc(left_vn=vn2_obj.get_fq_name_str(),
right_vn=vn3_obj.get_fq_name_str(),
check_create=True)
si2_sc_ri_name = 'service-' + si2_sc_ri_uuid +\
'-default-domain_default-project_' +\
si2_name

# Checking the VRF assign rules.
self.check_acl_action_assign_rules(vn1_obj.get_fq_name(),
vn1_obj.get_fq_name_str(),
vn3_obj.get_fq_name_str(),
':'.join(self.get_ri_name(vn1_obj, si1_sc_ri_name)))
self.check_acl_action_assign_rules(vn1_obj.get_fq_name(),
vn3_obj.get_fq_name_str(),
vn1_obj.get_fq_name_str(),
':'.join(self.get_ri_name(vn1_obj, si1_sc_ri_name)))
self.check_acl_action_assign_rules(vn3_obj.get_fq_name(),
vn1_obj.get_fq_name_str(),
vn3_obj.get_fq_name_str(),
':'.join(self.get_ri_name(vn3_obj, si1_sc_ri_name)))
self.check_acl_action_assign_rules(vn3_obj.get_fq_name(),
vn1_obj.get_fq_name_str(),
vn3_obj.get_fq_name_str(),
':'.join(self.get_ri_name(vn3_obj, si1_sc_ri_name)))

self.check_acl_action_assign_rules(vn2_obj.get_fq_name(),
vn2_obj.get_fq_name_str(),
vn3_obj.get_fq_name_str(),
':'.join(self.get_ri_name(vn2_obj, si2_sc_ri_name)))
self.check_acl_action_assign_rules(vn2_obj.get_fq_name(),
vn3_obj.get_fq_name_str(),
vn2_obj.get_fq_name_str(),
':'.join(self.get_ri_name(vn2_obj, si2_sc_ri_name)))
self.check_acl_action_assign_rules(vn3_obj.get_fq_name(),
vn2_obj.get_fq_name_str(),
vn3_obj.get_fq_name_str(),
':'.join(self.get_ri_name(vn3_obj, si2_sc_ri_name)))
self.check_acl_action_assign_rules(vn3_obj.get_fq_name(),
vn2_obj.get_fq_name_str(),
vn3_obj.get_fq_name_str(),
':'.join(self.get_ri_name(vn3_obj, si2_sc_ri_name)))

vn1_obj.del_network_policy(np1)
vn3_obj.del_network_policy(np1)
vn2_obj.del_network_policy(np2)
vn3_obj.del_network_policy(np2)
self._vnc_lib.virtual_network_update(vn1_obj)
self._vnc_lib.virtual_network_update(vn2_obj)
self._vnc_lib.virtual_network_update(vn3_obj)
self._vnc_lib.network_policy_delete(id=np.uuid)

self.delete_network_policy(np1)
self.delete_network_policy(np2)
self.delete_vn(fq_name=vn1_obj.get_fq_name())
self.delete_vn(fq_name=vn2_obj.get_fq_name())
self.delete_vn(fq_name=vn3_obj.get_fq_name())
#end test_service_policy_vmi_with_multi_port_tuples

def test_mps_with_nat(self, version=2):
Expand Down

0 comments on commit fafae7b

Please sign in to comment.