Example #1
0
 def _create_image(self, request, provider_uuid, identity_uuid):
     _permission_to_act(identity_uuid, "Imaging")
     # request.DATA is r/o
     # Copy allows for editing
     data = copy.deepcopy(request.DATA)
     data.update({'owner': data.get('created_for', request.user.username)})
     if data.get('vis', 'public') != 'public':
         user_list = data.get('shared_with', '')
         if type(user_list) == str:
             user_list = re.split(', | |\n', user_list)
         share_with_admins(user_list, data.get('provider'))
         share_with_self(user_list, request.user.username)
         user_list = [user for user in user_list if user]  # Skips blanks
         # TODO: Remove duplicates as well..
         data['shared_with'] = user_list
     logger.info(data)
     serializer = MachineRequestSerializer(data=data)
     if serializer.is_valid():
         # Add parent machine to request
         instance = serializer.validated_data['instance']
         parent_machine = instance.source.providermachine
         serializer.validated_data['parent_machine'] = parent_machine
         user = serializer.validated_data['new_machine_owner']
         identity_member = IdentityMembership.objects.get(
                 identity__provider=serializer.validated_data['new_machine_provider'],
                 identity__created_by=user)
         serializer.validated_data['membership'] = identity_member
         serializer.validated_data['created_by'] = user
         self._permission_to_image(identity_uuid, instance)
         machine_request = serializer.save()
         instance = machine_request.instance
         # NOTE: THIS IS A HACK -- While we enforce all images
         #       to go to iPlant Cloud - Tucson.
         # THIS CODE SHOULD BE REMOVED
         try:
             tucson_provider = Provider.objects.get(
                 location='iPlant Cloud - Tucson')
             if machine_request.new_machine_provider.location\
                != tucson_provider.location:
                 machine_request.new_machine_provider = tucson_provider
         except:
             # Will skip this step if no provider is named
             # iPlant Cloud - Tucson.
             pass
         serializer.save()
         # Object now has an ID for links..
         machine_request_id = machine_request.id
         active_provider = machine_request.active_provider()
         auto_approve = active_provider.auto_imaging
         requestImaging(request, machine_request_id,
                        auto_approve=auto_approve)
         if auto_approve:
             start_machine_imaging(machine_request)
         return Response(serializer.data,
                         status=status.HTTP_201_CREATED)
     else:
         return Response(serializer.errors,
                         status=status.HTTP_400_BAD_REQUEST)
Example #2
0
 def _create_image(self, request, provider_uuid, identity_uuid):
     _permission_to_act(identity_uuid, "Imaging")
     # request.data is r/o
     # Copy allows for editing
     data = copy.deepcopy(request.data)
     data.update({'owner': data.get('created_for', request.user.username)})
     if data.get('vis', 'public') != 'public':
         user_list = data.get('shared_with', '')
         if type(user_list) == str:
             user_list = re.split(', | |\n', user_list)
         share_with_admins(user_list, data.get('provider'))
         share_with_self(user_list, request.user.username)
         user_list = [user for user in user_list if user]  # Skips blanks
         # TODO: Remove duplicates as well..
         data['shared_with'] = user_list
     logger.info(data)
     serializer = MachineRequestSerializer(data=data)
     if serializer.is_valid():
         # Add parent machine to request
         instance = serializer.validated_data['instance']
         parent_machine = instance.source.providermachine
         serializer.validated_data['parent_machine'] = parent_machine
         user = serializer.validated_data['new_machine_owner']
         identity_member = IdentityMembership.objects.get(
             identity__provider=serializer.
             validated_data['new_machine_provider'],
             identity__created_by=user)
         serializer.validated_data['membership'] = identity_member
         serializer.validated_data['created_by'] = user
         self._permission_to_image(identity_uuid, instance)
         pending_status = StatusType.objects.get(name='pending')
         machine_request = serializer.save(status=pending_status)
         instance = machine_request.instance
         # NOTE: THIS IS A HACK -- While we enforce all images
         #       to go to iPlant Cloud - Tucson.
         # THIS CODE SHOULD BE REMOVED
         try:
             tucson_provider = Provider.objects.get(
                 location='iPlant Cloud - Tucson')
             if machine_request.new_machine_provider.location\
                != tucson_provider.location:
                 machine_request.new_machine_provider = tucson_provider
         except:
             # Will skip this step if no provider is named
             # iPlant Cloud - Tucson.
             pass
         # Object now has an ID for links..
         machine_request_id = machine_request.id
         active_provider = machine_request.active_provider()
         auto_approve = active_provider.auto_imaging
         requestImaging(request,
                        machine_request_id,
                        auto_approve=auto_approve)
         if auto_approve:
             start_machine_imaging(machine_request)
         return Response(serializer.data, status=status.HTTP_201_CREATED)
     else:
         return bad_request(serializer.errors, prefix="Invalid value for ")
 def _create_image(self, request, provider_uuid, identity_uuid):
     _permission_to_act(identity_uuid, "Imaging")
     # request.data is r/o
     # Copy allows for editing
     data = copy.deepcopy(request.data)
     data.update({'owner': data.get('created_for', request.user.username)})
     if data.get('vis', 'public') != 'public':
         user_list = data.get('shared_with', '')
         if type(user_list) == str:
             user_list = re.split(', | |\n', user_list)
         share_with_admins(user_list, data.get('provider'))
         share_with_self(user_list, request.user.username)
         user_list = [user for user in user_list if user]    # Skips blanks
         # TODO: Remove duplicates as well..
         data['shared_with'] = user_list
     logger.info(data)
     serializer = MachineRequestSerializer(data=data)
     if serializer.is_valid():
         # Add parent machine to request
         instance = serializer.validated_data['instance']
         parent_machine = instance.source.providermachine
         serializer.validated_data['parent_machine'] = parent_machine
         user = serializer.validated_data['new_machine_owner']
         identity_member = IdentityMembership.objects.get(
             identity__provider=serializer.
             validated_data['new_machine_provider'],
             identity__created_by=user
         )
         serializer.validated_data['membership'] = identity_member
         serializer.validated_data['created_by'] = user
         self._permission_to_image(identity_uuid, instance)
         pending_status, _ = StatusType.objects.get_or_create(name='pending')
         machine_request = serializer.save(status=pending_status)
         instance = machine_request.instance
         if getattr(settings, 'REPLICATION_PROVIDER_LOCATION'):
             try:
                 replication_provider = Provider.objects.get(
                     location=settings.REPLICATION_PROVIDER_LOCATION
                 )
                 if machine_request.new_machine_provider.location\
                    != replication_provider.location:
                     machine_request.new_machine_provider = replication_provider
             except:
                 # Will skip this step if no provider is named
                 # as the REPLICATION_PROVIDER_LOCATION
                 pass
         # Object now has an ID for links..
         machine_request_id = machine_request.id
         active_provider = machine_request.active_provider()
         auto_approve = active_provider.auto_imaging
         requestImaging(
             request, machine_request_id, auto_approve=auto_approve
         )
         if auto_approve:
             start_machine_imaging(machine_request)
         return Response(serializer.data, status=status.HTTP_201_CREATED)
     else:
         return bad_request(serializer.errors, prefix="Invalid value for ")
Example #4
0
    def perform_create(self, serializer):

        request_user = self.request.user
        q = MachineRequest.objects.filter(
            (Q(created_by__id=request_user.id)
             & Q(instance_id=serializer.validated_data['instance'].id)
             & ~Q(status__name="failed") & ~Q(status__name="denied")
             & ~Q(status__name="completed") & ~Q(status__name="closed")))

        if len(q) > 0:
            message = "Only one active request is allowed per provider."
            raise rest_exceptions.MethodNotAllowed('create', detail=message)
        # NOTE: An identity could possible have multiple memberships
        # It may be better to directly take membership rather than an identity
        identity_id = serializer.initial_data.get("identity")
        parent_machine = serializer.validated_data['instance'].provider_machine
        access_list = serializer.initial_data.get("access_list") or []
        visibility = serializer.initial_data.get("new_application_visibility")
        new_provider = self._get_new_provider()
        if visibility in ["select", "private"]:
            share_with_admins(access_list, parent_machine.provider.uuid)
            share_with_self(access_list, request_user.username)
            access_list = remove_duplicate_users(access_list)

        status, _ = StatusType.objects.get_or_create(name="pending")
        new_machine_provider = Provider.objects.filter(id=new_provider.id)
        new_machine_owner = AtmosphereUser.objects.filter(id=request_user.id)
        parent_machine = ProviderMachine.objects.filter(id=parent_machine.id)

        if new_machine_provider.count():
            new_machine_provider = new_machine_provider[0]
        else:
            raise rest_exceptions.ParseError(
                detail="Could not retrieve new machine provider.")

        if new_machine_owner.count():
            new_machine_owner = new_machine_owner[0]
        else:
            raise rest_exceptions.ParseError(
                detail="Could not retrieve new machine owner.")

        if parent_machine.count():
            parent_machine = parent_machine[0]
        else:
            raise rest_exceptions.ParseError(
                detail="Could not retrieve parent machine.")
        new_tags = self.filter_tags(
            request_user,
            serializer.validated_data.get("new_version_tags", ""))
        try:
            membership = IdentityMembership.objects.get(identity=identity_id)
            instance = serializer.save(
                membership=membership,
                status=status,
                created_by=request_user,
                new_machine_provider=new_provider,
                new_machine_owner=request_user,
                new_version_tags=new_tags,
                access_list=access_list,
                old_status=
                "pending",  # TODO: Is this required or will it default to pending?
                parent_machine=parent_machine)
            instance.migrate_access_to_membership_list(access_list)
            self.submit_action(instance)
        except (core_exceptions.ProviderLimitExceeded,
                core_exceptions.RequestLimitExceeded):
            message = "Only one active request is allowed per provider."
            raise rest_exceptions.MethodNotAllowed('create', detail=message)
        except core_exceptions.InvalidMembership:
            message = ("The user '%s' is not a valid member." %
                       request_user.username)
            raise rest_exceptions.ParseError(detail=message)
        except IdentityMembership.DoesNotExist:
            message = ("The identity '%s' does not have a membership" %
                       identity_id)
            raise rest_exceptions.ParseError(detail=message)
        except Exception as e:
            message = {
                "An error was encoutered when submitting the request: %s" %
                e.message
            }
            logger.exception(e)
            raise rest_exceptions.ParseError(detail=message)
    def perform_create(self, serializer):

        q = MachineRequest.objects.filter(
            (
                Q(created_by__id=self.request.user.id) &
                Q(instance_id=serializer.validated_data['instance'].id) &
                ~Q(status__name="failed") &
                ~Q(status__name="rejected") &
                ~Q(status__name="completed") &
                ~Q(status__name="closed")
            ))

        if len(q) > 0:
            message = "Only one active request is allowed per provider."
            raise rest_exceptions.MethodNotAllowed('create', detail=message)

        # NOTE: An identity could possible have multiple memberships
        # It may be better to directly take membership rather than an identity
        identity_id = serializer.initial_data.get("identity")
        new_owner=self.request.user
        parent_machine = serializer.validated_data['instance'].provider_machine

        # TODO: This is a hack that can be removed POST-ll (When MachineRequest validates new_machine_provider)
        new_provider = parent_machine.provider  # <--HACK!

        access_list = serializer.initial_data.get("access_list") or []
        visibility = serializer.initial_data.get("new_application_visibility") 
        if  visibility in ["select", "private"]:
            share_with_admins(access_list, parent_machine.provider.uuid)
            share_with_self(access_list, new_owner.username)
            access_list = remove_duplicate_users(access_list)

        status, _ = StatusType.objects.get_or_create(name="pending")
        new_machine_provider = Provider.objects.filter(id=new_provider.id)
        new_machine_owner = AtmosphereUser.objects.filter(id=new_owner.id)
        parent_machine = ProviderMachine.objects.filter(id=parent_machine.id)

        if new_machine_provider.count():
            new_machine_provider = new_machine_provider[0]
        else:
            raise rest_exceptions.ParseError(detail="Could not retrieve new machine provider.")

        if new_machine_owner.count():
            new_machine_owner = new_machine_owner[0]
        else:
            raise rest_exceptions.ParseError(detail="Could not retrieve new machine owner.")

        if parent_machine.count():
            parent_machine = parent_machine[0]
        else:
            raise rest_exceptions.ParseError(detail="Could not retrieve parent machine.")

        try:
            membership = IdentityMembership.objects.get(identity=identity_id)
            instance = serializer.save(
                membership=membership,
                status=status,
                created_by=self.request.user,
                new_machine_provider=new_provider,
                new_machine_owner=new_owner,
                access_list = access_list,
                old_status="pending",  # TODO: Is this required or will it default to pending?
                parent_machine=parent_machine
            )
            instance.migrate_access_to_membership_list(access_list)
            self.submit_action(instance)
        except (core_exceptions.ProviderLimitExceeded,
                core_exceptions.RequestLimitExceeded):
            message = "Only one active request is allowed per provider."
            raise rest_exceptions.MethodNotAllowed('create', detail=message)
        except core_exceptions.InvalidMembership:
            message = (
                "The user '%s' is not a valid member."
                % self.request.user.username
            )
            raise rest_exceptions.ParseError(detail=message)
        except IdentityMembership.DoesNotExist:
            message = (
                "The identity '%s' does not have a membership"
                % identity_id
            )
            raise rest_exceptions.ParseError(detail=message)
        except Exception as e:
            message = {
                "An error was encoutered when submitting the request: %s" % e.message
            }
            logger.exception(e)
            raise rest_exceptions.ParseError(detail=message)