DDS  ver. 3.4
CommanderChannel.h
Go to the documentation of this file.
1 // Copyright 2014 GSI, Inc. All rights reserved.
2 //
3 //
4 //
5 
6 #ifndef __DDS__AGENT__CCommanderChannel__
7 #define __DDS__AGENT__CCommanderChannel__
8 
9 // DDS
10 #include "ClientChannelImpl.h"
11 #include "SMIntercomChannel.h"
12 #include "TopoCore.h"
13 
14 namespace dds
15 {
16  namespace agent_cmd
17  {
18  using slotId_t = uint64_t;
19  using taskId_t = uint64_t;
20 
21  struct SSlotInfo
22  {
23  using container_t = std::map<slotId_t, SSlotInfo>;
24 
25  slotId_t m_id{ 0 };
26  std::string m_sUsrExe;
27  std::string m_sUsrEnv;
29  size_t m_taskIndex{ 0 };
30  size_t m_collectionIndex{ 0 };
31  std::string m_taskPath;
32  std::string m_groupName;
33  std::string m_collectionName;
34  std::string m_taskName;
35  pid_t m_pid{ 0 };
36  };
37 
38  class CCommanderChannel : public protocol_api::CClientChannelImpl<CCommanderChannel>
39  {
40  using pidContainer_t = std::vector<pid_t>;
41  using stringContainer_t = std::vector<std::string>;
42 
43  public:
44  CCommanderChannel(boost::asio::io_context& _service,
45  uint64_t _ProtocolHeaderID,
46  boost::asio::io_context& _intercomService);
47 
48  public:
50 
52  MESSAGE_HANDLER(cmdREPLY, on_cmdREPLY)
53  MESSAGE_HANDLER(cmdSIMPLE_MSG, on_cmdSIMPLE_MSG)
54  MESSAGE_HANDLER(cmdGET_HOST_INFO, on_cmdGET_HOST_INFO)
55  MESSAGE_HANDLER(cmdSHUTDOWN, on_cmdSHUTDOWN)
56  MESSAGE_HANDLER(cmdBINARY_ATTACHMENT_RECEIVED, on_cmdBINARY_ATTACHMENT_RECEIVED)
57  MESSAGE_HANDLER(cmdGET_ID, on_cmdGET_ID)
58  MESSAGE_HANDLER(cmdSET_ID, on_cmdSET_ID)
59  MESSAGE_HANDLER(cmdGET_LOG, on_cmdGET_LOG)
60  MESSAGE_HANDLER(cmdASSIGN_USER_TASK, on_cmdASSIGN_USER_TASK)
61  MESSAGE_HANDLER(cmdACTIVATE_USER_TASK, on_cmdACTIVATE_USER_TASK)
62  MESSAGE_HANDLER(cmdSTOP_USER_TASK, on_cmdSTOP_USER_TASK)
63  MESSAGE_HANDLER(cmdUPDATE_KEY, on_cmdUPDATE_KEY)
64  MESSAGE_HANDLER(cmdCUSTOM_CMD, on_cmdCUSTOM_CMD)
65  MESSAGE_HANDLER(cmdADD_SLOT, on_cmdADD_SLOT)
66  MESSAGE_HANDLER(cmdUSER_TASK_DONE, on_cmdUSER_TASK_DONE)
67  END_MSG_MAP()
68 
69  public:
70  void stopChannel();
71  void setNumberOfSlots(size_t _nSlots);
72 
73  private:
74  // Message Handlers
76  protocol_api::SSenderInfo& _sender);
78  protocol_api::SSenderInfo& _sender);
79  bool on_cmdGET_HOST_INFO(
81  protocol_api::SSenderInfo& _sender);
83  protocol_api::SSenderInfo& _sender);
84  bool on_cmdBINARY_ATTACHMENT_RECEIVED(
86  protocol_api::SSenderInfo& _sender);
88  protocol_api::SSenderInfo& _sender);
90  protocol_api::SSenderInfo& _sender);
92  protocol_api::SSenderInfo& _sender);
93  bool on_cmdASSIGN_USER_TASK(
95  protocol_api::SSenderInfo& _sender);
96  bool on_cmdACTIVATE_USER_TASK(
98  protocol_api::SSenderInfo& _sender);
99  bool on_cmdSTOP_USER_TASK(
101  protocol_api::SSenderInfo& _sender);
103  protocol_api::SSenderInfo& _sender);
105  protocol_api::SSenderInfo& _sender);
107  protocol_api::SSenderInfo& _sender);
108  void send_cmdUPDATE_KEY(
109  const protocol_api::SSenderInfo& _sender,
111  bool on_cmdUSER_TASK_DONE(
113  protocol_api::SSenderInfo& _sender);
114 
115  private:
116  void readAgentIDFile();
117  void createAgentIDFile() const;
118  void deleteAgentIDFile() const;
119  void onNewUserTask(uint64_t _slotID, pid_t _pid);
120  void terminateChildrenProcesses(pid_t _parentPid = 0);
121  void terminateChildrenProcesses(const pidContainer_t& _children,
122  const std::chrono::steady_clock::time_point& _wait_until);
123  void enumChildProcesses(pid_t _forPid, stringContainer_t& _chilren);
124  void taskExited(uint64_t _taskID, int _exitCode);
125  SSlotInfo& getSlotInfoById(const slotId_t& _slotID)
126  {
127  std::lock_guard<std::mutex> lock(m_mutexSlots);
128  auto it = m_slots.find(_slotID);
129  if (it == m_slots.end())
130  {
131  std::stringstream ss;
132  ss << "No matching slot for " << _slotID;
133  throw std::runtime_error(ss.str());
134  }
135 
136  return it->second;
137  }
138 
139  private:
140  uint64_t m_id{ 0 };
141  uint16_t m_connectionAttempts{ 1 };
142  std::mutex m_taskIDToSlotIDMapMutex;
143  std::map<uint64_t, uint64_t> m_taskIDToSlotIDMap;
145  std::mutex m_topoMutex;
146 
147  CSMIntercomChannel::connectionPtr_t m_intercomChannel;
148 
149  std::mutex m_mutexSlots;
150  SSlotInfo::container_t m_slots;
151  size_t m_nSlots{ 0 };
152  };
153  } // namespace agent_cmd
154 } // namespace dds
155 
156 #endif /* defined(__DDS__AGENT__CCommanderChannel__) */
Definition: ProtocolCommands.h:49
Definition: BaseEventHandlersImpl.h:48
size_t m_collectionIndex
Definition: CommanderChannel.h:30
Definition: ProtocolCommands.h:45
Definition: ProtocolCommands.h:71
Definition: ProtocolCommands.h:68
#define REGISTER_DEFAULT_REMOTE_ID_STRING
Definition: BaseChannelImpl.h:190
std::string m_collectionName
Definition: CommanderChannel.h:33
std::string m_taskPath
Definition: CommanderChannel.h:31
slotId_t m_id
Definition: CommanderChannel.h:25
Definition: CommanderChannel.h:38
std::shared_ptr< SEmptyCmd > ptr_t
Definition: CommandAttachmentImpl.h:64
Definition: ProtocolCommands.h:30
std::map< slotId_t, SSlotInfo > container_t
Definition: CommanderChannel.h:23
Definition: ProtocolCommands.h:43
Definition: ProtocolCommands.h:33
REGISTER_DEFAULT_REMOTE_ID_STRING BEGIN_MSG_MAP(CCommanderChannel) MESSAGE_HANDLER(cmdREPLY
std::shared_ptr< CSMIntercomChannel > connectionPtr_t
Definition: BaseSMChannelImpl.h:191
CCommanderChannel(boost::asio::io_context &_service, uint64_t _ProtocolHeaderID, boost::asio::io_context &_intercomService)
Definition: CommanderChannel.cpp:26
#define END_MSG_MAP()
Definition: BaseChannelImpl.h:153
Definition: ProtocolCommands.h:36
Definition: AgentConnectionManager.h:13
Definition: ProtocolCommands.h:65
std::string m_groupName
Definition: CommanderChannel.h:32
taskId_t m_taskID
Definition: CommanderChannel.h:28
Definition: ProtocolCommands.h:55
Definition: TopoCore.h:25
REGISTER_DEFAULT_REMOTE_ID_STRING on_cmdREPLY on_cmdGET_HOST_INFO on_cmdBINARY_ATTACHMENT_RECEIVED on_cmdSET_ID on_cmdASSIGN_USER_TASK on_cmdSTOP_USER_TASK on_cmdCUSTOM_CMD on_cmdUSER_TASK_DONE END_MSG_MAP() public void setNumberOfSlots(size_t _nSlots)
Definition: CommanderChannel.cpp:86
Definition: ProtocolCommands.h:52
std::string m_sUsrExe
Definition: CommanderChannel.h:26
Definition: ProtocolCommands.h:51
Definition: BaseChannelImpl.h:40
Definition: ProtocolCommands.h:46
Definition: CommanderChannel.h:21
Definition: ProtocolCommands.h:41
Definition: ProtocolCommands.h:53
uint64_t slotId_t
Definition: CommanderChannel.h:18
pid_t m_pid
Definition: CommanderChannel.h:35
uint64_t taskId_t
Definition: CommanderChannel.h:19
std::string m_taskName
Definition: CommanderChannel.h:34
size_t m_taskIndex
Definition: CommanderChannel.h:29
REGISTER_DEFAULT_REMOTE_ID_STRING on_cmdREPLY MESSAGE_HANDLER(cmdSIMPLE_MSG, on_cmdSIMPLE_MSG) MESSAGE_HANDLER(cmdGET_HOST_INFO
std::string m_sUsrEnv
Definition: CommanderChannel.h:27