diff --git a/ansible/inventory/env/group_vars/all.yml b/ansible/inventory/env/group_vars/all.yml
index 941d617ad0b5ad69a84e4c3ecc6bc043642a8086..17b712b29f496c800622d71a49eef490bb938292 100644
--- a/ansible/inventory/env/group_vars/all.yml
+++ b/ansible/inventory/env/group_vars/all.yml
@@ -335,7 +335,8 @@ sunbird_open_saber_bridge_enable: 'false'
 sunbird_content_service_enable_logging: 'true'
 sunbird_language_service_api_key: "{{core_vault_sunbird_ekstep_api_key}}"
 sunbird_installation_display_name: "{{sunbird_app_name}} {{env}}"
-sunbird_ekstep_api_base_url: "https://{{ekstep_s3_env}}.ekstep.in/api"   #API base URL of the Ekstep environment. Use `https://qa.ekstep.in/api` for non-prod deployments, and use `https://api.ekstep.in/` for prod deployment.
+sunbird_ekstep_proxy_base_url: "https://{{ekstep_s3_env}}.ekstep.in"  #Base URL of the Ekstep environment. Use `https://qa.ekstep.in/` for non-prod deployments, and `https://community.ekstep.in/` for prod deployment.
+sunbird_ekstep_api_base_url: "{{sunbird_ekstep_proxy_base_url}}/api"   #API base URL of the Ekstep environment. Use `https://qa.ekstep.in/api` for non-prod deployments, and use `https://api.ekstep.in/` for prod deployment.
 sunbird_language_service_api_base_url: '{{sunbird_ekstep_api_base_url}}/language'
 
 kong_version: 1.5.0-gold
diff --git a/ansible/plugin.yml b/ansible/plugin.yml
new file mode 100644
index 0000000000000000000000000000000000000000..2276d95b9de90786e08a9efacca5e670fdbbb65e
--- /dev/null
+++ b/ansible/plugin.yml
@@ -0,0 +1,22 @@
+- hosts: local
+  become: yes
+  gather_facts: no
+  vars_files:
+    - "{{inventory_dir}}/secrets.yml"
+  environment:
+        AZURE_STORAGE_ACCOUNT: "{{ azure_plugin_storage_account_name }}"
+        AZURE_STORAGE_KEY: "{{ azure_plugin_storage_account_key }}"
+  tasks:
+    - name: delte plugin org_sunbird_questionunit_quml
+      command: "az storage blob delete-batch --source {{ plugin_container_name }} --pattern content-plugins/{{ plugins_name }}"
+      async: 3600
+      poll: 10  
+      tags:
+        - org_sunbird_questionunit_quml
+    
+    - name: upload plugin org_sunbird_questionunit_quml
+      command: "az storage blob upload-batch --destination {{ plugin_container_name }}/content-plugins/{{ plugins_name }} --source {{ source_file }}"
+      async: 3600
+      poll: 10  
+      tags:
+        - org_sunbird_questionunit_quml
diff --git a/ansible/postgresql-restore.yml b/ansible/postgresql-restore.yml
index 7faf9af5514a3e4d29b3b4cbd463268e6d638631..e2d80770d12c72a816ef359ca930fc58a039d22b 100644
--- a/ansible/postgresql-restore.yml
+++ b/ansible/postgresql-restore.yml
@@ -1,8 +1,8 @@
-- hosts: postgresql-restore
+- hosts: local
   become: yes
   vars_files:
-    - ['{{inventory_dir}}/secrets.yml', 'secrets/{{env}}.yml']
+    - ['{{inventory_dir}}/secrets.yml']
   roles:
-    - postgresql-restore
+    - postgres-azure-managed-service-restore
   tags:
     - postgresql-restore
diff --git a/ansible/roles/postgres-azure-managed-service-restore/defaults/main.yml b/ansible/roles/postgres-azure-managed-service-restore/defaults/main.yml
new file mode 100644
index 0000000000000000000000000000000000000000..f90d20c9f4fb8404ec2adeb9d44e65b31baacd7d
--- /dev/null
+++ b/ansible/roles/postgres-azure-managed-service-restore/defaults/main.yml
@@ -0,0 +1,14 @@
+postgresql_restore_dir: /tmp/postgres-restore
+postgres_backup_azure_container_name: postgresql-backup
+
+db:
+  name: ['keycloak', 'api_manager_{{ postgres_env }}', 'badger', 'quartz']
+  role: ['keycloak', 'api_manager_{{ postgres_env }}', 'badger', 'quartz']
+  user: ['azure_superuser, {{ env_user_name }}']
+
+#these variables are passed as extra vars
+postgres_backup_filename:
+postgres_user: 
+postgres_password: 
+postgres_hostname:
+postgres_env:
diff --git a/ansible/roles/postgres-azure-managed-service-restore/tasks/main.yml b/ansible/roles/postgres-azure-managed-service-restore/tasks/main.yml
new file mode 100644
index 0000000000000000000000000000000000000000..ba413e79431fe4d623ceeba901afaacf5256de3e
--- /dev/null
+++ b/ansible/roles/postgres-azure-managed-service-restore/tasks/main.yml
@@ -0,0 +1,70 @@
+- name: install psycopg2
+  package:
+    name: python-psycopg2
+    state: present
+   
+- name: ensure restore dir exists
+  file: path="{{ postgresql_restore_dir }}" state=directory mode=0777
+
+- set_fact:
+    postgres_backup_filepath: "{{ postgresql_restore_dir }}/{{ postgres_backup_filename }}"
+
+- name: Download backup from azure
+  command: az storage blob download -c {{ postgres_backup_azure_container_name }} --name {{ postgres_backup_filename }} -f {{ postgres_backup_filepath }}
+  args:
+    chdir: "{{ postgres_restore_dir }}"
+  async: 100
+  poll: 10
+
+- name: unarchive artifact
+  unarchive: src={{ postgresql_restore_dir }}/{{ postgres_backup_filename }} dest={{ postgresql_restore_dir }}/ copy=no
+
+- name: Create db's
+  postgresql_db:
+    login_user: "{{ postgres_user }}"
+    login_password: "{{ postgres_password }}"
+    login_host: "{{ postgres_hostname }}"
+    name: "{{ item }}"
+    state: present
+  with_items: "{{ db.name }}"
+  async: 1000
+  poll: 10
+
+- name: Create role and grant access to db's
+  postgresql_user:
+    login_user: "{{ postgres_user }}"
+    login_password: "{{ postgres_password }}"
+    login_host: "{{ postgres_hostname }}"
+    db: "{{ item[0] }}"
+    name: "{{ item[1] }}"
+    priv: ALL
+    state: present
+    role_attr_flags: CREATEROLE
+  with_nested:
+    - "{{ db.name }}"
+    - "{{ db.role }}"
+  async: 1000
+  poll: 10
+
+- name: create user
+  postgresql_user:
+    login_user: "{{ postgres_user }}"
+    login_password: "{{ postgres_password }}"
+    login_host: "{{ postgres_hostname }}"
+    name: "{{ item }}"
+  with_items: "{{ db.user }}"
+  async: 1000
+  poll: 10
+
+- name: Restore db's
+  postgresql_db:
+    login_user: "{{ postgres_user }}"
+    login_password: "{{ postgres_password }}"
+    login_host: "{{ postgres_hostname }}"
+    name: "{{ item }}"
+    state: restore
+    target: "{{ item }}.sql"
+  args:
+    chdir: "{{ postgres_restore_dir }}"
+  with_items: "{{ db.name }}"
+
diff --git a/ansible/roles/stack-sunbird/defaults/main.yml b/ansible/roles/stack-sunbird/defaults/main.yml
index 86b134617c594d06c88d955928abd9fb6e443565..43cb794b51d82d803451e17076505b1234b64523 100644
--- a/ansible/roles/stack-sunbird/defaults/main.yml
+++ b/ansible/roles/stack-sunbird/defaults/main.yml
@@ -110,3 +110,4 @@ sunbird_analytics_blob_account_key:
 sunbird_portal_player_cdn_enabled: 
 sunbird_portal_preview_cdn_url:
 cdn_file_path:
+sunbird_portal_cdn_blob_url:
diff --git a/deploy/jenkins/jenkins-server-setup.sh b/deploy/jenkins/jenkins-server-setup.sh
index 6ccb350fd5307cf76ca71c2cdd75efc86146ff16..c7dd7d61ac9eb69b6a5351bb865fef7249c1b206 100755
--- a/deploy/jenkins/jenkins-server-setup.sh
+++ b/deploy/jenkins/jenkins-server-setup.sh
@@ -12,7 +12,7 @@ echo -e "\n\e[0;32m${bold}Installating Jenkins${normal}"
 wget -q -O - https://pkg.jenkins.io/debian-stable/jenkins.io.key | apt-key add -
 sudo apt-add-repository "deb https://pkg.jenkins.io/debian-stable binary/"
 sudo apt-get update
-sudo apt-get install -y jenkins=2.164.2
+sudo apt-get install -y jenkins=2.164.3
 
 echo -e "\n\e[0;32m${bold}Installating PIP${normal}"
 apt-get install -y python-pip
diff --git a/deploy/jenkins/jobs/Build/jobs/Core/jobs/APIManager/config.xml b/deploy/jenkins/jobs/Build/jobs/Core/jobs/APIManager/config.xml
index 4a039c44893aa233d6427a96979c52b9e090f2f1..da41923c8c4cab03e3f182712eb91c133921a9ac 100644
--- a/deploy/jenkins/jobs/Build/jobs/Core/jobs/APIManager/config.xml
+++ b/deploy/jenkins/jobs/Build/jobs/Core/jobs/APIManager/config.xml
@@ -1,5 +1,5 @@
 <?xml version='1.1' encoding='UTF-8'?>
-<flow-definition plugin="workflow-job@2.32">
+<flow-definition plugin="workflow-job@2.33">
   <actions/>
   <description></description>
   <keepDependencies>false</keepDependencies>
@@ -18,26 +18,22 @@
       <paramsToUseForLimit></paramsToUseForLimit>
     </hudson.plugins.throttleconcurrents.ThrottleJobProperty>
   </properties>
-  <definition class="org.jenkinsci.plugins.workflow.cps.CpsScmFlowDefinition" plugin="workflow-cps@2.67">
-    <scm class="hudson.plugins.git.GitSCM" plugin="git@3.9.3">
-      <configVersion>2</configVersion>
-      <userRemoteConfigs>
-        <hudson.plugins.git.UserRemoteConfig>
-          <url>https://github.com/project-sunbird/sunbird-devops</url>
-        </hudson.plugins.git.UserRemoteConfig>
-      </userRemoteConfigs>
-      <branches>
-        <hudson.plugins.git.BranchSpec>
-          <name>${github_release_tag}</name>
-        </hudson.plugins.git.BranchSpec>
-      </branches>
-      <doGenerateSubmoduleConfigurations>false</doGenerateSubmoduleConfigurations>
-      <submoduleCfg class="list"/>
-      <extensions/>
-    </scm>
-    <scriptPath>images/kong/Jenkinsfile.build</scriptPath>
-    <lightweight>false</lightweight>
+  <definition class="org.jenkinsci.plugins.workflow.cps.CpsFlowDefinition" plugin="workflow-cps@2.70">
+    <script>node(){
+        build_tag=&quot;1.8.0-gold&quot;
+        name=&quot;kong&quot;
+        node=env.NODE_NAME
+        org=env.hub_org
+        
+     sh &quot;&quot;&quot;
+        docker pull sunbird/kong:1.8.0-gold
+        docker tag sunbird/kong:1.8.0-gold ${org}/${name}:${build_tag}
+        &quot;&quot;&quot;
+writeFile file: &apos;metadata.json&apos;, text: &apos;{ &quot;image_name&quot; : &quot;&apos; + name + &apos;&quot;, &quot;image_tag&quot; : &quot;&apos; + build_tag + &apos;&quot;, &quot;node_name&quot; : &quot;&apos; + node + &apos;&quot;}&apos;
+
+     archiveArtifacts artifacts: &apos;metadata.json&apos;, onlyIfSuccessful: true
+}</script>
+    <sandbox>true</sandbox>
   </definition>
   <triggers/>
   <disabled>false</disabled>
-</flow-definition>
diff --git a/deploy/jenkins/jobs/Build/jobs/Core/jobs/Badger/config.xml b/deploy/jenkins/jobs/Build/jobs/Core/jobs/Badger/config.xml
index a19a4fe04daaab7fa13e9237808df810a731e124..6595d9f538b4cbaa011348017c5e15e219f6f0a3 100644
--- a/deploy/jenkins/jobs/Build/jobs/Core/jobs/Badger/config.xml
+++ b/deploy/jenkins/jobs/Build/jobs/Core/jobs/Badger/config.xml
@@ -1,7 +1,7 @@
 <?xml version='1.1' encoding='UTF-8'?>
-<flow-definition plugin="workflow-job@2.31">
+<flow-definition plugin="workflow-job@2.33">
   <actions>
-    <org.jenkinsci.plugins.workflow.multibranch.JobPropertyTrackerAction plugin="workflow-multibranch@2.20">
+    <org.jenkinsci.plugins.workflow.multibranch.JobPropertyTrackerAction plugin="workflow-multibranch@2.21">
       <jobPropertyDescriptors>
         <string>hudson.model.ParametersDefinitionProperty</string>
         <string>com.sonyericsson.rebuild.RebuildSettings</string>
@@ -20,20 +20,10 @@
       </strategy>
     </jenkins.model.BuildDiscarderProperty>
     <org.jenkinsci.plugins.workflow.job.properties.DisableConcurrentBuildsJobProperty/>
-    <com.sonyericsson.rebuild.RebuildSettings plugin="rebuild@1.29">
+    <com.sonyericsson.rebuild.RebuildSettings plugin="rebuild@1.31">
       <autoRebuild>false</autoRebuild>
       <rebuildDisabled>false</rebuildDisabled>
     </com.sonyericsson.rebuild.RebuildSettings>
-    <hudson.model.ParametersDefinitionProperty>
-      <parameterDefinitions>
-        <hudson.model.StringParameterDefinition>
-          <name>github_release_tag</name>
-          <description>&lt;font color=red size=2&gt;&lt;b&gt;CAUTION: If the value is blank, latest code will be built. Specify github tag name to build from a tag.&lt;/b&gt;&lt;/font&gt;</description>
-          <defaultValue></defaultValue>
-          <trim>false</trim>
-        </hudson.model.StringParameterDefinition>
-      </parameterDefinitions>
-    </hudson.model.ParametersDefinitionProperty>
     <hudson.plugins.throttleconcurrents.ThrottleJobProperty plugin="throttle-concurrents@2.0.1">
       <maxConcurrentPerNode>0</maxConcurrentPerNode>
       <maxConcurrentTotal>0</maxConcurrentTotal>
@@ -44,40 +34,25 @@
       <paramsToUseForLimit></paramsToUseForLimit>
     </hudson.plugins.throttleconcurrents.ThrottleJobProperty>
     <org.jenkinsci.plugins.workflow.job.properties.PipelineTriggersJobProperty>
-      <triggers>
-        <com.cloudbees.jenkins.GitHubPushTrigger plugin="github@1.29.4">
-          <spec></spec>
-        </com.cloudbees.jenkins.GitHubPushTrigger>
-      </triggers>
+      <triggers/>
     </org.jenkinsci.plugins.workflow.job.properties.PipelineTriggersJobProperty>
   </properties>
-  <definition class="org.jenkinsci.plugins.workflow.cps.CpsScmFlowDefinition" plugin="workflow-cps@2.63">
-    <scm class="hudson.plugins.git.GitSCM" plugin="git@3.9.3">
-      <configVersion>2</configVersion>
-      <userRemoteConfigs>
-        <hudson.plugins.git.UserRemoteConfig>
-          <url>https://github.com/project-sunbird/sunbird-devops.git</url>
-        </hudson.plugins.git.UserRemoteConfig>
-      </userRemoteConfigs>
-      <branches>
-        <hudson.plugins.git.BranchSpec>
-          <name>${github_release_tag}</name>
-        </hudson.plugins.git.BranchSpec>
-      </branches>
-      <doGenerateSubmoduleConfigurations>false</doGenerateSubmoduleConfigurations>
-      <submoduleCfg class="list"/>
-      <extensions>
-        <hudson.plugins.git.extensions.impl.CloneOption>
-          <shallow>true</shallow>
-          <noTags>false</noTags>
-          <reference></reference>
-          <depth>0</depth>
-          <honorRefspec>false</honorRefspec>
-        </hudson.plugins.git.extensions.impl.CloneOption>
-      </extensions>
-    </scm>
-    <scriptPath>images/openbadger/Jenkinsfile</scriptPath>
-    <lightweight>false</lightweight>
+  <definition class="org.jenkinsci.plugins.workflow.cps.CpsFlowDefinition" plugin="workflow-cps@2.70">
+    <script>node(){
+        build_tag=&quot;1.8.0-gold&quot;
+        name=&quot;badger&quot;
+        node=env.NODE_NAME
+        org=env.hub_org
+        
+     sh &quot;&quot;&quot;
+        docker pull sunbird/${name}:${build_tag}
+        docker tag sunbird/${name}:${build_tag} ${org}/${name}:${build_tag}
+        &quot;&quot;&quot;
+writeFile file: &apos;metadata.json&apos;, text: &apos;{ &quot;image_name&quot; : &quot;&apos; + name + &apos;&quot;, &quot;image_tag&quot; : &quot;&apos; + build_tag + &apos;&quot;, &quot;node_name&quot; : &quot;&apos; + node + &apos;&quot;}&apos;
+
+     archiveArtifacts artifacts: &apos;metadata.json&apos;, onlyIfSuccessful: true
+}</script>
+    <sandbox>true</sandbox>
   </definition>
   <triggers/>
   <disabled>false</disabled>
diff --git a/deploy/jenkins/jobs/Provision/jobs/dev/jobs/DataPipeline/jobs/Yarn/config.xml b/deploy/jenkins/jobs/Provision/jobs/dev/jobs/DataPipeline/jobs/Yarn/config.xml
index a36f5c0d7fd1b87e31972e58bcf002359a7d3ea9..bb720de727203bbaa37a473092b2fc04b1267a71 100644
--- a/deploy/jenkins/jobs/Provision/jobs/dev/jobs/DataPipeline/jobs/Yarn/config.xml
+++ b/deploy/jenkins/jobs/Provision/jobs/dev/jobs/DataPipeline/jobs/Yarn/config.xml
@@ -1,5 +1,5 @@
 <?xml version='1.1' encoding='UTF-8'?>
-<flow-definition plugin="workflow-job@2.32">
+<flow-definition plugin="workflow-job@2.33">
   <actions>
     <org.jenkinsci.plugins.workflow.multibranch.JobPropertyTrackerAction plugin="workflow-multibranch@2.21">
       <jobPropertyDescriptors>
@@ -20,7 +20,7 @@
       </strategy>
     </jenkins.model.BuildDiscarderProperty>
     <org.jenkinsci.plugins.workflow.job.properties.DisableConcurrentBuildsJobProperty/>
-    <com.sonyericsson.rebuild.RebuildSettings plugin="rebuild@1.30">
+    <com.sonyericsson.rebuild.RebuildSettings plugin="rebuild@1.31">
       <autoRebuild>false</autoRebuild>
       <rebuildDisabled>false</rebuildDisabled>
     </com.sonyericsson.rebuild.RebuildSettings>
@@ -32,7 +32,7 @@
           <randomName>choice-parameter-196500122471866</randomName>
           <visibleItemCount>1</visibleItemCount>
           <script class="org.biouno.unochoice.model.GroovyScript">
-            <secureScript plugin="script-security@1.57">
+            <secureScript plugin="script-security@1.60">
               <script>if (override_private_branch.equals(&quot;true&quot;)) {
 return &quot;&quot;&quot;&lt;input name=&quot;value&quot; value=&quot;${private_repo_branch}&quot; class=&quot;setting-input&quot;  type=&quot;text&quot;&gt;&lt;br&gt; &lt;font color=dimgray size=2&gt;&lt;b&gt;Change this value to checkout a different branch from private repository.&lt;/b&gt;&lt;/font&gt;&quot;&quot;&quot;
 }
@@ -40,7 +40,7 @@ else
 return &quot;&quot;&quot;&lt;b&gt;This parameter is not used&lt;/b&gt;&quot;&quot;&quot;</script>
               <sandbox>false</sandbox>
             </secureScript>
-            <secureFallbackScript plugin="script-security@1.57">
+            <secureFallbackScript plugin="script-security@1.60">
               <script>return &quot;&quot;&quot;&lt;b&gt;This parameter is not used&lt;/b&gt;&quot;&quot;&quot;</script>
               <sandbox>false</sandbox>
             </secureFallbackScript>
@@ -57,7 +57,7 @@ return &quot;&quot;&quot;&lt;b&gt;This parameter is not used&lt;/b&gt;&quot;&quo
           <randomName>choice-parameter-196500128714203</randomName>
           <visibleItemCount>1</visibleItemCount>
           <script class="org.biouno.unochoice.model.GroovyScript">
-            <secureScript plugin="script-security@1.57">
+            <secureScript plugin="script-security@1.60">
               <script>if (override_public_branch.equals(&quot;true&quot;)) {
 return &quot;&quot;&quot;&lt;input name=&quot;value&quot; value=&quot;&quot; class=&quot;setting-input&quot;  type=&quot;text&quot;&gt;&lt;br&gt; &lt;font color=dimgray size=2&gt;&lt;b&gt;Provide the tag or branch name to checkout the Jenkinsfile and codebase.&lt;br&gt;Note: The tag or branch name for this job should be taken from &lt;a href=&quot;https://github.com/project-sunbird/sunbird-data-pipeline&quot;&gt;project-sunbird/sunbird-data-pipeline&lt;/a&gt;&lt;/b&gt;&lt;/font&gt;&lt;/b&gt;&lt;/font&gt;&quot;&quot;&quot;;
 
@@ -66,7 +66,7 @@ else
 return &quot;&quot;&quot;&lt;b&gt;This parameter is not used&lt;/b&gt;&quot;&quot;&quot;</script>
               <sandbox>false</sandbox>
             </secureScript>
-            <secureFallbackScript plugin="script-security@1.57">
+            <secureFallbackScript plugin="script-security@1.60">
               <script>return &quot;&quot;&quot;&lt;b&gt;This parameter is not used&lt;/b&gt;&quot;&quot;&quot;</script>
               <sandbox>false</sandbox>
             </secureFallbackScript>
@@ -77,9 +77,17 @@ return &quot;&quot;&quot;&lt;b&gt;This parameter is not used&lt;/b&gt;&quot;&quo
           <choiceType>ET_FORMATTED_HTML</choiceType>
           <omitValueField>true</omitValueField>
         </org.biouno.unochoice.DynamicReferenceParameter>
+        <hudson.model.StringParameterDefinition>
+          <name>hosts</name>
+          <description>&lt;font color=dimgray size=2&gt;&lt;b&gt;Specify IP or group to limit the run on specific IP or host&lt;/b&gt;&lt;/font&gt;</description>
+          <defaultValue>all</defaultValue>
+          <trim>false</trim>
+        </hudson.model.StringParameterDefinition>
       </parameterDefinitions>
     </hudson.model.ParametersDefinitionProperty>
     <hudson.plugins.throttleconcurrents.ThrottleJobProperty plugin="throttle-concurrents@2.0.1">
+      <maxConcurrentPerNode>0</maxConcurrentPerNode>
+      <maxConcurrentTotal>0</maxConcurrentTotal>
       <categories class="java.util.concurrent.CopyOnWriteArrayList"/>
       <throttleEnabled>false</throttleEnabled>
       <throttleOption>project</throttleOption>
@@ -87,8 +95,8 @@ return &quot;&quot;&quot;&lt;b&gt;This parameter is not used&lt;/b&gt;&quot;&quo
       <paramsToUseForLimit></paramsToUseForLimit>
     </hudson.plugins.throttleconcurrents.ThrottleJobProperty>
   </properties>
-  <definition class="org.jenkinsci.plugins.workflow.cps.CpsScmFlowDefinition" plugin="workflow-cps@2.66">
-    <scm class="hudson.plugins.git.GitSCM" plugin="git@3.9.3">
+  <definition class="org.jenkinsci.plugins.workflow.cps.CpsScmFlowDefinition" plugin="workflow-cps@2.70">
+    <scm class="hudson.plugins.git.GitSCM" plugin="git@3.10.0">
       <configVersion>2</configVersion>
       <userRemoteConfigs>
         <hudson.plugins.git.UserRemoteConfig>
diff --git a/pipelines/backup/postgresql-restore/Jenkinsfile b/pipelines/backup/postgresql-restore/Jenkinsfile
index 53effdd0ce95e1ee004ef41a092d11f0be94dfd8..ad24fdf9b50de6f963e0a46cd2ae2aff33595ccf 100644
--- a/pipelines/backup/postgresql-restore/Jenkinsfile
+++ b/pipelines/backup/postgresql-restore/Jenkinsfile
@@ -22,7 +22,7 @@ node() {
                 jobName = sh(returnStdout: true, script: "echo $JOB_NAME").split('/')[-1].trim()
                 currentWs = sh(returnStdout: true, script: 'pwd').trim()
                 ansiblePlaybook = "${currentWs}/ansible/postgresql-restore.yml"
-                ansibleExtraArgs = "--vault-password-file /var/lib/jenkins/secrets/vault-pass"
+                ansibleExtraArgs = "--extra-vars \"postgres_backup_filename=${params.postgres_backup_filename} postgres_user=${params.postgres_user} postgres_password=${params.postgres_password} postgres_hostname=${params.postgres_hostname} postgres_env=${params.postgres_env}\" --vault-password-file /var/lib/jenkins/secrets/vault-pass"
                 values.put('currentWs', currentWs)
                 values.put('env', envDir)
                 values.put('module', module)
diff --git a/pipelines/deploy/org_sunbird_questionunit_quml/Jenkinsfile b/pipelines/deploy/org_sunbird_questionunit_quml/Jenkinsfile
new file mode 100644
index 0000000000000000000000000000000000000000..bad14b81a321c3b315d0e7226a1aa1ad9b00381c
--- /dev/null
+++ b/pipelines/deploy/org_sunbird_questionunit_quml/Jenkinsfile
@@ -0,0 +1,66 @@
+@Library('deploy-conf') _
+node() {
+    try {
+        String ANSI_GREEN = "\u001B[32m"
+        String ANSI_NORMAL = "\u001B[0m"
+        String ANSI_BOLD = "\u001B[1m"
+        String ANSI_RED = "\u001B[31m"
+        String ANSI_YELLOW = "\u001B[33m"
+
+        stage('checkout public repo') {
+            cleanWs()
+            checkout scm
+        }
+
+            ansiColor('xterm') {
+                values = lp_dp_params()
+                values.put('module', 'Core')
+                stage('get artifact') {
+                    currentWs = sh(returnStdout: true, script: 'pwd').trim()
+                    artifact = values.artifact_name + ":" + values.artifact_version
+                    values.put('currentWs', currentWs)
+                    if (params.artifact_source == "ArtifactRepo") {
+                        println(ANSI_BOLD + ANSI_YELLOW + '''\
+                        Option chosen is ArtifactRepo, ignoring any previously copied artifacts and new artifacts will be downloaded from remote source
+                        '''.stripIndent().replace("\n", " ") + ANSI_NORMAL)
+                        ansiblePlaybook = "${currentWs}/ansible/artifacts-download.yml"
+                        ansibleExtraArgs = """\
+                               --extra-vars "artifact=${artifact}
+                               artifact_path=${currentWs}/${artifact}"
+                               --vault-password-file /var/lib/jenkins/secrets/vault-pass
+                               """.stripIndent().replace("\n", " ")
+                        values.put('ansiblePlaybook', ansiblePlaybook)
+                        values.put('ansibleExtraArgs', ansibleExtraArgs)
+                        ansible_playbook_run(values)
+                    }
+                    else{
+                        println(ANSI_BOLD + ANSI_YELLOW + '''\
+                    Option chosen is JenkinsJob, using the artifacts copied 
+                    '''.stripIndent().replace("\n", " ") + ANSI_NORMAL)
+                    }
+                }
+                stage('deploy artifact'){
+                    sh """
+                       unzip ${artifact}
+                       unzip content-plugins.zip
+                       chmod a+x content-plugins/az_copy.sh
+                       mv content-plugins ansible
+                    """
+
+                    ansiblePlaybook = "${currentWs}/ansible/plugin.yml"
+                    ansibleExtraArgs = "--tags org_sunbird_questionunit_quml --extra-vars \" plugins_name=${params.plugin_name} source_file=${currentWs}/ansible/content-plugins/${params.plugin_name}\" --vault-password-file /var/lib/jenkins/secrets/vault-pass"  
+                      values.put('ansiblePlaybook', ansiblePlaybook)
+                      values.put('ansibleExtraArgs', ansibleExtraArgs)
+                      println values
+                      ansible_playbook_run(values)
+
+                    archiveArtifacts artifacts: "${artifact}", fingerprint: true, onlyIfSuccessful: true
+                    archiveArtifacts artifacts: 'metadata.json', onlyIfSuccessful: true
+                    currentBuild.description = "${values.artifact_version}"
+                }
+            }
+        }
+    catch (err) {
+        throw err
+    }
+}
diff --git a/private_repo/ansible/inventory/dev/Core/common.yml b/private_repo/ansible/inventory/dev/Core/common.yml
index df24b8ef8392f0634ee92fc010f188b5b154267b..c30e17dbd3d9a433f6c20d50433d1bd6d4a7b5ae 100644
--- a/private_repo/ansible/inventory/dev/Core/common.yml
+++ b/private_repo/ansible/inventory/dev/Core/common.yml
@@ -1,13 +1,14 @@
 ##########################################
 # Starting Of Core VARS
 env:                             #Name of the environment, e.g. dev, staging or production.
+env_name: "{{ env }}"
 domain_name:                  #Domain on which the portal will be accessed. e.g. staging.{implementation-name}.org
 proto:                          # Protocol
 bootstrap_user: 
 bootstrap_key_path: 
 ssh_public_key_deployer: ""             # SSH Public key for deployer user, with which ansible will execute tasks
 
-ekstep_s3_env: qa                       # dev or qa of ekstep for plugins
+ekstep_s3_env: qa                       # dev or qa or prod of ekstep for plugins
 learningservice_ip:                     # Load balancer IP for learning server
 searchservice_ip:                       # search service Load balancer IP
 analyticsapi_ip:                        # Analytics Service Load Balancer IP
@@ -67,4 +68,6 @@ keycloak_ekstep_sunbird_login_theme_dest: "/opt/keycloak/themes/sunbird/login"
 keycloak_postgresql: "postgresql-9.4.1212.jar"
 sunbird_auth_version: 1.0v
 
+############## Release-1.15.0 & 2.0.0 ##################
+#sunbird_cassandra_replication_strategy: '{"class":"NetworkTopologyStrategy","datacenter1":2}' # If using cluster give this value and choose datacenter and replication factor as required '{"class":"NetworkTopologyStrategy","datacenter1":2}' if not using cluster, leave this variable commented
 
diff --git a/private_repo/ansible/inventory/dev/Core/hosts b/private_repo/ansible/inventory/dev/Core/hosts
index 6a7d19569932e1599357835651735f31cfc4a7de..dbf41b480cadfe91b83576c753dd505de31c8fde 100644
--- a/private_repo/ansible/inventory/dev/Core/hosts
+++ b/private_repo/ansible/inventory/dev/Core/hosts
@@ -36,15 +36,26 @@ log-es-1
 [swarm-agent-for-prometheus:children]
 swarm-agent-for-prometheus-1
 
-[swarm-agent-for-grafana-1]
+[swarm-agent-for-prometheus-stateful:children]
+swarm-agent-for-prometheus
+
+[swarm-dashboard-1]
 18.0.0.15
 
-[swarm-agent-for-grafana:children]
-swarm-agent-for-grafana-1
+[swarm-dashboard:children]
+swarm-dashboard-1
 
-[swarm-agent-for-alertmanager-1]
+[swarm-agent-dashboard-1]
 18.0.0.15
 
+[swarm-agent-dashboard:children]
+swarm-agent-dashboard-1
+
+[alertmanager_stateful:children]
+swarm-agent-dashboard
+
+[swarm-agent-for-alertmanager-1]
+18.0.0.15
 
 [es-1]
 18.0.0.9 es_instance_name=es-1 es_etc_node_master=true es_etc_node_data=true
@@ -92,6 +103,15 @@ postgresql-master
 [kafka:children]
 kafka-1
 
+[processing-cluster-zookeepers]
+18.0.0.50              # Zookeeper IP of processing cluster in Data pipeline
+
+[zookeeper:children]
+processing-cluster-zookeepers
+
+[lp-redis]
+18.0.0.51              # Redis master IP of Knowledge platform
+
 [local]
 localhost
 
@@ -127,6 +147,8 @@ swarm-nodes
 swarm-manager
 kafka
 keycloak
+swarm-dashboard
+swarm-agent-dashboard
 
 [env:children]
 core
@@ -142,4 +164,4 @@ swarm-manager
 # cluster_name=DC1
 #
 ansible_ssh_user=deployer
-ansible_ssh_private_key_file=/run/secrets/deployer_ssh_key
+ansible_ssh_private_key_file=/var/lib/jenkins/secrets/deployer_ssh_key
diff --git a/private_repo/ansible/inventory/dev/Core/secrets.yml b/private_repo/ansible/inventory/dev/Core/secrets.yml
index f1a8f2cd493d50b099beb90bdde8fea5feea3f9d..fdb8ad4af0e72045c245790e77f3fd420460b1f2 100644
--- a/private_repo/ansible/inventory/dev/Core/secrets.yml
+++ b/private_repo/ansible/inventory/dev/Core/secrets.yml
@@ -1,6 +1,6 @@
 # !! Might deprecate 
 core_vault_sunbird_ekstep_api_key: 
-core_vault_sunbird_encryption_key: 
+core_vault_sunbird_encryption_key:       #Random hash to encrypt data
 core_vault_kong__test_jwt: 
 
 ############# Core #######################
@@ -21,7 +21,7 @@ core_vault_ansible_vault_password:
 ################### DONT FILL THESE VARIABLES INITIALLY ###################
 
 core_vault_sunbird_sso_publickey:  # Get After Keycloak Deployment
-core_vault_sunbird_api_auth_token: #Authorization key (JWT) to access Sunbird APIs. This will be in the output of deploy-apis.sh script, extracting it out is documented in the deployment wiki.
+core_vault_sunbird_api_auth_token: #Take the jwt token api-management-test-user from Jenkins job OnboardConsumers and update core_vault_sunbird_api_auth_token if using KP and DP along with core
 core_vault_sunbird_keycloak_user_federation_provider_id:      # Get after keycloak deployment
 
 ######################## Not mandatory ###################################
diff --git a/private_repo/ansible/inventory/dev/DataPipeline/hosts b/private_repo/ansible/inventory/dev/DataPipeline/hosts
index 919631f7f43c67b65b2ccbc9b5876f1721ff9dce..5243a3e7aa25847bc0be171b516c5208aa08424c 100644
--- a/private_repo/ansible/inventory/dev/DataPipeline/hosts
+++ b/private_repo/ansible/inventory/dev/DataPipeline/hosts
@@ -9,6 +9,11 @@
 [core-cassandra]
 15.0.0.7
 
+[core-es-1]
+15.0.0.50    # This should be elasticsearch master IP of Core
+
+[core-es:children]
+core-es-1
 
 ################# LP ##########################
 [search]
@@ -56,9 +61,14 @@ cassandra
 15.0.3.8
 
 [influxdb]
-#15.0.3.8
 15.0.3.6
 
+[redis]
+15.0.3.5
+
+[redisall:children]
+redis
+
 [processing-cluster-kafka]
 15.0.3.8
 15.0.3.7
@@ -70,7 +80,6 @@ cassandra
 [telemetry-search-cluster1]
 15.0.2.6
 
-
 [telemetry-search-cluster:children]
 telemetry-search-cluster1
 
diff --git a/private_repo/ansible/inventory/dev/KnowledgePlatform/common.yml b/private_repo/ansible/inventory/dev/KnowledgePlatform/common.yml
index 05ff5d7861ec82bec9b537790597f330dba55419..a4f306758d201ff6926f0188c3c8f608c122a962 100644
--- a/private_repo/ansible/inventory/dev/KnowledgePlatform/common.yml
+++ b/private_repo/ansible/inventory/dev/KnowledgePlatform/common.yml
@@ -38,5 +38,5 @@ neo4j_enterprise: "true"
 ## backup
 backup_azure_storage_account_name: sunbirdbackupsdev
 ### overriding backup secret
-backup_azure_storage_access_key: "{{lp_vault_backup_azure_storage_secret}}"
+backup_azure_storage_access_key: "{{lp_vault_azure_storage_secret}}"
 
diff --git a/private_repo/ansible/inventory/dev/KnowledgePlatform/hosts b/private_repo/ansible/inventory/dev/KnowledgePlatform/hosts
index d67f201cf7a6f14f748e1b6eaa42edfb0e7d4112..a0aad45eac3c4f6a470874746b0ec3abb269f0a4 100644
--- a/private_repo/ansible/inventory/dev/KnowledgePlatform/hosts
+++ b/private_repo/ansible/inventory/dev/KnowledgePlatform/hosts
@@ -31,9 +31,12 @@ redis1
 [learning-neo4j-cluster:children]
 learning-neo4j-node1
 
-[cassandra]
+[cassandra-node-1]   # The old cassandra group has been renamed to cassandra-node-* to accomadate for clusters
 15.0.2.7
 
+[cassandra:children]
+cassandra-node-1
+
 [dp-cassandra]
 15.0.2.7