From 1a25e50a172db7331edf2f836f3c2005222bb4c5 Mon Sep 17 00:00:00 2001 From: Pete Vander Giessen Date: Tue, 5 Nov 2019 19:54:35 +0000 Subject: [PATCH] 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 --- snap-overlay/bin/set-default-config | 3 +++ snap-overlay/snap-openstack.yaml | 5 +++++ .../templates/glance.database.conf.j2 | 2 +- snap-overlay/templates/horizon-nginx.conf.j2 | 2 +- .../templates/keystone.database.conf.j2 | 2 +- .../templates/neutron.conf.d.rabbitmq.conf.j2 | 2 +- .../templates/neutron.database.conf.j2 | 2 +- .../templates/nova.conf.d.database.conf.j2 | 4 ++-- .../templates/nova.conf.d.rabbitmq.conf.j2 | 2 +- snap-overlay/templates/rabbitmq.conf.j2 | 6 +++++ snap-wrappers/mysql/mysql-start-server | 11 ++++++++++ snap/hooks/post-refresh | 14 ++++++++++++ snapcraft.yaml | 4 ++-- tests/framework.py | 8 ++++++- tools/init/init/questions/__init__.py | 8 +++++-- tools/init/init/shell.py | 5 ++--- tools/launch/launch/main.py | 22 +++++++++++++++---- 17 files changed, 82 insertions(+), 20 deletions(-) create mode 100644 snap-overlay/templates/rabbitmq.conf.j2 diff --git a/snap-overlay/bin/set-default-config b/snap-overlay/bin/set-default-config index 26fd08d..729b725 100755 --- a/snap-overlay/bin/set-default-config +++ b/snap-overlay/bin/set-default-config @@ -20,6 +20,9 @@ snapctl set \ config.network.ext-cidr=10.20.20.1/24 \ config.network.security-rules=true \ config.network.dashboard-allowed-hosts="*" \ + config.network.ports.dashboard=80 \ + config.network.ports.mysql=3306 \ + config.network.ports.rabbit=5672 \ ; # Passwords, certs, etc. diff --git a/snap-overlay/snap-openstack.yaml b/snap-overlay/snap-openstack.yaml index 1615eeb..d8bda03 100644 --- a/snap-overlay/snap-openstack.yaml +++ b/snap-overlay/snap-openstack.yaml @@ -17,6 +17,7 @@ setup: - "{snap_common}/etc/cinder/uwsgi/snap" - "{snap_common}/etc/nova/uwsgi/snap" - "{snap_common}/etc/horizon/uwsgi/snap" + - "{snap_common}/etc/rabbitmq" - "{snap_common}/fernet-keys" - "{snap_common}/lib" - "{snap_common}/lib/images" @@ -53,6 +54,7 @@ setup: 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.conf.d.rabbitmq.conf.j2: "{snap_common}/etc/neutron/neutron.conf.d/rabbitmq.conf" + rabbitmq.conf.j2: "{snap_common}/etc/rabbitmq/rabbitmq.config" chmod: "{snap_common}/instances": 0755 @@ -69,6 +71,9 @@ setup: extcidr: 'config.network.ext-cidr' dns: 'config.network.dns' 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: keystone-manage: binary: "{snap}/bin/keystone-manage" diff --git a/snap-overlay/templates/glance.database.conf.j2 b/snap-overlay/templates/glance.database.conf.j2 index bb9a32b..c4c0d81 100644 --- a/snap-overlay/templates/glance.database.conf.j2 +++ b/snap-overlay/templates/glance.database.conf.j2 @@ -1,2 +1,2 @@ [database] -connection = mysql+pymysql://glance:glance@{{ control_ip }}/glance +connection = mysql+pymysql://glance:glance@{{ control_ip }}:{{ mysql_port }}/glance diff --git a/snap-overlay/templates/horizon-nginx.conf.j2 b/snap-overlay/templates/horizon-nginx.conf.j2 index c06b400..394e4e9 100644 --- a/snap-overlay/templates/horizon-nginx.conf.j2 +++ b/snap-overlay/templates/horizon-nginx.conf.j2 @@ -2,7 +2,7 @@ # to define this template. Be sure to update "listen" with the port number and # also update "api-name" for the socket. server { - listen 80; + listen {{ dashboard_port }}; error_log syslog:server=unix:/dev/log; access_log syslog:server=unix:/dev/log; location / { diff --git a/snap-overlay/templates/keystone.database.conf.j2 b/snap-overlay/templates/keystone.database.conf.j2 index ad29228..a480ec7 100644 --- a/snap-overlay/templates/keystone.database.conf.j2 +++ b/snap-overlay/templates/keystone.database.conf.j2 @@ -1,2 +1,2 @@ [database] -connection = mysql+pymysql://keystone:keystone@{{ control_ip }}/keystone +connection = mysql+pymysql://keystone:keystone@{{ control_ip }}:{{ mysql_port }}/keystone diff --git a/snap-overlay/templates/neutron.conf.d.rabbitmq.conf.j2 b/snap-overlay/templates/neutron.conf.d.rabbitmq.conf.j2 index 95406d0..ef149bc 100644 --- a/snap-overlay/templates/neutron.conf.d.rabbitmq.conf.j2 +++ b/snap-overlay/templates/neutron.conf.d.rabbitmq.conf.j2 @@ -1,2 +1,2 @@ [DEFAULT] -transport_url = rabbit://openstack:rabbitmq@{{ control_ip }} +transport_url = rabbit://openstack:rabbitmq@{{ control_ip }}:{{ rabbit_port }} diff --git a/snap-overlay/templates/neutron.database.conf.j2 b/snap-overlay/templates/neutron.database.conf.j2 index 8d22851..fe12945 100644 --- a/snap-overlay/templates/neutron.database.conf.j2 +++ b/snap-overlay/templates/neutron.database.conf.j2 @@ -1,2 +1,2 @@ [database] -connection = mysql+pymysql://neutron:neutron@{{ control_ip }}/neutron +connection = mysql+pymysql://neutron:neutron@{{ control_ip }}:{{ mysql_port }}/neutron diff --git a/snap-overlay/templates/nova.conf.d.database.conf.j2 b/snap-overlay/templates/nova.conf.d.database.conf.j2 index 3eaddf9..51ded26 100644 --- a/snap-overlay/templates/nova.conf.d.database.conf.j2 +++ b/snap-overlay/templates/nova.conf.d.database.conf.j2 @@ -1,5 +1,5 @@ [database] -connection = mysql+pymysql://nova:nova@{{ control_ip }}/nova +connection = mysql+pymysql://nova:nova@{{ control_ip }}:{{ mysql_port }}/nova [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 diff --git a/snap-overlay/templates/nova.conf.d.rabbitmq.conf.j2 b/snap-overlay/templates/nova.conf.d.rabbitmq.conf.j2 index 95406d0..ef149bc 100644 --- a/snap-overlay/templates/nova.conf.d.rabbitmq.conf.j2 +++ b/snap-overlay/templates/nova.conf.d.rabbitmq.conf.j2 @@ -1,2 +1,2 @@ [DEFAULT] -transport_url = rabbit://openstack:rabbitmq@{{ control_ip }} +transport_url = rabbit://openstack:rabbitmq@{{ control_ip }}:{{ rabbit_port }} diff --git a/snap-overlay/templates/rabbitmq.conf.j2 b/snap-overlay/templates/rabbitmq.conf.j2 new file mode 100644 index 0000000..5b4e22b --- /dev/null +++ b/snap-overlay/templates/rabbitmq.conf.j2 @@ -0,0 +1,6 @@ +[ + {rabbit, [ + {tcp_listeners, [{{ rabbit_port}}]} + ] + } +]. \ No newline at end of file diff --git a/snap-wrappers/mysql/mysql-start-server b/snap-wrappers/mysql/mysql-start-server index 3b15767..3f813b6 100755 --- a/snap-wrappers/mysql/mysql-start-server +++ b/snap-wrappers/mysql/mysql-start-server @@ -17,12 +17,16 @@ set -e init_config() { + # Write out config. + # Include 'client' section for pymysql client. + # TODO: is [mysql] section necessary? mkdir -p "${CONFDIR}" echo "Generating config file in ${CONFFILE}..." cat > ${CONFFILE} < 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. diff --git a/snapcraft.yaml b/snapcraft.yaml index 26faa11..618e7be 100644 --- a/snapcraft.yaml +++ b/snapcraft.yaml @@ -778,11 +778,11 @@ parts: rm -f $SNAPCRAFT_PART_INSTALL/usr/bin/erl rm -f $SNAPCRAFT_PART_INSTALL/usr/lib/rabbitmq/bin/rabbitmq-script-wrapper # 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 organize: 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 # Memcached Token Caching diff --git a/tests/framework.py b/tests/framework.py index 4cf84fb..faa7642 100644 --- a/tests/framework.py +++ b/tests/framework.py @@ -224,7 +224,13 @@ class Framework(unittest.TestCase): # Test print('Verifying GUI for (IP: {})'.format(host.horizon_ip)) # 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! self.driver.find_element(By.ID, "id_username").click() self.driver.find_element(By.ID, "id_username").send_keys("admin") diff --git a/tools/init/init/questions/__init__.py b/tools/init/init/questions/__init__.py index 5f15771..7718b4a 100644 --- a/tools/init/init/questions/__init__.py +++ b/tools/init/init/questions/__init__.py @@ -267,7 +267,9 @@ class RabbitMq(Question): config_key = 'config.services.control-plane' 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_wait(log_file, 'completed') @@ -301,7 +303,9 @@ class DatabaseSetup(Question): config_key = 'config.services.control-plane' 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), 'mysqld: ready for connections.') diff --git a/tools/init/init/shell.py b/tools/init/init/shell.py index 3caa482..f9c85b3 100644 --- a/tools/init/init/shell.py +++ b/tools/init/init/shell.py @@ -127,9 +127,8 @@ def sql(cmd: str) -> None: :param cmd: sql to execute. """ - mysql_conf = '${SNAP_USER_COMMON}/etc/mysql/my.cnf'.format(**_env) - connection = pymysql.connect(host='localhost', user='root', - read_default_file=mysql_conf) + mysql_conf = '{SNAP_COMMON}/etc/mysql/my.cnf'.format(**_env) + connection = pymysql.connect(read_default_file=mysql_conf) with connection.cursor() as cursor: cursor.execute(cmd) diff --git a/tools/launch/launch/main.py b/tools/launch/launch/main.py index 93a3080..9b8aaba 100644 --- a/tools/launch/launch/main.py +++ b/tools/launch/launch/main.py @@ -146,15 +146,29 @@ def launch(name, args): '-c', 'floating_ip_address', 'external') check('openstack', 'server', 'add', 'floating', 'ip', server_id, ip) + 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("""\ -Server {} launched! (status is {}) +Server {name} launched! (status is {status}) Access it with `ssh -i \ -$HOME/.ssh/id_microstack` @{}""".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') - print('You can also visit the OpenStack dashboard at http://{}'.format( - gate)) + port = check_output('snapctl', 'get', 'config.network.ports.dashboard') + + print('You can also visit the OpenStack dashboard at http://{}:{}'.format( + gate, port)) def main():