def create(self, validated_data): try: return cm.api.add_service_to_cluster( self.context.get('cluster'), validated_data.get('prototype_id'), ) except IntegrityError: raise AdcmApiEx('SERVICE_CONFLICT') from None except AdcmEx as e: raise AdcmApiEx(e.code, e.msg, e.http_code) from e
def create(self, validated_data): try: return cm.api.add_host_provider( validated_data.get('prototype_id'), validated_data.get('name'), validated_data.get('description', '')) except Prototype.DoesNotExist: raise AdcmApiEx('PROTOTYPE_NOT_FOUND') from None except IntegrityError: raise AdcmApiEx("PROVIDER_CONFLICT") from None except AdcmEx as e: raise AdcmApiEx(e.code, e.msg, e.http_code) from e
def validate_hc(self, hc): if not hc: raise AdcmApiEx('INVALID_INPUT', 'hc field is required') if not isinstance(hc, list): raise AdcmApiEx('INVALID_INPUT', 'hc field should be a list') for item in hc: for key in ('component_id', 'host_id', 'service_id'): if key not in item: msg = '"{}" sub-field is required' raise AdcmApiEx('INVALID_INPUT', msg.format(key)) return hc
def create(self, validated_data): try: cluster = check_obj(Cluster, {'id': validated_data['cluster_id']}, 'CLUSTER_NOT_FOUND') prototype = check_obj(Prototype, {'id': validated_data['prototype_id']}, 'PROTOTYPE_NOT_FOUND') return add_service_to_cluster(cluster, prototype) except IntegrityError: raise AdcmApiEx('SERVICE_CONFLICT') from None except AdcmEx as e: raise AdcmApiEx(e.code, e.msg, e.http_code) from e
def get(self, request, job_id, log_id): try: job = JobLog.objects.get(id=job_id) try: log_storage = LogStorage.objects.get(id=log_id, job=job) except LogStorage.DoesNotExist: raise AdcmApiEx( 'LOG_NOT_FOUND', f'log {log_id} not found for job {job_id}') from None serializer = self.serializer_class(log_storage, context={'request': request}) return Response(serializer.data) except AdcmEx as e: raise AdcmApiEx(e.code, e.msg, e.http_code) from e
def get_obj_conf(cluster_id, service_id): cluster = check_obj(Cluster, cluster_id, 'CLUSTER_NOT_FOUND') if service_id: co = check_obj(ClusterObject, { 'cluster': cluster, 'id': service_id }, 'SERVICE_NOT_FOUND') obj = co else: obj = cluster if not obj: raise AdcmApiEx('CONFIG_NOT_FOUND', "this object has no config") if not obj.config: raise AdcmApiEx('CONFIG_NOT_FOUND', "this object has no config") return obj
def create(self, validated_data): provider = validated_data.get('provider') try: proto = Prototype.objects.get(bundle=provider.prototype.bundle, type='host') except Prototype.DoesNotExist: raise AdcmApiEx('PROTOTYPE_NOT_FOUND') from None try: return cm.api.add_host(proto, self.context.get('provider'), validated_data.get('fqdn'), validated_data.get('description', '')) except IntegrityError: raise AdcmApiEx("HOST_CONFLICT", "duplicate host") from None except AdcmEx as e: raise AdcmApiEx(e.code, e.msg, e.http_code) from e
def update(self, instance, validated_data): instance.profile = validated_data.get('profile', instance.profile) try: instance.save() except IntegrityError: raise AdcmApiEx("USER_CONFLICT") from None return instance
def put(self, request, task_id): task = check_obj(TaskLog, task_id, 'TASK_NOT_FOUND') try: cancel_task(task) except AdcmEx as e: raise AdcmApiEx(e.code, e.msg, e.http_code) from e return Response(status=status.HTTP_200_OK)
def download_log_file(request, job_id, log_id): try: job = JobLog.objects.get(id=job_id) log_storage = LogStorage.objects.get(id=log_id, job=job) if log_storage.type in ['stdout', 'stderr']: filename = f'{job.id}-{log_storage.name}-{log_storage.type}.{log_storage.format}' else: filename = f'{job.id}-{log_storage.name}.{log_storage.format}' filename = re.sub(r'\s+', '_', filename) if log_storage.format == 'txt': mime_type = 'text/plain' else: mime_type = 'application/json' if log_storage.body is None: body = '' length = 0 else: body = log_storage.body length = len(body) response = HttpResponse(body) response['Content-Type'] = mime_type response['Content-Length'] = length response['Content-Encoding'] = 'UTF-8' response['Content-Disposition'] = f'attachment; filename={filename}' return response except AdcmEx as e: raise AdcmApiEx(e.code, e.msg, e.http_code) from e
def put(self, request, bundle_id): bundle = check_obj(Bundle, bundle_id, 'BUNDLE_NOT_FOUND') try: cm.api.accept_license(bundle) return Response(status=status.HTTP_200_OK) except AdcmEx as e: raise AdcmApiEx(e.code, e.msg, e.http_code, e.adds) from e
def create(self, validated_data): check_obj(User, {'username': validated_data.get('login')}, 'USER_NOT_FOUND') try: return UserProfile.objects.create(**validated_data) except IntegrityError: raise AdcmApiEx("USER_CONFLICT") from None
def delete(self, request, bundle_id): bundle = check_obj(Bundle, bundle_id, 'BUNDLE_NOT_FOUND') try: cm.bundle.delete_bundle(bundle) except AdcmEx as e: raise AdcmApiEx(e.code, e.msg, e.http_code) from e return Response(status=status.HTTP_204_NO_CONTENT)
def create(self, validated_data): try: upgrade = check_obj(Upgrade, validated_data.get('upgrade_id'), 'UPGRADE_NOT_FOUND') return cm.upgrade.do_upgrade(validated_data.get('obj'), upgrade) except AdcmEx as e: raise AdcmApiEx(e.code, e.msg, e.http_code) from e
def validate(self, attrs): user = django.contrib.auth.authenticate(username=attrs.get('username'), password=attrs.get('password')) if not user: raise AdcmApiEx('AUTH_ERROR', 'Wrong user or password') attrs['user'] = user return attrs
def create(self, validated_data): try: bind = validated_data.get('bind') cluster = self.context.get('cluster') service = self.context.get('service') return cm.api.multi_bind(cluster, service, bind) except AdcmEx as e: raise AdcmApiEx(e.code, e.msg, e.http_code, e.adds) from e
def create(self, validated_data): cluster = check_obj(Cluster, validated_data.get('cluster_id'), "CLUSTER_NOT_FOUND") host = check_obj(Host, validated_data.get('id'), "HOST_NOT_FOUND") try: cm.api.add_host_to_cluster(cluster, host) except AdcmEx as e: raise AdcmApiEx(e.code, e.msg, e.http_code) from e return host
def check_obj(model, req, error): if isinstance(req, dict): kw = req else: kw = {'id': req} try: return model.objects.get(**kw) except ObjectDoesNotExist: raise AdcmApiEx(error) from None
def create(self, validated_data): try: binds = validated_data.get('bind') service = self.context.get('service') cluster = self.context.get('cluster') return multi_bind(cluster, service, binds) except AdcmEx as error: raise AdcmApiEx(error.code, error.msg, error.http_code, error.adds) from error
def delete(self, request, cluster_id, host_id): """ Remove host from cluster """ host = self.get_obj(cluster_id, host_id) try: cm.api.remove_host_from_cluster(host) except AdcmEx as e: raise AdcmApiEx(e.code, e.msg, e.http_code) from e return Response(status=status.HTTP_204_NO_CONTENT)
def update(self, instance, validated_data): instance.name = validated_data.get('name', instance.name) instance.description = validated_data.get('description', instance.description) try: instance.save() except IntegrityError: msg = 'cluster with name "{}" already exists'.format(instance.name) raise AdcmApiEx("CLUSTER_CONFLICT", msg) from None return instance
def create(self, validated_data): export_cluster = check_obj(Cluster, validated_data.get('export_cluster_id'), "CLUSTER_NOT_FOUND") try: return cm.api.bind(validated_data.get('cluster'), validated_data.get('service'), export_cluster, validated_data.get('export_service_id')) except AdcmEx as e: raise AdcmApiEx(e.code, e.msg, e.http_code) from e
def delete(self, request, host_id): # pylint: disable=arguments-differ """ Remove host (and all corresponding host services:components) """ host = check_obj(Host, host_id, 'HOST_NOT_FOUND') try: cm.api.delete_host(host) except AdcmEx as e: raise AdcmApiEx(e.code, e.msg, e.http_code) from e return Response(status=status.HTTP_204_NO_CONTENT)
def _get_ansible_content(self, obj): path_file = os.path.join(config.RUN_DIR, f'{obj.job.id}', f'{obj.name}-{obj.type}.{obj.format}') try: with open(path_file, 'r') as f: content = f.read() except FileNotFoundError: msg = f'File "{obj.name}-{obj.type}.{obj.format}" not found' raise AdcmApiEx('LOG_NOT_FOUND', msg) from None return content
def create(self, validated_data): try: user = User.objects.create_user( validated_data.get('username'), password=validated_data.get('password'), is_superuser=validated_data.get('is_superuser', True)) UserProfile.objects.create(login=validated_data.get('username')) return user except IntegrityError: raise AdcmApiEx("USER_CONFLICT", 'user already exists') from None
def get_obj(self, service_id, bind_id): service = check_obj(ClusterObject, service_id, 'SERVICE_NOT_FOUND') try: cluster = service.cluster except models.ObjectDoesNotExist: AdcmApiEx('CLUSTER_NOT_FOUND') return check_obj(ClusterBind, { 'cluster': cluster, 'id': bind_id }, 'BIND_NOT_FOUND')
def delete(self, request, provider_id): # pylint: disable=arguments-differ """ Remove host provider """ provider = check_obj(HostProvider, provider_id, 'PROVIDER_NOT_FOUND') try: cm.api.delete_host_provider(provider) except AdcmEx as e: raise AdcmApiEx(e.code, e.msg, e.http_code) from e return Response(status=status.HTTP_204_NO_CONTENT)
def delete(self, request, *args, **kwargs): """ Remove service from cluster """ service = check_obj(ClusterObject, {'id': kwargs['service_id']}, 'SERVICE_NOT_FOUND') try: delete_service(service) except AdcmEx as error: raise AdcmApiEx(error.code, error.msg, error.http_code) from error return Response(status=status.HTTP_204_NO_CONTENT)
def get_object(self): login = self.kwargs['username'] try: up = UserProfile.objects.get(login=login) except UserProfile.DoesNotExist: try: user = User.objects.get(username=login) up = UserProfile.objects.create(login=user.username) up.save() except User.DoesNotExist: raise AdcmApiEx('USER_NOT_FOUND') from None return up
def put(self, request, bundle_id): """ update bundle """ bundle = check_obj(Bundle, bundle_id, 'BUNDLE_NOT_FOUND') try: cm.bundle.update_bundle(bundle) serializer = self.serializer_class(bundle, context={'request': request}) return Response(serializer.data) except AdcmEx as e: raise AdcmApiEx(e.code, e.msg, e.http_code, e.adds) from e