|
31 | 31 | NODE_STATES.LEAVE : 'cyan',
|
32 | 32 | NODE_STATES.UNKNOWN: 'grey',
|
33 | 33 | }
|
| 34 | + |
34 | 35 | NODE_STATE_PREFIXS = {NODE_STATES.ALIVE : CHARACTERS.check,
|
35 | 36 | NODE_STATES.DEAD : CHARACTERS.cross,
|
36 | 37 | NODE_STATES.SUSPECT: CHARACTERS.double_exclamation,
|
@@ -203,6 +204,45 @@ def do_join(seed=''):
|
203 | 204 | cprint('FAILED', color='red')
|
204 | 205 |
|
205 | 206 |
|
| 207 | +def do_ping(node): |
| 208 | + # The information is available only if the agent is started |
| 209 | + wait_for_agent_started(visual_wait=True) |
| 210 | + |
| 211 | + try: |
| 212 | + node_obj = get_opsbro_json('/agent/query/guess/%s' % node) |
| 213 | + except get_request_errors() as exp: |
| 214 | + logger.error('Cannot query the node: %s' % exp) |
| 215 | + sys.exit(2) |
| 216 | + if node_obj is None: |
| 217 | + cprint('FAILED: cannot find the node %s' % node, color='red') |
| 218 | + sys.exit(2) |
| 219 | + node_uuid = node_obj['uuid'] |
| 220 | + |
| 221 | + try: |
| 222 | + ping_result = get_opsbro_json('/agent/ping/%s' % node_uuid) |
| 223 | + except get_request_errors() as exp: |
| 224 | + logger.error('Cannot launch the node ping: %s' % exp) |
| 225 | + sys.exit(2) |
| 226 | + if 'error' in ping_result: |
| 227 | + cprint('FAILED: %s' % ping_result['error'], color='red') |
| 228 | + sys.exit(2) |
| 229 | + node_state = ping_result['state'] |
| 230 | + display_name = node_obj['display_name'] |
| 231 | + if not display_name: |
| 232 | + display_name = node_obj['name'] |
| 233 | + |
| 234 | + state_color = NODE_STATE_COLORS.get(node_state) |
| 235 | + state_char = NODE_STATE_PREFIXS.get(node_state) |
| 236 | + cprint(' %s ' % state_char, color=state_color, end='') |
| 237 | + cprint('%-15s ' % display_name, color='magenta', end='') |
| 238 | + cprint('is: ', end='') |
| 239 | + cprint(node_state, color=state_color) |
| 240 | + |
| 241 | + # If not alive, it's an error |
| 242 | + if node_state != NODE_STATES.ALIVE: |
| 243 | + sys.exit(2) |
| 244 | + |
| 245 | + |
206 | 246 | def do_zone_change(name=''):
|
207 | 247 | if not name:
|
208 | 248 | cprint("Need a zone name")
|
@@ -628,6 +668,14 @@ def do_wait_members(name='', display_name='', group='', count=1, timeout=30):
|
628 | 668 | ],
|
629 | 669 | },
|
630 | 670 |
|
| 671 | + do_ping : { |
| 672 | + 'keywords' : ['gossip', 'ping'], |
| 673 | + 'description': 'Ping another node of the cluster', |
| 674 | + 'args' : [ |
| 675 | + {'name': 'node', 'default': '', 'description': 'uuid, name or display name of the node to ping'}, |
| 676 | + ], |
| 677 | + }, |
| 678 | + |
631 | 679 | do_leave : {
|
632 | 680 | 'keywords' : ['gossip', 'leave'],
|
633 | 681 | 'description': 'Put in leave a cluster node',
|
|
0 commit comments