Example #1
0
    def test_get_ec2_ids(self):
        expected = {
            'instance-id': 'ec2-inst-id',
            'ami-id': 'ec2-ami-id',
            'kernel-id': 'ami-kernel-ec2-kernelid',
            'ramdisk-id': 'ami-ramdisk-ec2-ramdiskid',
            }
        inst = {
            'uuid': 'fake-uuid',
            'kernel_id': 'ec2-kernelid',
            'ramdisk_id': 'ec2-ramdiskid',
            'image_ref': 'fake-image',
            }
        self.mox.StubOutWithMock(ec2utils, 'id_to_ec2_inst_id')
        self.mox.StubOutWithMock(ec2utils, 'glance_id_to_ec2_id')
        self.mox.StubOutWithMock(ec2utils, 'image_type')

        ec2utils.id_to_ec2_inst_id(inst['uuid']).AndReturn(
            expected['instance-id'])
        ec2utils.glance_id_to_ec2_id(self.context,
                                     inst['image_ref']).AndReturn(
            expected['ami-id'])
        for image_type in ['kernel', 'ramdisk']:
            image_id = inst['%s_id' % image_type]
            ec2utils.image_type(image_type).AndReturn('ami-' + image_type)
            ec2utils.glance_id_to_ec2_id(self.context, image_id,
                                         'ami-' + image_type).AndReturn(
                'ami-%s-ec2-%sid' % (image_type, image_type))

        self.mox.ReplayAll()
        result = self.conductor.get_ec2_ids(self.context, inst)
        self.assertEqual(result, expected)
Example #2
0
    def test_get_ec2_ids(self):
        expected = {
            'instance-id': 'ec2-inst-id',
            'ami-id': 'ec2-ami-id',
            'kernel-id': 'ami-kernel-ec2-kernelid',
            'ramdisk-id': 'ami-ramdisk-ec2-ramdiskid',
        }
        inst = {
            'uuid': 'fake-uuid',
            'kernel_id': 'ec2-kernelid',
            'ramdisk_id': 'ec2-ramdiskid',
            'image_ref': 'fake-image',
        }
        self.mox.StubOutWithMock(ec2utils, 'id_to_ec2_inst_id')
        self.mox.StubOutWithMock(ec2utils, 'glance_id_to_ec2_id')
        self.mox.StubOutWithMock(ec2utils, 'image_type')

        ec2utils.id_to_ec2_inst_id(inst['uuid']).AndReturn(
            expected['instance-id'])
        ec2utils.glance_id_to_ec2_id(
            self.context, inst['image_ref']).AndReturn(expected['ami-id'])
        for image_type in ['kernel', 'ramdisk']:
            image_id = inst['%s_id' % image_type]
            ec2utils.image_type(image_type).AndReturn('ami-' + image_type)
            ec2utils.glance_id_to_ec2_id(
                self.context, image_id, 'ami-' + image_type).AndReturn(
                    'ami-%s-ec2-%sid' % (image_type, image_type))

        self.mox.ReplayAll()
        result = self.conductor.get_ec2_ids(self.context, inst)
        self.assertEqual(result, expected)
Example #3
0
    def test_get_ec2_ids(self):
        expected = {
            "instance-id": "ec2-inst-id",
            "ami-id": "ec2-ami-id",
            "kernel-id": "ami-kernel-ec2-kernelid",
            "ramdisk-id": "ami-ramdisk-ec2-ramdiskid",
        }
        inst = {
            "uuid": "fake-uuid",
            "kernel_id": "ec2-kernelid",
            "ramdisk_id": "ec2-ramdiskid",
            "image_ref": "fake-image",
        }
        self.mox.StubOutWithMock(ec2utils, "id_to_ec2_inst_id")
        self.mox.StubOutWithMock(ec2utils, "glance_id_to_ec2_id")
        self.mox.StubOutWithMock(ec2utils, "image_type")

        ec2utils.id_to_ec2_inst_id(inst["uuid"]).AndReturn(expected["instance-id"])
        ec2utils.glance_id_to_ec2_id(self.context, inst["image_ref"]).AndReturn(expected["ami-id"])
        for image_type in ["kernel", "ramdisk"]:
            image_id = inst["%s_id" % image_type]
            ec2utils.image_type(image_type).AndReturn("ami-" + image_type)
            ec2utils.glance_id_to_ec2_id(self.context, image_id, "ami-" + image_type).AndReturn(
                "ami-%s-ec2-%sid" % (image_type, image_type)
            )

        self.mox.ReplayAll()
        result = self.conductor.get_ec2_ids(self.context, inst)
        self.assertEqual(result, expected)
Example #4
0
File: base.py Project: nati/nova
    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
Example #5
0
 def __call__(self, req):
     context = req.environ['nova.context']
     api_request = req.environ['ec2.request']
     result = None
     try:
         result = api_request.invoke(context)
     except exception.InstanceNotFound as ex:
         ec2_id = ec2utils.id_to_ec2_inst_id(ex.kwargs['instance_id'])
         message = ex.msg_fmt % {'instance_id': ec2_id}
         return ec2_error_ex(ex, req, message=message)
     except exception.VolumeNotFound as ex:
         ec2_id = ec2utils.id_to_ec2_vol_id(ex.kwargs['volume_id'])
         message = ex.msg_fmt % {'volume_id': ec2_id}
         return ec2_error_ex(ex, req, message=message)
     except exception.SnapshotNotFound as ex:
         ec2_id = ec2utils.id_to_ec2_snap_id(ex.kwargs['snapshot_id'])
         message = ex.msg_fmt % {'snapshot_id': ec2_id}
         return ec2_error_ex(ex, req, message=message)
     except (
             exception.CannotDisassociateAutoAssignedFloatingIP,
             exception.FloatingIpAssociated,
             exception.FloatingIpNotFound,
             exception.ImageNotActive,
             exception.InvalidInstanceIDMalformed,
             exception.InvalidKeypair,
             exception.InvalidParameterValue,
             exception.InvalidPortRange,
             exception.InvalidVolume,
             exception.KeyPairExists,
             exception.KeypairNotFound,
             exception.MissingParameter,
             exception.NoFloatingIpInterface,
             exception.NoMoreFixedIps,
             exception.NotAuthorized,
             exception.QuotaError,
             exception.QuotaError,
             exception.SecurityGroupExists,
             exception.SecurityGroupLimitExceeded,
             exception.SecurityGroupLimitExceeded,
             exception.SecurityGroupRuleExists,
             exception.VolumeUnattached,
             # Following aren't translated to valid EC2 errors.
             exception.ImageNotFound,
             exception.ImageNotFoundEC2,
             exception.InvalidAttribute,
             exception.InvalidRequest,
             exception.NotFound) as ex:
         return ec2_error_ex(ex, req)
     except Exception as ex:
         return ec2_error_ex(ex, req, unexpected=True)
     else:
         resp = webob.Response()
         resp.status = 200
         resp.headers['Content-Type'] = 'text/xml'
         resp.body = str(result)
         return resp
Example #6
0
 def __call__(self, req):
     context = req.environ["nova.context"]
     api_request = req.environ["ec2.request"]
     try:
         result = api_request.invoke(context)
     except exception.InstanceNotFound as ex:
         ec2_id = ec2utils.id_to_ec2_inst_id(ex.kwargs["instance_id"])
         message = ex.msg_fmt % {"instance_id": ec2_id}
         return ec2_error_ex(ex, req, message=message)
     except exception.VolumeNotFound as ex:
         ec2_id = ec2utils.id_to_ec2_vol_id(ex.kwargs["volume_id"])
         message = ex.msg_fmt % {"volume_id": ec2_id}
         return ec2_error_ex(ex, req, message=message)
     except exception.SnapshotNotFound as ex:
         ec2_id = ec2utils.id_to_ec2_snap_id(ex.kwargs["snapshot_id"])
         message = ex.msg_fmt % {"snapshot_id": ec2_id}
         return ec2_error_ex(ex, req, message=message)
     except (
         exception.CannotDisassociateAutoAssignedFloatingIP,
         exception.FloatingIpAssociated,
         exception.FloatingIpNotFound,
         exception.FloatingIpBadRequest,
         exception.ImageNotActive,
         exception.InvalidInstanceIDMalformed,
         exception.InvalidVolumeIDMalformed,
         exception.InvalidKeypair,
         exception.InvalidParameterValue,
         exception.InvalidPortRange,
         exception.InvalidVolume,
         exception.KeyPairExists,
         exception.KeypairNotFound,
         exception.MissingParameter,
         exception.NoFloatingIpInterface,
         exception.NoMoreFixedIps,
         exception.Forbidden,
         exception.QuotaError,
         exception.SecurityGroupExists,
         exception.SecurityGroupLimitExceeded,
         exception.SecurityGroupRuleExists,
         exception.VolumeUnattached,
         # Following aren't translated to valid EC2 errors.
         exception.ImageNotFound,
         exception.ImageNotFoundEC2,
         exception.InvalidAttribute,
         exception.InvalidRequest,
         exception.NotFound,
     ) as ex:
         return ec2_error_ex(ex, req)
     except Exception as ex:
         return ec2_error_ex(ex, req, unexpected=True)
     else:
         resp = webob.Response()
         resp.status = 200
         resp.headers["Content-Type"] = "text/xml"
         resp.body = str(result)
         return resp
Example #7
0
    def get_ec2_ids(self, context, instance):
        ec2_ids = {}

        ec2_ids["instance-id"] = ec2utils.id_to_ec2_inst_id(instance["uuid"])
        ec2_ids["ami-id"] = ec2utils.glance_id_to_ec2_id(context, instance["image_ref"])
        for image_type in ["kernel", "ramdisk"]:
            image_id = instance.get("%s_id" % image_type)
            if image_id is not None:
                ec2_image_type = ec2utils.image_type(image_type)
                ec2_id = ec2utils.glance_id_to_ec2_id(context, image_id, ec2_image_type)
                ec2_ids["%s-id" % image_type] = ec2_id

        return ec2_ids
Example #8
0
    def get_ec2_ids(self, context, instance):
        ec2_ids = {}

        ec2_ids['instance-id'] = ec2utils.id_to_ec2_inst_id(instance['uuid'])
        ec2_ids['ami-id'] = ec2utils.glance_id_to_ec2_id(
            context, instance['image_ref'])
        for image_type in ['kernel', 'ramdisk']:
            image_id = instance.get('%s_id' % image_type)
            if image_id is not None:
                ec2_image_type = ec2utils.image_type(image_type)
                ec2_id = ec2utils.glance_id_to_ec2_id(context, image_id,
                                                      ec2_image_type)
                ec2_ids['%s-id' % image_type] = ec2_id

        return ec2_ids
Example #9
0
    def get_ec2_ids(self, context, instance):
        ec2_ids = {}

        ec2_ids['instance-id'] = ec2utils.id_to_ec2_inst_id(instance['uuid'])
        ec2_ids['ami-id'] = ec2utils.glance_id_to_ec2_id(context,
                                                         instance['image_ref'])
        for image_type in ['kernel', 'ramdisk']:
            if '%s_id' % image_type in instance:
                image_id = instance['%s_id' % image_type]
                ec2_image_type = ec2utils.image_type(image_type)
                ec2_id = ec2utils.glance_id_to_ec2_id(context, image_id,
                                                      ec2_image_type)
                ec2_ids['%s-id' % image_type] = ec2_id

        return ec2_ids
Example #10
0
    def _get_ec2_ids(context, instance):
        ec2_ids = {}

        ec2_ids['instance_id'] = ec2utils.id_to_ec2_inst_id(instance.uuid)
        ec2_ids['ami_id'] = ec2utils.glance_id_to_ec2_id(context,
                                                         instance.image_ref)
        for image_type in ['kernel', 'ramdisk']:
            image_id = getattr(instance, '%s_id' % image_type)
            ec2_id = None
            if image_id is not None:
                ec2_image_type = ec2utils.image_type(image_type)
                ec2_id = ec2utils.glance_id_to_ec2_id(context, image_id,
                                                      ec2_image_type)
            ec2_ids['%s_id' % image_type] = ec2_id

        return ec2_ids
Example #11
0
    def _get_ec2_ids(context, instance):
        ec2_ids = {}

        ec2_ids['instance_id'] = ec2utils.id_to_ec2_inst_id(instance.uuid)
        ec2_ids['ami_id'] = ec2utils.glance_id_to_ec2_id(context,
                                                         instance.image_ref)
        for image_type in ['kernel', 'ramdisk']:
            image_id = getattr(instance, '%s_id' % image_type)
            ec2_id = None
            if image_id is not None:
                ec2_image_type = ec2utils.image_type(image_type)
                ec2_id = ec2utils.glance_id_to_ec2_id(context, image_id,
                                                      ec2_image_type)
            ec2_ids['%s_id' % image_type] = ec2_id

        return ec2_ids
Example #12
0
 def __call__(self, req):
     context = req.environ['nova.context']
     api_request = req.environ['ec2.request']
     result = None
     try:
         result = api_request.invoke(context)
     except exception.InstanceNotFound as ex:
         ec2_id = ec2utils.id_to_ec2_inst_id(ex.kwargs['instance_id'])
         message = ex.msg_fmt % {'instance_id': ec2_id}
         return ec2_error_ex(ex, req, message=message)
     except exception.VolumeNotFound as ex:
         ec2_id = ec2utils.id_to_ec2_vol_id(ex.kwargs['volume_id'])
         message = ex.msg_fmt % {'volume_id': ec2_id}
         return ec2_error_ex(ex, req, message=message)
     except exception.SnapshotNotFound as ex:
         ec2_id = ec2utils.id_to_ec2_snap_id(ex.kwargs['snapshot_id'])
         message = ex.msg_fmt % {'snapshot_id': ec2_id}
         return ec2_error_ex(ex, req, message=message)
     except exception.KeyPairExists as ex:
         code = 'InvalidKeyPair.Duplicate'
         return ec2_error_ex(ex, req, code=code)
     except exception.InvalidKeypair as ex:
         code = 'InvalidKeyPair.Format'
         return ec2_error_ex(ex, req, code=code)
     except (exception.EC2APIError,
             exception.NotFound,
             exception.KeypairNotFound,
             exception.SecurityGroupExists,
             exception.InvalidParameterValue,
             exception.InvalidPortRange,
             exception.NotAuthorized,
             exception.InvalidRequest,
             exception.InvalidAttribute,
             exception.InvalidPortRange,
             exception.QuotaError,
             exception.MissingParameter,
             exception.InvalidInstanceIDMalformedEC2) as ex:
         return ec2_error_ex(ex, req)
     except Exception as ex:
         return ec2_error_ex(ex, req, unexpected=True)
     else:
         resp = webob.Response()
         resp.status = 200
         resp.headers['Content-Type'] = 'text/xml'
         resp.body = str(result)
         return resp
Example #13
0
 def __call__(self, req):
     context = req.environ["nova.context"]
     api_request = req.environ["ec2.request"]
     result = None
     try:
         result = api_request.invoke(context)
     except exception.InstanceNotFound as ex:
         ec2_id = ec2utils.id_to_ec2_inst_id(ex.kwargs["instance_id"])
         message = ex.msg_fmt % {"instance_id": ec2_id}
         return ec2_error_ex(ex, req, message=message)
     except exception.VolumeNotFound as ex:
         ec2_id = ec2utils.id_to_ec2_vol_id(ex.kwargs["volume_id"])
         message = ex.msg_fmt % {"volume_id": ec2_id}
         return ec2_error_ex(ex, req, message=message)
     except exception.SnapshotNotFound as ex:
         ec2_id = ec2utils.id_to_ec2_snap_id(ex.kwargs["snapshot_id"])
         message = ex.msg_fmt % {"snapshot_id": ec2_id}
         return ec2_error_ex(ex, req, message=message)
     except exception.KeyPairExists as ex:
         code = "InvalidKeyPair.Duplicate"
         return ec2_error_ex(ex, req, code=code)
     except exception.InvalidKeypair as ex:
         code = "InvalidKeyPair.Format"
         return ec2_error_ex(ex, req, code=code)
     except (
         exception.EC2APIError,
         exception.NotFound,
         exception.InvalidParameterValue,
         exception.InvalidPortRange,
         exception.NotAuthorized,
         exception.InvalidRequest,
         exception.QuotaError,
         exception.InvalidInstanceIDMalformed,
     ) as ex:
         return ec2_error_ex(ex, req)
     except Exception as ex:
         return ec2_error_ex(ex, req, unexpected=True)
     else:
         resp = webob.Response()
         resp.status = 200
         resp.headers["Content-Type"] = "text/xml"
         resp.body = str(result)
         return resp
Example #14
0
 def __call__(self, req):
     context = req.environ['nova.context']
     api_request = req.environ['ec2.request']
     result = None
     try:
         result = api_request.invoke(context)
     except exception.InstanceNotFound as ex:
         ec2_id = ec2utils.id_to_ec2_inst_id(ex.kwargs['instance_id'])
         message = ex.msg_fmt % {'instance_id': ec2_id}
         return ec2_error_ex(ex, req, message=message)
     except exception.VolumeNotFound as ex:
         ec2_id = ec2utils.id_to_ec2_vol_id(ex.kwargs['volume_id'])
         message = ex.msg_fmt % {'volume_id': ec2_id}
         return ec2_error_ex(ex, req, message=message)
     except exception.SnapshotNotFound as ex:
         ec2_id = ec2utils.id_to_ec2_snap_id(ex.kwargs['snapshot_id'])
         message = ex.msg_fmt % {'snapshot_id': ec2_id}
         return ec2_error_ex(ex, req, message=message)
     except exception.KeyPairExists as ex:
         code = 'InvalidKeyPair.Duplicate'
         return ec2_error_ex(ex, req, code=code)
     except exception.InvalidKeypair as ex:
         code = 'InvalidKeyPair.Format'
         return ec2_error_ex(ex, req, code=code)
     except (exception.EC2APIError, exception.NotFound,
             exception.InvalidParameterValue, exception.InvalidPortRange,
             exception.NotAuthorized, exception.InvalidRequest,
             exception.QuotaError,
             exception.InvalidInstanceIDMalformed) as ex:
         return ec2_error_ex(ex, req)
     except Exception as ex:
         return ec2_error_ex(ex, req, unexpected=True)
     else:
         resp = webob.Response()
         resp.status = 200
         resp.headers['Content-Type'] = 'text/xml'
         resp.body = str(result)
         return resp
Example #15
0
    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
Example #16
0
    def __call__(self, req):
        context = req.environ['nova.context']
        request_id = context.request_id
        api_request = req.environ['ec2.request']
        result = None
        try:
            result = api_request.invoke(context)
        except exception.InstanceNotFound as ex:
            LOG.info(_('InstanceNotFound raised: %s'), unicode(ex),
                     context=context)
            ec2_id = ec2utils.id_to_ec2_inst_id(ex.kwargs['instance_id'])
            message = ex.message % {'instance_id': ec2_id}
            return ec2_error(req, request_id, type(ex).__name__, message)
        except exception.VolumeNotFound as ex:
            LOG.info(_('VolumeNotFound raised: %s'), unicode(ex),
                     context=context)
            ec2_id = ec2utils.id_to_ec2_vol_id(ex.kwargs['volume_id'])
            message = ex.message % {'volume_id': ec2_id}
            return ec2_error(req, request_id, type(ex).__name__, message)
        except exception.SnapshotNotFound as ex:
            LOG.info(_('SnapshotNotFound raised: %s'), unicode(ex),
                     context=context)
            ec2_id = ec2utils.id_to_ec2_snap_id(ex.kwargs['snapshot_id'])
            message = ex.message % {'snapshot_id': ec2_id}
            return ec2_error(req, request_id, type(ex).__name__, message)
        except exception.NotFound as ex:
            LOG.info(_('NotFound raised: %s'), unicode(ex), context=context)
            return ec2_error(req, request_id, type(ex).__name__, unicode(ex))
        except exception.EC2APIError as ex:
            LOG.exception(_('EC2APIError raised: %s'), unicode(ex),
                          context=context)
            if ex.code:
                return ec2_error(req, request_id, ex.code, unicode(ex))
            else:
                return ec2_error(req, request_id, type(ex).__name__,
                                   unicode(ex))
        except exception.KeyPairExists as ex:
            LOG.debug(_('KeyPairExists raised: %s'), unicode(ex),
                     context=context)
            return ec2_error(req, request_id, type(ex).__name__, unicode(ex))
        except exception.InvalidParameterValue as ex:
            LOG.debug(_('InvalidParameterValue raised: %s'), unicode(ex),
                     context=context)
            return ec2_error(req, request_id, type(ex).__name__, unicode(ex))
        except exception.InvalidPortRange as ex:
            LOG.debug(_('InvalidPortRange raised: %s'), unicode(ex),
                     context=context)
            return ec2_error(req, request_id, type(ex).__name__, unicode(ex))
        except exception.NotAuthorized as ex:
            LOG.info(_('NotAuthorized raised: %s'), unicode(ex),
                    context=context)
            return ec2_error(req, request_id, type(ex).__name__, unicode(ex))
        except exception.InvalidRequest as ex:
            LOG.debug(_('InvalidRequest raised: %s'), unicode(ex),
                     context=context)
            return ec2_error(req, request_id, type(ex).__name__, unicode(ex))
        except exception.QuotaError as ex:
            LOG.debug(_('QuotaError raised: %s'), unicode(ex),
                      context=context)
            return ec2_error(req, request_id, type(ex).__name__, unicode(ex))
        except exception.InvalidInstanceIDMalformed as ex:
            LOG.debug(_('Invalid id: bogus (expecting "i-..."): %s'),
                        unicode(ex), context=context)
            return ec2_error(req, request_id, type(ex).__name__, unicode(ex))
        except Exception as ex:
            env = req.environ.copy()
            for k in env.keys():
                if not isinstance(env[k], basestring):
                    env.pop(k)

            LOG.exception(_('Unexpected error raised: %s'), unicode(ex))
            LOG.error(_('Environment: %s') % jsonutils.dumps(env))
            return ec2_error(req, request_id, 'UnknownError',
                             _('An unknown error has occurred. '
                               'Please try your request again.'))
        else:
            resp = webob.Response()
            resp.status = 200
            resp.headers['Content-Type'] = 'text/xml'
            resp.body = str(result)
            return resp
Example #17
0
    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
Example #18
0
    def __call__(self, req):
        context = req.environ["nova.context"]
        request_id = context.request_id
        api_request = req.environ["ec2.request"]
        result = None
        try:
            result = api_request.invoke(context)
        except exception.InstanceNotFound as ex:
            LOG.info(_("InstanceNotFound raised: %s"), unicode(ex), context=context)
            ec2_id = ec2utils.id_to_ec2_inst_id(ex.kwargs["instance_id"])
            message = ex.message % {"instance_id": ec2_id}
            return ec2_error(req, request_id, type(ex).__name__, message)
        except exception.VolumeNotFound as ex:
            LOG.info(_("VolumeNotFound raised: %s"), unicode(ex), context=context)
            ec2_id = ec2utils.id_to_ec2_vol_id(ex.kwargs["volume_id"])
            message = ex.message % {"volume_id": ec2_id}
            return ec2_error(req, request_id, type(ex).__name__, message)
        except exception.SnapshotNotFound as ex:
            LOG.info(_("SnapshotNotFound raised: %s"), unicode(ex), context=context)
            ec2_id = ec2utils.id_to_ec2_snap_id(ex.kwargs["snapshot_id"])
            message = ex.message % {"snapshot_id": ec2_id}
            return ec2_error(req, request_id, type(ex).__name__, message)
        except exception.NotFound as ex:
            LOG.info(_("NotFound raised: %s"), unicode(ex), context=context)
            return ec2_error(req, request_id, type(ex).__name__, unicode(ex))
        except exception.EC2APIError as ex:
            if ex.code:
                return ec2_error(req, request_id, ex.code, unicode(ex))
            else:
                return ec2_error(req, request_id, type(ex).__name__, unicode(ex))
        except exception.KeyPairExists as ex:
            LOG.debug(_("KeyPairExists raised: %s"), unicode(ex), context=context)
            code = "InvalidKeyPair.Duplicate"
            return ec2_error(req, request_id, code, unicode(ex))
        except exception.InvalidKeypair as ex:
            LOG.debug(_("InvalidKeypair raised: %s"), unicode(ex), context)
            code = "InvalidKeyPair.Format"
            return ec2_error(req, request_id, code, unicode(ex))
        except exception.InvalidParameterValue as ex:
            LOG.debug(_("InvalidParameterValue raised: %s"), unicode(ex), context=context)
            return ec2_error(req, request_id, type(ex).__name__, unicode(ex))
        except exception.InvalidPortRange as ex:
            LOG.debug(_("InvalidPortRange raised: %s"), unicode(ex), context=context)
            return ec2_error(req, request_id, type(ex).__name__, unicode(ex))
        except exception.NotAuthorized as ex:
            LOG.info(_("NotAuthorized raised: %s"), unicode(ex), context=context)
            return ec2_error(req, request_id, type(ex).__name__, unicode(ex))
        except exception.InvalidRequest as ex:
            LOG.debug(_("InvalidRequest raised: %s"), unicode(ex), context=context)
            return ec2_error(req, request_id, type(ex).__name__, unicode(ex))
        except exception.QuotaError as ex:
            LOG.debug(_("QuotaError raised: %s"), unicode(ex), context=context)
            return ec2_error(req, request_id, type(ex).__name__, unicode(ex))
        except exception.InvalidInstanceIDMalformed as ex:
            LOG.debug(_('Invalid id: bogus (expecting "i-..."): %s'), unicode(ex), context=context)
            return ec2_error(req, request_id, type(ex).__name__, unicode(ex))
        except Exception as ex:
            env = req.environ.copy()
            for k in env.keys():
                if not isinstance(env[k], basestring):
                    env.pop(k)

            LOG.exception(_("Unexpected error raised: %s"), unicode(ex))
            LOG.error(_("Environment: %s") % jsonutils.dumps(env))
            return ec2_error(
                req, request_id, "UnknownError", _("An unknown error has occurred. " "Please try your request again.")
            )
        else:
            resp = webob.Response()
            resp.status = 200
            resp.headers["Content-Type"] = "text/xml"
            resp.body = str(result)
            return resp