Ejemplo n.º 1
0
    def test_get_network_metadata_json_dhcp(self):
        ipv4_subnet = fake_network_cache_model.new_subnet(
            subnet_dict=dict(dhcp_server='1.1.1.1'), version=4)
        ipv6_subnet = fake_network_cache_model.new_subnet(
            subnet_dict=dict(dhcp_server='1234:567::'), version=6)

        self.netinfo[0]['network']['subnets'][0] = ipv4_subnet
        self.netinfo[0]['network']['subnets'][1] = ipv6_subnet
        net_metadata = netutils.get_network_metadata(self.netinfo,
                                                     use_ipv6=True)

        # IPv4 Network
        self.assertEqual(
            {
                'id': 'network0',
                'link': 'interface0',
                'type': 'ipv4_dhcp',
                'network_id': 1
            },
            net_metadata['networks'][0])

        # IPv6 Network
        self.assertEqual(
            {
                'id': 'network1',
                'link': 'interface0',
                'type': 'ipv6_dhcp',
                'network_id': 1
            },
            net_metadata['networks'][1])
Ejemplo n.º 2
0
    def test_get_network_metadata_json_dhcp(self):
        ipv4_subnet = fake_network_cache_model.new_subnet(
            subnet_dict=dict(dhcp_server='1.1.1.1'), version=4)
        ipv6_subnet = fake_network_cache_model.new_subnet(
            subnet_dict=dict(dhcp_server='1234:567::'), version=6)

        self.netinfo[0]['network']['subnets'][0] = ipv4_subnet
        self.netinfo[0]['network']['subnets'][1] = ipv6_subnet
        net_metadata = netutils.get_network_metadata(self.netinfo,
                                                     use_ipv6=True)

        # IPv4 Network
        self.assertEqual(
            {
                'id': 'network0',
                'link': 'interface0',
                'type': 'ipv4_dhcp',
                'network_id': 1
            }, net_metadata['networks'][0])

        # IPv6 Network
        self.assertEqual(
            {
                'id': 'network1',
                'link': 'interface0',
                'type': 'ipv6_dhcp',
                'network_id': 1
            }, net_metadata['networks'][1])
Ejemplo n.º 3
0
    def _test_get_network_metadata_json_ipv6_addr_mode(self, mode):
        ipv6_subnet = fake_network_cache_model.new_subnet(
            subnet_dict=dict(dhcp_server='1234:567::',
                             ipv6_address_mode=mode), version=6)

        self.netinfo[0]['network']['subnets'][1] = ipv6_subnet
        net_metadata = netutils.get_network_metadata(self.netinfo)

        self.assertEqual(
            {
                'id': 'network1',
                'link': 'interface0',
                'ip_address': 'fd00::2',
                'netmask': 'ffff:ffff:ffff::',
                'routes': [
                    {
                        'network': '::',
                        'netmask': '::',
                        'gateway': 'fd00::1'
                    },
                    {
                        'network': '::',
                        'netmask': 'ffff:ffff:ffff::',
                        'gateway': 'fd00::1:1'
                    }
                ],
                'services': [
                    {'address': '1:2:3:4::', 'type': 'dns'},
                    {'address': '2:3:4:5::', 'type': 'dns'}
                ],
                'type': 'ipv6_%s' % mode,
                'network_id': 1
            },
            net_metadata['networks'][1])
Ejemplo n.º 4
0
    def _test_get_network_metadata_json_ipv6_addr_mode(self, mode):
        ipv6_subnet = fake_network_cache_model.new_subnet(
            subnet_dict=dict(dhcp_server='1234:567::',
                             ipv6_address_mode=mode), version=6)

        self.netinfo[0]['network']['subnets'][1] = ipv6_subnet
        net_metadata = netutils.get_network_metadata(self.netinfo)

        self.assertEqual(
            {
                'id': 'network1',
                'link': 'interface0',
                'ip_address': 'fd00::2',
                'netmask': 'ffff:ffff:ffff::',
                'routes': [
                    {
                        'network': '::',
                        'netmask': '::',
                        'gateway': 'fd00::1'
                    },
                    {
                        'network': '::',
                        'netmask': 'ffff:ffff:ffff::',
                        'gateway': 'fd00::1:1'
                    }
                ],
                'services': [
                    {'address': '1:2:3:4::', 'type': 'dns'},
                    {'address': '2:3:4:5::', 'type': 'dns'}
                ],
                'type': 'ipv6_%s' % mode,
                'network_id': 1
            },
            net_metadata['networks'][1])
Ejemplo n.º 5
0
    def test_new_vif_types_get_type_phy(self):
        new_types = ["whizbang_nvf", "vswitch9"]
        link_types = []
        for vif_type in new_types:
            network_json = netutils.get_network_metadata(
                self._new_netinfo(vif_type=vif_type))
            link_types.append(network_json["links"][0]["type"])

        self.assertEqual(["phy"] * len(new_types), link_types)
Ejemplo n.º 6
0
    def test_new_vif_types_get_type_phy(self):
        new_types = ["whizbang_nvf", "vswitch9"]
        link_types = []
        for vif_type in new_types:
            network_json = netutils.get_network_metadata(
                self._new_netinfo(vif_type=vif_type))
            link_types.append(network_json["links"][0]["type"])

        self.assertEqual(["phy"] * len(new_types), link_types)
Ejemplo n.º 7
0
    def test_get_network_metadata_no_ipv4(self):
        expected_json = {
            "services": [{
                "type": "dns",
                "address": "1:2:3:4::"
            }, {
                "type": "dns",
                "address": "2:3:4:5::"
            }],
            "networks": [{
                "network_id":
                uuids.network_id,
                "type":
                "ipv6",
                "netmask":
                "ffff:ffff:ffff::",
                "link":
                "interface0",
                "routes": [{
                    "netmask": "::",
                    "network": "::",
                    "gateway": "fd00::1"
                }, {
                    "netmask": "ffff:ffff:ffff::",
                    "network": "::",
                    "gateway": "fd00::1:1"
                }],
                'services': [{
                    'address': '1:2:3:4::',
                    'type': 'dns'
                }, {
                    'address': '2:3:4:5::',
                    'type': 'dns'
                }],
                "ip_address":
                "fd00::2",
                "id":
                "network0"
            }],
            "links": [{
                "ethernet_mac_address": "aa:aa:aa:aa:aa:aa",
                "mtu": 1500,
                "type": "phy",
                "id": "interface0",
                "vif_id": uuids.vif_id
            }]
        }

        # drop the ipv4 subnet
        self.netinfo[0]['network']['subnets'].pop(0)
        network_json = netutils.get_network_metadata(self.netinfo)
        self.assertEqual(expected_json, network_json)
Ejemplo n.º 8
0
    def test_get_network_metadata_no_ipv4(self):
        expected_json = {
            "services": [
                {
                    "type": "dns",
                    "address": "1:2:3:4::"
                },
                {
                    "type": "dns",
                    "address": "2:3:4:5::"
                }
            ],
            "networks": [
                {
                    "network_id": 1,
                    "type": "ipv6",
                    "netmask": "ffff:ffff:ffff::",
                    "link": "interface0",
                    "routes": [
                        {
                            "netmask": "::",
                            "network": "::",
                            "gateway": "fd00::1"
                        },
                        {
                            "netmask": "ffff:ffff:ffff::",
                            "network": "::",
                            "gateway": "fd00::1:1"
                        }
                    ],
                   'services': [{'address': '1:2:3:4::', 'type': 'dns'},
                                {'address': '2:3:4:5::', 'type': 'dns'}],
                    "ip_address": "fd00::2",
                    "id": "network0"
                }
            ],
            "links": [
                {
                    "ethernet_mac_address": "aa:aa:aa:aa:aa:aa",
                    "mtu": 1500,
                    "type": "phy",
                    "id": "interface0",
                    "vif_id": 1
                }
            ]
        }

        # drop the ipv4 subnet
        self.netinfo[0]['network']['subnets'].pop(0)
        network_json = netutils.get_network_metadata(self.netinfo)
        self.assertEqual(expected_json, network_json)
Ejemplo n.º 9
0
    def test_legacy_vif_types_type_passed_through(self):
        legacy_types = [
            model.VIF_TYPE_BRIDGE,
            model.VIF_TYPE_DVS,
            model.VIF_TYPE_HW_VEB,
            model.VIF_TYPE_HYPERV,
            model.VIF_TYPE_OVS,
            model.VIF_TYPE_TAP,
            model.VIF_TYPE_VHOSTUSER,
            model.VIF_TYPE_VIF,
        ]
        link_types = []
        for vif_type in legacy_types:
            network_json = netutils.get_network_metadata(
                self._new_netinfo(vif_type=vif_type))
            link_types.append(network_json["links"][0]["type"])

        self.assertEqual(legacy_types, link_types)
Ejemplo n.º 10
0
    def test_legacy_vif_types_type_passed_through(self):
        legacy_types = [
            model.VIF_TYPE_BRIDGE,
            model.VIF_TYPE_DVS,
            model.VIF_TYPE_HW_VEB,
            model.VIF_TYPE_HYPERV,
            model.VIF_TYPE_OVS,
            model.VIF_TYPE_TAP,
            model.VIF_TYPE_VHOSTUSER,
            model.VIF_TYPE_VIF,
        ]
        link_types = []
        for vif_type in legacy_types:
            network_json = netutils.get_network_metadata(
                self._new_netinfo(vif_type=vif_type))
            link_types.append(network_json["links"][0]["type"])

        self.assertEqual(legacy_types, link_types)
Ejemplo n.º 11
0
    def test_get_network_metadata_json(self):

        net_metadata = netutils.get_network_metadata(self.netinfo,
                                                     use_ipv6=True)

        # Physical Ethernet
        self.assertEqual(
            {
                'id': 'interface0',
                'type': 'phy',
                'ethernet_mac_address': 'aa:aa:aa:aa:aa:aa',
                'vif_id': 1,
                'mtu': 1500
            }, net_metadata['links'][0])

        # IPv4 Network
        self.assertEqual(
            {
                'id':
                'network0',
                'link':
                'interface0',
                'type':
                'ipv4',
                'ip_address':
                '10.10.0.2',
                'netmask':
                '255.255.255.0',
                'routes': [{
                    'network': '0.0.0.0',
                    'netmask': '0.0.0.0',
                    'gateway': '10.10.0.1'
                }, {
                    'network': '0.0.0.0',
                    'netmask': '255.255.255.0',
                    'gateway': '192.168.1.1'
                }],
                'network_id':
                1
            }, net_metadata['networks'][0])

        self.assertEqual(
            {
                'id':
                'network1',
                'link':
                'interface0',
                'type':
                'ipv6',
                'ip_address':
                'fd00::2',
                'netmask':
                'ffff:ffff:ffff::',
                'routes': [{
                    'network': '::',
                    'netmask': '::',
                    'gateway': 'fd00::1'
                }, {
                    'network': '::',
                    'netmask': 'ffff:ffff:ffff::',
                    'gateway': 'fd00::1:1'
                }],
                'network_id':
                1
            }, net_metadata['networks'][1])
Ejemplo n.º 12
0
    def test_get_network_metadata(self):
        expected_json = {
            "links": [
                {
                    "ethernet_mac_address": "aa:aa:aa:aa:aa:aa",
                    "id": "interface0",
                    "type": "phy",
                    "vif_id": 1,
                    "mtu": 1500
                },
                {
                    "ethernet_mac_address": "aa:aa:aa:aa:aa:ab",
                    "id": "interface1",
                    "type": "phy",
                    "vif_id": 1,
                    "mtu": 1500
                },
            ],
            "networks": [{
                "id":
                "network0",
                "ip_address":
                "10.10.0.2",
                "link":
                "interface0",
                "netmask":
                "255.255.255.0",
                "network_id":
                "00000000-0000-0000-0000-000000000000",
                "routes": [{
                    "gateway": "10.10.0.1",
                    "netmask": "0.0.0.0",
                    "network": "0.0.0.0"
                }, {
                    "gateway": "192.168.1.1",
                    "netmask": "255.255.255.0",
                    "network": "0.0.0.0"
                }],
                "type":
                "ipv4"
            }, {
                'id':
                'network1',
                'ip_address':
                'fd00::2',
                'link':
                'interface0',
                'netmask':
                'ffff:ffff:ffff::',
                'network_id':
                '00000000-0000-0000-0000-000000000000',
                'routes': [{
                    'gateway': 'fd00::1',
                    'netmask': '::',
                    'network': '::'
                }, {
                    'gateway': 'fd00::1:1',
                    'netmask': 'ffff:ffff:ffff::',
                    'network': '::'
                }],
                'type':
                'ipv6'
            }, {
                "id":
                "network2",
                "ip_address":
                "192.168.0.2",
                "link":
                "interface1",
                "netmask":
                "255.255.255.0",
                "network_id":
                "11111111-1111-1111-1111-111111111111",
                "routes": [{
                    "gateway": "192.168.0.1",
                    "netmask": "0.0.0.0",
                    "network": "0.0.0.0"
                }],
                "type":
                "ipv4"
            }],
            'services': [{
                'address': '1.2.3.4',
                'type': 'dns'
            }, {
                'address': '2.3.4.5',
                'type': 'dns'
            }, {
                'address': '1:2:3:4::',
                'type': 'dns'
            }, {
                'address': '2:3:4:5::',
                'type': 'dns'
            }]
        }

        self.netinfo[0]['network']['id'] = (
            '00000000-0000-0000-0000-000000000000')

        # Add a second NIC
        self.netinfo.append(
            fake_network_cache_model.new_vif({
                'type': 'ethernet',
                'address': 'aa:aa:aa:aa:aa:ab'
            }))

        address = fake_network_cache_model.new_ip({'address': '192.168.0.2'})
        gateway_address = fake_network_cache_model.new_ip(
            {'address': '192.168.0.1'})

        ipv4_subnet = fake_network_cache_model.new_subnet({
            'cidr': '192.168.0.0/24',
            'gateway': gateway_address,
            'ips': [address],
            'routes': []
        })

        self.netinfo[1]['network']['id'] = (
            '11111111-1111-1111-1111-111111111111')

        self.netinfo[1]['network']['subnets'][0] = ipv4_subnet
        self.netinfo[1]['network']['meta']['mtu'] = 1500

        network_json = netutils.get_network_metadata(self.netinfo)
        self.assertEqual(expected_json, network_json)
Ejemplo n.º 13
0
    def test_get_network_metadata_json(self):

        net_metadata = netutils.get_network_metadata(self.netinfo,
                                                     use_ipv6=True)

        # Physical Ethernet
        self.assertEqual(
            {
                'id': 'interface0',
                'type': 'phy',
                'ethernet_mac_address': 'aa:aa:aa:aa:aa:aa',
                'vif_id': 1,
                'mtu': 1500
            },
            net_metadata['links'][0])

        # IPv4 Network
        self.assertEqual(
            {
                'id': 'network0',
                'link': 'interface0',
                'type': 'ipv4',
                'ip_address': '10.10.0.2',
                'netmask': '255.255.255.0',
                'routes': [
                    {
                        'network': '0.0.0.0',
                        'netmask': '0.0.0.0',
                        'gateway': '10.10.0.1'
                    },
                    {
                        'network': '0.0.0.0',
                        'netmask': '255.255.255.0',
                        'gateway': '192.168.1.1'
                    }
                ],
                'network_id': 1
            },
            net_metadata['networks'][0])

        self.assertEqual(
            {
                'id': 'network1',
                'link': 'interface0',
                'type': 'ipv6',
                'ip_address': 'fd00::2',
                'netmask': 'ffff:ffff:ffff::',
                'routes': [
                    {
                        'network': '::',
                        'netmask': '::',
                        'gateway': 'fd00::1'
                    },
                    {
                        'network': '::',
                        'netmask': 'ffff:ffff:ffff::',
                        'gateway': 'fd00::1:1'
                    }
                ],
                'network_id': 1
            },
            net_metadata['networks'][1])
Ejemplo n.º 14
0
    def test_get_network_metadata(self):
        expected_json = {
            "links": [
                {
                    "ethernet_mac_address": "aa:aa:aa:aa:aa:aa",
                    "id": "interface0",
                    "type": "phy",
                    "vif_id": 1,
                    "mtu": 1500
                },
                {
                    "ethernet_mac_address": "aa:aa:aa:aa:aa:ab",
                    "id": "interface1",
                    "type": "phy",
                    "vif_id": 1,
                    "mtu": 1500
                },
            ],
            "networks": [
                {
                    "id": "network0",
                    "ip_address": "10.10.0.2",
                    "link": "interface0",
                    "netmask": "255.255.255.0",
                    "network_id":
                        "00000000-0000-0000-0000-000000000000",
                    "routes": [
                        {
                            "gateway": "10.10.0.1",
                            "netmask": "0.0.0.0",
                            "network": "0.0.0.0"
                        },
                        {
                            "gateway": "192.168.1.1",
                            "netmask": "255.255.255.0",
                            "network": "0.0.0.0"
                        }
                    ],
                    "type": "ipv4"
                },
                {
                   'id': 'network1',
                   'ip_address': 'fd00::2',
                   'link': 'interface0',
                   'netmask': 'ffff:ffff:ffff::',
                   'network_id': '00000000-0000-0000-0000-000000000000',
                   'routes': [{'gateway': 'fd00::1',
                               'netmask': '::',
                               'network': '::'},
                              {'gateway': 'fd00::1:1',
                               'netmask': 'ffff:ffff:ffff::',
                               'network': '::'}],
                   'type': 'ipv6'
                },
                {
                    "id": "network2",
                    "ip_address": "192.168.0.2",
                    "link": "interface1",
                    "netmask": "255.255.255.0",
                    "network_id":
                        "11111111-1111-1111-1111-111111111111",
                    "routes": [
                        {
                            "gateway": "192.168.0.1",
                            "netmask": "0.0.0.0",
                            "network": "0.0.0.0"
                        }
                    ],
                    "type": "ipv4"
                }
            ],
            'services': [
                {'address': '1.2.3.4', 'type': 'dns'},
                {'address': '2.3.4.5', 'type': 'dns'},
                {'address': '1:2:3:4::', 'type': 'dns'},
                {'address': '2:3:4:5::', 'type': 'dns'}
            ]
        }

        self.netinfo[0]['network']['id'] = (
            '00000000-0000-0000-0000-000000000000')

        # Add a second NIC
        self.netinfo.append(fake_network_cache_model.new_vif({
            'type': 'ethernet', 'address': 'aa:aa:aa:aa:aa:ab'}))

        address = fake_network_cache_model.new_ip({'address': '192.168.0.2'})
        gateway_address = fake_network_cache_model.new_ip(
            {'address': '192.168.0.1'})

        ipv4_subnet = fake_network_cache_model.new_subnet(
            {'cidr': '192.168.0.0/24', 'gateway': gateway_address,
             'ips': [address], 'routes': []})

        self.netinfo[1]['network']['id'] = (
            '11111111-1111-1111-1111-111111111111')

        self.netinfo[1]['network']['subnets'][0] = ipv4_subnet
        self.netinfo[1]['network']['mtu'] = 1500

        network_json = netutils.get_network_metadata(self.netinfo)
        self.assertEqual(expected_json, network_json)
Ejemplo n.º 15
0
    def _generate_configdrive(self, instance, node, network_info,
                              extra_md=None, files=None):
        if not extra_md:
            extra_md = {}

        client = neutron.get_client(None, admin=True)

        # Get vlan to port map
        net_vlan_map = {}
        port_vlan_map = {}
        for vif in network_info:
            if vif['network']['id'] not in net_vlan_map:
                network = client.show_network(vif['network']['id'])
                net_vlan_map[vif['network']['id']] = (
                    network['network']['provider:segmentation_id'])
            port_vlan_map[vif['id']] = net_vlan_map[vif['network']['id']]

        network_metadata = netutils.get_network_metadata(network_info)

        ports = self.ironicclient.call("node.list_ports",
                                       node.uuid, detail=True)
        portgroups = self.ironicclient.call("node.list_portgroups", node.uuid)
        all_ports = ports + portgroups

        for link in network_metadata['links']:
            link['type'] = 'vlan'
            link['vlan_mac_address'] = link['ethernet_mac_address']
            link['neutron_port_id'] = link['vif_id']
            link['vlan_id'] = port_vlan_map[link['vif_id']]
            link['vlan_link'] = self._get_port_for_vif(
                all_ports, link['vif_id']).uuid
            del link['ethernet_mac_address']
            del link['vif_id']

        for port in ports:
            if port.extra.get('vif_port_ids', []):
                link = {'id': port.uuid, 'type': 'phy', 'mtu': 9000,
                        'ethernet_mac_address': port.address}
                network_metadata['links'].append(link)

        for pg in portgroups:
            ps = [port for port in ports if port.portgroup_id is pg.id]
            link = {'id': pg.uuid, 'type': 'bond',
                    'ethernet_mac_address': ports[0].address,
                    'bond_mode': '802.1ad',
                    'bond_xmit_hash_policy': 'layer3+4',
                    'bond_miimon': 100, 'bond_links': []}
            for port in ps:
                link['bond_links'].append(port.uuid)

        files.append(('ironicnetworking', 'yes'.encode()))

        i_meta = instance_metadata.InstanceMetadata(
            instance, content=files, extra_md=extra_md,
            network_metadata=network_metadata)

        with tempfile.NamedTemporaryFile() as uncompressed:
            try:
                with configdrive.ConfigDriveBuilder(instance_md=i_meta) as cdb:
                    cdb.make_drive(uncompressed.name)
            except Exception as e:
                with excutils.save_and_reraise_exception():
                    LOG.error(_LE("Creating config drive failed with "
                                  "error: %s"), e, instance=instance)

            with tempfile.NamedTemporaryFile() as compressed:
                # compress config drive
                with gzip.GzipFile(fileobj=compressed, mode='wb') as gzipped:
                    uncompressed.seek(0)
                    shutil.copyfileobj(uncompressed, gzipped)

                # base64 encode config drive
                compressed.seek(0)
                return base64.b64encode(compressed.read())
Ejemplo n.º 16
0
    def __init__(self, instance, address=None, content=None, extra_md=None,
                 network_info=None, vd_driver=None, network_metadata=None,
                 request_context=None):
        """Creation of this object should basically cover all time consuming
        collection.  Methods after that should not cause time delays due to
        network operations or lengthy cpu operations.

        The user should then get a single instance and make multiple method
        calls on it.
        """
        if not content:
            content = []

        ctxt = context.get_admin_context()

        # The default value of mimeType is set to MIME_TYPE_TEXT_PLAIN
        self.set_mimetype(MIME_TYPE_TEXT_PLAIN)
        self.instance = instance
        self.extra_md = extra_md

        self.availability_zone = az.get_instance_availability_zone(ctxt,
                                                                   instance)

        secgroup_api = openstack_driver.get_openstack_security_group_driver()
        self.security_groups = secgroup_api.get_instance_security_groups(
            ctxt, instance)

        self.mappings = _format_instance_mapping(ctxt, instance)

        if instance.user_data is not None:
            self.userdata_raw = base64.b64decode(instance.user_data)
        else:
            self.userdata_raw = None

        self.address = address

        # expose instance metadata.
        self.launch_metadata = utils.instance_meta(instance)

        self.password = password.extract_password(instance)

        self.uuid = instance.uuid

        self.content = {}
        self.files = []

        # get network info, and the rendered network template
        if network_info is None:
            network_info = instance.info_cache.network_info

        # expose network metadata
        if network_metadata is None:
            self.network_metadata = netutils.get_network_metadata(network_info)
        else:
            self.network_metadata = network_metadata

        self.ip_info = \
                ec2utils.get_ip_info_for_instance_from_nw_info(network_info)

        self.network_config = None
        cfg = netutils.get_injected_network_template(network_info)

        if cfg:
            key = "%04i" % len(self.content)
            self.content[key] = cfg
            self.network_config = {"name": "network_config",
                'content_path': "/%s/%s" % (CONTENT_DIR, key)}

        # 'content' is passed in from the configdrive code in
        # nova/virt/libvirt/driver.py.  That's how we get the injected files
        # (personalities) in. AFAIK they're not stored in the db at all,
        # so are not available later (web service metadata time).
        for (path, contents) in content:
            key = "%04i" % len(self.content)
            self.files.append({'path': path,
                'content_path': "/%s/%s" % (CONTENT_DIR, key)})
            self.content[key] = contents

        if vd_driver is None:
            vdclass = importutils.import_class(CONF.vendordata_driver)
        else:
            vdclass = vd_driver

        self.vddriver = vdclass(instance=instance, address=address,
                                extra_md=extra_md, network_info=network_info)

        self.route_configuration = None

        # NOTE(mikal): the decision to not pass extra_md here like we
        # do to the StaticJSON driver is deliberate. extra_md will
        # contain the admin password for the instance, and we shouldn't
        # pass that to external services.
        self.vendordata_providers = {
            'StaticJSON': vendordata_json.JsonFileVendorData(
                instance=instance, address=address,
                extra_md=extra_md, network_info=network_info),
            'DynamicJSON': vendordata_dynamic.DynamicVendorData(
                instance=instance, address=address,
                network_info=network_info, context=request_context)
        }
Ejemplo n.º 17
0
    def __init__(self,
                 instance,
                 address=None,
                 content=None,
                 extra_md=None,
                 network_info=None,
                 network_metadata=None,
                 request_context=None):
        """Creation of this object should basically cover all time consuming
        collection.  Methods after that should not cause time delays due to
        network operations or lengthy cpu operations.

        The user should then get a single instance and make multiple method
        calls on it.
        """
        if not content:
            content = []

        ctxt = context.get_admin_context()

        # NOTE(danms): Sanitize the instance to limit the amount of stuff
        # inside that may not pickle well (i.e. context). We also touch
        # some of the things we'll lazy load later to make sure we keep their
        # values in what we cache.
        instance.ec2_ids
        instance.keypairs
        instance.device_metadata
        instance.numa_topology
        instance = objects.Instance.obj_from_primitive(
            instance.obj_to_primitive())

        # The default value of mimeType is set to MIME_TYPE_TEXT_PLAIN
        self.set_mimetype(MIME_TYPE_TEXT_PLAIN)
        self.instance = instance
        self.extra_md = extra_md

        self.availability_zone = instance.get('availability_zone')

        self.security_groups = security_group_api.get_instance_security_groups(
            ctxt, instance)

        self.mappings = _format_instance_mapping(ctxt, instance)

        if instance.user_data is not None:
            self.userdata_raw = base64.decode_as_bytes(instance.user_data)
        else:
            self.userdata_raw = None

        self.address = address

        # expose instance metadata.
        self.launch_metadata = utils.instance_meta(instance)

        self.password = password.extract_password(instance)

        self.uuid = instance.uuid

        self.content = {}
        self.files = []

        # get network info, and the rendered network template
        if network_info is None:
            network_info = instance.info_cache.network_info

        # expose network metadata
        if network_metadata is None:
            self.network_metadata = netutils.get_network_metadata(network_info)
        else:
            self.network_metadata = network_metadata

        self.ip_info = netutils.get_ec2_ip_info(network_info)

        self.network_config = None
        cfg = netutils.get_injected_network_template(network_info)

        if cfg:
            key = "%04i" % len(self.content)
            self.content[key] = cfg
            self.network_config = {
                "name": "network_config",
                'content_path': "/%s/%s" % (CONTENT_DIR, key)
            }

        # 'content' is passed in from the configdrive code in
        # nova/virt/libvirt/driver.py.  That's how we get the injected files
        # (personalities) in. AFAIK they're not stored in the db at all,
        # so are not available later (web service metadata time).
        for (path, contents) in content:
            key = "%04i" % len(self.content)
            self.files.append({
                'path': path,
                'content_path': "/%s/%s" % (CONTENT_DIR, key)
            })
            self.content[key] = contents

        self.route_configuration = None

        # NOTE(mikal): the decision to not pass extra_md here like we
        # do to the StaticJSON driver is deliberate. extra_md will
        # contain the admin password for the instance, and we shouldn't
        # pass that to external services.
        self.vendordata_providers = {
            'StaticJSON':
            vendordata_json.JsonFileVendorData(instance=instance,
                                               address=address,
                                               extra_md=extra_md,
                                               network_info=network_info),
            'DynamicJSON':
            vendordata_dynamic.DynamicVendorData(instance=instance,
                                                 address=address,
                                                 network_info=network_info,
                                                 context=request_context)
        }