Made horizon, rabbit and mysql ports configurable

Addresses requests to make it easier to avoid conflicts between the
Horizon dashboard and http services that might already be running on
the machine.

Configurable via snap config. Exposing via arguments to .init and
testing post init configuration is left for a separate PR.

Eventually, these may move to non standard ports by default. This PR
sets the stage for that, but further discussion is needed before we
decide whether to implement.

(This commit also contains a sneaky fix for the username display at the
end of the launch script.)

Closes-Bug: 1814829
Change-Id: If728d6ec8024bca4d3e809637fbdcc03ed4e6934
This commit is contained in:
Pete Vander Giessen 2019-11-05 19:54:35 +00:00
parent d34a98ad15
commit 1a25e50a17
17 changed files with 82 additions and 20 deletions

View File

@ -20,6 +20,9 @@ snapctl set \
config.network.ext-cidr=10.20.20.1/24 \ config.network.ext-cidr=10.20.20.1/24 \
config.network.security-rules=true \ config.network.security-rules=true \
config.network.dashboard-allowed-hosts="*" \ config.network.dashboard-allowed-hosts="*" \
config.network.ports.dashboard=80 \
config.network.ports.mysql=3306 \
config.network.ports.rabbit=5672 \
; ;
# Passwords, certs, etc. # Passwords, certs, etc.

View File

@ -17,6 +17,7 @@ setup:
- "{snap_common}/etc/cinder/uwsgi/snap" - "{snap_common}/etc/cinder/uwsgi/snap"
- "{snap_common}/etc/nova/uwsgi/snap" - "{snap_common}/etc/nova/uwsgi/snap"
- "{snap_common}/etc/horizon/uwsgi/snap" - "{snap_common}/etc/horizon/uwsgi/snap"
- "{snap_common}/etc/rabbitmq"
- "{snap_common}/fernet-keys" - "{snap_common}/fernet-keys"
- "{snap_common}/lib" - "{snap_common}/lib"
- "{snap_common}/lib/images" - "{snap_common}/lib/images"
@ -53,6 +54,7 @@ setup:
neutron.nova.conf.j2: "{snap_common}/etc/neutron/neutron.conf.d/nova.conf" neutron.nova.conf.j2: "{snap_common}/etc/neutron/neutron.conf.d/nova.conf"
neutron.database.conf.j2: "{snap_common}/etc/neutron/neutron.conf.d/database.conf" neutron.database.conf.j2: "{snap_common}/etc/neutron/neutron.conf.d/database.conf"
neutron.conf.d.rabbitmq.conf.j2: "{snap_common}/etc/neutron/neutron.conf.d/rabbitmq.conf" neutron.conf.d.rabbitmq.conf.j2: "{snap_common}/etc/neutron/neutron.conf.d/rabbitmq.conf"
rabbitmq.conf.j2: "{snap_common}/etc/rabbitmq/rabbitmq.config"
chmod: chmod:
"{snap_common}/instances": 0755 "{snap_common}/instances": 0755
@ -69,6 +71,9 @@ setup:
extcidr: 'config.network.ext-cidr' extcidr: 'config.network.ext-cidr'
dns: 'config.network.dns' dns: 'config.network.dns'
dashboard_allowed_hosts: 'config.network.dashboard-allowed-hosts' dashboard_allowed_hosts: 'config.network.dashboard-allowed-hosts'
dashboard_port: 'config.network.ports.dashboard'
mysql_port: 'config.network.ports.mysql'
rabbit_port: 'config.network.ports.rabbit'
entry_points: entry_points:
keystone-manage: keystone-manage:
binary: "{snap}/bin/keystone-manage" binary: "{snap}/bin/keystone-manage"

View File

@ -1,2 +1,2 @@
[database] [database]
connection = mysql+pymysql://glance:glance@{{ control_ip }}/glance connection = mysql+pymysql://glance:glance@{{ control_ip }}:{{ mysql_port }}/glance

View File

@ -2,7 +2,7 @@
# to define this template. Be sure to update "listen" with the port number and # to define this template. Be sure to update "listen" with the port number and
# also update "api-name" for the socket. # also update "api-name" for the socket.
server { server {
listen 80; listen {{ dashboard_port }};
error_log syslog:server=unix:/dev/log; error_log syslog:server=unix:/dev/log;
access_log syslog:server=unix:/dev/log; access_log syslog:server=unix:/dev/log;
location / { location / {

View File

@ -1,2 +1,2 @@
[database] [database]
connection = mysql+pymysql://keystone:keystone@{{ control_ip }}/keystone connection = mysql+pymysql://keystone:keystone@{{ control_ip }}:{{ mysql_port }}/keystone

View File

@ -1,2 +1,2 @@
[DEFAULT] [DEFAULT]
transport_url = rabbit://openstack:rabbitmq@{{ control_ip }} transport_url = rabbit://openstack:rabbitmq@{{ control_ip }}:{{ rabbit_port }}

View File

@ -1,2 +1,2 @@
[database] [database]
connection = mysql+pymysql://neutron:neutron@{{ control_ip }}/neutron connection = mysql+pymysql://neutron:neutron@{{ control_ip }}:{{ mysql_port }}/neutron

View File

@ -1,5 +1,5 @@
[database] [database]
connection = mysql+pymysql://nova:nova@{{ control_ip }}/nova connection = mysql+pymysql://nova:nova@{{ control_ip }}:{{ mysql_port }}/nova
[api_database] [api_database]
connection = mysql+pymysql://nova_api:nova_api@{{ control_ip }}/nova_api connection = mysql+pymysql://nova_api:nova_api@{{ control_ip }}:{{ mysql_port }}/nova_api

View File

@ -1,2 +1,2 @@
[DEFAULT] [DEFAULT]
transport_url = rabbit://openstack:rabbitmq@{{ control_ip }} transport_url = rabbit://openstack:rabbitmq@{{ control_ip }}:{{ rabbit_port }}

View File

@ -0,0 +1,6 @@
[
{rabbit, [
{tcp_listeners, [{{ rabbit_port}}]}
]
}
].

View File

@ -17,12 +17,16 @@
set -e set -e
init_config() { init_config() {
# Write out config.
# Include 'client' section for pymysql client.
# TODO: is [mysql] section necessary?
mkdir -p "${CONFDIR}" mkdir -p "${CONFDIR}"
echo "Generating config file in ${CONFFILE}..." echo "Generating config file in ${CONFFILE}..."
cat > ${CONFFILE} <<EOF cat > ${CONFFILE} <<EOF
[mysqld] [mysqld]
pid-file=${RUNDIR}/mysqld.pid pid-file=${RUNDIR}/mysqld.pid
socket=${RUNDIR}/mysqld.sock socket=${RUNDIR}/mysqld.sock
port=${PORT}
datadir=${DATADIR} datadir=${DATADIR}
log-error=${LOGDIR}/error.log log-error=${LOGDIR}/error.log
secure-file-priv=${FILESDIR} secure-file-priv=${FILESDIR}
@ -30,9 +34,15 @@ basedir=${BASEDIR}
[mysql] [mysql]
socket=${RUNDIR}/mysqld.sock socket=${RUNDIR}/mysqld.sock
port=${PORT}
[client]
socket=${RUNDIR}/mysqld.sock
port=${PORT}
[mysql_upgrade] [mysql_upgrade]
socket=${RUNDIR}/mysqld.sock socket=${RUNDIR}/mysqld.sock
port=${PORT}
EOF EOF
} }
@ -57,6 +67,7 @@ CONFDIR="${MYSQL_SNAPDIR}/etc/mysql"
CONFFILE="${CONFDIR}/my.cnf" CONFFILE="${CONFDIR}/my.cnf"
FILESDIR="${MYSQL_SNAPDIR}/lib/mysql-files" FILESDIR="${MYSQL_SNAPDIR}/lib/mysql-files"
BASEDIR="${SNAP}/usr" BASEDIR="${SNAP}/usr"
PORT=$(snapctl get config.network.ports.mysql)
[ -d "${LOGDIR}" ] || mkdir -p ${LOGDIR} [ -d "${LOGDIR}" ] || mkdir -p ${LOGDIR}
[ -f "${LOGDIR}/error.log" ] || touch ${LOGDIR}/error.log [ -f "${LOGDIR}/error.log" ] || touch ${LOGDIR}/error.log

View File

@ -16,4 +16,18 @@ if [ -z "$(snapctl get config)" ]; then
mkdir -p ${SNAP_COMMON}/etc/horizon/local_settings.d mkdir -p ${SNAP_COMMON}/etc/horizon/local_settings.d
fi fi
# Add default ports for mysql, rabbit and dashboard services.
# [2019-11-21] build 171 (beta) -> master
if [ -z "$(snapctl get config.network.ports.dashboard)" ]; then
snapctl set config.network.ports.dashboard=80
fi
if [ -z "$(snapctl get config.network.ports.mysql)" ]; then
snapctl set config.network.ports.mysql=3306
fi
if [ -z "$(snapctl get config.network.ports.rabbit)" ]; then
snapctl set config.network.ports.rabbit=5672
fi
snap-openstack setup # Write any template changes. snap-openstack setup # Write any template changes.

View File

@ -778,11 +778,11 @@ parts:
rm -f $SNAPCRAFT_PART_INSTALL/usr/bin/erl rm -f $SNAPCRAFT_PART_INSTALL/usr/bin/erl
rm -f $SNAPCRAFT_PART_INSTALL/usr/lib/rabbitmq/bin/rabbitmq-script-wrapper rm -f $SNAPCRAFT_PART_INSTALL/usr/lib/rabbitmq/bin/rabbitmq-script-wrapper
# NOTE(jamespage): The versioned path below is brittle. # NOTE(jamespage): The versioned path below is brittle.
rm -f $SNAPCRAFT_PART_INSTALL/usr/lib/rabbitmq/lib/rabbitmq_server-3.5.7/sbin/rabbitmq-defaults rm -f $SNAPCRAFT_PART_INSTALL/usr/lib/rabbitmq/lib/rabbitmq_server-3.6.10/sbin/rabbitmq-defaults
snapcraftctl build snapcraftctl build
organize: organize:
rabbitmq-script-wrapper: usr/lib/rabbitmq/bin/rabbitmq-script-wrapper rabbitmq-script-wrapper: usr/lib/rabbitmq/bin/rabbitmq-script-wrapper
rabbitmq-defaults: usr/lib/rabbitmq/lib/rabbitmq_server-3.5.7/sbin/rabbitmq-defaults rabbitmq-defaults: usr/lib/rabbitmq/lib/rabbitmq_server-3.6.10/sbin/rabbitmq-defaults
erl: usr/bin/erl erl: usr/bin/erl
# Memcached Token Caching # Memcached Token Caching

View File

@ -224,7 +224,13 @@ class Framework(unittest.TestCase):
# Test # Test
print('Verifying GUI for (IP: {})'.format(host.horizon_ip)) print('Verifying GUI for (IP: {})'.format(host.horizon_ip))
# Verify that our GUI is working properly # Verify that our GUI is working properly
self.driver.get("http://{}/".format(host.horizon_ip)) dashboard_port = check_output(*host.prefix, 'sudo', 'snap', 'get',
'microstack',
'config.network.ports.dashboard')
self.driver.get("http://{}:{}/".format(
host.horizon_ip,
dashboard_port
))
# Login to horizon! # Login to horizon!
self.driver.find_element(By.ID, "id_username").click() self.driver.find_element(By.ID, "id_username").click()
self.driver.find_element(By.ID, "id_username").send_keys("admin") self.driver.find_element(By.ID, "id_username").send_keys("admin")

View File

@ -267,7 +267,9 @@ class RabbitMq(Question):
config_key = 'config.services.control-plane' config_key = 'config.services.control-plane'
def _wait(self) -> None: def _wait(self) -> None:
nc_wait(_env['control_ip'], '5672') rabbit_port = check_output(
'snapctl', 'get', 'config.network.ports.rabbit')
nc_wait(_env['control_ip'], rabbit_port)
log_file = '{SNAP_COMMON}/log/rabbitmq/startup_log'.format(**_env) log_file = '{SNAP_COMMON}/log/rabbitmq/startup_log'.format(**_env)
log_wait(log_file, 'completed') log_wait(log_file, 'completed')
@ -301,7 +303,9 @@ class DatabaseSetup(Question):
config_key = 'config.services.control-plane' config_key = 'config.services.control-plane'
def _wait(self) -> None: def _wait(self) -> None:
nc_wait(_env['control_ip'], '3306') mysql_port = check_output(
'snapctl', 'get', 'config.network.ports.mysql')
nc_wait(_env['control_ip'], mysql_port)
log_wait('{SNAP_COMMON}/log/mysql/error.log'.format(**_env), log_wait('{SNAP_COMMON}/log/mysql/error.log'.format(**_env),
'mysqld: ready for connections.') 'mysqld: ready for connections.')

View File

@ -127,9 +127,8 @@ def sql(cmd: str) -> None:
:param cmd: sql to execute. :param cmd: sql to execute.
""" """
mysql_conf = '${SNAP_USER_COMMON}/etc/mysql/my.cnf'.format(**_env) mysql_conf = '{SNAP_COMMON}/etc/mysql/my.cnf'.format(**_env)
connection = pymysql.connect(host='localhost', user='root', connection = pymysql.connect(read_default_file=mysql_conf)
read_default_file=mysql_conf)
with connection.cursor() as cursor: with connection.cursor() as cursor:
cursor.execute(cmd) cursor.execute(cmd)

View File

@ -146,15 +146,29 @@ def launch(name, args):
'-c', 'floating_ip_address', 'external') '-c', 'floating_ip_address', 'external')
check('openstack', 'server', 'add', 'floating', 'ip', server_id, ip) check('openstack', 'server', 'add', 'floating', 'ip', server_id, ip)
username = '<username>'
if args.flavor:
# Try to guess at a username.
# TODO: make this more sophisticated.
if 'fedora' in args.flavor.lower():
username = 'fedora'
if 'ubuntu' in args.flavor.lower():
username = 'ubuntu'
if 'cirros' in args.flavor.lower():
username = 'cirros'
print("""\ print("""\
Server {} launched! (status is {}) Server {name} launched! (status is {status})
Access it with `ssh -i \ Access it with `ssh -i \
$HOME/.ssh/id_microstack` <username>@{}""".format(name, status, ip)) $HOME/.ssh/id_microstack` {username}@{ip}""".format(name=name, status=status,
username=username, ip=ip))
gate = check_output('snapctl', 'get', 'config.network.ext-gateway') gate = check_output('snapctl', 'get', 'config.network.ext-gateway')
print('You can also visit the OpenStack dashboard at http://{}'.format( port = check_output('snapctl', 'get', 'config.network.ports.dashboard')
gate))
print('You can also visit the OpenStack dashboard at http://{}:{}'.format(
gate, port))
def main(): def main():