Name: nova-bin Namespace: openstack Labels: app.kubernetes.io/managed-by=Helm Annotations: meta.helm.sh/release-name: nova meta.helm.sh/release-namespace: openstack Data ==== bootstrap.sh: ---- #!/bin/bash set -ex export HOME=/tmp echo 'Wait for Computes script not enabled' echo 'No other bootstrap customizations found.' ceph-keyring.sh: ---- #!/bin/bash set -ex export HOME=/tmp cp -vf /etc/ceph/ceph.conf.template /etc/ceph/ceph.conf KEYRING=/etc/ceph/ceph.client.${CEPH_CINDER_USER}.keyring if ! [ "x${CEPH_CINDER_USER}" == "xadmin" ]; then # # If user is not client.admin, check if it already exists. If not create # the user. If the cephx user does not exist make sure the caps are set # according to best practices # if USERINFO=$(ceph auth get client.${CEPH_CINDER_USER}); then echo "Cephx user client.${CEPH_CINDER_USER} already exist" echo "Update user client.${CEPH_CINDER_USER} caps" ceph auth caps client.${CEPH_CINDER_USER} \ mon "profile rbd" \ osd "profile rbd" ceph auth get client.${CEPH_CINDER_USER} -o ${KEYRING} else echo "Creating Cephx user client.${CEPH_CINDER_USER}" ceph auth get-or-create client.${CEPH_CINDER_USER} \ mon "profile rbd" \ osd "profile rbd" \ -o ${KEYRING} fi rm -f /etc/ceph/ceph.client.admin.keyring fi db-sync.sh: ---- #!/bin/bash set -ex NOVA_VERSION=$(nova-manage --version 2>&1 | grep -Eo '[0-9]+[.][0-9]+[.][0-9]+') function manage_cells () { # NOTE(portdirect): check if nova fully supports cells v2, and manage # accordingly. Support was complete in ocata (V14.x.x). if [ "${NOVA_VERSION%%.*}" -gt "14" ]; then nova-manage cell_v2 map_cell0 nova-manage cell_v2 list_cells | grep -q " cell1 " || \ nova-manage cell_v2 create_cell --name=cell1 --verbose CELL0_ID=$(nova-manage cell_v2 list_cells | awk -F '|' '/ cell0 / { print $3 }' | tr -d ' ') CELL1_ID=$(nova-manage cell_v2 list_cells | awk -F '|' '/ cell1 / { print $3 }' | tr -d ' ') set +x CELL0_TRANSPORT=$(nova-manage cell_v2 list_cells | awk -F '|' '/ cell0 / { print $4 }' | tr -d ' ') if [ -z "${DB_CONNECTION_CELL0}" ]; then echo "ERROR: missing DB_CONNECTION_CELL0" exit 1 fi nova-manage cell_v2 update_cell \ --cell_uuid="${CELL0_ID}" \ --name="cell0" \ --transport-url="${CELL0_TRANSPORT}" \ --database_connection="${DB_CONNECTION_CELL0}" for VAR in TRANSPORT_URL DB_CONNECTION; do if [ -z "${!VAR}" ]; then echo "ERROR: missing $VAR variable" exit 1 fi done nova-manage cell_v2 update_cell \ --cell_uuid="${CELL1_ID}" \ --name="cell1" \ --transport-url="${TRANSPORT_URL}" \ --database_connection="${DB_CONNECTION}" set -x fi } # NOTE(aostapenko) Starting Wallaby nova-manage api_db version returns init version for empty database # greater than 0 # https://opendev.org/openstack/nova/src/branch/stable/wallaby/nova/db/sqlalchemy/migration.py#L32 # thus logic prior to this commit does not work. We need to either remove or justify and alter previous logic. nova-manage api_db sync manage_cells nova-manage db sync nova-manage db online_data_migrations echo 'Finished DB migrations' nova-compute-init.sh: ---- #!/bin/bash set -ex # Make the Nova Instances Dir as this is not autocreated. mkdir -p /var/lib/nova/instances # Set Ownership of nova dirs to the nova user chown ${NOVA_USER_UID} /var/lib/nova /var/lib/nova/instances migration_interface="" if [[ -z $migration_interface ]]; then # search for interface with default routing # If there is not default gateway, exit migration_network_cidr="0/0" if [ -z "${migration_network_cidr}" ] ; then migration_network_cidr="0/0" fi migration_interface=$(ip -4 route list ${migration_network_cidr} | awk -F 'dev' '{ print $2; exit }' | awk '{ print $1 }') || exit 1 fi migration_address=$(ip a s $migration_interface | grep 'inet ' | awk '{print $2}' | awk -F "/" '{print $1}' | head -1) if [ -z "${migration_address}" ] ; then echo "Var live_migration_interface is empty" exit 1 fi tee > /tmp/pod-shared/nova-libvirt.conf << EOF [libvirt] live_migration_inbound_addr = $migration_address EOF hypervisor_interface="" if [[ -z $hypervisor_interface ]]; then # search for interface with default routing # If there is not default gateway, exit hypervisor_network_cidr="0/0" if [ -z "${hypervisor_network_cidr}" ] ; then hypervisor_network_cidr="0/0" fi hypervisor_interface=$(ip -4 route list ${hypervisor_network_cidr} | awk -F 'dev' '{ print $2; exit }' | awk '{ print $1 }') || exit 1 fi hypervisor_address=$(ip a s $hypervisor_interface | grep 'inet ' | awk '{print $2}' | awk -F "/" '{print $1}' | head -1) if [ -z "${hypervisor_address}" ] ; then echo "Var my_ip is empty" exit 1 fi tee > /tmp/pod-shared/nova-hypervisor.conf << EOF [DEFAULT] my_ip = $hypervisor_address EOF tee > /tmp/pod-shared/nova-compute-fqdn.conf << EOF [DEFAULT] host = $(hostname --fqdn) EOF nova-console-proxy-init-assets.sh: ---- #!/bin/bash set -ex console_kind="novnc" if [ "${console_kind}" == "novnc" ] ; then cp -vaRf /usr/share/novnc/* /tmp/usr/share/novnc/ elif [ "${console_kind}" == "spice" ] ; then cp -vaRf /usr/share/spice-html5/* /tmp/usr/share/spice-html5/ fi rabbit-init.sh: ---- #!/bin/bash set -e # Extract connection details RABBIT_HOSTNAME=$(echo "${RABBITMQ_ADMIN_CONNECTION}" | \ awk -F'[@]' '{print $2}' | \ awk -F'[:/]' '{print $1}') RABBIT_PORT=$(echo "${RABBITMQ_ADMIN_CONNECTION}" | \ awk -F'[@]' '{print $2}' | \ awk -F'[:/]' '{print $2}') # Extract Admin User creadential RABBITMQ_ADMIN_USERNAME=$(echo "${RABBITMQ_ADMIN_CONNECTION}" | \ awk -F'[@]' '{print $1}' | \ awk -F'[//:]' '{print $4}') RABBITMQ_ADMIN_PASSWORD=$(echo "${RABBITMQ_ADMIN_CONNECTION}" | \ awk -F'[@]' '{print $1}' | \ awk -F'[//:]' '{print $5}' | \ sed 's/%/\\x/g' | \ xargs -0 printf "%b") # Extract User creadential RABBITMQ_USERNAME=$(echo "${RABBITMQ_USER_CONNECTION}" | \ awk -F'[@]' '{print $1}' | \ awk -F'[//:]' '{print $4}') RABBITMQ_PASSWORD=$(echo "${RABBITMQ_USER_CONNECTION}" | \ awk -F'[@]' '{print $1}' | \ awk -F'[//:]' '{print $5}' | \ sed 's/%/\\x/g' | \ xargs -0 printf "%b") # Extract User vHost RABBITMQ_VHOST=$(echo "${RABBITMQ_USER_CONNECTION}" | \ awk -F'[@]' '{print $2}' | \ awk -F'[:/]' '{print $3}') # Resolve vHost to / if no value is set RABBITMQ_VHOST="${RABBITMQ_VHOST:-/}" function rabbitmqadmin_cli () { if [ -n "$RABBITMQ_X509" ] then rabbitmqadmin \ --ssl \ --ssl-disable-hostname-verification \ --ssl-ca-cert-file="${USER_CERT_PATH}/ca.crt" \ --ssl-cert-file="${USER_CERT_PATH}/tls.crt" \ --ssl-key-file="${USER_CERT_PATH}/tls.key" \ --host="${RABBIT_HOSTNAME}" \ --port="${RABBIT_PORT}" \ --username="${RABBITMQ_ADMIN_USERNAME}" \ --password="${RABBITMQ_ADMIN_PASSWORD}" \ ${@} else rabbitmqadmin \ --host="${RABBIT_HOSTNAME}" \ --port="${RABBIT_PORT}" \ --username="${RABBITMQ_ADMIN_USERNAME}" \ --password="${RABBITMQ_ADMIN_PASSWORD}" \ ${@} fi } echo "Managing: User: ${RABBITMQ_USERNAME}" rabbitmqadmin_cli \ declare user \ name="${RABBITMQ_USERNAME}" \ password="${RABBITMQ_PASSWORD}" \ tags="user" echo "Deleting Guest User" rabbitmqadmin_cli \ delete user \ name="guest" || true if [ "${RABBITMQ_VHOST}" != "/" ] then echo "Managing: vHost: ${RABBITMQ_VHOST}" rabbitmqadmin_cli \ declare vhost \ name="${RABBITMQ_VHOST}" else echo "Skipping root vHost declaration: vHost: ${RABBITMQ_VHOST}" fi echo "Managing: Permissions: ${RABBITMQ_USERNAME} on ${RABBITMQ_VHOST}" rabbitmqadmin_cli \ declare permission \ vhost="${RABBITMQ_VHOST}" \ user="${RABBITMQ_USERNAME}" \ configure=".*" \ write=".*" \ read=".*" if [ ! -z "$RABBITMQ_AUXILIARY_CONFIGURATION" ] then echo "Applying additional configuration" echo "${RABBITMQ_AUXILIARY_CONFIGURATION}" > /tmp/rmq_definitions.json rabbitmqadmin_cli import /tmp/rmq_definitions.json fi wait-for-computes-init.sh: ---- #!/bin/bash set -ex # This runs in a bootstrap init container. It counts the number of compute nodes. COMPUTE_NODES=$(kubectl get nodes -o custom-columns=NAME:.metadata.name -l openstack-compute-node=enabled --no-headers | sort) /bin/echo $COMPUTE_NODES > /tmp/compute_nodes.txt cell-setup-init.sh: ---- #!/bin/bash set -ex until openstack compute service list --service nova-compute -f value -c State | grep -q "^up$" ;do echo "Waiting for Nova Compute processes to register" sleep 10 done ceph-admin-keyring.sh: ---- #!/bin/bash set -ex export HOME=/tmp cat > /etc/ceph/ceph.client.admin.keyring << EOF [client.admin] key = $(cat /tmp/client-keyring) EOF exit 0 nova-api-metadata-init.sh: ---- #!/bin/bash set -ex metadata_ip="" if [ -z "${metadata_ip}" ] ; then metadata_ip=$(getent hosts metadata | awk '{print $1}') fi cat </tmp/pod-shared/nova-api-metadata.ini [DEFAULT] metadata_host=$metadata_ip EOF nova-compute-ironic.sh: ---- #!/bin/bash set -ex exec nova-compute \ --config-file /etc/nova/nova.conf \ --config-file /etc/nova/nova-ironic.conf nova-conductor.sh: ---- #!/bin/bash set -x exec nova-conductor \ --config-file /etc/nova/nova.conf rally-test.sh: ---- #!/bin/bash set -ex : "${RALLY_ENV_NAME:="openstack-helm"}" : "${OS_INTERFACE:="public"}" : "${RALLY_CLEANUP:="true"}" if [ "x$RALLY_CLEANUP" == "xtrue" ]; then function rally_cleanup { openstack user delete \ --domain="${SERVICE_OS_USER_DOMAIN_NAME}" \ "${SERVICE_OS_USERNAME}" FLAVORS=$(openstack flavor list -f value --all | awk '$2 ~ /^s_rally_/ { print $1 }') if [ -n "$FLAVORS" ]; then echo $FLAVORS | xargs openstack flavor delete fi SERVERS=$(openstack server list -f value --all | awk '$2 ~ /^s_rally_/ { print $1 }') if [ -n "$SERVERS" ]; then echo $SERVERS | xargs openstack server delete fi IMAGES=$(openstack image list -f value | awk '$2 ~ /^c_rally_/ { print $1 }') if [ -n "$IMAGES" ]; then echo $IMAGES | xargs openstack image delete fi } trap rally_cleanup EXIT fi function create_or_update_db () { revisionResults=$(rally db revision) if [ $revisionResults = "None" ] then rally db create else rally db upgrade fi } create_or_update_db cat > /tmp/rally-config.json << EOF { "openstack": { "auth_url": "${OS_AUTH_URL}", "region_name": "${OS_REGION_NAME}", "endpoint_type": "${OS_INTERFACE}", "admin": { "username": "${OS_USERNAME}", "password": "${OS_PASSWORD}", "user_domain_name": "${OS_USER_DOMAIN_NAME}", "project_name": "${OS_PROJECT_NAME}", "project_domain_name": "${OS_PROJECT_DOMAIN_NAME}" }, "users": [ { "username": "${SERVICE_OS_USERNAME}", "password": "${SERVICE_OS_PASSWORD}", "project_name": "${SERVICE_OS_PROJECT_NAME}", "user_domain_name": "${SERVICE_OS_USER_DOMAIN_NAME}", "project_domain_name": "${SERVICE_OS_PROJECT_DOMAIN_NAME}" } ], "https_insecure": false, "https_cacert": "${OS_CACERT}" } } EOF rally deployment create --file /tmp/rally-config.json --name "${RALLY_ENV_NAME}" rm -f /tmp/rally-config.json rally deployment use "${RALLY_ENV_NAME}" rally deployment check rally task validate /etc/rally/rally_tests.yaml rally task start /etc/rally/rally_tests.yaml rally task sla-check rally env cleanup rally deployment destroy --deployment "${RALLY_ENV_NAME}" ssh-init.sh: ---- #!/bin/bash set -ex export NOVA_USERNAME=$(id -u ${NOVA_USER_UID} -n) export NOVA_USER_HOME=$(eval echo ~${NOVA_USERNAME}) mkdir -p ${NOVA_USER_HOME}/.ssh cat > ${NOVA_USER_HOME}/.ssh/config < 1: # Third time in, kill the previous process os.kill(int(data['pid']), signal.SIGTERM) else: data['exit_count'] = data.get('exit_count', 0) + 1 with open(pidfile, 'w') as f: json.dump(data, f) sys.exit(0) data['pid'] = os.getpid() data['exit_count'] = 0 with open(pidfile, 'w') as f: json.dump(data, f) test_rpc_liveness() sys.exit(0) # return success ssh-start.sh: ---- #!/bin/bash set -ex IFS=',' for KEY_TYPE in $KEY_TYPES; do KEY_PATH=/etc/ssh/ssh_host_${KEY_TYPE}_key if [[ ! -f "${KEY_PATH}" ]]; then ssh-keygen -q -t ${KEY_TYPE} -f ${KEY_PATH} -N "" fi done IFS='' subnet_address="0.0.0.0/0" if [ -z "${subnet_address}" ] ; then subnet_address="0.0.0.0/0" fi listen_interface=$(ip -4 route list ${subnet_address} | awk -F 'dev' '{ print $2; exit }' | awk '{ print $1 }') || exit 1 listen_address=$(ip a s $listen_interface | grep 'inet ' | awk '{print $2}' | awk -F "/" '{print $1}' | head -1) cat > /tmp/sshd_config_extend <> /etc/ssh/sshd_config rm /tmp/sshd_config_extend mkdir -p /run/sshd exec /usr/sbin/sshd -D -e -o Port=$SSH_PORT cell-setup.sh: ---- #!/bin/bash set -ex NOVA_VERSION=$(nova-manage --version 2>&1 | grep -Eo '[0-9]+[.][0-9]+[.][0-9]+') # NOTE(portdirect): check if nova fully supports cells v2, and manage # accordingly. Support was complete in ocata (V14.x.x). if [ "${NOVA_VERSION%%.*}" -gt "14" ]; then nova-manage cell_v2 discover_hosts --verbose fi nova-api-metadata.sh: ---- #!/bin/bash set -ex COMMAND="${@:-start}" function start () { exec uwsgi --ini /etc/nova/nova-metadata-uwsgi.ini } function stop () { kill -TERM 1 } $COMMAND nova-api.sh: ---- #!/bin/bash set -ex COMMAND="${@:-start}" function start () { exec uwsgi --ini /etc/nova/nova-api-uwsgi.ini } function stop () { kill -TERM 1 } $COMMAND nova-compute.sh: ---- #!/bin/bash set -ex exec nova-compute \ --config-file /etc/nova/nova.conf \ --config-file /tmp/pod-shared/nova-console.conf \ --config-file /tmp/pod-shared/nova-libvirt.conf \ --config-file /tmp/pod-shared/nova-compute-fqdn.conf \ --config-file /tmp/pod-shared/nova-hypervisor.conf nova-console-compute-init.sh: ---- #!/bin/bash set -ex console_kind="novnc" if [ "${console_kind}" == "novnc" ] ; then client_address="" client_interface="" client_network_cidr="0/0" listen_ip="0.0.0.0" elif [ "${console_kind}" == "spice" ] ; then client_address="" client_interface="" client_network_cidr="0/0" listen_ip="0.0.0.0" fi if [ -z "${client_address}" ] ; then if [ -z "${client_interface}" ] ; then if [ -z "${client_network_cidr}" ] ; then client_network_cidr="0/0" fi client_interface=$(ip -4 route list ${client_network_cidr} | awk -F 'dev' '{ print $2; exit }' | awk '{ print $1 }') || exit 1 fi # determine client ip dynamically based on interface provided client_address=$(ip a s $client_interface | grep 'inet ' | awk '{print $2}' | awk -F "/" '{print $1}' | head -1) fi if [ -z "${listen_ip}" ] ; then # The server component listens on all IP addresses and the proxy component # only listens on the management interface IP address of the compute node. listen_ip=0.0.0.0 fi touch /tmp/pod-shared/nova-console.conf if [ "${console_kind}" == "novnc" ] ; then cat > /tmp/pod-shared/nova-console.conf < /tmp/pod-shared/nova-console.conf </tmp/pod-shared/nova-vnc.ini [vnc] server_proxyclient_address = $client_address server_listen = $listen_ip novncproxy_host = $listen_ip EOF elif [ "${console_kind}" == "spice" ] ; then cat </tmp/pod-shared/nova-spice.ini [spice] server_proxyclient_address = $client_address server_listen = $listen_ip EOF fi fake-iptables.sh: ---- #!/bin/bash exit 0 nova-console-proxy.sh: ---- #!/bin/bash set -x console_kind="novnc" if [ "${console_kind}" == "novnc" ] ; then exec nova-novncproxy \ --config-file /etc/nova/nova.conf \ --config-file /tmp/pod-shared/nova-vnc.ini elif [ "${console_kind}" == "spice" ] ; then exec nova-spicehtml5proxy\ --config-file /etc/nova/nova.conf \ --config-file /tmp/pod-shared/nova-spice.ini fi nova-scheduler.sh: ---- #!/bin/bash set -xe exec nova-scheduler \ --config-file /etc/nova/nova.conf BinaryData ==== Events: