Skip to content

Commit

Permalink
Add backup/restore plans (#339)
Browse files Browse the repository at this point in the history
First iteration of backup restore, covering use case of restoring degraded PE instance.

Migration functionality to be introduced in further release.

---------

Co-authored-by: Neil Anderson <neil.anderson@puppet.com>
Co-authored-by: Neil Anderson <ragingra@users.noreply.github.com>
Co-authored-by: JHunniford <97452751+J-Hunniford@users.noreply.github.com>
Co-authored-by: Dimitri Tischenko <dimitri.tischenko@perforce.com>
Co-authored-by: Ben Ford <ben.ford@puppetlabs.com>
  • Loading branch information
6 people authored Jun 28, 2024
1 parent d1edf04 commit 9cb918e
Show file tree
Hide file tree
Showing 31 changed files with 1,920 additions and 75 deletions.
241 changes: 241 additions & 0 deletions .github/workflows/test-backup-restore-migration.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,241 @@
---
name: "Backup and restore test"

on:
workflow_dispatch:
inputs:
image:
description: "GCP image for test cluster"
required: true
default: "almalinux-cloud/almalinux-8"
architecture:
description: "PE architecture to test"
required: true
default: "standard"
version:
description: "PE version to install"
required: true
default: "2021.7.4"
ssh-debugging:
description: "Boolean; whether or not to pause for ssh debugging"
required: true
default: "false"

jobs:
backup:
name: "Backup: Cluster A: PE ${{ inputs.version }} ${{ inputs.architecture }} on ${{ inputs.image }}"
runs-on: ubuntu-20.04
env:
BOLT_GEM: true
BOLT_DISABLE_ANALYTICS: true
LANG: "en_US.UTF-8"

steps:
- name: "Start SSH session"
if: ${{ github.event.inputs.ssh-debugging == 'true' }}
uses: luchihoratiu/debug-via-ssh@main
with:
NGROK_AUTH_TOKEN: ${{ secrets.NGROK_AUTH_TOKEN }}
SSH_PASS: ${{ secrets.SSH_PASS }}

- name: "Checkout Source"
uses: actions/checkout@v2

- name: "Activate Ruby 2.7"
uses: ruby/setup-ruby@v1
with:
ruby-version: "2.7"
bundler-cache: true

- name: "Print bundle environment"
if: ${{ github.repository_owner == 'puppetlabs' }}
run: |
echo ::group::info:bundler
bundle env
echo ::endgroup::
- name: "Provision test cluster"
timeout-minutes: 15
run: |
echo ::group::prepare
mkdir -p $HOME/.ssh
echo 'Host *' > $HOME/.ssh/config
echo ' ServerAliveInterval 150' >> $HOME/.ssh/config
echo ' ServerAliveCountMax 2' >> $HOME/.ssh/config
bundle exec rake spec_prep
echo ::endgroup::
echo ::group::provision
bundle exec bolt plan run peadm_spec::provision_test_cluster \
--modulepath spec/fixtures/modules \
provider=provision_service \
image=${{ inputs.image }} \
architecture=${{ inputs.architecture }}
echo ::endgroup::
echo ::group::info:request
cat request.json || true; echo
echo ::endgroup::
echo ::group::info:inventory
sed -e 's/password: .*/password: "[redacted]"/' < spec/fixtures/litmus_inventory.yaml || true
echo ::endgroup::
# - name: Save inventory file A to an artifact
# uses: actions/upload-artifact@v3
# with:
# name: inventory_A
# path: spec/fixtures/litmus_inventory.yaml

- name: "Install PE on test cluster"
timeout-minutes: 120
run: |
bundle exec bolt plan run peadm_spec::install_test_cluster \
--inventoryfile spec/fixtures/litmus_inventory.yaml \
--modulepath spec/fixtures/modules \
architecture=${{ inputs.architecture }} \
version=${{ inputs.version }}
- name: "Start SSH session"
if: github.event.inputs.ssh-debugging == 'true'
uses: luchihoratiu/debug-via-ssh@main
with:
NGROK_AUTH_TOKEN: ${{ secrets.NGROK_AUTH_TOKEN }}
SSH_PASS: ${{ secrets.SSH_PASS }}

# - name: Download artifacts
# # if: always()
# uses: actions/download-artifact@v3
# with:
# path: spec/fixtures/

- name: perform PE backup of cluster A
timeout-minutes: 10
continue-on-error: true
run: |
echo ::group::prepare
mkdir -p $HOME/.ssh
echo 'Host *' > $HOME/.ssh/config
echo ' ServerAliveInterval 150' >> $HOME/.ssh/config
echo ' ServerAliveCountMax 2' >> $HOME/.ssh/config
bundle exec rake spec_prep
echo ::endgroup::
echo ::group::backup
bundle exec bolt plan run peadm_spec::test_backup \
--inventoryfile spec/fixtures/litmus_inventory.yaml \
--modulepath spec/fixtures/modules
echo ::endgroup::
- name: "Wait as long as the file ${HOME}/pause file is present"
continue-on-error: true
# if: ${{ always() && github.event.inputs.ssh-debugging == 'true' }}
if: github.event.inputs.ssh-debugging == 'true'
run: |
while [ -f "${HOME}/pause" ] ; do
echo "${HOME}/pause present, sleeping for 60 seconds..."
sleep 10
done
echo "${HOME}/pause absent, continuing workflow."
- name: "Tear down cluster A"
if: always()
run: |
if [ -f spec/fixtures/litmus_inventory.yaml ]; then
echo ::group::tear_down
bundle exec rake 'litmus:tear_down'
echo ::endgroup::
echo ::group::info:request
cat request.json || true; echo
echo ::endgroup::
fi
restore:
name: "Restore: Cluster B: PE ${{ inputs.version }} ${{ inputs.architecture }} on ${{ inputs.image }}"
runs-on: ubuntu-20.04
env:
BOLT_GEM: true
BOLT_DISABLE_ANALYTICS: true
LANG: "en_US.UTF-8"

steps:
- name: "Checkout Source"
uses: actions/checkout@v2

- name: "Activate Ruby 2.7"
uses: ruby/setup-ruby@v1
with:
ruby-version: "2.7"
bundler-cache: true

- name: "Print bundle environment"
if: ${{ github.repository_owner == 'puppetlabs' }}
run: |
echo ::group::info:bundler
bundle env
echo ::endgroup::
- name: "Provision test cluster"
timeout-minutes: 15
run: |
echo ::group::prepare
mkdir -p $HOME/.ssh
echo 'Host *' > $HOME/.ssh/config
echo ' ServerAliveInterval 150' >> $HOME/.ssh/config
echo ' ServerAliveCountMax 2' >> $HOME/.ssh/config
bundle exec rake spec_prep
echo ::endgroup::
echo ::group::provision
bundle exec bolt plan run peadm_spec::provision_test_cluster \
--modulepath spec/fixtures/modules \
provider=provision_service \
image=${{ inputs.image }} \
architecture=${{ inputs.architecture }}
echo ::endgroup::
echo ::group::info:request
cat request.json || true; echo
echo ::endgroup::
echo ::group::info:inventory
sed -e 's/password: .*/password: "[redacted]"/' < spec/fixtures/litmus_inventory.yaml || true
echo ::endgroup::
# - name: Save inventory file B to an artifact
# uses: actions/upload-artifact@v3
# with:
# name: inventory_B
# path: spec/fixtures/litmus_inventory.yaml

- name: "Install PE on test cluster"
timeout-minutes: 120
run: |
bundle exec bolt plan run peadm_spec::install_test_cluster \
--inventoryfile spec/fixtures/litmus_inventory.yaml \
--modulepath spec/fixtures/modules \
architecture=${{ inputs.architecture }} \
version=${{ inputs.version }}
- name: Wait for backup to finish
uses: lewagon/wait-on-check-action@v1.3.1
with:
ref: ${{ github.ref }}
check-name: "Backup: Cluster A: PE ${{ inputs.version }} ${{ inputs.architecture }} on ${{ inputs.image }}"
repo-token: ${{ secrets.GITHUB_TOKEN }}
wait-interval: 10

- name: "Tear down cluster B"
if: always()
run: |
cp spec/fixtures/inventory_B/litmus_inventory.yaml spec/fixtures/litmus_inventory.yaml || true
if [ -f spec/fixtures/litmus_inventory.yaml ]; then
echo ::group::tear_down
bundle exec rake 'litmus:tear_down'
echo ::endgroup::
echo ::group::info:request
cat request.json || true; echo
echo ::endgroup::
fi
Loading

0 comments on commit 9cb918e

Please sign in to comment.