hybrid_platforms_conductor 32.5.0 → 32.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 834a3af157221b88e6a150738b146f90fdf832c43fe5e8471619879c47a22d5b
4
- data.tar.gz: c4f54b879fbfba923fda2a8aee1b299cb846ed9478ca9bd81535f220ec622f69
3
+ metadata.gz: d6b6259b1f05bb082b4f2c6820f74b6c90dad15f5868a311337429b80d233500
4
+ data.tar.gz: c5f58e3ba104ba2365addea64ab08c43a4fe9797430c950bf01258eb7bfcdc1b
5
5
  SHA512:
6
- metadata.gz: 42ae65da627c812b096c0e9f9b4bb8c9ac4dde3185e1f6cf8d1405acbab960d5c5c88050c25e3d45906acb6054c73fd7ec29b2e5751b1ec38734f83a33f34bef
7
- data.tar.gz: 41e641381b34d9d0841770974c4401612bfc3a4d11a5ec2fe85969f40ab1bfce0952cb4bbf5b7d2fce5420d9090a4962e278b9fb84d4251e0f13ee84db405e6c
6
+ metadata.gz: b079e89a17630ed994614bc24e76ba2154ae52fcaf3712feaaef9e823487d933d6b33b87b3aa253e8d11270d5765d061349c4a37f467e81d729d994ed1f7b72e
7
+ data.tar.gz: 4a89e197bed2c87dbc10d66d8a3f6240c68deb7c2799962be282634c3c109b653c2a66725baa5ca44e38fd0bf1ec992148720047668c1c7786bd494a8e3836e7
@@ -16,11 +16,40 @@ module HybridPlatformsConductor
16
16
 
17
17
  module PlatformsDslSsh
18
18
 
19
+ # List of SSH connection transformations:
20
+ # * *nodes_selectors_stack* (Array<Object>): Stack of nodes selectors impacted by this rule
21
+ # * *transform* (Proc): Code called to transform SSH connection info:
22
+ # Parameters::
23
+ # * *node* (String): Node for which we transform the SSH connection
24
+ # * *connection* (String or nil): The connection host or IP, or nil if none
25
+ # * *connection_user* (String): The connection user
26
+ # * *gateway* (String or nil): The gateway name, or nil if none
27
+ # * *gateway_user* (String or nil): The gateway user, or nil if none
28
+ # Result::
29
+ # * String: The transformed connection host or IP, or nil if none
30
+ # * String: The transformed connection user
31
+ # * String or nil: The transformed gateway name, or nil if none
32
+ # * String or nil: The transformed gateway user, or nil if none
33
+ # Array< Hash<Symbol, Object> >
34
+ attr_reader :ssh_connection_transforms
35
+
19
36
  # Initialize the DSL
20
37
  def init_ssh
21
38
  # List of gateway configurations, per gateway config name
22
39
  # Hash<Symbol, String>
23
40
  @gateways = {}
41
+ @ssh_connection_transforms = []
42
+ end
43
+
44
+ # Define a transformation of SSH connection.
45
+ #
46
+ # Parameters::
47
+ # * *transform* (Proc): Code to be called to transform an SSH connection (see ssh_connection_transforms signature for details)
48
+ def transform_ssh_connection(&transform)
49
+ @ssh_connection_transforms << {
50
+ nodes_selectors_stack: current_nodes_selectors_stack,
51
+ transform: transform
52
+ }
24
53
  end
25
54
 
26
55
  # Register a new gateway configuration
@@ -295,7 +324,7 @@ module HybridPlatformsConductor
295
324
  # Result::
296
325
  # * String: The ssh URL connecting to the current node
297
326
  def ssh_url
298
- "#{@ssh_user}@hpc.#{@node}"
327
+ "hpc.#{@node}"
299
328
  end
300
329
 
301
330
  # Get an SSH configuration content giving access to nodes of the platforms with the current configuration
@@ -318,14 +347,6 @@ module HybridPlatformsConductor
318
347
  # ENDPOINTS #
319
348
  #############
320
349
 
321
- Host *
322
- User #{@ssh_user}
323
- # Default control socket path to be used when multiplexing SSH connections
324
- ControlPath #{control_master_file('%h', '%p', '%r')}
325
- #{open_ssh_major_version >= 7 ? 'PubkeyAcceptedKeyTypes +ssh-dss' : ''}
326
- #{known_hosts_file.nil? ? '' : "UserKnownHostsFile #{known_hosts_file}"}
327
- #{@ssh_strict_host_key_checking ? '' : 'StrictHostKeyChecking no'}
328
-
329
350
  EOS
330
351
 
331
352
  # Add each node
@@ -333,21 +354,37 @@ module HybridPlatformsConductor
333
354
  @nodes_handler.prefetch_metadata_of nodes, %i[private_ips hostname host_ip description]
334
355
  nodes.sort.each do |node|
335
356
  # Generate the conf for the node
336
- begin
337
- connection, gateway, gateway_user = connection_info_for(node)
357
+ connection, connection_user, gateway, gateway_user = connection_info_for(node, no_exception: true)
358
+ if connection.nil?
359
+ config_content << "# #{node} - Not connectable using SSH - #{@nodes_handler.get_description_of(node) || ''}\n"
360
+ else
338
361
  config_content << "# #{node} - #{connection} - #{@nodes_handler.get_description_of(node) || ''}\n"
339
362
  config_content << "Host #{ssh_aliases_for(node).join(' ')}\n"
340
363
  config_content << " Hostname #{connection}\n"
364
+ config_content << " User \"#{connection_user}\"\n" if connection_user != @ssh_user
341
365
  config_content << " ProxyCommand #{ssh_exec} -q -W %h:%p #{gateway_user}@#{gateway}\n" unless gateway.nil?
342
366
  if @passwords.key?(node)
343
367
  config_content << " PreferredAuthentications password\n"
344
368
  config_content << " PubkeyAuthentication no\n"
345
369
  end
346
- rescue NotConnectableError
347
- config_content << "# #{node} - Not connectable using SSH - #{@nodes_handler.get_description_of(node) || ''}\n"
348
370
  end
349
371
  config_content << "\n"
350
372
  end
373
+ # Add global definitions at the end of the SSH config, as they might be overriden by previous ones, and first match wins.
374
+ config_content << <<~EOS
375
+ ###########
376
+ # GLOBALS #
377
+ ###########
378
+
379
+ Host *
380
+ User #{@ssh_user}
381
+ # Default control socket path to be used when multiplexing SSH connections
382
+ ControlPath #{control_master_file('%h', '%p', '%r')}
383
+ #{open_ssh_major_version >= 7 ? 'PubkeyAcceptedKeyTypes +ssh-dss' : ''}
384
+ #{known_hosts_file.nil? ? '' : "UserKnownHostsFile #{known_hosts_file}"}
385
+ #{@ssh_strict_host_key_checking ? '' : 'StrictHostKeyChecking no'}
386
+
387
+ EOS
351
388
  config_content
352
389
  end
353
390
 
@@ -450,7 +487,7 @@ module HybridPlatformsConductor
450
487
  with_lock_on_control_master_for(node) do |current_users, user_id|
451
488
  working_master = false
452
489
  ssh_exec = ssh_exec_for(node)
453
- ssh_url = "#{@ssh_user}@hpc.#{node}"
490
+ ssh_url = "hpc.#{node}"
454
491
  if current_users.empty?
455
492
  log_debug "[ ControlMaster - #{ssh_url} ] - Creating SSH ControlMaster..."
456
493
  # Create the control master
@@ -518,7 +555,7 @@ module HybridPlatformsConductor
518
555
  user_locks_mutex.synchronize do
519
556
  user_locks.each do |node, user_id|
520
557
  with_lock_on_control_master_for(node, user_id: user_id) do |current_users, user_id|
521
- ssh_url = "#{@ssh_user}@hpc.#{node}"
558
+ ssh_url = "hpc.#{node}"
522
559
  log_warn "[ ControlMaster - #{ssh_url} ] - Current process/thread was not part of the ControlMaster users anymore whereas it should have been" unless current_users.include?(user_id)
523
560
  remaining_users = current_users - [user_id]
524
561
  if remaining_users.empty?
@@ -562,8 +599,9 @@ module HybridPlatformsConductor
562
599
  # TODO: Add test case when control file is missing ad when it is stale
563
600
  # Get the list of existing process/thread ids using this control master
564
601
  existing_users = File.exist?(control_master_users_file) ? File.read(control_master_users_file).split("\n") : []
565
- ssh_url = "#{@ssh_user}@hpc.#{node}"
566
- control_path_file = control_master_file(connection_info_for(node).first, '22', @ssh_user)
602
+ ssh_url = "hpc.#{node}"
603
+ connection, connection_user, _gateway, _gateway_user = connection_info_for(node)
604
+ control_path_file = control_master_file(connection, '22', connection_user)
567
605
  if existing_users.empty?
568
606
  # Make sure there is no stale one.
569
607
  if File.exist?(control_path_file)
@@ -595,7 +633,7 @@ module HybridPlatformsConductor
595
633
  # * *port* (String): The port. Can be a string as ssh config uses wildchars.
596
634
  # * *user* (String): The user
597
635
  def control_master_file(host, port, user)
598
- "#{@tmp_dir}/hpc_actions_executor_mux_#{host}_#{port}_#{user}"
636
+ "#{@tmp_dir}/hpc_ssh_mux_#{host}_#{port}_#{user}"
599
637
  end
600
638
 
601
639
  # Provide a bootstrapped ssh executable that includes an SSH config allowing access to nodes.
@@ -627,7 +665,7 @@ module HybridPlatformsConductor
627
665
  nodes.sort.each do |node|
628
666
  host_keys = @nodes_handler.get_host_keys_of(node)
629
667
  if host_keys && !host_keys.empty?
630
- connection, _gateway, _gateway_user = connection_info_for(node)
668
+ connection, _connection_user, _gateway, _gateway_user = connection_info_for(node)
631
669
  host_keys.each do |host_key|
632
670
  file.puts "#{connection} #{host_key}"
633
671
  end
@@ -660,11 +698,13 @@ module HybridPlatformsConductor
660
698
  #
661
699
  # Parameters::
662
700
  # * *node* (String): The node to access
701
+ # * *no_exception* (Boolean): Should we skip exceptions in case of no connection possible? [default: false]
663
702
  # Result::
664
- # * String: The real hostname or IP to be used to connect
703
+ # * String: The real hostname or IP to be used to connect, or nil if none and no_exception is true
704
+ # * String: The real user to be used to connect, or nil if none and no_exception is true
665
705
  # * String or nil: The gateway name to be used (should be defined by the gateways configurations), or nil if no gateway to be used.
666
706
  # * String or nil: The gateway user to be used, or nil if none.
667
- def connection_info_for(node)
707
+ def connection_info_for(node, no_exception: false)
668
708
  connection =
669
709
  if @nodes_handler.get_host_ip_of(node)
670
710
  @nodes_handler.get_host_ip_of(node)
@@ -673,12 +713,18 @@ module HybridPlatformsConductor
673
713
  elsif @nodes_handler.get_hostname_of(node)
674
714
  @nodes_handler.get_hostname_of(node)
675
715
  else
676
- raise NotConnectableError, "No connection possible to #{node}"
716
+ nil
677
717
  end
718
+ connection_user = @ssh_user
678
719
  gateway = @nodes_handler.get_gateway_of node
679
720
  gateway_user = @nodes_handler.get_gateway_user_of node
680
721
  gateway_user = @ssh_gateway_user if !gateway.nil? && gateway_user.nil?
681
- [connection, gateway, gateway_user]
722
+ # In case we want to transform the connection info, do it here.
723
+ @nodes_handler.select_confs_for_node(node, @config.ssh_connection_transforms).each do |transform_info|
724
+ connection, connection_user, gateway, gateway_user = transform_info[:transform].call(node, connection, connection_user, gateway, gateway_user)
725
+ end
726
+ raise NotConnectableError, "No connection possible to #{node}" if connection.nil? && !no_exception
727
+ [connection, connection_user, gateway, gateway_user]
682
728
  end
683
729
 
684
730
  # Get the possible SSH aliases for a given node.
@@ -1,5 +1,5 @@
1
1
  module HybridPlatformsConductor
2
2
 
3
- VERSION = '32.5.0'
3
+ VERSION = '32.6.0'
4
4
 
5
5
  end
@@ -43,6 +43,41 @@ describe HybridPlatformsConductor::ActionsExecutor do
43
43
  end
44
44
  end
45
45
 
46
+ it 'returns ssh transformation procs' do
47
+ with_test_platform(
48
+ {
49
+ nodes: {
50
+ 'node1' => {},
51
+ 'node2' => {},
52
+ 'node3' => {}
53
+ },
54
+ },
55
+ false,
56
+ '
57
+ for_nodes(%w[node1 node3]) do
58
+ transform_ssh_connection do |node, connection, connection_user, gateway, gateway_user|
59
+ ["#{connection}_#{node}_13", "#{connection_user}_#{node}_13", "#{gateway}_#{node}_13", "#{gateway_user}_#{node}_13"]
60
+ end
61
+ end
62
+ for_nodes(\'node1\') do
63
+ transform_ssh_connection do |node, connection, connection_user, gateway, gateway_user|
64
+ ["#{connection}_#{node}_1", "#{connection_user}_#{node}_1", "#{gateway}_#{node}_1", "#{gateway_user}_#{node}_1"]
65
+ end
66
+ end
67
+ '
68
+ ) do
69
+ expect(test_config.ssh_connection_transforms.size).to eq 2
70
+ expect(test_config.ssh_connection_transforms[0][:nodes_selectors_stack]).to eq [%w[node1 node3]]
71
+ expect(test_config.ssh_connection_transforms[0][:transform].call('node1', 'test_host', 'test_user', 'test_gateway', 'test_gateway_user')).to eq [
72
+ 'test_host_node1_13', 'test_user_node1_13', 'test_gateway_node1_13', 'test_gateway_user_node1_13'
73
+ ]
74
+ expect(test_config.ssh_connection_transforms[1][:nodes_selectors_stack]).to eq ['node1']
75
+ expect(test_config.ssh_connection_transforms[1][:transform].call('node1', 'test_host', 'test_user', 'test_gateway', 'test_gateway_user')).to eq [
76
+ 'test_host_node1_1', 'test_user_node1_1', 'test_gateway_node1_1', 'test_gateway_user_node1_1'
77
+ ]
78
+ end
79
+ end
80
+
46
81
  end
47
82
 
48
83
  end
@@ -52,6 +52,45 @@ describe HybridPlatformsConductor::ActionsExecutor do
52
52
  end
53
53
  end
54
54
 
55
+ it 'creates SSH master to several nodes with ssh connections transformed' do
56
+ with_test_platform(
57
+ { nodes: {
58
+ 'node1' => { meta: { host_ip: '192.168.42.1' } },
59
+ 'node2' => { meta: { host_ip: '192.168.42.2' } },
60
+ 'node3' => { meta: { host_ip: '192.168.42.3' } }
61
+ } },
62
+ false,
63
+ '
64
+ for_nodes(%w[node1 node3]) do
65
+ transform_ssh_connection do |node, connection, connection_user, gateway, gateway_user|
66
+ ["#{connection}_#{node}_13", "#{connection_user}_#{node}_13", "#{gateway}_#{node}_13", "#{gateway_user}_#{node}_13"]
67
+ end
68
+ end
69
+ for_nodes(\'node1\') do
70
+ transform_ssh_connection do |node, connection, connection_user, gateway, gateway_user|
71
+ ["#{connection}_#{node}_1", "#{connection_user}_#{node}_1", "#{gateway}_#{node}_1", "#{gateway_user}_#{node}_1"]
72
+ end
73
+ end
74
+ '
75
+ ) do
76
+ with_cmd_runner_mocked(
77
+ [
78
+ ['which env', proc { [0, "/usr/bin/env\n", ''] }],
79
+ ['ssh -V 2>&1', proc { [0, "OpenSSH_7.4p1 Debian-10+deb9u7, OpenSSL 1.0.2u 20 Dec 2019\n", ''] }]
80
+ ] + ssh_expected_commands_for(
81
+ 'node1' => { ip: '192.168.42.1', connection: '192.168.42.1_node1_13_node1_1', user: 'test_user_node1_13_node1_1' },
82
+ 'node2' => { ip: '192.168.42.2', connection: '192.168.42.2', user: 'test_user' },
83
+ 'node3' => { ip: '192.168.42.3', connection: '192.168.42.3_node3_13', user: 'test_user_node3_13' }
84
+ )
85
+ ) do
86
+ test_connector.ssh_user = 'test_user'
87
+ test_connector.with_connection_to(%w[node1 node2 node3]) do |connected_nodes|
88
+ expect(connected_nodes.sort).to eq %w[node1 node2 node3].sort
89
+ end
90
+ end
91
+ end
92
+ end
93
+
55
94
  it 'fails when an SSH master can\'t be created' do
56
95
  with_test_platform(nodes: {
57
96
  'node1' => { meta: { host_ip: '192.168.42.1' } },
@@ -73,7 +112,7 @@ describe HybridPlatformsConductor::ActionsExecutor do
73
112
  )
74
113
  ) do
75
114
  test_connector.ssh_user = 'test_user'
76
- expect { test_connector.with_connection_to(%w[node1 node2 node3]) }.to raise_error(/^Error while starting SSH Control Master with .+\/ssh -o BatchMode=yes -o ControlMaster=yes -o ControlPersist=yes test_user@hpc.node2 true: Can't connect to 192.168.42.2$/)
115
+ expect { test_connector.with_connection_to(%w[node1 node2 node3]) }.to raise_error(/^Error while starting SSH Control Master with .+\/ssh -o BatchMode=yes -o ControlMaster=yes -o ControlPersist=yes hpc.node2 true: Can't connect to 192.168.42.2$/)
77
116
  end
78
117
  end
79
118
  end
@@ -416,7 +455,7 @@ describe HybridPlatformsConductor::ActionsExecutor do
416
455
  ['ssh -V 2>&1', proc { [0, "OpenSSH_7.4p1 Debian-10+deb9u7, OpenSSL 1.0.2u 20 Dec 2019\n", ''] }],
417
456
  ] +
418
457
  [[
419
- /^.+\/ssh -o BatchMode=yes -o ControlMaster=yes -o ControlPersist=yes test_user@hpc\.node true$/,
458
+ /^.+\/ssh -o BatchMode=yes -o ControlMaster=yes -o ControlPersist=yes hpc\.node true$/,
420
459
  proc do
421
460
  nbr_boot_messages += 1
422
461
  [255, '', "System is booting up. See pam_nologin(8)\nAuthentication failed.\n"]
@@ -35,8 +35,11 @@ describe HybridPlatformsConductor::ActionsExecutor do
35
35
  begin_marker = node.nil? ? /^Host \*$/ : /^# #{Regexp.escape(node)} - .+$/
36
36
  start_idx = ssh_config_lines.index { |line| line =~ begin_marker }
37
37
  return nil if start_idx.nil?
38
- end_marker = /^# \w+ - .+$/
39
- end_idx = ssh_config_lines[start_idx + 1..-1].index { |line| line =~ end_marker }
38
+ end_markers = [
39
+ /^\# \w+ - .+$/,
40
+ /^\#+$/
41
+ ]
42
+ end_idx = ssh_config_lines[start_idx + 1..-1].index { |line| end_markers.any? { |end_marker| line =~ end_marker } }
40
43
  end_idx = end_idx.nil? ? -1 : start_idx + end_idx
41
44
  ssh_config_lines[start_idx..end_idx].select do |line|
42
45
  stripped_line = line.strip
@@ -50,7 +53,7 @@ describe HybridPlatformsConductor::ActionsExecutor do
50
53
  expect(ssh_config_for(nil)).to eq <<~EOS
51
54
  Host *
52
55
  User test_user
53
- ControlPath #{Dir.tmpdir}/hpc_ssh/hpc_actions_executor_mux_%h_%p_%r
56
+ ControlPath #{Dir.tmpdir}/hpc_ssh/hpc_ssh_mux_%h_%p_%r
54
57
  PubkeyAcceptedKeyTypes +ssh-dss
55
58
  EOS
56
59
  end
@@ -62,7 +65,7 @@ describe HybridPlatformsConductor::ActionsExecutor do
62
65
  expect(ssh_config_for(nil)).to eq <<~EOS
63
66
  Host *
64
67
  User test_user
65
- ControlPath #{Dir.tmpdir}/hpc_ssh/hpc_actions_executor_mux_%h_%p_%r
68
+ ControlPath #{Dir.tmpdir}/hpc_ssh/hpc_ssh_mux_%h_%p_%r
66
69
  PubkeyAcceptedKeyTypes +ssh-dss
67
70
  EOS
68
71
  end
@@ -74,7 +77,7 @@ describe HybridPlatformsConductor::ActionsExecutor do
74
77
  expect(ssh_config_for(nil, known_hosts_file: '/path/to/known_hosts')).to eq <<~EOS
75
78
  Host *
76
79
  User test_user
77
- ControlPath #{Dir.tmpdir}/hpc_ssh/hpc_actions_executor_mux_%h_%p_%r
80
+ ControlPath #{Dir.tmpdir}/hpc_ssh/hpc_ssh_mux_%h_%p_%r
78
81
  PubkeyAcceptedKeyTypes +ssh-dss
79
82
  UserKnownHostsFile /path/to/known_hosts
80
83
  EOS
@@ -88,7 +91,7 @@ describe HybridPlatformsConductor::ActionsExecutor do
88
91
  expect(ssh_config_for(nil)).to eq <<~EOS
89
92
  Host *
90
93
  User test_user
91
- ControlPath #{Dir.tmpdir}/hpc_ssh/hpc_actions_executor_mux_%h_%p_%r
94
+ ControlPath #{Dir.tmpdir}/hpc_ssh/hpc_ssh_mux_%h_%p_%r
92
95
  PubkeyAcceptedKeyTypes +ssh-dss
93
96
  StrictHostKeyChecking no
94
97
  EOS
@@ -274,6 +277,47 @@ describe HybridPlatformsConductor::ActionsExecutor do
274
277
  end
275
278
  end
276
279
 
280
+ it 'uses node transformed SSH connection' do
281
+ with_test_platform(
282
+ { nodes: {
283
+ 'node1' => { meta: { host_ip: '192.168.42.1', gateway: 'test_gateway1', gateway_user: 'test_gateway1_user' } },
284
+ 'node2' => { meta: { host_ip: '192.168.42.2', gateway: 'test_gateway2', gateway_user: 'test_gateway2_user' } },
285
+ 'node3' => { meta: { host_ip: '192.168.42.3', gateway: 'test_gateway3', gateway_user: 'test_gateway3_user' } }
286
+ } },
287
+ false,
288
+ '
289
+ for_nodes(%w[node1 node3]) do
290
+ transform_ssh_connection do |node, connection, connection_user, gateway, gateway_user|
291
+ ["#{connection}_#{node}_13", "#{connection_user}_#{node}_13", "#{gateway}_#{node}_13", "#{gateway_user}_#{node}_13"]
292
+ end
293
+ end
294
+ for_nodes(\'node1\') do
295
+ transform_ssh_connection do |node, connection, connection_user, gateway, gateway_user|
296
+ ["#{connection}_#{node}_1", "#{connection_user}_#{node}_1", "#{gateway}_#{node}_1", "#{gateway_user}_#{node}_1"]
297
+ end
298
+ end
299
+ ') do
300
+ test_connector.ssh_user = 'test_user'
301
+ expect(ssh_config_for('node1')).to eq <<~EOS
302
+ Host hpc.node1
303
+ Hostname 192.168.42.1_node1_13_node1_1
304
+ User "test_user_node1_13_node1_1"
305
+ ProxyCommand ssh -q -W %h:%p test_gateway1_user_node1_13_node1_1@test_gateway1_node1_13_node1_1
306
+ EOS
307
+ expect(ssh_config_for('node2')).to eq <<~EOS
308
+ Host hpc.node2
309
+ Hostname 192.168.42.2
310
+ ProxyCommand ssh -q -W %h:%p test_gateway2_user@test_gateway2
311
+ EOS
312
+ expect(ssh_config_for('node3')).to eq <<~EOS
313
+ Host hpc.node3
314
+ Hostname 192.168.42.3_node3_13
315
+ User "test_user_node3_13"
316
+ ProxyCommand ssh -q -W %h:%p test_gateway3_user_node3_13@test_gateway3_node3_13
317
+ EOS
318
+ end
319
+ end
320
+
277
321
  it 'generates a config compatible for passwords authentication' do
278
322
  with_test_platform(nodes: { 'node' => { meta: { host_ip: '192.168.42.42' } } }) do
279
323
  test_connector.passwords['node'] = 'PaSsWoRd'
@@ -13,7 +13,7 @@ describe HybridPlatformsConductor::ActionsExecutor do
13
13
 
14
14
  it 'provides an SSH URL that can be used by other processes to connect to this node' do
15
15
  with_test_platform_for_remote_testing do
16
- expect(test_connector.ssh_url).to eq 'test_user@hpc.node'
16
+ expect(test_connector.ssh_url).to eq 'hpc.node'
17
17
  end
18
18
  end
19
19
 
@@ -6,7 +6,7 @@ describe HybridPlatformsConductor::ActionsExecutor do
6
6
 
7
7
  it 'executes bash commands remotely' do
8
8
  with_test_platform_for_remote_testing(
9
- expected_cmds: [[/.+\/ssh test_user@hpc\.node \/bin\/bash <<'EOF'\nbash_cmd.bash\nEOF/, proc { [0, 'Bash commands executed on node', ''] }]],
9
+ expected_cmds: [[/.+\/ssh hpc\.node \/bin\/bash <<'EOF'\nbash_cmd.bash\nEOF/, proc { [0, 'Bash commands executed on node', ''] }]],
10
10
  expected_stdout: 'Bash commands executed on node'
11
11
  ) do
12
12
  test_connector.remote_bash('bash_cmd.bash')
@@ -17,7 +17,7 @@ describe HybridPlatformsConductor::ActionsExecutor do
17
17
  with_test_platform_for_remote_testing(
18
18
  expected_cmds: [
19
19
  [
20
- /.+\/ssh test_user@hpc\.node \/bin\/bash <<'EOF'\nbash_cmd.bash\nEOF/,
20
+ /.+\/ssh hpc\.node \/bin\/bash <<'EOF'\nbash_cmd.bash\nEOF/,
21
21
  proc do |cmd, log_to_file: nil, log_to_stdout: true, log_stdout_to_io: nil, log_stderr_to_io: nil, expected_code: 0, timeout: nil, no_exception: false|
22
22
  expect(timeout).to eq 5
23
23
  [0, '', '']
@@ -33,7 +33,7 @@ describe HybridPlatformsConductor::ActionsExecutor do
33
33
  it 'executes interactive commands remotely' do
34
34
  with_test_platform_for_remote_testing do
35
35
  expect(test_connector).to receive(:system) do |cmd|
36
- expect(cmd).to match /^.+\/ssh test_user@hpc\.node$/
36
+ expect(cmd).to match /^.+\/ssh hpc\.node$/
37
37
  end
38
38
  test_connector.remote_interactive
39
39
  end
@@ -43,7 +43,7 @@ describe HybridPlatformsConductor::ActionsExecutor do
43
43
  with_test_platform_for_remote_testing(
44
44
  expected_cmds: [
45
45
  [
46
- /cd \/path\/to && tar\s+--create\s+--gzip\s+--file -\s+src.file \| \/.+\/ssh\s+test_user@hpc\.node\s+"tar\s+--extract\s+--gunzip\s+--file -\s+--directory \/remote_path\/to\/dst.dir\s+--owner root\s+"/,
46
+ /cd \/path\/to && tar\s+--create\s+--gzip\s+--file -\s+src.file \| \/.+\/ssh\s+hpc\.node\s+"tar\s+--extract\s+--gunzip\s+--file -\s+--directory \/remote_path\/to\/dst.dir\s+--owner root\s+"/,
47
47
  proc { [0, '', ''] }
48
48
  ]
49
49
  ]
@@ -56,7 +56,7 @@ describe HybridPlatformsConductor::ActionsExecutor do
56
56
  with_test_platform_for_remote_testing(
57
57
  expected_cmds: [
58
58
  [
59
- /cd \/path\/to && tar\s+--create\s+--gzip\s+--file -\s+src.file \| \/.+\/ssh\s+test_user@hpc\.node\s+"tar\s+--extract\s+--gunzip\s+--file -\s+--directory \/remote_path\/to\/dst.dir\s+--owner root\s+"/,
59
+ /cd \/path\/to && tar\s+--create\s+--gzip\s+--file -\s+src.file \| \/.+\/ssh\s+hpc\.node\s+"tar\s+--extract\s+--gunzip\s+--file -\s+--directory \/remote_path\/to\/dst.dir\s+--owner root\s+"/,
60
60
  proc do |cmd, log_to_file: nil, log_to_stdout: true, log_stdout_to_io: nil, log_stderr_to_io: nil, expected_code: 0, timeout: nil, no_exception: false|
61
61
  expect(timeout).to eq 5
62
62
  [0, '', '']
@@ -76,7 +76,7 @@ describe HybridPlatformsConductor::ActionsExecutor do
76
76
  [
77
77
  /.+\/hpc_temp_cmds_.+\.sh$/,
78
78
  proc do |received_cmd|
79
- expect(File.read(received_cmd)).to match /.+\/ssh test_user@hpc\.node \/bin\/bash <<'EOF'\n#{Regexp.escape(cmd)}\nEOF/
79
+ expect(File.read(received_cmd)).to match /.+\/ssh hpc\.node \/bin\/bash <<'EOF'\n#{Regexp.escape(cmd)}\nEOF/
80
80
  [0, 'Bash commands executed on node', '']
81
81
  end
82
82
  ]
@@ -92,7 +92,7 @@ describe HybridPlatformsConductor::ActionsExecutor do
92
92
  with_test_platform_for_remote_testing(
93
93
  expected_cmds: [
94
94
  [
95
- /cd \/path\/to && tar\s+--create\s+--gzip\s+--file -\s+src.file \| \/.+\/ssh\s+test_user@hpc\.node\s+"sudo -u root tar\s+--extract\s+--gunzip\s+--file -\s+--directory \/remote_path\/to\/dst.dir\s+--owner root\s+"/,
95
+ /cd \/path\/to && tar\s+--create\s+--gzip\s+--file -\s+src.file \| \/.+\/ssh\s+hpc\.node\s+"sudo -u root tar\s+--extract\s+--gunzip\s+--file -\s+--directory \/remote_path\/to\/dst.dir\s+--owner root\s+"/,
96
96
  proc { [0, '', ''] }
97
97
  ]
98
98
  ]
@@ -105,7 +105,7 @@ describe HybridPlatformsConductor::ActionsExecutor do
105
105
  with_test_platform_for_remote_testing(
106
106
  expected_cmds: [
107
107
  [
108
- /cd \/path\/to && tar\s+--create\s+--gzip\s+--file -\s+src.file \| \/.+\/ssh\s+test_user@hpc\.node\s+"other_sudo --user root tar\s+--extract\s+--gunzip\s+--file -\s+--directory \/remote_path\/to\/dst.dir\s+--owner root\s+"/,
108
+ /cd \/path\/to && tar\s+--create\s+--gzip\s+--file -\s+src.file \| \/.+\/ssh\s+hpc\.node\s+"other_sudo --user root tar\s+--extract\s+--gunzip\s+--file -\s+--directory \/remote_path\/to\/dst.dir\s+--owner root\s+"/,
109
109
  proc { [0, '', ''] }
110
110
  ]
111
111
  ],
@@ -119,7 +119,7 @@ describe HybridPlatformsConductor::ActionsExecutor do
119
119
  with_test_platform_for_remote_testing(
120
120
  expected_cmds: [
121
121
  [
122
- /cd \/path\/to && tar\s+--create\s+--gzip\s+--file -\s+--owner remote_user\s+src.file \| \/.+\/ssh\s+test_user@hpc\.node\s+"tar\s+--extract\s+--gunzip\s+--file -\s+--directory \/remote_path\/to\/dst.dir\s+--owner root\s+"/,
122
+ /cd \/path\/to && tar\s+--create\s+--gzip\s+--file -\s+--owner remote_user\s+src.file \| \/.+\/ssh\s+hpc\.node\s+"tar\s+--extract\s+--gunzip\s+--file -\s+--directory \/remote_path\/to\/dst.dir\s+--owner root\s+"/,
123
123
  proc { [0, '', ''] }
124
124
  ]
125
125
  ]
@@ -132,7 +132,7 @@ describe HybridPlatformsConductor::ActionsExecutor do
132
132
  with_test_platform_for_remote_testing(
133
133
  expected_cmds: [
134
134
  [
135
- /cd \/path\/to && tar\s+--create\s+--gzip\s+--file -\s+--group remote_group\s+src.file \| \/.+\/ssh\s+test_user@hpc\.node\s+"tar\s+--extract\s+--gunzip\s+--file -\s+--directory \/remote_path\/to\/dst.dir\s+--owner root\s+"/,
135
+ /cd \/path\/to && tar\s+--create\s+--gzip\s+--file -\s+--group remote_group\s+src.file \| \/.+\/ssh\s+hpc\.node\s+"tar\s+--extract\s+--gunzip\s+--file -\s+--directory \/remote_path\/to\/dst.dir\s+--owner root\s+"/,
136
136
  proc { [0, '', ''] }
137
137
  ]
138
138
  ]
@@ -59,10 +59,10 @@ describe HybridPlatformsConductor::NodesHandler do
59
59
  '
60
60
  ) do
61
61
  expect(test_config.sudo_procs.size).to eq 2
62
- expect(test_config.sudo_procs[0][:nodes_selectors_stack]). to eq []
63
- expect(test_config.sudo_procs[0][:sudo_proc].call('test_user')). to eq 'alt_sudo1 -p test_user'
64
- expect(test_config.sudo_procs[1][:nodes_selectors_stack]). to eq ['node2']
65
- expect(test_config.sudo_procs[1][:sudo_proc].call('test_user')). to eq 'alt_sudo2 -q test_user'
62
+ expect(test_config.sudo_procs[0][:nodes_selectors_stack]).to eq []
63
+ expect(test_config.sudo_procs[0][:sudo_proc].call('test_user')).to eq 'alt_sudo1 -p test_user'
64
+ expect(test_config.sudo_procs[1][:nodes_selectors_stack]).to eq ['node2']
65
+ expect(test_config.sudo_procs[1][:sudo_proc].call('test_user')).to eq 'alt_sudo2 -q test_user'
66
66
  end
67
67
  end
68
68
 
@@ -10,6 +10,7 @@ module HybridPlatformsConductorTest
10
10
  # Parameters::
11
11
  # * *nodes_connections* (Hash<String, Hash<Symbol,Object> >): Nodes' connections info, per node name:
12
12
  # * *connection* (String): Connection string (fqdn, IP...) used by SSH
13
+ # * *ip* (String): IP used by SSH (can be different from connection in case of transformed SSH) [default: connection]
13
14
  # * *user* (String): User used by SSH
14
15
  # * *times* (Integer): Number of times this connection should be used [default: 1]
15
16
  # * *control_master_create_error* (String or nil): Error to simulate during the SSH ControlMaster creation, or nil for none [default: nil]
@@ -33,16 +34,17 @@ module HybridPlatformsConductorTest
33
34
  ssh_commands_once = []
34
35
  ssh_commands_per_connection = []
35
36
  if with_strict_host_key_checking
37
+ ip = node_connection_info[:ip] || node_connection_info[:connection]
36
38
  ssh_commands_once.concat([
37
39
  [
38
- "ssh-keyscan #{node_connection_info[:connection]}",
39
- proc { [0, "#{node_connection_info[:connection]} ssh-rsa fake_host_key_for_#{node_connection_info[:connection]}", ''] }
40
+ "ssh-keyscan #{ip}",
41
+ proc { [0, "#{ip} ssh-rsa fake_host_key_for_#{ip}", ''] }
40
42
  ]
41
43
  ])
42
44
  end
43
45
  if with_control_master_create
44
46
  ssh_commands_per_connection << [
45
- /^.+\/ssh #{with_batch_mode ? '-o BatchMode=yes ' : ''}-o ControlMaster=yes -o ControlPersist=yes #{Regexp.escape(node_connection_info[:user])}@hpc\.#{Regexp.escape(node)} true$/,
47
+ /^.+\/ssh #{with_batch_mode ? '-o BatchMode=yes ' : ''}-o ControlMaster=yes -o ControlPersist=yes hpc\.#{Regexp.escape(node)} true$/,
46
48
  proc do
47
49
  control_file = test_actions_executor.connector(:ssh).send(:control_master_file, node_connection_info[:connection], '22', node_connection_info[:user])
48
50
  # Fail if the ControlMaster file already exists, as would SSH do if the file is stalled
@@ -60,13 +62,13 @@ module HybridPlatformsConductorTest
60
62
  end
61
63
  if with_control_master_check
62
64
  ssh_commands_per_connection << [
63
- /^.+\/ssh -O check #{Regexp.escape(node_connection_info[:user])}@hpc\.#{Regexp.escape(node)}$/,
65
+ /^.+\/ssh -O check hpc\.#{Regexp.escape(node)}$/,
64
66
  proc { [0, '', ''] }
65
67
  ]
66
68
  end
67
69
  if with_control_master_destroy
68
70
  ssh_commands_per_connection << [
69
- /^.+\/ssh -O exit #{Regexp.escape(node_connection_info[:user])}@hpc\.#{Regexp.escape(node)} 2>&1 \| grep -v 'Exit request sent\.'$/,
71
+ /^.+\/ssh -O exit hpc\.#{Regexp.escape(node)} 2>&1 \| grep -v 'Exit request sent\.'$/,
70
72
  proc do
71
73
  # Really mock the control file deletion
72
74
  File.unlink(test_actions_executor.connector(:ssh).send(:control_master_file, node_connection_info[:connection], '22', node_connection_info[:user]))
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hybrid_platforms_conductor
3
3
  version: !ruby/object:Gem::Version
4
- version: 32.5.0
4
+ version: 32.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Muriel Salvan
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-03-10 00:00:00.000000000 Z
11
+ date: 2021-03-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: range_operators
@@ -463,7 +463,7 @@ files:
463
463
  - spec/hybrid_platforms_conductor_test/api/nodes_handler/cmdbs/platform_handlers_spec.rb
464
464
  - spec/hybrid_platforms_conductor_test/api/nodes_handler/cmdbs_plugins_api_spec.rb
465
465
  - spec/hybrid_platforms_conductor_test/api/nodes_handler/common_spec.rb
466
- - spec/hybrid_platforms_conductor_test/api/nodes_handler/config_spec.rb
466
+ - spec/hybrid_platforms_conductor_test/api/nodes_handler/config_dsl_spec.rb
467
467
  - spec/hybrid_platforms_conductor_test/api/nodes_handler/git_diff_impacts_spec.rb
468
468
  - spec/hybrid_platforms_conductor_test/api/nodes_handler/nodes_selectors_spec.rb
469
469
  - spec/hybrid_platforms_conductor_test/api/nodes_handler/platform_handlers_plugins_api_spec.rb