self.conf = conf
self.driver_name = self.conf['driver']
- @property
- def driver(self):
+ def _get_driver(self):
driver_type = get_driver(
getattr(lc_Provider, self.driver_name.upper())
)
- driver_args = deepcopy(self.conf['driver_args'])
+ driver_args = self._get_driver_args()
driver = driver_type(
*[driver_args.pop(arg_name) for arg_name in self._driver_posargs],
**driver_args
)
return driver
+ driver = property(fget=_get_driver)
+
+ def _get_driver_args(self):
+ return deepcopy(self.conf['driver_args'])
class Provisioner(object):
class OpenStackProvider(Provider):
_driver_posargs = ['username', 'password']
+ def _get_driver(self):
+ self._auth_token = util.AuthToken(name='teuthology_%s' % self.name)
+ with self._auth_token as token:
+ driver = super(OpenStackProvider, self)._get_driver()
+ # We must apparently call get_service_catalog() so that
+ # get_endpoint() works.
+ driver.connection.get_service_catalog()
+ if not token.value:
+ token.write(
+ driver.connection.auth_token,
+ driver.connection.auth_token_expires,
+ driver.connection.get_endpoint(),
+ )
+ return driver
+ driver = property(fget=_get_driver)
+
+ def _get_driver_args(self):
+ driver_args = super(OpenStackProvider, self)._get_driver_args()
+ if self._auth_token.value:
+ driver_args['ex_force_auth_token'] = self._auth_token.value
+ driver_args['ex_force_base_url'] = self._auth_token.endpoint
+ return driver_args
+
@property
def images(self):
if not hasattr(self, '_images'):
:return: None
"""
- driver_name = self.provider.driver.name.lower()
+ driver_name = self.provider.driver_name.lower()
full_conf = conf or dict()
driver_conf = full_conf.get(driver_name, dict())
legacy_conf = getattr(config, driver_name) or dict()
'libcloud.compute.drivers.openstack'
'.OpenStackNodeDriver.destroy_volume'
)
+ self.patchers['m_get_service_catalog'] = patch(
+ 'libcloud.common.openstack'
+ '.OpenStackBaseConnection.get_service_catalog'
+ )
+ self.patchers['m_auth_token'] = patch(
+ 'teuthology.provision.cloud.util.AuthToken'
+ )
+ self.patchers['m_get_endpoint'] = patch(
+ 'libcloud.common.openstack'
+ '.OpenStackBaseConnection.get_endpoint',
+ )
self.patchers['m_sleep'] = patch(
'time.sleep'
)
self.mocks = dict()
for name, patcher in self.patchers.items():
self.mocks[name] = patcher.start()
+ self.mocks['m_get_endpoint'].return_value = 'endpoint'
def teardown(self):
for patcher in self.patchers.values():
assert obj.conf == test_config['providers']['my_provider']
def test_driver(self):
+ token = self.mocks['m_auth_token'].return_value
+ self.mocks['m_auth_token'].return_value.__enter__.return_value = token
+ token.value = None
obj = cloud.get_provider('my_provider')
assert isinstance(obj.driver, get_driver('openstack'))
+ assert obj._auth_token.value is None
def test_images(self):
obj = cloud.get_provider('my_provider')