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