Skip to content

Commit da27b53

Browse files
author
Eric Diven
committed
Build the Docker images in the Makefile
We had an infrastructure failure where the yum repo wasn't available. This meant that the docker build process for the base image for every test failed. Unfortunately, we check for the base image and attempt to build it once per testcase rather than once per test run, so our tests took forever to run and had an error for every test. This commit moves building the base image to the Makefile so that if we hit this issue in the future, we'll fail fast.
1 parent f24d12f commit da27b53

6 files changed

+52
-79
lines changed

Makefile

+7-2
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ clean-docs:
7070
lint:
7171
flake8 prestoadmin packaging tests
7272

73-
smoke: clean-test
73+
smoke: clean-test docker-images
7474
tox -e py26 -- -a smoketest,'!quarantine'
7575

7676
test: clean-test
@@ -79,11 +79,16 @@ test: clean-test
7979

8080
TEST_SUITE?=tests.product
8181

82-
test-all: clean-test
82+
test-all: clean-test docker-images
8383
tox -- -s tests.unit
8484
tox -- -s tests.integration
8585
tox -e py26 -- -s ${TEST_SUITE} -a '!quarantine'
8686

87+
88+
DOCKERFILE_DIR=tests/product/resources/centos6-ssh-test
89+
docker-images:
90+
docker build --rm=true --tag teradatalabs/centos-ssh-test $(DOCKERFILE_DIR)
91+
8792
test-rpm: clean-test
8893
tox -e py26 -- -s tests.rpm -a '!quarantine'
8994

tests/bare_image_provider.py

+33-2
Original file line numberDiff line numberDiff line change
@@ -21,18 +21,49 @@
2121

2222
import abc
2323

24+
from docker import Client
25+
2426

2527
class BareImageProvider(object):
2628
__metaclass__ = abc.ABCMeta
2729

30+
def __init__(self, tag_decoration):
31+
super(BareImageProvider, self).__init__()
32+
self.tag_decoration = tag_decoration
33+
2834
@abc.abstractmethod
2935
def create_bare_images(self, cluster, master_name, slave_name):
3036
"""Create master and slave images to be tagged with master_name and
3137
slave_name, respectively."""
3238
pass
3339

34-
@abc.abstractmethod
3540
def get_tag_decoration(self):
3641
"""Returns a string that's prepended to docker image tags for images
3742
based off of the bare image created by the provider."""
38-
pass
43+
return self.tag_decoration
44+
45+
46+
"""
47+
Provides bare images from existing tags in Docker. For some of the heftier
48+
images, we don't want to go through a long and drawn-out Docker build on a
49+
regular basis. For these, we count on having an image in Docker that we can
50+
tag appropriately into the teradatalabs/pa_tests namespace. Test cleanup can
51+
continue to obliterate that namespace without disrupting the actual heavyweight
52+
images.
53+
54+
As an additional benefit, this means we can have tests depend on images that
55+
the test code doesn't know how to build. That seems like a liability, but it
56+
that the build process for complex images can be versioned outside of the
57+
presto-admin codebase.
58+
"""
59+
60+
class TagBareImageProvider(BareImageProvider):
61+
def __init__(self, base_master_name, base_slave_name, tag_decoration):
62+
super(TagBareImageProvider, self).__init__(tag_decoration)
63+
self.base_master_name = base_master_name
64+
self.base_slave_name = base_slave_name
65+
self.client = Client()
66+
67+
def create_bare_images(self, cluster, master_name, slave_name):
68+
self.client.tag(self.base_master_name, master_name)
69+
self.client.tag(self.base_slave_name, slave_name)

tests/docker_cluster.py

+6-3
Original file line numberDiff line numberDiff line change
@@ -392,18 +392,21 @@ def start_existing_images(bare_image_provider, cluster_type):
392392
return centos_cluster
393393

394394
@staticmethod
395-
def _check_for_images(master_image_name, slave_image_name):
395+
def _check_for_images(master_image_name, slave_image_name, tag='latest'):
396+
master_repotag = '%s:%s' % (master_image_name, tag)
397+
slave_repotag = '%s:%s' % (slave_image_name, tag)
396398
with Client(timeout=180) as client:
397399
images = client.images()
398400
has_master_image = False
399401
has_slave_image = False
400402
for image in images:
401-
if master_image_name in image['RepoTags'][0]:
403+
if master_repotag in image['RepoTags']:
402404
has_master_image = True
403-
if slave_image_name in image['RepoTags'][0]:
405+
if slave_repotag in image['RepoTags']:
404406
has_slave_image = True
405407
return has_master_image and has_slave_image
406408

409+
407410
def commit_images(self, bare_image_provider, cluster_type):
408411
self.client.commit(self.master,
409412
self._get_master_image_name(bare_image_provider,

tests/hdp_bare_image_provider.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
that hadoop is actually installed.
1818
"""
1919

20-
from tests.tag_bare_image_provider import TagBareImageProvider
20+
from tests.bare_image_provider import TagBareImageProvider
2121

2222

2323
class HdpBareImageProvider(TagBareImageProvider):

tests/no_hadoop_bare_image_provider.py

+5-24
Original file line numberDiff line numberDiff line change
@@ -16,30 +16,11 @@
1616
Provides bare images for standalone clusters.
1717
"""
1818

19-
from tests.bare_image_provider import BareImageProvider
19+
from tests.bare_image_provider import TagBareImageProvider
2020

21-
from tests.product.constants import \
22-
BASE_IMAGE_NAME, BASE_IMAGE_TAG, BASE_TD_DOCKERFILE_DIR
2321

24-
25-
class NoHadoopBareImageProvider(BareImageProvider):
22+
class NoHadoopBareImageProvider(TagBareImageProvider):
2623
def __init__(self):
27-
super(NoHadoopBareImageProvider, self).__init__()
28-
29-
def create_bare_images(self, cluster, master_name, slave_name):
30-
cluster.create_image(
31-
BASE_TD_DOCKERFILE_DIR,
32-
master_name,
33-
BASE_IMAGE_NAME,
34-
BASE_IMAGE_TAG
35-
)
36-
37-
cluster.create_image(
38-
BASE_TD_DOCKERFILE_DIR,
39-
slave_name,
40-
BASE_IMAGE_NAME,
41-
BASE_IMAGE_TAG
42-
)
43-
44-
def get_tag_decoration(self):
45-
return 'nohadoop'
24+
super(NoHadoopBareImageProvider, self).__init__(
25+
'teradatalabs/centos-ssh-test', 'teradatalabs/centos-ssh-test',
26+
'nohadoop')

tests/tag_bare_image_provider.py

-47
This file was deleted.

0 commit comments

Comments
 (0)