Skip to content

Commit

Permalink
Merge d045a4f into e29e693
Browse files Browse the repository at this point in the history
  • Loading branch information
rcerven committed Aug 22, 2019
2 parents e29e693 + d045a4f commit 6202dbf
Show file tree
Hide file tree
Showing 2 changed files with 39 additions and 48 deletions.
83 changes: 36 additions & 47 deletions koji_containerbuild/plugins/builder_containerbuild.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,6 @@
import os.path
import sys
import logging
import imp
import time
import traceback
import dockerfile_parse
Expand Down Expand Up @@ -68,8 +67,13 @@
'VERSION',
'RELEASE',
'ARCHITECTURE',
'NAME',
))

LABELS_REQUIRED = koji.Enum((
'NAME',
'COMPONENT',
))

# Mapping between LABEL identifiers within koji and actual LABEL identifiers
# which can be found in Dockerfile. First value is preferred one, others are for
Expand All @@ -79,18 +83,9 @@
'VERSION': ('version', 'Version'),
'RELEASE': ('release', 'Release'),
'ARCHITECTURE': ('architecture', 'Architecture'),
'NAME': ('name', 'Name'),
}


# Map from LABELS to extra data
LABEL_DATA_MAP = {
'COMPONENT': 'name',
'VERSION': 'version',
'RELEASE': 'release',
'ARCHITECTURE': 'architecture',
}


# Default values for LABELs. If there exist default value here LABEL is
# optional in Dockerfile.
LABEL_DEFAULT_VALUES = {
Expand Down Expand Up @@ -236,16 +231,6 @@ def get_data_labels(self):
break
return self._label_data

def get_extra_data(self):
"""Returns dict with keys for Koji's extra_information"""
data = self.get_data_labels()
extra_data = {}
for label_id, value in data.items():
assert label_id in LABEL_DATA_MAP
extra_key = LABEL_DATA_MAP[label_id]
extra_data[extra_key] = value
return extra_data

def get_additional_tags(self):
"""Returns a list of additional tags to be applied to an image"""
tags = []
Expand All @@ -263,10 +248,19 @@ def get_additional_tags(self):
def get_missing_label_ids(self):
data = self.get_data_labels()
missing_labels = []
for label_id in LABELS:
# check required labels, have to be defined explicitly and not via env
for label_id in LABELS_REQUIRED:
assert label_id in data
if not data[label_id]:
missing_labels.append(label_id)

# check for all labels, unless required or default values provided,
# they should be at least defined (even via env)
for label_id in LABELS:
assert label_id in data
if data[label_id] is None:
if label_id not in missing_labels:
missing_labels.append(label_id)
return missing_labels

def get_expected_nvr(self):
Expand Down Expand Up @@ -814,20 +808,27 @@ def checkLabels(self, src, build_tag, label_overwrites=None):
# Make sure the longest tag for the docker image is no more than 128 chars
# see https://github.com/docker/docker/issues/8445

data = labels_wrapper.get_extra_data()
data = labels_wrapper.get_data_labels()
tags = labels_wrapper.get_additional_tags()
if LABEL_DATA_MAP['RELEASE'] in data:
version_release_tag = "%s-%s" % (
data[LABEL_DATA_MAP['VERSION']], data[LABEL_DATA_MAP['RELEASE']])
tags.append(version_release_tag)
check_nvr = False

if 'RELEASE' in data and 'VERSION' in data:
if data['RELEASE'] and data['VERSION']:
if type(data['RELEASE']) is not object:
version_release_tag = "%s-%s" % (data['VERSION'], data['RELEASE'])
tags.append(version_release_tag)
check_nvr = True

if tags:
longest_tag = max(tags, key=len)
if len(longest_tag) > 128:
raise koji.BuildError(
"Docker cannot create image with a tag longer than 128, "
"current version-release tag length is %s" % len(longest_tag))

return (labels_wrapper.get_extra_data(), labels_wrapper.get_expected_nvr())
if check_nvr:
return (data['COMPONENT'], labels_wrapper.get_expected_nvr())
return (data['COMPONENT'], None)

def handler(self, src, target, opts=None):
jsonschema.validate([src, target, opts], self.PARAMS_SCHEMA)
Expand All @@ -836,7 +837,7 @@ def handler(self, src, target, opts=None):
opts = {}

self.opts = opts
data = {}
component = None

self.event_id = self.session.getLastEvent()['id']
target_info = self.session.getBuildTarget(target, event=self.event_id)
Expand All @@ -855,35 +856,23 @@ def handler(self, src, target, opts=None):
label_overwrites = {}
release_overwrite = opts.get('release')
if release_overwrite:
label_overwrites = {LABEL_DATA_MAP['RELEASE']: release_overwrite}
data, expected_nvr = self.checkLabels(src, label_overwrites=label_overwrites,
build_tag=build_tag)
admin_opts = self._get_admin_opts(opts)
data.update(admin_opts)
label_overwrites = {LABEL_NAME_MAP['RELEASE'][0]: release_overwrite}
component, expected_nvr = self.checkLabels(src, label_overwrites=label_overwrites,
build_tag=build_tag)

# scratch builds do not get imported, and consequently not tagged
if not self.opts.get('scratch') and not flatpak:
self.check_whitelist(data[LABEL_DATA_MAP['COMPONENT']], target_info)
self.check_whitelist(component, target_info)

try:
# Flatpak builds append .<N> to the release generated from module version
if flatpak:
auto_release = True
else:
auto_release = (data[LABEL_DATA_MAP['RELEASE']] ==
LABEL_DEFAULT_VALUES['RELEASE'])
if auto_release:
# Do not expose default release value
del data[LABEL_DATA_MAP['RELEASE']]

self.extra_information = {"src": src, "data": data,
"target": target}
expected_nvr = None

if not SCM.is_scm_url(src):
raise koji.BuildError('Invalid source specification: %s' % src)

# Scratch and auto release builds shouldn't be checked for nvr
if not self.opts.get('scratch') and not auto_release:
if not self.opts.get('scratch') and expected_nvr:
try:
build_id = self.session.getBuild(expected_nvr)['id']
except:
Expand Down
4 changes: 3 additions & 1 deletion tests/test_builder_containerbuild.py
Original file line number Diff line number Diff line change
Expand Up @@ -335,6 +335,7 @@ def _mock_folders(self, tmpdir, dockerfile_content=None, additional_tags_content
dockerfile_content = dedent("""\
FROM fedora
LABEL name=fedora
LABEL com.redhat.component=fedora-docker
LABEL version=25
""")
Expand Down Expand Up @@ -374,7 +375,7 @@ def test_checkLabels_missing_labels(self, tmpdir):

dockerfile_content = 'FROM fedora\n'
missing_labels = ['com.redhat.component (or BZComponent)',
'version (or Version)']
'version (or Version)', 'name (or Name)']
folder_info = self._mock_folders(str(tmpdir),
dockerfile_content=dockerfile_content)
(flexmock(cct)
Expand Down Expand Up @@ -768,6 +769,7 @@ def test_build_nvr_exists(self, tmpdir, orchestrator, df_release, param_release,
dockerfile_content = dedent("""\
FROM fedora
LABEL name=fedora
LABEL com.redhat.component=fedora-docker
LABEL version=25
""")
Expand Down

0 comments on commit 6202dbf

Please sign in to comment.