Create own /etc/kolla-mesos config tree

Change-Id: I339ca639c73d61e971e17f3744ceb12c04e373f7
Closes-Bug: #1519125
This commit is contained in:
Michal Rostecki 2015-11-30 15:09:14 +01:00
parent f3e719916f
commit d349ae0e2c
27 changed files with 642 additions and 119 deletions

5
.gitignore vendored
View File

@ -44,6 +44,9 @@ output/*/index.html
# Sphinx # Sphinx
doc/build doc/build
# oslo-config-generator
etc/*.sample
# pbr generates these # pbr generates these
AUTHORS AUTHORS
ChangeLog ChangeLog
@ -57,4 +60,4 @@ ChangeLog
.vagrant .vagrant
# generated openrc # generated openrc
openrc openrc

View File

@ -0,0 +1,5 @@
[DEFAULT]
output_file = etc/kolla-mesos.conf.sample
wrap_width = 79
namespace = kolla_mesos

View File

@ -12,11 +12,11 @@
# See the License for the specific language governing permissions and # See the License for the specific language governing permissions and
# limitations under the License. # limitations under the License.
import argparse
import logging import logging
import os import sys
from oslo_config import cfg
from kolla_mesos.common import config_utils
from kolla_mesos.common import zk_utils from kolla_mesos.common import zk_utils
@ -24,37 +24,19 @@ logging.basicConfig()
LOG = logging.getLogger(__name__) LOG = logging.getLogger(__name__)
LOG.setLevel(logging.INFO) LOG.setLevel(logging.INFO)
CONF = cfg.CONF
def merge_args_and_config(settings_from_config_file): CONF.import_group('zookeeper', 'kolla_mesos.config.zookeeper')
parser = argparse.ArgumentParser(description='Kolla build script') CONF.import_opt('path', 'kolla_mesos.config.config_cli')
defaults = { CONF.import_opt('show', 'kolla_mesos.config.config_cli')
"zookeeper_host": os.environ.get('ZK_HOSTS', 'localhost:2181'),
}
defaults.update(settings_from_config_file.items('kolla-build'))
parser.set_defaults(**defaults)
parser.add_argument('--zookeeper-host',
help='Zookeeper host:port',
type=str)
parser.add_argument('-d', '--debug',
help='Turn on debugging log level',
action='store_true')
parser.add_argument('-s', '--show',
help='Show node data',
action='store_true')
parser.add_argument('path',
help='Zookeeper node path (try /kolla)')
return vars(parser.parse_args())
def main(): def main():
cmd_opts, kolla_config = config_utils.load('kolla-build.conf', CONF(sys.argv[1:], project='kolla-mesos')
merge_args_and_config) with zk_utils.connection(CONF.zookeeper.host) as zk:
if CONF.show:
with zk_utils.connection(cmd_opts['zookeeper_host']) as zk: zk_utils.cat(zk, CONF.path)
if cmd_opts['show']:
zk_utils.cat(zk, cmd_opts['path'])
else: else:
zk_utils.tree(zk, cmd_opts['path']) zk_utils.tree(zk, CONF.path)
if __name__ == '__main__': if __name__ == '__main__':
main() main()

View File

@ -12,21 +12,21 @@
# See the License for the specific language governing permissions and # See the License for the specific language governing permissions and
# limitations under the License. # limitations under the License.
import argparse
import datetime import datetime
import json import json
import logging import logging
import os import os
import signal import signal
import sys
import tempfile import tempfile
import time import time
from oslo_config import cfg
import shutil import shutil
from six.moves import configparser from six.moves import configparser
from six.moves import cStringIO from six.moves import cStringIO
import yaml import yaml
from kolla_mesos.common import config_utils
from kolla_mesos.common import file_utils from kolla_mesos.common import file_utils
from kolla_mesos.common import jinja_utils from kolla_mesos.common import jinja_utils
from kolla_mesos.common import zk_utils from kolla_mesos.common import zk_utils
@ -38,72 +38,25 @@ LOG.setLevel(logging.INFO)
signal.signal(signal.SIGINT, signal.SIG_DFL) signal.signal(signal.SIGINT, signal.SIG_DFL)
CONF = cfg.CONF
CONF.import_group('kolla', 'kolla_mesos.config.kolla')
CONF.import_group('profiles', 'kolla_mesos.config.profiles')
CONF.import_group('zookeeper', 'kolla_mesos.config.zookeeper')
CONF.import_group('marathon', 'kolla_mesos.config.marathon')
CONF.import_group('chronos', 'kolla_mesos.config.chronos')
class KollaDirNotFoundException(Exception): class KollaDirNotFoundException(Exception):
pass pass
def merge_args_and_config(settings_from_config_file):
parser = argparse.ArgumentParser(description='Kolla build script')
defaults = {
"namespace": "kollaglue",
"tag": "latest",
"base": "centos",
"base_tag": "latest",
"install_type": "binary",
}
defaults.update(settings_from_config_file.items('kolla-build'))
parser.set_defaults(**defaults)
parser.add_argument('-n', '--namespace',
help='Set the Docker namespace name',
type=str)
parser.add_argument('--tag',
help='Set the Docker tag',
type=str)
parser.add_argument('-b', '--base',
help='The base distro to use when building',
type=str)
parser.add_argument('--base-tag',
help='The base distro image tag',
type=str)
parser.add_argument('-t', '--type',
help='The method of the Openstack install',
type=str,
dest='install_type')
parser.add_argument('--zookeeper-host',
help='Zookeeper host:port (default localhost:2181)',
default="localhost:2181",
type=str)
parser.add_argument('-d', '--debug',
help='Turn on debugging log level',
action='store_true')
parser.add_argument('-p', '--profile',
help=('Build a pre-defined set of images, see '
'[profiles] section in '
'{}'.format(
file_utils.find_config_file(
'kolla-build.conf'))),
type=str,
action='append')
return vars(parser.parse_args())
class KollaWorker(object): class KollaWorker(object):
def __init__(self, config, profiles): def __init__(self):
self.base_dir = os.path.abspath(file_utils.find_base_dir( self.base_dir = os.path.abspath(file_utils.find_base_dir(
project='kolla-mesos')) project='kolla-mesos'))
self.config_dir = os.path.join(self.base_dir, 'config') self.config_dir = os.path.join(self.base_dir, 'config')
LOG.debug("Kolla-Mesos base directory: " + self.base_dir) LOG.debug("Kolla-Mesos base directory: " + self.base_dir)
self.namespace = config['namespace']
self.base = config['base']
self.install_type = config['install_type']
self.image_prefix = self.base + '-' + config['install_type'] + '-'
self.build_config = config
self.profiles = profiles
self.required_vars = {} self.required_vars = {}
def setup_working_dir(self): def setup_working_dir(self):
@ -114,9 +67,7 @@ class KollaWorker(object):
LOG.debug('Created output dir: {}'.format(self.temp_dir)) LOG.debug('Created output dir: {}'.format(self.temp_dir))
def get_projects(self): def get_projects(self):
projects = set() projects = set(getattr(CONF.profiles, CONF.kolla.profile))
for prof in self.build_config.get('profiles', ['default']):
projects |= set(self.profiles[prof].split(','))
return projects return projects
def get_jinja_vars(self): def get_jinja_vars(self):
@ -217,14 +168,14 @@ class KollaWorker(object):
kc_name = os.path.join(self.config_dir, 'config.json') kc_name = os.path.join(self.config_dir, 'config.json')
# override container_config_directory # override container_config_directory
cont_conf_dir = 'zk://%s' % ( cont_conf_dir = 'zk://%s' % (
self.build_config['zookeeper_host']) CONF.zookeeper.host)
jinja_vars['container_config_directory'] = cont_conf_dir jinja_vars['container_config_directory'] = cont_conf_dir
kolla_config = jinja_utils.jinja_render(kc_name, jinja_vars) kolla_config = jinja_utils.jinja_render(kc_name, jinja_vars)
# 4. parse the marathon app file and add the KOLLA_CONFIG # 4. parse the marathon app file and add the KOLLA_CONFIG
values = { values = {
'kolla_config': kolla_config.replace('"', '\\"'), 'kolla_config': kolla_config.replace('"', '\\"'),
'zookeeper_hosts': self.build_config['zookeeper_host'] 'zookeeper_hosts': CONF.zookeeper.host
} }
for app_type in ['marathon', 'chronos']: for app_type in ['marathon', 'chronos']:
app_file = os.path.join(self.base_dir, app_file = os.path.join(self.base_dir,
@ -256,7 +207,7 @@ class KollaWorker(object):
shutil.rmtree(self.temp_dir) shutil.rmtree(self.temp_dir)
def write_to_zookeeper(self): def write_to_zookeeper(self):
with zk_utils.connection(self.build_config['zookeeper_host']) as zk: with zk_utils.connection(CONF.zookeeper.host) as zk:
# to clean these up, uncomment # to clean these up, uncomment
zk.delete('/kolla', recursive=True) zk.delete('/kolla', recursive=True)
@ -281,10 +232,8 @@ class KollaWorker(object):
def start(self): def start(self):
# find all marathon files and run. # find all marathon files and run.
# find all cronos files and run. # find all cronos files and run.
marathon_api = self.build_config['zookeeper_host'].replace('2181', marathon_api = CONF.marathon.host
'8080') chronos_api = CONF.chronos.host
chronos_api = self.build_config['zookeeper_host'].replace('2181',
'4400')
content_type = '-L -H "Content-type: application/json"' content_type = '-L -H "Content-type: application/json"'
for root, dirs, names in os.walk(self.temp_dir): for root, dirs, names in os.walk(self.temp_dir):
for name in names: for name in names:
@ -300,11 +249,8 @@ class KollaWorker(object):
def main(): def main():
cmd_opts, kolla_config = config_utils.load('kolla-build.conf', CONF(sys.argv[1:], project='kolla-mesos')
merge_args_and_config) kolla = KollaWorker()
profiles = dict(kolla_config.items('profiles'))
kolla = KollaWorker(cmd_opts, profiles)
kolla.setup_working_dir() kolla.setup_working_dir()
kolla.write_to_zookeeper() kolla.write_to_zookeeper()
kolla.write_openrc() kolla.write_openrc()

View File

@ -0,0 +1,29 @@
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import fcntl
import socket
import struct
# TODO(nihilifer): Autodetect networks and find a way to share commons between
# kolla_mesos and kolla_mesos_start.py.
def get_ip_address(ifname='eth0'):
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
try:
return socket.inet_ntoa(fcntl.ioctl(
s.fileno(),
0x8915, # SIOCGIFADDR
struct.pack('256s', ifname[:15])
)[20:24])
except IOError:
return '127.0.0.1'

View File

View File

@ -0,0 +1,33 @@
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from oslo_config import cfg
from kolla_mesos.common import network_utils
CHRONOS_URL = 'http://{}:4400'.format(network_utils.get_ip_address())
CONF = cfg.CONF
chronos_opts = [
cfg.StrOpt('host',
default=CHRONOS_URL,
help='Chronos connection URL (http://host:port)'),
cfg.IntOpt('timeout',
default=5,
help='Timeout for the request to the Chronos API')
]
chronos_opt_group = cfg.OptGroup(name='chronos',
title='Options for Chronos')
CONF.register_group(chronos_opt_group)
CONF.register_cli_opts(chronos_opts, chronos_opt_group)
CONF.register_opts(chronos_opts, chronos_opt_group)

View File

@ -10,19 +10,14 @@
# See the License for the specific language governing permissions and # See the License for the specific language governing permissions and
# limitations under the License. # limitations under the License.
import logging from oslo_config import cfg
from six.moves import configparser
from kolla_mesos.common import file_utils
LOG = logging.getLogger(__name__)
def load(config_name, merge_args_and_config): CONF = cfg.CONF
kolla_config = configparser.SafeConfigParser() config_cli_opts = [
kolla_config.read(file_utils.find_config_file(config_name)) cfg.StrOpt('path',
cmd_opts = merge_args_and_config(kolla_config) default='/kolla'),
if cmd_opts['debug']: cfg.BoolOpt('show',
LOG.setLevel(logging.DEBUG) default=False)
return cmd_opts, kolla_config ]
CONF.register_cli_opts(config_cli_opts)

View File

@ -0,0 +1,41 @@
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from oslo_config import cfg
CONF = cfg.CONF
kolla_opts = [
cfg.StrOpt('namespace',
default='kollaglue',
help='The Docker namespace name'),
cfg.StrOpt('tag',
default='latest',
help='The Docker tag'),
cfg.StrOpt('base',
default='centos',
help='The base distro which was used to build images'),
cfg.StrOpt('base-tag',
default='latest',
help='The base distro image tag'),
cfg.StrOpt('install-type',
default='binary',
help='The method of the OpenStack install'),
cfg.StrOpt('profile',
default='default',
help='Build profile which was used to build images')
]
kolla_opt_group = cfg.OptGroup(name='kolla',
title='Options for Kolla Docker images')
CONF.register_group(kolla_opt_group)
CONF.register_cli_opts(kolla_opts, kolla_opt_group)
CONF.register_opts(kolla_opts, kolla_opt_group)

View File

@ -0,0 +1,33 @@
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from oslo_config import cfg
from kolla_mesos.common import network_utils
MARATHON_URL = 'http://{}:8080'.format(network_utils.get_ip_address())
CONF = cfg.CONF
marathon_opts = [
cfg.StrOpt('host',
default=MARATHON_URL,
help='Marathon connection URL (http://host:port)'),
cfg.IntOpt('timeout',
default=5,
help='Timeout for the request to the Marathon API')
]
marathon_opt_group = cfg.OptGroup(name='marathon',
title='Options for Marathon')
CONF.register_group(marathon_opt_group)
CONF.register_cli_opts(marathon_opts, marathon_opt_group)
CONF.register_opts(marathon_opts, marathon_opt_group)

View File

@ -0,0 +1,42 @@
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from oslo_config import cfg
CONF = cfg.CONF
profiles_opts = [
cfg.ListOpt('infra',
default=['ceph', 'data', 'mariadb', 'haproxy', 'keepalived',
'kolla-ansible', 'memcached', 'mongodb',
'openvswitch', 'rabbitmq', 'rsyslog']),
cfg.ListOpt('main',
default=['cinder', 'ceilometer', 'glance', 'heat', 'horizon',
'keystone', 'neutron', 'nova', 'swift']),
cfg.ListOpt('aux',
default=['designate', 'gnocchi', 'ironic', 'magnum', 'zaqar']),
cfg.ListOpt('default',
default=['data', 'kolla-ansible', 'glance', 'haproxy', 'heat',
'horizon', 'keepalived', 'keystone', 'memcached',
'mariadb', 'neutron', 'nova', 'openvswitch',
'rabbitmq', 'rsyslog']),
cfg.ListOpt('gate',
default=['ceph', 'cinder', 'data', 'dind', 'glance', 'haproxy',
'heat', 'horizon', 'keepalived', 'keystone',
'kolla-ansible', 'mariadb', 'memcached', 'neutron',
'nova', 'openvswitch', 'rabbitmq', 'rsyslog'])
]
profiles_opt_group = cfg.OptGroup(name='profiles',
title='Common sets of images')
CONF.register_group(profiles_opt_group)
CONF.register_cli_opts(profiles_opts, profiles_opt_group)
CONF.register_opts(profiles_opts, profiles_opt_group)

View File

@ -0,0 +1,30 @@
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from oslo_config import cfg
from kolla_mesos.common import network_utils
ZOOKEEPER_URL = '{}:2181'.format(network_utils.get_ip_address())
CONF = cfg.CONF
zookeeper_opts = [
cfg.StrOpt('host',
default=ZOOKEEPER_URL,
help='ZooKeeper connection URL (host:port)')
]
zookeeper_opt_group = cfg.OptGroup(name='zookeeper',
title='Options for ZooKeeper')
CONF.register_group(zookeeper_opt_group)
CONF.register_cli_opts(zookeeper_opts, zookeeper_opt_group)
CONF.register_opts(zookeeper_opts, zookeeper_opt_group)

27
kolla_mesos/opts.py Normal file
View File

@ -0,0 +1,27 @@
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from kolla_mesos.config import chronos
from kolla_mesos.config import kolla
from kolla_mesos.config import marathon
from kolla_mesos.config import profiles
from kolla_mesos.config import zookeeper
def list_opts():
return [
('chronos', chronos.chronos_opts),
('kolla', kolla.kolla_opts),
('marathon', marathon.marathon_opts),
('profiles', profiles.profiles_opts),
('zookeeper', zookeeper.zookeeper_opts)
]

View File

View File

@ -0,0 +1,44 @@
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from oslo_config import cfg
from kolla_mesos.tests import base
from kolla_mesos.tests.fakes import config_file as fake_config_file
CONF = cfg.CONF
CONF.import_group('chronos', 'kolla_mesos.config.chronos')
CHRONOS_TEXT_CONFIG = """
[chronos]
host = test.local:4400
timeout = 30
"""
class TestChronosConfig(base.BaseTestCase):
def _asserts(self):
self.assertEqual(CONF.chronos.host, 'test.local:4400')
self.assertEqual(CONF.chronos.timeout, 30)
def test_cli_config(self):
argv = ['--chronos-host', 'test.local:4400', '--chronos-timeout', '30']
CONF(argv, project='kolla-mesos')
self._asserts()
@fake_config_file.FakeConfigFile(CHRONOS_TEXT_CONFIG)
def test_file_config(self):
CONF([], project='kolla-mesos', default_config_files=['/dev/null'])
self._asserts()

View File

@ -0,0 +1,29 @@
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from oslo_config import cfg
from kolla_mesos.tests import base
CONF = cfg.CONF
CONF.import_opt('path', 'kolla_mesos.config.config_cli')
CONF.import_opt('show', 'kolla_mesos.config.config_cli')
class TestConfigCliConfig(base.BaseTestCase):
def test_config_cli(self):
argv = ['--path', 'test_path', '--show']
CONF(argv, project='kolla-mesos')
self.assertEqual(CONF.path, 'test_path')
self.assertTrue(CONF.show)

View File

@ -0,0 +1,55 @@
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from oslo_config import cfg
from kolla_mesos.tests import base
from kolla_mesos.tests.fakes import config_file as fake_config_file
CONF = cfg.CONF
CONF.import_group('kolla', 'kolla_mesos.config.kolla')
KOLLA_TEXT_CONFIG = """
[kolla]
namespace = test_namespace
tag = test_tag
base = test_base
base_tag = test_base_tag
install_type = test_install_type
profile = test_profile
"""
class TestKollaConfig(base.BaseTestCase):
def _asserts(self):
self.assertEqual(CONF.kolla.namespace, 'test_namespace')
self.assertEqual(CONF.kolla.tag, 'test_tag')
self.assertEqual(CONF.kolla.base, 'test_base')
self.assertEqual(CONF.kolla.base_tag, 'test_base_tag')
self.assertEqual(CONF.kolla.install_type, 'test_install_type')
self.assertEqual(CONF.kolla.profile, 'test_profile')
def test_cli_config(self):
argv = ['--kolla-namespace', 'test_namespace', '--kolla-tag',
'test_tag', '--kolla-base', 'test_base', '--kolla-base-tag',
'test_base_tag', '--kolla-install-type', 'test_install_type',
'--kolla-profile', 'test_profile']
CONF(argv, project='kolla-mesos')
self._asserts()
@fake_config_file.FakeConfigFile(KOLLA_TEXT_CONFIG)
def test_file_config(self):
CONF([], project='kolla-mesos', default_config_files=['/dev/null'])
self._asserts()

View File

@ -0,0 +1,43 @@
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from oslo_config import cfg
from kolla_mesos.tests import base
from kolla_mesos.tests.fakes import config_file as fake_config_file
CONF = cfg.CONF
CONF.import_group('marathon', 'kolla_mesos.config.marathon')
MARATHON_TEXT_CONFIG = """
[marathon]
host = test.local:8080
timeout = 30
"""
class TestMarathonConfig(base.BaseTestCase):
def test_cli_config(self):
argv = ['--marathon-host', 'test.local:8080', '--marathon-timeout',
'30']
CONF(argv, project='kolla-mesos')
self.assertEqual(CONF.marathon.host, 'test.local:8080')
self.assertEqual(CONF.marathon.timeout, 30)
@fake_config_file.FakeConfigFile(MARATHON_TEXT_CONFIG)
def test_file_config(self):
CONF([], project='kolla-mesos', default_config_files=['/dev/null'])
self.assertEqual(CONF.marathon.host, 'test.local:8080')
self.assertEqual(CONF.marathon.timeout, 30)

View File

@ -0,0 +1,56 @@
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from oslo_config import cfg
from kolla_mesos.tests import base
from kolla_mesos.tests.fakes import config_file as fake_config_file
CONF = cfg.CONF
CONF.import_group('profiles', 'kolla_mesos.config.profiles')
PROFILES_TEXT_CONFIG = """
[profiles]
infra = test1, test2
main = test1
aux = test1, test2, test3
default = test1, test2, test3, test4, test5
gate = test1, test2, test3, test4
"""
class TestProfilesConfig(base.BaseTestCase):
def _asserts(self):
self.assertEqual(CONF.profiles.infra, ['test1', 'test2'])
self.assertEqual(CONF.profiles.main, ['test1'])
self.assertEqual(CONF.profiles.aux, ['test1', 'test2', 'test3'])
self.assertEqual(CONF.profiles.default, ['test1', 'test2', 'test3',
'test4', 'test5'])
self.assertEqual(CONF.profiles.gate, ['test1', 'test2', 'test3',
'test4'])
def test_cli_config(self):
argv = ['--profiles-infra', 'test1,test2',
'--profiles-main', 'test1', '--profiles-aux',
'test1,test2,test3', '--profiles-default',
'test1,test2,test3,test4,test5', '--profiles-gate',
'test1,test2,test3,test4']
CONF(argv, project='kolla-mesos')
self._asserts()
@fake_config_file.FakeConfigFile(PROFILES_TEXT_CONFIG)
def test_file_config(self):
CONF([], project='kolla-mesos', default_config_files=['/dev/null'])
self._asserts()

View File

@ -0,0 +1,42 @@
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from oslo_config import cfg
from kolla_mesos.tests import base
from kolla_mesos.tests.fakes import config_file as fake_config_file
CONF = cfg.CONF
CONF.import_group('zookeeper', 'kolla_mesos.config.zookeeper')
ZOOKEEPER_TEXT_CONFIG = """
[zookeeper]
host = test.local:2181
"""
class TestZookeeperConfig(base.BaseTestCase):
def _asserts(self):
self.assertEqual(CONF.zookeeper.host, 'test.local:2181')
def test_cli_config(self):
argv = ['--zookeeper-host', 'test.local:2181']
CONF(argv, project='kolla-mesos')
self._asserts()
@fake_config_file.FakeConfigFile(ZOOKEEPER_TEXT_CONFIG)
def test_file_config(self):
CONF([], project='kolla-mesos', default_config_files=['/dev/null'])
self._asserts()

View File

View File

@ -0,0 +1,47 @@
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import functools
import io
import mock
import six
class FakeConfigFile(object):
"""Contextmanager and decorator for mocking config files.
:param text_config: contents of configuration to parse by oslo.config
:type text_config: str
"""
def __init__(self, text_config):
self.text_config = text_config
def __enter__(self):
if six.PY3:
func = 'builtins.open'
else:
func = '__builtin__.open'
self.patcher = mock.patch(func,
return_value=io.BytesIO(self.text_config))
self.patcher.start()
def __exit__(self, *args, **kwargs):
self.patcher.stop()
def __call__(self, f):
@functools.wraps(f)
def wrapper(*args, **kwargs):
with self:
return f(*args, **kwargs)
return wrapper

View File

@ -6,4 +6,5 @@ pbr>=1.6
Babel>=1.3 Babel>=1.3
Jinja2>=2.8 # BSD License (3 clause) Jinja2>=2.8 # BSD License (3 clause)
kazoo>=2.2 kazoo>=2.2
oslo.config>=2.7.0 # Apache-2.0
PyYAML>=3.1.0 PyYAML>=3.1.0

View File

@ -30,6 +30,8 @@ data_files =
console_scripts = console_scripts =
kolla-mesos-deploy = kolla_mesos.cmd.deploy:main kolla-mesos-deploy = kolla_mesos.cmd.deploy:main
kolla-mesos-config = kolla_mesos.cmd.config:main kolla-mesos-config = kolla_mesos.cmd.config:main
oslo.config.opts =
kolla_mesos = kolla_mesos.opts:list_opts
[build_sphinx] [build_sphinx]
source-dir = doc/source source-dir = doc/source

View File

@ -0,0 +1,28 @@
#!/bin/sh
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
set -e
GEN_CMD=oslo-config-generator
if ! type "$GEN_CMD" > /dev/null; then
echo "ERROR: $GEN_CMD not installed on the system."
exit 1
fi
for file in `ls etc/oslo-config-generator/*`; do
$GEN_CMD --config-file=$file
done
set -x

View File

@ -45,3 +45,6 @@ show-source = True
ignore = E123,E125 ignore = E123,E125
builtins = _ builtins = _
exclude=.venv,.git,.tox,dist,doc,*openstack/common*,*lib/python*,*egg,build exclude=.venv,.git,.tox,dist,doc,*openstack/common*,*lib/python*,*egg,build
[testenv:genconfig]
commands = {toxinidir}/tools/generate_config_file_samples.sh

View File

@ -12,16 +12,23 @@ enabled=1
gpgcheck=1 gpgcheck=1
gpgkey=https://yum.dockerproject.org/gpg gpgkey=https://yum.dockerproject.org/gpg
EOF EOF
yum -y install docker-engine epel-release git python-pip yum -y install docker-engine epel-release git python-devel vim-enhanced
yum -y install python-pip
yum -y groupinstall "Development Tools"
yum clean
# Start services # Start services
systemctl enable docker systemctl enable docker
systemctl start docker systemctl start docker
# Fetch and install pip packages # Fetch and install pip packages
pip install tox
sudo -u vagrant git clone https://github.com/openstack/kolla ~vagrant/kolla sudo -u vagrant git clone https://github.com/openstack/kolla ~vagrant/kolla
pip install ~vagrant/kolla pip install ~vagrant/kolla
pip install ~vagrant/kolla-mesos pip install ~vagrant/kolla-mesos
# Copy configuration # Generate and copy configuration
sudo -u vagrant bash -c "cd ~vagrant/kolla-mesos && tox -e genconfig"
mkdir -p /etc/kolla-mesos
cp -r ~vagrant/kolla/etc/kolla/ /etc/kolla cp -r ~vagrant/kolla/etc/kolla/ /etc/kolla
cp ~vagrant/kolla-mesos/etc/kolla-mesos.conf.sample /etc/kolla-mesos/kolla-mesos.conf