:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: : Copyright (c) 2017 Enea AB, Cavium and others. : : All rights reserved. This program and the accompanying materials : are made available under the terms of the Apache License, Version 2.0 : which accompanies this distribution, and is available at : http://www.apache.org/licenses/LICENSE-2.0 :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: From: Stanislaw Kardach Date: Sun, 18 Dec 2016 21:28:21 +0100 Subject: [PATCH] Add arch to nailgun release and target image This is required so that the TestVM image is created using a cirros image that is compatible with the architecture of the deployment setup. As a bonus, it is also used when building the target image. [ Alexandru Avadanii ] Rebased onto Newton. Signed-off-by: Alexandru Avadanii Signed-off-by: Stanislaw Kardach --- nailgun/nailgun/consts.py | 5 ++ .../alembic_migrations/versions/armband.py | 53 ++++++++++++++++++++++ nailgun/nailgun/db/sqlalchemy/models/release.py | 8 ++++ nailgun/nailgun/fixtures/openstack.yaml | 5 ++ .../nailgun/orchestrator/deployment_serializers.py | 8 +++- .../orchestrator/provisioning_serializers.py | 3 +- nailgun/nailgun/orchestrator/tasks_templates.py | 5 +- .../integration/test_cluster_changes_handler.py | 12 ++--- .../integration/test_orchestrator_serializer.py | 4 +- nailgun/nailgun/test/unit/test_tasks_templates.py | 6 ++- 10 files changed, 95 insertions(+), 14 deletions(-) create mode 100644 nailgun/nailgun/db/migration/alembic_migrations/versions/armband.py diff --git a/nailgun/nailgun/consts.py b/nailgun/nailgun/consts.py index ccbe860..a3875ce 100644 --- a/nailgun/nailgun/consts.py +++ b/nailgun/nailgun/consts.py @@ -38,6 +38,11 @@ RELEASE_OS = Enum( ) ) +RELEASE_ARCHS = Enum( + 'amd64', + 'arm64' +) + CLUSTER_MODES = Enum( 'multinode', 'ha_full', diff --git a/nailgun/nailgun/db/migration/alembic_migrations/versions/armband.py b/nailgun/nailgun/db/migration/alembic_migrations/versions/armband.py new file mode 100644 index 0000000..6e42b3f --- /dev/null +++ b/nailgun/nailgun/db/migration/alembic_migrations/versions/armband.py @@ -0,0 +1,53 @@ +# Copyright 2016 Cavium, Inc. +# +# 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. + +"""Armband patches + +Revision ID: f9b7fd91ac19 +Revises: c6edea552f1e +Create Date: 2016-03-01 23:18:58.712617 + +""" + +# revision identifiers, used by Alembic. +revision = 'f9b7fd91ac19' +down_revision = 'c6edea552f1e' + +from alembic import op +from nailgun.utils.migration import drop_enum +import sqlalchemy as sa + +ENUMS = ( + 'release_arch', +) + + +def upgrade(): + add_release_arch() + + +def downgrade(): + remove_release_arch() + map(drop_enum, ENUMS) + + +def add_release_arch(): + arch_enum = sa.Enum('amd64', 'arm64', name='release_arch') + arch_enum.create(op.get_bind(), checkfirst=False) + op.add_column('releases', sa.Column('arch', arch_enum, nullable=False, + server_default='amd64')) + + +def remove_release_arch(): + op.drop_column('releases', 'arch') diff --git a/nailgun/nailgun/db/sqlalchemy/models/release.py b/nailgun/nailgun/db/sqlalchemy/models/release.py index a069b61..882d32c 100644 --- a/nailgun/nailgun/db/sqlalchemy/models/release.py +++ b/nailgun/nailgun/db/sqlalchemy/models/release.py @@ -40,6 +40,14 @@ class Release(Base): id = Column(Integer, primary_key=True) name = Column(Unicode(100), nullable=False) version = Column(String(30), nullable=False) + arch = Column( + Enum( + *consts.RELEASE_ARCHS, + name='release_arch' + ), + nullable=False, + default=consts.RELEASE_ARCHS.amd64 + ) description = Column(Unicode) operating_system = Column(String(50), nullable=False) state = Column( diff --git a/nailgun/nailgun/fixtures/openstack.yaml b/nailgun/nailgun/fixtures/openstack.yaml index ba967d7..c1d2a71 100644 --- a/nailgun/nailgun/fixtures/openstack.yaml +++ b/nailgun/nailgun/fixtures/openstack.yaml @@ -2113,6 +2113,7 @@ name: "Newton on CentOS 6.5" state: "unavailable" version: "newton-10.0" + arch: "amd64" operating_system: "CentOS" description: "This option will install the OpenStack Mitaka packages using a CentOS based operating system. With high availability features built in, you are getting a robust, enterprise-grade OpenStack deployment." attributes_metadata: @@ -2186,6 +2187,7 @@ fields: name: "Newton on Ubuntu 16.04" version: "newton-10.0" + arch: "amd64" operating_system: "Ubuntu" description: "This option will install the OpenStack Newton packages using Ubuntu as a base operating system. With high availability features built in, you are getting a robust, enterprise-grade OpenStack deployment." attributes_metadata: @@ -2417,6 +2419,7 @@ fields: name: "Newton on Ubuntu+UCA 16.04" version: "newton-10.0" + arch: "amd64" description: "This option will install the OpenStack Newton packages using Ubuntu as a base operating system, including Ubuntu Cloud Archive OpenStack packages. With high availability features built in, you are getting a robust, enterprise-grade OpenStack deployment." attributes_metadata: editable: @@ -2517,6 +2520,7 @@ fields: name: "Newton on Ubuntu 16.04 (aarch64)" version: "newton-10.0" + arch: "arm64" operating_system: "Ubuntu" description: "This option will install the OpenStack Newton packages using Ubuntu as a base operating system. With high availability features built in, you are getting a robust, enterprise-grade OpenStack deployment." attributes_metadata: @@ -2754,6 +2758,7 @@ fields: name: "Newton on Ubuntu+UCA 16.04 (aarch64)" version: "newton-10.0" + arch: "arm64" description: "This option will install the OpenStack Newton packages using Ubuntu as a base operating system, including Ubuntu Cloud Archive OpenStack packages. With high availability features built in, you are getting a robust, enterprise-grade OpenStack deployment." attributes_metadata: editable: diff --git a/nailgun/nailgun/orchestrator/deployment_serializers.py b/nailgun/nailgun/orchestrator/deployment_serializers.py index f983ae3..2f9cec2 100644 --- a/nailgun/nailgun/orchestrator/deployment_serializers.py +++ b/nailgun/nailgun/orchestrator/deployment_serializers.py @@ -261,7 +261,13 @@ class DeploymentMultinodeSerializer(object): img_dir = '/usr/share/cirros-testvm/' else: img_dir = '/opt/vm/' - image_data['img_path'] = '{0}cirros-x86_64-disk.img'.format(img_dir) + arch = node.cluster.release.arch + if arch == "amd64": + arch = "x86_64" + elif arch == "arm64": + arch = "aarch64" + image_data['img_path'] = '{0}cirros-{1}-disk.img'.format(img_dir, + arch) properties_data = {} diff --git a/nailgun/nailgun/orchestrator/provisioning_serializers.py b/nailgun/nailgun/orchestrator/provisioning_serializers.py index 7b2c6ac..f2c05e1 100644 --- a/nailgun/nailgun/orchestrator/provisioning_serializers.py +++ b/nailgun/nailgun/orchestrator/provisioning_serializers.py @@ -329,7 +329,8 @@ class ProvisioningSerializer61(ProvisioningSerializer): attrs['repo_setup']['repos'], attrs['provision'], cluster.id, - packages)) + packages, + cluster.release.arch)) PriorityStrategy().one_by_one(tasks) return tasks diff --git a/nailgun/nailgun/orchestrator/tasks_templates.py b/nailgun/nailgun/orchestrator/tasks_templates.py index 8252891..84bebe6 100644 --- a/nailgun/nailgun/orchestrator/tasks_templates.py +++ b/nailgun/nailgun/orchestrator/tasks_templates.py @@ -208,7 +208,7 @@ def make_reboot_task(uids, task): def make_provisioning_images_task( - uids, repos, provision_data, cid, packages): + uids, repos, provision_data, cid, packages, arch): conf = { 'repos': repos, 'image_data': provision_data['image_data'], @@ -230,7 +230,8 @@ def make_provisioning_images_task( "--image_build_dir /var/lib/fuel/ibp " "--log-file /var/log/fuel-agent-env-{0}.log " "--data_driver nailgun_build_image " - "--input_data '{1}'").format(cid, conf), + "--target_arch {1} " + "--input_data '{2}'").format(cid, arch, conf), 'timeout': settings.PROVISIONING_IMAGES_BUILD_TIMEOUT, 'retries': 1}}) diff --git a/nailgun/nailgun/test/integration/test_cluster_changes_handler.py b/nailgun/nailgun/test/integration/test_cluster_changes_handler.py index d7e964e..bce8289 100644 --- a/nailgun/nailgun/test/integration/test_cluster_changes_handler.py +++ b/nailgun/nailgun/test/integration/test_cluster_changes_handler.py @@ -148,7 +148,7 @@ class TestHandlers(BaseIntegrationTest): common_attrs['last_controller'] = controller_nodes[-1]['name'] common_attrs['storage']['pg_num'] = 128 - common_attrs['test_vm_image'] = { + common_attrs['test_vm_image'] = [{ 'container_format': 'bare', 'public': 'true', 'disk_format': 'qcow2', @@ -164,7 +164,7 @@ class TestHandlers(BaseIntegrationTest): 'murano_image_info': """'{"title": "Murano Demo", "type":""" """ "cirros.demo"}'""", }, - } + }] critical_mapping = { 'primary-controller': True, @@ -565,7 +565,7 @@ class TestHandlers(BaseIntegrationTest): common_attrs['last_controller'] = controller_nodes[-1]['name'] common_attrs['storage']['pg_num'] = 128 - common_attrs['test_vm_image'] = { + common_attrs['test_vm_image'] = [{ 'container_format': 'bare', 'public': 'true', 'disk_format': 'qcow2', @@ -581,7 +581,7 @@ class TestHandlers(BaseIntegrationTest): 'murano_image_info': """'{"title": "Murano Demo", "type":""" """ "cirros.demo"}'""", }, - } + }] critical_mapping = { 'primary-controller': True, @@ -1053,7 +1053,7 @@ class TestHandlers(BaseIntegrationTest): common_attrs['last_controller'] = controller_nodes[-1]['name'] common_attrs['storage']['pg_num'] = 128 - common_attrs['test_vm_image'] = { + common_attrs['test_vm_image'] = [{ 'container_format': 'bare', 'public': 'true', 'disk_format': 'qcow2', @@ -1069,7 +1069,7 @@ class TestHandlers(BaseIntegrationTest): 'murano_image_info': """'{"title": "Murano Demo", "type":""" """ "cirros.demo"}'""", }, - } + }] critical_mapping = { 'primary-controller': True, diff --git a/nailgun/nailgun/test/integration/test_orchestrator_serializer.py b/nailgun/nailgun/test/integration/test_orchestrator_serializer.py index f399602..6034f30 100644 --- a/nailgun/nailgun/test/integration/test_orchestrator_serializer.py +++ b/nailgun/nailgun/test/integration/test_orchestrator_serializer.py @@ -2565,12 +2565,12 @@ class BaseDeploymentSerializer(BaseSerializerTest): def check_no_murano_data(self): glance_properties = self.serializer.generate_test_vm_image_data( - self.env.nodes[0])['test_vm_image']['glance_properties'] + self.env.nodes[0])['test_vm_image'][0]['glance_properties'] self.assertNotIn('murano_image_info', glance_properties) def check_murano_data(self): glance_properties = self.serializer.generate_test_vm_image_data( - self.env.nodes[0])['test_vm_image']['glance_properties'] + self.env.nodes[0])['test_vm_image'][0]['glance_properties'] self.assertIn('murano_image_info', glance_properties) @staticmethod diff --git a/nailgun/nailgun/test/unit/test_tasks_templates.py b/nailgun/nailgun/test/unit/test_tasks_templates.py index 4db183f..4f5d2cb 100644 --- a/nailgun/nailgun/test/unit/test_tasks_templates.py +++ b/nailgun/nailgun/test/unit/test_tasks_templates.py @@ -140,7 +140,8 @@ class TestMakeTask(base.BaseTestCase): } }}, cid=123, - packages=packages + packages=packages, + arch='amd64' ) fuel_image_conf = { @@ -177,7 +178,8 @@ class TestMakeTask(base.BaseTestCase): cmd = result["parameters"]["cmd"].lstrip( "fa_build_image --image_build_dir /var/lib/fuel/ibp " "--log-file /var/log/fuel-agent-env-123.log " - "--data_driver nailgun_build_image --input_data '").rstrip("'") + "--data_driver nailgun_build_image --target_arch amd64" + " --input_data '").rstrip("'") self.assertEqual(jsonutils.loads(cmd), fuel_image_conf) def test_generate_ironic_bootstrap_keys_task(self):