Merge "Fix the CoreOS template definition"
This commit is contained in:
commit
dc6aee868b
|
@ -12,7 +12,6 @@
|
||||||
# License for the specific language governing permissions and limitations
|
# License for the specific language governing permissions and limitations
|
||||||
# under the License.
|
# under the License.
|
||||||
import abc
|
import abc
|
||||||
import uuid
|
|
||||||
|
|
||||||
from oslo_config import cfg
|
from oslo_config import cfg
|
||||||
from oslo_log import log as logging
|
from oslo_log import log as logging
|
||||||
|
@ -431,28 +430,17 @@ class SwarmApiAddressOutputMapping(OutputMapping):
|
||||||
setattr(bay, self.bay_attr, output_value)
|
setattr(bay, self.bay_attr, output_value)
|
||||||
|
|
||||||
|
|
||||||
class AtomicK8sTemplateDefinition(BaseTemplateDefinition):
|
class K8sTemplateDefinition(BaseTemplateDefinition):
|
||||||
"""Kubernetes template for a Fedora Atomic VM."""
|
"""Base Kubernetes template."""
|
||||||
|
|
||||||
provides = [
|
|
||||||
{'server_type': 'vm',
|
|
||||||
'os': 'fedora-atomic',
|
|
||||||
'coe': 'kubernetes'},
|
|
||||||
]
|
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
super(AtomicK8sTemplateDefinition, self).__init__()
|
super(K8sTemplateDefinition, self).__init__()
|
||||||
self.add_parameter('bay_uuid',
|
|
||||||
bay_attr='uuid',
|
|
||||||
param_type=str)
|
|
||||||
self.add_parameter('master_flavor',
|
self.add_parameter('master_flavor',
|
||||||
baymodel_attr='master_flavor_id')
|
baymodel_attr='master_flavor_id')
|
||||||
self.add_parameter('minion_flavor',
|
self.add_parameter('minion_flavor',
|
||||||
baymodel_attr='flavor_id')
|
baymodel_attr='flavor_id')
|
||||||
self.add_parameter('number_of_minions',
|
self.add_parameter('number_of_minions',
|
||||||
bay_attr='node_count')
|
bay_attr='node_count')
|
||||||
self.add_parameter('docker_volume_size',
|
|
||||||
baymodel_attr='docker_volume_size')
|
|
||||||
self.add_parameter('external_network',
|
self.add_parameter('external_network',
|
||||||
baymodel_attr='external_network_id',
|
baymodel_attr='external_network_id',
|
||||||
required=True)
|
required=True)
|
||||||
|
@ -476,8 +464,6 @@ class AtomicK8sTemplateDefinition(BaseTemplateDefinition):
|
||||||
|
|
||||||
def get_params(self, context, baymodel, bay, **kwargs):
|
def get_params(self, context, baymodel, bay, **kwargs):
|
||||||
extra_params = kwargs.pop('extra_params', {})
|
extra_params = kwargs.pop('extra_params', {})
|
||||||
label_list = ['flannel_network_cidr', 'flannel_use_vxlan',
|
|
||||||
'flannel_network_subnetlen']
|
|
||||||
scale_mgr = kwargs.pop('scale_manager', None)
|
scale_mgr = kwargs.pop('scale_manager', None)
|
||||||
if scale_mgr:
|
if scale_mgr:
|
||||||
hosts = self.get_output('kube_minions')
|
hosts = self.get_output('kube_minions')
|
||||||
|
@ -485,6 +471,38 @@ class AtomicK8sTemplateDefinition(BaseTemplateDefinition):
|
||||||
scale_mgr.get_removal_nodes(hosts))
|
scale_mgr.get_removal_nodes(hosts))
|
||||||
|
|
||||||
extra_params['discovery_url'] = self.get_discovery_url(bay)
|
extra_params['discovery_url'] = self.get_discovery_url(bay)
|
||||||
|
|
||||||
|
label_list = ['flannel_network_cidr', 'flannel_use_vxlan',
|
||||||
|
'flannel_network_subnetlen']
|
||||||
|
for label in label_list:
|
||||||
|
extra_params[label] = baymodel.labels.get(label)
|
||||||
|
|
||||||
|
return super(K8sTemplateDefinition,
|
||||||
|
self).get_params(context, baymodel, bay,
|
||||||
|
extra_params=extra_params,
|
||||||
|
**kwargs)
|
||||||
|
|
||||||
|
|
||||||
|
class AtomicK8sTemplateDefinition(K8sTemplateDefinition):
|
||||||
|
"""Kubernetes template for a Fedora Atomic VM."""
|
||||||
|
|
||||||
|
provides = [
|
||||||
|
{'server_type': 'vm',
|
||||||
|
'os': 'fedora-atomic',
|
||||||
|
'coe': 'kubernetes'},
|
||||||
|
]
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
super(AtomicK8sTemplateDefinition, self).__init__()
|
||||||
|
self.add_parameter('bay_uuid',
|
||||||
|
bay_attr='uuid',
|
||||||
|
param_type=str)
|
||||||
|
self.add_parameter('docker_volume_size',
|
||||||
|
baymodel_attr='docker_volume_size')
|
||||||
|
|
||||||
|
def get_params(self, context, baymodel, bay, **kwargs):
|
||||||
|
extra_params = kwargs.pop('extra_params', {})
|
||||||
|
|
||||||
# Kubernetes backend code is still using v2 API
|
# Kubernetes backend code is still using v2 API
|
||||||
extra_params['auth_url'] = context.auth_url.replace("v3", "v2")
|
extra_params['auth_url'] = context.auth_url.replace("v3", "v2")
|
||||||
extra_params['username'] = context.user_name
|
extra_params['username'] = context.user_name
|
||||||
|
@ -497,9 +515,6 @@ class AtomicK8sTemplateDefinition(BaseTemplateDefinition):
|
||||||
extra_params['loadbalancing_protocol'] = 'HTTP'
|
extra_params['loadbalancing_protocol'] = 'HTTP'
|
||||||
extra_params['kubernetes_port'] = 8080
|
extra_params['kubernetes_port'] = 8080
|
||||||
|
|
||||||
for label in label_list:
|
|
||||||
extra_params[label] = baymodel.labels.get(label)
|
|
||||||
|
|
||||||
return super(AtomicK8sTemplateDefinition,
|
return super(AtomicK8sTemplateDefinition,
|
||||||
self).get_params(context, baymodel, bay,
|
self).get_params(context, baymodel, bay,
|
||||||
extra_params=extra_params,
|
extra_params=extra_params,
|
||||||
|
@ -510,37 +525,13 @@ class AtomicK8sTemplateDefinition(BaseTemplateDefinition):
|
||||||
return cfg.CONF.bay.k8s_atomic_template_path
|
return cfg.CONF.bay.k8s_atomic_template_path
|
||||||
|
|
||||||
|
|
||||||
class CoreOSK8sTemplateDefinition(AtomicK8sTemplateDefinition):
|
class CoreOSK8sTemplateDefinition(K8sTemplateDefinition):
|
||||||
"""Kubernetes template for CoreOS VM."""
|
"""Kubernetes template for CoreOS VM."""
|
||||||
|
|
||||||
provides = [
|
provides = [
|
||||||
{'server_type': 'vm', 'os': 'coreos', 'coe': 'kubernetes'},
|
{'server_type': 'vm', 'os': 'coreos', 'coe': 'kubernetes'},
|
||||||
]
|
]
|
||||||
|
|
||||||
def __init__(self):
|
|
||||||
super(CoreOSK8sTemplateDefinition, self).__init__()
|
|
||||||
self.add_parameter('ssh_authorized_key',
|
|
||||||
baymodel_attr='ssh_authorized_key')
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def get_token():
|
|
||||||
discovery_url = cfg.CONF.bay.coreos_discovery_token_url
|
|
||||||
if discovery_url:
|
|
||||||
coreos_token_url = requests.get(discovery_url)
|
|
||||||
token = str(coreos_token_url.text.split('/')[3])
|
|
||||||
else:
|
|
||||||
token = uuid.uuid4().hex
|
|
||||||
return token
|
|
||||||
|
|
||||||
def get_params(self, context, baymodel, bay, **kwargs):
|
|
||||||
extra_params = kwargs.pop('extra_params', {})
|
|
||||||
extra_params['token'] = self.get_token()
|
|
||||||
|
|
||||||
return super(CoreOSK8sTemplateDefinition,
|
|
||||||
self).get_params(context, baymodel, bay,
|
|
||||||
extra_params=extra_params,
|
|
||||||
**kwargs)
|
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def template_path(self):
|
def template_path(self):
|
||||||
return cfg.CONF.bay.k8s_coreos_template_path
|
return cfg.CONF.bay.k8s_coreos_template_path
|
||||||
|
|
|
@ -150,18 +150,50 @@ class TestBayConductorWithK8s(base.TestCase):
|
||||||
|
|
||||||
self.assertEqual(expected, definition)
|
self.assertEqual(expected, definition)
|
||||||
|
|
||||||
@patch('requests.get')
|
|
||||||
@patch('magnum.objects.BayModel.get_by_uuid')
|
@patch('magnum.objects.BayModel.get_by_uuid')
|
||||||
def test_extract_template_definition_coreos_with_disovery(
|
def test_extract_template_definition_coreos_with_disovery(
|
||||||
|
self,
|
||||||
|
mock_objects_baymodel_get_by_uuid):
|
||||||
|
self.baymodel_dict['cluster_distro'] = 'coreos'
|
||||||
|
baymodel = objects.BayModel(self.context, **self.baymodel_dict)
|
||||||
|
mock_objects_baymodel_get_by_uuid.return_value = baymodel
|
||||||
|
bay = objects.Bay(self.context, **self.bay_dict)
|
||||||
|
|
||||||
|
(template_path,
|
||||||
|
definition) = bay_conductor._extract_template_definition(self.context,
|
||||||
|
bay)
|
||||||
|
|
||||||
|
expected = {
|
||||||
|
'ssh_key_name': 'keypair_id',
|
||||||
|
'external_network': 'external_network_id',
|
||||||
|
'dns_nameserver': 'dns_nameserver',
|
||||||
|
'server_image': 'image_id',
|
||||||
|
'minion_flavor': 'flavor_id',
|
||||||
|
'master_flavor': 'master_flavor_id',
|
||||||
|
'number_of_minions': 1,
|
||||||
|
'number_of_masters': 1,
|
||||||
|
'fixed_network_cidr': '10.20.30.0/24',
|
||||||
|
'network_driver': 'network_driver',
|
||||||
|
'discovery_url': 'https://discovery.etcd.io/test',
|
||||||
|
'http_proxy': 'http_proxy',
|
||||||
|
'https_proxy': 'https_proxy',
|
||||||
|
'no_proxy': 'no_proxy',
|
||||||
|
'flannel_network_cidr': '10.101.0.0/16',
|
||||||
|
'flannel_network_subnetlen': '26',
|
||||||
|
'flannel_use_vxlan': 'yes',
|
||||||
|
'tls_disabled': False,
|
||||||
|
}
|
||||||
|
self.assertEqual(expected, definition)
|
||||||
|
|
||||||
|
@patch('requests.get')
|
||||||
|
@patch('magnum.objects.BayModel.get_by_uuid')
|
||||||
|
def test_extract_template_definition_coreos_no_discoveryurl(
|
||||||
self,
|
self,
|
||||||
mock_objects_baymodel_get_by_uuid,
|
mock_objects_baymodel_get_by_uuid,
|
||||||
reqget):
|
reqget):
|
||||||
baymodel_dict = self.baymodel_dict
|
self.baymodel_dict['cluster_distro'] = 'coreos'
|
||||||
baymodel_dict['cluster_distro'] = 'coreos'
|
self.bay_dict['discovery_url'] = None
|
||||||
cfg.CONF.set_override('coreos_discovery_token_url',
|
mock_req = mock.MagicMock(text='http://tokentest/h1/h2/h3')
|
||||||
'http://tokentest',
|
|
||||||
group='bay')
|
|
||||||
mock_req = mock.MagicMock(text='/h1/h2/h3')
|
|
||||||
reqget.return_value = mock_req
|
reqget.return_value = mock_req
|
||||||
baymodel = objects.BayModel(self.context, **self.baymodel_dict)
|
baymodel = objects.BayModel(self.context, **self.baymodel_dict)
|
||||||
mock_objects_baymodel_get_by_uuid.return_value = baymodel
|
mock_objects_baymodel_get_by_uuid.return_value = baymodel
|
||||||
|
@ -182,74 +214,13 @@ class TestBayConductorWithK8s(base.TestCase):
|
||||||
'number_of_masters': 1,
|
'number_of_masters': 1,
|
||||||
'fixed_network_cidr': '10.20.30.0/24',
|
'fixed_network_cidr': '10.20.30.0/24',
|
||||||
'network_driver': 'network_driver',
|
'network_driver': 'network_driver',
|
||||||
'docker_volume_size': 20,
|
'discovery_url': 'http://tokentest/h1/h2/h3',
|
||||||
'ssh_authorized_key': 'ssh_authorized_key',
|
|
||||||
'token': 'h3',
|
|
||||||
'discovery_url': 'https://discovery.etcd.io/test',
|
|
||||||
'http_proxy': 'http_proxy',
|
'http_proxy': 'http_proxy',
|
||||||
'https_proxy': 'https_proxy',
|
'https_proxy': 'https_proxy',
|
||||||
'no_proxy': 'no_proxy',
|
'no_proxy': 'no_proxy',
|
||||||
'flannel_network_cidr': '10.101.0.0/16',
|
'flannel_network_cidr': '10.101.0.0/16',
|
||||||
'flannel_network_subnetlen': '26',
|
'flannel_network_subnetlen': '26',
|
||||||
'flannel_use_vxlan': 'yes',
|
'flannel_use_vxlan': 'yes',
|
||||||
'auth_url': 'http://192.168.10.10:5000/v2',
|
|
||||||
'tenant_name': 'fake_tenant',
|
|
||||||
'username': 'fake_user',
|
|
||||||
'user_token': 'fake_token',
|
|
||||||
'bay_uuid': self.bay_dict['uuid'],
|
|
||||||
'magnum_url': self.mock_osc.magnum_url.return_value,
|
|
||||||
'tls_disabled': False,
|
|
||||||
}
|
|
||||||
self.assertEqual(expected, definition)
|
|
||||||
|
|
||||||
@patch('uuid.uuid4')
|
|
||||||
@patch('magnum.objects.BayModel.get_by_uuid')
|
|
||||||
def test_extract_template_definition_coreos_no_discoveryurl(
|
|
||||||
self,
|
|
||||||
mock_objects_baymodel_get_by_uuid,
|
|
||||||
mock_uuid):
|
|
||||||
baymodel_dict = self.baymodel_dict
|
|
||||||
baymodel_dict['cluster_distro'] = 'coreos'
|
|
||||||
cfg.CONF.set_override('coreos_discovery_token_url',
|
|
||||||
None,
|
|
||||||
group='bay')
|
|
||||||
mock_uuid.return_value = mock.MagicMock(
|
|
||||||
hex='ba3d1866282848ddbedc76112110c208')
|
|
||||||
baymodel = objects.BayModel(self.context, **self.baymodel_dict)
|
|
||||||
mock_objects_baymodel_get_by_uuid.return_value = baymodel
|
|
||||||
bay = objects.Bay(self.context, **self.bay_dict)
|
|
||||||
|
|
||||||
(template_path,
|
|
||||||
definition) = bay_conductor._extract_template_definition(self.context,
|
|
||||||
bay)
|
|
||||||
|
|
||||||
expected = {
|
|
||||||
'ssh_key_name': 'keypair_id',
|
|
||||||
'external_network': 'external_network_id',
|
|
||||||
'dns_nameserver': 'dns_nameserver',
|
|
||||||
'server_image': 'image_id',
|
|
||||||
'minion_flavor': 'flavor_id',
|
|
||||||
'master_flavor': 'master_flavor_id',
|
|
||||||
'number_of_minions': 1,
|
|
||||||
'number_of_masters': 1,
|
|
||||||
'fixed_network_cidr': '10.20.30.0/24',
|
|
||||||
'network_driver': 'network_driver',
|
|
||||||
'docker_volume_size': 20,
|
|
||||||
'ssh_authorized_key': 'ssh_authorized_key',
|
|
||||||
'token': 'ba3d1866282848ddbedc76112110c208',
|
|
||||||
'discovery_url': 'https://discovery.etcd.io/test',
|
|
||||||
'http_proxy': 'http_proxy',
|
|
||||||
'https_proxy': 'https_proxy',
|
|
||||||
'no_proxy': 'no_proxy',
|
|
||||||
'flannel_network_cidr': '10.101.0.0/16',
|
|
||||||
'flannel_network_subnetlen': '26',
|
|
||||||
'flannel_use_vxlan': 'yes',
|
|
||||||
'auth_url': 'http://192.168.10.10:5000/v2',
|
|
||||||
'tenant_name': 'fake_tenant',
|
|
||||||
'username': 'fake_user',
|
|
||||||
'user_token': 'fake_token',
|
|
||||||
'bay_uuid': self.bay_dict['uuid'],
|
|
||||||
'magnum_url': self.mock_osc.magnum_url.return_value,
|
|
||||||
'tls_disabled': False,
|
'tls_disabled': False,
|
||||||
}
|
}
|
||||||
self.assertEqual(expected, definition)
|
self.assertEqual(expected, definition)
|
||||||
|
@ -302,52 +273,6 @@ class TestBayConductorWithK8s(base.TestCase):
|
||||||
mock_objects_baymodel_get_by_uuid,
|
mock_objects_baymodel_get_by_uuid,
|
||||||
missing_attr='master_flavor_id')
|
missing_attr='master_flavor_id')
|
||||||
|
|
||||||
@patch('magnum.objects.BayModel.get_by_uuid')
|
|
||||||
def test_extract_template_definition_without_ssh_authorized_key(
|
|
||||||
self,
|
|
||||||
mock_objects_baymodel_get_by_uuid):
|
|
||||||
baymodel_dict = self.baymodel_dict
|
|
||||||
baymodel_dict['cluster_distro'] = 'coreos'
|
|
||||||
baymodel_dict['ssh_authorized_key'] = None
|
|
||||||
baymodel = objects.BayModel(self.context, **baymodel_dict)
|
|
||||||
mock_objects_baymodel_get_by_uuid.return_value = baymodel
|
|
||||||
bay = objects.Bay(self.context, **self.bay_dict)
|
|
||||||
|
|
||||||
(template_path,
|
|
||||||
definition) = bay_conductor._extract_template_definition(self.context,
|
|
||||||
bay)
|
|
||||||
|
|
||||||
expected = {
|
|
||||||
'ssh_key_name': 'keypair_id',
|
|
||||||
'external_network': 'external_network_id',
|
|
||||||
'dns_nameserver': 'dns_nameserver',
|
|
||||||
'server_image': 'image_id',
|
|
||||||
'master_flavor': 'master_flavor_id',
|
|
||||||
'minion_flavor': 'flavor_id',
|
|
||||||
'number_of_minions': 1,
|
|
||||||
'number_of_masters': 1,
|
|
||||||
'fixed_network_cidr': '10.20.30.0/24',
|
|
||||||
'network_driver': 'network_driver',
|
|
||||||
'docker_volume_size': 20,
|
|
||||||
'discovery_url': 'https://discovery.etcd.io/test',
|
|
||||||
'http_proxy': 'http_proxy',
|
|
||||||
'https_proxy': 'https_proxy',
|
|
||||||
'no_proxy': 'no_proxy',
|
|
||||||
'flannel_network_cidr': '10.101.0.0/16',
|
|
||||||
'flannel_network_subnetlen': '26',
|
|
||||||
'flannel_use_vxlan': 'yes',
|
|
||||||
'auth_url': 'http://192.168.10.10:5000/v2',
|
|
||||||
'tenant_name': 'fake_tenant',
|
|
||||||
'username': 'fake_user',
|
|
||||||
'user_token': 'fake_token',
|
|
||||||
'bay_uuid': self.bay_dict['uuid'],
|
|
||||||
'magnum_url': self.mock_osc.magnum_url.return_value,
|
|
||||||
'tls_disabled': False,
|
|
||||||
}
|
|
||||||
self.assertIn('token', definition)
|
|
||||||
del definition['token']
|
|
||||||
self.assertEqual(expected, definition)
|
|
||||||
|
|
||||||
@patch('magnum.objects.BayModel.get_by_uuid')
|
@patch('magnum.objects.BayModel.get_by_uuid')
|
||||||
def test_extract_template_definition_without_apiserver_port(
|
def test_extract_template_definition_without_apiserver_port(
|
||||||
self,
|
self,
|
||||||
|
|
Loading…
Reference in New Issue