From 28fff8006ae17d9afeee4ad409e12b6608fa26cb Mon Sep 17 00:00:00 2001 From: Ricardo Rocha Date: Tue, 10 Oct 2017 13:17:51 +0000 Subject: [PATCH] Make docker_storage_driver a str instead of enum Allow any value to be passed on the docker_storage_driver field by turning it into a StringField (was EnumField), and remove the constraints limiting the values to 'devicemapper' and 'overlay'. Change the docker storage setup to have a generic setup for all drivers with the exception of 'devicemapper', which keeps its own specific storage config function. For all others, do the same we already did for overlay (with two cases for usage of a cinder volume or not) and simply set the storage driver in the docker configuration to the value provided in the cluster template. Change-Id: I9aa8f232ce64ece4d439c0a476f463820a499617 Closes-Bug: #1722522 --- api-ref/source/parameters.yaml | 3 +- doc/source/user/index.rst | 9 ++--- magnum/api/controllers/v1/baymodel.py | 2 +- magnum/api/controllers/v1/cluster_template.py | 2 +- ...5aa95ba_change_storage_driver_to_string.py | 33 +++++++++++++++++++ .../fragments/configure-docker-storage.sh | 12 ++----- .../configure_docker_storage_driver_atomic.sh | 10 +++--- .../templates/kubecluster.yaml | 2 -- .../templates/kubemaster.yaml | 2 -- .../templates/kubeminion.yaml | 2 -- .../templates/kubecluster.yaml | 2 -- .../templates/kubemaster.yaml | 2 -- .../kubeminion_software_configs.yaml | 2 -- .../templates/cluster.yaml | 2 -- .../templates/swarmmaster.yaml | 2 -- .../templates/swarmnode.yaml | 2 -- .../templates/swarmcluster.yaml | 2 -- .../templates/swarmmaster.yaml | 2 -- .../templates/swarmnode.yaml | 2 -- magnum/objects/cluster_template.py | 6 ++-- magnum/objects/fields.py | 16 --------- magnum/tests/unit/objects/test_objects.py | 2 +- .../notes/bug-1722522-d94743c6362a5e48.yaml | 10 ++++++ 23 files changed, 60 insertions(+), 69 deletions(-) create mode 100644 magnum/db/sqlalchemy/alembic/versions/04c625aa95ba_change_storage_driver_to_string.py create mode 100644 releasenotes/notes/bug-1722522-d94743c6362a5e48.yaml diff --git a/api-ref/source/parameters.yaml b/api-ref/source/parameters.yaml index 0d575063b8..d8d413a6e7 100644 --- a/api-ref/source/parameters.yaml +++ b/api-ref/source/parameters.yaml @@ -225,8 +225,7 @@ dns_nameserver: docker_storage_driver: description: | The name of a driver to manage the storage for the images and the - container's writable layer. The supported drivers are ``devicemapper`` and - ``overlay``. The default is ``devicemapper``. + container's writable layer. The default is ``devicemapper``. in: body required: true type: string diff --git a/doc/source/user/index.rst b/doc/source/user/index.rst index 32dd190199..f6c97d9b1c 100644 --- a/doc/source/user/index.rst +++ b/doc/source/user/index.rst @@ -236,8 +236,7 @@ They are loosely grouped as: mandatory, infrastructure, COE specific. --docker-storage-driver \ The name of a driver to manage the storage for the images and the - container's writable layer. The supported drivers are 'devicemapper' - and 'overlay'. The default is 'devicemapper'. + container's writable layer. The default is 'devicemapper'. --labels \ Arbitrary labels in the form of key=value pairs. The accepted keys @@ -1025,8 +1024,7 @@ Volume driver (volume-driver) Storage driver (docker-storage-driver) Specified in the ClusterTemplate to select the Docker storage driver. The - supported storage drivers are 'devicemapper' and 'overlay', with - 'devicemapper' being the default. Refer to the `Storage`_ section for more + default is 'devicemapper'. Refer to the `Storage`_ section for more details. Image (image) @@ -1203,8 +1201,7 @@ Volume driver (volume-driver) Storage driver (docker-storage-driver) Specified in the ClusterTemplate to select the Docker storage driver. The - supported storage driver are 'devicemapper' and 'overlay', with - 'devicemapper' being the default. Refer to the `Storage`_ section for more + default is 'devicemapper'. Refer to the `Storage`_ section for more details. Image (image) diff --git a/magnum/api/controllers/v1/baymodel.py b/magnum/api/controllers/v1/baymodel.py index fb9b268e18..1b5c0e6c2f 100644 --- a/magnum/api/controllers/v1/baymodel.py +++ b/magnum/api/controllers/v1/baymodel.py @@ -127,7 +127,7 @@ class BayModel(base.APIBase): insecure_registry = wtypes.StringType(min_length=1, max_length=255) """Insecure registry URL when creating a Baymodel""" - docker_storage_driver = wtypes.Enum(str, *fields.DockerStorageDriver.ALL) + docker_storage_driver = wtypes.StringType(min_length=1, max_length=255) """Docker storage driver""" master_lb_enabled = wsme.wsattr(types.boolean, default=False) diff --git a/magnum/api/controllers/v1/cluster_template.py b/magnum/api/controllers/v1/cluster_template.py index cc95bfcfe9..fe0d942761 100644 --- a/magnum/api/controllers/v1/cluster_template.py +++ b/magnum/api/controllers/v1/cluster_template.py @@ -128,7 +128,7 @@ class ClusterTemplate(base.APIBase): insecure_registry = wtypes.StringType(min_length=1, max_length=255) """Insecure registry URL when creating a ClusterTemplate """ - docker_storage_driver = wtypes.Enum(str, *fields.DockerStorageDriver.ALL) + docker_storage_driver = wtypes.StringType(min_length=1, max_length=255) """Docker storage driver""" master_lb_enabled = wsme.wsattr(types.boolean, default=False) diff --git a/magnum/db/sqlalchemy/alembic/versions/04c625aa95ba_change_storage_driver_to_string.py b/magnum/db/sqlalchemy/alembic/versions/04c625aa95ba_change_storage_driver_to_string.py new file mode 100644 index 0000000000..4a53f32579 --- /dev/null +++ b/magnum/db/sqlalchemy/alembic/versions/04c625aa95ba_change_storage_driver_to_string.py @@ -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. +"""change storage driver to string + +Revision ID: 04c625aa95ba +Revises: 52bcaf58fecb +Create Date: 2017-10-10 15:40:37.553288 + +""" + +# revision identifiers, used by Alembic. +revision = '04c625aa95ba' +down_revision = '52bcaf58fecb' + +from alembic import op +import sqlalchemy as sa + + +def upgrade(): + op.alter_column('cluster_template', 'docker_storage_driver', + existing_type=sa.Enum('devicemapper', 'overlay', + name='docker_storage_driver'), + type_=sa.String(length=512), + nullable=True) diff --git a/magnum/drivers/common/templates/fragments/configure-docker-storage.sh b/magnum/drivers/common/templates/fragments/configure-docker-storage.sh index 4704e07558..87b803825b 100644 --- a/magnum/drivers/common/templates/fragments/configure-docker-storage.sh +++ b/magnum/drivers/common/templates/fragments/configure-docker-storage.sh @@ -32,14 +32,8 @@ fi $configure_docker_storage_driver -if [ "$DOCKER_STORAGE_DRIVER" = "overlay" ]; then - if [ $(echo -e "$(uname -r)\n3.18" | sort -V | head -1) = $(uname -r) ]; then - ERROR_MESSAGE="OverlayFS requires at least Linux kernel 3.18. Cluster node kernel version: $(uname -r)" - echo "ERROR: ${ERROR_MESSAGE}" >&2 - sh -c "${WAIT_CURL} --data-binary '{\"status\": \"FAILURE\", \"reason\": \"${ERROR_MESSAGE}\"}'" - else - configure_overlay - fi -else +if [ "$DOCKER_STORAGE_DRIVER" = "devicemapper" ]; then configure_devicemapper +else + configure_storage_driver_generic $DOCKER_STORAGE_DRIVER fi diff --git a/magnum/drivers/common/templates/fragments/configure_docker_storage_driver_atomic.sh b/magnum/drivers/common/templates/fragments/configure_docker_storage_driver_atomic.sh index 9d92a666d2..a06cccc413 100644 --- a/magnum/drivers/common/templates/fragments/configure_docker_storage_driver_atomic.sh +++ b/magnum/drivers/common/templates/fragments/configure_docker_storage_driver_atomic.sh @@ -1,5 +1,5 @@ # This file contains docker storage drivers configuration for fedora -# atomic hosts. Currently, devicemapper and overlay are supported. +# atomic hosts, as supported by Magnum. # * Remove any existing docker-storage configuration. In case of an # existing configuration, docker-storage-setup will fail. @@ -17,8 +17,8 @@ clear_docker_storage () { fi } -# Configure docker storage with xfs as backing filesystem. -configure_overlay () { +# Configure generic docker storage driver. +configure_storage_driver_generic() { clear_docker_storage if [ -n "$DOCKER_VOLUME_SIZE" ] && [ "$DOCKER_VOLUME_SIZE" -gt 0 ]; then @@ -27,9 +27,7 @@ configure_overlay () { mount -a fi - echo "STORAGE_DRIVER=overlay" > /etc/sysconfig/docker-storage-setup - - docker-storage-setup + sed -i "/^DOCKER_STORAGE_OPTIONS=/ s/=.*/=-s $1/" /etc/sysconfig/docker-storage local lvname=$(lvdisplay | grep "LV\ Path" | awk '{print $3}') local pvname=$(pvdisplay | grep "PV\ Name" | awk '{print $3}') diff --git a/magnum/drivers/k8s_fedora_atomic_v1/templates/kubecluster.yaml b/magnum/drivers/k8s_fedora_atomic_v1/templates/kubecluster.yaml index 8a05721aa1..a87183b999 100644 --- a/magnum/drivers/k8s_fedora_atomic_v1/templates/kubecluster.yaml +++ b/magnum/drivers/k8s_fedora_atomic_v1/templates/kubecluster.yaml @@ -153,8 +153,6 @@ parameters: type: string description: docker storage driver name default: "devicemapper" - constraints: - - allowed_values: ["devicemapper", "overlay"] wait_condition_timeout: type: number diff --git a/magnum/drivers/k8s_fedora_atomic_v1/templates/kubemaster.yaml b/magnum/drivers/k8s_fedora_atomic_v1/templates/kubemaster.yaml index 6bdc0acc50..335fae78c7 100644 --- a/magnum/drivers/k8s_fedora_atomic_v1/templates/kubemaster.yaml +++ b/magnum/drivers/k8s_fedora_atomic_v1/templates/kubemaster.yaml @@ -60,8 +60,6 @@ parameters: type: string description: docker storage driver name default: "devicemapper" - constraints: - - allowed_values: ["devicemapper", "overlay"] volume_driver: type: string diff --git a/magnum/drivers/k8s_fedora_atomic_v1/templates/kubeminion.yaml b/magnum/drivers/k8s_fedora_atomic_v1/templates/kubeminion.yaml index 53ef59dde7..d299fbe787 100644 --- a/magnum/drivers/k8s_fedora_atomic_v1/templates/kubeminion.yaml +++ b/magnum/drivers/k8s_fedora_atomic_v1/templates/kubeminion.yaml @@ -50,8 +50,6 @@ parameters: type: string description: docker storage driver name default: "devicemapper" - constraints: - - allowed_values: ["devicemapper", "overlay"] tls_disabled: type: boolean diff --git a/magnum/drivers/k8s_fedora_ironic_v1/templates/kubecluster.yaml b/magnum/drivers/k8s_fedora_ironic_v1/templates/kubecluster.yaml index 0225633e0f..736815903f 100644 --- a/magnum/drivers/k8s_fedora_ironic_v1/templates/kubecluster.yaml +++ b/magnum/drivers/k8s_fedora_ironic_v1/templates/kubecluster.yaml @@ -151,8 +151,6 @@ parameters: type: string description: docker storage driver name default: "devicemapper" - constraints: - - allowed_values: ["devicemapper", "overlay"] wait_condition_timeout: type: number diff --git a/magnum/drivers/k8s_fedora_ironic_v1/templates/kubemaster.yaml b/magnum/drivers/k8s_fedora_ironic_v1/templates/kubemaster.yaml index 43b987d75f..e496523199 100644 --- a/magnum/drivers/k8s_fedora_ironic_v1/templates/kubemaster.yaml +++ b/magnum/drivers/k8s_fedora_ironic_v1/templates/kubemaster.yaml @@ -49,8 +49,6 @@ parameters: type: string description: docker storage driver name default: "devicemapper" - constraints: - - allowed_values: ["devicemapper", "overlay"] flannel_network_cidr: type: string diff --git a/magnum/drivers/k8s_fedora_ironic_v1/templates/kubeminion_software_configs.yaml b/magnum/drivers/k8s_fedora_ironic_v1/templates/kubeminion_software_configs.yaml index 0c7bd45a70..8b7d006b22 100644 --- a/magnum/drivers/k8s_fedora_ironic_v1/templates/kubeminion_software_configs.yaml +++ b/magnum/drivers/k8s_fedora_ironic_v1/templates/kubeminion_software_configs.yaml @@ -22,8 +22,6 @@ parameters: type: string description: docker storage driver name default: "devicemapper" - constraints: - - allowed_values: ["devicemapper", "overlay"] tls_disabled: type: boolean diff --git a/magnum/drivers/swarm_fedora_atomic_v1/templates/cluster.yaml b/magnum/drivers/swarm_fedora_atomic_v1/templates/cluster.yaml index aacafda325..103e8ef002 100644 --- a/magnum/drivers/swarm_fedora_atomic_v1/templates/cluster.yaml +++ b/magnum/drivers/swarm_fedora_atomic_v1/templates/cluster.yaml @@ -144,8 +144,6 @@ parameters: type: string description: docker storage driver name default: "devicemapper" - constraints: - - allowed_values: ["devicemapper", "overlay"] loadbalancing_protocol: type: string diff --git a/magnum/drivers/swarm_fedora_atomic_v1/templates/swarmmaster.yaml b/magnum/drivers/swarm_fedora_atomic_v1/templates/swarmmaster.yaml index c535676e33..a8f040762f 100644 --- a/magnum/drivers/swarm_fedora_atomic_v1/templates/swarmmaster.yaml +++ b/magnum/drivers/swarm_fedora_atomic_v1/templates/swarmmaster.yaml @@ -29,8 +29,6 @@ parameters: docker_storage_driver: type: string description: docker storage driver name - constraints: - - allowed_values: ["devicemapper", "overlay"] external_network: type: string diff --git a/magnum/drivers/swarm_fedora_atomic_v1/templates/swarmnode.yaml b/magnum/drivers/swarm_fedora_atomic_v1/templates/swarmnode.yaml index d4562e1746..3d4dd64899 100644 --- a/magnum/drivers/swarm_fedora_atomic_v1/templates/swarmnode.yaml +++ b/magnum/drivers/swarm_fedora_atomic_v1/templates/swarmnode.yaml @@ -38,8 +38,6 @@ parameters: docker_storage_driver: type: string description: docker storage driver name - constraints: - - allowed_values: ["devicemapper", "overlay"] external_network: type: string diff --git a/magnum/drivers/swarm_fedora_atomic_v2/templates/swarmcluster.yaml b/magnum/drivers/swarm_fedora_atomic_v2/templates/swarmcluster.yaml index 9687836754..55de3290d0 100644 --- a/magnum/drivers/swarm_fedora_atomic_v2/templates/swarmcluster.yaml +++ b/magnum/drivers/swarm_fedora_atomic_v2/templates/swarmcluster.yaml @@ -116,8 +116,6 @@ parameters: type: string description: docker storage driver name default: "devicemapper" - constraints: - - allowed_values: ["devicemapper", "overlay"] loadbalancing_protocol: type: string diff --git a/magnum/drivers/swarm_fedora_atomic_v2/templates/swarmmaster.yaml b/magnum/drivers/swarm_fedora_atomic_v2/templates/swarmmaster.yaml index 8f8d6ffb4f..cd7e675c54 100644 --- a/magnum/drivers/swarm_fedora_atomic_v2/templates/swarmmaster.yaml +++ b/magnum/drivers/swarm_fedora_atomic_v2/templates/swarmmaster.yaml @@ -30,8 +30,6 @@ parameters: docker_storage_driver: type: string description: docker storage driver name - constraints: - - allowed_values: ["devicemapper", "overlay"] external_network: type: string diff --git a/magnum/drivers/swarm_fedora_atomic_v2/templates/swarmnode.yaml b/magnum/drivers/swarm_fedora_atomic_v2/templates/swarmnode.yaml index c0c362a7f5..a205833001 100644 --- a/magnum/drivers/swarm_fedora_atomic_v2/templates/swarmnode.yaml +++ b/magnum/drivers/swarm_fedora_atomic_v2/templates/swarmnode.yaml @@ -38,8 +38,6 @@ parameters: docker_storage_driver: type: string description: docker storage driver name - constraints: - - allowed_values: ["devicemapper", "overlay"] external_network: type: string diff --git a/magnum/objects/cluster_template.py b/magnum/objects/cluster_template.py index ecaff185da..955536d81c 100644 --- a/magnum/objects/cluster_template.py +++ b/magnum/objects/cluster_template.py @@ -41,7 +41,8 @@ class ClusterTemplate(base.MagnumPersistentObject, base.MagnumObject, # Version 1.15: Added 'floating_ip_enabled' field # Version 1.16: Renamed the class from "BayModel' to 'ClusterTemplate' # Version 1.17: 'coe' field type change to ClusterTypeField - VERSION = '1.17' + # Version 1.18: DockerStorageDriver is a StringField (was an Enum) + VERSION = '1.18' dbapi = dbapi.get_instance() @@ -63,8 +64,7 @@ class ClusterTemplate(base.MagnumPersistentObject, base.MagnumObject, 'volume_driver': fields.StringField(nullable=True), 'apiserver_port': fields.IntegerField(nullable=True), 'docker_volume_size': fields.IntegerField(nullable=True), - 'docker_storage_driver': m_fields.DockerStorageDriverField( - nullable=True), + 'docker_storage_driver': fields.StringField(nullable=True), 'cluster_distro': fields.StringField(nullable=True), 'coe': m_fields.ClusterTypeField(nullable=True), 'http_proxy': fields.StringField(nullable=True), diff --git a/magnum/objects/fields.py b/magnum/objects/fields.py index 559a4e8379..9024ef33d0 100644 --- a/magnum/objects/fields.py +++ b/magnum/objects/fields.py @@ -72,18 +72,6 @@ class ClusterType(fields.Enum): super(ClusterType, self).__init__(valid_values=ClusterType.ALL) -class DockerStorageDriver(fields.Enum): - ALL = ( - DEVICEMAPPER, OVERLAY, - ) = ( - 'devicemapper', 'overlay', - ) - - def __init__(self): - super(DockerStorageDriver, self).__init__( - valid_values=DockerStorageDriver.ALL) - - class QuotaResourceName(fields.Enum): ALL = ( CLUSTER, @@ -156,9 +144,5 @@ class ClusterTypeField(fields.BaseEnumField): AUTO_TYPE = ClusterType() -class DockerStorageDriverField(fields.BaseEnumField): - AUTO_TYPE = DockerStorageDriver() - - class ServerTypeField(fields.BaseEnumField): AUTO_TYPE = ServerType() diff --git a/magnum/tests/unit/objects/test_objects.py b/magnum/tests/unit/objects/test_objects.py index 0f9c3debd0..16d1f5c13a 100644 --- a/magnum/tests/unit/objects/test_objects.py +++ b/magnum/tests/unit/objects/test_objects.py @@ -356,7 +356,7 @@ class TestObject(test_base.TestCase, _TestObject): # http://docs.openstack.org/developer/magnum/objects.html object_data = { 'Cluster': '1.16-7a544c5059697c464810470980f81ba1', - 'ClusterTemplate': '1.17-f1ce5212b46506360b41ab5cb7658af4', + 'ClusterTemplate': '1.18-7fa94f4fdd027acfb4f022f202afdfb5', 'Certificate': '1.1-1924dc077daa844f0f9076332ef96815', 'MyObj': '1.0-34c4b1aadefd177b13f9a2f894cc23cd', 'X509KeyPair': '1.2-d81950af36c59a71365e33ce539d24f9', diff --git a/releasenotes/notes/bug-1722522-d94743c6362a5e48.yaml b/releasenotes/notes/bug-1722522-d94743c6362a5e48.yaml new file mode 100644 index 0000000000..b4164fff5f --- /dev/null +++ b/releasenotes/notes/bug-1722522-d94743c6362a5e48.yaml @@ -0,0 +1,10 @@ +--- +features: + - | + Allow any value to be passed on the docker_storage_driver field by turning it + into a StringField (was EnumField), and remove the constraints limiting the + values to 'devicemapper' and 'overlay'. +upgrade: + - | + Requires a db upgrade to change the docker_storage_driver + field to be a string instead of an enum.