def test_nova_to_osvif_vif_agilio_ovs_forwarder(self): vif = model.VIF(id="dc065497-3c8d-4f44-8fb4-e1d33c16a536", type=model.VIF_TYPE_AGILIO_OVS, address="22:52:25:62:e2:aa", profile={ "pci_slot": "0000:08:08.5", }, network=model.Network( id="b82c1929-051e-481d-8110-4669916c7915", label="Demo Net", subnets=[]), vnic_type=model.VNIC_TYPE_VIRTIO_FORWARDER, details={ model.VIF_DETAILS_VHOSTUSER_MODE: 'client', model.VIF_DETAILS_VHOSTUSER_OVS_PLUG: True, model.VIF_DETAILS_VHOSTUSER_SOCKET: '/fake/socket', }) actual = os_vif_util.nova_to_osvif_vif(vif) expect = osv_objects.vif.VIFVHostUser( id="dc065497-3c8d-4f44-8fb4-e1d33c16a536", active=False, address="22:52:25:62:e2:aa", has_traffic_filtering=False, plugin="agilio_ovs", port_profile=osv_objects.vif.VIFPortProfileOVSRepresentor( interface_id="dc065497-3c8d-4f44-8fb4-e1d33c16a536", representor_address="0000:08:08.5", representor_name="nicdc065497-3c", datapath_offload=osv_objects.vif.DatapathOffloadRepresentor( representor_name="nicdc065497-3c", representor_address="0000:08:08.5")), preserve_on_delete=False, vif_name="nicdc065497-3c", path='/fake/socket', mode='client', network=osv_objects.network.Network( id="b82c1929-051e-481d-8110-4669916c7915", bridge_interface=None, label="Demo Net", subnets=osv_objects.subnet.SubnetList(objects=[]))) self.assertObjEqual(expect, actual)
def test_nova_to_osvif_vhostuser_ovs(self): vif = model.VIF( id="dc065497-3c8d-4f44-8fb4-e1d33c16a536", type=model.VIF_TYPE_VHOSTUSER, address="22:52:25:62:e2:aa", network=model.Network(id="b82c1929-051e-481d-8110-4669916c7915", label="Demo Net", subnets=[]), details={ model.VIF_DETAILS_VHOSTUSER_MODE: 'client', model.VIF_DETAILS_VHOSTUSER_OVS_PLUG: True, model.VIF_DETAILS_VHOSTUSER_SOCKET: '/fake/socket', model.VIF_DETAILS_PORT_FILTER: True, model.VIF_DETAILS_OVS_DATAPATH_TYPE: model.VIF_DETAILS_OVS_DATAPATH_SYSTEM }, ) actual = os_vif_util.nova_to_osvif_vif(vif) expect = osv_objects.vif.VIFVHostUser( id="dc065497-3c8d-4f44-8fb4-e1d33c16a536", active=False, address="22:52:25:62:e2:aa", plugin="ovs", port_profile=osv_objects.vif.VIFPortProfileOpenVSwitch( interface_id="dc065497-3c8d-4f44-8fb4-e1d33c16a536", datapath_type=model.VIF_DETAILS_OVS_DATAPATH_SYSTEM), vif_name="vhudc065497-3c", path='/fake/socket', mode='client', has_traffic_filtering=True, preserve_on_delete=False, network=osv_objects.network.Network( id="b82c1929-051e-481d-8110-4669916c7915", bridge_interface=None, label="Demo Net", subnets=osv_objects.subnet.SubnetList(objects=[]))) self.assertObjEqual(expect, actual)
def _build_network_info_model(self, context, instance, networks=None): search_opts = { 'tenant_id': instance['project_id'], 'device_id': instance['uuid'], } client = neutronv2.get_client(context, admin=True) data = client.list_ports(**search_opts) ports = data.get('ports', []) if networks is None: # retrieve networks from info_cache to get correct nic order network_cache = self.conductor_api.instance_get_by_uuid( context, instance['uuid'])['info_cache']['network_info'] network_cache = jsonutils.loads(network_cache) net_ids = [iface['network']['id'] for iface in network_cache] networks = self._get_available_networks(context, instance['project_id']) # ensure ports are in preferred network order, and filter out # those not attached to one of the provided list of networks else: net_ids = [n['id'] for n in networks] ports = [port for port in ports if port['network_id'] in net_ids] _ensure_requested_network_ordering(lambda x: x['network_id'], ports, net_ids) nw_info = network_model.NetworkInfo() for port in ports: network_IPs = self._nw_info_get_ips(client, port) subnets = self._nw_info_get_subnets(context, port, network_IPs) devname = "tap" + port['id'] devname = devname[:network_model.NIC_NAME_LEN] network, ovs_interfaceid = self._nw_info_build_network( port, networks, subnets) nw_info.append( network_model.VIF(id=port['id'], address=port['mac_address'], network=network, type=port.get('binding:vif_type'), ovs_interfaceid=ovs_interfaceid, devname=devname)) return nw_info
def test_nova_to_osvif_vhostuser_ovs_no_socket_path(self): vif = model.VIF( id="dc065497-3c8d-4f44-8fb4-e1d33c16a536", type=model.VIF_TYPE_VHOSTUSER, address="22:52:25:62:e2:aa", network=model.Network( id="b82c1929-051e-481d-8110-4669916c7915", label="Demo Net", subnets=[]), details={ model.VIF_DETAILS_VHOSTUSER_MODE: 'client', model.VIF_DETAILS_VHOSTUSER_OVS_PLUG: True, model.VIF_DETAILS_PORT_FILTER: True } ) self.assertRaises(exception.VifDetailsMissingVhostuserSockPath, os_vif_util.nova_to_osvif_vif, vif)
def test_nova_to_osvif_vif_ivs_bridged(self): vif = model.VIF(id="dc065497-3c8d-4f44-8fb4-e1d33c16a536", type=model.VIF_TYPE_IVS, address="22:52:25:62:e2:aa", network=model.Network( id="b82c1929-051e-481d-8110-4669916c7915", label="Demo Net", subnets=[]), details={ model.VIF_DETAILS_PORT_FILTER: True, model.VIF_DETAILS_OVS_HYBRID_PLUG: True, }) actual = os_vif_util.nova_to_osvif_vif(vif) # expected vif_name is nic + vif_id, with total length 14 chars expected_vif_name = 'nicdc065497-3c' self.assertIsInstance(actual, osv_objects.vif.VIFBridge) self.assertEqual(expected_vif_name, actual.vif_name)
def test_nova_to_osvif_vhostuser_fp_lb(self): vif = model.VIF( id="dc065497-3c8d-4f44-8fb4-e1d33c16a536", type=model.VIF_TYPE_VHOSTUSER, address="22:52:25:62:e2:aa", network=model.Network( id="b82c1929-051e-481d-8110-4669916c7915", label="Demo Net", mtu="1500", bridge="brq12345", subnets=[]), details={ model.VIF_DETAILS_VHOSTUSER_MODE: 'client', model.VIF_DETAILS_VHOSTUSER_SOCKET: '/fake/socket', model.VIF_DETAILS_VHOSTUSER_FP_PLUG: True, model.VIF_DETAILS_VHOSTUSER_OVS_PLUG: False, } ) actual = os_vif_util.nova_to_osvif_vif(vif) expect = osv_objects.vif.VIFVHostUser( id="dc065497-3c8d-4f44-8fb4-e1d33c16a536", active=False, address="22:52:25:62:e2:aa", plugin="vhostuser_fp", port_profile=osv_objects.vif.VIFPortProfileFPBridge( bridge_name="brq12345"), vif_name="nicdc065497-3c", path='/fake/socket', mode='client', has_traffic_filtering=False, preserve_on_delete=False, network=osv_objects.network.Network( id="b82c1929-051e-481d-8110-4669916c7915", bridge_interface=None, label="Demo Net", mtu="1500", bridge="brq12345", subnets=osv_objects.subnet.SubnetList( objects=[]))) self.assertObjEqual(expect, actual)
def _build_network_info_model(self, context, instance, networks=None): search_opts = { 'tenant_id': instance['project_id'], 'device_id': instance['uuid'], } data = quantumv2.get_client(context).list_ports(**search_opts) ports = data.get('ports', []) if not networks: networks = self._get_available_networks(context, instance['project_id']) nw_info = network_model.NetworkInfo() for port in ports: network_name = None for net in networks: if port['network_id'] == net['id']: network_name = net['name'] break network_IPs = [ network_model.FixedIP(address=ip_address) for ip_address in [ip['ip_address'] for ip in port['fixed_ips']] ] # TODO(gongysh) get floating_ips for each fixed_ip subnets = self._get_subnets_from_port(context, port) for subnet in subnets: subnet['ips'] = [ fixed_ip for fixed_ip in network_IPs if fixed_ip.is_in_subnet(subnet) ] network = network_model.Network( id=port['network_id'], bridge='', # Quantum ignores this field injected=FLAGS.flat_injected, label=network_name, tenant_id=net['tenant_id']) network['subnets'] = subnets nw_info.append( network_model.VIF(id=port['id'], address=port['mac_address'], network=network)) return nw_info
def test_nova_to_osvif_contrail_vrouter_no_socket_path(self): """Test for the Contrail / Tungsten Fabric DPDK datapath.""" vif = model.VIF( id="dc065497-3c8d-4f44-8fb4-e1d33c16a536", type=model.VIF_TYPE_VHOSTUSER, address="22:52:25:62:e2:aa", network=model.Network( id="b82c1929-051e-481d-8110-4669916c7915", label="Demo Net", subnets=[]), details={ model.VIF_DETAILS_VHOSTUSER_MODE: 'client', model.VIF_DETAILS_VHOSTUSER_VROUTER_PLUG: True, } ) self.assertRaises(exception.VifDetailsMissingVhostuserSockPath, os_vif_util.nova_to_osvif_vif, vif)
def current(): subnet_4 = network_model.Subnet( cidr=FAKE_NETWORK_IP4_CIDR, dns=[ network_model.IP(FAKE_NETWORK_DNS_IP4_ADDR1), network_model.IP(FAKE_NETWORK_DNS_IP4_ADDR2) ], gateway=network_model.IP(FAKE_NETWORK_IP4_GATEWAY), ips=[ network_model.IP(FAKE_NETWORK_IP4_ADDR1), network_model.IP(FAKE_NETWORK_IP4_ADDR2) ], routes=None, dhcp_server=FAKE_NETWORK_DHCP_IP4_ADDR) subnet_6 = network_model.Subnet( cidr=FAKE_NETWORK_IP6_CIDR, gateway=network_model.IP(FAKE_NETWORK_IP6_GATEWAY), ips=[ network_model.IP(FAKE_NETWORK_IP6_ADDR1), network_model.IP(FAKE_NETWORK_IP6_ADDR2), network_model.IP(FAKE_NETWORK_IP6_ADDR3) ], routes=None, version=6) subnets = [subnet_4] if ipv6: subnets.append(subnet_6) network = network_model.Network( id=FAKE_NETWORK_UUID, bridge=FAKE_NETWORK_BRIDGE, label=None, subnets=subnets, vlan=FAKE_NETWORK_VLAN, bridge_interface=FAKE_NETWORK_INTERFACE, injected=False) vif = network_model.VIF(id=FAKE_VIF_UUID, address=FAKE_VIF_MAC, network=network, type=network_model.VIF_TYPE_BRIDGE, devname=None, ovs_interfaceid=None) return vif
def test_nova_to_osvif_vif_agilio_ovs_direct(self): vif = model.VIF( id="dc065497-3c8d-4f44-8fb4-e1d33c16a536", type=model.VIF_TYPE_AGILIO_OVS, address="22:52:25:62:e2:aa", profile={ "pci_slot": "0000:08:08.5", }, network=model.Network( id="b82c1929-051e-481d-8110-4669916c7915", label="Demo Net", subnets=[]), vnic_type=model.VNIC_TYPE_DIRECT, ) actual = os_vif_util.nova_to_osvif_vif(vif) expect = osv_objects.vif.VIFHostDevice( id="dc065497-3c8d-4f44-8fb4-e1d33c16a536", active=False, has_traffic_filtering=False, address="22:52:25:62:e2:aa", dev_type=osv_objects.fields.VIFHostDeviceDevType.ETHERNET, dev_address="0000:08:08.5", plugin="agilio_ovs", port_profile=osv_objects.vif.VIFPortProfileOVSRepresentor( interface_id="dc065497-3c8d-4f44-8fb4-e1d33c16a536", representor_name="nicdc065497-3c", representor_address="0000:08:08.5", datapath_offload=osv_objects.vif.DatapathOffloadRepresentor( representor_name="nicdc065497-3c", representor_address="0000:08:08.5")), preserve_on_delete=False, vif_name="nicdc065497-3c", network=osv_objects.network.Network( id="b82c1929-051e-481d-8110-4669916c7915", bridge_interface=None, label="Demo Net", subnets=osv_objects.subnet.SubnetList( objects=[]))) self.assertObjEqual(expect, actual)
def setUp(self): super(VMwareVifTestCase, self).setUp() network = network_model.Network(id=0, bridge='fa0', label='fake', vlan=3, bridge_interface='eth0', injected=True) self._network = network self.vif = network_model.NetworkInfo([ network_model.VIF(id=None, address='DE:AD:BE:EF:00:00', network=network, type=None, devname=None, ovs_interfaceid=None, rxtx_cap=3) ])[0] self.session = fake.FakeSession() self.cluster = None
def test_get_neutron_network_dvs_provider(self, mock_network_name): fake_network_obj = { 'type': 'DistributedVirtualPortgroup', 'dvpg': 'fake-key', 'dvsw': 'fake-props' } mock_network_name.side_effect = [None, fake_network_obj] vif_info = network_model.NetworkInfo([ network_model.VIF(type=network_model.VIF_TYPE_DVS, address='DE:AD:BE:EF:00:00', network=self._network) ])[0] network_ref = vif._get_neutron_network('fake-session', 'fake-cluster', vif_info) calls = [ mock.call('fake-session', 'fa0', 'fake-cluster'), mock.call('fake-session', 'fake', 'fake-cluster') ] mock_network_name.assert_has_calls(calls) self.assertEqual(fake_network_obj, network_ref)
def test_get_network_ref_bridge(self, mock_ensure_vlan_bridge): network = network_model.Network(id=0, bridge='fa0', label='fake', vlan=3, bridge_interface='eth0', injected=True, should_create_vlan=True) self.vif = network_model.NetworkInfo([ network_model.VIF(id=None, address='DE:AD:BE:EF:00:00', network=network, type=None, devname=None, ovs_interfaceid=None, rxtx_cap=3) ])[0] vif.get_network_ref(self.session, self.cluster, self.vif, False) mock_ensure_vlan_bridge.assert_called_once_with( self.session, self.vif, cluster=self.cluster, create_vlan=True)
def test_get_neutron_network_dvs_vif_details(self, mock_network_name): fake_network_obj = { 'type': 'DistributedVirtualPortgroup', 'dvpg': 'pg1', 'dvsw': 'fake-props' } mock_network_name.return_value = fake_network_obj vif_info = network_model.NetworkInfo([ network_model.VIF(type=network_model.VIF_TYPE_DVS, details={ 'dvs_port_key': 'key1', 'dvs_port_group_name': 'pg1' }, address='DE:AD:BE:EF:00:00', network=self._network) ])[0] network_ref = vif._get_neutron_network('fake-session', 'fake-cluster', vif_info) mock_network_name.assert_called_once_with('fake-session', 'pg1', 'fake-cluster') self.assertEqual(fake_network_obj, network_ref)
def setUp(self): super(VMwareVifTestCase, self).setUp() self.flags(vlan_interface='vmnet0', group='vmware') network = network_model.Network(id=0, bridge='fa0', label='fake', vlan=3, bridge_interface='eth0', injected=True) self.vif = network_model.NetworkInfo([ network_model.VIF(id=None, address='DE:AD:BE:EF:00:00', network=network, type=None, devname=None, ovs_interfaceid=None, rxtx_cap=3) ])[0] self.session = test_vmwareapi_vm_util.fake_session() self.cluster = None
def test_nova_to_osvif_vif_ovs_hybrid(self): self.flags(firewall_driver=None) vif = model.VIF( id="dc065497-3c8d-4f44-8fb4-e1d33c16a536", type=model.VIF_TYPE_OVS, address="22:52:25:62:e2:aa", network=model.Network( id="b82c1929-051e-481d-8110-4669916c7915", label="Demo Net", subnets=[]), details={ model.VIF_DETAILS_PORT_FILTER: False, model.VIF_DETAILS_OVS_DATAPATH_TYPE: model.VIF_DETAILS_OVS_DATAPATH_SYSTEM }, ) actual = os_vif_util.nova_to_osvif_vif(vif) expect = osv_objects.vif.VIFBridge( id="dc065497-3c8d-4f44-8fb4-e1d33c16a536", active=False, address="22:52:25:62:e2:aa", has_traffic_filtering=False, plugin="ovs", bridge_name="qbrdc065497-3c", port_profile=osv_objects.vif.VIFPortProfileOpenVSwitch( interface_id="dc065497-3c8d-4f44-8fb4-e1d33c16a536", datapath_type="system"), preserve_on_delete=False, vif_name="nicdc065497-3c", network=osv_objects.network.Network( id="b82c1929-051e-481d-8110-4669916c7915", bridge_interface=None, label="Demo Net", subnets=osv_objects.subnet.SubnetList( objects=[]))) self.assertObjEqual(expect, actual)
def test_get_network_ref_bridge(self): self.mox.StubOutWithMock(vif, 'ensure_vlan_bridge') vif.ensure_vlan_bridge(self.session, self.vif, cluster=self.cluster, create_vlan=True) self.mox.ReplayAll() network = network_model.Network(id=0, bridge='fa0', label='fake', vlan=3, bridge_interface='eth0', injected=True, should_create_vlan=True) self.vif = network_model.NetworkInfo([ network_model.VIF(id=None, address='DE:AD:BE:EF:00:00', network=network, type=None, devname=None, ovs_interfaceid=None, rxtx_cap=3) ])[0] vif.get_network_ref(self.session, self.cluster, self.vif, False)
def test_pre_live_migrate_at_destination(self, mock_part_get, mock_find_trunks, mock_trunk_crt): # Mock the vif net_model = model.Model({'bridge': 'br-int', 'meta': {'mtu': 1450}}) vif = model.VIF(address='aa:bb:cc:dd:ee:ff', id='vif_id', devname='tap-dev', network=net_model) # Mock out the management partition mock_mgmt_wrap = mock.MagicMock() mock_mgmt_wrap.uuid = 'mgmt_uuid' mock_part_get.return_value = mock_mgmt_wrap mock_trunk_crt.return_value = [mock.Mock(pvid=2)] mock_orphan_wrap = mock.MagicMock(mac='aabbccddeeff') mock_find_trunks.return_value = [mock_orphan_wrap] # Invoke and test the basic response vea_vlan_mappings = {} self.drv.pre_live_migrate_at_destination(vif, vea_vlan_mappings) self.assertEqual(vea_vlan_mappings['aa:bb:cc:dd:ee:ff'], 2) # Now validate it called the things it needed to ovs_ext_ids = ('iface-id=vif_id,iface-status=active,' 'attached-mac=aa:bb:cc:dd:ee:ff,vm-uuid=inst_uuid') mock_trunk_crt.assert_called_once_with( self.adpt, 'host_uuid', ['mgmt_uuid'], CONF.powervm.pvm_vswitch_for_novalink_io, dev_name='tap-dev', ovs_bridge='br-int', ovs_ext_ids=ovs_ext_ids, configured_mtu=1450) mock_find_trunks.assert_called_once_with( self.adpt, CONF.powervm.pvm_vswitch_for_novalink_io) mock_orphan_wrap.delete.assert_called_once_with()
def current(): fake_ip = '0.0.0.0' subnet_4 = network_model.Subnet( cidr=fake_ip, dns=[network_model.IP(fake_ip), network_model.IP(fake_ip)], gateway=network_model.IP(fake_ip), ips=[network_model.IP(fake_ip), network_model.IP(fake_ip)], routes=None, dhcp_server=network_model.IP(fake_ip)) subnet_6 = network_model.Subnet(cidr=fake_ip, gateway=network_model.IP(fake_ip), ips=[ network_model.IP(fake_ip), network_model.IP(fake_ip), network_model.IP(fake_ip) ], routes=None, version=6) subnets = [subnet_4] if ipv6: subnets.append(subnet_6) network = network_model.Network(id=None, bridge=fake, label=None, subnets=subnets, vlan=fake_vlan, bridge_interface=fake_bridge_interface, injected=False) vif = network_model.VIF(id='vif-xxx-yyy-zzz', address=fake, network=network, type=network_model.VIF_TYPE_BRIDGE, devname=None, ovs_interfaceid=None) return vif
def test_get_dest_vif(self): source_vif = network_model.VIF( id=uuids.port_id, type=network_model.VIF_TYPE_OVS, details={}, vnic_type=network_model.VNIC_TYPE_DIRECT, profile={'foo': 'bar'}, ovs_interfaceid=uuids.ovs_interfaceid) migrate_vif = objects.VIFMigrateData( port_id=uuids.port_id, vnic_type=network_model.VNIC_TYPE_NORMAL, vif_type=network_model.VIF_TYPE_BRIDGE, vif_details={'bar': 'baz'}, profile={}, host='fake-dest-host', source_vif=source_vif) dest_vif = migrate_vif.get_dest_vif() self.assertEqual(migrate_vif.port_id, dest_vif['id']) self.assertEqual(migrate_vif.vnic_type, dest_vif['vnic_type']) self.assertEqual(migrate_vif.vif_type, dest_vif['type']) self.assertEqual(migrate_vif.vif_details, dest_vif['details']) self.assertEqual(migrate_vif.profile, dest_vif['profile']) self.assertEqual(uuids.ovs_interfaceid, dest_vif['ovs_interfaceid'])
def test_update_vif_xml_no_matching_vif(self): """Tests that the vif in the migrate data is not found in the existing guest interfaces. """ data = objects.LibvirtLiveMigrateData(vifs=[ objects.VIFMigrateData(source_vif=network_model.VIF( address="DE:AD:BE:EF:CA:FE"))]) original_xml = """<domain> <uuid>3de6550a-8596-4937-8046-9d862036bca5</uuid> <devices> <interface type="bridge"> <mac address="CA:FE:DE:AD:BE:EF"/> <model type="virtio"/> <source bridge="qbra188171c-ea"/> <target dev="tapa188171c-ea"/> </interface> </devices> </domain>""" get_vif_config = mock.MagicMock(new_callable=mock.NonCallableMock) doc = etree.fromstring(original_xml) ex = self.assertRaises(KeyError, migration._update_vif_xml, doc, data, get_vif_config) self.assertIn("CA:FE:DE:AD:BE:EF", six.text_type(ex))
def test_nova_to_osvif_contrail_vrouter(self): """Test for the Contrail / Tungsten Fabric DPDK datapath.""" vif = model.VIF( id="dc065497-3c8d-4f44-8fb4-e1d33c16a536", type=model.VIF_TYPE_VHOSTUSER, address="22:52:25:62:e2:aa", network=model.Network( id="b82c1929-051e-481d-8110-4669916c7915", label="Demo Net", subnets=[]), details={ model.VIF_DETAILS_VHOSTUSER_MODE: 'client', model.VIF_DETAILS_VHOSTUSER_VROUTER_PLUG: True, model.VIF_DETAILS_VHOSTUSER_SOCKET: '/fake/socket', } ) actual = os_vif_util.nova_to_osvif_vif(vif) expect = osv_objects.vif.VIFVHostUser( id="dc065497-3c8d-4f44-8fb4-e1d33c16a536", active=False, address="22:52:25:62:e2:aa", plugin="contrail_vrouter", vif_name="nicdc065497-3c", path='/fake/socket', mode='client', has_traffic_filtering=False, preserve_on_delete=False, network=osv_objects.network.Network( id="b82c1929-051e-481d-8110-4669916c7915", bridge_interface=None, label="Demo Net", subnets=osv_objects.subnet.SubnetList( objects=[]))) self.assertObjEqual(expect, actual)
def setUp(self): super(VMwareVMOpsTestCase, self).setUp() vmwareapi_fake.reset() stubs.set_stubs(self.stubs) self.flags(image_cache_subdirectory_name='vmware_base', my_ip='', flat_injected=True, vnc_enabled=True) self._context = context.RequestContext('fake_user', 'fake_project') self._session = driver.VMwareAPISession() self._virtapi = mock.Mock() self._vmops = vmops.VMwareVCVMOps(self._session, self._virtapi, None) self._image_id = nova.tests.image.fake.get_valid_image_id() values = { 'name': 'fake_name', 'uuid': 'fake_uuid', 'vcpus': 1, 'memory_mb': 512, 'image_ref': self._image_id, 'root_gb': 1, 'node': 'respool-1001(MyResPoolName)' } self._instance = fake_instance.fake_instance_obj( self._context, **values) fake_ds_ref = vmwareapi_fake.ManagedObjectReference('fake-ds') self._ds_record = vm_util.DSRecord( datastore=fake_ds_ref, name='fake_ds', capacity=10 * units.Gi, freespace=10 * units.Gi) self._dc_info = vmops.DcInfo( ref='fake_dc_ref', name='fake_dc', vmFolder='fake_vm_folder') subnet_4 = network_model.Subnet(cidr='192.168.0.1/24', dns=[network_model.IP('192.168.0.1')], gateway= network_model.IP('192.168.0.1'), ips=[ network_model.IP('192.168.0.100')], routes=None) subnet_6 = network_model.Subnet(cidr='dead:beef::1/64', dns=None, gateway= network_model.IP('dead:beef::1'), ips=[network_model.IP( 'dead:beef::dcad:beff:feef:0')], routes=None) network = network_model.Network(id=0, bridge='fa0', label='fake', subnets=[subnet_4, subnet_6], vlan=None, bridge_interface=None, injected=True) self.network_info = network_model.NetworkInfo([ network_model.VIF(id=None, address='DE:AD:BE:EF:00:00', network=network, type=None, devname=None, ovs_interfaceid=None, rxtx_cap=3) ]) pure_IPv6_network = network_model.Network(id=0, bridge='fa0', label='fake', subnets=[subnet_6], vlan=None, bridge_interface=None, injected=True) self.pure_IPv6_network_info = network_model.NetworkInfo([ network_model.VIF(id=None, address='DE:AD:BE:EF:00:00', network=pure_IPv6_network, type=None, devname=None, ovs_interfaceid=None, rxtx_cap=3) ])
class LibvirtVifTestCase(test.TestCase): gateway_bridge_4 = network_model.IP(address='101.168.1.1', type='gateway') dns_bridge_4 = network_model.IP(address='8.8.8.8', type=None) ips_bridge_4 = [network_model.IP(address='101.168.1.9', type=None)] subnet_bridge_4 = network_model.Subnet(cidr='101.168.1.0/24', dns=[dns_bridge_4], gateway=gateway_bridge_4, routes=None, dhcp_server='191.168.1.1') gateway_bridge_6 = network_model.IP(address='101:1db9::1', type='gateway') subnet_bridge_6 = network_model.Subnet(cidr='101:1db9::/64', dns=None, gateway=gateway_bridge_6, ips=None, routes=None) network_bridge = network_model.Network( id='network-id-xxx-yyy-zzz', bridge='br0', label=None, subnets=[subnet_bridge_4, subnet_bridge_6], bridge_interface='eth0', vlan=99) vif_bridge = network_model.VIF(id='vif-xxx-yyy-zzz', address='ca:fe:de:ad:be:ef', network=network_bridge, type=network_model.VIF_TYPE_BRIDGE, devname='tap-xxx-yyy-zzz', ovs_interfaceid=None) network_bridge_neutron = network_model.Network( id='network-id-xxx-yyy-zzz', bridge=None, label=None, subnets=[subnet_bridge_4, subnet_bridge_6], bridge_interface='eth0', vlan=99) vif_bridge_neutron = network_model.VIF(id='vif-xxx-yyy-zzz', address='ca:fe:de:ad:be:ef', network=network_bridge_neutron, type=None, devname='tap-xxx-yyy-zzz', ovs_interfaceid='aaa-bbb-ccc') network_ovs = network_model.Network( id='network-id-xxx-yyy-zzz', bridge='br0', label=None, subnets=[subnet_bridge_4, subnet_bridge_6], bridge_interface=None, vlan=99) network_ivs = network_model.Network( id='network-id-xxx-yyy-zzz', bridge='br0', label=None, subnets=[subnet_bridge_4, subnet_bridge_6], bridge_interface=None, vlan=99) vif_ovs = network_model.VIF(id='vif-xxx-yyy-zzz', address='ca:fe:de:ad:be:ef', network=network_ovs, type=network_model.VIF_TYPE_OVS, devname='tap-xxx-yyy-zzz', ovs_interfaceid='aaa-bbb-ccc') vif_ovs_hybrid = network_model.VIF(id='vif-xxx-yyy-zzz', address='ca:fe:de:ad:be:ef', network=network_ovs, type=network_model.VIF_TYPE_OVS, details={ 'ovs_hybrid_plug': True, 'port_filter': True }, devname='tap-xxx-yyy-zzz', ovs_interfaceid='aaa-bbb-ccc') vif_ovs_filter_cap = network_model.VIF(id='vif-xxx-yyy-zzz', address='ca:fe:de:ad:be:ef', network=network_ovs, type=network_model.VIF_TYPE_OVS, details={'port_filter': True}, devname='tap-xxx-yyy-zzz', ovs_interfaceid='aaa-bbb-ccc') vif_ovs_legacy = network_model.VIF(id='vif-xxx-yyy-zzz', address='ca:fe:de:ad:be:ef', network=network_ovs, type=None, devname=None, ovs_interfaceid=None) vif_ivs = network_model.VIF(id='vif-xxx-yyy-zzz', address='ca:fe:de:ad:be:ef', network=network_ivs, type=network_model.VIF_TYPE_IVS, devname='tap-xxx-yyy-zzz', ovs_interfaceid='aaa-bbb-ccc') vif_ivs_legacy = network_model.VIF(id='vif-xxx-yyy-zzz', address='ca:fe:de:ad:be:ef', network=network_ovs, type=None, devname=None, ovs_interfaceid='aaa') vif_none = network_model.VIF(id='vif-xxx-yyy-zzz', address='ca:fe:de:ad:be:ef', network=network_bridge, type=None, devname='tap-xxx-yyy-zzz', ovs_interfaceid=None) network_8021 = network_model.Network( id='network-id-xxx-yyy-zzz', bridge=None, label=None, subnets=[subnet_bridge_4, subnet_bridge_6], interface='eth0', vlan=99) vif_8021qbh = network_model.VIF( id='vif-xxx-yyy-zzz', address='ca:fe:de:ad:be:ef', network=network_8021, type=network_model.VIF_TYPE_802_QBH, devname='tap-xxx-yyy-zzz', ovs_interfaceid=None, qbh_params=network_model.VIF8021QbhParams(profileid="xxx-yyy-zzz")) vif_8021qbg = network_model.VIF(id='vif-xxx-yyy-zzz', address='ca:fe:de:ad:be:ef', network=network_8021, type=network_model.VIF_TYPE_802_QBG, devname='tap-xxx-yyy-zzz', ovs_interfaceid=None, qbg_params=network_model.VIF8021QbgParams( managerid="xxx-yyy-zzz", typeid="aaa-bbb-ccc", typeidversion="1", instanceid="ddd-eee-fff")) network_mlnx = network_model.Network( id='network-id-xxx-yyy-zzz', label=None, bridge=None, subnets=[subnet_bridge_4, subnet_bridge_6], interface='eth0') network_midonet = network_model.Network(id='network-id-xxx-yyy-zzz', label=None, bridge=None, subnets=[subnet_bridge_4], interface='eth0') vif_mlnx = network_model.VIF(id='vif-xxx-yyy-zzz', address='ca:fe:de:ad:be:ef', network=network_mlnx, type=network_model.VIF_TYPE_MLNX_DIRECT, devname='tap-xxx-yyy-zzz') vif_midonet = network_model.VIF(id='vif-xxx-yyy-zzz', address='ca:fe:de:ad:be:ef', network=network_midonet, type=network_model.VIF_TYPE_MIDONET, devname='tap-xxx-yyy-zzz') vif_iovisor = network_model.VIF(id='vif-xxx-yyy-zzz', address='ca:fe:de:ad:be:ef', network=network_bridge, type=network_model.VIF_TYPE_IOVISOR, devname='tap-xxx-yyy-zzz', ovs_interfaceid=None) instance = {'name': 'instance-name', 'uuid': 'instance-uuid'} bandwidth = { 'quota:vif_inbound_peak': '200', 'quota:vif_outbound_peak': '20', 'quota:vif_inbound_average': '100', 'quota:vif_outbound_average': '10', 'quota:vif_inbound_burst': '300', 'quota:vif_outbound_burst': '30' } def setUp(self): super(LibvirtVifTestCase, self).setUp() self.flags(allow_same_net_traffic=True) self.executes = [] def fake_execute(*cmd, **kwargs): self.executes.append(cmd) return None, None self.stubs.Set(utils, 'execute', fake_execute) def _get_conn(self, uri="qemu:///session", ver=None): def __inner(): if ver is None: return fakelibvirt.Connection(uri, False) else: return fakelibvirt.Connection(uri, False, ver) return __inner def _get_node(self, xml): doc = etree.fromstring(xml) ret = doc.findall('./devices/interface') self.assertEqual(len(ret), 1) return ret[0] def _assertMacEquals(self, node, vif): mac = node.find("mac").get("address") self.assertEqual(mac, vif['address']) def _assertTypeEquals(self, node, type, attr, source, br_want, prefix=None): self.assertEqual(node.get("type"), type) br_name = node.find(attr).get(source) if prefix is None: self.assertEqual(br_name, br_want) else: self.assertTrue(br_name.startswith(prefix)) def _assertTypeAndMacEquals(self, node, type, attr, source, vif, br_want=None, size=0, prefix=None): ret = node.findall("filterref") self.assertEqual(len(ret), size) self._assertTypeEquals(node, type, attr, source, br_want, prefix) self._assertMacEquals(node, vif) def _assertModel(self, xml, model_want=None, driver_want=None): node = self._get_node(xml) if model_want is None: ret = node.findall("model") self.assertEqual(len(ret), 0) else: model = node.find("model").get("type") self.assertEqual(model, model_want) if driver_want is None: ret = node.findall("driver") self.assertEqual(len(ret), 0) else: driver = node.find("driver").get("name") self.assertEqual(driver, driver_want) def _get_conf(self): conf = vconfig.LibvirtConfigGuest() conf.virt_type = "qemu" conf.name = "fake-name" conf.uuid = "fake-uuid" conf.memory = 100 * 1024 conf.vcpus = 4 return conf def _get_instance_xml(self, driver, vif, image_meta=None): default_inst_type = flavors.get_default_flavor() extra_specs = default_inst_type['extra_specs'].items() quota_bandwidth = self.bandwidth.items() default_inst_type['extra_specs'] = dict(extra_specs + quota_bandwidth) conf = self._get_conf() nic = driver.get_config(self.instance, vif, image_meta, default_inst_type) conf.add_device(nic) return conf.to_xml() def test_multiple_nics(self): conf = self._get_conf() # Tests multiple nic configuration and that target_dev is # set for each nics = [{ 'net_type': 'bridge', 'mac_addr': '00:00:00:00:00:0b', 'source_dev': 'b_source_dev', 'target_dev': 'b_target_dev' }, { 'net_type': 'ethernet', 'mac_addr': '00:00:00:00:00:0e', 'source_dev': 'e_source_dev', 'target_dev': 'e_target_dev' }, { 'net_type': 'direct', 'mac_addr': '00:00:00:00:00:0d', 'source_dev': 'd_source_dev', 'target_dev': 'd_target_dev' }] for nic in nics: nic_conf = vconfig.LibvirtConfigGuestInterface() nic_conf.net_type = nic['net_type'] nic_conf.target_dev = nic['target_dev'] nic_conf.mac_addr = nic['mac_addr'] nic_conf.source_dev = nic['source_dev'] conf.add_device(nic_conf) xml = conf.to_xml() doc = etree.fromstring(xml) for nic in nics: path = "./devices/interface/[@type='%s']" % nic['net_type'] node = doc.find(path) self.assertEqual(nic['net_type'], node.get("type")) self.assertEqual(nic['mac_addr'], node.find("mac").get("address")) self.assertEqual(nic['target_dev'], node.find("target").get("dev")) def test_model_novirtio(self): self.flags(use_virtio_for_bridges=False, virt_type='kvm', group='libvirt') d = vif.LibvirtGenericVIFDriver(self._get_conn()) xml = self._get_instance_xml(d, self.vif_bridge) self._assertModel(xml) def test_model_kvm(self): self.flags(use_virtio_for_bridges=True, virt_type='kvm', group='libvirt') d = vif.LibvirtGenericVIFDriver(self._get_conn()) xml = self._get_instance_xml(d, self.vif_bridge) self._assertModel(xml, network_model.VIF_MODEL_VIRTIO) def test_model_kvm_custom(self): self.flags(use_virtio_for_bridges=True, virt_type='kvm', group='libvirt') d = vif.LibvirtGenericVIFDriver(self._get_conn()) image_meta = { 'properties': { 'hw_vif_model': network_model.VIF_MODEL_E1000 } } xml = self._get_instance_xml(d, self.vif_bridge, image_meta) self._assertModel(xml, network_model.VIF_MODEL_E1000) def test_model_kvm_bogus(self): self.flags(use_virtio_for_bridges=True, virt_type='kvm', group='libvirt') d = vif.LibvirtGenericVIFDriver(self._get_conn()) image_meta = {'properties': {'hw_vif_model': 'acme'}} self.assertRaises(exception.UnsupportedHardware, self._get_instance_xml, d, self.vif_bridge, image_meta) def _test_model_qemu(self, *vif_objs, **kw): libvirt_version = kw.get('libvirt_version') self.flags(use_virtio_for_bridges=True, virt_type='qemu', group='libvirt') for vif_obj in vif_objs: d = vif.LibvirtGenericVIFDriver(self._get_conn()) if libvirt_version is not None: d.libvirt_version = libvirt_version xml = self._get_instance_xml(d, vif_obj) doc = etree.fromstring(xml) bandwidth = doc.find('./devices/interface/bandwidth') self.assertNotEqual(bandwidth, None) inbound = bandwidth.find('inbound') self.assertEqual(inbound.get("average"), self.bandwidth['quota:vif_inbound_average']) self.assertEqual(inbound.get("peak"), self.bandwidth['quota:vif_inbound_peak']) self.assertEqual(inbound.get("burst"), self.bandwidth['quota:vif_inbound_burst']) outbound = bandwidth.find('outbound') self.assertEqual(outbound.get("average"), self.bandwidth['quota:vif_outbound_average']) self.assertEqual(outbound.get("peak"), self.bandwidth['quota:vif_outbound_peak']) self.assertEqual(outbound.get("burst"), self.bandwidth['quota:vif_outbound_burst']) self._assertModel(xml, network_model.VIF_MODEL_VIRTIO, "qemu") def test_model_qemu_no_firewall(self): self.flags(firewall_driver="nova.virt.firewall.NoopFirewallDriver") self._test_model_qemu( self.vif_bridge, self.vif_8021qbh, self.vif_8021qbg, self.vif_iovisor, self.vif_mlnx, ) self._test_model_qemu(self.vif_ovs, libvirt_version=vif.LIBVIRT_OVS_VPORT_VERSION) def test_model_qemu_iptables(self): self.flags(firewall_driver="nova.virt.firewall.IptablesFirewallDriver") self._test_model_qemu( self.vif_bridge, self.vif_ovs, self.vif_ivs, self.vif_8021qbh, self.vif_8021qbg, self.vif_iovisor, self.vif_mlnx, ) def test_model_xen(self): self.flags(use_virtio_for_bridges=True, virt_type='xen', group='libvirt') d = vif.LibvirtGenericVIFDriver(self._get_conn("xen:///system")) xml = self._get_instance_xml(d, self.vif_bridge) self._assertModel(xml) def test_generic_driver_none(self): d = vif.LibvirtGenericVIFDriver(self._get_conn()) self.assertRaises(exception.NovaException, self._get_instance_xml, d, self.vif_none) def _check_bridge_driver(self, d, vif, br_want): xml = self._get_instance_xml(d, vif) node = self._get_node(xml) self._assertTypeAndMacEquals(node, "bridge", "source", "bridge", self.vif_bridge, br_want, 1) def test_generic_driver_bridge(self): d = vif.LibvirtGenericVIFDriver(self._get_conn()) self._check_bridge_driver(d, self.vif_bridge, self.vif_bridge['network']['bridge']) def _check_ivs_ethernet_driver(self, d, vif, dev_prefix): self.flags(firewall_driver="nova.virt.firewall.NoopFirewallDriver") xml = self._get_instance_xml(d, vif) node = self._get_node(xml) self._assertTypeAndMacEquals(node, "ethernet", "target", "dev", self.vif_ivs, prefix=dev_prefix) script = node.find("script").get("path") self.assertEqual(script, "") def _check_ovs_ethernet_driver(self, d, vif, dev_prefix): self.flags(firewall_driver="nova.virt.firewall.NoopFirewallDriver") xml = self._get_instance_xml(d, vif) node = self._get_node(xml) self._assertTypeAndMacEquals(node, "ethernet", "target", "dev", self.vif_ovs, prefix=dev_prefix) script = node.find("script").get("path") self.assertEqual(script, "") def test_ovs_ethernet_driver(self): d = vif.LibvirtGenericVIFDriver(self._get_conn(ver=9010)) self._check_ovs_ethernet_driver(d, self.vif_ovs, "tap") def test_unplug_ivs_ethernet(self): d = vif.LibvirtGenericVIFDriver(self._get_conn(ver=9010)) with mock.patch.object(linux_net, 'delete_ivs_vif_port') as delete: delete.side_effect = processutils.ProcessExecutionError d.unplug_ivs_ethernet(None, self.vif_ovs) def test_plug_ovs_hybrid(self): calls = { 'device_exists': [mock.call('qbrvif-xxx-yyy'), mock.call('qvovif-xxx-yyy')], '_create_veth_pair': [mock.call('qvbvif-xxx-yyy', 'qvovif-xxx-yyy')], 'execute': [ mock.call('brctl', 'addbr', 'qbrvif-xxx-yyy', run_as_root=True), mock.call('brctl', 'setfd', 'qbrvif-xxx-yyy', 0, run_as_root=True), mock.call('brctl', 'stp', 'qbrvif-xxx-yyy', 'off', run_as_root=True), mock.call('tee', ('/sys/class/net/qbrvif-xxx-yyy' '/bridge/multicast_snooping'), process_input='0', run_as_root=True, check_exit_code=[0, 1]), mock.call('ip', 'link', 'set', 'qbrvif-xxx-yyy', 'up', run_as_root=True), mock.call('brctl', 'addif', 'qbrvif-xxx-yyy', 'qvbvif-xxx-yyy', run_as_root=True) ], 'create_ovs_vif_port': [ mock.call('br0', 'qvovif-xxx-yyy', 'aaa-bbb-ccc', 'ca:fe:de:ad:be:ef', 'instance-uuid') ] } with contextlib.nested( mock.patch.object(linux_net, 'device_exists', return_value=False), mock.patch.object(utils, 'execute'), mock.patch.object(linux_net, '_create_veth_pair'), mock.patch.object( linux_net, 'create_ovs_vif_port')) as (device_exists, execute, _create_veth_pair, create_ovs_vif_port): d = vif.LibvirtGenericVIFDriver(self._get_conn(ver=9010)) d.plug_ovs_hybrid(self.instance, self.vif_ovs) device_exists.assert_has_calls(calls['device_exists']) _create_veth_pair.assert_has_calls(calls['_create_veth_pair']) execute.assert_has_calls(calls['execute']) create_ovs_vif_port.assert_has_calls(calls['create_ovs_vif_port']) def test_unplug_ovs_hybrid(self): calls = { 'device_exists': [mock.call('qbrvif-xxx-yyy')], 'execute': [ mock.call('brctl', 'delif', 'qbrvif-xxx-yyy', 'qvbvif-xxx-yyy', run_as_root=True), mock.call('ip', 'link', 'set', 'qbrvif-xxx-yyy', 'down', run_as_root=True), mock.call('brctl', 'delbr', 'qbrvif-xxx-yyy', run_as_root=True) ], 'delete_ovs_vif_port': [mock.call('br0', 'qvovif-xxx-yyy')] } with contextlib.nested( mock.patch.object(linux_net, 'device_exists', return_value=True), mock.patch.object(utils, 'execute'), mock.patch.object( linux_net, 'delete_ovs_vif_port')) as (device_exists, execute, delete_ovs_vif_port): d = vif.LibvirtGenericVIFDriver(self._get_conn(ver=9010)) d.unplug_ovs_hybrid(None, self.vif_ovs) device_exists.assert_has_calls(calls['device_exists']) execute.assert_has_calls(calls['execute']) delete_ovs_vif_port.assert_has_calls(calls['delete_ovs_vif_port']) def test_unplug_ovs_hybrid_bridge_does_not_exist(self): calls = { 'device_exists': [mock.call('qbrvif-xxx-yyy')], 'delete_ovs_vif_port': [mock.call('br0', 'qvovif-xxx-yyy')] } with contextlib.nested( mock.patch.object(linux_net, 'device_exists', return_value=False), mock.patch.object( linux_net, 'delete_ovs_vif_port')) as (device_exists, delete_ovs_vif_port): d = vif.LibvirtGenericVIFDriver(self._get_conn(ver=9010)) d.unplug_ovs_hybrid(None, self.vif_ovs) device_exists.assert_has_calls(calls['device_exists']) delete_ovs_vif_port.assert_has_calls(calls['delete_ovs_vif_port']) def test_plug_ivs_hybrid(self): calls = { 'device_exists': [mock.call('qbrvif-xxx-yyy'), mock.call('qvovif-xxx-yyy')], '_create_veth_pair': [mock.call('qvbvif-xxx-yyy', 'qvovif-xxx-yyy')], 'execute': [ mock.call('brctl', 'addbr', 'qbrvif-xxx-yyy', run_as_root=True), mock.call('brctl', 'setfd', 'qbrvif-xxx-yyy', 0, run_as_root=True), mock.call('brctl', 'stp', 'qbrvif-xxx-yyy', 'off', run_as_root=True), mock.call('tee', ('/sys/class/net/qbrvif-xxx-yyy' '/bridge/multicast_snooping'), process_input='0', run_as_root=True, check_exit_code=[0, 1]), mock.call('ip', 'link', 'set', 'qbrvif-xxx-yyy', 'up', run_as_root=True), mock.call('brctl', 'addif', 'qbrvif-xxx-yyy', 'qvbvif-xxx-yyy', run_as_root=True) ], 'create_ivs_vif_port': [ mock.call('qvovif-xxx-yyy', 'aaa-bbb-ccc', 'ca:fe:de:ad:be:ef', 'instance-uuid') ] } with contextlib.nested( mock.patch.object(linux_net, 'device_exists', return_value=False), mock.patch.object(utils, 'execute'), mock.patch.object(linux_net, '_create_veth_pair'), mock.patch.object( linux_net, 'create_ivs_vif_port')) as (device_exists, execute, _create_veth_pair, create_ivs_vif_port): d = vif.LibvirtGenericVIFDriver(self._get_conn(ver=9010)) d.plug_ivs_hybrid(self.instance, self.vif_ivs) device_exists.assert_has_calls(calls['device_exists']) _create_veth_pair.assert_has_calls(calls['_create_veth_pair']) execute.assert_has_calls(calls['execute']) create_ivs_vif_port.assert_has_calls(calls['create_ivs_vif_port']) def test_unplug_ivs_hybrid(self): calls = { 'execute': [ mock.call('brctl', 'delif', 'qbrvif-xxx-yyy', 'qvbvif-xxx-yyy', run_as_root=True), mock.call('ip', 'link', 'set', 'qbrvif-xxx-yyy', 'down', run_as_root=True), mock.call('brctl', 'delbr', 'qbrvif-xxx-yyy', run_as_root=True) ], 'delete_ivs_vif_port': [mock.call('qvovif-xxx-yyy')] } with contextlib.nested( mock.patch.object(utils, 'execute'), mock.patch.object( linux_net, 'delete_ivs_vif_port')) as (execute, delete_ivs_vif_port): d = vif.LibvirtGenericVIFDriver(self._get_conn(ver=9010)) d.unplug_ivs_hybrid(None, self.vif_ivs) execute.assert_has_calls(calls['execute']) delete_ivs_vif_port.assert_has_calls(calls['delete_ivs_vif_port']) def test_unplug_ivs_hybrid_bridge_does_not_exist(self): d = vif.LibvirtGenericVIFDriver(self._get_conn(ver=9010)) with mock.patch.object(utils, 'execute') as execute: execute.side_effect = processutils.ProcessExecutionError d.unplug_ivs_hybrid(None, self.vif_ivs) def test_unplug_iovisor(self): d = vif.LibvirtGenericVIFDriver(self._get_conn(ver=9010)) with mock.patch.object(utils, 'execute') as execute: execute.side_effect = processutils.ProcessExecutionError mynetwork = network_model.Network(id='network-id-xxx-yyy-zzz', label='mylabel') myvif = network_model.VIF(id='vif-xxx-yyy-zzz', address='ca:fe:de:ad:be:ef', network=mynetwork) d.unplug_iovisor(None, myvif) @mock.patch('nova.network.linux_net.device_exists') def test_plug_iovisor(self, device_exists): device_exists.return_value = True d = vif.LibvirtGenericVIFDriver(self._get_conn(ver=9010)) with mock.patch.object(utils, 'execute') as execute: execute.side_effect = processutils.ProcessExecutionError instance = { 'name': 'instance-name', 'uuid': 'instance-uuid', 'project_id': 'myproject' } d.plug_iovisor(instance, self.vif_ivs) def test_ivs_ethernet_driver(self): d = vif.LibvirtGenericVIFDriver(self._get_conn(ver=9010)) self._check_ivs_ethernet_driver(d, self.vif_ivs, "tap") def _check_ivs_virtualport_driver(self, d, vif, want_iface_id): self.flags(firewall_driver="nova.virt.firewall.NoopFirewallDriver") xml = self._get_instance_xml(d, vif) node = self._get_node(xml) self._assertTypeAndMacEquals(node, "ethernet", "target", "dev", vif, vif['devname']) def _check_ovs_virtualport_driver(self, d, vif, want_iface_id): self.flags(firewall_driver="nova.virt.firewall.NoopFirewallDriver") xml = self._get_instance_xml(d, vif) node = self._get_node(xml) self._assertTypeAndMacEquals(node, "bridge", "source", "bridge", vif, "br0") vp = node.find("virtualport") self.assertEqual(vp.get("type"), "openvswitch") iface_id_found = False for p_elem in vp.findall("parameters"): iface_id = p_elem.get("interfaceid", None) if iface_id: self.assertEqual(iface_id, want_iface_id) iface_id_found = True self.assertTrue(iface_id_found) def test_generic_ovs_virtualport_driver(self): d = vif.LibvirtGenericVIFDriver(self._get_conn(ver=9011)) want_iface_id = self.vif_ovs['ovs_interfaceid'] self._check_ovs_virtualport_driver(d, self.vif_ovs, want_iface_id) def test_generic_ivs_virtualport_driver(self): d = vif.LibvirtGenericVIFDriver(self._get_conn(ver=9011)) want_iface_id = self.vif_ivs['ovs_interfaceid'] self._check_ivs_virtualport_driver(d, self.vif_ivs, want_iface_id) def test_hybrid_plug_without_nova_firewall(self): d = vif.LibvirtGenericVIFDriver(self._get_conn()) br_want = "qbr" + self.vif_ovs_hybrid['id'] br_want = br_want[:network_model.NIC_NAME_LEN] self.flags(firewall_driver="nova.virt.firewall.NoopFirewallDriver") xml = self._get_instance_xml(d, self.vif_ovs_hybrid) node = self._get_node(xml) self._assertTypeAndMacEquals(node, "bridge", "source", "bridge", self.vif_ovs_hybrid, br_want, 0) def test_direct_plug_with_port_filter_cap_no_nova_firewall(self): d = vif.LibvirtGenericVIFDriver(self._get_conn()) br_want = self.vif_midonet['devname'] xml = self._get_instance_xml(d, self.vif_ovs_filter_cap) node = self._get_node(xml) self._assertTypeAndMacEquals(node, "ethernet", "target", "dev", self.vif_ovs_filter_cap, br_want) def _check_neutron_hybrid_driver(self, d, vif, br_want): self.flags(firewall_driver="nova.virt.firewall.IptablesFirewallDriver") xml = self._get_instance_xml(d, vif) node = self._get_node(xml) self._assertTypeAndMacEquals(node, "bridge", "source", "bridge", vif, br_want, 1) def test_generic_hybrid_driver(self): d = vif.LibvirtGenericVIFDriver(self._get_conn()) br_want = "qbr" + self.vif_ovs['id'] br_want = br_want[:network_model.NIC_NAME_LEN] self._check_neutron_hybrid_driver(d, self.vif_ovs, br_want) def test_ivs_hybrid_driver(self): d = vif.LibvirtGenericVIFDriver(self._get_conn()) br_want = "qbr" + self.vif_ivs['id'] br_want = br_want[:network_model.NIC_NAME_LEN] self._check_neutron_hybrid_driver(d, self.vif_ivs, br_want) def test_mlnx_direct_vif_driver(self): d = vif.LibvirtGenericVIFDriver(self._get_conn()) xml = self._get_instance_xml(d, self.vif_mlnx) node = self._get_node(xml) self.assertEqual(node.get("type"), "direct") self._assertTypeEquals(node, "direct", "source", "dev", "eth-xxx-yyy-zzz") self._assertTypeEquals(node, "direct", "source", "mode", "passthrough") self._assertMacEquals(node, self.vif_mlnx) self._assertModel(xml, network_model.VIF_MODEL_VIRTIO) def test_midonet_ethernet_vif_driver(self): d = vif.LibvirtGenericVIFDriver(self._get_conn()) self.flags(firewall_driver="nova.virt.firewall.NoopFirewallDriver") br_want = self.vif_midonet['devname'] xml = self._get_instance_xml(d, self.vif_midonet) node = self._get_node(xml) self._assertTypeAndMacEquals(node, "ethernet", "target", "dev", self.vif_midonet, br_want) def test_generic_8021qbh_driver(self): d = vif.LibvirtGenericVIFDriver(self._get_conn()) xml = self._get_instance_xml(d, self.vif_8021qbh) node = self._get_node(xml) self._assertTypeEquals(node, "direct", "source", "dev", "eth0") self._assertMacEquals(node, self.vif_8021qbh) vp = node.find("virtualport") self.assertEqual(vp.get("type"), "802.1Qbh") profile_id_found = False for p_elem in vp.findall("parameters"): wantparams = self.vif_8021qbh['qbh_params'] profile_id = p_elem.get("profileid", None) if profile_id: self.assertEqual(profile_id, wantparams['profileid']) profile_id_found = True self.assertTrue(profile_id_found) def test_generic_iovisor_driver(self): d = vif.LibvirtGenericVIFDriver(self._get_conn()) self.flags(firewall_driver="nova.virt.firewall.NoopFirewallDriver") br_want = self.vif_ivs['devname'] xml = self._get_instance_xml(d, self.vif_ivs) node = self._get_node(xml) self._assertTypeAndMacEquals(node, "ethernet", "target", "dev", self.vif_ivs, br_want) def test_generic_8021qbg_driver(self): d = vif.LibvirtGenericVIFDriver(self._get_conn()) xml = self._get_instance_xml(d, self.vif_8021qbg) node = self._get_node(xml) self._assertTypeEquals(node, "direct", "source", "dev", "eth0") self._assertMacEquals(node, self.vif_8021qbg) vp = node.find("virtualport") self.assertEqual(vp.get("type"), "802.1Qbg") manager_id_found = False type_id_found = False typeversion_id_found = False instance_id_found = False for p_elem in vp.findall("parameters"): wantparams = self.vif_8021qbg['qbg_params'] manager_id = p_elem.get("managerid", None) type_id = p_elem.get("typeid", None) typeversion_id = p_elem.get("typeidversion", None) instance_id = p_elem.get("instanceid", None) if manager_id: self.assertEqual(manager_id, wantparams['managerid']) manager_id_found = True if type_id: self.assertEqual(type_id, wantparams['typeid']) type_id_found = True if typeversion_id: self.assertEqual(typeversion_id, wantparams['typeidversion']) typeversion_id_found = True if instance_id: self.assertEqual(instance_id, wantparams['instanceid']) instance_id_found = True self.assertTrue(manager_id_found) self.assertTrue(type_id_found) self.assertTrue(typeversion_id_found) self.assertTrue(instance_id_found)
def _create_instance_data(self): """Creates an instance record and associated data like BDMs, VIFs, migrations, etc in the source cell and returns the Instance object. The idea is to create as many things from the Instance.INSTANCE_OPTIONAL_ATTRS list as possible. :returns: The created Instance and Migration objects """ # Create the nova-compute services record first. fake_service = test_service._fake_service() fake_service.pop('version', None) # version field is immutable fake_service.pop('id', None) # cannot create with an id set service = objects.Service(self.source_context, **fake_service) service.create() # Create the compute node using the service. fake_compute_node = copy.copy(test_compute_node.fake_compute_node) fake_compute_node['host'] = service.host fake_compute_node['hypervisor_hostname'] = service.host fake_compute_node['stats'] = {} # the object requires a dict fake_compute_node['service_id'] = service.id fake_compute_node.pop('id', None) # cannot create with an id set compute_node = objects.ComputeNode(self.source_context, **fake_compute_node) compute_node.create() # Build an Instance object with basic fields set. updates = { 'metadata': { 'foo': 'bar' }, 'system_metadata': { 'roles': ['member'] }, 'host': compute_node.host, 'node': compute_node.hypervisor_hostname } inst = fake_instance.fake_instance_obj(self.source_context, **updates) delattr(inst, 'id') # cannot create an instance with an id set # Now we have to dirty all of the fields because fake_instance_obj # uses Instance._from_db_object to create the Instance object we have # but _from_db_object calls obj_reset_changes() which resets all of # the fields that were on the object, including the basic stuff like # the 'host' field, which means those fields don't get set in the DB. # TODO(mriedem): This should live in fake_instance_obj with a # make_creatable kwarg. for field in inst.obj_fields: if field in inst: setattr(inst, field, getattr(inst, field)) # Make sure at least one expected basic field is dirty on the Instance. self.assertIn('host', inst.obj_what_changed()) # Set the optional fields on the instance before creating it. inst.pci_requests = objects.InstancePCIRequests(requests=[ objects.InstancePCIRequest( **test_instance_pci_requests.fake_pci_requests[0]) ]) inst.numa_topology = objects.InstanceNUMATopology( cells=test_instance_numa.fake_obj_numa_topology.cells) inst.trusted_certs = objects.TrustedCerts(ids=[uuids.cert]) inst.vcpu_model = test_vcpu_model.fake_vcpumodel inst.keypairs = objects.KeyPairList( objects=[objects.KeyPair(**test_keypair.fake_keypair)]) inst.device_metadata = ( test_instance_device_metadata.get_fake_obj_device_metadata( self.source_context)) # FIXME(mriedem): db.instance_create does not handle tags inst.obj_reset_changes(['tags']) inst.create() bdm = { 'instance_uuid': inst.uuid, 'source_type': 'volume', 'destination_type': 'volume', 'volume_id': uuids.volume_id, 'volume_size': 1, 'device_name': '/dev/vda', } bdm = objects.BlockDeviceMapping( self.source_context, **fake_block_device.FakeDbBlockDeviceDict(bdm_dict=bdm)) delattr(bdm, 'id') # cannot create a bdm with an id set bdm.obj_reset_changes(['id']) bdm.create() vif = objects.VirtualInterface(self.source_context, address='de:ad:be:ef:ca:fe', uuid=uuids.port, instance_uuid=inst.uuid) vif.create() info_cache = objects.InstanceInfoCache().new(self.source_context, inst.uuid) info_cache.network_info = network_model.NetworkInfo( [network_model.VIF(id=vif.uuid, address=vif.address)]) info_cache.save(update_cells=False) objects.TagList.create(self.source_context, inst.uuid, ['test']) try: raise test.TestingException('test-fault') except test.TestingException as fault: compute_utils.add_instance_fault_from_exc(self.source_context, inst, fault) objects.InstanceAction().action_start(self.source_context, inst.uuid, 'resize', want_result=False) objects.InstanceActionEvent().event_start(self.source_context, inst.uuid, 'migrate_server', want_result=False) # Create a fake migration for the cross-cell resize operation. migration = objects.Migration( self.source_context, **test_migration.fake_db_migration(instance_uuid=inst.uuid, cross_cell_move=True, migration_type='resize')) delattr(migration, 'id') # cannot create a migration with an id set migration.obj_reset_changes(['id']) migration.create() # Create an old non-resize migration to make sure it is copied to the # target cell database properly. old_migration = objects.Migration( self.source_context, **test_migration.fake_db_migration(instance_uuid=inst.uuid, migration_type='live-migration', status='completed', uuid=uuids.old_migration)) delattr(old_migration, 'id') # cannot create a migration with an id old_migration.obj_reset_changes(['id']) old_migration.create() fake_pci_device = copy.copy(test_pci_device.fake_db_dev) fake_pci_device['extra_info'] = {} # the object requires a dict fake_pci_device['compute_node_id'] = compute_node.id pci_device = objects.PciDevice.create(self.source_context, fake_pci_device) pci_device.allocate(inst) # sets the status and instance_uuid fields pci_device.save() # Return a fresh copy of the instance from the DB with as many joined # fields loaded as possible. expected_attrs = copy.copy(instance_obj.INSTANCE_OPTIONAL_ATTRS) # Cannot load fault from get_by_uuid. expected_attrs.remove('fault') inst = objects.Instance.get_by_uuid(self.source_context, inst.uuid, expected_attrs=expected_attrs) return inst, migration
SUBNET = network_model.Subnet(cidr='101.168.1.0/24', dns=[DNS_BRIDGE], gateway=GATEWAY, routes=None, dhcp_server='191.168.1.1') NETWORK = network_model.Network(id='ab7b876b-2c1c-4bb2-afa1-f9f4b6a28053', bridge='br0', label=None, subnets=[SUBNET], bridge_interface=None, vlan=99, mtu=1000) OVS_VIF = network_model.VIF( id='da5cc4bf-f16c-4807-a0b6-911c7c67c3f8', address='ca:fe:de:ad:be:ef', network=NETWORK, type=network_model.VIF_TYPE_OVS, devname='tapda5cc4bf-f1', ovs_interfaceid='7b6812a6-b044-4596-b3c5-43a8ec431638', details={network_model.VIF_DETAILS_OVS_HYBRID_PLUG: False}) OVS_HYBRID_VIF = network_model.VIF( id='da5cc4bf-f16c-4807-a0b6-911c7c67c3f8', address='ca:fe:de:ad:be:ef', network=NETWORK, type=network_model.VIF_TYPE_OVS, devname='tapda5cc4bf-f1', ovs_interfaceid='7b6812a6-b044-4596-b3c5-43a8ec431638', details={network_model.VIF_DETAILS_OVS_HYBRID_PLUG: True}) TAP_VIF = network_model.VIF(id='da5cc4bf-f16c-4807-a0b6-911c7c67c3f8', address='ca:fe:de:ad:be:ee', network=NETWORK, type=network_model.VIF_TYPE_TAP,
def test_update_vif_xml(self): """Simulates updating the guest xml for live migrating from a host using OVS to a host using vhostuser as the networking backend. """ vif_ovs = network_model.VIF(id=uuids.vif, address='DE:AD:BE:EF:CA:FE', details={'port_filter': False}, devname='tap-xxx-yyy-zzz', ovs_interfaceid=uuids.ovs) source_vif = vif_ovs migrate_vifs = [ objects.VIFMigrateData( port_id=uuids.port_id, vnic_type=network_model.VNIC_TYPE_NORMAL, vif_type=network_model.VIF_TYPE_VHOSTUSER, vif_details={'vhostuser_socket': '/vhost-user/test.sock'}, profile={}, host='dest.host', source_vif=source_vif) ] data = objects.LibvirtLiveMigrateData(vifs=migrate_vifs) original_xml = """<domain> <uuid>3de6550a-8596-4937-8046-9d862036bca5</uuid> <devices> <interface type="bridge"> <mac address="DE:AD:BE:EF:CA:FE"/> <model type="virtio"/> <source bridge="qbra188171c-ea"/> <target dev="tapa188171c-ea"/> <virtualport type="openvswitch"> <parameters interfaceid="%s"/> </virtualport> <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/> </interface> </devices> </domain>""" % uuids.ovs conf = vconfig.LibvirtConfigGuestInterface() conf.net_type = "vhostuser" conf.vhostuser_type = "unix" conf.vhostuser_mode = "server" conf.mac_addr = "DE:AD:BE:EF:CA:FE" conf.vhostuser_path = "/vhost-user/test.sock" conf.model = "virtio" get_vif_config = mock.MagicMock(return_value=conf) doc = etree.fromstring(original_xml) updated_xml = etree.tostring(migration._update_vif_xml( doc, data, get_vif_config), encoding='unicode') # Note that <target> and <virtualport> are dropped from the ovs source # interface xml since they aren't applicable to the vhostuser # destination interface xml. The type attribute value changes and the # hardware address element is retained. expected_xml = """<domain> <uuid>3de6550a-8596-4937-8046-9d862036bca5</uuid> <devices> <interface type="vhostuser"> <mac address="DE:AD:BE:EF:CA:FE"/> <model type="virtio"/> <source mode="server" path="/vhost-user/test.sock" type="unix"/> <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/> </interface> </devices> </domain>""" self.assertThat(updated_xml, matchers.XMLMatches(expected_xml))
def setUp(self): super(TestZVMDriver, self).setUp() self.flags(my_ip='192.168.1.1', instance_name_template='abc%05d') self.flags(cloud_connector_url='https://1.1.1.1:1111', group='zvm') with mock.patch('nova.virt.zvm.utils.ConnectorClient.call') as mcall, \ mock.patch('pwd.getpwuid', return_value=mock.Mock(pw_name='test')): mcall.return_value = { 'hypervisor_hostname': 'TESTHOST', 'ipl_time': 'IPL at 11/14/17 10:47:44 EST' } self._driver = zvmdriver.ZVMDriver(fake.FakeVirtAPI()) self._hypervisor = self._driver._hypervisor self._context = context.RequestContext('fake_user', 'fake_project') self._image_id = uuidsentinel.imag_id self._instance_values = { 'display_name': 'test', 'uuid': uuidsentinel.inst_id, 'vcpus': 1, 'memory_mb': 1024, 'image_ref': self._image_id, 'root_gb': 0, } self._instance = fake_instance.fake_instance_obj( self._context, **self._instance_values) self._instance.flavor = objects.Flavor(name='testflavor', vcpus=1, root_gb=3, ephemeral_gb=10, swap=0, memory_mb=512, extra_specs={}) self._eph_disks = [{ 'guest_format': u'ext3', 'device_name': u'/dev/sdb', 'disk_bus': None, 'device_type': None, 'size': 1 }, { 'guest_format': u'ext4', 'device_name': u'/dev/sdc', 'disk_bus': None, 'device_type': None, 'size': 2 }] self._block_device_info = { 'swap': None, 'root_device_name': u'/dev/sda', 'ephemerals': self._eph_disks, 'block_device_mapping': [] } fake_image_meta = { 'status': 'active', 'properties': { 'os_distro': 'rhel7.2' }, 'name': 'rhel72eckdimage', 'deleted': False, 'container_format': 'bare', 'disk_format': 'raw', 'id': self._image_id, 'owner': 'cfc26f9d6af948018621ab00a1675310', 'checksum': 'b026cd083ef8e9610a29eaf71459cc', 'min_disk': 0, 'is_public': False, 'deleted_at': None, 'min_ram': 0, 'size': 465448142 } self._image_meta = objects.ImageMeta.from_dict(fake_image_meta) subnet_4 = network_model.Subnet( cidr='192.168.0.1/24', dns=[network_model.IP('192.168.0.1')], gateway=network_model.IP('192.168.0.1'), ips=[network_model.IP('192.168.0.100')], routes=None) network = network_model.Network(id=0, bridge='fa0', label='fake', subnets=[subnet_4], vlan=None, bridge_interface=None, injected=True) self._network_values = { 'id': None, 'address': 'DE:AD:BE:EF:00:00', 'network': network, 'type': network_model.VIF_TYPE_OVS, 'devname': None, 'ovs_interfaceid': None, 'rxtx_cap': 3 } self._network_info = network_model.NetworkInfo( [network_model.VIF(**self._network_values)]) self.mock_update_task_state = mock.Mock()
def test_stringify(self): networkinfo = network_model.NetworkInfo() networkinfo.append(network_model.VIF(id=123)) networkinfo.append(network_model.VIF(id=456)) self.assertEqual('NetworkModel(123,456)', self.field.stringify(networkinfo))
def test_vif_not_equal(self): vif1 = model.VIF(id=1) vif2 = model.VIF(id=2) self.assertNotEqual(vif1, vif2) vif1 = model.VIF(address='00:00:00:00:00:11') vif2 = model.VIF(address='00:00:00:00:00:22') self.assertNotEqual(vif1, vif2) vif1 = model.VIF(network='net1') vif2 = model.VIF(network='net2') self.assertNotEqual(vif1, vif2) vif1 = model.VIF(type='ovs') vif2 = model.VIF(type='linuxbridge') self.assertNotEqual(vif1, vif2) vif1 = model.VIF(devname='ovs1234') vif2 = model.VIF(devname='linuxbridge1234') self.assertNotEqual(vif1, vif2) vif1 = model.VIF(qbh_params=1) vif2 = model.VIF(qbh_params=None) self.assertNotEqual(vif1, vif2) vif1 = model.VIF(qbg_params=1) vif2 = model.VIF(qbg_params=None) self.assertNotEqual(vif1, vif2) vif1 = model.VIF(active=True) vif2 = model.VIF(active=False) self.assertNotEqual(vif1, vif2) vif1 = model.VIF(vnic_type=model.VNIC_TYPE_NORMAL) vif2 = model.VIF(vnic_type=model.VNIC_TYPE_DIRECT) self.assertNotEqual(vif1, vif2) vif1 = model.VIF(profile={'pci_slot': '0000:0a:00.1'}) vif2 = model.VIF(profile={'pci_slot': '0000:0a:00.2'}) self.assertNotEqual(vif1, vif2) vif1 = model.VIF(preserve_on_delete=True) vif2 = model.VIF(preserve_on_delete=False) self.assertNotEqual(vif1, vif2)