fuel-web/nailgun/nailgun/test/unit/test_network_template_handl...

248 lines
8.3 KiB
Python

# -*- coding: utf-8 -*-
# Copyright 2015 Mirantis, 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.
from oslo_serialization import jsonutils
from nailgun.db import db
from nailgun import consts
from nailgun.test import base
from nailgun.test.base import BaseIntegrationTest
from nailgun.utils import reverse
class TestHandlers(BaseIntegrationTest):
def get_template(self, cluster_id, expect_errors=False):
resp = self.app.get(
reverse(
'TemplateNetworkConfigurationHandler',
kwargs={'cluster_id': cluster_id}
),
headers=self.default_headers,
expect_errors=expect_errors
)
return resp
def test_network_template_upload(self):
cluster = self.env.create_cluster(api=False)
template = self.env.read_fixtures(['network_template_80'])[0]
template.pop('pk') # PK is not needed
resp = self.app.put(
reverse(
'TemplateNetworkConfigurationHandler',
kwargs={'cluster_id': cluster.id},
),
jsonutils.dumps(template),
headers=self.default_headers
)
self.assertEqual(200, resp.status_code)
self.assertEquals(template, resp.json_body)
resp = self.get_template(cluster.id)
self.assertEqual(200, resp.status_code)
self.assertEqual(template, resp.json_body)
def test_network_template_add_node(self):
cluster = self.env.create(
release_kwargs={'version': '1111-9.0'},
cluster_kwargs={
'api': False,
'net_provider': consts.CLUSTER_NET_PROVIDERS.neutron
}
)
self.env.create_nodes_w_interfaces_count(
5,
if_count=15,
cluster_id=cluster.id,
status=consts.NODE_STATUSES.ready,
roles=["controller"],
iface_name_prefix='eno{0}'
)
template = self.env.read_fixtures(['network_template_90'])[3]
template.pop('pk') # PK is not needed
resp = self.app.put(
reverse(
'TemplateNetworkConfigurationHandler',
kwargs={'cluster_id': cluster.id},
),
jsonutils.dumps(template),
headers=self.default_headers
)
self.assertEqual(200, resp.status_code)
self.assertEquals(template, resp.json_body)
resp = self.get_template(cluster.id)
self.assertEqual(200, resp.status_code)
self.assertEqual(template, resp.json_body)
def test_network_template_upload_on_multi_group_cluster(self):
cluster = self.env.create_cluster(
api=False,
net_provider=consts.CLUSTER_NET_PROVIDERS.neutron
)
cluster.release.version = '1111-7.0'
custom_group_name = 'group-custom-1'
resp = self.env.create_node_group(
name=custom_group_name, cluster_id=cluster.id
)
custom_group = resp.json_body
node1 = self.env.create_nodes_w_interfaces_count(
1, 5,
cluster_id=cluster.id,
roles=["controller"],
)[0]
node2 = self.env.create_nodes_w_interfaces_count(
1, 5,
cluster_id=cluster.id,
roles=["compute"],
group_id=custom_group['id'],
)[0]
template = self.env.read_fixtures(['network_template_70'])[0]
template.pop('pk') # PK is not needed
resp = self.app.put(
reverse(
'TemplateNetworkConfigurationHandler',
kwargs={'cluster_id': cluster.id},
),
jsonutils.dumps(template),
headers=self.default_headers
)
self.assertEqual(200, resp.status_code)
self.assertDictEqual(
node1.network_template['templates'],
base.get_nodegroup_network_schema_template(template, 'default')
)
self.assertDictEqual(
node2.network_template['templates'],
base.get_nodegroup_network_schema_template(
template, custom_group_name)
)
def test_wrong_network_template_upload_failed(self):
cluster = self.env.create_cluster(api=False)
template = self.env.read_fixtures(['network_template_80'])[0]
template['adv_net_template']['default'] = {}
resp = self.app.put(
reverse(
'TemplateNetworkConfigurationHandler',
kwargs={'cluster_id': cluster.id},
),
jsonutils.dumps(template),
headers=self.default_headers,
expect_errors=True
)
self.assertEqual(400, resp.status_code)
def test_template_not_set(self):
resp = self.get_template(1, expect_errors=True)
self.assertEqual(404, resp.status_code)
def check_put_delete_template(self, cluster, forbidden=False):
template = self.env.read_fixtures(['network_template_80'])[0]
template.pop('pk') # PK is not needed
resp = self.app.put(
reverse(
'TemplateNetworkConfigurationHandler',
kwargs={'cluster_id': cluster.id},
),
jsonutils.dumps(template),
headers=self.default_headers,
expect_errors=forbidden
)
if not forbidden:
self.assertEqual(resp.status_code, 200)
else:
self.assertEqual(resp.status_code, 403)
resp = self.app.delete(
reverse(
'TemplateNetworkConfigurationHandler',
kwargs={'cluster_id': cluster.id},
),
headers=self.default_headers,
expect_errors=forbidden
)
if not forbidden:
self.assertEqual(resp.status_code, 204)
resp = self.get_template(cluster.id)
self.assertEquals(None, resp.json_body)
else:
self.assertEqual(resp.status_code, 403)
def test_put_delete_template(self):
cluster = self.env.create_cluster(api=False)
self.check_put_delete_template(cluster)
def test_put_delete_template_after_deployment(self):
cluster = self.env.create_cluster(api=False)
allowed = [consts.CLUSTER_STATUSES.new,
consts.CLUSTER_STATUSES.stopped,
consts.CLUSTER_STATUSES.operational,
consts.CLUSTER_STATUSES.error,
consts.CLUSTER_STATUSES.partially_deployed]
for status in consts.CLUSTER_STATUSES:
cluster.status = status
# need commit because rollback is called when handler exits with
# error (403 in this case)
db().commit()
self.check_put_delete_template(cluster, status not in allowed)
def test_network_template_upload_90(self):
cluster = self.env.create(
release_kwargs={'version': '1111-9.0'},
cluster_kwargs={
'api': True,
'net_provider': consts.CLUSTER_NET_PROVIDERS.neutron,
}
)
self.env.create_nodes_w_interfaces_count(
1,
if_count=15,
cluster_id=cluster.id,
status=consts.NODE_STATUSES.ready,
roles=["controller"],
iface_name_prefix='eno{0}'
)
template = self.env.read_fixtures(['network_template_90'])[3]
template.pop('pk') # PK is not needed
resp = self.app.put(
reverse(
'TemplateNetworkConfigurationHandler',
kwargs={'cluster_id': cluster.id},
),
jsonutils.dumps(template),
headers=self.default_headers
)
self.assertEqual(200, resp.status_code)
self.assertEquals(template, resp.json_body)
resp = self.get_template(cluster.id)
self.assertEqual(200, resp.status_code)
self.assertEqual(template, resp.json_body)