1030 строки
30 KiB
Bash
Executable File
1030 строки
30 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# ghe-restore command tests
|
|
|
|
# Bring in testlib
|
|
# shellcheck source=test/testlib.sh
|
|
. "$(dirname "$0")/testlib.sh"
|
|
|
|
setup_test_data "$GHE_DATA_DIR/1"
|
|
setup_actions_enabled_settings_for_restore true
|
|
|
|
# Make the current symlink
|
|
ln -s 1 "$GHE_DATA_DIR/current"
|
|
|
|
begin_test "ghe-restore-snapshot-path reports an error when current symlink doesn't exist"
|
|
(
|
|
set -e
|
|
rm "$GHE_DATA_DIR/current"
|
|
|
|
ghe-restore-snapshot-path > "$TRASHDIR/restore-out" 2>&1 || true
|
|
ln -s 1 "$GHE_DATA_DIR/current"
|
|
grep -q "Error: Snapshot 'current' doesn't exist." "$TRASHDIR/restore-out"
|
|
)
|
|
end_test
|
|
|
|
begin_test "ghe-restore-snapshot-path reports an error when specified snapshot doesn't exist"
|
|
(
|
|
set -e
|
|
rm "$GHE_DATA_DIR/current"
|
|
|
|
ghe-restore-snapshot-path foo > "$TRASHDIR/restore-out" 2>&1 || true
|
|
ln -s 1 "$GHE_DATA_DIR/current"
|
|
grep -q "Error: Snapshot 'foo' doesn't exist." "$TRASHDIR/restore-out"
|
|
)
|
|
end_test
|
|
|
|
begin_test "ghe-restore into configured vm"
|
|
(
|
|
set -e
|
|
rm -rf "$GHE_REMOTE_ROOT_DIR"
|
|
setup_remote_metadata
|
|
|
|
# set as configured, enable maintenance mode and create required directories
|
|
setup_maintenance_mode "configured"
|
|
|
|
# set restore host environ var
|
|
GHE_RESTORE_HOST=127.0.0.1
|
|
export GHE_RESTORE_HOST
|
|
|
|
# run ghe-restore and write output to file for asserting against
|
|
if ! GHE_DEBUG=1 ghe-restore -v -f > "$TRASHDIR/restore-out" 2>&1; then
|
|
cat "$TRASHDIR/restore-out"
|
|
: ghe-restore should have exited successfully
|
|
false
|
|
fi
|
|
|
|
# for debugging
|
|
cat "$TRASHDIR/restore-out"
|
|
|
|
# verify connect to right host
|
|
grep -q "Connect 127.0.0.1:122 OK" "$TRASHDIR/restore-out"
|
|
|
|
# verify stale servers were cleared
|
|
grep -q "Cleaning up stale nodes ..." "$TRASHDIR/restore-out"
|
|
|
|
# Verify all the data we've restored is as expected
|
|
verify_all_restored_data
|
|
)
|
|
end_test
|
|
|
|
begin_test "ghe-restore logs the benchmark"
|
|
(
|
|
set -e
|
|
|
|
export BM_TIMESTAMP=foo
|
|
export GHE_RESTORE_HOST=127.0.0.1
|
|
ghe-restore -v -f
|
|
[ "$(grep took $GHE_DATA_DIR/current/benchmarks/benchmark.foo.log | wc -l)" -gt 1 ]
|
|
)
|
|
end_test
|
|
|
|
begin_test "ghe-restore aborts without user verification"
|
|
(
|
|
set -e
|
|
rm -rf "$GHE_REMOTE_ROOT_DIR"
|
|
setup_remote_metadata
|
|
|
|
# set as configured, enable maintenance mode and create required directories
|
|
setup_maintenance_mode "configured"
|
|
|
|
# set restore host environ var
|
|
GHE_RESTORE_HOST=127.0.0.1
|
|
export GHE_RESTORE_HOST
|
|
|
|
# run ghe-restore and write output to file for asserting against
|
|
if echo "no" | ghe-restore -v > "$TRASHDIR/restore-out" 2>&1; then
|
|
cat "$TRASHDIR/restore-out"
|
|
false # ghe-restore should have exited non-zero
|
|
fi
|
|
|
|
grep -q "Restore aborted" "$TRASHDIR/restore-out"
|
|
)
|
|
end_test
|
|
|
|
begin_test "ghe-restore accepts user verification"
|
|
(
|
|
set -e
|
|
rm -rf "$GHE_REMOTE_ROOT_DIR"
|
|
setup_remote_metadata
|
|
|
|
# set as configured, enable maintenance mode and create required directories
|
|
setup_maintenance_mode "configured"
|
|
|
|
# set restore host environ var
|
|
GHE_RESTORE_HOST=127.0.0.1
|
|
export GHE_RESTORE_HOST
|
|
|
|
# run ghe-restore and write output to file for asserting against
|
|
if ! echo "yes" | ghe-restore -v > "$TRASHDIR/restore-out" 2>&1; then
|
|
cat "$TRASHDIR/restore-out"
|
|
false # ghe-restore should have accepted the input
|
|
fi
|
|
)
|
|
end_test
|
|
|
|
begin_test "ghe-restore -c into unconfigured vm"
|
|
(
|
|
set -e
|
|
rm -rf "$GHE_REMOTE_ROOT_DIR"
|
|
setup_remote_metadata
|
|
|
|
# set restore host environ var
|
|
GHE_RESTORE_HOST=127.0.0.1
|
|
export GHE_RESTORE_HOST
|
|
|
|
# leave unconfigured, enable maintenance mode and create required directories
|
|
setup_maintenance_mode
|
|
|
|
# run ghe-restore and write output to file for asserting against
|
|
if ! ghe-restore -v -f -c > "$TRASHDIR/restore-out" 2>&1; then
|
|
cat "$TRASHDIR/restore-out"
|
|
false
|
|
fi
|
|
|
|
# verify connect to right host
|
|
grep -q "Connect 127.0.0.1:122 OK" "$TRASHDIR/restore-out"
|
|
|
|
# verify attempt to clear stale servers was not made
|
|
grep -q "Cleaning up stale nodes ..." "$TRASHDIR/restore-out" && {
|
|
echo "Unconfigured nodes should not be cleaned up."
|
|
exit 1
|
|
}
|
|
|
|
# Verify all the data we've restored is as expected
|
|
verify_all_restored_data
|
|
)
|
|
end_test
|
|
|
|
begin_test "ghe-restore into unconfigured vm"
|
|
(
|
|
set -e
|
|
rm -rf "$GHE_REMOTE_ROOT_DIR"
|
|
setup_remote_metadata
|
|
|
|
# set restore host environ var
|
|
GHE_RESTORE_HOST=127.0.0.1
|
|
export GHE_RESTORE_HOST
|
|
|
|
# leave unconfigured, enable maintenance mode and create required directories
|
|
setup_maintenance_mode
|
|
|
|
# ghe-restore into an unconfigured vm implies -c
|
|
ghe-restore -v -f > "$TRASHDIR/restore-out" 2>&1
|
|
cat "$TRASHDIR/restore-out"
|
|
|
|
# verify no config run after restore on unconfigured instance
|
|
! grep -q "ghe-config-apply OK" "$TRASHDIR/restore-out"
|
|
|
|
# verify connect to right host
|
|
grep -q "Connect 127.0.0.1:122 OK" "$TRASHDIR/restore-out"
|
|
|
|
# verify attempt to clear stale servers was not made
|
|
grep -q "Cleaning up stale nodes ..." "$TRASHDIR/restore-out" && {
|
|
echo "Unconfigured nodes should not be cleaned up."
|
|
exit 1
|
|
}
|
|
|
|
# Verify all the data we've restored is as expected
|
|
verify_all_restored_data
|
|
)
|
|
end_test
|
|
|
|
begin_test "ghe-restore with host arg and config value"
|
|
(
|
|
set -e
|
|
rm -rf "$GHE_REMOTE_ROOT_DIR"
|
|
setup_remote_metadata
|
|
|
|
# set as configured, enable maintenance mode and create required directories
|
|
setup_maintenance_mode "configured"
|
|
|
|
# set restore host environ var (which we shouldn't see)
|
|
GHE_RESTORE_HOST="broken.config.restore.host"
|
|
export GHE_RESTORE_HOST
|
|
|
|
# set restore host config var (which we shouldn't see)
|
|
GHE_BACKUP_CONFIG_TEMP="$TRASHDIR/backup.config.temp"
|
|
cp "$GHE_BACKUP_CONFIG" "$GHE_BACKUP_CONFIG_TEMP"
|
|
echo 'GHE_RESTORE_HOST="broken.config.restore.host"' >> "$GHE_BACKUP_CONFIG_TEMP"
|
|
GHE_BACKUP_CONFIG="$GHE_BACKUP_CONFIG_TEMP"
|
|
export GHE_BACKUP_CONFIG
|
|
|
|
# run it
|
|
output="$(ghe-restore -f localhost)" || false
|
|
|
|
# clean up the config file
|
|
rm "$GHE_BACKUP_CONFIG_TEMP"
|
|
|
|
# verify host arg overrides configured restore host
|
|
echo "$output" | grep -q 'Connect localhost:122 OK'
|
|
|
|
# Verify all the data we've restored is as expected
|
|
verify_all_restored_data
|
|
)
|
|
end_test
|
|
|
|
begin_test "ghe-restore with host arg"
|
|
(
|
|
set -e
|
|
rm -rf "$GHE_REMOTE_ROOT_DIR"
|
|
setup_remote_metadata
|
|
|
|
# set as configured, enable maintenance mode and create required directories
|
|
setup_maintenance_mode "configured"
|
|
|
|
# set restore host environ var
|
|
GHE_RESTORE_HOST="broken.environ.restore.host"
|
|
export GHE_RESTORE_HOST
|
|
|
|
# run it
|
|
output="$(ghe-restore -f localhost)" || false
|
|
|
|
# verify host arg overrides configured restore host
|
|
echo "$output" | grep -q 'Connect localhost:122 OK'
|
|
|
|
# Verify all the data we've restored is as expected
|
|
verify_all_restored_data
|
|
)
|
|
end_test
|
|
|
|
begin_test "ghe-restore no host arg or configured restore host"
|
|
(
|
|
set -e
|
|
rm -rf "$GHE_REMOTE_ROOT_DIR"
|
|
setup_remote_metadata
|
|
|
|
# set as configured, enable maintenance mode and create required directories
|
|
setup_maintenance_mode "configured"
|
|
|
|
# unset configured restore host
|
|
unset GHE_RESTORE_HOST
|
|
|
|
# verify running ghe-restore fails
|
|
! ghe-restore -f
|
|
)
|
|
end_test
|
|
|
|
begin_test "ghe-restore with no pages backup"
|
|
(
|
|
set -e
|
|
rm -rf "$GHE_REMOTE_ROOT_DIR"
|
|
setup_remote_metadata
|
|
|
|
# set as configured, enable maintenance mode and create required directories
|
|
setup_maintenance_mode "configured"
|
|
|
|
# remove pages data
|
|
rm -rf "$GHE_DATA_DIR/1/pages"
|
|
|
|
# run it
|
|
ghe-restore -v -f localhost
|
|
)
|
|
end_test
|
|
|
|
begin_test "ghe-restore does not restore encrypted column encryption keying material for versions below 3.7.0"
|
|
(
|
|
GHE_REMOTE_VERSION=2.1.10 ghe-restore -v -f localhost | grep -q "encrypted column encryption keying material not set" && exit 1
|
|
[ ! -f "$GHE_DATA_DIR/current/encrypted-column-keying-material" ]
|
|
|
|
GHE_REMOTE_VERSION=3.6.1 ghe-restore -v -f localhost | grep -q "encrypted column encryption keying material not set" && exit 1
|
|
[ ! -f "$GHE_DATA_DIR/current/encrypted-column-keying-material" ]
|
|
|
|
)
|
|
end_test
|
|
|
|
begin_test "ghe-restore with encrypted column encryption keying material for versions 3.7.0+"
|
|
(
|
|
set -e
|
|
rm -rf "$GHE_REMOTE_ROOT_DIR"
|
|
setup_remote_metadata
|
|
|
|
required_files=(
|
|
"encrypted-column-encryption-keying-material"
|
|
)
|
|
|
|
for file in "${required_files[@]}"; do
|
|
echo "foo" > "$GHE_DATA_DIR/current/$file"
|
|
done
|
|
|
|
# GHES version 3.7.0
|
|
GHE_REMOTE_VERSION=3.7.0
|
|
export GHE_REMOTE_VERSION
|
|
|
|
ghe-restore -v -f localhost
|
|
required_secrets=(
|
|
"secrets.github.encrypted-column-keying-material"
|
|
)
|
|
|
|
for secret in "${required_secrets[@]}"; do
|
|
[ "$(ghe-ssh "$GHE_HOSTNAME" -- ghe-config "$secret")" = "foo" ]
|
|
done
|
|
|
|
# GHES version 3.8.0
|
|
GHE_REMOTE_VERSION=3.8.0
|
|
export GHE_REMOTE_VERSION
|
|
|
|
ghe-restore -v -f localhost
|
|
required_secrets=(
|
|
"secrets.github.encrypted-column-keying-material"
|
|
)
|
|
|
|
for secret in "${required_secrets[@]}"; do
|
|
[ "$(ghe-ssh "$GHE_HOSTNAME" -- ghe-config "$secret")" = "foo" ]
|
|
done
|
|
)
|
|
end_test
|
|
|
|
|
|
begin_test "ghe-restore does not encrypted column current encryption key for versions below 3.8.0"
|
|
(
|
|
GHE_REMOTE_VERSION=2.1.10 restore -v -f | grep -q "encrypted column current encryption key not set" && exit 1
|
|
[ ! -f "$GHE_DATA_DIR/current/encrypted-column-current-encryption-key" ]
|
|
|
|
GHE_REMOTE_VERSION=3.7.0 restore -v -f | grep -q "encrypted column current encryption key not set" && exit 1
|
|
[ ! -f "$GHE_DATA_DIR/current/encrypted-column-current-encryption-key" ]
|
|
|
|
)
|
|
end_test
|
|
|
|
begin_test "ghe-restore with encrypted column current encryption key for versions 3.8.0+"
|
|
(
|
|
set -e
|
|
rm -rf "$GHE_REMOTE_ROOT_DIR"
|
|
setup_remote_metadata
|
|
|
|
required_files=(
|
|
"encrypted-column-current-encryption-key"
|
|
)
|
|
|
|
for file in "${required_files[@]}"; do
|
|
echo "foo" > "$GHE_DATA_DIR/current/$file"
|
|
done
|
|
|
|
# GHES version 3.8.0
|
|
GHE_REMOTE_VERSION=3.8.0
|
|
export GHE_REMOTE_VERSION
|
|
|
|
ghe-restore -v -f localhost
|
|
required_secrets=(
|
|
"secrets.github.encrypted-column-current-encryption-key"
|
|
)
|
|
|
|
for secret in "${required_secrets[@]}"; do
|
|
[ "$(ghe-ssh "$GHE_HOSTNAME" -- ghe-config "$secret")" = "foo" ]
|
|
done
|
|
|
|
|
|
# GHES version 3.9.0
|
|
GHE_REMOTE_VERSION=3.9.0
|
|
export GHE_REMOTE_VERSION
|
|
|
|
ghe-restore -v -f localhost
|
|
required_secrets=(
|
|
"secrets.github.encrypted-column-current-encryption-key"
|
|
)
|
|
|
|
for secret in "${required_secrets[@]}"; do
|
|
[ "$(ghe-ssh "$GHE_HOSTNAME" -- ghe-config "$secret")" = "foo" ]
|
|
done
|
|
)
|
|
end_test
|
|
|
|
begin_test "ghe-restore with secret scanning encrypted secrets encryption keys for versions below 3.8.0"
|
|
(
|
|
set -e
|
|
rm -rf "$GHE_REMOTE_ROOT_DIR"
|
|
setup_remote_metadata
|
|
|
|
required_files=(
|
|
"secret-scanning-encrypted-secrets-current-storage-key"
|
|
"secret-scanning-encrypted-secrets-delimited-storage-keys"
|
|
"secret-scanning-encrypted-secrets-current-shared-transit-key"
|
|
"secret-scanning-encrypted-secrets-delimited-shared-transit-keys"
|
|
)
|
|
|
|
for file in "${required_files[@]}"; do
|
|
echo "foo" >"$GHE_DATA_DIR/current/$file"
|
|
done
|
|
|
|
GHE_REMOTE_VERSION=3.7.0 ghe-restore -v -f localhost
|
|
|
|
required_secrets=(
|
|
"secrets.secret-scanning.encrypted-secrets-current-storage-key"
|
|
"secrets.secret-scanning.encrypted-secrets-delimited-storage-keys"
|
|
"secrets.secret-scanning.encrypted-secrets-current-shared-transit-key"
|
|
"secrets.secret-scanning.encrypted-secrets-delimited-shared-transit-keys"
|
|
)
|
|
|
|
for secret in "${required_secrets[@]}"; do
|
|
[ "$(ghe-ssh "$GHE_HOSTNAME" -- ghe-config "$secret")" = "" ] # expecting these to not be set for versions below 3.8.0
|
|
done
|
|
)
|
|
end_test
|
|
|
|
|
|
begin_test "ghe-restore with secret scanning encrypted secrets encryption keys for versions 3.8.0+"
|
|
(
|
|
set -e
|
|
rm -rf "$GHE_REMOTE_ROOT_DIR"
|
|
setup_remote_metadata
|
|
|
|
required_files=(
|
|
"secret-scanning-encrypted-secrets-current-storage-key"
|
|
"secret-scanning-encrypted-secrets-delimited-storage-keys"
|
|
"secret-scanning-encrypted-secrets-current-shared-transit-key"
|
|
"secret-scanning-encrypted-secrets-delimited-shared-transit-keys"
|
|
)
|
|
|
|
for file in "${required_files[@]}"; do
|
|
echo "foo" >"$GHE_DATA_DIR/current/$file"
|
|
done
|
|
|
|
GHE_REMOTE_VERSION=3.8.0 ghe-restore -v -f localhost
|
|
|
|
required_secrets=(
|
|
"secrets.secret-scanning.encrypted-secrets-current-storage-key"
|
|
"secrets.secret-scanning.encrypted-secrets-delimited-storage-keys"
|
|
"secrets.secret-scanning.encrypted-secrets-current-shared-transit-key"
|
|
"secrets.secret-scanning.encrypted-secrets-delimited-shared-transit-keys"
|
|
)
|
|
|
|
for secret in "${required_secrets[@]}"; do
|
|
[ "$(ghe-ssh "$GHE_HOSTNAME" -- ghe-config "$secret")" = "foo" ] # expecting this to have been restored successfully for versions 3.8.0+
|
|
done
|
|
)
|
|
end_test
|
|
|
|
# Setup Actions data for the subsequent tests
|
|
setup_actions_test_data "$GHE_DATA_DIR/1"
|
|
|
|
begin_test "ghe-restore invokes ghe-import-mssql"
|
|
(
|
|
set -e
|
|
rm -rf "$GHE_REMOTE_ROOT_DIR"
|
|
setup_remote_metadata
|
|
enable_actions
|
|
|
|
# enable maintenance mode and create required directories
|
|
setup_maintenance_mode
|
|
|
|
# set restore host environ var
|
|
GHE_RESTORE_HOST=127.0.0.1
|
|
export GHE_RESTORE_HOST
|
|
|
|
# run ghe-restore and write output to file for asserting against
|
|
if ! ghe-restore -v -f > "$TRASHDIR/restore-out" 2>&1; then
|
|
cat "$TRASHDIR/restore-out"
|
|
: ghe-restore should have exited successfully
|
|
false
|
|
fi
|
|
|
|
grep -q "Restoring MSSQL database" "$TRASHDIR/restore-out"
|
|
grep -q "ghe-import-mssql .* OK" "$TRASHDIR/restore-out"
|
|
)
|
|
end_test
|
|
|
|
begin_test "ghe-restore with Kredz settings"
|
|
(
|
|
set -e
|
|
rm -rf "$GHE_REMOTE_ROOT_DIR"
|
|
setup_remote_metadata
|
|
enable_actions
|
|
|
|
required_files=(
|
|
"kredz-credz-hmac"
|
|
)
|
|
|
|
for file in "${required_files[@]}"; do
|
|
echo "foo" > "$GHE_DATA_DIR/current/$file"
|
|
done
|
|
|
|
ghe-restore -v -f localhost
|
|
required_secrets=(
|
|
"secrets.kredz.credz-hmac-secret"
|
|
)
|
|
|
|
for secret in "${required_secrets[@]}"; do
|
|
[ "$(ghe-ssh "$GHE_HOSTNAME" -- ghe-config "$secret")" = "foo" ]
|
|
done
|
|
)
|
|
end_test
|
|
|
|
begin_test "ghe-restore with kredz-varz settings"
|
|
(
|
|
set -e
|
|
rm -rf "$GHE_REMOTE_ROOT_DIR"
|
|
setup_remote_metadata
|
|
enable_actions
|
|
|
|
required_files=(
|
|
"kredz-varz-hmac"
|
|
)
|
|
|
|
for file in "${required_files[@]}"; do
|
|
echo "foo" > "$GHE_DATA_DIR/current/$file"
|
|
done
|
|
|
|
ghe-restore -v -f localhost
|
|
required_secrets=(
|
|
"secrets.kredz.varz-hmac-secret"
|
|
)
|
|
|
|
for secret in "${required_secrets[@]}"; do
|
|
[ "$(ghe-ssh "$GHE_HOSTNAME" -- ghe-config "$secret")" = "foo" ]
|
|
done
|
|
)
|
|
end_test
|
|
|
|
begin_test "ghe-restore with Actions settings"
|
|
(
|
|
set -e
|
|
rm -rf "$GHE_REMOTE_ROOT_DIR"
|
|
setup_remote_metadata
|
|
enable_actions
|
|
|
|
required_files=(
|
|
"actions-config-db-login"
|
|
"actions-config-db-password"
|
|
"actions-framework-access-token"
|
|
"actions-url-signing-hmac-key-primary"
|
|
"actions-url-signing-hmac-key-secondary"
|
|
"actions-oauth-s2s-signing-cert"
|
|
"actions-oauth-s2s-signing-key"
|
|
"actions-oauth-s2s-signing-cert-thumbprint"
|
|
"actions-primary-encryption-cert-thumbprint"
|
|
"actions-aad-cert-thumbprint"
|
|
"actions-delegated-auth-cert-thumbprint"
|
|
"actions-runtime-service-principal-cert"
|
|
"actions-s2s-encryption-cert"
|
|
"actions-secondary-encryption-cert-thumbprint"
|
|
"actions-service-principal-cert"
|
|
"actions-sps-validation-cert-thumbprint"
|
|
|
|
"actions-launch-secrets-private-key"
|
|
"actions-launch-deployer-hmac"
|
|
"actions-launch-client-id"
|
|
"actions-launch-client-secret"
|
|
"actions-launch-receiver-webhook-secret"
|
|
"actions-launch-app-private-key"
|
|
"actions-launch-app-public-key"
|
|
"actions-launch-app-id"
|
|
"actions-launch-app-relay-id"
|
|
"actions-launch-action-runner-secret"
|
|
"actions-launch-azp-app-cert"
|
|
"actions-launch-app-app-private-key"
|
|
|
|
)
|
|
|
|
for file in "${required_files[@]}"; do
|
|
echo "foo" > "$GHE_DATA_DIR/current/$file"
|
|
done
|
|
|
|
ghe-restore -v -f localhost
|
|
|
|
required_secrets=(
|
|
"secrets.actions.ConfigurationDatabaseSqlLogin"
|
|
"secrets.actions.ConfigurationDatabaseSqlPassword"
|
|
"secrets.actions.FrameworkAccessTokenKeySecret"
|
|
"secrets.actions.UrlSigningHmacKeyPrimary"
|
|
"secrets.actions.UrlSigningHmacKeySecondary"
|
|
"secrets.actions.OAuthS2SSigningCert"
|
|
"secrets.actions.OAuthS2SSigningKey"
|
|
"secrets.actions.OAuthS2SSigningCertThumbprint"
|
|
"secrets.actions.PrimaryEncryptionCertificateThumbprint"
|
|
"secrets.actions.AADCertThumbprint"
|
|
"secrets.actions.DelegatedAuthCertThumbprint"
|
|
"secrets.actions.RuntimeServicePrincipalCertificate"
|
|
"secrets.actions.S2SEncryptionCertificate"
|
|
"secrets.actions.SecondaryEncryptionCertificateThumbprint"
|
|
"secrets.actions.ServicePrincipalCertificate"
|
|
"secrets.actions.SpsValidationCertThumbprint"
|
|
|
|
"secrets.launch.actions-secrets-private-key"
|
|
"secrets.launch.deployer-hmac-secret"
|
|
"secrets.launch.client-id"
|
|
"secrets.launch.client-secret"
|
|
"secrets.launch.receiver-webhook-secret"
|
|
"secrets.launch.app-private-key"
|
|
"secrets.launch.app-public-key"
|
|
"secrets.launch.app-id"
|
|
"secrets.launch.app-relay-id"
|
|
"secrets.launch.action-runner-secret"
|
|
"secrets.launch.token-oauth-key"
|
|
"secrets.launch.token-oauth-cert"
|
|
"secrets.launch.azp-app-cert"
|
|
"secrets.launch.azp-app-private-key"
|
|
|
|
)
|
|
|
|
for secret in "${required_secrets[@]}"; do
|
|
[ "$(ghe-ssh "$GHE_HOSTNAME" -- ghe-config "$secret")" = "foo" ]
|
|
done
|
|
)
|
|
end_test
|
|
|
|
begin_test "ghe-restore with Actions settings passing -c"
|
|
(
|
|
set -e
|
|
rm -rf "$GHE_REMOTE_ROOT_DIR"
|
|
setup_remote_metadata
|
|
enable_actions
|
|
|
|
required_files=(
|
|
"actions-config-db-login"
|
|
"actions-config-db-password"
|
|
"actions-framework-access-token"
|
|
"actions-url-signing-hmac-key-primary"
|
|
"actions-url-signing-hmac-key-secondary"
|
|
"actions-oauth-s2s-signing-cert"
|
|
"actions-oauth-s2s-signing-key"
|
|
"actions-oauth-s2s-signing-cert-thumbprint"
|
|
"actions-primary-encryption-cert-thumbprint"
|
|
"actions-aad-cert-thumbprint"
|
|
"actions-delegated-auth-cert-thumbprint"
|
|
"actions-runtime-service-principal-cert"
|
|
"actions-s2s-encryption-cert"
|
|
"actions-secondary-encryption-cert-thumbprint"
|
|
"actions-service-principal-cert"
|
|
"actions-sps-validation-cert-thumbprint"
|
|
"actions-storage-container-prefix"
|
|
|
|
"actions-launch-secrets-private-key"
|
|
"actions-launch-deployer-hmac"
|
|
"actions-launch-client-id"
|
|
"actions-launch-client-secret"
|
|
"actions-launch-receiver-webhook-secret"
|
|
"actions-launch-app-private-key"
|
|
"actions-launch-app-public-key"
|
|
"actions-launch-app-id"
|
|
"actions-launch-app-relay-id"
|
|
"actions-launch-action-runner-secret"
|
|
"actions-launch-azp-app-cert"
|
|
"actions-launch-app-app-private-key"
|
|
|
|
)
|
|
|
|
for file in "${required_files[@]}"; do
|
|
echo "foo" > "$GHE_DATA_DIR/current/$file"
|
|
done
|
|
|
|
ghe-restore -v -f -c localhost
|
|
|
|
required_secrets=(
|
|
"secrets.actions.ConfigurationDatabaseSqlLogin"
|
|
"secrets.actions.ConfigurationDatabaseSqlPassword"
|
|
"secrets.actions.FrameworkAccessTokenKeySecret"
|
|
"secrets.actions.UrlSigningHmacKeyPrimary"
|
|
"secrets.actions.UrlSigningHmacKeySecondary"
|
|
"secrets.actions.OAuthS2SSigningCert"
|
|
"secrets.actions.OAuthS2SSigningKey"
|
|
"secrets.actions.OAuthS2SSigningCertThumbprint"
|
|
"secrets.actions.PrimaryEncryptionCertificateThumbprint"
|
|
"secrets.actions.AADCertThumbprint"
|
|
"secrets.actions.DelegatedAuthCertThumbprint"
|
|
"secrets.actions.RuntimeServicePrincipalCertificate"
|
|
"secrets.actions.S2SEncryptionCertificate"
|
|
"secrets.actions.SecondaryEncryptionCertificateThumbprint"
|
|
"secrets.actions.ServicePrincipalCertificate"
|
|
"secrets.actions.SpsValidationCertThumbprint"
|
|
"secrets.actions.storage.container-prefix"
|
|
"secrets.launch.actions-secrets-private-key"
|
|
"secrets.launch.deployer-hmac-secret"
|
|
"secrets.launch.client-id"
|
|
"secrets.launch.client-secret"
|
|
"secrets.launch.receiver-webhook-secret"
|
|
"secrets.launch.app-private-key"
|
|
"secrets.launch.app-public-key"
|
|
"secrets.launch.app-id"
|
|
"secrets.launch.app-relay-id"
|
|
"secrets.launch.action-runner-secret"
|
|
"secrets.launch.token-oauth-key"
|
|
"secrets.launch.token-oauth-cert"
|
|
"secrets.launch.azp-app-cert"
|
|
"secrets.launch.azp-app-private-key"
|
|
|
|
)
|
|
|
|
for secret in "${required_secrets[@]}"; do
|
|
[ "$(ghe-ssh "$GHE_HOSTNAME" -- ghe-config "$secret")" = "foo" ]
|
|
done
|
|
)
|
|
end_test
|
|
|
|
begin_test "ghe-restore stops and starts Actions"
|
|
(
|
|
set -e
|
|
rm -rf "$GHE_REMOTE_ROOT_DIR"
|
|
setup_remote_metadata
|
|
enable_actions
|
|
|
|
setup_maintenance_mode "configured"
|
|
|
|
output=$(ghe-restore -v -f localhost 2>&1)
|
|
|
|
echo "$output" | grep -q "ghe-actions-stop .* OK"
|
|
echo "$output" | grep -q "ghe-actions-start .* OK"
|
|
)
|
|
end_test
|
|
|
|
begin_test "ghe-restore does not attempt to start Actions during cleanup if they never have been stopped"
|
|
(
|
|
set -e
|
|
rm -rf "$GHE_REMOTE_ROOT_DIR"
|
|
setup_remote_metadata
|
|
enable_actions
|
|
|
|
setup_maintenance_mode "configured"
|
|
# We are not in maintance mode which means that we don't stop Actions and abort early.
|
|
disable_maintenance_mode
|
|
|
|
! output=$(ghe-restore -v -f localhost 2>&1)
|
|
|
|
! echo "$output" | grep -q "ghe-actions-stop"
|
|
! echo "$output" | grep -q "ghe-actions-start"
|
|
)
|
|
end_test
|
|
|
|
begin_test "ghe-restore with Actions data"
|
|
(
|
|
set -e
|
|
rm -rf "$GHE_REMOTE_ROOT_DIR"
|
|
setup_remote_metadata
|
|
enable_actions
|
|
|
|
setup_maintenance_mode "configured"
|
|
|
|
output=$(ghe-restore -v -f localhost 2>&1)
|
|
|
|
echo "$output" | grep -q "Transferring Actions files to"
|
|
|
|
diff -ru "$GHE_REMOTE_DATA_USER_DIR/actions" "$GHE_DATA_DIR/current/actions"
|
|
)
|
|
end_test
|
|
|
|
begin_test "ghe-restore fails if Actions is disabled but the snapshot contains Actions data"
|
|
(
|
|
set -e
|
|
rm -rf "$GHE_REMOTE_ROOT_DIR"
|
|
setup_remote_metadata
|
|
|
|
setup_maintenance_mode "configured"
|
|
|
|
! ghe-restore -v -f localhost
|
|
)
|
|
end_test
|
|
|
|
# Delete Actions test data before subsequent tests
|
|
cleanup_actions_test_data "$GHE_DATA_DIR/1"
|
|
|
|
begin_test "ghe-restore cluster backup to non-cluster appliance"
|
|
(
|
|
set -e
|
|
rm -rf "$GHE_REMOTE_ROOT_DIR"
|
|
setup_remote_metadata
|
|
|
|
# set as configured, enable maintenance mode and create required directories
|
|
setup_maintenance_mode "configured"
|
|
|
|
echo "cluster" > "$GHE_DATA_DIR/current/strategy"
|
|
! output=$(ghe-restore -v -f localhost 2>&1)
|
|
|
|
echo $output | grep -q "Snapshot from a GitHub Enterprise cluster cannot be restored"
|
|
)
|
|
end_test
|
|
|
|
begin_test "ghe-restore no leaked ssh host keys detected"
|
|
(
|
|
set -e
|
|
|
|
# No leaked key message test
|
|
! ghe-restore -v -f localhost | grep -q "Leaked key"
|
|
)
|
|
end_test
|
|
|
|
begin_test "ghe-restore with current backup leaked key detection"
|
|
(
|
|
set -e
|
|
|
|
# Add a custom ssh key that will be used as part of the backup and fingerprint injection for the tests
|
|
cat <<EOF > "$GHE_DATA_DIR/ssh_host_dsa_key.pub"
|
|
ssh-dss AAAAB3NzaC1kc3MAAACBAMv7O3YNWyAOj6Oa6QhG2qL67FSDoR96cYILilsQpn1j+f21uXOYBRdqauP+8XS2sPYZy6p/T3gJhCeC6ppQWY8n8Wjs/oS8j+nl5KX7JbIqzvSIb0tAKnMI67pqCHTHWx+LGvslgRALJuGxOo7Bp551bNN02Y2gfm2TlHOv6DarAAAAFQChqAK2KkHI+WNkFj54GwGYdX+GCQAAAIEApmXYiT7OYXfmiHzhJ/jfT1ZErPAOwqLbhLTeKL34DkAH9J/DImLAC0tlSyDXjlMzwPbmECdu6LNYh4OZq7vAN/mcM2+Sue1cuJRmkt5B1NYox4fRs3o9RO+DGOcbogUUUQu7OIM/o95zF6dFEfxIWnSsmYvl+Ync4fEgN6ZLjtMAAACBAMRYjDs0g1a9rocKzUQ7fazaXnSNHxZADQW6SIodt7ic1fq4OoO0yUoBf/DSOF8MC/XTSLn33awI9SrbQ5Kk0oGxmV1waoFkqW/MDlypC8sHG0/gxzeJICkwjh/1OVwF6+e0C/6bxtUwV/I+BeMtZ6U2tKy15FKp5Mod7bLBgiee test@backup-utils
|
|
EOF
|
|
|
|
# Add custom key to tar file
|
|
tar -cf "$GHE_DATA_DIR/current/ssh-host-keys.tar" --directory="$GHE_DATA_DIR" ssh_host_dsa_key.pub
|
|
|
|
# Inject the fingerprint into the blacklist
|
|
export FINGERPRINT_BLACKLIST="98:d8:99:d3:be:c0:55:05:db:b0:53:2f:1f:ad:b3:60"
|
|
|
|
# Running it and ignoring the actual script status but testing that the ssh host detection still happens
|
|
output=$(ghe-restore -v -f localhost) || true
|
|
|
|
# Clean up, putting it back to its initial state
|
|
echo "fake ghe-export-ssh-host-keys data" > "$GHE_DATA_DIR/current/ssh-host-keys.tar"
|
|
|
|
# Test for leaked key messages
|
|
echo $output | grep -q "Leaked key found in current backup snapshot"
|
|
echo $output | grep -q "The snapshot that is being restored contains a leaked SSH host key."
|
|
)
|
|
end_test
|
|
|
|
begin_test "ghe-restore fails when restore to an active HA pair"
|
|
(
|
|
set -e
|
|
|
|
rm -rf "$GHE_REMOTE_ROOT_DIR"
|
|
setup_remote_metadata
|
|
|
|
echo "rsync" > "$GHE_DATA_DIR/current/strategy"
|
|
touch "$GHE_REMOTE_ROOT_DIR/etc/github/repl-state"
|
|
|
|
! output=$(ghe-restore -v -f localhost 2>&1)
|
|
|
|
echo $output | grep -q "Error: Restoring to an appliance with replication enabled is not supported."
|
|
)
|
|
end_test
|
|
|
|
begin_test "ghe-restore honours --version flag"
|
|
(
|
|
set -e
|
|
|
|
# Make sure a partial version string is returned
|
|
ghe-restore --version | grep "GitHub backup-utils v"
|
|
|
|
)
|
|
end_test
|
|
|
|
begin_test "ghe-restore honours --help and -h flags"
|
|
(
|
|
set -e
|
|
|
|
arg_help=$(ghe-restore --help | grep -o 'Usage: ghe-restore')
|
|
arg_h=$(ghe-restore -h | grep -o 'Usage: ghe-restore')
|
|
|
|
# Make sure a Usage: string is returned and that it's the same for -h and --help
|
|
[ "$arg_help" = "$arg_h" ] && echo $arg_help | grep -q "Usage: ghe-restore"
|
|
)
|
|
end_test
|
|
|
|
begin_test "ghe-restore exits early on unsupported version"
|
|
(
|
|
set -e
|
|
GHE_RESTORE_HOST=127.0.0.1
|
|
export GHE_RESTORE_HOST
|
|
|
|
! GHE_TEST_REMOTE_VERSION=2.10.0 ghe-restore -v
|
|
)
|
|
end_test
|
|
|
|
# Reset data for sub-subsequent tests
|
|
rm -rf "$GHE_DATA_DIR/1"
|
|
setup_test_data "$GHE_DATA_DIR/1"
|
|
|
|
# Make the current symlink
|
|
ln -s 1 "$GHE_DATA_DIR/current"
|
|
|
|
# Disabling test for release. Issue for tracking https://github.com/github/backup-utils/issues/677
|
|
# begin_test "ghe-restore cluster with matching node versions"
|
|
# (
|
|
# set -e
|
|
# rm -rf "$GHE_REMOTE_ROOT_DIR"
|
|
# setup_moreutils_parallel
|
|
# setup_remote_metadata
|
|
# setup_remote_cluster
|
|
# echo "cluster" > "$GHE_DATA_DIR/current/strategy"
|
|
|
|
# # set as configured, enable maintenance mode and create required directories
|
|
# setup_maintenance_mode "configured"
|
|
|
|
# # set restore host environ var
|
|
# GHE_RESTORE_HOST=127.0.0.1
|
|
# export GHE_RESTORE_HOST
|
|
|
|
# # run ghe-restore and write output to file for asserting against
|
|
# if ! ghe-restore -v -f > "$TRASHDIR/restore-out" 2>&1; then
|
|
# cat "$TRASHDIR/restore-out"
|
|
# : ghe-restore should have exited successfully
|
|
# false
|
|
# fi
|
|
|
|
# cleanup_moreutils_parallel
|
|
|
|
# # for debugging
|
|
# cat "$TRASHDIR/restore-out"
|
|
|
|
# # verify data was copied from multiple nodes
|
|
# # repositories
|
|
# grep -q "networks to git-server-fake-uuid" "$TRASHDIR/restore-out"
|
|
# grep -q "networks to git-server-fake-uuid1" "$TRASHDIR/restore-out"
|
|
# grep -q "networks to git-server-fake-uuid2" "$TRASHDIR/restore-out"
|
|
# grep -q "dgit-cluster-restore-finalize OK" "$TRASHDIR/restore-out"
|
|
|
|
# # gists
|
|
# grep -q "gists to git-server-fake-uuid" "$TRASHDIR/restore-out"
|
|
# grep -q "gists to git-server-fake-uuid1" "$TRASHDIR/restore-out"
|
|
# grep -q "gists to git-server-fake-uuid2" "$TRASHDIR/restore-out"
|
|
# grep -q "gist-cluster-restore-finalize OK" "$TRASHDIR/restore-out"
|
|
|
|
|
|
# # storage
|
|
# grep -q "data to git-server-fake-uuid" "$TRASHDIR/restore-out"
|
|
# grep -q "data to git-server-fake-uuid1" "$TRASHDIR/restore-out"
|
|
# grep -q "data to git-server-fake-uuid2" "$TRASHDIR/restore-out"
|
|
# grep -q "storage-cluster-restore-finalize OK" "$TRASHDIR/restore-out"
|
|
|
|
|
|
# # pages
|
|
# grep -q "Pages to git-server-fake-uuid" "$TRASHDIR/restore-out"
|
|
# grep -q "Pages to git-server-fake-uuid1" "$TRASHDIR/restore-out"
|
|
# grep -q "Pages to git-server-fake-uuid2" "$TRASHDIR/restore-out"
|
|
# grep -q "dpages-cluster-restore-finalize OK" "$TRASHDIR/restore-out"
|
|
|
|
# # verify no warnings printed
|
|
# ! grep -q "Warning" "$TRASHDIR/restore-out"
|
|
|
|
# # Verify all the data we've restored is as expected
|
|
# verify_all_restored_data
|
|
# )
|
|
# end_test
|
|
|
|
begin_test "ghe-restore cluster with different node versions should fail at ghe-host-check"
|
|
(
|
|
set -e
|
|
rm -rf "$GHE_REMOTE_ROOT_DIR"
|
|
setup_moreutils_parallel
|
|
setup_remote_metadata
|
|
setup_remote_cluster
|
|
echo "cluster" > "$GHE_DATA_DIR/current/strategy"
|
|
|
|
# set that versions should not match for this test
|
|
DIFFERENT_VERSIONS=1
|
|
export DIFFERENT_VERSIONS
|
|
|
|
# set as configured, enable maintenance mode and create required directories
|
|
setup_maintenance_mode "configured"
|
|
|
|
# set restore host environ var
|
|
GHE_RESTORE_HOST=127.0.0.1
|
|
export GHE_RESTORE_HOST
|
|
|
|
! output=$(ghe-restore -v -f 2>&1)
|
|
# echo "$output" | grep -q "Error: Not all nodes are running the same version! Please ensure all nodes are running the same version before using backup-utils."
|
|
)
|
|
end_test
|
|
|
|
# Disabling test for release. Issue for tracking https://github.com/github/backup-utils/issues/677
|
|
# begin_test "ghe-restore missing directories or files from source snapshot displays warning"
|
|
# (
|
|
# # Tests the scenario where something exists in the database, but not on disk.
|
|
# set -e
|
|
# rm -rf "$GHE_REMOTE_ROOT_DIR"
|
|
# setup_moreutils_parallel
|
|
# setup_remote_metadata
|
|
# setup_remote_cluster
|
|
# echo "cluster" > "$GHE_DATA_DIR/current/strategy"
|
|
|
|
# # set as configured, enable maintenance mode and create required directories
|
|
# setup_maintenance_mode "configured"
|
|
|
|
# # set restore host environ var
|
|
# GHE_RESTORE_HOST=127.0.0.1
|
|
# export GHE_RESTORE_HOST
|
|
|
|
# # Tell dgit-cluster-restore-finalize and gist-cluster-restore-finalize to return warnings
|
|
# export GHE_DGIT_CLUSTER_RESTORE_FINALIZE_WARNING=1
|
|
# export GHE_GIST_CLUSTER_RESTORE_FINALIZE_WARNING=1
|
|
|
|
# # run ghe-restore and write output to file for asserting against
|
|
# if ! ghe-restore -v -f > "$TRASHDIR/restore-out" 2>&1; then
|
|
# cat "$TRASHDIR/restore-out"
|
|
# : ghe-restore should have exited successfully
|
|
# false
|
|
# fi
|
|
|
|
# cleanup_moreutils_parallel
|
|
|
|
# # for debugging
|
|
# cat "$TRASHDIR/restore-out"
|
|
|
|
# grep -q "Warning: One or more repository networks failed to restore successfully." "$TRASHDIR/restore-out"
|
|
# grep -q "Warning: One or more Gists failed to restore successfully." "$TRASHDIR/restore-out"
|
|
|
|
# # Verify all the data we've restored is as expected
|
|
# verify_all_restored_data
|
|
# )
|
|
# end_test
|
|
|
|
begin_test "ghe-restore fails if Actions is disabled in the backup but enabled on the appliance"
|
|
(
|
|
set -e
|
|
rm -rf "$GHE_REMOTE_ROOT_DIR"
|
|
setup_remote_metadata
|
|
setup_actions_enabled_settings_for_restore false
|
|
enable_actions
|
|
|
|
setup_maintenance_mode "configured"
|
|
|
|
! ghe-restore -v -f localhost
|
|
)
|
|
end_test
|