fuel-web/nailgun/nailgun/test/integration/test_roles.py

182 lines
5.8 KiB
Python

# -*- coding: utf-8 -*-
# Copyright 2013 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.
import json
from sqlalchemy.exc import IntegrityError
from nailgun.db import db
from nailgun.db.sqlalchemy.models import Role
from nailgun.test.base import BaseIntegrationTest
from nailgun.test.base import reverse
class TestRoles(BaseIntegrationTest):
def test_roles_update(self):
self.env.create_release()
resp = self.app.get(
reverse('ReleaseCollectionHandler'),
headers=self.default_headers
)
test_role_name = "testrole"
release_json = json.loads(resp.body)[0]
old_roles = set(release_json["roles"])
release_json["roles"].append(test_role_name)
resp = self.app.put(
reverse('ReleaseHandler',
kwargs={"obj_id": release_json["id"]}),
json.dumps(release_json),
headers=self.default_headers
)
new_roles = json.loads(resp.body)["roles"]
self.assertIn(test_role_name, new_roles)
self.assertLessEqual(old_roles, set(new_roles))
def test_roles_add_and_remove(self):
self.env.create_release()
resp = self.app.get(
reverse('ReleaseCollectionHandler'),
headers=self.default_headers
)
test_role_name = "testrole"
release_json = json.loads(resp.body)[0]
old_roles = release_json["roles"]
release_json["roles"].append(test_role_name)
release_json["roles"].remove(old_roles[0])
expected_roles = list(release_json["roles"])
resp = self.app.put(
reverse('ReleaseHandler',
kwargs={"obj_id": release_json["id"]}),
json.dumps(release_json),
headers=self.default_headers
)
new_roles = json.loads(resp.body)["roles"]
self.assertEqual(expected_roles, new_roles)
def test_roles_add_duplicated_through_handler(self):
self.env.create_release()
resp = self.app.get(
reverse('ReleaseCollectionHandler'),
headers=self.default_headers
)
test_role_name = "testrole"
release_json = json.loads(resp.body)[0]
old_roles = release_json["roles"]
release_json["roles"].append(test_role_name)
expected_roles = list(release_json["roles"])
# add some duplicates
release_json["roles"].extend(old_roles)
resp = self.app.put(
reverse('ReleaseHandler',
kwargs={"obj_id": release_json["id"]}),
json.dumps(release_json),
headers=self.default_headers
)
new_roles = json.loads(resp.body)["roles"]
self.assertEqual(expected_roles, new_roles)
def test_roles_add_duplicated_to_db_directly(self):
self.env.create_release()
resp = self.app.get(
reverse('ReleaseCollectionHandler'),
headers=self.default_headers
)
release_json = json.loads(resp.body)[0]
old_roles = list(release_json["roles"])
role = Role(name=old_roles[0],
release_id=release_json["id"])
added = True
try:
db().add(role)
db().commit()
except IntegrityError:
db.rollback()
added = False
self.assertFalse(added)
resp = self.app.get(
reverse('ReleaseCollectionHandler'),
headers=self.default_headers
)
release_json = json.loads(resp.body)[0]
new_roles = list(release_json["roles"])
self.assertEqual(old_roles, new_roles)
def test_roles_delete(self):
self.env.create_release()
resp = self.app.get(
reverse('ReleaseCollectionHandler'),
headers=self.default_headers
)
release_json = json.loads(resp.body)[0]
old_roles = release_json["roles"]
removed_role = release_json["roles"][0]
release_json["roles"] = release_json["roles"][1:]
resp = self.app.put(
reverse('ReleaseHandler',
kwargs={"obj_id": release_json["id"]}),
json.dumps(release_json),
headers=self.default_headers
)
new_roles = json.loads(resp.body)["roles"]
self.assertLess(len(new_roles), len(old_roles))
self.assertNotIn(removed_role, new_roles)
def test_roles_failed_to_delete_assigned(self):
self.env.create(
cluster_kwargs={},
nodes_kwargs=[
{"status": "ready", "roles": ["controller"]}
]
)
resp = self.app.get(
reverse('ReleaseCollectionHandler'),
headers=self.default_headers
)
release_json = json.loads(resp.body)[0]
old_roles = set(release_json["roles"])
old_roles.remove("controller")
release_json["roles"] = list(old_roles)
resp = self.app.put(
reverse(
'ReleaseHandler',
kwargs={
"obj_id": release_json["id"]
}
),
json.dumps(release_json),
headers=self.default_headers,
expect_errors=True
)
self.assertEqual(resp.status_code, 400)
self.assertEqual(
resp.body,
"Cannot delete roles already assigned to nodes: controller"
)