Merge "Updating breaking config and code for basic setup"
Signed-off-by: Davlet Panech <davlet.panech@windriver.com> Change-Id: Iff1321901f108e8337b58161c6fb44c0fd21ba00
This commit is contained in:
commit
e24862d56f
@ -100,7 +100,7 @@ def handle_args():
|
|||||||
Directory with config files, scripts, images (i.e.
|
Directory with config files, scripts, images (i.e.
|
||||||
lab_setup.sh, lab_setup.conf, ...) that are needed
|
lab_setup.sh, lab_setup.conf, ...) that are needed
|
||||||
for the install. All files at this location are
|
for the install. All files at this location are
|
||||||
transfered to controller-0 in /home/wrsroot. You
|
transfered to controller-0 in /home/sysadmin. You
|
||||||
can add you own scripts that you need to be
|
can add you own scripts that you need to be
|
||||||
present on the controller. Caution: rsync will
|
present on the controller. Caution: rsync will
|
||||||
follow links and will fail if links are broken!
|
follow links and will fail if links are broken!
|
||||||
@ -117,13 +117,19 @@ def handle_args():
|
|||||||
parser.add_argument("--config-controller-ini", help=
|
parser.add_argument("--config-controller-ini", help=
|
||||||
"""
|
"""
|
||||||
Path to the local config_controller .ini. This
|
Path to the local config_controller .ini. This
|
||||||
file is transfered to the controller. NOTE: OAM
|
file is transferred to the controller. NOTE: OAM
|
||||||
configuration in this ini is updated dynamically
|
configuration in this ini is updated dynamically
|
||||||
based on networking related args.
|
based on networking related args.
|
||||||
(e.g. stx_config.ini_centos,
|
(e.g. stx_config.ini_centos,
|
||||||
~/stx_config.ini_centos, /home/myousaf ...).
|
~/stx_config.ini_centos, /home/myousaf ...).
|
||||||
""",
|
""",
|
||||||
type=str)
|
type=str)
|
||||||
|
parser.add_argument("--ansible-controller-config", help=
|
||||||
|
"""
|
||||||
|
Path to a local YAML file to be copied as localhost.yml
|
||||||
|
to the home directory of the controller-0.
|
||||||
|
""",
|
||||||
|
type=str)
|
||||||
parser.add_argument("--vbox-home-dir", help=
|
parser.add_argument("--vbox-home-dir", help=
|
||||||
"""
|
"""
|
||||||
This is the folder where vbox disks will be
|
This is the folder where vbox disks will be
|
||||||
@ -367,7 +373,7 @@ def handle_args():
|
|||||||
type=str, choices=['serial', 'graphical'], default='serial')
|
type=str, choices=['serial', 'graphical'], default='serial')
|
||||||
parser.add_argument("--username", help=
|
parser.add_argument("--username", help=
|
||||||
"""
|
"""
|
||||||
Username. default is 'wrsroot'
|
Username. default is 'sysadmin'
|
||||||
""",
|
""",
|
||||||
type=str)
|
type=str)
|
||||||
parser.add_argument("--password", help=
|
parser.add_argument("--password", help=
|
||||||
|
@ -1,11 +1,29 @@
|
|||||||
Pybox
|
# Pybox
|
||||||
=====
|
|
||||||
|
|
||||||
The automated installer provides you with an easy tool to install
|
This automated installer provides you with an easy way to install
|
||||||
StarlingX AIO-SX, AIO-DX, Standard, and Storage setups on Linux hosts on
|
StarlingX in many different configuration options. The following
|
||||||
Virtualbox 5.1.x.
|
acronyms are important to understand:
|
||||||
|
|
||||||
The main concepts of the autoinstaller is the stage and the chain. A stage
|
- `AIO` stands for All-In-One, and it means that a single host might
|
||||||
|
be responsible for more than one role.
|
||||||
|
- `SX` stands for Simplex, and it means there's only one controller node
|
||||||
|
that the whole installation depends on.
|
||||||
|
- `DX` stands for Duplex, and it means that 2 or more controllers will
|
||||||
|
be arranged in a high-availability setup.
|
||||||
|
|
||||||
|
The configurations available from this script, via the `--setup-type`
|
||||||
|
parameter, are:
|
||||||
|
|
||||||
|
- `AIO-SX` or "All-In-One Simplex" will set up one single VM that will be both
|
||||||
|
a controller and a worker nodes.
|
||||||
|
- `AIO-DX` or "All-In-One Duplex" will set up two controller VMs with one of
|
||||||
|
them also being a worker.
|
||||||
|
- `Standard` and `Storage` setups are currently under review.
|
||||||
|
|
||||||
|
Overall Design of the Code
|
||||||
|
--------------------------
|
||||||
|
|
||||||
|
The main concepts of the autoinstaller are stages and chains. A stage
|
||||||
is an atomic set of actions taken by the autoinstaller. A chain is a set
|
is an atomic set of actions taken by the autoinstaller. A chain is a set
|
||||||
of stages executed in a specific order. Stages can be executed
|
of stages executed in a specific order. Stages can be executed
|
||||||
independently and repeated as many times the user needs. Chains can be
|
independently and repeated as many times the user needs. Chains can be
|
||||||
@ -19,7 +37,7 @@ Example stages:
|
|||||||
- config-controller # Run config controller using the
|
- config-controller # Run config controller using the
|
||||||
- config-controller-ini updated based on --ini-* options.
|
- config-controller-ini updated based on --ini-* options.
|
||||||
- rsync-config # Rsync all files from --config-files-dir and
|
- rsync-config # Rsync all files from --config-files-dir and
|
||||||
--config-files-dir* to /home/wrsroot.
|
--config-files-dir* to /home/sysadmin.
|
||||||
- lab-setup1 # Run lab_setup with one or more --lab-setup-conf
|
- lab-setup1 # Run lab_setup with one or more --lab-setup-conf
|
||||||
files from controller-0.
|
files from controller-0.
|
||||||
- unlock-controller-0 # Unlock controller-0 and wait for it to reboot.
|
- unlock-controller-0 # Unlock controller-0 and wait for it to reboot.
|
||||||
@ -47,8 +65,7 @@ the user does not need to reinstall from scratch. The user can restore the
|
|||||||
snapshot of the previous stage, whether to retry or fix the issue
|
snapshot of the previous stage, whether to retry or fix the issue
|
||||||
manually, then continue the process.
|
manually, then continue the process.
|
||||||
|
|
||||||
List of Features
|
## List of Features
|
||||||
----------------
|
|
||||||
|
|
||||||
Basic:
|
Basic:
|
||||||
- Multi-user, and multiple lab installs can run at the same time.
|
- Multi-user, and multiple lab installs can run at the same time.
|
||||||
@ -93,23 +110,66 @@ Other features
|
|||||||
chain)
|
chain)
|
||||||
- Support to install lowlatency and securityprofile
|
- Support to install lowlatency and securityprofile
|
||||||
|
|
||||||
Installation
|
## Installation and Usage
|
||||||
------------
|
|
||||||
|
|
||||||
Prerequisites:
|
This section covers a basic functioning example of the **All-In-One Simplex
|
||||||
|
(AIO-SX) installation**, which creates one VM that will work as both a
|
||||||
|
Controller and a Worker. A NAT Network between the host and the Virtual Machine
|
||||||
|
will be configured and used.
|
||||||
|
|
||||||
- Install Virtualbox. It is recommend v5.1.x. Use v5.2 at your own risk
|
>_NOTE_: the following steps assume you're on a Debian-based Linux box.
|
||||||
- Configure at least a vbox hostonly adapter network. If you want to
|
|
||||||
use NAT, you must also configue a NAT Network.
|
|
||||||
- Make sure you have rsync, ssh-keygen, and sshpass commands installed.
|
|
||||||
- Install python3 and pip3 if not already done.
|
|
||||||
|
|
||||||
Sample Usage
|
1. Install dependencies:
|
||||||
------------
|
|
||||||
|
|
||||||
./install_vbox.py --setup-type AIO-SX --iso-location
|
```shell
|
||||||
"/home/myousaf/bootimage.iso" --labname test --install-mode serial
|
sudo apt install virtualbox socat git rsync sshpass openssh-client python3-pip python3-venv
|
||||||
--config-files-dir /home/myousaf/pybox/configs/aio-sx/
|
```
|
||||||
--config-controller-ini
|
|
||||||
/home/myousaf/pybox/configs/aio-sx/stx_config.ini_centos --vboxnet-name
|
2. Create a NAT Network with the `VBoxManage` CLI that is installed with VirtualBox:
|
||||||
vboxnet0 --controller0-ip 10.10.10.8 --ini-oam-cidr '10.10.10.0/24'
|
|
||||||
|
```shell
|
||||||
|
VBoxManage natnetwork add --netname NatNetwork --network 10.10.10.0/24 --dhcp off --ipv6 on
|
||||||
|
VBoxManage natnetwork modify --netname NatNetwork --port-forward-4 http-8080:tcp:[]:8080:[10.10.10.3]:8080
|
||||||
|
```
|
||||||
|
|
||||||
|
3. Checkout the repository, and set up Python's Virtual Environment with:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
git clone https://opendev.org/starlingx/tools.git
|
||||||
|
cd tools/deployment/virtualbox/pybox
|
||||||
|
python3 -m venv venv
|
||||||
|
source ./venv/bin/activate
|
||||||
|
pip install --upgrade pip
|
||||||
|
pip install -r requirements.txt
|
||||||
|
```
|
||||||
|
|
||||||
|
4. Grab the latest ISO (this script was last tested with version 8.0.0):
|
||||||
|
|
||||||
|
```shell
|
||||||
|
wget https://mirror.starlingx.cengn.ca/mirror/starlingx/release/latest_release/debian/monolithic/outputs/iso/starlingx-intel-x86-64-cd.iso \
|
||||||
|
-O $HOME/Downloads/stx-8.iso
|
||||||
|
```
|
||||||
|
|
||||||
|
5. Now you're ready to run the script. From the `/deployment/virtualbox/pybox`
|
||||||
|
folder, do:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
python3 ./install_vbox.py --setup-type AIO-SX \
|
||||||
|
--iso-location "$HOME/Downloads/stx-8.iso" \
|
||||||
|
--labname StarlingX --install-mode serial \
|
||||||
|
--config-files-dir ./configs/aio-sx/ \
|
||||||
|
--config-controller-ini ./configs/aio-sx/stx_config.ini_centos \
|
||||||
|
--ansible-controller-config ./configs/aio-sx/localhost.yml \
|
||||||
|
--vboxnet-type nat \
|
||||||
|
--vboxnet-name NatNetwork \
|
||||||
|
--nat-controller0-local-ssh-port 3122 \
|
||||||
|
--controller0-ip 10.10.10.3 \
|
||||||
|
--ini-oam-cidr '10.10.10.0/24' \
|
||||||
|
--snapshot
|
||||||
|
```
|
||||||
|
|
||||||
|
The script takes a while to do all the things (from creating a VM and
|
||||||
|
installing an OS in it to configuring StarlingX). Several restarts might
|
||||||
|
occur, and you might see a VirtualBox with a prompt. You don't need to type
|
||||||
|
anything. While the installation script is running it will take care of
|
||||||
|
everything for you.
|
@ -628,19 +628,19 @@ MGMTQOSWEIGHT=8
|
|||||||
##
|
##
|
||||||
## local_lvm - nova-local volume group is created and physical volumes are
|
## local_lvm - nova-local volume group is created and physical volumes are
|
||||||
## added. The instances logical volume is created and
|
## added. The instances logical volume is created and
|
||||||
## mounted at /etc/nova/instances. The instances logical
|
## mounted at /etc/platform/instances. The instances logical
|
||||||
## volume uses a subset of the available space within the
|
## volume uses a subset of the available space within the
|
||||||
## volume group. Instance disks are logical volumes created
|
## volume group. Instance disks are logical volumes created
|
||||||
## out of the available space in the nova-local volume group
|
## out of the available space in the nova-local volume group
|
||||||
## local_image - nova-local volume group is created and physical volumes
|
## local_image - nova-local volume group is created and physical volumes
|
||||||
## are added. The instances logical volume is created and
|
## are added. The instances logical volume is created and
|
||||||
## mounted at /etc/nova/instances. The instances logical is
|
## mounted at /etc/platform/instances. The instances logical is
|
||||||
## sized to use 100% of the volume group. Instance disks are
|
## sized to use 100% of the volume group. Instance disks are
|
||||||
## file based CoW images contained within
|
## file based CoW images contained within
|
||||||
## /etc/nova/instances.
|
## /etc/platform/instances.
|
||||||
## remote - nova-local volume group is created and physical volumes are
|
## remote - nova-local volume group is created and physical volumes are
|
||||||
## added. The instances logical volume is created and
|
## added. The instances logical volume is created and
|
||||||
## mounted at /etc/nova/instances. The instances logical is
|
## mounted at /etc/platform/instances. The instances logical is
|
||||||
## sized to use 100% of the volume group. Instance disks are
|
## sized to use 100% of the volume group. Instance disks are
|
||||||
## RBD based from the ceph ephemeral pool.
|
## RBD based from the ceph ephemeral pool.
|
||||||
##
|
##
|
||||||
|
65
virtualbox/pybox/configs/aio-sx/lab_setup1.sh
Normal file
65
virtualbox/pybox/configs/aio-sx/lab_setup1.sh
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
## This file makes the necessary configuration for the unlock of the Controller-0
|
||||||
|
|
||||||
|
GROUPNO=0
|
||||||
|
DATE_FORMAT="%Y-%m-%d %T"
|
||||||
|
LOG_FILE=${LOG_FILE:-"${HOME}/lab_setup_1.group${GROUPNO}.log"}
|
||||||
|
VERBOSE_LEVEL=0
|
||||||
|
|
||||||
|
OPENRC=/etc/platform/openrc
|
||||||
|
source ${OPENRC}
|
||||||
|
|
||||||
|
|
||||||
|
function info {
|
||||||
|
local MSG="$1"
|
||||||
|
|
||||||
|
echo ${MSG}
|
||||||
|
echo $(date +"${DATE_FORMAT}") ${MSG} >> ${LOG_FILE}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function log_command {
|
||||||
|
local CMD=$1
|
||||||
|
local MSG="[${OS_USERNAME}@${OS_PROJECT_NAME}]> RUNNING: ${CMD}"
|
||||||
|
|
||||||
|
set +e
|
||||||
|
if [ ${VERBOSE_LEVEL} -gt 0 ]; then
|
||||||
|
echo ${MSG}
|
||||||
|
fi
|
||||||
|
echo $(date +"${DATE_FORMAT}") ${MSG} >> ${LOG_FILE}
|
||||||
|
|
||||||
|
if [ ${VERBOSE_LEVEL} -gt 1 ]; then
|
||||||
|
eval ${CMD} 2>&1 | tee -a ${LOG_FILE}
|
||||||
|
RET=${PIPESTATUS[0]}
|
||||||
|
else
|
||||||
|
eval ${CMD} &>> ${LOG_FILE}
|
||||||
|
RET=$?
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ${RET} -ne 0 ]; then
|
||||||
|
info "COMMAND FAILED (rc=${RET}): ${CMD}"
|
||||||
|
info "==========================="
|
||||||
|
info "Check \"${LOG_FILE}\" for more details, fix the issues and"
|
||||||
|
info "re-run the failed command manually."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
set -e
|
||||||
|
|
||||||
|
return ${RET}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
## Set OAM interface
|
||||||
|
function configure_OAM_interface {
|
||||||
|
#Set OAM_IF variable
|
||||||
|
log_command "OAM_IF=enp0s3"
|
||||||
|
#Associate OAM_IF with Controller-0
|
||||||
|
log_command "system host-if-modify controller-0 $OAM_IF -c platform"
|
||||||
|
log_command "system interface-network-assign controller-0 $OAM_IF oam"
|
||||||
|
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
configure_OAM_interface
|
13
virtualbox/pybox/configs/aio-sx/localhost.yml
Normal file
13
virtualbox/pybox/configs/aio-sx/localhost.yml
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
system_mode: simplex
|
||||||
|
|
||||||
|
dns_servers:
|
||||||
|
- 1.1.1.1
|
||||||
|
- 8.8.8.8
|
||||||
|
|
||||||
|
external_oam_subnet: 10.10.10.0/24
|
||||||
|
external_oam_gateway_address: 10.10.10.1
|
||||||
|
external_oam_floating_address: 10.10.10.3
|
||||||
|
|
||||||
|
admin_username: admin
|
||||||
|
admin_password: Li69nux*
|
||||||
|
ansible_become_pass: Li69nux*
|
@ -61,7 +61,7 @@ name=vbox
|
|||||||
floating_ip=10.10.10.7
|
floating_ip=10.10.10.7
|
||||||
controller-0_ip=10.10.10.8
|
controller-0_ip=10.10.10.8
|
||||||
controller-1_ip=10.10.10.9
|
controller-1_ip=10.10.10.9
|
||||||
username=wrsroot
|
username=sysadmin
|
||||||
password=Li69nux*
|
password=Li69nux*
|
||||||
|
|
||||||
[Serial]
|
[Serial]
|
||||||
|
@ -22,6 +22,6 @@ class Lab:
|
|||||||
'floating_ip': '10.10.10.7',
|
'floating_ip': '10.10.10.7',
|
||||||
'controller-0_ip': '10.10.10.8',
|
'controller-0_ip': '10.10.10.8',
|
||||||
'controller-1_ip': '10.10.10.9',
|
'controller-1_ip': '10.10.10.9',
|
||||||
'username': 'wrsroot',
|
'username': 'sysadmin',
|
||||||
'password': 'Li69nux*',
|
'password': 'Li69nux*',
|
||||||
}
|
}
|
||||||
|
@ -103,7 +103,7 @@ def disable_logout(stream):
|
|||||||
serial.send_bytes(stream, "export TMOUT=0")
|
serial.send_bytes(stream, "export TMOUT=0")
|
||||||
|
|
||||||
|
|
||||||
def change_password(stream, username="wrsroot", password="Li69nux*"):
|
def change_password(stream, username="sysadmin", password="Li69nux*"):
|
||||||
"""
|
"""
|
||||||
changes the default password on initial login.
|
changes the default password on initial login.
|
||||||
Args:
|
Args:
|
||||||
@ -114,15 +114,15 @@ def change_password(stream, username="wrsroot", password="Li69nux*"):
|
|||||||
serial.send_bytes(stream, username, expect_prompt=False)
|
serial.send_bytes(stream, username, expect_prompt=False)
|
||||||
serial.expect_bytes(stream, "Password:")
|
serial.expect_bytes(stream, "Password:")
|
||||||
serial.send_bytes(stream, username, expect_prompt=False)
|
serial.send_bytes(stream, username, expect_prompt=False)
|
||||||
serial.expect_bytes(stream, "UNIX password:")
|
serial.expect_bytes(stream, "Current password:")
|
||||||
serial.send_bytes(stream, username, expect_prompt=False)
|
serial.send_bytes(stream, username, expect_prompt=False)
|
||||||
serial.expect_bytes(stream, "New password:")
|
serial.expect_bytes(stream, "New password:")
|
||||||
serial.send_bytes(stream, password, expect_prompt=False)
|
serial.send_bytes(stream, password, expect_prompt=False)
|
||||||
serial.expect_bytes(stream, "Retype new")
|
serial.expect_bytes(stream, "Retype new password")
|
||||||
serial.send_bytes(stream, password)
|
serial.send_bytes(stream, password)
|
||||||
|
|
||||||
|
|
||||||
def login(stream, timeout=600, username="wrsroot", password="Li69nux*"):
|
def login(stream, timeout=600, username="sysadmin", password="Li69nux*"):
|
||||||
"""
|
"""
|
||||||
Logs into controller-0.
|
Logs into controller-0.
|
||||||
Args:
|
Args:
|
||||||
|
@ -30,7 +30,7 @@ def set_dns(stream, dns_ip):
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
LOG.info("Configuring DNS to %s.", dns_ip)
|
LOG.info("Configuring DNS to %s.", dns_ip)
|
||||||
serial.send_bytes(stream, "source /etc/nova/openrc; system dns-modify "
|
serial.send_bytes(stream, "source /etc/platform/openrc; system dns-modify "
|
||||||
"nameservers={}".format(dns_ip), prompt='keystone')
|
"nameservers={}".format(dns_ip), prompt='keystone')
|
||||||
|
|
||||||
|
|
||||||
@ -43,9 +43,10 @@ def config_controller(stream, config_file=None, password='Li69nux*'):
|
|||||||
if config_file:
|
if config_file:
|
||||||
args += '--config-file ' + config_file + ' '
|
args += '--config-file ' + config_file + ' '
|
||||||
|
|
||||||
serial.send_bytes(stream, "sudo config_controller {}".format(args), expect_prompt=False)
|
# serial.send_bytes(stream, f'sudo config_controller {args}', expect_prompt=False)
|
||||||
|
serial.send_bytes(stream, 'ansible-playbook /usr/share/ansible/stx-ansible/playbooks/bootstrap.yml', expect_prompt=False)
|
||||||
host_helper.check_password(stream, password=password)
|
host_helper.check_password(stream, password=password)
|
||||||
ret = serial.expect_bytes(stream, "unlock controller to proceed.",
|
ret = serial.expect_bytes(stream, "~$",
|
||||||
timeout=HostTimeout.LAB_CONFIG)
|
timeout=HostTimeout.LAB_CONFIG)
|
||||||
if ret != 0:
|
if ret != 0:
|
||||||
LOG.info("Configuration failed. Exiting installer.")
|
LOG.info("Configuration failed. Exiting installer.")
|
||||||
|
@ -48,15 +48,19 @@ def menu_selector(stream, setup_type,
|
|||||||
|
|
||||||
# Wait for menu to load (add sleep so we can see what is picked)
|
# Wait for menu to load (add sleep so we can see what is picked)
|
||||||
serial.expect_bytes(stream, "Press")
|
serial.expect_bytes(stream, "Press")
|
||||||
|
|
||||||
# Pick install type
|
# Pick install type
|
||||||
if setup_type in [AIO_SX, AIO_DX]:
|
if setup_type in [AIO_SX, AIO_DX]:
|
||||||
LOG.info("Selecting AIO controller")
|
LOG.info("Selecting All-in-one Install")
|
||||||
serial.send_bytes(stream, "\033[B", expect_prompt=False, send=False)
|
serial.send_bytes(stream, "\033[B", expect_prompt=False, send=False)
|
||||||
if lowlatency is True:
|
if lowlatency is True:
|
||||||
LOG.info("Selecting low latency controller")
|
LOG.info("Selecting All-in-one (lowlatency) Install")
|
||||||
serial.send_bytes(stream, "\033[B", expect_prompt=False, send=False)
|
serial.send_bytes(stream, "\033[B", expect_prompt=False, send=False)
|
||||||
|
else:
|
||||||
|
LOG.info("Selecting Controller Install")
|
||||||
serial.send_bytes(stream, "\n", expect_prompt=False, send=False)
|
serial.send_bytes(stream, "\n", expect_prompt=False, send=False)
|
||||||
time.sleep(4)
|
time.sleep(4)
|
||||||
|
|
||||||
# Serial or Graphical menu (picking Serial by default)
|
# Serial or Graphical menu (picking Serial by default)
|
||||||
if install_mode == "graphical":
|
if install_mode == "graphical":
|
||||||
LOG.info("Selecting Graphical menu")
|
LOG.info("Selecting Graphical menu")
|
||||||
@ -65,6 +69,7 @@ def menu_selector(stream, setup_type,
|
|||||||
LOG.info("Selecting Serial menu")
|
LOG.info("Selecting Serial menu")
|
||||||
serial.send_bytes(stream, "\n", expect_prompt=False, send=False)
|
serial.send_bytes(stream, "\n", expect_prompt=False, send=False)
|
||||||
time.sleep(6)
|
time.sleep(6)
|
||||||
|
|
||||||
# Security profile menu
|
# Security profile menu
|
||||||
if securityprofile == "extended":
|
if securityprofile == "extended":
|
||||||
LOG.info("Selecting extended security profile")
|
LOG.info("Selecting extended security profile")
|
||||||
@ -531,7 +536,7 @@ def wait_for_hosts(ssh_client, hostnames, status,
|
|||||||
raise Exception("VMs failed to go %s!", status)
|
raise Exception("VMs failed to go %s!", status)
|
||||||
# Get host list
|
# Get host list
|
||||||
host_statuses, _, _ = run_ssh_cmd(
|
host_statuses, _, _ = run_ssh_cmd(
|
||||||
ssh_client, 'source /etc/nova/openrc; system host-list', timeout=30)
|
ssh_client, 'source /etc/platform/openrc; system host-list', timeout=30)
|
||||||
host_statuses = host_statuses[1:-1]
|
host_statuses = host_statuses[1:-1]
|
||||||
for host_status in host_statuses:
|
for host_status in host_statuses:
|
||||||
for host in hostnames:
|
for host in hostnames:
|
||||||
@ -610,7 +615,7 @@ def set_serial_prompt_mode(stream, mode):
|
|||||||
if serial.send_bytes(stream, vboxoptions.password, prompt="~$", fail_ok=True, timeout=30):
|
if serial.send_bytes(stream, vboxoptions.password, prompt="~$", fail_ok=True, timeout=30):
|
||||||
raise Exception("Login failure, invalid password?")
|
raise Exception("Login failure, invalid password?")
|
||||||
if mode == CONSOLE_USER_MODE:
|
if mode == CONSOLE_USER_MODE:
|
||||||
serial.send_bytes(stream, "source /etc/nova/openrc\n",
|
serial.send_bytes(stream, "source /etc/platform/openrc\n",
|
||||||
timeout=30, prompt='keystone')
|
timeout=30, prompt='keystone')
|
||||||
serial_console_mode = CONSOLE_USER_MODE
|
serial_console_mode = CONSOLE_USER_MODE
|
||||||
if mode == 'root' and serial_console_mode != 'root':
|
if mode == 'root' and serial_console_mode != 'root':
|
||||||
@ -621,7 +626,7 @@ def set_serial_prompt_mode(stream, mode):
|
|||||||
"cd /home/wrsroot",
|
"cd /home/wrsroot",
|
||||||
prompt="/home/wrsroot# ",
|
prompt="/home/wrsroot# ",
|
||||||
timeout=30)
|
timeout=30)
|
||||||
serial.send_bytes(stream, "source /etc/nova/openrc\n",
|
serial.send_bytes(stream, "source /etc/platform/openrc\n",
|
||||||
timeout=30, prompt='keystone')
|
timeout=30, prompt='keystone')
|
||||||
serial_console_mode = CONSOLE_ROOT_MODE
|
serial_console_mode = CONSOLE_ROOT_MODE
|
||||||
serial.send_bytes(stream, "export TMOUT=0", timeout=10, prompt='keystone')
|
serial.send_bytes(stream, "export TMOUT=0", timeout=10, prompt='keystone')
|
||||||
@ -742,7 +747,7 @@ def stage_install_controller0():
|
|||||||
def stage_config_controller(stream):
|
def stage_config_controller(stream):
|
||||||
ip, port = get_ssh_ip_and_port(
|
ip, port = get_ssh_ip_and_port(
|
||||||
'controller-0') # Floating ip is not yet configured
|
'controller-0') # Floating ip is not yet configured
|
||||||
if True:
|
|
||||||
# Updated config file
|
# Updated config file
|
||||||
LOG.info("#### Updating config_controller ini file networking" \
|
LOG.info("#### Updating config_controller ini file networking" \
|
||||||
"settings and uploading it to controller.")
|
"settings and uploading it to controller.")
|
||||||
@ -785,12 +790,11 @@ def stage_config_controller(stream):
|
|||||||
sftp_send(
|
sftp_send(
|
||||||
fp.name, remote_host=ip, remote_port=port, destination=destination,
|
fp.name, remote_host=ip, remote_port=port, destination=destination,
|
||||||
username=vboxoptions.username, password=vboxoptions.password)
|
username=vboxoptions.username, password=vboxoptions.password)
|
||||||
else:
|
|
||||||
destination = "/home/" + \
|
LOG.info("Copying Ansible configuration file")
|
||||||
vboxoptions.username + "/stx_config.ini_centos"
|
destination_ansible = f'/home/{vboxoptions.username}/localhost.yml'
|
||||||
sftp_send(
|
sftp_send(
|
||||||
vboxoptions.config_controller_ini, remote_host=ip, remote_port=port,
|
vboxoptions.ansible_controller_config, remote_host=ip, remote_port=port, destination=destination_ansible,
|
||||||
destination=destination,
|
|
||||||
username=vboxoptions.username, password=vboxoptions.password)
|
username=vboxoptions.username, password=vboxoptions.password)
|
||||||
|
|
||||||
# Run config_controller
|
# Run config_controller
|
||||||
@ -840,22 +844,30 @@ def get_ssh_ip_and_port(node='floating'):
|
|||||||
|
|
||||||
|
|
||||||
def stage_rsync_config():
|
def stage_rsync_config():
|
||||||
|
if not vboxoptions.config_files_dir and not vboxoptions.config_files_dir_dont_follow_links:
|
||||||
|
LOG.info("No rsync done! Please set config-files-dir "
|
||||||
|
"and/or config-files-dir-dont-follow-links")
|
||||||
|
return
|
||||||
|
|
||||||
# Get ip and port for ssh on floating ip
|
# Get ip and port for ssh on floating ip
|
||||||
ip, port = get_ssh_ip_and_port()
|
ip, port = get_ssh_ip_and_port()
|
||||||
|
|
||||||
# Copy config files to controller
|
# Copy config files to controller
|
||||||
if vboxoptions.config_files_dir:
|
if vboxoptions.config_files_dir:
|
||||||
local_path = vboxoptions.config_files_dir
|
local_path = vboxoptions.config_files_dir
|
||||||
|
follow_links = True
|
||||||
send_dir(source=local_path, remote_host=ip, remote_port=port,
|
send_dir(source=local_path, remote_host=ip, remote_port=port,
|
||||||
destination='/home/' + vboxoptions.username + '/',
|
destination='/home/' + vboxoptions.username + '/',
|
||||||
username=vboxoptions.username, password=vboxoptions.password)
|
username=vboxoptions.username, password=vboxoptions.password,
|
||||||
|
follow_links=follow_links)
|
||||||
|
|
||||||
if vboxoptions.config_files_dir_dont_follow_links:
|
if vboxoptions.config_files_dir_dont_follow_links:
|
||||||
local_path = vboxoptions.config_files_dir_dont_follow_links
|
local_path = vboxoptions.config_files_dir_dont_follow_links
|
||||||
|
follow_links = False
|
||||||
send_dir(source=local_path, remote_host=ip, remote_port=port,
|
send_dir(source=local_path, remote_host=ip, remote_port=port,
|
||||||
destination='/home/' + vboxoptions.username + '/',
|
destination='/home/' + vboxoptions.username + '/',
|
||||||
username=vboxoptions.username, password=vboxoptions.password)
|
username=vboxoptions.username, password=vboxoptions.password,
|
||||||
if not vboxoptions.config_files_dir and not vboxoptions.config_files_dir_dont_follow_links:
|
follow_links=follow_links)
|
||||||
LOG.info("No rsync done! Please set config-files-dir" \
|
|
||||||
"and/or config-files-dir-dont-follow-links")
|
|
||||||
|
|
||||||
|
|
||||||
@connect_to_serial
|
@connect_to_serial
|
||||||
@ -873,19 +885,18 @@ def _run_lab_setup_serial(stream):
|
|||||||
|
|
||||||
|
|
||||||
@connect_to_ssh
|
@connect_to_ssh
|
||||||
def _run_lab_setup(ssh_client):
|
def _run_lab_setup(stage, ssh_client):
|
||||||
conf_str = ""
|
conf_str = ""
|
||||||
for cfg_file in vboxoptions.lab_setup_conf:
|
for cfg_file in vboxoptions.lab_setup_conf:
|
||||||
conf_str = conf_str + " -f {}".format(cfg_file)
|
conf_str = conf_str + " -f {}".format(cfg_file)
|
||||||
|
|
||||||
_, _, exitcode = run_ssh_cmd(ssh_client,
|
command = f'source /etc/platform/openrc; export ' \
|
||||||
'source /etc/platform/openrc; '
|
f'PATH="$PATH:/usr/local/bin"; export PATH="$PATH:/usr/bin"; ' \
|
||||||
'export PATH="$PATH:/usr/local/bin; '
|
f'export PATH="$PATH:/usr/local/sbin"; export ' \
|
||||||
'export PATH="$PATH:/usr/bin; '
|
f'PATH="$PATH:/usr/sbin"; sh lab_setup{stage}.sh'
|
||||||
'export PATH="$PATH:/usr/local/sbin; '
|
|
||||||
'export PATH="$PATH:/usr/sbin"; '
|
_, _, exitcode = run_ssh_cmd(ssh_client, command, timeout=HostTimeout.LAB_INSTALL)
|
||||||
'sh lab_setup.sh {}'.format(conf_str),
|
|
||||||
timeout=HostTimeout.LAB_INSTALL)
|
|
||||||
if exitcode != 0:
|
if exitcode != 0:
|
||||||
msg = "Lab setup failed, expecting exit code of 0 but got {}.".format(
|
msg = "Lab setup failed, expecting exit code of 0 but got {}.".format(
|
||||||
exitcode)
|
exitcode)
|
||||||
@ -894,23 +905,23 @@ def _run_lab_setup(ssh_client):
|
|||||||
|
|
||||||
|
|
||||||
def stage_lab_setup1():
|
def stage_lab_setup1():
|
||||||
_run_lab_setup()
|
_run_lab_setup(1)
|
||||||
|
|
||||||
|
|
||||||
def stage_lab_setup2():
|
def stage_lab_setup2():
|
||||||
_run_lab_setup()
|
_run_lab_setup(2)
|
||||||
|
|
||||||
|
|
||||||
def stage_lab_setup3():
|
def stage_lab_setup3():
|
||||||
_run_lab_setup()
|
_run_lab_setup(3)
|
||||||
|
|
||||||
|
|
||||||
def stage_lab_setup4():
|
def stage_lab_setup4():
|
||||||
_run_lab_setup()
|
_run_lab_setup(4)
|
||||||
|
|
||||||
|
|
||||||
def stage_lab_setup5():
|
def stage_lab_setup5():
|
||||||
_run_lab_setup()
|
_run_lab_setup(5)
|
||||||
|
|
||||||
|
|
||||||
@connect_to_ssh
|
@connect_to_ssh
|
||||||
@ -918,7 +929,7 @@ def stage_lab_setup5():
|
|||||||
def stage_unlock_controller0(stream, ssh_client):
|
def stage_unlock_controller0(stream, ssh_client):
|
||||||
LOG.info("#### Unlocking controller-0")
|
LOG.info("#### Unlocking controller-0")
|
||||||
_, _, _ = run_ssh_cmd(ssh_client,
|
_, _, _ = run_ssh_cmd(ssh_client,
|
||||||
'source /etc/nova/openrc; system host-unlock controller-0',
|
'source /etc/platform/openrc; system host-unlock controller-0',
|
||||||
timeout=HostTimeout.CONTROLLER_UNLOCK)
|
timeout=HostTimeout.CONTROLLER_UNLOCK)
|
||||||
|
|
||||||
LOG.info("#### Waiting for controller-0 to reboot")
|
LOG.info("#### Waiting for controller-0 to reboot")
|
||||||
@ -978,7 +989,7 @@ def stage_install_nodes(ssh_client):
|
|||||||
username=vboxoptions.username, password=vboxoptions.password)
|
username=vboxoptions.username, password=vboxoptions.password)
|
||||||
# Apply host-bulk-add
|
# Apply host-bulk-add
|
||||||
_, _, exitcode = run_ssh_cmd(ssh_client,
|
_, _, exitcode = run_ssh_cmd(ssh_client,
|
||||||
'source /etc/nova/openrc; ',
|
'source /etc/platform/openrc; ',
|
||||||
'system host-bulk-add {}'.format(destination),
|
'system host-bulk-add {}'.format(destination),
|
||||||
timeout=60)
|
timeout=60)
|
||||||
if exitcode != 0:
|
if exitcode != 0:
|
||||||
@ -1015,7 +1026,7 @@ def stage_unlock_controller1(ssh_client):
|
|||||||
|
|
||||||
LOG.info("#### Unlocking controller-1")
|
LOG.info("#### Unlocking controller-1")
|
||||||
run_ssh_cmd(ssh_client,
|
run_ssh_cmd(ssh_client,
|
||||||
'source /etc/nova/openrc; system host-unlock controller-1',
|
'source /etc/platform/openrc; system host-unlock controller-1',
|
||||||
timeout=60)
|
timeout=60)
|
||||||
|
|
||||||
LOG.info("#### waiting for controller-1 to be available.")
|
LOG.info("#### waiting for controller-1 to be available.")
|
||||||
@ -1029,7 +1040,7 @@ def stage_unlock_storages(ssh_client):
|
|||||||
|
|
||||||
for storage in storages:
|
for storage in storages:
|
||||||
run_ssh_cmd(ssh_client,
|
run_ssh_cmd(ssh_client,
|
||||||
'source /etc/nova/openrc; system host-unlock {}'.format(storage),
|
'source /etc/platform/openrc; system host-unlock {}'.format(storage),
|
||||||
timeout=60)
|
timeout=60)
|
||||||
LOG.info("Waiting 15s before next unlock")
|
LOG.info("Waiting 15s before next unlock")
|
||||||
time.sleep(15)
|
time.sleep(15)
|
||||||
@ -1047,7 +1058,7 @@ def stage_unlock_workers(ssh_client):
|
|||||||
for worker in workers:
|
for worker in workers:
|
||||||
run_ssh_cmd(
|
run_ssh_cmd(
|
||||||
ssh_client,
|
ssh_client,
|
||||||
'source /etc/nova/openrc; system host-unlock {}'.format(worker),
|
'source /etc/platform/openrc; system host-unlock {}'.format(worker),
|
||||||
timeout=60)
|
timeout=60)
|
||||||
LOG.info("Waiting 15s before next unlock")
|
LOG.info("Waiting 15s before next unlock")
|
||||||
time.sleep(15)
|
time.sleep(15)
|
||||||
@ -1316,7 +1327,6 @@ AIO_SX_STAGES = [
|
|||||||
STG_RSYNC_CONFIG,
|
STG_RSYNC_CONFIG,
|
||||||
STG_LAB_SETUP1,
|
STG_LAB_SETUP1,
|
||||||
STG_UNLOCK_CONTROLLER0,
|
STG_UNLOCK_CONTROLLER0,
|
||||||
STG_LAB_SETUP2,
|
|
||||||
]
|
]
|
||||||
|
|
||||||
AIO_DX_STAGES = [
|
AIO_DX_STAGES = [
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
# Install rsync, sshpass
|
|
||||||
#
|
|
||||||
configparser
|
configparser
|
||||||
paramiko
|
paramiko
|
||||||
pytest
|
pytest
|
||||||
streamexpect
|
git+https://github.com/digidotcom/python-streamexpect#egg=streamexpect
|
||||||
|
pexpect
|
||||||
|
|
||||||
|
@ -41,38 +41,31 @@ def sftp_send(source, remote_host, remote_port, destination, username, password)
|
|||||||
sftp_client.close()
|
sftp_client.close()
|
||||||
ssh_client.close()
|
ssh_client.close()
|
||||||
|
|
||||||
|
|
||||||
def send_dir(source, remote_host, remote_port, destination, username,
|
def send_dir(source, remote_host, remote_port, destination, username,
|
||||||
password, follow_links=True, clear_known_hosts=True):
|
password, follow_links=True, clear_known_hosts=True):
|
||||||
# Only works from linux for now
|
# Only works from linux for now
|
||||||
if not source.endswith('/') or not source.endswith('\\'):
|
if not source.endswith('/') or not source.endswith('\\'):
|
||||||
source = source + '/'
|
source = source + '/'
|
||||||
params = {
|
|
||||||
'source': source,
|
follow_links = "L" if follow_links else ""
|
||||||
'remote_host': remote_host,
|
|
||||||
'destination': destination,
|
|
||||||
'port': remote_port,
|
|
||||||
'username': username,
|
|
||||||
'password': password,
|
|
||||||
'follow_links': "L" if follow_links else "",
|
|
||||||
}
|
|
||||||
if clear_known_hosts:
|
if clear_known_hosts:
|
||||||
if remote_host == '127.0.0.1':
|
if remote_host == '127.0.0.1':
|
||||||
keygen_arg = "[127.0.0.1]:{}".format(remote_port)
|
keygen_arg = "[127.0.0.1]:{}".format(remote_port)
|
||||||
else:
|
else:
|
||||||
keygen_arg = remote_host
|
keygen_arg = remote_host
|
||||||
cmd = 'ssh-keygen -f "/home/%s/.ssh/known_hosts" -R' \
|
cmd = f'ssh-keygen -f "/home/{getpass.getuser()}/.ssh/known_hosts" -R {keygen_arg}'
|
||||||
' %s', getpass.getuser(), keygen_arg
|
|
||||||
LOG.info("CMD: %s", cmd)
|
LOG.info("CMD: %s", cmd)
|
||||||
process = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE)
|
process = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE)
|
||||||
for line in iter(process.stdout.readline, b''):
|
for line in iter(process.stdout.readline, b''):
|
||||||
LOG.info("%s", line.decode("utf-8").strip())
|
LOG.info("%s", line.decode("utf-8").strip())
|
||||||
process.wait()
|
process.wait()
|
||||||
|
|
||||||
LOG.info("Running rsync of dir: {source} ->" \
|
LOG.info(f'Running rsync of dir: {source} -> {username}@{remote_host}'
|
||||||
"{username}@{remote_host}:{destination}".format(**params))
|
f':{destination}')
|
||||||
cmd = ("rsync -av{follow_links} "
|
cmd = (f'rsync -av{follow_links} --rsh="/usr/bin/sshpass -p {password} '
|
||||||
"--rsh=\"/usr/bin/sshpass -p {password} ssh -p {port} -o StrictHostKeyChecking=no -l {username}\" "
|
f'ssh -p {remote_port} -o StrictHostKeyChecking=no -l {username}" '
|
||||||
"{source}* {username}@{remote_host}:{destination}".format(**params))
|
f'{source}* {username}@{remote_host}:{destination}')
|
||||||
LOG.info("CMD: %s", cmd)
|
LOG.info("CMD: %s", cmd)
|
||||||
|
|
||||||
process = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE)
|
process = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE)
|
||||||
@ -80,7 +73,7 @@ def send_dir(source, remote_host, remote_port, destination, username,
|
|||||||
LOG.info("%s", line.decode("utf-8").strip())
|
LOG.info("%s", line.decode("utf-8").strip())
|
||||||
process.wait()
|
process.wait()
|
||||||
if process.returncode:
|
if process.returncode:
|
||||||
raise Exception("Error in rsync, return code:{}".format(process.returncode))
|
raise Exception(f'Error in rsync, return code: {process.returncode}')
|
||||||
|
|
||||||
|
|
||||||
def send_dir_fallback(source, remote_host, destination, username, password):
|
def send_dir_fallback(source, remote_host, destination, username, password):
|
||||||
|
@ -130,7 +130,7 @@ init_hostonly_net
|
|||||||
rm -f "$HOSTADD_SCRIPT"
|
rm -f "$HOSTADD_SCRIPT"
|
||||||
cat <<EOF > "$HOSTADD_SCRIPT"
|
cat <<EOF > "$HOSTADD_SCRIPT"
|
||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
source /etc/nova/openrc
|
source /etc/platform/openrc
|
||||||
EOF
|
EOF
|
||||||
chmod +x "$HOSTADD_SCRIPT"
|
chmod +x "$HOSTADD_SCRIPT"
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user