class ImageSerializer(serializers.HyperlinkedModelSerializer): created_by = UserSummarySerializer(read_only=True) tags = TagRelatedField(many=True) versions = ImageVersionRelatedField(many=True) icon = serializers.CharField(source="get_icon_url", read_only=True) is_public = SwapBooleanField(source='private') url = UUIDHyperlinkedIdentityField(view_name='api:v2:application-detail', ) metrics_url = UUIDHyperlinkedIdentityField( view_name='api:v2:applicationmetric-detail', ) class Meta: model = Image fields = ( 'id', 'url', 'uuid', 'name', # Adtl. Fields 'metrics_url', 'created_by', 'description', 'end_date', 'is_public', 'icon', 'start_date', 'tags', 'versions')
class ImageSerializer(serializers.HyperlinkedModelSerializer): created_by = UserSummarySerializer(read_only=True) access_list = ModelRelatedField( many=True, queryset=filter_current_user_queryset, serializer_class=PatternMatchSummarySerializer, style={'base_template': 'input.html'}) tags = TagRelatedField(many=True) versions = ImageVersionRelatedField(many=True) icon = serializers.CharField(source="get_icon_url", read_only=True) is_public = SwapBooleanField(source='private') url = UUIDHyperlinkedIdentityField(view_name='api:v2:application-detail', ) metrics_url = UUIDHyperlinkedIdentityField( view_name='api:v2:applicationmetric-detail', ) class Meta: model = Image fields = ( 'id', 'url', 'uuid', 'name', # Adtl. Fields 'metrics_url', 'created_by', 'description', 'end_date', 'is_public', 'icon', 'start_date', 'access_list', 'tags', 'versions')
class InstanceSuperSummarySerializer(serializers.HyperlinkedModelSerializer): user = serializers.PrimaryKeyRelatedField( source='created_by', read_only=True) provider = serializers.PrimaryKeyRelatedField( source='created_by_identity.provider', read_only=True) status = serializers.CharField(source='esh_status', read_only=True) uuid = serializers.CharField(source='provider_alias') url = UUIDHyperlinkedIdentityField( view_name='api:v2:instance-detail', uuid_field='provider_alias' ) class Meta: model = Instance fields = ( 'id', 'uuid', 'url', 'name', 'status', 'ip_address', 'shell', 'vnc', 'user', 'provider', 'start_date', 'end_date', )
class CredentialSerializer(serializers.HyperlinkedModelSerializer): url = UUIDHyperlinkedIdentityField(view_name='api:v2:credential-detail', ) identity = IdentitySummarySerializer() class Meta: model = Credential fields = ('id', 'uuid', 'url', 'identity', 'key', 'value')
class AllocationSummarySerializer(serializers.HyperlinkedModelSerializer): url = UUIDHyperlinkedIdentityField( view_name='api:v2:allocation-detail', ) class Meta: model = Allocation fields = ('id', 'uuid', 'url', 'threshold', 'delta')
class LicenseSerializer(serializers.HyperlinkedModelSerializer): text = serializers.CharField(source='license_text') type = ModelRelatedField(lookup_field='name', source='license_type', queryset=LicenseType.objects.all(), serializer_class=LicenseTypeSummarySerializer, style={'base_template': 'input.html'}) url = UUIDHyperlinkedIdentityField(view_name='api:v2:license-detail', ) created_by = serializers.SlugRelatedField( slug_field='username', queryset=AtmosphereUser.objects.all(), required=False) def is_valid(self, raise_exception=False): """ """ raw_type = self.initial_data.get("type", "").lower() if 'raw text' in raw_type: LicenseType.objects.get_or_create(name="Raw Text") elif 'url' in raw_type: LicenseType.objects.get_or_create(name="URL") return super(LicenseSerializer, self).is_valid(raise_exception=raise_exception) def create(self, validated_data): if 'created_by' not in validated_data: request = self.context.get('request') if request and request.user: validated_data['created_by'] = request.user return super(LicenseSerializer, self).create(validated_data) class Meta: model = License fields = ('id', 'url', 'uuid', 'created_by', 'title', 'text', 'type')
class VolumeSummarySerializer(serializers.HyperlinkedModelSerializer): identity = IdentitySummarySerializer( source='instance_source.created_by_identity' ) provider = serializers.PrimaryKeyRelatedField( source='instance_source.provider', read_only=True ) start_date = serializers.DateTimeField(source='instance_source.start_date') end_date = serializers.DateTimeField(source='instance_source.end_date') uuid = serializers.CharField(source='instance_source.identifier') user = serializers.SlugRelatedField( slug_field="username", source='instance_source.created_by', read_only=True ) url = UUIDHyperlinkedIdentityField( view_name='api:v2:volume-detail', uuid_field='identifier', ) class Meta: model = Volume fields = ( 'id', 'uuid', 'url', 'name', 'size', 'user', 'identity', 'provider', 'start_date', 'end_date' )
class InstanceStatusHistorySerializer(serializers.HyperlinkedModelSerializer): instance = ModelRelatedField( queryset=Instance.objects.all(), serializer_class=InstanceSuperSummarySerializer, style={'base_template': 'input.html'}) size = SizeRelatedField(queryset=Size.objects.none()) provider = ProviderSummarySerializer(source='instance.get_provider') image = ImageSummarySerializer( source='instance.provider_machine.application_version.application') status = serializers.SlugRelatedField(slug_field='name', read_only=True) activity = serializers.CharField(max_length=36, allow_blank=True) url = UUIDHyperlinkedIdentityField( view_name='api:v2:instancestatushistory-detail', ) class Meta: model = InstanceStatusHistory fields = ( 'id', 'uuid', 'url', 'instance', 'status', 'activity', 'size', 'provider', 'image', 'extra', 'start_date', 'end_date', )
class BootScriptSerializer(serializers.HyperlinkedModelSerializer): created_by = serializers.SlugRelatedField( slug_field='username', queryset=AtmosphereUser.objects.all(), required=False) text = serializers.CharField(source='script_text') type = serializers.SlugRelatedField( source='script_type', slug_field='name', queryset=ScriptType.objects.all()) url = UUIDHyperlinkedIdentityField( view_name='api:v2:bootscript-detail', ) def is_valid(self, raise_exception=False): """ """ raw_type = self.initial_data.get("type", "").lower() if 'raw text' in raw_type: ScriptType.objects.get_or_create(name="Raw Text") elif 'url' in raw_type: ScriptType.objects.get_or_create(name="URL") return super(BootScriptSerializer, self).is_valid( raise_exception=raise_exception) def create(self, validated_data): if 'created_by' not in validated_data: request = self.context.get('request') if request and request.user: validated_data['created_by'] = request.user return super(BootScriptSerializer, self).create(validated_data) class Meta: model = BootScript fields = ('id', 'url', 'uuid', 'created_by', 'title', 'text', 'type')
class StatusTypeSerializer(serializers.HyperlinkedModelSerializer): url = UUIDHyperlinkedIdentityField(view_name='api:v2:statustype-detail', ) class Meta: model = StatusType fields = ('id', 'url', 'uuid', 'name', 'description', 'start_date', 'end_date')
class InstanceStatusHistorySerializer(serializers.HyperlinkedModelSerializer): instance = InstanceRelatedField(queryset=Instance.objects.none()) size = SizeRelatedField(queryset=Size.objects.none()) provider = ProviderSummarySerializer( source='instance.provider_machine.provider') image = ImageSummarySerializer( source='instance.provider_machine.application_version.application') status = serializers.SlugRelatedField(slug_field='name', read_only=True) url = UUIDHyperlinkedIdentityField( view_name='api:v2:instancestatushistory-detail', ) class Meta: model = InstanceStatusHistory fields = ( 'id', 'uuid', 'url', 'instance', 'status', 'size', 'provider', 'image', 'start_date', 'end_date', )
class QuotaSummarySerializer(serializers.HyperlinkedModelSerializer): url = UUIDHyperlinkedIdentityField(view_name='api:v2:quota-detail', ) class Meta: model = Quota fields = ('id', 'url', 'uuid', 'cpu', 'memory', 'storage', 'storage_count', 'suspended_count')
class SizeSummarySerializer(serializers.HyperlinkedModelSerializer): url = UUIDHyperlinkedIdentityField(view_name='api:v2:size-detail', ) class Meta: model = Size fields = ('id', 'uuid', 'url', 'alias', 'name', 'cpu', 'disk', 'root', 'mem', 'active', 'start_date', 'end_date')
class ProviderSerializer(serializers.HyperlinkedModelSerializer): name = serializers.CharField(source='location') url = UUIDHyperlinkedIdentityField(view_name='api:v2:provider-detail', ) type = ProviderTypeSerializer() virtualization = PlatformTypeSerializer() sizes = SizeSummarySerializer(source='size_set', many=True) is_admin = serializers.SerializerMethodField() def get_is_admin(self, provider): user = self.context['request'].user if user.is_staff or user.is_superuser: return True return False class Meta: model = Provider fields = ( 'id', 'url', 'uuid', 'name', 'description', 'type', 'virtualization', 'active', 'public', 'auto_imaging', 'sizes', 'start_date', 'end_date', 'is_admin', )
class QuotaSerializer(serializers.HyperlinkedModelSerializer): url = UUIDHyperlinkedIdentityField(view_name='api:v2:quota-detail', ) def validate_cpu(self, value): return self._is_positive_int('cpu', value) def validate_memory(self, value): return self._is_positive_int('memory', value) def validate_storage(self, value): return self._is_positive_int('storage', value) def validate_storage_count(self, value): return self._is_positive_int('storage_count', value) def validate_suspended_count(self, value): return self._is_positive_int('suspended_count', value) def _is_positive_int(self, key, value): if type(value) != int or value < 1: raise serializers.ValidationError("Value of %s should be >= 1" % key) return value class Meta: model = Quota fields = ('id', 'uuid', 'url', 'cpu', 'memory', 'storage', 'storage_count', 'suspended_count')
class ImageMetricSerializer(serializers.HyperlinkedModelSerializer): url = UUIDHyperlinkedIdentityField( view_name='api:v2:applicationmetric-detail', ) is_featured = serializers.SerializerMethodField() metrics = serializers.SerializerMethodField() def get_is_featured(self, application): return application.featured() def get_metrics(self, application): request = self.context.get('request', None) user = self.context.get('user', request.user) if not user: raise Exception( "This serializer expects 'user' or an authenticated " "'request' including 'user' to be passed in via serializer " "context! context={'user':user}" ) # Summarized metrics example return _get_summarized_application_metrics(application) class Meta: model = Image fields = ( 'id', 'url', 'uuid', 'name', # Adtl. Fields 'metrics', 'is_featured', )
class UserResourceRequestSerializer(serializers.HyperlinkedModelSerializer): def validate_status(self, value): if str(value) not in ["pending", "closed"]: raise serializers.ValidationError( "Users can only open and close requests.") return value quota = QuotaRelatedField(read_only=True) allocation = AllocationRelatedField(read_only=True) status = StatusTypeRelatedField(queryset=StatusType.objects.none(), allow_null=True, required=False) admin_message = serializers.CharField(read_only=True) uuid = serializers.CharField(read_only=True) created_by = UserRelatedField(read_only=True) user = UserSummarySerializer(source='membership.identity.created_by', read_only=True) identity = IdentityRelatedField(source='membership.identity', queryset=Identity.objects.none()) provider = ProviderSummarySerializer(source='membership.identity.provider', read_only=True) url = UUIDHyperlinkedIdentityField( view_name='api:v2:resourcerequest-detail', ) class Meta: model = ResourceRequest fields = ('id', 'uuid', 'url', 'request', 'description', 'status', 'created_by', 'user', 'identity', 'provider', 'admin_message', 'quota', 'allocation')
class IdentitySerializer(serializers.HyperlinkedModelSerializer): quota = ModelRelatedField(queryset=Quota.objects.all(), serializer_class=QuotaSummarySerializer, lookup_field='id') usage = serializers.SerializerMethodField() credentials = CredentialSummarySerializer(many=True, source='credential_set') key = serializers.SerializerMethodField() is_leader = serializers.SerializerMethodField() user = UserSummarySerializer(source='created_by') members = GroupSummarySerializer(source='get_membership', many=True, read_only=True) provider = ProviderSummarySerializer() url = UUIDHyperlinkedIdentityField(view_name='api:v2:identity-detail', ) def update(self, core_identity, validated_data): quota = validated_data.get('quota') data = {'quota': quota.id, 'identity': core_identity.id} event_serializer = QuotaAssignedSerializer(data=data) if not event_serializer.is_valid(): raise serializers.ValidationError( "Validation of EventSerializer failed with: %s" % event_serializer.errors) try: event_serializer.save() except Exception as exc: logger.exception("Unexpected error occurred during Event save") raise serializers.ValidationError( "Unexpected error occurred during Event save: %s" % exc) # Synchronous call to EventTable -> Set Quota for Identity's CloudProvider -> Save the Quota to Identity identity = Identity.objects.get(uuid=core_identity.uuid) return identity def get_usage(self, identity): return -1 def get_is_leader(self, identity): """ Returns true/false if the user requesting the object is the leader. """ user = None if self.context: if 'request' in self.context: user = self.context['request'].user elif 'user' in self.context: user = self.context['user'] if user == identity.created_by: return True return Identity.shared_with_user( user, is_leader=True).filter(id=identity.id).exists() def get_key(self, identity): return identity.get_key() class Meta: model = Identity fields = ('id', 'uuid', 'url', 'key', 'quota', 'credentials', 'usage', 'is_leader', 'provider', 'members', 'user')
class ProjectSummarySerializer(serializers.HyperlinkedModelSerializer): owner = serializers.StringRelatedField(source='owner.name') url = UUIDHyperlinkedIdentityField(view_name='api:v2:project-detail', ) class Meta: model = Project fields = ('id', 'url', 'uuid', 'name', 'description', 'owner', 'start_date', 'end_date')
class ResourceRequestSerializer(serializers.HyperlinkedModelSerializer): uuid = serializers.CharField(read_only=True) url = UUIDHyperlinkedIdentityField( view_name='api:v2:resourcerequest-detail', ) created_by = UserRelatedField(read_only=True) user = UserSummarySerializer( source='membership.identity.created_by', read_only=True) identity = IdentityRelatedField(source='membership.identity', queryset=Identity.objects.none()) provider = ProviderSummarySerializer( source='membership.identity.provider', read_only=True) status = StatusTypeRelatedField(queryset=StatusType.objects.none(), allow_null=True, required=False) quota = QuotaRelatedField(queryset=Quota.objects.all(), allow_null=True, required=False) allocation = AllocationRelatedField(queryset=Allocation.objects.all(), allow_null=True, required=False) # TODO should be refactored to not use SerializerMethodField() current_quota = serializers.SerializerMethodField() current_allocation = serializers.SerializerMethodField() def get_current_quota(self, request): user_membership = IdentityMembership.objects.get( id=request.membership_id) return user_membership.quota.id if user_membership.quota else None def get_current_allocation(self, request): user_membership = IdentityMembership.objects.get( id=request.membership_id) return user_membership.allocation.id if user_membership.allocation else None class Meta: model = ResourceRequest fields = ( 'id', 'uuid', 'url', 'request', 'description', 'status', 'created_by', 'user', 'identity', 'provider', 'admin_message', 'quota', 'allocation', 'current_quota', 'current_allocation' )
class ImageVersionSummarySerializer(serializers.HyperlinkedModelSerializer): # Required when its a uuid -- otherwise LONGINT id = serializers.CharField(read_only=True) url = UUIDHyperlinkedIdentityField(view_name='api:v2:imageversion-detail', uuid_field='id') class Meta: model = ImageVersion fields = ('id', 'url', 'name')
class ImageSuperSummarySerializer(serializers.HyperlinkedModelSerializer): user = serializers.PrimaryKeyRelatedField(source='created_by', read_only=True) url = UUIDHyperlinkedIdentityField(view_name='api:v2:application-detail', ) class Meta: model = Image fields = ('id', 'url', 'uuid', 'name', 'description', 'icon', 'start_date', 'end_date', 'user')
class BootScriptSummarySerializer(serializers.HyperlinkedModelSerializer): type = serializers.SlugRelatedField(source='script_type', slug_field='name', queryset=ScriptType.objects.all()) url = UUIDHyperlinkedIdentityField(view_name='api:v2:bootscript-detail', ) class Meta: model = BootScript fields = ('id', 'url', 'uuid', 'title', 'type')
class InstanceSerializer(serializers.HyperlinkedModelSerializer): identity = IdentitySummarySerializer(source='created_by_identity') user = UserSummarySerializer(source='created_by') provider = ProviderSummarySerializer(source='created_by_identity.provider') status = serializers.CharField(source='esh_status', read_only=True) projects = serializers.PrimaryKeyRelatedField(many=True, read_only=True) scripts = ModelRelatedField(many=True, required=False, queryset=BootScript.objects.all(), serializer_class=BootScriptSummarySerializer, style={'base_template': 'input.html'}) size = serializers.SerializerMethodField() image = serializers.SerializerMethodField() version = serializers.SerializerMethodField() uuid = serializers.CharField(source='provider_alias') url = UUIDHyperlinkedIdentityField(view_name='api:v2:instance-detail', uuid_field='provider_alias') def get_size(self, obj): size = obj.get_size() serializer = SizeSummarySerializer(size, context=self.context) return serializer.data def get_image(self, obj): image_uuid = obj.application_uuid() image = Image.objects.get(uuid=image_uuid) serializer = ImageSummarySerializer(image, context=self.context) return serializer.data def get_version(self, obj): version = obj.source.providermachine.application_version serializer = ImageVersionSummarySerializer(version, context=self.context) return serializer.data class Meta: model = Instance fields = ( 'id', 'uuid', 'url', 'name', 'status', 'size', 'ip_address', 'shell', 'vnc', 'identity', 'user', 'provider', 'image', 'version', # NOTE:Should replace image? 'scripts', 'projects', 'start_date', 'end_date', )
class EventSerializer(serializers.HyperlinkedModelSerializer): url = UUIDHyperlinkedIdentityField( view_name='api:v2:event-detail', ) def _validate_ias_event(self, entity_id, payload): allocation_source_id = payload.get('allocation_source_id', '') instance_id = payload.get('instance_id', '') if entity_id != instance_id: raise serializers.ValidationError( "Expected entity ID to be the Instance ID: %s, Received: %s" % (instance_id, entity_id)) user = self._get_request_user() if not user: raise serializers.ValidationError("Request user was not found") payload['username'] = user.username allocation_source = AllocationSource.for_user(user=user).filter( source_id=allocation_source_id).first() instance = Instance.for_user(user=user).filter(provider_alias=instance_id).first() if not allocation_source: raise serializers.ValidationError( "AllocationSource with source_id=%s DoesNotExist" % allocation_source_id) if not instance: raise serializers.ValidationError( "Instance with provider_alias=%s DoesNotExist" % instance_id) return True def _get_request_user(self): if 'request' not in self.context: raise ValueError("Expected 'request' context for this serializer") return self.context['request'].user def validate(self, data): name = data['name'] entity_id = data['entity_id'] payload = data['payload'] if name.lower() == 'instance_allocation_source_changed': self._validate_ias_event(entity_id, payload) else: raise serializers.ValidationError( "Unknown event type %s" % name ) return super(EventSerializer, self).validate(data) class Meta: model = EventTable fields = ( 'id', 'uuid', 'url', 'entity_id', 'name', 'payload', 'timestamp', )
class LicenseSummarySerializer(serializers.HyperlinkedModelSerializer): type = serializers.SlugRelatedField(source='license_type', slug_field='name', queryset=LicenseType.objects.all()) text = serializers.CharField(source='license_text', read_only=True) url = UUIDHyperlinkedIdentityField(view_name='api:v2:license-detail', ) class Meta: model = License fields = ('id', 'url', 'uuid', 'title', 'type', 'text')
class GroupSummarySerializer(serializers.HyperlinkedModelSerializer): url = UUIDHyperlinkedIdentityField(view_name='api:v2:group-detail', ) class Meta: model = Group fields = ( 'id', 'uuid', 'url', 'name', )
class GroupSerializer(serializers.HyperlinkedModelSerializer): url = UUIDHyperlinkedIdentityField( view_name='api:v2:group-detail', ) users = UserSummarySerializer(source='user_set', many=True) class Meta: model = Group fields = ( 'id', 'url', 'name', 'users', )
class InstanceSummarySerializer(serializers.HyperlinkedModelSerializer): identity = IdentitySummarySerializer(source='created_by_identity') user = serializers.PrimaryKeyRelatedField( source='created_by', read_only=True) provider = serializers.PrimaryKeyRelatedField( source='created_by_identity.provider', read_only=True) status = serializers.CharField(source='esh_status', read_only=True) size = serializers.SerializerMethodField() image = serializers.SerializerMethodField() uuid = serializers.CharField(source='provider_alias') url = UUIDHyperlinkedIdentityField( view_name='api:v2:instance-detail', uuid_field='provider_alias' ) def get_size(self, obj): size = obj.get_size() serializer = SizeSummarySerializer(size, context=self.context) return serializer.data def get_image(self, obj): image_uuid = obj.application_uuid() image = Image.objects.get(uuid=image_uuid) serializer = ImageSummarySerializer(image, context=self.context) return serializer.data class Meta: model = Instance view_name = 'api:v2:instance-detail' fields = ( 'id', 'uuid', 'url', 'name', 'status', 'size', 'ip_address', 'shell', 'vnc', 'web_desktop', 'identity', 'user', 'provider', 'image', 'start_date', 'end_date', )
class ExternalLinkSerializer(serializers.HyperlinkedModelSerializer): created_by = UserSummarySerializer(read_only=True) url = UUIDHyperlinkedIdentityField(view_name='api:v2:externallink-detail', uuid_field='id') class Meta: model = ExternalLink fields = ( 'id', 'url', 'title', 'description', 'link', # Adtl. Fields 'created_by')