Skip to content

Commit 065150e

Browse files
authored
OSPC-1873 Get SSH working in Database instance container (#1409)
1 parent 0f70e3b commit 065150e

File tree

4 files changed

+177
-2
lines changed

4 files changed

+177
-2
lines changed

base-helm-configs/trove/trove-helm-overrides.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,9 @@ conf:
8080
management_networks: ""
8181
network_driver: trove.network.neutron.NeutronDriver
8282
taskmanager_manager: trove.taskmanager.manager.Manager
83+
use_nova_server_config_drive: true
8384
trove_api_workers: 2
85+
trove_security_groups_support: false
8486
trove_volume_support: true
8587
volume_support: true
8688
volume_fstype: ext4

bin/create-secrets.sh

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,8 @@ cinder_admin_password=$(generate_password 32)
6464
trove_rabbitmq_password=$(generate_password 64)
6565
trove_db_password=$(generate_password 32)
6666
trove_admin_password=$(generate_password 32)
67+
trove_ssh_public_key=$(ssh-keygen -qt ed25519 -N '' -C "trove_ssh" -f trove_ssh_key && cat trove_ssh_key.pub)
68+
trove_ssh_private_key=$(cat trove_ssh_key)
6769
cloudkitty_rabbitmq_password=$(generate_password 64)
6870
cloudkitty_db_password=$(generate_password 32)
6971
cloudkitty_admin_password=$(generate_password 32)
@@ -334,6 +336,21 @@ data:
334336
---
335337
apiVersion: v1
336338
kind: Secret
339+
metadata:
340+
name: trove-ssh
341+
namespace: openstack
342+
annotations:
343+
meta.helm.sh/release-name: trove
344+
meta.helm.sh/release-namespace: openstack
345+
labels:
346+
app.kubernetes.io/managed-by: Helm
347+
type: Opaque
348+
data:
349+
public-key: $(echo $trove_ssh_public_key | base64 -w0)
350+
private-key: $(echo "$trove_ssh_private_key" | base64 -w0)
351+
---
352+
apiVersion: v1
353+
kind: Secret
337354
metadata:
338355
name: cloudkitty-rabbitmq-password
339356
namespace: openstack

scripts/hyperconverged-lab-kubespray.sh

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -616,7 +616,15 @@ fi
616616

617617

618618
if [ "${TEST_LEVEL}" = "off" ]; then
619+
# Wait for Nova and Neutron APIs to be ready before proceeding
620+
waitForOpenStackAPIsReadyRemote "${SSH_USERNAME}" "${JUMP_HOST_VIP}"
621+
619622
createPostSetupResourcesRemote "${SSH_USERNAME}" "${JUMP_HOST_VIP}" "${LAB_NAME_PREFIX}"
623+
624+
# Trove Setup & Installation
625+
# Must be run after the flat network has been created
626+
setupTrove "${SSH_USERNAME}" "${JUMP_HOST_VIP}" "${LAB_NAME_PREFIX}"
627+
620628
else
621629
# Wait for Nova and Neutron APIs to be ready before proceeding
622630
if [ ${DISABLE_OPENSTACK} = "false" ]; then

scripts/lib/hyperconverged-common.sh

Lines changed: 150 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,9 @@ function parseCommonArgs() {
3737

3838
if [ "${HYPERCONVERGED_CINDER_VOLUME:-false}" = "true" ]; then
3939
# barbican is needed for iSCSI encrypted volumes and cinder install has to be
40-
# done much later during the cinder volume setup
41-
INCLUDE_LIST=("keystone" "barbican" "glance" "nova" "neutron" "placement")
40+
# done much later during the cinder volume setup; trove is also included since
41+
# cinder volume support was added to support trove develpment
42+
INCLUDE_LIST=("keystone" "barbican" "glance" "nova" "neutron" "placement" "trove")
4243
EXCLUDE_LIST=("cinder")
4344
else
4445
INCLUDE_LIST=("keystone" "glance" "cinder" "nova" "neutron" "placement")
@@ -529,6 +530,9 @@ conf:
529530
trove:
530531
DEFAULT:
531532
trove_api_workers: 1
533+
management_networks: <management_networks>
534+
management_security_groups: <management_security_groups>
535+
nova_keypair: <keypair_name>
532536
oslo_messaging_notifications:
533537
driver: noop
534538
trove_api_uwsgi:
@@ -1663,3 +1667,147 @@ echo "Installing Octavia"
16631667
sudo /opt/genestack/bin/install-octavia.sh -f $OCTAVIA_HELM_FILE
16641668
EOC
16651669
}
1670+
1671+
function setupKubeConfig() {
1672+
if [ ! -d ~/.kube ]; then
1673+
mkdir ~/.kube
1674+
sudo cp -i /etc/kubernetes/admin.conf ~/.kube/config 2>/dev/null || true
1675+
sudo chown $(id -u):$(id -g) ~/.kube/config 2>/dev/null || true
1676+
fi
1677+
}
1678+
1679+
function setupTrove() {
1680+
# Trove requires some setup that cannot be done w/ a pre-install job because the job
1681+
# runs in a container that does not have access to the
1682+
# /etc/genestack/helm-config/trove/trove-helm-overrides.yaml file that must be modified
1683+
# so that the management_networks and management_security_groups can be assigned.
1684+
# This also can't be done until openstack commands are available which doesn't happen until the
1685+
# openstack setup is complete, which includes the installation of trove. Unfortunately, once the
1686+
# changes are made, trove needs to have the helm upgrade run again which is done by the trove
1687+
# install script.
1688+
1689+
echo "Running trove setup ..."
1690+
1691+
local ssh_user="$1"
1692+
local jump_host="$2"
1693+
local lab_prefix="$3"
1694+
1695+
{
1696+
declare -f setupKubeConfig
1697+
1698+
cat << JUMP_HOST_EOF
1699+
# check if trove is installed and running, otherwise exit cleanly
1700+
if ! grep "trove: true" /etc/genestack/openstack-components.yaml &>/dev/null; then
1701+
echo "Trove not installed, exiting Trove setup function for ${lab_prefix}-0"
1702+
exit 0
1703+
fi
1704+
1705+
echo "Running trove setup on ${lab_prefix}-0..."
1706+
1707+
setupKubeConfig
1708+
1709+
TROVE_SSH_KEY=\$(/usr/local/bin/kubectl get secret trove-ssh -n openstack -o jsonpath='{.data.private-key}' | base64 --decode)
1710+
TROVE_SSH_PUBLIC_KEY=\$(/usr/local/bin/kubectl get secret trove-ssh -n openstack -o jsonpath='{.data.public-key}' | base64 --decode)
1711+
TROVE_SSH_KEY_FILENAME="/home/${ssh_user}/.ssh/trove_ssh_key"
1712+
TROVE_ADMIN_PASSWORD=\$(/usr/local/bin/kubectl --namespace openstack get secret trove-admin -o jsonpath='{.data.password}' | base64 -d)
1713+
1714+
set -e
1715+
# activate environment for openstack commands
1716+
source /opt/genestack/scripts/genestack.rc
1717+
1718+
echo "[JUMP_HOST] Creating Trove SSH key on ${lab_prefix}-0"
1719+
echo "\${TROVE_SSH_KEY}" > \${TROVE_SSH_KEY_FILENAME} && chown ${ssh_user}:${ssh_user} \${TROVE_SSH_KEY_FILENAME} && chmod 600 \${TROVE_SSH_KEY_FILENAME}
1720+
1721+
# create environment for trove credentials
1722+
echo "[JUMP_HOST] Creating trove-openrc"
1723+
cat > ~/openrc-trove << TROVE_EOF
1724+
export OS_AUTH_URL=http://keystone-api.openstack.svc.cluster.local:5000/v3
1725+
export OS_PROJECT_NAME=service
1726+
export OS_TENANT_NAME=default
1727+
export OS_PROJECT_DOMAIN_NAME=service
1728+
export OS_USERNAME=trove
1729+
export OS_PASSWORD=\${TROVE_ADMIN_PASSWORD}
1730+
export OS_USER_DOMAIN_NAME=service
1731+
export OS_REGION_NAME=RegionOne
1732+
export OS_INTERFACE=internal
1733+
export OS_IDENTITY_API_VERSION="3"
1734+
TROVE_EOF
1735+
1736+
# activate environment with trove credentials
1737+
source ~/openrc-trove
1738+
1739+
KEYPAIR_NAME="trove-access-keypair"
1740+
SEC_GROUP_NAME="trove-access-secgroup"
1741+
REMOTE_IP="0.0.0.0/0" # Adjust the CIDR to restrict access if needed
1742+
1743+
if openstack keypair show \$KEYPAIR_NAME; then
1744+
echo "[JUMP_HOST] Keypair for access to Trove instances exists"
1745+
else
1746+
echo "[JUMP_HOST] Creating Keypair for access to Trove instances"
1747+
echo "\${TROVE_SSH_PUBLIC_KEY}" > /tmp/trove-access-key.pub
1748+
openstack keypair create --public-key /tmp/trove-access-key.pub \$KEYPAIR_NAME
1749+
fi
1750+
1751+
# Check if security group exists
1752+
if openstack security group show \$SEC_GROUP_NAME; then
1753+
echo "[JUMP_HOST] Security Group for access to Trove instances exists"
1754+
else
1755+
echo "[JUMP_HOST] Creating Security Group for access to Trove instances"
1756+
openstack security group create --description "Security group for Trove instances" \$SEC_GROUP_NAME
1757+
openstack security group rule create --protocol icmp --remote-ip \$REMOTE_IP \$SEC_GROUP_NAME
1758+
openstack security group rule create --protocol tcp --dst-port 22 --remote-ip \$REMOTE_IP \$SEC_GROUP_NAME
1759+
openstack security group rule create --protocol tcp --dst-port 3306 --remote-ip \$REMOTE_IP \$SEC_GROUP_NAME
1760+
fi
1761+
1762+
# update helm overrides so configuration is setup to use a management network and security group
1763+
echo "[JUMP_HOST] Updating Trove Helm overrides"
1764+
FLAT_NETWORK_ID=\$(openstack network list -f value -c ID -c Name | grep flat | awk {'print \$1'})
1765+
sed -i "s/<management_networks>/\$FLAT_NETWORK_ID/g" /etc/genestack/helm-configs/trove/trove-helm-overrides.yaml
1766+
ACCESS_SECGROUP_ID=\$(openstack security group list -f value -c ID -c Name | grep trove-access-secgroup | awk {'print \$1'})
1767+
sed -i "s/<management_security_groups>/\$ACCESS_SECGROUP_ID/g" /etc/genestack/helm-configs/trove/trove-helm-overrides.yaml
1768+
sed -i "s/<keypair_name>/\$KEYPAIR_NAME/g" /etc/genestack/helm-configs/trove/trove-helm-overrides.yaml
1769+
1770+
sudo /opt/genestack/bin/install-trove.sh
1771+
JUMP_HOST_EOF
1772+
} | ssh -o ForwardAgent=yes -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -t ${ssh_user}@${jump_host} bash
1773+
1774+
{
1775+
declare -f setupKubeConfig
1776+
1777+
cat << NODE_1_EOF
1778+
if ! grep "trove: true" /etc/genestack/openstack-components.yaml &>/dev/null; then
1779+
echo "Trove not installed, exiting Trove setup function for ${lab_prefix}-1"
1780+
exit 0
1781+
fi
1782+
1783+
echo "Running trove setup on ${lab_prefix}-1..."
1784+
1785+
setupKubeConfig
1786+
1787+
echo "[${lab_prefix}-1] Creating Trove SSH key"
1788+
TROVE_SSH_KEY=\$(/usr/local/bin/kubectl get secret trove-ssh -n openstack -o jsonpath='{.data.private-key}' | base64 --decode)
1789+
TROVE_SSH_KEY_FILENAME="/home/${ssh_user}/.ssh/trove_ssh_key"
1790+
ssh -o ForwardAgent=yes -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -t ${ssh_user}@${lab_prefix}-1 "echo \"\${TROVE_SSH_KEY}\" > \${TROVE_SSH_KEY_FILENAME} && chown ${ssh_user}:${ssh_user} \${TROVE_SSH_KEY_FILENAME} && chmod 600 \${TROVE_SSH_KEY_FILENAME}"
1791+
NODE_1_EOF
1792+
} | ssh -o ForwardAgent=yes -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -t ${ssh_user}@${jump_host} bash
1793+
1794+
{
1795+
declare -f setupKubeConfig
1796+
1797+
cat << NODE_2_EOF
1798+
if ! grep "trove: true" /etc/genestack/openstack-components.yaml &>/dev/null; then
1799+
echo "Trove not installed, exiting Trove setup function for ${lab_prefix}-2"
1800+
exit 0
1801+
fi
1802+
1803+
echo "Running trove setup on ${lab_prefix}-2..."
1804+
1805+
setupKubeConfig
1806+
1807+
echo "[${lab_prefix}-2] Creating Trove SSH key"
1808+
TROVE_SSH_KEY=\$(/usr/local/bin/kubectl get secret trove-ssh -n openstack -o jsonpath='{.data.private-key}' | base64 --decode)
1809+
TROVE_SSH_KEY_FILENAME="/home/${ssh_user}/.ssh/trove_ssh_key"
1810+
ssh -o ForwardAgent=yes -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -t ${ssh_user}@${lab_prefix}-2 "echo \"\${TROVE_SSH_KEY}\" > \${TROVE_SSH_KEY_FILENAME} && chown ${ssh_user}:${ssh_user} \${TROVE_SSH_KEY_FILENAME} && chmod 600 \${TROVE_SSH_KEY_FILENAME}"
1811+
NODE_2_EOF
1812+
} | ssh -o ForwardAgent=yes -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -t ${ssh_user}@${jump_host} bash
1813+
}

0 commit comments

Comments
 (0)