import xmlrpclib
from PLC.Slices import Slices
-from PLC.SliceTags import SliceTags
+from PLC.SliceTags import SliceTags, SliceTag
+from PLC.TagTypes import TagTypes
from PLC.Nodes import Nodes
from PLC.Config import Config
from pyaspects.meta import MetaAspect
def __init__(self):
self.config = Config("/etc/planetlab/plc_config")
- self.log = open("/var/log/omf/plc_slice_calls.log", "a")
+ # this was only for debugging, no need to log all method calls here -baris
+ # self.log = open("/var/log/omf/plc_slice_calls.log", "a")
+ self.log = None
+
def logit(self, call, args, kwargs, data, slice):
+ if not self.log: return
+
self.log.write("%s : args: %s kwargs: %s\n" % (call, args, kwargs))
self.log.write("data: %s\n" % data)
self.log.write("%s\n\n" % slice)
def get_slice(self, api, id_or_name):
slice_filter = {}
- if isinstance(id_or_name, str):
+ try: # if integer
+ slice_filter['slice_id'] = int(str(id_or_name))
+ except ValueError:
+ # we have a string
slice_filter['name'] = id_or_name
- else:
- slice_filter['slice_id']= id_or_name
slice = Slices(api, slice_filter = slice_filter)[0]
# don't bother to check for slice tags for the moment. we'll only
# create XMPP pubsub groups for all slices
# return None
return slice
- def get_node_hostname(self, api, node_id):
- node_filter = {'node_id': node_id }
+ def get_node_hostname(self, api, node_id_or_hostname):
+ node_filter = {}
+ try:
+ node_filter['node_id'] = int(str(node_id_or_hostname))
+ except ValueError:
+ # we have a hostname
+ node_filter['hostname'] = node_id_or_hostname
+
try:
node = Nodes(api, node_filter = node_filter)[0]
return node['hostname']
def get_slice_tags(self, api, slice_id):
return SliceTags(api, slice_tag_filter = {'slice_id': slice_id})
+ def get_tag_type(self, api, tagname):
+ try:
+ tag = TagTypes(api, {'tagname':tagname})[0]
+ return tag
+ except IndexError:
+ return None
+
def create_slice(self, slice):
pass
elif api_method_name == "AddSliceToNodes" or api_method_name == "DeleteSliceFromNodes":
slice_name_or_id = args[1]
node_ids = args[2]
+ elif api_method_name == "AddSliceTag":
+ slice_name_or_id = args[1]
else: # ignore the rest
#self.logit(wobj.name, args, kwargs, data, "SLICE")
return
for node_id in node_ids:
node_hostname = self.get_node_hostname(wobj.api, node_id)
self.delete_resource(slice['name'], node_hostname)
-
- self.logit(wobj.name, args, kwargs, data, slice)
+ elif api_method_name == "AddSliceTag":
+ # OMF slices need to have dotsshmount vsys tag set to be
+ # able to access users' public keys.
+ tag_type_id_or_name = args[2]
+ omf_tag = self.get_tag_type(wobj.api, "omf_control")
+ vsys_tag = self.get_tag_type(wobj.api, "vsys")
+ if tag_type_id_or_name in (omf_tag['tagname'], omf_tag['tag_type_id']):
+ slice_tag = SliceTag(wobj.api)
+ slice_tag['slice_id'] = slice['slice_id']
+ slice_tag['tag_type_id'] = vsys_tag['tag_type_id']
+ slice_tag['value'] = u'dotsshmount'
+ slice_tag.sync()
-class OMFAspect_xmpp(BaseOMF):
- __metaclass__ = MetaAspect
- name = "omfaspect_xmpp"
-
- def __init__(self):
- BaseOMF.__init__(self)
- xmppserver = self.config.PLC_OMF_XMPP_SERVER
- xmppuser = "@".join([self.config.PLC_OMF_XMPP_USER, xmppserver])
- xmpppass = self.config.PLC_OMF_XMPP_PASSWORD
- self.slicemgr = Slicemgr(xmppuser, xmpppass,
- log=open("/var/log/omf/pubsub_client.log", "a"),
- verbose=True)
-
- def create_slice(self, slice):
- self.slicemgr.create_slice(slice)
-
- def add_resource(self, slice, resource):
- self.slicemgr.add_resource(slice, resource)
-
- def delete_slice(self, slice):
- self.slicemgr.delete_slice(slice)
-
- def delete_resource(self, slice, resource):
- self.slicemgr.delete_resource(slice, resource)
-
- def before(self, wobj, data, *args, **kwargs):
- BaseOMF.before(self, wobj, data, *args, **kwargs)
+ self.logit(wobj.name, args, kwargs, data, slice)
- def after(self, wobj, data, *args, **kwargs):
- BaseOMF.after(self, wobj, data, *args, **kwargs)
class OMFAspect_xmlrpc(BaseOMF):
BaseOMF.__init__(self)
slicemgr_url = self.config.PLC_OMF_SLICEMGR_URL
- self.server = xmlrpclib.ServerProxy(slicemgr_url)
+ self.server = xmlrpclib.ServerProxy(slicemgr_url, allow_none = 1)
def create_slice(self, slice):
- self.server.slicemgr.createSlice(slice)
+ self.server.createSlice(slice)
def add_resource(self, slice, resource):
- self.server.slicemgr.addResource(slice, resource)
+ self.server.addResource(slice, resource)
def delete_slice(self, slice):
- self.server.slicemgr.deleteSlice(slice)
+ self.server.deleteSlice(slice)
def delete_resource(self, slice, resource):
- self.server.slicemgr.removeResource(slice, resource)
+ self.server.removeResource(slice, resource)
def before(self, wobj, data, *args, **kwargs):
BaseOMF.before(self, wobj, data, *args, **kwargs)