Merge "Change node 'image' to 'label'" into feature/zuulv3
diff --git a/tests/base.py b/tests/base.py
index 76d604f..76f7e03 100755
--- a/tests/base.py
+++ b/tests/base.py
@@ -1091,14 +1091,14 @@
         self.jobdir = None
         self.uuid = job.unique
         self.parameters = json.loads(job.arguments)
-        # TODOv3(jeblair): self.node is really "the image of the node
-        # assigned".  We should rename it (self.node_image?) if we
+        # TODOv3(jeblair): self.node is really "the label of the node
+        # assigned".  We should rename it (self.node_label?) if we
         # keep using it like this, or we may end up exposing more of
         # the complexity around multi-node jobs here
-        # (self.nodes[0].image?)
+        # (self.nodes[0].label?)
         self.node = None
         if len(self.parameters.get('nodes')) == 1:
-            self.node = self.parameters['nodes'][0]['image']
+            self.node = self.parameters['nodes'][0]['label']
         self.unique = self.parameters['ZUUL_UUID']
         self.pipeline = self.parameters['ZUUL_PIPELINE']
         self.project = self.parameters['ZUUL_PROJECT']
diff --git a/tests/fixtures/config/ansible/git/common-config/zuul.yaml b/tests/fixtures/config/ansible/git/common-config/zuul.yaml
index 02b87bd..b31c148 100644
--- a/tests/fixtures/config/ansible/git/common-config/zuul.yaml
+++ b/tests/fixtures/config/ansible/git/common-config/zuul.yaml
@@ -71,7 +71,7 @@
     name: check-vars
     nodes:
       - name: ubuntu-xenial
-        image: ubuntu-xenial
+        label: ubuntu-xenial
 
 - job:
     name: hello
diff --git a/tests/fixtures/config/inventory/git/common-config/zuul.yaml b/tests/fixtures/config/inventory/git/common-config/zuul.yaml
index 184bd80..e147b98 100644
--- a/tests/fixtures/config/inventory/git/common-config/zuul.yaml
+++ b/tests/fixtures/config/inventory/git/common-config/zuul.yaml
@@ -16,11 +16,11 @@
     name: nodeset1
     nodes:
       - name: controller
-        image: controller-image
+        label: controller-label
       - name: compute1
-        image: compute-image
+        label: compute-label
       - name: compute2
-        image: compute-image
+        label: compute-label
     groups:
       - name: ceph-osd
         nodes:
@@ -35,7 +35,7 @@
     name: single-inventory
     nodes:
       - name: ubuntu-xenial
-        image: ubuntu-xenial
+        label: ubuntu-xenial
 
 - job:
     name: group-inventory
diff --git a/tests/fixtures/config/multi-tenant/git/common-config/zuul.yaml b/tests/fixtures/config/multi-tenant/git/common-config/zuul.yaml
index ec9c6dd..362434e 100644
--- a/tests/fixtures/config/multi-tenant/git/common-config/zuul.yaml
+++ b/tests/fixtures/config/multi-tenant/git/common-config/zuul.yaml
@@ -15,4 +15,4 @@
     name: python27
     nodes:
       - name: controller
-        image: ubuntu-trusty
+        label: ubuntu-trusty
diff --git a/tests/fixtures/config/multi-tenant/git/tenant-one-config/zuul.yaml b/tests/fixtures/config/multi-tenant/git/tenant-one-config/zuul.yaml
index 63a19e2..347bc53 100644
--- a/tests/fixtures/config/multi-tenant/git/tenant-one-config/zuul.yaml
+++ b/tests/fixtures/config/multi-tenant/git/tenant-one-config/zuul.yaml
@@ -23,7 +23,7 @@
     name: nodeset1
     nodes:
       - name: controller
-        image: controller-image
+        label: controller-label
 
 - job:
     name: project1-test1
diff --git a/tests/fixtures/config/multi-tenant/git/tenant-two-config/zuul.yaml b/tests/fixtures/config/multi-tenant/git/tenant-two-config/zuul.yaml
index 4feb9f5..5ea803e 100644
--- a/tests/fixtures/config/multi-tenant/git/tenant-two-config/zuul.yaml
+++ b/tests/fixtures/config/multi-tenant/git/tenant-two-config/zuul.yaml
@@ -23,7 +23,7 @@
     name: nodeset1
     nodes:
       - name: controller
-        image: controller-image
+        label: controller-label
 
 - job:
     name: project2-test1
diff --git a/tests/fixtures/config/openstack/git/project-config/zuul.yaml b/tests/fixtures/config/openstack/git/project-config/zuul.yaml
index aff2046..2ad600c 100644
--- a/tests/fixtures/config/openstack/git/project-config/zuul.yaml
+++ b/tests/fixtures/config/openstack/git/project-config/zuul.yaml
@@ -38,7 +38,7 @@
     timeout: 30
     nodes:
       - name: controller
-        image: ubuntu-xenial
+        label: ubuntu-xenial
 
 - job:
     name: python27
@@ -50,7 +50,7 @@
     branches: stable/mitaka
     nodes:
       - name: controller
-        image: ubuntu-trusty
+        label: ubuntu-trusty
 
 - job:
     name: python35
diff --git a/tests/fixtures/config/single-tenant/git/common-config/zuul.yaml b/tests/fixtures/config/single-tenant/git/common-config/zuul.yaml
index 2bb61ee..27454d3 100644
--- a/tests/fixtures/config/single-tenant/git/common-config/zuul.yaml
+++ b/tests/fixtures/config/single-tenant/git/common-config/zuul.yaml
@@ -49,20 +49,20 @@
     attempts: 4
     nodes:
       - name: controller
-        image: image1
+        label: label1
 
 - job:
     name: project-test1
     branches: stable
     nodes:
       - name: controller
-        image: image2
+        label: label2
 
 - job:
     name: project-post
     nodes:
       - name: static
-        image: ubuntu-xenial
+        label: ubuntu-xenial
 
 - job:
     name: project-test2
diff --git a/tests/fixtures/layouts/disable_at.yaml b/tests/fixtures/layouts/disable_at.yaml
index 2956ebf..8e352d8 100644
--- a/tests/fixtures/layouts/disable_at.yaml
+++ b/tests/fixtures/layouts/disable_at.yaml
@@ -19,7 +19,7 @@
     name: project-test1
     nodes:
       - name: controller
-        image: image1
+        label: label1
 
 - project:
     name: org/project
diff --git a/tests/fixtures/layouts/dont-ignore-ref-deletes.yaml b/tests/fixtures/layouts/dont-ignore-ref-deletes.yaml
index aee5ac6..6a05fe6 100644
--- a/tests/fixtures/layouts/dont-ignore-ref-deletes.yaml
+++ b/tests/fixtures/layouts/dont-ignore-ref-deletes.yaml
@@ -11,7 +11,7 @@
     name: project-post
     nodes:
       - name: static
-        image: ubuntu-xenial
+        label: ubuntu-xenial
 
 - project:
     name: org/project
diff --git a/tests/fixtures/layouts/idle.yaml b/tests/fixtures/layouts/idle.yaml
index ff33842..60f8ed1 100644
--- a/tests/fixtures/layouts/idle.yaml
+++ b/tests/fixtures/layouts/idle.yaml
@@ -9,13 +9,13 @@
     name: project-bitrot-stable-old
     nodes:
       - name: static
-        image: ubuntu-xenial
+        label: ubuntu-xenial
 
 - job:
     name: project-bitrot-stable-older
     nodes:
       - name: static
-        image: ubuntu-trusty
+        label: ubuntu-trusty
 
 - project:
     name: org/project
diff --git a/tests/fixtures/layouts/no-timer.yaml b/tests/fixtures/layouts/no-timer.yaml
index c8ced62..12eaa35 100644
--- a/tests/fixtures/layouts/no-timer.yaml
+++ b/tests/fixtures/layouts/no-timer.yaml
@@ -27,13 +27,13 @@
     name: project-bitrot-stable-old
     nodes:
       - name: static
-        image: ubuntu-xenial
+        label: ubuntu-xenial
 
 - job:
     name: project-bitrot-stable-older
     nodes:
       - name: static
-        image: ubuntu-trusty
+        label: ubuntu-trusty
 
 - project:
     name: org/project
diff --git a/tests/fixtures/layouts/repo-deleted.yaml b/tests/fixtures/layouts/repo-deleted.yaml
index a33da77..95d11bb 100644
--- a/tests/fixtures/layouts/repo-deleted.yaml
+++ b/tests/fixtures/layouts/repo-deleted.yaml
@@ -40,14 +40,14 @@
     name: project-test1
     nodes:
       - name: controller
-        image: image1
+        label: label1
 
 - job:
     name: project-test1
     branches: stable
     nodes:
       - name: controller
-        image: image2
+        label: label2
 
 - job:
     name: project-test2
diff --git a/tests/fixtures/layouts/smtp.yaml b/tests/fixtures/layouts/smtp.yaml
index 8f53d02..fd91d36 100644
--- a/tests/fixtures/layouts/smtp.yaml
+++ b/tests/fixtures/layouts/smtp.yaml
@@ -46,14 +46,14 @@
     name: project-test1
     nodes:
       - name: controller
-        image: image1
+        label: label1
 
 - job:
     name: project-test1
     branches: stable
     nodes:
       - name: controller
-        image: image2
+        label: label2
 
 - job:
     name: project-test2
diff --git a/tests/fixtures/layouts/timer.yaml b/tests/fixtures/layouts/timer.yaml
index 95199e7..883c32e 100644
--- a/tests/fixtures/layouts/timer.yaml
+++ b/tests/fixtures/layouts/timer.yaml
@@ -28,13 +28,13 @@
     name: project-bitrot-stable-old
     nodes:
       - name: static
-        image: ubuntu-xenial
+        label: ubuntu-xenial
 
 - job:
     name: project-bitrot-stable-older
     nodes:
       - name: static
-        image: ubuntu-trusty
+        label: ubuntu-trusty
 
 - project:
     name: org/project
diff --git a/tests/unit/test_model.py b/tests/unit/test_model.py
index e7e53c4..7a4d53e 100644
--- a/tests/unit/test_model.py
+++ b/tests/unit/test_model.py
@@ -186,7 +186,7 @@
             'post-run': 'base-post',
             'nodes': [{
                 'name': 'controller',
-                'image': 'base',
+                'label': 'base',
             }],
         })
         layout.addJob(base)
@@ -199,7 +199,7 @@
             'post-run': 'py27-post',
             'nodes': [{
                 'name': 'controller',
-                'image': 'new',
+                'label': 'new',
             }],
             'timeout': 40,
         })
@@ -216,7 +216,7 @@
             'post-run': 'py27-diablo-post',
             'nodes': [{
                 'name': 'controller',
-                'image': 'old',
+                'label': 'old',
             }],
             'timeout': 50,
         })
@@ -264,7 +264,7 @@
         self.assertEqual(job.timeout, 40)
         nodes = job.nodeset.getNodes()
         self.assertEqual(len(nodes), 1)
-        self.assertEqual(nodes[0].image, 'new')
+        self.assertEqual(nodes[0].label, 'new')
         self.assertEqual([x.path for x in job.pre_run],
                          ['playbooks/base-pre',
                           'playbooks/py27-pre'])
@@ -292,7 +292,7 @@
         self.assertEqual(job.timeout, 50)
         nodes = job.nodeset.getNodes()
         self.assertEqual(len(nodes), 1)
-        self.assertEqual(nodes[0].image, 'old')
+        self.assertEqual(nodes[0].label, 'old')
         self.assertEqual([x.path for x in job.pre_run],
                          ['playbooks/base-pre',
                           'playbooks/py27-pre',
diff --git a/tests/unit/test_scheduler.py b/tests/unit/test_scheduler.py
index de8246c..d9e20be 100755
--- a/tests/unit/test_scheduler.py
+++ b/tests/unit/test_scheduler.py
@@ -60,7 +60,7 @@
         self.assertEqual(A.data['status'], 'MERGED')
         self.assertEqual(A.reported, 2)
         self.assertEqual(self.getJobFromHistory('project-test1').node,
-                         'image1')
+                         'label1')
         self.assertIsNone(self.getJobFromHistory('project-test2').node)
 
         # TODOv3(jeblair): we may want to report stats by tenant (also?).
@@ -110,7 +110,7 @@
         self.assertIn('gate', A.messages[1],
                       "A should transit gate")
         self.assertEqual(self.getJobFromHistory('project-test1').node,
-                         'image2')
+                         'label2')
 
     def test_parallel_changes(self):
         "Test that changes are tested in parallel and merged in series"
diff --git a/tests/unit/test_v3.py b/tests/unit/test_v3.py
index e325f18..7d84b1f 100644
--- a/tests/unit/test_v3.py
+++ b/tests/unit/test_v3.py
@@ -375,9 +375,9 @@
                 name: duplicate
                 nodes:
                   - name: compute
-                    image: foo
+                    label: foo
                   - name: compute
-                    image: foo
+                    label: foo
             """)
 
         file_dict = {'.zuul.yaml': in_repo_conf}
@@ -400,7 +400,7 @@
                 name: duplicate
                 nodes:
                   - name: compute
-                    image: foo
+                    label: foo
                 groups:
                   - name: group
                     nodes: compute
diff --git a/zuul/configloader.py b/zuul/configloader.py
index d1ff7ca..029b840 100644
--- a/zuul/configloader.py
+++ b/zuul/configloader.py
@@ -214,7 +214,7 @@
     @staticmethod
     def getSchema():
         node = {vs.Required('name'): str,
-                vs.Required('image'): str,
+                vs.Required('label'): str,
                 }
 
         group = {vs.Required('name'): str,
@@ -239,7 +239,7 @@
         for conf_node in as_list(conf['nodes']):
             if conf_node['name'] in node_names:
                 raise DuplicateNodeError(conf['name'], conf_node['name'])
-            node = model.Node(conf_node['name'], conf_node['image'])
+            node = model.Node(conf_node['name'], conf_node['label'])
             ns.addNode(node)
             node_names.add(conf_node['name'])
         for conf_group in as_list(conf.get('groups', [])):
@@ -285,7 +285,7 @@
                 }
 
         node = {vs.Required('name'): str,
-                vs.Required('image'): str,
+                vs.Required('label'): str,
                 }
 
         zuul_role = {vs.Required('zuul'): str,
@@ -432,7 +432,7 @@
             else:
                 ns = model.NodeSet()
                 for conf_node in conf_nodes:
-                    node = model.Node(conf_node['name'], conf_node['image'])
+                    node = model.Node(conf_node['name'], conf_node['label'])
                     ns.addNode(node)
             job.nodeset = ns
 
diff --git a/zuul/executor/client.py b/zuul/executor/client.py
index 52074a1..f6961f3 100644
--- a/zuul/executor/client.py
+++ b/zuul/executor/client.py
@@ -279,7 +279,7 @@
         nodeset = item.current_build_set.getJobNodeSet(job.name)
         nodes = []
         for node in nodeset.getNodes():
-            nodes.append(dict(name=node.name, image=node.image,
+            nodes.append(dict(name=node.name, label=node.label,
                               az=node.az,
                               host_keys=node.host_keys,
                               provider=node.provider,
diff --git a/zuul/model.py b/zuul/model.py
index 25f69d7..5eedc75 100644
--- a/zuul/model.py
+++ b/zuul/model.py
@@ -354,9 +354,9 @@
     provided by Nodepool.
     """
 
-    def __init__(self, name, image):
+    def __init__(self, name, label):
         self.name = name
-        self.image = image
+        self.label = label
         self.id = None
         self.lock = None
         # Attributes from Nodepool
@@ -383,7 +383,7 @@
         self.state_time = time.time()
 
     def __repr__(self):
-        return '<Node %s %s:%s>' % (self.id, self.name, self.image)
+        return '<Node %s %s:%s>' % (self.id, self.name, self.label)
 
     def __ne__(self, other):
         return not self.__eq__(other)
@@ -392,7 +392,7 @@
         if not isinstance(other, Node):
             return False
         return (self.name == other.name and
-                self.image == other.image and
+                self.label == other.label and
                 self.id == other.id)
 
     def toDict(self):
@@ -471,7 +471,7 @@
     def copy(self):
         n = NodeSet(self.name)
         for name, node in self.nodes.items():
-            n.addNode(Node(node.name, node.image))
+            n.addNode(Node(node.name, node.label))
         for name, group in self.groups.items():
             n.addGroup(Group(group.name, group.nodes[:]))
         return n
@@ -538,7 +538,7 @@
 
     def toDict(self):
         d = {}
-        nodes = [n.image for n in self.nodeset.getNodes()]
+        nodes = [n.label for n in self.nodeset.getNodes()]
         d['node_types'] = nodes
         d['requestor'] = self.requestor
         d['state'] = self.state