Canonical have relicensed the LXD project to AGPLv3. This means that we can no longer update the go LXD client without re-licensing GARM as AGPLv3. This is not desirable or possible. The existing code seems to be Apache 2.0 and all code that has already been contributed seems to stay as Apache 2.0, but new contributions from Canonical employees will be AGPLv3. We cannot risc including AGPLv3 code now or in the future, so we will separate the LXD provider into its own project which can be AGPLv3. GARM will simply execute the external provider. If the client code of LXD will ever be split from the main project and re-licensed as Apache 2.0 or a compatible license, we will reconsider adding it back as a native provider. Although in the long run, I believe external providers will be the only option as they are easier to write, easier to maintain and safer to ship (a bug in the provider does not crash GARM itself). Signed-off-by: Gabriel Adrian Samfira <gsamfira@cloudbasesolutions.com>
71 lines
2.3 KiB
Bash
Executable file
71 lines
2.3 KiB
Bash
Executable file
#!/usr/bin/env bash
|
|
set -o errexit
|
|
|
|
DIR="$(dirname $0)"
|
|
BINARIES_DIR="$PWD/bin"
|
|
CONTRIB_DIR="$PWD/contrib"
|
|
CONFIG_DIR="$PWD/test/integration/config"
|
|
CONFIG_DIR_PROV="$PWD/test/integration/provider"
|
|
PROVIDER_BIN_DIR="/opt/garm/providers.d/lxd"
|
|
LXD_PROVIDER_EXECUTABLE="$PROVIDER_BIN_DIR/garm-provider-lxd"
|
|
LXD_PROVIDER_CONFIG="$CONFIG_DIR/garm-provider-lxd.toml"
|
|
|
|
if [[ ! -f $BINARIES_DIR/garm ]] || [[ ! -f $BINARIES_DIR/garm-cli ]]; then
|
|
echo "ERROR: Please build GARM binaries first"
|
|
exit 1
|
|
fi
|
|
|
|
if [[ -z $GH_OAUTH_TOKEN ]]; then echo "ERROR: The env variable GH_OAUTH_TOKEN is not set"; exit 1; fi
|
|
if [[ -z $CREDENTIALS_NAME ]]; then echo "ERROR: The env variable CREDENTIALS_NAME is not set"; exit 1; fi
|
|
if [[ -z $GARM_BASE_URL ]]; then echo "ERROR: The env variable GARM_BASE_URL is not set"; exit 1; fi
|
|
|
|
# Generate a random 32-char secret for JWT_AUTH_SECRET and DB_PASSPHRASE.
|
|
function generate_secret() {
|
|
(tr -dc 'a-zA-Z0-9!@#$%^&*()_+?><~\`;' < /dev/urandom | head -c 32) 2>/dev/null
|
|
}
|
|
|
|
# Wait for a port to open at a given address.
|
|
function wait_open_port() {
|
|
local ADDRESS="$1"
|
|
local PORT="$2"
|
|
local TIMEOUT=30
|
|
SECONDS=0
|
|
while true; do
|
|
if [[ $SECONDS -gt $TIMEOUT ]]; then
|
|
echo "ERROR: Port $PORT didn't open at $ADDRESS within $TIMEOUT seconds"
|
|
return 1
|
|
fi
|
|
nc -v -w 5 -z "$ADDRESS" "$PORT" &>/dev/null && break || sleep 1
|
|
done
|
|
echo "Port $PORT at address $ADDRESS is open"
|
|
}
|
|
|
|
export JWT_AUTH_SECRET="$(generate_secret)"
|
|
export DB_PASSPHRASE="$(generate_secret)"
|
|
|
|
# Group "adm" is the LXD daemon group as set by the "canonical/setup-lxd" GitHub action.
|
|
sudo useradd --shell /usr/bin/false --system --groups adm --no-create-home garm
|
|
|
|
sudo mkdir -p $PROVIDER_BIN_DIR
|
|
git clone https://github.com/cloudbase/garm-provider-lxd ~/garm-provider-lxd
|
|
pushd ~/garm-provider-lxd
|
|
go build -o $PROVIDER_BIN_DIR/garm-provider-lxd
|
|
popd
|
|
|
|
sudo mkdir -p /etc/garm
|
|
cat $CONFIG_DIR/config.toml | envsubst | sudo tee /etc/garm/config.toml
|
|
sudo chown -R garm:garm /etc/garm
|
|
|
|
sudo mkdir /etc/garm/test-provider
|
|
sudo touch $CONFIG_DIR_PROV/config
|
|
sudo cp $CONFIG_DIR_PROV/* /etc/garm/test-provider
|
|
|
|
sudo mv $BINARIES_DIR/* /usr/local/bin/
|
|
sudo cp $CONTRIB_DIR/garm.service /etc/systemd/system/garm.service
|
|
|
|
sudo systemctl daemon-reload
|
|
sudo systemctl start garm
|
|
|
|
wait_open_port 127.0.0.1 9997
|
|
|
|
echo "GARM is up and running"
|