Ejemplo n.º 1
0
    def test_nova_to_osvif_vhostuser_fp_ovs_hybrid(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",
                                  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:
                True,
                model.VIF_DETAILS_OVS_HYBRID_PLUG:
                True,
                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.VIFVHostUser(
            id="dc065497-3c8d-4f44-8fb4-e1d33c16a536",
            active=False,
            address="22:52:25:62:e2:aa",
            plugin="vhostuser_fp",
            port_profile=osv_objects.vif.VIFPortProfileFPOpenVSwitch(
                interface_id="dc065497-3c8d-4f44-8fb4-e1d33c16a536",
                bridge_name="qbrdc065497-3c",
                hybrid_plug=True,
                datapath_type=model.VIF_DETAILS_OVS_DATAPATH_SYSTEM),
            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",
                subnets=osv_objects.subnet.SubnetList(objects=[])))

        self.assertObjEqual(expect, actual)
Ejemplo n.º 2
0
    def test_nova_to_osvif_vif_unknown(self):
        vif = model.VIF(
            id="dc065497-3c8d-4f44-8fb4-e1d33c16a536",
            type="wibble",
            address="22:52:25:62:e2:aa",
            network=model.Network(id="b82c1929-051e-481d-8110-4669916c7915",
                                  label="Demo Net",
                                  subnets=[]),
        )

        ex = self.assertRaises(exception.NovaException,
                               os_vif_util.nova_to_osvif_vif, vif)
        self.assertIn('Unsupported VIF type wibble', six.text_type(ex))
Ejemplo n.º 3
0
    def _mgmt_cna_to_vif(self, cna):
        """Converts the mgmt CNA to VIF format for network injection."""
        mac = vm.norm_mac(cna.mac)
        ipv6_link_local = self._mac_to_link_local(mac)

        subnet = network_model.Subnet(
            version=6,
            cidr=_LLA_SUBNET,
            ips=[network_model.FixedIP(address=ipv6_link_local)])
        network = network_model.Network(id='mgmt',
                                        subnets=[subnet],
                                        injected='yes')
        return network_model.VIF(id='mgmt_vif', address=mac, network=network)
Ejemplo n.º 4
0
    def test_nova_to_osvif_network_labeled_no_vlan(self):
        network = model.Network(id="b82c1929-051e-481d-8110-4669916c7915",
                                label="Demo Net",
                                should_create_vlan=True,
                                subnets=[
                                    model.Subnet(cidr="192.168.1.0/24",
                                                 gateway=model.IP(
                                                     address="192.168.1.254",
                                                     type='gateway')),
                                ])

        self.assertRaises(exception.NovaException,
                          os_vif_util._nova_to_osvif_network, network)
Ejemplo n.º 5
0
    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,
                                    admin=True).list_ports(**search_opts)
        ports = data.get('ports', [])
        if not networks:
            networks = self._get_available_networks(context,
                                                    instance['project_id'])
        else:
            # ensure ports are in preferred network order
            _ensure_requested_network_ordering(lambda x: x['network_id'],
                                               ports,
                                               [n['id'] for n in networks])

        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=CONF.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,
                                  type=port.get('binding:vif_type')))
        return nw_info
Ejemplo n.º 6
0
 def test_attach_vrouter(self, mock_find_by_name, mock_find_pid):
     vid = '920be1f5-2b98-411e-890a-69bcabb2a5a0'
     if_remote_name = 'ns%s' % vid[:8]
     if_local_name = 'veth%s' % vid[:8]
     address = '10.1.2.1'
     gateway = '1.1.1.254'
     fixed_ip = '1.1.1.42/24'
     calls = [
         mock.call('mkdir', '-p', '/var/run/netns', run_as_root=True),
         mock.call('ln', '-sf', '/proc/7890/ns/net',
                   '/var/run/netns/my_vm', run_as_root=True),
         mock.call('ip', 'netns', 'exec', 'my_vm', 'ip', 'link',
                   'set', 'lo', 'up', run_as_root=True),
         mock.call('ip', 'link', 'set', if_remote_name, 'netns', 'my_vm',
                   run_as_root=True),
         mock.call('ip', 'link', 'set', if_local_name, 'up',
                   run_as_root=True),
         mock.call('ip', 'netns', 'exec', 'my_vm', 'ip', 'link',
                   'set', if_remote_name, 'address', address,
                   run_as_root=True),
         mock.call('ip', 'netns', 'exec', 'my_vm', 'ifconfig',
                   if_remote_name, fixed_ip, run_as_root=True),
         mock.call('ip', 'netns', 'exec', 'my_vm', 'ip',
                   'route', 'replace', 'default', 'via', gateway,
                   'dev', if_remote_name, run_as_root=True),
         mock.call('ip', 'netns', 'exec', 'my_vm', 'ip', 'link',
                   'set', if_remote_name, 'up', run_as_root=True)
     ]
     network_info = [network_model.VIF(id=vid, address=address,
                                       network=network_model.Network(
                                           id='virtual-network-1',
                                           subnets=[network_model.Subnet(
                                               cidr='1.1.1.0/24',
                                               gateway=network_model.IP(
                                                   address=gateway,
                                                   type='gateway'),
                                               ips=[network_model.IP(
                                                   address='1.1.1.42',
                                                   type='fixed',
                                                   version=4)]
                                           )]
                                       ))]
     instance = dict(name='fake_instance', display_name='fake_vm',
                     hostname='fake_vm', host='linux',
                     project_id='e2d2ddc6-4e0f-4cd4-b846-3bad53093ec6',
                     uuid='d4b817fb-7885-4649-bad7-89302dde12e1')
     with mock.patch('nova.utils.execute') as ex:
         driver = docker_driver.DockerDriver(object)
         driver._attach_vifs(instance, network_info)
         ex.assert_has_calls(calls)
Ejemplo n.º 7
0
    def _test_is_firewall_required(self, port_filter, driver, expect):
        vif = model.VIF(id="dc065497-3c8d-4f44-8fb4-e1d33c16a536",
                        type=model.VIF_TYPE_BRIDGE,
                        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: port_filter,
                        })
        self.flags(firewall_driver=driver)

        self.assertEqual(expect, os_vif_util._is_firewall_required(vif))
Ejemplo n.º 8
0
    def test_network_not_equal(self):
        network1 = model.Network(id='1')
        network2 = model.Network(id='2')
        self.assertNotEqual(network1, network2)

        network1 = model.Network(bridge='br-int')
        network2 = model.Network(bridge='br0')
        self.assertNotEqual(network1, network2)

        network1 = model.Network(label='net1')
        network2 = model.Network(label='net2')
        self.assertNotEqual(network1, network2)

        network1 = model.Network(subnets='1.1.1.0/24')
        network2 = model.Network(subnets='2.2.2.0/24')
        self.assertNotEqual(network1, network2)
Ejemplo n.º 9
0
    def test_nova_to_osvif_vif_ivs_plain(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,
                        })

        actual = os_vif_util.nova_to_osvif_vif(vif)

        self.assertIsNone(actual)
Ejemplo n.º 10
0
    def test_nova_to_osvif_vhostuser_vrouter_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_VROUTER_PLUG: True,
                        })

        self.assertRaises(exception.VifDetailsMissingVhostuserSockPath,
                          os_vif_util.nova_to_osvif_vif, vif)
Ejemplo n.º 11
0
    def test_nova_to_osvif_vhostuser_non_ovs(self):
        vif = model.VIF(id="dc065497-3c8d-4f44-8fb4-e1d33c16a536",
                        active=False,
                        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: False,
                            model.VIF_DETAILS_VHOSTUSER_SOCKET: '/fake/socket'
                        })

        self.assertIsNone(os_vif_util.nova_to_osvif_vif(vif))
Ejemplo n.º 12
0
    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)
        if CONF.use_neutron:
            vif_type = network_model.VIF_TYPE_OVS
        else:
            vif_type = network_model.VIF_TYPE_BRIDGE
        vif = network_model.VIF(id=FAKE_VIF_UUID,
                                address=FAKE_VIF_MAC,
                                network=network,
                                type=vif_type,
                                devname=None,
                                ovs_interfaceid=None)

        return vif
Ejemplo n.º 13
0
    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)
Ejemplo n.º 14
0
Archivo: api.py Proyecto: mattstep/nova
    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:
            search_opts = {}
            if instance['project_id']:
                search_opts.update({"tenant_id": instance['project_id']})
            data = quantumv2.get_client(context).list_networks(**search_opts)
            networks = data.get('networks', [])
        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

            subnets = self._get_subnets_from_port(context, port)
            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

            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
Ejemplo n.º 15
0
    def test_nova_to_osvif_vif_ivs_plain(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,
                        })

        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.VIFGeneric)
        self.assertEqual(expected_vif_name, actual.vif_name)
def new_network(network_dict=None, version=4):
    if version == 6:
        new_net = dict(
            id=1,
            bridge='br0',
            label='public',
            subnets=[new_subnet(version=6),
                     new_subnet(dict(cidr='ffff:ffff:ffff:ffff::'),
                                version=6)])
    elif version == 4:
        new_net = dict(
            id=1,
            bridge='br0',
            label='public',
            subnets=[new_subnet(), new_subnet(dict(cidr='255.255.255.255'))])
    network_dict = network_dict or {}
    new_net.update(network_dict)
    return model.Network(**new_net)
Ejemplo n.º 17
0
    def _nw_info_build_network(self, port, networks, subnets):
        # NOTE(danms): This loop can't fail to find a network since we
        # filtered ports to only the ones matching networks in our parent
        for net in networks:
            if port['network_id'] == net['id']:
                network_name = net['name']
                break

        bridge = None
        ovs_interfaceid = None
        # Network model metadata
        should_create_bridge = None
        vif_type = port.get('binding:vif_type')
        # TODO(berrange) Neutron should pass the bridge name
        # in another binding metadata field
        if vif_type == network_model.VIF_TYPE_OVS:
            bridge = CONF.neutron_ovs_bridge
            ovs_interfaceid = port['id']
        elif vif_type == network_model.VIF_TYPE_BRIDGE:
            bridge = "brq" + port['network_id']
            should_create_bridge = True

        if bridge is not None:
            bridge = bridge[:network_model.NIC_NAME_LEN]

        network = network_model.Network(
            id=port['network_id'],
            bridge=bridge,
            injected=CONF.flat_injected,
            label=network_name,
            tenant_id=net['tenant_id']
            )
        network['subnets'] = subnets
        port_profile = port.get('binding:profile')
        if port_profile:
            physical_network = port_profile.get('physical_network')
            if physical_network:
                network['physical_network'] = physical_network

        if should_create_bridge is not None:
            network['should_create_bridge'] = should_create_bridge
        return network, ovs_interfaceid
Ejemplo n.º 18
0
    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)
Ejemplo n.º 19
0
 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)
Ejemplo n.º 20
0
 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
Ejemplo n.º 21
0
    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_network_extra(self):
        network = model.Network(
            id="b82c1929-051e-481d-8110-4669916c7915",
            bridge="br0",
            multi_host=True,
            should_create_bridge=True,
            should_create_vlan=True,
            bridge_interface="eth0",
            vlan=1729,
            subnets=[
                model.Subnet(cidr="192.168.1.0/24",
                             gateway=model.IP(
                                 address="192.168.1.254",
                                 type='gateway')),
            ])

        expect = osv_objects.network.Network(
            id="b82c1929-051e-481d-8110-4669916c7915",
            bridge="br0",
            multi_host=True,
            should_provide_bridge=True,
            should_provide_vlan=True,
            bridge_interface="eth0",
            vlan=1729,
            subnets=osv_objects.subnet.SubnetList(
                objects=[
                    osv_objects.subnet.Subnet(
                        cidr="192.168.1.0/24",
                        dns=[],
                        gateway="192.168.1.254",
                        ips=osv_objects.fixed_ip.FixedIPList(
                            objects=[]),
                        routes=osv_objects.route.RouteList(
                            objects=[]),
                    )
                ]))

        actual = os_vif_util._nova_to_osvif_network(network)

        self.assertObjEqual(expect, actual)
Ejemplo n.º 23
0
 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)
Ejemplo n.º 24
0
    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)
Ejemplo n.º 25
0
    def test_nova_to_osvif_vhostuser_non_ovs(self):
        vif = model.VIF(
            id="dc065497-3c8d-4f44-8fb4-e1d33c16a536",
            active=False,
            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: False,
                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="noop",
            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=None,
                subnets=osv_objects.subnet.SubnetList(
                    objects=[])))

        self.assertObjEqual(expect, actual)
Ejemplo n.º 26
0
    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
Ejemplo n.º 27
0
    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()
Ejemplo n.º 28
0
    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)
                ])
Ejemplo n.º 29
0
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)
Ejemplo n.º 30
0
from nova.network import model as network_model
from nova import test
from nova.tests.unit import fake_instance
from nova.virt.lxd import vif

GATEWAY = network_model.IP(address='101.168.1.1', type='gateway')
DNS_BRIDGE = network_model.IP(address='8.8.8.8', type=None)
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,