| # Licensed to the Apache Software Foundation (ASF) under one |
| # or more contributor license agreements. See the NOTICE file |
| # distributed with this work for additional information |
| # regarding copyright ownership. The ASF licenses this file |
| # to you 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 marvin.cloudstackAPI import * |
| from marvin.cloudstackTestCase import cloudstackTestCase |
| from marvin.lib.base import Account, Role, User |
| from marvin.lib.utils import cleanup_resources |
| from nose.plugins.attrib import attr |
| |
| import random |
| |
| |
| class TestData(object): |
| """Test data object that is required to create resources |
| """ |
| def __init__(self): |
| self.testdata = { |
| "accountadmin": { |
| "email": "mtu@test.cloud", |
| "firstname": "Marvin", |
| "lastname": "TestAdminAccount", |
| "username": "TestAdminAccount", |
| "password": "password" |
| }, |
| "accountdomainadmin": { |
| "email": "mtu@test.cloud", |
| "firstname": "Marvin", |
| "lastname": "TestDomainAdminAccount", |
| "username": "TestDomainAdminAccount", |
| "password": "password" |
| }, |
| "accountroleuser": { |
| "email": "mtu@test.cloud", |
| "firstname": "Marvin", |
| "lastname": "TestUserAccount", |
| "username": "TestUserAccount", |
| "password": "password" |
| }, |
| "roleadmin": { |
| "name": "MarvinFake Admin Role ", |
| "type": "Admin", |
| "description": "Fake Admin Role created by Marvin test" |
| }, |
| "roleuser": { |
| "name": "MarvinFake User Role ", |
| "type": "User", |
| "description": "Fake User Role created by Marvin test", |
| "ispublic": False |
| }, |
| "publicrole": { |
| "name": "MarvinFake Public Role ", |
| "type": "User", |
| "description": "Fake Public Role created by Marvin test" |
| }, |
| "importrole": { |
| "name": "MarvinFake Import Role ", |
| "type": "User", |
| "description": "Fake Import User Role created by Marvin test", |
| "ispublic": True, |
| "rules": [{"rule":"list*", "permission":"allow","description":"Listing apis"}, |
| {"rule":"get*", "permission":"allow","description":"Get apis"}, |
| {"rule":"update*", "permission":"deny","description":"Update apis"}] |
| }, |
| "roledomainadmin": { |
| "name": "MarvinFake DomainAdmin Role ", |
| "type": "DomainAdmin", |
| "description": "Fake Domain-Admin Role created by Marvin test", |
| "ispublic": False |
| }, |
| "apiConfig": { |
| "listApis": "allow", |
| "listAccounts": "allow", |
| "listClusters": "deny", |
| "*VM*": "allow", |
| "*Host*": "deny" |
| } |
| } |
| |
| |
| class TestPrivateRoles(cloudstackTestCase): |
| """Tests Visibility of private and public roles |
| """ |
| |
| def setUp(self): |
| self.apiclient = self.testClient.getApiClient() |
| self.testdata = TestData().testdata |
| |
| self.testdata["roleadmin"]["name"] += self.getRandomString() |
| self.testdata["roledomainadmin"]["name"] += self.getRandomString() |
| self.testdata["roleuser"]["name"] += self.getRandomString() |
| self.cleanup = [] |
| |
| self.role_admin = Role.create( |
| self.apiclient, |
| self.testdata["roleadmin"] |
| ) |
| self.cleanup.append(self.role_admin) |
| |
| self.role_domain_admin = Role.create( |
| self.apiclient, |
| self.testdata["roledomainadmin"] |
| ) |
| self.cleanup.append(self.role_domain_admin) |
| |
| self.private_role = Role.create( |
| self.apiclient, |
| self.testdata["roleuser"] |
| ) |
| self.cleanup.append(self.private_role) |
| |
| self.account_admin = Account.create( |
| self.apiclient, |
| self.testdata["accountadmin"], |
| roleid=self.role_admin.id |
| ) |
| self.cleanup.append(self.account_admin) |
| |
| self.account_domain_admin = Account.create( |
| self.apiclient, |
| self.testdata["accountdomainadmin"], |
| roleid=self.role_domain_admin.id |
| ) |
| self.cleanup.append(self.account_domain_admin) |
| |
| self.admin_apiclient = self.testClient.getUserApiClient( |
| UserName=self.account_admin.name, |
| DomainName='ROOT', |
| type=1 |
| ) |
| |
| self.domain_admin_apiclient = self.testClient.getUserApiClient( |
| UserName=self.account_domain_admin.name, |
| DomainName='ROOT', |
| type=2 |
| ) |
| |
| def tearDown(self): |
| super(TestPrivateRoles, self).tearDown() |
| |
| def getRandomString(self): |
| return "".join(random.choice("abcdefghijklmnopqrstuvwxyz0123456789") for _ in range(10)) |
| |
| def asserts_visibility_of_private_role(self, role_id): |
| list_roles_domain_admin = Role.list(self.domain_admin_apiclient, id=role_id) |
| self.assertEqual( |
| list_roles_domain_admin, |
| None, |
| "Domain Admins should not be able to list private roles" |
| ) |
| |
| list_roles_admin = Role.list(self.admin_apiclient, id=role_id) |
| self.assertNotEqual( |
| list_roles_admin, |
| None, |
| "Admins should be able to list private roles" |
| ) |
| |
| def asserts_visibility_of_public_role(self, role_id): |
| list_roles_domain_admin = Role.list(self.domain_admin_apiclient, id=role_id) |
| self.assertNotEqual( |
| list_roles_domain_admin, |
| None, |
| "Domain Admins should be able to list public roles" |
| ) |
| |
| list_roles_admin = Role.list(self.admin_apiclient, id=role_id) |
| self.assertNotEqual( |
| list_roles_admin, |
| None, |
| "Admins should be able to list public roles" |
| ) |
| |
| @attr(tags=['simulator', 'basic'], required_hardware=False) |
| def test_create_role(self): |
| """ |
| 1. Create a private role |
| 2. Create a public role |
| 3. Verify whether their visibility is as expected |
| """ |
| self.testdata["roleuser"]["name"] += self.getRandomString() |
| self.testdata["publicrole"]["name"] += self.getRandomString() |
| private_role = Role.create( |
| self.apiclient, |
| self.testdata["roleuser"] |
| ) |
| self.cleanup.append(self.private_role) |
| public_role = Role.create( |
| self.apiclient, |
| self.testdata["publicrole"] |
| ) |
| self.cleanup.append(self.public_role) |
| self.asserts_visibility_of_private_role(private_role.id) |
| self.asserts_visibility_of_public_role(public_role.id) |
| |
| @attr(tags=['simulator', 'basic'], required_hardware=False) |
| def test_update_role(self): |
| """ |
| 1. Create a public role |
| 2. Check if its visibility is public |
| 3. Update it to make it private |
| 4. Verify if its visibility is private |
| """ |
| self.testdata["publicrole"]["name"] += self.getRandomString() |
| role = Role.create( |
| self.apiclient, |
| self.testdata["publicrole"] |
| ) |
| self.cleanup.append(role) |
| self.asserts_visibility_of_public_role(role.id) |
| role.update(self.apiclient, id=role.id, ispublic=False) |
| self.asserts_visibility_of_private_role(role.id) |
| |
| @attr(tags=['simulator', 'basic'], required_hardware=False) |
| def test_import_role(self): |
| """ |
| 1. Import a public role |
| 2. Import a private role |
| 3. Verify their visibility |
| """ |
| self.testdata["importrole"]["name"] += self.getRandomString() |
| imported_public_role = Role.importRole( |
| self.apiclient, |
| self.testdata["importrole"] |
| ) |
| self.cleanup.append(imported_public_role) |
| self.testdata["importrole"]["name"] += self.getRandomString() |
| self.testdata["importrole"]["ispublic"] = False |
| imported_private_role = Role.importRole( |
| self.apiclient, |
| self.testdata["importrole"] |
| ) |
| self.cleanup.append(imported_private_role) |
| |
| self.asserts_visibility_of_public_role(imported_public_role.id) |
| self.asserts_visibility_of_private_role(imported_private_role.id) |
| |
| @attr(tags=['simulator', 'basic'], required_hardware=False) |
| def test_login_private_role(self): |
| """ |
| 1. Crate a User account with a private role |
| 2. Login with the created account |
| 3. Verify that the login was successful |
| """ |
| account_private_role = Account.create( |
| self.apiclient, |
| self.testdata["accountroleuser"], |
| roleid=self.private_role.id |
| ) |
| self.cleanup.append(account_private_role) |
| |
| response = User.login( |
| self.apiclient, |
| username=account_private_role.name, |
| password=self.testdata["accountroleuser"]["password"] |
| ) |
| |
| self.assertNotEqual( |
| response.sessionkey, |
| None, |
| "Accounts using private roles should be able to login." |
| ) |