Use username from node information if available

Nodepool knows the username that you should ssh with at image build time
and includes this information in the node data. Zuul should use this
username for the executor target.

Change-Id: I1e677061b9fd495b192d25a5825362c81e40d0c6
Depends-On: Ife0daa79f319aea04ed32513f99c73c460156941
This commit is contained in:
Jamie Lennox 2017-04-06 10:34:04 +10:00 committed by Tobias Henkel
parent 11925ef217
commit d4006d6927
7 changed files with 44 additions and 0 deletions

View File

@ -1713,6 +1713,8 @@ class FakeNodepool(object):
image_id=None,
host_keys=["fake-key1", "fake-key2"],
executor='fake-nodepool')
if 'fakeuser' in node_type:
data['username'] = 'fakeuser'
data = json.dumps(data).encode('utf8')
path = self.client.create(path, data,
makepath=True,

View File

@ -0,0 +1,2 @@
- hosts: all
tasks: []

View File

@ -31,6 +31,14 @@
- compute1
- compute2
- nodeset:
name: nodeset2
nodes:
- name: default
label: default-label
- name: fakeuser
label: fakeuser-label
- job:
name: base
parent: null
@ -47,3 +55,8 @@
name: group-inventory
nodeset: nodeset1
run: playbooks/group-inventory.yaml
- job:
name: hostvars-inventory
run: playbooks/hostvars-inventory.yaml
nodeset: nodeset2

View File

@ -4,3 +4,4 @@
jobs:
- single-inventory
- group-inventory
- hostvars-inventory

View File

@ -80,3 +80,24 @@ class TestInventory(ZuulTestCase):
self.executor_server.release()
self.waitUntilSettled()
def test_hostvars_inventory(self):
inventory = self._get_build_inventory('hostvars-inventory')
all_nodes = ('default', 'fakeuser')
self.assertIn('all', inventory)
self.assertIn('hosts', inventory['all'])
self.assertIn('vars', inventory['all'])
for node_name in all_nodes:
self.assertIn(node_name, inventory['all']['hosts'])
# check if the nodes use the correct username
if node_name == 'fakeuser':
username = 'fakeuser'
else:
username = 'zuul'
self.assertEqual(
inventory['all']['hosts'][node_name]['ansible_user'], username)
self.executor_server.release()
self.waitUntilSettled()

View File

@ -920,6 +920,10 @@ class AnsibleJob(object):
private_ipv4=node.get('private_ipv4'),
public_ipv6=node.get('public_ipv6')))
username = node.get('username')
if username:
host_vars['ansible_user'] = username
host_keys = []
for key in node.get('host_keys'):
if port != 22:

View File

@ -388,6 +388,7 @@ class Node(object):
self.az = None
self.provider = None
self.region = None
self.username = None
@property
def state(self):