+# Copyright 2019 Nokia
+#
+# 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 os
+import mock
+from crl.remotesession.remotesession import RemoteSession
+from crl.interactivesessions.remoterunner import RunResult
+from .usermanager import (
+ UserManager,
+ UserRecord)
+from .envcreator import EnvCreator
+
+
+UPDATE_ENV_DICT = {
+ 'OS_ENDPOINT_TYPE': 'internalURL',
+ 'OS_USERNAME': 'admin',
+ 'OS_PASSWORD': 'password',
+ 'OS_TENANT_NAME': 'admin',
+ 'OS_PROJECT_NAME': 'admin',
+ 'OS_AUTH_URL': '192.168.1.2:5000/v3'}
+
+UM_ADMIN_ENV_DICT = UPDATE_ENV_DICT.copy()
+UM_ADMIN_ENV_DICT.update({'OS_USERNAME': 'um_admin_username',
+ 'OS_PASSWORD': 'um_admin_password',
+ 'OS_TENANT_NAME': 'infrastructure',
+ 'OS_PROJECT_NAME': 'infrastructure'})
+
+ROLES = ['role1', 'role2']
+
+USERRECORD = UserRecord(uuid='uuid',
+ username='username',
+ password='password',
+ roles=ROLES)
+
+TARGET = 'target'
+
+
+THISDIR = os.path.dirname(__file__)
+USER_CONFIG_PATH = os.path.join(THISDIR, 'testutils', 'user_config.yaml')
+
+
+class EnvCreatorVerifier(object):
+ def __init__(self):
+ self._mock_remotesession_factory = mock.create_autospec(RemoteSession)
+ self._mock_usermanager = mock.create_autospec(UserManager)
+ self._envcreator = EnvCreator(
+ remotesession_factory=self._mock_remotesession_factory,
+ usermanager=self._mock_usermanager)
+ self._setup_mocks()
+
+ @property
+ def _envname(self):
+ return ', '.join(ROLES)
+
+ def _setup_mocks(self):
+ self._setup_mock_remotesession()
+ self._setup_mock_usermanager()
+
+ def _setup_mock_remotesession(self):
+ self._get_source_update_env_dict.return_value = UPDATE_ENV_DICT
+ self._execute_command_in_target.side_effect = self._execute_side_effect
+
+ @property
+ def _get_source_update_env_dict(self):
+ return self._mock_remotesession_factory.return_value.get_source_update_env_dict
+
+ @property
+ def _execute_command_in_target(self):
+ return self._mock_remotesession_factory.return_value.execute_command_in_target
+
+ @staticmethod
+ def _execute_side_effect(command):
+ assert command == 'cat /etc/userconfig/user_config.yaml'
+ with open(USER_CONFIG_PATH) as f:
+ return RunResult(status=0, stdout=f.read(), stderr='')
+
+ def _setup_mock_usermanager(self):
+ def mock_create_user_with_roles(*roles):
+ roles_list = list(roles)
+ assert list(roles_list) == ROLES, (
+ 'Expected {expected!r}, actual {actual!r}'.format(
+ expected=ROLES,
+ actual=roles_list))
+ return USERRECORD
+
+ self._mock_usermanager.create_user_with_roles.side_effect = mock_create_user_with_roles
+
+ def verify_create(self):
+ self._assert_target_dict(self._envcreator.create(target=TARGET,
+ envname=self._envname))
+ self._verify_mock_calls()
+
+ def verify_multiple_creates(self):
+ self.verify_create()
+ self._assert_target_dict(self._envcreator.create(target='target2',
+ envname=self._envname))
+ self._get_source_update_env_dict.assert_called_once_with(
+ self._openrc, target=TARGET)
+
+ def verify_create_admin(self):
+ assert self._envcreator.create(target=TARGET, envname='admin') == UPDATE_ENV_DICT
+ self._verify_mock_calls()
+
+ def verify_create_um_admin(self):
+ assert self._envcreator.create(target=TARGET, envname='um_admin') == UM_ADMIN_ENV_DICT
+
+ def _assert_target_dict(self, target_dict):
+ assert target_dict == self._expected_target_dict, (
+ 'Expcted: {expected}, actual: {actual}'.format(
+ expected=self._expected_target_dict,
+ actual=target_dict))
+
+ @property
+ def _expected_target_dict(self):
+ d = UPDATE_ENV_DICT.copy()
+ d.update({'OS_USERNAME': USERRECORD.username,
+ 'OS_PASSWORD': USERRECORD.password,
+ 'OS_TENANT_NAME': 'infrastructure',
+ 'OS_PROJECT_NAME': 'infrastructure'})
+ return d
+
+ def _verify_mock_calls(self):
+ self._get_source_update_env_dict.assert_called_once_with(
+ self._openrc, target=TARGET)
+
+ @property
+ def _openrc(self):
+ return 'openrc'