1 # Baris Metin <tmetin@sophia.inria.fr>
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
13 class BaseOMF(object):
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")
22 def logit(self, call, args, kwargs, data, slice):
23 if not self.log: return
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)
31 def get_slice(self, api, id_or_name):
34 slice_filter['slice_id'] = int(str(id_or_name))
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
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.
50 def get_node_hostname(self, api, node_id_or_hostname):
53 node_filter['node_id'] = int(str(node_id_or_hostname))
56 node_filter['hostname'] = node_id_or_hostname
59 node = Nodes(api, node_filter = node_filter)[0]
60 return node['hostname']
64 def get_slice_tags(self, api, slice_id):
65 return SliceTags(api, slice_tag_filter = {'slice_id': slice_id})
67 def create_slice(self, slice):
70 def add_resource(self, slice, resource):
73 def delete_slice(self, slice):
76 def delete_resource(self, slice, resource):
80 def before(self, wobj, data, *args, **kwargs):
81 api_method_name = wobj.name
82 slice_name_or_id = None
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
92 slice = self.get_slice(wobj.api, slice_name_or_id)
96 if api_method_name == "DeleteSlice":
97 self.delete_slice(slice['name'])
99 self.logit(wobj.name, args, kwargs, data, slice)
102 def after(self, wobj, data, *args, **kwargs):
103 api_method_name = wobj.name
104 slice_name_or_id = 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]
111 else: # ignore the rest
112 #self.logit(wobj.name, args, kwargs, data, "SLICE")
115 slice = self.get_slice(wobj.api, slice_name_or_id)
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)
130 self.logit(wobj.name, args, kwargs, data, slice)
134 class OMFAspect_xmlrpc(BaseOMF):
135 __metaclass__ = MetaAspect
136 name = "omfaspect_xmlrpc"
139 BaseOMF.__init__(self)
141 slicemgr_url = self.config.PLC_OMF_SLICEMGR_URL
142 self.server = xmlrpclib.ServerProxy(slicemgr_url, allow_none = 1)
144 def create_slice(self, slice):
145 self.server.createSlice(slice)
147 def add_resource(self, slice, resource):
148 self.server.addResource(slice, resource)
150 def delete_slice(self, slice):
151 self.server.deleteSlice(slice)
153 def delete_resource(self, slice, resource):
154 self.server.removeResource(slice, resource)
156 def before(self, wobj, data, *args, **kwargs):
157 BaseOMF.before(self, wobj, data, *args, **kwargs)
159 def after(self, wobj, data, *args, **kwargs):
160 BaseOMF.after(self, wobj, data, *args, **kwargs)
164 OMFAspect = OMFAspect_xmlrpc