From 227e3cfecc283f0cb7a1a338892a9a10b1d769e7 Mon Sep 17 00:00:00 2001 From: Rene Moser Date: Sat, 30 Nov 2024 14:57:10 +0100 Subject: [PATCH] ci: add acceptrance --- .github/workflows/acceptance.yml | 91 +++++++++++++++++++ .github/workflows/setup-cloudstack/action.yml | 74 +++++++++++++++ 2 files changed, 165 insertions(+) create mode 100644 .github/workflows/acceptance.yml create mode 100644 .github/workflows/setup-cloudstack/action.yml diff --git a/.github/workflows/acceptance.yml b/.github/workflows/acceptance.yml new file mode 100644 index 0000000..98fa13c --- /dev/null +++ b/.github/workflows/acceptance.yml @@ -0,0 +1,91 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +# See https://github.com/apache/cloudstack-terraform-provider/blob/main/.github/workflows/acceptance.yml +name: Acceptance Test + +on: + pull_request: + push: + +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}-acceptance + cancel-in-progress: true + +permissions: + contents: read + +env: + CLOUDSTACK_API_URL: http://localhost:8080/client/api + #CLOUDSTACK_VERSIONS: "['4.18.2.5', '4.19.1.1', '4.19.1.3']" + CLOUDSTACK_VERSIONS: "['4.19.1.1']" +jobs: + prepare-matrix: + runs-on: ubuntu-latest + outputs: + cloudstack-versions: ${{ steps.set-versions.outputs.cloudstack-versions }} + steps: + - name: Set versions + id: set-versions + run: | + echo "cloudstack-versions=${{ env.CLOUDSTACK_VERSIONS }}" >> $GITHUB_OUTPUT + + acceptance-cs: + name: Python ${{ matrix.python-version }} with Cloudstack ${{ matrix.cloudstack-version }} + needs: [prepare-matrix] + runs-on: ubuntu-latest + services: + cloudstack-simulator: + image: apache/cloudstack-simulator:${{ matrix.cloudstack-version }} + ports: + - 8080:5050 + strategy: + fail-fast: false + matrix: + cloudstack-version: ${{ fromJson(needs.prepare-matrix.outputs.cloudstack-versions) }} + python-version: + - '3.12' + steps: + - uses: actions/checkout@v4 + - name: Configure Cloudstack v${{ matrix.cloudstack-version }} + uses: ./.github/workflows/setup-cloudstack + id: setup-cloudstack + with: + cloudstack-version: ${{ matrix.cloudstack-version }} + - uses: actions/setup-python@v5 + with: + python-version: ${{ matrix.python-version }} + - name: Run acceptance test + env: + CLOUDSTACK_KEY: ${{ steps.setup-cloudstack.outputs.CLOUDSTACK_API_KEY }} + CLOUDSTACK_SECRET: ${{ steps.setup-cloudstack.outputs.CLOUDSTACK_SECRET_KEY }} + CLOUDSTACK_ENDPOINT: ${{ steps.setup-cloudstack.outputs.CLOUDSTACK_API_URL }} + run: | + python -m venv .venv + source .venv/bin/activate + which python + pip install . + cs listZones + + all-jobs-passed: # Will succeed if it is skipped + runs-on: ubuntu-latest + needs: [acceptance-cs] + # Only run if any of the previous jobs failed + if: ${{ failure() }} + steps: + - name: Previous jobs failed + run: exit 1 diff --git a/.github/workflows/setup-cloudstack/action.yml b/.github/workflows/setup-cloudstack/action.yml new file mode 100644 index 0000000..195683a --- /dev/null +++ b/.github/workflows/setup-cloudstack/action.yml @@ -0,0 +1,74 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +# See https://raw.githubusercontent.com/apache/cloudstack-terraform-provider/refs/heads/main/.github/workflows/setup-cloudstack/action.yml + +name: Setup Cloudstack + +inputs: + cloudstack-version: + description: 'Cloudstack version' + required: true +outputs: + CLOUDSTACK_USER_ID: + description: 'Cloudstack user id' + value: ${{ steps.setup-cloudstack.outputs.user_id }} + CLOUDSTACK_API_KEY: + description: 'Cloudstack api key' + value: ${{ steps.setup-cloudstack.outputs.api_key }} + CLOUDSTACK_SECRET_KEY: + description: 'Cloudstack secret key' + value: ${{ steps.setup-cloudstack.outputs.secret_key }} + CLOUDSTACK_API_URL: + description: 'Cloudstack API URL' + value: http://localhost:8080/client/api + +runs: + using: composite + steps: + - name: Wait Cloudstack to be ready + shell: bash + run: | + echo "Starting Cloudstack health check" + T=0 + until [ $T -gt 20 ] || curl -sfL http://localhost:8080 --output /dev/null + do + echo "Waiting for Cloudstack to be ready..." + ((T+=1)) + sleep 30 + done + - name: Setting up Cloudstack + id: setup-cloudstack + shell: bash + run: | + docker exec $(docker container ls --format=json -l | jq -r .ID) python /root/tools/marvin/marvin/deployDataCenter.py -i /root/setup/dev/advanced.cfg + curl -sf --location "${CLOUDSTACK_API_URL}" \ + --header 'Content-Type: application/x-www-form-urlencoded' \ + --data-urlencode 'command=login' \ + --data-urlencode 'username=admin' \ + --data-urlencode 'password=password' \ + --data-urlencode 'response=json' \ + --data-urlencode 'domain=/' -j -c cookies.txt --output /dev/null + + CLOUDSTACK_USER_ID=$(curl -fs "${CLOUDSTACK_API_URL}?command=listUsers&response=json" -b cookies.txt | jq -r '.listusersresponse.user[0].id') + CLOUDSTACK_API_KEY=$(curl -s "${CLOUDSTACK_API_URL}?command=getUserKeys&id=${CLOUDSTACK_USER_ID}&response=json" -b cookies.txt | jq -r '.getuserkeysresponse.userkeys.apikey') + CLOUDSTACK_SECRET_KEY=$(curl -fs "${CLOUDSTACK_API_URL}?command=getUserKeys&id=${CLOUDSTACK_USER_ID}&response=json" -b cookies.txt | jq -r '.getuserkeysresponse.userkeys.secretkey') + + echo "CLOUDSTACK_USER_ID=$CLOUDSTACK_USER_ID" >> $GITHUB_OUTPUT + echo "CLOUDSTACK_API_KEY=$CLOUDSTACK_API_KEY" >> $GITHUB_OUTPUT + echo "CLOUDSTACK_SECRET_KEY=$CLOUDSTACK_SECRET_KEY" >> $GITHUB_OUTPUT + echo "CLOUDSTACK_API_URL=$CLOUDSTACK_API_URL" >> $GITHUB_OUTPUT