Remove interference of config objects

Till now global config object was used. So we and project owns
functional test fill same config object. This can lead to options/groups
overlaps (two separate package add option with same name). Also second
"read config" call will reset config and remove loaded options. "Read
config" call happenes twice because we and package that own functional
test both make this call.

That why we must use separate config object.

Change-Id: I7bc4ec995317fb6454deb19e75b82793e3d027a4
This commit is contained in:
Dmitry Bogun 2016-12-09 12:53:16 +02:00
parent 60fca54634
commit e6cc50bcff
7 changed files with 83 additions and 65 deletions

View File

@ -16,47 +16,22 @@
import logging
import uuid
import os
import sys
import libvirt
import jinja2
from oslo_config import cfg
from ramdisk_func_test import conf
import utils
def _setup_config():
cfg.CONF([], default_config_files=[
"/etc/ramdisk-func-test/ramdisk-func-test.conf"])
def _setup_loggging():
for pair in [
'paramiko=WARN',
'ironic.openstack.common=WARN',
]:
mod, _sep, level_name = pair.partition('=')
logger = logging.getLogger(mod)
# NOTE(AAzza) in python2.6 Logger.setLevel doesn't convert string name
# to integer code.
if sys.version_info < (2, 7):
level = logging.getLevelName(level_name)
logger.setLevel(level)
else:
logger.setLevel(level_name)
_setup_config()
_setup_loggging()
opts = [
CONF = conf.CONF
CONF.register_opts([
cfg.StrOpt('qemu_url',
help='URL of qemu server.',
default="qemu:///system"),
]
CONF = cfg.CONF
CONF.register_opts(opts)
])
LOG = logging.getLogger(__name__)

20
ramdisk_func_test/conf.py Normal file
View File

@ -0,0 +1,20 @@
#
# Copyright 2016 Cray Inc., All Rights Reserved
#
# 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.
from oslo_config import cfg
PROJECT_NAME = 'ramdisk-func-test'
CONF = cfg.ConfigOpts()

View File

@ -23,6 +23,7 @@ import sh
from oslo_config import cfg
from ramdisk_func_test import conf
from ramdisk_func_test import utils
from ramdisk_func_test.base import TemplateEngine
from ramdisk_func_test.base import ABS_PATH
@ -30,7 +31,8 @@ from ramdisk_func_test.network import Network
from ramdisk_func_test.node import Node
opts = [
CONF = conf.CONF
CONF.register_opts([
cfg.StrOpt('image_build_dir',
default="/tmp/rft_image_build",
help='A path where images from DIB will be build. Expected '
@ -50,20 +52,20 @@ opts = [
# NOTE(oberezovskyi): path from Centos 7 taken as default
cfg.StrOpt('pxelinux',
default='/usr/share/syslinux/pxelinux.0',
help='Path to pxelinux.0 file')
]
CONF = cfg.CONF
CONF.register_opts(opts)
help='Path to pxelinux.0 file'),
cfg.IntOpt('stub_webserver_port',
default=8011,
help='The port used by stub webserver')
])
CONF.import_opt('ramdisk_func_test_workdir', 'ramdisk_func_test.utils')
LOG = logging.getLogger(__name__)
class Environment(object):
HTTP_PORT = "8011"
_loaded_config = object() # to fail comparison with None
def __init__(self, node_templates):
def __init__(self, node_templates, config=None):
super(Environment, self).__init__()
self.templ_eng = TemplateEngine(node_templates)
@ -74,6 +76,8 @@ class Environment(object):
self.rsync_dir = None
self.image_mount_point = None
self._load_config(config)
def setupclass(self):
"""Global setup - single for all tests"""
self.network = Network(self.templ_eng)
@ -138,7 +142,7 @@ class Environment(object):
ramdisk=CONF.ramdisk,
deployment_id=self.node.name,
api_url="http://{0}:{1}".format(self.network.address,
self.HTTP_PORT)
CONF.stub_webserver_port)
)
pxe_path = os.path.join(tftp_root, "pxelinux.cfg")
@ -149,11 +153,10 @@ class Environment(object):
with open(conf_path, 'w') as f:
f.write(pxe_config)
def _setup_webserver(self, port=HTTP_PORT):
def _setup_webserver(self):
port = CONF.stub_webserver_port
LOG.info("Starting stub webserver (at IP {0} port {1}, path to tenant "
"images folder is '{2}')".format(self.network.address,
port,
"images folder is '{2}')".format(self.network.address, port,
self.tenant_images_dir))
# TODO(max_lobur) make webserver singletone
@ -172,11 +175,12 @@ class Environment(object):
def get_url_for_stub_image(self):
return "http://{0}:{1}/fake".format(self.network.address,
self.HTTP_PORT)
CONF.stub_webserver_port)
def _get_swift_tenant_image_url(self, image_name):
return ("http://{0}:{1}/tenant_images/"
"{2}".format(self.network.address, self.HTTP_PORT, image_name))
return (
'http://{0}:{1}/tenant_images/{2}'.format(
self.network.address, CONF.stub_webserver_port, image_name))
def _get_rsync_tenant_image_url(self, image_name):
url = "{0}::ironic_rsync/{1}/".format(self.network.address,
@ -247,3 +251,23 @@ class Environment(object):
if self.image_mount_point:
sh.sudo.umount(self.image_mount_point)
sh.rmdir(self.image_mount_point)
@classmethod
def _load_config(cls, path):
if cls._loaded_config == path:
return
LOG.debug('Load ramdisk-func-test configuration')
args = {}
if path:
args['default_config_files'] = [path]
conf.CONF([], project=conf.PROJECT_NAME, **args)
# configure log level for libs we are using
for channel, level in [
('paramiko', logging.WARN),
('ironic.openstack.common', logging.WARN)]:
logger = logging.getLogger(channel)
logger.setLevel(level)
cls._loaded_config = path

View File

@ -20,12 +20,13 @@ import libvirt
from oslo_config import cfg
from ramdisk_func_test import conf
from ramdisk_func_test import utils
from ramdisk_func_test.base import LibvirtBase
LOG = logging.getLogger(__name__)
opts = [
CONF = conf.CONF
CONF.register_opts([
cfg.StrOpt('libvirt_net_head_octets',
default="192.168",
help='Head octets for libvirt network (choose free one).'),
@ -35,12 +36,11 @@ opts = [
cfg.IntOpt('libvirt_net_range_end',
default=254,
help='Libvirt network DHCP range end.')
]
CONF = cfg.CONF
CONF.register_opts(opts)
])
CONF.import_opt('ramdisk_func_test_workdir', 'ramdisk_func_test.utils')
LOG = logging.getLogger(__name__)
class Network(LibvirtBase):
def __init__(self, templ_engine):

View File

@ -23,10 +23,13 @@ from lxml import etree
from oslo_config import cfg
from ramdisk_func_test import conf
from ramdisk_func_test import utils
from ramdisk_func_test.base import LibvirtBase
opts = [
CONF = conf.CONF
CONF.register_opts([
cfg.IntOpt('node_boot_timeout',
help='Time to wait slave node to boot (seconds)',
default=360),
@ -34,10 +37,7 @@ opts = [
default='',
help='Libvirt machine type (apply if it is not set in '
'template)'),
]
CONF = cfg.CONF
CONF.register_opts(opts)
])
CONF.import_opt('ramdisk_func_test_workdir', 'ramdisk_func_test.utils')
LOG = logging.getLogger(__name__)

View File

@ -13,27 +13,27 @@
# License for the specific language governing permissions and limitations
# under the License.
import ConfigParser
import os
import logging
import shutil
import random
import socket
from subprocess import check_output
from time import time
from time import sleep
from oslo_config import cfg
from subprocess import check_output
import ConfigParser
from ramdisk_func_test import conf
opts = [
CONF = conf.CONF
CONF.register_opts([
cfg.StrOpt('ramdisk_func_test_workdir',
help='Path where virtualized node disks will be stored.',
default="/tmp/ramdisk-func-test/"),
]
CONF = cfg.CONF
CONF.register_opts(opts)
])
LOG = logging.getLogger(__name__)

View File

@ -24,12 +24,11 @@ import sys
import traceback
import re
from oslo_config import cfg
from ramdisk_func_test import conf
from ramdisk_func_test.base import ABS_PATH
CONF = cfg.CONF
CONF = conf.CONF
LOG = logging.getLogger(__name__)
logging.basicConfig(filename='/tmp/mock-web-server.log',
level=logging.DEBUG,