Exemple #1
0
    def initial(self, request, *args, **kwargs):
        if self.action in ('update', 'partial_update'):
            resource = self.get_object()
            if resource.state not in resource.States.STABLE_STATES:
                raise core_exceptions.IncorrectStateException(
                    'Modification allowed in stable states only')

        elif self.action in ('stop', 'start', 'resize'):
            resource = self.get_object()
            if resource.state == resource.States.PROVISIONING_SCHEDULED:
                raise core_exceptions.IncorrectStateException(
                    'Provisioning scheduled. Disabled modifications.')

        super(BaseResourceViewSet, self).initial(request, *args, **kwargs)
Exemple #2
0
    def initial(self, request, *args, **kwargs):
        if self.action in ('update', 'partial_update', 'destroy'):
            instance = self.get_object()
            if instance and instance.state not in instance.States.STABLE_STATES:
                raise core_exceptions.IncorrectStateException(
                    'Modification allowed in stable states only')

        # TODO: Replace it with schedule_transition and common transition flow
        elif self.action in ('stop', 'start', 'resize'):
            instance = self.get_object()
            if instance and instance.state == instance.States.PROVISIONING_SCHEDULED:
                raise core_exceptions.IncorrectStateException(
                    'Provisioning scheduled. Disabled modifications.')

        return super(InstanceViewSet, self).initial(request, *args, **kwargs)
Exemple #3
0
    def perform_update(self, serializer):
        spl = self.get_object().service_project_link
        if spl.state == core_models.SynchronizationStates.ERRED:
            raise core_exceptions.IncorrectStateException(
                detail=
                'Cannot modify resource if its service project link in erred state.'
            )

        serializer.save()
Exemple #4
0
 def __call__(self, resource):
     if resource.state not in self.valid_states:
         states_names = dict(resource.States.CHOICES)
         valid_states_names = [
             str(states_names[state]) for state in self.valid_states
         ]
         raise exceptions.IncorrectStateException(
             _('Valid states for operation: %s.') %
             ', '.join(valid_states_names))
Exemple #5
0
    def perform_create(self, serializer):
        if serializer.validated_data[
                'service_project_link'].state == core_models.SynchronizationStates.ERRED:
            raise core_exceptions.IncorrectStateException(
                detail=
                'Cannot modify resource if its service project link in erred state.'
            )

        try:
            self.perform_provision(serializer)
        except ServiceBackendError as e:
            raise APIException(e)
Exemple #6
0
        def wrapped(self, request, *args, **kwargs):
            message = "Performing %s operation is not allowed for resource in its current state"
            operation_name = view_fn.__name__

            try:
                with transaction.atomic():
                    resource = self.get_object()
                    project = resource.service_project_link.project
                    is_admin = project.has_user(request.user, models.ProjectRole.ADMINISTRATOR) \
                        or project.customer.has_user(request.user, models.CustomerRole.OWNER)

                    if not is_admin and not request.user.is_staff:
                        raise PermissionDenied(
                            "Only project administrator or staff allowed to perform this action."
                        )

                    if valid_state and resource.state != valid_state:
                        raise core_exceptions.IncorrectStateException(
                            message % operation_name)

                    # Important! We are passing back the instance from current transaction to a view
                    try:
                        view_fn(self, request, resource, *args, **kwargs)
                    except ServiceBackendNotImplemented:
                        raise MethodNotAllowed(operation_name)

            except TransitionNotAllowed:
                raise core_exceptions.IncorrectStateException(message %
                                                              operation_name)

            except IntegrityError:
                return Response(
                    {'status': '%s was not scheduled' % operation_name},
                    status=status.HTTP_400_BAD_REQUEST)

            return Response({'status': '%s was scheduled' % operation_name},
                            status=status.HTTP_202_ACCEPTED)
Exemple #7
0
    def perform_update(self, serializer):
        membership = self.get_object().cloud_project_membership
        if membership.state == core_models.SynchronizationStates.ERRED:
            raise core_exceptions.IncorrectStateException(
                detail=
                'Cannot modify an instance if it is connected to a cloud project membership in erred state.'
            )
        instance = serializer.save()

        event_logger.info('Virtual machine %s has been updated.',
                          instance.name,
                          extra={
                              'instance': instance,
                              'event_type': 'iaas_instance_update_succeeded'
                          })

        from nodeconductor.iaas.tasks import push_instance_security_groups
        push_instance_security_groups.delay(instance.uuid.hex)
Exemple #8
0
    def perform_create(self, serializer):
        serializer.validated_data['agreed_sla'] = serializer.validated_data[
            'template'].sla_level
        # check if connected cloud_project_membership is in a sane state - fail modification operation otherwise
        membership = serializer.validated_data['cloud_project_membership']
        if membership.state == core_models.SynchronizationStates.ERRED:
            raise core_exceptions.IncorrectStateException(
                detail=
                'Cannot modify an instance if it is connected to a cloud project membership in erred state.'
            )

        membership.project.customer.validate_quota_change(
            {'nc_resource_count': 1}, raise_exception=True)

        instance = serializer.save()
        event_logger.info('Virtual machine %s creation has been scheduled.',
                          instance.name,
                          extra={
                              'instance': instance,
                              'event_type': 'iaas_instance_creation_scheduled'
                          })
        tasks.provision_instance.delay(
            instance.uuid.hex, backend_flavor_id=instance.flavor.backend_id)
Exemple #9
0
 def __call__(self, resource):
     if resource.runtime_state not in self.valid_states:
         raise exceptions.IncorrectStateException(
             _('Valid runtime states for operation: %s.') %
             ', '.join(self.valid_states))