7 from nepi.testbeds.omf.omf_client import OMFClient
8 from nepi.testbeds.omf.omf_messages import MessageHandler
11 def __init__(self, slice, host, port, password, debug):
12 date = datetime.datetime.now().strftime("%Y-%m-%dt%H.%M.%S")
13 tz = -time.altzone if time.daylight != 0 else -time.timezone
14 date += "%+06.2f" % (tz / 3600) # timezone difference is in seconds
15 self._user = "%s-%s" % (slice, date)
19 self._password = password
22 self._logger = logging.getLogger('nepi.testbeds.omfapi')
24 self._logger.setLevel(logging.DEBUG)
31 if sys.version_info < (3, 0):
33 sys.setdefaultencoding('utf8')
35 # instantiate the xmpp client
38 # register xmpp nodes for the experiment
39 self._enroll_experiment()
41 # register xmpp logger for the experiment
44 def _init_client(self):
45 jid = "%s@%s" % (self._user, self._host)
46 xmpp = OMFClient(jid, self._password)
47 # PROTOCOL_SSLv3 required for compatibility with OpenFire
48 xmpp.ssl_version = ssl.PROTOCOL_SSLv3
50 if xmpp.connect((self._host, self._port)):
51 xmpp.process(threaded=True)
55 self._message = MessageHandler(self._slice, self._user)
57 msg = "Unable to connect to the XMPP server."
58 self._logger.error(msg)
59 raise RuntimeError(msg)
61 def _enroll_experiment(self):
62 xmpp_node = self._exp_session_id
63 self._client.create(xmpp_node)
64 self._client.subscribe(xmpp_node)
66 address = "/%s/OMF/%s/%s" % (self._host, self._slice, self._user)
67 payload = self._message.newexpfunction(self._user, address)
68 slice_sid = "/OMF/%s" % (self._slice)
69 self._client.publish(payload, slice_sid)
71 def _enroll_logger(self):
72 xmpp_node = self._logger_session_id
73 self._client.create(xmpp_node)
74 self._client.subscribe(xmpp_node)
76 payload = self._message.logfunction("2",
77 "nodeHandler::NodeHandler",
79 "OMF Experiment Controller 5.4 (git 529a626)")
80 self._client.publish(payload, xmpp_node)
82 def _host_session_id(self, hostname):
83 return "/OMF/%s/%s/%s" % (self._slice, self._user, hostname)
85 def _host_resource_id(self, hostname):
86 return "/OMF/%s/resources/%s" % (self._slice, hostname)
89 def _exp_session_id(self):
90 return "/OMF/%s/%s" % (self._slice, self._user)
93 def _logger_session_id(self):
94 return "/OMF/%s/%s/LOGGER" % (self._slice, self._user)
96 def delete(self, hostname):
97 if not hostname in self._hostnames:
100 self._hostnames.remove(hostname)
102 xmpp_node = self._host_session_id(hostname)
103 self._client.delete(xmpp_node)
105 def enroll_host(self, hostname):
106 if hostname in self._hostnames:
109 self._hostnames.append(hostname)
111 xmpp_node = self._host_session_id(hostname)
112 self._client.create(xmpp_node)
113 self._client.subscribe(xmpp_node)
115 xmpp_node = self._host_resource_id(hostname)
116 self._client.subscribe(xmpp_node)
118 payload = self._message.enrollfunction("1", "*", "1", hostname)
119 self._client.publish(payload, xmpp_node)
121 def configure(self, hostname, attribute, value):
122 payload = self._message.configurefunction(hostname, value, attribute)
123 xmpp_node = self._host_session_id(hostname)
124 self._client.publish(payload, xmpp_node)
126 def execute(self, hostname, app_id, arguments, path):
127 payload = self._message.executefunction(hostname, app_id, arguments, path)
128 xmpp_node = self._host_session_id(hostname)
129 self._client.publish(payload, xmpp_node)
131 def disconnect(self):
132 self._client.delete(self._exp_session_id)
133 self._client.delete(self._logger_session_id)
135 for hostname in self._hostnames[:]:
136 self.delete(hostname)
139 self._client.disconnect()