1 # -*- coding: utf-8 -*-
3 from constants import TESTBED_ID, TESTBED_VERSION
4 from nepi.core import testbed_impl
5 from nepi.util.constants import TIME_NOW
14 from nepi.testbeds.omf.omf_client import OMFClient
15 from nepi.testbeds.omf.omf_messages import MessageHandler
18 class TestbedController(testbed_impl.TestbedController):
20 super(TestbedController, self).__init__(TESTBED_ID, TESTBED_VERSION)
28 self._logger = logging.getLogger('nepi.testbeds.omf')
31 if self._attributes.get_attribute_value("enableDebug") == True:
32 self._logger.setLevel(logging.DEBUG)
35 self._home = self._attributes.\
36 get_attribute_value("homeDirectory")
37 home = os.path.normpath(self._home)
38 if not os.path.exists(home):
39 os.makedirs(home, 0755)
41 # instantiate the xmpp client
43 # register xmpp nodes for the experiment
44 self._publish_and_enroll_experiment()
45 # register xmpp logger for the experiment
46 self._publish_and_enroll_logger()
48 super(TestbedController, self).do_setup()
50 def set(self, guid, name, value, time = TIME_NOW):
51 super(TestbedController, self).set(guid, name, value, time)
54 def get(self, guid, name, time = TIME_NOW):
55 value = super(TestbedController, self).get(guid, name, time)
59 node_sid = "/OMF/%s/%s" % (self._slice, self._user)
60 self._clean_up(node_sid)
61 logger = "/OMF/%s/%s/LOGGER" % (self._slice, self._user)
62 self._clean_up(logger)
64 for hostname in self._elements.values():
67 node_sid = self._host_sid(hostname)
68 self._clean_up(node_sid)
69 #node_res = self._host_res(hostname)
70 #self._clean_up(node_res)
73 self._xmpp.disconnect()
75 def _host_sid(self, hostname):
76 return "/OMF/%s/%s/%s" % (self._slice, self._user, hostname)
78 def _host_res(self, hostname):
79 return "/OMF/%s/resources/%s" % (self._slice, hostname)
81 def _init_client(self):
82 self._slice = self._attributes.get_attribute_value("xmppSlice")
83 self._host = self._attributes.get_attribute_value("xmppHost")
84 port = self._attributes.get_attribute_value("xmppPort")
85 password = self._attributes.get_attribute_value("xmppPassword")
87 #date = "2012-04-18t16.06.34+02.00"
88 date = datetime.datetime.now().strftime("%Y-%m-%dt%H.%M.%S+02.00")
89 self._user = "%s-%s" % (self._slice, date)
90 jid = "%s@%s" % (self._user, self._host)
92 xmpp = OMFClient(jid, password)
93 # PROTOCOL_SSLv3 required for compatibility with OpenFire
94 xmpp.ssl_version = ssl.PROTOCOL_SSLv3
96 if xmpp.connect((self._host, port)):
97 xmpp.process(threaded=True)
101 self._message = MessageHandler(self._slice, self._user)
103 msg = "Unable to connect to the XMPP server."
104 self._logger.error(msg)
105 raise RuntimeError(msg)
107 def _publish_and_enroll_experiment(self):
108 node_sid = "/OMF/%s/%s" % (self._slice, self._user)
109 self._create_and_subscribe(node_sid)
111 node_slice = "/OMF/%s" % (self._slice)
112 address = "/%s/OMF/%s/%s" % (self._host, self._slice, self._user)
113 payload = self._message.newexpfunction(self._user, address)
114 self._xmpp.publish(payload, node_slice)
116 def _publish_and_enroll_logger(self):
117 logger = "/OMF/%s/%s/LOGGER" % (self._slice, self._user)
118 self._create_and_subscribe(logger)
120 payload = self._message.logfunction("2",
121 "nodeHandler::NodeHandler",
123 "OMF Experiment Controller 5.4 (git 529a626)")
124 self._xmpp.publish(payload, logger)
126 def _clean_up(self, xmpp_node):
127 self._xmpp.delete(xmpp_node)
129 if sys.version_info < (3, 0):
131 sys.setdefaultencoding('utf8')
133 def _create_and_subscribe(self, xmpp_node):
134 self._xmpp.suscriptions()
135 self._xmpp.create(xmpp_node)
136 self._xmpp.subscribe(xmpp_node)
139 def _publish_and_enroll_host(self, hostname):
140 node_sid = self._host_sid(hostname)
141 self._create_and_subscribe(node_sid)
143 node_res = self._host_res(hostname)
144 self._create_and_subscribe(node_res)
146 payload = self._message.enrollfunction("1", "*", "1", hostname)
147 self._xmpp.publish(payload, node_res)
149 def _publish_configure(self, hostname, attribute, value):
150 payload = self._message.configurefunction(hostname, value, attribute)
151 node_sid = self._host_sid(hostname)
152 self._xmpp.publish(payload, node_sid)
154 def _publish_execute(self, hostname, app_id, arguments, path):
155 payload = self._message.executefunction(hostname, app_id, arguments, path)
156 node_sid = self._host_sid(hostname)
157 self._xmpp.publish(payload, node_sid)