Пример #1
0
    def get_help_text(self, extra_context=None):
        extra = {} if extra_context is None else dict(extra_context)
        try:
            extra['usages'] = quotas.tenant_quota_usages(
                self.request,
                targets=('instances', 'cores', 'ram', 'volumes', 'gigabytes'))
            extra['usages_json'] = json.dumps(extra['usages'])
            extra['cinder_enabled'] = \
                base.is_service_enabled(self.request, 'volume')
            flavors = json.dumps(
                [f._info for f in instance_utils.flavor_list(self.request)])
            extra['flavors'] = flavors
            images = image_utils.get_available_images(
                self.request, self.initial['project_id'], self._images_cache)
            if images is not None:
                attrs = [{
                    'id': i.id,
                    'min_disk': getattr(i, 'min_disk', 0),
                    'min_ram': getattr(i, 'min_ram', 0),
                    'size': functions.bytes_to_gigabytes(i.size)
                } for i in images]
                extra['images'] = json.dumps(attrs)

        except Exception:
            exceptions.handle(self.request,
                              _("Unable to retrieve quota information."))
        return super().get_help_text(extra)
Пример #2
0
 def prepare_source_fields_if_image_specified(self, request):
     self.fields['availability_zone'].choices = \
         self.availability_zones(request)
     try:
         image = self.get_image(request,
                                request.GET["image_id"])
         image.bytes = image.size
         self.fields['name'].initial = image.name
         min_vol_size = functions.bytes_to_gigabytes(
             image.size)
         size_help_text = (_('Volume size must be equal to or greater '
                             'than the image size (%s)')
                           % filesizeformat(image.size))
         properties = getattr(image, 'properties', {})
         min_disk_size = (getattr(image, 'min_disk', 0) or
                          properties.get('min_disk', 0))
         if (min_disk_size > min_vol_size):
             min_vol_size = min_disk_size
             size_help_text = (_('Volume size must be equal to or '
                                 'greater than the image minimum '
                                 'disk size (%sGB)')
                               % min_disk_size)
         self.fields['size'].initial = min_vol_size
         self.fields['size'].help_text = size_help_text
         self.fields['image_source'].choices = ((image.id, image),)
         del self.fields['snapshot_source']
         del self.fields['volume_source']
         del self.fields['volume_source_type']
     except Exception:
         msg = _('Unable to load the specified image. %s')
         exceptions.handle(request, msg % request.GET['image_id'])
Пример #3
0
    def get_help_text(self, extra_context=None):
        extra = {} if extra_context is None else dict(extra_context)
        try:
            extra['usages'] = quotas.tenant_quota_usages(
                self.request,
                targets=('instances', 'cores', 'ram', 'volumes', 'gigabytes'))
            extra['usages_json'] = json.dumps(extra['usages'])
            extra['cinder_enabled'] = \
                base.is_service_enabled(self.request, 'volume')
            flavors = json.dumps([f._info for f in
                                  instance_utils.flavor_list(self.request)])
            extra['flavors'] = flavors
            images = image_utils.get_available_images(
                self.request, self.initial['project_id'], self._images_cache)
            if images is not None:
                attrs = [{'id': i.id,
                          'min_disk': getattr(i, 'min_disk', 0),
                          'min_ram': getattr(i, 'min_ram', 0),
                          'size': functions.bytes_to_gigabytes(i.size)}
                         for i in images]
                extra['images'] = json.dumps(attrs)

        except Exception:
            exceptions.handle(self.request,
                              _("Unable to retrieve quota information."))
        return super(SetInstanceDetailsAction, self).get_help_text(extra)
Пример #4
0
 def prepare_source_fields_if_image_specified(self, request):
     self.fields['availability_zone'].choices = \
         availability_zones(request)
     try:
         image = self.get_image(request,
                                request.GET["image_id"])
         image.bytes = image.size
         self.fields['name'].initial = image.name
         min_vol_size = functions.bytes_to_gigabytes(
             image.size)
         size_help_text = (_('Volume size must be equal to or greater '
                             'than the image size (%s)')
                           % filesizeformat(image.size))
         properties = getattr(image, 'properties', {})
         min_disk_size = (getattr(image, 'min_disk', 0) or
                          properties.get('min_disk', 0))
         if min_disk_size > min_vol_size:
             min_vol_size = min_disk_size
             size_help_text = (_('Volume size must be equal to or '
                                 'greater than the image minimum '
                                 'disk size (%sGiB)')
                               % min_disk_size)
         self.fields['size'].initial = min_vol_size
         self.fields['size'].help_text = size_help_text
         self.fields['image_source'].choices = ((image.id, image),)
         del self.fields['snapshot_source']
         del self.fields['volume_source']
         del self.fields['volume_source_type']
     except Exception:
         msg = _('Unable to load the specified image. %s')
         exceptions.handle(request, msg % request.GET['image_id'])
    def populate_image_id_choices(self, request, context):
        choices = []
        image_dict = {}
        #images = image_utils.get_available_images(request,
        #                                    context.get('zone_id'),
        #                                    images_cache=self._images_cache)
        try:
            zones = api.proxy.availability_zone_list(request)
        except:
            zones = []
            exceptions.handle(request, _('Unable to retrieve zones.'), ignore=True)

        for zone in zones:
            images = image_utils.get_available_images(
                    request, zone.id, images_cache=self._images_cache)
            for image in images:
                image_dict[image.name] = image

        for image in image_dict.values():
            image.bytes = image.size
            image.volume_size = max(
                image.min_disk, functions.bytes_to_gigabytes(image.bytes))
            choices.append((image.imageid, image))
        if choices:
            choices.sort(key=lambda c: c[1].name)
            choices.insert(0, ("", _("Select Image")))
        else:
            choices.insert(0, ("", _("No images available")))
        return choices
Пример #6
0
 def prepare_source_fields_if_image_specified(self, request):
     self.fields["availability_zone"].choices = self.availability_zones(request)
     try:
         image = self.get_image(request, request.GET["image_id"])
         image.bytes = image.size
         self.fields["name"].initial = image.name
         min_vol_size = functions.bytes_to_gigabytes(image.size)
         size_help_text = _("Volume size must be equal to or greater " "than the image size (%s)") % filesizeformat(
             image.size
         )
         properties = getattr(image, "properties", {})
         min_disk_size = getattr(image, "min_disk", 0) or properties.get("min_disk", 0)
         if min_disk_size > min_vol_size:
             min_vol_size = min_disk_size
             size_help_text = (
                 _("Volume size must be equal to or " "greater than the image minimum " "disk size (%sGB)")
                 % min_disk_size
             )
         self.fields["size"].initial = min_vol_size
         self.fields["size"].help_text = size_help_text
         self.fields["image_source"].choices = ((image.id, image),)
         del self.fields["snapshot_source"]
         del self.fields["volume_source"]
         del self.fields["volume_source_type"]
     except Exception:
         msg = _("Unable to load the specified image. %s")
         exceptions.handle(request, msg % request.GET["image_id"])
Пример #7
0
    def get_help_text(self, extra_context=None):
        extra = {} if extra_context is None else dict(extra_context)
        try:
            data = api.order.order_hypervisor(self.request,
                                              self.context['start_time'],
                                              self.context['stop_time'])
            total_restouce = data.get('total_resource', None)
            free_resource = data.get('free_resource', None)
            extra['usages'] = {
                'disk': {
                    'available':
                    free_resource.get('disk', None),
                    'used':
                    total_restouce.get('disk', None) -
                    free_resource.get('disk', None),
                    'quota':
                    total_restouce.get('disk', None),
                },
                'cores': {
                    'available':
                    free_resource.get('vcpus', None),
                    'used':
                    total_restouce.get('vcpus', None) -
                    free_resource.get('vcpus', None),
                    'quota':
                    total_restouce.get('vcpus', None),
                },
                'ram': {
                    'available':
                    free_resource.get('ram', None),
                    'used':
                    total_restouce.get('ram', None) -
                    free_resource.get('ram', None),
                    'quota':
                    total_restouce.get('ram', None),
                }
            }
            extra['usages_json'] = json.dumps(extra['usages'])
            flavors = json.dumps(
                [f._info for f in instance_utils.flavor_list(self.request)])
            extra['flavors'] = flavors
            images = image_utils.get_available_images(
                self.request, self.initial['project_id'], self._images_cache)
            if images is not None:
                attrs = [{
                    'id': i.id,
                    'min_disk': getattr(i, 'min_disk', 0),
                    'min_ram': getattr(i, 'min_ram', 0),
                    'size': functions.bytes_to_gigabytes(i.size)
                } for i in images]
                extra['images'] = json.dumps(attrs)

        except Exception:
            exceptions.handle(self.request,
                              _("Unable to retrieve quota information."))
        return super(SetInstanceDetailsAction, self).get_help_text(extra)
Пример #8
0
 def _check_volume_for_image(self, cleaned_data):
     image_id = cleaned_data.get('image_id')
     image = self._get_image(image_id)
     volume_size = cleaned_data.get('volume_size')
     if not image or not volume_size:
         return
     img_gigs = functions.bytes_to_gigabytes(image.size)
     smallest_size = max(img_gigs, image.min_disk)
     cleaned_data['volume_size'] = smallest_size
     '''
 def _check_volume_for_image(self, cleaned_data):
     image_id = cleaned_data.get('image_id')
     image = self._get_image(image_id)
     volume_size = cleaned_data.get('volume_size')
     if not image or not volume_size:
         return
     img_gigs = functions.bytes_to_gigabytes(image.size)
     smallest_size = max(img_gigs, image.min_disk)
     cleaned_data['volume_size'] = smallest_size
     '''
 def populate_image_id_choices(self, request, context):
     choices = []
     images = utils.get_available_images(request, context.get("project_id"), self._images_cache)
     for image in images:
         image.bytes = image.size
         image.volume_size = functions.bytes_to_gigabytes(image.bytes)
         choices.append((image.id, image))
     if choices:
         choices.insert(0, ("", _("Select Image")))
     else:
         choices.insert(0, ("", _("No images available")))
     return choices
Пример #11
0
 def populate_image_id_choices(self, request, context):
     choices = []
     images = utils.get_available_images(request, context.get('project_id'),
                                         self._images_cache)
     for image in images:
         image.bytes = image.size
         image.volume_size = functions.bytes_to_gigabytes(image.bytes)
         choices.append((image.id, image))
     if choices:
         choices.insert(0, ("", _("Select Image")))
     else:
         choices.insert(0, ("", _("No images available")))
     return choices
Пример #12
0
    def prepare_source_fields_default(self, request):
        source_type_choices = []
        self.fields['availability_zone'].choices = \
            availability_zones(request)

        try:
            available = api.cinder.VOLUME_STATE_AVAILABLE
            snapshots = cinder.volume_snapshot_list(
                request, search_opts=dict(status=available))
            if snapshots:
                source_type_choices.append(("snapshot_source",
                                            _("Snapshot")))
                choices = [('', _("Choose a snapshot"))] + \
                          [(s.id, s) for s in snapshots]
                self.fields['snapshot_source'].choices = choices
            else:
                del self.fields['snapshot_source']
        except Exception:
            exceptions.handle(request,
                              _("Unable to retrieve volume snapshots."))

        images = utils.get_available_images(request,
                                            request.user.tenant_id)
        if images:
            source_type_choices.append(("image_source", _("Image")))
            choices = [('', _("Choose an image"))]
            for image in images:
                image.bytes = image.size
                image.size = functions.bytes_to_gigabytes(image.bytes)
                choices.append((image.id, image))
            self.fields['image_source'].choices = choices
        else:
            del self.fields['image_source']

        volumes = self.get_volumes(request)
        if volumes:
            source_type_choices.append(("volume_source", _("Volume")))
            choices = [('', _("Choose a volume"))]
            for volume in volumes:
                choices.append((volume.id, volume))
            self.fields['volume_source'].choices = choices
        else:
            del self.fields['volume_source']

        if source_type_choices:
            choices = ([('no_source_type',
                         _("No source, empty volume"))] +
                       source_type_choices)
            self.fields['volume_source_type'].choices = choices
        else:
            del self.fields['volume_source_type']
Пример #13
0
    def prepare_source_fields_default(self, request):
        source_type_choices = []
        self.fields['availability_zone'].choices = \
            self.availability_zones(request)

        try:
            snapshot_list = cinder.volume_snapshot_list(request)
            snapshots = [s for s in snapshot_list
                         if s.status == 'available']
            if snapshots:
                source_type_choices.append(("snapshot_source",
                                            _("Snapshot")))
                choices = [('', _("Choose a snapshot"))] + \
                          [(s.id, s) for s in snapshots]
                self.fields['snapshot_source'].choices = choices
            else:
                del self.fields['snapshot_source']
        except Exception:
            exceptions.handle(request,
                              _("Unable to retrieve volume snapshots."))

        images = utils.get_available_images(request,
                                            request.user.tenant_id)
        if images:
            source_type_choices.append(("image_source", _("Image")))
            choices = [('', _("Choose an image"))]
            for image in images:
                image.bytes = image.size
                image.size = functions.bytes_to_gigabytes(image.bytes)
                choices.append((image.id, image))
            self.fields['image_source'].choices = choices
        else:
            del self.fields['image_source']

        volumes = self.get_volumes(request)
        if volumes:
            source_type_choices.append(("volume_source", _("Volume")))
            choices = [('', _("Choose a volume"))]
            for volume in volumes:
                choices.append((volume.id, volume))
            self.fields['volume_source'].choices = choices
        else:
            del self.fields['volume_source']

        if source_type_choices:
            choices = ([('no_source_type',
                         _("No source, empty volume"))] +
                       source_type_choices)
            self.fields['volume_source_type'].choices = choices
        else:
            del self.fields['volume_source_type']
Пример #14
0
 def __init__(self, request, context, *args, **kwargs):
     super(SetInstanceDetailsAction, self).__init__(request, context, *args,
                                                    **kwargs)
     choices = [("", _("Select Image"))]
     try:
         images = utils.get_available_images(request,
                                             context.get('project_id'))
         for image in images:
             image.bytes = image.size
             image.volume_size = functions.bytes_to_gigabytes(image.bytes)
             choices.append((image.id, image))
         self.fields['image_id'].choices = choices
     except Exception:
         exceptions.handle(self.request,
                           _('Unable to retrieve list of images .'))
Пример #15
0
 def populate_image_id_choices(self, request, context):
     choices = []
     images = image_utils.get_available_images(request, context.get("project_id"), self._images_cache)
     for image in images:
         image.bytes = getattr(image, "virtual_size", None) or image.size
         image.volume_size = max(image.min_disk, functions.bytes_to_gigabytes(image.bytes))
         choices.append((image.id, image))
         if context.get("image_id") == image.id and "volume_size" not in context:
             context["volume_size"] = image.volume_size
     if choices:
         choices.sort(key=lambda c: c[1].name or "")
         choices.insert(0, ("", _("Select Image")))
     else:
         choices.insert(0, ("", _("No images available")))
     return choices
Пример #16
0
 def _check_volume_for_image(self, cleaned_data):
     image_id = cleaned_data.get('image_id')
     image = self._get_image(image_id)
     volume_size = cleaned_data.get('volume_size')
     if not image or not volume_size:
         return
     volume_size = int(volume_size)
     img_gigs = functions.bytes_to_gigabytes(image.size)
     smallest_size = max(img_gigs, image.min_disk)
     if volume_size < smallest_size:
         msg = (_("The Volume size is too small for the"
                  " '%(image_name)s' image and has to be"
                  " greater than or equal to "
                  "'%(smallest_size)d' GB.") %
                {'image_name': image.name,
                 'smallest_size': smallest_size})
         self._errors['volume_size'] = self.error_class([msg])
Пример #17
0
 def populate_image_id_choices(self, request, context):
     choices = []
     try:
         images = utils.get_available_images(request,
                                             context.get('project_id'))
         for image in images:
             image.bytes = image.size
             image.volume_size = functions.bytes_to_gigabytes(image.bytes)
             choices.append((image.id, image))
     except Exception:
         exceptions.handle(self.request,
                           _('Unable to retrieve list of images .'))
     if choices:
         choices.insert(0, ("", _("Select Image")))
     else:
         choices.insert(0, ("", _("No images available")))
     return choices
Пример #18
0
 def __init__(self, request, context, *args, **kwargs):
     super(SetInstanceDetailsAction, self).__init__(request,
                                                    context,
                                                    *args,
                                                    **kwargs)
     choices = [("", _("Select Image"))]
     try:
         images = utils.get_available_images(request,
                                             context.get('project_id'))
         for image in images:
             image.bytes = image.size
             image.volume_size = functions.bytes_to_gigabytes(image.bytes)
             choices.append((image.id, image))
         self.fields['image_id'].choices = choices
     except Exception:
         exceptions.handle(self.request,
                           _('Unable to retrieve list of images .'))
Пример #19
0
    def get_help_text(self, extra_context=None):
        extra = {} if extra_context is None else dict(extra_context)
        try:
            extra['usages'] = api.nova.tenant_absolute_limits(self.request)

            for quota in cinder.tenant_quota_get(self.request,
                                                 self.request.user.tenant_id):
                if quota.name == 'gigabytes_Tier1':
                    extra['usages']['maxTotalTier1Size'] = quota.limit

            totalTier1Used = 0

            volumes = []  # needed later for getting snapshot type
            for volume in cinder.volume_list(self.request):
                if volume.volume_type == 'Tier1':
                    volumes.append(volume.id)
                    totalTier1Used += volume.size

            for snapshot in cinder.volume_snapshot_list(self.request):
                if snapshot.volume_id in volumes:
                    totalTier1Used += snapshot.size

            extra['usages']['totalTier1Used'] = totalTier1Used

            extra['usages_json'] = json.dumps(extra['usages'])

            flavors = json.dumps(
                [f._info for f in instance_utils.flavor_list(self.request)])
            extra['flavors'] = flavors
            images = image_utils.get_available_images(
                self.request, self.initial['project_id'], self._images_cache)
            if images is not None:
                attrs = [{
                    'id': i.id,
                    'min_disk': getattr(i, 'min_disk', 0),
                    'min_ram': getattr(i, 'min_ram', 0),
                    'size': functions.bytes_to_gigabytes(i.size)
                } for i in images]
                extra['images'] = json.dumps(attrs)

        except Exception:
            exceptions.handle(self.request,
                              _("Unable to retrieve quota information."))
        return super(SetInstanceDetailsAction, self).get_help_text(extra)
Пример #20
0
 def populate_image_id_choices(self, request, context):
     choices = []
     images = image_utils.get_available_images(request,
                                         context.get('project_id'),
                                         self._images_cache)
     for image in images:
         image.bytes = image.size
         image.volume_size = max(
             image.min_disk, functions.bytes_to_gigabytes(image.bytes))
         choices.append((image.id, image))
         if context.get('image_id') == image.id and \
                 'volume_size' not in context:
             context['volume_size'] = image.volume_size
     if choices:
         choices.sort(key=lambda c: c[1].name)
         choices.insert(0, ("", _("Select Image")))
     else:
         choices.insert(0, ("", _("No images available")))
     return choices
Пример #21
0
    def prepare_source_fields_default(self, request):
        source_type_choices = []
        self.fields["availability_zone"].choices = self.availability_zones(request)

        try:
            available = api.cinder.VOLUME_STATE_AVAILABLE
            snapshots = cinder.volume_snapshot_list(request, search_opts=dict(status=available))
            if snapshots:
                source_type_choices.append(("snapshot_source", _("Snapshot")))
                choices = [("", _("Choose a snapshot"))] + [(s.id, s) for s in snapshots]
                self.fields["snapshot_source"].choices = choices
            else:
                del self.fields["snapshot_source"]
        except Exception:
            exceptions.handle(request, _("Unable to retrieve volume snapshots."))

        images = utils.get_available_images(request, request.user.tenant_id)
        if images:
            source_type_choices.append(("image_source", _("Image")))
            choices = [("", _("Choose an image"))]
            for image in images:
                image.bytes = image.size
                image.size = functions.bytes_to_gigabytes(image.bytes)
                choices.append((image.id, image))
            self.fields["image_source"].choices = choices
        else:
            del self.fields["image_source"]

        volumes = self.get_volumes(request)
        if volumes:
            source_type_choices.append(("volume_source", _("Volume")))
            choices = [("", _("Choose a volume"))]
            for volume in volumes:
                choices.append((volume.id, volume))
            self.fields["volume_source"].choices = choices
        else:
            del self.fields["volume_source"]

        if source_type_choices:
            choices = [("no_source_type", _("No source, empty volume"))] + source_type_choices
            self.fields["volume_source_type"].choices = choices
        else:
            del self.fields["volume_source_type"]
Пример #22
0
 def populate_image_id_choices(self, request, context):
     choices = []
     images = image_utils.get_available_images(request,
                                               context.get('project_id'),
                                               self._images_cache)
     for image in images:
         image.bytes = getattr(image, 'virtual_size', None) or image.size
         image.volume_size = max(image.min_disk,
                                 functions.bytes_to_gigabytes(image.bytes))
         choices.append((image.id, image))
         if context.get('image_id') == image.id and \
                 'volume_size' not in context:
             context['volume_size'] = image.volume_size
     if choices:
         choices.sort(key=lambda c: c[1].name or '')
         choices.insert(0, ("", _("Select Image")))
     else:
         choices.insert(0, ("", _("No images available")))
     return choices
Пример #23
0
 def populate_image_id_choices(self, request, context):
     choices = []
     images = image_utils.get_available_images(request,
                                         context.get('project_id'),
                                         self._images_cache)
     for image in images:
         image.bytes = image.size
         image.volume_size = max(
             image.min_disk, functions.bytes_to_gigabytes(image.bytes))
         # Commit @ https://github.com/JioCloud/horizon/commit/9e3766a608da0ba2ca78bd9091308817311cd320
         # Do not show instance snapshots in image list.
         if image.properties.get('image_type', '') != 'snapshot':
             choices.append((image.id, image))
         if context.get('image_id') == image.id and \
                 'volume_size' not in context:
             context['volume_size'] = image.volume_size
     if choices:
         choices.sort(key=lambda c: c[1].name)
         choices.insert(0, ("", _("Select Image")))
     else:
         choices.insert(0, ("", _("No images available")))
     return choices
Пример #24
0
    def populate_image_id_choices(self, request, context):
        choices = []
        images = image_utils.get_available_images(request,
                                                  context.get('project_id'),
                                                  self._images_cache)

        # prepare account plan marks
        plans = dict([(plan['id'], plan) for plan in get_plans(request)])
        marks = []
        for plan_map in get_project_plan_mappings(request,
                                                  context.get('project_id')):
            plan = plans.get(plan_map['plan_id'])
            if plan:
                mark = plan.get('metadata_mark')
                if mark:
                    marks.append(mark.upper())

        for image in images:
            # filter out image by `astute_plan_mark`
            if marks:
                plan_mark = image.properties.get('astute_plan_mark')
                if plan_mark and not plan_mark.upper() in marks:
                    continue
            image.bytes = getattr(image, 'virtual_size', None) or image.size
            image.volume_size = max(image.min_disk,
                                    functions.bytes_to_gigabytes(image.bytes))
            choices.append((image.id, image))
            if context.get('image_id') == image.id and \
                    'volume_size' not in context:
                context['volume_size'] = image.volume_size
        if choices:
            #choices.sort(key=lambda c: c[1].name)
            #Converting to lowercase for sorting in alphabetical order
            choices.sort(key=lambda c: c[1].name.lower())

            choices.insert(0, ("", _("Select Image")))
        else:
            choices.insert(0, ("", _("No images available")))
        return choices
Пример #25
0
    def get_help_text(self, extra_context=None):
        extra = {} if extra_context is None else dict(extra_context)
        try:
            extra['usages'] = api.nova.tenant_absolute_limits(self.request)
            extra['usages_json'] = json.dumps(extra['usages'])
            flavors = json.dumps([f._info for f in
                                  instance_utils.flavor_list(self.request)])
            extra['flavors'] = flavors
            images = image_utils.get_available_images(
                self.request, self.initial['project_id'], self._images_cache)
            if images is not None:
                attrs = [{'id': i.id,
                          'min_disk': getattr(i, 'min_disk', 0),
                          'min_ram': getattr(i, 'min_ram', 0),
                          'size': functions.bytes_to_gigabytes(i.size)}
                         for i in images]
                extra['images'] = json.dumps(attrs)

        except Exception:
            exceptions.handle(self.request,
                              _("Unable to retrieve quota information."))
        return super(SetInstanceDetailsAction, self).get_help_text(extra)
Пример #26
0
    def get_help_text(self, extra_context=None):
        extra = extra_context or {}
        try:
            extra['usages'] = api.nova.tenant_absolute_limits(self.request)
            extra['usages_json'] = json.dumps(extra['usages'])
            flavors = json.dumps([f._info for f in
                                  instance_utils.flavor_list(self.request)])
            extra['flavors'] = flavors
            images = image_utils.get_available_images(
                self.request, self.initial['project_id'], self._images_cache)
            if images is not None:
                attrs = [{'id': i.id,
                          'min_disk': getattr(i, 'min_disk', 0),
                          'min_ram': getattr(i, 'min_ram', 0),
                          'size': functions.bytes_to_gigabytes(i.size)}
                         for i in images]
                extra['images'] = json.dumps(attrs)

        except Exception:
            exceptions.handle(self.request,
                              _("Unable to retrieve quota information."))
        return super(SetInstanceDetailsAction, self).get_help_text(extra)
Пример #27
0
    def get_help_text(self, extra_context=None):
        extra = {} if extra_context is None else dict(extra_context)
        try:
            extra["usages"] = api.nova.tenant_absolute_limits(self.request)
            extra["usages_json"] = json.dumps(extra["usages"])
            flavors = json.dumps([f._info for f in instance_utils.flavor_list(self.request)])
            extra["flavors"] = flavors
            images = image_utils.get_available_images(self.request, self.initial["project_id"], self._images_cache)
            if images is not None:
                attrs = [
                    {
                        "id": i.id,
                        "min_disk": getattr(i, "min_disk", 0),
                        "min_ram": getattr(i, "min_ram", 0),
                        "size": functions.bytes_to_gigabytes(i.size),
                    }
                    for i in images
                ]
                extra["images"] = json.dumps(attrs)

        except Exception:
            exceptions.handle(self.request, _("Unable to retrieve quota information."))
        return super(SetInstanceDetailsAction, self).get_help_text(extra)
Пример #28
0
    def handle(self, request, data):
        try:
            usages = quotas.tenant_limit_usages(self.request)
            availableGB = usages['maxTotalVolumeGigabytes'] - \
                usages['gigabytesUsed']
            availableVol = usages['maxTotalVolumes'] - usages['volumesUsed']

            snapshot_id = None
            image_id = None
            source_type = data.get('volume_source_type', None)
            if (data.get("snapshot_source", None)
                    and source_type in [None, 'snapshot_source']):
                # Create from Snapshot
                snapshot = self.get_snapshot(request, data["snapshot_source"])
                snapshot_id = snapshot.id
                if (data['size'] < snapshot.size):
                    error_message = _('The volume size cannot be less than '
                                      'the snapshot size (%sGB)' %
                                      snapshot.size)
                    raise ValidationError(error_message)
            elif (data.get("image_source", None)
                  and source_type in [None, 'image_source']):
                # Create from Snapshot
                image = self.get_image(request, data["image_source"])
                image_id = image.id
                image_size = functions.bytes_to_gigabytes(image.size)
                if (data['size'] < image_size):
                    error_message = _('The volume size cannot be less than '
                                      'the image size (%s)' %
                                      filesizeformat(image.size))
                    raise ValidationError(error_message)
            else:
                if type(data['size']) is str:
                    data['size'] = int(data['size'])

            if availableGB < data['size']:
                error_message = _('A volume of %(req)iGB cannot be created as '
                                  'you only have %(avail)iGB of your quota '
                                  'available.')
                params = {'req': data['size'], 'avail': availableGB}
                raise ValidationError(error_message % params)
            elif availableVol <= 0:
                error_message = _('You are already using all of your available'
                                  ' volumes.')
                raise ValidationError(error_message)

            metadata = {}

            volume = cinder.volume_create(request,
                                          data['size'],
                                          data['name'],
                                          data['description'],
                                          data['type'],
                                          snapshot_id=snapshot_id,
                                          image_id=image_id,
                                          metadata=metadata)
            message = _('Creating volume "%s"') % data['name']
            messages.info(request, message)
            return volume
        except ValidationError as e:
            self.api_error(e.messages[0])
            return False
        except Exception:
            exceptions.handle(request, ignore=True)
            self.api_error(_("Unable to create volume."))
            return False
Пример #29
0
    def handle(self, request, data):
        try:
            usages = quotas.tenant_limit_usages(self.request)
            availableGB = usages['maxTotalVolumeGigabytes'] - \
                usages['gigabytesUsed']
            availableVol = usages['maxTotalVolumes'] - usages['volumesUsed']

            snapshot_id = None
            image_id = None
            volume_id = None
            source_type = data.get('volume_source_type', None)
            az = data.get('availability_zone', None) or None
            if (data.get("snapshot_source", None) and
                    source_type in [None, 'snapshot_source']):
                # Create from Snapshot
                snapshot = self.get_snapshot(request,
                                             data["snapshot_source"])
                snapshot_id = snapshot.id
                if (data['size'] < snapshot.size):
                    error_message = (_('The volume size cannot be less than '
                                       'the snapshot size (%sGB)')
                                     % snapshot.size)
                    raise ValidationError(error_message)
                az = None
            elif (data.get("image_source", None) and
                  source_type in [None, 'image_source']):
                # Create from Snapshot
                image = self.get_image(request,
                                       data["image_source"])
                image_id = image.id
                image_size = functions.bytes_to_gigabytes(image.size)
                if (data['size'] < image_size):
                    error_message = (_('The volume size cannot be less than '
                                       'the image size (%s)')
                                     % filesizeformat(image.size))
                    raise ValidationError(error_message)
                properties = getattr(image, 'properties', {})
                min_disk_size = (getattr(image, 'min_disk', 0) or
                                 properties.get('min_disk', 0))
                if (min_disk_size > 0 and data['size'] < min_disk_size):
                    error_message = (_('The volume size cannot be less than '
                                       'the image minimum disk size (%sGB)')
                                     % min_disk_size)
                    raise ValidationError(error_message)
            elif (data.get("volume_source", None) and
                  source_type in [None, 'volume_source']):
                # Create from volume
                volume = self.get_volume(request, data["volume_source"])
                volume_id = volume.id

                if data['size'] < volume.size:
                    error_message = (_('The volume size cannot be less than '
                                       'the source volume size (%sGB)')
                                     % volume.size)
                    raise ValidationError(error_message)
            else:
                if type(data['size']) is str:
                    data['size'] = int(data['size'])

            if availableGB < data['size']:
                error_message = _('A volume of %(req)iGB cannot be created as '
                                  'you only have %(avail)iGB of your quota '
                                  'available.')
                params = {'req': data['size'],
                          'avail': availableGB}
                raise ValidationError(error_message % params)
            elif availableVol <= 0:
                error_message = _('You are already using all of your available'
                                  ' volumes.')
                raise ValidationError(error_message)

            metadata = {}

            volume = cinder.volume_create(request,
                                          data['size'],
                                          data['name'],
                                          data['description'],
                                          data['type'],
                                          snapshot_id=snapshot_id,
                                          image_id=image_id,
                                          metadata=metadata,
                                          availability_zone=az,
                                          source_volid=volume_id)
            message = _('Creating volume "%s"') % data['name']
            messages.info(request, message)
            return volume
        except ValidationError as e:
            self.api_error(e.messages[0])
            return False
        except Exception:
            exceptions.handle(request, ignore=True)
            self.api_error(_("Unable to create volume."))
            return False
Пример #30
0
    def clean(self):
        cleaned_data = super(SetInstanceDetailsAction, self).clean()

        count = cleaned_data.get('count', 1)
        # Prevent launching more instances than the quota allows
        usages = quotas.tenant_quota_usages(self.request)
        available_count = usages['instances']['available']
        if available_count < count:
            error_message = ungettext_lazy('The requested instance '
                                           'cannot be launched as you only '
                                           'have %(avail)i of your quota '
                                           'available. ',
                                           'The requested %(req)i instances '
                                           'cannot be launched as you only '
                                           'have %(avail)i of your quota '
                                           'available.',
                                           count)
            params = {'req': count,
                      'avail': available_count}
            raise forms.ValidationError(error_message % params)
        try:
            flavor_id = cleaned_data.get('flavor')
            # We want to retrieve details for a given flavor,
            # however flavor_list uses a memoized decorator
            # so it is used instead of flavor_get to reduce the number
            # of API calls.
            flavors = instance_utils.flavor_list(self.request)
            flavor = [x for x in flavors if x.id == flavor_id][0]
        except IndexError:
            flavor = None

        count_error = []
        # Validate cores and ram.
        available_cores = usages['cores']['available']
        if flavor and available_cores < count * flavor.vcpus:
            count_error.append(_("Cores(Available: %(avail)s, "
                                 "Requested: %(req)s)")
                    % {'avail': available_cores,
                       'req': count * flavor.vcpus})

        available_ram = usages['ram']['available']
        if flavor and available_ram < count * flavor.ram:
            count_error.append(_("RAM(Available: %(avail)s, "
                                 "Requested: %(req)s)")
                    % {'avail': available_ram,
                       'req': count * flavor.ram})

        if count_error:
            value_str = ", ".join(count_error)
            msg = (_('The requested instance cannot be launched. '
                     'The following requested resource(s) exceed '
                     'quota(s): %s.') % value_str)
            if count == 1:
                self._errors['flavor'] = self.error_class([msg])
            else:
                self._errors['count'] = self.error_class([msg])

        # Validate our instance source.
        source_type = self.data.get('source_type', None)

        if source_type in ('image_id', 'volume_image_id'):
            if source_type == 'volume_image_id':
                if not self.data.get('volume_size', None):
                    msg = _("You must set volume size")
                    self._errors['volume_size'] = self.error_class([msg])
                if not cleaned_data.get('device_name'):
                    msg = _("You must set device name")
                    self._errors['device_name'] = self.error_class([msg])
            if not cleaned_data.get('image_id'):
                msg = _("You must select an image.")
                self._errors['image_id'] = self.error_class([msg])
            else:
                # Prevents trying to launch an image needing more resources.
                try:
                    image_id = cleaned_data.get('image_id')
                    # We want to retrieve details for a given image,
                    # however get_available_images uses a cache of image list,
                    # so it is used instead of image_get to reduce the number
                    # of API calls.
                    images = image_utils.get_available_images(
                        self.request,
                        self.context.get('project_id'),
                        self._images_cache)
                    image = [x for x in images if x.id == image_id][0]
                except IndexError:
                    image = None

                if image and flavor:
                    props_mapping = (("min_ram", "ram"), ("min_disk", "disk"))
                    for iprop, fprop in props_mapping:
                        if getattr(image, iprop) > 0 and \
                                getattr(image, iprop) > getattr(flavor, fprop):
                            msg = (_("The flavor '%(flavor)s' is too small "
                                     "for requested image.\n"
                                     "Minimum requirements: "
                                     "%(min_ram)s MB of RAM and "
                                     "%(min_disk)s GB of Root Disk.") %
                                   {'flavor': flavor.name,
                                    'min_ram': image.min_ram,
                                    'min_disk': image.min_disk})
                            self._errors['image_id'] = self.error_class([msg])
                            break  # Not necessary to continue the tests.

                    volume_size = cleaned_data.get('volume_size')
                    if volume_size and source_type == 'volume_image_id':
                        volume_size = int(volume_size)
                        img_gigs = functions.bytes_to_gigabytes(image.size)
                        smallest_size = max(img_gigs, image.min_disk)
                        if volume_size < smallest_size:
                            msg = (_("The Volume size is too small for the"
                                     " '%(image_name)s' image and has to be"
                                     " greater than or equal to "
                                     "'%(smallest_size)d' GB.") %
                                   {'image_name': image.name,
                                    'smallest_size': smallest_size})
                            self._errors['volume_size'] = self.error_class(
                                [msg])

        elif source_type == 'instance_snapshot_id':
            if not cleaned_data['instance_snapshot_id']:
                msg = _("You must select a snapshot.")
                self._errors['instance_snapshot_id'] = self.error_class([msg])

        elif source_type == 'volume_id':
            if not cleaned_data.get('volume_id'):
                msg = _("You must select a volume.")
                self._errors['volume_id'] = self.error_class([msg])
            # Prevent launching multiple instances with the same volume.
            # TODO(gabriel): is it safe to launch multiple instances with
            # a snapshot since it should be cloned to new volumes?
            if count > 1:
                msg = _('Launching multiple instances is only supported for '
                        'images and instance snapshots.')
                raise forms.ValidationError(msg)

        elif source_type == 'volume_snapshot_id':
            if not cleaned_data.get('volume_snapshot_id'):
                msg = _("You must select a snapshot.")
                self._errors['volume_snapshot_id'] = self.error_class([msg])
            if not cleaned_data.get('device_name'):
                msg = _("You must set device name")
                self._errors['device_name'] = self.error_class([msg])

        return cleaned_data
Пример #31
0
    def handle(self, request, data):
        try:
            usages = quotas.tenant_quota_usages(
                self.request, targets=('volumes', 'gigabytes'))
            availableGB = usages['gigabytes']['available']
            availableVol = usages['volumes']['available']

            snapshot_id = None
            image_id = None
            volume_id = None
            source_type = data.get('volume_source_type', None)
            az = data.get('availability_zone', None) or None
            volume_type = data.get('type')

            if (data.get("snapshot_source", None) and
                    source_type in ['', None, 'snapshot_source']):
                # Create from Snapshot
                snapshot = self.get_snapshot(request,
                                             data["snapshot_source"])
                snapshot_id = snapshot.id
                if data['size'] < snapshot.size:
                    error_message = (_('The volume size cannot be less than '
                                       'the snapshot size (%sGiB)')
                                     % snapshot.size)
                    raise ValidationError(error_message)
                az = None
                volume_type = ""
            elif (data.get("image_source", None) and
                  source_type in ['', None, 'image_source']):
                # Create from Snapshot
                image = self.get_image(request,
                                       data["image_source"])
                image_id = image.id
                image_size = functions.bytes_to_gigabytes(image.size)
                if data['size'] < image_size:
                    error_message = (_('The volume size cannot be less than '
                                       'the image size (%s)')
                                     % filesizeformat(image.size))
                    raise ValidationError(error_message)
                properties = getattr(image, 'properties', {})
                min_disk_size = (getattr(image, 'min_disk', 0) or
                                 properties.get('min_disk', 0))
                if min_disk_size > 0 and data['size'] < min_disk_size:
                    error_message = (_('The volume size cannot be less than '
                                       'the image minimum disk size (%sGiB)')
                                     % min_disk_size)
                    raise ValidationError(error_message)
            elif (data.get("volume_source", None) and
                  source_type in ['', None, 'volume_source']):
                # Create from volume
                volume = self.get_volume(request, data["volume_source"])
                volume_id = volume.id

                if data['size'] < volume.size:
                    error_message = (_('The volume size cannot be less than '
                                       'the source volume size (%sGiB)')
                                     % volume.size)
                    raise ValidationError(error_message)
            else:
                if type(data['size']) is str:
                    data['size'] = int(data['size'])

            if availableGB < data['size']:
                error_message = _('A volume of %(req)iGiB cannot be created '
                                  'as you only have %(avail)iGiB of your '
                                  'quota available.')
                params = {'req': data['size'],
                          'avail': availableGB}
                raise ValidationError(error_message % params)
            elif availableVol <= 0:
                error_message = _('You are already using all of your available'
                                  ' volumes.')
                raise ValidationError(error_message)

            metadata = {}

            volume = cinder.volume_create(request,
                                          data['size'],
                                          data['name'],
                                          data['description'],
                                          volume_type,
                                          snapshot_id=snapshot_id,
                                          image_id=image_id,
                                          metadata=metadata,
                                          availability_zone=az,
                                          source_volid=volume_id,
                                          group_id=data.get('group') or None)
            message = _('Creating volume "%s"') % data['name']
            messages.info(request, message)
            return volume
        except ValidationError as e:
            self.api_error(e.messages[0])
            return False
        except Exception:
            redirect = reverse("horizon:project:volumes:index")
            exceptions.handle(request,
                              _("Unable to create volume."),
                              redirect=redirect)
Пример #32
0
    def clean(self):
        cleaned_data = super(SetInstanceDetailsAction, self).clean()

        count = cleaned_data.get("count", 1)
        # Prevent launching more instances than the quota allows
        usages = quotas.tenant_quota_usages(self.request)
        available_count = usages["instances"]["available"]
        if available_count < count:
            error_message = ungettext_lazy(
                "The requested instance "
                "cannot be launched as you only "
                "have %(avail)i of your quota "
                "available. ",
                "The requested %(req)i instances "
                "cannot be launched as you only "
                "have %(avail)i of your quota "
                "available.",
                count,
            )
            params = {"req": count, "avail": available_count}
            raise forms.ValidationError(error_message % params)

        # Validate our instance source.
        source_type = self.data.get("source_type", None)

        if source_type in ("image_id", "volume_image_id"):
            if source_type == "volume_image_id":
                if not self.data.get("volume_size", None):
                    msg = _("You must set volume size")
                    self._errors["volume_size"] = self.error_class([msg])
                if not cleaned_data.get("device_name"):
                    msg = _("You must set device name")
                    self._errors["device_name"] = self.error_class([msg])
            if not cleaned_data.get("image_id"):
                msg = _("You must select an image.")
                self._errors["image_id"] = self.error_class([msg])
            else:
                # Prevents trying to launch an image needing more resources.
                try:
                    image_id = cleaned_data.get("image_id")
                    # We want to retrieve details for a given image,
                    # however get_available_images uses a cache of image list,
                    # so it is used instead of image_get to reduce the number
                    # of API calls.
                    images = image_utils.get_available_images(
                        self.request, self.context.get("project_id"), self._images_cache
                    )
                    image = [x for x in images if x.id == image_id][0]
                except IndexError:
                    image = None

                try:
                    flavor_id = cleaned_data.get("flavor")
                    # We want to retrieve details for a given flavor,
                    # however flavor_list uses a memoized decorator
                    # so it is used instead of flavor_get to reduce the number
                    # of API calls.
                    flavors = instance_utils.flavor_list(self.request)
                    flavor = [x for x in flavors if x.id == flavor_id][0]
                except IndexError:
                    flavor = None

                if image and flavor:
                    props_mapping = (("min_ram", "ram"), ("min_disk", "disk"))
                    for iprop, fprop in props_mapping:
                        if getattr(image, iprop) > 0 and getattr(image, iprop) > getattr(flavor, fprop):
                            msg = _(
                                "The flavor '%(flavor)s' is too small "
                                "for requested image.\n"
                                "Minimum requirements: "
                                "%(min_ram)s MB of RAM and "
                                "%(min_disk)s GB of Root Disk."
                            ) % {"flavor": flavor.name, "min_ram": image.min_ram, "min_disk": image.min_disk}
                            self._errors["image_id"] = self.error_class([msg])
                            break  # Not necessary to continue the tests.

                    volume_size = cleaned_data.get("volume_size")
                    if volume_size and source_type == "volume_image_id":
                        volume_size = int(volume_size)
                        img_gigs = functions.bytes_to_gigabytes(image.size)
                        smallest_size = max(img_gigs, image.min_disk)
                        if volume_size < smallest_size:
                            msg = _(
                                "The Volume size is too small for the"
                                " '%(image_name)s' image and has to be"
                                " greater than or equal to "
                                "'%(smallest_size)d' GB."
                            ) % {"image_name": image.name, "smallest_size": smallest_size}
                            self._errors["volume_size"] = self.error_class([msg])

        elif source_type == "instance_snapshot_id":
            if not cleaned_data["instance_snapshot_id"]:
                msg = _("You must select a snapshot.")
                self._errors["instance_snapshot_id"] = self.error_class([msg])

        elif source_type == "volume_id":
            if not cleaned_data.get("volume_id"):
                msg = _("You must select a volume.")
                self._errors["volume_id"] = self.error_class([msg])
            # Prevent launching multiple instances with the same volume.
            # TODO(gabriel): is it safe to launch multiple instances with
            # a snapshot since it should be cloned to new volumes?
            if count > 1:
                msg = _("Launching multiple instances is only supported for " "images and instance snapshots.")
                raise forms.ValidationError(msg)

        elif source_type == "volume_snapshot_id":
            if not cleaned_data.get("volume_snapshot_id"):
                msg = _("You must select a snapshot.")
                self._errors["volume_snapshot_id"] = self.error_class([msg])
            if not cleaned_data.get("device_name"):
                msg = _("You must set device name")
                self._errors["device_name"] = self.error_class([msg])

        return cleaned_data
Пример #33
0
    def __init__(self, request, *args, **kwargs):
        super(CreateForm, self).__init__(request, *args, **kwargs)
        volume_types = cinder.volume_type_list(request)
        self.fields["type"].choices = [("", "")] + [(type.name, type.name) for type in volume_types]

        if "snapshot_id" in request.GET:
            try:
                snapshot = self.get_snapshot(request, request.GET["snapshot_id"])
                self.fields["name"].initial = snapshot.display_name
                self.fields["size"].initial = snapshot.size
                self.fields["snapshot_source"].choices = ((snapshot.id, snapshot),)
                try:
                    # Set the volume type from the original volume
                    orig_volume = cinder.volume_get(request, snapshot.volume_id)
                    self.fields["type"].initial = orig_volume.volume_type
                except Exception:
                    pass
                self.fields["size"].help_text = _(
                    "Volume size must be equal " "to or greater than the snapshot size (%sGB)" % snapshot.size
                )
                del self.fields["image_source"]
                del self.fields["volume_source_type"]
            except Exception:
                exceptions.handle(request, _("Unable to load the specified snapshot."))
        elif "image_id" in request.GET:
            try:
                image = self.get_image(request, request.GET["image_id"])
                image.bytes = image.size
                self.fields["name"].initial = image.name
                self.fields["size"].initial = functions.bytes_to_gigabytes(image.size)
                self.fields["image_source"].choices = ((image.id, image),)
                self.fields["size"].help_text = _(
                    "Volume size must be equal " "to or greater than the image size (%s)" % filesizeformat(image.size)
                )
                del self.fields["snapshot_source"]
                del self.fields["volume_source_type"]
            except Exception:
                msg = _("Unable to load the specified image. %s")
                exceptions.handle(request, msg % request.GET["image_id"])
        else:
            source_type_choices = []

            try:
                snapshots = cinder.volume_snapshot_list(request)
                if snapshots:
                    source_type_choices.append(("snapshot_source", _("Snapshot")))
                    choices = [("", _("Choose a snapshot"))] + [(s.id, s) for s in snapshots]
                    self.fields["snapshot_source"].choices = choices
                else:
                    del self.fields["snapshot_source"]
            except Exception:
                exceptions.handle(request, _("Unable to retrieve " "volume snapshots."))

            images = utils.get_available_images(request, request.user.tenant_id)
            if images:
                source_type_choices.append(("image_source", _("Image")))
                choices = [("", _("Choose an image"))]
                for image in images:
                    image.bytes = image.size
                    image.size = functions.bytes_to_gigabytes(image.bytes)
                    choices.append((image.id, image))
                self.fields["image_source"].choices = choices
            else:
                del self.fields["image_source"]

            if source_type_choices:
                choices = [("no_source_type", _("No source, empty volume."))] + source_type_choices
                self.fields["volume_source_type"].choices = choices
            else:
                del self.fields["volume_source_type"]
Пример #34
0
    def __init__(self, request, *args, **kwargs):
        super(CreateForm, self).__init__(request, *args, **kwargs)
        volume_types = cinder.volume_type_list(request)
        self.fields['type'].choices = [("", "")] + \
                                      [(type.name, type.name)
                                       for type in volume_types]

        # Hide the volume encryption field if the hypervisor doesn't support it
        # NOTE: as of Grizzly this is not yet supported in Nova so enabling
        # this setting will not do anything useful
        hypervisor_features = getattr(settings,
                                      "OPENSTACK_HYPERVISOR_FEATURES", {})
        can_encrypt_volumes = hypervisor_features.get("can_encrypt_volumes",
                                                      False)

        if can_encrypt_volumes:
            # TODO(laura-glendenning) get from api call in future
            encryption_options = {"LUKS": "dmcrypt LUKS"}
            self.fields['encryption'].choices = [("", "")] + \
                [(enc, display) for enc, display in encryption_options.items()]
        else:
            self.fields['encryption'].widget = forms.widgets.HiddenInput()
            self.fields['encryption'].required = False

        if ("snapshot_id" in request.GET):
            try:
                snapshot = self.get_snapshot(request,
                                             request.GET["snapshot_id"])
                self.fields['name'].initial = snapshot.display_name
                self.fields['size'].initial = snapshot.size
                self.fields['snapshot_source'].choices = ((snapshot.id,
                                                           snapshot), )
                try:
                    # Set the volume type from the original volume
                    orig_volume = cinder.volume_get(request,
                                                    snapshot.volume_id)
                    self.fields['type'].initial = orig_volume.volume_type
                except Exception:
                    pass
                self.fields['size'].help_text = _(
                    'Volume size must be equal '
                    'to or greater than the snapshot size (%sGB)' %
                    snapshot.size)
                del self.fields['image_source']
                del self.fields['volume_source_type']
            except Exception:
                exceptions.handle(request,
                                  _('Unable to load the specified snapshot.'))
        elif ('image_id' in request.GET):
            try:
                image = self.get_image(request, request.GET["image_id"])
                image.bytes = image.size
                self.fields['name'].initial = image.name
                self.fields['size'].initial = bytes_to_gigabytes(image.size)
                self.fields['image_source'].choices = ((image.id, image), )
                self.fields['size'].help_text = _(
                    'Volume size must be equal '
                    'to or greater than the image size (%s)' %
                    filesizeformat(image.size))
                del self.fields['snapshot_source']
                del self.fields['volume_source_type']
            except Exception:
                msg = _('Unable to load the specified image. %s')
                exceptions.handle(request, msg % request.GET['image_id'])
        else:
            source_type_choices = []

            try:
                snapshots = cinder.volume_snapshot_list(request)
                if snapshots:
                    source_type_choices.append(
                        ("snapshot_source", _("Snapshot")))
                    choices = [('', _("Choose a snapshot"))] + \
                              [(s.id, s) for s in snapshots]
                    self.fields['snapshot_source'].choices = choices
                else:
                    del self.fields['snapshot_source']
            except Exception:
                exceptions.handle(request,
                                  _("Unable to retrieve "
                                    "volume snapshots."))

            images = get_available_images(request, request.user.tenant_id)
            if images:
                source_type_choices.append(("image_source", _("Image")))
                choices = [('', _("Choose an image"))]
                for image in images:
                    image.bytes = image.size
                    image.size = bytes_to_gigabytes(image.bytes)
                    choices.append((image.id, image))
                self.fields['image_source'].choices = choices
            else:
                del self.fields['image_source']

            if source_type_choices:
                choices = (
                    [('no_source_type', _("No source, empty volume."))] +
                    source_type_choices)
                self.fields['volume_source_type'].choices = choices
            else:
                del self.fields['volume_source_type']
Пример #35
0
    def __init__(self, request, *args, **kwargs):
        super(CreateForm, self).__init__(request, *args, **kwargs)
        volume_types = cinder.volume_type_list(request)
        self.fields["type"].choices = [("", "")] + [(type.name, type.name) for type in volume_types]

        if "snapshot_id" in request.GET:
            try:
                snapshot = self.get_snapshot(request, request.GET["snapshot_id"])
                self.fields["name"].initial = snapshot.name
                self.fields["size"].initial = snapshot.size
                self.fields["snapshot_source"].choices = ((snapshot.id, snapshot),)
                try:
                    # Set the volume type from the original volume
                    orig_volume = cinder.volume_get(request, snapshot.volume_id)
                    self.fields["type"].initial = orig_volume.volume_type
                except Exception:
                    pass
                self.fields["size"].help_text = (
                    _("Volume size must be equal " "to or greater than the snapshot size (%sGB)") % snapshot.size
                )
                del self.fields["image_source"]
                del self.fields["volume_source"]
                del self.fields["volume_source_type"]
                del self.fields["availability_zone"]
            except Exception:
                exceptions.handle(request, _("Unable to load the specified snapshot."))
        elif "image_id" in request.GET:
            self.fields["availability_zone"].choices = self.availability_zones(request)
            try:
                image = self.get_image(request, request.GET["image_id"])
                image.bytes = image.size
                self.fields["name"].initial = image.name
                min_vol_size = functions.bytes_to_gigabytes(image.size)
                size_help_text = _(
                    "Volume size must be equal to or greater " "than the image size (%s)"
                ) % filesizeformat(image.size)
                properties = getattr(image, "properties", {})
                min_disk_size = getattr(image, "min_disk", 0) or properties.get("min_disk", 0)
                if min_disk_size > min_vol_size:
                    min_vol_size = min_disk_size
                    size_help_text = (
                        _("Volume size must be equal to or " "greater than the image minimum " "disk size (%sGB)")
                        % min_disk_size
                    )
                self.fields["size"].initial = min_vol_size
                self.fields["size"].help_text = size_help_text
                self.fields["image_source"].choices = ((image.id, image),)
                del self.fields["snapshot_source"]
                del self.fields["volume_source"]
                del self.fields["volume_source_type"]
            except Exception:
                msg = _("Unable to load the specified image. %s")
                exceptions.handle(request, msg % request.GET["image_id"])
        elif "volume_id" in request.GET:
            self.fields["availability_zone"].choices = self.availability_zones(request)
            volume = None
            try:
                volume = self.get_volume(request, request.GET["volume_id"])
            except Exception:
                msg = _("Unable to load the specified volume. %s")
                exceptions.handle(request, msg % request.GET["volume_id"])

            if volume is not None:
                self.fields["name"].initial = volume.name
                self.fields["description"].initial = volume.description
                min_vol_size = volume.size
                size_help_text = _(
                    "Volume size must be equal to or greater " "than the origin volume size (%s)"
                ) % filesizeformat(volume.size)
                self.fields["size"].initial = min_vol_size
                self.fields["size"].help_text = size_help_text
                self.fields["volume_source"].choices = ((volume.id, volume),)
                self.fields["type"].initial = volume.type
                del self.fields["snapshot_source"]
                del self.fields["image_source"]
                del self.fields["volume_source_type"]
        else:
            source_type_choices = []
            self.fields["availability_zone"].choices = self.availability_zones(request)

            try:
                snapshot_list = cinder.volume_snapshot_list(request)
                snapshots = [s for s in snapshot_list if s.status == "available"]
                if snapshots:
                    source_type_choices.append(("snapshot_source", _("Snapshot")))
                    choices = [("", _("Choose a snapshot"))] + [(s.id, s) for s in snapshots]
                    self.fields["snapshot_source"].choices = choices
                else:
                    del self.fields["snapshot_source"]
            except Exception:
                exceptions.handle(request, _("Unable to retrieve " "volume snapshots."))

            images = utils.get_available_images(request, request.user.tenant_id)
            if images:
                source_type_choices.append(("image_source", _("Image")))
                choices = [("", _("Choose an image"))]
                for image in images:
                    image.bytes = image.size
                    image.size = functions.bytes_to_gigabytes(image.bytes)
                    choices.append((image.id, image))
                self.fields["image_source"].choices = choices
            else:
                del self.fields["image_source"]

            volumes = self.get_volumes(request)
            if volumes:
                source_type_choices.append(("volume_source", _("Volume")))
                choices = [("", _("Choose a volume"))]
                for volume in volumes:
                    choices.append((volume.id, volume))
                self.fields["volume_source"].choices = choices
            else:
                del self.fields["volume_source"]

            if source_type_choices:
                choices = [("no_source_type", _("No source, empty volume"))] + source_type_choices
                self.fields["volume_source_type"].choices = choices
            else:
                del self.fields["volume_source_type"]
Пример #36
0
    def clean(self):
        cleaned_data = super(SetInstanceDetailsAction, self).clean()

        count = cleaned_data.get('count', 1)
        # Prevent launching more instances than the quota allows
        usages = quotas.tenant_quota_usages(self.request)
        available_count = usages['instances']['available']
        if available_count < count:
            error_message = ungettext_lazy(
                'The requested instance '
                'cannot be launched as you only '
                'have %(avail)i of your quota '
                'available. ', 'The requested %(req)i instances '
                'cannot be launched as you only '
                'have %(avail)i of your quota '
                'available.', count)
            params = {'req': count, 'avail': available_count}
            raise forms.ValidationError(error_message % params)
        try:
            flavor_id = cleaned_data.get('flavor')
            # We want to retrieve details for a given flavor,
            # however flavor_list uses a memoized decorator
            # so it is used instead of flavor_get to reduce the number
            # of API calls.
            flavors = instance_utils.flavor_list(self.request)
            flavor = [x for x in flavors if x.id == flavor_id][0]
        except IndexError:
            flavor = None

        count_error = []
        # Validate cores and ram.
        available_cores = usages['cores']['available']
        if flavor and available_cores < count * flavor.vcpus:
            count_error.append(
                _("Cores(Available: %(avail)s, "
                  "Requested: %(req)s)") % {
                      'avail': available_cores,
                      'req': count * flavor.vcpus
                  })

        available_ram = usages['ram']['available']
        if flavor and available_ram < count * flavor.ram:
            count_error.append(
                _("RAM(Available: %(avail)s, "
                  "Requested: %(req)s)") % {
                      'avail': available_ram,
                      'req': count * flavor.ram
                  })

        if count_error:
            value_str = ", ".join(count_error)
            msg = (_('The requested instance cannot be launched. '
                     'The following requested resource(s) exceed '
                     'quota(s): %s.') % value_str)
            if count == 1:
                self._errors['flavor'] = self.error_class([msg])
            else:
                self._errors['count'] = self.error_class([msg])

        # Validate our instance source.
        source_type = self.data.get('source_type', None)

        if source_type in ('image_id', 'volume_image_id'):
            if source_type == 'volume_image_id':
                volume_size = self.data.get('volume_size', None)
                if not volume_size:
                    msg = _("You must set volume size")
                    self._errors['volume_size'] = self.error_class([msg])
                if float(volume_size) <= 0:
                    msg = _("Volume size must be greater than 0")
                    self._errors['volume_size'] = self.error_class([msg])
                if not cleaned_data.get('device_name'):
                    msg = _("You must set device name")
                    self._errors['device_name'] = self.error_class([msg])
            if not cleaned_data.get('image_id'):
                msg = _("You must select an image.")
                self._errors['image_id'] = self.error_class([msg])
            else:
                # Prevents trying to launch an image needing more resources.
                try:
                    image_id = cleaned_data.get('image_id')
                    # We want to retrieve details for a given image,
                    # however get_available_images uses a cache of image list,
                    # so it is used instead of image_get to reduce the number
                    # of API calls.
                    images = image_utils.get_available_images(
                        self.request, self.context.get('project_id'),
                        self._images_cache)
                    image = [x for x in images if x.id == image_id][0]
                except IndexError:
                    image = None

                if image and flavor:
                    props_mapping = (("min_ram", "ram"), ("min_disk", "disk"))
                    for iprop, fprop in props_mapping:
                        if getattr(image, iprop) > 0 and \
                                getattr(image, iprop) > getattr(flavor, fprop):
                            msg = (_("The flavor '%(flavor)s' is too small "
                                     "for requested image.\n"
                                     "Minimum requirements: "
                                     "%(min_ram)s MB of RAM and "
                                     "%(min_disk)s GB of Root Disk.") % {
                                         'flavor': flavor.name,
                                         'min_ram': image.min_ram,
                                         'min_disk': image.min_disk
                                     })
                            self._errors['image_id'] = self.error_class([msg])
                            break  # Not necessary to continue the tests.

                    volume_size = cleaned_data.get('volume_size')
                    if volume_size and source_type == 'volume_image_id':
                        volume_size = int(volume_size)
                        img_gigs = functions.bytes_to_gigabytes(image.size)
                        smallest_size = max(img_gigs, image.min_disk)
                        if volume_size < smallest_size:
                            msg = (_("The Volume size is too small for the"
                                     " '%(image_name)s' image and has to be"
                                     " greater than or equal to "
                                     "'%(smallest_size)d' GB.") % {
                                         'image_name': image.name,
                                         'smallest_size': smallest_size
                                     })
                            self._errors['volume_size'] = self.error_class(
                                [msg])

        elif source_type == 'instance_snapshot_id':
            if not cleaned_data['instance_snapshot_id']:
                msg = _("You must select a snapshot.")
                self._errors['instance_snapshot_id'] = self.error_class([msg])

        elif source_type == 'volume_id':
            if not cleaned_data.get('volume_id'):
                msg = _("You must select a volume.")
                self._errors['volume_id'] = self.error_class([msg])
            # Prevent launching multiple instances with the same volume.
            # TODO(gabriel): is it safe to launch multiple instances with
            # a snapshot since it should be cloned to new volumes?
            if count > 1:
                msg = _('Launching multiple instances is only supported for '
                        'images and instance snapshots.')
                raise forms.ValidationError(msg)

        elif source_type == 'volume_snapshot_id':
            if not cleaned_data.get('volume_snapshot_id'):
                msg = _("You must select a snapshot.")
                self._errors['volume_snapshot_id'] = self.error_class([msg])
            if not cleaned_data.get('device_name'):
                msg = _("You must set device name")
                self._errors['device_name'] = self.error_class([msg])

        return cleaned_data
Пример #37
0
    def __init__(self, request, *args, **kwargs):
        super(CreateForm, self).__init__(request, *args, **kwargs)
        volume_types = cinder.volume_type_list(request)
        self.fields['type'].choices = [("", "")] + \
                                      [(type.name, type.name)
                                       for type in volume_types]

        if "snapshot_id" in request.GET:
            try:
                snapshot = self.get_snapshot(request,
                                             request.GET["snapshot_id"])
                self.fields['name'].initial = snapshot.display_name
                self.fields['size'].initial = snapshot.size
                self.fields['snapshot_source'].choices = ((snapshot.id,
                                                           snapshot),)
                try:
                    # Set the volume type from the original volume
                    orig_volume = cinder.volume_get(request,
                                                    snapshot.volume_id)
                    self.fields['type'].initial = orig_volume.volume_type
                except Exception:
                    pass
                self.fields['size'].help_text = _('Volume size must be equal '
                            'to or greater than the snapshot size (%sGB)') \
                            % snapshot.size
                del self.fields['image_source']
                del self.fields['volume_source_type']
                del self.fields['availability_zone']
            except Exception:
                exceptions.handle(request,
                                  _('Unable to load the specified snapshot.'))
        elif 'image_id' in request.GET:
            self.fields['availability_zone'].choices = \
                self.availability_zones(request)
            try:
                image = self.get_image(request,
                                       request.GET["image_id"])
                image.bytes = image.size
                self.fields['name'].initial = image.name
                min_vol_size = functions.bytes_to_gigabytes(
                    image.size)
                size_help_text = _('Volume size must be equal to or greater '
                                   'than the image size (%s)') \
                                 % filesizeformat(image.size)
                min_disk_size = getattr(image, 'min_disk', 0)
                if (min_disk_size > min_vol_size):
                    min_vol_size = min_disk_size
                    size_help_text = _('Volume size must be equal to or '
                                       'greater than the image minimum '
                                       'disk size (%sGB)') \
                                     % min_disk_size
                self.fields['size'].initial = min_vol_size
                self.fields['size'].help_text = size_help_text
                self.fields['image_source'].choices = ((image.id, image),)
                del self.fields['snapshot_source']
                del self.fields['volume_source_type']
            except Exception:
                msg = _('Unable to load the specified image. %s')
                exceptions.handle(request, msg % request.GET['image_id'])
        elif 'volume_id' in request.GET:
            self.fields['availability_zone'].choices = \
                self.availability_zones(request)
            volume = None
            try:
                volume = self.get_volume(request, request.GET["volume_id"])
            except Exception:
                msg = _('Unable to load the specified volume. %s')
                exceptions.handle(request, msg % request.GET['volume_id'])

            if volume is not None:
                self.fields['name'].initial = volume.display_name
                self.fields['description'].initial = volume.display_description
                min_vol_size = volume.size
                size_help_text = _('Volume size must be equal to or greater '
                                   'than the origin volume size (%s)') \
                                 % filesizeformat(volume.size)
                self.fields['size'].initial = min_vol_size
                self.fields['size'].help_text = size_help_text
                self.fields['volume_source'].choices = ((volume.id, volume),)
                self.fields['type'].initial = volume.type
                del self.fields['snapshot_source']
                del self.fields['image_source']
                del self.fields['volume_source_type']
        else:
            source_type_choices = []
            self.fields['availability_zone'].choices = \
                self.availability_zones(request)

            try:
                snapshot_list = cinder.volume_snapshot_list(request)
                snapshots = [s for s in snapshot_list
                              if s.status == 'available']
                if snapshots:
                    source_type_choices.append(("snapshot_source",
                                                _("Snapshot")))
                    choices = [('', _("Choose a snapshot"))] + \
                              [(s.id, s) for s in snapshots]
                    self.fields['snapshot_source'].choices = choices
                else:
                    del self.fields['snapshot_source']
            except Exception:
                exceptions.handle(request, _("Unable to retrieve "
                        "volume snapshots."))

            images = utils.get_available_images(request,
                                          request.user.tenant_id)
            if images:
                source_type_choices.append(("image_source", _("Image")))
                choices = [('', _("Choose an image"))]
                for image in images:
                    image.bytes = image.size
                    image.size = functions.bytes_to_gigabytes(image.bytes)
                    choices.append((image.id, image))
                self.fields['image_source'].choices = choices
            else:
                del self.fields['image_source']

            volumes = self.get_volumes(request)
            if volumes:
                source_type_choices.append(("volume_source", _("Volume")))
                choices = [('', _("Choose a volume"))]
                for volume in volumes:
                    choices.append((volume.id, volume))
                self.fields['volume_source'].choices = choices
            else:
                del self.fields['volume_source']

            if source_type_choices:
                choices = ([('no_source_type',
                             _("No source, empty volume"))] +
                            source_type_choices)
                self.fields['volume_source_type'].choices = choices
            else:
                del self.fields['volume_source_type']
Пример #38
0
    def handle(self, request, data):
        try:
            # FIXME(johnp): cinderclient currently returns a useless
            # error message when the quota is exceeded when trying to create
            # a volume, so we need to check for that scenario here before we
            # send it off to try and create.
            usages = quotas.tenant_quota_usages(request)

            snapshot_id = None
            image_id = None
            source_type = data.get('volume_source_type', None)
            if (data.get("snapshot_source", None) and
                  source_type in [None, 'snapshot_source']):
                # Create from Snapshot
                snapshot = self.get_snapshot(request,
                                             data["snapshot_source"])
                snapshot_id = snapshot.id
                if (data['size'] < snapshot.size):
                    error_message = _('The volume size cannot be less than '
                                      'the snapshot size (%sGB)' %
                                      snapshot.size)
                    raise ValidationError(error_message)
            elif (data.get("image_source", None) and
                  source_type in [None, 'image_source']):
                # Create from Snapshot
                image = self.get_image(request,
                                       data["image_source"])
                image_id = image.id
                image_size = bytes_to_gigabytes(image.size)
                if (data['size'] < image_size):
                    error_message = _('The volume size cannot be less than '
                                      'the image size (%s)' %
                                      filesizeformat(image.size))
                    raise ValidationError(error_message)
            else:
                if type(data['size']) is str:
                    data['size'] = int(data['size'])

            if usages['gigabytes']['available'] < data['size']:
                error_message = _('A volume of %(req)iGB cannot be created as '
                                  'you only have %(avail)iGB of your quota '
                                  'available.')
                params = {'req': data['size'],
                          'avail': usages['gigabytes']['available']}
                raise ValidationError(error_message % params)
            elif usages['volumes']['available'] <= 0:
                error_message = _('You are already using all of your available'
                                  ' volumes.')
                raise ValidationError(error_message)

            metadata = {}

            if data['encryption']:
                metadata['encryption'] = data['encryption']

            volume = cinder.volume_create(request,
                                          data['size'],
                                          data['name'],
                                          data['description'],
                                          data['type'],
                                          snapshot_id=snapshot_id,
                                          image_id=image_id,
                                          metadata=metadata)
            message = 'Creating volume "%s"' % data['name']
            messages.info(request, message)
            return volume
        except ValidationError, e:
            self.api_error(e.messages[0])
            return False
Пример #39
0
    def __init__(self, request, *args, **kwargs):
        super(CreateForm, self).__init__(request, *args, **kwargs)
        volume_types = cinder.volume_type_list(request)
        self.fields['type'].choices = [("", "")] + \
                                      [(type.name, type.name)
                                       for type in volume_types]

        if ("snapshot_id" in request.GET):
            try:
                snapshot = self.get_snapshot(request,
                                             request.GET["snapshot_id"])
                self.fields['name'].initial = snapshot.display_name
                self.fields['size'].initial = snapshot.size
                self.fields['snapshot_source'].choices = ((snapshot.id,
                                                           snapshot), )
                try:
                    # Set the volume type from the original volume
                    orig_volume = cinder.volume_get(request,
                                                    snapshot.volume_id)
                    self.fields['type'].initial = orig_volume.volume_type
                except Exception:
                    pass
                self.fields['size'].help_text = _(
                    'Volume size must be equal '
                    'to or greater than the snapshot size (%sGB)' %
                    snapshot.size)
                del self.fields['image_source']
                del self.fields['volume_source_type']
            except Exception:
                exceptions.handle(request,
                                  _('Unable to load the specified snapshot.'))
        elif ('image_id' in request.GET):
            try:
                image = self.get_image(request, request.GET["image_id"])
                image.bytes = image.size
                self.fields['name'].initial = image.name
                self.fields['size'].initial = functions.bytes_to_gigabytes(
                    image.size)
                self.fields['image_source'].choices = ((image.id, image), )
                self.fields['size'].help_text = _(
                    'Volume size must be equal '
                    'to or greater than the image size (%s)' %
                    filesizeformat(image.size))
                del self.fields['snapshot_source']
                del self.fields['volume_source_type']
            except Exception:
                msg = _('Unable to load the specified image. %s')
                exceptions.handle(request, msg % request.GET['image_id'])
        else:
            source_type_choices = []

            try:
                snapshots = cinder.volume_snapshot_list(request)
                if snapshots:
                    source_type_choices.append(
                        ("snapshot_source", _("Snapshot")))
                    choices = [('', _("Choose a snapshot"))] + \
                              [(s.id, s) for s in snapshots]
                    self.fields['snapshot_source'].choices = choices
                else:
                    del self.fields['snapshot_source']
            except Exception:
                exceptions.handle(request,
                                  _("Unable to retrieve "
                                    "volume snapshots."))

            images = utils.get_available_images(request,
                                                request.user.tenant_id)
            if images:
                source_type_choices.append(("image_source", _("Image")))
                choices = [('', _("Choose an image"))]
                for image in images:
                    image.bytes = image.size
                    image.size = functions.bytes_to_gigabytes(image.bytes)
                    choices.append((image.id, image))
                self.fields['image_source'].choices = choices
            else:
                del self.fields['image_source']

            if source_type_choices:
                choices = (
                    [('no_source_type', _("No source, empty volume."))] +
                    source_type_choices)
                self.fields['volume_source_type'].choices = choices
            else:
                del self.fields['volume_source_type']
Пример #40
0
    def handle(self, request, data):
        try:
            usages = quotas.tenant_limit_usages(self.request)
            availableGB = usages["maxTotalVolumeGigabytes"] - usages["gigabytesUsed"]
            availableVol = usages["maxTotalVolumes"] - usages["volumesUsed"]

            snapshot_id = None
            image_id = None
            source_type = data.get("volume_source_type", None)
            if data.get("snapshot_source", None) and source_type in [None, "snapshot_source"]:
                # Create from Snapshot
                snapshot = self.get_snapshot(request, data["snapshot_source"])
                snapshot_id = snapshot.id
                if data["size"] < snapshot.size:
                    error_message = _("The volume size cannot be less than " "the snapshot size (%sGB)" % snapshot.size)
                    raise ValidationError(error_message)
            elif data.get("image_source", None) and source_type in [None, "image_source"]:
                # Create from Snapshot
                image = self.get_image(request, data["image_source"])
                image_id = image.id
                image_size = functions.bytes_to_gigabytes(image.size)
                if data["size"] < image_size:
                    error_message = _(
                        "The volume size cannot be less than " "the image size (%s)" % filesizeformat(image.size)
                    )
                    raise ValidationError(error_message)
            else:
                if type(data["size"]) is str:
                    data["size"] = int(data["size"])

            if availableGB < data["size"]:
                error_message = _(
                    "A volume of %(req)iGB cannot be created as "
                    "you only have %(avail)iGB of your quota "
                    "available."
                )
                params = {"req": data["size"], "avail": availableGB}
                raise ValidationError(error_message % params)
            elif availableVol <= 0:
                error_message = _("You are already using all of your available" " volumes.")
                raise ValidationError(error_message)

            metadata = {}

            volume = cinder.volume_create(
                request,
                data["size"],
                data["name"],
                data["description"],
                data["type"],
                snapshot_id=snapshot_id,
                image_id=image_id,
                metadata=metadata,
            )
            message = _('Creating volume "%s"') % data["name"]
            messages.info(request, message)
            return volume
        except ValidationError as e:
            self.api_error(e.messages[0])
            return False
        except Exception:
            exceptions.handle(request, ignore=True)
            self.api_error(_("Unable to create volume."))
            return False
Пример #41
0
    def handle(self, request, data):
        try:
            # FIXME(johnp): cinderclient currently returns a useless
            # error message when the quota is exceeded when trying to create
            # a volume, so we need to check for that scenario here before we
            # send it off to try and create.
            usages = quotas.tenant_quota_usages(request)

            snapshot_id = None
            image_id = None
            source_type = data.get('volume_source_type', None)
            if (data.get("snapshot_source", None)
                    and source_type in [None, 'snapshot_source']):
                # Create from Snapshot
                snapshot = self.get_snapshot(request, data["snapshot_source"])
                snapshot_id = snapshot.id
                if (data['size'] < snapshot.size):
                    error_message = _('The volume size cannot be less than '
                                      'the snapshot size (%sGB)' %
                                      snapshot.size)
                    raise ValidationError(error_message)
            elif (data.get("image_source", None)
                  and source_type in [None, 'image_source']):
                # Create from Snapshot
                image = self.get_image(request, data["image_source"])
                image_id = image.id
                image_size = bytes_to_gigabytes(image.size)
                if (data['size'] < image_size):
                    error_message = _('The volume size cannot be less than '
                                      'the image size (%s)' %
                                      filesizeformat(image.size))
                    raise ValidationError(error_message)
            else:
                if type(data['size']) is str:
                    data['size'] = int(data['size'])

            if usages['gigabytes']['available'] < data['size']:
                error_message = _('A volume of %(req)iGB cannot be created as '
                                  'you only have %(avail)iGB of your quota '
                                  'available.')
                params = {
                    'req': data['size'],
                    'avail': usages['gigabytes']['available']
                }
                raise ValidationError(error_message % params)
            elif usages['volumes']['available'] <= 0:
                error_message = _('You are already using all of your available'
                                  ' volumes.')
                raise ValidationError(error_message)

            metadata = {}

            if data['encryption']:
                metadata['encryption'] = data['encryption']

            volume = cinder.volume_create(request,
                                          data['size'],
                                          data['name'],
                                          data['description'],
                                          data['type'],
                                          snapshot_id=snapshot_id,
                                          image_id=image_id,
                                          metadata=metadata)
            message = 'Creating volume "%s"' % data['name']
            messages.info(request, message)
            return volume
        except ValidationError, e:
            self.api_error(e.messages[0])
            return False
Пример #42
0
    def handle(self, request, data):
        try:
            # FIXME(johnp): cinderclient currently returns a useless
            # error message when the quota is exceeded when trying to create
            # a volume, so we need to check for that scenario here before we
            # send it off to try and create.
            usages = cinder.tenant_absolute_limits(self.request)
            volumes = cinder.volume_list(self.request)
            total_size = sum(
                [getattr(volume, 'size', 0) for volume in volumes])
            usages['gigabytesUsed'] = total_size
            usages['volumesUsed'] = len(volumes)
            availableGB = usages['maxTotalVolumeGigabytes'] -\
                usages['gigabytesUsed']
            availableVol = usages['maxTotalVolumes'] - usages['volumesUsed']

            snapshot_id = None
            image_id = None
            source_type = data.get('volume_source_type', None)
            if (data.get("snapshot_source", None)
                    and source_type in [None, 'snapshot_source']):
                # Create from Snapshot
                snapshot = self.get_snapshot(request, data["snapshot_source"])
                snapshot_id = snapshot.id
                if (data['size'] < snapshot.size):
                    error_message = _('The volume size cannot be less than '
                                      'the snapshot size (%sGB)' %
                                      snapshot.size)
                    raise ValidationError(error_message)
            elif (data.get("image_source", None)
                  and source_type in [None, 'image_source']):
                # Create from Snapshot
                image = self.get_image(request, data["image_source"])
                image_id = image.id
                image_size = bytes_to_gigabytes(image.size)
                if (data['size'] < image_size):
                    error_message = _('The volume size cannot be less than '
                                      'the image size (%s)' %
                                      filesizeformat(image.size))
                    raise ValidationError(error_message)
            else:
                if type(data['size']) is str:
                    data['size'] = int(data['size'])

            if availableGB < data['size']:
                error_message = _('A volume of %(req)iGB cannot be created as '
                                  'you only have %(avail)iGB of your quota '
                                  'available.')
                params = {'req': data['size'], 'avail': availableGB}
                raise ValidationError(error_message % params)
            elif availableVol <= 0:
                error_message = _('You are already using all of your available'
                                  ' volumes.')
                raise ValidationError(error_message)

            metadata = {}

            if data['encryption']:
                metadata['encryption'] = data['encryption']

            volume = cinder.volume_create(request,
                                          data['size'],
                                          data['name'],
                                          data['description'],
                                          data['type'],
                                          snapshot_id=snapshot_id,
                                          image_id=image_id,
                                          metadata=metadata)
            message = _('Creating volume "%s"') % data['name']
            messages.info(request, message)
            return volume
        except ValidationError as e:
            self.api_error(e.messages[0])
            return False
        except:
            exceptions.handle(request, ignore=True)
            self.api_error(_("Unable to create volume."))
            return False
Пример #43
0
    def __init__(self, request, *args, **kwargs):
        super(CreateForm, self).__init__(request, *args, **kwargs)
        volume_types = cinder.volume_type_list(request)
        self.fields['type'].choices = [("", _("No volume type"))] + \
                                      [(type.name, type.name)
                                       for type in volume_types]

        if "snapshot_id" in request.GET:
            try:
                snapshot = self.get_snapshot(request,
                                             request.GET["snapshot_id"])
                self.fields['name'].initial = snapshot.name
                self.fields['size'].initial = snapshot.size
                self.fields['snapshot_source'].choices = ((snapshot.id,
                                                           snapshot),)
                try:
                    # Set the volume type from the original volume
                    orig_volume = cinder.volume_get(request,
                                                    snapshot.volume_id)
                    self.fields['type'].initial = orig_volume.volume_type
                except Exception:
                    pass
                self.fields['size'].help_text = _('Volume size must be equal '
                            'to or greater than the snapshot size (%sGB)') \
                            % snapshot.size
                del self.fields['image_source']
                del self.fields['volume_source']
                del self.fields['volume_source_type']
                del self.fields['availability_zone']
            except Exception:
                exceptions.handle(request,
                                  _('Unable to load the specified snapshot.'))
        elif 'image_id' in request.GET:
            self.fields['availability_zone'].choices = \
                self.availability_zones(request)
            try:
                image = self.get_image(request,
                                       request.GET["image_id"])
                image.bytes = image.size
                self.fields['name'].initial = image.name
                min_vol_size = functions.bytes_to_gigabytes(
                    image.size)
                size_help_text = _('Volume size must be equal to or greater '
                                   'than the image size (%s)') \
                                 % filesizeformat(image.size)
                min_disk_size = getattr(image, 'min_disk', 0)
                if (min_disk_size > min_vol_size):
                    min_vol_size = min_disk_size
                    size_help_text = _('Volume size must be equal to or '
                                       'greater than the image minimum '
                                       'disk size (%sGB)') \
                                     % min_disk_size
                self.fields['size'].initial = min_vol_size
                self.fields['size'].help_text = size_help_text
                self.fields['image_source'].choices = ((image.id, image),)
                del self.fields['snapshot_source']
                del self.fields['volume_source']
                del self.fields['volume_source_type']
            except Exception:
                msg = _('Unable to load the specified image. %s')
                exceptions.handle(request, msg % request.GET['image_id'])
        elif 'volume_id' in request.GET:
            self.fields['availability_zone'].choices = \
                self.availability_zones(request)
            volume = None
            try:
                volume = self.get_volume(request, request.GET["volume_id"])
            except Exception:
                msg = _('Unable to load the specified volume. %s')
                exceptions.handle(request, msg % request.GET['volume_id'])

            if volume is not None:
                self.fields['name'].initial = volume.name
                self.fields['description'].initial = volume.description
                min_vol_size = volume.size
                size_help_text = _('Volume size must be equal to or greater '
                                   'than the origin volume size (%s)') \
                                 % filesizeformat(volume.size)
                self.fields['size'].initial = min_vol_size
                self.fields['size'].help_text = size_help_text
                self.fields['volume_source'].choices = ((volume.id, volume),)
                self.fields['type'].initial = volume.type
                del self.fields['snapshot_source']
                del self.fields['image_source']
                del self.fields['volume_source_type']
        else:
            source_type_choices = []
            self.fields['availability_zone'].choices = \
                self.availability_zones(request)

            try:
                snapshot_list = cinder.volume_snapshot_list(request)
                snapshots = [s for s in snapshot_list
                              if s.status == 'available']
                if snapshots:
                    source_type_choices.append(("snapshot_source",
                                                _("Snapshot")))
                    choices = [('', _("Choose a snapshot"))] + \
                              [(s.id, s) for s in snapshots]
                    self.fields['snapshot_source'].choices = choices
                else:
                    del self.fields['snapshot_source']
            except Exception:
                exceptions.handle(request, _("Unable to retrieve "
                        "volume snapshots."))

            images = utils.get_available_images(request,
                                          request.user.tenant_id)
            if images:
                source_type_choices.append(("image_source", _("Image")))
                choices = [('', _("Choose an image"))]
                for image in images:
                    image.bytes = image.size
                    image.size = functions.bytes_to_gigabytes(image.bytes)
                    choices.append((image.id, image))
                self.fields['image_source'].choices = choices
            else:
                del self.fields['image_source']

            volumes = self.get_volumes(request)
            if volumes:
                source_type_choices.append(("volume_source", _("Volume")))
                choices = [('', _("Choose a volume"))]
                for volume in volumes:
                    choices.append((volume.id, volume))
                self.fields['volume_source'].choices = choices
            else:
                del self.fields['volume_source']

            if source_type_choices:
                choices = ([('no_source_type',
                             _("No source, empty volume"))] +
                            source_type_choices)
                self.fields['volume_source_type'].choices = choices
            else:
                del self.fields['volume_source_type']
Пример #44
0
    def handle(self, request, data):
        try:
            usages = quotas.tenant_quota_usages(
                self.request, targets=('volumes', 'gigabytes'))
            availableGB = usages['gigabytes']['available']
            availableVol = usages['volumes']['available']

            snapshot_id = None
            image_id = None
            volume_id = None
            source_type = data.get('volume_source_type', None)
            az = data.get('availability_zone', None) or None
            volume_type = data.get('type')

            if (data.get("snapshot_source", None) and
                    source_type in ['', None, 'snapshot_source']):
                # Create from Snapshot
                snapshot = self.get_snapshot(request,
                                             data["snapshot_source"])
                snapshot_id = snapshot.id
                if data['size'] < snapshot.size:
                    error_message = (_('The volume size cannot be less than '
                                       'the snapshot size (%sGiB)')
                                     % snapshot.size)
                    raise ValidationError(error_message)
                az = None
                volume_type = ""
            elif (data.get("image_source", None) and
                  source_type in ['', None, 'image_source']):
                # Create from Snapshot
                image = self.get_image(request,
                                       data["image_source"])
                image_id = image.id
                image_size = functions.bytes_to_gigabytes(image.size)
                if data['size'] < image_size:
                    error_message = (_('The volume size cannot be less than '
                                       'the image size (%s)')
                                     % filesizeformat(image.size))
                    raise ValidationError(error_message)
                properties = getattr(image, 'properties', {})
                min_disk_size = (getattr(image, 'min_disk', 0) or
                                 properties.get('min_disk', 0))
                if min_disk_size > 0 and data['size'] < min_disk_size:
                    error_message = (_('The volume size cannot be less than '
                                       'the image minimum disk size (%sGiB)')
                                     % min_disk_size)
                    raise ValidationError(error_message)
            elif (data.get("volume_source", None) and
                  source_type in ['', None, 'volume_source']):
                # Create from volume
                volume = self.get_volume(request, data["volume_source"])
                volume_id = volume.id

                if data['size'] < volume.size:
                    error_message = (_('The volume size cannot be less than '
                                       'the source volume size (%sGiB)')
                                     % volume.size)
                    raise ValidationError(error_message)
            else:
                if type(data['size']) is str:
                    data['size'] = int(data['size'])

            if availableGB < data['size']:
                error_message = _('A volume of %(req)iGiB cannot be created '
                                  'as you only have %(avail)iGiB of your '
                                  'quota available.')
                params = {'req': data['size'],
                          'avail': availableGB}
                raise ValidationError(error_message % params)
            elif availableVol <= 0:
                error_message = _('You are already using all of your available'
                                  ' volumes.')
                raise ValidationError(error_message)

            metadata = {}

            volume = cinder.volume_create(request,
                                          data['size'],
                                          data['name'],
                                          data['description'],
                                          volume_type,
                                          snapshot_id=snapshot_id,
                                          image_id=image_id,
                                          metadata=metadata,
                                          availability_zone=az,
                                          source_volid=volume_id,
                                          group_id=data.get('group') or None)
            message = _('Creating volume "%s"') % volume.name
            messages.info(request, message)
            return volume
        except ValidationError as e:
            self.api_error(e.messages[0])
            return False
        except Exception:
            redirect = reverse("horizon:project:volumes:index")
            exceptions.handle(request,
                              _("Unable to create volume."),
                              redirect=redirect)
Пример #45
0
    def handle(self, request, data):
        # operation log
        resource_type = None
        resource_name = None

        if data.get("image_source", None):
            resource_type = 'image'
            resource_name = 'Image'
        else:
            resource_type = 'volume'
            resource_name = 'Volume'

        try:
            usages = quotas.tenant_limit_usages(self.request)
            availableGB = usages['maxTotalVolumeGigabytes'] - \
                usages['gigabytesUsed']
            availableVol = usages['maxTotalVolumes'] - usages['volumesUsed']

            snapshot_id = None
            image_id = None
            volume_id = None
            source_type = data.get('volume_source_type', None)
            az = data.get('availability_zone', None) or None
            if (data.get("snapshot_source", None)
                    and source_type in [None, 'snapshot_source']):
                # Create from Snapshot
                snapshot = self.get_snapshot(request, data["snapshot_source"])
                snapshot_id = snapshot.id
                if (data['size'] < snapshot.size):
                    error_message = (_('The volume size cannot be less than '
                                       'the snapshot size (%sGB)') %
                                     snapshot.size)
                    raise ValidationError(error_message)
                az = None
            elif (data.get("image_source", None)
                  and source_type in [None, 'image_source']):
                # Create from Snapshot
                image = self.get_image(request, data["image_source"])
                image_id = image.id
                image_size = functions.bytes_to_gigabytes(image.size)
                if (data['size'] < image_size):
                    error_message = (_('The volume size cannot be less than '
                                       'the image size (%s)') %
                                     filesizeformat(image.size))
                    raise ValidationError(error_message)
                properties = getattr(image, 'properties', {})
                min_disk_size = (getattr(image, 'min_disk', 0)
                                 or properties.get('min_disk', 0))
                if (min_disk_size > 0 and data['size'] < min_disk_size):
                    error_message = (_('The volume size cannot be less than '
                                       'the image minimum disk size (%sGB)') %
                                     min_disk_size)
                    raise ValidationError(error_message)
            elif (data.get("volume_source", None)
                  and source_type in [None, 'volume_source']):
                # Create from volume
                volume = self.get_volume(request, data["volume_source"])
                volume_id = volume.id

                if data['size'] < volume.size:
                    error_message = (_('The volume size cannot be less than '
                                       'the source volume size (%sGB)') %
                                     volume.size)
                    raise ValidationError(error_message)
            else:
                if type(data['size']) is str:
                    data['size'] = int(data['size'])

            if availableGB < data['size']:
                error_message = _('A volume of %(req)iGB cannot be created as '
                                  'you only have %(avail)iGB of your quota '
                                  'available.')
                params = {'req': data['size'], 'avail': availableGB}
                raise ValidationError(error_message % params)
            elif availableVol <= 0:
                error_message = _('You are already using all of your available'
                                  ' volumes.')
                raise ValidationError(error_message)

            metadata = {}
            for i in range(data['quantity']):
                volume = cinder.volume_create(request,
                                              data['size'],
                                              data['name'],
                                              data['description'],
                                              data['type'],
                                              snapshot_id=snapshot_id,
                                              image_id=image_id,
                                              metadata=metadata,
                                              availability_zone=az,
                                              source_volid=volume_id)
            message = _('Creating volume "%s"') % data['name']
            messages.info(request, message)

            # operation log
            config = _(
                "Volume Name: %s Volume Count: %s Volume Size: %sG Volume Type: %s"
            ) % (data.get('name', ''), str(data['quantity']), str(
                data['size']), data['type'])
            api.logger.Logger(request).create(resource_type=resource_type,
                                              action_name='Create Volume',
                                              resource_name=resource_name,
                                              config=config,
                                              status='Success')
            return volume
        except ValidationError as e:
            self.api_error(e.messages[0])

            # operation log
            api.logger.Logger(request).create(resource_type=resource_type,
                                              action_name='Create Volume',
                                              resource_name=resource_name,
                                              config='',
                                              status='Error')

            return False
        except Exception:
            redirect = reverse("horizon:storage:volumes:index")
            exceptions.handle(request,
                              _("Unable to create volume."),
                              redirect=redirect)
            # operation log
            api.logger.Logger(request).create(resource_type=resource_type,
                                              action_name='Create Volume',
                                              resource_name=resource_name,
                                              config='',
                                              status='Error')
Пример #46
0
    def create_volume(self, request, ticket):
        data = json.loads(ticket.context)
        admin_id = request.user.tenant_id

        self.add_role(request, ticket)

        # code refrence project/volumes/volumes/forms.py
        usages = quotas.tenant_quota_usages(request, ticket.project_id)
        # TODO(xuanmingyi) must test
        availableGB = usages['gigabytes']['available']
        availableVol = usages['volumes']['available']

        snapshot_id = None
        image_id = None
        volume_id = None
        source_type = data.get('volume_source_type', None)
        az = data.get('available_zone', None) or None
        if (data.get("snapshot_source", None) and
                source_type in [None, 'snapshot_source']):
            # Create from Snapshot
            # TODO(xuanmingyi) why?
            auth_views.switch(request, ticket.project_id)
            snapshot = animbus_cinder.volume_snapshot_get(
                request,
                data["snapshot_source"])
            auth_views.switch(request, admin_id)
            snapshot_id = snapshot.id
            if (data['size'] < snapshot.size):
                error_message = _('The volume size cannot be less than '
                                  'the snapshot size (%sGB)') % snapshot.size
                raise ValidationError(error_message)
            az = None
        elif (data.get("image_source", None) and
                source_type in [None, "image_source"]):
            image = glance.image_get(request,
                                     data["image_source"])
            image_id = image.id
            image_size = functions.bytes_to_gigabytes(
                image.size)
            if (data['size'] < image_size):
                error_message = _(
                    'The volume size cannot be less than '
                    'the image size (%s)') % filesizeformat(image.size)
                raise ValidationError(error_message)
            properties = getattr(image, 'properties', {})
            min_disk_size = (getattr(image, 'min_disk', 0) or
                             properties.get('min_disk', 0))
            if (min_disk_size > 0 and data['size'] < min_disk_size):
                error_message = _(
                    'The volume size cannot be less than '
                    'the image minimum disk size (%sGB)') % min_disk_size
                raise ValidationError(error_message)
        elif (data.get("volume_source", None) and
              source_type in [None, 'volume_source']):
            auth_views.switch(request, ticket.project_id)
            volume = animbus_cinder.volume_get(request, data["volume_source"])
            auth_views.switch(request, admin_id)
            volume_id = volume.id

            if data['size'] < volume.size:
                error_message = _(
                    'The volume size cannot be less than '
                    'the source volume size (%sGB)') % volume.size
                raise ValidationError(error_message)
        else:
            if type(data['size']) is str:
                data['size'] = int(data['size'])

        if availableGB < data['size']:
            error_message = _('A volume of %(req)iGB cannot be created as '
                              'you only have %(avail)iGB of your quota '
                              'available.')
            params = {'req': data['size'],
                      'avail': availableGB}
            raise ValidationError(error_message, params)
        elif availableVol <= 0:
            error_message = _('You are already using all of your available'
                              ' volumes.')
            raise ValidationError(error_message)
        auth_views.switch(request, ticket.project_id)

        volume = animbus_cinder.volume_create(request,
                                              data['size'],
                                              data['name'],
                                              data['description'],
                                              data['type'],
                                              snapshot_id=snapshot_id,
                                              image_id=image_id,
                                              metadata={},
                                              availability_zone=az,
                                              source_volid=volume_id,
                                              project_id=ticket.project_id)

        auth_views.switch(request, admin_id)
Пример #47
0
    def handle(self, request, data):
        try:
            usages = cinder.tenant_absolute_limits(self.request)
            volumes = cinder.volume_list(self.request)
            total_size = sum([getattr(volume, 'size', 0) for volume
                              in volumes])
            usages['gigabytesUsed'] = total_size
            usages['volumesUsed'] = len(volumes)
            availableGB = usages['maxTotalVolumeGigabytes'] -\
                usages['gigabytesUsed']
            availableVol = usages['maxTotalVolumes'] - usages['volumesUsed']

            snapshot_id = None
            image_id = None
            source_type = data.get('volume_source_type', None)
            if (data.get("snapshot_source", None) and
                  source_type in [None, 'snapshot_source']):
                # Create from Snapshot
                snapshot = self.get_snapshot(request,
                                             data["snapshot_source"])
                snapshot_id = snapshot.id
                if (data['size'] < snapshot.size):
                    error_message = _('The volume size cannot be less than '
                                      'the snapshot size (%sGB)' %
                                      snapshot.size)
                    raise ValidationError(error_message)
            elif (data.get("image_source", None) and
                  source_type in [None, 'image_source']):
                # Create from Snapshot
                image = self.get_image(request,
                                       data["image_source"])
                image_id = image.id
                image_size = functions.bytes_to_gigabytes(image.size)
                if (data['size'] < image_size):
                    error_message = _('The volume size cannot be less than '
                                      'the image size (%s)' %
                                      filesizeformat(image.size))
                    raise ValidationError(error_message)
            else:
                if type(data['size']) is str:
                    data['size'] = int(data['size'])

            if availableGB < data['size']:
                error_message = _('A volume of %(req)iGB cannot be created as '
                                  'you only have %(avail)iGB of your quota '
                                  'available.')
                params = {'req': data['size'],
                          'avail': availableGB}
                raise ValidationError(error_message % params)
            elif availableVol <= 0:
                error_message = _('You are already using all of your available'
                                  ' volumes.')
                raise ValidationError(error_message)

            metadata = {}

            volume = cinder.volume_create(request,
                                          data['size'],
                                          data['name'],
                                          data['description'],
                                          data['type'],
                                          snapshot_id=snapshot_id,
                                          image_id=image_id,
                                          metadata=metadata)
            message = _('Creating volume "%s"') % data['name']
            messages.info(request, message)
            return volume
        except ValidationError as e:
            self.api_error(e.messages[0])
            return False
        except Exception:
            exceptions.handle(request, ignore=True)
            self.api_error(_("Unable to create volume."))
            return False
Пример #48
0
    def handle(self, request, data):
        try:
            usages = quotas.tenant_limit_usages(self.request)
            availableGB = usages['maxTotalVolumeGigabytes'] - \
                usages['gigabytesUsed']
            availableVol = usages['maxTotalVolumes'] - usages['volumesUsed']

            snapshot_id = None
            image_id = None
            volume_id = None
            source_type = data.get('volume_source_type', None)
            az = data.get('availability_zone', None) or None
            if (data.get("snapshot_source", None)
                    and source_type in ['', None, 'snapshot_source']):
                # Create from Snapshot
                snapshot = self.get_snapshot(request, data["snapshot_source"])
                snapshot_id = snapshot.id
                if (data['size'] < snapshot.size):
                    error_message = (_('The volume size cannot be less than '
                                       'the snapshot size (%sGB)') %
                                     snapshot.size)
                    raise ValidationError(error_message)
                az = None
            elif (data.get("image_source", None)
                  and source_type in ['', None, 'image_source']):
                # Create from Snapshot
                image = self.get_image(request, data["image_source"])
                image_id = image.id
                image_size = functions.bytes_to_gigabytes(image.size)
                if (data['size'] < image_size):
                    error_message = (_('The volume size cannot be less than '
                                       'the image size (%s)') %
                                     filesizeformat(image.size))
                    raise ValidationError(error_message)
                properties = getattr(image, 'properties', {})
                min_disk_size = (getattr(image, 'min_disk', 0)
                                 or properties.get('min_disk', 0))
                if (min_disk_size > 0 and data['size'] < min_disk_size):
                    error_message = (_('The volume size cannot be less than '
                                       'the image minimum disk size (%sGB)') %
                                     min_disk_size)
                    raise ValidationError(error_message)
            elif (data.get("volume_source", None)
                  and source_type in ['', None, 'volume_source']):
                # Create from volume
                volume = self.get_volume(request, data["volume_source"])
                volume_id = volume.id

                if data['size'] < volume.size:
                    error_message = (_('The volume size cannot be less than '
                                       'the source volume size (%sGB)') %
                                     volume.size)
                    raise ValidationError(error_message)
            else:
                if type(data['size']) is str:
                    data['size'] = int(data['size'])

            if availableGB < data['size']:
                error_message = _('A volume of %(req)iGB cannot be created as '
                                  'you only have %(avail)iGB of your quota '
                                  'available.')
                params = {'req': data['size'], 'avail': availableGB}
                raise ValidationError(error_message % params)
            elif availableVol <= 0:
                error_message = _('You are already using all of your available'
                                  ' volumes.')
                raise ValidationError(error_message)

            metadata = {}

            if data['type'] == 'no_type':
                data['type'] = ''

            user_vol_total = cinder.volume_list(request)

            if len(user_vol_total) >= USER_QUOTA:
                msg = _(
                    'As per Expostack policy, only %s volumes are allowed per user in a perticular Project.'
                    'Please contact [email protected] for any queries.'
                ) % USER_QUOTA
                raise ValidationError(msg)

            if data['size'] > VOLUME_SIZE_LIMIT:
                msg = _(
                    'As per Expostack policy Volume size cannot be more than %s GB.'
                    'Please contact [email protected] for any queries.'
                ) % VOLUME_SIZE_LIMIT
                raise ValidationError(msg)

            volume = cinder.volume_create(request,
                                          data['size'],
                                          data['name'],
                                          data['description'],
                                          data['type'],
                                          snapshot_id=snapshot_id,
                                          image_id=image_id,
                                          metadata=metadata,
                                          availability_zone=az,
                                          source_volid=volume_id,
                                          lease_days=data['lease_days'])
            message = _('Creating volume "%s"') % data['name']
            messages.info(request, message)
            return volume
        except ValidationError as e:
            self.api_error(e.messages[0])
            return False
        except Exception:
            redirect = reverse("horizon:project:volumes:index")
            exceptions.handle(request,
                              _("Unable to create volume."),
                              redirect=redirect)
Пример #49
0
    def __init__(self, request, *args, **kwargs):
        super(CreateForm, self).__init__(request, *args, **kwargs)
        volume_types = cinder.volume_type_list(request)
        self.fields['type'].choices = [("", "")] + \
                                      [(type.name, type.name)
                                       for type in volume_types]

        # Hide the volume encryption field if the hypervisor doesn't support it
        # NOTE: as of Grizzly this is not yet supported in Nova so enabling
        # this setting will not do anything useful
        hypervisor_features = getattr(settings,
                                      "OPENSTACK_HYPERVISOR_FEATURES",
                                      {})
        can_encrypt_volumes = hypervisor_features.get("can_encrypt_volumes",
                                                      False)

        if can_encrypt_volumes:
            # TODO(laura-glendenning) get from api call in future
            encryption_options = {"LUKS": "dmcrypt LUKS"}
            self.fields['encryption'].choices = [("", "")] + \
                [(enc, display) for enc, display in encryption_options.items()]
        else:
            self.fields['encryption'].widget = forms.widgets.HiddenInput()
            self.fields['encryption'].required = False

        if ("snapshot_id" in request.GET):
            try:
                snapshot = self.get_snapshot(request,
                                             request.GET["snapshot_id"])
                self.fields['name'].initial = snapshot.display_name
                self.fields['size'].initial = snapshot.size
                self.fields['snapshot_source'].choices = ((snapshot.id,
                                                           snapshot),)
                try:
                    # Set the volume type from the original volume
                    orig_volume = cinder.volume_get(request,
                                                    snapshot.volume_id)
                    self.fields['type'].initial = orig_volume.volume_type
                except:
                    pass
                self.fields['size'].help_text = _('Volume size must be equal '
                                'to or greater than the snapshot size (%sGB)'
                                % snapshot.size)
                del self.fields['image_source']
                del self.fields['volume_source_type']
            except:
                exceptions.handle(request,
                                  _('Unable to load the specified snapshot.'))
        elif ('image_id' in request.GET):
            try:
                image = self.get_image(request,
                                       request.GET["image_id"])
                image.bytes = image.size
                self.fields['name'].initial = image.name
                self.fields['size'].initial = bytes_to_gigabytes(image.size)
                self.fields['image_source'].choices = ((image.id, image),)
                self.fields['size'].help_text = _('Volume size must be equal '
                                'to or greater than the image size (%s)'
                                % filesizeformat(image.size))
                del self.fields['snapshot_source']
                del self.fields['volume_source_type']
            except:
                msg = _('Unable to load the specified image. %s')
                exceptions.handle(request, msg % request.GET['image_id'])
        else:
            source_type_choices = []

            try:
                snapshots = cinder.volume_snapshot_list(request)
                if snapshots:
                    source_type_choices.append(("snapshot_source",
                                                _("Snapshot")))
                    choices = [('', _("Choose a snapshot"))] + \
                              [(s.id, s) for s in snapshots]
                    self.fields['snapshot_source'].choices = choices
                else:
                    del self.fields['snapshot_source']
            except:
                exceptions.handle(request, _("Unable to retrieve "
                        "volume snapshots."))

            images = get_available_images(request,
                                          request.user.tenant_id)
            if images:
                source_type_choices.append(("image_source", _("Image")))
                choices = [('', _("Choose an image"))]
                for image in images:
                    image.bytes = image.size
                    image.size = bytes_to_gigabytes(image.bytes)
                    choices.append((image.id, image))
                self.fields['image_source'].choices = choices
            else:
                del self.fields['image_source']

            if source_type_choices:
                choices = ([('no_source_type',
                             _("No source, empty volume."))] +
                            source_type_choices)
                self.fields['volume_source_type'].choices = choices
            else:
                del self.fields['volume_source_type']