Exemplo n.º 1
0
 def _attach_bdm_to_instance(self, context, instance, instance_id, bdms):
     try:
         pass
     except botocore.exceptions.ClientError as e:
         reason = e.response.get('Error', {}).get('Message', 'Unkown')
         LOG.error('Create instance failed, the error is: %s' % reason)
         self.aws_client.get_aws_client(context)\
                        .delete_instances(InstanceIds=[instance_id])
         raise exception_ex.ProviderCreateInstanceFailed(reason=reason)
     except botocore.exceptions.WaiterError as e:
         reason = e.message
         LOG.warn('Cannot create instance,operation time out')
         self.aws_client.get_aws_client(context)\
                        .delete_instances(InstanceIds=[instance_id])
         raise exception_ex.ProviderCreateInstanceFailed(reason=reason)
     except Exception as e:
         with excutils.save_and_reraise_exception():
             LOG.error(_LE('Error from create instance. '
                           'Error=%(e)s'), {'e': e},
                       instance=instance)
Exemplo n.º 2
0
 def _create_instance(self, context, instance, bdms, **kwargs):
     LOG.debug('Create instance: %s', kwargs)
     instance_ids = []
     try:
         instance_ids = self.aws_client.get_aws_client(context)\
                                       .create_instance(**kwargs)
         if instance_ids:
             tags = [{'Key': 'caa_instance_id', 'Value': instance.uuid}]
             self.aws_client.get_aws_client(context)\
                            .create_tags(Resources=[instance_ids],
                                         Tags=tags)
             if bdms:
                 if not self._check_bdms(bdms):
                     msg = 'Create instance failed,the bdms info error'
                     LOG.error('Create instance on aws failed,'
                               ' the bdms %s info error' % bdms)
                     raise exception_ex.ProviderCreateInstanceFailed(
                         reason=msg)
                 for bdm in bdms:
                     volume_id = bdm.get('connection_info', {}).get('data', {})\
                                    .get('volume_id')
                     mountpoint = bdm.get('mount_device')
                     self.aws_client.get_aws_client(context).attach_volume(
                         VolumeId=volume_id,
                         InstanceId=instance_ids[0],
                         Device=mountpoint)
             return instance_ids
         else:
             msg = 'Create instance on aws failed'
             raise exception_ex.ProviderCreateInstanceFailed(reason=msg)
     except Exception as e:
         with excutils.save_and_reraise_exception():
             LOG.error(_LE('Error from create instance. '
                           'Error=%(e)s'), {'e': e},
                       instance=instance)
             if instance_ids:
                 self.aws_client.get_aws_client(context)\
                                .delete_instances(InstanceIds=instance_ids)
Exemplo n.º 3
0
 def _get_provider_nics(self, context, instance, project_mapper=None):
     if project_mapper is None:
         project_mapper = self._get_project_mapper(context,
                                                   context.project_id)
     provider_net_data = project_mapper.get('net_data', None)
     provider_net_api = project_mapper.get('net_api', None)
     if not provider_net_data or not provider_net_api:
         LOG.error(_LE('Create instance failed.The net not found'),
                   instance=instance)
         msg = 'The net of instance found on aws'
         raise exception_ex.ProviderCreateInstanceFailed(reason=msg)
     nics = []
     nics.append({
         'DeviceIndex': 0,
         'SubnetId': provider_net_data,
         'DeleteOnTermination': True
     })
     nics.append({
         'DeviceIndex': 1,
         'SubnetId': provider_net_api,
         'DeleteOnTermination': True
     })
     return nics
Exemplo n.º 4
0
 def _build_sub_bdm(self, context, image_id, root_size):
     sub_bdms = []
     try:
         kwargs = {'ImageIds': [image_id]}
         images = self.aws_client.get_aws_client(context)\
                                 .describe_images(**kwargs)
         image = images[0]
         block_device_mappings = image.get('BlockDeviceMappings')
         for bdm in block_device_mappings:
             device_name = bdm.get('DeviceName')
             if device_name == '/dev/sda1' or device_name == '/dev/xvda':
                 bdm.get('Ebs', {})['VolumeSize'] = root_size
                 break
         sub_bdms.extend(block_device_mappings)
         return sub_bdms
     except botocore.exceptions.ClientError as e:
         reason = e.response.get('Error', {}).get('Message', 'Unkown')
         LOG.error(_LE('Error from create instance. '
                       'Error=%(error)s'), {'error': reason})
         raise exception_ex.ProviderCreateInstanceFailed(reason=reason)
     except Exception as e:
         with excutils.save_and_reraise_exception():
             LOG.error(_LE('Error from create instance. '
                           'Error=%(e)s'), {'e': e})
Exemplo n.º 5
0
    def spawn(self,
              context,
              instance,
              image_meta,
              injected_files,
              admin_password,
              network_info=None,
              block_device_info=None):
        LOG.debug("Start to create server", instance=instance)
        base_image_id = None
        flavor = instance.get_flavor()
        root_size = flavor.root_gb
        sub_flavor_id = self._get_provider_flavor_id(context, flavor.flavorid)
        if not sub_flavor_id:
            raise exception.FlavorNotFound(flavor_id=flavor.flavorid)
        block_device_info = block_device_info or {}
        attached_bdms = copy.deepcopy(
            block_device_info.get('block_device_mapping', []))
        if instance.image_ref:
            base_image_id = self._get_provider_base_image_id(context)
        else:
            if block_device_info:
                bdms = block_device_info.get('block_device_mapping', [])
                if bdms:
                    bdms = sorted(bdms, key=lambda bdm: bdm['boot_index'])
                    bdm = bdms[0]
                    root_size = bdm.get('size')
                    base_image_id = self._get_image_id_from_bdm(context, bdm)
                    attached_bdms.remove(bdm)
        if not base_image_id:
            LOG.error(_LE('Create instance failed.The base image not found'),
                      instance=instance)
            msg = 'The base image not found on aws'
            raise exception_ex.ProviderCreateInstanceFailed(reason=msg)
        project_mapper = self._get_project_mapper(context, context.project_id)
        nics = self._get_provider_nics(context, project_mapper)
        bdms = self._build_sub_bdm(context, base_image_id, root_size)
        availability_zone = project_mapper.get("availability_zone", None)
        security_groups = self._get_provider_security_groups_list(
            context, project_mapper)
        user_data = self._get_user_data(injected_files)
        create_args = self._build_create_args(base_image_id,
                                              sub_flavor_id,
                                              availability_zone,
                                              nics,
                                              security_groups=security_groups,
                                              user_data=user_data,
                                              block_device_mapping=bdms)
        instance_ids = self._create_instance(context, instance, attached_bdms,
                                             **create_args)
        try:
            kwargs = {'InstanceIds': instance_ids}
            instances = self.aws_client.get_aws_client(context)\
                            .describe_instances(**kwargs)
            nics = instances[0].get('NetworkInterfaces')
            if nics:
                for nic in nics:
                    if nic.get('SubnetId') == project_mapper.get('net_api'):
                        ip = nic.get('PrivateIpAddresses')[0]\
                                .get('PrivateIpAddress')
                        instance.system_metadata['management_ip'] = ip
            instance.system_metadata['instance_id'] = instance_ids[0]
            LOG.debug(
                'Instance metadata info instance_id: %(id)s ,'
                'ip: %(ip)s', {
                    'id': instance_ids[0],
                    'ip': ip
                })
            instance.save()
            # instance mapper
            values = {'provider_instance_id': instance_ids[0]}
            self.caa_db_api.instance_mapper_create(context, instance.uuid,
                                                   instance.project_id, values)
            LOG.info(_LI("Instance spawned successfully."), instance=instance)
        except Exception as e:
            LOG.error(_LE('save instance info failed! '
                          'Error=%(e)s'), {
                              'e': e,
                          },
                      instance=instance)

            self.aws_client.get_aws_client(context)\
                           .delete_instances(InstanceIds=instance_ids)
            msg = 'Instance_mapper_create failed'
            raise exception_ex.ProviderCreateInstanceFailed(reason=msg)