コード例 #1
0
 def cinder_api(self):
     assert self.api_session is not None, 'Unable to use cinder_api without a Keystoneauth session'
     params = {'api_session': self.api_session}
     try:
         if self.volume_backup.region:
             params['region_name'] = self.volume_backup.region.id
         else:
             backup_related_volume = self.volume_backup.volume
             if backup_related_volume:
                 params['region_name'] = backup_related_volume.region
         return cinder_client(**params)
     except VolumeModel.DoesNotExist:
         return cinder_client(**params)
コード例 #2
0
    def cinder_admin_api(self):
        """
        :rtype: cinderclient.v3.client.Client
        """
        assert self.admin_session is not None, 'Unable to use admin_api without a Keystoneauth session'

        return cinder_client(api_session=self.admin_session)
コード例 #3
0
 def create(self,
            name,
            size,
            region_name,
            type=None,
            source_type=None,
            source_id=None):
     """
     :type region_name: str or unicode
     :param size: Size of volume in GB
     :param name: Name of the volume
     :param type: Type of volume
     :param source_type: the source type to create volume from
     :param source_id: the source id/uuid (volume or image / snapshot)
     :rtype: :class:`cinderclient.v2.volumes.Volume`
     """
     extra_params = {}
     if source_type and source_id:
         if source_type == 'image':
             extra_params['imageRef'] = source_id
         elif source_type == 'volume':
             extra_params['source_volid'] = source_id
     if type:
         extra_params['volume_type'] = type
     cc = cinder_client(api_session=self.api_session,
                        region_name=region_name)
     return cc.volumes.create(size=size, name=name, **extra_params)
コード例 #4
0
 def get_volume_from_api(self, volume_id, region, api_session=None):
     api_session = api_session or self.api_session
     cc = cinder_client(api_session=api_session, region_name=region)
     try:
         volume = cc.volumes.get(volume_id)
     except cinderclient.exceptions.NotFound:
         LOG.debug('Unable to get volume missing in OpenStack: {}'.format(
             volume_id))
         return None
     return volume
コード例 #5
0
def wait_for_volume_status(self, volume_id, project_id, project_domain_id,
                           region_name, status):
    if volume_id:
        os_api = OSApi(project=project_id, domain=project_domain_id)
        cc = cinder_client(api_session=os_api.get_session(),
                           region_name=region_name)
        volume = cc.volumes.get(volume_id)
        if volume.status != status:
            self.retry(countdown=5)
        else:
            return volume_id
    return None
コード例 #6
0
 def create(self, volume_id, name, force=False, description=None, region_name=None, metadata=None):
     if not region_name:
         volume = VolumeModel.objects.filter(id=volume_id).first()
         if not volume:
             raise APIBadRequest(_('Volume to create snapshot for does not exist.'))
         region_name = volume.region
     cc = cinder_client(api_session=self.api_session, region_name=region_name)
     return cc.volume_snapshots.create(
         volume_id=volume_id,
         force=force,
         name=name,
         description=description,
         metadata=metadata,
     )
コード例 #7
0
 def create(self,
            volume_id,
            region_id,
            container=None,
            name=None,
            description=None,
            incremental=False,
            force=False):
     cc = cinder_client(api_session=self.api_session, region_name=region_id)
     return cc.backups.create(
         volume_id=volume_id,
         container=container,
         name=name,
         description=description,
         incremental=incremental,
         force=force,
     )
コード例 #8
0
def sync_volume_extra_details(self, volume_id, region_name):
    del self  # unused
    os_api = OSAdminApi()
    cc = cinder_client(api_session=os_api.get_session(),
                       region_name=region_name)
    try:
        volume_from_os = cc.volumes.get(volume_id)
    except cinder_exceptions.NotFound:
        pass
    else:
        db_volume = Volume.objects.filter(id=volume_id).first()
        if db_volume and volume_from_os:
            if volume_from_os.bootable == 'true':
                db_volume.bootable = True
            if volume_from_os.bootable == 'false':
                db_volume.bootable = False
            db_volume.save()
コード例 #9
0
 def get_qos_spec_from_api(self, payload, region, api_session=None):
     name = payload.get('name', None)
     id = payload.get('id', None)
     if not name and not id:
         LOG.warning('Unable to get QoS spec without a name or id')
         return None
     api_session = api_session or self.api_session
     cc = cinder_client(api_session=api_session, region_name=region)
     try:
         # name is unique in openstack
         if name:
             qos_spec = cc.qos_specs.find(name=name)
         else:
             qos_spec = cc.qos_specs.get(id)
     except cinderclient.exceptions.NotFound:
         LOG.debug('Unable to get QoS spec missing in OpenStack: {}'.format(
             name or id))
         return None
     return qos_spec
コード例 #10
0
def sync_cinder(region_id=None):
    assert region_id is not None, 'Unable to sync cinder objects without a region'
    cc = cinder_client(api_session=get_keystone_admin().session, region_name=region_id)
    try:
        volume_types = cc.volume_types.list()
    except EndpointNotFound as e:
        LOG.error(str(e))
        return
    sync_volume_types(volume_types=volume_types, region=region_id)
    for volume_type in volume_types:
        sync_volume_type_extra_specs(volume_type=volume_type)
        if not volume_type.is_public:
            volume_type_to_projects = cc.volume_type_access.list(volume_type=volume_type.id)
            sync_volume_type_to_projects(volume_type_to_projects=volume_type_to_projects)
    qos_specs = cc.qos_specs.list()
    sync_qos_specs(qos_specs=qos_specs)
    sync_volumes(cc, region_id)
    sync_volume_backups(cinder=cc, region_id=region_id)
    sync_volume_snapshots(cinder=cc, region_id=region_id)
コード例 #11
0
def delete_openstack_volume(self,
                            volume_id,
                            region,
                            project_id,
                            user_id: Optional[int] = None):
    del self  # unused

    project = Project.with_admin_session(project_id, cache=AUTH_CACHE)
    cc = cinder_client(api_session=project.api_session, region_name=region)
    try:
        db_volume = OpenstackVolume.objects.filter(id=volume_id).first()
        user = AppUser.objects.filter(id=user_id).first()
        cc.volumes.delete(volume=volume_id)

        if user and db_volume:
            if user.is_staff:
                staff_signals.staff_delete_volume.send(
                    sender=__name__,
                    user=user,
                    user_id=user.id,
                    volume_name=db_volume.name,
                    volume_id=db_volume.id,
                    username=user.username,
                )
            else:
                user_signals.user_delete_volume.send(
                    sender=__name__,
                    user=user,
                    user_id=user.id,
                    volume_name=db_volume.name,
                    volume_id=db_volume.id,
                    username=user.username,
                )

    except cinder_exceptions.NotFound:
        OpenstackVolume.objects.filter(id=volume_id).delete()
コード例 #12
0
    def cinder_api(self):
        assert self.api_session is not None, 'Unable to use cinder_api without a Keystoneauth session'

        return cinder_client(api_session=self.api_session,
                             region_name=self.volume.region)