#!/bin/bash
set -euo pipefail

mysql -u root << 'SQL'
DROP DATABASE IF EXISTS neutron;
DROP USER IF EXISTS 'neutron'@'localhost';
DROP USER IF EXISTS 'neutron'@'%';
CREATE DATABASE neutron;
CREATE USER 'neutron'@'localhost' IDENTIFIED BY 'changeme';
CREATE USER 'neutron'@'%' IDENTIFIED BY 'changeme';
GRANT ALL PRIVILEGES ON neutron.* TO 'neutron'@'localhost';
GRANT ALL PRIVILEGES ON neutron.* TO 'neutron'@'%';
SQL

crudini --set /etc/neutron/neutron.conf database connection mysql+pymysql://neutron:changeme@localhost/neutron
crudini --set /etc/neutron/neutron.conf DEFAULT core_plugin ml2
crudini --set /etc/neutron/plugins/ml2/ml2_conf.ini ml2 type_drivers local
crudini --set /etc/neutron/plugins/ml2/ml2_conf.ini ml2 tenant_network_types local
crudini --set /etc/neutron/plugins/ml2/ml2_conf.ini ml2 mechanism_drivers ovn
crudini --set /etc/neutron/plugins/ml2/ml2_conf.ini ovn ovn_nb_connection tcp:127.0.0.1:6641
crudini --set /etc/neutron/plugins/ml2/ml2_conf.ini ovn ovn_sb_connection tcp:127.0.0.1:6642
crudini --set /etc/neutron/neutron_ovn_metadata_agent.ini DEFAULT nova_metadata_host 127.0.0.1
crudini --set /etc/neutron/neutron_ovn_metadata_agent.ini DEFAULT metadata_proxy_shared_secret secret

crudini --set /etc/nova/nova.conf api auth_strategy noauth2
crudini --set /etc/nova/nova.conf neutron service_metadata_proxy true
crudini --set /etc/nova/nova.conf neutron metadata_proxy_shared_secret secret
crudini --set /etc/nova/nova.conf DEFAULT enabled_apis metadata
crudini --set /etc/nova/nova.conf DEFAULT transport_url rabbit://guest:guest@localhost:5672/
crudini --set /etc/nova/nova.conf DEFAULT state_path /var/lib/nova
crudini --set /etc/nova/nova.conf DEFAULT my_ip 127.0.0.1
crudini --set /etc/nova/nova.conf DEFAULT use_neutron true
crudini --set /etc/nova/nova.conf DEFAULT debug true
crudini --set /etc/nova/nova.conf DEFAULT log_dir /var/log/nova
crudini --set /etc/nova/nova.conf oslo_concurrency lock_path /var/lib/nova/tmp
mkdir -p /var/lib/nova/tmp
mkdir -p /var/log/nova

ovn-nbctl set-connection ptcp:6641:0.0.0.0 -- set connection . inactivity_probe=60000
ovn-sbctl set-connection ptcp:6642:0.0.0.0 -- set connection . inactivity_probe=60000

neutron-db-manage upgrade head

DAEMONS=(apache2 neutron-ovn-metadata-agent)
for daemon in "${DAEMONS[@]}"; do
    service "$daemon" restart
    TIMEOUT=50
    while [ "$TIMEOUT" -gt 0 ]; do
        if service "$daemon" status > /dev/null; then
            break
        fi
        TIMEOUT=$((TIMEOUT - 1))
        sleep 0.5
    done
    if [ "$TIMEOUT" -le 0 ]; then
        echo "ERROR: ${daemon} failed to start"
        tail -100 /var/log/neutron/*.log || true
        tail -100 /var/log/apache2/* || true
        exit 1
    fi
done

cat > /tmp/nova-metadata-test.conf <<'CONF'
[DEFAULT]
metadata_workers = 1
[api]
auth_strategy = noauth2
[neutron]
service_metadata_proxy = true
metadata_proxy_shared_secret = secret
CONF

/usr/bin/python3 - <<'PY'
import gzip
import io
from unittest import mock

from neutron.common import metadata

request = type('Req', (), {'http_version': 'HTTP/1.1'})()
body = b'{"uuid": "demo"}'
buf = io.BytesIO()
with gzip.GzipFile(fileobj=buf, mode='wb') as gz:
    gz.write(body)
compressed = buf.getvalue()

def build_response(content, headers):
    response = mock.Mock()
    response.headers = headers
    response.content = content
    response.status_code = 200
    response.encoding = 'utf-8'
    return response

compressed_response = build_response(compressed, {'content-length': str(len(compressed))})
out = metadata.MetadataProxyHandlerBaseSocketServer._http_response(compressed_response, request)
assert body.decode() in out.decode('utf-8')

plain_response = build_response(body, {'content-length': str(len(body)), 'content-encoding': 'gzip'})
out = metadata.MetadataProxyHandlerBaseSocketServer._http_response(plain_response, request)
assert body.decode() in out.decode('utf-8')
PY
