Add a "registry" option group

This commit adds a new oslo.config option group: "registry".

Before this patch the Docker registry was specified using
the --builder-registry option. This poses a UX problem as
setting --builder-registry was also necessary when
deploying.

This commit fixes that problem by adding a new oslo.config
option group: "registry". This group includes all the
registry-related options: "address", "insecure", "username"
and "password".

The commit also fixes a bug where _get_image_name (in
templates.py) did not return the proper image name when no
registry was used.

CLI option changes:

* --builder-registry replaced by --registry-address
* --builder-insecure-registry replaced by --registry-insecure
* --auth-registry-username replaced by --registry-username
* --auth-registry-password replaced by --registry-password
* --auth-registry removed (auth is enabled if both
  --registry-username and --registry-password are set)

Change-Id: Ifc2ec93bb21934464451a260dc634a01ddec66cb
This commit is contained in:
Éric Lemoine
2016-06-30 14:30:17 +02:00
parent a9c28537c2
commit 338894acd0
7 changed files with 45 additions and 30 deletions

View File

@@ -18,6 +18,7 @@ CONF = cfg.CONF
CONF.import_group('builder', 'microservices.config.builder')
CONF.import_group('images', 'microservices.config.images')
CONF.import_group('repositories', 'microservices.config.repositories')
CONF.import_group('registry', 'microservices.config.registry')
LOG = logging.getLogger(__name__)
@@ -48,8 +49,8 @@ def find_dockerfiles(repository_name, tmp_dir, match=True):
repository_dir = os.path.join(CONF.repositories.path, repository_name)
namespace = CONF.images.namespace
if CONF.builder.push:
namespace = '%s/%s' % (CONF.builder.registry, namespace)
if CONF.builder.push and CONF.registry.address:
namespace = '%s/%s' % (CONF.registry.address, namespace)
for root, __, files in os.walk(repository_dir):
if 'Dockerfile.j2' in files:
@@ -127,13 +128,13 @@ def build_dockerfile(dc, dockerfile):
def push_dockerfile(dc, dockerfile):
if CONF.auth.registry:
dc.login(username=CONF.auth.registry_username,
password=CONF.auth.registry_password,
registry=CONF.builder.registry)
if CONF.registry.username and CONF.registry.password:
dc.login(username=CONF.registry.username,
password=CONF.registry.password,
registry=CONF.registry.address)
for line in dc.push(dockerfile['full_name'],
stream=True,
insecure_registry=CONF.builder.insecure_registry):
insecure_registry=CONF.registry.insecure):
build_data = json.loads(line)
if 'stream' in build_data:
LOG.info('%s: %s', dockerfile['name'],
@@ -142,13 +143,13 @@ def push_dockerfile(dc, dockerfile):
LOG.error('%s: %s', dockerfile['name'],
build_data['errorDetail']['message'])
LOG.info("%s - Push into %s registry finished", dockerfile['name'],
CONF.builder.registry)
CONF.registry.address)
def process_dockerfile(dockerfile, executor, future_list, ready_images):
with contextlib.closing(docker.Client()) as dc:
build_dockerfile(dc, dockerfile)
if CONF.builder.push:
if CONF.builder.push and CONF.registry.address:
push_dockerfile(dc, dockerfile)
for child in dockerfile['children']:

View File

@@ -9,11 +9,14 @@ from microservices import fetch
CONF = cfg.CONF
CONF.import_group('registry', 'microservices.config.registry')
CONF.import_group('repositories', 'microservices.config.repositories')
CONF.import_opt('action', 'microservices.config.cli')
def do_build():
if CONF.builder.push and not CONF.registry.address:
raise RuntimeError('No registry specified, cannot push')
if CONF.repositories.clone:
do_fetch()
build.build_components(components=CONF.action.components)

View File

@@ -7,6 +7,7 @@ from oslo_config import cfg
CONF = cfg.CONF
CONF.import_group('builder', 'microservices.config.builder')
CONF.import_group('images', 'microservices.config.images')
CONF.import_group('registry', 'microservices.config.registry')
def str_to_bool(text):
@@ -15,9 +16,6 @@ def str_to_bool(text):
def jinja_render(path):
variables = {k: v for k, v in CONF.images.items()}
if CONF.builder.push:
variables['namespace'] = '%s/%s' % (CONF.builder.registry,
variables['namespace'])
env = jinja2.Environment(loader=jinja2.FileSystemLoader(
os.path.dirname(path)))

View File

@@ -8,15 +8,6 @@ CONF = cfg.CONF
auth_opts = [
cfg.StrOpt('gerrit-username',
default=getpass.getuser()),
cfg.BoolOpt('registry',
default=False,
help='Login to the Docker registry by user/pass'),
cfg.StrOpt('registry-username',
default='',
help='Username for Docker registry'),
cfg.StrOpt('registry-password',
default='',
help='Password for Docker registry')
]
auth_opt_group = cfg.OptGroup(name='auth',
title='Authentication data')

View File

@@ -22,13 +22,7 @@ builder_opts = [
help='Push to the Docker registry'),
cfg.BoolOpt('no-cache',
default=False,
help='Dont use docker cache'),
cfg.StrOpt('registry',
default='127.0.0.1:5000',
help='Docker registry address (host:port)'),
cfg.BoolOpt('insecure-registry',
default=False,
help='Permit to push without SSL')
help='Dont use docker cache')
]
builder_opt_group = cfg.OptGroup(name='builder',
title='Images builder')

View File

@@ -0,0 +1,23 @@
from oslo_config import cfg
CONF = cfg.CONF
registry_opts = [
cfg.StrOpt('address',
default='',
help='Docker registry address (host:port)'),
cfg.BoolOpt('insecure',
default=False,
help='Permit registry access without SSL'),
cfg.StrOpt('username',
default='',
help='Username for Docker registry'),
cfg.StrOpt('password',
default='',
help='Password for Docker registry')
]
registry_opt_group = cfg.OptGroup(name='registry',
title='Docker registry data')
CONF.register_group(registry_opt_group)
CONF.register_cli_opts(registry_opts, registry_opt_group)
CONF.register_opts(registry_opts, registry_opt_group)

View File

@@ -6,6 +6,8 @@ from microservices import utils
CONF = cfg.CONF
CONF.import_group('images', 'microservices.config.images')
CONF.import_group('registry', 'microservices.config.registry')
FILES_VOLUME = "files-volume"
GLOBAL_VOLUME = "global-volume"
@@ -14,8 +16,11 @@ SCRIPT_VOLUME = "script-volume"
def _get_image_name(image_name):
return "%s/%s/%s:%s" % (CONF.builder.registry, CONF.images.namespace,
image_name, CONF.images.tag)
image_name = "%s/%s:%s" % (CONF.images.namespace, image_name,
CONF.images.tag)
if CONF.registry.address:
image_name = "%s/%s" % (CONF.registry.address, image_name)
return image_name
def _get_start_cmd(cmd_name):