Skip to content
This repository has been archived by the owner on Jan 23, 2024. It is now read-only.

Support ubi8 docker images #931

Merged
merged 5 commits into from
Sep 22, 2020
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions scripts/modules/beats.py
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,8 @@ def build_candidate_manifest(self):
image = self.docker_name
if self.oss:
image += "-oss"
if self.ubi8:
image += "-ubi8"

key = "{image}-{version}-docker-image.tar.gz".format(
image=image,
Expand Down
17 changes: 17 additions & 0 deletions scripts/modules/cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -169,6 +169,8 @@ def __init__(self, argv=None, services=None):

self.args = parser.parse_args(argv)

self.validate_options(self.args, parser)

# py3
if not hasattr(self.args, "func"):
parser.error("command required")
Expand Down Expand Up @@ -340,6 +342,14 @@ def init_start_parser(self, parser, services, argv=None):
default=False,
)

parser.add_argument(
'--ubi8',
action='store_true',
help='use ubi8 container images',
dest='ubi8',
default=False,
)

parser.add_argument(
"--apm-server-url",
action="store",
Expand Down Expand Up @@ -488,6 +498,13 @@ def store_options(self, parser):
for choice, subparser in subparsers_action.choices.items():
self.available_options.add(choice)

def validate_options(self, args, parser):
"""
Helper method to validate if certain options are compatible or not.
"""
if hasattr(self.args, "oss") and hasattr(self.args, "ubi8") and args.oss and args.ubi8:
parser.error("oss and ubi8 options are incompatible. Choose one of them instead.")

#
# handlers
#
Expand Down
8 changes: 7 additions & 1 deletion scripts/modules/elastic_stack.py
Original file line number Diff line number Diff line change
Expand Up @@ -425,6 +425,8 @@ def build_candidate_manifest(self):
image = self.docker_name
if self.oss:
image += "-oss"
if self.ubi8:
image += "-ubi8"

key = "{image}-{version}-docker-image.tar.gz".format(
image=image,
Expand Down Expand Up @@ -480,7 +482,11 @@ def _content(self):
build_spec_parts = self.build.split("@", 1)
repo = build_spec_parts[0]
branch = build_spec_parts[1] if len(build_spec_parts) > 1 else "master"
binary = "apm-server-oss" if self.oss else "apm-server"
binary = "apm-server"
if self.oss:
binary = "apm-server-oss"
if self.ubi8:
binary = "apm-server-ubi8"
v1v marked this conversation as resolved.
Show resolved Hide resolved
content.update({
"build": {
"context": "docker/apm-server",
Expand Down
11 changes: 10 additions & 1 deletion scripts/modules/service.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ def __init__(self, **options):
self._oss = options.get(self.option_name() + "_oss") or options.get("oss")
self._release = options.get(self.option_name() + "_release") or options.get("release")
self._snapshot = options.get(self.option_name() + "_snapshot") or options.get("snapshot")
self._ubi8 = options.get(self.option_name() + "_ubi8") or options.get("ubi8")

# version is service specific or stack or default
self._version = options.get(self.option_name() + "_version") or options.get("version", DEFAULT_STACK_VERSION)
Expand Down Expand Up @@ -69,6 +70,8 @@ def default_image(self, version_override=None):
image = "/".join((self.docker_registry, self.docker_path, self.docker_name))
if self.oss:
image += "-oss"
if self.ubi8:
image += "-ubi8"
image += ":" + (version_override or self.version)
# no command line option for setting snapshot, snapshot == no bc and not release
if self.snapshot or not (any((self.bc, self.release))):
Expand Down Expand Up @@ -107,6 +110,10 @@ def option_name(cls):
def oss(self):
return self._oss

@property
def ubi8(self):
return self._ubi8

@staticmethod
def publish_port(external, internal=None, expose=False):
addr = "" if expose else "127.0.0.1:"
Expand Down Expand Up @@ -175,6 +182,8 @@ def build_candidate_manifest(self):
image = self.docker_name
if self.oss:
image += "-oss"
if self.ubi8:
image += "-ubi8"
key = "{image}-{version}-docker-image.tar.gz".format(
image=image,
version=version,
Expand Down Expand Up @@ -205,7 +214,7 @@ def add_arguments(cls, parser):
dest=cls.option_name() + "_" + image_detail_key,
help="stack {} override".format(image_detail_key),
)
for image_detail_key in ("oss", "release", "snapshot"):
for image_detail_key in ("oss", "release", "snapshot", "ubi8"):
parser.add_argument(
"--" + cls.name() + "-" + image_detail_key,
action="store_true",
Expand Down
56 changes: 56 additions & 0 deletions scripts/tests/localsetup_tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -1366,6 +1366,62 @@ def test_start_bc_with_release(self, mock_load_images, mock_resolve_bc):
},
image_cache_dir)

@mock.patch(service.__name__ + ".resolve_bc")
@mock.patch(cli.__name__ + ".load_images")
def test_start_bc_ubi8(self, mock_load_images, mock_resolve_bc):
mock_resolve_bc.return_value = {
"projects": {
"elasticsearch": {
"packages": {
"elasticsearch-ubi8-7.10.0-docker-image.tar.gz": {
"url": "https://staging.elastic.co/.../elasticsearch-ubi8-7.10.0-docker-image.tar.gz",
"type": "docker"
},
},
},
"kibana": {
"packages": {
"kibana-ubi8-7.10.0-docker-image.tar.gz": {
"url": "https://staging.elastic.co/.../kibana-ubi8-7.10.0-docker-image.tar.gz",
"type": "docker"
},
},
},
"apm-server": {
"packages": {
"apm-server-ubi8-7.10.0-docker-image.tar.gz": {
"url": "https://staging.elastic.co/.../apm-server-ubi8-7.10.0-docker-image.tar.gz",
"type": "docker"
},
},
},
},
}
docker_compose_yml = stringIO()
image_cache_dir = "/foo"
version = "7.10.0"
bc = "abcd1234"
self.assertNotIn(version, LocalSetup.SUPPORTED_VERSIONS)
setup = LocalSetup(argv=self.common_setup_args + [
version, "--ubi8", "--bc", bc, "--image-cache-dir", image_cache_dir])
setup.set_docker_compose_path(docker_compose_yml)
setup()
docker_compose_yml.seek(0)
got = yaml.load(docker_compose_yml)
services = got["services"]
self.assertEqual(
"docker.elastic.co/elasticsearch/elasticsearch-ubi8:{}".format(version),
services["elasticsearch"]["image"]
)
self.assertEqual("docker.elastic.co/kibana/kibana-ubi8:{}".format(version), services["kibana"]["image"])
mock_load_images.assert_called_once_with(
{
"https://staging.elastic.co/.../elasticsearch-ubi8-7.10.0-docker-image.tar.gz",
"https://staging.elastic.co/.../kibana-ubi8-7.10.0-docker-image.tar.gz",
"https://staging.elastic.co/.../apm-server-ubi8-7.10.0-docker-image.tar.gz",
},
image_cache_dir)

@mock.patch(service.__name__ + ".resolve_bc")
def test_docker_download_image_url(self, mock_resolve_bc):
mock_resolve_bc.return_value = {
Expand Down
30 changes: 30 additions & 0 deletions scripts/tests/service_tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -440,6 +440,12 @@ def test_oss_release(self):
apm_server["image"], "docker.elastic.co/apm/apm-server-oss:6.3.100"
)

def test_ubi8_snapshot(self):
apm_server = ApmServer(version="8.0.0", ubi8=True, snapshot=True).render()["apm-server"]
self.assertEqual(
apm_server["image"], "docker.elastic.co/apm/apm-server-ubi8:8.0.0-SNAPSHOT"
)

def test_api_key_auth(self):
apm_server = ApmServer(version="7.6.100", apm_server_api_key_auth=True).render()["apm-server"]
self.assertIn("apm-server.api_key.enabled=true", apm_server["command"])
Expand Down Expand Up @@ -721,6 +727,16 @@ def test_apm_server_build_oss(self):
'apm_server_repo': 'foo.git'},
'context': 'docker/apm-server'})

def test_apm_server_build_ubi8(self):
apm_server = ApmServer(version="7.9.2", apm_server_build="foo.git", release=True, ubi8=True).render()["apm-server"]
self.assertIsNone(apm_server.get("image"))
self.assertDictEqual(apm_server["build"], {
'args': {'apm_server_base_image': 'docker.elastic.co/apm/apm-server-ubi8:7.9.2',
'apm_server_binary': 'apm-server-ubi8',
'apm_server_branch_or_commit': 'master',
'apm_server_repo': 'foo.git'},
'context': 'docker/apm-server'})

def test_apm_server_count(self):
render = ApmServer(version="6.4.100", apm_server_count=2).render()
apm_server_lb = render["apm-server"]
Expand Down Expand Up @@ -839,6 +855,16 @@ def test_6_2_oss_release(self):
"xpack.security.enabled set while oss"
)

def test_7_10_ubi8_release(self):
elasticsearch = Elasticsearch(version="7.10.0", ubi8=True, release=True).render()["elasticsearch"]
self.assertEqual(
elasticsearch["image"], "docker.elastic.co/elasticsearch/elasticsearch-ubi8:7.10.0"
)
self.assertTrue(
any(e.startswith("xpack.security.enabled=") for e in elasticsearch["environment"]),
"xpack.security.enabled set while oss"
)

def test_6_3_snapshot(self):
elasticsearch = Elasticsearch(version="6.3.100", snapshot=True).render()["elasticsearch"]
self.assertEqual(
Expand Down Expand Up @@ -1091,6 +1117,10 @@ def test_kibana_snapshot(self):
kibana = Kibana(version="7.3.0", kibana_snapshot=True, kibana_version="7.3.0").render()["kibana"]
self.assertEqual("docker.elastic.co/kibana/kibana:7.3.0-SNAPSHOT", kibana["image"])

def test_kibana_ubi8(self):
kibana = Kibana(version="7.10.0", release=True, kibana_ubi8=True, kibana_version="7.10.0").render()["kibana"]
self.assertEqual("docker.elastic.co/kibana/kibana-ubi8:7.10.0", kibana["image"])

def test_kibana_login_assistance_message(self):
kibana = Kibana(version="7.6.0", xpack_secure=True, kibana_version="7.6.0").render()["kibana"]
self.assertIn("Login details: `admin/changeme`.", kibana['environment']["XPACK_SECURITY_LOGINASSISTANCEMESSAGE"])
Expand Down