Exemple #1
0
    def post(self, request, format=None):
        """
        Creates a new service
        """
        if request.user.is_admin:
            serializer = self.serializer_class(data=request.data)
            if serializer.is_valid():
                # Getting serialized data
                request_data = serializer.data
                if not Service.objects.filter(name=request_data['name']):
                    try:
                        with transaction.atomic():

                            # Creating service
                            service = Service()
                            service.name = request_data['name']
                            service.category = Category.objects.get(
                                pk=request_data['category'])
                            service.cost_price = request_data['cost_price']
                            service.sale_price = request_data['sale_price']

                            if 'description' in request_data and request_data[
                                    'description']:
                                service.description = request_data[
                                    'description']

                            service.save()
                            return Response({"id": service.id},
                                            status=status.HTTP_201_CREATED)

                    except Exception as e:
                        return Response(
                            {
                                "type": "internal_server_error",
                                "detail": str(e)
                            },
                            status=status.HTTP_500_INTERNAL_SERVER_ERROR)
                else:
                    return Response({"type": "service_already_exist"},
                                    status=status.HTTP_409_CONFLICT)
            else:
                return Response(
                    {
                        "type": "validation_error",
                        "errors": serializer.errors
                    },
                    status=status.HTTP_400_BAD_REQUEST)
        else:
            return Response({"type": "unauthorized"},
                            status=status.HTTP_401_UNAUTHORIZED)
Exemple #2
0
def save(request):
    # Update service fields
    try:
        service_id = request.POST.get("id")
        if service_id != '0':
            service = Service.objects.get(id=service_id)
        else:
            service = Service()
    except Service.DoesNotExist:
        service = Service()

    service.name = request.POST['name']
    service.escalate_after = request.POST['escalate_after']
    service.retry = request.POST['retry']
    service.notifications_disabled = request.POST.get("disable_notification",
                                                      "off") == "on"
    service.send_resolve_enabled = request.POST.get(
        "send_resolve_notification", "off") == "on"
    if (request.POST['policy']):
        pol = SchedulePolicy.objects.get(id=request.POST['policy'])
    else:
        pol = None
    service.policy = pol
    # Save service
    try:
        service.save()
    except IntegrityError:
        messages.error(request, 'Service validation failed')
        if len(request.POST['id']) > 0:
            return HttpResponseRedirect(
                reverse('openduty.services.edit', None,
                        [str(request.POST['id'])]))
        else:
            return HttpResponseRedirect(reverse('openduty.services.new'))

    return HttpResponseRedirect('/services/')
class TestGetEscalation(BaseTestCase):

    def setUp(self):
        super(TestGetEscalation, self).setUp()
        self.sp = SchedulePolicy(name=random_string(), repeat_times=1)
        self.sp.save()
        self.service = Service(name=random_string(), policy=self.sp)
        self.service.save()
        self.cal = Calendar(
            name=random_string(),
            slug=random_string(),
        )
        self.cal.save()
        self.spr = SchedulePolicyRule(
            schedule_policy=self.sp,
            position=0,
            schedule=self.cal,
            escalate_after=1,
        )
        self.spr.save()

    def tearDown(self):
        super(TestGetEscalation, self).tearDown()
        try:
            self.spr.delete()
            self.cal.delete()
            self.service.delete()
            self.sp.delete()
        except:
            pass

    @pytest.mark.skip(reason="TO Be Fixed")
    def test_get_escalation_works_with_no_recurrence(self):
        event = Event(
            start=timezone.now() - timedelta(days=1),
            end=timezone.now() + timedelta(days=1),
            title='{username},{username}'.format(username=self.username),
            calendar=self.cal,
        )
        event.save()
        try:
            events = get_escalation_for_service(self.service)
            self.assertEqual(2, len(events))
        finally:
            event.delete()

    def test_get_escalation_fails_with_no_recurrence_after_event_end(self):
        event = Event(
            start = timezone.now() - timedelta(days=2),
            end = timezone.now() - timedelta(days=1),
            title = '{username},{username}'.format(username=self.username),
            calendar = self.cal,
        )
        event.save()
        try:
            events = get_escalation_for_service(self.service)
            self.assertEqual(0, len(events))
        finally:
            event.delete()

    def test_get_escalation_empty_when_recurrance_is_not_now(self):
        rule = Rule(
            name=random_string(),
            description=random_string(),
            frequency='WEEKLY',
        )
        rule.save()
        # Active yesterday, and 1 week from now, but not today
        event = Event(
            start = timezone.now() - timedelta(days=2),
            end = timezone.now() - timedelta(days=1),
            title = '{username},{username}'.format(username=self.username),
            calendar = self.cal,
            rule = rule,
        )
        event.save()
        events = get_escalation_for_service(self.service)
        self.assertEqual(0, len(events))

    @pytest.mark.skip(reason="TO Be Fixed")
    def test_get_escalation_works_when_recurrance_is_now(self):
        rule = Rule(
            name=random_string(),
            description=random_string(),
            frequency='WEEKLY',
        )
        rule.save()
        # Active last week at this time, recurring now
        event = Event(
            start = timezone.now() - timedelta(days=7, hours=5),
            end = timezone.now() + timedelta(hours=4) - timedelta(days=7),
            title = '{username},{username}'.format(username=self.username),
            calendar = self.cal,
            rule = rule,
        )
        event.save()
        events = get_escalation_for_service(self.service)
        self.assertEqual(2, len(events))

    def test_get_escalation_returns_empty_for_muted_services(self):
        event = Event(
            start = timezone.now() - timedelta(days=1),
            end = timezone.now() + timedelta(days=1),
            title = '{username},{username}'.format(username=self.username),
            calendar = self.cal,
        )
        event.save()
        self.service.notifications_disabled = True
        try:
            events = get_escalation_for_service(self.service)
            self.assertEqual(0, len(events))
        finally:
            event.delete()
Exemple #4
0
class TestAPI(BaseTestCase):
    def setUp(self):
        super(TestAPI, self).setUp()
        self.sp = SchedulePolicy(name=random_string(), repeat_times=1)
        self.sp.save()
        self.service = Service(name=random_string(), policy=self.sp)
        self.service.save()
        self.token = Token(key="testtoken")
        self.token.save()
        self.servicetoken = ServiceTokens(name="testbinding",
                                          service_id=self.service,
                                          token_id=self.token)
        self.servicetoken.save()
        self.service2 = Service(name=random_string(), policy=self.sp)
        self.service2.save()
        self.token2 = Token(key="testtoken2")
        self.token2.save()
        self.servicetoken2 = ServiceTokens(name="testbinding",
                                           service_id=self.service2,
                                           token_id=self.token2)
        self.servicetoken2.save()

    def tearDown(self):
        super(TestAPI, self).tearDown()
        try:
            self.servicetoken.delete()
            self.servicetoken2.delete()
            self.token2.delete()
            self.token.delete()
            self.service2.delete()
            self.service.delete()
            self.sp.delete()
        except:
            pass

    def test_create_event(self):
        try:
            client = APIClient()
            response = client.post(
                '/api/create_event',
                data={
                    "incident_key": "testing",
                    "service_key": self.token.key,
                    "event_type": "trigger",
                    "description": "test",
                    "details": "test"
                },
            )
            self.assertEqual(201, response.status_code)
            new_instance = Incident.objects.get(incident_key='testing')
            self.assertEqual("testing", new_instance.incident_key)
            self.assertEqual(Incident.TRIGGER, new_instance.event_type)
            self.assertEqual(self.service, new_instance.service_key)
        finally:
            pass

    def test_create_event_fails_with_invalid_key(self):
        try:
            client = APIClient()
            response = client.post(
                '/api/create_event',
                data={
                    "incident_key": "testing",
                    "service_key": "invalid",
                    "event_type": "trigger",
                    "description": "test",
                    "details": "test"
                },
            )
            self.assertEqual(403, response.status_code)
        finally:
            pass

    def inject_incident(self):
        incident = Incident()
        incident.service_key = self.service
        incident.event_type = Incident.TRIGGER
        incident.incident_key = "testing"
        incident.description = "test"
        incident.details = "test"
        incident.occurred_at = timezone.now()
        incident.save()

    def test_create_event_different_service(self):
        self.inject_incident()
        try:
            client = APIClient()
            response = client.post(
                '/api/create_event',
                data={
                    "incident_key": "testing",
                    "service_key": self.token2.key,
                    "event_type": "trigger",
                    "description": "test",
                    "details": "test"
                },
            )
            self.assertEqual(201, response.status_code)
            incidents = Incident.objects.all()
            self.assertEqual(2, incidents.count())
        finally:
            pass

    def test_incident_recovery(self):
        self.inject_incident()
        try:
            client = APIClient()
            response = client.post(
                '/api/create_event',
                data={
                    "incident_key": "testing",
                    "service_key": self.token.key,
                    "event_type": "resolve",
                    "description": "test",
                    "details": "test"
                },
            )
            self.assertEqual(201, response.status_code)
            updated = Incident.objects.get(incident_key='testing')
            self.assertEqual(Incident.RESOLVE, updated.event_type)
        finally:
            updated.delete()

    def test_incident_acknowledge(self):
        self.inject_incident()
        try:
            client = APIClient()
            response = client.post(
                '/api/create_event',
                data={
                    "incident_key": "testing",
                    "service_key": self.token.key,
                    "event_type": "acknowledge",
                    "description": "test",
                    "details": "test"
                },
            )
            self.assertEqual(201, response.status_code)
            updated = Incident.objects.get(incident_key='testing')
            self.assertEqual(Incident.ACKNOWLEDGE, updated.event_type)
        finally:
            updated.delete()