diff --git a/.gitea/actions/init-db/action.yaml b/.gitea/actions/init-db/action.yaml new file mode 100644 index 0000000..95526f8 --- /dev/null +++ b/.gitea/actions/init-db/action.yaml @@ -0,0 +1,76 @@ +name: initialize database +description: initialize database by using database of test environment +author: BinKrassDuFass + +inputs: + MONGODB_SERVICE_NAME: + description: 'Name of the MongoDB service' + required: true + default: 'mongo' + + TIBI_USERNAME: + description: 'Username of the Tibi account' + required: true + default: 'admin' + + TIBI_PASSWORD: + description: 'Password of the Tibi account' + required: true + default: 'admin' + + TIBI_API_URL: + description: 'URL of the Tibi API' + required: true + default: 'http://tibi-server:8080/api/v1' + + TIBI_API_CONFIG_PATH: + description: 'Path of the Tibi API config' + required: true + default: "${{github.workspace}}/api/config.yml}}" + + TIBI_API_NAMESPACE: + description: 'Namespace of the Tibi API' + required: true + + PROJECT_NAME: + description: 'Name of the project' + required: true + +runs: + using: composite + steps: + - name: Setup mongo tools + shell: bash + run: | + echo "::group::setup Mongo keys" + wget -qO - https://www.mongodb.org/static/pgp/server-6.0.asc | sudo apt-key add - + sudo apt-get install -y gnupg + wget -qO - https://www.mongodb.org/static/pgp/server-6.0.asc | sudo apt-key add - + echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/6.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-6.0.list + echo "::endgroup::" + + echo "::group::mongodb tools" + sudo apt-get update + echo "aptitude install mongodb-database-tools" + sudo apt-get install -y mongodb-database-tools + echo "::endgroup::" + + echo "mongodump --version" + mongodump --version + + - name: Restore MongoDB Data + run: | + echo "::group::initialize mongo data" + mongorestore --uri "mongodb://${{inputs.MONGODB_SERVICE_NAME}}:27017" ./.github/actions/init-db/mongo-dump + echo "::endgroup::" + shell: bash + + - name: set config in tibi + shell: bash + run: ./.github/actions/init-db/setConfigInTibiProject.sh ${{inputs.TIBI_USERNAME}} ${{inputs.TIBI_PASSWORD}} ${{inputs.TIBI_API_URL}} ${{inputs.TIBI_API_CONFIG_PATH}} ${{inputs.TIBI_API_NAMESPACE}} ${{inputs.PROJECT_NAME}} + + + + + + diff --git a/.gitea/actions/init-db/action.yml b/.gitea/actions/init-db/action.yml deleted file mode 100644 index 6755d6b..0000000 --- a/.gitea/actions/init-db/action.yml +++ /dev/null @@ -1,19 +0,0 @@ -name: initialize database -description: initialize database by using database of test environment -author: BinKrassDuFass - -inputs: - MONGODB_SERVICE_NAME: - description: 'Name of the MongoDB service' - required: true - default: 'mongo' - -runs: - using: composite - steps: - - name: Install MongoDB tools - run: sudo apt-get install -y mongodb-database-tools - - - name: Restore MongoDB Data - run: mongorestore --uri "mongodb://${{inputs.MONGODB_SERVICE_NAME}}:27017" /.gitea/ - diff --git a/.gitea/actions/init-db/index.js b/.gitea/actions/init-db/index.js deleted file mode 100644 index e18dcbb..0000000 --- a/.gitea/actions/init-db/index.js +++ /dev/null @@ -1,116 +0,0 @@ -const axios = require("axios") -const { MongoClient } = require("mongodb") -const fs = require("fs") -const util = require("util") - -// Function to log objects in a detailed manner -function logObj(o) { - console.log(util.inspect(o, false, null, true)) -} - -// Function to preload the database with collections -async function preloadDatabase(db, collections) { - for (const { name, file } of collections) { - const content = fs.readFileSync(file, "utf8") - const data = JSON.parse(content) - - const collection = db.collection(name) - await collection.insertMany(data) - - const insertedData = await collection.find({}).toArray() - if (insertedData.length !== data.length) { - console.error( - `Mismatch in collection ${name}: expected ${data.length} documents, found ${insertedData.length}` - ) - } else { - console.log(`Successfully verified ${insertedData.length} documents in ${name}`) - } - } -} - -async function initializeDatabase(config) { - try { - const dbClient = new MongoClient(config.mongodbUri) - await dbClient.connect() - let db = dbClient.db(config.tibiDbPrefix) - await db.collection("project").deleteMany({ namespace: config.projectApiNamespace }) - - const dbName = config.tibiDbPrefix + "_" + config.projectApiNamespace - db = dbClient.db(dbName) - await db.dropDatabase() - - // Login to Tibi API - const loginResponse = await axios.post(config.tibiApiUrl + "/login", { - username: config.tibiUsername, - password: config.tibiPassword, - }) - const tibiToken = loginResponse.data.token - - // Create project - let project - try { - const projectResponse = await axios.post( - config.tibiApiUrl + "/project", - { - configFile: config.projectApiConfig, - name: config.projectApiNamespace, - namespace: config.projectApiNamespace, - description: config.projectApiNamespace, - }, - { - headers: { - "X-Auth-Token": tibiToken, - }, - } - ) - project = projectResponse.data - } catch (e) { - logObj(e) - throw e - } - - // Check if project is online - const projectStatus = await axios.get(config.tibiApiUrl + "/project/" + project.id, { - headers: { - "X-Auth-Token": tibiToken, - }, - }) - if (!projectStatus.data.api.isOnline) { - throw new Error(`Project ${config.projectApiNamespace} is not online.`) - } - - - // Define collections to preload into the database - const collections = [ - // Define your collections here as per your Cypress plugin logic - // { name: "collectionName", file: "path/to/file.json" }, - // ... other collections - ] - await preloadDatabase(db, collections) - - await dbClient.close() - } catch (error) { - console.error("Error initializing the database:", error) - throw error - } -} - -// Run the script if it's executed directly -if (require.main === module) { - const config = { - projectApiNamespace: process.env.PROJECT_API_NAMESPACE, - mongodbUri: process.env.MONGODB_URI, - tibiDbPrefix: process.env.TIBI_DB_PREFIX, - tibiApiUrl: process.env.TIBI_API_URL, - // Add other required environment variables here - } - - initializeDatabase(config) - .then(() => console.log("Database initialized successfully")) - .catch((err) => { - console.error("Failed to initialize database:", err) - process.exit(1) - }) -} - -module.exports = initializeDatabase diff --git a/.gitea/actions/init-db/mongo-dump/tibi_allkids_erfurt/ssr.bson b/.gitea/actions/init-db/mongo-dump/tibi_allkids_erfurt/ssr.bson index f1cadf7..a026cfd 100644 Binary files a/.gitea/actions/init-db/mongo-dump/tibi_allkids_erfurt/ssr.bson and b/.gitea/actions/init-db/mongo-dump/tibi_allkids_erfurt/ssr.bson differ diff --git a/.gitea/actions/init-db/setConfigInTibiProject.sh b/.gitea/actions/init-db/setConfigInTibiProject.sh new file mode 100644 index 0000000..7c570af --- /dev/null +++ b/.gitea/actions/init-db/setConfigInTibiProject.sh @@ -0,0 +1,108 @@ +#!/bin/bash + +# Start a GitHub Actions group for input validation +echo "::group::Validating Inputs" + +# Check if the correct number of arguments is passed +if [ "$#" -ne 6 ]; then + echo "Incorrect number of arguments provided." + echo "Usage: $0 <TIBI_USERNAME> <TIBI_PASSWORD> <TIBI_API_URL> <PROJECT_API_CONFIG> <PROJECT_NAMESPACE> <PROJECT_NAME>" + exit 1 +fi + +# Assigning passed arguments to variables for better readability +TIBI_USERNAME=$1 +TIBI_PASSWORD=$2 +TIBI_API_URL=$3 +PROJECT_API_CONFIG=$4 +PROJECT_NAMESPACE=$5 +PROJECT_NAME=$6 + +echo "Provided TIBI_USERNAME: $TIBI_USERNAME" +echo "TIBI_API_URL: $TIBI_API_URL" +# Be cautious with logging sensitive data like passwords and tokens +# Echoing the password or sensitive information is generally not recommended + +# End the input validation group +echo "::endgroup::" + +# Start a group for authentication +echo "::group::Authenticating User" + +# Prepare authentication request payload +auth_payload=$(jq -n --arg username "$TIBI_USERNAME" --arg password "$TIBI_PASSWORD" '{username: $username, password: $password}') +echo "Authentication payload: $auth_payload" +# Fetch the authentication token +echo "Requesting authentication token..." +auth_response=$(curl -s -X POST -H "Content-Type: application/json" -d "$auth_payload" "$TIBI_API_URL/login") +# Logging the response for debugging (remove sensitive data as necessary) +echo "Authentication response: $auth_response" + +# Extract token from the response +TIBI_AUTH_TOKEN=$(echo $auth_response | jq -r '.token') + +# Check if the token was successfully retrieved +if [ -z "$TIBI_AUTH_TOKEN" ]; then + echo "Failed to get authentication token. Exiting script." + exit 1 +fi + +echo "Authentication token received successfully." +echo "::endgroup::" + +# Start a group for fetching project data +echo "::group::Fetching Project Data" + +# Get the list of projects from the API +echo "Retrieving projects..." +response=$(curl -s -H "X-Auth-Token: $TIBI_AUTH_TOKEN" "$TIBI_API_URL/project") +echo $response +projects=$(echo $response) # Parse the JSON response to get project data + +echo "::endgroup::" + +# Start a group for processing project data +echo "::group::Processing Project Data" + +# Initialize variables to track project existence +projectFound=false +projectId="" + +# Loop through each project to find if the required project exists +for row in $(echo "${projects}" | jq -r '.[] | @base64'); do + _jq() { + echo ${row} | base64 --decode | jq -r ${1} + } + + api_name=$(_jq '.name') + # Check if the current project's namespace matches the target + if [ "$api_name" == "$PROJECT_NAME" ]; then + projectId=$(_jq '.id') + projectData=$(echo ${row} | base64 --decode) + projectFound=true + break + fi +done + +echo "::endgroup::" + +# Start a group for creating or updating the project +echo "::group::Creating or Updating Project" + +# Conditionally create a new project or update the existing one +if [ "$projectFound" = true ]; then + echo "Project found with ID: $projectId, updating..." + # Prepare updated project data + updatedProjectData=$(echo $projectData | jq --arg configFile "$PROJECT_API_CONFIG" '.configFile = $configFile | del(.id)') + # Send a PUT request to update the project + updateResponse=$(curl -s -X PUT -H "Content-Type: application/json" -H "X-Auth-Token: $TIBI_AUTH_TOKEN" -d "$updatedProjectData" "$TIBI_API_URL/project/$projectId") + # Logging the response for debugging (remove sensitive data as necessary) + echo "Update response: $updateResponse" + +else + echo "Project not found. Creating new project..." + # Send a POST request to create a new project + createResponse=$(curl -s -X POST -H "Content-Type: application/json" -H "X-Auth-Token: $TIBI_AUTH_TOKEN" -d "{\"configFile\":\"$PROJECT_API_CONFIG\", \"name\":\"$PROJECT_NAMESPACE\", \"namespace\":\"$PROJECT_NAMESPACE\", \"description\":\"$PROJECT_NAMESPACE\"}" "$TIBI_API_URL/project") +fi + +echo "::endgroup::"