diff --git a/tests/base.py b/tests/base.py index 176c53528a..036515d311 100755 --- a/tests/base.py +++ b/tests/base.py @@ -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, diff --git a/tests/fixtures/config/inventory/git/common-config/playbooks/hostvars-inventory.yaml b/tests/fixtures/config/inventory/git/common-config/playbooks/hostvars-inventory.yaml new file mode 100644 index 0000000000..f679dceaef --- /dev/null +++ b/tests/fixtures/config/inventory/git/common-config/playbooks/hostvars-inventory.yaml @@ -0,0 +1,2 @@ +- hosts: all + tasks: [] diff --git a/tests/fixtures/config/inventory/git/common-config/zuul.yaml b/tests/fixtures/config/inventory/git/common-config/zuul.yaml index 900abd6697..74ddf2dcef 100644 --- a/tests/fixtures/config/inventory/git/common-config/zuul.yaml +++ b/tests/fixtures/config/inventory/git/common-config/zuul.yaml @@ -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 diff --git a/tests/fixtures/config/inventory/git/org_project/.zuul.yaml b/tests/fixtures/config/inventory/git/org_project/.zuul.yaml index 26310a0b59..1a8bf5d649 100644 --- a/tests/fixtures/config/inventory/git/org_project/.zuul.yaml +++ b/tests/fixtures/config/inventory/git/org_project/.zuul.yaml @@ -4,3 +4,4 @@ jobs: - single-inventory - group-inventory + - hostvars-inventory diff --git a/tests/unit/test_inventory.py b/tests/unit/test_inventory.py index 2835d30678..04dcb051b9 100644 --- a/tests/unit/test_inventory.py +++ b/tests/unit/test_inventory.py @@ -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() diff --git a/zuul/executor/server.py b/zuul/executor/server.py index 469d6f3508..79fa91e0e2 100644 --- a/zuul/executor/server.py +++ b/zuul/executor/server.py @@ -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: diff --git a/zuul/model.py b/zuul/model.py index b027c534fe..8044d93900 100644 --- a/zuul/model.py +++ b/zuul/model.py @@ -388,6 +388,7 @@ class Node(object): self.az = None self.provider = None self.region = None + self.username = None @property def state(self):