From f5a5af32a3a3abcb540a2c9c5b516df783c1dce2 Mon Sep 17 00:00:00 2001 From: Mark Goddard Date: Tue, 3 Jul 2018 19:26:13 +0100 Subject: [PATCH] Deploy steps - DB model Adds a 'deploy_step' column to the nodes table. Co-Authored-By: Ruby Loo Change-Id: I31286266f28b1fdcdfeb6002992f4eece25c6ac1 Story: #1753128 Task: #22592 --- .../b9117ac17882_add_node_deploy_step.py | 33 +++++++++++++++++++ ironic/db/sqlalchemy/models.py | 1 + ironic/tests/unit/api/utils.py | 3 ++ .../unit/db/sqlalchemy/test_migrations.py | 7 ++++ ironic/tests/unit/db/utils.py | 1 + 5 files changed, 45 insertions(+) create mode 100644 ironic/db/sqlalchemy/alembic/versions/b9117ac17882_add_node_deploy_step.py diff --git a/ironic/db/sqlalchemy/alembic/versions/b9117ac17882_add_node_deploy_step.py b/ironic/db/sqlalchemy/alembic/versions/b9117ac17882_add_node_deploy_step.py new file mode 100644 index 0000000000..6d2b286b33 --- /dev/null +++ b/ironic/db/sqlalchemy/alembic/versions/b9117ac17882_add_node_deploy_step.py @@ -0,0 +1,33 @@ +# All Rights Reserved. +# +# 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 deploy_step to node + +Revision ID: b9117ac17882 +Revises: fb3f10dd262e +Create Date: 2018-06-19 22:31:45.668156 + +""" + +from alembic import op +import sqlalchemy as sa + +# revision identifiers, used by Alembic. +revision = 'b9117ac17882' +down_revision = 'fb3f10dd262e' + + +def upgrade(): + op.add_column('nodes', sa.Column('deploy_step', sa.Text(), + nullable=True)) diff --git a/ironic/db/sqlalchemy/models.py b/ironic/db/sqlalchemy/models.py index f548758dc4..f7ca076c8e 100644 --- a/ironic/db/sqlalchemy/models.py +++ b/ironic/db/sqlalchemy/models.py @@ -144,6 +144,7 @@ class Node(Base): driver_info = Column(db_types.JsonEncodedDict) driver_internal_info = Column(db_types.JsonEncodedDict) clean_step = Column(db_types.JsonEncodedDict) + deploy_step = Column(db_types.JsonEncodedDict) resource_class = Column(String(80), nullable=True) raid_config = Column(db_types.JsonEncodedDict) diff --git a/ironic/tests/unit/api/utils.py b/ironic/tests/unit/api/utils.py index 233bea1a5d..0b4fab7ef4 100644 --- a/ironic/tests/unit/api/utils.py +++ b/ironic/tests/unit/api/utils.py @@ -100,6 +100,9 @@ def node_post_data(**kw): node.pop('chassis_id') node.pop('tags') node.pop('traits') + # TODO(mgoddard): Remove this once the deploy_step field is supported in + # the API. + node.pop('deploy_step') # NOTE(jroll): pop out fields that were introduced in later API versions, # unless explicitly requested. Otherwise, these will cause tests using diff --git a/ironic/tests/unit/db/sqlalchemy/test_migrations.py b/ironic/tests/unit/db/sqlalchemy/test_migrations.py index 94d408d66a..26f1920197 100644 --- a/ironic/tests/unit/db/sqlalchemy/test_migrations.py +++ b/ironic/tests/unit/db/sqlalchemy/test_migrations.py @@ -719,6 +719,13 @@ class MigrationCheckersMixin(object): self.assertIsInstance(nodes_tbl.c.fault.type, sqlalchemy.types.String) + def _check_b9117ac17882(self, engine, data): + nodes = db_utils.get_table(engine, 'nodes') + col_names = [column.name for column in nodes.c] + self.assertIn('deploy_step', col_names) + self.assertIsInstance(nodes.c.deploy_step.type, + sqlalchemy.types.String) + def test_upgrade_and_version(self): with patch_with_engine(self.engine): self.migration_api.upgrade('head') diff --git a/ironic/tests/unit/db/utils.py b/ironic/tests/unit/db/utils.py index b9da90741d..204b65a0fd 100644 --- a/ironic/tests/unit/db/utils.py +++ b/ironic/tests/unit/db/utils.py @@ -196,6 +196,7 @@ def get_test_node(**kw): 'driver_internal_info': kw.get('driver_internal_info', fake_internal_info), 'clean_step': kw.get('clean_step'), + 'deploy_step': kw.get('deploy_step'), 'properties': kw.get('properties', properties), 'reservation': kw.get('reservation'), 'maintenance': kw.get('maintenance', False),