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
from six.moves import configparser as ConfigParser
import yaml
import fakeprovider
class ConfigValue(object):
def __eq__(self, other):
@@ -323,4 +343,6 @@ def _cloudKwargsFromProvider(provider):
def _get_one_cloud(cloud_config, cloud_kwargs):
'''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)

View File

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

View File

@@ -24,6 +24,7 @@ from contextlib import contextmanager
import shade
import exceptions
import fakeprovider
from nodeutils import iterate_timeout
from task_manager import TaskManager, ManagerStoppedException
@@ -52,6 +53,13 @@ class NotFound(Exception):
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):
log = logging.getLogger("nodepool.ProviderManager")
@@ -70,7 +78,8 @@ class ProviderManager(TaskManager):
else:
ProviderManager.log.debug("Creating new ProviderManager object"
" 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()
for stop_manager in stop_managers:
@@ -326,3 +335,12 @@ class ProviderManager(TaskManager):
self.log.debug('Deleting server %s' % 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}
labels:
- name: fake-label
image: fake-image
- name: real-label
image: real-image
min-ready: 1
providers:
- name: fake-provider
- name: real-provider
providers:
- name: fake-provider
cloud: fake-cloud
- name: real-provider
cloud: real-cloud
keypair: 'if-present-use-this-keypair'
max-servers: 96
pool: 'fake'
pool: 'real'
networks:
- net-id: 'some-uuid'
rate: 0.0001
images:
- name: fake-image
base-image: 'Fake Precise'
- name: real-image
base-image: 'Real Precise'
min-ram: 8192
name-filter: 'Fake'
name-filter: 'Real'
meta:
key: value
key2: value

View File

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

View File

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