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)
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)
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()
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))
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)
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)
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)
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)
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))