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)