Пример #1
0
    def get_url(cls, job=None, action=None):
        if job is None:
            job = JobFactory()

        url = 'http://testserver' + reverse(get_detail_view_name(models.Job),
                                            kwargs={'uuid': job.uuid.hex})
        return url if action is None else url + action + '/'
Пример #2
0
    def get_url(cls, python_management=None, action=None):
        if python_management is None:
            python_management = PythonManagementFactory()

        url = 'http://testserver' + reverse(
            core_utils.get_detail_view_name(models.PythonManagement),
            kwargs={'uuid': python_management.uuid})
        return url if action is None else url + action + '/'
Пример #3
0
    def get_url(cls, playbook=None, action=None):
        if playbook is None:
            playbook = PlaybookFactory()

        url = 'http://testserver' + reverse(get_detail_view_name(
            models.Playbook),
                                            kwargs={'uuid': playbook.uuid.hex})
        return url if action is None else url + action + '/'
Пример #4
0
def get_field_type(field):
    """
    Returns field type/possible values.
    """
    if isinstance(field, core_filters.MappedMultipleChoiceFilter):
        return ' | '.join(['"%s"' % f for f in sorted(field.mapped_to_model)])
    if isinstance(field, OrderingFilter) or isinstance(field, ChoiceFilter):
        return ' | '.join(['"%s"' % f[0] for f in field.extra['choices']])
    if isinstance(field, ChoiceField):
        return ' | '.join(['"%s"' % f for f in sorted(field.choices)])
    if isinstance(field, HyperlinkedRelatedField):
        if field.view_name.endswith('detail'):
            return 'link to %s' % reverse(
                field.view_name,
                kwargs={
                    '%s' % field.lookup_field: "'%s'" % field.lookup_field
                },
            )
        return reverse(field.view_name)
    if isinstance(field, structure_filters.ServiceTypeFilter):
        return ' | '.join([
            '"%s"' % f for f in SupportedServices.get_filter_mapping().keys()
        ])
    if isinstance(field, ResourceTypeFilter):
        return ' | '.join([
            '"%s"' % f for f in SupportedServices.get_resource_models().keys()
        ])
    if isinstance(field, core_serializers.GenericRelatedField):
        links = []
        for model in field.related_models:
            detail_view_name = core_utils.get_detail_view_name(model)
            for f in field.lookup_fields:
                try:
                    link = reverse(detail_view_name,
                                   kwargs={'%s' % f: "'%s'" % f})
                except NoReverseMatch:
                    pass
                else:
                    links.append(link)
                    break
        path = ', '.join(links)
        if path:
            return 'link to any: %s' % path
    if isinstance(field, core_filters.ContentTypeFilter):
        return "string in form 'app_label'.'model_name'"
    if isinstance(field, ModelMultipleChoiceFilter):
        return get_field_type(field.field)
    if isinstance(field, ListSerializer):
        return 'list of [%s]' % get_field_type(field.child)
    if isinstance(field, ManyRelatedField):
        return 'list of [%s]' % get_field_type(field.child_relation)
    if isinstance(field, ModelField):
        return get_field_type(field.model_field)

    name = field.__class__.__name__
    for w in ('Filter', 'Field', 'Serializer'):
        name = name.replace(w, '')
    return FIELDS.get(name, name)
Пример #5
0
    def get_extra_kwargs(self):
        extra_kwargs = super(AugmentedSerializerMixin, self).get_extra_kwargs()

        if hasattr(self.Meta, 'view_name'):
            view_name = self.Meta.view_name
        else:
            view_name = core_utils.get_detail_view_name(self.Meta.model)

        if 'url' in extra_kwargs:
            extra_kwargs['url']['view_name'] = view_name
        else:
            extra_kwargs['url'] = {'view_name': view_name}

        return extra_kwargs
Пример #6
0
class JobEstimateSerializer(PermissionFieldFilteringMixin,
                            serializers.HyperlinkedModelSerializer):
    ssh_public_key = serializers.HyperlinkedRelatedField(
        lookup_field='uuid',
        view_name='sshpublickey-detail',
        queryset=core_models.SshPublicKey.objects.all(),
        required=True,
    )
    service_project_link = serializers.HyperlinkedRelatedField(
        lookup_field='pk',
        view_name='openstacktenant-spl-detail',
        queryset=openstack_models.OpenStackTenantServiceProjectLink.objects.
        all(),
    )
    playbook = serializers.HyperlinkedRelatedField(
        lookup_field='uuid',
        view_name=core_utils.get_detail_view_name(models.Playbook),
        queryset=models.Playbook.objects.all(),
    )
    arguments = serializers.JSONField(default=dict)

    class Meta(object):
        model = models.Job
        fields = ('ssh_public_key', 'service_project_link', 'playbook',
                  'arguments')

    def get_filtered_field_names(self):
        return 'service_project_link',

    def check_subnet(self, attrs):
        if not self.instance:
            settings = attrs['service_project_link'].service.settings
            if not openstack_models.SubNet.objects.filter(
                    settings=settings).exists():
                raise serializers.ValidationError(
                    _('Selected OpenStack provider does not have any subnet yet.'
                      ))
            else:
                attrs['subnet'] = openstack_models.SubNet.objects.filter(
                    settings=settings).first()

    def validate(self, attrs):
        if not self.instance:
            attrs['user'] = self.context['request'].user

        self.check_subnet(attrs)
        return attrs
Пример #7
0
    def get_url(cls, jupyter_hub_management=None, action=None):
        if jupyter_hub_management is None:
            jupyter_hub_management = JupyterHubManagementFactory()

        url = 'http://testserver' + reverse(core_utils.get_detail_view_name(models.JupyterHubManagement), kwargs={'uuid': jupyter_hub_management.uuid})
        return url if action is None else url + action + '/'
Пример #8
0
class JobSerializer(common_serializers.BaseApplicationSerializer,
                    structure_serializers.PermissionFieldFilteringMixin):
    service_project_link = serializers.HyperlinkedRelatedField(
        lookup_field='pk',
        view_name='openstacktenant-spl-detail',
        queryset=openstack_models.OpenStackTenantServiceProjectLink.objects.
        all(),
    )
    service = serializers.HyperlinkedRelatedField(
        source='service_project_link.service',
        lookup_field='uuid',
        view_name='openstacktenant-detail',
        read_only=True,
    )
    service_name = serializers.ReadOnlyField(
        source='service_project_link.service.settings.name')
    service_uuid = serializers.ReadOnlyField(
        source='service_project_link.service.uuid')
    ssh_public_key = serializers.HyperlinkedRelatedField(
        lookup_field='uuid',
        view_name='sshpublickey-detail',
        queryset=core_models.SshPublicKey.objects.all(),
        required=True,
    )
    ssh_public_key_name = serializers.ReadOnlyField(
        source='ssh_public_key.name')
    ssh_public_key_uuid = serializers.ReadOnlyField(
        source='ssh_public_key.uuid')
    project = serializers.HyperlinkedRelatedField(
        source='service_project_link.project',
        lookup_field='uuid',
        view_name='project-detail',
        read_only=True,
    )
    project_name = serializers.ReadOnlyField(
        source='service_project_link.project.name')
    project_uuid = serializers.ReadOnlyField(
        source='service_project_link.project.uuid')
    playbook = serializers.HyperlinkedRelatedField(
        lookup_field='uuid',
        view_name=core_utils.get_detail_view_name(
            playbook_jobs_models.Playbook),
        queryset=playbook_jobs_models.Playbook.objects.all(),
    )
    playbook_name = serializers.ReadOnlyField(source='playbook.name')
    playbook_uuid = serializers.ReadOnlyField(source='playbook.uuid')
    playbook_image = serializers.FileField(source='playbook.image',
                                           read_only=True)
    playbook_description = serializers.ReadOnlyField(
        source='playbook.description')
    arguments = serializers.JSONField(default=dict)
    state = serializers.SerializerMethodField()
    tag = serializers.SerializerMethodField()
    type = serializers.SerializerMethodField()

    class Meta(object):
        model = playbook_jobs_models.Job
        fields = ('url', 'uuid', 'name', 'description', 'service_project_link',
                  'service', 'service_name', 'service_uuid', 'ssh_public_key',
                  'ssh_public_key_name', 'ssh_public_key_uuid', 'project',
                  'project_name', 'project_uuid', 'playbook', 'playbook_name',
                  'playbook_uuid', 'playbook_image', 'playbook_description',
                  'arguments', 'state', 'output', 'created', 'modified', 'tag',
                  'type')
        read_only_fields = ('output', 'created', 'modified', 'type')
        protected_fields = ('service_project_link', 'ssh_public_key',
                            'playbook', 'arguments')
        extra_kwargs = {
            'url': {
                'lookup_field': 'uuid'
            },
        }

    def get_type(self, obj):
        return 'playbook_job'

    def get_filtered_field_names(self):
        return 'project', 'service_project_link', 'ssh_public_key'

    def get_state(self, obj):
        return obj.get_state_display()

    def get_tag(self, obj):
        return obj.get_tag()

    def check_project(self, attrs):
        if self.instance:
            project = self.instance.service_project_link.project
        else:
            project = attrs['service_project_link'].project
        if not structure._has_admin_access(self.context['request'].user,
                                           project):
            raise exceptions.PermissionDenied()

    def check_arguments(self, attrs):
        playbook = self.instance.playbook if self.instance else attrs[
            'playbook']
        arguments = attrs['arguments']
        parameter_names = playbook.parameters.all().values_list('name',
                                                                flat=True)
        for argument in arguments.keys():
            if argument not in parameter_names and argument != 'project_uuid':
                raise serializers.ValidationError(
                    _('Argument %s is not listed in playbook parameters.' %
                      argument))

        if playbook.parameters.exclude(name__in=arguments.keys()).filter(
                required=True, default__exact='').exists():
            raise serializers.ValidationError(
                _('Not all required playbook parameters were specified.'))

        unfilled_parameters = playbook.parameters.exclude(
            name__in=arguments.keys())
        for parameter in unfilled_parameters:
            if parameter.default:
                arguments[parameter.name] = parameter.default

    def check_subnet(self, attrs):
        if not self.instance:
            settings = attrs['service_project_link'].service.settings
            if not openstack_models.SubNet.objects.filter(
                    settings=settings).exists():
                raise serializers.ValidationError(
                    _('Selected OpenStack provider does not have any subnet yet.'
                      ))
            else:
                attrs['subnet'] = openstack_models.SubNet.objects.filter(
                    settings=settings).first()

    def validate(self, attrs):
        if not self.instance:
            attrs['user'] = self.context['request'].user

        self.check_project(attrs)
        self.check_arguments(attrs)
        self.check_subnet(attrs)
        return attrs