diff options
author | 2016-04-18 15:12:05 +0300 | |
---|---|---|
committer | 2016-04-18 15:12:05 +0300 | |
commit | 7e5993941829e5fd1bb9ab3c6ac624d9aa800c37 (patch) | |
tree | 5e41c7f91ff77427be2731ff55f6cadfc6fb05e8 | |
parent | 1fa7b64c13e6c485926eba5c40bd198af738e365 (diff) |
support for reacquire command
also better sync with the server about ownership of ports
7 files changed, 105 insertions, 34 deletions
diff --git a/scripts/automation/trex_control_plane/stl/console/trex_console.py b/scripts/automation/trex_control_plane/stl/console/trex_console.py index 00d2a028..589f1d35 100755 --- a/scripts/automation/trex_control_plane/stl/console/trex_console.py +++ b/scripts/automation/trex_control_plane/stl/console/trex_console.py @@ -421,6 +421,9 @@ class TRexConsole(TRexGeneralCmd): '''Release ports\n''' self.stateless_client.release_line(line) + def do_reacquire (self, line): + '''reacquire all the ports under your logged user name''' + self.stateless_client.reacquire_line(line) def help_acquire (self): self.do_acquire("-h") diff --git a/scripts/automation/trex_control_plane/stl/trex_stl_lib/trex_stl_client.py b/scripts/automation/trex_control_plane/stl/trex_stl_lib/trex_stl_client.py index 12ed1f81..76fbf3b8 100755 --- a/scripts/automation/trex_control_plane/stl/trex_stl_lib/trex_stl_client.py +++ b/scripts/automation/trex_control_plane/stl/trex_stl_lib/trex_stl_client.py @@ -264,22 +264,55 @@ class EventsHandler(object): self.__async_event_port_job_done(port_id) show_event = True - # port was stolen... + # port was acquired - maybe stolen... elif (type == 5): session_id = data['session_id'] - # false alarm, its us + port_id = int(data['port_id']) + who = data['who'] + force = data['force'] + + # if we hold the port and it was not taken by this session - show it + if port_id in self.client.get_acquired_ports() and session_id != self.client.session_id: + show_event = True + + # format the thief/us... if session_id == self.client.session_id: - return + user = 'you' + elif who == self.client.username: + user = 'another session of you' + else: + user = "'{0}'".format(who) - port_id = int(data['port_id']) - who = data['who'] + if force: + ev = "Port {0} was forcely taken by {1}".format(port_id, user) + else: + ev = "Port {0} was taken by {1}".format(port_id, user) - ev = "Port {0} was forcely taken by '{1}'".format(port_id, who) + # call the handler in case its not this session + if session_id != self.client.session_id: + self.__async_event_port_acquired(port_id, who) + + + # port was released + elif (type == 6): + port_id = int(data['port_id']) + who = data['who'] + session_id = data['session_id'] + + if session_id == self.client.session_id: + user = 'you' + elif who == self.client.username: + user = 'another session of you' + else: + user = "'{0}'".format(who) + + ev = "Port {0} was released by {1}".format(port_id, user) + + # call the handler in case its not this session + if session_id != self.client.session_id: + self.__async_event_port_released(port_id) - # call the handler - self.__async_event_port_forced_acquired(port_id, who) - show_event = True # server stopped elif (type == 100): @@ -317,9 +350,11 @@ class EventsHandler(object): self.client.ports[port_id].async_event_port_resumed() - def __async_event_port_forced_acquired (self, port_id, who): - self.client.ports[port_id].async_event_forced_acquired(who) + def __async_event_port_acquired (self, port_id, who): + self.client.ports[port_id].async_event_acquired(who) + def __async_event_port_released (self, port_id): + self.client.ports[port_id].async_event_released() def __async_event_server_stopped (self): self.client.connected = False @@ -506,7 +541,7 @@ class STLClient(object): # API classes - self.api_vers = [ {'type': 'core', 'major': 1, 'minor':1 } + self.api_vers = [ {'type': 'core', 'major': 1, 'minor':2 } ] self.api_h = {'core': None} @@ -2122,6 +2157,17 @@ class STLClient(object): @__console + def reacquire_line (self, line): + '''reacquire all the ports under your username''' + my_unowned_ports = list_difference([k for k, v in self.ports.items() if v.get_owner() == self.username], self.get_acquired_ports()) + if not my_unowned_ports: + self.logger.log("reacquire - no unowned ports under '{0}'".format(self.username)) + return + + self.acquire(ports = my_unowned_ports, force = True) + return True + + @__console def disconnect_line (self, line): self.disconnect() diff --git a/scripts/automation/trex_control_plane/stl/trex_stl_lib/trex_stl_port.py b/scripts/automation/trex_control_plane/stl/trex_stl_lib/trex_stl_port.py index 6f6f50b1..16e55d73 100644 --- a/scripts/automation/trex_control_plane/stl/trex_stl_lib/trex_stl_port.py +++ b/scripts/automation/trex_control_plane/stl/trex_stl_lib/trex_stl_port.py @@ -96,9 +96,12 @@ class Port(object): "handler": self.handler} rc = self.transmit("release", params) - self.handler = None - + if rc.good(): + + self.handler = None + self.owner = '' + return self.ok() else: return self.err(rc.err()) @@ -679,7 +682,10 @@ class Port(object): if not self.is_acquired(): self.state = self.STATE_TX - def async_event_forced_acquired (self, who): + def async_event_acquired (self, who): self.handler = None self.owner = who + def async_event_released (self): + self.owner = '' + diff --git a/src/publisher/trex_publisher.h b/src/publisher/trex_publisher.h index f086babb..f8843758 100644 --- a/src/publisher/trex_publisher.h +++ b/src/publisher/trex_publisher.h @@ -46,7 +46,8 @@ public: EVENT_PORT_PAUSED = 2, EVENT_PORT_RESUMED = 3, EVENT_PORT_FINISHED_TX = 4, - EVENT_PORT_FORCE_ACQUIRED = 5, + EVENT_PORT_ACQUIRED = 5, + EVENT_PORT_RELEASED = 6, EVENT_SERVER_STOPPED = 100, diff --git a/src/stateless/cp/trex_stateless.cpp b/src/stateless/cp/trex_stateless.cpp index c86c5f65..5bbe9faf 100644 --- a/src/stateless/cp/trex_stateless.cpp +++ b/src/stateless/cp/trex_stateless.cpp @@ -54,7 +54,7 @@ TrexStateless::TrexStateless(const TrexStatelessCfg &cfg) { m_publisher = cfg.m_publisher; /* API core version */ - m_api_classes[APIClass::API_CLASS_TYPE_CORE].init(APIClass::API_CLASS_TYPE_CORE, 1, 1); + m_api_classes[APIClass::API_CLASS_TYPE_CORE].init(APIClass::API_CLASS_TYPE_CORE, 1, 2); } /** diff --git a/src/stateless/cp/trex_stateless_port.cpp b/src/stateless/cp/trex_stateless_port.cpp index 605995ae..90142d9b 100644 --- a/src/stateless/cp/trex_stateless_port.cpp +++ b/src/stateless/cp/trex_stateless_port.cpp @@ -119,23 +119,10 @@ TrexStatelessPort::~TrexStatelessPort() { void TrexStatelessPort::acquire(const std::string &user, uint32_t session_id, bool force) { - /* if port is free - just take it */ - if (get_owner().is_free()) { - get_owner().own(user); - return; - } - - if (force) { - get_owner().own(user); - - /* inform the other client of the steal... */ - Json::Value data; + bool used_force = !get_owner().is_free() && force; - data["port_id"] = m_port_id; - data["who"] = user; - data["session_id"] = session_id; - - get_stateless_obj()->get_publisher()->publish_event(TrexPublisher::EVENT_PORT_FORCE_ACQUIRED, data); + if (get_owner().is_free() || force) { + get_owner().own(user, session_id); } else { /* not same user or session id and not force - report error */ @@ -146,11 +133,30 @@ TrexStatelessPort::acquire(const std::string &user, uint32_t session_id, bool fo } } + Json::Value data; + + data["port_id"] = m_port_id; + data["who"] = user; + data["session_id"] = session_id; + data["force"] = used_force; + + get_stateless_obj()->get_publisher()->publish_event(TrexPublisher::EVENT_PORT_ACQUIRED, data); + } void TrexStatelessPort::release(void) { + + + Json::Value data; + + data["port_id"] = m_port_id; + data["who"] = get_owner().get_name(); + data["session_id"] = get_owner().get_session_id(); + get_owner().release(); + + get_stateless_obj()->get_publisher()->publish_event(TrexPublisher::EVENT_PORT_RELEASED, data); } /** @@ -776,6 +782,7 @@ TrexStatelessPort::remove_and_delete_all_streams() { TrexPortOwner::TrexPortOwner() { m_is_free = true; + m_session_id = 0; /* for handlers random generation */ m_seed = time(NULL); diff --git a/src/stateless/cp/trex_stateless_port.h b/src/stateless/cp/trex_stateless_port.h index 2167e735..520940d8 100644 --- a/src/stateless/cp/trex_stateless_port.h +++ b/src/stateless/cp/trex_stateless_port.h @@ -54,16 +54,18 @@ public: m_is_free = true; m_owner_name = ""; m_handler = ""; + m_session_id = 0; } bool is_owned_by(const std::string &user) { return ( !m_is_free && (m_owner_name == user) ); } - void own(const std::string &owner_name) { + void own(const std::string &owner_name, uint32_t session_id) { /* save user data */ m_owner_name = owner_name; + m_session_id = session_id; /* internal data */ m_handler = utl_generate_random_str(m_seed, 8); @@ -82,6 +84,9 @@ public: return (!m_is_free ? m_handler : g_unowned_handler); } + const uint32_t get_session_id() { + return m_session_id; + } private: @@ -91,6 +96,9 @@ private: /* user provided info */ std::string m_owner_name; + /* which session of the user holds this port*/ + uint32_t m_session_id; + /* handler genereated internally */ std::string m_handler; |