def __init__(self, instance, address=None): self.instance = instance ctxt = context.get_admin_context() services = db.service_get_all_by_host(ctxt.elevated(), instance["host"]) self.availability_zone = ec2utils.get_availability_zone_by_host(services, instance["host"]) self.ip_info = ec2utils.get_ip_info_for_instance(ctxt, instance) self.security_groups = db.security_group_get_by_instance(ctxt, instance["id"]) self.mappings = _format_instance_mapping(ctxt, instance) if instance.get("user_data", None) is not None: self.userdata_b64 = base64.b64decode(instance["user_data"]) else: self.userdata_b64 = None self.ec2_ids = {} self.ec2_ids["instance-id"] = ec2utils.id_to_ec2_inst_id(instance["id"]) self.ec2_ids["ami-id"] = ec2utils.glance_id_to_ec2_id(ctxt, instance["image_ref"]) for image_type in ["kernel", "ramdisk"]: if self.instance.get("%s_id" % image_type): image_id = self.instance["%s_id" % image_type] ec2_image_type = ec2utils.image_type(image_type) ec2_id = ec2utils.glance_id_to_ec2_id(ctxt, image_id, ec2_image_type) self.ec2_ids["%s-id" % image_type] = ec2_id self.address = address
def __init__(self, instance, address=None): self.instance = instance ctxt = context.get_admin_context() services = db.service_get_all_by_host(ctxt.elevated(), instance['host']) self.availability_zone = ec2utils.get_availability_zone_by_host( services, instance['host']) self.ip_info = ec2utils.get_ip_info_for_instance(ctxt, instance) self.security_groups = db.security_group_get_by_instance( ctxt, instance['id']) self.mappings = _format_instance_mapping(ctxt, instance) if instance.get('user_data', None) is not None: self.userdata_b64 = base64.b64decode(instance['user_data']) else: self.userdata_b64 = None self.ec2_ids = {} self.ec2_ids['instance-id'] = ec2utils.id_to_ec2_inst_id( instance['id']) self.ec2_ids['ami-id'] = ec2utils.glance_id_to_ec2_id( ctxt, instance['image_ref']) for image_type in ['kernel', 'ramdisk']: if self.instance.get('%s_id' % image_type): image_id = self.instance['%s_id' % image_type] ec2_image_type = ec2utils.image_type(image_type) ec2_id = ec2utils.glance_id_to_ec2_id(ctxt, image_id, ec2_image_type) self.ec2_ids['%s-id' % image_type] = ec2_id self.address = address
def __init__(self, instance, address=None): self.instance = instance ctxt = context.get_admin_context() services = db.service_get_all_by_host(ctxt.elevated(), instance['host']) self.availability_zone = ec2utils.get_availability_zone_by_host( services, instance['host']) self.ip_info = ec2utils.get_ip_info_for_instance(ctxt, instance) self.security_groups = db.security_group_get_by_instance(ctxt, instance['id']) self.mappings = _format_instance_mapping(ctxt, instance) if instance.get('user_data', None) is not None: self.userdata_b64 = base64.b64decode(instance['user_data']) else: self.userdata_b64 = None self.ec2_ids = {} self.ec2_ids['instance-id'] = ec2utils.id_to_ec2_id(instance['id']) self.ec2_ids['ami-id'] = ec2utils.glance_id_to_ec2_id(ctxt, instance['image_ref']) for image_type in ['kernel', 'ramdisk']: if self.instance.get('%s_id' % image_type): image_id = self.instance['%s_id' % image_type] image_type = ec2utils.image_type(image_type) ec2_id = ec2utils.glance_id_to_ec2_id(ctxt, image_id, image_type) self.ec2_ids['%s-id' % image_type] = ec2_id self.address = address
def __init__( self, instance, address=None, content=None, extra_md=None, conductor_api=None, network_info=None, vd_driver=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): This should be removed after bp:compute-manager-objects if not isinstance(instance, obj_base.NovaObject): expected = ["metadata", "system_metadata"] if "info_cache" in instance: expected.append("info_cache") instance = objects.Instance._from_db_object(ctxt, objects.Instance(), instance, expected_attrs=expected) # 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 if conductor_api: capi = conductor_api else: capi = conductor.API() self.availability_zone = ec2utils.get_availability_zone_by_host(instance["host"], capi) self.security_groups = objects.SecurityGroupList.get_by_instance(ctxt, instance) self.mappings = _format_instance_mapping(ctxt, instance) if instance.get("user_data", None) is not None: self.userdata_raw = base64.b64decode(instance["user_data"]) else: self.userdata_raw = None self.ec2_ids = capi.get_ec2_ids(ctxt, obj_base.obj_to_primitive(instance)) self.address = address # expose instance metadata. self.launch_metadata = utils.instance_meta(instance) self.password = password.extract_password(instance) self.uuid = instance.get("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 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
def __init__(self, instance, address=None, content=[], extra_md=None, conductor_api=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. """ self.instance = instance self.extra_md = extra_md if conductor_api: capi = conductor_api else: capi = conductor.API() ctxt = context.get_admin_context() self.availability_zone = ec2utils.get_availability_zone_by_host( instance['host'], capi) self.ip_info = ec2utils.get_ip_info_for_instance(ctxt, instance) self.security_groups = capi.security_group_get_by_instance(ctxt, instance) self.mappings = _format_instance_mapping(capi, ctxt, instance) if instance.get('user_data', None) is not None: self.userdata_raw = base64.b64decode(instance['user_data']) else: self.userdata_raw = None self.ec2_ids = capi.get_ec2_ids(ctxt, instance) self.address = address # expose instance metadata. self.launch_metadata = {} for item in instance.get('metadata', []): self.launch_metadata[item['key']] = item['value'] self.password = password.extract_password(instance) self.uuid = instance.get('uuid') self.content = {} self.files = [] # get network info, and the rendered network template ctxt = context.get_admin_context() network_info = network.API().get_instance_nw_info(ctxt, instance, conductor_api=capi) 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. Thats 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
def get_metadata(self, address): ctxt = context.get_admin_context() search_opts = {"fixed_ip": address, "deleted": False} try: instance_ref = self.compute_api.get_all(ctxt, search_opts=search_opts) except exception.NotFound: instance_ref = None if not instance_ref: return None # This ensures that all attributes of the instance # are populated. instance_ref = db.instance_get(ctxt, instance_ref[0]["id"]) mpi = self._get_mpi_data(ctxt, instance_ref["project_id"]) hostname = "%s.%s" % (instance_ref["hostname"], FLAGS.dhcp_domain) host = instance_ref["host"] services = db.service_get_all_by_host(ctxt.elevated(), host) availability_zone = ec2utils.get_availability_zone_by_host(services, host) ip_info = ec2utils.get_ip_info_for_instance(ctxt, instance_ref) floating_ips = ip_info["floating_ips"] floating_ip = floating_ips and floating_ips[0] or "" ec2_id = ec2utils.id_to_ec2_id(instance_ref["id"]) image_ec2_id = ec2utils.image_ec2_id(instance_ref["image_ref"]) security_groups = db.security_group_get_by_instance(ctxt, instance_ref["id"]) security_groups = [x["name"] for x in security_groups] mappings = self._format_instance_mapping(ctxt, instance_ref) data = { "user-data": base64.b64decode(instance_ref["user_data"]), "meta-data": { "ami-id": image_ec2_id, "ami-launch-index": instance_ref["launch_index"], "ami-manifest-path": "FIXME", "block-device-mapping": mappings, "hostname": hostname, "instance-action": "none", "instance-id": ec2_id, "instance-type": instance_ref["instance_type"]["name"], "local-hostname": hostname, "local-ipv4": address, "placement": {"availability-zone": availability_zone}, "public-hostname": hostname, "public-ipv4": floating_ip, "reservation-id": instance_ref["reservation_id"], "security-groups": security_groups, "mpi": mpi, }, } # public-keys should be in meta-data only if user specified one if instance_ref["key_name"]: data["meta-data"]["public-keys"] = { "0": {"_name": instance_ref["key_name"], "openssh-key": instance_ref["key_data"]} } for image_type in ["kernel", "ramdisk"]: if instance_ref.get("%s_id" % image_type): ec2_id = ec2utils.image_ec2_id(instance_ref["%s_id" % image_type], ec2utils.image_type(image_type)) data["meta-data"]["%s-id" % image_type] = ec2_id if False: # TODO(vish): store ancestor ids data["ancestor-ami-ids"] = [] if False: # TODO(vish): store product codes data["product-codes"] = [] return data
def get_metadata(self, address): ctxt = context.get_admin_context() search_opts = {'fixed_ip': address, 'deleted': False} try: instance_ref = self.compute_api.get_all(ctxt, search_opts=search_opts) except exception.NotFound: instance_ref = None if not instance_ref: return None # This ensures that all attributes of the instance # are populated. instance_ref = db.instance_get(ctxt, instance_ref[0]['id']) mpi = self._get_mpi_data(ctxt, instance_ref['project_id']) hostname = "%s.%s" % (instance_ref['hostname'], FLAGS.dhcp_domain) host = instance_ref['host'] services = db.service_get_all_by_host(ctxt.elevated(), host) availability_zone = ec2utils.get_availability_zone_by_host( services, host) ip_info = ec2utils.get_ip_info_for_instance(ctxt, instance_ref) floating_ips = ip_info['floating_ips'] floating_ip = floating_ips and floating_ips[0] or '' ec2_id = ec2utils.id_to_ec2_id(instance_ref['id']) image_ec2_id = ec2utils.image_ec2_id(instance_ref['image_ref']) security_groups = db.security_group_get_by_instance( ctxt, instance_ref['id']) security_groups = [x['name'] for x in security_groups] mappings = self._format_instance_mapping(ctxt, instance_ref) data = { 'user-data': base64.b64decode(instance_ref['user_data']), 'meta-data': { 'ami-id': image_ec2_id, 'ami-launch-index': instance_ref['launch_index'], 'ami-manifest-path': 'FIXME', 'block-device-mapping': mappings, 'hostname': hostname, 'instance-action': 'none', 'instance-id': ec2_id, 'instance-type': instance_ref['instance_type']['name'], 'local-hostname': hostname, 'local-ipv4': address, 'placement': { 'availability-zone': availability_zone }, 'public-hostname': hostname, 'public-ipv4': floating_ip, 'reservation-id': instance_ref['reservation_id'], 'security-groups': security_groups, 'mpi': mpi } } # public-keys should be in meta-data only if user specified one if instance_ref['key_name']: data['meta-data']['public-keys'] = { '0': { '_name': instance_ref['key_name'], 'openssh-key': instance_ref['key_data'] } } for image_type in ['kernel', 'ramdisk']: if instance_ref.get('%s_id' % image_type): ec2_id = ec2utils.image_ec2_id( instance_ref['%s_id' % image_type], ec2utils.image_type(image_type)) data['meta-data']['%s-id' % image_type] = ec2_id if False: # TODO(vish): store ancestor ids data['ancestor-ami-ids'] = [] if False: # TODO(vish): store product codes data['product-codes'] = [] return data
def __init__(self, instance, address=None, content=[], extra_md=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. """ self.instance = instance self.extra_md = extra_md ctxt = context.get_admin_context() services = db.service_get_all_by_host(ctxt.elevated(), instance['host']) self.availability_zone = ec2utils.get_availability_zone_by_host( services, instance['host']) self.ip_info = ec2utils.get_ip_info_for_instance(ctxt, instance) self.security_groups = db.security_group_get_by_instance(ctxt, instance['id']) self.mappings = _format_instance_mapping(ctxt, instance) if instance.get('user_data', None) is not None: self.userdata_raw = base64.b64decode(instance['user_data']) else: self.userdata_raw = None self.ec2_ids = {} self.ec2_ids['instance-id'] = ec2utils.id_to_ec2_inst_id( instance['id']) self.ec2_ids['ami-id'] = ec2utils.glance_id_to_ec2_id(ctxt, instance['image_ref']) for image_type in ['kernel', 'ramdisk']: if self.instance.get('%s_id' % image_type): image_id = self.instance['%s_id' % image_type] ec2_image_type = ec2utils.image_type(image_type) ec2_id = ec2utils.glance_id_to_ec2_id(ctxt, image_id, ec2_image_type) self.ec2_ids['%s-id' % image_type] = ec2_id self.address = address # expose instance metadata. self.launch_metadata = {} for item in instance.get('metadata', []): self.launch_metadata[item['key']] = item['value'] self.uuid = instance.get('uuid') self.content = {} self.files = [] # get network info, and the rendered network template ctxt = context.get_admin_context() network_info = network.API().get_instance_nw_info(ctxt, instance) 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. Thats 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
def get_metadata(self, address): ctxt = context.get_admin_context() search_opts = {'fixed_ip': address, 'deleted': False} try: instance_ref = self.compute_api.get_all(ctxt, search_opts=search_opts) except exception.NotFound: instance_ref = None if not instance_ref: return None # This ensures that all attributes of the instance # are populated. instance_ref = db.instance_get(ctxt, instance_ref[0]['id']) mpi = self._get_mpi_data(ctxt, instance_ref['project_id']) hostname = "%s.%s" % (instance_ref['hostname'], FLAGS.dhcp_domain) host = instance_ref['host'] services = db.service_get_all_by_host(ctxt.elevated(), host) availability_zone = ec2utils.get_availability_zone_by_host(services, host) ip_info = ec2utils.get_ip_info_for_instance(ctxt, instance_ref) floating_ips = ip_info['floating_ips'] floating_ip = floating_ips and floating_ips[0] or '' ec2_id = ec2utils.id_to_ec2_id(instance_ref['id']) image_ec2_id = ec2utils.image_ec2_id(instance_ref['image_ref']) security_groups = db.security_group_get_by_instance(ctxt, instance_ref['id']) security_groups = [x['name'] for x in security_groups] mappings = self._format_instance_mapping(ctxt, instance_ref) data = { 'user-data': base64.b64decode(instance_ref['user_data']), 'meta-data': { 'ami-id': image_ec2_id, 'ami-launch-index': instance_ref['launch_index'], 'ami-manifest-path': 'FIXME', 'block-device-mapping': mappings, 'hostname': hostname, 'instance-action': 'none', 'instance-id': ec2_id, 'instance-type': instance_ref['instance_type']['name'], 'local-hostname': hostname, 'local-ipv4': address, 'placement': {'availability-zone': availability_zone}, 'public-hostname': hostname, 'public-ipv4': floating_ip, 'reservation-id': instance_ref['reservation_id'], 'security-groups': security_groups, 'mpi': mpi}} # public-keys should be in meta-data only if user specified one if instance_ref['key_name']: data['meta-data']['public-keys'] = { '0': {'_name': instance_ref['key_name'], 'openssh-key': instance_ref['key_data']}} for image_type in ['kernel', 'ramdisk']: if instance_ref.get('%s_id' % image_type): ec2_id = ec2utils.image_ec2_id( instance_ref['%s_id' % image_type], ec2utils.image_type(image_type)) data['meta-data']['%s-id' % image_type] = ec2_id if False: # TODO(vish): store ancestor ids data['ancestor-ami-ids'] = [] if False: # TODO(vish): store product codes data['product-codes'] = [] return data
def __init__(self, instance, address=None, content=None, extra_md=None, conductor_api=None, network_info=None, vd_driver=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): This should be removed after bp:compute-manager-objects if not isinstance(instance, instance_obj.Instance): instance = instance_obj.Instance._from_db_object( ctxt, instance_obj.Instance(), instance, expected_attrs=['metadata', 'system_metadata']) self.instance = instance self.extra_md = extra_md if conductor_api: capi = conductor_api else: capi = conductor.API() self.availability_zone = ec2utils.get_availability_zone_by_host( instance['host'], capi) self.security_groups = secgroup_obj.SecurityGroupList.get_by_instance( ctxt, instance) self.mappings = _format_instance_mapping(capi, ctxt, instance) if instance.get('user_data', None) is not None: self.userdata_raw = base64.b64decode(instance['user_data']) else: self.userdata_raw = None self.ec2_ids = capi.get_ec2_ids(ctxt, obj_base.obj_to_primitive(instance)) self.address = address # expose instance metadata. self.launch_metadata = utils.instance_meta(instance) self.password = password.extract_password(instance) self.uuid = instance.get('uuid') self.content = {} self.files = [] # get network info, and the rendered network template if network_info is None: network_info = network.API().get_instance_nw_info(ctxt, instance) 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. Thats 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)
def get_metadata(self, address): if not address: raise exception.FixedIpNotFoundForAddress(address=address) cache_key = 'metadata-%s' % address data = self._cache.get(cache_key) if data: return data ctxt = context.get_admin_context() try: fixed_ip = self.network_api.get_fixed_ip_by_address(ctxt, address) instance_ref = db.instance_get(ctxt, fixed_ip['instance_id']) except exception.NotFound: return None hostname = "%s.%s" % (instance_ref['hostname'], FLAGS.dhcp_domain) host = instance_ref['host'] services = db.service_get_all_by_host(ctxt.elevated(), host) availability_zone = ec2utils.get_availability_zone_by_host(services, host) ip_info = ec2utils.get_ip_info_for_instance(ctxt, instance_ref) floating_ips = ip_info['floating_ips'] floating_ip = floating_ips and floating_ips[0] or '' ec2_id = ec2utils.id_to_ec2_id(instance_ref['id']) image_id = instance_ref['image_ref'] ctxt = context.get_admin_context() image_ec2_id = ec2utils.glance_id_to_ec2_id(ctxt, image_id) security_groups = db.security_group_get_by_instance(ctxt, instance_ref['id']) security_groups = [x['name'] for x in security_groups] mappings = self._format_instance_mapping(ctxt, instance_ref) data = { 'user-data': base64.b64decode(instance_ref['user_data']), 'meta-data': { 'ami-id': image_ec2_id, 'ami-launch-index': instance_ref['launch_index'], 'ami-manifest-path': 'FIXME', 'block-device-mapping': mappings, 'hostname': hostname, 'instance-action': 'none', 'instance-id': ec2_id, 'instance-type': instance_ref['instance_type']['name'], 'local-hostname': hostname, 'local-ipv4': address, 'placement': {'availability-zone': availability_zone}, 'public-hostname': hostname, 'public-ipv4': floating_ip, 'reservation-id': instance_ref['reservation_id'], 'security-groups': security_groups}} # public-keys should be in meta-data only if user specified one if instance_ref['key_name']: data['meta-data']['public-keys'] = { '0': {'_name': instance_ref['key_name'], 'openssh-key': instance_ref['key_data']}} for image_type in ['kernel', 'ramdisk']: if instance_ref.get('%s_id' % image_type): image_id = instance_ref['%s_id' % image_type] image_type = ec2utils.image_type(image_type) ec2_id = ec2utils.glance_id_to_ec2_id(ctxt, image_id, image_type) data['meta-data']['%s-id' % image_type] = ec2_id if False: # TODO(vish): store ancestor ids data['ancestor-ami-ids'] = [] if False: # TODO(vish): store product codes data['product-codes'] = [] self._cache.set(cache_key, data, 15) return data
def get_metadata(self, address): if not address: raise exception.FixedIpNotFoundForAddress(address=address) cache_key = 'metadata-%s' % address data = self._cache.get(cache_key) if data: return data ctxt = context.get_admin_context() try: fixed_ip = self.network_api.get_fixed_ip_by_address(ctxt, address) instance_ref = db.instance_get(ctxt, fixed_ip['instance_id']) except exception.NotFound: return None hostname = "%s.%s" % (instance_ref['hostname'], FLAGS.dhcp_domain) host = instance_ref['host'] services = db.service_get_all_by_host(ctxt.elevated(), host) availability_zone = ec2utils.get_availability_zone_by_host( services, host) ip_info = ec2utils.get_ip_info_for_instance(ctxt, instance_ref) floating_ips = ip_info['floating_ips'] floating_ip = floating_ips and floating_ips[0] or '' ec2_id = ec2utils.id_to_ec2_id(instance_ref['id']) image_id = instance_ref['image_ref'] ctxt = context.get_admin_context() image_ec2_id = ec2utils.glance_id_to_ec2_id(ctxt, image_id) security_groups = db.security_group_get_by_instance( ctxt, instance_ref['id']) security_groups = [x['name'] for x in security_groups] mappings = self._format_instance_mapping(ctxt, instance_ref) data = { 'user-data': base64.b64decode(instance_ref['user_data']), 'meta-data': { 'ami-id': image_ec2_id, 'ami-launch-index': instance_ref['launch_index'], 'ami-manifest-path': 'FIXME', 'block-device-mapping': mappings, 'hostname': hostname, 'instance-action': 'none', 'instance-id': ec2_id, 'instance-type': instance_ref['instance_type']['name'], 'local-hostname': hostname, 'local-ipv4': address, 'placement': { 'availability-zone': availability_zone }, 'public-hostname': hostname, 'public-ipv4': floating_ip, 'reservation-id': instance_ref['reservation_id'], 'security-groups': security_groups } } # public-keys should be in meta-data only if user specified one if instance_ref['key_name']: data['meta-data']['public-keys'] = { '0': { '_name': instance_ref['key_name'], 'openssh-key': instance_ref['key_data'] } } for image_type in ['kernel', 'ramdisk']: if instance_ref.get('%s_id' % image_type): image_id = instance_ref['%s_id' % image_type] image_type = ec2utils.image_type(image_type) ec2_id = ec2utils.glance_id_to_ec2_id(ctxt, image_id, image_type) data['meta-data']['%s-id' % image_type] = ec2_id if False: # TODO(vish): store ancestor ids data['ancestor-ami-ids'] = [] if False: # TODO(vish): store product codes data['product-codes'] = [] self._cache.set(cache_key, data, 15) return data
def __init__(self, instance, address=None, content=None, extra_md=None, conductor_api=None, network_info=None, vd_driver=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): This should be removed after bp:compute-manager-objects if not isinstance(instance, instance_obj.Instance): instance = instance_obj.Instance._from_db_object( ctxt, instance_obj.Instance(), instance, expected_attrs=['metadata', 'system_metadata']) self.instance = instance self.extra_md = extra_md if conductor_api: capi = conductor_api else: capi = conductor.API() self.availability_zone = ec2utils.get_availability_zone_by_host( instance['host'], capi) self.security_groups = secgroup_obj.SecurityGroupList.get_by_instance( ctxt, instance) self.mappings = _format_instance_mapping(ctxt, instance) if instance.get('user_data', None) is not None: self.userdata_raw = base64.b64decode(instance['user_data']) else: self.userdata_raw = None self.ec2_ids = capi.get_ec2_ids(ctxt, obj_base.obj_to_primitive(instance)) self.address = address # expose instance metadata. self.launch_metadata = utils.instance_meta(instance) self.password = password.extract_password(instance) self.uuid = instance.get('uuid') self.content = {} self.files = [] # get network info, and the rendered network template if network_info is None: network_info = network.API().get_instance_nw_info(ctxt, instance) 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. Thats 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 # IBM-ONLY start # For config strategy, we initialize ibm_configuration_data_files with # the files to put in the root of the config disk. self.ibm_configuration_data_files = [] config_data = instance.system_metadata.get('configuration_data') if config_data: config_data = json.loads(config_data) files = config_data['present_disk'].get('files', {}) self.ibm_configuration_data_files = files.items()
def __init__(self, instance, address=None, content=[], extra_md=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. """ self.instance = instance self.extra_md = extra_md ctxt = context.get_admin_context() services = db.service_get_all_by_host(ctxt.elevated(), instance["host"]) self.availability_zone = ec2utils.get_availability_zone_by_host(services, instance["host"]) self.ip_info = ec2utils.get_ip_info_for_instance(ctxt, instance) self.security_groups = db.security_group_get_by_instance(ctxt, instance["id"]) self.mappings = _format_instance_mapping(ctxt, instance) if instance.get("user_data", None) is not None: self.userdata_raw = base64.b64decode(instance["user_data"]) else: self.userdata_raw = None self.ec2_ids = {} self.ec2_ids["instance-id"] = ec2utils.id_to_ec2_inst_id(instance["uuid"]) self.ec2_ids["ami-id"] = ec2utils.glance_id_to_ec2_id(ctxt, instance["image_ref"]) for image_type in ["kernel", "ramdisk"]: if self.instance.get("%s_id" % image_type): image_id = self.instance["%s_id" % image_type] ec2_image_type = ec2utils.image_type(image_type) ec2_id = ec2utils.glance_id_to_ec2_id(ctxt, image_id, ec2_image_type) self.ec2_ids["%s-id" % image_type] = ec2_id self.address = address # expose instance metadata. self.launch_metadata = {} for item in instance.get("metadata", []): self.launch_metadata[item["key"]] = item["value"] self.uuid = instance.get("uuid") self.content = {} self.files = [] # get network info, and the rendered network template ctxt = context.get_admin_context() network_info = network.API().get_instance_nw_info(ctxt, instance) 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. Thats 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