blob: 9333adc3e970bac1c38e70c6e639b5be5bb98f09 [file] [log] [blame]
Sapan Bhatia0235e982014-09-03 13:14:40 -04001from django.db.models.signals import post_save
2from django.dispatch import receiver
3import pdb
Sapan Bhatia475c5972014-11-05 10:32:41 -05004from dependency_walker import *
Sapan Bhatia3a5980e2014-09-15 03:48:11 -04005import model_policies
Tony Macka7dbd422015-01-05 22:48:11 -05006from util.logger import logger
Sapan Bhatiad49ba532015-01-23 16:09:28 +00007from datetime import datetime
8import time
9from core.models import *
10from django.db.transaction import atomic
11from django.db.models import F, Q
Sapan Bhatiae2ace182015-01-16 22:17:42 +000012
Scott Baker79eaac22014-10-21 15:05:29 -070013modelPolicyEnabled = True
Sapan Bhatia538067c2015-05-09 18:10:17 +020014bad_instances=[]
Scott Baker79eaac22014-10-21 15:05:29 -070015
16def EnableModelPolicy(x):
17 global modelPolicyEnabled
18 modelPolicyEnabled = x
19
Sapan Bhatia538067c2015-05-09 18:10:17 +020020def update_wp(d, o):
21 try:
22 save_fields = []
23 if (d.write_protect != o.write_protect):
24 d.write_protect = o.write_protect
25 save_fields.append('write_protect')
26 if (save_fields):
27 d.save(update_fields=save_fields)
28 except AttributeError,e:
29 raise e
30
Sapan Bhatia475c5972014-11-05 10:32:41 -050031def update_dep(d, o):
Sapan Bhatia538067c2015-05-09 18:10:17 +020032 try:
33 print 'Trying to update %s'%d
34 save_fields = []
35 if (d.updated < o.updated):
36 save_fields = ['updated']
37
38 if (save_fields):
39 d.save(update_fields=save_fields)
40 except AttributeError,e:
41 raise e
42
Sapan Bhatia475c5972014-11-05 10:32:41 -050043def delete_if_inactive(d, o):
Sapan Bhatia538067c2015-05-09 18:10:17 +020044 try:
45 d.delete()
46 print "Deleted %s (%s)"%(d,d.__class__.__name__)
47 except:
48 pass
49 return
50
Sapan Bhatia475c5972014-11-05 10:32:41 -050051
Sapan Bhatiad49ba532015-01-23 16:09:28 +000052@atomic
53def execute_model_policy(instance, deleted):
Sapan Bhatia538067c2015-05-09 18:10:17 +020054 # Automatic dirtying
55 if (instance in bad_instances):
56 return
Sapan Bhatiae2ace182015-01-16 22:17:42 +000057
Sapan Bhatia538067c2015-05-09 18:10:17 +020058 # These are the models whose children get deleted when they are
59 delete_policy_models = ['Slice','Sliver','Network']
60 sender_name = instance.__class__.__name__
61 policy_name = 'model_policy_%s'%sender_name
62 noargs = False
Sapan Bhatiad49ba532015-01-23 16:09:28 +000063
Sapan Bhatia538067c2015-05-09 18:10:17 +020064 if (not deleted):
65 walk_inv_deps(update_dep, instance)
66 walk_deps(update_wp, instance)
67 elif (sender_name in delete_policy_models):
68 walk_inv_deps(delete_if_inactive, instance)
Sapan Bhatiae2ace182015-01-16 22:17:42 +000069
Sapan Bhatia538067c2015-05-09 18:10:17 +020070
71
72 try:
73 policy_handler = getattr(model_policies, policy_name, None)
74 logger.error("POLICY HANDLER: %s %s" % (policy_name, policy_handler))
75 if policy_handler is not None:
76 if (deleted):
77 try:
78 policy_handler.handle_delete(instance)
79 except AttributeError:
80 pass
81 else:
82 policy_handler.handle(instance)
83 except:
84 logger.log_exc("Model Policy Error:")
85
86 try:
87 instance.policed=datetime.now()
Sapan Bhatiad49ba532015-01-23 16:09:28 +000088 instance.save(update_fields=['policed'])
Sapan Bhatia538067c2015-05-09 18:10:17 +020089 except:
90 logging.error('Object %r is defective'%instance)
91 bad_instances.append(instance)
Sapan Bhatiae2ace182015-01-16 22:17:42 +000092
Sapan Bhatiad49ba532015-01-23 16:09:28 +000093def run_policy():
Sapan Bhatia538067c2015-05-09 18:10:17 +020094 from core.models import Sliver,Slice,Controller,Network,User,SlicePrivilege,Site,SitePrivilege,Image,ControllerSlice,ControllerUser,ControllerSite
95 while (True):
96 start = time.time()
97 models = [Sliver,Slice, Controller, Network, User, SlicePrivilege, Site, SitePrivilege, Image, ControllerSlice, ControllerSite, ControllerUser]
98 objects = []
99 deleted_objects = []
Sapan Bhatia475c5972014-11-05 10:32:41 -0500100
Sapan Bhatia538067c2015-05-09 18:10:17 +0200101 for m in models:
102 res = m.objects.filter(Q(policed__lt=F('updated')) | Q(policed=None))
103 objects.extend(res)
104 res = m.deleted_objects.filter(Q(policed__lt=F('updated')) | Q(policed=None))
105 deleted_objects.extend(res)
106
107 for o in objects:
108 execute_model_policy(o, o.deleted)
109
110 for o in deleted_objects:
111 execute_model_policy(o, True)
112
113
114 if (time.time()-start<1):
115 time.sleep(1)