From 749d87e56597d20d5b6a6adf7194588bf05a9e95 Mon Sep 17 00:00:00 2001 From: David Shrewsbury Date: Thu, 18 May 2017 11:00:53 -0400 Subject: [PATCH] Fix test_node_vhd_and_qcow2 to validate uploads The test was assuming that the 2 built nodes would be evenly satisfied across providers. We cannot guarantee that for v3 nodepool. We CAN guarantee that the images that are built are uploaded to the provider(s) that supports the image types. In this case, fake-provider1 supports vhd and fake-provider2 supports qcow2. This required adding a 'format' field to the ImageUpload model so we can know which format was uploaded. Change-Id: I7db211b511abbb82807b50c786fa19a25ae10d32 --- nodepool/builder.py | 1 + nodepool/tests/test_launcher.py | 20 ++++++++------------ nodepool/tests/test_zk.py | 6 ++++++ nodepool/zk.py | 7 ++++++- 4 files changed, 21 insertions(+), 13 deletions(-) diff --git a/nodepool/builder.py b/nodepool/builder.py index 243b5d4ea..6b9df28bf 100644 --- a/nodepool/builder.py +++ b/nodepool/builder.py @@ -899,6 +899,7 @@ class UploadWorker(BaseWorker): data.state = zk.READY data.external_id = external_id data.external_name = ext_image_name + data.format = image.extension return data def _checkForProviderUploads(self): diff --git a/nodepool/tests/test_launcher.py b/nodepool/tests/test_launcher.py index ab1496b03..c11b35df8 100644 --- a/nodepool/tests/test_launcher.py +++ b/nodepool/tests/test_launcher.py @@ -274,19 +274,15 @@ class TestLauncher(tests.DBTestCase): def test_node_vhd_and_qcow2(self): """Test label provided by vhd and qcow2 images builds""" configfile = self.setup_config('node_vhd_and_qcow2.yaml') - pool = self.useNodepool(configfile, watermark_sleep=1) self._useBuilder(configfile) - self.waitForImage('fake-provider1', 'fake-image') - self.waitForImage('fake-provider2', 'fake-image') - pool.start() - nodes = self.waitForNodes('fake-label', 2) - self.assertEqual(len(nodes), 2) - self.assertEqual(zk.READY, nodes[0].state) - self.assertEqual(zk.READY, nodes[1].state) - if nodes[0].provider == 'fake-provider1': - self.assertEqual(nodes[1].provider, 'fake-provider2') - else: - self.assertEqual(nodes[1].provider, 'fake-provider1') + p1_image = self.waitForImage('fake-provider1', 'fake-image') + p2_image = self.waitForImage('fake-provider2', 'fake-image') + + # We can't guarantee which provider would build the requested + # nodes, but that doesn't matter so much as guaranteeing that the + # correct image type is uploaded to the correct provider. + self.assertEqual(p1_image.format, "vhd") + self.assertEqual(p2_image.format, "qcow2") def test_dib_upload_fail(self): """Test that an image upload failure is contained.""" diff --git a/nodepool/tests/test_zk.py b/nodepool/tests/test_zk.py index 08e6cdfa4..497c3f23a 100644 --- a/nodepool/tests/test_zk.py +++ b/nodepool/tests/test_zk.py @@ -186,6 +186,7 @@ class TestZooKeeper(tests.DBTestCase): orig_data = zk.ImageUpload() orig_data.external_id = "deadbeef" orig_data.state = zk.READY + orig_data.format = "qcow2" build_number = self.zk.storeBuild(image, zk.ImageBuild()) upload_id = self.zk.storeImageUpload(image, build_number, provider, @@ -196,6 +197,7 @@ class TestZooKeeper(tests.DBTestCase): self.assertEqual(orig_data.external_id, data.external_id) self.assertEqual(orig_data.state, data.state) self.assertEqual(orig_data.state_time, data.state_time) + self.assertEqual(orig_data.format, data.format) self.assertEqual(self.zk.getBuildProviders("ubuntu-trusty", build_number), [provider]) @@ -695,6 +697,7 @@ class TestZKModel(tests.BaseTestCase): o.state = zk.UPLOADING o.external_id = 'DEADBEEF' o.external_name = 'trusty' + o.format = 'qcow2' d = o.toDict() self.assertNotIn('id', d) @@ -705,6 +708,7 @@ class TestZKModel(tests.BaseTestCase): self.assertEqual(o.state_time, d['state_time']) self.assertEqual(o.external_id, d['external_id']) self.assertEqual(o.external_name, d['external_name']) + self.assertEqual(o.format, d['format']) def test_ImageUpload_fromDict(self): now = int(time.time()) @@ -713,6 +717,7 @@ class TestZKModel(tests.BaseTestCase): d = { 'external_id': 'DEADBEEF', 'external_name': 'trusty', + 'format': 'qcow2', 'state': zk.READY, 'state_time': now } @@ -726,6 +731,7 @@ class TestZKModel(tests.BaseTestCase): self.assertEqual(o.state_time, d['state_time']) self.assertEqual(o.external_id, d['external_id']) self.assertEqual(o.external_name, d['external_name']) + self.assertEqual(o.format, d['format']) def test_NodeRequest_toDict(self): o = zk.NodeRequest("500-123") diff --git a/nodepool/zk.py b/nodepool/zk.py index a58070d51..26de4c405 100644 --- a/nodepool/zk.py +++ b/nodepool/zk.py @@ -258,6 +258,7 @@ class ImageUpload(BaseModel): self.build_id = build_id self.provider_name = provider_name self.image_name = image_name + self.format = None self.external_id = None # Provider ID of the image self.external_name = None # Provider name of the image @@ -267,6 +268,7 @@ class ImageUpload(BaseModel): d['build_id'] = self.build_id d['provider_name'] = self.provider_name d['image_name'] = self.image_name + d['format'] = self.format d['stat'] = self.stat return '' % d @@ -275,7 +277,8 @@ class ImageUpload(BaseModel): return (self.id == other.id and self.provider_name == other.provider_name and self.build_id == other.build_id and - self.image_name == other.image_name) + self.image_name == other.image_name and + self.format == other.format) else: return False @@ -286,6 +289,7 @@ class ImageUpload(BaseModel): d = super(ImageUpload, self).toDict() d['external_id'] = self.external_id d['external_name'] = self.external_name + d['format'] = self.format return d @staticmethod @@ -305,6 +309,7 @@ class ImageUpload(BaseModel): super(ImageUpload, o).fromDict(d) o.external_id = d.get('external_id') o.external_name = d.get('external_name') + o.format = d.get('format') return o