예제 #1
0
    def post(self, request, fqdn, *args, **kwargs):
        """
        Add annotation to machine.
        """
        try:
            result = get_machine(fqdn,
                                 redirect_to='api:annotation_add',
                                 data=request.GET)
            if isinstance(result, Serializer):
                return result.as_json
            elif isinstance(result, HttpResponseRedirect):
                return result
            machine = result
        except Exception as e:
            return ErrorMessage(str(e)).as_json

        data = json.loads(request.body.decode('utf-8'))['form']
        form = AnnotationAPIForm(data, machine=machine)

        if form.is_valid():
            try:
                cleaned_data = form.cleaned_data
                annotation = Annotation(machine_id=machine.pk,
                                        reporter=request.user,
                                        text=cleaned_data['text'])
                annotation.save()
            except Exception as e:
                logger.exception(e)
                return ErrorMessage("Something went wrong!").as_json

            return Message('Ok.').as_json

        return ErrorMessage("\n{}".format(
            format_cli_form_errors(form))).as_json
예제 #2
0
    def post(self, request, *args, **kwargs):
        """
        Add machine.
        """
        if not request.user.is_superuser:
            return ErrorMessage(
                "Only superusers are allowed to perform this action!").as_json

        data = json.loads(request.body.decode('utf-8'))['form']
        form = MachineAPIForm(data)

        if form.is_valid():

            cleaned_data = form.cleaned_data
            mac_address = cleaned_data['mac_address']
            del cleaned_data['mac_address']

            new_machine = Machine(**cleaned_data)
            new_machine.mac_address = mac_address
            try:
                new_machine.save()
            except Exception as e:
                logger.exception(e)
                return ErrorMessage("Something went wrong!").as_json

            return Message('Ok.').as_json

        return ErrorMessage("\n{}".format(
            format_cli_form_errors(form))).as_json
예제 #3
0
    def post(self, request, architecture, *args, **kwargs):
        """
        Add virtual machine for specific `architecture`.
        """
        data = json.loads(request.body.decode('utf-8'))['form']

        try:
            host = Machine.api.get(fqdn__iexact=data['host'],
                                   vm_dedicated_host=True)
        except Machine.DoesNotExist:
            return ErrorMessage("Host doesn't exist!").as_json
        except Exception as e:
            return ErrorMessage(str(e)).as_json

        if not host.virtualization_api:
            return ErrorMessage("No virtualization API available!").as_json

        form = VirtualMachineAPIForm(
            data, virtualization_api=host.virtualization_api)

        if form.is_valid():
            try:
                vm = host.virtualization_api.create(**form.cleaned_data)

                vm.reserve(reason='VM of {}'.format(request.user),
                           until=add_offset_to_date(30),
                           user=request.user)

                theader = [
                    {
                        'fqdn': 'FQDN'
                    },
                    {
                        'mac_address': 'MAC address'
                    },
                ]
                if vm.vnc['enabled']:
                    theader.append({'vnc': 'VNC'})

                response = {
                    'header': {
                        'type': 'TABLE',
                        'theader': theader
                    },
                    'data': [{
                        'fqdn': vm.fqdn,
                        'mac_address': vm.mac_address
                    }],
                }
                if vm.vnc['enabled']:
                    response['data'][0]['vnc'] = '{}:{}'.format(
                        host.fqdn, vm.vnc['port'])

                return JsonResponse(response)

            except Exception as e:
                return ErrorMessage(str(e)).as_json

        return ErrorMessage("\n{}".format(
            format_cli_form_errors(form))).as_json
예제 #4
0
    def post(self, request, *args, **kwargs):
        """
        Delete machine.
        """
        if not request.user.is_superuser:
            return ErrorMessage("Only superusers are allowed to perform this action!").as_json

        data = json.loads(request.body.decode('utf-8'))['form']
        form = DeleteMachineAPIForm(data)

        if form.is_valid():

            try:
                cleaned_data = form.cleaned_data

                machine = Machine.objects.get(fqdn__iexact=cleaned_data['fqdn'])

                if machine.is_virtual_machine():
                    host = machine.get_hypervisor()

                    if host.virtualization_api is None:
                        return ErrorMessage("No virtualization API found!").as_json

                    if host.virtualization_api.remove(machine):
                        result = machine.delete()
                else:
                    result = machine.delete()

                theader = [
                    {'objects': 'Deleted objects'},
                    {'count': '#'},
                ]

                response = {
                    'header': {'type': 'TABLE', 'theader': theader},
                    'data': [],
                }
                for key, value in result[1].items():
                    response['data'].append(
                        {
                            'objects': key.replace('data.', ''),
                            'count': value
                        }
                    )
                return JsonResponse(response)

            except Exception as e:
                logger.exception(e)
                return ErrorMessage("Something went wrong!").as_json

        return ErrorMessage("\n{}".format(format_cli_form_errors(form))).as_json
예제 #5
0
    def post(self, request, id, *args, **kwargs):
        """
        Process reservation.
        """
        try:
            machine = Machine.objects.get(pk=id)
        except Machine.DoesNotExist:
            return ErrorMessage("Machine doesn't exist!").as_json

        try:
            data = json.loads(request.body.decode('utf-8'))['form']

            if data['until'] == 0 and request.user.is_superuser:
                # set to 'infinite'
                data['until'] = datetime.date.max
            else:
                # set 'until' field (=offset) to concrete date for form validation
                data['until'] = add_offset_to_date(data['until'],
                                                   as_string=True)

            form = ReserveMachineAPIForm(data)
        except (KeyError, ValueError):
            return ErrorMessage("Data format is invalid!").as_json

        if form.is_valid():
            reason = form.cleaned_data['reason']
            until = form.cleaned_data['until']
            username = form.cleaned_data['username']

            try:
                user = User.objects.get(username=username)
            except Exception:
                return ErrorMessage("User doesn't exist!").as_json

            try:
                machine.reserve(reason,
                                until,
                                user=request.user,
                                reserve_for_user=user)
                return Message('OK.').as_json

            except Exception as e:
                return ErrorMessage(str(e)).as_json
        else:
            return ErrorMessage("\n{}".format(
                format_cli_form_errors(form))).as_json
예제 #6
0
    def post(self, request, fqdn, *args, **kwargs):
        """
        Add remote power to machine.
        """
        if not request.user.is_superuser:
            return ErrorMessage(
                "Only superusers are allowed to perform this action!").as_json

        try:
            result = get_machine(fqdn,
                                 redirect_to='api:remotepower_add',
                                 data=request.GET)
            if isinstance(result, Serializer):
                return result.as_json
            elif isinstance(result, HttpResponseRedirect):
                return result
            machine = result
        except Exception as e:
            return ErrorMessage(str(e)).as_json

        if machine.has_remotepower():
            return InfoMessage("Machine has already a remote power.").as_json

        data = json.loads(request.body.decode('utf-8'))['form']
        form = RemotePowerAPIForm(data, machine=machine)

        if form.is_valid():
            try:
                remotepower = RemotePower(**form.cleaned_data)
                remotepower.save()
            except Exception as e:
                logger.exception(e)
                return ErrorMessage("Something went wrong!").as_json

            return Message('Ok.').as_json

        return ErrorMessage("\n{}".format(
            format_cli_form_errors(form))).as_json