diff --git a/flowspec/models.py b/flowspec/models.py index 2b9a2ba2863910f86edc377a2f450ea9063295e9..e3a1c197ca7c3ee91e5385b1b0b3cf4064d7aa85 100644 --- a/flowspec/models.py +++ b/flowspec/models.py @@ -90,6 +90,7 @@ ROUTE_STATES = ( ("OUTOFSYNC", "OUTOFSYNC"), ("INACTIVE", "INACTIVE"), ("ADMININACTIVE", "ADMININACTIVE"), + ("INACTIVE_TODELETE", "INACTIVE_TODELETE"), ) @@ -310,6 +311,7 @@ class Route(models.Model): def commit_delete(self, *args, **kwargs): logger.info("model::commit_delete(): route="+str(self)+", kwargs="+str(kwargs)) + username = None reason_text = '' reason = '' @@ -535,7 +537,7 @@ class Route(models.Model): self.status = "ACTIVE" self.save() found = True - if self.status == "ADMININACTIVE" or self.status == "INACTIVE" or self.status == "EXPIRED": + if self.status == "ADMININACTIVE" or self.status == "INACTIVE" or self.status == "INACTIVE_TODELETE" or self.status == "EXPIRED": found = True return found @@ -630,7 +632,7 @@ class Route(models.Model): @property def days_to_expire(self): - if self.status not in ['EXPIRED', 'ADMININACTIVE', 'ERROR', 'INACTIVE']: + if self.status not in ['EXPIRED', 'ADMININACTIVE', 'ERROR', 'INACTIVE', 'INACTIVE_TODELETE']: expiration_days = (self.expires - datetime.date.today()).days if expiration_days < settings.EXPIRATION_NOTIFY_DAYS: return "%s" %expiration_days diff --git a/flowspec/tasks.py b/flowspec/tasks.py index 8d0ed06d054772b6d6a45d27811d23b20750c107..6e6d4ca0d09bf58570a52331845331f094cb01de 100644 --- a/flowspec/tasks.py +++ b/flowspec/tasks.py @@ -138,43 +138,49 @@ def edit(route, callback=None): @task(ignore_result=True) def delete(route, **kwargs): - logger.info("tasks::delete(): called") + logger.info("tasks::delete(): called route="+str(route)) + logger.info("tasks::delete(): called route.dir="+str(dir(route))) logger.info("tasks::delete(): called kwargs="+str(kwargs)) + initial_status = route.status + logger.info("tasks::delete(): called initial_status="+str(initial_status)) try: applier = PR.Applier(route_object=route) commit, response = applier.apply(operation="delete") reason_text = '' + logger.info("tasks::delete(): called commit="+str(commit)) if commit: - status = "INACTIVE" - if "reason" in kwargs and kwargs['reason'] == 'EXPIRED': - status = 'EXPIRED' - reason_text = " Reason: %s " % status - else: - status = 'DELETED' - route.status = status - route.response = response - if route.status == "DELETED": # special new case for fully deleting a rule via REST API + status = "INACTIVE" + if "reason" in kwargs and kwargs['reason'] == 'EXPIRED': + status = 'EXPIRED' + reason_text = " Reason: %s " % status + else: + status = "ERROR" + + if commit and initial_status == "INACTIVE_TODELETE": # special new case for fully deleting a rule via REST API route.delete() msg1 = "[%s] Fully deleted rule : %s%s- Result %s" % (route.applier, route.name, reason_text, response) logger.info("tasks::delete(): DELETED msg="+msg1) announce(msg1, route.applier, route) - else: + else: + route.status = status + route.response = response + route.save() msg1 = "[%s] Suspending rule : %s%s- Result %s" % (route.applier, route.name, reason_text, response) logger.info("tasks::delete(): msg="+msg1) announce(msg1 , route.applier, route) - try: + try: snmp_add_initial_zero_value.delay(str(route.id), False) - except Exception as e: + except Exception as e: logger.error("tasks::delete(): route="+str(route)+", INACTIVE, add_null_value failed: "+str(e)) - else: - status = "ERROR" - route.status = status - route.response = response - route.save() - msg1 = "[%s] Suspending rule : %s%s- Result %s" % (route.applier, route.name, reason_text, response) - logger.info("tasks::delete(): ERROR msg="+msg1) - announce(msg1, route.applier, route) +# else: +# status = "ERROR" +# route.status = status +# route.response = response +# route.save() +# msg1 = "[%s] Suspending rule : %s%s- Result %s" % (route.applier, route.name, reason_text, response) +# logger.info("tasks::delete(): ERROR msg="+msg1) +# announce(msg1, route.applier, route) except TimeLimitExceeded: route.status = "ERROR" route.response = "Task timeout" diff --git a/flowspec/validators.py b/flowspec/validators.py index fce7796f6ab0e5cd85de42c14ec2b626d695928f..c20aa0facf073fe7afb75cbbfc457adf1a459fa4 100644 --- a/flowspec/validators.py +++ b/flowspec/validators.py @@ -41,7 +41,7 @@ def clean_status(status): :rtype: str """ - allowed_states = ['ACTIVE', 'INACTIVE'] + allowed_states = ['ACTIVE', 'INACTIVE', 'INACTIVE_TODELETE'] if status not in allowed_states: return _('Invalid status value. You are allowed to use "{}".'.format( diff --git a/flowspec/viewsets.py b/flowspec/viewsets.py index 4d040da0cf353e766af3acacd855dfdce6e4d8d0..d74297bc52f81d21ba15d65499234cf7276a851f 100644 --- a/flowspec/viewsets.py +++ b/flowspec/viewsets.py @@ -170,6 +170,16 @@ class RouteViewSet(viewsets.ModelViewSet): if serializer.is_valid(): new_status = serializer.object.status super(RouteViewSet, self).update(request, pk, partial=partial) + + logger.info("RouteViewSet::update(): called request="+str(request)) + if request.META.has_key('HTTP_X_METHODOVERRIDE'): + method_overriden = request.META['HTTP_X_METHODOVERRIDE'] + logger.info("RouteViewSet::update(): HTTP_X_METHODOVERRIDE="+str(method_overriden)) + if method_overriden == "DELETE": + logger.info("RouteViewSet::update(): redirecting to delete with full delete on") + obj.status = "INACTIVE_TODELETE" + return self.delete(obj) + if old_status == 'ACTIVE': work_on_active_object(obj, new_status) elif old_status in ['INACTIVE', 'ERROR']: @@ -198,13 +208,17 @@ class RouteViewSet(viewsets.ModelViewSet): def helper_override_user(self, obj): #if self.request.user.is_superuser and obj.applier!=None: from django.contrib.auth.models import User - if self.request.user.is_superuser and self.request.POST["applier"]!=None: - os.write(4, "debug requesta1 "+str(self.request.POST["applier"])+"\n") - obj.applier = User.objects.get(username=self.request.POST["applier"]) + applier_speced = None + if "applier" in self.request.POST: + applier_speced = self.request.POST["applier"] + if self.request.user.is_superuser and applier_speced!=None: + os.write(4, "debug requesta1 "+str(applier_speced)+"\n") + obj.applier = User.objects.get(username=applier_speced) elif self.request.user.is_superuser: - os.write(4, "debug requesta2 "+str(self.request.POST["applier"])+"\n") + os.write(4, "debug requesta2 "+str(applier_speced)+"\n") #obj.applier = self.request.user - obj.applier = User.objects.get(username='tomas.jra2t6') + #obj.applier = User.objects.get(username='tomas.jra2t6') + obj.applier = User.objects.get(username='david.jra2t6') #raise PermissionDenied('Is superuser') #obj.applier = User.objects.get(id='tomas.jra2t6') #logger.info("debug request "+str(self.request)) @@ -216,7 +230,7 @@ class RouteViewSet(viewsets.ModelViewSet): #os.write(4, "debug requestd "+str(dir(self.request))+"\n") #os.write(4, "debug requestd "+str(type(self.request.POST))+"\n") #os.write(4, "debug requestd "+str(dir(self.request.POST))+"\n") - #os.write(4, "debug requesta "+str(self.request.POST["applier"])+"\n") + #os.write(4, "debug requesta "+str(applier_speced)+"\n") #obj.comments = obj.comments+" "+str(os.getpid()) else: #raise PermissionDenied('Is not superuser') @@ -227,8 +241,9 @@ class RouteViewSet(viewsets.ModelViewSet): obj.commit_add() def pre_delete(self, obj): + logger.info("RouteViewSet::pre_delete(): called "+str(self)+", obj="+str(obj)) obj.commit_delete() - + logger.info("RouteViewSet::pre_delete(): returning "+str(self)+", obj="+str(obj)) class PortViewSet(viewsets.ModelViewSet): queryset = MatchPort.objects.all()