mirror of
https://github.com/apache/cloudstack.git
synced 2025-10-26 08:42:29 +01:00
295 lines
10 KiB
Python
295 lines
10 KiB
Python
# 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.
|
|
""" P1 tests for Account
|
|
"""
|
|
# Import Local Modules
|
|
from marvin.cloudstackTestCase import cloudstackTestCase
|
|
from marvin.lib.utils import (random_gen,
|
|
cleanup_resources,
|
|
validateList)
|
|
from marvin.cloudstackAPI import *
|
|
from marvin.lib.base import (Domain,
|
|
Account,
|
|
ServiceOffering,
|
|
VirtualMachine,
|
|
Network,
|
|
User,
|
|
Template,
|
|
Role)
|
|
from marvin.lib.common import (get_domain,
|
|
get_zone,
|
|
get_test_template,
|
|
list_accounts,
|
|
list_virtual_machines,
|
|
list_service_offering,
|
|
list_templates,
|
|
list_users,
|
|
wait_for_cleanup)
|
|
from nose.plugins.attrib import attr
|
|
from marvin.cloudstackException import CloudstackAPIException
|
|
from marvin.codes import PASS
|
|
import time
|
|
|
|
from pyVmomi.VmomiSupport import GetVersionFromVersionUri
|
|
|
|
class Services:
|
|
|
|
"""Test Account Services
|
|
"""
|
|
|
|
def __init__(self):
|
|
self.services = {
|
|
"domain": {
|
|
"name": "Domain",
|
|
},
|
|
"account": {
|
|
"email": "test@test.com",
|
|
"firstname": "Test",
|
|
"lastname": "User",
|
|
"username": "test",
|
|
# Random characters are appended for unique
|
|
# username
|
|
"password": "fr3sca",
|
|
},
|
|
"role": {
|
|
"name": "User Role",
|
|
"type": "User",
|
|
"description": "User Role created by Marvin test"
|
|
},
|
|
"user": {
|
|
"email": "user@test.com",
|
|
"firstname": "User",
|
|
"lastname": "User",
|
|
"username": "User",
|
|
# Random characters are appended for unique
|
|
# username
|
|
"password": "fr3sca",
|
|
},
|
|
"service_offering": {
|
|
"name": "Tiny Instance",
|
|
"displaytext": "Tiny Instance",
|
|
"cpunumber": 1,
|
|
"cpuspeed": 100,
|
|
# in MHz
|
|
"memory": 128,
|
|
# In MBs
|
|
},
|
|
"virtual_machine": {
|
|
"displayname": "Test VM",
|
|
"username": "root",
|
|
"password": "password",
|
|
"ssh_port": 22,
|
|
"hypervisor": 'XenServer',
|
|
# Hypervisor type should be same as
|
|
# hypervisor type of cluster
|
|
"privateport": 22,
|
|
"publicport": 22,
|
|
"protocol": 'TCP',
|
|
},
|
|
"template": {
|
|
"displaytext": "Public Template",
|
|
"name": "Public template",
|
|
"ostype": 'CentOS 5.6 (64-bit)',
|
|
"url": "",
|
|
"hypervisor": '',
|
|
"format": '',
|
|
"isfeatured": True,
|
|
"ispublic": True,
|
|
"isextractable": True,
|
|
"templatefilter": "self"
|
|
},
|
|
"ostype": 'CentOS 5.6 (64-bit)',
|
|
"sleep": 60,
|
|
"timeout": 10,
|
|
}
|
|
|
|
class TestUserLogin(cloudstackTestCase):
|
|
|
|
@classmethod
|
|
def setUpClass(cls):
|
|
cls.testClient = super(TestUserLogin, cls).getClsTestClient()
|
|
cls.api_client = cls.testClient.getApiClient()
|
|
|
|
cls.services = Services().services
|
|
cls.domain = get_domain(cls.api_client)
|
|
cls.zone = get_zone(cls.api_client, cls.testClient.getZoneForTests())
|
|
cls.services['mode'] = cls.zone.networktype
|
|
cls._cleanup = []
|
|
return
|
|
|
|
@classmethod
|
|
def tearDownClass(cls):
|
|
super(TestUserLogin,cls).tearDownClass()
|
|
|
|
def setUp(self):
|
|
self.apiclient = self.testClient.getApiClient()
|
|
self.dbclient = self.testClient.getDbConnection()
|
|
|
|
self.debug("Enabling 2FA in global setting")
|
|
updateConfigurationCmd = updateConfiguration.updateConfigurationCmd()
|
|
updateConfigurationCmd.name = "enable.user.2fa"
|
|
updateConfigurationCmd.value = "true"
|
|
updateConfigurationResponse = self.apiclient.updateConfiguration(
|
|
updateConfigurationCmd)
|
|
|
|
self.cleanup = []
|
|
return
|
|
|
|
def tearDown(self):
|
|
self.debug("Disable 2FA in global setting")
|
|
updateConfigurationCmd = updateConfiguration.updateConfigurationCmd()
|
|
updateConfigurationCmd.name = "enable.user.2fa"
|
|
updateConfigurationCmd.value = "false"
|
|
updateConfigurationResponse = self.apiclient.updateConfiguration(
|
|
updateConfigurationCmd)
|
|
|
|
super(TestUserLogin,self).tearDown()
|
|
|
|
@attr(tags=["login", "accounts", "simulator", "advanced",
|
|
"advancedns", "basic", "eip", "sg"])
|
|
def test_2FA_enabled(self):
|
|
"""Test if Login API does not return UUID's
|
|
"""
|
|
|
|
# Steps for test scenario
|
|
# 1. create a user account
|
|
# 2. login to the user account with given credentials (loginCmd)
|
|
# 3. verify login response
|
|
|
|
# Setup Global settings
|
|
|
|
self.debug("Mandate 2FA in global setting")
|
|
updateConfigurationCmd = updateConfiguration.updateConfigurationCmd()
|
|
updateConfigurationCmd.name = "mandate.user.2fa"
|
|
updateConfigurationCmd.value = "true"
|
|
updateConfigurationResponse = self.apiclient.updateConfiguration(
|
|
updateConfigurationCmd)
|
|
|
|
self.debug("Creating an user account..")
|
|
self.account = Account.create(
|
|
self.apiclient,
|
|
self.services["account"],
|
|
domainid=self.domain.id
|
|
)
|
|
self.cleanup.append(self.account)
|
|
|
|
self.debug("Logging into the cloudstack with login API")
|
|
response = User.login(
|
|
self.apiclient,
|
|
username=self.account.name,
|
|
password=self.services["account"]["password"]
|
|
)
|
|
|
|
self.debug("Login API response: %s" % response)
|
|
|
|
self.assertEqual(
|
|
response.is2faenabled,
|
|
"true",
|
|
"2FA enabled for user"
|
|
)
|
|
|
|
self.debug("Remove mandating 2FA in global setting")
|
|
updateConfigurationCmd = updateConfiguration.updateConfigurationCmd()
|
|
updateConfigurationCmd.name = "mandate.user.2fa"
|
|
updateConfigurationCmd.value = "false"
|
|
updateConfigurationResponse = self.apiclient.updateConfiguration(
|
|
updateConfigurationCmd)
|
|
|
|
return
|
|
|
|
@attr(tags=["login", "accounts", "simulator", "advanced",
|
|
"advancedns", "basic", "eip", "sg"])
|
|
def test_2FA_setup(self):
|
|
"""Test if Login API does not return UUID's
|
|
"""
|
|
|
|
# Steps for test scenario
|
|
# 1. create a user account
|
|
# 2. login to the user account with given credentials (loginCmd)
|
|
# 3. verify login response for 2fa
|
|
# 4. setup 2fa for the user
|
|
# 5. verify the code in the setup 2fa response
|
|
# 6. test disable 2FA
|
|
|
|
# Setup Global settings
|
|
|
|
self.debug("Mandate 2FA in global setting")
|
|
updateConfigurationCmd = updateConfiguration.updateConfigurationCmd()
|
|
updateConfigurationCmd.name = "mandate.user.2fa"
|
|
updateConfigurationCmd.value = "true"
|
|
updateConfigurationResponse = self.apiclient.updateConfiguration(
|
|
updateConfigurationCmd)
|
|
|
|
self.debug("Creating an user account..")
|
|
self.account = Account.create(
|
|
self.apiclient,
|
|
self.services["account"],
|
|
domainid=self.domain.id
|
|
)
|
|
self.cleanup.append(self.account)
|
|
|
|
self.debug("Logging into the cloudstack with login API")
|
|
response = User.login(
|
|
self.apiclient,
|
|
username=self.account.name,
|
|
password=self.services["account"]["password"]
|
|
)
|
|
|
|
self.debug("Login API response: %s" % response)
|
|
|
|
self.assertEqual(
|
|
response.is2faenabled,
|
|
"true",
|
|
"2FA enabled for user"
|
|
)
|
|
|
|
self.user = self.account.user[0]
|
|
self.user_apiclient = self.testClient.getUserApiClient(
|
|
self.user.username, self.domain.id
|
|
)
|
|
|
|
setup2faCmd = setupUserTwoFactorAuthentication.setupUserTwoFactorAuthenticationCmd()
|
|
setup2faCmd.provider = "staticpin"
|
|
setup2faResponse = self.user_apiclient.setupUserTwoFactorAuthentication(
|
|
setup2faCmd)
|
|
|
|
self.assertNotEqual(
|
|
setup2faResponse.secretcode,
|
|
None,
|
|
"2FA enabled for user"
|
|
)
|
|
|
|
disable2faCmd = setupUserTwoFactorAuthentication.setupUserTwoFactorAuthenticationCmd()
|
|
disable2faCmd.enable = "false"
|
|
disable2faResponse = self.user_apiclient.setupUserTwoFactorAuthentication(
|
|
disable2faCmd)
|
|
|
|
self.assertEqual(
|
|
disable2faResponse.secretcode,
|
|
None,
|
|
"2FA disabled for user"
|
|
)
|
|
|
|
self.debug("Remove mandating 2FA in global setting")
|
|
updateConfigurationCmd = updateConfiguration.updateConfigurationCmd()
|
|
updateConfigurationCmd.name = "mandate.user.2fa"
|
|
updateConfigurationCmd.value = "false"
|
|
updateConfigurationResponse = self.apiclient.updateConfiguration(
|
|
updateConfigurationCmd)
|
|
|
|
return
|