1 # Baris Metin <tmetin@sophia.inria.fr>
6 from PLC.Slices import Slices
7 from PLC.SliceTags import SliceTags, SliceTag
8 from PLC.TagTypes import TagTypes
9 from PLC.Nodes import Nodes
10 from PLC.Config import Config
11 from pyaspects.meta import MetaAspect
14 class BaseOMF(object):
17 self.config = Config("/etc/planetlab/plc_config")
18 # this was only for debugging, no need to log all method calls here -baris
19 # self.log = open("/var/log/omf/plc_slice_calls.log", "a")
23 def logit(self, call, args, kwargs, data, slice):
24 if not self.log: return
26 self.log.write("%s : args: %s kwargs: %s\n" % (call, args, kwargs))
27 self.log.write("data: %s\n" % data)
28 self.log.write("%s\n\n" % slice)
32 def get_slice(self, api, id_or_name):
35 slice_filter['slice_id'] = int(str(id_or_name))
38 slice_filter['name'] = id_or_name
39 slice = Slices(api, slice_filter = slice_filter)[0]
40 # don't bother to check for slice tags for the moment. we'll only
41 # create XMPP pubsub groups for all slices
43 # slice_tags = SliceTags(api, slice_tag_filter = { 'slice_id': slice['slice_id'] })
44 # omf_tag = [tag for tag in slice_tags if tag['name'] == 'omf']
45 # if omf_tag and omf_tag['value'] not in ('false','0','no'):
46 # # OK, slice has the "omf" tag set.
51 def get_node_hostname(self, api, node_id_or_hostname):
54 node_filter['node_id'] = int(str(node_id_or_hostname))
57 node_filter['hostname'] = node_id_or_hostname
60 node = Nodes(api, node_filter = node_filter)[0]
61 return node['hostname']
65 def get_slice_tags(self, api, slice_id):
66 return SliceTags(api, slice_tag_filter = {'slice_id': slice_id})
68 def get_tag_type(self, api, tagname):
70 tag = TagTypes(api, {'tagname':tagname})[0]
75 def create_slice(self, slice):
78 def add_resource(self, slice, resource):
81 def delete_slice(self, slice):
84 def delete_resource(self, slice, resource):
88 def before(self, wobj, data, *args, **kwargs):
89 api_method_name = wobj.name
90 slice_name_or_id = None
93 # DeleteSlice shall be handled before the actual method call;
94 # after the call we won't be able to acess the slice.
95 if api_method_name == "DeleteSlice":
96 slice_name_or_id = args[1]
97 else: # ignore the rest
100 slice = self.get_slice(wobj.api, slice_name_or_id)
104 if api_method_name == "DeleteSlice":
105 self.delete_slice(slice['name'])
107 self.logit(wobj.name, args, kwargs, data, slice)
110 def after(self, wobj, data, *args, **kwargs):
111 api_method_name = wobj.name
112 slice_name_or_id = None
114 if api_method_name == "AddSlice":
115 slice_name_or_id = args[1]['name']
116 elif api_method_name == "AddSliceToNodes" or api_method_name == "DeleteSliceFromNodes":
117 slice_name_or_id = args[1]
119 elif api_method_name == "AddSliceTag":
120 slice_name_or_id = args[1]
121 else: # ignore the rest
122 #self.logit(wobj.name, args, kwargs, data, "SLICE")
125 slice = self.get_slice(wobj.api, slice_name_or_id)
129 if api_method_name == "AddSlice":
130 self.create_slice(slice['name'])
131 elif api_method_name == "AddSliceToNodes":
132 for node_id in node_ids:
133 node_hostname = self.get_node_hostname(wobj.api, node_id)
134 self.add_resource(slice['name'], node_hostname)
135 elif api_method_name == "DeleteSliceFromNodes":
136 for node_id in node_ids:
137 node_hostname = self.get_node_hostname(wobj.api, node_id)
138 self.delete_resource(slice['name'], node_hostname)
139 elif api_method_name == "AddSliceTag":
140 # OMF slices need to have dotsshmount vsys tag set to be
141 # able to access users' public keys.
142 tag_type_id_or_name = args[2]
143 omf_tag = self.get_tag_type(wobj.api, "omf_control")
144 vsys_tag = self.get_tag_type(wobj.api, "vsys")
145 if tag_type_id_or_name in (omf_tag['tagname'], omf_tag['tag_type_id']):
146 slice_tag = SliceTag(wobj.api)
147 slice_tag['slice_id'] = slice['slice_id']
148 slice_tag['tag_type_id'] = vsys_tag['tag_type_id']
149 slice_tag['value'] = u'dotsshmount'
153 self.logit(wobj.name, args, kwargs, data, slice)
157 class OMFAspect_xmlrpc(BaseOMF):
158 __metaclass__ = MetaAspect
159 name = "omfaspect_xmlrpc"
162 BaseOMF.__init__(self)
164 slicemgr_url = self.config.PLC_OMF_SLICEMGR_URL
165 self.server = xmlrpclib.ServerProxy(slicemgr_url, allow_none = 1)
167 def create_slice(self, slice):
168 self.server.createSlice(slice)
170 def add_resource(self, slice, resource):
171 self.server.addResource(slice, resource)
173 def delete_slice(self, slice):
174 self.server.deleteSlice(slice)
176 def delete_resource(self, slice, resource):
177 self.server.removeResource(slice, resource)
179 def before(self, wobj, data, *args, **kwargs):
180 BaseOMF.before(self, wobj, data, *args, **kwargs)
182 def after(self, wobj, data, *args, **kwargs):
183 BaseOMF.after(self, wobj, data, *args, **kwargs)
187 OMFAspect = OMFAspect_xmlrpc