1735490e2d9048d55ee691d9e362a28cba6935ae
[plcapi.git] / aspects / omfaspects.py
1 # Baris Metin <tmetin@sophia.inria.fr>
2
3 import os
4 import xmlrpclib
5
6 from PLC.Slices import Slices
7 from PLC.SliceTags import SliceTags
8 from PLC.Nodes import Nodes
9 from PLC.Config import Config
10 from pyaspects.meta import MetaAspect
11
12
13 class BaseOMF(object):
14
15     def __init__(self):
16         self.config = Config("/etc/planetlab/plc_config")
17         # this was only for debugging, no need to log all method calls here -baris
18         # self.log = open("/var/log/omf/plc_slice_calls.log", "a")
19         self.log = None
20         
21
22     def logit(self, call, args, kwargs, data, slice):
23         if not self.log: return
24
25         self.log.write("%s : args: %s  kwargs: %s\n" % (call, args, kwargs))
26         self.log.write("data: %s\n" % data)
27         self.log.write("%s\n\n" % slice)
28         self.log.flush()
29
30            
31     def get_slice(self, api, id_or_name):
32         slice_filter = {}
33         try: # if integer
34             slice_filter['slice_id'] = int(str(id_or_name))
35         except ValueError:
36             # we have a string
37             slice_filter['name'] = id_or_name
38         slice = Slices(api, slice_filter = slice_filter)[0]
39 # don't bother to check for slice tags for the moment. we'll only
40 # create XMPP pubsub groups for all slices
41 #
42 #         slice_tags = SliceTags(api, slice_tag_filter = { 'slice_id': slice['slice_id'] })
43 #         omf_tag = [tag for tag in slice_tags if tag['name'] == 'omf']
44 #         if omf_tag and omf_tag['value'] not in ('false','0','no'):
45 #             # OK, slice has the "omf" tag set.
46 #             return slice
47 #         return None
48         return slice
49
50     def get_node_hostname(self, api, node_id_or_hostname):
51         node_filter = {}
52         try:
53             node_filter['node_id'] = int(str(node_id_or_hostname))
54         except ValueError:
55             # we have a hostname
56             node_filter['hostname'] = node_id_or_hostname
57
58         try:
59             node = Nodes(api, node_filter = node_filter)[0]
60             return node['hostname']
61         except IndexError:
62             return None
63         
64     def get_slice_tags(self, api, slice_id):
65         return SliceTags(api, slice_tag_filter = {'slice_id': slice_id})
66
67     def create_slice(self, slice):
68         pass
69
70     def add_resource(self, slice, resource):
71         pass
72
73     def delete_slice(self, slice):
74         pass
75
76     def delete_resource(self, slice, resource):
77         pass
78
79     # aspect method
80     def before(self, wobj, data, *args, **kwargs):
81         api_method_name = wobj.name
82         slice_name_or_id = None
83         node_ids = None
84
85         # DeleteSlice shall be handled before the actual method call;
86         # after the call we won't be able to acess the slice.
87         if api_method_name == "DeleteSlice":
88             slice_name_or_id = args[1]        
89         else: # ignore the rest
90             return
91
92         slice = self.get_slice(wobj.api, slice_name_or_id)
93         if not slice:
94             return
95
96         if api_method_name == "DeleteSlice":
97             self.delete_slice(slice['name'])
98
99         self.logit(wobj.name, args, kwargs, data, slice)
100
101     # aspect method
102     def after(self, wobj, data, *args, **kwargs):
103         api_method_name = wobj.name
104         slice_name_or_id = None
105         node_ids = None
106         if api_method_name == "AddSlice":
107             slice_name_or_id = args[1]['name']
108         elif api_method_name == "AddSliceToNodes" or api_method_name == "DeleteSliceFromNodes":
109             slice_name_or_id = args[1]
110             node_ids = args[2]
111         else: # ignore the rest
112             #self.logit(wobj.name, args, kwargs, data, "SLICE")
113             return
114
115         slice = self.get_slice(wobj.api, slice_name_or_id)
116         if not slice:
117             return
118
119         if api_method_name == "AddSlice":
120             self.create_slice(slice['name'])
121         elif api_method_name == "AddSliceToNodes":
122             for node_id in node_ids:
123                 node_hostname = self.get_node_hostname(wobj.api, node_id)
124                 self.add_resource(slice['name'], node_hostname)
125         elif api_method_name == "DeleteSliceFromNodes":
126             for node_id in node_ids:
127                 node_hostname = self.get_node_hostname(wobj.api, node_id)
128                 self.delete_resource(slice['name'], node_hostname)
129
130         self.logit(wobj.name, args, kwargs, data, slice)
131
132
133
134 class OMFAspect_xmlrpc(BaseOMF):
135     __metaclass__ = MetaAspect
136     name = "omfaspect_xmlrpc"
137
138     def __init__(self):
139         BaseOMF.__init__(self)
140
141         slicemgr_url = self.config.PLC_OMF_SLICEMGR_URL
142         self.server = xmlrpclib.ServerProxy(slicemgr_url, allow_none = 1)
143
144     def create_slice(self, slice):
145         self.server.createSlice(slice)
146
147     def add_resource(self, slice, resource):
148         self.server.addResource(slice, resource)
149
150     def delete_slice(self, slice):
151         self.server.deleteSlice(slice)
152         
153     def delete_resource(self, slice, resource):
154         self.server.removeResource(slice, resource)
155
156     def before(self, wobj, data, *args, **kwargs):
157         BaseOMF.before(self, wobj, data, *args, **kwargs)
158
159     def after(self, wobj, data, *args, **kwargs):
160         BaseOMF.after(self, wobj, data, *args, **kwargs)
161
162
163
164 OMFAspect = OMFAspect_xmlrpc
165