Adds volume_driver in db api

Adds volume_driver to the following:
1. api baymodel attribute
2. a new column to the baymodel db
3. objects.Note: Updates baymodel object version
4. Unit tests

Co-Authored By: Kai Qiang Wu(Kennan)<wkqwu@cn.ibm.com>
Co-Authored By: Ton Ngo<ton@us.ibm.com>
Partially-Implements: blueprint magnum-integrate-with-cinder

Change-Id: I25506bd39ab4be513ef99c39f8c52a502b300d92
This commit is contained in:
wangqun 2016-01-12 06:33:32 +00:00
parent e5397eabeb
commit 6dc4816521
7 changed files with 83 additions and 5 deletions

View File

@ -119,6 +119,9 @@ class BayModel(base.APIBase):
"""Its comma separated list of ip for which proxies should not
used in the bay"""
volume_driver = wtypes.StringType(min_length=1, max_length=255)
"""The name of the driver used for instantiating container volume driver"""
registry_enabled = wsme.wsattr(types.boolean, default=False)
"""Indicates whether the docker registry is enabled"""
@ -177,6 +180,7 @@ class BayModel(base.APIBase):
external_network_id='ffc44e4a-2319-4062-bce0-9ae1c38b05ba',
fixed_network='private',
network_driver='libnetwork',
volume_driver='cinder',
apiserver_port=8080,
docker_volume_size=25,
cluster_distro='fedora-atomic',

View File

@ -0,0 +1,31 @@
# 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 volume driver
Revision ID: 05d3e97de9ee
Revises: 57fbdf2327a2
Create Date: 2016-01-12 06:21:24.880838
"""
# revision identifiers, used by Alembic.
revision = '05d3e97de9ee'
down_revision = '57fbdf2327a2'
from alembic import op
import sqlalchemy as sa
def upgrade():
op.add_column('baymodel', sa.Column('volume_driver',
sa.String(length=255), nullable=True))

View File

@ -152,6 +152,7 @@ class BayModel(Base):
external_network_id = Column(String(255))
fixed_network = Column(String(255))
network_driver = Column(String(255))
volume_driver = Column(String(255))
dns_nameserver = Column(String(255))
apiserver_port = Column(Integer())
docker_volume_size = Column(Integer())

View File

@ -31,7 +31,8 @@ class BayModel(base.MagnumPersistentObject, base.MagnumObject,
# Version 1.6: Change 'insecure' to 'tls_disabled'
# Version 1.7: Added 'public' field
# Version 1.8: Added 'server_type' field
VERSION = '1.8'
# Version 1.9: Added 'volume_driver' field
VERSION = '1.9'
dbapi = dbapi.get_instance()
@ -49,6 +50,7 @@ class BayModel(base.MagnumPersistentObject, base.MagnumObject,
'external_network_id': fields.StringField(nullable=True),
'fixed_network': fields.StringField(nullable=True),
'network_driver': fields.StringField(nullable=True),
'volume_driver': fields.StringField(nullable=True),
'apiserver_port': fields.IntegerField(nullable=True),
'docker_volume_size': fields.IntegerField(nullable=True),
'ssh_authorized_key': fields.StringField(nullable=True),

View File

@ -52,7 +52,7 @@ class TestListBayModel(api_base.FunctionalTest):
'image_id', 'registry_enabled', 'no_proxy',
'keypair_id', 'https_proxy', 'tls_disabled',
'public', 'labels', 'ssh_authorized_key',
'master_flavor_id',)
'master_flavor_id', 'volume_driver')
def test_empty(self):
response = self.get_json('/baymodels')
@ -200,6 +200,7 @@ class TestPatch(api_base.FunctionalTest):
image_id='nerdherd',
apiserver_port=8080,
fixed_network='private',
volume_driver='rexray',
public=False,
docker_volume_size=20,
ssh_authorized_key='ssh-rsa AAAAB3NzaC1ycEAAAADA'
@ -284,6 +285,8 @@ class TestPatch(api_base.FunctionalTest):
response['fixed_network'])
self.assertEqual(self.baymodel.network_driver,
response['network_driver'])
self.assertEqual(self.baymodel.volume_driver,
response['volume_driver'])
self.assertEqual(self.baymodel.docker_volume_size,
response['docker_volume_size'])
self.assertEqual(self.baymodel.ssh_authorized_key,
@ -323,6 +326,8 @@ class TestPatch(api_base.FunctionalTest):
response['fixed_network'])
self.assertEqual(baymodel.network_driver,
response['network_driver'])
self.assertEqual(baymodel.volume_driver,
response['volume_driver'])
self.assertEqual(baymodel.docker_volume_size,
response['docker_volume_size'])
self.assertEqual(baymodel.ssh_authorized_key,
@ -452,7 +457,7 @@ class TestPost(api_base.FunctionalTest):
"dns_nameserver", "keypair_id", "external_network_id",
"cluster_distro", "fixed_network", "apiserver_port",
"docker_volume_size", "http_proxy", "https_proxy",
"no_proxy", "network_driver", "labels"]
"no_proxy", "network_driver", "labels", "volume_driver"]
for field in fields:
self._create_baymodel_raises_app_error(**{field: 'i' * 256})
@ -461,7 +466,8 @@ class TestPost(api_base.FunctionalTest):
"dns_nameserver", "keypair_id", "external_network_id",
"cluster_distro", "fixed_network", "apiserver_port",
"docker_volume_size", "ssh_authorized_key", "labels",
"http_proxy", "https_proxy", "no_proxy", "network_driver"]
"http_proxy", "https_proxy", "no_proxy", "network_driver",
"volume_driver"]
for field in fields:
self._create_baymodel_raises_app_error(**{field: ''})
@ -590,6 +596,39 @@ class TestPost(api_base.FunctionalTest):
config_dict,
expect_errors_flag)
@mock.patch('magnum.api.attr_validator.validate_image')
@mock.patch('magnum.api.attr_validator.validate_keypair')
def test_create_baymodel_with_volume_driver(self, mock_keypair_exists,
mock_image_data):
mock_keypair_exists.return_value = None
with mock.patch.object(self.dbapi, 'create_baymodel',
wraps=self.dbapi.create_baymodel) as cc_mock:
mock_keypair_exists.return_value = None
mock_image_data.return_value = {'name': 'mock_name',
'os_distro': 'fedora-atomic'}
bdict = apiutils.baymodel_post_data(volume_driver='rexray')
response = self.post_json('/baymodels', bdict)
self.assertEqual(bdict['volume_driver'],
response.json['volume_driver'])
cc_mock.assert_called_once_with(mock.ANY)
self.assertNotIn('id', cc_mock.call_args[0][0])
@mock.patch('magnum.api.attr_validator.validate_image')
@mock.patch('magnum.api.attr_validator.validate_keypair')
def test_create_baymodel_with_no_volume_driver(self, mock_keypair_exists,
mock_image_data):
mock_keypair_exists.return_value = None
with mock.patch.object(self.dbapi, 'create_baymodel',
wraps=self.dbapi.create_baymodel) as cc_mock:
mock_image_data.return_value = {'name': 'mock_name',
'os_distro': 'fedora-atomic'}
bdict = apiutils.baymodel_post_data()
response = self.post_json('/baymodels', bdict)
self.assertEqual(bdict['volume_driver'],
response.json['volume_driver'])
cc_mock.assert_called_once_with(mock.ANY)
self.assertNotIn('id', cc_mock.call_args[0][0])
@mock.patch('magnum.api.attr_validator.validate_image')
@mock.patch('magnum.api.attr_validator.validate_keypair')
@mock.patch.object(magnum_policy, 'enforce')

View File

@ -33,6 +33,7 @@ def get_test_baymodel(**kw):
'd1f02cfb-d27f-4068-9332-84d907cb0e2e'),
'fixed_network': kw.get('fixed_network', 'private'),
'network_driver': kw.get('network_driver'),
'volume_driver': kw.get('volume_driver'),
'dns_nameserver': kw.get('dns_nameserver', '8.8.1.1'),
'apiserver_port': kw.get('apiserver_port', 8080),
'docker_volume_size': kw.get('docker_volume_size', 20),

View File

@ -424,7 +424,7 @@ class _TestObject(object):
# http://docs.openstack.org/developer/magnum/objects.html
object_data = {
'Bay': '1.3-5c09d266a4f21301b3243848d4c09a90',
'BayModel': '1.8-a4bb0976be245f06edbd1db087a18071',
'BayModel': '1.9-d5d32553721d0cadfcc45ddc316d9c1a',
'Certificate': '1.0-2aff667971b85c1edf8d15684fd7d5e2',
'Container': '1.3-e2d9d2e8a8844d421148cd9fde6c6bd6',
'MyObj': '1.0-b43567e512438205e32f4e95ca616697',