This is an automated email from the ASF dual-hosted git repository. lahirujayathilake pushed a commit to branch airavata-deployment in repository https://gitbox.apache.org/repos/asf/airavata.git
commit 740ada8f3eb2000569b6f95b072cb397fe8fac39 Author: lahiruj <[email protected]> AuthorDate: Tue Oct 28 12:40:10 2025 -0400 Initial implementation of ansible scripts to deploy and update airavata services --- dev-tools/ansible/airavata_setup.yml | 99 ++++++++ dev-tools/ansible/airavata_update.yml | 68 +++++ dev-tools/ansible/deploy_setup.sh | 72 ++++++ dev-tools/ansible/deploy_update.sh | 75 ++++++ .../inventories/dev/group_vars/all/vars.yml | 76 ++++++ dev-tools/ansible/inventories/dev/hosts | 12 + dev-tools/ansible/inventories/template/README.md | 148 +++++++++++ .../template/group_vars/all/vars.yml.example | 25 ++ .../template/group_vars/all/vault.yml.example | 85 +++++++ .../host_vars/airavata-server/vault.yml.example | 19 ++ .../ansible/inventories/template/hosts.example | 12 + .../roles/airavata_services/defaults/main.yml | 214 ++++++++++++++++ .../roles/airavata_services/handlers/main.yml | 23 ++ .../roles/airavata_services/tasks/build.yml | 66 +++++ .../tasks/deploy_agent_service.yml | 78 ++++++ .../airavata_services/tasks/deploy_api_server.yml | 120 +++++++++ .../airavata_services/tasks/deploy_file_server.yml | 78 ++++++ .../tasks/deploy_research_service.yml | 78 ++++++ .../airavata_services/tasks/deploy_restproxy.yml | 78 ++++++ .../ansible/roles/airavata_services/tasks/main.yml | 36 +++ .../airavata_services/tasks/start_services.yml | 143 +++++++++++ .../airavata_services/tasks/stop_services.yml | 138 +++++++++++ .../templates/airavata-server.properties.j2 | 276 +++++++++++++++++++++ .../templates/application-agent-service.yml.j2 | 63 +++++ .../application-file-server.properties.j2 | 34 +++ .../templates/application-research-service.yml.j2 | 76 ++++++ .../templates/application-restproxy.properties.j2 | 23 ++ .../templates/email-config.yml.j2 | 114 +++++++++ .../airavata_services/templates/log4j2.xml.j2 | 55 ++++ 29 files changed, 2384 insertions(+) diff --git a/dev-tools/ansible/airavata_setup.yml b/dev-tools/ansible/airavata_setup.yml new file mode 100644 index 0000000000..860038a110 --- /dev/null +++ b/dev-tools/ansible/airavata_setup.yml @@ -0,0 +1,99 @@ +# +# +# 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. +# + +--- +# Airavata Full Environment Setup Playbook +# +# This playbook sets up a complete Airavata environment from scratch including: +# - Environment setup (users, groups, firewall) +# - Java and Maven installation +# - Zookeeper installation and configuration +# - Kafka installation and configuration +# - RabbitMQ installation and configuration +# - MariaDB installation and configuration +# - SSL certificate setup (Let's Encrypt) +# - Airavata services build and deployment +# +# Usage: +# ansible-playbook -i inventories/<env> airavata_setup.yml --ask-vault-pass +# +# Prerequisites: +# - Clean server with root/sudo access +# - DNS configured (for Let's Encrypt) + +- name: Full Airavata Environment Setup + hosts: airavata_servers + become: yes + + roles: + # Environment and prerequisites + - role: env_setup + tags: + - env_setup + + # Java installation + - role: java + tags: + - java + + # Maven, Git, and source checkout + - role: common + become: yes + become_user: "{{ user | default('airavata') }}" + tags: + - common + + # Zookeeper installation and configuration + - role: zookeeper + tags: + - zookeeper + - airavata + + # Kafka installation and configuration + - role: kafka + tags: + - kafka + - airavata + + # RabbitMQ installation and configuration + - role: rabbitmq + tags: + - rabbitmq + - airavata + + # MariaDB installation and configuration + - role: database + tags: + - database + + # SSL certificates (Let's Encrypt) + - role: letsencrypt + tags: + - ssl + - letsencrypt + + # Build and deploy Airavata services + - role: airavata_services + become: yes + become_user: "{{ user | default('airavata') }}" + tags: + - airavata_services + - deploy + diff --git a/dev-tools/ansible/airavata_update.yml b/dev-tools/ansible/airavata_update.yml new file mode 100644 index 0000000000..1150e4d55d --- /dev/null +++ b/dev-tools/ansible/airavata_update.yml @@ -0,0 +1,68 @@ +# +# +# 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. +# + +--- +# Airavata Services Update Playbook +# +# This playbook updates existing Airavata services in environments where +# infrastructure (Zookeeper, RabbitMQ, databases) already exists. +# +# Usage: +# ansible-playbook -i inventories/<env> airavata_update.yml --ask-vault-pass +# +# Prerequisites: +# - Infrastructure components already running (Zookeeper, RabbitMQ, databases) +# - Previous deployment exists +# - SSH access to target servers + +- name: Update Airavata Services + hosts: airavata_servers + become: yes + become_user: "{{ deploy_user | default(ansible_user) }}" + + tasks: + - name: Display deployment information + debug: + msg: "Updating Airavata services on {{ inventory_hostname }}" + + - name: Pull and build Airavata + include_role: + name: airavata_services + tasks_from: build + + - name: Stop all services + include_role: + name: airavata_services + tasks_from: stop_services + + - name: Deploy all services + include_role: + name: airavata_services + tasks_from: main + + - name: Start all services + include_role: + name: airavata_services + tasks_from: start_services + + - name: Display completion message + debug: + msg: "Airavata services update completed on {{ inventory_hostname }}" + diff --git a/dev-tools/ansible/deploy_setup.sh b/dev-tools/ansible/deploy_setup.sh new file mode 100755 index 0000000000..c8c7a6ee63 --- /dev/null +++ b/dev-tools/ansible/deploy_setup.sh @@ -0,0 +1,72 @@ +#!/bin/bash +# +# 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. +# + +# Full environment setup wrapper script for Airavata deployment + +set -e + +if [ -z "$1" ]; then + echo "Usage: $0 <environment>" + echo "" + echo "Deploys complete Airavata environment from scratch including all infrastructure components." + echo "" + echo "Examples:" + echo " $0 prod" + echo " $0 dev" + echo " $0 staging" + exit 1 +fi + +ENV=$1 +INVENTORY="inventories/$ENV" + +if [ ! -d "$INVENTORY" ]; then + echo "Error: Inventory directory '$INVENTORY' not found" + echo "" + echo "Available inventories:" + ls -1 inventories/ 2>/dev/null || echo " (none found)" + exit 1 +fi + +echo "==========================================" +echo "Full Airavata Setup Deployment" +echo "==========================================" +echo "Environment: $ENV" +echo "Inventory: $INVENTORY" +echo "" +echo "This will set up a complete Airavata environment from scratch," +echo "including Java, Maven, Zookeeper, Kafka, RabbitMQ, MariaDB," +echo "SSL certificates, and all Airavata services." +echo "" +read -p "Continue? (y/N): " -n 1 -r +echo +if [[ ! $REPLY =~ ^[Yy]$ ]]; then + echo "Deployment cancelled." + exit 1 +fi + +echo "Starting deployment..." +ansible-playbook -i "$INVENTORY" airavata_setup.yml --ask-vault-pass + +echo "" +echo "==========================================" +echo "Deployment completed!" +echo "==========================================" + diff --git a/dev-tools/ansible/deploy_update.sh b/dev-tools/ansible/deploy_update.sh new file mode 100755 index 0000000000..7a4bf13de8 --- /dev/null +++ b/dev-tools/ansible/deploy_update.sh @@ -0,0 +1,75 @@ +#!/bin/bash +# +# 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. +# + +# Service update wrapper script for Airavata deployment + +set -e + +if [ -z "$1" ]; then + echo "Usage: $0 <environment>" + echo "" + echo "Updates existing Airavata services in the specified environment." + echo "" + echo "Examples:" + echo " $0 prod" + echo " $0 dev" + echo "" + exit 1 +fi + +ENV=$1 +INVENTORY="inventories/$ENV" + +if [ ! -d "$INVENTORY" ]; then + echo "Error: Inventory directory '$INVENTORY' not found" + echo "" + echo "Available inventories:" + ls -1 inventories/ 2>/dev/null || echo " (none found)" + exit 1 +fi + +echo "==========================================" +echo "Airavata Service Update" +echo "==========================================" +echo "Environment: $ENV" +echo "Inventory: $INVENTORY" +echo "" +echo "This will:" +echo " 1. Pull latest code from git" +echo " 2. Build Airavata with Maven" +echo " 3. Stop all services" +echo " 4. Deploy new artifacts" +echo " 5. Start all services" +echo "" +read -p "Continue? (y/N): " -n 1 -r +echo +if [[ ! $REPLY =~ ^[Yy]$ ]]; then + echo "Update cancelled." + exit 1 +fi + +echo "Starting update..." +ansible-playbook -i "$INVENTORY" airavata_update.yml --ask-vault-pass + +echo "" +echo "==========================================" +echo "Update completed!" +echo "==========================================" + diff --git a/dev-tools/ansible/inventories/dev/group_vars/all/vars.yml b/dev-tools/ansible/inventories/dev/group_vars/all/vars.yml new file mode 100644 index 0000000000..b964069549 --- /dev/null +++ b/dev-tools/ansible/inventories/dev/group_vars/all/vars.yml @@ -0,0 +1,76 @@ +--- +# Non-sensitive configuration variables for dev environment + +# Airavata version and build settings +airavata_version: "0.21-SNAPSHOT" +git_branch: "master" +airavata_git_repo: "https://github.com/apache/airavata.git" +airavata_source_dir: "/home/{{ deploy_user }}/airavata-src" +deployment_dir: "/home/{{ deploy_user }}/airavata" + +# Deployment user +deploy_user: "exouser" + +# Service ports +api_server_port: 8930 +profile_service_port: 8962 +registry_port: 8970 +registry_server_port: 8970 +sharing_registry_port: 7878 +cred_store_port: 8960 +agent_service_port: 18880 +research_service_port: 18899 +file_server_port: 8050 +restproxy_port: 8082 + +# Database drivers +registry_jdbc_driver: "org.mariadb.jdbc.Driver" +appcatalog_jdbc_driver: "org.mariadb.jdbc.Driver" +replicacatalog_jdbc_driver: "org.mariadb.jdbc.Driver" +workflowcatalog_jdbc_driver: "org.mariadb.jdbc.Driver" +sharingcatalog_jdbc_driver: "org.mariadb.jdbc.Driver" +profile_service_jdbc_driver: "org.mariadb.jdbc.Driver" +credential_store_jdbc_driver: "org.mariadb.jdbc.Driver" + +# Database users +registry_jdbc_user: "root" +appcatalog_jdbc_user: "root" +replicacatalog_jdbc_user: "root" +workflowcatalog_jdbc_user: "root" +sharingcatalog_jdbc_user: "root" +profile_service_jdbc_user: "root" +credential_store_jdbc_user: "root" + +# Paths +local_data_location: "/home/{{ deploy_user }}/temp-storage" +file_server_storage_location: "/home/{{ deploy_user }}/temp-storage" +agent_service_storage_path: "/var/www/portals/gateway-user-data" + +# Keystore file name +vault_keystore_file: "airavata.sym.p12" + +# Email monitor settings +email_based_monitor_host: "imap.gmail.com" +email_based_monitor_store_protocol: "imaps" +email_based_monitor_folder_name: "INBOX" +email_expiration_minutes: 60 +email_based_monitoring_period: 10000 + +# Kafka and RabbitMQ +kafka_broker_url: "localhost:9092" +restproxy_broker_url: "localhost:9092" +rabbitmq_status_exchange_name: "status_exchange" +rabbitmq_process_exchange_name: "process_exchange" +rabbitmq_experiment_exchange_name: "experiment_exchange" +experiment_launch_queue: "experiment_launch" + +# Zookeeper connection +zookeeper_connection: "localhost:2181" +embedded_zk: false + +# Other non-sensitive configuration +enable_sharing: true +enable_validation: true +enable_realtime_monitor: true +job_notification_enable: true + diff --git a/dev-tools/ansible/inventories/dev/hosts b/dev-tools/ansible/inventories/dev/hosts new file mode 100644 index 0000000000..d0ac8dc5f6 --- /dev/null +++ b/dev-tools/ansible/inventories/dev/hosts @@ -0,0 +1,12 @@ +[airavata_servers] +dev-server + +[zookeeper] +dev-server + +[rabbitmq] +dev-server + +[database] +dev-server + diff --git a/dev-tools/ansible/inventories/template/README.md b/dev-tools/ansible/inventories/template/README.md new file mode 100644 index 0000000000..e82de5cdcd --- /dev/null +++ b/dev-tools/ansible/inventories/template/README.md @@ -0,0 +1,148 @@ +# Airavata Deployment Inventory Template + +This directory contains a template for creating new Airavata deployment inventories. + +## Quick Start for New Environment + +### 1. Copy this template + +```bash +cp -r inventories/template inventories/my-env +cd inventories/my-env +``` + +### 2. Rename example files + +```bash +mv hosts.example hosts +mv group_vars/all/vars.yml.example group_vars/all/vars.yml +mv group_vars/all/vault.yml.example group_vars/all/vault.yml +mv host_vars/airavata-server/vault.yml.example host_vars/airavata-server/vault.yml +``` + +### 3. Edit configuration files + +Edit all files and replace `CHANGEME` values with your actual values: + +**hosts** - Replace `airavata-server` with your host alias if needed +**group_vars/all/vars.yml** - Set non-sensitive configuration values +**group_vars/all/vault.yml** - Set sensitive values (passwords, URLs, etc.) +**host_vars/airavata-server/vault.yml** - Set server IP addresses and SSH credentials + +### 4. Encrypt sensitive files + +Encrypt the vault files to protect sensitive information: + +```bash +cd ../my-env + +# Encrypt group variables (database passwords, API keys, etc.) +ansible-vault encrypt group_vars/all/vault.yml + +# Encrypt host variables (server IPs, SSH keys) +ansible-vault encrypt host_vars/airavata-server/vault.yml +``` + +### 5. Test connection + +Verify you can connect to your server: + +```bash +ansible-playbook -i inventories/my-env --list-hosts -m ping --ask-vault-pass +``` + +### 6. Deploy + +**For initial setup (full environment from scratch):** +```bash +./deploy_setup.sh my-env +``` + +or + +```bash +ansible-playbook -i inventories/my-env airavata_setup.yml --ask-vault-pass +``` + +**For service updates (infrastructure already exists):** +```bash +./deploy_update.sh my-env +``` + +or + +```bash +ansible-playbook -i inventories/my-env airavata_update.yml --ask-vault-pass +``` + +## File Structure + +``` +my-env/ +├── hosts # Host definitions +├── group_vars/ +│ └── all/ +│ ├── vars.yml # Non-sensitive variables +│ └── vault.yml # Encrypted sensitive variables +└── host_vars/ + └── airavata-server/ + └── vault.yml # Encrypted server-specific variables +``` + +## Key Configuration Points + +### Server Access (host_vars/airavata-server/vault.yml) +- `ansible_host` - Server IP address or hostname +- `ansible_user` - SSH user for deployment +- `ansible_ssh_private_key_file` - Path to SSH private key + +### Database Configuration (group_vars/all/vault.yml) +- All database passwords +- Database URLs and connection strings +- Server IP addresses embedded in URLs + +### Service Configuration (group_vars/all/vault.yml) +- IAM/Keycloak credentials +- OAuth client secrets +- RabbitMQ connection strings +- Email monitoring credentials +- Tunnel server tokens +- Keystore passwords + +### Non-Sensitive Configuration (group_vars/all/vars.yml) +- Service ports +- Build settings (git repository, branch, version) +- Paths and directories + +## Managing Vault Files + +**View an encrypted file:** +```bash +ansible-vault view group_vars/all/vault.yml +``` + +**Edit an encrypted file:** +```bash +ansible-vault edit group_vars/all/vault.yml +``` + +**Change vault password:** +```bash +ansible-vault rekey group_vars/all/vault.yml +``` + +## Troubleshooting + +**Issue: Playbook asks for vault password repeatedly** +- Check that all vault files are encrypted +- Verify the inventory directory path is correct + +**Issue: Connection refused** +- Verify `ansible_host` in host_vars is correct +- Check SSH key file path and permissions +- Ensure target server is accessible from your machine + +**Issue: Services don't start** +- Check logs in `deployment_dir/logs/` +- Verify all required ports are open +- Ensure database connectivity \ No newline at end of file diff --git a/dev-tools/ansible/inventories/template/group_vars/all/vars.yml.example b/dev-tools/ansible/inventories/template/group_vars/all/vars.yml.example new file mode 100644 index 0000000000..003ad940b9 --- /dev/null +++ b/dev-tools/ansible/inventories/template/group_vars/all/vars.yml.example @@ -0,0 +1,25 @@ +--- +# Non-sensitive configuration variables +# Copy this file to vars.yml and update values as needed + +# Airavata version and build settings +airavata_version: "0.21-SNAPSHOT" +git_branch: "master" +airavata_git_repo: "https://github.com/apache/airavata.git" +airavata_source_dir: "/home/{{ deploy_user }}/airavata-src" +deployment_dir: "/home/{{ deploy_user }}/airavata" + +# Non-sensitive service settings +deploy_user: "CHANGEME_DEPLOY_USER" +api_server_port: 8930 +profile_service_port: 8962 +registry_port: 8970 + +# Database info +registry_jdbc_driver: "org.mariadb.jdbc.Driver" +registry_jdbc_user: "root" +appcatalog_jdbc_user: "root" + +# Paths +local_data_location: "/home/{{ deploy_user }}/temp-storage" + diff --git a/dev-tools/ansible/inventories/template/group_vars/all/vault.yml.example b/dev-tools/ansible/inventories/template/group_vars/all/vault.yml.example new file mode 100644 index 0000000000..f738651aeb --- /dev/null +++ b/dev-tools/ansible/inventories/template/group_vars/all/vault.yml.example @@ -0,0 +1,85 @@ +--- +# Sensitive configuration variables (will be encrypted) +# Copy this file to vault.yml, fill in CHANGEME values, then encrypt: +# ansible-vault encrypt vault.yml + +# Database passwords +registry_jdbc_password: "CHANGEME_DB_PASSWORD" +appcatalog_jdbc_password: "CHANGEME_DB_PASSWORD" +replicacatalog_jdbc_password: "CHANGEME_DB_PASSWORD" +workflowcatalog_jdbc_password: "CHANGEME_DB_PASSWORD" +sharingcatalog_jdbc_password: "CHANGEME_DB_PASSWORD" +profile_service_jdbc_password: "CHANGEME_DB_PASSWORD" +credential_store_jdbc_password: "CHANGEME_DB_PASSWORD" + +# Database URLs +registry_jdbc_url: "jdbc:mariadb://CHANGEME_DB_HOST:3306/experiment_catalog" +appcatalog_jdbc_url: "jdbc:mariadb://CHANGEME_DB_HOST:3306/app_catalog" +replicacatalog_jdbc_url: "jdbc:mariadb://CHANGEME_DB_HOST:3306/replica_catalog" +workflowcatalog_jdbc_url: "jdbc:mariadb://CHANGEME_DB_HOST:3306/workflow_catalog" +sharingcatalog_jdbc_url: "jdbc:mariadb://CHANGEME_DB_HOST:3306/sharing_catalog" +profile_service_jdbc_url: "jdbc:mariadb://CHANGEME_DB_HOST:3306/profile_service" +credential_store_jdbc_url: "jdbc:mariadb://CHANGEME_DB_HOST:3306/credential_store" + +# IAM credentials +iam_server_url: "https://CHANGEME_IAM_SERVER" +iam_admin_username: "admin" +iam_admin_password: "CHANGEME_IAM_PASSWORD" + +# OAuth secrets +default_registry_password: "CHANGEME_REGISTRY_PASSWORD" +default_registry_oauth_client_secret: "CHANGEME_OAUTH_SECRET" + +# RabbitMQ +rabbitmq_broker_url: "amqp://guest:guest@localhost:5672/CHANGEME_VHOST" + +# Zookeeper +zookeeper_connection: "localhost:2181" + +# Email monitoring +email_based_monitor_address: "CHANGEME_EMAIL_ADDRESS" +email_based_monitor_password: "CHANGEME_EMAIL_PASSWORD" + +# Kafka +kafka_broker_url: "localhost:9092" +job_status_publish_endpoint: "http://CHANGEME_API_HOST:8082/topics/helix-airavata-mq" + +# Tunnel tokens (for agent service) +tunnel_server_host: "CHANGEME_TUNNEL_HOST" +tunnel_server_port: 17000 +tunnel_server_token: "CHANGEME_TUNNEL_TOKEN" +tunnel_server_api_url: "http://CHANGEME_TUNNEL_HOST:8000" + +# Keystore passwords +keystore_password: "CHANGEME_KEYSTORE_PASSWORD" +credential_store_keystore_password: "CHANGEME_CRED_STORE_PASSWORD" + +# Agent service datasource +agent_service_datasource_url: "jdbc:mariadb://CHANGEME_DB_HOST:3306/app_catalog" +agent_service_datasource_username: "root" +agent_service_datasource_password: "CHANGEME_DB_PASSWORD" + +# Research service datasource +research_service_datasource_url: "jdbc:mariadb://CHANGEME_DB_HOST:3306/research_catalog" +research_service_datasource_username: "root" +research_service_datasource_password: "CHANGEME_DB_PASSWORD" + +# Agent service Airavata settings +agent_service_airavata_url: "localhost" +agent_service_airavata_port: 8930 +agent_service_airavata_secure: false + +# Research service URLs +research_hub_url: "https://CHANGEME_RESEARCH_HUB" +research_hub_dev_user: "[email protected]" +research_hub_admin_api_key: "CHANGEME_API_KEY" +research_hub_limit: 10 +research_portal_dev_url: "https://CHANGEME_PORTAL" +research_portal_url: "https://CHANGEME_PORTAL" +openid_url: "https://CHANGEME_AUTH_SERVER/realms/default/.well-known/openid-configuration" +user_profile_server_url: "CHANGEME_PROFILE_SERVER" +user_profile_server_port: 8962 + +# Keystore file +vault_keystore_file: "files/airavata.sym.p12" + diff --git a/dev-tools/ansible/inventories/template/host_vars/airavata-server/vault.yml.example b/dev-tools/ansible/inventories/template/host_vars/airavata-server/vault.yml.example new file mode 100644 index 0000000000..477d50a07e --- /dev/null +++ b/dev-tools/ansible/inventories/template/host_vars/airavata-server/vault.yml.example @@ -0,0 +1,19 @@ +--- +# Server-specific sensitive variables (will be encrypted) +# Copy this file to vault.yml, fill in values, then encrypt: +# ansible-vault encrypt vault.yml + +# SSH connection details +ansible_host: "CHANGEME_SERVER_IP" +ansible_user: "CHANGEME_SSH_USER" +ansible_ssh_private_key_file: "CHANGEME_PATH_TO_SSH_KEY" + +# Optional: If using password-based SSH +# ansible_password: "CHANGEME_SSH_PASSWORD" + +# Optional: If SSH runs on non-standard port +# ansible_port: 22 + +# Optional: SSH connection timeout +# ansible_ssh_timeout: 30 + diff --git a/dev-tools/ansible/inventories/template/hosts.example b/dev-tools/ansible/inventories/template/hosts.example new file mode 100644 index 0000000000..9c1852ea78 --- /dev/null +++ b/dev-tools/ansible/inventories/template/hosts.example @@ -0,0 +1,12 @@ +[airavata_servers] +airavata-server + +[zookeeper] +airavata-server + +[rabbitmq] +airavata-server + +[database] +airavata-server + diff --git a/dev-tools/ansible/roles/airavata_services/defaults/main.yml b/dev-tools/ansible/roles/airavata_services/defaults/main.yml new file mode 100644 index 0000000000..0aacf9f5df --- /dev/null +++ b/dev-tools/ansible/roles/airavata_services/defaults/main.yml @@ -0,0 +1,214 @@ +# +# +# 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. +# + +--- +# Airavata Services Role Default Variables + +# Service distribution names +airavata_version: "0.21-SNAPSHOT" +api_server_dist_name: "apache-airavata-api-server-{{ airavata_version }}" +agent_service_dist_name: "apache-airavata-agent-service-{{ airavata_version }}" +research_service_dist_name: "apache-airavata-research-service-{{ airavata_version }}" +file_server_dist_name: "apache-airavata-file-server-{{ airavata_version }}" +restproxy_dist_name: "apache-airavata-restproxy-{{ airavata_version }}" + +# Service directories +api_server_dir: "{{ deployment_dir }}/{{ api_server_dist_name }}" +agent_service_dir: "{{ deployment_dir }}/{{ agent_service_dist_name }}" +research_service_dir: "{{ deployment_dir }}/{{ research_service_dist_name }}" +file_server_dir: "{{ deployment_dir }}/{{ file_server_dist_name }}" +restproxy_dir: "{{ deployment_dir }}/{{ restproxy_dist_name }}" + +# Service ports +api_server_port: 8930 +profile_service_port: 8962 +registry_port: 8970 +registry_server_port: 8970 +sharing_registry_port: 7878 +cred_store_port: 8960 +agent_service_port: 18880 +research_service_port: 18899 +file_server_port: 8050 +restproxy_port: 8082 + +# Service hosts +api_server_host: "0.0.0.0" +profile_service_host: "0.0.0.0" +agent_service_server_address: "0.0.0.0" +research_service_server_address: "0.0.0.0" + +# Monitoring ports +api_server_monitoring_port: 9097 +participant_monitoring_port: 9096 +pre_wm_monitoring_port: 9093 +post_wm_monitoring_port: 9094 + +# Monitoring hosts +api_server_monitoring_host: "localhost" +participant_monitoring_host: "localhost" +pre_workflow_manager_monitoring_host: "localhost" +post_workflow_manager_monitoring_host: "localhost" + +# Server hosts +orchestrator_server_host: "localhost" +regserver_server_host: "localhost" +sharing_registry_server_host: "localhost" +cred_store_server_host: "localhost" + +# Orchestrator configuration +orchestrator_class: "org.apache.airavata.orchestrator.server.OrchestratorServer" +orchestrator_server_port: 8940 +orchestrator_server_min_threads: 50 +job_validators: "org.apache.airavata.orchestrator.core.validator.impl.BatchQueueValidator,org.apache.airavata.orchestrator.core.validator.impl.ExperimentStatusValidator" +enable_validation: true +host_scheduler: "org.apache.airavata.orchestrator.core.schedule.DefaultHostScheduler" + +# Registry server configuration +regserver_class: "org.apache.airavata.registry.api.service.RegistryAPIServer" + +# Sharing registry configuration +sharing_server_class: "org.apache.airavata.sharing.registry.server.SharingRegistryServer" +enable_sharing: true + +# Default registry user +default_registry_user: "default-admin" +default_registry_gateway: "default" +default_registry_oauth_client_id: "pga" +super_tenant_gatewayId: "default" + +# JDBC driver +registry_jdbc_driver: "org.mariadb.jdbc.Driver" +appcatalog_jdbc_driver: "org.mariadb.jdbc.Driver" +replicacatalog_jdbc_driver: "org.mariadb.jdbc.Driver" +workflowcatalog_jdbc_driver: "org.mariadb.jdbc.Driver" +sharingcatalog_jdbc_driver: "org.mariadb.jdbc.Driver" +profile_service_jdbc_driver: "org.mariadb.jdbc.Driver" +credential_store_jdbc_driver: "org.mariadb.jdbc.Driver" + +# Security configuration +security_manager_class: "org.apache.airavata.service.security.KeyCloakSecurityManager" +TLS_enabled: false +TLS_client_timeout: 10000 +keystore_path: "keystores/airavata.p12" +authz_cache_enabled: true +authz_cache_manager_class: "org.apache.airavata.service.security.authzcache.DefaultAuthzCacheManager" +in_memory_cache_size: 1000 + +# Keystore configuration +credential_store_keystore_url: "keystores/airavata.sym.p12" +credential_store_keystore_alias: "airavata" + +# Job notification configuration +job_notification_enable: true +job_notification_emailids: "" +prefetch_count: 200 +durable_queue: false + +# RabbitMQ configuration +rabbitmq_status_exchange_name: "status_exchange" +rabbitmq_process_exchange_name: "process_exchange" +rabbitmq_experiment_exchange_name: "experiment_exchange" +experiment_launch_queue: "experiment_launch" + +# Zookeeper configuration +embedded_zk: false + +# Helix configuration +helix_cluster_name: "AiravataCluster" +helix_controller_name: "AiravataController" +helix_participant_name: "AiravataParticipant" +participant_monitoring_enabled: true + +# Job monitor configuration +enable_realtime_monitor: true +realtime_monitor_broker_consumer_group: "monitor" +realtime_monitor_broker_topic: "helix-airavata-mq" +job_monitor_broker_consumer_group: "MonitoringConsumer" +job_monitor_broker_topic: "monitoring-data" +job_monitor_broker_publisher_id: "AiravataMonitorPublisher" +job_monitor_email_publisher_id: "EmailBasedProducer" +job_monitor_realtime_publisher_id: "RealtimeProducer" + +# Email monitor configuration +email_based_monitor_host: "imap.gmail.com" +email_based_monitor_store_protocol: "imaps" +email_based_monitor_folder_name: "INBOX" +email_expiration_minutes: 60 +email_based_monitoring_period: 10000 + +# Pre-workflow manager configuration +pre_workflow_manager_loadbalance_clusters: false +pre_workflow_manager_monitoring_enabled: true +pre_workflow_manager_name: "AiravataPreWM" + +# Post-workflow manager configuration +post_workflow_manager_loadbalance_clusters: false +post_workflow_manager_monitoring_enabled: true +post_workflow_manager_name: "AiravataPostWM" + +# Parser-workflow configuration +data_parser_delete_container: true +data_parser_broker_consumer_group: "CHANGE_ME" +data_parser_topic: "CHANGE_ME" +data_parser_storage_resource_id: "CHANGE_ME" + +# Monitoring and scanning configuration +cluster_status_monitoring_enable: false +metaschedluer_job_scanning_enable: false +data_analyzer_job_scanning_enable: false + +# Data staging configuration +enable_streaming_transfer: false + +# Thrift client pool configuration +thrift_client_pool_abandoned_removal_enabled: true +thrift_client_pool_abandoned_removal_logged: false + +# DB Event Manager +db_event_manager_class: "org.apache.airavata.db.event.manager.DBEventManagerRunner" + +# Agent service configuration +agent_service_grpc_host: "api.dev.cybershuttle.org" +agent_service_grpc_port: 19900 +agent_service_grpc_max_inbound_message_size: 10485760 +agent_service_max_file_size: "200MB" +agent_service_max_request_size: "200MB" +agent_service_pool_name: "AppCatalogPool" +agent_service_leak_detection_threshold: 20000 +agent_service_ddl_auto: "create" + +# Research service configuration +research_service_grpc_port: 19908 +research_service_max_file_size: "200MB" +research_service_max_request_size: "200MB" +research_service_pool_name: "ResearchCatalogPool" +research_service_leak_detection_threshold: 20000 +research_service_ddl_auto: "validate" + +# File server configuration +file_server_max_file_size: "12GB" +file_server_max_request_size: "12GB" +file_server_file_size_threshold: "2MB" + +# Storage configuration +local_data_location: "/home/{{ deploy_user }}/temp-storage" +agent_service_storage_resource_id: "default_9c15d8af-3d36-4c3c-a07a-0f3b4bb5b903" +agent_service_storage_path: "/var/www/portals/gateway-user-data" +agent_service_application_interface_id: "AiravataAgent_3eeb580b-b0c6-4f7e-8e3d-22c4f84ec3f1" diff --git a/dev-tools/ansible/roles/airavata_services/handlers/main.yml b/dev-tools/ansible/roles/airavata_services/handlers/main.yml new file mode 100644 index 0000000000..087ccde391 --- /dev/null +++ b/dev-tools/ansible/roles/airavata_services/handlers/main.yml @@ -0,0 +1,23 @@ +# +# +# 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. +# + +--- +# Handlers for Airavata Services role + diff --git a/dev-tools/ansible/roles/airavata_services/tasks/build.yml b/dev-tools/ansible/roles/airavata_services/tasks/build.yml new file mode 100644 index 0000000000..310492fcd3 --- /dev/null +++ b/dev-tools/ansible/roles/airavata_services/tasks/build.yml @@ -0,0 +1,66 @@ +# +# +# 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. +# + +--- +- name: Pull latest code from git + git: + repo: "{{ airavata_git_repo }}" + dest: "{{ airavata_source_dir }}" + version: "{{ git_branch }}" + update: yes + register: git_pull_result + tags: + - build + +- name: Display git pull result + debug: + msg: "Git pull completed. Changed: {{ git_pull_result.changed }}" + +- name: Build Airavata with Maven + command: mvn clean install -DskipTests + args: + chdir: "{{ airavata_source_dir }}" + environment: + MAVEN_OPTS: "-Xmx2048m" + register: maven_build_result + tags: + - build + +- name: Display maven build result + debug: + msg: "Maven build completed successfully" + +- name: Check for built distributions + find: + paths: "{{ airavata_source_dir }}/distribution" + patterns: "apache-airavata-*.tar.gz" + register: distribution_files + tags: + - build + +- name: Verify required distribution files exist + assert: + that: + - distribution_files.matched >= 5 + fail_msg: "Expected at least 5 distribution files, found {{ distribution_files.matched }}" + success_msg: "Found {{ distribution_files.matched }} distribution files" + tags: + - build + diff --git a/dev-tools/ansible/roles/airavata_services/tasks/deploy_agent_service.yml b/dev-tools/ansible/roles/airavata_services/tasks/deploy_agent_service.yml new file mode 100644 index 0000000000..6e603411f9 --- /dev/null +++ b/dev-tools/ansible/roles/airavata_services/tasks/deploy_agent_service.yml @@ -0,0 +1,78 @@ +# +# +# 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. +# + +--- +- name: Remove old Agent Service deployment if exists + file: + path: "{{ agent_service_dir }}" + state: absent + tags: + - deploy + - agent-service + +- name: Extract Agent Service distribution + unarchive: + src: "{{ airavata_source_dir }}/distribution/apache-airavata-agent-service-{{ airavata_version }}.tar.gz" + dest: "{{ deployment_dir }}" + remote_src: yes + tags: + - deploy + - agent-service + +- name: Create configuration directory for Agent Service + file: + path: "{{ agent_service_dir }}/conf" + state: directory + owner: "{{ deploy_user }}" + group: "{{ deploy_user }}" + tags: + - deploy + - agent-service + +- name: Deploy application.yml for Agent Service + template: + src: application-agent-service.yml.j2 + dest: "{{ agent_service_dir }}/conf/application.yml" + owner: "{{ deploy_user }}" + group: "{{ deploy_user }}" + mode: "0644" + tags: + - deploy + - agent-service + +- name: Deploy log4j2.xml for Agent Service + template: + src: log4j2.xml.j2 + dest: "{{ agent_service_dir }}/conf/log4j2.xml" + owner: "{{ deploy_user }}" + group: "{{ deploy_user }}" + mode: "0644" + tags: + - deploy + - agent-service + +- name: Set executable permissions on Agent Service script + file: + path: "{{ agent_service_dir }}/bin/agent-service.sh" + mode: "0755" + tags: + - deploy + - agent-service + diff --git a/dev-tools/ansible/roles/airavata_services/tasks/deploy_api_server.yml b/dev-tools/ansible/roles/airavata_services/tasks/deploy_api_server.yml new file mode 100644 index 0000000000..b93cf52775 --- /dev/null +++ b/dev-tools/ansible/roles/airavata_services/tasks/deploy_api_server.yml @@ -0,0 +1,120 @@ +# +# +# 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. +# + +--- +- name: Remove old API Server deployment if exists + file: + path: "{{ api_server_dir }}" + state: absent + tags: + - deploy + - api-server + +- name: Extract API Server distribution + unarchive: + src: "{{ airavata_source_dir }}/distribution/apache-airavata-api-server-{{ airavata_version }}.tar.gz" + dest: "{{ deployment_dir }}" + remote_src: yes + tags: + - deploy + - api-server + +- name: Create configuration directory for API Server + file: + path: "{{ api_server_dir }}/conf" + state: directory + owner: "{{ deploy_user }}" + group: "{{ deploy_user }}" + tags: + - deploy + - api-server + +- name: Create keystores directory for API Server + file: + path: "{{ api_server_dir }}/conf/keystores" + state: directory + owner: "{{ deploy_user }}" + group: "{{ deploy_user }}" + tags: + - deploy + - api-server + +- name: Deploy airavata-server.properties + template: + src: airavata-server.properties.j2 + dest: "{{ api_server_dir }}/conf/airavata-server.properties" + owner: "{{ deploy_user }}" + group: "{{ deploy_user }}" + mode: "0644" + tags: + - deploy + - api-server + +- name: Deploy email-config.yml + template: + src: email-config.yml.j2 + dest: "{{ api_server_dir }}/conf/email-config.yml" + owner: "{{ deploy_user }}" + group: "{{ deploy_user }}" + mode: "0644" + tags: + - deploy + - api-server + +- name: Deploy log4j2.xml + template: + src: log4j2.xml.j2 + dest: "{{ api_server_dir }}/conf/log4j2.xml" + owner: "{{ deploy_user }}" + group: "{{ deploy_user }}" + mode: "0644" + tags: + - deploy + - api-server + +- name: Copy keystore file + copy: + src: "{{ inventory_dir }}/files/{{ vault_keystore_file }}" + dest: "{{ api_server_dir }}/conf/keystores/{{ vault_keystore_file | basename }}" + owner: "{{ deploy_user }}" + group: "{{ deploy_user }}" + mode: "0600" + decrypt: yes + when: vault_keystore_file is defined + tags: + - deploy + - api-server + +- name: Set executable permissions on API Server scripts + file: + path: "{{ api_server_dir }}/bin/{{ item }}" + mode: "0755" + loop: + - orchestrator.sh + - controller.sh + - participant.sh + - pre-wm.sh + - post-wm.sh + - email-monitor.sh + - realtime-monitor.sh + tags: + - deploy + - api-server + diff --git a/dev-tools/ansible/roles/airavata_services/tasks/deploy_file_server.yml b/dev-tools/ansible/roles/airavata_services/tasks/deploy_file_server.yml new file mode 100644 index 0000000000..99bb583f85 --- /dev/null +++ b/dev-tools/ansible/roles/airavata_services/tasks/deploy_file_server.yml @@ -0,0 +1,78 @@ +# +# +# 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. +# + +--- +- name: Remove old File Server deployment if exists + file: + path: "{{ file_server_dir }}" + state: absent + tags: + - deploy + - file-server + +- name: Extract File Server distribution + unarchive: + src: "{{ airavata_source_dir }}/distribution/apache-airavata-file-server-{{ airavata_version }}.tar.gz" + dest: "{{ deployment_dir }}" + remote_src: yes + tags: + - deploy + - file-server + +- name: Create configuration directory for File Server + file: + path: "{{ file_server_dir }}/conf" + state: directory + owner: "{{ deploy_user }}" + group: "{{ deploy_user }}" + tags: + - deploy + - file-server + +- name: Deploy application.properties for File Server + template: + src: application-file-server.properties.j2 + dest: "{{ file_server_dir }}/conf/application.properties" + owner: "{{ deploy_user }}" + group: "{{ deploy_user }}" + mode: "0644" + tags: + - deploy + - file-server + +- name: Deploy log4j2.xml for File Server + template: + src: log4j2.xml.j2 + dest: "{{ file_server_dir }}/conf/log4j2.xml" + owner: "{{ deploy_user }}" + group: "{{ deploy_user }}" + mode: "0644" + tags: + - deploy + - file-server + +- name: Set executable permissions on File Server script + file: + path: "{{ file_server_dir }}/bin/file-service.sh" + mode: "0755" + tags: + - deploy + - file-server + diff --git a/dev-tools/ansible/roles/airavata_services/tasks/deploy_research_service.yml b/dev-tools/ansible/roles/airavata_services/tasks/deploy_research_service.yml new file mode 100644 index 0000000000..132f3e715c --- /dev/null +++ b/dev-tools/ansible/roles/airavata_services/tasks/deploy_research_service.yml @@ -0,0 +1,78 @@ +# +# +# 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. +# + +--- +- name: Remove old Research Service deployment if exists + file: + path: "{{ research_service_dir }}" + state: absent + tags: + - deploy + - research-service + +- name: Extract Research Service distribution + unarchive: + src: "{{ airavata_source_dir }}/distribution/apache-airavata-research-service-{{ airavata_version }}.tar.gz" + dest: "{{ deployment_dir }}" + remote_src: yes + tags: + - deploy + - research-service + +- name: Create configuration directory for Research Service + file: + path: "{{ research_service_dir }}/conf" + state: directory + owner: "{{ deploy_user }}" + group: "{{ deploy_user }}" + tags: + - deploy + - research-service + +- name: Deploy application.yml for Research Service + template: + src: application-research-service.yml.j2 + dest: "{{ research_service_dir }}/conf/application.yml" + owner: "{{ deploy_user }}" + group: "{{ deploy_user }}" + mode: "0644" + tags: + - deploy + - research-service + +- name: Deploy log4j2.xml for Research Service + template: + src: log4j2.xml.j2 + dest: "{{ research_service_dir }}/conf/log4j2.xml" + owner: "{{ deploy_user }}" + group: "{{ deploy_user }}" + mode: "0644" + tags: + - deploy + - research-service + +- name: Set executable permissions on Research Service script + file: + path: "{{ research_service_dir }}/bin/research-service.sh" + mode: "0755" + tags: + - deploy + - research-service + diff --git a/dev-tools/ansible/roles/airavata_services/tasks/deploy_restproxy.yml b/dev-tools/ansible/roles/airavata_services/tasks/deploy_restproxy.yml new file mode 100644 index 0000000000..0aeaa94a0e --- /dev/null +++ b/dev-tools/ansible/roles/airavata_services/tasks/deploy_restproxy.yml @@ -0,0 +1,78 @@ +# +# +# 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. +# + +--- +- name: Remove old REST Proxy deployment if exists + file: + path: "{{ restproxy_dir }}" + state: absent + tags: + - deploy + - restproxy + +- name: Extract REST Proxy distribution + unarchive: + src: "{{ airavata_source_dir }}/distribution/apache-airavata-restproxy-{{ airavata_version }}.tar.gz" + dest: "{{ deployment_dir }}" + remote_src: yes + tags: + - deploy + - restproxy + +- name: Create configuration directory for REST Proxy + file: + path: "{{ restproxy_dir }}/conf" + state: directory + owner: "{{ deploy_user }}" + group: "{{ deploy_user }}" + tags: + - deploy + - restproxy + +- name: Deploy application.properties for REST Proxy + template: + src: application-restproxy.properties.j2 + dest: "{{ restproxy_dir }}/conf/application.properties" + owner: "{{ deploy_user }}" + group: "{{ deploy_user }}" + mode: "0644" + tags: + - deploy + - restproxy + +- name: Deploy log4j2.xml for REST Proxy + template: + src: log4j2.xml.j2 + dest: "{{ restproxy_dir }}/conf/log4j2.xml" + owner: "{{ deploy_user }}" + group: "{{ deploy_user }}" + mode: "0644" + tags: + - deploy + - restproxy + +- name: Set executable permissions on REST Proxy script + file: + path: "{{ restproxy_dir }}/bin/restproxy.sh" + mode: "0755" + tags: + - deploy + - restproxy + diff --git a/dev-tools/ansible/roles/airavata_services/tasks/main.yml b/dev-tools/ansible/roles/airavata_services/tasks/main.yml new file mode 100644 index 0000000000..84f10aec2a --- /dev/null +++ b/dev-tools/ansible/roles/airavata_services/tasks/main.yml @@ -0,0 +1,36 @@ +# +# +# 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. +# + +--- +- name: Include service deployment tasks + include_tasks: deploy_api_server.yml + +- name: Include agent service deployment tasks + include_tasks: deploy_agent_service.yml + +- name: Include research service deployment tasks + include_tasks: deploy_research_service.yml + +- name: Include file server deployment tasks + include_tasks: deploy_file_server.yml + +- name: Include REST proxy deployment tasks + include_tasks: deploy_restproxy.yml + diff --git a/dev-tools/ansible/roles/airavata_services/tasks/start_services.yml b/dev-tools/ansible/roles/airavata_services/tasks/start_services.yml new file mode 100644 index 0000000000..ea74081310 --- /dev/null +++ b/dev-tools/ansible/roles/airavata_services/tasks/start_services.yml @@ -0,0 +1,143 @@ +# +# +# 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. +# + +--- +- name: Start API Server orchestrator + shell: "{{ api_server_dir }}/bin/orchestrator.sh -d start api-orch" + args: + chdir: "{{ api_server_dir }}" + tags: + - start + - api-server + +- name: Start API Server controller + shell: "{{ api_server_dir }}/bin/controller.sh -d start" + args: + chdir: "{{ api_server_dir }}" + tags: + - start + - api-server + +- name: Start API Server participant + shell: "{{ api_server_dir }}/bin/participant.sh -d start" + args: + chdir: "{{ api_server_dir }}" + tags: + - start + - api-server + +- name: Start API Server email-monitor + shell: "{{ api_server_dir }}/bin/email-monitor.sh -d start" + args: + chdir: "{{ api_server_dir }}" + tags: + - start + - api-server + +- name: Start API Server realtime-monitor + shell: "{{ api_server_dir }}/bin/realtime-monitor.sh -d start" + args: + chdir: "{{ api_server_dir }}" + tags: + - start + - api-server + +- name: Start API Server pre-wm + shell: "{{ api_server_dir }}/bin/pre-wm.sh -d start" + args: + chdir: "{{ api_server_dir }}" + tags: + - start + - api-server + +- name: Start API Server post-wm + shell: "{{ api_server_dir }}/bin/post-wm.sh -d start" + args: + chdir: "{{ api_server_dir }}" + tags: + - start + - api-server + +- name: Wait for API Server to start + wait_for: + timeout: 30 + tags: + - start + - api-server + +- name: Start Agent Service + shell: "{{ agent_service_dir }}/bin/agent-service.sh -d start" + args: + chdir: "{{ agent_service_dir }}" + tags: + - start + - agent-service + +- name: Wait for Agent Service to start + wait_for: + timeout: 30 + tags: + - start + - agent-service + +- name: Start Research Service + shell: "{{ research_service_dir }}/bin/research-service.sh -d start" + args: + chdir: "{{ research_service_dir }}" + tags: + - start + - research-service + +- name: Wait for Research Service to start + wait_for: + timeout: 30 + tags: + - start + - research-service + +- name: Start File Server + shell: "{{ file_server_dir }}/bin/file-service.sh -d start" + args: + chdir: "{{ file_server_dir }}" + tags: + - start + - file-server + +- name: Wait for File Server to start + wait_for: + timeout: 30 + tags: + - start + - file-server + +- name: Start REST Proxy + shell: "{{ restproxy_dir }}/bin/restproxy.sh -d start" + args: + chdir: "{{ restproxy_dir }}" + tags: + - start + - restproxy + +- name: Wait for REST Proxy to start + wait_for: + timeout: 30 + tags: + - start + - restproxy diff --git a/dev-tools/ansible/roles/airavata_services/tasks/stop_services.yml b/dev-tools/ansible/roles/airavata_services/tasks/stop_services.yml new file mode 100644 index 0000000000..9bf784df76 --- /dev/null +++ b/dev-tools/ansible/roles/airavata_services/tasks/stop_services.yml @@ -0,0 +1,138 @@ +# +# +# 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. +# + +--- +- name: Check if API Server binary exists + stat: + path: "{{ api_server_dir }}/bin/orchestrator.sh" + register: api_server_exists + tags: + - stop + +- name: Stop API Server orchestrator if exists + shell: "{{ api_server_dir }}/bin/orchestrator.sh -d stop api-orch" + when: api_server_exists.stat.exists + tags: + - stop + ignore_errors: yes + +- name: Stop API Server controller if exists + shell: "{{ api_server_dir }}/bin/controller.sh -d stop" + when: api_server_exists.stat.exists + tags: + - stop + ignore_errors: yes + +- name: Stop API Server participant if exists + shell: "{{ api_server_dir }}/bin/participant.sh -d stop" + when: api_server_exists.stat.exists + tags: + - stop + ignore_errors: yes + +- name: Stop API Server pre-wm if exists + shell: "{{ api_server_dir }}/bin/pre-wm.sh -d stop" + when: api_server_exists.stat.exists + tags: + - stop + ignore_errors: yes + +- name: Stop API Server post-wm if exists + shell: "{{ api_server_dir }}/bin/post-wm.sh -d stop" + when: api_server_exists.stat.exists + tags: + - stop + ignore_errors: yes + +- name: Stop API Server email-monitor if exists + shell: "{{ api_server_dir }}/bin/email-monitor.sh -d stop" + when: api_server_exists.stat.exists + tags: + - stop + ignore_errors: yes + +- name: Stop API Server realtime-monitor if exists + shell: "{{ api_server_dir }}/bin/realtime-monitor.sh -d stop" + when: api_server_exists.stat.exists + tags: + - stop + ignore_errors: yes + +- name: Check if Agent Service binary exists + stat: + path: "{{ agent_service_dir }}/bin/agent-service.sh" + register: agent_service_exists + tags: + - stop + +- name: Stop Agent Service if exists + shell: "{{ agent_service_dir }}/bin/agent-service.sh -d stop" + when: agent_service_exists.stat.exists + tags: + - stop + ignore_errors: yes + +- name: Check if Research Service binary exists + stat: + path: "{{ research_service_dir }}/bin/research-service.sh" + register: research_service_exists + tags: + - stop + +- name: Stop Research Service if exists + shell: "{{ research_service_dir }}/bin/research-service.sh -d stop" + when: research_service_exists.stat.exists + tags: + - stop + ignore_errors: yes + +- name: Check if File Server binary exists + stat: + path: "{{ file_server_dir }}/bin/file-service.sh" + register: file_server_exists + tags: + - stop + +- name: Stop File Server if exists + shell: "{{ file_server_dir }}/bin/file-service.sh -d stop" + when: file_server_exists.stat.exists + tags: + - stop + ignore_errors: yes + +- name: Check if REST Proxy binary exists + stat: + path: "{{ restproxy_dir }}/bin/restproxy.sh" + register: restproxy_exists + tags: + - stop + +- name: Stop REST Proxy if exists + shell: "{{ restproxy_dir }}/bin/restproxy.sh -d stop" + when: restproxy_exists.stat.exists + tags: + - stop + ignore_errors: yes + +- name: Wait for services to fully stop + wait_for: + timeout: 30 + tags: + - stop diff --git a/dev-tools/ansible/roles/airavata_services/templates/airavata-server.properties.j2 b/dev-tools/ansible/roles/airavata_services/templates/airavata-server.properties.j2 new file mode 100644 index 0000000000..ac38f4818a --- /dev/null +++ b/dev-tools/ansible/roles/airavata_services/templates/airavata-server.properties.j2 @@ -0,0 +1,276 @@ +# +# +# 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. +# + +########################################################################### +# +# This properties file provides configuration for all Airavata Services: +# +########################################################################### + +########################################################################### +# API Server Registry DB Configuration +########################################################################### +registry.jdbc.driver={{ registry_jdbc_driver }} +registry.jdbc.url={{ registry_jdbc_url }} +registry.jdbc.user={{ registry_jdbc_user }} +registry.jdbc.password={{ registry_jdbc_password }} +validationQuery=SELECT 1 from CONFIGURATION + +########################################################################### +# Application Catalog DB Configuration +########################################################################### +appcatalog.jdbc.driver={{ appcatalog_jdbc_driver }} +appcatalog.jdbc.url={{ appcatalog_jdbc_url }} +appcatalog.jdbc.user={{ appcatalog_jdbc_user }} +appcatalog.jdbc.password={{ appcatalog_jdbc_password }} +appcatalog.validationQuery=SELECT 1 from CONFIGURATION + +########################################################################## +# Replica Catalog DB Configuration +########################################################################### +replicacatalog.jdbc.driver={{ replicacatalog_jdbc_driver }} +replicacatalog.jdbc.url={{ replicacatalog_jdbc_url }} +replicacatalog.jdbc.user={{ replicacatalog_jdbc_user }} +replicacatalog.jdbc.password={{ replicacatalog_jdbc_password }} +replicacatalog.validationQuery=SELECT 1 from CONFIGURATION + +########################################################################### +# Workflow Catalog DB Configuration +########################################################################### +workflowcatalog.jdbc.driver={{ workflowcatalog_jdbc_driver }} +workflowcatalog.jdbc.url={{ workflowcatalog_jdbc_url }} +workflowcatalog.jdbc.user={{ workflowcatalog_jdbc_user }} +workflowcatalog.jdbc.password={{ workflowcatalog_jdbc_password }} +workflowcatalog.validationQuery=SELECT 1 from CONFIGURATION + +########################################################################### +# Sharing Catalog DB Configuration +########################################################################### +sharingcatalog.jdbc.driver={{ sharingcatalog_jdbc_driver }} +sharingcatalog.jdbc.url={{ sharingcatalog_jdbc_url }} +sharingcatalog.jdbc.user={{ sharingcatalog_jdbc_user }} +sharingcatalog.jdbc.password={{ sharingcatalog_jdbc_password }} +sharingcatalog.validationQuery=SELECT 1 from CONFIGURATION + +########################################################################### +# Generic Server Configurations +########################################################################### +enable.sharing={{ enable_sharing }} + +########################################################################### +# Sharing Registry Server Configuration +########################################################################### +sharing_server={{ sharing_server_class }} +sharing.registry.server.host={{ sharing_registry_server_host }} +sharing.registry.server.port={{ sharing_registry_port }} + +########################################################################### +# Registry Server Configurations +########################################################################### +regserver={{ regserver_class }} +regserver.server.host={{ regserver_server_host }} +regserver.server.port={{ registry_server_port }} +regserver.server.min.threads={{ orchestrator_server_min_threads }} + +default.registry.user={{ default_registry_user }} +default.registry.password={{ default_registry_password }} +default.registry.gateway={{ default_registry_gateway }} +default.registry.oauth.client.id={{ default_registry_oauth_client_id }} +default.registry.oauth.client.secret={{ default_registry_oauth_client_secret }} +super.tenant.gatewayId={{ super_tenant_gatewayId }} + +########################################################################### +# API Server Configurations +########################################################################### +apiserver.class={{ apiserver_class }} +apiserver.host={{ api_server_host }} +apiserver.port={{ api_server_port }} +api.server.monitoring.enabled={{ api_server_monitoring_enabled }} +api.server.monitoring.host={{ api_server_monitoring_host }} +api.server.monitoring.port={{ api_server_monitoring_port }} + +########################################################################### +# Orchestrator Server Configurations +########################################################################### +orchestrator={{ orchestrator_class }} +orchestrator.server.host={{ orchestrator_server_host }} +orchestrator.server.port={{ orchestrator_server_port }} +orchestrator.server.min.threads={{ orchestrator_server_min_threads }} + +job.validators={{ job_validators }} +enable.validation={{ enable_validation }} +host.scheduler={{ host_scheduler }} + +########################################################################### +# Job Monitor Configurations +########################################################################### +job.notification.enable={{ job_notification_enable }} +#Provide comma separated email ids as a string if more than one +job.notification.emailids={{ job_notification_emailids }} +job.status.publish.endpoint={{ job_status_publish_endpoint }} + +########################################################################### +# Credential Store module Configuration +########################################################################### +credential.store.keystore.url={{ credential_store_keystore_url }} +credential.store.keystore.alias={{ credential_store_keystore_alias }} +credential.store.keystore.password={{ credential_store_keystore_password }} +credential.store.jdbc.url={{ credential_store_jdbc_url }} +credential.store.jdbc.user={{ credential_store_jdbc_user }} +credential.store.jdbc.password={{ credential_store_jdbc_password }} +credential.store.jdbc.driver={{ credential_store_jdbc_driver }} +credential.store.server.host={{ cred_store_server_host }} +credential.store.server.port={{ cred_store_port }} +credential.store.class={{ credential_store_class }} +credential.store.jdbc.validationQuery={{ credential_store_validation_query }} + +########################################################################### +# AMQP Notification Configuration +########################################################################### +rabbitmq.broker.url={{ rabbitmq_broker_url }} +experiment.launch.queue={{ experiment_launch_queue }} +rabbitmq.status.exchange.name={{ rabbitmq_status_exchange_name }} +rabbitmq.process.exchange.name={{ rabbitmq_process_exchange_name }} +rabbitmq.experiment.exchange.name={{ rabbitmq_experiment_exchange_name }} +durable.queue={{ durable_queue }} +prefetch.count={{ prefetch_count }} + +########################################################################### +# Zookeeper Server Configuration +########################################################################### +embedded.zk={{ embedded_zk }} +zookeeper.server.connection={{ zookeeper_connection }} + +######################################################################## +## API Security Configuration +######################################################################## +security.manager.class={{ security_manager_class }} +TLS.enabled={{ TLS_enabled }} +TLS.client.timeout={{ TLS_client_timeout }} +keystore.path={{ keystore_path }} +keystore.password={{ keystore_password }} +authz.cache.enabled={{ authz_cache_enabled }} +authz.cache.manager.class={{ authz_cache_manager_class }} +in.memory.cache.size={{ in_memory_cache_size }} + +########################################################################### +# Profile Service Configuration +########################################################################### +profile.service.server.host={{ profile_service_host }} +profile.service.server.port={{ profile_service_port }} +profile_service.class={{ profile_service_class }} +# MariaDB properties +profile.service.jdbc.url={{ profile_service_jdbc_url }} +profile.service.jdbc.user={{ profile_service_jdbc_user }} +profile.service.jdbc.password={{ profile_service_jdbc_password }} +profile.service.jdbc.driver={{ profile_service_jdbc_driver }} +profile.service.validationQuery={{ profile_service_validation_query }} + +########################################################################### +# Iam Admin services Configuration +########################################################################### +iam.server.url={{ iam_server_url }} +iam.server.super.admin.username={{ iam_admin_username }} +iam.server.super.admin.password={{ iam_admin_password }} + +########################################################################### +# DB Event Manager Runner +########################################################################### +db_event_manager.class={{ db_event_manager_class }} + +########################################################################### +# Job Execution Engine properties +########################################################################### +helix.cluster.name={{ helix_cluster_name }} +helix.controller.name={{ helix_controller_name }} +helix.participant.name={{ helix_participant_name }} +participant.monitoring.enabled={{ participant_monitoring_enabled }} +participant.monitoring.host={{ participant_monitoring_host }} +participant.monitoring.port={{ participant_monitoring_port }} + +########################################################################### +# Job Monitor related properties +########################################################################### +enable.realtime.monitor={{ enable_realtime_monitor }} +realtime.monitor.broker.consumer.group={{ realtime_monitor_broker_consumer_group }} +realtime.monitor.broker.topic={{ realtime_monitor_broker_topic }} + +job.monitor.broker.consumer.group={{ job_monitor_broker_consumer_group }} +job.monitor.broker.topic={{ job_monitor_broker_topic }} +job.monitor.broker.publisher.id={{ job_monitor_broker_publisher_id }} +job.monitor.email.publisher.id={{ job_monitor_email_publisher_id }} +job.monitor.realtime.publisher.id={{ job_monitor_realtime_publisher_id }} + +email.based.monitor.host={{ email_based_monitor_host }} +email.based.monitor.store.protocol={{ email_based_monitor_store_protocol }} +email.based.monitor.folder.name={{ email_based_monitor_folder_name }} +email.expiration.minutes={{ email_expiration_minutes }} +email.based.monitoring.period={{ email_based_monitoring_period }} +email.based.monitor.address={{ email_based_monitor_address }} +email.based.monitor.password={{ email_based_monitor_password }} + +kafka.broker.url={{ kafka_broker_url }} +local.data.location={{ local_data_location }} + +########################################################################### +# ThriftClientPool Configuration +########################################################################### +thrift.client.pool.abandoned.removal.enabled={{ thrift_client_pool_abandoned_removal_enabled }} +thrift.client.pool.abandoned.removal.logged={{ thrift_client_pool_abandoned_removal_logged }} + +########################################################################### +# Pre-workflow Configuration +########################################################################### +pre.workflow.manager.loadbalance.clusters={{ pre_workflow_manager_loadbalance_clusters }} +pre.workflow.manager.monitoring.enabled={{ pre_workflow_manager_monitoring_enabled }} +pre.workflow.manager.monitoring.host={{ pre_workflow_manager_monitoring_host }} +pre.workflow.manager.monitoring.port={{ pre_wm_monitoring_port }} +pre.workflow.manager.name={{ pre_workflow_manager_name }} + +########################################################################### +# Post-workflow Configuration +########################################################################### +post.workflow.manager.loadbalance.clusters={{ post_workflow_manager_loadbalance_clusters }} +post.workflow.manager.monitoring.enabled={{ post_workflow_manager_monitoring_enabled }} +post.workflow.manager.monitoring.host={{ post_workflow_manager_monitoring_host }} +post.workflow.manager.monitoring.port={{ post_wm_monitoring_port }} +post.workflow.manager.name={{ post_workflow_manager_name }} + +########################################################################### +# Parser-workflow Configuration +########################################################################### +data.parser.delete.container={{ data_parser_delete_container }} +data.parser.broker.consumer.group={{ data_parser_broker_consumer_group }} +data.parser.topic={{ data_parser_topic }} +data.parser.storage.resource.id={{ data_parser_storage_resource_id }} + +########################################################################### +# Metascheduler And Compute Resource Monitoring Configuration +########################################################################### +cluster.status.monitoring.enable={{ cluster_status_monitoring_enable }} +# cluster.status.monitoring.repeat.time=18000 +metaschedluer.job.scanning.enable={{ metaschedluer_job_scanning_enable }} +data.analyzer.job.scanning.enable={{ data_analyzer_job_scanning_enable }} + +########################################################################### +# Data Staging Task Level Configurations +########################################################################### +enable.streaming.transfer={{ enable_streaming_transfer }} + diff --git a/dev-tools/ansible/roles/airavata_services/templates/application-agent-service.yml.j2 b/dev-tools/ansible/roles/airavata_services/templates/application-agent-service.yml.j2 new file mode 100644 index 0000000000..62295600d4 --- /dev/null +++ b/dev-tools/ansible/roles/airavata_services/templates/application-agent-service.yml.j2 @@ -0,0 +1,63 @@ +# +# +# 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. +# + +grpc: + server: + host: {{ agent_service_grpc_host }} + port: {{ agent_service_grpc_port }} + max-inbound-message-size: {{ agent_service_grpc_max_inbound_message_size }} + +server: + port: {{ agent_service_server_port }} + address: {{ agent_service_server_address }} + +spring: + servlet: + multipart: + max-file-size: {{ agent_service_max_file_size }} + max-request-size: {{ agent_service_max_request_size }} + datasource: + url: "{{ agent_service_datasource_url }}" + username: "{{ agent_service_datasource_username }}" + password: "{{ agent_service_datasource_password }}" + driver-class-name: org.mariadb.jdbc.Driver + hikari: + pool-name: {{ agent_service_pool_name }} + leak-detection-threshold: {{ agent_service_leak_detection_threshold }} + jpa: + hibernate: + ddl-auto: {{ agent_service_ddl_auto }} + open-in-view: false + +airavata: + server: + url: {{ agent_service_airavata_url }} + port: {{ agent_service_airavata_port }} + secure: {{ agent_service_airavata_secure }} + storageResourceId: {{ agent_service_storage_resource_id }} + storagePath: {{ agent_service_storage_path }} + cluster: + applicationInterfaceId: {{ agent_service_application_interface_id }} + tunnel: + serverHost: {{ tunnel_server_host }} + serverPort: {{ tunnel_server_port }} + serverToken: {{ tunnel_server_token }} + serverApiUrl: {{ tunnel_server_api_url }} + diff --git a/dev-tools/ansible/roles/airavata_services/templates/application-file-server.properties.j2 b/dev-tools/ansible/roles/airavata_services/templates/application-file-server.properties.j2 new file mode 100644 index 0000000000..4a8e80afc7 --- /dev/null +++ b/dev-tools/ansible/roles/airavata_services/templates/application-file-server.properties.j2 @@ -0,0 +1,34 @@ +# +# +# 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. +# + +spring.servlet.multipart.max-file-size={{ file_server_max_file_size }} +spring.servlet.multipart.max-request-size={{ file_server_max_request_size }} +spring.servlet.multipart.file-size-threshold={{ file_server_file_size_threshold }} + +# files storage location (stores all files uploaded via REST API) +storage.location={{ file_server_storage_location }} + +regserver.server.host={{ regserver_server_host }} +regserver.server.port={{ registry_server_port }} +credential.store.server.host={{ credential_store_server_host }} +credential.store.server.port={{ cred_store_port }} + +server.port={{ file_server_port }} + diff --git a/dev-tools/ansible/roles/airavata_services/templates/application-research-service.yml.j2 b/dev-tools/ansible/roles/airavata_services/templates/application-research-service.yml.j2 new file mode 100644 index 0000000000..b433c6027d --- /dev/null +++ b/dev-tools/ansible/roles/airavata_services/templates/application-research-service.yml.j2 @@ -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. +# + +grpc: + server: + port: {{ research_service_grpc_port }} + +server: + port: {{ research_service_server_port }} + address: {{ research_service_server_address }} + +airavata: + research-hub: + url: {{ research_hub_url }} + dev-user: "{{ research_hub_dev_user }}" + adminApiKey: "{{ research_hub_admin_api_key }}" + limit: {{ research_hub_limit }} + research-portal: + dev-url: {{ research_portal_dev_url }} + url: {{ research_portal_url }} + + openid: + url: "{{ openid_url }}" + + user-profile: + server: + url: {{ user_profile_server_url }} + port: {{ user_profile_server_port }} + +spring: + servlet: + multipart: + max-file-size: {{ research_service_max_file_size }} + max-request-size: {{ research_service_max_request_size }} + datasource: + url: "{{ research_service_datasource_url }}" + username: "{{ research_service_datasource_username }}" + password: "{{ research_service_datasource_password }}" + driver-class-name: org.mariadb.jdbc.Driver + hikari: + pool-name: {{ research_service_pool_name }} + leak-detection-threshold: {{ research_service_leak_detection_threshold }} + jpa: + hibernate: + ddl-auto: {{ research_service_ddl_auto }} + open-in-view: false + +springdoc: + api-docs: + enabled: {{ springdoc_api_docs_enabled }} + swagger-ui: + path: {{ springdoc_swagger_ui_path }} + operationsSorter: {{ springdoc_swagger_ui_operations_sorter }} + tagsSorter: {{ springdoc_swagger_ui_tags_sorter }} + doc-expansion: {{ springdoc_swagger_ui_doc_expansion }} + oauth: + use-pkce-with-authorization-code-grant: {{ springdoc_swagger_ui_oauth_use_pkce }} + client-id: {{ springdoc_swagger_ui_oauth_client_id }} + diff --git a/dev-tools/ansible/roles/airavata_services/templates/application-restproxy.properties.j2 b/dev-tools/ansible/roles/airavata_services/templates/application-restproxy.properties.j2 new file mode 100644 index 0000000000..0659c934e1 --- /dev/null +++ b/dev-tools/ansible/roles/airavata_services/templates/application-restproxy.properties.j2 @@ -0,0 +1,23 @@ +# +# +# 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. +# + +restproxy.broker.url={{ restproxy_broker_url }} +server.port={{ restproxy_port }} + diff --git a/dev-tools/ansible/roles/airavata_services/templates/email-config.yml.j2 b/dev-tools/ansible/roles/airavata_services/templates/email-config.yml.j2 new file mode 100644 index 0000000000..e361cfd320 --- /dev/null +++ b/dev-tools/ansible/roles/airavata_services/templates/email-config.yml.j2 @@ -0,0 +1,114 @@ +# +# +# 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. +# + +config: + resources: + - jobManagerType: PBS + emailParser: org.apache.airavata.monitor.email.parser.PBSEmailParser + resourceEmailAddresses: + - [email protected] # gordon + - [email protected] # Bigred2 + - root <[email protected]> # Bigred2 + - root <[email protected]> # alamo + - root <[email protected]> #karst + - root <[email protected]> #mason + - smic3 <[email protected]> # philip.hpc.lsu + - [email protected] + - adm <[email protected]> #supermic + - root <[email protected]> #alamo + - root <[email protected]> #carbonate + - adm <[email protected]> # Mick cluster at LSU for CSBG-LSU + - GW77 Job Emails <[email protected]> #gw77 email to fix email issues + + - jobManagerType: SLURM + emailParser: org.apache.airavata.monitor.email.parser.SLURMEmailParser + resourceEmailAddresses: + - SDSC Admin <[email protected]> # comet + - [email protected] # stampede + - SDSC Admin <[email protected]> # comet new + - [email protected] + - Slurm <[email protected]> # bridges + - Slurm <[email protected]> #Bridges + - Slurm Daemon <[email protected]> # OU Schooner + - [email protected] # stampede2 + - Slurm service account <[email protected]> # Utah Ember + - SLURM workload manager <[email protected]> # JS Mark Cluster + - super user <[email protected]> # LS5 new email after Nov 5th 2018 + - [email protected] #LS5 old email + - [email protected] # Jureca Email + - Slurm <[email protected]> + - [email protected] + - [email protected] + - [email protected] # Jetstream Ultrascan static cluster with 10 nodes + - [email protected] #Stampede2 + - [email protected] #Searching SRA + - Slurm Admin <[email protected]> #GSU cluster + - [email protected] #USD cluster + - [email protected] + - [email protected] + - SLURM resource manager <[email protected]> #Bigdawg + - SLURM resource manager <[email protected]> #InterACTWEL Jetstream + - slurm@zoar #R System cluster + - GW77 Job Emails <[email protected]> #gw77 email to fix email issues + - SLURM resource manager <[email protected]> #seagrid elastic cluster + - SLURM resource manager <[email protected]> # EPW Jetstream slurm cluster + - SLURM resource manager <[email protected]> #Distant reader + - [email protected] #RT at SDSU + - Slurm on Mio <[email protected]> # MIO from Mines + - SLURM resource manager <[email protected]> # Jetstream Helix cluster + - SLURM resource manager <[email protected]> + - [email protected] + - super user <root@localhost> # Bigred3 + - SLURM resource manager <[email protected]> + - SLURM resource manager <[email protected]> + - Slurm <[email protected]> + - [email protected] #Pinnacle UCMerced Cluster + - [email protected] #HIVE Slurm + - [email protected] #VLab PlasmaScience JS2 cluster + - [email protected] #Anvil Purdue + - SLURM User <[email protected]> + - [email protected] #Frontera + + - jobManagerType: UGE + emailParser: org.apache.airavata.monitor.email.parser.UGEEmailParser + resourceEmailAddresses: + - ls4.tacc.utexas.edu # contain Lonestar + - root <root@local> # USD HPC Cluster + - root <[email protected]> # SIU Little Dog + - [email protected] # SIU Big Dog + - root <[email protected]> # USD HPC Cluster + + - jobManagerType: LSF + emailParser: org.apache.airavata.monitor.email.parser.LSFEmailParser + resourceEmailAddresses: + - iu.xsede.edu # test resource mail address + - tcs.tulsahpc.org #Tandy + + - jobManagerType: HTCONDOR + emailParser: org.apache.airavata.monitor.email.parser.HTCondorEmailParser + resourceEmailAddresses: + - [email protected] + - Owner of HTCondor Daemons <[email protected]> #EHT Condor Access point + - Owner of HTCondor Daemons <[email protected]> + - [email protected] # AutoDock_Vina +# - jobManagerType: HTCondor +# emailParser: org.apache.airavata.monitor.email.parser.HTCondorEmailParser +# resourceEmailAddresses: + diff --git a/dev-tools/ansible/roles/airavata_services/templates/log4j2.xml.j2 b/dev-tools/ansible/roles/airavata_services/templates/log4j2.xml.j2 new file mode 100644 index 0000000000..3c8e581507 --- /dev/null +++ b/dev-tools/ansible/roles/airavata_services/templates/log4j2.xml.j2 @@ -0,0 +1,55 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +# +# 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. +# +--> +<Configuration status="WARN"> + <Properties> + <Property name="serviceName">${env:SERVICE_NAME:-output}</Property> + </Properties> + <Appenders> + <Console name="Console" target="SYSTEM_OUT"> + <PatternLayout pattern="%d [%t] %-5p %c{30} %X - %m%n"/> + </Console> + <RollingFile name="RollingFileAppender" fileName="../logs/${serviceName}.log" + filePattern="../logs/${serviceName}-%d{MM-dd-yyyy}-%i.log.gz"> + <PatternLayout> + <Pattern>%d [%t] %-5p %c{30} %X - %m%n</Pattern> + </PatternLayout> + <Policies> + <OnStartupTriggeringPolicy/> + <TimeBasedTriggeringPolicy/> + <SizeBasedTriggeringPolicy size="50 MB"/> + </Policies> + <DefaultRolloverStrategy max="20"/> + </RollingFile> + </Appenders> + <Loggers> + <logger name="ch.qos.logback" level="WARN"/> + <logger name="org.apache.helix" level="WARN"/> + <logger name="org.apache.zookeeper" level="ERROR"/> + <logger name="org.apache.airavata" level="INFO"/> + <logger name="org.hibernate" level="ERROR"/> + <Root level="INFO"> + <AppenderRef ref="Console"/> + <AppenderRef ref="RollingFileAppender"/> + </Root> + </Loggers> +</Configuration> +
