Merge branch 'AIRAVATA-3697' into develop
diff --git a/CITATION.cff b/CITATION.cff
new file mode 100644
index 0000000..92f4e12
--- /dev/null
+++ b/CITATION.cff
@@ -0,0 +1,56 @@
+# This CITATION.cff file was generated with cffinit.
+# Visit https://bit.ly/cffinit to generate yours today!
+
+cff-version: 1.2.0
+title: Apache Airavata
+message: >-
+  If you use this software, please cite it using the
+  metadata from this file.
+type: software
+authors:
+  - given-names: Airavata
+    family-names: Apache
+    email: dev@airavata.apache.org
+repository-code: 'https://github.com/apache/airavata'
+url: 'https://airavata.apache.org/'
+license: Apache-2.0
+preferred-citation:
+  type: proceedings
+  authors:
+  - family-names: "Marru"
+    given-names: "Suresh"
+  - family-names: "Gunathilake"
+    given-names: "Lahiru"
+  - family-names: "Herath"
+    given-names: "Chathura"
+  - family-names: "Tangchaisin"
+    given-names: "Patanachai"
+  - family-names: "Pierce"
+    given-names: "Marlon"
+  - family-names: "Mattmann"
+    given-names: "Chris"
+  - family-names: "Singh"
+    given-names: "Raminder"
+  - family-names: "Gunarathne"
+    given-names: "Thilina"
+  - family-names: "Chinthaka"
+    given-names: "Eran"
+  - family-names: "Gardler"
+    given-names: "Ross"
+  - family-names: "Slominski"
+    given-names: "Aleksander"
+  - family-names: "Douma"
+    given-names: "Ate"
+  - family-names: "Perera"
+    given-names: "Srinath"
+  - family-names: "Weerawarana"
+    given-names: "Sanjiva"
+  doi: "10.1145/2110486.2110490"
+  journal: "Proceedings of the 2011 ACM workshop on Gateway computing environments"
+  month: 11
+  start: 1 # 21
+  end: 10 # 28
+  title: "Apache airavata: a framework for distributed applications and computational workflows"
+  issue: 1
+  volume: 1
+  year: 2011
diff --git a/dev-tools/ansible/inventories/scigap/production/group_vars/django/vars.yml b/dev-tools/ansible/inventories/scigap/production/group_vars/django/vars.yml
index da6381a..2502b87 100644
--- a/dev-tools/ansible/inventories/scigap/production/group_vars/django/vars.yml
+++ b/dev-tools/ansible/inventories/scigap/production/group_vars/django/vars.yml
@@ -32,6 +32,8 @@
 # django_keycloak_ca_certfile_path: 'os.path.join(BASE_DIR, "django_airavata", "resources", "incommon_rsa_server_ca.pem")'
 cilogon_userinfo_url: "https://cilogon.org/oauth2/userinfo"
 
+django_user_data_archive_directory: "{{ user_data_dir }}/user-data-archives/{{ gateway_id }}"
+
 # Default email settings
 portal_email_host: "smtp.gmail.com"
 portal_email_port: 587
diff --git a/dev-tools/ansible/inventories/scigap/production/host_vars/ai-confluence/vars.yml b/dev-tools/ansible/inventories/scigap/production/host_vars/ai-confluence/vars.yml
new file mode 100644
index 0000000..eedf190
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/production/host_vars/ai-confluence/vars.yml
@@ -0,0 +1,56 @@
+#
+#
+# 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.
+#
+
+---
+
+# TODO: tus not setup yet
+tusd_vhost_servername:
+
+vhost_servername: "ai.cybershuttle.org"
+vhost_ssl: True
+ssl_certificate_file: "/etc/letsencrypt/live/{{ vhost_servername }}/cert.pem"
+ssl_certificate_chain_file: "/etc/letsencrypt/live/{{ vhost_servername }}/fullchain.pem"
+ssl_certificate_key_file: "/etc/letsencrypt/live/{{ vhost_servername }}/privkey.pem"
+
+# Increase max upload size to 200MB
+#django_file_upload_max_file_size_mb: 200
+
+## Keycloak related variables
+tenant_domain: "ai-confluence"
+oauth_client_key: "{{ vault_oauth_client_key }}"
+oauth_client_secret: "{{ vault_oauth_client_secret }}"
+
+auth_options:
+  password:
+    name: "AI Confluence Gateway"
+  external:
+    - name: "Existing Institution Credentials"
+      idp_alias: "cilogon"
+      logo: "images/cilogon-logo-24x24-b.png"
+
+gateway_id: "ai-confluence"
+experiment_data_dir: "{{ user_data_dir }}/ai-confluence"
+gateway_data_store_ssh_public_key: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDVSe+qdmtbC0557O4C+Xv5jrSr66Wjj/zx9fDHhX3j5xHxWA90mnc5HNfFRSM+IqL4kICY83M7YQWClOdpITMb1tLFNzY4ZkR4X7xTxFw8MGkMGm3lEPFhr2Sht7CwC3Br/5x4wUIlNfWMkWmRT+evaM1GGHozkjgCVutsSINLKbz38L2/ZYlJ5l14WaCq602IY8qUFDNUzSC8Tl44IyG9l6ocnEvE4sBbMiFKx38jIRTlZDyIqJ5V1WzeW0xm7wzVQQsAQHn7x2yTNgJ2I6EX4kJeyjwXIbl4N70QuISaHz4XOe6/L1a/c2fMuLmjc5GgjoUPxscvyCvCrTSu/3Zf"
+
+admin_emails: "[('CIRC', 'circ-iu-group@iu.edu')]"
+portal_title: "AI Confluence Gateway"
+
+#django_google_analytics_tracking_id: "UA-66348921-1"
+...
diff --git a/dev-tools/ansible/inventories/scigap/production/host_vars/ai-confluence/vault.yml b/dev-tools/ansible/inventories/scigap/production/host_vars/ai-confluence/vault.yml
new file mode 100644
index 0000000..c67f63a
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/production/host_vars/ai-confluence/vault.yml
@@ -0,0 +1,12 @@
+$ANSIBLE_VAULT;1.1;AES256
+63316230363261343835663931313830316132666565323138353866353061363734323566616430
+6465666666313261316439353261343230626130633437310a623938623865303662383365663965
+35366163613336356630313366653830643934656435356536613933646231313931396139653232
+3134663335346239640a336230663731363366636231383838383964353631393530303537343432
+39396466323465333034303236303832663966633138363739323665303162613137303333396432
+65353765306339323166643439343737336639383461333264633236383664346464623635353366
+39363062623531643561393138313830396330626533376362633265303830323531333435643034
+66326439613764323637623238623063646665373432656238306362363638663730323537356636
+32333666336138656336633163653262306639373139636532306435323363326235376561383130
+31653132336565326662333133366335373232643462663337353236353036306666623733303964
+376334376536623637633266636532386464
diff --git a/dev-tools/ansible/inventories/scigap/production/host_vars/global-flood/vars.yml b/dev-tools/ansible/inventories/scigap/production/host_vars/global-flood/vars.yml
index 50e738b..1390f7c 100644
--- a/dev-tools/ansible/inventories/scigap/production/host_vars/global-flood/vars.yml
+++ b/dev-tools/ansible/inventories/scigap/production/host_vars/global-flood/vars.yml
@@ -23,6 +23,8 @@
 #gateway_data_store_hostname: "js-168-166.jetstream-cloud.org"
 
 airavata_django_extra_dependencies:
+  # Production server has gdal library 3.4 installed
+  - name: "GDAL<3.5"
   - name: "git+https://github.com/Global-Flood-Assessment/global-floods-django-app.git#egg=global_floods_django_app"
     editable: true
 
diff --git a/dev-tools/ansible/inventories/scigap/production/host_vars/molecular-dynamics/vars.yml b/dev-tools/ansible/inventories/scigap/production/host_vars/molecular-dynamics/vars.yml
new file mode 100644
index 0000000..2bcca64
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/production/host_vars/molecular-dynamics/vars.yml
@@ -0,0 +1,56 @@
+#
+#
+# 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.
+#
+
+---
+
+# TODO: tus not setup yet
+tusd_vhost_servername:
+
+vhost_servername: "md.cybershuttle.org"
+vhost_ssl: True
+ssl_certificate_file: "/etc/letsencrypt/live/{{ vhost_servername }}/cert.pem"
+ssl_certificate_chain_file: "/etc/letsencrypt/live/{{ vhost_servername }}/fullchain.pem"
+ssl_certificate_key_file: "/etc/letsencrypt/live/{{ vhost_servername }}/privkey.pem"
+
+# Increase max upload size to 200MB
+#django_file_upload_max_file_size_mb: 200
+
+## Keycloak related variables
+tenant_domain: "molecular-dynamics"
+oauth_client_key: "{{ vault_oauth_client_key }}"
+oauth_client_secret: "{{ vault_oauth_client_secret }}"
+
+auth_options:
+  password:
+    name: "Molecular Dynamics Gateway"
+  external:
+    - name: "Existing Institution Credentials"
+      idp_alias: "cilogon"
+      logo: "images/cilogon-logo-24x24-b.png"
+
+gateway_id: "molecular-dynamics"
+experiment_data_dir: "{{ user_data_dir }}/molecular-dynamics"
+gateway_data_store_ssh_public_key: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCE1feXCJlzfxtkwqrwfHRXqmfR0tKyiGg/NXhYht9mO/WMvuSeKysByCBDnFO1PVF+qGJILOE7E9n6e9xOfTqpuLJsYi4UwLRKu7nGOsERj7ei+1+UpJDn/m8FoDoEInokrkzHeqFJ2NeTSTTU4SKrdvoRF9BWRQW3s3YDILwfh646dvm0wvuxBvif6O/t58svYwVH08MhDK8q06qWeYb21vqI4rk5jM9gObUUcdKuONpSCj9Q8VcnhelHCEu6oyQWcfxaD0k9/qGjEetv2Y/h2dGLSbXxadePkLOojHEAkStzHOYAqlgr0Ig/wav/PgyQBXAWJ4+FjnfVvJ++CCif"
+
+admin_emails: "[('CIRC', 'circ-iu-group@iu.edu')]"
+portal_title: "Molecular Dynamics Gateway"
+
+#django_google_analytics_tracking_id: "UA-66348921-1"
+...
diff --git a/dev-tools/ansible/inventories/scigap/production/host_vars/molecular-dynamics/vault.yml b/dev-tools/ansible/inventories/scigap/production/host_vars/molecular-dynamics/vault.yml
new file mode 100644
index 0000000..4536cde
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/production/host_vars/molecular-dynamics/vault.yml
@@ -0,0 +1,12 @@
+$ANSIBLE_VAULT;1.1;AES256
+66396632386236353530653733363831366335643137333664356434336333393234633466633138
+6265353330303335343262393535666234353138356562330a663264353831363336396330663130
+61623064386530366634316531343136393837376662323832623033336462343332316239616565
+3232623064383330320a343433656466656236616665653034373963303934626439363630343332
+38326661386337383834633861323830643834383064656336333237653965316563623831326138
+64366331353664346137393933363533653830643638366433386337376230633764663931323532
+30643038643837306531333466666637643466663639313763643439623131393537346366613332
+62353639633239653537333130313962393137666436613765393034323665623235363961663464
+39663638363562326663663265353234616465346438306330373137626632626562393461313737
+39343239363237643031306264653264396462383834633535396638303034383562336133386632
+633564653066613064303639613432333333
diff --git a/dev-tools/ansible/inventories/scigap/production/host_vars/nasa-veda/vars.yml b/dev-tools/ansible/inventories/scigap/production/host_vars/nasa-veda/vars.yml
new file mode 100644
index 0000000..c7b803d
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/production/host_vars/nasa-veda/vars.yml
@@ -0,0 +1,56 @@
+#
+#
+# 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.
+#
+
+---
+
+# TODO: tus not setup yet
+tusd_vhost_servername:
+
+vhost_servername: "veda.cybershuttle.org"
+vhost_ssl: True
+ssl_certificate_file: "/etc/letsencrypt/live/{{ vhost_servername }}/cert.pem"
+ssl_certificate_chain_file: "/etc/letsencrypt/live/{{ vhost_servername }}/fullchain.pem"
+ssl_certificate_key_file: "/etc/letsencrypt/live/{{ vhost_servername }}/privkey.pem"
+
+# Increase max upload size to 200MB
+#django_file_upload_max_file_size_mb: 200
+
+## Keycloak related variables
+tenant_domain: "nasa-veda"
+oauth_client_key: "{{ vault_oauth_client_key }}"
+oauth_client_secret: "{{ vault_oauth_client_secret }}"
+
+auth_options:
+  password:
+    name: "NASA VEDA Gateway"
+  external:
+    - name: "Existing Institution Credentials"
+      idp_alias: "cilogon"
+      logo: "images/cilogon-logo-24x24-b.png"
+
+gateway_id: "nasa-veda"
+experiment_data_dir: "{{ user_data_dir }}/nasa-veda"
+gateway_data_store_ssh_public_key: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCp8LKgKow4ksZJLSm/6qwKA9D1w4+CQcjgl0VJHZSTGFxPxG4Z75hgIlLDDe5tpa8pfwgKywIn8/QNvay2B7lgrEtxH/MkJYoeRiz8w9gq9svWYddFGq+rSAWtyaB3KroPL4N77xiZ6BnGsjhQY80Umsusj4SP3ue1L/2mKkN/POOPP75b2lONxJqYwMT2Bdusa6lbReEM9iv089Ef0nRAfxhOh2mX9/XghDBcx6GYEqcs2rvaQkwEcqroJiozTgcROJLp5kwCdJ/O5vdr3wIoAqOWlyUbU32oGiHvDcz2GYNxyZUeEC6M5sxtz3NzqSHVtl8sJKS2UOuNOH+sbuvZ"
+
+admin_emails: "[('CIRC', 'circ-iu-group@iu.edu')]"
+portal_title: "NASA VEDA Gateway"
+
+#django_google_analytics_tracking_id: "UA-66348921-1"
+...
diff --git a/dev-tools/ansible/inventories/scigap/production/host_vars/nasa-veda/vault.yml b/dev-tools/ansible/inventories/scigap/production/host_vars/nasa-veda/vault.yml
new file mode 100644
index 0000000..af3e708
--- /dev/null
+++ b/dev-tools/ansible/inventories/scigap/production/host_vars/nasa-veda/vault.yml
@@ -0,0 +1,12 @@
+$ANSIBLE_VAULT;1.1;AES256
+62626364616539366331623738616565623364396334333361316564646338613633366539343437
+6566346261626230616230623066623532343633626635350a313938373362336433636638623137
+37623031636266383761343261366564316161373962633861636163646430316530666466313234
+3063633530666631610a383266363162363937636439303264353734663462303535356234326439
+36613763653838343361366337393735343534356638353238343262613330393033376630363736
+35663338663533393535363835343234323836313137616635353761616364653665336563383230
+64313566613432383664333333353137343838316532393765633930633866646238663535663337
+34643639396462343732636539393430643264336562613731353034346333373761353036303936
+36373266663831646661316363633137306663303433383863323731396536306632623439633336
+35666165663465613938633938376238613033616237393732343861303037656538393834323934
+646539346163646436616339663361343537
diff --git a/dev-tools/ansible/inventories/scigap/production/host_vars/testdrive/vars.yml b/dev-tools/ansible/inventories/scigap/production/host_vars/testdrive/vars.yml
index ba2a2aa..0ffc743 100644
--- a/dev-tools/ansible/inventories/scigap/production/host_vars/testdrive/vars.yml
+++ b/dev-tools/ansible/inventories/scigap/production/host_vars/testdrive/vars.yml
@@ -47,6 +47,7 @@
 gateway_id: "default"
 experiment_data_dir: "{{ user_data_dir }}/testdrive"
 gateway_data_store_ssh_public_key: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCUF51b2cYYqqadLHL9M/oPY0ZHZlWbdOdaIgjpzIzMnO7M9hKrHVY2pqyLPvqCLzaunxITPWsTqw0E8hwub4ttGLAx/O4kIf+BgyZK7iuwXWhI7u85/o58IfrD4B+jVCYKRNayuLR+lJWsiOeS6HSlunpTKTEhFGeOHn2UzdbLfgWYQ3VUFDtKN1oDPDT78ml5c2RCibJ21jltpevVfEtCUctERpTfniWSuQZggP1qiLNa1+PfiJ3mGsEzJFDntQvQetdinaAbEaT7+sctS8nBNjapkmYMf6tBl3S0bLttYPH51f8lUQAFaAzrestO1JpJNnIeY01/S3MWIlAWASnn"
+django_user_data_archive_max_age_days: 90
 
 admin_emails: "[('SGRC', 'sgrc-iu-group@iu.edu')]"
 portal_title: "Airavata Test Drive Gateway"
diff --git a/dev-tools/ansible/inventories/scigap/production/hosts b/dev-tools/ansible/inventories/scigap/production/hosts
index e6fdce4..c230488 100644
--- a/dev-tools/ansible/inventories/scigap/production/hosts
+++ b/dev-tools/ansible/inventories/scigap/production/hosts
@@ -51,13 +51,13 @@
 snowvision ansible_host=156.56.104.84
 southdakota ansible_host=156.56.104.84
 testdrive ansible_host=156.56.104.84
-uab ansible_host=156.56.104.84
-wvsu ansible_host=156.56.104.84
+#uab ansible_host=156.56.104.84
+#wvsu ansible_host=156.56.104.84
 pace-gatech ansible_host=156.56.104.84
 smaltr ansible_host=156.56.104.84
-toppic ansible_host=156.56.104.84
+#toppic ansible_host=156.56.104.84
 microbial-genomes ansible_host=156.56.104.84
-v4i ansible_host=156.56.104.84
+#v4i ansible_host=156.56.104.84
 physicell ansible_host=156.56.104.84
 pathogenomics ansible_host=156.56.104.84
 bcbportal ansible_host=156.56.104.84
@@ -76,6 +76,9 @@
 deeppdb ansible_host=156.56.104.84
 ehtgateway ansible_host=156.56.104.84
 neuroscience-cybershuttle ansible_host=156.56.104.84
+ai-confluence ansible_host=156.56.104.84
+molecular-dynamics ansible_host=156.56.104.84
+nasa-veda ansible_host=156.56.104.84
 
 # smiles server
 smiles ansible_host=scigap13.sciencegateways.iu.edu ansible_user=root
@@ -86,8 +89,8 @@
 # Baysprism Jetstream2 server
 bayesprism ansible_host=149.165.155.90 ansible_user=exouser
 
-# dreg jetstream server
-dreg ansible_host=149.165.154.48 ansible_user=exouser
+# dreg jetstream server The old is 149.165.154.48
+dreg ansible_host=149.165.171.97 ansible_user=exouser
 
 # futurewater jetstream server
 futurewater ansible_host=149.165.154.212 ansible_user=exouser
@@ -103,6 +106,6 @@
 simccs ansible_host=scigap11.sciencegateways.iu.edu ansible_user=root
 
 # simvascular server
-simvascular ansible_host=simvascular.stanford.edu ansible_user=gateway
+# simvascular ansible_host=simvascular.stanford.edu ansible_user=gateway
 # we can remove this once the migration is complete
 simvascular_old ansible_host=156.56.104.84
diff --git a/dev-tools/ansible/roles/django/templates/django-ssl-vhost.conf.j2 b/dev-tools/ansible/roles/django/templates/django-ssl-vhost.conf.j2
index 2c2f73f..0764c34 100644
--- a/dev-tools/ansible/roles/django/templates/django-ssl-vhost.conf.j2
+++ b/dev-tools/ansible/roles/django/templates/django-ssl-vhost.conf.j2
@@ -43,7 +43,7 @@
 
 <VirtualHost *:{{ httpd_default_http_port }}>
     ServerName {{ vhost_servername }}
-    
+
     ## Redirect all http traffic to https
     RewriteEngine On
     RewriteCond %{HTTPS} off
@@ -99,7 +99,15 @@
     {% endif %}
     {% endfor %}
 
-    WSGIDaemonProcess {{ vhost_servername }} display-name=%{GROUP} python-home={{ doc_root_dir }}/venv python-path={{ doc_root_dir }}/airavata-django-portal processes={{ django_wsgi_processes }} user={{ user }} group={{ group }}
+    WSGIDaemonProcess {{ vhost_servername }} \
+            display-name=%{GROUP} \
+            python-home={{ doc_root_dir }}/venv \
+            python-path={{ doc_root_dir }}/airavata-django-portal \
+            processes={{ django_wsgi_processes }} \
+            user={{ user }} \
+            group={{ group }} \
+            lang=en_US.UTF-8 \
+            locale=en_US.UTF-8
     WSGIProcessGroup {{ vhost_servername }}
 
     WSGIScriptAlias / {{ doc_root_dir }}/airavata-django-portal/django_airavata/wsgi.py