From: Tim Rozet Date: Wed, 16 Sep 2015 19:02:13 +0000 (+0000) Subject: Merge "adding files to the build cache to reduce bandwidth by reusing already downloa... X-Git-Tag: arno.2015.2.0~40 X-Git-Url: https://gerrit.opnfv.org/gerrit/gitweb?a=commitdiff_plain;h=a9373056094ee6c31e5468daeea2b126aa4e58ea;hp=871f020abcef1a1ff652ef0e0c9c50420c4c6aac;p=genesis.git Merge "adding files to the build cache to reduce bandwidth by reusing already downloaded build dependancies reverting git archive to use HEAD, jenkins checks out the correct branch so we can rely on head" into stable/arno --- diff --git a/common/ci/clean.sh b/common/ci/clean.sh index da75205..caaf88f 100755 --- a/common/ci/clean.sh +++ b/common/ci/clean.sh @@ -239,8 +239,15 @@ done echo "${blue}Checking whether PXE bridge ${pxe_bridge} exists${reset}" if ! brctl show ${pxe_bridge} 2>&1 | grep -i 'No such device'; then echo "${blue}PXE bridge detected. Removing...${reset}" - if ifconfig | grep ${pxe_bridge}; then - ifdown ${pxe_bridge} + link_state=$(ip link show ${pxe_bridge} | grep -oP 'state \K[^ ]+') + if [[ ${link_state} != 'DOWN' ]]; then + ip link set dev ${pxe_bridge} down + sleep 5 + link_state=$(ip link show ${pxe_bridge} | grep -oP 'state \K[^ ]+') + if [[ ${link_state} != 'DOWN' ]]; then + echo "${red}Could not bring DOWN bridge ${pxe_bridge} link state is ${link_state}${reset}" + exit 1 + fi fi brctl delbr ${pxe_bridge} if ifconfig | grep ${pxe_bridge} || brctl show | grep ${pxe_bridge}; then diff --git a/fuel/ci/README b/fuel/ci/README index 3525d4d..5ecaa7b 100644 --- a/fuel/ci/README +++ b/fuel/ci/README @@ -18,6 +18,69 @@ For more info on usage: ./build.sh -h ./deploy.sh -h -To be able to deploy on a certain metal environment there needs to be a Deplyment Environment Adaptor" executable with propper added to $PATH such that -deploy.sh can call it by $dea [options] as indicated by ./deploy -h. +sudo ./deploy.sh -h +python deploy.py -h + +usage: python deploy.py [-h] [-nf] [-nh] [-fo] [-co] [-c] [-iso [ISO_FILE]] + [-dea [DEA_FILE]] [-dha [DHA_FILE]] [-s STORAGE_DIR] + [-b PXE_BRIDGE] [-p FUEL_PLUGINS_DIR] + +optional arguments: + -h, --help show this help message and exit + -nf Do not install Fuel Master (and Node VMs when using + libvirt) + -nh Don't run health check after deployment + -fo Install Fuel Master only (and Node VMs when using + libvirt) + -co Cleanup VMs and Virtual Networks according to what is + defined in DHA + -c Cleanup after deploy + -iso [ISO_FILE] ISO File [default: OPNFV.iso] + -dea [DEA_FILE] Deployment Environment Adapter: dea.yaml + -dha [DHA_FILE] Deployment Hardware Adapter: dha.yaml + -s STORAGE_DIR Storage Directory [default: images] + -b PXE_BRIDGE Linux Bridge for booting up the Fuel Master VM + [default: pxebr] + -p FUEL_PLUGINS_DIR Fuel Plugins directory + + + +* EXAMPLES: + +- Install Fuel Master and deploy OPNFV Cloud from scratch on Hardware Environment: + + sudo ./deploy.sh -iso ~/ISO/opnfv.iso -dea ~/CONF/hardware/dea.yaml -dha ~/CONF/hardware/dha.yaml -s /mnt/images -b pxebr -p ~/PLUGIN + + +- Install Fuel Master and deploy OPNFV Cloud from scratch on Virtual Environment: + + sudo ./deploy.sh -iso ~/ISO/opnfv.iso -dea ~/CONF/virtual/dea.yaml -dha ~/CONF/virtual/dha.yaml -s /mnt/images -p ~/PLUGIN + + +- Deploy OPNFV Cloud on an already active Environment where Fuel Master VM is running so no need to install Fuel again: + + sudo ./deploy.sh -nf -dea ~/CONF/virtual/dea.yaml -dha ~/CONF/virtual/dha.yaml + + => with plugin installation + sudo ./deploy.sh -nf -dea ~/CONF/virtual/dea.yaml -dha ~/CONF/virtual/dha.yaml -p ~/PLUGIN + + => with cleanup after deployment is finished + sudo ./deploy.sh -nf -dea ~/CONF/virtual/dea.yaml -dha ~/CONF/virtual/dha.yaml -p ~/PLUGIN -c + + => no healthcheck after deployment is completed + sudo ./deploy.sh -nf -dea ~/CONF/virtual/dea.yaml -dha ~/CONF/virtual/dha.yaml -p ~/PLUGIN -nh + + +- Install Fuel Master only (and Node VMs when using virtual environment): + + => for virtual environment: + sudo ./deploy.sh -iso ~/ISO/opnfv.iso -dea ~/CONF/virtual/dea.yaml -dha ~/CONF/virtual/dha.yaml -s /mnt/images + + => for hardware environment: + sudo ./deploy.sh -iso ~/ISO/opnfv.iso -dea ~/CONF/hardware/dea.yaml -dha ~/CONF/hardware/dha.yaml -s /mnt/images -b pxebr + + +- Cleanup a running OPNFV environment: + + sudo ./deploy.sh -co -dha ~/CONF/virtual/dha.yaml \ No newline at end of file diff --git a/fuel/deploy/README.txt b/fuel/deploy/README.txt index 33baff1..f42e9ac 100644 --- a/fuel/deploy/README.txt +++ b/fuel/deploy/README.txt @@ -1,15 +1,16 @@ ======== PREREQUISITES ======== -the following applications and python modules are required to be installed: +the following dependencies and python modules are required to be installed: -- example for Ubuntu environment: +- for Ubuntu: -sudo apt-get install -y libvirt-bin qemu-kvm tightvncserver virt-manager -sshpass fuseiso genisoimage blackbox xterm python-pip -sudo restart libvirt-bin -sudo pip install pyyaml netaddr paramiko lxml scp +sudo apt-get install -y libvirt-bin qemu-kvm python-pip fuseiso mkisofs +sudo apt-get install -y python-dev libz-dev libxml2-dev libxslt-dev +sudo pip install pyyaml netaddr paramiko lxml scp pycrypto ecdsa +During libvirt install the user is added to the libvirtd group, so you have to +logout then login back again ======== PREPARE and RUN the OPNFV Autodeployment ======== @@ -24,86 +25,162 @@ you will have to modify them according to your needs - If wou wish to deploy OPNFV cloud environment on top of KVM/Libvirt virtualization use as example the following configuration files: - => libvirt/conf/ha + * SR1 configuration files + + => templates/virtual_environment/conf/ha + dea.yaml + dha.yaml + + + * ARNO configuration files + + => templates/virtual_environment/old_conf/ha dea.yaml dha.yaml - => libvirt/conf/multinode + => templates/virtual_environment/old_conf/multinode dea.yaml dha.yaml -- If you wish to deploy OPNFV cloud environment on baremetal +- If you wish to deploy OPNFV cloud environment on hardware use as example the following configuration files: - => baremetal/conf/ericsson_montreal_lab/ha + * SR1 configuration files + + => templates/hardware_environment/conf/ericsson_montreal_lab/ha dea.yaml dha.yaml - => baremetal/conf/ericsson_montreal_lab/multinode + => templates/hardware_environment/conf/linux_foundation_lab/pod1/ha dea.yaml dha.yaml - => baremetal/conf/linux_foundation_lab/ha + => templates/hardware_environment/conf/linux_foundation_lab/pod2/ha dea.yaml dha.yaml - => baremetal/conf/linux_foundation_lab/multinode + + * ARNO configuration files + + => templates/hardware_environment/old_conf/ericsson_montreal_lab/ha dea.yaml dha.yaml + => templates/hardware_environment/old_conf/ericsson_montreal_lab/multinode + dea.yaml + dha.yaml ---- Step.2 Run Autodeployment: + => templates/hardware_environment/old_conf/linux_foundation_lab/ha + dea.yaml + dha.yaml + + => templates/hardware_environment/old_conf/linux_foundation_lab/multinode + dea.yaml + dha.yaml -usage: python deploy.py [-h] [-nf] [-s [STORAGE_DIR]] [-b [PXE_BRIDGE]] - [iso_file] dea_file dha_file -positional arguments: - iso_file ISO File [default: OPNFV.iso] - dea_file Deployment Environment Adapter: dea.yaml - dha_file Deployment Hardware Adapter: dha.yaml +--- Step.2 Run Autodeployment --- + +usage: python deploy.py [-h] [-nf] [-nh] [-fo] [-co] [-c] [-iso [ISO_FILE]] + [-dea [DEA_FILE]] [-dha [DHA_FILE]] [-s STORAGE_DIR] + [-b PXE_BRIDGE] [-p FUEL_PLUGINS_DIR] optional arguments: - -h, --help show this help message and exit - -nf Do not install Fuel Master (and Node VMs when using - libvirt) - -s [STORAGE_DIR] Storage Directory [default: images] - -b [PXE_BRIDGE] Linux Bridge for booting up the Fuel Master VM [default: - pxebr] + -h, --help show this help message and exit + -nf Do not install Fuel Master (and Node VMs when using libvirt) + -nh Don't run health check after deployment + -fo Install Fuel Master only (and Node VMs when using libvirt) + -co Cleanup VMs and Virtual Networks according to what is + defined in DHA + -c Cleanup after deploy + -iso [ISO_FILE] ISO File [default: OPNFV.iso] + -dea [DEA_FILE] Deployment Environment Adapter: dea.yaml + -dha [DHA_FILE] Deployment Hardware Adapter: dha.yaml + -s STORAGE_DIR Storage Directory [default: images] + -b PXE_BRIDGE Linux Bridge for booting up the Fuel Master VM + [default: pxebr] + -p FUEL_PLUGINS_DIR Fuel Plugins directory -* WARNING: +* EXAMPLES: -If optional argument -s is not specified, Autodeployment will use -"/images" as default, and it will create it, if it hasn't been created before +- Install Fuel Master and deploy OPNFV Cloud from scratch on Hardware Environment: -If optional argument -b is not specified, Autodeployment will use "pxebr" as default, -if the bridge does not exist, the application will terminate with an error message + sudo python deploy.py -iso ~/ISO/opnfv.iso -dea ~/CONF/hardware/dea.yaml -dha ~/CONF/hardware/dha.yaml -s /mnt/images -b pxebr -p ~/PLUGIN -IF optional argument is not specified, Autodeployment will use "/OPNFV.iso" -as default, if the iso file does not exist, the application will terminate with an error message - is not required for Autodeployment in virtual environment, even if it is specified -it will not be used at all +- Install Fuel Master and deploy OPNFV Cloud from scratch on Virtual Environment: + sudo python deploy.py -iso ~/ISO/opnfv.iso -dea ~/CONF/virtual/dea.yaml -dha ~/CONF/virtual/dha.yaml -s /mnt/images -p ~/PLUGIN -* EXAMPLES: -- Install Fuel Master and deploy OPNFV Cloud from scratch on Baremetal Environment +- Deploy OPNFV Cloud on an already active Environment where Fuel Master VM is running so no need to install Fuel again: + + sudo python deploy.py -nf -dea ~/CONF/virtual/dea.yaml -dha ~/CONF/virtual/dha.yaml + + => with plugin installation + sudo python deploy.py -nf -dea ~/CONF/virtual/dea.yaml -dha ~/CONF/virtual/dha.yaml -p ~/PLUGIN + + => with cleanup after deployment is finished + sudo python deploy.py -nf -dea ~/CONF/virtual/dea.yaml -dha ~/CONF/virtual/dha.yaml -p ~/PLUGIN -c + + => no healthcheck after deployment is completed + sudo python deploy.py -nf -dea ~/CONF/virtual/dea.yaml -dha ~/CONF/virtual/dha.yaml -p ~/PLUGIN -nh + + +- Install Fuel Master only (and Node VMs when using virtual environment): + + => for virtual environment: + sudo python deploy.py -iso ~/ISO/opnfv.iso -dea ~/CONF/virtual/dea.yaml -dha ~/CONF/virtual/dha.yaml -s /mnt/images + + => for hardware environment: + sudo python deploy.py -iso ~/ISO/opnfv.iso -dea ~/CONF/hardware/dea.yaml -dha ~/CONF/hardware/dha.yaml -s /mnt/images -b pxebr + + +- Cleanup a running OPNFV environment: + + sudo python deploy.py -co -dha ~/CONF/virtual/dha.yaml + + +* WARNINGS: + +=> If optional argument -s is not specified, Autodeployment will use +"/images" as default, and it will create it, if it hasn't been created before + +=> If optional argument -b is not specified, Autodeployment will use "pxebr" as default, +if the bridge does not exist, the application will terminate with an error message + +=> If argument -iso [ISO_FILE] is not specified, Autodeployment will use "/OPNFV.iso" +as default, if the iso file does not exist, the application will terminate with an error message + +=> If argument -dea [DEA_FILE] is not specified, Autodeployment will use "/dea.yaml" +as default, if DEA file does not exist, the application will terminate with an error message -sudo python deploy.py ~/ISO/opnfv.iso ~/CONF/baremetal/dea.yaml ~/CONF/baremetal/dha.yaml -s /mnt/images -b pxebr +=> If argument -dha [DHA_FILE] is not specified, Autodeployment will use "/dha.yaml" +as default, if DHA file does not exist, the application will terminate with an error message +=> Optional argument -b PXE_BRIDGE is not required for Autodeployment in virtual environment, + even if it is specified it will not be used at all because virtual environment is using a different virtual network setup -- Install Fuel Master and deploy OPNFV Cloud from scratch on Virtual Environment +=> If optional argument -p FUEL_PLUGINS_DIR is not specified, no plugins will be installed in Fuel -sudo python deploy.py ~/ISO/opnfv.iso ~/CONF/virtual/dea.yaml ~/CONF/virtual/dha.yaml -s /mnt/images +--- Networking considerations --- +For Virtual Environment: -- Deploy OPNFV Cloud on an already active Environment where Fuel Master VM is running - so no need to install Fuel again +There are some NAT, IPTABLE conflicts on the edge of libvirt bridging and Fuel Master +according to http://wiki.libvirt.org/page/Networking +netfilter on the bridges should be disabled -sudo python deploy.py -nf ~/CONF/baremetal/dea.yaml ~/CONF/baremetal/dha.yaml +Add these lines to /etc/sysctl.conf -sudo python deploy.py -nf ~/CONF/virtual/dea.yaml ~/CONF/virtual/dha.yaml +cat >> /etc/sysctl.conf < - fuel - 8290304 - 8290304 - 2 - - /machine - - - hvm - - - - - - - - - - - SandyBridge - - - - - - - destroy - restart - restart - - - - - - /usr/bin/kvm - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/fuel/deploy/cloud/configure_environment.py b/fuel/deploy/cloud/configure_environment.py index d0037d7..2d68c1b 100644 --- a/fuel/deploy/cloud/configure_environment.py +++ b/fuel/deploy/cloud/configure_environment.py @@ -1,6 +1,13 @@ +############################################################################### +# Copyright (c) 2015 Ericsson AB and others. +# szilard.cserey@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################### + import common -import os -import shutil from configure_settings import ConfigureSettings from configure_network import ConfigureNetwork @@ -14,6 +21,9 @@ exec_cmd = common.exec_cmd parse = common.parse err = common.err log = common.log +delete = common.delete +create_dir_if_not_exists = common.create_dir_if_not_exists + class ConfigureEnvironment(object): @@ -21,7 +31,6 @@ class ConfigureEnvironment(object): self.env_id = None self.dea = dea self.yaml_config_dir = yaml_config_dir - self.env_name = self.dea.get_property('environment_name') self.release_id = release_id self.node_id_roles_dict = node_id_roles_dict self.required_networks = [] @@ -36,21 +45,20 @@ class ConfigureEnvironment(object): def configure_environment(self): log('Configure environment') - if os.path.exists(self.yaml_config_dir): - log('Deleting existing config directory %s' % self.yaml_config_dir) - shutil.rmtree(self.yaml_config_dir) - log('Creating new config directory %s' % self.yaml_config_dir) - os.makedirs(self.yaml_config_dir) - - mode = self.dea.get_property('environment_mode') + delete(self.yaml_config_dir) + create_dir_if_not_exists(self.yaml_config_dir) + env_name = self.dea.get_env_name() + env_mode = self.dea.get_env_mode() + env_net_segment_type = self.dea.get_env_net_segment_type() log('Creating environment %s release %s, mode %s, network-mode neutron' - ', net-segment-type vlan' % (self.env_name, self.release_id, mode)) + ', net-segment-type %s' + % (env_name, self.release_id, env_mode, env_net_segment_type)) exec_cmd('fuel env create --name %s --release %s --mode %s ' - '--network-mode neutron --net-segment-type vlan' - % (self.env_name, self.release_id, mode)) + '--network-mode neutron --net-segment-type %s' + % (env_name, self.release_id, env_mode, env_net_segment_type)) - if not self.env_exists(self.env_name): - err('Failed to create environment %s' % self.env_name) + if not self.env_exists(env_name): + err('Failed to create environment %s' % env_name) self.config_settings() self.config_network() self.config_nodes() @@ -68,6 +76,3 @@ class ConfigureEnvironment(object): nodes = ConfigureNodes(self.yaml_config_dir, self.env_id, self.node_id_roles_dict, self.dea) nodes.config_nodes() - - - diff --git a/fuel/deploy/cloud/configure_network.py b/fuel/deploy/cloud/configure_network.py index 295eb90..0027894 100644 --- a/fuel/deploy/cloud/configure_network.py +++ b/fuel/deploy/cloud/configure_network.py @@ -1,3 +1,13 @@ +############################################################################### +# Copyright (c) 2015 Ericsson AB and others. +# szilard.cserey@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################### + + import common import yaml import io @@ -11,6 +21,8 @@ parse = common.parse err = common.err check_file_exists = common.check_file_exists log = common.log +backup = common.backup + class ConfigureNetwork(object): @@ -41,6 +53,7 @@ class ConfigureNetwork(object): network_yaml = ('%s/network_%s.yaml' % (self.yaml_config_dir, self.env_id)) check_file_exists(network_yaml) + backup(network_yaml) network_config = self.dea.get_property('network') @@ -58,4 +71,4 @@ class ConfigureNetwork(object): network.update(net_id[network['name']]) with io.open(network_yaml, 'w') as stream: - yaml.dump(network_config, stream, default_flow_style=False) \ No newline at end of file + yaml.dump(network_config, stream, default_flow_style=False) diff --git a/fuel/deploy/cloud/configure_nodes.py b/fuel/deploy/cloud/configure_nodes.py index a2f2a10..e76d222 100644 --- a/fuel/deploy/cloud/configure_nodes.py +++ b/fuel/deploy/cloud/configure_nodes.py @@ -1,3 +1,13 @@ +############################################################################### +# Copyright (c) 2015 Ericsson AB and others. +# szilard.cserey@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################### + + import common import yaml import io @@ -12,6 +22,7 @@ parse = common.parse err = common.err check_file_exists = common.check_file_exists log = common.log +backup = common.backup class ConfigureNodes(object): @@ -39,18 +50,18 @@ class ConfigureNodes(object): def modify_node_network_schemes(self, node_id, roles_blade): log('Modify network transformations for node %s' % node_id) type = self.dea.get_node_property(roles_blade[1], 'transformations') - transformations = self.dea.get_transformations(type) - - for node_file in glob.glob('%s/deployment_%s/*_%s.yaml' - % (self.yaml_config_dir, self.env_id, - node_id)): + transformations = self.dea.get_property(type) + deployment_dir = '%s/deployment_%s' % ( + self.yaml_config_dir, self.env_id) + backup(deployment_dir) + for node_file in glob.glob(deployment_dir + '/*_%s.yaml' % node_id): with io.open(node_file) as stream: - node = yaml.load(stream) + node = yaml.load(stream) - node['network_scheme']['transformations'] = transformations + node['network_scheme'].update(transformations) with io.open(node_file, 'w') as stream: - yaml.dump(node, stream, default_flow_style=False) + yaml.dump(node, stream, default_flow_style=False) def download_deployment_config(self): log('Download deployment config for environment %s' % self.env_id) @@ -77,6 +88,7 @@ class ConfigureNodes(object): interface_yaml = ('%s/node_%s/interfaces.yaml' % (self.yaml_config_dir, node_id)) check_file_exists(interface_yaml) + backup('%s/node_%s' % (self.yaml_config_dir, node_id)) with io.open(interface_yaml) as stream: interfaces = yaml.load(stream) @@ -84,10 +96,10 @@ class ConfigureNodes(object): net_name_id = {} for interface in interfaces: for network in interface['assigned_networks']: - net_name_id[network['name']] = network['id'] + net_name_id[network['name']] = network['id'] type = self.dea.get_node_property(roles_blade[1], 'interfaces') - interface_config = self.dea.get_interfaces(type) + interface_config = self.dea.get_property(type) for interface in interfaces: interface['assigned_networks'] = [] @@ -99,4 +111,4 @@ class ConfigureNodes(object): interface['assigned_networks'].append(net) with io.open(interface_yaml, 'w') as stream: - yaml.dump(interfaces, stream, default_flow_style=False) \ No newline at end of file + yaml.dump(interfaces, stream, default_flow_style=False) diff --git a/fuel/deploy/cloud/configure_settings.py b/fuel/deploy/cloud/configure_settings.py index ac0afdc..fa918fd 100644 --- a/fuel/deploy/cloud/configure_settings.py +++ b/fuel/deploy/cloud/configure_settings.py @@ -1,3 +1,12 @@ +############################################################################### +# Copyright (c) 2015 Ericsson AB and others. +# szilard.cserey@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################### + import common import yaml import io @@ -11,6 +20,8 @@ parse = common.parse err = common.err check_file_exists = common.check_file_exists log = common.log +backup = common.backup + class ConfigureSettings(object): @@ -40,6 +51,7 @@ class ConfigureSettings(object): settings_yaml = ('%s/settings_%s.yaml' % (self.yaml_config_dir, self.env_id)) check_file_exists(settings_yaml) + backup(settings_yaml) settings = self.dea.get_property('settings') diff --git a/fuel/deploy/cloud/deploy.py b/fuel/deploy/cloud/deploy.py index c423834..1534f0b 100644 --- a/fuel/deploy/cloud/deploy.py +++ b/fuel/deploy/cloud/deploy.py @@ -1,7 +1,17 @@ -import time +############################################################################### +# Copyright (c) 2015 Ericsson AB and others. +# szilard.cserey@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################### + + +import os import yaml import io -import sys +import glob import common from dea import DeploymentEnvironmentAdapter @@ -22,173 +32,94 @@ log = common.log commafy = common.commafy ArgParser = common.ArgParser + class Deploy(object): - def __init__(self, dea_file, macs_file): + def __init__(self, dea_file, blade_node_file, plugins_dir, + no_health_check): self.dea = DeploymentEnvironmentAdapter(dea_file) - self.macs_file = macs_file + self.blade_node_file = blade_node_file + self.plugins_dir = plugins_dir + self.no_health_check = no_health_check self.macs_per_blade = {} self.blades = self.dea.get_node_ids() - self.node_ids_dict = {} - self.node_id_roles_dict = {} - self.supported_release = None + self.blade_node_dict = {} + self.node_roles_dict = {} self.env_id = None - self.wanted_release = self.dea.get_wanted_release() - - def cleanup_fuel_environments(self, env_list): - WAIT_LOOP = 60 - SLEEP_TIME = 10 - for env in env_list: - log('Deleting environment %s' % env[E['id']]) - exec_cmd('fuel env --env %s --delete' % env[E['id']]) - all_env_erased = False - for i in range(WAIT_LOOP): - env_list = parse(exec_cmd('fuel env list')) - if env_list: - time.sleep(SLEEP_TIME) - else: - all_env_erased = True - break - if not all_env_erased: - err('Could not erase these environments %s' - % [(env[E['id']], env[E['status']]) for env in env_list]) - - def cleanup_fuel_nodes(self, node_list): - for node in node_list: - if node[N['status']] == 'discover': - log('Deleting node %s' % node[N['id']]) - exec_cmd('fuel node --node-id %s --delete-from-db' - % node[N['id']]) - exec_cmd('cobbler system remove --name node-%s' - % node[N['id']], False) - - def check_previous_installation(self): - log('Check previous installation') - env_list = parse(exec_cmd('fuel env list')) - if env_list: - self.cleanup_fuel_environments(env_list) - node_list = parse(exec_cmd('fuel node list')) - if node_list: - self.cleanup_fuel_nodes(node_list) - - def check_supported_release(self): - log('Check supported release: %s' % self.wanted_release) - release_list = parse(exec_cmd('fuel release -l')) - for release in release_list: - if release[R['name']] == self.wanted_release: - self.supported_release = release - break - if not self.supported_release: - err('This Fuel does not contain the following release: %s' - % self.wanted_release) - - def check_prerequisites(self): - log('Check prerequisites') - self.check_supported_release() - self.check_previous_installation() - - def get_mac_addresses(self): - with io.open(self.macs_file, 'r') as stream: - self.macs_per_blade = yaml.load(stream) - - def find_mac_in_dict(self, mac): - for blade, mac_list in self.macs_per_blade.iteritems(): - if mac in mac_list: - return blade - - def all_blades_discovered(self): - for blade, node_id in self.node_ids_dict.iteritems(): - if not node_id: - return False - return True - - def not_discovered_blades_summary(self): - summary = '' - for blade, node_id in self.node_ids_dict.iteritems(): - if not node_id: - summary += '\n[blade %s]' % blade - return summary - - def node_discovery(self, node_list, discovered_macs): - for node in node_list: - if (node[N['status']] == 'discover' and - node[N['online']] == 'True' and - node[N['mac']] not in discovered_macs): - discovered_macs.append(node[N['mac']]) - blade = self.find_mac_in_dict(node[N['mac']]) - if blade: - log('Blade %s discovered as Node %s with MAC %s' - % (blade, node[N['id']], node[N['mac']])) - self.node_ids_dict[blade] = node[N['id']] - - def discovery_waiting_loop(self, discovered_macs): - WAIT_LOOP = 320 - SLEEP_TIME = 10 - all_discovered = False - for i in range(WAIT_LOOP): - node_list = parse(exec_cmd('fuel node list')) - if node_list: - self.node_discovery(node_list, discovered_macs) - if self.all_blades_discovered(): - all_discovered = True - break - else: - time.sleep(SLEEP_TIME) - return all_discovered - - def wait_for_discovered_blades(self): - log('Wait for discovered blades') - discovered_macs = [] - for blade in self.blades: - self.node_ids_dict[blade] = None - all_discovered = self.discovery_waiting_loop(discovered_macs) - if not all_discovered: - err('Not all blades have been discovered: %s' - % self.not_discovered_blades_summary()) + self.wanted_release = self.dea.get_property('wanted_release') + + def get_blade_node_mapping(self): + with io.open(self.blade_node_file, 'r') as stream: + self.blade_node_dict = yaml.load(stream) def assign_roles_to_cluster_node_ids(self): - self.node_id_roles_dict = {} - for blade, node_id in self.node_ids_dict.iteritems(): + self.node_roles_dict = {} + for blade, node in self.blade_node_dict.iteritems(): roles = commafy(self.dea.get_node_role(blade)) - self.node_id_roles_dict[node_id] = (roles, blade) + self.node_roles_dict[node] = (roles, blade) def configure_environment(self): + release_list = parse(exec_cmd('fuel release -l')) + for release in release_list: + if release[R['name']] == self.wanted_release: + break config_env = ConfigureEnvironment(self.dea, YAML_CONF_DIR, - self.supported_release[R['id']], - self.node_id_roles_dict) + release[R['id']], + self.node_roles_dict) config_env.configure_environment() self.env_id = config_env.env_id def deploy_cloud(self): dep = Deployment(self.dea, YAML_CONF_DIR, self.env_id, - self.node_id_roles_dict) + self.node_roles_dict, self.no_health_check) dep.deploy() + def install_plugins(self): + log('Installing Fuel Plugins') + if self.plugins_dir and os.path.isdir(self.plugins_dir): + for f in glob.glob('%s/*.rpm' % self.plugins_dir): + log('Found plugin %s, installing ...' % f) + r, c = exec_cmd('fuel plugins --install %s' % f, False) + if c > 0 and 'does not update installed package' not in r: + err('Installation of Fuel Plugin %s failed' % f) + def deploy(self): - self.get_mac_addresses() - self.check_prerequisites() - self.wait_for_discovered_blades() + + self.install_plugins() + + self.get_blade_node_mapping() + self.assign_roles_to_cluster_node_ids() + self.configure_environment() + self.deploy_cloud() + def parse_arguments(): parser = ArgParser(prog='python %s' % __file__) + parser.add_argument('-nh', dest='no_health_check', action='store_true', + default=False, + help='Don\'t run health check after deployment') parser.add_argument('dea_file', action='store', help='Deployment Environment Adapter: dea.yaml') - parser.add_argument('macs_file', action='store', - help='Blade MAC addresses: macs.yaml') + parser.add_argument('blade_node_file', action='store', + help='Blade Node mapping: blade_node.yaml') + parser.add_argument('plugins_dir', nargs='?', action='store', + help='Plugins directory') args = parser.parse_args() check_file_exists(args.dea_file) - check_file_exists(args.macs_file) - return (args.dea_file, args.macs_file) + check_file_exists(args.blade_node_file) + return (args.dea_file, args.blade_node_file, args.plugins_dir, + args.no_health_check) + def main(): - dea_file, macs_file = parse_arguments() + dea_file, blade_node_file, plugins_dir, no_health_check = parse_arguments() - deploy = Deploy(dea_file, macs_file) + deploy = Deploy(dea_file, blade_node_file, plugins_dir, no_health_check) deploy.deploy() if __name__ == '__main__': - main() \ No newline at end of file + main() diff --git a/fuel/deploy/cloud/deployment.py b/fuel/deploy/cloud/deployment.py index 0054c5b..43bd4b6 100644 --- a/fuel/deploy/cloud/deployment.py +++ b/fuel/deploy/cloud/deployment.py @@ -1,3 +1,13 @@ +############################################################################### +# Copyright (c) 2015 Ericsson AB and others. +# szilard.cserey@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################### + + import common import os import shutil @@ -15,20 +25,26 @@ run_proc = common.run_proc parse = common.parse err = common.err log = common.log +literal_unicode = common.literal_unicode +literal_unicode_representer = common.literal_unicode_representer +yaml.add_representer(literal_unicode, literal_unicode_representer) +backup = common.backup class Deployment(object): - def __init__(self, dea, yaml_config_dir, env_id, node_id_roles_dict): + def __init__(self, dea, yaml_config_dir, env_id, node_id_roles_dict, + no_health_check): self.dea = dea self.yaml_config_dir = yaml_config_dir self.env_id = env_id self.node_id_roles_dict = node_id_roles_dict + self.no_health_check = no_health_check def download_deployment_info(self): log('Download deployment info for environment %s' % self.env_id) - deployment_dir = '%s/deployment_%s' \ - % (self.yaml_config_dir, self.env_id) + deployment_dir = ('%s/deployment_%s' + % (self.yaml_config_dir, self.env_id)) if os.path.exists(deployment_dir): shutil.rmtree(deployment_dir) exec_cmd('fuel deployment --env %s --download --dir %s' @@ -39,21 +55,54 @@ class Deployment(object): exec_cmd('fuel --env %s deployment --upload --dir %s' % (self.env_id, self.yaml_config_dir)) + def __update_opnfv_dict(self, opnfv_dict, key, node_type, val): + if val: + if key not in opnfv_dict: + opnfv_dict.update({key: {}}) + opnfv_dict[key].update({node_type: val}) + def config_opnfv(self): log('Configure OPNFV settings on environment %s' % self.env_id) - opnfv_compute = self.dea.get_opnfv('compute') - opnfv_controller = self.dea.get_opnfv('controller') self.download_deployment_info() + + opnfv = {'opnfv': {}} + dns_list = self.dea.get_dns_list() + host_list = self.dea.get_hosts() + + ntp_list_for_controller = '' + for ntp in self.dea.get_ntp_list(): + ntp_list_for_controller += 'server %s\n' % ntp + + ntp_list_for_compute = '' + for controller_file in glob.glob( + '%s/deployment_%s/*controller*.yaml' + % (self.yaml_config_dir, self.env_id)): + with io.open(controller_file) as stream: + controller = yaml.load(stream) + ntp_list_for_compute += 'server %s\n' % controller['fqdn'] + + self.__update_opnfv_dict( + opnfv['opnfv'], 'dns', 'controller', dns_list[:]) + self.__update_opnfv_dict( + opnfv['opnfv'], 'dns', 'compute', dns_list[:]) + self.__update_opnfv_dict( + opnfv['opnfv'], 'ntp', 'controller', + literal_unicode(ntp_list_for_controller)) + self.__update_opnfv_dict( + opnfv['opnfv'], 'ntp', 'compute', + literal_unicode(ntp_list_for_compute)) + + if host_list: + opnfv['opnfv'].update({'hosts': host_list}) + for node_file in glob.glob('%s/deployment_%s/*.yaml' % (self.yaml_config_dir, self.env_id)): - with io.open(node_file) as stream: - node = yaml.load(stream) - if node['role'] == 'compute': - node.update(opnfv_compute) - else: - node.update(opnfv_controller) - with io.open(node_file, 'w') as stream: - yaml.dump(node, stream, default_flow_style=False) + with io.open(node_file) as stream: + node = yaml.load(stream) + node.update(opnfv) + with io.open(node_file, 'w') as stream: + yaml.dump(node, stream, default_flow_style=False) + self.upload_deployment_info() def run_deploy(self): @@ -103,11 +152,15 @@ class Deployment(object): def health_check(self): log('Now running sanity and smoke health checks') - log(exec_cmd('fuel health --env %s --check sanity,smoke --force' - % self.env_id)) - + r = exec_cmd('fuel health --env %s --check sanity,smoke --force' + % self.env_id) + log(r) + if 'failure' in r: + err('Healthcheck failed!') + def deploy(self): self.config_opnfv() self.run_deploy() self.verify_node_status() - self.health_check() \ No newline at end of file + if not self.no_health_check: + self.health_check() diff --git a/fuel/deploy/common.py b/fuel/deploy/common.py index dc12637..ab2bf68 100644 --- a/fuel/deploy/common.py +++ b/fuel/deploy/common.py @@ -1,8 +1,20 @@ +############################################################################### +# Copyright (c) 2015 Ericsson AB and others. +# szilard.cserey@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################### + import subprocess import sys import os import logging import argparse +import shutil +import stat +import errno N = {'id': 0, 'status': 1, 'name': 2, 'cluster': 3, 'ip': 4, 'mac': 5, 'roles': 6, 'pending_roles': 7, 'online': 8} @@ -20,6 +32,7 @@ LOG.addHandler(out_handler) out_handler = logging.FileHandler('autodeploy.log', mode='w') out_handler.setFormatter(formatter) LOG.addHandler(out_handler) +os.chmod('autodeploy.log', stat.S_IRWXU | stat.S_IRWXG | stat.S_IRWXO) def exec_cmd(cmd, check=True): process = subprocess.Popen(cmd, @@ -35,6 +48,7 @@ def exec_cmd(cmd, check=True): return response return response, return_code + def run_proc(cmd): process = subprocess.Popen(cmd, stdout=subprocess.PIPE, @@ -42,14 +56,16 @@ def run_proc(cmd): shell=True) return process + def parse(printout): parsed_list = [] lines = printout.splitlines() for l in lines[2:]: - parsed = [e.strip() for e in l.split('|')] - parsed_list.append(parsed) + parsed = [e.strip() for e in l.split('|')] + parsed_list.append(parsed) return parsed_list + def clean(lines): parsed_list = [] parsed = [] @@ -62,42 +78,80 @@ def clean(lines): parsed_list.append(parsed) return parsed if len(parsed_list) == 1 else parsed_list + def err(message): LOG.error('%s\n' % message) sys.exit(1) + +def warn(message): + LOG.warning('%s\n' % message) + + def check_file_exists(file_path): if not os.path.isfile(file_path): err('ERROR: File %s not found\n' % file_path) + def check_dir_exists(dir_path): if not os.path.isdir(dir_path): err('ERROR: Directory %s not found\n' % dir_path) + def create_dir_if_not_exists(dir_path): if not os.path.isdir(dir_path): log('Creating directory %s' % dir_path) os.makedirs(dir_path) + +def delete(f): + if os.path.isfile(f): + log('Deleting file %s' % f) + os.remove(file) + elif os.path.isdir(f): + log('Deleting directory %s' % f) + shutil.rmtree(f) + + def commafy(comma_separated_list): l = [c.strip() for c in comma_separated_list.split(',')] return ','.join(l) -def delete_file(file): - if os.path.exists(file): - os.remove(file) def check_if_root(): r = exec_cmd('whoami') if r != 'root': err('You need be root to run this application') + def log(message): LOG.debug('%s\n' % message) + class ArgParser(argparse.ArgumentParser): + def error(self, message): sys.stderr.write('ERROR: %s\n' % message) self.print_help() sys.exit(2) + +class literal_unicode(unicode): + pass + + +def literal_unicode_representer(dumper, data): + return dumper.represent_scalar(u'tag:yaml.org,2002:str', data, style='|') + + +def backup(path): + src = path + dst = path + '_orig' + delete(dst) + try: + shutil.copytree(src, dst) + except OSError as e: + if e.errno == errno.ENOTDIR: + shutil.copy(src, dst) + else: + raise diff --git a/fuel/deploy/dea.py b/fuel/deploy/dea.py index 61ebea3..9c1ebfc 100644 --- a/fuel/deploy/dea.py +++ b/fuel/deploy/dea.py @@ -1,8 +1,20 @@ +############################################################################### +# Copyright (c) 2015 Ericsson AB and others. +# szilard.cserey@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################### + + import yaml import io import netaddr + class DeploymentEnvironmentAdapter(object): + def __init__(self, yaml_path): self.dea_struct = None self.parse_yaml(yaml_path) @@ -19,6 +31,15 @@ class DeploymentEnvironmentAdapter(object): with io.open(yaml_path) as yaml_file: self.dea_struct = yaml.load(yaml_file) + def get_env_name(self): + return self.get_property('environment')['name'] + + def get_env_mode(self): + return self.get_property('environment')['mode'] + + def get_env_net_segment_type(self): + return self.get_property('environment')['net_segment_type'] + def get_fuel_config(self): return self.dea_struct['fuel'] @@ -48,8 +69,6 @@ class DeploymentEnvironmentAdapter(object): return node[property_name] def get_node_role(self, node_id): - role_list = [] - return self.get_node_property(node_id, 'role') def get_node_ids(self): @@ -69,14 +88,20 @@ class DeploymentEnvironmentAdapter(object): def get_network_names(self): return self.network_names - def get_interfaces(self, type): - return self.dea_struct['interfaces'][type] - - def get_transformations(self, type): - return self.dea_struct['transformations'][type] - - def get_opnfv(self, role): - return {'opnfv': self.dea_struct['opnfv'][role]} - - def get_wanted_release(self): - return self.dea_struct['wanted_release'] \ No newline at end of file + def get_dns_list(self): + settings = self.get_property('settings') + dns_list = settings['editable']['external_dns']['dns_list']['value'] + return [d.strip() for d in dns_list.split(',')] + + def get_ntp_list(self): + settings = self.get_property('settings') + ntp_list = settings['editable']['external_ntp']['ntp_list']['value'] + return [n.strip() for n in ntp_list.split(',')] + + def get_hosts(self): + opnfv = self.get_property('opnfv') + hosts_list = [] + for host in opnfv['hosts']: + if host['address'] and host['fqdn']: + hosts_list.append(host) + return hosts_list diff --git a/fuel/deploy/deploy.py b/fuel/deploy/deploy.py index 33c6f9f..1acce42 100644 --- a/fuel/deploy/deploy.py +++ b/fuel/deploy/deploy.py @@ -1,34 +1,46 @@ +############################################################################### +# Copyright (c) 2015 Ericsson AB and others. +# szilard.cserey@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################### + + import os -import shutil import io import re import sys import netaddr -import uuid import yaml from dea import DeploymentEnvironmentAdapter from dha import DeploymentHardwareAdapter from install_fuel_master import InstallFuelMaster from deploy_env import CloudDeploy -from setup_execution_environment import ExecutionEnvironment +from execution_environment import ExecutionEnvironment import common log = common.log exec_cmd = common.exec_cmd err = common.err +warn = common.warn check_file_exists = common.check_file_exists check_dir_exists = common.check_dir_exists create_dir_if_not_exists = common.create_dir_if_not_exists +delete = common.delete check_if_root = common.check_if_root ArgParser = common.ArgParser FUEL_VM = 'fuel' PATCH_DIR = 'fuel_patch' -WORK_DIR = 'deploy' +WORK_DIR = '~/deploy' CWD = os.getcwd() + class cd: + def __init__(self, new_path): self.new_path = os.path.expanduser(new_path) @@ -42,15 +54,22 @@ class cd: class AutoDeploy(object): - def __init__(self, without_fuel, storage_dir, pxe_bridge, iso_file, - dea_file, dha_file): - self.without_fuel = without_fuel + def __init__(self, no_fuel, fuel_only, no_health_check, cleanup_only, + cleanup, storage_dir, pxe_bridge, iso_file, dea_file, + dha_file, fuel_plugins_dir): + self.no_fuel = no_fuel + self.fuel_only = fuel_only + self.no_health_check = no_health_check + self.cleanup_only = cleanup_only + self.cleanup = cleanup self.storage_dir = storage_dir self.pxe_bridge = pxe_bridge self.iso_file = iso_file self.dea_file = dea_file self.dha_file = dha_file - self.dea = DeploymentEnvironmentAdapter(dea_file) + self.fuel_plugins_dir = fuel_plugins_dir + self.dea = (DeploymentEnvironmentAdapter(dea_file) + if not cleanup_only else None) self.dha = DeploymentHardwareAdapter(dha_file) self.fuel_conf = {} self.fuel_node_id = self.dha.get_fuel_node_id() @@ -101,7 +120,7 @@ class AutoDeploy(object): exec_cmd('find . | cpio -pd %s' % tmp_new_dir) with cd(tmp_new_dir): exec_cmd('fusermount -u %s' % tmp_orig_dir) - shutil.rmtree(tmp_orig_dir) + delete(tmp_orig_dir) exec_cmd('chmod -R 755 %s' % tmp_new_dir) def patch(self, tmp_new_dir, new_iso): @@ -111,7 +130,7 @@ class AutoDeploy(object): with cd(tmp_new_dir): exec_cmd('cat %s | patch -p0' % ks_path) - shutil.rmtree('.rr_moved') + delete('.rr_moved') isolinux = 'isolinux/isolinux.cfg' log('isolinux.cfg before: %s' % exec_cmd('grep netmask %s' % isolinux)) @@ -137,8 +156,10 @@ class AutoDeploy(object): f.write(data) def deploy_env(self): - dep = CloudDeploy(self.dha, self.fuel_conf['ip'], self.fuel_username, - self.fuel_password, self.dea_file, WORK_DIR) + dep = CloudDeploy(self.dea, self.dha, self.fuel_conf['ip'], + self.fuel_username, self.fuel_password, + self.dea_file, self.fuel_plugins_dir, WORK_DIR, + self.no_health_check) return dep.deploy() def setup_execution_environment(self): @@ -146,19 +167,36 @@ class AutoDeploy(object): self.dha_file, self.dea) exec_env.setup_environment() + def cleanup_execution_environment(self): + exec_env = ExecutionEnvironment(self.storage_dir, self.pxe_bridge, + self.dha_file, self.dea) + exec_env.cleanup_environment() + def create_tmp_dir(self): - self.tmp_dir = '%s/fueltmp-%s' % (CWD, str(uuid.uuid1())) - os.makedirs(self.tmp_dir) + self.tmp_dir = '%s/fueltmp' % CWD + delete(self.tmp_dir) + create_dir_if_not_exists(self.tmp_dir) def deploy(self): - check_if_root() self.collect_fuel_info() - if not self.without_fuel: + if not self.no_fuel: self.setup_execution_environment() self.create_tmp_dir() self.install_fuel_master() - shutil.rmtree(self.tmp_dir) - return self.deploy_env() + if not self.fuel_only: + return self.deploy_env() + return True + + def run(self): + check_if_root() + if self.cleanup_only: + self.cleanup_execution_environment() + else: + deploy_success = self.deploy() + if self.cleanup: + self.cleanup_execution_environment() + return deploy_success + return True def check_bridge(pxe_bridge, dha_path): with io.open(dha_path) as yaml_file: @@ -167,23 +205,63 @@ def check_bridge(pxe_bridge, dha_path): log('Using Linux Bridge %s for booting up the Fuel Master VM' % pxe_bridge) r = exec_cmd('ip link show %s' % pxe_bridge) - if pxe_bridge in r and 'state UP' not in r: - err('Linux Bridge {0} is not Active, ' - 'bring it UP first: [ip link set dev {0} up]' % pxe_bridge) + if pxe_bridge in r and 'state DOWN' in r: + err('Linux Bridge {0} is not Active, bring' + ' it UP first: [ip link set dev {0} up]'.format(pxe_bridge)) + + +def check_fuel_plugins_dir(dir): + msg = None + if not dir: + msg = 'Fuel Plugins Directory not specified!' + elif not os.path.isdir(dir): + msg = 'Fuel Plugins Directory does not exist!' + elif not os.listdir(dir): + msg = 'Fuel Plugins Directory is empty!' + if msg: + warn('%s Opendaylight Fuel Plugin will not be installed!' % msg) + def parse_arguments(): parser = ArgParser(prog='python %s' % __file__) - parser.add_argument('-nf', dest='without_fuel', action='store_true', + parser.add_argument('-nf', dest='no_fuel', action='store_true', default=False, help='Do not install Fuel Master (and Node VMs when ' 'using libvirt)') - parser.add_argument('iso_file', nargs='?', action='store', - default='%s/OPNFV.iso' % CWD, - help='ISO File [default: OPNFV.iso]') - parser.add_argument('dea_file', action='store', - help='Deployment Environment Adapter: dea.yaml') - parser.add_argument('dha_file', action='store', - help='Deployment Hardware Adapter: dha.yaml') + parser.add_argument('-nh', dest='no_health_check', action='store_true', + default=False, + help='Don\'t run health check after deployment') + parser.add_argument('-fo', dest='fuel_only', action='store_true', + default=False, + help='Install Fuel Master only (and Node VMs when ' + 'using libvirt)') + parser.add_argument('-co', dest='cleanup_only', action='store_true', + default=False, + help='Cleanup VMs and Virtual Networks according to ' + 'what is defined in DHA') + parser.add_argument('-c', dest='cleanup', action='store_true', + default=False, + help='Cleanup after deploy') + if {'-iso', '-dea', '-dha', '-h'}.intersection(sys.argv): + parser.add_argument('-iso', dest='iso_file', action='store', nargs='?', + default='%s/OPNFV.iso' % CWD, + help='ISO File [default: OPNFV.iso]') + parser.add_argument('-dea', dest='dea_file', action='store', nargs='?', + default='%s/dea.yaml' % CWD, + help='Deployment Environment Adapter: dea.yaml') + parser.add_argument('-dha', dest='dha_file', action='store', nargs='?', + default='%s/dha.yaml' % CWD, + help='Deployment Hardware Adapter: dha.yaml') + else: + parser.add_argument('iso_file', action='store', nargs='?', + default='%s/OPNFV.iso' % CWD, + help='ISO File [default: OPNFV.iso]') + parser.add_argument('dea_file', action='store', nargs='?', + default='%s/dea.yaml' % CWD, + help='Deployment Environment Adapter: dea.yaml') + parser.add_argument('dha_file', action='store', nargs='?', + default='%s/dha.yaml' % CWD, + help='Deployment Hardware Adapter: dha.yaml') parser.add_argument('-s', dest='storage_dir', action='store', default='%s/images' % CWD, help='Storage Directory [default: images]') @@ -191,31 +269,40 @@ def parse_arguments(): default='pxebr', help='Linux Bridge for booting up the Fuel Master VM ' '[default: pxebr]') + parser.add_argument('-p', dest='fuel_plugins_dir', action='store', + help='Fuel Plugins directory') args = parser.parse_args() log(args) - check_file_exists(args.dea_file) check_file_exists(args.dha_file) - if not args.without_fuel: + if not args.cleanup_only: + check_file_exists(args.dea_file) + check_fuel_plugins_dir(args.fuel_plugins_dir) + + if not args.no_fuel and not args.cleanup_only: log('Using OPNFV ISO file: %s' % args.iso_file) check_file_exists(args.iso_file) log('Using image directory: %s' % args.storage_dir) create_dir_if_not_exists(args.storage_dir) check_bridge(args.pxe_bridge, args.dha_file) - return (args.without_fuel, args.storage_dir, args.pxe_bridge, - args.iso_file, args.dea_file, args.dha_file) + kwargs = {'no_fuel': args.no_fuel, 'fuel_only': args.fuel_only, + 'no_health_check': args.no_health_check, + 'cleanup_only': args.cleanup_only, 'cleanup': args.cleanup, + 'storage_dir': args.storage_dir, 'pxe_bridge': args.pxe_bridge, + 'iso_file': args.iso_file, 'dea_file': args.dea_file, + 'dha_file': args.dha_file, + 'fuel_plugins_dir': args.fuel_plugins_dir} + return kwargs def main(): - without_fuel, storage_dir, pxe_bridge, iso_file, dea_file, dha_file = \ - parse_arguments() + kwargs = parse_arguments() - d = AutoDeploy(without_fuel, storage_dir, pxe_bridge, iso_file, - dea_file, dha_file) - sys.exit(d.deploy()) + d = AutoDeploy(**kwargs) + sys.exit(d.run()) if __name__ == '__main__': - main() \ No newline at end of file + main() diff --git a/fuel/deploy/deploy_env.py b/fuel/deploy/deploy_env.py index 084f37e..4953bde 100644 --- a/fuel/deploy/deploy_env.py +++ b/fuel/deploy/deploy_env.py @@ -1,7 +1,18 @@ +############################################################################### +# Copyright (c) 2015 Ericsson AB and others. +# szilard.cserey@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################### + + import os import io import yaml import glob +import time from ssh_client import SSHClient import common @@ -10,38 +21,58 @@ exec_cmd = common.exec_cmd err = common.err check_file_exists = common.check_file_exists log = common.log +parse = common.parse +commafy = common.commafy +N = common.N +E = common.E +R = common.R +RO = common.RO CLOUD_DEPLOY_FILE = 'deploy.py' +BLADE_RESTART_TIMES = 3 +PLUGINS_DIR = '~/plugins' class CloudDeploy(object): - def __init__(self, dha, fuel_ip, fuel_username, fuel_password, dea_file, - work_dir): + def __init__(self, dea, dha, fuel_ip, fuel_username, fuel_password, + dea_file, fuel_plugins_dir, work_dir, no_health_check): + self.dea = dea self.dha = dha self.fuel_ip = fuel_ip self.fuel_username = fuel_username self.fuel_password = fuel_password self.dea_file = dea_file + self.fuel_plugins_dir = fuel_plugins_dir self.work_dir = work_dir + self.no_health_check = no_health_check self.file_dir = os.path.dirname(os.path.realpath(__file__)) self.ssh = SSHClient(self.fuel_ip, self.fuel_username, self.fuel_password) - self.macs_file = '%s/macs.yaml' % self.file_dir + self.blade_node_file = '%s/blade_node.yaml' % self.file_dir self.node_ids = self.dha.get_node_ids() + self.wanted_release = self.dea.get_property('wanted_release') + self.blade_node_dict = {} + self.macs_per_blade = {} def upload_cloud_deployment_files(self): - dest ='~/%s/' % self.work_dir - with self.ssh as s: - s.exec_cmd('rm -rf %s' % self.work_dir, check=False) - s.exec_cmd('mkdir ~/%s' % self.work_dir) - s.scp_put(self.dea_file, dest) - s.scp_put(self.macs_file, dest) - s.scp_put('%s/common.py' % self.file_dir, dest) - s.scp_put('%s/dea.py' % self.file_dir, dest) + s.exec_cmd('rm -rf %s' % self.work_dir, False) + s.exec_cmd('mkdir %s' % self.work_dir) + s.scp_put(self.dea_file, self.work_dir) + s.scp_put(self.blade_node_file, self.work_dir) + s.scp_put('%s/common.py' % self.file_dir, self.work_dir) + s.scp_put('%s/dea.py' % self.file_dir, self.work_dir) for f in glob.glob('%s/cloud/*' % self.file_dir): - s.scp_put(f, dest) + s.scp_put(f, self.work_dir) + + def upload_plugin_files(self): + with self.ssh as s: + s.exec_cmd('rm -rf %s' % PLUGINS_DIR, False) + s.exec_cmd('mkdir %s' % PLUGINS_DIR) + if self.fuel_plugins_dir: + for f in glob.glob('%s/*.rpm' % self.fuel_plugins_dir): + s.scp_put(f, PLUGINS_DIR) def power_off_nodes(self): for node_id in self.node_ids: @@ -56,34 +87,172 @@ class CloudDeploy(object): self.dha.node_set_boot_order(node_id, boot_order_list[:]) def get_mac_addresses(self): - macs_per_node = {} + self.macs_per_blade = {} for node_id in self.node_ids: - macs_per_node[node_id] = self.dha.get_node_pxe_mac(node_id) - with io.open(self.macs_file, 'w') as stream: - yaml.dump(macs_per_node, stream, default_flow_style=False) + self.macs_per_blade[node_id] = self.dha.get_node_pxe_mac(node_id) def run_cloud_deploy(self, deploy_app): log('START CLOUD DEPLOYMENT') deploy_app = '%s/%s' % (self.work_dir, deploy_app) dea_file = '%s/%s' % (self.work_dir, os.path.basename(self.dea_file)) - macs_file = '%s/%s' % (self.work_dir, os.path.basename(self.macs_file)) + blade_node_file = '%s/%s' % ( + self.work_dir, os.path.basename(self.blade_node_file)) with self.ssh as s: - status = s.run('python %s %s %s' - % (deploy_app, dea_file, macs_file)) + status = s.run('python %s %s %s %s %s' + % (('-nh' if self.no_health_check else ''), + deploy_app, dea_file, blade_node_file, + PLUGINS_DIR)) return status - def deploy(self): + def check_supported_release(self): + log('Check supported release: %s' % self.wanted_release) + found = False + release_list = parse(self.ssh.exec_cmd('fuel release -l')) + for release in release_list: + if release[R['name']] == self.wanted_release: + found = True + break + if not found: + err('This Fuel does not contain the following release: %s' + % self.wanted_release) - self.power_off_nodes() + def check_previous_installation(self): + log('Check previous installation') + env_list = parse(self.ssh.exec_cmd('fuel env list')) + if env_list: + self.cleanup_fuel_environments(env_list) + node_list = parse(self.ssh.exec_cmd('fuel node list')) + if node_list: + self.cleanup_fuel_nodes(node_list) - self.set_boot_order(['pxe', 'disk']) + def cleanup_fuel_environments(self, env_list): + WAIT_LOOP = 60 + SLEEP_TIME = 10 + for env in env_list: + log('Deleting environment %s' % env[E['id']]) + self.ssh.exec_cmd('fuel env --env %s --delete --force' + % env[E['id']]) + all_env_erased = False + for i in range(WAIT_LOOP): + env_list = parse(self.ssh.exec_cmd('fuel env list')) + if env_list: + time.sleep(SLEEP_TIME) + else: + all_env_erased = True + break + if not all_env_erased: + err('Could not erase these environments %s' + % [(env[E['id']], env[E['status']]) for env in env_list]) + + def cleanup_fuel_nodes(self, node_list): + for node in node_list: + if node[N['status']] == 'discover': + log('Deleting node %s' % node[N['id']]) + self.ssh.exec_cmd('fuel node --node-id %s --delete-from-db ' + '--force' % node[N['id']]) + self.ssh.exec_cmd('cobbler system remove --name node-%s' + % node[N['id']], False) + + def check_prerequisites(self): + log('Check prerequisites') + with self.ssh: + self.check_supported_release() + self.check_previous_installation() + + def wait_for_discovered_blades(self): + log('Wait for discovered blades') + discovered_macs = [] + restart_times = BLADE_RESTART_TIMES + + for blade in self.node_ids: + self.blade_node_dict[blade] = None + + with self.ssh: + all_discovered = self.discovery_waiting_loop(discovered_macs) + + while not all_discovered and restart_times != 0: + restart_times -= 1 + for blade in self.get_not_discovered_blades(): + self.dha.node_reset(blade) + with self.ssh: + all_discovered = self.discovery_waiting_loop(discovered_macs) + + if not all_discovered: + err('Not all blades have been discovered: %s' + % self.not_discovered_blades_summary()) + with io.open(self.blade_node_file, 'w') as stream: + yaml.dump(self.blade_node_dict, stream, default_flow_style=False) + + def discovery_waiting_loop(self, discovered_macs): + WAIT_LOOP = 360 + SLEEP_TIME = 10 + all_discovered = False + for i in range(WAIT_LOOP): + node_list = parse(self.ssh.exec_cmd('fuel node list')) + if node_list: + self.node_discovery(node_list, discovered_macs) + if self.all_blades_discovered(): + all_discovered = True + break + else: + time.sleep(SLEEP_TIME) + return all_discovered + + def node_discovery(self, node_list, discovered_macs): + for node in node_list: + if (node[N['status']] == 'discover' and + node[N['online']] == 'True' and + node[N['mac']] not in discovered_macs): + discovered_macs.append(node[N['mac']]) + blade = self.find_mac_in_dict(node[N['mac']]) + if blade: + log('Blade %s discovered as Node %s with MAC %s' + % (blade, node[N['id']], node[N['mac']])) + self.blade_node_dict[blade] = node[N['id']] + + def find_mac_in_dict(self, mac): + for blade, mac_list in self.macs_per_blade.iteritems(): + if mac in mac_list: + return blade + + def all_blades_discovered(self): + for blade, node_id in self.blade_node_dict.iteritems(): + if not node_id: + return False + return True + + def not_discovered_blades_summary(self): + summary = '' + for blade, node_id in self.blade_node_dict.iteritems(): + if not node_id: + summary += '\n[blade %s]' % blade + return summary + + def get_not_discovered_blades(self): + not_discovered_blades = [] + for blade, node_id in self.blade_node_dict.iteritems(): + if not node_id: + not_discovered_blades.append(blade) + return not_discovered_blades + + def set_boot_order_nodes(self): + self.power_off_nodes() + self.set_boot_order(['pxe', 'disk']) self.power_on_nodes() + def deploy(self): + + self.set_boot_order_nodes() + + self.check_prerequisites() + self.get_mac_addresses() - check_file_exists(self.macs_file) + self.wait_for_discovered_blades() self.upload_cloud_deployment_files() + self.upload_plugin_files() + return self.run_cloud_deploy(CLOUD_DEPLOY_FILE) diff --git a/fuel/deploy/dha.py b/fuel/deploy/dha.py index bf9a951..1feee60 100644 --- a/fuel/deploy/dha.py +++ b/fuel/deploy/dha.py @@ -1,3 +1,13 @@ +############################################################################### +# Copyright (c) 2015 Ericsson AB and others. +# szilard.cserey@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################### + + import yaml import io @@ -5,15 +15,20 @@ from dha_adapters.libvirt_adapter import LibvirtAdapter from dha_adapters.ipmi_adapter import IpmiAdapter from dha_adapters.hp_adapter import HpAdapter + class DeploymentHardwareAdapter(object): + def __new__(cls, yaml_path): with io.open(yaml_path) as yaml_file: dha_struct = yaml.load(yaml_file) type = dha_struct['adapter'] if cls is DeploymentHardwareAdapter: - if type == 'libvirt': return LibvirtAdapter(yaml_path) - if type == 'ipmi': return IpmiAdapter(yaml_path) - if type == 'hp': return HpAdapter(yaml_path) + if type == 'libvirt': + return LibvirtAdapter(yaml_path) + if type == 'ipmi': + return IpmiAdapter(yaml_path) + if type == 'hp': + return HpAdapter(yaml_path) return super(DeploymentHardwareAdapter, cls).__new__(cls) diff --git a/fuel/deploy/dha_adapters/__init__.py b/fuel/deploy/dha_adapters/__init__.py index e69de29..fb73157 100644 --- a/fuel/deploy/dha_adapters/__init__.py +++ b/fuel/deploy/dha_adapters/__init__.py @@ -0,0 +1,8 @@ +############################################################################### +# Copyright (c) 2015 Ericsson AB and others. +# szilard.cserey@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################### diff --git a/fuel/deploy/dha_adapters/hardware_adapter.py b/fuel/deploy/dha_adapters/hardware_adapter.py index a8d0121..29e04f1 100644 --- a/fuel/deploy/dha_adapters/hardware_adapter.py +++ b/fuel/deploy/dha_adapters/hardware_adapter.py @@ -1,7 +1,18 @@ +############################################################################### +# Copyright (c) 2015 Ericsson AB and others. +# szilard.cserey@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################### + import yaml import io + class HardwareAdapter(object): + def __init__(self, yaml_path): self.dha_struct = None self.parse_yaml(yaml_path) @@ -45,4 +56,4 @@ class HardwareAdapter(object): return node['username'], node['password'] def get_disks(self): - return self.dha_struct['disks'] \ No newline at end of file + return self.dha_struct['disks'] diff --git a/fuel/deploy/dha_adapters/hp_adapter.py b/fuel/deploy/dha_adapters/hp_adapter.py index 8cfec34..51f55f3 100644 --- a/fuel/deploy/dha_adapters/hp_adapter.py +++ b/fuel/deploy/dha_adapters/hp_adapter.py @@ -1,3 +1,13 @@ +############################################################################### +# Copyright (c) 2015 Ericsson AB and others. +# szilard.cserey@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################### + + import common from ipmi_adapter import IpmiAdapter from ssh_client import SSHClient @@ -10,6 +20,7 @@ DEV = {'pxe': 'bootsource5', ROOT = '/system1/bootconfig1' + class HpAdapter(IpmiAdapter): def __init__(self, yaml_path): @@ -22,4 +33,4 @@ class HpAdapter(IpmiAdapter): with ssh as s: for order, dev in enumerate(boot_order_list): s.exec_cmd('set %s/%s bootorder=%s' - % (ROOT, DEV[dev], order+1)) + % (ROOT, DEV[dev], order + 1)) diff --git a/fuel/deploy/dha_adapters/ipmi_adapter.py b/fuel/deploy/dha_adapters/ipmi_adapter.py index 1bef898..25aa36e 100644 --- a/fuel/deploy/dha_adapters/ipmi_adapter.py +++ b/fuel/deploy/dha_adapters/ipmi_adapter.py @@ -1,3 +1,13 @@ +############################################################################### +# Copyright (c) 2015 Ericsson AB and others. +# szilard.cserey@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################### + + import common import time from hardware_adapter import HardwareAdapter @@ -6,6 +16,7 @@ log = common.log exec_cmd = common.exec_cmd err = common.err + class IpmiAdapter(HardwareAdapter): def __init__(self, yaml_path): @@ -104,4 +115,4 @@ class IpmiAdapter(HardwareAdapter): exec_cmd('%s chassis bootdev cdrom' % cmd_prefix) elif dev == 'disk': exec_cmd('%s chassis bootdev disk options=persistent' - % cmd_prefix) \ No newline at end of file + % cmd_prefix) diff --git a/fuel/deploy/dha_adapters/libvirt_adapter.py b/fuel/deploy/dha_adapters/libvirt_adapter.py index 1eca548..b285c16 100644 --- a/fuel/deploy/dha_adapters/libvirt_adapter.py +++ b/fuel/deploy/dha_adapters/libvirt_adapter.py @@ -1,3 +1,13 @@ +############################################################################### +# Copyright (c) 2015 Ericsson AB and others. +# szilard.cserey@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################### + + import common from lxml import etree from hardware_adapter import HardwareAdapter @@ -10,6 +20,7 @@ DEV = {'pxe': 'network', 'disk': 'hd', 'iso': 'cdrom'} + class LibvirtAdapter(HardwareAdapter): def __init__(self, yaml_path): @@ -88,7 +99,8 @@ class LibvirtAdapter(HardwareAdapter): def node_eject_iso(self, node_id): vm_name = self.get_node_property(node_id, 'libvirtName') device = self.get_name_of_device(vm_name, 'cdrom') - exec_cmd('virsh change-media %s --eject %s' % (vm_name, device), False) + exec_cmd('virsh change-media %s --eject %s --config --live' + % (vm_name, device), False) def node_insert_iso(self, node_id, iso_file): vm_name = self.get_node_property(node_id, 'libvirtName') @@ -119,3 +131,6 @@ class LibvirtAdapter(HardwareAdapter): device = target.get('dev') if device: return device + + def get_virt_net_conf_dir(self): + return self.dha_struct['virtNetConfDir'] diff --git a/fuel/deploy/environments/__init__.py b/fuel/deploy/environments/__init__.py index c274feb..fb73157 100644 --- a/fuel/deploy/environments/__init__.py +++ b/fuel/deploy/environments/__init__.py @@ -1 +1,8 @@ -__author__ = 'eszicse' +############################################################################### +# Copyright (c) 2015 Ericsson AB and others. +# szilard.cserey@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################### diff --git a/fuel/deploy/environments/execution_environment.py b/fuel/deploy/environments/execution_environment.py index 4f612a6..63be5cd 100644 --- a/fuel/deploy/environments/execution_environment.py +++ b/fuel/deploy/environments/execution_environment.py @@ -1,3 +1,13 @@ +############################################################################### +# Copyright (c) 2015 Ericsson AB and others. +# szilard.cserey@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################### + + from lxml import etree import common @@ -10,6 +20,7 @@ check_dir_exists = common.check_dir_exists check_file_exists = common.check_file_exists check_if_root = common.check_if_root + class ExecutionEnvironment(object): def __init__(self, storage_dir, dha_file, root_dir): @@ -54,8 +65,8 @@ class ExecutionEnvironment(object): uuid.getparent().remove(uuid) disks = vm_xml.xpath('/domain/devices/disk') for disk in disks: - if (disk.get('type') == 'file' - and disk.get('device') == 'disk'): + if (disk.get('type') == 'file' and + disk.get('device') == 'disk'): sources = disk.xpath('source') for source in sources: disk.remove(source) @@ -64,4 +75,4 @@ class ExecutionEnvironment(object): disk.append(source) with open(temp_vm_file, 'w') as f: vm_xml.write(f, pretty_print=True, xml_declaration=True) - exec_cmd('virsh define %s' % temp_vm_file) \ No newline at end of file + exec_cmd('virsh define %s' % temp_vm_file) diff --git a/fuel/deploy/environments/libvirt_environment.py b/fuel/deploy/environments/libvirt_environment.py index e156fd2..785eeca 100644 --- a/fuel/deploy/environments/libvirt_environment.py +++ b/fuel/deploy/environments/libvirt_environment.py @@ -1,3 +1,13 @@ +############################################################################### +# Copyright (c) 2015 Ericsson AB and others. +# szilard.cserey@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################### + + from lxml import etree import glob @@ -11,7 +21,6 @@ check_dir_exists = common.check_dir_exists check_file_exists = common.check_file_exists check_if_root = common.check_if_root -NET_DIR = 'libvirt/networks' class LibvirtEnvironment(ExecutionEnvironment): @@ -19,17 +28,18 @@ class LibvirtEnvironment(ExecutionEnvironment): super(LibvirtEnvironment, self).__init__( storage_dir, dha_file, root_dir) self.dea = dea - self.network_dir = '%s/%s' % (self.root_dir, NET_DIR) + self.network_dir = '%s/%s' % (self.root_dir, + self.dha.get_virt_net_conf_dir()) self.node_ids = self.dha.get_all_node_ids() self.net_names = self.collect_net_names() def create_storage(self, node_id, disk_path, disk_sizes): if node_id == self.fuel_node_id: - disk_size = disk_sizes['fuel'] + disk_size = disk_sizes['fuel'] else: - roles = self.dea.get_node_role(node_id) - role = 'controller' if 'controller' in roles else 'compute' - disk_size = disk_sizes[role] + roles = self.dea.get_node_role(node_id) + role = 'controller' if 'controller' in roles else 'compute' + disk_size = disk_sizes[role] exec_cmd('fallocate -l %s %s' % (disk_size, disk_path)) def create_vms(self): @@ -48,6 +58,10 @@ class LibvirtEnvironment(ExecutionEnvironment): self.define_vm(vm_name, temp_vm_file, disk_path) exec_cmd('rm -fr %s' % temp_dir) + def start_vms(self): + for node_id in self.node_ids: + self.dha.node_power_on(node_id) + def create_networks(self): for net_file in glob.glob('%s/*' % self.network_dir): exec_cmd('virsh net-define %s' % net_file) @@ -82,11 +96,11 @@ class LibvirtEnvironment(ExecutionEnvironment): self.delete_vm(node_id) def setup_environment(self): - check_if_root() check_dir_exists(self.network_dir) self.cleanup_environment() - self.create_vms() self.create_networks() + self.create_vms() + self.start_vms() def cleanup_environment(self): self.delete_vms() diff --git a/fuel/deploy/environments/virtual_fuel.py b/fuel/deploy/environments/virtual_fuel.py index f8b6791..cb8be63 100644 --- a/fuel/deploy/environments/virtual_fuel.py +++ b/fuel/deploy/environments/virtual_fuel.py @@ -1,3 +1,13 @@ +############################################################################### +# Copyright (c) 2015 Ericsson AB and others. +# szilard.cserey@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################### + + from lxml import etree import common @@ -8,6 +18,7 @@ log = common.log check_file_exists = common.check_file_exists check_if_root = common.check_if_root + class VirtualFuel(ExecutionEnvironment): def __init__(self, storage_dir, pxe_bridge, dha_file, root_dir): diff --git a/fuel/deploy/setup_execution_environment.py b/fuel/deploy/execution_environment.py similarity index 67% rename from fuel/deploy/setup_execution_environment.py rename to fuel/deploy/execution_environment.py index d97fcde..e671463 100644 --- a/fuel/deploy/setup_execution_environment.py +++ b/fuel/deploy/execution_environment.py @@ -1,12 +1,20 @@ +############################################################################### +# Copyright (c) 2015 Ericsson AB and others. +# szilard.cserey@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################### + + import yaml import io -import sys import os import common from environments.libvirt_environment import LibvirtEnvironment from environments.virtual_fuel import VirtualFuel -from dea import DeploymentEnvironmentAdapter exec_cmd = common.exec_cmd err = common.err @@ -16,7 +24,9 @@ check_file_exists = common.check_file_exists check_if_root = common.check_if_root ArgParser = common.ArgParser + class ExecutionEnvironment(object): + def __new__(cls, storage_dir, pxe_bridge, dha_path, dea): with io.open(dha_path) as yaml_file: diff --git a/fuel/deploy/install_fuel_master.py b/fuel/deploy/install_fuel_master.py index b9b7809..9a2599c 100644 --- a/fuel/deploy/install_fuel_master.py +++ b/fuel/deploy/install_fuel_master.py @@ -1,3 +1,13 @@ +############################################################################### +# Copyright (c) 2015 Ericsson AB and others. +# szilard.cserey@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################### + + import common import time import os @@ -7,14 +17,17 @@ from dha_adapters.libvirt_adapter import LibvirtAdapter log = common.log err = common.err clean = common.clean +delete = common.delete TRANSPLANT_FUEL_SETTINGS = 'transplant_fuel_settings.py' BOOTSTRAP_ADMIN = '/usr/local/sbin/bootstrap_admin_node' +FUEL_CLIENT_CONFIG = '/etc/fuel/client/config.yaml' + class InstallFuelMaster(object): - def __init__(self, dea_file, dha_file, fuel_ip, fuel_username, fuel_password, - fuel_node_id, iso_file, work_dir): + def __init__(self, dea_file, dha_file, fuel_ip, fuel_username, + fuel_password, fuel_node_id, iso_file, work_dir): self.dea_file = dea_file self.dha = LibvirtAdapter(dha_file) self.fuel_ip = fuel_ip @@ -22,6 +35,7 @@ class InstallFuelMaster(object): self.fuel_password = fuel_password self.fuel_node_id = fuel_node_id self.iso_file = iso_file + self.iso_dir = os.path.dirname(self.iso_file) self.work_dir = work_dir self.file_dir = os.path.dirname(os.path.realpath(__file__)) self.ssh = SSHClient(self.fuel_ip, self.fuel_username, @@ -67,8 +81,9 @@ class InstallFuelMaster(object): log('Waiting for one minute for Fuel to stabilize') time.sleep(60) - log('Eject ISO') - self.dha.node_eject_iso(self.fuel_node_id) + self.delete_deprecated_fuel_client_config_from_fuel_6_1() + + self.post_install_cleanup() log('Fuel Master installed successfully !') @@ -89,7 +104,7 @@ class InstallFuelMaster(object): self.ssh.close() if not success: - err('Could not SSH into Fuel VM %s' % self.fuel_ip) + err('Could not SSH into Fuel VM %s' % self.fuel_ip) def wait_until_fuel_menu_up(self): WAIT_LOOP = 60 @@ -110,12 +125,9 @@ class InstallFuelMaster(object): return fuel_menu_pid def get_fuel_menu_pid(self, printout, search): - fuel_menu_pid = None for line in printout.splitlines(): - if search in line: - fuel_menu_pid = clean(line)[1] - break - return fuel_menu_pid + if line.endswith(search): + return clean(line)[1] def ssh_exec_cmd(self, cmd, check=True): with self.ssh: @@ -123,17 +135,16 @@ class InstallFuelMaster(object): return ret def inject_own_astute_yaml(self): - dest ='~/%s/' % self.work_dir - with self.ssh as s: - s.exec_cmd('rm -rf %s' % self.work_dir, check=False) - s.exec_cmd('mkdir ~/%s' % self.work_dir) - s.scp_put(self.dea_file, dest) - s.scp_put('%s/common.py' % self.file_dir, dest) - s.scp_put('%s/dea.py' % self.file_dir, dest) - s.scp_put('%s/transplant_fuel_settings.py' % self.file_dir, dest) + s.exec_cmd('rm -rf %s' % self.work_dir, False) + s.exec_cmd('mkdir %s' % self.work_dir) + s.scp_put(self.dea_file, self.work_dir) + s.scp_put('%s/common.py' % self.file_dir, self.work_dir) + s.scp_put('%s/dea.py' % self.file_dir, self.work_dir) + s.scp_put('%s/transplant_fuel_settings.py' + % self.file_dir, self.work_dir) log('Modifying Fuel astute') - s.run('python ~/%s/%s ~/%s/%s' + s.run('python %s/%s %s/%s' % (self.work_dir, TRANSPLANT_FUEL_SETTINGS, self.work_dir, os.path.basename(self.dea_file))) @@ -153,4 +164,42 @@ class InstallFuelMaster(object): time.sleep(SLEEP_TIME) if not install_completed: + self.post_install_cleanup() err('Fuel installation did not complete') + + def post_install_cleanup(self): + log('Eject ISO file %s' % self.iso_file) + self.dha.node_eject_iso(self.fuel_node_id) + log('Remove ISO directory %s' % self.iso_dir) + delete(self.iso_dir) + + def delete_deprecated_fuel_client_config_from_fuel_6_1(self): + with self.ssh as s: + response, error = s.exec_cmd('fuel -v', False) + if (error and + 'DEPRECATION WARNING' in error and + '6.1.0' in error and + FUEL_CLIENT_CONFIG in error): + log('Delete deprecated fuel client config %s' % FUEL_CLIENT_CONFIG) + with self.ssh as s: + s.exec_cmd('rm %s' % FUEL_CLIENT_CONFIG, False) + + + + + + + + + + + + + + + + + + + + diff --git a/fuel/deploy/reap.py b/fuel/deploy/reap.py index 8a8681a..1c21891 100644 --- a/fuel/deploy/reap.py +++ b/fuel/deploy/reap.py @@ -1,3 +1,13 @@ +############################################################################### +# Copyright (c) 2015 Ericsson AB and others. +# szilard.cserey@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################### + + import common import time import os @@ -65,6 +75,7 @@ DISKS = {'fuel': '30G', 'controller': '30G', 'compute': '30G'} + class Reap(object): def __init__(self, dea_file, dha_file, comment): @@ -219,7 +230,7 @@ class Reap(object): def reap_network_settings(self): network_file = ('%s/network_%s.yaml' - % (self.temp_dir, self.env_id)) + % (self.temp_dir, self.env_id)) data = self.read_yaml(network_file) network = {} network['networking_parameters'] = data['networking_parameters'] @@ -230,7 +241,7 @@ class Reap(object): self.write_yaml(self.dea_file, {'network': network}) def reap_settings(self): - settings_file = '%s/settings_%s.yaml' % (self.temp_dir, self.env_id) + settings_file = '%s/settings_%s.yaml' % (self.temp_dir, self.env_id) settings = self.read_yaml(settings_file) self.write_yaml(self.dea_file, {'settings': settings}) @@ -302,12 +313,14 @@ class Reap(object): self.reap_settings() self.finale() + def usage(): print ''' Usage: python reap.py ''' + def parse_arguments(): parser = ArgParser(prog='python %s' % __file__) parser.add_argument('dea_file', nargs='?', action='store', @@ -320,11 +333,13 @@ def parse_arguments(): args = parser.parse_args() return (args.dea_file, args.dha_file, args.comment) + def main(): dea_file, dha_file, comment = parse_arguments() r = Reap(dea_file, dha_file, comment) r.reap() + if __name__ == '__main__': - main() \ No newline at end of file + main() diff --git a/fuel/deploy/ssh_client.py b/fuel/deploy/ssh_client.py index 0ec2edc..0f6b8c7 100644 --- a/fuel/deploy/ssh_client.py +++ b/fuel/deploy/ssh_client.py @@ -1,3 +1,13 @@ +############################################################################### +# Copyright (c) 2015 Ericsson AB and others. +# szilard.cserey@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################### + + import paramiko import common import scp @@ -34,7 +44,7 @@ class SSHClient(object): def __exit__(self, type, value, traceback): self.close() - def exec_cmd(self, command, sudo=False, timeout=TIMEOUT, check=True): + def exec_cmd(self, command, check=True, sudo=False, timeout=TIMEOUT): if sudo and self.username != 'root': command = "sudo -S -p '' %s" % command stdin, stdout, stderr = self.client.exec_command(command, diff --git a/fuel/deploy/templates/hardware_environment/conf/ericsson_montreal_lab/ha/dea.yaml b/fuel/deploy/templates/hardware_environment/conf/ericsson_montreal_lab/ha/dea.yaml new file mode 100644 index 0000000..cdb4aec --- /dev/null +++ b/fuel/deploy/templates/hardware_environment/conf/ericsson_montreal_lab/ha/dea.yaml @@ -0,0 +1,845 @@ +title: Deployment Environment Adapter (DEA) +# DEA API version supported +version: +created: +comment: Test environment Ericsson Montreal +environment: + name: opnfv_virt + mode: ha + net_segment_type: gre +wanted_release: Juno on Ubuntu 14.04.1 +nodes: +- id: 1 + interfaces: interfaces_1 + transformations: transformations_1 + role: ceph-osd,controller +- id: 2 + interfaces: interfaces_1 + transformations: transformations_1 + role: ceph-osd,controller +- id: 3 + interfaces: interfaces_1 + transformations: transformations_1 + role: ceph-osd,controller +- id: 4 + interfaces: interfaces_1 + transformations: transformations_2 + role: ceph-osd,compute +- id: 5 + interfaces: interfaces_1 + transformations: transformations_2 + role: ceph-osd,compute +- id: 6 + interfaces: interfaces_1 + transformations: transformations_2 + role: ceph-osd,compute +opnfv: + hosts: + - name: + address: + fqdn: +fuel: + ADMIN_NETWORK: + ipaddress: 10.40.0.2 + netmask: 255.255.255.0 + dhcp_pool_start: 10.40.0.3 + dhcp_pool_end: 10.40.0.254 + DNS_UPSTREAM: 10.118.32.193 + DNS_DOMAIN: opnfvericsson.ca + DNS_SEARCH: opnfvericsson.ca + FUEL_ACCESS: + user: admin + password: admin + HOSTNAME: opnfv + NTP1: 10.118.34.219 + NTP2: + NTP3: +interfaces_1: + eth0: + - fuelweb_admin + eth2: + - public + - management + - storage + - private +transformations_1: + transformations: + - action: add-br + name: br-fw-admin + - action: add-br + name: br-mgmt + - action: add-br + name: br-storage + - action: add-br + name: br-ex + - action: add-br + name: br-floating + provider: ovs + - action: add-patch + bridges: + - br-floating + - br-ex + mtu: 65000 + provider: ovs + - action: add-br + name: br-mesh + - action: add-port + bridge: br-fw-admin + name: eth0 + - action: add-port + bridge: br-mgmt + name: eth2.320 + - action: add-port + bridge: br-storage + name: eth2.220 + - action: add-port + bridge: br-mesh + name: eth2.20 + - action: add-port + bridge: br-ex + name: eth0 +transformations_2: + transformations: + - action: add-br + name: br-fw-admin + - action: add-br + name: br-mgmt + - action: add-br + name: br-storage + - action: add-br + name: br-mesh + - action: add-port + bridge: br-fw-admin + name: eth0 + - action: add-port + bridge: br-mgmt + name: eth2.320 + - action: add-port + bridge: br-storage + name: eth2.220 + - action: add-port + bridge: br-mesh + name: eth2.20 +network: + networking_parameters: + base_mac: fa:16:3e:00:00:00 + dns_nameservers: + - 10.118.32.193 + floating_ranges: + - - 10.118.34.226 + - 10.118.34.230 + gre_id_range: + - 2 + - 65535 + internal_cidr: 192.168.111.0/24 + internal_gateway: 192.168.111.1 + net_l23_provider: ovs + segmentation_type: gre + vlan_range: + - 2022 + - 2023 + networks: + - cidr: 10.118.34.192/24 + gateway: 10.118.34.193 + ip_ranges: + - - 10.118.34.220 + - 10.118.34.225 + meta: + cidr: 10.118.34.192/24 + configurable: true + floating_range_var: floating_ranges + ip_range: + - 10.118.34.220 + - 10.118.34.225 + map_priority: 1 + name: public + notation: ip_ranges + render_addr_mask: public + render_type: null + use_gateway: true + vips: + - haproxy + - vrouter + vlan_start: null + name: public + vlan_start: null + - cidr: 192.168.0.0/24 + gateway: null + ip_ranges: + - - 192.168.0.1 + - 192.168.0.254 + meta: + cidr: 192.168.0.0/24 + configurable: true + map_priority: 2 + name: management + notation: cidr + render_addr_mask: internal + render_type: cidr + use_gateway: false + vips: + - haproxy + - vrouter + vlan_start: 320 + name: management + vlan_start: 320 + - cidr: 192.168.1.0/24 + gateway: null + ip_ranges: + - - 192.168.1.1 + - 192.168.1.254 + meta: + cidr: 192.168.1.0/24 + configurable: true + map_priority: 2 + name: storage + notation: cidr + render_addr_mask: storage + render_type: cidr + use_gateway: false + vlan_start: 220 + name: storage + vlan_start: 220 + - cidr: 192.168.2.0/24 + gateway: null + ip_ranges: + - - 192.168.2.1 + - 192.168.2.254 + meta: + assign_vip: 192.168.2.0/24 + configurable: true + map_priority: 2 + name: private + notation: cidr + render_addr_mask: private + render_type: cidr + seg_type: gre + use_gateway: false + vlan_start: 20 + name: private + vlan_start: 20 + - cidr: 10.40.0.0/24 + gateway: 10.40.0.2 + ip_ranges: + - - 10.40.0.3 + - 10.40.255.254 + meta: + configurable: false + map_priority: 0 + notation: ip_ranges + render_addr_mask: null + render_type: null + unmovable: true + use_gateway: true + name: fuelweb_admin + vlan_start: null +settings: + editable: + access: + email: + description: Email address for Administrator + label: Email + regex: + error: Invalid email + source: ^\S+@\S+$ + type: text + value: admin@localhost + weight: 40 + metadata: + label: Access + weight: 10 + password: + description: Password for Administrator + label: Password + regex: + error: Empty password + source: \S + type: password + value: admin + weight: 20 + tenant: + description: Tenant (project) name for Administrator + label: Tenant + regex: + error: Invalid tenant name + source: ^(?!services$)(?!nova$)(?!glance$)(?!keystone$)(?!neutron$)(?!cinder$)(?!swift$)(?!ceph$)(?![Gg]uest$)(?!.* + +.*$).+ + type: text + value: admin + weight: 30 + user: + description: Username for Administrator + label: Username + regex: + error: Invalid username + source: ^(?!services$)(?!nova$)(?!glance$)(?!keystone$)(?!neutron$)(?!cinder$)(?!swift$)(?!ceph$)(?![Gg]uest$)(?!.* + +.*$).+ + type: text + value: admin + weight: 10 + additional_components: + ceilometer: + description: If selected, Ceilometer component will be installed + label: Install Ceilometer + type: checkbox + value: false + weight: 40 + heat: + description: '' + label: '' + type: hidden + value: true + weight: 30 + metadata: + label: Additional Components + weight: 20 + mongo: + description: If selected, You can use external Mongo DB as ceilometer backend + label: Use external Mongo DB + restrictions: + - settings:additional_components.ceilometer.value == false + type: checkbox + value: false + weight: 40 + murano: + description: If selected, Murano component will be installed + label: Install Murano + restrictions: + - cluster:net_provider != 'neutron' + type: checkbox + value: false + weight: 20 + sahara: + description: If selected, Sahara component will be installed + label: Install Sahara + type: checkbox + value: false + weight: 10 + common: + auth_key: + description: Public key(s) to include in authorized_keys on deployed nodes + label: Public Key + type: textarea + value: '' + weight: 70 + auto_assign_floating_ip: + description: If selected, OpenStack will automatically assign a floating IP + to a new instance + label: Auto assign floating IP + restrictions: + - action: hide + condition: cluster:net_provider == 'neutron' + type: checkbox + value: false + weight: 40 + debug: + description: Debug logging mode provides more information, but requires more + disk space. + label: OpenStack debug logging + type: checkbox + value: false + weight: 20 + libvirt_type: + label: Hypervisor type + type: radio + value: kvm + values: + - data: kvm + description: Choose this type of hypervisor if you run OpenStack on hardware + label: KVM + - data: qemu + description: Choose this type of hypervisor if you run OpenStack on virtual + hosts. + label: QEMU + weight: 30 + metadata: + label: Common + weight: 30 + nova_quota: + description: Quotas are used to limit CPU and memory usage for tenants. Enabling + quotas will increase load on the Nova database. + label: Nova quotas + type: checkbox + value: false + weight: 25 + puppet_debug: + description: Debug puppet logging mode provides more information, but requires + more disk space. + label: Puppet debug logging + type: checkbox + value: true + weight: 20 + resume_guests_state_on_host_boot: + description: Whether to resume previous guests state when the host reboots. + If enabled, this option causes guests assigned to the host to resume their + previous state. If the guest was running a restart will be attempted when + nova-compute starts. If the guest was not running previously, a restart will + not be attempted. + label: Resume guests state on host boot + type: checkbox + value: true + weight: 60 + use_cow_images: + description: For most cases you will want qcow format. If it's disabled, raw + image format will be used to run VMs. OpenStack with raw format currently + does not support snapshotting. + label: Use qcow format for images + type: checkbox + value: true + weight: 50 + use_vcenter: + type: hidden + value: false + weight: 30 + corosync: + group: + description: '' + label: Group + type: text + value: 226.94.1.1 + weight: 10 + metadata: + label: Corosync + restrictions: + - action: hide + condition: 'true' + weight: 50 + port: + description: '' + label: Port + type: text + value: '12000' + weight: 20 + verified: + description: Set True only if multicast is configured correctly on router. + label: Need to pass network verification. + type: checkbox + value: false + weight: 10 + external_dns: + dns_list: + description: List of upstream DNS servers, separated by comma + label: DNS list + regex: + error: Invalid IP address list + source: ^\*$|^(?:\d|1?\d\d|2[0-4]\d|25[0-5])(?:\.(?:\d|1?\d\d|2[0-4]\d|25[0-5])){3}(?:\s*,\s*(?:\d|1?\d\d|2[0-4]\d|25[0-5])(?:\.(?:\d|1?\d\d|2[0-4]\d|25[0-5])){3})*$ + type: text + value: 10.118.32.193 + weight: 10 + metadata: + label: Host OS DNS Servers + weight: 90 + external_mongo: + hosts_ip: + description: IP Addresses of MongoDB. Use comma to split IPs + label: MongoDB hosts IP + regex: + error: Invalid hosts ip sequence + source: ^(((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?),)*((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$ + type: text + value: '' + weight: 30 + metadata: + label: External MongoDB + restrictions: + - action: hide + condition: settings:additional_components.mongo.value == false + weight: 20 + mongo_db_name: + description: Mongo database name + label: Database name + regex: + error: Invalid database name + source: ^\w+$ + type: text + value: ceilometer + weight: 30 + mongo_password: + description: Mongo database password + label: Password + regex: + error: Password contains spaces + source: ^\S*$ + type: password + value: ceilometer + weight: 30 + mongo_replset: + description: Name for Mongo replication set + label: Replset + type: text + value: '' + weight: 30 + mongo_user: + description: Mongo database username + label: Username + regex: + error: Empty username + source: ^\w+$ + type: text + value: ceilometer + weight: 30 + external_ntp: + metadata: + label: Host OS NTP Servers + weight: 100 + ntp_list: + description: List of upstream NTP servers, separated by comma + label: NTP server list + regex: + error: Invalid NTP server list + source: ^\s*(?:(?:\w+(?:-+\w+)*\.)+[a-z]+|\d{1,3}(?:\.\d{1,3}){3})\s*(?:,\s*(?:(?:\w+(?:-+\w+)*\.)+[a-z]+|\d{1,3}(\.\d{1,3}){3})\s*)*$ + type: text + value: 10.118.34.219 + weight: 10 + kernel_params: + kernel: + description: Default kernel parameters + label: Initial parameters + type: text + value: console=ttyS0,9600 console=tty0 net.ifnames=0 biosdevname=0 rootdelay=90 + nomodeset + weight: 45 + metadata: + label: Kernel parameters + weight: 40 + murano_settings: + metadata: + label: Murano Settings + restrictions: + - action: hide + condition: settings:additional_components.murano.value == false + weight: 20 + murano_repo_url: + description: '' + label: Murano Repository URL + type: text + value: http://storage.apps.openstack.org/ + weight: 10 + neutron_mellanox: + metadata: + enabled: true + label: Mellanox Neutron components + restrictions: + - action: hide + condition: not ('experimental' in version:feature_groups) + toggleable: false + weight: 50 + plugin: + label: Mellanox drivers and SR-IOV plugin + type: radio + value: disabled + values: + - data: disabled + description: If selected, Mellanox drivers, Neutron and Cinder plugin will + not be installed. + label: Mellanox drivers and plugins disabled + restrictions: + - settings:storage.iser.value == true + - data: drivers_only + description: If selected, Mellanox Ethernet drivers will be installed to support + networking over Mellanox NIC. Mellanox Neutron plugin will not be installed. + label: Install only Mellanox drivers + restrictions: + - settings:common.libvirt_type.value != 'kvm' + - data: ethernet + description: If selected, both Mellanox Ethernet drivers and Mellanox network + acceleration (Neutron) plugin will be installed. + label: Install Mellanox drivers and SR-IOV plugin + restrictions: + - settings:common.libvirt_type.value != 'kvm' or not (cluster:net_provider + == 'neutron' and networking_parameters:segmentation_type == 'vlan') + weight: 60 + vf_num: + description: Note that one virtual function will be reserved to the storage + network, in case of choosing iSER. + label: Number of virtual NICs + restrictions: + - settings:neutron_mellanox.plugin.value != 'ethernet' + type: text + value: '16' + weight: 70 + opendaylight: + metadata: + enabled: true + label: OpenDaylight plugin + plugin_id: 1 + restrictions: + - cluster:net_provider != 'neutron': Only neutron is supported by OpenDaylight + toggleable: true + weight: 70 + rest_api_port: + description: Port on which ODL REST API will be available. + label: Port number + regex: + error: Invalid port number + source: ^([1-9][0-9]{0,3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])$ + type: text + value: '8282' + weight: 40 + use_vxlan: + description: Configure neutron to use VXLAN tunneling + label: Use vxlan + restrictions: + - action: disable + condition: networking_parameters:segmentation_type == 'vlan' + message: Neutron with GRE segmentation required + type: checkbox + value: true + weight: 20 + vni_range_end: + description: VXLAN VNI IDs range end + label: VNI range end + regex: + error: Invalid ID number + source: ^\d+$ + restrictions: + - action: hide + condition: networking_parameters:segmentation_type == 'vlan' + type: text + value: '10000' + weight: 31 + vni_range_start: + description: VXLAN VNI IDs range start + label: VNI range start + regex: + error: Invalid ID number + source: ^\d+$ + restrictions: + - action: hide + condition: networking_parameters:segmentation_type == 'vlan' + type: text + value: '10' + weight: 30 + provision: + metadata: + label: Provision + weight: 80 + method: + description: Which provision method to use for this cluster. + label: Provision method + type: radio + value: image + values: + - data: image + description: Copying pre-built images on a disk. + label: Image + - data: cobbler + description: Install from scratch using anaconda or debian-installer. + label: (DEPRECATED) Classic (use anaconda or debian-installer) + public_network_assignment: + assign_to_all_nodes: + description: When disabled, public network will be assigned to controllers only + label: Assign public network to all nodes + type: checkbox + value: false + weight: 10 + metadata: + label: Public network assignment + restrictions: + - action: hide + condition: cluster:net_provider != 'neutron' + weight: 50 + repo_setup: + metadata: + always_editable: true + label: Repositories + weight: 50 + repos: + description: 'Please note: the first repository will be considered the operating + system mirror that will be used during node provisioning. + + To create a local repository mirror on the Fuel master node, please follow + the instructions provided by running "fuel-createmirror --help" on the Fuel + master node. + + Please make sure your Fuel master node has Internet access to the repository + before attempting to create a mirror. + + For more details, please refer to the documentation (https://docs.mirantis.com/openstack/fuel/fuel-6.1/operations.html#external-ubuntu-ops). + + ' + extra_priority: null + type: custom_repo_configuration + value: + - name: ubuntu + priority: null + section: main universe multiverse + suite: trusty + type: deb + uri: http://archive.ubuntu.com/ubuntu/ + - name: ubuntu-updates + priority: null + section: main universe multiverse + suite: trusty-updates + type: deb + uri: http://archive.ubuntu.com/ubuntu/ + - name: ubuntu-security + priority: null + section: main universe multiverse + suite: trusty-security + type: deb + uri: http://archive.ubuntu.com/ubuntu/ + - name: mos + priority: 1050 + section: main restricted + suite: mos6.1 + type: deb + uri: http://10.40.0.2:8080/2014.2.2-6.1/ubuntu/x86_64 + - name: mos-updates + priority: 1050 + section: main restricted + suite: mos6.1-updates + type: deb + uri: http://mirror.fuel-infra.org/mos/ubuntu/ + - name: mos-security + priority: 1050 + section: main restricted + suite: mos6.1-security + type: deb + uri: http://mirror.fuel-infra.org/mos/ubuntu/ + - name: mos-holdback + priority: 1100 + section: main restricted + suite: mos6.1-holdback + type: deb + uri: http://mirror.fuel-infra.org/mos/ubuntu/ + - name: Auxiliary + priority: 1150 + section: main restricted + suite: auxiliary + type: deb + uri: http://10.40.0.2:8080/2014.2.2-6.1/ubuntu/auxiliary + storage: + ephemeral_ceph: + description: Configures Nova to store ephemeral volumes in RBD. This works best + if Ceph is enabled for volumes and images, too. Enables live migration of + all types of Ceph backed VMs (without this option, live migration will only + work with VMs launched from Cinder volumes). + label: Ceph RBD for ephemeral volumes (Nova) + type: checkbox + value: true + weight: 75 + images_ceph: + description: Configures Glance to use the Ceph RBD backend to store images. + If enabled, this option will prevent Swift from installing. + label: Ceph RBD for images (Glance) + restrictions: + - settings:storage.images_vcenter.value == true: Only one Glance backend could + be selected. + type: checkbox + value: true + weight: 30 + images_vcenter: + description: Configures Glance to use the vCenter/ESXi backend to store images. + If enabled, this option will prevent Swift from installing. + label: VMWare vCenter/ESXi datastore for images (Glance) + restrictions: + - action: hide + condition: settings:common.use_vcenter.value != true + - condition: settings:storage.images_ceph.value == true + message: Only one Glance backend could be selected. + type: checkbox + value: false + weight: 35 + iser: + description: 'High performance block storage: Cinder volumes over iSER protocol + (iSCSI over RDMA). This feature requires SR-IOV capabilities in the NIC, and + will use a dedicated virtual function for the storage network.' + label: iSER protocol for volumes (Cinder) + restrictions: + - settings:storage.volumes_lvm.value != true or settings:common.libvirt_type.value + != 'kvm' + - action: hide + condition: not ('experimental' in version:feature_groups) + type: checkbox + value: false + weight: 11 + metadata: + label: Storage + weight: 60 + objects_ceph: + description: Configures RadosGW front end for Ceph RBD. This exposes S3 and + Swift API Interfaces. If enabled, this option will prevent Swift from installing. + label: Ceph RadosGW for objects (Swift API) + restrictions: + - settings:storage.images_ceph.value == false + type: checkbox + value: false + weight: 80 + osd_pool_size: + description: Configures the default number of object replicas in Ceph. This + number must be equal to or lower than the number of deployed 'Storage - Ceph + OSD' nodes. + label: Ceph object replication factor + regex: + error: Invalid number + source: ^[1-9]\d*$ + type: text + value: '2' + weight: 85 + volumes_ceph: + description: Configures Cinder to store volumes in Ceph RBD images. + label: Ceph RBD for volumes (Cinder) + restrictions: + - settings:storage.volumes_lvm.value == true + type: checkbox + value: true + weight: 20 + volumes_lvm: + description: It is recommended to have at least one Storage - Cinder LVM node. + label: Cinder LVM over iSCSI for volumes + restrictions: + - settings:storage.volumes_ceph.value == true + type: checkbox + value: false + weight: 10 + syslog: + metadata: + label: Syslog + weight: 50 + syslog_port: + description: Remote syslog port + label: Port + regex: + error: Invalid Syslog port + source: ^([1-9][0-9]{0,3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])$ + type: text + value: '514' + weight: 20 + syslog_server: + description: Remote syslog hostname + label: Hostname + type: text + value: '' + weight: 10 + syslog_transport: + label: Syslog transport protocol + type: radio + value: tcp + values: + - data: udp + description: '' + label: UDP + - data: tcp + description: '' + label: TCP + weight: 30 + workloads_collector: + enabled: + type: hidden + value: true + metadata: + label: Workloads Collector User + restrictions: + - action: hide + condition: 'true' + weight: 10 + password: + type: password + value: pBkLbu1k + tenant: + type: text + value: services + user: + type: text + value: fuel_stats_user diff --git a/fuel/deploy/templates/hardware_environment/conf/ericsson_montreal_lab/ha/dha.yaml b/fuel/deploy/templates/hardware_environment/conf/ericsson_montreal_lab/ha/dha.yaml new file mode 100644 index 0000000..6227e5f --- /dev/null +++ b/fuel/deploy/templates/hardware_environment/conf/ericsson_montreal_lab/ha/dha.yaml @@ -0,0 +1,54 @@ +title: Deployment Hardware Adapter (DHA) +# DHA API version supported +version: +created: +comment: Test environment Ericsson Montreal + +# Adapter to use for this definition +adapter: hp + +# Node list. +# Mandatory property is id, all other properties are adapter specific. + +nodes: +- id: 1 + pxeMac: 14:58:D0:54:7A:D8 + ipmiIp: 10.118.32.198 + ipmiUser: + ipmiPass: +- id: 2 + pxeMac: 14:58:D0:55:E2:E0 + ipmiIp: 10.118.32.202 + ipmiUser: + ipmiPass: +- id: 3 + pxeMac: 9C:B6:54:8A:25:C0 + ipmiIp: 10.118.32.213 + ipmiUser: + ipmiPass: +- id: 4 + pxeMac: 14:58:D0:54:28:80 + ipmiIp: 10.118.32.201 + ipmiUser: + ipmiPass: +- id: 5 + pxeMac: 14:58:D0:54:E7:88 + ipmiIp: 10.118.32.203 + ipmiUser: + ipmiPass: +- id: 6 + pxeMac: 14:58:D0:54:7A:28 + ipmiIp: 10.118.32.205 + ipmiUser: + ipmiPass: +# Adding the Fuel node as node id 7 which may not be correct - please +# adjust as needed. +- id: 7 + libvirtName: fuel-opnfv + libvirtTemplate: templates/hardware_environment/vms/fuel.xml + isFuel: yes + username: root + password: r00tme + +disks: + fuel: 50G \ No newline at end of file diff --git a/fuel/deploy/templates/hardware_environment/conf/linux_foundation_lab/pod1/ha/dea.yaml b/fuel/deploy/templates/hardware_environment/conf/linux_foundation_lab/pod1/ha/dea.yaml new file mode 100644 index 0000000..29720e5 --- /dev/null +++ b/fuel/deploy/templates/hardware_environment/conf/linux_foundation_lab/pod1/ha/dea.yaml @@ -0,0 +1,842 @@ +title: Deployment Environment Adapter (DEA) +# DEA API version supported +version: +created: +comment: Config for LF POD1 - HA deployment with Ceph +environment: + name: opnfv_virt + mode: ha + net_segment_type: gre +wanted_release: Juno on Ubuntu 14.04.1 +nodes: +- id: 1 + interfaces: interfaces_1 + transformations: transformations_1 + role: ceph-osd,controller +- id: 2 + interfaces: interfaces_1 + transformations: transformations_1 + role: ceph-osd,controller +- id: 3 + interfaces: interfaces_1 + transformations: transformations_1 + role: ceph-osd,controller +- id: 4 + interfaces: interfaces_1 + transformations: transformations_2 + role: ceph-osd,compute +- id: 5 + interfaces: interfaces_1 + transformations: transformations_2 + role: ceph-osd,compute +opnfv: + hosts: + - name: + address: + fqdn: +fuel: + ADMIN_NETWORK: + ipaddress: 10.20.0.2 + netmask: 255.255.0.0 + dhcp_pool_start: 10.20.0.3 + dhcp_pool_end: 10.20.0.254 + DNS_UPSTREAM: 8.8.8.8 + DNS_DOMAIN: domain.tld + DNS_SEARCH: domain.tld + FUEL_ACCESS: + user: admin + password: admin + HOSTNAME: opnfv + NTP1: 0.pool.ntp.org + NTP2: 1.pool.ntp.org + NTP3: 2.pool.ntp.org +interfaces_1: + eth0: + - public + eth1: + - fuelweb_admin + - management + - storage + - private +transformations_1: + transformations: + - action: add-br + name: br-fw-admin + - action: add-br + name: br-mgmt + - action: add-br + name: br-storage + - action: add-br + name: br-ex + - action: add-br + name: br-floating + provider: ovs + - action: add-patch + bridges: + - br-floating + - br-ex + mtu: 65000 + provider: ovs + - action: add-br + name: br-mesh + - action: add-port + bridge: br-fw-admin + name: eth0 + - action: add-port + bridge: br-mgmt + name: eth1.300 + - action: add-port + bridge: br-storage + name: eth1.301 + - action: add-port + bridge: br-mesh + name: eth1.302 + - action: add-port + bridge: br-ex + name: eth0 +transformations_2: + transformations: + - action: add-br + name: br-fw-admin + - action: add-br + name: br-mgmt + - action: add-br + name: br-storage + - action: add-br + name: br-mesh + - action: add-port + bridge: br-fw-admin + name: eth0 + - action: add-port + bridge: br-mgmt + name: eth1.300 + - action: add-port + bridge: br-storage + name: eth1.301 + - action: add-port + bridge: br-mesh + name: eth1.302 +network: + networking_parameters: + base_mac: fa:16:3e:00:00:00 + dns_nameservers: + - 8.8.4.4 + - 8.8.8.8 + floating_ranges: + - - 172.30.9.80 + - 172.30.9.89 + gre_id_range: + - 2 + - 65535 + internal_cidr: 192.168.111.0/24 + internal_gateway: 192.168.111.1 + net_l23_provider: ovs + segmentation_type: gre + vlan_range: + - 1000 + - 1030 + networks: + - cidr: 172.30.9.0/24 + gateway: 172.30.9.1 + ip_ranges: + - - 172.30.9.70 + - 172.30.9.79 + meta: + cidr: 172.30.9.0/24 + configurable: true + floating_range_var: floating_ranges + ip_range: + - 172.30.9.70 + - 172.30.9.79 + map_priority: 1 + name: public + notation: ip_ranges + render_addr_mask: public + render_type: null + use_gateway: true + vips: + - haproxy + - vrouter + vlan_start: null + name: public + vlan_start: null + - cidr: 192.168.0.0/24 + gateway: null + ip_ranges: + - - 192.168.0.1 + - 192.168.0.254 + meta: + cidr: 192.168.0.0/24 + configurable: true + map_priority: 2 + name: management + notation: cidr + render_addr_mask: internal + render_type: cidr + use_gateway: false + vips: + - haproxy + - vrouter + vlan_start: 300 + name: management + vlan_start: 300 + - cidr: 192.168.1.0/24 + gateway: null + ip_ranges: + - - 192.168.1.1 + - 192.168.1.254 + meta: + cidr: 192.168.1.0/24 + configurable: true + map_priority: 2 + name: storage + notation: cidr + render_addr_mask: storage + render_type: cidr + use_gateway: false + vlan_start: 301 + name: storage + vlan_start: 301 + - cidr: 192.168.2.0/24 + gateway: null + ip_ranges: + - - 192.168.2.1 + - 192.168.2.254 + meta: + assign_vip: 192.168.2.0/24 + configurable: true + map_priority: 2 + name: private + notation: cidr + render_addr_mask: private + render_type: cidr + seg_type: gre + use_gateway: false + vlan_start: 302 + name: private + vlan_start: 302 + - cidr: 10.20.0.0/24 + gateway: 10.20.0.2 + ip_ranges: + - - 10.20.0.3 + - 10.20.255.254 + meta: + configurable: false + map_priority: 0 + notation: ip_ranges + render_addr_mask: null + render_type: null + unmovable: true + use_gateway: true + name: fuelweb_admin + vlan_start: null +settings: + editable: + access: + email: + description: Email address for Administrator + label: Email + regex: + error: Invalid email + source: ^\S+@\S+$ + type: text + value: admin@localhost + weight: 40 + metadata: + label: Access + weight: 10 + password: + description: Password for Administrator + label: Password + regex: + error: Empty password + source: \S + type: password + value: admin + weight: 20 + tenant: + description: Tenant (project) name for Administrator + label: Tenant + regex: + error: Invalid tenant name + source: ^(?!services$)(?!nova$)(?!glance$)(?!keystone$)(?!neutron$)(?!cinder$)(?!swift$)(?!ceph$)(?![Gg]uest$)(?!.* + +.*$).+ + type: text + value: admin + weight: 30 + user: + description: Username for Administrator + label: Username + regex: + error: Invalid username + source: ^(?!services$)(?!nova$)(?!glance$)(?!keystone$)(?!neutron$)(?!cinder$)(?!swift$)(?!ceph$)(?![Gg]uest$)(?!.* + +.*$).+ + type: text + value: admin + weight: 10 + additional_components: + ceilometer: + description: If selected, Ceilometer component will be installed + label: Install Ceilometer + type: checkbox + value: false + weight: 40 + heat: + description: '' + label: '' + type: hidden + value: true + weight: 30 + metadata: + label: Additional Components + weight: 20 + mongo: + description: If selected, You can use external Mongo DB as ceilometer backend + label: Use external Mongo DB + restrictions: + - settings:additional_components.ceilometer.value == false + type: checkbox + value: false + weight: 40 + murano: + description: If selected, Murano component will be installed + label: Install Murano + restrictions: + - cluster:net_provider != 'neutron' + type: checkbox + value: false + weight: 20 + sahara: + description: If selected, Sahara component will be installed + label: Install Sahara + type: checkbox + value: false + weight: 10 + common: + auth_key: + description: Public key(s) to include in authorized_keys on deployed nodes + label: Public Key + type: textarea + value: '' + weight: 70 + auto_assign_floating_ip: + description: If selected, OpenStack will automatically assign a floating IP + to a new instance + label: Auto assign floating IP + restrictions: + - action: hide + condition: cluster:net_provider == 'neutron' + type: checkbox + value: false + weight: 40 + debug: + description: Debug logging mode provides more information, but requires more + disk space. + label: OpenStack debug logging + type: checkbox + value: false + weight: 20 + libvirt_type: + label: Hypervisor type + type: radio + value: kvm + values: + - data: kvm + description: Choose this type of hypervisor if you run OpenStack on hardware + label: KVM + - data: qemu + description: Choose this type of hypervisor if you run OpenStack on virtual + hosts. + label: QEMU + weight: 30 + metadata: + label: Common + weight: 30 + nova_quota: + description: Quotas are used to limit CPU and memory usage for tenants. Enabling + quotas will increase load on the Nova database. + label: Nova quotas + type: checkbox + value: false + weight: 25 + puppet_debug: + description: Debug puppet logging mode provides more information, but requires + more disk space. + label: Puppet debug logging + type: checkbox + value: true + weight: 20 + resume_guests_state_on_host_boot: + description: Whether to resume previous guests state when the host reboots. + If enabled, this option causes guests assigned to the host to resume their + previous state. If the guest was running a restart will be attempted when + nova-compute starts. If the guest was not running previously, a restart will + not be attempted. + label: Resume guests state on host boot + type: checkbox + value: true + weight: 60 + use_cow_images: + description: For most cases you will want qcow format. If it's disabled, raw + image format will be used to run VMs. OpenStack with raw format currently + does not support snapshotting. + label: Use qcow format for images + type: checkbox + value: true + weight: 50 + use_vcenter: + type: hidden + value: false + weight: 30 + corosync: + group: + description: '' + label: Group + type: text + value: 226.94.1.1 + weight: 10 + metadata: + label: Corosync + restrictions: + - action: hide + condition: 'true' + weight: 50 + port: + description: '' + label: Port + type: text + value: '12000' + weight: 20 + verified: + description: Set True only if multicast is configured correctly on router. + label: Need to pass network verification. + type: checkbox + value: false + weight: 10 + external_dns: + dns_list: + description: List of upstream DNS servers, separated by comma + label: DNS list + regex: + error: Invalid IP address list + source: ^\*$|^(?:\d|1?\d\d|2[0-4]\d|25[0-5])(?:\.(?:\d|1?\d\d|2[0-4]\d|25[0-5])){3}(?:\s*,\s*(?:\d|1?\d\d|2[0-4]\d|25[0-5])(?:\.(?:\d|1?\d\d|2[0-4]\d|25[0-5])){3})*$ + type: text + value: 8.8.4.4, 8.8.8.8 + weight: 10 + metadata: + label: Host OS DNS Servers + weight: 90 + external_mongo: + hosts_ip: + description: IP Addresses of MongoDB. Use comma to split IPs + label: MongoDB hosts IP + regex: + error: Invalid hosts ip sequence + source: ^(((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?),)*((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$ + type: text + value: '' + weight: 30 + metadata: + label: External MongoDB + restrictions: + - action: hide + condition: settings:additional_components.mongo.value == false + weight: 20 + mongo_db_name: + description: Mongo database name + label: Database name + regex: + error: Invalid database name + source: ^\w+$ + type: text + value: ceilometer + weight: 30 + mongo_password: + description: Mongo database password + label: Password + regex: + error: Password contains spaces + source: ^\S*$ + type: password + value: ceilometer + weight: 30 + mongo_replset: + description: Name for Mongo replication set + label: Replset + type: text + value: '' + weight: 30 + mongo_user: + description: Mongo database username + label: Username + regex: + error: Empty username + source: ^\w+$ + type: text + value: ceilometer + weight: 30 + external_ntp: + metadata: + label: Host OS NTP Servers + weight: 100 + ntp_list: + description: List of upstream NTP servers, separated by comma + label: NTP server list + regex: + error: Invalid NTP server list + source: ^\s*(?:(?:\w+(?:-+\w+)*\.)+[a-z]+|\d{1,3}(?:\.\d{1,3}){3})\s*(?:,\s*(?:(?:\w+(?:-+\w+)*\.)+[a-z]+|\d{1,3}(\.\d{1,3}){3})\s*)*$ + type: text + value: 0.pool.ntp.org, 1.pool.ntp.org + weight: 10 + kernel_params: + kernel: + description: Default kernel parameters + label: Initial parameters + type: text + value: console=ttyS0,9600 console=tty0 net.ifnames=0 biosdevname=0 rootdelay=90 + nomodeset + weight: 45 + metadata: + label: Kernel parameters + weight: 40 + murano_settings: + metadata: + label: Murano Settings + restrictions: + - action: hide + condition: settings:additional_components.murano.value == false + weight: 20 + murano_repo_url: + description: '' + label: Murano Repository URL + type: text + value: http://storage.apps.openstack.org/ + weight: 10 + neutron_mellanox: + metadata: + enabled: true + label: Mellanox Neutron components + restrictions: + - action: hide + condition: not ('experimental' in version:feature_groups) + toggleable: false + weight: 50 + plugin: + label: Mellanox drivers and SR-IOV plugin + type: radio + value: disabled + values: + - data: disabled + description: If selected, Mellanox drivers, Neutron and Cinder plugin will + not be installed. + label: Mellanox drivers and plugins disabled + restrictions: + - settings:storage.iser.value == true + - data: drivers_only + description: If selected, Mellanox Ethernet drivers will be installed to support + networking over Mellanox NIC. Mellanox Neutron plugin will not be installed. + label: Install only Mellanox drivers + restrictions: + - settings:common.libvirt_type.value != 'kvm' + - data: ethernet + description: If selected, both Mellanox Ethernet drivers and Mellanox network + acceleration (Neutron) plugin will be installed. + label: Install Mellanox drivers and SR-IOV plugin + restrictions: + - settings:common.libvirt_type.value != 'kvm' or not (cluster:net_provider + == 'neutron' and networking_parameters:segmentation_type == 'vlan') + weight: 60 + vf_num: + description: Note that one virtual function will be reserved to the storage + network, in case of choosing iSER. + label: Number of virtual NICs + restrictions: + - settings:neutron_mellanox.plugin.value != 'ethernet' + type: text + value: '16' + weight: 70 + opendaylight: + metadata: + enabled: true + label: OpenDaylight plugin + plugin_id: 1 + restrictions: + - cluster:net_provider != 'neutron': Only neutron is supported by OpenDaylight + toggleable: true + weight: 70 + rest_api_port: + description: Port on which ODL REST API will be available. + label: Port number + regex: + error: Invalid port number + source: ^([1-9][0-9]{0,3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])$ + type: text + value: '8282' + weight: 40 + use_vxlan: + description: Configure neutron to use VXLAN tunneling + label: Use vxlan + restrictions: + - action: disable + condition: networking_parameters:segmentation_type == 'vlan' + message: Neutron with GRE segmentation required + type: checkbox + value: true + weight: 20 + vni_range_end: + description: VXLAN VNI IDs range end + label: VNI range end + regex: + error: Invalid ID number + source: ^\d+$ + restrictions: + - action: hide + condition: networking_parameters:segmentation_type == 'vlan' + type: text + value: '10000' + weight: 31 + vni_range_start: + description: VXLAN VNI IDs range start + label: VNI range start + regex: + error: Invalid ID number + source: ^\d+$ + restrictions: + - action: hide + condition: networking_parameters:segmentation_type == 'vlan' + type: text + value: '10' + weight: 30 + provision: + metadata: + label: Provision + weight: 80 + method: + description: Which provision method to use for this cluster. + label: Provision method + type: radio + value: image + values: + - data: image + description: Copying pre-built images on a disk. + label: Image + - data: cobbler + description: Install from scratch using anaconda or debian-installer. + label: (DEPRECATED) Classic (use anaconda or debian-installer) + public_network_assignment: + assign_to_all_nodes: + description: When disabled, public network will be assigned to controllers only + label: Assign public network to all nodes + type: checkbox + value: false + weight: 10 + metadata: + label: Public network assignment + restrictions: + - action: hide + condition: cluster:net_provider != 'neutron' + weight: 50 + repo_setup: + metadata: + always_editable: true + label: Repositories + weight: 50 + repos: + description: 'Please note: the first repository will be considered the operating + system mirror that will be used during node provisioning. + + To create a local repository mirror on the Fuel master node, please follow + the instructions provided by running "fuel-createmirror --help" on the Fuel + master node. + + Please make sure your Fuel master node has Internet access to the repository + before attempting to create a mirror. + + For more details, please refer to the documentation (https://docs.mirantis.com/openstack/fuel/fuel-6.1/operations.html#external-ubuntu-ops). + + ' + extra_priority: null + type: custom_repo_configuration + value: + - name: ubuntu + priority: null + section: main universe multiverse + suite: trusty + type: deb + uri: http://archive.ubuntu.com/ubuntu/ + - name: ubuntu-updates + priority: null + section: main universe multiverse + suite: trusty-updates + type: deb + uri: http://archive.ubuntu.com/ubuntu/ + - name: ubuntu-security + priority: null + section: main universe multiverse + suite: trusty-security + type: deb + uri: http://archive.ubuntu.com/ubuntu/ + - name: mos + priority: 1050 + section: main restricted + suite: mos6.1 + type: deb + uri: http://10.20.0.2:8080/2014.2.2-6.1/ubuntu/x86_64 + - name: mos-updates + priority: 1050 + section: main restricted + suite: mos6.1-updates + type: deb + uri: http://mirror.fuel-infra.org/mos/ubuntu/ + - name: mos-security + priority: 1050 + section: main restricted + suite: mos6.1-security + type: deb + uri: http://mirror.fuel-infra.org/mos/ubuntu/ + - name: mos-holdback + priority: 1100 + section: main restricted + suite: mos6.1-holdback + type: deb + uri: http://mirror.fuel-infra.org/mos/ubuntu/ + - name: Auxiliary + priority: 1150 + section: main restricted + suite: auxiliary + type: deb + uri: http://10.20.0.2:8080/2014.2.2-6.1/ubuntu/auxiliary + storage: + ephemeral_ceph: + description: Configures Nova to store ephemeral volumes in RBD. This works best + if Ceph is enabled for volumes and images, too. Enables live migration of + all types of Ceph backed VMs (without this option, live migration will only + work with VMs launched from Cinder volumes). + label: Ceph RBD for ephemeral volumes (Nova) + type: checkbox + value: true + weight: 75 + images_ceph: + description: Configures Glance to use the Ceph RBD backend to store images. + If enabled, this option will prevent Swift from installing. + label: Ceph RBD for images (Glance) + restrictions: + - settings:storage.images_vcenter.value == true: Only one Glance backend could + be selected. + type: checkbox + value: true + weight: 30 + images_vcenter: + description: Configures Glance to use the vCenter/ESXi backend to store images. + If enabled, this option will prevent Swift from installing. + label: VMWare vCenter/ESXi datastore for images (Glance) + restrictions: + - action: hide + condition: settings:common.use_vcenter.value != true + - condition: settings:storage.images_ceph.value == true + message: Only one Glance backend could be selected. + type: checkbox + value: false + weight: 35 + iser: + description: 'High performance block storage: Cinder volumes over iSER protocol + (iSCSI over RDMA). This feature requires SR-IOV capabilities in the NIC, and + will use a dedicated virtual function for the storage network.' + label: iSER protocol for volumes (Cinder) + restrictions: + - settings:storage.volumes_lvm.value != true or settings:common.libvirt_type.value + != 'kvm' + - action: hide + condition: not ('experimental' in version:feature_groups) + type: checkbox + value: false + weight: 11 + metadata: + label: Storage + weight: 60 + objects_ceph: + description: Configures RadosGW front end for Ceph RBD. This exposes S3 and + Swift API Interfaces. If enabled, this option will prevent Swift from installing. + label: Ceph RadosGW for objects (Swift API) + restrictions: + - settings:storage.images_ceph.value == false + type: checkbox + value: false + weight: 80 + osd_pool_size: + description: Configures the default number of object replicas in Ceph. This + number must be equal to or lower than the number of deployed 'Storage - Ceph + OSD' nodes. + label: Ceph object replication factor + regex: + error: Invalid number + source: ^[1-9]\d*$ + type: text + value: '2' + weight: 85 + volumes_ceph: + description: Configures Cinder to store volumes in Ceph RBD images. + label: Ceph RBD for volumes (Cinder) + restrictions: + - settings:storage.volumes_lvm.value == true + type: checkbox + value: true + weight: 20 + volumes_lvm: + description: It is recommended to have at least one Storage - Cinder LVM node. + label: Cinder LVM over iSCSI for volumes + restrictions: + - settings:storage.volumes_ceph.value == true + type: checkbox + value: false + weight: 10 + syslog: + metadata: + label: Syslog + weight: 50 + syslog_port: + description: Remote syslog port + label: Port + regex: + error: Invalid Syslog port + source: ^([1-9][0-9]{0,3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])$ + type: text + value: '514' + weight: 20 + syslog_server: + description: Remote syslog hostname + label: Hostname + type: text + value: '' + weight: 10 + syslog_transport: + label: Syslog transport protocol + type: radio + value: tcp + values: + - data: udp + description: '' + label: UDP + - data: tcp + description: '' + label: TCP + weight: 30 + workloads_collector: + enabled: + type: hidden + value: true + metadata: + label: Workloads Collector User + restrictions: + - action: hide + condition: 'true' + weight: 10 + password: + type: password + value: pBkLbu1k + tenant: + type: text + value: services + user: + type: text + value: fuel_stats_user diff --git a/fuel/deploy/baremetal/conf/linux_foundation_lab/pod1/ha/dha.yaml b/fuel/deploy/templates/hardware_environment/conf/linux_foundation_lab/pod1/ha/dha.yaml similarity index 89% rename from fuel/deploy/baremetal/conf/linux_foundation_lab/pod1/ha/dha.yaml rename to fuel/deploy/templates/hardware_environment/conf/linux_foundation_lab/pod1/ha/dha.yaml index 8db72f0..724d6d8 100644 --- a/fuel/deploy/baremetal/conf/linux_foundation_lab/pod1/ha/dha.yaml +++ b/fuel/deploy/templates/hardware_environment/conf/linux_foundation_lab/pod1/ha/dha.yaml @@ -1,7 +1,7 @@ title: Deployment Hardware Adapter (DHA) # DHA API version supported -version: 1.1 -created: Fri May 8 08:03:49 UTC 2015 +version: +created: comment: Config for LF POD1 # Adapter to use for this definition @@ -40,10 +40,10 @@ nodes: # adjust as needed. - id: 6 libvirtName: fuel-opnfv - libvirtTemplate: baremetal/vms/fuel_lf.xml + libvirtTemplate: templates/hardware_environment/vms/fuel.xml isFuel: yes username: root password: r00tme disks: - fuel: 30G \ No newline at end of file + fuel: 50G \ No newline at end of file diff --git a/fuel/deploy/templates/hardware_environment/conf/linux_foundation_lab/pod2/ha/dea.yaml b/fuel/deploy/templates/hardware_environment/conf/linux_foundation_lab/pod2/ha/dea.yaml new file mode 100644 index 0000000..2b9319c --- /dev/null +++ b/fuel/deploy/templates/hardware_environment/conf/linux_foundation_lab/pod2/ha/dea.yaml @@ -0,0 +1,842 @@ +title: Deployment Environment Adapter (DEA) +# DEA API version supported +version: +created: +comment: Config for LF POD2 - HA deployment with Ceph +environment: + name: opnfv_virt + mode: ha + net_segment_type: gre +wanted_release: Juno on Ubuntu 14.04.1 +nodes: +- id: 1 + interfaces: interfaces_1 + transformations: transformations_1 + role: ceph-osd,controller +- id: 2 + interfaces: interfaces_1 + transformations: transformations_1 + role: ceph-osd,controller +- id: 3 + interfaces: interfaces_1 + transformations: transformations_1 + role: ceph-osd,controller +- id: 4 + interfaces: interfaces_1 + transformations: transformations_2 + role: ceph-osd,compute +- id: 5 + interfaces: interfaces_1 + transformations: transformations_2 + role: ceph-osd,compute +opnfv: + hosts: + - name: + address: + fqdn: +fuel: + ADMIN_NETWORK: + ipaddress: 10.20.0.2 + netmask: 255.255.0.0 + dhcp_pool_start: 10.20.0.3 + dhcp_pool_end: 10.20.0.254 + DNS_UPSTREAM: 8.8.8.8 + DNS_DOMAIN: domain.tld + DNS_SEARCH: domain.tld + FUEL_ACCESS: + user: admin + password: admin + HOSTNAME: opnfv + NTP1: 0.pool.ntp.org + NTP2: 1.pool.ntp.org + NTP3: 2.pool.ntp.org +interfaces_1: + eth0: + - public + eth1: + - fuelweb_admin + - management + - storage + - private +transformations_1: + transformations: + - action: add-br + name: br-fw-admin + - action: add-br + name: br-mgmt + - action: add-br + name: br-storage + - action: add-br + name: br-ex + - action: add-br + name: br-floating + provider: ovs + - action: add-patch + bridges: + - br-floating + - br-ex + mtu: 65000 + provider: ovs + - action: add-br + name: br-mesh + - action: add-port + bridge: br-fw-admin + name: eth0 + - action: add-port + bridge: br-mgmt + name: eth1.300 + - action: add-port + bridge: br-storage + name: eth1.301 + - action: add-port + bridge: br-mesh + name: eth1.302 + - action: add-port + bridge: br-ex + name: eth0 +transformations_2: + transformations: + - action: add-br + name: br-fw-admin + - action: add-br + name: br-mgmt + - action: add-br + name: br-storage + - action: add-br + name: br-mesh + - action: add-port + bridge: br-fw-admin + name: eth0 + - action: add-port + bridge: br-mgmt + name: eth1.300 + - action: add-port + bridge: br-storage + name: eth1.301 + - action: add-port + bridge: br-mesh + name: eth1.302 +network: + networking_parameters: + base_mac: fa:16:3e:00:00:00 + dns_nameservers: + - 8.8.4.4 + - 8.8.8.8 + floating_ranges: + - - 172.30.10.83 + - 172.30.10.92 + gre_id_range: + - 2 + - 65535 + internal_cidr: 192.168.111.0/24 + internal_gateway: 192.168.111.1 + net_l23_provider: ovs + segmentation_type: gre + vlan_range: + - 1000 + - 1030 + networks: + - cidr: 172.30.10.0/24 + gateway: 172.30.10.1 + ip_ranges: + - - 172.30.10.73 + - 172.30.10.82 + meta: + cidr: 172.30.10.0/24 + configurable: true + floating_range_var: floating_ranges + ip_range: + - 172.30.10.73 + - 172.30.10.82 + map_priority: 1 + name: public + notation: ip_ranges + render_addr_mask: public + render_type: null + use_gateway: true + vips: + - haproxy + - vrouter + vlan_start: null + name: public + vlan_start: null + - cidr: 192.168.0.0/24 + gateway: null + ip_ranges: + - - 192.168.0.1 + - 192.168.0.254 + meta: + cidr: 192.168.0.0/24 + configurable: true + map_priority: 2 + name: management + notation: cidr + render_addr_mask: internal + render_type: cidr + use_gateway: false + vips: + - haproxy + - vrouter + vlan_start: 300 + name: management + vlan_start: 300 + - cidr: 192.168.1.0/24 + gateway: null + ip_ranges: + - - 192.168.1.1 + - 192.168.1.254 + meta: + cidr: 192.168.1.0/24 + configurable: true + map_priority: 2 + name: storage + notation: cidr + render_addr_mask: storage + render_type: cidr + use_gateway: false + vlan_start: 301 + name: storage + vlan_start: 301 + - cidr: 192.168.2.0/24 + gateway: null + ip_ranges: + - - 192.168.2.1 + - 192.168.2.254 + meta: + assign_vip: 192.168.2.0/24 + configurable: true + map_priority: 2 + name: private + notation: cidr + render_addr_mask: private + render_type: cidr + seg_type: gre + use_gateway: false + vlan_start: 302 + name: private + vlan_start: 302 + - cidr: 10.20.0.0/24 + gateway: 10.20.0.2 + ip_ranges: + - - 10.20.0.3 + - 10.20.255.254 + meta: + configurable: false + map_priority: 0 + notation: ip_ranges + render_addr_mask: null + render_type: null + unmovable: true + use_gateway: true + name: fuelweb_admin + vlan_start: null +settings: + editable: + access: + email: + description: Email address for Administrator + label: Email + regex: + error: Invalid email + source: ^\S+@\S+$ + type: text + value: admin@localhost + weight: 40 + metadata: + label: Access + weight: 10 + password: + description: Password for Administrator + label: Password + regex: + error: Empty password + source: \S + type: password + value: admin + weight: 20 + tenant: + description: Tenant (project) name for Administrator + label: Tenant + regex: + error: Invalid tenant name + source: ^(?!services$)(?!nova$)(?!glance$)(?!keystone$)(?!neutron$)(?!cinder$)(?!swift$)(?!ceph$)(?![Gg]uest$)(?!.* + +.*$).+ + type: text + value: admin + weight: 30 + user: + description: Username for Administrator + label: Username + regex: + error: Invalid username + source: ^(?!services$)(?!nova$)(?!glance$)(?!keystone$)(?!neutron$)(?!cinder$)(?!swift$)(?!ceph$)(?![Gg]uest$)(?!.* + +.*$).+ + type: text + value: admin + weight: 10 + additional_components: + ceilometer: + description: If selected, Ceilometer component will be installed + label: Install Ceilometer + type: checkbox + value: false + weight: 40 + heat: + description: '' + label: '' + type: hidden + value: true + weight: 30 + metadata: + label: Additional Components + weight: 20 + mongo: + description: If selected, You can use external Mongo DB as ceilometer backend + label: Use external Mongo DB + restrictions: + - settings:additional_components.ceilometer.value == false + type: checkbox + value: false + weight: 40 + murano: + description: If selected, Murano component will be installed + label: Install Murano + restrictions: + - cluster:net_provider != 'neutron' + type: checkbox + value: false + weight: 20 + sahara: + description: If selected, Sahara component will be installed + label: Install Sahara + type: checkbox + value: false + weight: 10 + common: + auth_key: + description: Public key(s) to include in authorized_keys on deployed nodes + label: Public Key + type: textarea + value: '' + weight: 70 + auto_assign_floating_ip: + description: If selected, OpenStack will automatically assign a floating IP + to a new instance + label: Auto assign floating IP + restrictions: + - action: hide + condition: cluster:net_provider == 'neutron' + type: checkbox + value: false + weight: 40 + debug: + description: Debug logging mode provides more information, but requires more + disk space. + label: OpenStack debug logging + type: checkbox + value: false + weight: 20 + libvirt_type: + label: Hypervisor type + type: radio + value: kvm + values: + - data: kvm + description: Choose this type of hypervisor if you run OpenStack on hardware + label: KVM + - data: qemu + description: Choose this type of hypervisor if you run OpenStack on virtual + hosts. + label: QEMU + weight: 30 + metadata: + label: Common + weight: 30 + nova_quota: + description: Quotas are used to limit CPU and memory usage for tenants. Enabling + quotas will increase load on the Nova database. + label: Nova quotas + type: checkbox + value: false + weight: 25 + puppet_debug: + description: Debug puppet logging mode provides more information, but requires + more disk space. + label: Puppet debug logging + type: checkbox + value: true + weight: 20 + resume_guests_state_on_host_boot: + description: Whether to resume previous guests state when the host reboots. + If enabled, this option causes guests assigned to the host to resume their + previous state. If the guest was running a restart will be attempted when + nova-compute starts. If the guest was not running previously, a restart will + not be attempted. + label: Resume guests state on host boot + type: checkbox + value: true + weight: 60 + use_cow_images: + description: For most cases you will want qcow format. If it's disabled, raw + image format will be used to run VMs. OpenStack with raw format currently + does not support snapshotting. + label: Use qcow format for images + type: checkbox + value: true + weight: 50 + use_vcenter: + type: hidden + value: false + weight: 30 + corosync: + group: + description: '' + label: Group + type: text + value: 226.94.1.1 + weight: 10 + metadata: + label: Corosync + restrictions: + - action: hide + condition: 'true' + weight: 50 + port: + description: '' + label: Port + type: text + value: '12000' + weight: 20 + verified: + description: Set True only if multicast is configured correctly on router. + label: Need to pass network verification. + type: checkbox + value: false + weight: 10 + external_dns: + dns_list: + description: List of upstream DNS servers, separated by comma + label: DNS list + regex: + error: Invalid IP address list + source: ^\*$|^(?:\d|1?\d\d|2[0-4]\d|25[0-5])(?:\.(?:\d|1?\d\d|2[0-4]\d|25[0-5])){3}(?:\s*,\s*(?:\d|1?\d\d|2[0-4]\d|25[0-5])(?:\.(?:\d|1?\d\d|2[0-4]\d|25[0-5])){3})*$ + type: text + value: 8.8.4.4, 8.8.8.8 + weight: 10 + metadata: + label: Host OS DNS Servers + weight: 90 + external_mongo: + hosts_ip: + description: IP Addresses of MongoDB. Use comma to split IPs + label: MongoDB hosts IP + regex: + error: Invalid hosts ip sequence + source: ^(((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?),)*((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$ + type: text + value: '' + weight: 30 + metadata: + label: External MongoDB + restrictions: + - action: hide + condition: settings:additional_components.mongo.value == false + weight: 20 + mongo_db_name: + description: Mongo database name + label: Database name + regex: + error: Invalid database name + source: ^\w+$ + type: text + value: ceilometer + weight: 30 + mongo_password: + description: Mongo database password + label: Password + regex: + error: Password contains spaces + source: ^\S*$ + type: password + value: ceilometer + weight: 30 + mongo_replset: + description: Name for Mongo replication set + label: Replset + type: text + value: '' + weight: 30 + mongo_user: + description: Mongo database username + label: Username + regex: + error: Empty username + source: ^\w+$ + type: text + value: ceilometer + weight: 30 + external_ntp: + metadata: + label: Host OS NTP Servers + weight: 100 + ntp_list: + description: List of upstream NTP servers, separated by comma + label: NTP server list + regex: + error: Invalid NTP server list + source: ^\s*(?:(?:\w+(?:-+\w+)*\.)+[a-z]+|\d{1,3}(?:\.\d{1,3}){3})\s*(?:,\s*(?:(?:\w+(?:-+\w+)*\.)+[a-z]+|\d{1,3}(\.\d{1,3}){3})\s*)*$ + type: text + value: 0.pool.ntp.org, 1.pool.ntp.org + weight: 10 + kernel_params: + kernel: + description: Default kernel parameters + label: Initial parameters + type: text + value: console=ttyS0,9600 console=tty0 net.ifnames=0 biosdevname=0 rootdelay=90 + nomodeset + weight: 45 + metadata: + label: Kernel parameters + weight: 40 + murano_settings: + metadata: + label: Murano Settings + restrictions: + - action: hide + condition: settings:additional_components.murano.value == false + weight: 20 + murano_repo_url: + description: '' + label: Murano Repository URL + type: text + value: http://storage.apps.openstack.org/ + weight: 10 + neutron_mellanox: + metadata: + enabled: true + label: Mellanox Neutron components + restrictions: + - action: hide + condition: not ('experimental' in version:feature_groups) + toggleable: false + weight: 50 + plugin: + label: Mellanox drivers and SR-IOV plugin + type: radio + value: disabled + values: + - data: disabled + description: If selected, Mellanox drivers, Neutron and Cinder plugin will + not be installed. + label: Mellanox drivers and plugins disabled + restrictions: + - settings:storage.iser.value == true + - data: drivers_only + description: If selected, Mellanox Ethernet drivers will be installed to support + networking over Mellanox NIC. Mellanox Neutron plugin will not be installed. + label: Install only Mellanox drivers + restrictions: + - settings:common.libvirt_type.value != 'kvm' + - data: ethernet + description: If selected, both Mellanox Ethernet drivers and Mellanox network + acceleration (Neutron) plugin will be installed. + label: Install Mellanox drivers and SR-IOV plugin + restrictions: + - settings:common.libvirt_type.value != 'kvm' or not (cluster:net_provider + == 'neutron' and networking_parameters:segmentation_type == 'vlan') + weight: 60 + vf_num: + description: Note that one virtual function will be reserved to the storage + network, in case of choosing iSER. + label: Number of virtual NICs + restrictions: + - settings:neutron_mellanox.plugin.value != 'ethernet' + type: text + value: '16' + weight: 70 + opendaylight: + metadata: + enabled: true + label: OpenDaylight plugin + plugin_id: 1 + restrictions: + - cluster:net_provider != 'neutron': Only neutron is supported by OpenDaylight + toggleable: true + weight: 70 + rest_api_port: + description: Port on which ODL REST API will be available. + label: Port number + regex: + error: Invalid port number + source: ^([1-9][0-9]{0,3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])$ + type: text + value: '8282' + weight: 40 + use_vxlan: + description: Configure neutron to use VXLAN tunneling + label: Use vxlan + restrictions: + - action: disable + condition: networking_parameters:segmentation_type == 'vlan' + message: Neutron with GRE segmentation required + type: checkbox + value: true + weight: 20 + vni_range_end: + description: VXLAN VNI IDs range end + label: VNI range end + regex: + error: Invalid ID number + source: ^\d+$ + restrictions: + - action: hide + condition: networking_parameters:segmentation_type == 'vlan' + type: text + value: '10000' + weight: 31 + vni_range_start: + description: VXLAN VNI IDs range start + label: VNI range start + regex: + error: Invalid ID number + source: ^\d+$ + restrictions: + - action: hide + condition: networking_parameters:segmentation_type == 'vlan' + type: text + value: '10' + weight: 30 + provision: + metadata: + label: Provision + weight: 80 + method: + description: Which provision method to use for this cluster. + label: Provision method + type: radio + value: image + values: + - data: image + description: Copying pre-built images on a disk. + label: Image + - data: cobbler + description: Install from scratch using anaconda or debian-installer. + label: (DEPRECATED) Classic (use anaconda or debian-installer) + public_network_assignment: + assign_to_all_nodes: + description: When disabled, public network will be assigned to controllers only + label: Assign public network to all nodes + type: checkbox + value: false + weight: 10 + metadata: + label: Public network assignment + restrictions: + - action: hide + condition: cluster:net_provider != 'neutron' + weight: 50 + repo_setup: + metadata: + always_editable: true + label: Repositories + weight: 50 + repos: + description: 'Please note: the first repository will be considered the operating + system mirror that will be used during node provisioning. + + To create a local repository mirror on the Fuel master node, please follow + the instructions provided by running "fuel-createmirror --help" on the Fuel + master node. + + Please make sure your Fuel master node has Internet access to the repository + before attempting to create a mirror. + + For more details, please refer to the documentation (https://docs.mirantis.com/openstack/fuel/fuel-6.1/operations.html#external-ubuntu-ops). + + ' + extra_priority: null + type: custom_repo_configuration + value: + - name: ubuntu + priority: null + section: main universe multiverse + suite: trusty + type: deb + uri: http://archive.ubuntu.com/ubuntu/ + - name: ubuntu-updates + priority: null + section: main universe multiverse + suite: trusty-updates + type: deb + uri: http://archive.ubuntu.com/ubuntu/ + - name: ubuntu-security + priority: null + section: main universe multiverse + suite: trusty-security + type: deb + uri: http://archive.ubuntu.com/ubuntu/ + - name: mos + priority: 1050 + section: main restricted + suite: mos6.1 + type: deb + uri: http://10.20.0.2:8080/2014.2.2-6.1/ubuntu/x86_64 + - name: mos-updates + priority: 1050 + section: main restricted + suite: mos6.1-updates + type: deb + uri: http://mirror.fuel-infra.org/mos/ubuntu/ + - name: mos-security + priority: 1050 + section: main restricted + suite: mos6.1-security + type: deb + uri: http://mirror.fuel-infra.org/mos/ubuntu/ + - name: mos-holdback + priority: 1100 + section: main restricted + suite: mos6.1-holdback + type: deb + uri: http://mirror.fuel-infra.org/mos/ubuntu/ + - name: Auxiliary + priority: 1150 + section: main restricted + suite: auxiliary + type: deb + uri: http://10.20.0.2:8080/2014.2.2-6.1/ubuntu/auxiliary + storage: + ephemeral_ceph: + description: Configures Nova to store ephemeral volumes in RBD. This works best + if Ceph is enabled for volumes and images, too. Enables live migration of + all types of Ceph backed VMs (without this option, live migration will only + work with VMs launched from Cinder volumes). + label: Ceph RBD for ephemeral volumes (Nova) + type: checkbox + value: true + weight: 75 + images_ceph: + description: Configures Glance to use the Ceph RBD backend to store images. + If enabled, this option will prevent Swift from installing. + label: Ceph RBD for images (Glance) + restrictions: + - settings:storage.images_vcenter.value == true: Only one Glance backend could + be selected. + type: checkbox + value: true + weight: 30 + images_vcenter: + description: Configures Glance to use the vCenter/ESXi backend to store images. + If enabled, this option will prevent Swift from installing. + label: VMWare vCenter/ESXi datastore for images (Glance) + restrictions: + - action: hide + condition: settings:common.use_vcenter.value != true + - condition: settings:storage.images_ceph.value == true + message: Only one Glance backend could be selected. + type: checkbox + value: false + weight: 35 + iser: + description: 'High performance block storage: Cinder volumes over iSER protocol + (iSCSI over RDMA). This feature requires SR-IOV capabilities in the NIC, and + will use a dedicated virtual function for the storage network.' + label: iSER protocol for volumes (Cinder) + restrictions: + - settings:storage.volumes_lvm.value != true or settings:common.libvirt_type.value + != 'kvm' + - action: hide + condition: not ('experimental' in version:feature_groups) + type: checkbox + value: false + weight: 11 + metadata: + label: Storage + weight: 60 + objects_ceph: + description: Configures RadosGW front end for Ceph RBD. This exposes S3 and + Swift API Interfaces. If enabled, this option will prevent Swift from installing. + label: Ceph RadosGW for objects (Swift API) + restrictions: + - settings:storage.images_ceph.value == false + type: checkbox + value: false + weight: 80 + osd_pool_size: + description: Configures the default number of object replicas in Ceph. This + number must be equal to or lower than the number of deployed 'Storage - Ceph + OSD' nodes. + label: Ceph object replication factor + regex: + error: Invalid number + source: ^[1-9]\d*$ + type: text + value: '2' + weight: 85 + volumes_ceph: + description: Configures Cinder to store volumes in Ceph RBD images. + label: Ceph RBD for volumes (Cinder) + restrictions: + - settings:storage.volumes_lvm.value == true + type: checkbox + value: true + weight: 20 + volumes_lvm: + description: It is recommended to have at least one Storage - Cinder LVM node. + label: Cinder LVM over iSCSI for volumes + restrictions: + - settings:storage.volumes_ceph.value == true + type: checkbox + value: false + weight: 10 + syslog: + metadata: + label: Syslog + weight: 50 + syslog_port: + description: Remote syslog port + label: Port + regex: + error: Invalid Syslog port + source: ^([1-9][0-9]{0,3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])$ + type: text + value: '514' + weight: 20 + syslog_server: + description: Remote syslog hostname + label: Hostname + type: text + value: '' + weight: 10 + syslog_transport: + label: Syslog transport protocol + type: radio + value: tcp + values: + - data: udp + description: '' + label: UDP + - data: tcp + description: '' + label: TCP + weight: 30 + workloads_collector: + enabled: + type: hidden + value: true + metadata: + label: Workloads Collector User + restrictions: + - action: hide + condition: 'true' + weight: 10 + password: + type: password + value: pBkLbu1k + tenant: + type: text + value: services + user: + type: text + value: fuel_stats_user diff --git a/fuel/deploy/templates/hardware_environment/conf/linux_foundation_lab/pod2/ha/dha.yaml b/fuel/deploy/templates/hardware_environment/conf/linux_foundation_lab/pod2/ha/dha.yaml new file mode 100644 index 0000000..f34d79f --- /dev/null +++ b/fuel/deploy/templates/hardware_environment/conf/linux_foundation_lab/pod2/ha/dha.yaml @@ -0,0 +1,49 @@ +title: Deployment Hardware Adapter (DHA) +# DHA API version supported +version: +created: +comment: Config for LF POD2 + +# Adapter to use for this definition +adapter: ipmi + +# Node list. +# Mandatory property is id, all other properties are adapter specific. + +nodes: +- id: 1 + pxeMac: 00:25:B5:A0:00:2A + ipmiIp: 172.30.8.75 + ipmiUser: admin + ipmiPass: octopus +- id: 2 + pxeMac: 00:25:B5:A0:00:3A + ipmiIp: 172.30.8.65 + ipmiUser: admin + ipmiPass: octopus +- id: 3 + pxeMac: 00:25:B5:A0:00:4A + ipmiIp: 172.30.8.74 + ipmiUser: admin + ipmiPass: octopus +- id: 4 + pxeMac: 00:25:B5:A0:00:5A + ipmiIp: 172.30.8.73 + ipmiUser: admin + ipmiPass: octopus +- id: 5 + pxeMac: 00:25:B5:A0:00:6A + ipmiIp: 172.30.8.72 + ipmiUser: admin + ipmiPass: octopus +# Adding the Fuel node as node id 6 which may not be correct - please +# adjust as needed. +- id: 6 + libvirtName: fuel-opnfv + libvirtTemplate: templates/hardware_environment/vms/fuel.xml + isFuel: yes + username: root + password: r00tme + +disks: + fuel: 50G \ No newline at end of file diff --git a/fuel/deploy/baremetal/conf/ericsson_montreal_lab/ha/dea.yaml b/fuel/deploy/templates/hardware_environment/old_conf/ericsson_montreal_lab/ha/dea.yaml similarity index 98% rename from fuel/deploy/baremetal/conf/ericsson_montreal_lab/ha/dea.yaml rename to fuel/deploy/templates/hardware_environment/old_conf/ericsson_montreal_lab/ha/dea.yaml index dc8014d..6ea3b72 100644 --- a/fuel/deploy/baremetal/conf/ericsson_montreal_lab/ha/dea.yaml +++ b/fuel/deploy/templates/hardware_environment/old_conf/ericsson_montreal_lab/ha/dea.yaml @@ -1,10 +1,12 @@ title: Deployment Environment Adapter (DEA) # DEA API version supported -version: 1.1 -created: Tue May 5 15:33:07 UTC 2015 +version: +created: comment: Test environment Ericsson Montreal -environment_name: opnfv -environment_mode: ha +environment: + name: opnfv_virt + mode: ha + net_segment_type: vlan wanted_release: Juno on Ubuntu 12.04.4 nodes: - id: 1 @@ -31,6 +33,11 @@ nodes: interfaces: interfaces_1 transformations: transformations_2 role: ceph-osd,compute +opnfv: + hosts: + - name: + address: + fqdn: fuel: ADMIN_NETWORK: ipaddress: 10.40.0.2 @@ -47,17 +54,16 @@ fuel: NTP1: 10.118.34.219 NTP2: NTP3: -interfaces: - interfaces_1: - eth0: - - fuelweb_admin - eth2: - - public - - management - - storage - - private -transformations: - transformations_1: +interfaces_1: + eth0: + - fuelweb_admin + eth2: + - public + - management + - storage + - private +transformations_1: + transformations: - action: add-br name: br-eth0 - action: add-port @@ -136,7 +142,8 @@ transformations: bridges: - br-eth2 - br-prv - transformations_2: +transformations_2: + transformations: - action: add-br name: br-eth0 - action: add-port @@ -203,9 +210,6 @@ transformations: bridges: - br-eth2 - br-prv -opnfv: - compute: {} - controller: {} network: networking_parameters: base_mac: fa:16:3e:00:00:00 diff --git a/fuel/deploy/baremetal/conf/ericsson_montreal_lab/ha/dha.yaml b/fuel/deploy/templates/hardware_environment/old_conf/ericsson_montreal_lab/ha/dha.yaml similarity index 93% rename from fuel/deploy/baremetal/conf/ericsson_montreal_lab/ha/dha.yaml rename to fuel/deploy/templates/hardware_environment/old_conf/ericsson_montreal_lab/ha/dha.yaml index 1f87d52..eed9ad6 100644 --- a/fuel/deploy/baremetal/conf/ericsson_montreal_lab/ha/dha.yaml +++ b/fuel/deploy/templates/hardware_environment/old_conf/ericsson_montreal_lab/ha/dha.yaml @@ -45,7 +45,7 @@ nodes: # adjust as needed. - id: 7 libvirtName: fuel-opnfv - libvirtTemplate: baremetal/vms/fuel.xml + libvirtTemplate: templates/hardware_environment/vms/fuel.xml isFuel: yes username: root password: r00tme diff --git a/fuel/deploy/baremetal/conf/ericsson_montreal_lab/multinode/dea.yaml b/fuel/deploy/templates/hardware_environment/old_conf/ericsson_montreal_lab/multinode/dea.yaml similarity index 98% rename from fuel/deploy/baremetal/conf/ericsson_montreal_lab/multinode/dea.yaml rename to fuel/deploy/templates/hardware_environment/old_conf/ericsson_montreal_lab/multinode/dea.yaml index 328dd6b..87ecdaa 100644 --- a/fuel/deploy/baremetal/conf/ericsson_montreal_lab/multinode/dea.yaml +++ b/fuel/deploy/templates/hardware_environment/old_conf/ericsson_montreal_lab/multinode/dea.yaml @@ -1,10 +1,12 @@ title: Deployment Environment Adapter (DEA) # DEA API version supported -version: 1.1 -created: Tue May 5 15:33:07 UTC 2015 +version: +created: comment: Test environment Ericsson Montreal -environment_name: opnfv -environment_mode: multinode +environment: + name: opnfv_virt + mode: multinode + net_segment_type: vlan wanted_release: Juno on Ubuntu 12.04.4 nodes: - id: 1 @@ -31,6 +33,11 @@ nodes: interfaces: interfaces_1 transformations: transformations_2 role: ceph-osd,compute +opnfv: + hosts: + - name: + address: + fqdn: fuel: ADMIN_NETWORK: ipaddress: 10.40.0.2 @@ -47,17 +54,16 @@ fuel: NTP1: 10.118.34.219 NTP2: NTP3: -interfaces: - interfaces_1: - eth0: - - fuelweb_admin - eth2: - - public - - management - - storage - - private -transformations: - transformations_1: +interfaces_1: + eth0: + - fuelweb_admin + eth2: + - public + - management + - storage + - private +transformations_1: + transformations: - action: add-br name: br-eth0 - action: add-port @@ -130,7 +136,8 @@ transformations: bridges: - br-eth2 - br-prv - transformations_2: +transformations_2: + transformations: - action: add-br name: br-eth0 - action: add-port @@ -197,9 +204,6 @@ transformations: bridges: - br-eth2 - br-prv -opnfv: - compute: {} - controller: {} network: networking_parameters: base_mac: fa:16:3e:00:00:00 diff --git a/fuel/deploy/baremetal/conf/ericsson_montreal_lab/multinode/dha.yaml b/fuel/deploy/templates/hardware_environment/old_conf/ericsson_montreal_lab/multinode/dha.yaml similarity index 93% rename from fuel/deploy/baremetal/conf/ericsson_montreal_lab/multinode/dha.yaml rename to fuel/deploy/templates/hardware_environment/old_conf/ericsson_montreal_lab/multinode/dha.yaml index 1f87d52..eed9ad6 100644 --- a/fuel/deploy/baremetal/conf/ericsson_montreal_lab/multinode/dha.yaml +++ b/fuel/deploy/templates/hardware_environment/old_conf/ericsson_montreal_lab/multinode/dha.yaml @@ -45,7 +45,7 @@ nodes: # adjust as needed. - id: 7 libvirtName: fuel-opnfv - libvirtTemplate: baremetal/vms/fuel.xml + libvirtTemplate: templates/hardware_environment/vms/fuel.xml isFuel: yes username: root password: r00tme diff --git a/fuel/deploy/baremetal/conf/linux_foundation_lab/pod1/ha/dea.yaml b/fuel/deploy/templates/hardware_environment/old_conf/linux_foundation_lab/pod1/ha/dea.yaml similarity index 98% rename from fuel/deploy/baremetal/conf/linux_foundation_lab/pod1/ha/dea.yaml rename to fuel/deploy/templates/hardware_environment/old_conf/linux_foundation_lab/pod1/ha/dea.yaml index c2e568a..ba66bdd 100644 --- a/fuel/deploy/baremetal/conf/linux_foundation_lab/pod1/ha/dea.yaml +++ b/fuel/deploy/templates/hardware_environment/old_conf/linux_foundation_lab/pod1/ha/dea.yaml @@ -1,10 +1,12 @@ title: Deployment Environment Adapter (DEA) # DEA API version supported -version: 1.1 -created: Thu May 21 13:34:13 CEST 2015 +version: +created: comment: Config for LF POD1 - HA deployment with Ceph -environment_name: opnfv -environment_mode: ha +environment: + name: opnfv_virt + mode: ha + net_segment_type: vlan wanted_release: Juno on Ubuntu 12.04.4 nodes: - id: 1 @@ -27,6 +29,11 @@ nodes: interfaces: interfaces_1 transformations: transformations_2 role: ceph-osd,compute +opnfv: + hosts: + - name: + address: + fqdn: fuel: ADMIN_NETWORK: ipaddress: 10.20.0.2 @@ -43,17 +50,16 @@ fuel: NTP1: 0.pool.ntp.org NTP2: 1.pool.ntp.org NTP3: 2.pool.ntp.org -interfaces: - interfaces_1: - eth0: - - public - eth1: - - fuelweb_admin - - management - - storage - - private -transformations: - transformations_1: +interfaces_1: + eth0: + - public + eth1: + - fuelweb_admin + - management + - storage + - private +transformations_1: + transformations: - action: add-br name: br-eth0 - action: add-port @@ -110,7 +116,8 @@ transformations: bridges: - br-eth1 - br-prv - transformations_2: +transformations_2: + transformations: - action: add-br name: br-eth0 - action: add-port @@ -159,9 +166,6 @@ transformations: bridges: - br-eth1 - br-prv -opnfv: - compute: {} - controller: {} network: networking_parameters: base_mac: fa:16:3e:00:00:00 diff --git a/fuel/deploy/templates/hardware_environment/old_conf/linux_foundation_lab/pod1/ha/dha.yaml b/fuel/deploy/templates/hardware_environment/old_conf/linux_foundation_lab/pod1/ha/dha.yaml new file mode 100644 index 0000000..a7fc7c0 --- /dev/null +++ b/fuel/deploy/templates/hardware_environment/old_conf/linux_foundation_lab/pod1/ha/dha.yaml @@ -0,0 +1,49 @@ +title: Deployment Hardware Adapter (DHA) +# DHA API version supported +version: +created: +comment: Config for LF POD1 + +# Adapter to use for this definition +adapter: ipmi + +# Node list. +# Mandatory property is id, all other properties are adapter specific. + +nodes: +- id: 1 + pxeMac: 00:25:b5:b0:00:ef + ipmiIp: 172.30.8.69 + ipmiUser: admin + ipmiPass: octopus +- id: 2 + pxeMac: 00:25:b5:b0:00:cf + ipmiIp: 172.30.8.78 + ipmiUser: admin + ipmiPass: octopus +- id: 3 + pxeMac: 00:25:b5:b0:00:8f + ipmiIp: 172.30.8.68 + ipmiUser: admin + ipmiPass: octopus +- id: 4 + pxeMac: 00:25:b5:b0:00:6f + ipmiIp: 172.30.8.77 + ipmiUser: admin + ipmiPass: octopus +- id: 5 + pxeMac: 00:25:b5:b0:00:4f + ipmiIp: 172.30.8.67 + ipmiUser: admin + ipmiPass: octopus +# Adding the Fuel node as node id 6 which may not be correct - please +# adjust as needed. +- id: 6 + libvirtName: fuel-opnfv + libvirtTemplate: templates/hardware_environment/vms/fuel.xml + isFuel: yes + username: root + password: r00tme + +disks: + fuel: 30G \ No newline at end of file diff --git a/fuel/deploy/baremetal/conf/linux_foundation_lab/pod1/multinode/dea.yaml b/fuel/deploy/templates/hardware_environment/old_conf/linux_foundation_lab/pod1/multinode/dea.yaml similarity index 98% rename from fuel/deploy/baremetal/conf/linux_foundation_lab/pod1/multinode/dea.yaml rename to fuel/deploy/templates/hardware_environment/old_conf/linux_foundation_lab/pod1/multinode/dea.yaml index d268404..35b1c3f 100644 --- a/fuel/deploy/baremetal/conf/linux_foundation_lab/pod1/multinode/dea.yaml +++ b/fuel/deploy/templates/hardware_environment/old_conf/linux_foundation_lab/pod1/multinode/dea.yaml @@ -1,10 +1,12 @@ title: Deployment Environment Adapter (DEA) # DEA API version supported -version: 1.1 -created: Tue May 5 15:33:07 UTC 2015 +version: +created: comment: Config for LF POD1 - Multinode deployment with Ceph -environment_name: opnfv -environment_mode: multinode +environment: + name: opnfv_virt + mode: multinode + net_segment_type: vlan wanted_release: Juno on Ubuntu 12.04.4 nodes: - id: 1 @@ -27,6 +29,11 @@ nodes: interfaces: interfaces_1 transformations: transformations_2 role: ceph-osd,compute +opnfv: + hosts: + - name: + address: + fqdn: fuel: ADMIN_NETWORK: ipaddress: 10.20.0.2 @@ -43,17 +50,16 @@ fuel: NTP1: 0.pool.ntp.org NTP2: 1.pool.ntp.org NTP3: 2.pool.ntp.org -interfaces: - interfaces_1: - eth0: - - public - eth1: - - fuelweb_admin - - management - - storage - - private -transformations: - transformations_1: +interfaces_1: + eth0: + - public + eth1: + - fuelweb_admin + - management + - storage + - private +transformations_1: + transformations: - action: add-br name: br-eth0 - action: add-port @@ -110,7 +116,8 @@ transformations: bridges: - br-eth1 - br-prv - transformations_2: +transformations_2: + transformations: - action: add-br name: br-eth0 - action: add-port @@ -159,9 +166,6 @@ transformations: bridges: - br-eth1 - br-prv -opnfv: - compute: {} - controller: {} network: networking_parameters: base_mac: fa:16:3e:00:00:00 diff --git a/fuel/deploy/baremetal/conf/linux_foundation_lab/pod1/multinode/dha.yaml b/fuel/deploy/templates/hardware_environment/old_conf/linux_foundation_lab/pod1/multinode/dha.yaml similarity index 89% rename from fuel/deploy/baremetal/conf/linux_foundation_lab/pod1/multinode/dha.yaml rename to fuel/deploy/templates/hardware_environment/old_conf/linux_foundation_lab/pod1/multinode/dha.yaml index d7f00c7..2dcab1f 100644 --- a/fuel/deploy/baremetal/conf/linux_foundation_lab/pod1/multinode/dha.yaml +++ b/fuel/deploy/templates/hardware_environment/old_conf/linux_foundation_lab/pod1/multinode/dha.yaml @@ -1,7 +1,7 @@ title: Deployment Hardware Adapter (DHA) # DHA API version supported -version: 1.1 -created: Fri May 8 08:03:49 UTC 2015 +version: +created: comment: Config for LF Pod1 # Adapter to use for this definition @@ -40,7 +40,7 @@ nodes: # adjust as needed. - id: 6 libvirtName: fuel-opnfv - libvirtTemplate: baremetal/vms/fuel_lf.xml + libvirtTemplate: templates/hardware_environment/vms/fuel.xml isFuel: yes username: root password: r00tme diff --git a/fuel/deploy/baremetal/conf/linux_foundation_lab/pod2/ha/dea.yaml b/fuel/deploy/templates/hardware_environment/old_conf/linux_foundation_lab/pod2/ha/dea.yaml similarity index 98% rename from fuel/deploy/baremetal/conf/linux_foundation_lab/pod2/ha/dea.yaml rename to fuel/deploy/templates/hardware_environment/old_conf/linux_foundation_lab/pod2/ha/dea.yaml index 5a0f367..d7fba48 100644 --- a/fuel/deploy/baremetal/conf/linux_foundation_lab/pod2/ha/dea.yaml +++ b/fuel/deploy/templates/hardware_environment/old_conf/linux_foundation_lab/pod2/ha/dea.yaml @@ -3,8 +3,10 @@ title: Deployment Environment Adapter (DEA) version: created: comment: Config for LF POD2 - HA deployment with Ceph -environment_name: opnfv -environment_mode: ha +environment: + name: opnfv_virt + mode: ha + net_segment_type: vlan wanted_release: Juno on Ubuntu 12.04.4 nodes: - id: 1 @@ -27,6 +29,11 @@ nodes: interfaces: interfaces_1 transformations: transformations_2 role: ceph-osd,compute +opnfv: + hosts: + - name: + address: + fqdn: fuel: ADMIN_NETWORK: ipaddress: 10.20.0.2 @@ -43,17 +50,16 @@ fuel: NTP1: 0.pool.ntp.org NTP2: 1.pool.ntp.org NTP3: 2.pool.ntp.org -interfaces: - interfaces_1: - eth0: - - public - eth1: - - fuelweb_admin - - management - - storage - - private -transformations: - transformations_1: +interfaces_1: + eth0: + - public + eth1: + - fuelweb_admin + - management + - storage + - private +transformations_1: + transformations: - action: add-br name: br-eth0 - action: add-port @@ -110,7 +116,8 @@ transformations: bridges: - br-eth1 - br-prv - transformations_2: +transformations_2: + transformations: - action: add-br name: br-eth0 - action: add-port @@ -159,9 +166,6 @@ transformations: bridges: - br-eth1 - br-prv -opnfv: - compute: {} - controller: {} network: networking_parameters: base_mac: fa:16:3e:00:00:00 diff --git a/fuel/deploy/baremetal/conf/linux_foundation_lab/pod2/ha/dha.yaml b/fuel/deploy/templates/hardware_environment/old_conf/linux_foundation_lab/pod2/ha/dha.yaml similarity index 93% rename from fuel/deploy/baremetal/conf/linux_foundation_lab/pod2/ha/dha.yaml rename to fuel/deploy/templates/hardware_environment/old_conf/linux_foundation_lab/pod2/ha/dha.yaml index 1a6d8bf..fdcd545 100644 --- a/fuel/deploy/baremetal/conf/linux_foundation_lab/pod2/ha/dha.yaml +++ b/fuel/deploy/templates/hardware_environment/old_conf/linux_foundation_lab/pod2/ha/dha.yaml @@ -40,7 +40,7 @@ nodes: # adjust as needed. - id: 6 libvirtName: fuel-opnfv - libvirtTemplate: baremetal/vms/fuel_lf.xml + libvirtTemplate: templates/hardware_environment/vms/fuel.xml isFuel: yes username: root password: r00tme diff --git a/fuel/deploy/baremetal/conf/linux_foundation_lab/pod2/multinode/dea.yaml b/fuel/deploy/templates/hardware_environment/old_conf/linux_foundation_lab/pod2/multinode/dea.yaml similarity index 98% rename from fuel/deploy/baremetal/conf/linux_foundation_lab/pod2/multinode/dea.yaml rename to fuel/deploy/templates/hardware_environment/old_conf/linux_foundation_lab/pod2/multinode/dea.yaml index d6548f7..4814017 100644 --- a/fuel/deploy/baremetal/conf/linux_foundation_lab/pod2/multinode/dea.yaml +++ b/fuel/deploy/templates/hardware_environment/old_conf/linux_foundation_lab/pod2/multinode/dea.yaml @@ -3,8 +3,10 @@ title: Deployment Environment Adapter (DEA) version: created: comment: Config for LF POD2 - Multinode deployment with Ceph -environment_name: opnfv -environment_mode: multinode +environment: + name: opnfv_virt + mode: multinode + net_segment_type: vlan wanted_release: Juno on Ubuntu 12.04.4 nodes: - id: 1 @@ -27,6 +29,11 @@ nodes: interfaces: interfaces_1 transformations: transformations_2 role: ceph-osd,compute +opnfv: + hosts: + - name: + address: + fqdn: fuel: ADMIN_NETWORK: ipaddress: 10.20.0.2 @@ -43,17 +50,16 @@ fuel: NTP1: 0.pool.ntp.org NTP2: 1.pool.ntp.org NTP3: 2.pool.ntp.org -interfaces: - interfaces_1: - eth0: - - public - eth1: - - fuelweb_admin - - management - - storage - - private -transformations: - transformations_1: +interfaces_1: + eth0: + - public + eth1: + - fuelweb_admin + - management + - storage + - private +transformations_1: + transformations: - action: add-br name: br-eth0 - action: add-port @@ -110,7 +116,8 @@ transformations: bridges: - br-eth1 - br-prv - transformations_2: +transformations_2: + transformations: - action: add-br name: br-eth0 - action: add-port @@ -159,9 +166,6 @@ transformations: bridges: - br-eth1 - br-prv -opnfv: - compute: {} - controller: {} network: networking_parameters: base_mac: fa:16:3e:00:00:00 diff --git a/fuel/deploy/baremetal/conf/linux_foundation_lab/pod2/multinode/dha.yaml b/fuel/deploy/templates/hardware_environment/old_conf/linux_foundation_lab/pod2/multinode/dha.yaml similarity index 93% rename from fuel/deploy/baremetal/conf/linux_foundation_lab/pod2/multinode/dha.yaml rename to fuel/deploy/templates/hardware_environment/old_conf/linux_foundation_lab/pod2/multinode/dha.yaml index 1a6d8bf..fdcd545 100644 --- a/fuel/deploy/baremetal/conf/linux_foundation_lab/pod2/multinode/dha.yaml +++ b/fuel/deploy/templates/hardware_environment/old_conf/linux_foundation_lab/pod2/multinode/dha.yaml @@ -40,7 +40,7 @@ nodes: # adjust as needed. - id: 6 libvirtName: fuel-opnfv - libvirtTemplate: baremetal/vms/fuel_lf.xml + libvirtTemplate: templates/hardware_environment/vms/fuel.xml isFuel: yes username: root password: r00tme diff --git a/fuel/deploy/baremetal/vms/fuel_lf.xml b/fuel/deploy/templates/hardware_environment/vms/fuel.xml similarity index 96% rename from fuel/deploy/baremetal/vms/fuel_lf.xml rename to fuel/deploy/templates/hardware_environment/vms/fuel.xml index 31b5490..e3e3f80 100644 --- a/fuel/deploy/baremetal/vms/fuel_lf.xml +++ b/fuel/deploy/templates/hardware_environment/vms/fuel.xml @@ -36,7 +36,6 @@ /usr/libexec/qemu-kvm - @@ -62,7 +61,6 @@ - diff --git a/fuel/deploy/templates/virtual_environment/conf/ha/dea.yaml b/fuel/deploy/templates/virtual_environment/conf/ha/dea.yaml new file mode 100644 index 0000000..e0e2fe6 --- /dev/null +++ b/fuel/deploy/templates/virtual_environment/conf/ha/dea.yaml @@ -0,0 +1,839 @@ +title: Deployment Environment Adapter (DEA) +# DEA API version supported +version: +created: +comment: Small libvirt setup +environment: + name: opnfv_virt + mode: ha + net_segment_type: gre +wanted_release: Juno on Ubuntu 14.04.1 +nodes: +- id: 1 + interfaces: interfaces_1 + transformations: transformations_1 + role: ceph-osd,controller +- id: 2 + interfaces: interfaces_1 + transformations: transformations_2 + role: ceph-osd,compute +- id: 3 + interfaces: interfaces_1 + transformations: transformations_2 + role: ceph-osd,compute +- id: 4 + interfaces: interfaces_1 + transformations: transformations_2 + role: ceph-osd,compute +opnfv: + hosts: + - name: + address: + fqdn: +fuel: + ADMIN_NETWORK: + ipaddress: 10.20.0.2 + netmask: 255.255.255.0 + dhcp_pool_start: 10.20.0.3 + dhcp_pool_end: 10.20.0.254 + DNS_UPSTREAM: 10.118.32.193 + DNS_DOMAIN: opnfvericsson.ca + DNS_SEARCH: opnfvericsson.ca + FUEL_ACCESS: + user: admin + password: admin + HOSTNAME: opnfv_virt + NTP1: 10.118.34.219 + NTP2: + NTP3: +interfaces_1: + eth0: + - fuelweb_admin + - management + eth1: + - storage + eth2: + - private + eth3: + - public +transformations_1: + transformations: + - action: add-br + name: br-fw-admin + - action: add-br + name: br-mgmt + - action: add-br + name: br-storage + - action: add-br + name: br-ex + - action: add-br + name: br-floating + provider: ovs + - action: add-patch + bridges: + - br-floating + - br-ex + mtu: 65000 + provider: ovs + - action: add-br + name: br-mesh + - action: add-port + bridge: br-fw-admin + name: eth0 + - action: add-port + bridge: br-mgmt + name: eth0.101 + - action: add-port + bridge: br-storage + name: eth1.102 + - action: add-port + bridge: br-mesh + name: eth2.103 + - action: add-port + bridge: br-ex + name: eth3 +transformations_2: + transformations: + - action: add-br + name: br-fw-admin + - action: add-br + name: br-mgmt + - action: add-br + name: br-storage + - action: add-br + name: br-mesh + - action: add-port + bridge: br-fw-admin + name: eth0 + - action: add-port + bridge: br-mgmt + name: eth0.101 + - action: add-port + bridge: br-storage + name: eth1.102 + - action: add-port + bridge: br-mesh + name: eth2.103 +network: + networking_parameters: + base_mac: fa:16:3e:00:00:00 + dns_nameservers: + - 10.118.32.193 + floating_ranges: + - - 172.16.0.130 + - 172.16.0.254 + gre_id_range: + - 2 + - 65535 + internal_cidr: 192.168.111.0/24 + internal_gateway: 192.168.111.1 + net_l23_provider: ovs + segmentation_type: gre + vlan_range: + - 1000 + - 1030 + networks: + - cidr: 172.16.0.0/24 + gateway: 172.16.0.1 + ip_ranges: + - - 172.16.0.2 + - 172.16.0.126 + meta: + cidr: 172.16.0.0/24 + configurable: true + floating_range_var: floating_ranges + ip_range: + - 172.16.0.2 + - 172.16.0.126 + map_priority: 1 + name: public + notation: ip_ranges + render_addr_mask: public + render_type: null + use_gateway: true + vips: + - haproxy + - vrouter + vlan_start: null + name: public + vlan_start: null + - cidr: 192.168.0.0/24 + gateway: null + ip_ranges: + - - 192.168.0.1 + - 192.168.0.254 + meta: + cidr: 192.168.0.0/24 + configurable: true + map_priority: 2 + name: management + notation: cidr + render_addr_mask: internal + render_type: cidr + use_gateway: false + vips: + - haproxy + - vrouter + vlan_start: 101 + name: management + vlan_start: 101 + - cidr: 192.168.1.0/24 + gateway: null + ip_ranges: + - - 192.168.1.1 + - 192.168.1.254 + meta: + cidr: 192.168.1.0/24 + configurable: true + map_priority: 2 + name: storage + notation: cidr + render_addr_mask: storage + render_type: cidr + use_gateway: false + vlan_start: 102 + name: storage + vlan_start: 102 + - cidr: 192.168.2.0/24 + gateway: null + ip_ranges: + - - 192.168.2.1 + - 192.168.2.254 + meta: + cidr: 192.168.2.0/24 + configurable: true + map_priority: 2 + name: private + notation: cidr + render_addr_mask: private + render_type: cidr + seg_type: gre + use_gateway: false + vlan_start: 103 + name: private + vlan_start: 103 + - cidr: 10.20.0.0/24 + gateway: 10.20.0.2 + ip_ranges: + - - 10.20.0.3 + - 10.20.0.254 + meta: + configurable: false + map_priority: 0 + notation: ip_ranges + render_addr_mask: null + render_type: null + unmovable: true + use_gateway: true + name: fuelweb_admin + vlan_start: null +settings: + editable: + access: + email: + description: Email address for Administrator + label: Email + regex: + error: Invalid email + source: ^\S+@\S+$ + type: text + value: admin@localhost + weight: 40 + metadata: + label: Access + weight: 10 + password: + description: Password for Administrator + label: Password + regex: + error: Empty password + source: \S + type: password + value: admin + weight: 20 + tenant: + description: Tenant (project) name for Administrator + label: Tenant + regex: + error: Invalid tenant name + source: ^(?!services$)(?!nova$)(?!glance$)(?!keystone$)(?!neutron$)(?!cinder$)(?!swift$)(?!ceph$)(?![Gg]uest$)(?!.* + +.*$).+ + type: text + value: admin + weight: 30 + user: + description: Username for Administrator + label: Username + regex: + error: Invalid username + source: ^(?!services$)(?!nova$)(?!glance$)(?!keystone$)(?!neutron$)(?!cinder$)(?!swift$)(?!ceph$)(?![Gg]uest$)(?!.* + +.*$).+ + type: text + value: admin + weight: 10 + additional_components: + ceilometer: + description: If selected, Ceilometer component will be installed + label: Install Ceilometer + type: checkbox + value: false + weight: 40 + heat: + description: '' + label: '' + type: hidden + value: true + weight: 30 + metadata: + label: Additional Components + weight: 20 + mongo: + description: If selected, You can use external Mongo DB as ceilometer backend + label: Use external Mongo DB + restrictions: + - settings:additional_components.ceilometer.value == false + type: checkbox + value: false + weight: 40 + murano: + description: If selected, Murano component will be installed + label: Install Murano + restrictions: + - cluster:net_provider != 'neutron' + type: checkbox + value: false + weight: 20 + sahara: + description: If selected, Sahara component will be installed + label: Install Sahara + type: checkbox + value: false + weight: 10 + common: + auth_key: + description: Public key(s) to include in authorized_keys on deployed nodes + label: Public Key + type: textarea + value: '' + weight: 70 + auto_assign_floating_ip: + description: If selected, OpenStack will automatically assign a floating IP + to a new instance + label: Auto assign floating IP + restrictions: + - action: hide + condition: cluster:net_provider == 'neutron' + type: checkbox + value: false + weight: 40 + debug: + description: Debug logging mode provides more information, but requires more + disk space. + label: OpenStack debug logging + type: checkbox + value: false + weight: 20 + libvirt_type: + label: Hypervisor type + type: radio + value: qemu + values: + - data: kvm + description: Choose this type of hypervisor if you run OpenStack on hardware + label: KVM + - data: qemu + description: Choose this type of hypervisor if you run OpenStack on virtual + hosts. + label: QEMU + weight: 30 + metadata: + label: Common + weight: 30 + nova_quota: + description: Quotas are used to limit CPU and memory usage for tenants. Enabling + quotas will increase load on the Nova database. + label: Nova quotas + type: checkbox + value: false + weight: 25 + puppet_debug: + description: Debug puppet logging mode provides more information, but requires + more disk space. + label: Puppet debug logging + type: checkbox + value: true + weight: 20 + resume_guests_state_on_host_boot: + description: Whether to resume previous guests state when the host reboots. + If enabled, this option causes guests assigned to the host to resume their + previous state. If the guest was running a restart will be attempted when + nova-compute starts. If the guest was not running previously, a restart will + not be attempted. + label: Resume guests state on host boot + type: checkbox + value: true + weight: 60 + use_cow_images: + description: For most cases you will want qcow format. If it's disabled, raw + image format will be used to run VMs. OpenStack with raw format currently + does not support snapshotting. + label: Use qcow format for images + type: checkbox + value: true + weight: 50 + use_vcenter: + type: hidden + value: false + weight: 30 + corosync: + group: + description: '' + label: Group + type: text + value: 226.94.1.1 + weight: 10 + metadata: + label: Corosync + restrictions: + - action: hide + condition: 'true' + weight: 50 + port: + description: '' + label: Port + type: text + value: '12000' + weight: 20 + verified: + description: Set True only if multicast is configured correctly on router. + label: Need to pass network verification. + type: checkbox + value: false + weight: 10 + external_dns: + dns_list: + description: List of upstream DNS servers, separated by comma + label: DNS list + regex: + error: Invalid IP address list + source: ^\*$|^(?:\d|1?\d\d|2[0-4]\d|25[0-5])(?:\.(?:\d|1?\d\d|2[0-4]\d|25[0-5])){3}(?:\s*,\s*(?:\d|1?\d\d|2[0-4]\d|25[0-5])(?:\.(?:\d|1?\d\d|2[0-4]\d|25[0-5])){3})*$ + type: text + value: 10.118.32.193 + weight: 10 + metadata: + label: Host OS DNS Servers + weight: 90 + external_mongo: + hosts_ip: + description: IP Addresses of MongoDB. Use comma to split IPs + label: MongoDB hosts IP + regex: + error: Invalid hosts ip sequence + source: ^(((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?),)*((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$ + type: text + value: '' + weight: 30 + metadata: + label: External MongoDB + restrictions: + - action: hide + condition: settings:additional_components.mongo.value == false + weight: 20 + mongo_db_name: + description: Mongo database name + label: Database name + regex: + error: Invalid database name + source: ^\w+$ + type: text + value: ceilometer + weight: 30 + mongo_password: + description: Mongo database password + label: Password + regex: + error: Password contains spaces + source: ^\S*$ + type: password + value: ceilometer + weight: 30 + mongo_replset: + description: Name for Mongo replication set + label: Replset + type: text + value: '' + weight: 30 + mongo_user: + description: Mongo database username + label: Username + regex: + error: Empty username + source: ^\w+$ + type: text + value: ceilometer + weight: 30 + external_ntp: + metadata: + label: Host OS NTP Servers + weight: 100 + ntp_list: + description: List of upstream NTP servers, separated by comma + label: NTP server list + regex: + error: Invalid NTP server list + source: ^\s*(?:(?:\w+(?:-+\w+)*\.)+[a-z]+|\d{1,3}(?:\.\d{1,3}){3})\s*(?:,\s*(?:(?:\w+(?:-+\w+)*\.)+[a-z]+|\d{1,3}(\.\d{1,3}){3})\s*)*$ + type: text + value: 10.118.34.219 + weight: 10 + kernel_params: + kernel: + description: Default kernel parameters + label: Initial parameters + type: text + value: console=ttyS0,9600 console=tty0 net.ifnames=0 biosdevname=0 rootdelay=90 + nomodeset + weight: 45 + metadata: + label: Kernel parameters + weight: 40 + murano_settings: + metadata: + label: Murano Settings + restrictions: + - action: hide + condition: settings:additional_components.murano.value == false + weight: 20 + murano_repo_url: + description: '' + label: Murano Repository URL + type: text + value: http://storage.apps.openstack.org/ + weight: 10 + neutron_mellanox: + metadata: + enabled: true + label: Mellanox Neutron components + restrictions: + - action: hide + condition: not ('experimental' in version:feature_groups) + toggleable: false + weight: 50 + plugin: + label: Mellanox drivers and SR-IOV plugin + type: radio + value: disabled + values: + - data: disabled + description: If selected, Mellanox drivers, Neutron and Cinder plugin will + not be installed. + label: Mellanox drivers and plugins disabled + restrictions: + - settings:storage.iser.value == true + - data: drivers_only + description: If selected, Mellanox Ethernet drivers will be installed to support + networking over Mellanox NIC. Mellanox Neutron plugin will not be installed. + label: Install only Mellanox drivers + restrictions: + - settings:common.libvirt_type.value != 'kvm' + - data: ethernet + description: If selected, both Mellanox Ethernet drivers and Mellanox network + acceleration (Neutron) plugin will be installed. + label: Install Mellanox drivers and SR-IOV plugin + restrictions: + - settings:common.libvirt_type.value != 'kvm' or not (cluster:net_provider + == 'neutron' and networking_parameters:segmentation_type == 'vlan') + weight: 60 + vf_num: + description: Note that one virtual function will be reserved to the storage + network, in case of choosing iSER. + label: Number of virtual NICs + restrictions: + - settings:neutron_mellanox.plugin.value != 'ethernet' + type: text + value: '16' + weight: 70 + opendaylight: + metadata: + enabled: true + label: OpenDaylight plugin + plugin_id: 1 + restrictions: + - cluster:net_provider != 'neutron': Only neutron is supported by OpenDaylight + toggleable: true + weight: 70 + rest_api_port: + description: Port on which ODL REST API will be available. + label: Port number + regex: + error: Invalid port number + source: ^([1-9][0-9]{0,3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])$ + type: text + value: '8282' + weight: 40 + use_vxlan: + description: Configure neutron to use VXLAN tunneling + label: Use vxlan + restrictions: + - action: disable + condition: networking_parameters:segmentation_type == 'vlan' + message: Neutron with GRE segmentation required + type: checkbox + value: true + weight: 20 + vni_range_end: + description: VXLAN VNI IDs range end + label: VNI range end + regex: + error: Invalid ID number + source: ^\d+$ + restrictions: + - action: hide + condition: networking_parameters:segmentation_type == 'vlan' + type: text + value: '10000' + weight: 31 + vni_range_start: + description: VXLAN VNI IDs range start + label: VNI range start + regex: + error: Invalid ID number + source: ^\d+$ + restrictions: + - action: hide + condition: networking_parameters:segmentation_type == 'vlan' + type: text + value: '10' + weight: 30 + provision: + metadata: + label: Provision + weight: 80 + method: + description: Which provision method to use for this cluster. + label: Provision method + type: radio + value: image + values: + - data: image + description: Copying pre-built images on a disk. + label: Image + - data: cobbler + description: Install from scratch using anaconda or debian-installer. + label: (DEPRECATED) Classic (use anaconda or debian-installer) + public_network_assignment: + assign_to_all_nodes: + description: When disabled, public network will be assigned to controllers only + label: Assign public network to all nodes + type: checkbox + value: false + weight: 10 + metadata: + label: Public network assignment + restrictions: + - action: hide + condition: cluster:net_provider != 'neutron' + weight: 50 + repo_setup: + metadata: + always_editable: true + label: Repositories + weight: 50 + repos: + description: 'Please note: the first repository will be considered the operating + system mirror that will be used during node provisioning. + + To create a local repository mirror on the Fuel master node, please follow + the instructions provided by running "fuel-createmirror --help" on the Fuel + master node. + + Please make sure your Fuel master node has Internet access to the repository + before attempting to create a mirror. + + For more details, please refer to the documentation (https://docs.mirantis.com/openstack/fuel/fuel-6.1/operations.html#external-ubuntu-ops). + + ' + extra_priority: null + type: custom_repo_configuration + value: + - name: ubuntu + priority: null + section: main universe multiverse + suite: trusty + type: deb + uri: http://archive.ubuntu.com/ubuntu/ + - name: ubuntu-updates + priority: null + section: main universe multiverse + suite: trusty-updates + type: deb + uri: http://archive.ubuntu.com/ubuntu/ + - name: ubuntu-security + priority: null + section: main universe multiverse + suite: trusty-security + type: deb + uri: http://archive.ubuntu.com/ubuntu/ + - name: mos + priority: 1050 + section: main restricted + suite: mos6.1 + type: deb + uri: http://10.20.0.2:8080/2014.2.2-6.1/ubuntu/x86_64 + - name: mos-updates + priority: 1050 + section: main restricted + suite: mos6.1-updates + type: deb + uri: http://mirror.fuel-infra.org/mos/ubuntu/ + - name: mos-security + priority: 1050 + section: main restricted + suite: mos6.1-security + type: deb + uri: http://mirror.fuel-infra.org/mos/ubuntu/ + - name: mos-holdback + priority: 1100 + section: main restricted + suite: mos6.1-holdback + type: deb + uri: http://mirror.fuel-infra.org/mos/ubuntu/ + - name: Auxiliary + priority: 1150 + section: main restricted + suite: auxiliary + type: deb + uri: http://10.20.0.2:8080/2014.2.2-6.1/ubuntu/auxiliary + storage: + ephemeral_ceph: + description: Configures Nova to store ephemeral volumes in RBD. This works best + if Ceph is enabled for volumes and images, too. Enables live migration of + all types of Ceph backed VMs (without this option, live migration will only + work with VMs launched from Cinder volumes). + label: Ceph RBD for ephemeral volumes (Nova) + type: checkbox + value: true + weight: 75 + images_ceph: + description: Configures Glance to use the Ceph RBD backend to store images. + If enabled, this option will prevent Swift from installing. + label: Ceph RBD for images (Glance) + restrictions: + - settings:storage.images_vcenter.value == true: Only one Glance backend could + be selected. + type: checkbox + value: true + weight: 30 + images_vcenter: + description: Configures Glance to use the vCenter/ESXi backend to store images. + If enabled, this option will prevent Swift from installing. + label: VMWare vCenter/ESXi datastore for images (Glance) + restrictions: + - action: hide + condition: settings:common.use_vcenter.value != true + - condition: settings:storage.images_ceph.value == true + message: Only one Glance backend could be selected. + type: checkbox + value: false + weight: 35 + iser: + description: 'High performance block storage: Cinder volumes over iSER protocol + (iSCSI over RDMA). This feature requires SR-IOV capabilities in the NIC, and + will use a dedicated virtual function for the storage network.' + label: iSER protocol for volumes (Cinder) + restrictions: + - settings:storage.volumes_lvm.value != true or settings:common.libvirt_type.value + != 'kvm' + - action: hide + condition: not ('experimental' in version:feature_groups) + type: checkbox + value: false + weight: 11 + metadata: + label: Storage + weight: 60 + objects_ceph: + description: Configures RadosGW front end for Ceph RBD. This exposes S3 and + Swift API Interfaces. If enabled, this option will prevent Swift from installing. + label: Ceph RadosGW for objects (Swift API) + restrictions: + - settings:storage.images_ceph.value == false + type: checkbox + value: false + weight: 80 + osd_pool_size: + description: Configures the default number of object replicas in Ceph. This + number must be equal to or lower than the number of deployed 'Storage - Ceph + OSD' nodes. + label: Ceph object replication factor + regex: + error: Invalid number + source: ^[1-9]\d*$ + type: text + value: '2' + weight: 85 + volumes_ceph: + description: Configures Cinder to store volumes in Ceph RBD images. + label: Ceph RBD for volumes (Cinder) + restrictions: + - settings:storage.volumes_lvm.value == true + type: checkbox + value: true + weight: 20 + volumes_lvm: + description: It is recommended to have at least one Storage - Cinder LVM node. + label: Cinder LVM over iSCSI for volumes + restrictions: + - settings:storage.volumes_ceph.value == true + type: checkbox + value: false + weight: 10 + syslog: + metadata: + label: Syslog + weight: 50 + syslog_port: + description: Remote syslog port + label: Port + regex: + error: Invalid Syslog port + source: ^([1-9][0-9]{0,3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])$ + type: text + value: '514' + weight: 20 + syslog_server: + description: Remote syslog hostname + label: Hostname + type: text + value: '' + weight: 10 + syslog_transport: + label: Syslog transport protocol + type: radio + value: tcp + values: + - data: udp + description: '' + label: UDP + - data: tcp + description: '' + label: TCP + weight: 30 + workloads_collector: + enabled: + type: hidden + value: true + metadata: + label: Workloads Collector User + restrictions: + - action: hide + condition: 'true' + weight: 10 + password: + type: password + value: pBkLbu1k + tenant: + type: text + value: services + user: + type: text + value: fuel_stats_user diff --git a/fuel/deploy/libvirt/conf/multinode/dha.yaml b/fuel/deploy/templates/virtual_environment/conf/ha/dha.yaml similarity index 54% rename from fuel/deploy/libvirt/conf/multinode/dha.yaml rename to fuel/deploy/templates/virtual_environment/conf/ha/dha.yaml index d862f64..224e9bd 100644 --- a/fuel/deploy/libvirt/conf/multinode/dha.yaml +++ b/fuel/deploy/templates/virtual_environment/conf/ha/dha.yaml @@ -1,7 +1,7 @@ title: Deployment Hardware Adapter (DHA) # DHA API version supported -version: 1.1 -created: Sat Apr 25 16:26:22 UTC 2015 +version: +created: comment: Small libvirt setup # Adapter to use for this definition @@ -13,30 +13,26 @@ adapter: libvirt nodes: - id: 1 libvirtName: controller1 - libvirtTemplate: libvirt/vms/controller.xml + libvirtTemplate: templates/virtual_environment/vms/controller.xml - id: 2 libvirtName: compute1 - libvirtTemplate: libvirt/vms/compute.xml + libvirtTemplate: templates/virtual_environment/vms/compute.xml - id: 3 libvirtName: compute2 - libvirtTemplate: libvirt/vms/compute.xml + libvirtTemplate: templates/virtual_environment/vms/compute.xml - id: 4 libvirtName: compute3 - libvirtTemplate: libvirt/vms/compute.xml + libvirtTemplate: templates/virtual_environment/vms/compute.xml - id: 5 - libvirtName: compute4 - libvirtTemplate: libvirt/vms/compute.xml -- id: 6 - libvirtName: compute5 - libvirtTemplate: libvirt/vms/compute.xml -- id: 7 libvirtName: fuel-master - libvirtTemplate: libvirt/vms/fuel.xml + libvirtTemplate: templates/virtual_environment/vms/fuel.xml isFuel: yes username: root password: r00tme +virtNetConfDir: templates/virtual_environment/networks + disks: - fuel: 30G + fuel: 50G controller: 30G compute: 30G diff --git a/fuel/deploy/libvirt/networks/fuel1.xml b/fuel/deploy/templates/virtual_environment/networks/fuel1.xml similarity index 100% rename from fuel/deploy/libvirt/networks/fuel1.xml rename to fuel/deploy/templates/virtual_environment/networks/fuel1.xml diff --git a/fuel/deploy/libvirt/networks/fuel2.xml b/fuel/deploy/templates/virtual_environment/networks/fuel2.xml similarity index 100% rename from fuel/deploy/libvirt/networks/fuel2.xml rename to fuel/deploy/templates/virtual_environment/networks/fuel2.xml diff --git a/fuel/deploy/libvirt/networks/fuel3.xml b/fuel/deploy/templates/virtual_environment/networks/fuel3.xml similarity index 100% rename from fuel/deploy/libvirt/networks/fuel3.xml rename to fuel/deploy/templates/virtual_environment/networks/fuel3.xml diff --git a/fuel/deploy/libvirt/networks/fuel4.xml b/fuel/deploy/templates/virtual_environment/networks/fuel4.xml similarity index 100% rename from fuel/deploy/libvirt/networks/fuel4.xml rename to fuel/deploy/templates/virtual_environment/networks/fuel4.xml diff --git a/fuel/deploy/libvirt/conf/ha/dea.yaml b/fuel/deploy/templates/virtual_environment/old_conf/ha/dea.yaml similarity index 98% rename from fuel/deploy/libvirt/conf/ha/dea.yaml rename to fuel/deploy/templates/virtual_environment/old_conf/ha/dea.yaml index 1a4939a..36f91ab 100644 --- a/fuel/deploy/libvirt/conf/ha/dea.yaml +++ b/fuel/deploy/templates/virtual_environment/old_conf/ha/dea.yaml @@ -1,10 +1,12 @@ title: Deployment Environment Adapter (DEA) # DEA API version supported -version: 1.1 -created: Sat Apr 25 16:26:22 UTC 2015 +version: +created: comment: Small libvirt setup -environment_name: opnfv_virt -environment_mode: ha +environment: + name: opnfv_virt + mode: ha + net_segment_type: vlan wanted_release: Juno on Ubuntu 12.04.4 nodes: - id: 1 @@ -31,6 +33,11 @@ nodes: interfaces: interfaces_1 transformations: transformations_2 role: ceph-osd,compute +opnfv: + hosts: + - name: + address: + fqdn: fuel: ADMIN_NETWORK: ipaddress: 10.20.0.2 @@ -47,19 +54,18 @@ fuel: NTP1: 0.pool.ntp.org NTP2: 1.pool.ntp.org NTP3: 2.pool.ntp.org -interfaces: - interfaces_1: - eth0: - - fuelweb_admin - - management - eth1: - - storage - eth2: - - private - eth3: - - public -transformations: - transformations_1: +interfaces_1: + eth0: + - fuelweb_admin + - management + eth1: + - storage + eth2: + - private + eth3: + - public +transformations_1: + transformations: - action: add-br name: br-eth0 - action: add-port @@ -126,7 +132,8 @@ transformations: bridges: - br-eth2 - br-prv - transformations_2: +transformations_2: + transformations: - action: add-br name: br-eth0 - action: add-port @@ -185,9 +192,6 @@ transformations: bridges: - br-eth2 - br-prv -opnfv: - compute: {} - controller: {} network: networking_parameters: base_mac: fa:16:3e:00:00:00 diff --git a/fuel/deploy/libvirt/conf/ha/dha.yaml b/fuel/deploy/templates/virtual_environment/old_conf/ha/dha.yaml similarity index 52% rename from fuel/deploy/libvirt/conf/ha/dha.yaml rename to fuel/deploy/templates/virtual_environment/old_conf/ha/dha.yaml index 6b6efb0..9b5a774 100644 --- a/fuel/deploy/libvirt/conf/ha/dha.yaml +++ b/fuel/deploy/templates/virtual_environment/old_conf/ha/dha.yaml @@ -1,7 +1,7 @@ title: Deployment Hardware Adapter (DHA) # DHA API version supported -version: 1.1 -created: Sat Apr 25 16:26:22 UTC 2015 +version: +created: comment: Small libvirt setup # Adapter to use for this definition @@ -13,29 +13,31 @@ adapter: libvirt nodes: - id: 1 libvirtName: controller1 - libvirtTemplate: libvirt/vms/controller.xml + libvirtTemplate: templates/virtual_environment/vms/controller.xml - id: 2 libvirtName: controller2 - libvirtTemplate: libvirt/vms/controller.xml + libvirtTemplate: templates/virtual_environment/vms/controller.xml - id: 3 libvirtName: controller3 - libvirtTemplate: libvirt/vms/controller.xml + libvirtTemplate: templates/virtual_environment/vms/controller.xml - id: 4 libvirtName: compute1 - libvirtTemplate: libvirt/vms/compute.xml + libvirtTemplate: templates/virtual_environment/vms/compute.xml - id: 5 libvirtName: compute2 - libvirtTemplate: libvirt/vms/compute.xml + libvirtTemplate: templates/virtual_environment/vms/compute.xml - id: 6 libvirtName: compute3 - libvirtTemplate: libvirt/vms/compute.xml + libvirtTemplate: templates/virtual_environment/vms/compute.xml - id: 7 libvirtName: fuel-master - libvirtTemplate: libvirt/vms/fuel.xml + libvirtTemplate: templates/virtual_environment/vms/fuel.xml isFuel: yes username: root password: r00tme +virtNetConfDir: templates/virtual_environment/networks + disks: fuel: 30G controller: 30G diff --git a/fuel/deploy/libvirt/conf/multinode/dea.yaml b/fuel/deploy/templates/virtual_environment/old_conf/multinode/dea.yaml similarity index 98% rename from fuel/deploy/libvirt/conf/multinode/dea.yaml rename to fuel/deploy/templates/virtual_environment/old_conf/multinode/dea.yaml index fd4b64f..471e141 100644 --- a/fuel/deploy/libvirt/conf/multinode/dea.yaml +++ b/fuel/deploy/templates/virtual_environment/old_conf/multinode/dea.yaml @@ -1,10 +1,12 @@ title: Deployment Environment Adapter (DEA) # DEA API version supported -version: 1.1 -created: Sat Apr 25 16:26:22 UTC 2015 +version: +created: comment: Small libvirt setup -environment_name: opnfv_virt -environment_mode: multinode +environment: + name: opnfv_virt + mode: multinode + net_segment_type: vlan wanted_release: Juno on Ubuntu 12.04.4 nodes: - id: 1 @@ -31,6 +33,11 @@ nodes: interfaces: interfaces_1 transformations: transformations_2 role: ceph-osd,compute +opnfv: + hosts: + - name: + address: + fqdn: fuel: ADMIN_NETWORK: ipaddress: 10.20.0.2 @@ -47,19 +54,18 @@ fuel: NTP1: 0.pool.ntp.org NTP2: 1.pool.ntp.org NTP3: 2.pool.ntp.org -interfaces: - interfaces_1: - eth0: - - fuelweb_admin - - management - eth1: - - storage - eth2: - - private - eth3: - - public -transformations: - transformations_1: +interfaces_1: + eth0: + - fuelweb_admin + - management + eth1: + - storage + eth2: + - private + eth3: + - public +transformations_1: + transformations: - action: add-br name: br-eth0 - action: add-port @@ -126,7 +132,8 @@ transformations: bridges: - br-eth2 - br-prv - transformations_2: +transformations_2: + transformations: - action: add-br name: br-eth0 - action: add-port @@ -185,9 +192,6 @@ transformations: bridges: - br-eth2 - br-prv -opnfv: - compute: {} - controller: {} network: networking_parameters: base_mac: fa:16:3e:00:00:00 diff --git a/fuel/deploy/templates/virtual_environment/old_conf/multinode/dha.yaml b/fuel/deploy/templates/virtual_environment/old_conf/multinode/dha.yaml new file mode 100644 index 0000000..75cff2a --- /dev/null +++ b/fuel/deploy/templates/virtual_environment/old_conf/multinode/dha.yaml @@ -0,0 +1,44 @@ +title: Deployment Hardware Adapter (DHA) +# DHA API version supported +version: +created: +comment: Small libvirt setup + +# Adapter to use for this definition +adapter: libvirt + +# Node list. +# Mandatory property is id, all other properties are adapter specific. + +nodes: +- id: 1 + libvirtName: controller1 + libvirtTemplate: templates/virtual_environment/vms/controller.xml +- id: 2 + libvirtName: compute1 + libvirtTemplate: templates/virtual_environment/vms/compute.xml +- id: 3 + libvirtName: compute2 + libvirtTemplate: templates/virtual_environment/vms/compute.xml +- id: 4 + libvirtName: compute3 + libvirtTemplate: templates/virtual_environment/vms/compute.xml +- id: 5 + libvirtName: compute4 + libvirtTemplate: templates/virtual_environment/vms/compute.xml +- id: 6 + libvirtName: compute5 + libvirtTemplate: templates/virtual_environment/vms/compute.xml +- id: 7 + libvirtName: fuel-master + libvirtTemplate: templates/virtual_environment/vms/fuel.xml + isFuel: yes + username: root + password: r00tme + +virtNetConfDir: templates/virtual_environment/networks + +disks: + fuel: 30G + controller: 30G + compute: 30G diff --git a/fuel/deploy/libvirt/vms/compute.xml b/fuel/deploy/templates/virtual_environment/vms/compute.xml similarity index 98% rename from fuel/deploy/libvirt/vms/compute.xml rename to fuel/deploy/templates/virtual_environment/vms/compute.xml index 86a7613..fbef4bd 100644 --- a/fuel/deploy/libvirt/vms/compute.xml +++ b/fuel/deploy/templates/virtual_environment/vms/compute.xml @@ -7,7 +7,6 @@ hvm - diff --git a/fuel/deploy/libvirt/vms/controller.xml b/fuel/deploy/templates/virtual_environment/vms/controller.xml similarity index 96% rename from fuel/deploy/libvirt/vms/controller.xml rename to fuel/deploy/templates/virtual_environment/vms/controller.xml index 9e49b0f..3ff2821 100644 --- a/fuel/deploy/libvirt/vms/controller.xml +++ b/fuel/deploy/templates/virtual_environment/vms/controller.xml @@ -1,7 +1,7 @@ controller - 2097152 - 2097152 + 8388608 + 8388608 2 hvm diff --git a/fuel/deploy/libvirt/vms/fuel.xml b/fuel/deploy/templates/virtual_environment/vms/fuel.xml similarity index 100% rename from fuel/deploy/libvirt/vms/fuel.xml rename to fuel/deploy/templates/virtual_environment/vms/fuel.xml diff --git a/fuel/deploy/transplant_fuel_settings.py b/fuel/deploy/transplant_fuel_settings.py index bb4f9b6..d2aece8 100644 --- a/fuel/deploy/transplant_fuel_settings.py +++ b/fuel/deploy/transplant_fuel_settings.py @@ -1,3 +1,13 @@ +############################################################################### +# Copyright (c) 2015 Ericsson AB and others. +# szilard.cserey@ericsson.com +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################### + + import sys import common import io @@ -6,12 +16,16 @@ from dea import DeploymentEnvironmentAdapter check_file_exists = common.check_file_exists +ASTUTE_YAML = '/etc/fuel/astute.yaml' + + def usage(): print ''' Usage: python transplant_fuel_settings.py ''' + def parse_arguments(): if len(sys.argv) != 2: usage() @@ -20,6 +34,7 @@ def parse_arguments(): check_file_exists(dea_file) return dea_file + def transplant(dea, astute): fuel_conf = dea.get_fuel_config() for key in fuel_conf.iterkeys(): @@ -30,17 +45,17 @@ def transplant(dea, astute): astute[key] = fuel_conf[key] return astute + def main(): dea_file = parse_arguments() - astute_yaml = '/etc/fuel/astute.yaml' - check_file_exists(astute_yaml) + check_file_exists(ASTUTE_YAML) dea = DeploymentEnvironmentAdapter(dea_file) - with io.open(astute_yaml) as stream: + with io.open(ASTUTE_YAML) as stream: astute = yaml.load(stream) transplant(dea, astute) - with io.open(astute_yaml, 'w') as stream: + with io.open(ASTUTE_YAML, 'w') as stream: yaml.dump(astute, stream, default_flow_style=False) if __name__ == '__main__': - main() \ No newline at end of file + main()