Updates CONF usage from bay to cluster.

Renames bay-related CONF options to their respective cluster names.
Adds release notes for CONF changes.

Change-Id: I7bbe0927e54c1f40a47bfdea448a88b467fef106
Implements: blueprint rename-bay-to-cluster
This commit is contained in:
Stephen Watson 2016-08-30 07:15:19 +00:00
parent 5258fddf9d
commit 6ead3e4780
16 changed files with 122 additions and 74 deletions

View File

@ -24,36 +24,45 @@ from magnum.i18n import _
from magnum import objects
baymodel_opts = [
cluster_template_opts = [
cfg.ListOpt('kubernetes_allowed_network_drivers',
default=['all'],
help=_("Allowed network drivers for kubernetes baymodels. "
"Use 'all' keyword to allow all drivers supported "
"for kubernetes baymodels. Supported network drivers "
"include flannel.")),
help=_("Allowed network drivers for kubernetes "
"cluster-templates. Use 'all' keyword to allow all "
"drivers supported for kubernetes cluster-templates. "
"Supported network drivers include flannel."),
deprecated_group='baymodel'),
cfg.StrOpt('kubernetes_default_network_driver',
default='flannel',
help=_("Default network driver for kubernetes baymodels.")),
help=_("Default network driver for kubernetes "
"cluster-templates."),
deprecated_group='baymodel'),
cfg.ListOpt('swarm_allowed_network_drivers',
default=['all'],
help=_("Allowed network drivers for docker swarm baymodels. "
"Use 'all' keyword to allow all drivers supported "
"for swarm baymodels. Supported network drivers "
"include docker and flannel.")),
help=_("Allowed network drivers for docker swarm "
"cluster-templates. Use 'all' keyword to allow all "
"drivers supported for swarm cluster-templates. "
"Supported network drivers include docker and flannel."
),
deprecated_group='baymodel'),
cfg.StrOpt('swarm_default_network_driver',
default='docker',
help=_("Default network driver for docker swarm baymodels.")),
help=_("Default network driver for docker swarm "
"cluster-templates."),
deprecated_group='baymodel'),
cfg.ListOpt('mesos_allowed_network_drivers',
default=['all'],
help=_("Allowed network drivers for mesos baymodels. "
help=_("Allowed network drivers for mesos cluster-templates. "
"Use 'all' keyword to allow all drivers supported "
"for mesos baymodels. Supported network drivers "
"include docker.")),
"for mesos cluster-templates. Supported network "
"drivers include docker."),
deprecated_group='baymodel'),
cfg.StrOpt('mesos_default_network_driver',
default='docker',
help=_("Default network driver for mesos baymodels.")),
help=_("Default network driver for mesos cluster-templates."),
deprecated_group='baymodel'),
]
cfg.CONF.register_opts(baymodel_opts, group='baymodel')
cfg.CONF.register_opts(cluster_template_opts, group='cluster_template')
bay_update_allowed_properties = set(['node_count'])
@ -251,9 +260,9 @@ class K8sValidator(Validator):
supported_network_drivers = ['flannel']
allowed_network_drivers = (
cfg.CONF.baymodel.kubernetes_allowed_network_drivers)
cfg.CONF.cluster_template.kubernetes_allowed_network_drivers)
default_network_driver = (
cfg.CONF.baymodel.kubernetes_default_network_driver)
cfg.CONF.cluster_template.kubernetes_default_network_driver)
supported_volume_driver = ['cinder']
@ -261,8 +270,10 @@ class K8sValidator(Validator):
class SwarmValidator(Validator):
supported_network_drivers = ['docker', 'flannel']
allowed_network_drivers = cfg.CONF.baymodel.swarm_allowed_network_drivers
default_network_driver = cfg.CONF.baymodel.swarm_default_network_driver
allowed_network_drivers = (cfg.CONF.cluster_template.
swarm_allowed_network_drivers)
default_network_driver = (cfg.CONF.cluster_template.
swarm_default_network_driver)
supported_volume_driver = ['rexray']
@ -270,7 +281,9 @@ class SwarmValidator(Validator):
class MesosValidator(Validator):
supported_network_drivers = ['docker']
allowed_network_drivers = cfg.CONF.baymodel.mesos_allowed_network_drivers
default_network_driver = cfg.CONF.baymodel.mesos_default_network_driver
allowed_network_drivers = (cfg.CONF.cluster_template.
mesos_allowed_network_drivers)
default_network_driver = (cfg.CONF.cluster_template.
mesos_default_network_driver)
supported_volume_driver = ['rexray']

View File

@ -26,7 +26,7 @@ CONF = cfg.CONF
def is_enabled(name):
return name in CONF.bay.enabled_definitions
return name in CONF.cluster.enabled_definitions
class TemplateList(lister.Lister):

View File

@ -38,27 +38,32 @@ from magnum import objects
from magnum.objects.fields import BayStatus as bay_status
bay_heat_opts = [
cluster_heat_opts = [
cfg.IntOpt('max_attempts',
default=2000,
help=('Number of attempts to query the Heat stack for '
'finding out the status of the created stack and '
'getting template outputs. This value is ignored '
'during bay creation if timeout is set as the poll '
'will continue until bay creation either ends '
'or times out.')),
'during cluster creation if timeout is set as the poll '
'will continue until cluster creation either ends '
'or times out.'),
deprecated_group='bay_heat'),
cfg.IntOpt('wait_interval',
default=1,
help=('Sleep time interval between two attempts of querying '
'the Heat stack. This interval is in seconds.')),
cfg.IntOpt('bay_create_timeout',
'the Heat stack. This interval is in seconds.'),
deprecated_group='bay_heat'),
cfg.IntOpt('create_timeout',
default=60,
help=('The length of time to let bay creation continue. This '
'interval is in minutes. The default is 60 minutes.'))
help=('The length of time to let cluster creation continue. '
'This interval is in minutes. The default is 60 minutes.'
),
deprecated_group='bay_heat',
deprecated_name='bay_create_timeout')
]
CONF = cfg.CONF
CONF.register_opts(bay_heat_opts, group='bay_heat')
CONF.register_opts(cluster_heat_opts, group='cluster_heat')
LOG = logging.getLogger(__name__)
@ -101,7 +106,7 @@ def _create_stack(context, osc, bay, bay_create_timeout):
else:
# no bay_create_timeout value was passed in to the request
# so falling back on configuration file value
heat_timeout = cfg.CONF.bay_heat.bay_create_timeout
heat_timeout = cfg.CONF.cluster_heat.create_timeout
fields = {
'stack_name': stack_name,
'parameters': heat_params,
@ -259,7 +264,7 @@ class Handler(object):
def _poll_and_check(self, osc, bay):
poller = HeatPoller(osc, bay)
lc = loopingcall.FixedIntervalLoopingCall(f=poller.poll_and_check)
lc.start(cfg.CONF.bay_heat.wait_interval, True)
lc.start(cfg.CONF.cluster_heat.wait_interval, True)
class HeatPoller(object):
@ -324,18 +329,18 @@ class HeatPoller(object):
# the loop will end when the stack completes or the timeout occurs
if stack.stack_status == bay_status.CREATE_IN_PROGRESS:
if (stack.timeout_mins is None and
self.attempts > cfg.CONF.bay_heat.max_attempts):
self.attempts > cfg.CONF.cluster_heat.max_attempts):
LOG.error(_LE('Bay check exit after %(attempts)s attempts,'
'stack_id: %(id)s, stack_status: %(status)s') %
{'attempts': cfg.CONF.bay_heat.max_attempts,
{'attempts': cfg.CONF.cluster_heat.max_attempts,
'id': self.bay.stack_id,
'status': stack.stack_status})
raise loopingcall.LoopingCallDone()
else:
if self.attempts > cfg.CONF.bay_heat.max_attempts:
if self.attempts > cfg.CONF.cluster_heat.max_attempts:
LOG.error(_LE('Bay check exit after %(attempts)s attempts,'
'stack_id: %(id)s, stack_status: %(status)s') %
{'attempts': cfg.CONF.bay_heat.max_attempts,
{'attempts': cfg.CONF.cluster_heat.max_attempts,
'id': self.bay.stack_id,
'status': stack.stack_status})
raise loopingcall.LoopingCallDone()

View File

@ -29,14 +29,14 @@ import sqlalchemy as sa
from magnum.i18n import _
bay_heat_opts = [
cluster_heat_opts = [
cfg.StrOpt('cluster_coe',
default='kubernetes',
help=_('Container Orchestration Environments are '
'kubernetes or swarm.'))
'kubernetes or swarm.'),
deprecated_group='bay_heat')
]
cfg.CONF.register_opts(bay_heat_opts, group='bay_heat')
cfg.CONF.register_opts(cluster_heat_opts, group='cluster_heat')
def upgrade():
@ -45,7 +45,8 @@ def upgrade():
baymodel = sa.sql.table('baymodel',
sa.sql.column('coe', sa.String(length=255)))
op.execute(
baymodel.update().values({
'coe': op.inline_literal(cfg.CONF.bay_heat.cluster_coe)})
'coe': op.inline_literal(cfg.CONF.cluster_heat.cluster_coe)})
)

View File

@ -36,12 +36,14 @@ COMMON_ENV_PATH = COMMON_TEMPLATES_PATH + "environments/"
template_def_opts = [
cfg.StrOpt('etcd_discovery_service_endpoint_format',
default='https://discovery.etcd.io/new?size=%(size)d',
help=_('Url for etcd public discovery endpoint.')),
help=_('Url for etcd public discovery endpoint.'),
deprecated_group='bay'),
cfg.ListOpt('enabled_definitions',
default=['magnum_vm_atomic_k8s', 'magnum_bm_fedora_k8s',
'magnum_vm_coreos_k8s', 'magnum_vm_atomic_swarm',
'magnum_vm_ubuntu_mesos'],
help=_('Enabled bay definition entry points.')),
help=_('Enabled cluster definition entry points.'),
deprecated_group='bay'),
]
docker_registry_opts = [
@ -54,7 +56,7 @@ docker_registry_opts = [
]
CONF = cfg.CONF
CONF.register_opts(template_def_opts, group='bay')
CONF.register_opts(template_def_opts, group='cluster')
CONF.register_opts(docker_registry_opts, group='docker_registry')
CONF.import_opt('trustee_domain_id', 'magnum.common.keystone', group='trust')
@ -243,7 +245,7 @@ class TemplateDefinition(object):
coe=coe)
type_definitions = definition_map[bay_type]
for name in cfg.CONF.bay.enabled_definitions:
for name in cfg.CONF.cluster.enabled_definitions:
if name in type_definitions:
return type_definitions[name]()
@ -428,7 +430,7 @@ class BaseTemplateDefinition(TemplateDefinition):
discovery_url = bay.discovery_url
else:
discovery_endpoint = (
cfg.CONF.bay.etcd_discovery_service_endpoint_format %
cfg.CONF.cluster.etcd_discovery_service_endpoint_format %
{'size': bay.master_count})
try:
discovery_url = requests.get(discovery_endpoint).text

View File

@ -38,7 +38,7 @@ def list_opts():
magnum.common.service.service_opts,
)),
('api', magnum.api.app.API_SERVICE_OPTS),
('bay', magnum.drivers.common.template_def.template_def_opts),
('cluster', magnum.drivers.common.template_def.template_def_opts),
('conductor', magnum.conductor.config.SERVICE_OPTS),
('database', magnum.db.sql_opts),
('docker', magnum.common.docker_utils.docker_opts),
@ -51,12 +51,13 @@ def list_opts():
('nova_client', magnum.common.clients.nova_client_opts),
('neutron_client', magnum.common.clients.neutron_client_opts),
('x509', magnum.common.x509.config.x509_opts),
('bay_heat', magnum.conductor.handlers.bay_conductor.bay_heat_opts),
('cluster_heat',
magnum.conductor.handlers.bay_conductor.cluster_heat_opts),
('certificates',
itertools.chain(magnum.common.cert_manager.cert_manager_opts,
local_cert_manager.local_cert_manager_opts,
)),
('baymodel', magnum.api.validation.baymodel_opts),
('cluster_template', magnum.api.validation.cluster_template_opts),
('keystone_auth', magnum.common.keystone.keystone_auth_opts),
('docker_registry',
magnum.drivers.common.template_def.docker_registry_opts)

View File

@ -265,9 +265,9 @@ extendedKeyUsage = clientAuth
test_timeout = int(test_timeout)
except ValueError:
# If timeout value is invalid, set a default timeout.
test_timeout = cfg.CONF.bay_heat.bay_create_timeout
test_timeout = cfg.CONF.cluster_heat.create_timeout
if test_timeout <= 0:
test_timeout = cfg.CONF.bay_heat.bay_create_timeout
test_timeout = cfg.CONF.cluster_heat.create_timeout
self.useFixture(fixtures.Timeout(test_timeout, gentle=True))

View File

@ -616,7 +616,7 @@ class TestPost(api_base.FunctionalTest):
mock_image_data.return_value = {'name': 'mock_name',
'os_distro': 'fedora-atomic'}
for k, v in baymodel_config_dict.items():
cfg.CONF.set_override(k, v, 'baymodel')
cfg.CONF.set_override(k, v, 'cluster_template')
with mock.patch.object(self.dbapi, 'create_baymodel',
wraps=self.dbapi.create_baymodel) as cc_mock:
bdict = apiutils.baymodel_post_data(**baymodel_dict)
@ -628,7 +628,7 @@ class TestPost(api_base.FunctionalTest):
expected_driver = bdict.get('network_driver')
if not expected_driver:
expected_driver = (
cfg.CONF.baymodel.swarm_default_network_driver)
cfg.CONF.cluster_template.swarm_default_network_driver)
self.assertEqual(expected_driver,
response.json['network_driver'])
self.assertEqual(bdict['image_id'],

View File

@ -647,7 +647,7 @@ class TestPost(api_base.FunctionalTest):
mock_image_data.return_value = {'name': 'mock_name',
'os_distro': 'fedora-atomic'}
for k, v in cluster_template_config_dict.items():
cfg.CONF.set_override(k, v, 'baymodel')
cfg.CONF.set_override(k, v, 'cluster_template')
with mock.patch.object(self.dbapi, 'create_baymodel',
wraps=self.dbapi.create_baymodel) as cc_mock:
bdict = apiutils.cluster_template_post_data(
@ -660,7 +660,7 @@ class TestPost(api_base.FunctionalTest):
expected_driver = bdict.get('network_driver')
if not expected_driver:
expected_driver = (
cfg.CONF.baymodel.swarm_default_network_driver)
cfg.CONF.cluster_template.swarm_default_network_driver)
self.assertEqual(expected_driver,
response.json['network_driver'])
self.assertEqual(bdict['image_id'],

View File

@ -182,9 +182,9 @@ class TestValidation(base.BaseTestCase):
pass
for key, val in network_driver_config_dict.items():
cfg.CONF.set_override(key, val, 'baymodel')
cfg.CONF.set_override(key, val, 'cluster_template')
baymodel = mock.MagicMock()
baymodel.name = 'test_baymodel'
baymodel.name = 'test_cluster_template'
baymodel.network_driver = network_driver_type
baymodel.coe = coe
@ -269,7 +269,7 @@ class TestValidation(base.BaseTestCase):
pass
for key, val in network_driver_config_dict.items():
cfg.CONF.set_override(key, val, 'baymodel')
cfg.CONF.set_override(key, val, 'cluster_template')
baymodel_ident = 'test_uuid_or_name'
patch = [{'path': '/network_driver', 'value': network_driver_type,
'op': 'replace'}]

View File

@ -492,7 +492,7 @@ class TestHeatPoller(base.TestCase):
@patch('magnum.common.clients.OpenStackClients')
def setup_poll_test(self, mock_openstack_client, cfg,
mock_retrieve_baymodel):
cfg.CONF.bay_heat.max_attempts = 10
cfg.CONF.cluster_heat.max_attempts = 10
bay = mock.MagicMock()
baymodel_dict = utils.get_test_baymodel(coe='kubernetes')
mock_heat_stack = mock.MagicMock()
@ -663,14 +663,14 @@ class TestHeatPoller(base.TestCase):
mock_heat_stack, bay, poller = self.setup_poll_test()
mock_heat_stack.stack_status = bay_status.DELETE_IN_PROGRESS
poller.attempts = cfg.CONF.bay_heat.max_attempts
poller.attempts = cfg.CONF.cluster_heat.max_attempts
self.assertRaises(loopingcall.LoopingCallDone, poller.poll_and_check)
def test_poll_create_in_prog_max_att_reached_no_timeout(self):
mock_heat_stack, bay, poller = self.setup_poll_test()
mock_heat_stack.stack_status = bay_status.CREATE_IN_PROGRESS
poller.attempts = cfg.CONF.bay_heat.max_attempts
poller.attempts = cfg.CONF.cluster_heat.max_attempts
mock_heat_stack.timeout_mins = None
self.assertRaises(loopingcall.LoopingCallDone, poller.poll_and_check)
@ -678,7 +678,7 @@ class TestHeatPoller(base.TestCase):
mock_heat_stack, bay, poller = self.setup_poll_test()
mock_heat_stack.stack_status = bay_status.CREATE_IN_PROGRESS
poller.attempts = cfg.CONF.bay_heat.max_attempts
poller.attempts = cfg.CONF.cluster_heat.max_attempts
mock_heat_stack.timeout_mins = 60
# since the timeout is set the max attempts gets ignored since
# the timeout will eventually stop the poller either when
@ -689,7 +689,7 @@ class TestHeatPoller(base.TestCase):
mock_heat_stack, bay, poller = self.setup_poll_test()
mock_heat_stack.stack_status = bay_status.CREATE_FAILED
poller.attempts = cfg.CONF.bay_heat.max_attempts
poller.attempts = cfg.CONF.cluster_heat.max_attempts
mock_heat_stack.timeout_mins = 60
self.assertRaises(loopingcall.LoopingCallDone, poller.poll_and_check)

View File

@ -480,7 +480,7 @@ class TestBayConductorWithK8s(base.TestCase):
cfg.CONF.set_override('etcd_discovery_service_endpoint_format',
'http://etcd/test?size=%(size)d',
group='bay')
group='cluster')
mock_req = mock.MagicMock(text='https://address/token')
reqget.return_value = mock_req
@ -585,7 +585,7 @@ class TestBayConductorWithK8s(base.TestCase):
expected_stack_name = 'expected_stack_name-xx-xx-xx-xx'
expected_template_contents = 'template_contents'
dummy_bay_name = 'expected_stack_name'
expected_timeout = cfg.CONF.bay_heat.bay_create_timeout
expected_timeout = cfg.CONF.cluster_heat.create_timeout
mock_tpl_files = {}
mock_get_template_contents.return_value = [
@ -626,7 +626,7 @@ class TestBayConductorWithK8s(base.TestCase):
expected_template_contents = 'template_contents'
dummy_bay_name = 'expected_stack_name'
bay_timeout = 0
expected_timeout = cfg.CONF.bay_heat.bay_create_timeout
expected_timeout = cfg.CONF.cluster_heat.create_timeout
mock_tpl_files = {}
mock_get_template_contents.return_value = [

View File

@ -275,7 +275,7 @@ class TestBayConductorWithMesos(base.TestCase):
@patch('magnum.common.clients.OpenStackClients')
def setup_poll_test(self, mock_openstack_client, cfg,
mock_retrieve_baymodel):
cfg.CONF.bay_heat.max_attempts = 10
cfg.CONF.cluster_heat.max_attempts = 10
bay = mock.MagicMock()
mock_heat_stack = mock.MagicMock()
mock_heat_client = mock.MagicMock()

View File

@ -371,7 +371,7 @@ class TestBayConductorWithSwarm(base.TestCase):
@patch('magnum.common.clients.OpenStackClients')
def setup_poll_test(self, mock_openstack_client, cfg,
mock_retrieve_baymodel):
cfg.CONF.bay_heat.max_attempts = 10
cfg.CONF.cluster_heat.max_attempts = 10
bay = mock.MagicMock()
mock_heat_stack = mock.MagicMock()
mock_heat_client = mock.MagicMock()

View File

@ -111,7 +111,7 @@ class TemplateDefinitionTestCase(base.TestCase):
def test_get_definition_not_enabled(self):
cfg.CONF.set_override('enabled_definitions',
['magnum_vm_atomic_k8s'],
group='bay')
group='cluster')
self.assertRaises(exception.BayTypeNotEnabled,
cmn_tdef.TemplateDefinition.get_template_definition,
'vm', 'coreos', 'kubernetes')
@ -385,7 +385,7 @@ class AtomicK8sTemplateDefinitionTestCase(BaseTemplateDefinitionTestCase):
def test_k8s_get_discovery_url(self, mock_get):
cfg.CONF.set_override('etcd_discovery_service_endpoint_format',
'http://etcd/test?size=%(size)d',
group='bay')
group='cluster')
expected_discovery_url = 'http://etcd/token'
mock_resp = mock.MagicMock()
mock_resp.text = expected_discovery_url
@ -405,7 +405,7 @@ class AtomicK8sTemplateDefinitionTestCase(BaseTemplateDefinitionTestCase):
def test_k8s_get_discovery_url_fail(self, mock_get):
cfg.CONF.set_override('etcd_discovery_service_endpoint_format',
'http://etcd/test?size=%(size)d',
group='bay')
group='cluster')
mock_get.side_effect = req_exceptions.RequestException()
mock_bay = mock.MagicMock()
mock_bay.master_count = 10
@ -778,7 +778,7 @@ class AtomicSwarmTemplateDefinitionTestCase(base.TestCase):
def test_swarm_get_discovery_url(self, mock_get):
cfg.CONF.set_override('etcd_discovery_service_endpoint_format',
'http://etcd/test?size=%(size)d',
group='bay')
group='cluster')
expected_discovery_url = 'http://etcd/token'
mock_resp = mock.MagicMock()
mock_resp.text = expected_discovery_url

View File

@ -0,0 +1,26 @@
---
prelude: >
Magnum's bay-to-cluster blueprint [1] required
changes across much of its codebase to align to
industry standards.
To support this blueprint, certain group and option
names were changed in configuration files [2].
See the deprecations section for more details.
[1] https://review.openstack.org/#/q/topic:bp/rename-bay-to-cluster
[2] https://review.openstack.org/#/c/362660/
deprecations:
- The 'bay' group has been renamed to 'cluster' and all
options in the former 'bay' group have been moved to
'cluster'.
- The 'bay_heat' group has been renamed to 'cluster_heat'
and all options in the former 'bay_heat' group have been
moved to 'cluster_heat'.
- The 'bay_create_timeout' option in the former 'bay_heat'
group has been renamed to 'create_timeout' inside the
'cluster_heat' group.
- The 'baymodel' group has been renamed to 'cluster_template'
and all options in the former 'baymodel' group have been
moved to 'cluster_template'.