Example #1
0
 def create(self, request):
     """
     Creates a User
     """
     serializer = FullSerializer(User, instance=User(), data=request.DATA, allow_passwords=True)
     if serializer.is_valid():
         user = serializer.object
         if UserList.get_user_by_username(user.username) is not None:
             return Response('User already exists', status=status.HTTP_303_SEE_OTHER)
         user.save()
         pw_client = Client()
         pw_client.ovs_type = 'INTERNAL'
         pw_client.grant_type = 'PASSWORD'
         pw_client.user = user
         pw_client.save()
         cc_client = Client()
         cc_client.ovs_type = 'INTERNAL'
         cc_client.grant_type = 'CLIENT_CREDENTIALS'
         cc_client.client_secret = ''.join(random.choice(string.ascii_letters +
                                                         string.digits +
                                                         '|_=+*#@!/-[]{}<>.?,\'";:~')
                                           for _ in range(128))
         cc_client.user = user
         cc_client.save()
         for junction in user.group.roles:
             for client in [cc_client, pw_client]:
                 roleclient = RoleClient()
                 roleclient.client = client
                 roleclient.role = junction.role
                 roleclient.save()
         serializer = FullSerializer(User, instance=user)
         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(self, request, role_guids=None):
     """
     Creates a Client
     """
     if 'role_guids' in request.DATA:
         del request.DATA['role_guids']
     serializer = FullSerializer(Client, instance=Client(), data=request.DATA)
     if serializer.is_valid():
         client = serializer.object
         if client.user is not None:
             if client.user_guid == request.client.user_guid or Toolbox.is_client_in_roles(request.client, ['manage']):
                 client.grant_type = 'CLIENT_CREDENTIALS'
                 client.client_secret = OAuth2Toolbox.create_hash(64)
                 serializer.save()
                 if not role_guids:
                     roles = [junction.role for junction in client.user.group.roles]
                 else:
                     possible_role_guids = [junction.role_guid for junction in client.user.group.roles]
                     roles = [Role(guid) for guid in role_guids if guid in possible_role_guids]
                 for role in roles:
                     roleclient = RoleClient()
                     roleclient.client = client
                     roleclient.role = role
                     roleclient.save()
                 return Response(serializer.data, status=status.HTTP_201_CREATED)
     return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
Example #3
0
 def create(self, request, role_guids=None):
     """
     Creates a Client
     """
     if 'role_guids' in request.DATA:
         del request.DATA['role_guids']
     serializer = FullSerializer(Client, instance=Client(), data=request.DATA)
     if serializer.is_valid():
         client = serializer.object
         if client.user is not None:
             if client.user_guid == request.client.user_guid or Toolbox.is_client_in_roles(request.client, ['manage']):
                 client.grant_type = 'CLIENT_CREDENTIALS'
                 client.client_secret = OAuth2Toolbox.create_hash(64)
                 serializer.save()
                 if not role_guids:
                     roles = [junction.role for junction in client.user.group.roles]
                 else:
                     possible_role_guids = [junction.role_guid for junction in client.user.group.roles]
                     roles = [Role(guid) for guid in role_guids if guid in possible_role_guids]
                 for role in roles:
                     roleclient = RoleClient()
                     roleclient.client = client
                     roleclient.role = role
                     roleclient.save()
                 return Response(serializer.data, status=status.HTTP_201_CREATED)
     return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
Example #4
0
 def create(self, request):
     """
     Creates a Management Center
     """
     serializer = FullSerializer(
         MgmtCenter,
         instance=MgmtCenter(),
         data=request.DATA,
         allow_passwords=True)
     if serializer.is_valid():
         mgmt_center = serializer.object
         duplicate = MgmtCenterList.get_by_ip(mgmt_center.ip)
         if duplicate is None:
             try:
                 mgmt_center_client = Factory.get_mgmtcenter(
                     mgmt_center=mgmt_center)
                 is_mgmt_center = mgmt_center_client.test_connection()
             except Exception as ex:
                 logger.debug('Management center testing: {0}'.format(ex))
                 raise NotAcceptable('The given information is invalid.')
             if not is_mgmt_center:
                 raise NotAcceptable(
                     'The given information is not for a Management center.'
                 )
             mgmt_center.save()
             return Response(
                 serializer.data, status=status.HTTP_201_CREATED)
         else:
             raise NotAcceptable(
                 'A Mangement Center with this ip already exists.')
     else:
         return Response(
             serializer.errors, status=status.HTTP_400_BAD_REQUEST)
Example #5
0
    def partial_update(self, storagerouter, request, contents=None):
        """
        Update a StorageRouter
        """
        contents = None if contents is None else contents.split(',')
        previous_primary = storagerouter.primary_failure_domain
        previous_secondary = storagerouter.secondary_failure_domain
        serializer = FullSerializer(StorageRouter,
                                    contents=contents,
                                    instance=storagerouter,
                                    data=request.DATA)
        if serializer.is_valid():
            primary = storagerouter.primary_failure_domain
            secondary = storagerouter.secondary_failure_domain
            if primary is None:
                raise NotAcceptable(
                    'A StorageRouter must have a primary FD configured')
            if secondary is not None:
                if primary.guid == secondary.guid:
                    raise NotAcceptable(
                        'A StorageRouter cannot have the same FD for both primary and secondary'
                    )
                if len(secondary.primary_storagerouters) == 0:
                    raise NotAcceptable(
                        'The secondary FD should be set as primary FD by at least one StorageRouter'
                    )
            if len(previous_primary.secondary_storagerouters) > 0 and len(previous_primary.primary_storagerouters) == 1 and \
                    previous_primary.primary_storagerouters[0].guid == storagerouter.guid and previous_primary.guid != primary.guid:
                raise NotAcceptable(
                    'Cannot change the primary FD as this StorageRouter is the only one serving it while it is used as secondary FD'
                )
            serializer.save()
            if previous_primary != primary or previous_secondary != secondary:
                cache = VolatileFactory.get_client()
                key_mds = 'ovs_dedupe_fdchange_mds_{0}'.format(
                    storagerouter.guid)
                key_dtl = 'ovs_dedupe_fdchange_dtl_{0}'.format(
                    storagerouter.guid)
                task_mds_id = cache.get(key_mds)
                task_dtl_id = cache.get(key_dtl)
                if task_mds_id:
                    # Key exists, task was already scheduled. If task is already running, the revoke message will be ignored
                    revoke(task_mds_id)
                if task_dtl_id:
                    revoke(task_dtl_id)
                async_mds_result = MDSServiceController.mds_checkup.s(
                ).apply_async(countdown=60)
                async_dtl_result = VDiskController.dtl_checkup.s().apply_async(
                    countdown=60)
                cache.set(key_mds, async_mds_result.id,
                          600)  # Store the task id
                cache.set(key_mds, async_dtl_result.id,
                          600)  # Store the task id

            return Response(serializer.data, status=status.HTTP_202_ACCEPTED)
        else:
            return Response(serializer.errors,
                            status=status.HTTP_400_BAD_REQUEST)
Example #6
0
 def create(self, request):
     """
     Creates a Backend
     """
     serializer = FullSerializer(Backend, instance=Backend(), data=request.DATA)
     if serializer.is_valid():
         serializer.save()
         return Response(serializer.data, status=status.HTTP_201_CREATED)
     return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
Example #7
0
 def create(self, request):
     """
     Creates a Management Center
     """
     serializer = FullSerializer(MgmtCenter,
                                 instance=MgmtCenter(),
                                 data=request.DATA,
                                 allow_passwords=True)
     if serializer.is_valid():
         mgmt_center = serializer.object
         duplicate = MgmtCenterList.get_by_ip(mgmt_center.ip)
         if duplicate is None:
             mgmt_center.save()
             try:
                 task_id = MgmtCenterController.test_connection.apply_async(
                     kwargs={
                         'mgmt_center_guid': mgmt_center.guid
                     }).id
                 task = MgmtCenterController.test_connection.AsyncResult(
                     task_id)
             except:
                 mgmt_center.delete()
                 raise
             try:
                 is_mgmt_center = task.get(timeout=60, propagate=True)
             except TimeoutError:
                 mgmt_center.delete()
                 logger.error('Timed out waiting for test_connection')
                 raise NotAcceptable(
                     'Timed out waiting for test_connection')
             except Exception as ex:
                 # propagate reraises the exception raised in the task
                 mgmt_center.delete()
                 logger.error('Task exception %s' % ex)
                 raise NotAcceptable('Task exception')
             if is_mgmt_center is True:
                 return Response(serializer.data,
                                 status=status.HTTP_201_CREATED)
             elif is_mgmt_center is None:
                 mgmt_center.delete()
                 raise NotAcceptable('The given information is invalid.')
             elif is_mgmt_center is False:
                 mgmt_center.delete()
                 raise NotAcceptable(
                     'The given information is not for a Management center.'
                 )
             else:
                 mgmt_center.delete()
                 raise NotAcceptable('Unexpected result %s' %
                                     is_mgmt_center)
         else:
             raise NotAcceptable(
                 'A Management Center with this ip already exists.')
     else:
         return Response(serializer.errors,
                         status=status.HTTP_400_BAD_REQUEST)
Example #8
0
 def create(self, request):
     """
     Creates a Backend
     """
     serializer = FullSerializer(Backend,
                                 instance=Backend(),
                                 data=request.DATA)
     if serializer.is_valid():
         serializer.save()
         return Response(serializer.data, status=status.HTTP_201_CREATED)
     return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
Example #9
0
 def create(self, request):
     """
     Creates a Backend
     """
     serializer = FullSerializer(Backend, instance=Backend(), data=request.DATA)
     if serializer.is_valid():
         duplicate = BackendList.get_by_name(serializer.object.name)
         if duplicate is None:
             serializer.save()
             return Response(serializer.data, status=status.HTTP_201_CREATED)
     return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
Example #10
0
 def partial_update(self, contents, pmachine, request):
     """
     Update a pMachine
     """
     contents = None if contents is None else contents.split(',')
     serializer = FullSerializer(PMachine, contents=contents, instance=pmachine, data=request.DATA)
     if serializer.is_valid():
         serializer.save()
         return Response(serializer.data, status=status.HTTP_202_ACCEPTED)
     else:
         return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
Example #11
0
    def partial_update(self, failuredomain, request, contents=None):
        """
        Update a Failure Domain
        """
        contents = None if contents is None else contents.split(',')
        serializer = FullSerializer(FailureDomain, contents=contents, instance=failuredomain, data=request.DATA)
        if serializer.is_valid():
            serializer.save()

            return Response(serializer.data, status=status.HTTP_202_ACCEPTED)
        else:
            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
Example #12
0
 def partial_update(self, contents, user, request):
     """
     Update a User
     """
     contents = None if contents is None else contents.split(',')
     serializer = FullSerializer(User, contents=contents, instance=user, data=request.DATA)
     if serializer.is_valid():
         if user.guid == request.client.user_guid:
             raise PermissionDenied('A user cannot update itself')
         serializer.save()
         return Response(serializer.data, status=status.HTTP_202_ACCEPTED)
     else:
         return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
Example #13
0
 def create(self, request):
     """
     Creates a Backend
     """
     serializer = FullSerializer(Backend,
                                 instance=Backend(),
                                 data=request.DATA)
     if serializer.is_valid():
         duplicate = BackendList.get_by_name(serializer.object.name)
         if duplicate is None:
             serializer.save()
             return Response(serializer.data,
                             status=status.HTTP_201_CREATED)
     return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
Example #14
0
 def partial_update(self, contents, pmachine, request):
     """
     Update a pMachine
     """
     contents = None if contents is None else contents.split(',')
     serializer = FullSerializer(PMachine,
                                 contents=contents,
                                 instance=pmachine,
                                 data=request.DATA)
     if serializer.is_valid():
         serializer.save()
         return Response(serializer.data, status=status.HTTP_202_ACCEPTED)
     else:
         return Response(serializer.errors,
                         status=status.HTTP_400_BAD_REQUEST)
Example #15
0
    def partial_update(self, failuredomain, request, contents=None):
        """
        Update a Failure Domain
        """
        contents = None if contents is None else contents.split(',')
        serializer = FullSerializer(FailureDomain,
                                    contents=contents,
                                    instance=failuredomain,
                                    data=request.DATA)
        if serializer.is_valid():
            serializer.save()

            return Response(serializer.data, status=status.HTTP_202_ACCEPTED)
        else:
            return Response(serializer.errors,
                            status=status.HTTP_400_BAD_REQUEST)
 def create(self, request):
     """
     Creates an AlbaBackend
     :param request: Data regarding ALBA backend to create
     """
     serializer = FullSerializer(AlbaBackend, instance=AlbaBackend(), data=request.DATA, allow_passwords=True)
     if serializer.is_valid():
         alba_backend = serializer.object
         alba_backend.save()
         alba_backend.backend.status = 'INSTALLING'
         alba_backend.backend.save()
         AlbaController.add_cluster.delay(alba_backend.guid)
         serializer = FullSerializer(AlbaBackend, contents='', instance=alba_backend)
         return Response(serializer.data, status=status.HTTP_201_CREATED)
     else:
         return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
Example #17
0
 def create(self, request):
     """
     Creates a Management Center
     """
     serializer = FullSerializer(MgmtCenter, instance=MgmtCenter(), data=request.DATA, allow_passwords=True)
     if serializer.is_valid():
         mgmt_center = serializer.object
         duplicate = MgmtCenterList.get_by_ip(mgmt_center.ip)
         if duplicate is None:
             mgmt_center.save()
             try:
                 task_id = MgmtCenterController.test_connection.apply_async(kwargs = {'mgmt_center_guid': mgmt_center.guid}).id
                 task = MgmtCenterController.test_connection.AsyncResult(task_id)
             except:
                 mgmt_center.delete()
                 raise
             try:
                 is_mgmt_center = task.get(timeout = 60,
                                           propagate = True)
             except TimeoutError:
                 mgmt_center.delete()
                 logger.error('Timed out waiting for test_connection')
                 raise NotAcceptable('Timed out waiting for test_connection')
             except Exception as ex:
                 # propagate reraises the exception raised in the task
                 mgmt_center.delete()
                 logger.error('Task exception %s' % ex)
                 raise NotAcceptable('Task exception')
             if is_mgmt_center is True:
                 return Response(serializer.data, status=status.HTTP_201_CREATED)
             elif is_mgmt_center is None:
                 mgmt_center.delete()
                 raise NotAcceptable('The given information is invalid.')
             elif is_mgmt_center is False:
                 mgmt_center.delete()
                 raise NotAcceptable('The given information is not for a Management center.')
             else:
                 mgmt_center.delete()
                 raise NotAcceptable('Unexpected result %s' % is_mgmt_center)
         else:
             raise NotAcceptable('A Management Center with this ip already exists.')
     else:
         return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
Example #18
0
    def partial_update(self, storagerouter, request, contents=None):
        """
        Update a StorageRouter
        """
        contents = None if contents is None else contents.split(',')
        previous_primary = storagerouter.primary_failure_domain
        previous_secondary = storagerouter.secondary_failure_domain
        serializer = FullSerializer(StorageRouter, contents=contents, instance=storagerouter, data=request.DATA)
        if serializer.is_valid():
            primary = storagerouter.primary_failure_domain
            secondary = storagerouter.secondary_failure_domain
            if primary is None:
                raise NotAcceptable('A StorageRouter must have a primary FD configured')
            if secondary is not None:
                if primary.guid == secondary.guid:
                    raise NotAcceptable('A StorageRouter cannot have the same FD for both primary and secondary')
                if len(secondary.primary_storagerouters) == 0:
                    raise NotAcceptable('The secondary FD should be set as primary FD by at least one StorageRouter')
            if len(previous_primary.secondary_storagerouters) > 0 and len(previous_primary.primary_storagerouters) == 1 and \
                    previous_primary.primary_storagerouters[0].guid == storagerouter.guid and previous_primary.guid != primary.guid:
                raise NotAcceptable('Cannot change the primary FD as this StorageRouter is the only one serving it while it is used as secondary FD')
            serializer.save()
            if previous_primary != primary or previous_secondary != secondary:
                cache = VolatileFactory.get_client()
                key_mds = 'ovs_dedupe_fdchange_mds_{0}'.format(storagerouter.guid)
                key_dtl = 'ovs_dedupe_fdchange_dtl_{0}'.format(storagerouter.guid)
                task_mds_id = cache.get(key_mds)
                task_dtl_id = cache.get(key_dtl)
                if task_mds_id:
                    # Key exists, task was already scheduled. If task is already running, the revoke message will be ignored
                    revoke(task_mds_id)
                if task_dtl_id:
                    revoke(task_dtl_id)
                async_mds_result = MDSServiceController.mds_checkup.s().apply_async(countdown=60)
                async_dtl_result = VDiskController.dtl_checkup.s().apply_async(countdown=60)
                cache.set(key_mds, async_mds_result.id, 600)  # Store the task id
                cache.set(key_mds, async_dtl_result.id, 600)  # Store the task id

            return Response(serializer.data, status=status.HTTP_202_ACCEPTED)
        else:
            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
Example #19
0
 def create(self, request):
     """
     Creates a User
     """
     serializer = FullSerializer(User,
                                 instance=User(),
                                 data=request.DATA,
                                 allow_passwords=True)
     if serializer.is_valid():
         user = serializer.object
         if UserList.get_user_by_username(user.username) is not None:
             return Response('User already exists',
                             status=status.HTTP_303_SEE_OTHER)
         user.save()
         pw_client = Client()
         pw_client.ovs_type = 'INTERNAL'
         pw_client.grant_type = 'PASSWORD'
         pw_client.user = user
         pw_client.save()
         cc_client = Client()
         cc_client.ovs_type = 'INTERNAL'
         cc_client.grant_type = 'CLIENT_CREDENTIALS'
         cc_client.client_secret = ''.join(
             random.choice(string.ascii_letters + string.digits +
                           '|_=+*#@!/-[]{}<>.?,\'";:~') for _ in range(128))
         cc_client.user = user
         cc_client.save()
         for junction in user.group.roles:
             for client in [cc_client, pw_client]:
                 roleclient = RoleClient()
                 roleclient.client = client
                 roleclient.role = junction.role
                 roleclient.save()
         serializer = FullSerializer(User, instance=user)
         return Response(serializer.data, status=status.HTTP_201_CREATED)
     else:
         return Response(serializer.errors,
                         status=status.HTTP_400_BAD_REQUEST)
Example #20
0
 def create(self, request):
     """
     Creates a Management Center
     """
     serializer = FullSerializer(MgmtCenter, instance=MgmtCenter(), data=request.DATA, allow_passwords=True)
     if serializer.is_valid():
         mgmt_center = serializer.object
         duplicate = MgmtCenterList.get_by_ip(mgmt_center.ip)
         if duplicate is None:
             try:
                 mgmt_center_client = Factory.get_mgmtcenter(mgmt_center=mgmt_center)
                 is_mgmt_center = mgmt_center_client.test_connection()
             except Exception as ex:
                 logger.debug('Management center testing: {0}'.format(ex))
                 raise NotAcceptable('The given information is invalid.')
             if not is_mgmt_center:
                 raise NotAcceptable('The given information is not for a Management center.')
             mgmt_center.save()
             return Response(serializer.data, status=status.HTTP_201_CREATED)
         else:
             raise NotAcceptable('A Mangement Center with this ip already exists.')
     else:
         return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
Example #21
0
 def create(self, request):
     """
     Creates a User
     """
     serializer = FullSerializer(User, instance=User(), data=request.DATA, allow_passwords=True)
     if serializer.is_valid():
         user = serializer.object
         if UserList.get_user_by_username(user.username) is not None:
             return Response('User already exists', status=status.HTTP_303_SEE_OTHER)
         user.save()
         client = Client()
         client.ovs_type = 'FRONTEND'
         client.grant_type = 'PASSWORD'
         client.user = user
         client.save()
         for junction in user.group.roles:
             roleclient = RoleClient()
             roleclient.client = client
             roleclient.role = junction.role
             roleclient.save()
         serializer = FullSerializer(User, instance=user)
         return Response(serializer.data, status=status.HTTP_201_CREATED)
     else:
         return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
Example #22
0
        def new_function(self, request, *args, **kwargs):
            """
            Wrapped function
            """
            _ = self

            # 1. Pre-loading request data
            contents = request.QUERY_PARAMS.get('contents')
            contents = None if contents is None else contents.split(',')

            # 5. Serializing
            obj = f(self, request, *args, **kwargs)
            return Response(FullSerializer(object_type,
                                           contents=contents,
                                           instance=obj).data,
                            status=status.HTTP_200_OK)
Example #23
0
        def new_function(self, request, *args, **kwargs):
            """
            Wrapped function
            """
            _ = self

            # 1. Pre-loading request data
            sort = request.QUERY_PARAMS.get('sort')
            if sort is None and default_sort is not None:
                sort = default_sort
            sort = None if sort is None else [
                s for s in reversed(sort.split(','))
            ]
            page = request.QUERY_PARAMS.get('page')
            page = int(page) if page is not None and page.isdigit() else None
            contents = request.QUERY_PARAMS.get('contents')
            contents = None if contents is None else contents.split(',')

            # 2. Construct hints for decorated function (so it can provide full objects if required)
            if 'hints' not in kwargs:
                kwargs['hints'] = {}
            kwargs['hints']['full'] = sort is not None or contents is not None

            # 3. Fetch data
            data_list = f(self, request=request, *args, **kwargs)
            guid_list = isinstance(data_list,
                                   list) and len(data_list) > 0 and isinstance(
                                       data_list[0], basestring)

            # 4. Sorting
            if sort is not None:
                if guid_list is True:
                    data_list = [object_type(guid) for guid in data_list]
                    guid_list = False  # The list is converted to objects
                for sort_item in sort:
                    desc = sort_item[0] == '-'
                    field = sort_item[1 if desc else 0:]
                    data_list.sort(key=lambda e: Toolbox.extract_key(e, field),
                                   reverse=desc)

            # 5. Paging
            items_pp = 10
            total_items = len(data_list)
            page_metadata = {
                'total_items': total_items,
                'current_page': 1,
                'max_page': 1,
                'start_number': min(1, total_items),
                'end_number': total_items
            }
            if page is not None:
                max_page = int(math.ceil(total_items / (items_pp * 1.0)))
                if page > max_page:
                    page = max_page
                if page == 0:
                    start_number = -1
                    end_number = 0
                else:
                    start_number = (
                        page - 1
                    ) * items_pp  # Index - e.g. 0 for page 1, 10 for page 2
                    end_number = start_number + items_pp  # Index - e.g. 10 for page 1, 20 for page 2
                data_list = data_list[start_number:end_number]
                page_metadata = dict(
                    page_metadata.items() + {
                        'current_page': max(1, page),
                        'max_page': max(1, max_page),
                        'start_number': start_number + 1,
                        'end_number': min(total_items, end_number)
                    }.items())

            # 6. Serializing
            if contents is not None:
                if guid_list is True:
                    data_list = [object_type(guid) for guid in data_list]
                data = FullSerializer(object_type,
                                      contents=contents,
                                      instance=data_list,
                                      many=True).data
            else:
                if guid_list is False:
                    data_list = [item.guid for item in data_list]
                data = data_list

            result = {
                'data': data,
                '_paging': page_metadata,
                '_contents': contents,
                '_sorting': [s for s in reversed(sort)] if sort else sort
            }

            # 7. Building response
            return Response(result, status=status.HTTP_200_OK)