Add master flavor
Allow specification of master flavor. This allows choice of flavor for the master node and the flavor size of the nodes that the containers will run on. Often you will want a large flavor size for the nodes running docker to load many containers, but a small flavor size for the master just running control plane services for the docker nodes. Change-Id: Id7691cde80ea403cfe38634958bb009a24e017dc Partial-Bug: 1418713
This commit is contained in:
parent
841e92157f
commit
d0beae766b
|
@ -52,6 +52,9 @@ class BayModel(base.APIBase):
|
|||
flavor_id = wtypes.text
|
||||
"""The flavor of this bay model"""
|
||||
|
||||
master_flavor_id = wtypes.text
|
||||
"""The flavor of the master node for this bay model"""
|
||||
|
||||
dns_nameserver = wtypes.text
|
||||
"""The DNS nameserver address"""
|
||||
|
||||
|
@ -108,6 +111,7 @@ class BayModel(base.APIBase):
|
|||
name='example',
|
||||
image_id='Fedora-k8s',
|
||||
flavor_id='m1.small',
|
||||
master_flavor_id='m1.small',
|
||||
dns_nameserver='8.8.1.1',
|
||||
keypair_id='keypair1',
|
||||
external_network_id='ffc44e4a-2319-4062-bce0-9ae1c38b05ba',
|
||||
|
|
|
@ -63,6 +63,8 @@ def _extract_bay_definition(context, bay):
|
|||
bay_definition['server_image'] = baymodel.image_id
|
||||
if baymodel.flavor_id:
|
||||
bay_definition['server_flavor'] = baymodel.flavor_id
|
||||
if baymodel.master_flavor_id:
|
||||
bay_definition['master_flavor'] = baymodel.master_flavor_id
|
||||
# TODO(yuanying): Add below lines if apiserver_port parameter is supported
|
||||
# if baymodel.apiserver_port:
|
||||
# bay_definition['apiserver_port'] = baymodel.apiserver_port
|
||||
|
|
|
@ -0,0 +1,34 @@
|
|||
# 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.
|
||||
"""Add master flavor
|
||||
|
||||
Revision ID: 1afee1db6cd0
|
||||
Revises: 3a938526b35d
|
||||
Create Date: 2015-02-27 14:53:38.042900
|
||||
|
||||
"""
|
||||
|
||||
# revision identifiers, used by Alembic.
|
||||
revision = '1afee1db6cd0'
|
||||
down_revision = '35cff7c86221'
|
||||
|
||||
from alembic import op
|
||||
import sqlalchemy as sa
|
||||
|
||||
|
||||
def upgrade():
|
||||
op.add_column('baymodel', sa.Column('master_flavor_id',
|
||||
sa.String(length=255), nullable=True))
|
||||
|
||||
|
||||
def downgrade():
|
||||
op.drop_column('baymodel', 'master_flavor_id')
|
|
@ -245,6 +245,9 @@ class Connection(api.Connection):
|
|||
query = query.filter_by(image_id=filters['image_id'])
|
||||
if 'flavor_id' in filters:
|
||||
query = query.filter_by(flavor_id=filters['flavor_id'])
|
||||
if 'master_flavor_id' in filters:
|
||||
query = query.filter_by(
|
||||
master_flavor_id=filters['master_flavor_id'])
|
||||
if 'keypair_id' in filters:
|
||||
query = query.filter_by(keypair_id=filters['keypair_id'])
|
||||
if 'external_network_id' in filters:
|
||||
|
|
|
@ -145,6 +145,7 @@ class BayModel(Base):
|
|||
name = Column(String(255))
|
||||
image_id = Column(String(255))
|
||||
flavor_id = Column(String(255))
|
||||
master_flavor_id = Column(String(255))
|
||||
keypair_id = Column(String(255))
|
||||
external_network_id = Column(String(255))
|
||||
fixed_network = Column(String(255))
|
||||
|
|
|
@ -34,6 +34,7 @@ class BayModel(base.MagnumObject):
|
|||
'name': obj_utils.str_or_none,
|
||||
'image_id': obj_utils.str_or_none,
|
||||
'flavor_id': obj_utils.str_or_none,
|
||||
'master_flavor_id': obj_utils.str_or_none,
|
||||
'keypair_id': obj_utils.str_or_none,
|
||||
'dns_nameserver': obj_utils.str_or_none,
|
||||
'external_network_id': obj_utils.str_or_none,
|
||||
|
|
|
@ -47,6 +47,7 @@ class TestListBayModel(api_base.FunctionalTest):
|
|||
response = self.get_json('/baymodels')
|
||||
self.assertEqual(baymodel.uuid, response['baymodels'][0]["uuid"])
|
||||
self.assertNotIn('flavor_id', response['baymodels'][0])
|
||||
self.assertNotIn('master_flavor_id', response['baymodels'][0])
|
||||
self.assertNotIn('dns_nameserver', response['baymodels'][0])
|
||||
self.assertNotIn('keypair_id', response['baymodels'][0])
|
||||
self.assertNotIn('external_network_id', response['baymodels'][0])
|
||||
|
@ -58,6 +59,7 @@ class TestListBayModel(api_base.FunctionalTest):
|
|||
response = self.get_json('/baymodels/%s' % baymodel['uuid'])
|
||||
self.assertEqual(baymodel.uuid, response['uuid'])
|
||||
self.assertIn('flavor_id', response)
|
||||
self.assertIn('master_flavor_id', response)
|
||||
self.assertIn('dns_nameserver', response)
|
||||
self.assertIn('keypair_id', response)
|
||||
self.assertIn('external_network_id', response)
|
||||
|
@ -69,6 +71,7 @@ class TestListBayModel(api_base.FunctionalTest):
|
|||
response = self.get_json('/baymodels/detail')
|
||||
self.assertEqual(baymodel.uuid, response['baymodels'][0]["uuid"])
|
||||
self.assertIn('flavor_id', response['baymodels'][0])
|
||||
self.assertIn('master_flavor_id', response['baymodels'][0])
|
||||
self.assertIn('dns_nameserver', response['baymodels'][0])
|
||||
self.assertIn('keypair_id', response['baymodels'][0])
|
||||
self.assertIn('external_network_id', response['baymodels'][0])
|
||||
|
|
|
@ -26,6 +26,7 @@ class TestBayK8sHeat(base.TestCase):
|
|||
self.baymodel_dict = {
|
||||
'image_id': 'image_id',
|
||||
'flavor_id': 'flavor_id',
|
||||
'master_flavor_id': 'master_flavor_id',
|
||||
'keypair_id': 'keypair_id',
|
||||
'dns_nameserver': 'dns_nameserver',
|
||||
'external_network_id': 'external_network_id',
|
||||
|
@ -57,6 +58,7 @@ class TestBayK8sHeat(base.TestCase):
|
|||
'dns_nameserver': 'dns_nameserver',
|
||||
'server_image': 'image_id',
|
||||
'server_flavor': 'flavor_id',
|
||||
'master_flavor': 'master_flavor_id',
|
||||
'number_of_minions': '1',
|
||||
'fixed_network': 'private',
|
||||
'docker_volume_size': 20,
|
||||
|
@ -80,6 +82,7 @@ class TestBayK8sHeat(base.TestCase):
|
|||
'external_network_id': 'external_network_id',
|
||||
'server_image': 'image_id',
|
||||
'server_flavor': 'flavor_id',
|
||||
'master_flavor': 'master_flavor_id',
|
||||
'number_of_minions': '1',
|
||||
'fixed_network': 'private',
|
||||
'docker_volume_size': 20,
|
||||
|
@ -103,6 +106,7 @@ class TestBayK8sHeat(base.TestCase):
|
|||
'external_network_id': 'external_network_id',
|
||||
'dns_nameserver': 'dns_nameserver',
|
||||
'server_flavor': 'flavor_id',
|
||||
'master_flavor': 'master_flavor_id',
|
||||
'number_of_minions': '1',
|
||||
'fixed_network': 'private',
|
||||
'docker_volume_size': 20,
|
||||
|
@ -126,6 +130,7 @@ class TestBayK8sHeat(base.TestCase):
|
|||
'external_network_id': 'external_network_id',
|
||||
'dns_nameserver': 'dns_nameserver',
|
||||
'server_image': 'image_id',
|
||||
'master_flavor': 'master_flavor_id',
|
||||
'number_of_minions': '1',
|
||||
'fixed_network': 'private',
|
||||
'docker_volume_size': 20,
|
||||
|
@ -151,6 +156,7 @@ class TestBayK8sHeat(base.TestCase):
|
|||
'server_image': 'image_id',
|
||||
'server_flavor': 'flavor_id',
|
||||
'fixed_network': 'private',
|
||||
'master_flavor': 'master_flavor_id',
|
||||
'number_of_minions': '1',
|
||||
}
|
||||
self.assertEqual(expected, bay_definition)
|
||||
|
@ -172,12 +178,37 @@ class TestBayK8sHeat(base.TestCase):
|
|||
'external_network_id': 'external_network_id',
|
||||
'dns_nameserver': 'dns_nameserver',
|
||||
'server_image': 'image_id',
|
||||
'master_flavor': 'master_flavor_id',
|
||||
'server_flavor': 'flavor_id',
|
||||
'number_of_minions': '1',
|
||||
'docker_volume_size': 20,
|
||||
}
|
||||
self.assertEqual(expected, bay_definition)
|
||||
|
||||
@patch('magnum.objects.BayModel.get_by_uuid')
|
||||
def test_extract_bay_definition_without_master_flavor(self,
|
||||
mock_objects_baymodel_get_by_uuid):
|
||||
baymodel_dict = self.baymodel_dict
|
||||
baymodel_dict['master_flavor_id'] = 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)
|
||||
|
||||
bay_definition = bay_k8s_heat._extract_bay_definition(self.context,
|
||||
bay)
|
||||
|
||||
expected = {
|
||||
'ssh_key_name': 'keypair_id',
|
||||
'external_network_id': 'external_network_id',
|
||||
'dns_nameserver': 'dns_nameserver',
|
||||
'server_image': 'image_id',
|
||||
'server_flavor': 'flavor_id',
|
||||
'number_of_minions': '1',
|
||||
'fixed_network': 'private',
|
||||
'docker_volume_size': 20,
|
||||
}
|
||||
self.assertEqual(expected, bay_definition)
|
||||
|
||||
@patch('magnum.objects.BayModel.get_by_uuid')
|
||||
def test_extract_bay_definition_without_apiserver_port(self,
|
||||
mock_objects_baymodel_get_by_uuid):
|
||||
|
@ -196,6 +227,7 @@ class TestBayK8sHeat(base.TestCase):
|
|||
'dns_nameserver': 'dns_nameserver',
|
||||
'server_image': 'image_id',
|
||||
'server_flavor': 'flavor_id',
|
||||
'master_flavor': 'master_flavor_id',
|
||||
'number_of_minions': '1',
|
||||
'fixed_network': 'private',
|
||||
'docker_volume_size': 20,
|
||||
|
@ -221,6 +253,7 @@ class TestBayK8sHeat(base.TestCase):
|
|||
'server_image': 'image_id',
|
||||
'server_flavor': 'flavor_id',
|
||||
'fixed_network': 'private',
|
||||
'master_flavor': 'master_flavor_id',
|
||||
'docker_volume_size': 20,
|
||||
}
|
||||
self.assertEqual(expected, bay_definition)
|
||||
|
|
|
@ -27,6 +27,7 @@ def get_test_baymodel(**kw):
|
|||
'name': kw.get('name', 'baymodel1'),
|
||||
'image_id': kw.get('image_id', 'ubuntu'),
|
||||
'flavor_id': kw.get('flavor_id', 'm1.small'),
|
||||
'master_flavor_id': kw.get('master_flavor_id', 'm1.small'),
|
||||
'keypair_id': kw.get('keypair_id', 'keypair1'),
|
||||
'external_network_id': kw.get('external_network_id',
|
||||
'd1f02cfb-d27f-4068-9332-84d907cb0e2e'),
|
||||
|
|
Loading…
Reference in New Issue