Restore ability to run nodepoold with fakes

With OSC and shade patches, we lost the ability to run nodepoold
in the foreground with fakes.  This restores that ability.

The shade integration unit tests are updated to use the string
'real' rather than 'fake' in config files, as they are trying to
avoid actually using the nodepool fakes, and the use of the string
'fake' is what triggers their use in many cases.

Change-Id: Ia5d3c3d5462bc03edafcc1567d1bab299ea5d40f
This commit is contained in:
James E. Blair
2015-10-05 10:50:54 -07:00
parent 7c9c0516c5
commit 2e05f1850f
7 changed files with 128 additions and 35 deletions

View File

@@ -1,7 +1,27 @@
#!/usr/bin/env python
# Copyright (C) 2011-2013 OpenStack Foundation
#
# 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_client_config import os_client_config
from six.moves import configparser as ConfigParser from six.moves import configparser as ConfigParser
import yaml import yaml
import fakeprovider
class ConfigValue(object): class ConfigValue(object):
def __eq__(self, other): def __eq__(self, other):
@@ -323,4 +343,6 @@ def _cloudKwargsFromProvider(provider):
def _get_one_cloud(cloud_config, cloud_kwargs): def _get_one_cloud(cloud_config, cloud_kwargs):
'''This is a function to allow for overriding it in tests.''' '''This is a function to allow for overriding it in tests.'''
if cloud_kwargs.get('auth', {}).get('auth-url', '') == 'fake':
return fakeprovider.fake_get_one_cloud(cloud_config, cloud_kwargs)
return cloud_config.get_one_cloud(**cloud_kwargs) return cloud_config.get_one_cloud(**cloud_kwargs)

View File

@@ -66,6 +66,7 @@ class Dummy(object):
def fake_get_one_cloud(cloud_config, cloud_kwargs): def fake_get_one_cloud(cloud_config, cloud_kwargs):
cloud_kwargs['validate'] = False cloud_kwargs['validate'] = False
cloud_kwargs['image_format'] = 'qcow2'
return cloud_config.get_one_cloud(**cloud_kwargs) return cloud_config.get_one_cloud(**cloud_kwargs)
@@ -184,11 +185,11 @@ class FakeOpenStackCloud(object):
def delete_image(self, name_or_id): def delete_image(self, name_or_id):
self._delete(name_or_id, self._image_list) self._delete(name_or_id, self._image_list)
def create_image_snapshot(self, server, image_name, **metadata): def create_image_snapshot(self, name, server, **metadata):
# XXX : validate metadata? # XXX : validate metadata?
return self._create( return self._create(
self._image_list, instance_type=Dummy.IMAGE, self._image_list, instance_type=Dummy.IMAGE,
name=image_name, **metadata) name=name, **metadata)
def list_flavors(self, get_extra=False): def list_flavors(self, get_extra=False):
return self._flavor_list return self._flavor_list

View File

@@ -24,6 +24,7 @@ from contextlib import contextmanager
import shade import shade
import exceptions import exceptions
import fakeprovider
from nodeutils import iterate_timeout from nodeutils import iterate_timeout
from task_manager import TaskManager, ManagerStoppedException from task_manager import TaskManager, ManagerStoppedException
@@ -52,6 +53,13 @@ class NotFound(Exception):
pass pass
def get_provider_manager(provider):
if (provider.cloud_config.get_auth_args().get('auth_url') == 'fake'):
return FakeProviderManager(provider)
else:
return ProviderManager(provider)
class ProviderManager(TaskManager): class ProviderManager(TaskManager):
log = logging.getLogger("nodepool.ProviderManager") log = logging.getLogger("nodepool.ProviderManager")
@@ -70,7 +78,8 @@ class ProviderManager(TaskManager):
else: else:
ProviderManager.log.debug("Creating new ProviderManager object" ProviderManager.log.debug("Creating new ProviderManager object"
" for %s" % p.name) " for %s" % p.name)
new_config.provider_managers[p.name] = ProviderManager(p) new_config.provider_managers[p.name] = \
get_provider_manager(p)
new_config.provider_managers[p.name].start() new_config.provider_managers[p.name].start()
for stop_manager in stop_managers: for stop_manager in stop_managers:
@@ -326,3 +335,12 @@ class ProviderManager(TaskManager):
self.log.debug('Deleting server %s' % server_id) self.log.debug('Deleting server %s' % server_id)
self.deleteServer(server_id) self.deleteServer(server_id)
class FakeProviderManager(ProviderManager):
def __init__(self, provider):
self.__client = fakeprovider.FakeOpenStackCloud()
super(FakeProviderManager, self).__init__(provider)
def _getClient(self):
return self.__client

View File

@@ -0,0 +1,51 @@
script-dir: .
images-dir: '{images_dir}'
cron:
check: '*/15 * * * *'
cleanup: '*/1 * * * *'
image-update: '14 2 * * *'
zmq-publishers:
- tcp://localhost:8881
gearman-servers:
- host: localhost
port: {gearman_port}
labels:
- name: real-label
image: real-image
min-ready: 1
providers:
- name: real-provider
providers:
- name: real-provider
region-name: real-region
keypair: 'if-present-use-this-keypair'
username: 'real'
password: 'real'
auth-url: 'real'
project-id: 'real'
max-servers: 96
pool: 'real'
networks:
- net-id: 'some-uuid'
rate: 0.0001
images:
- name: real-image
base-image: 'Real Precise'
min-ram: 8192
name-filter: 'Real'
meta:
key: value
key2: value
setup: prepare_node_devstack.sh
targets:
- name: fake-target
jenkins:
url: https://jenkins.example.org/
user: fake
apikey: fake

View File

@@ -14,26 +14,26 @@ gearman-servers:
port: {gearman_port} port: {gearman_port}
labels: labels:
- name: fake-label - name: real-label
image: fake-image image: real-image
min-ready: 1 min-ready: 1
providers: providers:
- name: fake-provider - name: real-provider
providers: providers:
- name: fake-provider - name: real-provider
cloud: fake-cloud cloud: real-cloud
keypair: 'if-present-use-this-keypair' keypair: 'if-present-use-this-keypair'
max-servers: 96 max-servers: 96
pool: 'fake' pool: 'real'
networks: networks:
- net-id: 'some-uuid' - net-id: 'some-uuid'
rate: 0.0001 rate: 0.0001
images: images:
- name: fake-image - name: real-image
base-image: 'Fake Precise' base-image: 'Real Precise'
min-ram: 8192 min-ram: 8192
name-filter: 'Fake' name-filter: 'Real'
meta: meta:
key: value key: value
key2: value key2: value

View File

@@ -42,53 +42,53 @@ class TestShadeIntegration(tests.IntegrationTestCase):
self.addCleanup(self._cleanup_cloud_config) self.addCleanup(self._cleanup_cloud_config)
def test_nodepool_provider_config(self): def test_nodepool_provider_config(self):
configfile = self.setup_config('node.yaml') configfile = self.setup_config('integration.yaml')
pool = self.useNodepool(configfile, watermark_sleep=1) pool = self.useNodepool(configfile, watermark_sleep=1)
pool.updateConfig() pool.updateConfig()
provider_manager = pool.config.provider_managers['fake-provider'] provider_manager = pool.config.provider_managers['real-provider']
auth_data = {'username': 'fake', auth_data = {'username': 'real',
'project_id': 'fake', 'project_id': 'real',
'password': 'fake', 'password': 'real',
'auth_url': 'fake'} 'auth_url': 'real'}
self.assertEqual(provider_manager._client.auth, auth_data) self.assertEqual(provider_manager._client.auth, auth_data)
self.assertEqual(provider_manager._client.region_name, 'fake-region') self.assertEqual(provider_manager._client.region_name, 'real-region')
def test_nodepool_osc_config(self): def test_nodepool_osc_config(self):
configfile = self.setup_config('node_osc.yaml') configfile = self.setup_config('integration_osc.yaml')
auth_data = {'username': 'os_fake', auth_data = {'username': 'os_real',
'project_name': 'os_fake', 'project_name': 'os_real',
'password': 'os_fake', 'password': 'os_real',
'auth_url': 'os_fake'} 'auth_url': 'os_real'}
osc_config = {'clouds': {'fake-cloud': {'auth': auth_data}}} osc_config = {'clouds': {'real-cloud': {'auth': auth_data}}}
self._use_cloud_config(osc_config) self._use_cloud_config(osc_config)
pool = self.useNodepool(configfile, watermark_sleep=1) pool = self.useNodepool(configfile, watermark_sleep=1)
pool.updateConfig() pool.updateConfig()
provider_manager = pool.config.provider_managers['fake-provider'] provider_manager = pool.config.provider_managers['real-provider']
self.assertEqual(provider_manager._client.auth, auth_data) self.assertEqual(provider_manager._client.auth, auth_data)
def test_nodepool_osc_config_reload(self): def test_nodepool_osc_config_reload(self):
configfile = self.setup_config('node_osc.yaml') configfile = self.setup_config('integration_osc.yaml')
auth_data = {'username': 'os_fake', auth_data = {'username': 'os_real',
'project_name': 'os_fake', 'project_name': 'os_real',
'password': 'os_fake', 'password': 'os_real',
'auth_url': 'os_fake'} 'auth_url': 'os_real'}
osc_config = {'clouds': {'fake-cloud': {'auth': auth_data}}} osc_config = {'clouds': {'real-cloud': {'auth': auth_data}}}
self._use_cloud_config(osc_config) self._use_cloud_config(osc_config)
pool = self.useNodepool(configfile, watermark_sleep=1) pool = self.useNodepool(configfile, watermark_sleep=1)
pool.updateConfig() pool.updateConfig()
provider_manager = pool.config.provider_managers['fake-provider'] provider_manager = pool.config.provider_managers['real-provider']
self.assertEqual(provider_manager._client.auth, auth_data) self.assertEqual(provider_manager._client.auth, auth_data)
# update the config # update the config
auth_data['password'] = 'os_new_fake' auth_data['password'] = 'os_new_real'
os.remove(self.clouds_path) os.remove(self.clouds_path)
with open(self.clouds_path, 'w') as h: with open(self.clouds_path, 'w') as h:
yaml.safe_dump(osc_config, h) yaml.safe_dump(osc_config, h)
pool.updateConfig() pool.updateConfig()
provider_manager = pool.config.provider_managers['fake-provider'] provider_manager = pool.config.provider_managers['real-provider']
self.assertEqual(provider_manager._client.auth, auth_data) self.assertEqual(provider_manager._client.auth, auth_data)
def test_exceptions(self): def test_exceptions(self):

View File

@@ -1,4 +1,5 @@
script-dir: . script-dir: .
images-dir: tools/images
cron: cron:
check: '*/15 * * * *' check: '*/15 * * * *'