class JobSerializer(JobListSerializer): action = serializers.SerializerMethodField() display_name = serializers.SerializerMethodField() objects = serializers.SerializerMethodField() selector = serializers.JSONField(required=False) log_dir = serializers.CharField(read_only=True) log_files = DataField(read_only=True) action_url = hlink('action-details', 'action_id', 'action_id') task_url = hlink('task-details', 'id', 'task_id') def get_action(self, obj): return get_job_action(obj) def get_display_name(self, obj): if obj.sub_action_id: try: sub = SubAction.objects.get(id=obj.sub_action_id) return sub.display_name except SubAction.DoesNotExist: return None else: try: action = Action.objects.get(id=obj.action_id) return action.display_name except Action.DoesNotExist: return None def get_objects(self, obj): return get_job_objects(obj)
class GroupSerializer(serializers.Serializer): name = serializers.CharField() url = hlink('group-details', 'name', 'name') change_role = hlink('change-group-role', 'name', 'name') @transaction.atomic def create(self, validated_data): try: return Group.objects.create(name=validated_data.get('name')) except IntegrityError: raise AdcmApiEx("GROUP_CONFLICT", 'group already exists') from None
class ProviderDetailSerializer(ProviderSerializer): issue = serializers.SerializerMethodField() edition = serializers.CharField(read_only=True) license = serializers.CharField(read_only=True) bundle_id = serializers.IntegerField(read_only=True) prototype = hlink('provider-type-details', 'prototype_id', 'prototype_id') config = CommonAPIURL(view_name='object-config') action = CommonAPIURL(view_name='object-action') upgrade = hlink('provider-upgrade', 'id', 'provider_id') host = hlink('provider-host', 'id', 'provider_id') def get_issue(self, obj): return cm.issue.get_issue(obj)
class ClusterHostDetailSerializer(ClusterHostSerializer): issue = serializers.SerializerMethodField() cluster_url = hlink('cluster-details', 'cluster_id', 'cluster_id') status = serializers.SerializerMethodField() monitoring = serializers.CharField(read_only=True) host_url = hlink('host-details', 'id', 'host_id') config = CommonAPIURL(view_name='object-config') action = CommonAPIURL(view_name='object-action') def get_issue(self, obj): return cm.issue.get_issue(obj) def get_status(self, obj): return cm.status_api.get_host_status(obj.id)
class TaskSerializer(TaskListSerializer): selector = serializers.SerializerMethodField() config = serializers.JSONField(required=False) attr = serializers.JSONField(required=False) hc = serializers.JSONField(required=False) hosts = serializers.JSONField(required=False) verbose = serializers.BooleanField(required=False) action_url = serializers.SerializerMethodField() action = serializers.SerializerMethodField() objects = serializers.SerializerMethodField() jobs = serializers.SerializerMethodField() restart = hlink('task-restart', 'id', 'task_id') terminatable = serializers.SerializerMethodField() cancel = hlink('task-cancel', 'id', 'task_id') object_type = serializers.SerializerMethodField() lock = ConcernItemSerializer(read_only=True) get_action_url = get_action_url def get_selector(self, obj): return get_task_selector(obj.task_object, obj.action) def get_terminatable(self, obj): if obj.action: allow_to_terminate = obj.action.allow_to_terminate else: allow_to_terminate = False # pylint: disable=simplifiable-if-statement if allow_to_terminate and obj.status in [config.Job.CREATED, config.Job.RUNNING]: # pylint: enable=simplifiable-if-statement return True else: return False def get_jobs(self, obj): return JobShort(obj.joblog_set, many=True, context=self.context).data def get_action(self, obj): return JobAction(obj.action, context=self.context).data def get_objects(self, obj): return get_job_objects(obj) def get_object_type(self, obj): if obj.action: return obj.action.prototype.type else: return None
class ProviderHostSerializer(serializers.Serializer): id = serializers.IntegerField(read_only=True) cluster_id = serializers.IntegerField(read_only=True) prototype_id = serializers.IntegerField(required=False, read_only=True) provider_id = serializers.IntegerField(required=False, read_only=True) fqdn = serializers.CharField(help_text='fully qualified domain name') description = serializers.CharField(required=False) state = serializers.CharField(read_only=True) # stack = serializers.JSONField(read_only=True) url = hlink('host-details', 'id', 'host_id') def validate_fqdn(self, name): try: return cm.stack.validate_name(name, 'Host name') except AdcmEx as e: raise AdcmApiEx(e.code, e.msg, e.http_code) from e 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
class HostComponentSerializer(serializers.Serializer): class MyUrlField(UrlField): def get_kwargs(self, obj): return { 'cluster_id': obj.cluster.id, 'hs_id': obj.id, } id = serializers.IntegerField(read_only=True) host_id = serializers.IntegerField(help_text='host id') host = serializers.CharField(read_only=True) service_id = serializers.IntegerField() component = serializers.CharField(help_text='component name') component_id = serializers.IntegerField(read_only=True, help_text='component id') state = serializers.CharField(read_only=True, required=False) url = MyUrlField(read_only=True, view_name='host-comp-details') host_url = hlink('host-details', 'host_id', 'host_id') def to_representation(self, instance): data = super().to_representation(instance) data['component'] = instance.component.prototype.name data[ 'component_display_name'] = instance.component.prototype.display_name data['host'] = instance.host.fqdn data['service_name'] = instance.service.prototype.name data['service_display_name'] = instance.service.prototype.display_name data['service_version'] = instance.service.prototype.version return data
class ProviderSerializer(serializers.Serializer): id = serializers.IntegerField(read_only=True) name = serializers.CharField() prototype_id = serializers.IntegerField() description = serializers.CharField(required=False) state = serializers.CharField(read_only=True) url = hlink('provider-details', 'id', 'provider_id') def validate_prototype_id(self, prototype_id): proto = check_obj(Prototype, { 'id': prototype_id, 'type': 'provider' }, "PROTOTYPE_NOT_FOUND") return proto 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
class ClusterSerializer(serializers.Serializer): id = serializers.IntegerField(read_only=True) prototype_id = serializers.IntegerField(help_text='id of cluster type') name = serializers.CharField(help_text='cluster name') description = serializers.CharField(help_text='cluster description', required=False) state = serializers.CharField(read_only=True) before_upgrade = serializers.JSONField(read_only=True) url = hlink('cluster-details', 'id', 'cluster_id') def validate_prototype_id(self, prototype_id): return check_obj(Prototype, {'id': prototype_id, 'type': 'cluster'}) def create(self, validated_data): try: return cm.api.add_cluster( validated_data.get('prototype_id'), validated_data.get('name'), validated_data.get('description', ''), ) except IntegrityError: raise AdcmEx("CLUSTER_CONFLICT") from None 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 = f'cluster with name "{instance.name}" already exists' raise AdcmEx("CLUSTER_CONFLICT", msg) from None return instance
class JobShort(serializers.Serializer): id = serializers.IntegerField(read_only=True) name = serializers.CharField(read_only=True) display_name = serializers.CharField(read_only=True) status = serializers.CharField(read_only=True) start_date = serializers.DateTimeField(read_only=True) finish_date = serializers.DateTimeField(read_only=True) url = hlink('job-details', 'id', 'job_id')
class TaskListSerializer(serializers.Serializer): id = serializers.IntegerField(read_only=True) pid = serializers.IntegerField(read_only=True) object_id = serializers.IntegerField(read_only=True) action_id = serializers.IntegerField(read_only=True) status = serializers.CharField(read_only=True) start_date = serializers.DateTimeField(read_only=True) finish_date = serializers.DateTimeField(read_only=True) url = hlink('task-details', 'id', 'task_id')
class JobListSerializer(serializers.Serializer): id = serializers.IntegerField(read_only=True) pid = serializers.IntegerField(read_only=True) task_id = serializers.IntegerField(read_only=True) action_id = serializers.IntegerField(read_only=True) sub_action_id = serializers.IntegerField(read_only=True) status = serializers.CharField(read_only=True) start_date = serializers.DateTimeField(read_only=True) finish_date = serializers.DateTimeField(read_only=True) url = hlink('job-details', 'id', 'job_id')
class UserSerializer(serializers.Serializer): username = serializers.CharField() password = serializers.CharField(write_only=True) url = hlink('user-details', 'username', 'username') change_group = hlink('add-user-group', 'username', 'username') change_password = hlink('user-passwd', 'username', 'username') change_role = hlink('change-user-role', 'username', 'username') is_superuser = serializers.BooleanField(required=False) @transaction.atomic 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
class ProfileSerializer(ProfileDetailSerializer): username = serializers.CharField(source='login') url = hlink('profile-details', 'login', 'username') 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
class HostDetailSerializer(HostSerializer): bundle_id = serializers.IntegerField(read_only=True) status = serializers.SerializerMethodField() config = CommonAPIURL(view_name='object-config') action = CommonAPIURL(view_name='object-action') prototype = hlink('host-type-details', 'prototype_id', 'prototype_id') multi_state = StringListSerializer(read_only=True) concerns = ConcernItemSerializer(many=True, read_only=True) locked = serializers.BooleanField(read_only=True) def get_status(self, obj): return cm.status_api.get_host_status(obj)
class BundleSerializer(serializers.Serializer): id = serializers.IntegerField(read_only=True) name = serializers.CharField(read_only=True) version = serializers.CharField(read_only=True) edition = serializers.CharField(read_only=True) hash = serializers.CharField(read_only=True) license = serializers.CharField(read_only=True) license_path = serializers.CharField(read_only=True) license_hash = serializers.CharField(read_only=True) description = serializers.CharField(required=False) date = serializers.DateTimeField(read_only=True) url = hlink('bundle-details', 'id', 'bundle_id') license_url = hlink('bundle-license', 'id', 'bundle_id') update = hlink('bundle-update', 'id', 'bundle_id') def to_representation(self, instance): data = super().to_representation(instance) proto = Prototype.objects.filter(bundle=instance, name=instance.name) data['adcm_min_version'] = proto[0].adcm_min_version data['display_name'] = proto[0].display_name return data
class HostDetailSerializer(HostSerializer): # stack = serializers.JSONField(read_only=True) issue = serializers.SerializerMethodField() bundle_id = serializers.IntegerField(read_only=True) status = serializers.SerializerMethodField() config = CommonAPIURL(view_name='object-config') action = CommonAPIURL(view_name='object-action') prototype = hlink('host-type-details', 'prototype_id', 'prototype_id') def get_issue(self, obj): return cm.issue.get_issue(obj) def get_status(self, obj): return cm.status_api.get_host_status(obj.id)
class UpgradeSerializer(serializers.Serializer): id = serializers.IntegerField(read_only=True) name = serializers.CharField(required=False) bundle_id = serializers.IntegerField(read_only=True) description = serializers.CharField(required=False) min_version = serializers.CharField(required=False) max_version = serializers.CharField(required=False) min_strict = serializers.BooleanField(required=False) max_strict = serializers.BooleanField(required=False) upgradable = serializers.BooleanField(required=False) license = serializers.CharField(required=False) license_url = hlink('bundle-license', 'bundle_id', 'bundle_id') from_edition = serializers.JSONField(required=False) state_available = serializers.JSONField(required=False) state_on_success = serializers.CharField(required=False)
class PrototypeSerializer(serializers.Serializer): bundle_id = serializers.IntegerField(read_only=True) id = serializers.IntegerField(read_only=True) path = serializers.CharField(read_only=True) name = serializers.CharField(read_only=True) display_name = serializers.CharField(required=False) version = serializers.CharField(read_only=True) bundle_edition = serializers.SerializerMethodField() description = serializers.CharField(required=False) type = serializers.CharField(read_only=True) required = serializers.BooleanField(read_only=True) url = hlink('prototype-details', 'id', 'prototype_id') def get_bundle_edition(self, obj): return obj.bundle.edition
class HostSerializer(serializers.Serializer): id = serializers.IntegerField(read_only=True) cluster_id = serializers.IntegerField(read_only=True) prototype_id = serializers.IntegerField(help_text='id of host type') provider_id = serializers.IntegerField() fqdn = serializers.CharField(help_text='fully qualified domain name') description = serializers.CharField(required=False) state = serializers.CharField(read_only=True) url = hlink('host-details', 'id', 'host_id') def get_issue(self, obj): return cm.issue.get_issue(obj) def validate_prototype_id(self, prototype_id): proto = check_obj(Prototype, { 'id': prototype_id, 'type': 'host' }, "PROTOTYPE_NOT_FOUND") return proto def validate_provider_id(self, provider_id): provider = check_obj(HostProvider, provider_id, "PROVIDER_NOT_FOUND") return provider def validate_fqdn(self, name): try: return cm.stack.validate_name(name, 'Host name') 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(validated_data.get('prototype_id'), validated_data.get('provider_id'), validated_data.get('fqdn'), validated_data.get('description', '')) except Prototype.DoesNotExist: raise AdcmApiEx('PROTOTYPE_NOT_FOUND') from None 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.cluster_id = validated_data.get('cluster_id') instance.save() return instance
class ComponentDetailSerializer(ComponentSerializer): constraint = serializers.JSONField(read_only=True) requires = serializers.JSONField(read_only=True) bound_to = serializers.JSONField(read_only=True) bundle_id = serializers.IntegerField(read_only=True) monitoring = serializers.CharField(read_only=True) status = serializers.SerializerMethodField() action = CommonAPIURL(read_only=True, view_name='object-action') config = CommonAPIURL(read_only=True, view_name='object-config') prototype = hlink('component-type-details', 'prototype_id', 'prototype_id') multi_state = StringListSerializer(read_only=True) concerns = ConcernItemSerializer(many=True, read_only=True) locked = serializers.BooleanField(read_only=True) group_config = GroupConfigsHyperlinkedIdentityField( view_name='group-config-list') def get_status(self, obj): return status_api.get_component_status(obj)
class ClusterDetailSerializer(ClusterSerializer): # stack = serializers.JSONField(read_only=True) issue = serializers.SerializerMethodField() bundle_id = serializers.IntegerField(read_only=True) edition = serializers.CharField(read_only=True) license = serializers.CharField(read_only=True) action = CommonAPIURL(view_name='object-action') service = hlink('cluster-service', 'id', 'cluster_id') host = hlink('cluster-host', 'id', 'cluster_id') hostcomponent = hlink('host-component', 'id', 'cluster_id') status = serializers.SerializerMethodField() status_url = hlink('cluster-status', 'id', 'cluster_id') config = CommonAPIURL(view_name='object-config') serviceprototype = hlink('cluster-service-prototype', 'id', 'cluster_id') upgrade = hlink('cluster-upgrade', 'id', 'cluster_id') imports = hlink('cluster-import', 'id', 'cluster_id') bind = hlink('cluster-bind', 'id', 'cluster_id') prototype = hlink('cluster-type-details', 'prototype_id', 'prototype_id') def get_issue(self, obj): return cm.issue.get_issue(obj) def get_status(self, obj): return cm.status_api.get_cluster_status(obj.id)
class JobSerializer(JobListSerializer): action = serializers.SerializerMethodField() display_name = serializers.SerializerMethodField() objects = serializers.SerializerMethodField() selector = serializers.SerializerMethodField() log_dir = serializers.CharField(read_only=True) log_files = DataField(read_only=True) action_url = serializers.SerializerMethodField() task_url = hlink('task-details', 'task_id', 'task_id') get_display_name = get_job_display_name get_action_url = get_action_url def get_selector(self, obj): return get_task_selector(obj.task.task_object, obj.action) def get_action(self, obj): return JobAction(obj.action, context=self.context).data def get_objects(self, obj): return get_job_objects(obj.task)
class ClusterSerializer(serializers.Serializer): id = serializers.IntegerField(read_only=True) prototype_id = serializers.IntegerField(help_text='id of cluster type') name = serializers.CharField(help_text='cluster name') description = serializers.CharField(help_text='cluster description', required=False) state = serializers.CharField(read_only=True) url = hlink('cluster-details', 'id', 'cluster_id') def validate_prototype_id(self, prototype_id): cluster = check_obj(Prototype, { 'id': prototype_id, 'type': 'cluster' }, "PROTOTYPE_NOT_FOUND") return cluster def create(self, validated_data): try: return cm.api.add_cluster( 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("CLUSTER_CONFLICT") from None except AdcmEx as e: raise AdcmApiEx(e.code, e.msg, e.http_code) from e 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
class ClusterServiceDetailSerializer(ClusterServiceSerializer): prototype_id = serializers.IntegerField(read_only=True) # stack = serializers.JSONField(read_only=True) description = serializers.CharField(read_only=True) bundle_id = serializers.IntegerField(read_only=True) issue = serializers.SerializerMethodField() status = serializers.SerializerMethodField() monitoring = serializers.CharField(read_only=True) config = CommonAPIURL(view_name='object-config') action = CommonAPIURL(view_name='object-action') component = ClusterServiceUrlField(read_only=True, view_name='cluster-service-component') imports = ClusterServiceUrlField(read_only=True, view_name='cluster-service-import') bind = ClusterServiceUrlField(read_only=True, view_name='cluster-service-bind') prototype = hlink('service-type-details', 'prototype_id', 'prototype_id') def get_issue(self, obj): return cm.issue.get_issue(obj) def get_status(self, obj): return cm.status_api.get_service_status(obj.cluster.id, obj.id)
class ClusterDetailSerializer(ClusterSerializer): bundle_id = serializers.IntegerField(read_only=True) edition = serializers.CharField(read_only=True) license = serializers.CharField(read_only=True) action = CommonAPIURL(view_name='object-action') service = ObjectURL(view_name='service') host = ObjectURL(view_name='host') hostcomponent = hlink('host-component', 'id', 'cluster_id') status = serializers.SerializerMethodField() status_url = hlink('cluster-status', 'id', 'cluster_id') config = CommonAPIURL(view_name='object-config') serviceprototype = hlink('cluster-service-prototype', 'id', 'cluster_id') upgrade = hlink('cluster-upgrade', 'id', 'cluster_id') imports = hlink('cluster-import', 'id', 'cluster_id') bind = hlink('cluster-bind', 'id', 'cluster_id') prototype = hlink('cluster-type-details', 'prototype_id', 'prototype_id') multi_state = StringListSerializer(read_only=True) concerns = ConcernItemSerializer(many=True, read_only=True) locked = serializers.BooleanField(read_only=True) group_config = GroupConfigsHyperlinkedIdentityField( view_name='group-config-list') def get_status(self, obj): return cm.status_api.get_cluster_status(obj)
class ConcernItemSerializer(serializers.Serializer): id = serializers.IntegerField(read_only=True) url = hlink('concern-details', 'id', 'concern_id')
class AdcmSerializer(serializers.Serializer): id = serializers.IntegerField(read_only=True) name = serializers.CharField() prototype_id = serializers.IntegerField() state = serializers.CharField(read_only=True) url = hlink('adcm-details', 'id', 'adcm_id')
class StatsSerializer(serializers.Serializer): task = hlink('task-stats', 'id', 'task_id') job = hlink('job-stats', 'id', 'job_id')
class TaskSerializer(TaskListSerializer): selector = serializers.JSONField(read_only=True) config = serializers.JSONField(required=False) attr = serializers.JSONField(required=False) hc = serializers.JSONField(required=False) hosts = serializers.JSONField(required=False) verbose = serializers.BooleanField(required=False) action_url = serializers.HyperlinkedIdentityField( read_only=True, view_name='action-details', lookup_field='action_id', lookup_url_kwarg='action_id') action = serializers.SerializerMethodField() objects = serializers.SerializerMethodField() jobs = serializers.SerializerMethodField() restart = hlink('task-restart', 'id', 'task_id') terminatable = serializers.SerializerMethodField() cancel = hlink('task-cancel', 'id', 'task_id') object_type = serializers.SerializerMethodField() def get_terminatable(self, obj): try: action = Action.objects.get(id=obj.action_id) allow_to_terminate = action.allow_to_terminate except Action.DoesNotExist: allow_to_terminate = False # pylint: disable=simplifiable-if-statement if allow_to_terminate and obj.status in [ config.Job.CREATED, config.Job.RUNNING ]: # pylint: enable=simplifiable-if-statement return True else: return False def get_jobs(self, obj): task_jobs = JobLog.objects.filter(task_id=obj.id) for job in task_jobs: if job.sub_action_id: try: sub = SubAction.objects.get(id=job.sub_action_id) job.display_name = sub.display_name job.name = sub.name except SubAction.DoesNotExist: job.display_name = None job.name = None else: try: action = Action.objects.get(id=job.action_id) job.display_name = action.display_name job.name = action.name except Action.DoesNotExist: job.display_name = None job.name = None jobs = JobShort(task_jobs, many=True, context=self.context) return jobs.data def get_action(self, obj): return get_job_action(obj) def get_objects(self, obj): return get_job_objects(obj) def get_object_type(self, obj): return get_job_object_type(obj)