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 ResourceRequestSerializer(serializers.HyperlinkedModelSerializer): 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) 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) class Meta: model = ResourceRequest view_name = 'api:v2:resourcerequest-detail' fields = ('id', 'uuid', 'url', 'request', 'description', 'status', 'created_by', 'user', 'identity', 'provider', 'admin_message', 'quota', 'allocation')
class ProviderMachineSerializer(serializers.HyperlinkedModelSerializer): # NOTE: these fields could be generalized for reuse in VolumeSerializer uuid = serializers.ReadOnlyField(source='instance_source.identifier') provider = ProviderSummarySerializer(source='instance_source.provider') version = ImageVersionSummarySerializer(source='application_version') image = ImageSummarySerializer(source='application') created_by = UserSummarySerializer(source='instance_source.created_by') start_date = serializers.DateTimeField(source='instance_source.start_date') end_date = serializers.DateTimeField(source='instance_source.end_date', allow_null=True) licenses = LicenseSummarySerializer(many=True, read_only=True) # NEW members = serializers.SlugRelatedField(slug_field='name', read_only=True, many=True) # NEW # NOTE: this is still using ID instead of UUID -- due to abstract classes and use of getattr in L271 of rest_framework/relations.py, this is a 'kink' that has not been worked out yet. url = InstanceSourceHyperlinkedIdentityField( view_name='api:v2:providermachine-detail', ) class Meta: model = ProviderMachine fields = ('id', 'uuid', 'url', 'provider', 'image', 'licenses', 'members', 'version', 'created_by', 'start_date', 'end_date') def update(self, instance, validated_data): if 'instance_source' in validated_data: source = instance.instance_source source_data = validated_data.pop('instance_source') for key, val in source_data.items(): setattr(source, key, val) source.save() for (key, val) in validated_data.items(): setattr(instance, key, val) instance.save() return instance
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 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 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) size = serializers.SerializerMethodField() image = serializers.SerializerMethodField() uuid = serializers.CharField(source='provider_alias') def get_size(self, obj): size_alias = obj.esh_size() provider_id = obj.created_by_identity.provider_id size = Size.objects.get(alias=size_alias, provider=provider_id) 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', 'identity', 'user', 'provider', 'image', 'projects', 'start_date', 'end_date')
class TagSerializer(serializers.HyperlinkedModelSerializer): user = UserSummarySerializer(read_only=True) class Meta: model = Tag view_name = 'api:v2:tag-detail' fields = ('id', 'url', 'name', 'description', 'user')
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 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 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 TokenSerializer(serializers.HyperlinkedModelSerializer): user = UserSummarySerializer(read_only=True) url = serializers.HyperlinkedIdentityField(view_name='api:v2:token-detail', lookup_field='key') class Meta: model = Token fields = ('key', 'url', 'user', 'api_server_url', 'remote_ip', 'issuer', 'issuedTime', 'expireTime')
class IdentitySerializer(serializers.HyperlinkedModelSerializer): quota = QuotaSummarySerializer(source='get_quota') allocation = AllocationSummarySerializer(source='get_allocation') user = UserSummarySerializer(source='created_by') provider = ProviderSummarySerializer() class Meta: model = Identity view_name = 'api_v2:identity-detail' fields = ('id', 'uuid', 'url', 'quota', 'allocation', 'provider', 'user')
class VolumeSerializer(serializers.HyperlinkedModelSerializer): description = serializers.CharField(required=False, allow_blank=True) identity = ModelRelatedField(source="instance_source.created_by_identity", lookup_field="uuid", queryset=Identity.objects.all(), serializer_class=IdentitySummarySerializer, style={'base_template': 'input.html'}) provider = ModelRelatedField(source="instance_source.provider", queryset=Provider.objects.all(), serializer_class=ProviderSummarySerializer, style={'base_template': 'input.html'}, required=False) user = UserSummarySerializer(source='instance_source.created_by', read_only=True) project = ModelRelatedField( queryset=Project.objects.all(), serializer_class=ProjectSummarySerializer, style={'base_template': 'input.html'}) uuid = serializers.CharField(source='instance_source.identifier', read_only=True) # NOTE: this is still using ID instead of UUID -- due to abstract classes and use of getattr in L271 of rest_framework/relations.py, this is a 'kink' that has not been worked out yet. url = InstanceSourceHyperlinkedIdentityField( view_name='api:v2:volume-detail', ) class Meta: model = Volume read_only_fields = ("user", "uuid", "start_date", "end_date") fields = ( 'id', 'uuid', 'name', 'description', 'identity', 'user', 'provider', 'project', 'size', 'url', 'start_date', 'end_date') def validate(self, data): if not data and not self.initial_data: return data raise Exception( "This serializer for GET output ONLY! -- " "Use the POST or UPDATE serializers instead!")
class ProviderMachineSerializer(serializers.HyperlinkedModelSerializer): uuid = serializers.ReadOnlyField(source='instance_source.identifier') image = ImageSummarySerializer(source='application') provider = ProviderSummarySerializer(source='instance_source.provider') created_by = UserSummarySerializer(source='instance_source.created_by') start_date = serializers.DateTimeField(source='instance_source.start_date') end_date = serializers.DateTimeField(source='instance_source.end_date') class Meta: model = ProviderMachine view_name = 'api_v2:providermachine-detail' fields = ('id', 'uuid', 'url', 'image', 'provider', 'created_by', 'start_date', 'end_date')
class ImageSerializer(serializers.HyperlinkedModelSerializer): created_by = UserSummarySerializer() tags = TagSummarySerializer(many=True) provider_images = ProviderMachineRelatedField(source='providermachine_set', many=True) class Meta: model = Image view_name = 'api_v2:application-detail' fields = ('id', 'url', 'uuid', 'name', 'description', 'icon', 'created_by', 'tags', 'start_date', 'end_date', 'provider_images')
class IdentityMembershipSerializer(serializers.HyperlinkedModelSerializer): quota = QuotaSummarySerializer() allocation = AllocationSummarySerializer() identity = IdentitySummarySerializer() user = UserSummarySerializer(source='identity.created_by') provider = ProviderSummarySerializer(source='identity.provider') url = serializers.HyperlinkedIdentityField( view_name='api:v2:identitymembership-detail', ) class Meta: model = IdentityMembership fields = ('id', 'url', 'quota', 'allocation', 'end_date', 'provider', 'identity', 'user')
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 ResourceRequestSerializer(serializers.HyperlinkedModelSerializer): uuid = serializers.CharField(read_only=True) url = UUIDHyperlinkedIdentityField( view_name='api:v2:resourcerequest-detail', ) created_by = UserSummarySerializer(read_only=True) status = ModelRelatedField( default=lambda: get_status_type(status="pending"), serializer_class=StatusTypeSummarySerializer, queryset=StatusType.objects.all(), lookup_field='id') class Meta: model = ResourceRequest fields = ('id', 'uuid', 'url', 'request', 'description', 'status', 'created_by', 'admin_message', 'start_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')
class VolumeSerializer(serializers.HyperlinkedModelSerializer): provider = ProviderSummarySerializer(source='instance_source.provider') identity = IdentitySummarySerializer( source='instance_source.created_by_identity') user = UserSummarySerializer(source='instance_source.created_by') start_date = serializers.DateTimeField(source='instance_source.start_date') end_date = serializers.DateTimeField(source='instance_source.end_date') projects = serializers.PrimaryKeyRelatedField(many=True, read_only=True) uuid = serializers.CharField(source='instance_source.identifier') class Meta: model = Volume view_name = 'api_v2:volume-detail' fields = ('id', 'uuid', 'url', 'name', 'size', 'user', 'provider', 'identity', 'projects', 'start_date', 'end_date')
class IdentitySerializer(serializers.HyperlinkedModelSerializer): quota = QuotaSummarySerializer(source='get_quota') allocation = AllocationSummarySerializer(source='get_allocation') usage = serializers.SerializerMethodField() user = UserSummarySerializer(source='created_by') provider = ProviderSummarySerializer() url = UUIDHyperlinkedIdentityField(view_name='api:v2:identity-detail', ) def get_usage(self, identity): return identity.get_allocation_usage() class Meta: model = Identity fields = ('id', 'uuid', 'url', 'quota', 'allocation', 'usage', 'provider', 'user')
class IdentityMembershipSerializer(serializers.HyperlinkedModelSerializer): quota = QuotaSummarySerializer() identity_key = serializers.SerializerMethodField() identity = IdentitySummarySerializer() user = UserSummarySerializer(source='identity.created_by') provider = ProviderSummarySerializer(source='identity.provider') url = serializers.HyperlinkedIdentityField( view_name='api:v2:identitymembership-detail', ) def get_identity_key(self, identity_membership): return identity_membership.identity.get_key() class Meta: model = IdentityMembership fields = ('id', 'url', 'quota', 'end_date', 'provider', 'identity', 'identity_key', 'user')
class TagSerializer(serializers.HyperlinkedModelSerializer): user = UserSummarySerializer(read_only=True) url = UUIDHyperlinkedIdentityField(view_name='api:v2:tag-detail', ) allow_access = serializers.SerializerMethodField() 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 get_allow_access(self, tag): user = self._get_request_user() return tag.allow_access(user) class Meta: model = Tag fields = ('id', 'uuid', 'url', 'name', 'description', 'user', 'allow_access')
class ResourceRequestSerializer(serializers.HyperlinkedModelSerializer): uuid = serializers.CharField(read_only=True) url = UUIDHyperlinkedIdentityField( view_name='api:v2:resourcerequest-detail', ) created_by = UserSummarySerializer(read_only=True) identity = IdentityRelatedField(source='membership.identity') status = StatusTypeSummarySerializer(read_only=True) class Meta: model = ResourceRequest fields = ( 'id', 'uuid', 'url', 'request', 'description', 'status', 'created_by', 'identity', 'admin_message', )
class ImageBookmarkSerializer(serializers.HyperlinkedModelSerializer): image = ImagePrimaryKeyRelatedField(source='application', queryset=Image.objects.all()) user = UserSummarySerializer(read_only=True) url = UUIDHyperlinkedIdentityField( view_name='api:v2:applicationbookmark-detail', ) def validate_image(self, value): """ Check that the image has not already been bookmarked """ user = self.context['request'].user try: ImageBookmark.objects.get(application=value, user=user) raise serializers.ValidationError("Image already bookmarked") except ImageBookmark.DoesNotExist: return value class Meta: model = ImageBookmark fields = ('id', 'uuid', 'url', 'image', 'user')
def to_representation(self, value): username = value.__str__() user = AtmosphereUser.objects.get(username=username) serializer = UserSummarySerializer(user, context=self.context) return serializer.data
class ImageVersionSerializer(serializers.HyperlinkedModelSerializer): """ Serializer for ApplicationVersion (aka 'image_version') """ # NOTE: Implicitly included via 'fields' # id, application parent = ImageVersionSummarySerializer() # name, change_log, allow_imaging licenses = ModelRelatedField( many=True, queryset=License.objects.all(), serializer_class=LicenseSummarySerializer, style={'base_template': 'input.html'} ) scripts = ModelRelatedField( source='boot_scripts', many=True, queryset=BootScript.objects.all(), serializer_class=BootScriptSummarySerializer, style={'base_template': 'input.html'} ) membership = serializers.SlugRelatedField( slug_field='name', read_only=True, many=True ) user = UserSummarySerializer(source='created_by') identity = IdentitySummarySerializer(source='created_by_identity') machines = serializers.SerializerMethodField('get_machines_for_user') image = ModelRelatedField( source='application', queryset=Image.objects.all(), serializer_class=ImageSummarySerializer, style={'base_template': 'input.html'} ) start_date = serializers.DateTimeField() min_mem = serializers.IntegerField(source='threshold.memory_min') min_cpu = serializers.IntegerField(source='threshold.cpu_min') end_date = serializers.DateTimeField(allow_null=True) url = UUIDHyperlinkedIdentityField( view_name='api:v2:imageversion-detail', uuid_field='id' ) def get_machines_for_user(self, obj): """ Only show version as available on providers the user has access to """ user = self.context['request'].user filtered = obj.machines.filter( Q(instance_source__provider__active=True) ) if isinstance(user, AnonymousUser): filtered = filtered.filter( Q(instance_source__provider__public=True) ) elif not user.is_staff: filtered = filtered.filter( Q(instance_source__provider_id__in=user.provider_ids()) ) serializer = ProviderMachineSummarySerializer( filtered, context=self.context, many=True ) return serializer.data class Meta: model = ImageVersion fields = ( 'id', 'url', 'parent', 'name', 'change_log', 'image', 'machines', 'allow_imaging', 'doc_object_id', 'licenses', 'membership', 'min_mem', 'min_cpu', 'scripts', 'user', 'identity', 'start_date', 'end_date' ) def update(self, instance, validated_data): if 'min_cpu' in self.initial_data or 'min_mem' in self.initial_data: self.update_threshold(instance, validated_data) return super(ImageVersionSerializer, self).update(instance, validated_data) def validate_min_cpu(self, value): if value < 0 or value > 16: raise serializers.ValidationError( "Value of CPU must be between 1 & 16" ) return value def validate_min_mem(self, value): if value < 0 or value > 32 * 1024: raise serializers.ValidationError( "Value of mem must be between 1 & 32 GB" ) return value def update_threshold(self, instance, validated_data): current_threshold = instance.get_threshold() try: current_mem_min = current_threshold.memory_min except: current_mem_min = 0 try: current_cpu_min = current_threshold.cpu_min except: current_cpu_min = 0 try: new_mem_min = validated_data.get('threshold')['memory_min'] except: new_mem_min = current_mem_min try: new_cpu_min = validated_data.get('threshold')['cpu_min'] except: new_cpu_min = current_cpu_min if not current_threshold: new_threshold = ApplicationThreshold.objects.create( application_version=instance, memory_min=new_mem_min, cpu_min=new_cpu_min ) else: new_threshold = ApplicationThreshold.objects.get( application_version=instance ) new_threshold.memory_min = new_mem_min new_threshold.cpu_min = new_cpu_min new_threshold.save() validated_data['threshold'] = new_threshold
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='api_status', read_only=True) activity = serializers.CharField(source='api_activity', 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() ip_address = serializers.SerializerMethodField() usage = serializers.SerializerMethodField() version = serializers.SerializerMethodField() allocation_source = serializers.SerializerMethodField() uuid = serializers.CharField(source='provider_alias') url = UUIDHyperlinkedIdentityField(view_name='api:v2:instance-detail', lookup_field='uuid', uuid_field='provider_alias') def get_allocation_source(self, instance): snapshot = InstanceAllocationSourceSnapshot.objects.filter( instance=instance).first() if not snapshot: return None serializer = AllocationSourceSerializer(snapshot.allocation_source, context=self.context) return serializer.data def get_usage(self, instance): return instance.get_total_hours() def get_size(self, obj): size = obj.get_size() serializer = SizeSummarySerializer(size, context=self.context) return serializer.data def get_image(self, obj): if obj.source.is_volume(): return {} image_uuid = obj.application_uuid() image = Image.objects.get(uuid=image_uuid) serializer = ImageSummarySerializer(image, context=self.context) return serializer.data def get_ip_address(self, obj): status = obj.esh_status() if status in ["suspended", "shutoff", "shelved"]: return "0.0.0.0" return obj.ip_address def get_version(self, obj): if obj.source.is_volume(): return {} 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', 'activity', 'size', 'ip_address', 'shell', 'vnc', 'web_desktop', 'identity', 'user', 'provider', 'image', 'version', # NOTE:Should replace image? 'usage', 'scripts', 'projects', 'start_date', 'end_date', 'allocation_source', )
def to_representation(self, value): user = User.objects.get(pk=value.pk) serializer = UserSummarySerializer(user, context=self.context) return serializer.data
class VolumeSerializer(serializers.HyperlinkedModelSerializer): description = serializers.CharField(required=False, allow_blank=True) identity = ModelRelatedField(source="instance_source.created_by_identity", lookup_field="uuid", queryset=Identity.objects.all(), serializer_class=IdentitySummarySerializer, style={'base_template': 'input.html'}) provider = ModelRelatedField(source="instance_source.provider", queryset=Provider.objects.all(), serializer_class=ProviderSummarySerializer, style={'base_template': 'input.html'}, required=False) user = UserSummarySerializer(source='instance_source.created_by', read_only=True) projects = serializers.PrimaryKeyRelatedField(many=True, read_only=True) snapshot_id = serializers.CharField(write_only=True, allow_blank=True, required=False) image_id = serializers.CharField(write_only=True, allow_blank=True, required=False) uuid = serializers.CharField(source='instance_source.identifier', read_only=True) # NOTE: this is still using ID instead of UUID -- due to abstract classes and use of getattr in L271 of rest_framework/relations.py, this is a 'kink' that has not been worked out yet. url = InstanceSourceHyperlinkedIdentityField( view_name='api:v2:volume-detail', ) class Meta: model = Volume read_only_fields = ("user", "uuid", "start_date", "end_date") fields = ('id', 'uuid', 'name', 'description', 'identity', 'user', 'provider', 'projects', 'size', 'url', 'snapshot_id', 'image_id', 'start_date', 'end_date') def validate(self, data): image_id = data.get('image') snapshot_id = data.get('snapshot') #: Only allow one at a time if snapshot_id and image_id: raise serializers.ValidationError( "Use either `snapshot_id` or `image_id` not both.") return data def create(self, validated_data): name = validated_data.get('name') size = validated_data.get('size') identifier = validated_data.get("identifier") description = validated_data.get('description') user = validated_data.get("user") start_date = validated_data.get("created_on") instance_source = validated_data.get("instance_source") identity = instance_source.get("created_by_identity") provider = identity.provider source = InstanceSource.objects.create(identifier=identifier, provider=provider, created_by=user, created_by_identity=identity) kwargs = { "name": name, "size": size, "description": description, "instance_source": source, "start_date": start_date } return Volume.objects.create(**kwargs)