Merge serverprep and prescript plugins

After commit 012a812609 was merged,
some configurations could be broken, such as those requesting EPEL
repos to be configured by Packstack, as Puppet was installed before
the repo was enabled. The best way to fix this is by merging the
serverprep and prescript plugins into one.

Together with the required adjustments for the merge, a new
auxiliary function is created to detect the OS name and release, to
allow some functions previously in the serverprep plugin to run
before the host facts are collected.

This patch is rather large, so extensive testing should be applied
before merging. You have been warned :).

Change-Id: I0b89349827c403070b6daddbbfd0dab535a95c05
This commit is contained in:
Javier Pena 2015-04-07 19:21:14 +02:00 committed by Lukas Bezdicka
parent 96e5463baf
commit f448af7283
5 changed files with 676 additions and 712 deletions

View File

@ -16,11 +16,16 @@
Plugin responsible for setting OpenStack global options
"""
import os
import re
import logging
import platform
import glob
import os
import uuid
from packstack.installer import basedefs
from packstack.installer import exceptions
from packstack.installer import processors
from packstack.installer import utils
from packstack.installer import validators
@ -509,6 +514,245 @@ def initConfig(controller):
"USE_DEFAULT": False,
"NEED_CONFIRM": False,
"CONDITION": False},
],
"SERVERPREPARE": [
{"CMD_OPTION": "use-epel",
"PROMPT": "To subscribe each server to EPEL enter \"y\"",
"OPTION_LIST": ["y", "n"],
"VALIDATORS": [validators.validate_options],
"DEFAULT_VALUE": "n",
"MASK_INPUT": False,
"LOOSE_VALIDATION": True,
"CONF_NAME": "CONFIG_USE_EPEL",
"USE_DEFAULT": False,
"NEED_CONFIRM": False,
"CONDITION": False},
{"CMD_OPTION": "additional-repo",
"PROMPT": ("Enter a comma separated list of URLs to any "
"additional yum repositories to install"),
"OPTION_LIST": [],
"DEFAULT_VALUE": "",
"MASK_INPUT": False,
"LOOSE_VALIDATION": True,
"CONF_NAME": "CONFIG_REPO",
"USE_DEFAULT": False,
"NEED_CONFIRM": False,
"CONDITION": False}
],
"RHEL": [
{"CMD_OPTION": "rh-username",
"PROMPT": "To subscribe each server to Red Hat enter a username ",
"OPTION_LIST": [],
"DEFAULT_VALUE": "",
"MASK_INPUT": False,
"LOOSE_VALIDATION": True,
"CONF_NAME": "CONFIG_RH_USER",
"USE_DEFAULT": False,
"NEED_CONFIRM": False,
"CONDITION": False},
{"CMD_OPTION": "rhn-satellite-server",
"PROMPT": ("To subscribe each server with RHN Satellite enter "
"RHN Satellite server URL"),
"OPTION_LIST": [],
"DEFAULT_VALUE": "",
"MASK_INPUT": False,
"LOOSE_VALIDATION": False,
"CONF_NAME": "CONFIG_SATELLITE_URL",
"USE_DEFAULT": False,
"NEED_CONFIRM": False,
"CONDITION": False}
],
"RHSM": [
{"CMD_OPTION": "rh-password",
"PROMPT": ("To subscribe each server to Red Hat enter your "
"password"),
"OPTION_LIST": [],
"DEFAULT_VALUE": "",
"MASK_INPUT": True,
"LOOSE_VALIDATION": True,
"CONF_NAME": "CONFIG_RH_PW",
"USE_DEFAULT": False,
"NEED_CONFIRM": False,
"CONDITION": False},
{"CMD_OPTION": "rh-enable-optional",
"PROMPT": "To enable RHEL optional repos use value \"y\"",
"OPTION_LIST": ["y", "n"],
"VALIDATORS": [validators.validate_options],
"DEFAULT_VALUE": "y",
"MASK_INPUT": False,
"LOOSE_VALIDATION": True,
"CONF_NAME": "CONFIG_RH_OPTIONAL",
"USE_DEFAULT": False,
"NEED_CONFIRM": False,
"CONDITION": False},
{"CMD_OPTION": "rh-proxy-host",
"PROMPT": ("Specify a HTTP proxy to use with Red Hat subscription"
" manager"),
"OPTION_LIST": [],
"DEFAULT_VALUE": "",
"MASK_INPUT": True,
"LOOSE_VALIDATION": False,
"CONF_NAME": "CONFIG_RH_PROXY",
"USE_DEFAULT": False,
"NEED_CONFIRM": False,
"CONDITION": False}
],
"RHSM_PROXY": [
{"CMD_OPTION": "rh-proxy-port",
"PROMPT": ("Specify port of Red Hat subscription manager HTTP "
"proxy"),
"OPTION_LIST": [],
"DEFAULT_VALUE": "",
"MASK_INPUT": False,
"LOOSE_VALIDATION": False,
"CONF_NAME": "CONFIG_RH_PROXY_PORT",
"USE_DEFAULT": False,
"NEED_CONFIRM": False,
"CONDITION": False},
{"CMD_OPTION": "rh-proxy-user",
"PROMPT": ("Specify a username to use with Red Hat subscription "
"manager HTTP proxy"),
"OPTION_LIST": [],
"DEFAULT_VALUE": "",
"MASK_INPUT": True,
"LOOSE_VALIDATION": False,
"CONF_NAME": "CONFIG_RH_PROXY_USER",
"USE_DEFAULT": False,
"NEED_CONFIRM": False,
"CONDITION": False},
{"CMD_OPTION": "rh-proxy-password",
"PROMPT": ("Specify a password to use with Red Hat subscription "
"manager HTTP proxy"),
"OPTION_LIST": [],
"DEFAULT_VALUE": "",
"MASK_INPUT": True,
"LOOSE_VALIDATION": False,
"CONF_NAME": "CONFIG_RH_PROXY_PW",
"USE_DEFAULT": False,
"NEED_CONFIRM": False,
"CONDITION": False}
],
"SATELLITE": [
{"CMD_OPTION": "rhn-satellite-username",
"PROMPT": ("Enter RHN Satellite username or leave plain if you "
"will use activation key instead"),
"OPTION_LIST": [],
"DEFAULT_VALUE": "",
"MASK_INPUT": False,
"LOOSE_VALIDATION": True,
"CONF_NAME": "CONFIG_SATELLITE_USER",
"USE_DEFAULT": False,
"NEED_CONFIRM": False,
"CONDITION": False},
{"CMD_OPTION": "rhn-satellite-password",
"PROMPT": ("Enter RHN Satellite password or leave plain if you "
"will use activation key instead"),
"OPTION_LIST": [],
"DEFAULT_VALUE": "",
"MASK_INPUT": True,
"LOOSE_VALIDATION": False,
"CONF_NAME": "CONFIG_SATELLITE_PW",
"USE_DEFAULT": False,
"NEED_CONFIRM": False,
"CONDITION": False},
{"CMD_OPTION": "rhn-satellite-activation-key",
"PROMPT": ("Enter RHN Satellite activation key or leave plain if "
"you used username/password instead"),
"OPTION_LIST": [],
"DEFAULT_VALUE": "",
"MASK_INPUT": True,
"LOOSE_VALIDATION": False,
"CONF_NAME": "CONFIG_SATELLITE_AKEY",
"USE_DEFAULT": False,
"NEED_CONFIRM": False,
"CONDITION": False},
{"CMD_OPTION": "rhn-satellite-cacert",
"PROMPT": "Specify a path or URL to a SSL CA certificate to use",
"OPTION_LIST": [],
"DEFAULT_VALUE": "",
"MASK_INPUT": True,
"LOOSE_VALIDATION": False,
"CONF_NAME": "CONFIG_SATELLITE_CACERT",
"USE_DEFAULT": False,
"NEED_CONFIRM": False,
"CONDITION": False},
{"CMD_OPTION": "rhn-satellite-profile",
"PROMPT": ("If required specify the profile name that should be "
"used as an identifier for the system "
"in RHN Satellite"),
"OPTION_LIST": [],
"DEFAULT_VALUE": "",
"MASK_INPUT": True,
"LOOSE_VALIDATION": False,
"CONF_NAME": "CONFIG_SATELLITE_PROFILE",
"USE_DEFAULT": False,
"NEED_CONFIRM": False,
"CONDITION": False},
{"CMD_OPTION": "rhn-satellite-flags",
"PROMPT": ("Enter comma separated list of flags passed "
"to rhnreg_ks"),
"OPTION_LIST": ['novirtinfo', 'norhnsd', 'nopackages'],
"VALIDATORS": [validators.validate_multi_options],
"DEFAULT_VALUE": "",
"MASK_INPUT": True,
"LOOSE_VALIDATION": False,
"CONF_NAME": "CONFIG_SATELLITE_FLAGS",
"USE_DEFAULT": False,
"NEED_CONFIRM": False,
"CONDITION": False},
{"CMD_OPTION": "rhn-satellite-proxy-host",
"PROMPT": "Specify a HTTP proxy to use with RHN Satellite",
"OPTION_LIST": [],
"DEFAULT_VALUE": "",
"MASK_INPUT": True,
"LOOSE_VALIDATION": False,
"CONF_NAME": "CONFIG_SATELLITE_PROXY",
"USE_DEFAULT": False,
"NEED_CONFIRM": False,
"CONDITION": False}
],
"SATELLITE_PROXY": [
{"CMD_OPTION": "rhn-satellite-proxy-username",
"PROMPT": ("Specify a username to use with an authenticated "
"HTTP proxy"),
"OPTION_LIST": [],
"DEFAULT_VALUE": "",
"MASK_INPUT": True,
"LOOSE_VALIDATION": False,
"CONF_NAME": "CONFIG_SATELLITE_PROXY_USER",
"USE_DEFAULT": False,
"NEED_CONFIRM": False,
"CONDITION": False},
{"CMD_OPTION": "rhn-satellite-proxy-password",
"PROMPT": ("Specify a password to use with an authenticated "
"HTTP proxy."),
"OPTION_LIST": [],
"DEFAULT_VALUE": "",
"MASK_INPUT": True,
"LOOSE_VALIDATION": False,
"CONF_NAME": "CONFIG_SATELLITE_PROXY_PW",
"USE_DEFAULT": False,
"NEED_CONFIRM": False,
"CONDITION": False}
]
}
update_params_usage(basedefs.PACKSTACK_DOC, params)
@ -520,6 +764,18 @@ def initConfig(controller):
def unsupported_enabled(config):
return config['CONFIG_UNSUPPORTED'] == 'y'
def filled_rhsm(config):
return bool(config.get('CONFIG_RH_USER'))
def filled_rhsm_proxy(config):
return bool(config.get('CONFIG_RH_PROXY'))
def filled_satellite(config):
return bool(config.get('CONFIG_SATELLITE_URL'))
def filled_satellite_proxy(config):
return bool(config.get('CONFIG_SATELLITE_PROXY'))
groups = [
{"GROUP_NAME": "GLOBAL",
"DESCRIPTION": "Global Options",
@ -540,8 +796,55 @@ def initConfig(controller):
"PRE_CONDITION": unsupported_enabled,
"PRE_CONDITION_MATCH": True,
"POST_CONDITION": False,
"POST_CONDITION_MATCH": True}
"POST_CONDITION_MATCH": True},
{"GROUP_NAME": "SERVERPREPARE",
"DESCRIPTION": "Server Prepare Configs ",
"PRE_CONDITION": lambda x: 'yes',
"PRE_CONDITION_MATCH": "yes",
"POST_CONDITION": False,
"POST_CONDITION_MATCH": True},
]
config = controller.CONF
if (is_all_in_one(config) and is_rhel()) or not is_all_in_one(config):
groups.extend([
{"GROUP_NAME": "RHEL",
"DESCRIPTION": "RHEL config",
"PRE_CONDITION": lambda x: 'yes',
"PRE_CONDITION_MATCH": "yes",
"POST_CONDITION": False,
"POST_CONDITION_MATCH": True},
{"GROUP_NAME": "RHSM",
"DESCRIPTION": "RH subscription manager config",
"PRE_CONDITION": filled_rhsm,
"PRE_CONDITION_MATCH": True,
"POST_CONDITION": False,
"POST_CONDITION_MATCH": True},
{"GROUP_NAME": "RHSM_PROXY",
"DESCRIPTION": "RH subscription manager proxy config",
"PRE_CONDITION": filled_rhsm_proxy,
"PRE_CONDITION_MATCH": True,
"POST_CONDITION": False,
"POST_CONDITION_MATCH": True},
{"GROUP_NAME": "SATELLITE",
"DESCRIPTION": "RHN Satellite config",
"PRE_CONDITION": filled_satellite,
"PRE_CONDITION_MATCH": True,
"POST_CONDITION": False,
"POST_CONDITION_MATCH": True},
{"GROUP_NAME": "SATELLITE_PROXY",
"DESCRIPTION": "RHN Satellite proxy config",
"PRE_CONDITION": filled_satellite_proxy,
"PRE_CONDITION_MATCH": True,
"POST_CONDITION": False,
"POST_CONDITION_MATCH": True}
])
for group in groups:
controller.addGroup(group, params[group['GROUP_NAME']])
@ -550,6 +853,8 @@ def initSequences(controller):
prescript_steps = [
{'title': 'Setting up ssh keys',
'functions': [install_keys]},
{'title': 'Preparing servers',
'functions': [server_prep]},
{'title': 'Preinstalling Puppet and discovering hosts\' details',
'functions': [preinstall_and_discover]},
{'title': 'Adding pre install manifest entries',
@ -568,9 +873,248 @@ def initSequences(controller):
controller.addSequence("Running pre install scripts", [], [],
prescript_steps)
# ------------------------- helper functions -------------------------
def is_rhel():
return 'Red Hat Enterprise Linux' in platform.linux_distribution()[0]
def detect_os_and_version(host):
server = utils.ScriptRunner(host)
server.append('python -c "import platform; print platform.linux_distribution(full_distribution_name=0)[0]+\',\'+platform.linux_distribution()[1]"')
try:
rc, out = server.execute()
out = out.split(",")
return out
except exceptions.ScriptRuntimeError:
logging.warn('Could not detect OS release')
return ['Unknown', 'Unknown']
def run_rhn_reg(host, server_url, username=None, password=None,
cacert=None, activation_key=None, profile_name=None,
proxy_host=None, proxy_user=None, proxy_pass=None,
flags=None):
"""
Registers given host to given RHN Satellite server. To successfully
register either activation_key or username/password is required.
"""
logging.debug('Setting RHN Satellite server: %s.' % locals())
mask = []
cmd = ['/usr/sbin/rhnreg_ks']
server = utils.ScriptRunner(host)
# check satellite server url
server_url = (server_url.rstrip('/').endswith('/XMLRPC')
and server_url or '%s/XMLRPC' % server_url)
cmd.extend(['--serverUrl', server_url])
if activation_key:
cmd.extend(['--activationkey', activation_key])
elif username:
cmd.extend(['--username', username])
if password:
cmd.extend(['--password', password])
mask.append(password)
else:
raise exceptions.InstallError('Either RHN Satellite activation '
'key or username/password must '
'be provided.')
if cacert:
# use and if required download given certificate
location = "/etc/sysconfig/rhn/%s" % os.path.basename(cacert)
if not os.path.isfile(location):
logging.debug('Downloading cacert from %s.' % server_url)
wget_cmd = ('ls %(location)s &> /dev/null && echo -n "" || '
'wget -nd --no-check-certificate --timeout=30 '
'--tries=3 -O "%(location)s" "%(cacert)s"' %
locals())
server.append(wget_cmd)
cmd.extend(['--sslCACert', location])
if profile_name:
cmd.extend(['--profilename', profile_name])
if proxy_host:
cmd.extend(['--proxy', proxy_host])
if proxy_user:
cmd.extend(['--proxyUser', proxy_user])
if proxy_pass:
cmd.extend(['--proxyPassword', proxy_pass])
mask.append(proxy_pass)
flags = flags or []
flags.append('force')
for i in flags:
cmd.append('--%s' % i)
server.append(' '.join(cmd))
server.append('yum clean metadata')
server.execute(mask_list=mask)
def run_rhsm_reg(host, username, password, optional=False, proxy_server=None,
proxy_port=None, proxy_user=None, proxy_password=None):
"""
Registers given host to Red Hat Repositories via subscription manager.
"""
releasever = detect_os_and_version(host)[1].split('.')[0]
server = utils.ScriptRunner(host)
# configure proxy if it is necessary
if proxy_server:
cmd = ('subscription-manager config '
'--server.proxy_hostname=%(proxy_server)s '
'--server.proxy_port=%(proxy_port)s')
if proxy_user:
cmd += (' --server.proxy_user=%(proxy_user)s '
'--server.proxy_password=%(proxy_password)s')
server.append(cmd % locals())
# register host
cmd = ('subscription-manager register --username=\"%s\" '
'--password=\"%s\" --autosubscribe || true')
server.append(cmd % (username, password.replace('"', '\\"')))
# subscribe to required channel
cmd = ('subscription-manager list --consumed | grep -i openstack || '
'subscription-manager subscribe --pool %s')
pool = ("$(subscription-manager list --available"
" | grep -m1 -A15 'Red Hat Enterprise Linux OpenStack Platform'"
" | grep -i 'Pool ID:' | awk '{print $3}')")
server.append(cmd % pool)
if optional:
server.append("subscription-manager repos "
"--enable rhel-%s-server-optional-rpms" % releasever)
server.append("subscription-manager repos "
"--enable rhel-%s-server-openstack-5.0-rpms" % releasever)
# mrg channel naming is a big mess
if releasever == '7':
mrg_prefix = 'rhel-x86_64-server-7'
elif releasever == '6':
mrg_prefix = 'rhel-6-server'
server.append("subscription-manager repos "
"--enable %s-mrg-messaging-2-rpms" % mrg_prefix)
server.append("yum clean all")
server.append("rpm -q --whatprovides yum-utils || "
"yum install -y yum-utils")
server.append("yum clean metadata")
server.execute(mask_list=[password])
def manage_epel(host, config):
"""
Installs and/or enables EPEL repo if it is required or disables it if it
is not required.
"""
relevant = ('redhat', 'centos', 'scientific')
if detect_os_and_version(host)[0].lower() not in relevant:
return
# yum's $releasever can be non numeric on RHEL, so interpolate here
releasever = detect_os_and_version(host)[1].split('.')[0]
mirrors = ('https://mirrors.fedoraproject.org/metalink?repo=epel-%s&'
'arch=$basearch' % releasever)
server = utils.ScriptRunner(host)
if config['CONFIG_USE_EPEL'] == 'y':
server.append('REPOFILE=$(mktemp)')
server.append('cat /etc/yum.conf > $REPOFILE')
server.append("echo -e '[packstack-epel]\nname=packstack-epel\n"
"enabled=1\nmirrorlist=%(mirrors)s' >> $REPOFILE"
% locals())
server.append('( rpm -q --whatprovides epel-release ||'
' yum install -y --nogpg -c $REPOFILE epel-release ) '
'|| true')
server.append('rm -rf $REPOFILE')
try:
server.execute()
except exceptions.ScriptRuntimeError as ex:
msg = 'Failed to set EPEL repo on host %s:\n%s' % (host, ex)
raise exceptions.ScriptRuntimeError(msg)
# if there's an epel repo explicitly enables or disables it
# according to: CONFIG_USE_EPEL
if config['CONFIG_USE_EPEL'] == 'y':
cmd = 'enable'
enabled = '(1|True)'
else:
cmd = 'disable'
enabled = '(0|False)'
server.clear()
server.append('rpm -q yum-utils || yum -y install yum-utils')
server.append('yum-config-manager --%(cmd)s epel' % locals())
rc, out = server.execute()
# yum-config-manager returns 0 always, but returns current setup
# if succeeds
match = re.search('enabled\s*\=\s*%(enabled)s' % locals(), out)
if match:
return
msg = 'Failed to set EPEL repo on host %s:\n'
if cmd == 'enable':
# fail in case user wants to have EPEL enabled
msg += ('RPM file seems to be installed, but appropriate repo file is '
'probably missing in /etc/yum.repos.d/')
raise exceptions.ScriptRuntimeError(msg % host)
else:
# just warn in case disabling failed which might happen when EPEL repo
# is not installed at all
msg += 'This is OK in case you don\'t want EPEL installed and enabled.'
# TO-DO: fill logger name when logging will be refactored.
logger = logging.getLogger()
logger.warn(msg % host)
def manage_rdo(host, config):
"""
Installs and enables RDO repo on host in case it is installed locally.
"""
try:
cmd = "rpm -q rdo-release --qf='%{version}-%{release}.%{arch}\n'"
rc, out = utils.execute(cmd, use_shell=True)
except exceptions.ExecuteRuntimeError:
# RDO repo is not installed, so we don't need to continue
return
# We are installing RDO. EPEL is a requirement, so enable it, overriding
# any configured option
config['CONFIG_USE_EPEL'] = 'y'
match = re.match(r'^(?P<version>\w+)\-(?P<release>\d+\.[\d\w]+)\n', out)
version, release = match.group('version'), match.group('release')
rdo_url = ("http://rdo.fedorapeople.org/openstack/openstack-%(version)s/"
"rdo-release-%(version)s-%(release)s.rpm" % locals())
server = utils.ScriptRunner(host)
server.append("(rpm -q 'rdo-release-%(version)s' ||"
" yum install -y --nogpg %(rdo_url)s) || true"
% locals())
try:
server.execute()
except exceptions.ScriptRuntimeError as ex:
msg = 'Failed to set RDO repo on host %s:\n%s' % (host, ex)
raise exceptions.ScriptRuntimeError(msg)
reponame = 'openstack-%s' % version
server.clear()
server.append('yum-config-manager --enable %(reponame)s' % locals())
# yum-config-manager returns 0 always, but returns current setup
# if succeeds
rc, out = server.execute()
match = re.search('enabled\s*=\s*(1|True)', out)
if not match:
msg = ('Failed to set RDO repo on host %s:\nRPM file seems to be '
'installed, but appropriate repo file is probably missing '
'in /etc/yum.repos.d/' % host)
raise exceptions.ScriptRuntimeError(msg)
# -------------------------- step functions --------------------------
def install_keys_on_host(hostname, sshkeydata):
server = utils.ScriptRunner(hostname)
# TODO replace all that with ssh-copy-id
@ -673,6 +1217,80 @@ def preinstall_and_discover(config, messages):
config['HOST_DETAILS'] = details
def server_prep(config, messages):
rh_username = None
sat_url = None
if is_rhel():
rh_username = config.get("CONFIG_RH_USER")
rh_password = config.get("CONFIG_RH_PW")
sat_registered = set()
sat_url = config["CONFIG_SATELLITE_URL"].strip()
if sat_url:
flag_list = config["CONFIG_SATELLITE_FLAGS"].split(',')
sat_flags = [i.strip() for i in flag_list if i.strip()]
sat_proxy_user = config.get("CONFIG_SATELLITE_PROXY_USER", '')
sat_proxy_pass = config.get("CONFIG_SATELLITE_PROXY_PW", '')
sat_args = {
'username': config["CONFIG_SATELLITE_USER"].strip(),
'password': config["CONFIG_SATELLITE_PW"].strip(),
'cacert': config["CONFIG_SATELLITE_CACERT"].strip(),
'activation_key': config["CONFIG_SATELLITE_AKEY"].strip(),
'profile_name': config["CONFIG_SATELLITE_PROFILE"].strip(),
'proxy_host': config["CONFIG_SATELLITE_PROXY"].strip(),
'proxy_user': sat_proxy_user.strip(),
'proxy_pass': sat_proxy_pass.strip(),
'flags': sat_flags
}
for hostname in filtered_hosts(config):
# Subscribe to Red Hat Repositories if configured
if rh_username:
run_rhsm_reg(hostname, rh_username, rh_password,
optional=(config.get('CONFIG_RH_OPTIONAL') == 'y'),
proxy_server=config.get('CONFIG_RH_PROXY'),
proxy_port=config.get('CONFIG_RH_PROXY_PORT'),
proxy_user=config.get('CONFIG_RH_PROXY_USER'),
proxy_password=config.get('CONFIG_RH_PROXY_PASSWORD'))
# Subscribe to RHN Satellite if configured
if sat_url and hostname not in sat_registered:
run_rhn_reg(hostname, sat_url, **sat_args)
sat_registered.add(hostname)
server = utils.ScriptRunner(hostname)
server.append('rpm -q --whatprovides yum-utils || '
'yum install -y yum-utils')
if is_rhel():
# Installing rhos-log-collector if it is available from yum.
server.append('yum list available rhos-log-collector && '
'yum -y install rhos-log-collector || '
'echo "no rhos-log-collector available"')
server.execute()
# enable RDO if it is installed locally
manage_rdo(hostname, config)
# enable or disable EPEL according to configuration
manage_epel(hostname, config)
# Add yum repositories if configured
CONFIG_REPO = config["CONFIG_REPO"].strip()
if CONFIG_REPO:
for i, repourl in enumerate(CONFIG_REPO.split(',')):
reponame = 'packstack_%d' % i
server.append('echo "[%(reponame)s]\nname=%(reponame)s\n'
'baseurl=%(repourl)s\nenabled=1\n'
'priority=1\ngpgcheck=0"'
' > /etc/yum.repos.d/%(reponame)s.repo'
% locals())
server.append("yum clean metadata")
server.execute()
def create_manifest(config, messages):
key = 'CONFIG_DEBUG_MODE'
config[key] = config[key] == 'y' and True or False

View File

@ -1,655 +0,0 @@
# -*- coding: utf-8 -*-
# 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.
"""
Plugin responsible for Server Preparation.
"""
import os
import re
import logging
import platform
from packstack.installer import basedefs
from packstack.installer import exceptions
from packstack.installer import utils
from packstack.installer import validators
from packstack.modules.common import filtered_hosts
from packstack.modules.common import is_all_in_one
from packstack.modules.documentation import update_params_usage
# ------------ Server Preparation Packstack Plugin Initialization -------------
PLUGIN_NAME = "OS-SERVERPREPARE"
PLUGIN_NAME_COLORED = utils.color_text(PLUGIN_NAME, 'blue')
def initConfig(controller):
conf_params = {
"SERVERPREPARE": [
{"CMD_OPTION": "use-epel",
"PROMPT": "To subscribe each server to EPEL enter \"y\"",
"OPTION_LIST": ["y", "n"],
"VALIDATORS": [validators.validate_options],
"DEFAULT_VALUE": "n",
"MASK_INPUT": False,
"LOOSE_VALIDATION": True,
"CONF_NAME": "CONFIG_USE_EPEL",
"USE_DEFAULT": False,
"NEED_CONFIRM": False,
"CONDITION": False},
{"CMD_OPTION": "additional-repo",
"PROMPT": ("Enter a comma separated list of URLs to any "
"additional yum repositories to install"),
"OPTION_LIST": [],
"DEFAULT_VALUE": "",
"MASK_INPUT": False,
"LOOSE_VALIDATION": True,
"CONF_NAME": "CONFIG_REPO",
"USE_DEFAULT": False,
"NEED_CONFIRM": False,
"CONDITION": False}
],
"RHEL": [
{"CMD_OPTION": "rh-username",
"PROMPT": "To subscribe each server to Red Hat enter a username ",
"OPTION_LIST": [],
"DEFAULT_VALUE": "",
"MASK_INPUT": False,
"LOOSE_VALIDATION": True,
"CONF_NAME": "CONFIG_RH_USER",
"USE_DEFAULT": False,
"NEED_CONFIRM": False,
"CONDITION": False},
{"CMD_OPTION": "rhn-satellite-server",
"PROMPT": ("To subscribe each server with RHN Satellite enter "
"RHN Satellite server URL"),
"OPTION_LIST": [],
"DEFAULT_VALUE": "",
"MASK_INPUT": False,
"LOOSE_VALIDATION": False,
"CONF_NAME": "CONFIG_SATELLITE_URL",
"USE_DEFAULT": False,
"NEED_CONFIRM": False,
"CONDITION": False}
],
"RHSM": [
{"CMD_OPTION": "rh-password",
"PROMPT": ("To subscribe each server to Red Hat enter your "
"password"),
"OPTION_LIST": [],
"DEFAULT_VALUE": "",
"MASK_INPUT": True,
"LOOSE_VALIDATION": True,
"CONF_NAME": "CONFIG_RH_PW",
"USE_DEFAULT": False,
"NEED_CONFIRM": False,
"CONDITION": False},
{"CMD_OPTION": "rh-enable-optional",
"PROMPT": "To enable RHEL optional repos use value \"y\"",
"OPTION_LIST": ["y", "n"],
"VALIDATORS": [validators.validate_options],
"DEFAULT_VALUE": "y",
"MASK_INPUT": False,
"LOOSE_VALIDATION": True,
"CONF_NAME": "CONFIG_RH_OPTIONAL",
"USE_DEFAULT": False,
"NEED_CONFIRM": False,
"CONDITION": False},
{"CMD_OPTION": "rh-proxy-host",
"PROMPT": ("Specify a HTTP proxy to use with Red Hat subscription"
" manager"),
"OPTION_LIST": [],
"DEFAULT_VALUE": "",
"MASK_INPUT": True,
"LOOSE_VALIDATION": False,
"CONF_NAME": "CONFIG_RH_PROXY",
"USE_DEFAULT": False,
"NEED_CONFIRM": False,
"CONDITION": False}
],
"RHSM_PROXY": [
{"CMD_OPTION": "rh-proxy-port",
"PROMPT": ("Specify port of Red Hat subscription manager HTTP "
"proxy"),
"OPTION_LIST": [],
"DEFAULT_VALUE": "",
"MASK_INPUT": False,
"LOOSE_VALIDATION": False,
"CONF_NAME": "CONFIG_RH_PROXY_PORT",
"USE_DEFAULT": False,
"NEED_CONFIRM": False,
"CONDITION": False},
{"CMD_OPTION": "rh-proxy-user",
"PROMPT": ("Specify a username to use with Red Hat subscription "
"manager HTTP proxy"),
"OPTION_LIST": [],
"DEFAULT_VALUE": "",
"MASK_INPUT": True,
"LOOSE_VALIDATION": False,
"CONF_NAME": "CONFIG_RH_PROXY_USER",
"USE_DEFAULT": False,
"NEED_CONFIRM": False,
"CONDITION": False},
{"CMD_OPTION": "rh-proxy-password",
"PROMPT": ("Specify a password to use with Red Hat subscription "
"manager HTTP proxy"),
"OPTION_LIST": [],
"DEFAULT_VALUE": "",
"MASK_INPUT": True,
"LOOSE_VALIDATION": False,
"CONF_NAME": "CONFIG_RH_PROXY_PW",
"USE_DEFAULT": False,
"NEED_CONFIRM": False,
"CONDITION": False}
],
"SATELLITE": [
{"CMD_OPTION": "rhn-satellite-username",
"PROMPT": ("Enter RHN Satellite username or leave plain if you "
"will use activation key instead"),
"OPTION_LIST": [],
"DEFAULT_VALUE": "",
"MASK_INPUT": False,
"LOOSE_VALIDATION": True,
"CONF_NAME": "CONFIG_SATELLITE_USER",
"USE_DEFAULT": False,
"NEED_CONFIRM": False,
"CONDITION": False},
{"CMD_OPTION": "rhn-satellite-password",
"PROMPT": ("Enter RHN Satellite password or leave plain if you "
"will use activation key instead"),
"OPTION_LIST": [],
"DEFAULT_VALUE": "",
"MASK_INPUT": True,
"LOOSE_VALIDATION": False,
"CONF_NAME": "CONFIG_SATELLITE_PW",
"USE_DEFAULT": False,
"NEED_CONFIRM": False,
"CONDITION": False},
{"CMD_OPTION": "rhn-satellite-activation-key",
"PROMPT": ("Enter RHN Satellite activation key or leave plain if "
"you used username/password instead"),
"OPTION_LIST": [],
"DEFAULT_VALUE": "",
"MASK_INPUT": True,
"LOOSE_VALIDATION": False,
"CONF_NAME": "CONFIG_SATELLITE_AKEY",
"USE_DEFAULT": False,
"NEED_CONFIRM": False,
"CONDITION": False},
{"CMD_OPTION": "rhn-satellite-cacert",
"PROMPT": "Specify a path or URL to a SSL CA certificate to use",
"OPTION_LIST": [],
"DEFAULT_VALUE": "",
"MASK_INPUT": True,
"LOOSE_VALIDATION": False,
"CONF_NAME": "CONFIG_SATELLITE_CACERT",
"USE_DEFAULT": False,
"NEED_CONFIRM": False,
"CONDITION": False},
{"CMD_OPTION": "rhn-satellite-profile",
"PROMPT": ("If required specify the profile name that should be "
"used as an identifier for the system "
"in RHN Satellite"),
"OPTION_LIST": [],
"DEFAULT_VALUE": "",
"MASK_INPUT": True,
"LOOSE_VALIDATION": False,
"CONF_NAME": "CONFIG_SATELLITE_PROFILE",
"USE_DEFAULT": False,
"NEED_CONFIRM": False,
"CONDITION": False},
{"CMD_OPTION": "rhn-satellite-flags",
"PROMPT": ("Enter comma separated list of flags passed "
"to rhnreg_ks"),
"OPTION_LIST": ['novirtinfo', 'norhnsd', 'nopackages'],
"VALIDATORS": [validators.validate_multi_options],
"DEFAULT_VALUE": "",
"MASK_INPUT": True,
"LOOSE_VALIDATION": False,
"CONF_NAME": "CONFIG_SATELLITE_FLAGS",
"USE_DEFAULT": False,
"NEED_CONFIRM": False,
"CONDITION": False},
{"CMD_OPTION": "rhn-satellite-proxy-host",
"PROMPT": "Specify a HTTP proxy to use with RHN Satellite",
"OPTION_LIST": [],
"DEFAULT_VALUE": "",
"MASK_INPUT": True,
"LOOSE_VALIDATION": False,
"CONF_NAME": "CONFIG_SATELLITE_PROXY",
"USE_DEFAULT": False,
"NEED_CONFIRM": False,
"CONDITION": False}
],
"SATELLITE_PROXY": [
{"CMD_OPTION": "rhn-satellite-proxy-username",
"PROMPT": ("Specify a username to use with an authenticated "
"HTTP proxy"),
"OPTION_LIST": [],
"DEFAULT_VALUE": "",
"MASK_INPUT": True,
"LOOSE_VALIDATION": False,
"CONF_NAME": "CONFIG_SATELLITE_PROXY_USER",
"USE_DEFAULT": False,
"NEED_CONFIRM": False,
"CONDITION": False},
{"CMD_OPTION": "rhn-satellite-proxy-password",
"PROMPT": ("Specify a password to use with an authenticated "
"HTTP proxy."),
"OPTION_LIST": [],
"DEFAULT_VALUE": "",
"MASK_INPUT": True,
"LOOSE_VALIDATION": False,
"CONF_NAME": "CONFIG_SATELLITE_PROXY_PW",
"USE_DEFAULT": False,
"NEED_CONFIRM": False,
"CONDITION": False}
]
}
update_params_usage(basedefs.PACKSTACK_DOC, conf_params)
def filled_rhsm(config):
return bool(config.get('CONFIG_RH_USER'))
def filled_rhsm_proxy(config):
return bool(config.get('CONFIG_RH_PROXY'))
def filled_satellite(config):
return bool(config.get('CONFIG_SATELLITE_URL'))
def filled_satellite_proxy(config):
return bool(config.get('CONFIG_SATELLITE_PROXY'))
conf_groups = [
{"GROUP_NAME": "SERVERPREPARE",
"DESCRIPTION": "Server Prepare Configs ",
"PRE_CONDITION": lambda x: 'yes',
"PRE_CONDITION_MATCH": "yes",
"POST_CONDITION": False,
"POST_CONDITION_MATCH": True},
]
config = controller.CONF
if (is_all_in_one(config) and is_rhel()) or not is_all_in_one(config):
conf_groups.extend([
{"GROUP_NAME": "RHEL",
"DESCRIPTION": "RHEL config",
"PRE_CONDITION": lambda x: 'yes',
"PRE_CONDITION_MATCH": "yes",
"POST_CONDITION": False,
"POST_CONDITION_MATCH": True},
{"GROUP_NAME": "RHSM",
"DESCRIPTION": "RH subscription manager config",
"PRE_CONDITION": filled_rhsm,
"PRE_CONDITION_MATCH": True,
"POST_CONDITION": False,
"POST_CONDITION_MATCH": True},
{"GROUP_NAME": "RHSM_PROXY",
"DESCRIPTION": "RH subscription manager proxy config",
"PRE_CONDITION": filled_rhsm_proxy,
"PRE_CONDITION_MATCH": True,
"POST_CONDITION": False,
"POST_CONDITION_MATCH": True},
{"GROUP_NAME": "SATELLITE",
"DESCRIPTION": "RHN Satellite config",
"PRE_CONDITION": filled_satellite,
"PRE_CONDITION_MATCH": True,
"POST_CONDITION": False,
"POST_CONDITION_MATCH": True},
{"GROUP_NAME": "SATELLITE_PROXY",
"DESCRIPTION": "RHN Satellite proxy config",
"PRE_CONDITION": filled_satellite_proxy,
"PRE_CONDITION_MATCH": True,
"POST_CONDITION": False,
"POST_CONDITION_MATCH": True}
])
for group in conf_groups:
params = conf_params[group["GROUP_NAME"]]
controller.addGroup(group, params)
def initSequences(controller):
preparesteps = [
{'title': 'Preparing servers', 'functions': [server_prep]}
]
controller.addSequence("Preparing servers", [], [], preparesteps)
# ------------------------- helper functions -------------------------
def is_rhel():
return 'Red Hat Enterprise Linux' in platform.linux_distribution()[0]
def run_rhn_reg(host, server_url, username=None, password=None,
cacert=None, activation_key=None, profile_name=None,
proxy_host=None, proxy_user=None, proxy_pass=None,
flags=None):
"""
Registers given host to given RHN Satellite server. To successfully
register either activation_key or username/password is required.
"""
logging.debug('Setting RHN Satellite server: %s.' % locals())
mask = []
cmd = ['/usr/sbin/rhnreg_ks']
server = utils.ScriptRunner(host)
# check satellite server url
server_url = (server_url.rstrip('/').endswith('/XMLRPC')
and server_url or '%s/XMLRPC' % server_url)
cmd.extend(['--serverUrl', server_url])
if activation_key:
cmd.extend(['--activationkey', activation_key])
elif username:
cmd.extend(['--username', username])
if password:
cmd.extend(['--password', password])
mask.append(password)
else:
raise exceptions.InstallError('Either RHN Satellite activation '
'key or username/password must '
'be provided.')
if cacert:
# use and if required download given certificate
location = "/etc/sysconfig/rhn/%s" % os.path.basename(cacert)
if not os.path.isfile(location):
logging.debug('Downloading cacert from %s.' % server_url)
wget_cmd = ('ls %(location)s &> /dev/null && echo -n "" || '
'wget -nd --no-check-certificate --timeout=30 '
'--tries=3 -O "%(location)s" "%(cacert)s"' %
locals())
server.append(wget_cmd)
cmd.extend(['--sslCACert', location])
if profile_name:
cmd.extend(['--profilename', profile_name])
if proxy_host:
cmd.extend(['--proxy', proxy_host])
if proxy_user:
cmd.extend(['--proxyUser', proxy_user])
if proxy_pass:
cmd.extend(['--proxyPassword', proxy_pass])
mask.append(proxy_pass)
flags = flags or []
flags.append('force')
for i in flags:
cmd.append('--%s' % i)
server.append(' '.join(cmd))
server.append('yum clean metadata')
server.execute(mask_list=mask)
def run_rhsm_reg(host, username, password, optional=False, proxy_server=None,
proxy_port=None, proxy_user=None, proxy_password=None):
"""
Registers given host to Red Hat Repositories via subscription manager.
"""
releasever = config['HOST_DETAILS'][host]['operatingsystemmajrelease']
server = utils.ScriptRunner(host)
# configure proxy if it is necessary
if proxy_server:
cmd = ('subscription-manager config '
'--server.proxy_hostname=%(proxy_server)s '
'--server.proxy_port=%(proxy_port)s')
if proxy_user:
cmd += (' --server.proxy_user=%(proxy_user)s '
'--server.proxy_password=%(proxy_password)s')
server.append(cmd % locals())
# register host
cmd = ('subscription-manager register --username=\"%s\" '
'--password=\"%s\" --autosubscribe || true')
server.append(cmd % (username, password.replace('"', '\\"')))
# subscribe to required channel
cmd = ('subscription-manager list --consumed | grep -i openstack || '
'subscription-manager subscribe --pool %s')
pool = ("$(subscription-manager list --available"
" | grep -m1 -A15 'Red Hat Enterprise Linux OpenStack Platform'"
" | grep -i 'Pool ID:' | awk '{print $3}')")
server.append(cmd % pool)
if optional:
server.append("subscription-manager repos "
"--enable rhel-%s-server-optional-rpms" % releasever)
server.append("subscription-manager repos "
"--enable rhel-%s-server-openstack-5.0-rpms" % releasever)
# mrg channel naming is a big mess
if releasever == '7':
mrg_prefix = 'rhel-x86_64-server-7'
elif releasever == '6':
mrg_prefix = 'rhel-6-server'
server.append("subscription-manager repos "
"--enable %s-mrg-messaging-2-rpms" % mrg_prefix)
server.append("yum clean all")
server.append("rpm -q --whatprovides yum-utils || "
"yum install -y yum-utils")
server.append("yum clean metadata")
server.execute(mask_list=[password])
def manage_epel(host, config):
"""
Installs and/or enables EPEL repo if it is required or disables it if it
is not required.
"""
relevant = ('redhat', 'centos', 'scientific')
if config['HOST_DETAILS'][host]['operatingsystem'].lower() not in relevant:
return
# yum's $releasever can be non numeric on RHEL, so interpolate here
releasever = config['HOST_DETAILS'][host]['operatingsystemmajrelease']
mirrors = ('https://mirrors.fedoraproject.org/metalink?repo=epel-%s&'
'arch=$basearch' % releasever)
server = utils.ScriptRunner(host)
if config['CONFIG_USE_EPEL'] == 'y':
server.append('REPOFILE=$(mktemp)')
server.append('cat /etc/yum.conf > $REPOFILE')
server.append("echo -e '[packstack-epel]\nname=packstack-epel\n"
"enabled=1\nmirrorlist=%(mirrors)s' >> $REPOFILE"
% locals())
server.append('( rpm -q --whatprovides epel-release ||'
' yum install -y --nogpg -c $REPOFILE epel-release ) '
'|| true')
server.append('rm -rf $REPOFILE')
try:
server.execute()
except exceptions.ScriptRuntimeError as ex:
msg = 'Failed to set EPEL repo on host %s:\n%s' % (host, ex)
raise exceptions.ScriptRuntimeError(msg)
# if there's an epel repo explicitly enables or disables it
# according to: CONFIG_USE_EPEL
if config['CONFIG_USE_EPEL'] == 'y':
cmd = 'enable'
enabled = '(1|True)'
else:
cmd = 'disable'
enabled = '(0|False)'
server.clear()
server.append('rpm -q yum-utils || yum -y install yum-utils')
server.append('yum-config-manager --%(cmd)s epel' % locals())
rc, out = server.execute()
# yum-config-manager returns 0 always, but returns current setup
# if succeeds
match = re.search('enabled\s*\=\s*%(enabled)s' % locals(), out)
if match:
return
msg = 'Failed to set EPEL repo on host %s:\n'
if cmd == 'enable':
# fail in case user wants to have EPEL enabled
msg += ('RPM file seems to be installed, but appropriate repo file is '
'probably missing in /etc/yum.repos.d/')
raise exceptions.ScriptRuntimeError(msg % host)
else:
# just warn in case disabling failed which might happen when EPEL repo
# is not installed at all
msg += 'This is OK in case you don\'t want EPEL installed and enabled.'
# TO-DO: fill logger name when logging will be refactored.
logger = logging.getLogger()
logger.warn(msg % host)
def manage_rdo(host, config):
"""
Installs and enables RDO repo on host in case it is installed locally.
"""
try:
cmd = "rpm -q rdo-release --qf='%{version}-%{release}.%{arch}\n'"
rc, out = utils.execute(cmd, use_shell=True)
except exceptions.ExecuteRuntimeError:
# RDO repo is not installed, so we don't need to continue
return
# We are installing RDO. EPEL is a requirement, so enable it, overriding
# any configured option
config['CONFIG_USE_EPEL'] = 'y'
match = re.match(r'^(?P<version>\w+)\-(?P<release>\d+\.[\d\w]+)\n', out)
version, release = match.group('version'), match.group('release')
rdo_url = ("http://rdo.fedorapeople.org/openstack/openstack-%(version)s/"
"rdo-release-%(version)s-%(release)s.rpm" % locals())
server = utils.ScriptRunner(host)
server.append("(rpm -q 'rdo-release-%(version)s' ||"
" yum install -y --nogpg %(rdo_url)s) || true"
% locals())
try:
server.execute()
except exceptions.ScriptRuntimeError as ex:
msg = 'Failed to set RDO repo on host %s:\n%s' % (host, ex)
raise exceptions.ScriptRuntimeError(msg)
reponame = 'openstack-%s' % version
server.clear()
server.append('yum-config-manager --enable %(reponame)s' % locals())
# yum-config-manager returns 0 always, but returns current setup
# if succeeds
rc, out = server.execute()
match = re.search('enabled\s*=\s*(1|True)', out)
if not match:
msg = ('Failed to set RDO repo on host %s:\nRPM file seems to be '
'installed, but appropriate repo file is probably missing '
'in /etc/yum.repos.d/' % host)
raise exceptions.ScriptRuntimeError(msg)
# -------------------------- step functions --------------------------
def server_prep(config, messages):
rh_username = None
sat_url = None
if is_rhel():
rh_username = config.get("CONFIG_RH_USER")
rh_password = config.get("CONFIG_RH_PW")
sat_registered = set()
sat_url = config["CONFIG_SATELLITE_URL"].strip()
if sat_url:
flag_list = config["CONFIG_SATELLITE_FLAGS"].split(',')
sat_flags = [i.strip() for i in flag_list if i.strip()]
sat_proxy_user = config.get("CONFIG_SATELLITE_PROXY_USER", '')
sat_proxy_pass = config.get("CONFIG_SATELLITE_PROXY_PW", '')
sat_args = {
'username': config["CONFIG_SATELLITE_USER"].strip(),
'password': config["CONFIG_SATELLITE_PW"].strip(),
'cacert': config["CONFIG_SATELLITE_CACERT"].strip(),
'activation_key': config["CONFIG_SATELLITE_AKEY"].strip(),
'profile_name': config["CONFIG_SATELLITE_PROFILE"].strip(),
'proxy_host': config["CONFIG_SATELLITE_PROXY"].strip(),
'proxy_user': sat_proxy_user.strip(),
'proxy_pass': sat_proxy_pass.strip(),
'flags': sat_flags
}
for hostname in filtered_hosts(config):
# Subscribe to Red Hat Repositories if configured
if rh_username:
run_rhsm_reg(hostname, rh_username, rh_password,
optional=(config.get('CONFIG_RH_OPTIONAL') == 'y'),
proxy_server=config.get('CONFIG_RH_PROXY'),
proxy_port=config.get('CONFIG_RH_PROXY_PORT'),
proxy_user=config.get('CONFIG_RH_PROXY_USER'),
proxy_password=config.get('CONFIG_RH_PROXY_PASSWORD'))
# Subscribe to RHN Satellite if configured
if sat_url and hostname not in sat_registered:
run_rhn_reg(hostname, sat_url, **sat_args)
sat_registered.add(hostname)
server = utils.ScriptRunner(hostname)
server.append('rpm -q --whatprovides yum-utils || '
'yum install -y yum-utils')
if is_rhel():
# Installing rhos-log-collector if it is available from yum.
server.append('yum list available rhos-log-collector && '
'yum -y install rhos-log-collector || '
'echo "no rhos-log-collector available"')
server.execute()
# enable RDO if it is installed locally
manage_rdo(hostname, config)
# enable or disable EPEL according to configuration
manage_epel(hostname, config)
# Add yum repositories if configured
CONFIG_REPO = config["CONFIG_REPO"].strip()
if CONFIG_REPO:
for i, repourl in enumerate(CONFIG_REPO.split(',')):
reponame = 'packstack_%d' % i
server.append('echo "[%(reponame)s]\nname=%(reponame)s\n'
'baseurl=%(repourl)s\nenabled=1\n'
'priority=1\ngpgcheck=0"'
' > /etc/yum.repos.d/%(reponame)s.repo'
% locals())
server.append("yum clean metadata")
server.execute()

View File

@ -0,0 +1,56 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
# Copyright 2013, Red Hat, Inc.
#
# 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 unittest import TestCase
from test_base import PackstackTestCaseMixin
from packstack.plugins import prescript_000
class OSPluginUtilsTestCase(PackstackTestCaseMixin, TestCase):
def test_rhn_creds_quoted(self):
"""Make sure RHN password is quoted."""
# On non-RHEL, the CONFIG_{RH,SATELLITE} options are never set,
# i.e. this test would always fail. Therefore, only run it on RHEL.
if not prescript_000.is_rhel():
return
password = "dasd|'asda%><?"
prescript_000.controller.CONF["CONFIG_KEYSTONE_HOST"] = "1.2.3.4"
prescript_000.controller.CONF["CONFIG_USE_EPEL"] = "n"
prescript_000.controller.CONF["CONFIG_REPO"] = ""
prescript_000.controller.CONF["CONFIG_RH_USER"] = "testuser"
prescript_000.controller.CONF["CONFIG_RH_PW"] = password
prescript_000.controller.CONF["CONFIG_RH_BETA_REPO"] = "n"
prescript_000.controller.CONF["CONFIG_SATELLITE_FLAGS"] = ""
prescript_000.controller.CONF["CONFIG_SATELLITE_URL"] = ""
prescript_000.controller.CONF["CONFIG_SATELLITE_USER"] = ""
prescript_000.controller.CONF["CONFIG_SATELLITE_PW"] = ""
prescript_000.controller.CONF["CONFIG_SATELLITE_CACERT"] = ""
prescript_000.controller.CONF["CONFIG_SATELLITE_AKEY"] = ""
prescript_000.controller.CONF["CONFIG_SATELLITE_PROFILE"] = ""
prescript_000.controller.CONF["CONFIG_SATELLITE_PROXY"] = ""
prescript_000.controller.CONF["CONFIG_SATELLITE_PROXY_USER"] = ""
prescript_000.controller.CONF["CONFIG_SATELLITE_PROXY_PW"] = ""
prescript_000.serverprep(prescript_000.controller.CONF)
self.assertNotEqual(
self.fake_popen.data.find('--password="%s"' % password), -1
)

View File

@ -1,56 +0,0 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
# Copyright 2013, Red Hat, Inc.
#
# 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 unittest import TestCase
from test_base import PackstackTestCaseMixin
from packstack.plugins import serverprep_001
class OSPluginUtilsTestCase(PackstackTestCaseMixin, TestCase):
def test_rhn_creds_quoted(self):
"""Make sure RHN password is quoted."""
# On non-RHEL, the CONFIG_{RH,SATELLITE} options are never set,
# i.e. this test would always fail. Therefore, only run it on RHEL.
if not serverprep_001.is_rhel():
return
password = "dasd|'asda%><?"
serverprep_001.controller.CONF["CONFIG_KEYSTONE_HOST"] = "1.2.3.4"
serverprep_001.controller.CONF["CONFIG_USE_EPEL"] = "n"
serverprep_001.controller.CONF["CONFIG_REPO"] = ""
serverprep_001.controller.CONF["CONFIG_RH_USER"] = "testuser"
serverprep_001.controller.CONF["CONFIG_RH_PW"] = password
serverprep_001.controller.CONF["CONFIG_RH_BETA_REPO"] = "n"
serverprep_001.controller.CONF["CONFIG_SATELLITE_FLAGS"] = ""
serverprep_001.controller.CONF["CONFIG_SATELLITE_URL"] = ""
serverprep_001.controller.CONF["CONFIG_SATELLITE_USER"] = ""
serverprep_001.controller.CONF["CONFIG_SATELLITE_PW"] = ""
serverprep_001.controller.CONF["CONFIG_SATELLITE_CACERT"] = ""
serverprep_001.controller.CONF["CONFIG_SATELLITE_AKEY"] = ""
serverprep_001.controller.CONF["CONFIG_SATELLITE_PROFILE"] = ""
serverprep_001.controller.CONF["CONFIG_SATELLITE_PROXY"] = ""
serverprep_001.controller.CONF["CONFIG_SATELLITE_PROXY_USER"] = ""
serverprep_001.controller.CONF["CONFIG_SATELLITE_PROXY_PW"] = ""
serverprep_001.serverprep(serverprep_001.controller.CONF)
self.assertNotEqual(
self.fake_popen.data.find('--password="%s"' % password), -1
)

View File

@ -0,0 +1 @@
docutils>=0.11