コード例 #1
0
    def test_nova_to_osvif_ips(self):
        ips = [
            model.FixedIP(address="192.168.122.24",
                          floating_ips=[
                              model.IP(address="192.168.122.100",
                                       type="floating"),
                              model.IP(address="192.168.122.101",
                                       type="floating"),
                              model.IP(address="192.168.122.102",
                                       type="floating"),
                          ],
                          version=4),
            model.FixedIP(address="2001::beef", version=6),
        ]

        actual = os_vif_util._nova_to_osvif_ips(ips)

        expect = osv_objects.fixed_ip.FixedIPList(objects=[
            osv_objects.fixed_ip.FixedIP(address="192.168.122.24",
                                         floating_ips=[
                                             "192.168.122.100",
                                             "192.168.122.101",
                                             "192.168.122.102",
                                         ]),
            osv_objects.fixed_ip.FixedIP(address="2001::beef",
                                         floating_ips=[]),
        ], )

        self.assertObjEqual(expect, actual)
コード例 #2
0
def new_fixed_ip(ip_dict=None, version=4):
    if version == 6:
        new_fixed_ip = dict(address='fd00::1:100', version=6)
    elif version == 4:
        new_fixed_ip = dict(address='192.168.1.100')
    ip_dict = ip_dict or {}
    new_fixed_ip.update(ip_dict)
    return model.FixedIP(**new_fixed_ip)
コード例 #3
0
 def _nw_info_get_ips(self, client, port):
     network_IPs = []
     for fixed_ip in port['fixed_ips']:
         fixed = network_model.FixedIP(address=fixed_ip['ip_address'])
         floats = self._get_floating_ips_by_fixed_and_port(
             client, fixed_ip['ip_address'], port['id'])
         for ip in floats:
             fip = network_model.IP(address=ip['floating_ip_address'],
                                    type='floating')
             fixed.add_floating_ip(fip)
         network_IPs.append(fixed)
     return network_IPs
コード例 #4
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)
コード例 #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
コード例 #6
0
    def test_equate_two_dissimilar_fixed_ips_fails(self):
        fixed_ip = model.FixedIP(address='::1')
        fixed_ip2 = model.FixedIP(address='::2')
        self.assertNotEqual(fixed_ip, fixed_ip2)

        fixed_ip = model.FixedIP(address='::1', type='1')
        fixed_ip2 = model.FixedIP(address='::1', type='2')
        self.assertNotEqual(fixed_ip, fixed_ip2)

        fixed_ip = model.FixedIP(address='::1', version='6')
        fixed_ip2 = model.FixedIP(address='::1', version='4')
        self.assertNotEqual(fixed_ip, fixed_ip2)

        fixed_ip = model.FixedIP(address='::1', floating_ips='1.1.1.1')
        fixed_ip2 = model.FixedIP(address='::1', floating_ips='8.8.8.8')
        self.assertNotEqual(fixed_ip, fixed_ip2)
コード例 #7
0
ファイル: api.py プロジェクト: 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
コード例 #8
0
 def test_equate_two_fixed_ips(self):
     fixed_ip = model.FixedIP(address='::1')
     fixed_ip2 = model.FixedIP(address='::1')
     self.assertEqual(fixed_ip, fixed_ip2)
コード例 #9
0
    def _build_network_info_model(self, context, instance, networks=None):
        """This is a slightly different version than the super.

        Adds support to relax the filters for the service tenant.
        Workaround the fact that nova doesn't like ipv6 subnet only
        """
        search_opts = {'device_id': instance['uuid']}
        # NOTE(rods): The following "if" statement is not present in the
        #            parent method.
        if context.project_name != 'service' or context.user_name != 'neutron':
            search_opts['tenant_id'] = instance['project_id']

        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'],
                                                    net_ids)  # akanda change

        # 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]
        api._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)

            # Nova does not like only IPv6, so let's lie and add a fake
            # link-local IPv4.  Neutron provides DHCP so this is ignored.
            # NOTE(rods): This workaround is not present in the parent method
            if not any(ip['version'] == 4 for ip in network_IPs):
                nova_lie = {
                    'cidr': '169.254.0.0/16',
                    'gateway': network_model.IP(address='', type='gateway'),
                    'ips': [network_model.FixedIP(address='169.254.10.20')]
                }
                subnets.append(nova_lie)

            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
コード例 #10
0
ファイル: fake_network.py プロジェクト: sapcc/nova
def fake_get_instance_nw_info(test, num_networks=1):
    def update_cache_fake(*args, **kwargs):
        fake_info_cache = {
            'created_at': None,
            'updated_at': None,
            'deleted_at': None,
            'deleted': False,
            'instance_uuid': uuids.vifs_1,
            'network_info': '[]',
        }
        return fake_info_cache

    test.stub_out('nova.db.api.instance_info_cache_update', update_cache_fake)

    # TODO(stephenfin): This doesn't match the kind of object we would receive
    # from '_build_vif_model' and callers of same. We should fix that.
    nw_model = network_model.NetworkInfo()
    for network_id in range(1, num_networks + 1):
        network = network_model.Network(
            id=getattr(uuids, 'network%i' % network_id),
            bridge='fake_br%d' % network_id,
            label='test%d' % network_id,
            subnets=[
                network_model.Subnet(
                    cidr='192.168.%d.0/24' % network_id,
                    dns=[
                        network_model.IP(
                            address='192.168.%d.3' % network_id,
                            type='dns',
                            version=4,
                            meta={},
                        ),
                        network_model.IP(
                            address='192.168.%d.4' % network_id,
                            type='dns',
                            version=4,
                            meta={},
                        ),
                    ],
                    gateway=network_model.IP(
                        address='192.168.%d.1' % network_id,
                        type='gateway',
                        version=4,
                        meta={},
                    ),
                    ips=[
                        network_model.FixedIP(
                            address='192.168.%d.100' % network_id,
                            version=4,
                            meta={},
                        ),
                    ],
                    routes=[],
                    version=4,
                    meta={},
                ),
                network_model.Subnet(
                    cidr='2001:db8:0:%x::/64' % network_id,
                    dns=[],
                    gateway=network_model.IP(
                        address='2001:db8:0:%x::1' % network_id,
                        type='gateway',
                        version=6,
                        meta={},
                    ),
                    ips=[
                        network_model.FixedIP(
                            address='2001:db8:0:%x:dcad:beff:feef:1' %
                            (network_id),
                            version=6,
                            meta={},
                        ),
                    ],
                    routes=[],
                    version=6,
                    meta={}),
            ],
            meta={"tenant_id": "806e1f03-b36f-4fc6-be29-11a366f150eb"},
        )
        vif = network_model.VIF(
            id=getattr(uuids, 'vif%i' % network_id),
            address='DE:AD:BE:EF:00:%02x' % network_id,
            network=network,
            type='bridge',
            details={},
            devname=None,
            ovs_interfaceid=None,
            qbh_params=None,
            qbg_params=None,
            active=False,
            vnic_type='normal',
            profile={},
            preserve_on_delete=False,
            meta={'rxtx_cap': 30},
        )
        nw_model.append(vif)

    return nw_model
コード例 #11
0
 def test_create_fixed_ipv6(self):
     fixed_ip = model.FixedIP(address='::1')
     self.assertEqual('::1', fixed_ip['address'])
     self.assertEqual([], fixed_ip['floating_ips'])
     self.assertEqual('fixed', fixed_ip['type'])
     self.assertEqual(6, fixed_ip['version'])
コード例 #12
0
def new_ip(ip_dict=None):
    new_ip = dict(address='192.168.1.100')
    ip_dict = ip_dict or {}
    new_ip.update(ip_dict)
    return model.FixedIP(**new_ip)
コード例 #13
0
 def test_add_floating_ip_repeatedly_only_one_instance(self):
     fixed_ip = model.FixedIP(address='192.168.1.100')
     for i in range(10):
         fixed_ip.add_floating_ip('192.168.1.101')
     self.assertEqual(['192.168.1.101'], fixed_ip['floating_ips'])
コード例 #14
0
 def test_createnew_fixed_ip_with_attrs(self):
     fixed_ip = model.FixedIP(address='192.168.1.100')
     self.assertEqual('192.168.1.100', fixed_ip['address'])
     self.assertEqual([], fixed_ip['floating_ips'])
     self.assertEqual('fixed', fixed_ip['type'])
     self.assertEqual(4, fixed_ip['version'])
コード例 #15
0
 def test_add_floating_ip(self):
     fixed_ip = model.FixedIP(address='192.168.1.100')
     fixed_ip.add_floating_ip('192.168.1.101')
     self.assertEqual(['192.168.1.101'], fixed_ip['floating_ips'])
コード例 #16
0
    def test_nova_to_osvif_subnets(self):
        subnets = [
            model.Subnet(cidr="192.168.1.0/24",
                         dns=[
                             model.IP(
                                 address="192.168.1.1",
                                 type="dns"),
                             model.IP(
                                 address="192.168.1.2",
                                 type="dns"),
                         ],
                         gateway=model.IP(
                             address="192.168.1.254",
                             type='gateway'),
                         ips=[
                             model.FixedIP(
                                 address="192.168.1.100",
                             ),
                             model.FixedIP(
                                 address="192.168.1.101",
                             ),
                         ],
                         routes=[
                             model.Route(
                                 cidr="10.0.0.1/24",
                                 gateway=model.IP(
                                     address="192.168.1.254",
                                     type="gateway"),
                                 interface="eth0"),
                         ]),
            model.Subnet(dns=[
                             model.IP(
                                 address="192.168.1.1",
                                 type="dns"),
                             model.IP(
                                 address="192.168.1.2",
                                 type="dns"),
                         ],
                         ips=[
                             model.FixedIP(
                                 address="192.168.1.100",
                             ),
                             model.FixedIP(
                                 address="192.168.1.101",
                             ),
                         ],
                         routes=[
                             model.Route(
                                 cidr="10.0.0.1/24",
                                 gateway=model.IP(
                                     address="192.168.1.254",
                                     type="gateway"),
                                 interface="eth0"),
                         ]),
            model.Subnet(dns=[
                             model.IP(
                                 address="192.168.1.1",
                                 type="dns"),
                             model.IP(
                                 address="192.168.1.2",
                                 type="dns"),
                         ],
                         gateway=model.IP(
                             type='gateway'),
                         ips=[
                             model.FixedIP(
                                 address="192.168.1.100",
                             ),
                             model.FixedIP(
                                 address="192.168.1.101",
                             ),
                         ],
                         routes=[
                             model.Route(
                                 cidr="10.0.0.1/24",
                                 gateway=model.IP(
                                     address="192.168.1.254",
                                     type="gateway"),
                                 interface="eth0"),
                         ]),
        ]

        expect = osv_objects.subnet.SubnetList(
            objects=[
                osv_objects.subnet.Subnet(
                    cidr="192.168.1.0/24",
                    dns=["192.168.1.1",
                         "192.168.1.2"],
                    gateway="192.168.1.254",
                    ips=osv_objects.fixed_ip.FixedIPList(
                        objects=[
                            osv_objects.fixed_ip.FixedIP(
                                address="192.168.1.100",
                                floating_ips=[]),
                            osv_objects.fixed_ip.FixedIP(
                                address="192.168.1.101",
                                floating_ips=[]),
                            ]),
                    routes=osv_objects.route.RouteList(
                        objects=[
                            osv_objects.route.Route(
                                cidr="10.0.0.1/24",
                                gateway="192.168.1.254",
                                interface="eth0")
                            ]),
                    ),
                osv_objects.subnet.Subnet(
                    dns=["192.168.1.1",
                         "192.168.1.2"],
                    ips=osv_objects.fixed_ip.FixedIPList(
                        objects=[
                            osv_objects.fixed_ip.FixedIP(
                                address="192.168.1.100",
                                floating_ips=[]),
                            osv_objects.fixed_ip.FixedIP(
                                address="192.168.1.101",
                                floating_ips=[]),
                            ]),
                    routes=osv_objects.route.RouteList(
                        objects=[
                            osv_objects.route.Route(
                                cidr="10.0.0.1/24",
                                gateway="192.168.1.254",
                                interface="eth0")
                            ]),
                    ),
                osv_objects.subnet.Subnet(
                    dns=["192.168.1.1",
                         "192.168.1.2"],
                    ips=osv_objects.fixed_ip.FixedIPList(
                        objects=[
                            osv_objects.fixed_ip.FixedIP(
                                address="192.168.1.100",
                                floating_ips=[]),
                            osv_objects.fixed_ip.FixedIP(
                                address="192.168.1.101",
                                floating_ips=[]),
                            ]),
                    routes=osv_objects.route.RouteList(
                        objects=[
                            osv_objects.route.Route(
                                cidr="10.0.0.1/24",
                                gateway="192.168.1.254",
                                interface="eth0")
                            ]),
                    ),
            ])

        actual = os_vif_util._nova_to_osvif_subnets(subnets)

        self.assertObjEqual(expect, actual)
コード例 #17
0
    def _build_network_info_model(self, context, instance, networks=None):
        search_opts = {
            'tenant_id': instance['project_id'],
            'device_id': instance['uuid'],
        }
        client = quantumv2.get_client(context, admin=True)
        data = client.list_ports(**search_opts)
        ports = data.get('ports', [])
        if networks is None:
            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
        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:
            # NOTE(danms): This loop can't fail to find a network since we
            # filtered ports to only the ones matching networks above.
            for net in networks:
                if port['network_id'] == net['id']:
                    network_name = net['name']
                    break

            network_IPs = []
            for fixed_ip in port['fixed_ips']:
                fixed = network_model.FixedIP(address=fixed_ip['ip_address'])
                floats = self._get_floating_ips_by_fixed_and_port(
                    client, fixed_ip['ip_address'], port['id'])
                for ip in floats:
                    fip = network_model.IP(address=ip['floating_ip_address'],
                                           type='floating')
                    fixed.add_floating_ip(fip)
                network_IPs.append(fixed)

            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)
                ]

            bridge = None
            ovs_interfaceid = None
            # Network model metadata
            should_create_bridge = None
            vif_type = port.get('binding:vif_type')
            # TODO(berrange) Quantum should pass the bridge name
            # in another binding metadata field
            if vif_type == network_model.VIF_TYPE_OVS:
                bridge = CONF.quantum_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]

            devname = "tap" + port['id']
            devname = devname[: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
            if should_create_bridge is not None:
                network['should_create_bridge'] = should_create_bridge
            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
コード例 #18
0
 def test_equate_two_dissimilar_fixed_ips_fails(self):
     fixed_ip = model.FixedIP(address='::1')
     fixed_ip2 = model.FixedIP(address='::2')
     self.assertNotEqual(fixed_ip, fixed_ip2)
コード例 #19
0
ファイル: api.py プロジェクト: bopopescu/novatest
    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 networks is None:
            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

            if network_name is None:
                raise exception.NotFound(
                    _('Network %(net)s for '
                      'port %(port_id)s not found!') % {
                          'net': port['network_id'],
                          'port': port['id']
                      })

            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)
                ]

            bridge = None
            ovs_interfaceid = None
            # Network model metadata
            should_create_bridge = None
            vif_type = port.get('binding:vif_type')
            # TODO(berrange) Quantum should pass the bridge name
            # in another binding metadata field
            if vif_type == network_model.VIF_TYPE_OVS:
                bridge = CONF.quantum_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]

            devname = "tap" + port['id']
            devname = devname[: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
            if should_create_bridge is not None:
                network['should_create_bridge'] = should_create_bridge
            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