c90006920ff21438d63dd441d3659cfc0e1fba2b
[armband.git] / patches / fuel-web / 0002-Add-arch-to-nailgun-release-and-target-image.patch
1 From: Stanislaw Kardach <stanislaw.kardach@caviumnetworks.com>
2 Date: Wed, 24 Feb 2016 20:11:54 +0100
3 Subject: [PATCH] Add arch to nailgun release and target image
4
5 This is required so that the TestVM image is created using a cirros
6 image that is compatible with the architecture of the deployment setup.
7 As a bonus, it is also used when building the target image.
8 ---
9  nailgun/nailgun/consts.py                          |  5 ++
10  .../alembic_migrations/versions/armband.py         | 53 ++++++++++++++++++++++
11  nailgun/nailgun/db/sqlalchemy/models/release.py    |  8 ++++
12  nailgun/nailgun/fixtures/openstack.yaml            |  5 ++
13  .../nailgun/orchestrator/deployment_serializers.py |  9 +++-
14  .../orchestrator/provisioning_serializers.py       |  3 +-
15  nailgun/nailgun/orchestrator/tasks_templates.py    |  5 +-
16  .../integration/test_cluster_changes_handler.py    | 12 ++---
17  .../integration/test_orchestrator_serializer.py    |  4 +-
18  nailgun/nailgun/test/unit/test_tasks_templates.py  |  6 ++-
19  10 files changed, 96 insertions(+), 14 deletions(-)
20  create mode 100644 nailgun/nailgun/db/migration/alembic_migrations/versions/armband.py
21
22 diff --git a/nailgun/nailgun/consts.py b/nailgun/nailgun/consts.py
23 index 1ded0ba..5a1af0a 100644
24 --- a/nailgun/nailgun/consts.py
25 +++ b/nailgun/nailgun/consts.py
26 @@ -38,6 +38,11 @@ RELEASE_OS = Enum(
27      )
28  )
29  
30 +RELEASE_ARCHS = Enum(
31 +    'amd64',
32 +    'arm64'
33 +)
34 +
35  CLUSTER_MODES = Enum(
36      'multinode',
37      'ha_full',
38 diff --git a/nailgun/nailgun/db/migration/alembic_migrations/versions/armband.py b/nailgun/nailgun/db/migration/alembic_migrations/versions/armband.py
39 new file mode 100644
40 index 0000000..8cca69c
41 --- /dev/null
42 +++ b/nailgun/nailgun/db/migration/alembic_migrations/versions/armband.py
43 @@ -0,0 +1,53 @@
44 +#    Copyright 2016 Cavium, Inc.
45 +#
46 +#    Licensed under the Apache License, Version 2.0 (the "License"); you may
47 +#    not use this file except in compliance with the License. You may obtain
48 +#    a copy of the License at
49 +#
50 +#         http://www.apache.org/licenses/LICENSE-2.0
51 +#
52 +#    Unless required by applicable law or agreed to in writing, software
53 +#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
54 +#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
55 +#    License for the specific language governing permissions and limitations
56 +#    under the License.
57 +
58 +"""Armband patches
59 +
60 +Revision ID: f9b7fd91ac19
61 +Revises: 43b2cb64dae6
62 +Create Date: 2016-03-01 23:18:58.712617
63 +
64 +"""
65 +
66 +# revision identifiers, used by Alembic.
67 +revision = 'f9b7fd91ac19'
68 +down_revision = '43b2cb64dae6'
69 +
70 +from alembic import op
71 +from nailgun.utils.migration import drop_enum
72 +import sqlalchemy as sa
73 +
74 +ENUMS = (
75 +    'release_arch',
76 +)
77 +
78 +
79 +def upgrade():
80 +    add_release_arch()
81 +
82 +
83 +def downgrade():
84 +    remove_release_arch()
85 +    map(drop_enum, ENUMS)
86 +
87 +
88 +def add_release_arch():
89 +    arch_enum = sa.Enum('amd64', 'arm64', name='release_arch')
90 +    arch_enum.create(op.get_bind(), checkfirst=False)
91 +    op.add_column('releases', sa.Column('arch', arch_enum, nullable=False,
92 +                  server_default='amd64'))
93 +
94 +
95 +def remove_release_arch():
96 +    op.drop_column('releases', 'arch')
97 diff --git a/nailgun/nailgun/db/sqlalchemy/models/release.py b/nailgun/nailgun/db/sqlalchemy/models/release.py
98 index 1b47de4..e209e72 100644
99 --- a/nailgun/nailgun/db/sqlalchemy/models/release.py
100 +++ b/nailgun/nailgun/db/sqlalchemy/models/release.py
101 @@ -39,6 +39,14 @@ class Release(Base):
102      id = Column(Integer, primary_key=True)
103      name = Column(Unicode(100), nullable=False)
104      version = Column(String(30), nullable=False)
105 +    arch = Column(
106 +        Enum(
107 +            *consts.RELEASE_ARCHS,
108 +            name='release_arch'
109 +        ),
110 +        nullable=False,
111 +        default=consts.RELEASE_ARCHS.amd64
112 +    )
113      description = Column(Unicode)
114      operating_system = Column(String(50), nullable=False)
115      state = Column(
116 diff --git a/nailgun/nailgun/fixtures/openstack.yaml b/nailgun/nailgun/fixtures/openstack.yaml
117 index 9674d66..d3226da 100644
118 --- a/nailgun/nailgun/fixtures/openstack.yaml
119 +++ b/nailgun/nailgun/fixtures/openstack.yaml
120 @@ -1904,6 +1904,7 @@
121      name: "Mitaka on CentOS 6.5"
122      state: "unavailable"
123      version: "mitaka-9.0"
124 +    arch: "amd64"
125      operating_system: "CentOS"
126      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."
127      attributes_metadata:
128 @@ -1978,6 +1979,7 @@
129    fields:
130      name: "Mitaka on Ubuntu 14.04"
131      version: "mitaka-9.0"
132 +    arch: "amd64"
133      operating_system: "Ubuntu"
134      description: "This option will install the OpenStack Mitaka packages using Ubuntu as a base operating system. With high availability features built in, you are getting a robust, enterprise-grade OpenStack deployment."
135      attributes_metadata:
136 @@ -2219,6 +2221,7 @@
137    fields:
138      name: "Mitaka on Ubuntu+UCA 14.04"
139      version: "mitaka-9.0"
140 +    arch: "amd64"
141      description: "This option will install the OpenStack Mitaka 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."
142      attributes_metadata:
143        editable:
144 @@ -2320,6 +2323,7 @@
145    fields:
146      name: "Mitaka on Ubuntu 14.04 (aarch64)"
147      version: "mitaka-9.0"
148 +    arch: "arm64"
149      operating_system: "Ubuntu"
150      description: "This option will install the OpenStack Mitaka packages using Ubuntu as a base operating system. With high availability features built in, you are getting a robust, enterprise-grade OpenStack deployment."
151      attributes_metadata:
152 @@ -2506,6 +2510,7 @@
153    fields:
154      name: "Mitaka on Ubuntu+UCA 14.04 (aarch64)"
155      version: "mitaka-9.0"
156 +    arch: "arm64"
157      description: "This option will install the OpenStack Mitaka 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."
158      attributes_metadata:
159        editable:
160 diff --git a/nailgun/nailgun/orchestrator/deployment_serializers.py b/nailgun/nailgun/orchestrator/deployment_serializers.py
161 index 699a599..6bb7990 100644
162 --- a/nailgun/nailgun/orchestrator/deployment_serializers.py
163 +++ b/nailgun/nailgun/orchestrator/deployment_serializers.py
164 @@ -300,7 +300,14 @@ class DeploymentMultinodeSerializer(object):
165              img_dir = '/usr/share/cirros-testvm/'
166          else:
167              img_dir = '/opt/vm/'
168 -        image_data['img_path'] = '{0}cirros-x86_64-disk.img'.format(img_dir)
169 +        release = self.current_release(node.cluster)
170 +        arch = release.arch
171 +        if arch == "amd64":
172 +            arch = "x86_64"
173 +        elif arch == "arm64":
174 +            arch = "aarch64"
175 +        image_data['img_path'] = '{0}cirros-{1}-disk.img'.format(img_dir,
176 +            arch)
177  
178          glance_properties = []
179  
180 diff --git a/nailgun/nailgun/orchestrator/provisioning_serializers.py b/nailgun/nailgun/orchestrator/provisioning_serializers.py
181 index 48a4753..b1f3ca6 100644
182 --- a/nailgun/nailgun/orchestrator/provisioning_serializers.py
183 +++ b/nailgun/nailgun/orchestrator/provisioning_serializers.py
184 @@ -307,7 +307,8 @@ class ProvisioningSerializer61(ProvisioningSerializer):
185                      attrs['repo_setup']['repos'],
186                      attrs['provision'],
187                      cluster.id,
188 -                    packages))
189 +                    packages,
190 +                    cluster.release.arch))
191  
192          # NOTE(kozhukalov): This pre-provision task is going to be
193          # removed by 7.0 because we need this only for classic way of
194 diff --git a/nailgun/nailgun/orchestrator/tasks_templates.py b/nailgun/nailgun/orchestrator/tasks_templates.py
195 index 51dfdf7..bc2bff9 100644
196 --- a/nailgun/nailgun/orchestrator/tasks_templates.py
197 +++ b/nailgun/nailgun/orchestrator/tasks_templates.py
198 @@ -210,7 +210,7 @@ def make_reboot_task(uids, task):
199  
200  
201  def make_provisioning_images_task(
202 -        uids, repos, provision_data, cid, packages):
203 +        uids, repos, provision_data, cid, packages, arch):
204      conf = {
205          'repos': repos,
206          'image_data': provision_data['image_data'],
207 @@ -232,7 +232,8 @@ def make_provisioning_images_task(
208                      "--image_build_dir /var/lib/fuel/ibp "
209                      "--log-file /var/log/fuel-agent-env-{0}.log "
210                      "--data_driver nailgun_build_image "
211 -                    "--input_data '{1}'").format(cid, conf),
212 +                    "--target_arch {1} "
213 +                    "--input_data '{2}'").format(cid, arch, conf),
214              'timeout': settings.PROVISIONING_IMAGES_BUILD_TIMEOUT,
215              'retries': 1}})
216  
217 diff --git a/nailgun/nailgun/test/integration/test_cluster_changes_handler.py b/nailgun/nailgun/test/integration/test_cluster_changes_handler.py
218 index 0f212e5..da50eac 100644
219 --- a/nailgun/nailgun/test/integration/test_cluster_changes_handler.py
220 +++ b/nailgun/nailgun/test/integration/test_cluster_changes_handler.py
221 @@ -153,7 +153,7 @@ class TestHandlers(BaseIntegrationTest):
222          common_attrs['last_controller'] = controller_nodes[-1]['name']
223          common_attrs['storage']['pg_num'] = 128
224  
225 -        common_attrs['test_vm_image'] = {
226 +        common_attrs['test_vm_image'] = [{
227              'container_format': 'bare',
228              'public': 'true',
229              'disk_format': 'qcow2',
230 @@ -165,7 +165,7 @@ class TestHandlers(BaseIntegrationTest):
231                  """--property murano_image_info="""
232                  """'{"title": "Murano Demo", "type": "cirros.demo"}'"""
233              ),
234 -        }
235 +        }]
236  
237          critical_mapping = {
238              'primary-controller': True,
239 @@ -565,7 +565,7 @@ class TestHandlers(BaseIntegrationTest):
240          common_attrs['last_controller'] = controller_nodes[-1]['name']
241          common_attrs['storage']['pg_num'] = 128
242  
243 -        common_attrs['test_vm_image'] = {
244 +        common_attrs['test_vm_image'] = [{
245              'container_format': 'bare',
246              'public': 'true',
247              'disk_format': 'qcow2',
248 @@ -577,7 +577,7 @@ class TestHandlers(BaseIntegrationTest):
249                  """--property murano_image_info="""
250                  """'{"title": "Murano Demo", "type": "cirros.demo"}'"""
251              ),
252 -        }
253 +        }]
254  
255          critical_mapping = {
256              'primary-controller': True,
257 @@ -1049,7 +1049,7 @@ class TestHandlers(BaseIntegrationTest):
258          common_attrs['last_controller'] = controller_nodes[-1]['name']
259          common_attrs['storage']['pg_num'] = 128
260  
261 -        common_attrs['test_vm_image'] = {
262 +        common_attrs['test_vm_image'] = [{
263              'container_format': 'bare',
264              'public': 'true',
265              'disk_format': 'qcow2',
266 @@ -1061,7 +1061,7 @@ class TestHandlers(BaseIntegrationTest):
267                  """--property murano_image_info="""
268                  """'{"title": "Murano Demo", "type": "cirros.demo"}'"""
269              ),
270 -        }
271 +        }]
272  
273          critical_mapping = {
274              'primary-controller': True,
275 diff --git a/nailgun/nailgun/test/integration/test_orchestrator_serializer.py b/nailgun/nailgun/test/integration/test_orchestrator_serializer.py
276 index 5db8f4e..ef208cb 100644
277 --- a/nailgun/nailgun/test/integration/test_orchestrator_serializer.py
278 +++ b/nailgun/nailgun/test/integration/test_orchestrator_serializer.py
279 @@ -2584,12 +2584,12 @@ class BaseDeploymentSerializer(BaseSerializerTest):
280  
281      def check_no_murano_data(self):
282          glance_properties = self.serializer.generate_test_vm_image_data(
283 -            self.env.nodes[0])['test_vm_image']['glance_properties']
284 +            self.env.nodes[0])['test_vm_image'][0]['glance_properties']
285          self.assertNotIn('murano_image_info', glance_properties)
286  
287      def check_murano_data(self):
288          glance_properties = self.serializer.generate_test_vm_image_data(
289 -            self.env.nodes[0])['test_vm_image']['glance_properties']
290 +            self.env.nodes[0])['test_vm_image'][0]['glance_properties']
291          self.assertIn('murano_image_info', glance_properties)
292  
293  
294 diff --git a/nailgun/nailgun/test/unit/test_tasks_templates.py b/nailgun/nailgun/test/unit/test_tasks_templates.py
295 index 4e81a19..d657518 100644
296 --- a/nailgun/nailgun/test/unit/test_tasks_templates.py
297 +++ b/nailgun/nailgun/test/unit/test_tasks_templates.py
298 @@ -140,7 +140,8 @@ class TestMakeTask(base.BaseTestCase):
299                      }
300                  }},
301              cid=123,
302 -            packages=packages
303 +            packages=packages,
304 +            arch='amd64'
305          )
306  
307          fuel_image_conf = {
308 @@ -177,7 +178,8 @@ class TestMakeTask(base.BaseTestCase):
309          cmd = result["parameters"]["cmd"].lstrip(
310              "fa_build_image --image_build_dir /var/lib/fuel/ibp "
311              "--log-file /var/log/fuel-agent-env-123.log "
312 -            "--data_driver nailgun_build_image --input_data '").rstrip("'")
313 +            "--data_driver nailgun_build_image --target_arch amd64"
314 +            " --input_data '").rstrip("'")
315          self.assertEqual(jsonutils.loads(cmd), fuel_image_conf)
316  
317      def test_generate_ironic_bootstrap_keys_task(self):