From e656b3bd0eca6b7ae01d6f97fce7f469d610b4e6 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 | 73 ++++++++++++++++++ .github/workflows/setup-cloudstack/action.yml | 76 +++++++++++++++++++ 2 files changed, 149 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..10a984d --- /dev/null +++ b/.github/workflows/acceptance.yml @@ -0,0 +1,73 @@ +# 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']" + +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: cs with Cloudstack ${{ matrix.cloudstack-version }} + needs: [prepare-matrix] + runs-on: ubuntu-latest + 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 }} + + - name: Run acceptance test + env: + CLOUDSTACK_API_KEY: ${{ steps.setup-cloudstack.outputs.CLOUDSTACK_API_KEY }} + CLOUDSTACK_SECRET_KEY: ${{ steps.setup-cloudstack.outputs.CLOUDSTACK_SECRET_KEY }} + run: | + echo $CLOUDSTACK_API_KEY + 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) }} diff --git a/.github/workflows/setup-cloudstack/action.yml b/.github/workflows/setup-cloudstack/action.yml new file mode 100644 index 0000000..548ee1e --- /dev/null +++ b/.github/workflows/setup-cloudstack/action.yml @@ -0,0 +1,76 @@ +# 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 "::add-mask::$CLOUDSTACK_API_KEY" + echo "::add-mask::$CLOUDSTACK_SECRET_KEY" + + echo "user_id=$CLOUDSTACK_USER_ID" >> $GITHUB_OUTPUT + echo "api_key=$CLOUDSTACK_API_KEY" >> $GITHUB_OUTPUT + echo "secret_key=$CLOUDSTACK_SECRET_KEY" >> $GITHUB_OUTPUT