324 lines
12 KiB
Python
324 lines
12 KiB
Python
# -*- coding: utf-8 -*-
|
|
|
|
"""
|
|
Installs and configures neutron
|
|
"""
|
|
|
|
import logging
|
|
import uuid
|
|
|
|
from packstack.installer import utils
|
|
from packstack.installer import validators
|
|
from packstack.installer import processors
|
|
|
|
from packstack.modules.common import is_all_in_one
|
|
from packstack.modules.ospluginutils import (appendManifestFile,
|
|
getManifestTemplate)
|
|
|
|
|
|
#------------------ oVirt installer initialization ------------------
|
|
|
|
PLUGIN_NAME = "OS-Provision"
|
|
PLUGIN_NAME_COLORED = utils.color_text(PLUGIN_NAME, 'blue')
|
|
|
|
DEMO_CIRRUS_URL = (
|
|
'http://download.cirros-cloud.net/0.3.3/cirros-0.3.3-x86_64-disk.img'
|
|
)
|
|
|
|
|
|
def initConfig(controller):
|
|
|
|
def process_provision(param, process_args=None):
|
|
return param if is_all_in_one(controller.CONF) else 'n'
|
|
|
|
conf_params = {
|
|
"PROVISION_INIT": [
|
|
{"CMD_OPTION": "provision-demo",
|
|
"USAGE": ("Whether to provision for demo usage and testing. Note "
|
|
"that provisioning is only supported for all-in-one "
|
|
"installations."),
|
|
"PROMPT": ("Would you like to provision for demo usage "
|
|
"and testing"),
|
|
"OPTION_LIST": ["y", "n"],
|
|
"VALIDATORS": [validators.validate_options],
|
|
"DEFAULT_VALUE": "y",
|
|
"MASK_INPUT": False,
|
|
"LOOSE_VALIDATION": True,
|
|
"CONF_NAME": "CONFIG_PROVISION_DEMO",
|
|
"USE_DEFAULT": False,
|
|
"NEED_CONFIRM": False,
|
|
"CONDITION": False},
|
|
|
|
{"CMD_OPTION": "provision-tempest",
|
|
"USAGE": "Whether to configure tempest for testing",
|
|
"PROMPT": ("Would you like to configure Tempest (OpenStack test "
|
|
"suite). Note that provisioning is only supported for "
|
|
"all-in-one installations."),
|
|
"OPTION_LIST": ["y", "n"],
|
|
"VALIDATORS": [validators.validate_options],
|
|
"DEFAULT_VALUE": "n",
|
|
"MASK_INPUT": False,
|
|
"LOOSE_VALIDATION": True,
|
|
"CONF_NAME": "CONFIG_PROVISION_TEMPEST",
|
|
"USE_DEFAULT": False,
|
|
"NEED_CONFIRM": False,
|
|
"CONDITION": False},
|
|
|
|
{"CMD_OPTION": "provision-tempest-user",
|
|
"USAGE": "The name of the Tempest Provisioning user. If you "
|
|
"don't provide a user name, Tempest will be configured "
|
|
"in a standalone mode",
|
|
"PROMPT": ("Enter the name of the Tempest Provisioning user "
|
|
"(if blank, Tempest will be configured in a "
|
|
"standalone mode) "),
|
|
"OPTION_LIST": False,
|
|
"VALIDATORS": False,
|
|
"DEFAULT_VALUE": "",
|
|
"MASK_INPUT": False,
|
|
"LOOSE_VALIDATION": True,
|
|
"CONF_NAME": "CONFIG_PROVISION_TEMPEST_USER",
|
|
"USE_DEFAULT": False,
|
|
"NEED_CONFIRM": False,
|
|
"CONDITION": False},
|
|
|
|
{"CMD_OPTION": "provision-tempest-user-passwd",
|
|
"USAGE": "The password to use for the Tempest Provisioning user",
|
|
"PROMPT": "Enter the password for the Tempest Provisioning user",
|
|
"OPTION_LIST": [],
|
|
"VALIDATORS": [validators.validate_not_empty],
|
|
"DEFAULT_VALUE": "PW_PLACEHOLDER",
|
|
"PROCESSORS": [processors.process_password],
|
|
"MASK_INPUT": True,
|
|
"LOOSE_VALIDATION": False,
|
|
"CONF_NAME": "CONFIG_PROVISION_TEMPEST_USER_PW",
|
|
"USE_DEFAULT": False,
|
|
"NEED_CONFIRM": True,
|
|
"CONDITION": False},
|
|
|
|
],
|
|
|
|
"PROVISION_DEMO": [
|
|
{"CMD_OPTION": "provision-demo-floatrange",
|
|
"USAGE": "The CIDR network address for the floating IP subnet",
|
|
"PROMPT": "Enter the network address for the floating IP subnet",
|
|
"OPTION_LIST": False,
|
|
"VALIDATORS": False,
|
|
"DEFAULT_VALUE": "172.24.4.224/28",
|
|
"MASK_INPUT": False,
|
|
"LOOSE_VALIDATION": True,
|
|
"CONF_NAME": "CONFIG_PROVISION_DEMO_FLOATRANGE",
|
|
"USE_DEFAULT": False,
|
|
"NEED_CONFIRM": False,
|
|
"CONDITION": False},
|
|
|
|
{"CMD_OPTION": "provision-cirros-url",
|
|
"USAGE": "A URL or local file location for the Cirros demo image "
|
|
"used for Glance",
|
|
"PROMPT": "Enter the URL or local file location for the Cirros "
|
|
"image",
|
|
"OPTION_LIST": False,
|
|
"VALIDATORS": [validators.validate_not_empty],
|
|
"DEFAULT_VALUE": DEMO_CIRRUS_URL,
|
|
"MASK_INPUT": False,
|
|
"LOOSE_VALIDATION": True,
|
|
"CONF_NAME": "CONFIG_PROVISION_CIRROS_URL",
|
|
"USE_DEFAULT": False,
|
|
"NEED_CONFIRM": False,
|
|
"CONDITION": False},
|
|
],
|
|
|
|
"TEMPEST_GIT_REFS": [
|
|
{"CMD_OPTION": "provision-tempest-repo-uri",
|
|
"USAGE": "The uri of the tempest git repository to use",
|
|
"PROMPT": "What is the uri of the Tempest git repository?",
|
|
"OPTION_LIST": [],
|
|
"VALIDATORS": [validators.validate_not_empty],
|
|
"DEFAULT_VALUE": "https://github.com/openstack/tempest.git",
|
|
"MASK_INPUT": False,
|
|
"LOOSE_VALIDATION": True,
|
|
"CONF_NAME": "CONFIG_PROVISION_TEMPEST_REPO_URI",
|
|
"USE_DEFAULT": False,
|
|
"NEED_CONFIRM": False,
|
|
"CONDITION": False},
|
|
|
|
{"CMD_OPTION": "provision-tempest-repo-revision",
|
|
"USAGE": "The revision of the tempest git repository to use",
|
|
"PROMPT": ("What revision, branch, or tag of the Tempest git "
|
|
"repository should be used"),
|
|
"OPTION_LIST": [],
|
|
"VALIDATORS": [validators.validate_not_empty],
|
|
"DEFAULT_VALUE": "master",
|
|
"MASK_INPUT": False,
|
|
"LOOSE_VALIDATION": True,
|
|
"CONF_NAME": "CONFIG_PROVISION_TEMPEST_REPO_REVISION",
|
|
"USE_DEFAULT": False,
|
|
"NEED_CONFIRM": False,
|
|
"CONDITION": False},
|
|
],
|
|
|
|
"PROVISION_ALL_IN_ONE_OVS_BRIDGE": [
|
|
{"CMD_OPTION": "provision-all-in-one-ovs-bridge",
|
|
"USAGE": ("Whether to configure the ovs external bridge in an "
|
|
"all-in-one deployment"),
|
|
"PROMPT": "Would you like to configure the external ovs bridge",
|
|
"OPTION_LIST": ["y", "n"],
|
|
"VALIDATORS": [validators.validate_options],
|
|
"DEFAULT_VALUE": "n",
|
|
"MASK_INPUT": False,
|
|
"LOOSE_VALIDATION": True,
|
|
"CONF_NAME": "CONFIG_PROVISION_ALL_IN_ONE_OVS_BRIDGE",
|
|
"USE_DEFAULT": False,
|
|
"NEED_CONFIRM": False,
|
|
"CONDITION": False},
|
|
],
|
|
}
|
|
|
|
def check_provisioning_demo(config):
|
|
return (config.get('CONFIG_PROVISION_DEMO', 'n') == 'y')
|
|
|
|
def check_provisioning_tempest(config):
|
|
return (config.get('CONFIG_PROVISION_TEMPEST', 'n') == 'y')
|
|
|
|
def allow_all_in_one_ovs_bridge(config):
|
|
return (config['CONFIG_NEUTRON_INSTALL'] == 'y' and
|
|
config['CONFIG_NEUTRON_L2_PLUGIN'] == 'openvswitch')
|
|
|
|
conf_groups = [
|
|
{"GROUP_NAME": "PROVISION_INIT",
|
|
"DESCRIPTION": "Provisioning demo config",
|
|
"PRE_CONDITION": lambda x: 'yes',
|
|
"PRE_CONDITION_MATCH": "yes",
|
|
"POST_CONDITION": False,
|
|
"POST_CONDITION_MATCH": True},
|
|
|
|
{"GROUP_NAME": "PROVISION_DEMO",
|
|
"DESCRIPTION": "Provisioning demo config",
|
|
"PRE_CONDITION_MATCH": True,
|
|
"POST_CONDITION": False,
|
|
"POST_CONDITION_MATCH": True},
|
|
|
|
{"GROUP_NAME": "TEMPEST_GIT_REFS",
|
|
"DESCRIPTION": "Optional tempest git uri and branch",
|
|
"PRE_CONDITION": check_provisioning_tempest,
|
|
"PRE_CONDITION_MATCH": True,
|
|
"POST_CONDITION": False,
|
|
"POST_CONDITION_MATCH": True},
|
|
|
|
{"GROUP_NAME": "PROVISION_ALL_IN_ONE_OVS_BRIDGE",
|
|
"DESCRIPTION": "Provisioning all-in-one ovs bridge config",
|
|
"PRE_CONDITION": allow_all_in_one_ovs_bridge,
|
|
"PRE_CONDITION_MATCH": True,
|
|
"POST_CONDITION": False,
|
|
"POST_CONDITION_MATCH": True},
|
|
]
|
|
for group in conf_groups:
|
|
paramList = conf_params[group["GROUP_NAME"]]
|
|
controller.addGroup(group, paramList)
|
|
|
|
# Due to group checking some parameters might not be initialized, but
|
|
# provision.pp needs them all. So we will initialize them with default
|
|
# values
|
|
params = [
|
|
controller.getParamByName(x)
|
|
for x in ['CONFIG_PROVISION_TEMPEST_REPO_URI',
|
|
'CONFIG_PROVISION_TEMPEST_REPO_REVISION',
|
|
'CONFIG_PROVISION_ALL_IN_ONE_OVS_BRIDGE']
|
|
]
|
|
for param in params:
|
|
value = controller.CONF.get(param.CONF_NAME, param.DEFAULT_VALUE)
|
|
controller.CONF[param.CONF_NAME] = value
|
|
|
|
|
|
def initSequences(controller):
|
|
config = controller.CONF
|
|
|
|
if (config['CONFIG_PROVISION_DEMO'] != "y" and
|
|
config['CONFIG_PROVISION_TEMPEST'] != "y"):
|
|
return
|
|
|
|
provision_steps = []
|
|
|
|
if config['CONFIG_PROVISION_DEMO'] == "y":
|
|
provision_steps.append(
|
|
{'title': 'Adding Provisioning Demo manifest entries',
|
|
'functions': [create_demo_manifest]}
|
|
)
|
|
|
|
if config['CONFIG_PROVISION_TEMPEST'] == "y":
|
|
provision_steps.append(
|
|
{'title': 'Adding Provisioning Tempest manifest entries',
|
|
'functions': [create_tempest_manifest]}
|
|
)
|
|
provision_steps.append(
|
|
{'title': 'Adding Provisioning Glance manifest entries',
|
|
'functions': [create_storage_manifest]}
|
|
)
|
|
|
|
marshall_conf_bool(config, 'CONFIG_PROVISION_TEMPEST')
|
|
marshall_conf_bool(config, 'CONFIG_PROVISION_ALL_IN_ONE_OVS_BRIDGE')
|
|
|
|
controller.addSequence("Provisioning for Demo and Testing Usage",
|
|
[], [], provision_steps)
|
|
|
|
|
|
#------------------------- helper functions -------------------------
|
|
|
|
def marshall_conf_bool(conf, key):
|
|
if conf[key] == 'y':
|
|
conf[key] = True
|
|
else:
|
|
conf[key] = False
|
|
|
|
|
|
def using_heat(config):
|
|
if config['CONFIG_HEAT_INSTALL'] != "y":
|
|
config['CONFIG_HEAT_USING_TRUSTS'] = "n"
|
|
|
|
|
|
def using_neutron(config):
|
|
# Using the neutron or nova api servers as the provisioning target
|
|
# will suffice for the all-in-one case.
|
|
if config['CONFIG_NEUTRON_INSTALL'] != "y":
|
|
# The provisioning template requires the name of the external
|
|
# bridge but the value will be missing if neutron isn't
|
|
# configured to be installed.
|
|
config['CONFIG_NEUTRON_L3_EXT_BRIDGE'] = 'br-ex'
|
|
|
|
# Set template-specific parameter to configure whether neutron is
|
|
# available. The value needs to be true/false rather than the y/n.
|
|
# provided by CONFIG_NEUTRON_INSTALL.
|
|
config['PROVISION_NEUTRON_AVAILABLE'] = config['CONFIG_NEUTRON_INSTALL']
|
|
marshall_conf_bool(config, 'PROVISION_NEUTRON_AVAILABLE')
|
|
|
|
|
|
#-------------------------- step functions --------------------------
|
|
|
|
def create_demo_manifest(config, messages):
|
|
using_neutron(config)
|
|
using_heat(config)
|
|
manifest_file = '%s_provision_demo.pp' % config['CONFIG_CONTROLLER_HOST']
|
|
manifest_data = getManifestTemplate("provision_demo.pp")
|
|
appendManifestFile(manifest_file, manifest_data)
|
|
|
|
|
|
def create_storage_manifest(config, messages):
|
|
if config['CONFIG_UNSUPPORTED'] != 'y':
|
|
config['CONFIG_STORAGE_HOST'] = config['CONFIG_CONTROLLER_HOST']
|
|
|
|
if config['CONFIG_PROVISION_TEMPEST']:
|
|
template = "provision_tempest_glance.pp"
|
|
else:
|
|
template = "provision_demo_glance.pp"
|
|
manifest_file = '%s_provision_glance.pp' % config['CONFIG_STORAGE_HOST']
|
|
manifest_data = getManifestTemplate(template)
|
|
appendManifestFile(manifest_file, manifest_data)
|
|
|
|
|
|
def create_tempest_manifest(config, messages):
|
|
using_neutron(config)
|
|
using_heat(config)
|
|
manifest_file = '%s_provision_tempest.pp' % \
|
|
config['CONFIG_CONTROLLER_HOST']
|
|
manifest_data = getManifestTemplate("provision_tempest.pp")
|
|
appendManifestFile(manifest_file, manifest_data)
|