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 self.log = open("/var/log/omf/plc_slice_calls.log", "a")
19 def logit(self, call, args, kwargs, data, slice):
20 self.log.write("%s : args: %s kwargs: %s\n" % (call, args, kwargs))
21 self.log.write("data: %s\n" % data)
22 self.log.write("%s\n\n" % slice)
26 def get_slice(self, api, id_or_name):
28 if isinstance(id_or_name, str):
29 slice_filter['name'] = id_or_name
31 slice_filter['slice_id']= id_or_name
32 slice = Slices(api, slice_filter = slice_filter)[0]
33 # don't bother to check for slice tags for the moment. we'll only
34 # create XMPP pubsub groups for all slices
36 # slice_tags = SliceTags(api, slice_tag_filter = { 'slice_id': slice['slice_id'] })
37 # omf_tag = [tag for tag in slice_tags if tag['name'] == 'omf']
38 # if omf_tag and omf_tag['value'] not in ('false','0','no'):
39 # # OK, slice has the "omf" tag set.
44 def get_node_hostname(self, api, node_id):
45 node_filter = {'node_id': node_id }
47 node = Nodes(api, node_filter = node_filter)[0]
48 return node['hostname']
52 def get_slice_tags(self, api, slice_id):
53 return SliceTags(api, slice_tag_filter = {'slice_id': slice_id})
55 def create_slice(self, slice):
58 def add_resource(self, slice, resource):
61 def delete_slice(self, slice):
64 def delete_resource(self, slice, resource):
68 def before(self, wobj, data, *args, **kwargs):
69 api_method_name = wobj.name
70 slice_name_or_id = None
73 # DeleteSlice shall be handled before the actual method call;
74 # after the call we won't be able to acess the slice.
75 if api_method_name == "DeleteSlice":
76 slice_name_or_id = args[1]
77 else: # ignore the rest
80 slice = self.get_slice(wobj.api, slice_name_or_id)
84 if api_method_name == "DeleteSlice":
85 self.delete_slice(slice['name'])
87 self.logit(wobj.name, args, kwargs, data, slice)
90 def after(self, wobj, data, *args, **kwargs):
91 api_method_name = wobj.name
92 slice_name_or_id = None
94 if api_method_name == "AddSlice":
95 slice_name_or_id = args[1]['name']
96 elif api_method_name == "AddSliceToNodes" or api_method_name == "DeleteSliceFromNodes":
97 slice_name_or_id = args[1]
99 else: # ignore the rest
100 #self.logit(wobj.name, args, kwargs, data, "SLICE")
103 slice = self.get_slice(wobj.api, slice_name_or_id)
107 if api_method_name == "AddSlice":
108 self.create_slice(slice['name'])
109 elif api_method_name == "AddSliceToNodes":
110 for node_id in node_ids:
111 node_hostname = self.get_node_hostname(wobj.api, node_id)
112 self.add_resource(slice['name'], node_hostname)
113 elif api_method_name == "DeleteSliceFromNodes":
114 for node_id in node_ids:
115 node_hostname = self.get_node_hostname(wobj.api, node_id)
116 self.delete_resource(slice['name'], node_hostname)
118 self.logit(wobj.name, args, kwargs, data, slice)
122 class OMFAspect_xmlrpc(BaseOMF):
123 __metaclass__ = MetaAspect
124 name = "omfaspect_xmlrpc"
127 BaseOMF.__init__(self)
129 slicemgr_url = self.config.PLC_OMF_SLICEMGR_URL
130 self.server = xmlrpclib.ServerProxy(slicemgr_url)
132 def create_slice(self, slice):
133 self.server.slicemgr.createSlice(slice)
135 def add_resource(self, slice, resource):
136 self.server.slicemgr.addResource(slice, resource)
138 def delete_slice(self, slice):
139 self.server.slicemgr.deleteSlice(slice)
141 def delete_resource(self, slice, resource):
142 self.server.slicemgr.removeResource(slice, resource)
144 def before(self, wobj, data, *args, **kwargs):
145 BaseOMF.before(self, wobj, data, *args, **kwargs)
147 def after(self, wobj, data, *args, **kwargs):
148 BaseOMF.after(self, wobj, data, *args, **kwargs)
152 OMFAspect = OMFAspect_xmlrpc