Ejemplo n.º 1
0
class OnePeriodictaskSerializer(PeriodictaskSerializer):
    notes = vst_fields.TextareaField(required=False, allow_blank=True)

    class Meta:
        model = models.PeriodicTask
        fields = (
            'id',
            'name',
            'kind',
            'mode',
            'inventory',
            'save_result',
            'template',
            'template_opt',
            'enabled',
            'type',
            'schedule',
            'notes',
        )

    def execute(self) -> Response:
        inventory = self.instance.inventory
        rdata = ExecuteResponseSerializer(
            data=dict(detail="Started at inventory {}.".format(inventory),
                      history_id=self.instance.execute(sync=False)))
        rdata.is_valid(True)
        return Response(rdata.data, status.HTTP_201_CREATED)
Ejemplo n.º 2
0
class OneInventorySerializer(InventorySerializer, _InventoryOperations):
    owner = UserSerializer(read_only=True)
    notes = vst_fields.TextareaField(required=False, allow_blank=True)

    class Meta:
        model = models.Inventory
        fields = ('id',
                  'name',
                  'notes',
                  'owner',)
Ejemplo n.º 3
0
class OneHostSerializer(HostSerializer):
    owner = UserSerializer(read_only=True)
    notes = vst_fields.TextareaField(required=False, allow_blank=True)

    class Meta:
        model = models.Host
        fields = ('id',
                  'name',
                  'notes',
                  'type',
                  'owner',)
Ejemplo n.º 4
0
class OneTeamSerializer(TeamSerializer):
    owner = UserSerializer(read_only=True)
    notes = vst_fields.TextareaField(required=False, allow_blank=True)

    class Meta:
        model = models.UserGroup
        fields = (
            'id',
            "name",
            "notes",
            "owner",
        )
Ejemplo n.º 5
0
class OneGroupSerializer(GroupSerializer, _InventoryOperations):
    owner = UserSerializer(read_only=True)
    notes = vst_fields.TextareaField(required=False, allow_blank=True)

    class Meta:
        model = models.Group
        fields = ('id',
                  'name',
                  'notes',
                  'children',
                  'owner',)

    class ValidationException(exceptions.ValidationError):
        status_code = 409
Ejemplo n.º 6
0
class OneTemplateSerializer(TemplateSerializer):
    data = DataSerializer(required=True)
    options = DataSerializer(required=False)
    options_list = serializers.ListField(read_only=True)
    notes = vst_fields.TextareaField(required=False, allow_blank=True)

    class Meta:
        model = models.Template
        fields = (
            'id',
            'name',
            'notes',
            'kind',
            'data',
            'options',
            'options_list',
        )

    def execute(self, request):
        return self.instance.execute(request.user, request.data.get('option', None))
Ejemplo n.º 7
0
class OneProjectSerializer(ProjectSerializer, _InventoryOperations):
    repository = vst_fields.VSTCharField(default='MANUAL')
    owner = UserSerializer(read_only=True)
    notes = vst_fields.TextareaField(required=False, allow_blank=True)
    readme_content = vst_fields.HtmlField(read_only=True, label='Information')
    execute_view_data = vst_serializers.DataSerializer(read_only=True,
                                                       allow_null=True)

    class Meta:
        model = models.Project
        fields = (
            'id',
            'name',
            'repository',
            'status',
            'revision',
            'branch',
            'owner',
            'notes',
            'readme_content',
            'execute_view_data',
        )

    @transaction.atomic()
    def sync(self) -> Response:
        self.instance.start_repo_task("sync")
        serializer = ActionResponseSerializer(data=dict(
            detail="Sync with {}.".format(self.instance.repository)))
        serializer.is_valid(True)
        return Response(serializer.data, status.HTTP_200_OK)

    def _get_ansible_serializer(self, kind: str) -> serializers.Serializer:
        view = self.context['view']
        exec_method = getattr(view, 'execute_{}'.format(kind), None)
        if exec_method is None:  # nocv
            raise Exception('Unknown kind')
        serializer_class = exec_method.kwargs['serializer_class']
        serializer = serializer_class(context=self.context)
        serializer.project = self.instance
        return serializer

    def _execution(self, kind: str, data: Dict, user: User,
                   **kwargs) -> Response:
        template = data.pop("template", None)
        inventory = data.get("inventory", None)
        msg = "Started in the inventory {}.".format(
            inventory
            if inventory else 'specified in the project configuration.')
        if template is not None:
            init_type = "template"
            obj_id = template
            msg = 'Start template [id={}].'.format(template)
        else:
            init_type = "project"
            obj_id = self.instance.id
            serializer = self._get_ansible_serializer(kind.lower())
            data = {
                k: v
                for k, v in serializer.to_internal_value(data).items()
                if k in data.keys() or v
            }
        target = data.pop(kind)
        try:
            target = str(target)
        except UnicodeEncodeError:  # nocv
            target = target.encode('utf-8')
        history_id = self.instance.execute(kind,
                                           str(target),
                                           initiator=obj_id,
                                           initiator_type=init_type,
                                           executor=user,
                                           **data)
        rdata = ExecuteResponseSerializer(
            data=dict(detail=msg, history_id=history_id, executor=user.id))
        rdata.is_valid(raise_exception=True)
        return Response(rdata.data, status.HTTP_201_CREATED)

    def execute_playbook(self, request) -> Response:
        return self._execution("playbook", dict(request.data), request.user)

    def execute_module(self, request) -> Response:
        return self._execution("module", dict(request.data), request.user)
Ejemplo n.º 8
0
class OneProjectSerializer(ProjectSerializer, _InventoryOperations):
    repository = vst_fields.VSTCharField(default='MANUAL')
    owner = UserSerializer(read_only=True)
    notes = vst_fields.TextareaField(required=False, allow_blank=True)
    readme_content = vst_fields.HtmlField(read_only=True, label='Information')
    execute_view_data = vst_serializers.DataSerializer(read_only=True,
                                                       allow_null=True)

    class Meta:
        model = models.Project
        fields = (
            'id',
            'name',
            'repository',
            'status',
            'revision',
            'branch',
            'owner',
            'notes',
            'readme_content',
            'execute_view_data',
        )

    @transaction.atomic()
    def sync(self):
        self.instance.start_repo_task("sync")
        serializer = ActionResponseSerializer(data=dict(
            detail="Sync with {}.".format(self.instance.repository)))
        serializer.is_valid(True)
        return Response(serializer.data, status.HTTP_200_OK)

    def _get_execution_inventory(self, template, inventory, user):
        if template or inventory is None:
            return inventory
        try:
            inventory = Inventory.objects.get(id=int(inventory))
            if not inventory.acl_handler.viewable_by(user):  # nocv
                raise PermissionDenied(
                    "You don't have permission to inventory.")
        except ValueError:
            pass
        return inventory

    def _execution(self, kind, data, user, **kwargs):
        template = kwargs.pop("template", None)
        inventory = self._get_execution_inventory(template,
                                                  data.pop("inventory", None),
                                                  user)
        msg = "Started in the inventory {}.".format(
            inventory
            if inventory else 'specified in the project configuration.')
        if template is not None:
            init_type = "template"
            obj_id = template
            data['template_option'] = kwargs.get('template_option', None)
            msg = 'Start template [id={}].'.format(template)
        else:
            init_type = "project"
            obj_id = self.instance.id
            if kind.lower() == 'module':
                serializer = AnsibleModuleSerializer()
            elif kind.lower() == 'playbook':
                serializer = AnsiblePlaybookSerializer()
            else:  # nocv
                raise Exception('Unknown kind')
            data = {
                k: v
                for k, v in serializer.to_internal_value(data).items()
                if k in data.keys() or v
            }
        history_id = self.instance.execute(kind,
                                           str(data.pop(kind)),
                                           inventory,
                                           initiator=obj_id,
                                           initiator_type=init_type,
                                           executor=user,
                                           **data)
        rdata = ExecuteResponseSerializer(
            data=dict(detail=msg, history_id=history_id, executor=user.id))
        rdata.is_valid(raise_exception=True)
        return Response(rdata.data, status.HTTP_201_CREATED)

    def execute_playbook(self, request):
        return self._execution("playbook", dict(request.data), request.user)

    def execute_module(self, request):
        return self._execution("module", dict(request.data), request.user)