From 470823d9dd6cf7728e04ec9c121fb375cdb9e369 Mon Sep 17 00:00:00 2001
From: rheafernandes
Date: Tue, 13 Oct 2020 12:45:50 +0530
Subject: [PATCH 001/184] Onboarded Asset V4 Apis
---
ansible/roles/kong-api/defaults/main.yml | 108 +++++++++++++++++++++++
1 file changed, 108 insertions(+)
diff --git a/ansible/roles/kong-api/defaults/main.yml b/ansible/roles/kong-api/defaults/main.yml
index 0daa1bbbb..0bf47f3e9 100644
--- a/ansible/roles/kong-api/defaults/main.yml
+++ b/ansible/roles/kong-api/defaults/main.yml
@@ -5257,3 +5257,111 @@ kong_apis:
config.limit_by: credential
- name: request-size-limiting
config.allowed_payload_size: "{{ small_request_size_limit }}"
+
+ - name: createAsset
+ uris: "{{ asset_prefix }}/v1/create"
+ upstream_url: "{{ content_service_url }}/asset/v4/create"
+ strip_uri: true
+ plugins:
+ - name: jwt
+ - name: cors
+ - "{{ statsd_pulgin }}"
+ - name: acl
+ config.whitelist:
+ - 'contentCreate'
+ - name: rate-limiting
+ config.policy: local
+ config.hour: "{{ medium_rate_limit_per_hour }}"
+ config.limit_by: credential
+ - name: request-size-limiting
+ config.allowed_payload_size: "{{ medium_request_size_limit }}"
+
+ - name: updateAsset
+ uris: "{{ asset_prefix }}/v1/update"
+ upstream_url: "{{ content_service_url }}/asset/v4/update"
+ strip_uri: true
+ plugins:
+ - name: jwt
+ - name: cors
+ - "{{ statsd_pulgin }}"
+ - name: acl
+ config.whitelist:
+ - 'contentCreate'
+ - name: rate-limiting
+ config.policy: local
+ config.hour: "{{ medium_rate_limit_per_hour }}"
+ config.limit_by: credential
+ - name: request-size-limiting
+ config.allowed_payload_size: "{{ medium_request_size_limit }}"
+
+ - name: readAsset
+ uris: "{{ asset_prefix }}/v1/read"
+ upstream_url: "{{ content_service_url }}/asset/v4/read"
+ strip_uri: true
+ plugins:
+ - name: jwt
+ - name: cors
+ - "{{ statsd_pulgin }}"
+ - name: acl
+ config.whitelist:
+ - 'contentCreate'
+ - name: rate-limiting
+ config.policy: local
+ config.hour: "{{ medium_rate_limit_per_hour }}"
+ config.limit_by: credential
+ - name: request-size-limiting
+ config.allowed_payload_size: "{{ medium_request_size_limit }}"
+
+ - name: uploadAsset
+ uris: "{{ asset_prefix }}/v1/upload"
+ upstream_url: "{{ content_service_url }}/asset/v4/upload"
+ strip_uri: true
+ plugins:
+ - name: jwt
+ - name: cors
+ - "{{ statsd_pulgin }}"
+ - name: acl
+ config.whitelist:
+ - 'contentCreate'
+ - name: rate-limiting
+ config.policy: local
+ config.hour: "{{ medium_rate_limit_per_hour }}"
+ config.limit_by: credential
+ - name: request-size-limiting
+ config.allowed_payload_size: "{{ medium_request_size_limit }}"
+
+ - name: uploadUrlAsset
+ uris: "{{ asset_prefix }}/v1/upload/url"
+ upstream_url: "{{ content_service_url }}/asset/v4/upload/url"
+ strip_uri: true
+ plugins:
+ - name: jwt
+ - name: cors
+ - "{{ statsd_pulgin }}"
+ - name: acl
+ config.whitelist:
+ - 'contentCreate'
+ - name: rate-limiting
+ config.policy: local
+ config.hour: "{{ medium_rate_limit_per_hour }}"
+ config.limit_by: credential
+ - name: request-size-limiting
+ config.allowed_payload_size: "{{ medium_request_size_limit }}"
+
+ - name: retireAsset
+ uris: "{{ asset_prefix }}/v1/retire"
+ upstream_url: "{{ content_service_url }}/asset/v4/retire"
+ strip_uri: true
+ plugins:
+ - name: jwt
+ - name: cors
+ - "{{ statsd_pulgin }}"
+ - name: acl
+ config.whitelist:
+ - 'contentCreate'
+ - name: rate-limiting
+ config.policy: local
+ config.hour: "{{ medium_rate_limit_per_hour }}"
+ config.limit_by: credential
+ - name: request-size-limiting
+ config.allowed_payload_size: "{{ medium_request_size_limit }}"
From 10827f1b01735bd7493c0ea3a6ea2f30183a1176 Mon Sep 17 00:00:00 2001
From: rheafernandes
Date: Tue, 13 Oct 2020 13:17:50 +0530
Subject: [PATCH 002/184] Added changes for asset prefix
---
ansible/roles/kong-api/defaults/main.yml | 2 ++
1 file changed, 2 insertions(+)
diff --git a/ansible/roles/kong-api/defaults/main.yml b/ansible/roles/kong-api/defaults/main.yml
index 0bf47f3e9..bdf576b2d 100644
--- a/ansible/roles/kong-api/defaults/main.yml
+++ b/ansible/roles/kong-api/defaults/main.yml
@@ -75,6 +75,8 @@ auth_service_prefix: /auth
object_category_prefix: /object/category
object_category_definition_prefix: /object/category/definition
dataset_service_prefix: /dataset
+asset_prefix: /asset
+
# Service URLs
knowledge_mw_service_url: "http://knowledge-mw-service:5000"
From 6768114fd04242a2933ec4f6a4516626f3d7344f Mon Sep 17 00:00:00 2001
From: NehaVerma
Date: Tue, 13 Oct 2020 13:34:27 +0530
Subject: [PATCH 003/184] SB-21000 : Certificate Template mapping added
---
.../stack-sunbird/templates/content-service_application.conf | 1 +
1 file changed, 1 insertion(+)
diff --git a/ansible/roles/stack-sunbird/templates/content-service_application.conf b/ansible/roles/stack-sunbird/templates/content-service_application.conf
index 07dbcb6c0..a96cdc908 100644
--- a/ansible/roles/stack-sunbird/templates/content-service_application.conf
+++ b/ansible/roles/stack-sunbird/templates/content-service_application.conf
@@ -534,6 +534,7 @@ contentTypeToPrimaryCategory {
LessonPlanUnit: "Lesson Plan Unit"
CourseUnit: "Course Unit"
TextBookUnit: "Textbook Unit"
+ Asset: "Certificate Template"
}
resourceTypeToPrimaryCategory {
From c7a3fcd7d65defafd4130e6ae4fb203ed9d5f6a8 Mon Sep 17 00:00:00 2001
From: rheafernandes
Date: Tue, 13 Oct 2020 14:10:22 +0530
Subject: [PATCH 004/184] Added fix for indentation issue
---
ansible/roles/kong-api/defaults/main.yml | 192 +++++++++++------------
1 file changed, 96 insertions(+), 96 deletions(-)
diff --git a/ansible/roles/kong-api/defaults/main.yml b/ansible/roles/kong-api/defaults/main.yml
index bdf576b2d..7fccebf6f 100644
--- a/ansible/roles/kong-api/defaults/main.yml
+++ b/ansible/roles/kong-api/defaults/main.yml
@@ -5261,109 +5261,109 @@ kong_apis:
config.allowed_payload_size: "{{ small_request_size_limit }}"
- name: createAsset
- uris: "{{ asset_prefix }}/v1/create"
- upstream_url: "{{ content_service_url }}/asset/v4/create"
- strip_uri: true
- plugins:
- - name: jwt
- - name: cors
- - "{{ statsd_pulgin }}"
- - name: acl
- config.whitelist:
- - 'contentCreate'
- - name: rate-limiting
- config.policy: local
- config.hour: "{{ medium_rate_limit_per_hour }}"
- config.limit_by: credential
- - name: request-size-limiting
- config.allowed_payload_size: "{{ medium_request_size_limit }}"
+ uris: "{{ asset_prefix }}/v1/create"
+ upstream_url: "{{ content_service_url }}/asset/v4/create"
+ strip_uri: true
+ plugins:
+ - name: jwt
+ - name: cors
+ - "{{ statsd_pulgin }}"
+ - name: acl
+ config.whitelist:
+ - 'contentCreate'
+ - name: rate-limiting
+ config.policy: local
+ config.hour: "{{ medium_rate_limit_per_hour }}"
+ config.limit_by: credential
+ - name: request-size-limiting
+ config.allowed_payload_size: "{{ medium_request_size_limit }}"
- name: updateAsset
- uris: "{{ asset_prefix }}/v1/update"
- upstream_url: "{{ content_service_url }}/asset/v4/update"
- strip_uri: true
- plugins:
- - name: jwt
- - name: cors
- - "{{ statsd_pulgin }}"
- - name: acl
- config.whitelist:
- - 'contentCreate'
- - name: rate-limiting
- config.policy: local
- config.hour: "{{ medium_rate_limit_per_hour }}"
- config.limit_by: credential
- - name: request-size-limiting
- config.allowed_payload_size: "{{ medium_request_size_limit }}"
+ uris: "{{ asset_prefix }}/v1/update"
+ upstream_url: "{{ content_service_url }}/asset/v4/update"
+ strip_uri: true
+ plugins:
+ - name: jwt
+ - name: cors
+ - "{{ statsd_pulgin }}"
+ - name: acl
+ config.whitelist:
+ - 'contentCreate'
+ - name: rate-limiting
+ config.policy: local
+ config.hour: "{{ medium_rate_limit_per_hour }}"
+ config.limit_by: credential
+ - name: request-size-limiting
+ config.allowed_payload_size: "{{ medium_request_size_limit }}"
- name: readAsset
- uris: "{{ asset_prefix }}/v1/read"
- upstream_url: "{{ content_service_url }}/asset/v4/read"
- strip_uri: true
- plugins:
- - name: jwt
- - name: cors
- - "{{ statsd_pulgin }}"
- - name: acl
- config.whitelist:
- - 'contentCreate'
- - name: rate-limiting
- config.policy: local
- config.hour: "{{ medium_rate_limit_per_hour }}"
- config.limit_by: credential
- - name: request-size-limiting
- config.allowed_payload_size: "{{ medium_request_size_limit }}"
+ uris: "{{ asset_prefix }}/v1/read"
+ upstream_url: "{{ content_service_url }}/asset/v4/read"
+ strip_uri: true
+ plugins:
+ - name: jwt
+ - name: cors
+ - "{{ statsd_pulgin }}"
+ - name: acl
+ config.whitelist:
+ - 'contentCreate'
+ - name: rate-limiting
+ config.policy: local
+ config.hour: "{{ medium_rate_limit_per_hour }}"
+ config.limit_by: credential
+ - name: request-size-limiting
+ config.allowed_payload_size: "{{ medium_request_size_limit }}"
- name: uploadAsset
- uris: "{{ asset_prefix }}/v1/upload"
- upstream_url: "{{ content_service_url }}/asset/v4/upload"
- strip_uri: true
- plugins:
- - name: jwt
- - name: cors
- - "{{ statsd_pulgin }}"
- - name: acl
- config.whitelist:
- - 'contentCreate'
- - name: rate-limiting
- config.policy: local
- config.hour: "{{ medium_rate_limit_per_hour }}"
- config.limit_by: credential
- - name: request-size-limiting
- config.allowed_payload_size: "{{ medium_request_size_limit }}"
+ uris: "{{ asset_prefix }}/v1/upload"
+ upstream_url: "{{ content_service_url }}/asset/v4/upload"
+ strip_uri: true
+ plugins:
+ - name: jwt
+ - name: cors
+ - "{{ statsd_pulgin }}"
+ - name: acl
+ config.whitelist:
+ - 'contentCreate'
+ - name: rate-limiting
+ config.policy: local
+ config.hour: "{{ medium_rate_limit_per_hour }}"
+ config.limit_by: credential
+ - name: request-size-limiting
+ config.allowed_payload_size: "{{ medium_request_size_limit }}"
- name: uploadUrlAsset
- uris: "{{ asset_prefix }}/v1/upload/url"
- upstream_url: "{{ content_service_url }}/asset/v4/upload/url"
- strip_uri: true
- plugins:
- - name: jwt
- - name: cors
- - "{{ statsd_pulgin }}"
- - name: acl
- config.whitelist:
- - 'contentCreate'
- - name: rate-limiting
- config.policy: local
- config.hour: "{{ medium_rate_limit_per_hour }}"
- config.limit_by: credential
- - name: request-size-limiting
- config.allowed_payload_size: "{{ medium_request_size_limit }}"
+ uris: "{{ asset_prefix }}/v1/upload/url"
+ upstream_url: "{{ content_service_url }}/asset/v4/upload/url"
+ strip_uri: true
+ plugins:
+ - name: jwt
+ - name: cors
+ - "{{ statsd_pulgin }}"
+ - name: acl
+ config.whitelist:
+ - 'contentCreate'
+ - name: rate-limiting
+ config.policy: local
+ config.hour: "{{ medium_rate_limit_per_hour }}"
+ config.limit_by: credential
+ - name: request-size-limiting
+ config.allowed_payload_size: "{{ medium_request_size_limit }}"
- name: retireAsset
- uris: "{{ asset_prefix }}/v1/retire"
- upstream_url: "{{ content_service_url }}/asset/v4/retire"
- strip_uri: true
- plugins:
- - name: jwt
- - name: cors
- - "{{ statsd_pulgin }}"
- - name: acl
- config.whitelist:
- - 'contentCreate'
- - name: rate-limiting
- config.policy: local
- config.hour: "{{ medium_rate_limit_per_hour }}"
- config.limit_by: credential
- - name: request-size-limiting
- config.allowed_payload_size: "{{ medium_request_size_limit }}"
+ uris: "{{ asset_prefix }}/v1/retire"
+ upstream_url: "{{ content_service_url }}/asset/v4/retire"
+ strip_uri: true
+ plugins:
+ - name: jwt
+ - name: cors
+ - "{{ statsd_pulgin }}"
+ - name: acl
+ config.whitelist:
+ - 'contentCreate'
+ - name: rate-limiting
+ config.policy: local
+ config.hour: "{{ medium_rate_limit_per_hour }}"
+ config.limit_by: credential
+ - name: request-size-limiting
+ config.allowed_payload_size: "{{ medium_request_size_limit }}"
From 74c5b2c49013106026ed19f5b96e440751a0a2c6 Mon Sep 17 00:00:00 2001
From: rheafernandes
Date: Tue, 13 Oct 2020 16:59:14 +0530
Subject: [PATCH 005/184] Added collection v4 apis
---
ansible/roles/kong-api/defaults/main.yml | 218 +++++++++++++++++++++++
1 file changed, 218 insertions(+)
diff --git a/ansible/roles/kong-api/defaults/main.yml b/ansible/roles/kong-api/defaults/main.yml
index 7fccebf6f..3e8c2d865 100644
--- a/ansible/roles/kong-api/defaults/main.yml
+++ b/ansible/roles/kong-api/defaults/main.yml
@@ -76,6 +76,7 @@ object_category_prefix: /object/category
object_category_definition_prefix: /object/category/definition
dataset_service_prefix: /dataset
asset_prefix: /asset
+collection_prefix: /collection
# Service URLs
@@ -5367,3 +5368,220 @@ kong_apis:
config.limit_by: credential
- name: request-size-limiting
config.allowed_payload_size: "{{ medium_request_size_limit }}"
+
+ - name: collectionCreate
+ uris: "{{ collection_prefix }}/v1/create"
+ upstream_url: "{{ content_service_url }}/collection/v4/create"
+ strip_uri: true
+ plugins:
+ - name: jwt
+ - name: cors
+ - "{{ statsd_pulgin }}"
+ - name: acl
+ config.whitelist:
+ - 'contentCreate'
+ - name: rate-limiting
+ config.policy: local
+ config.hour: "{{ medium_rate_limit_per_hour }}"
+ config.limit_by: credential
+ - name: request-size-limiting
+ config.allowed_payload_size: "{{ medium_request_size_limit }}"
+
+ - name: collectionRead
+ uris: "{{ collection_prefix }}/v1/read"
+ upstream_url: "{{ content_service_url }}/collection/v4/read"
+ strip_uri: true
+ plugins:
+ - name: jwt
+ - name: cors
+ - "{{ statsd_pulgin }}"
+ - name: acl
+ config.whitelist:
+ - 'contentCreate'
+ - name: rate-limiting
+ config.policy: local
+ config.hour: "{{ medium_rate_limit_per_hour }}"
+ config.limit_by: credential
+ - name: request-size-limiting
+ config.allowed_payload_size: "{{ medium_request_size_limit }}"
+
+ - name: collectionUpdate
+ uris: "{{ collection_prefix }}/v1/update"
+ upstream_url: "{{ content_service_url }}/collection/v4/update"
+ strip_uri: true
+ plugins:
+ - name: jwt
+ - name: cors
+ - "{{ statsd_pulgin }}"
+ - name: acl
+ config.whitelist:
+ - 'contentCreate'
+ - name: rate-limiting
+ config.policy: local
+ config.hour: "{{ medium_rate_limit_per_hour }}"
+ config.limit_by: credential
+ - name: request-size-limiting
+ config.allowed_payload_size: "{{ medium_request_size_limit }}"
+
+ - name: collectionFlag
+ uris: "{{ collection_prefix }}/v1/flag"
+ upstream_url: "{{ content_service_url }}/collection/v4/flag"
+ strip_uri: true
+ plugins:
+ - name: jwt
+ - name: cors
+ - "{{ statsd_pulgin }}"
+ - name: acl
+ config.whitelist:
+ - 'contentCreate'
+ - name: rate-limiting
+ config.policy: local
+ config.hour: "{{ medium_rate_limit_per_hour }}"
+ config.limit_by: credential
+ - name: request-size-limiting
+ config.allowed_payload_size: "{{ medium_request_size_limit }}"
+
+ - name: collectionDiscard
+ uris: "{{ collection_prefix }}/v1/discard"
+ upstream_url: "{{ content_service_url }}/collection/v4/discard"
+ strip_uri: true
+ plugins:
+ - name: jwt
+ - name: cors
+ - "{{ statsd_pulgin }}"
+ - name: acl
+ config.whitelist:
+ - 'contentCreate'
+ - name: rate-limiting
+ config.policy: local
+ config.hour: "{{ medium_rate_limit_per_hour }}"
+ config.limit_by: credential
+ - name: request-size-limiting
+ config.allowed_payload_size: "{{ medium_request_size_limit }}"
+
+ - name: collectionRetire
+ uris: "{{ collection_prefix }}/v1/retire"
+ upstream_url: "{{ content_service_url }}/collection/v4/retire"
+ strip_uri: true
+ plugins:
+ - name: jwt
+ - name: cors
+ - "{{ statsd_pulgin }}"
+ - name: acl
+ config.whitelist:
+ - 'contentCreate'
+ - name: rate-limiting
+ config.policy: local
+ config.hour: "{{ medium_rate_limit_per_hour }}"
+ config.limit_by: credential
+ - name: request-size-limiting
+ config.allowed_payload_size: "{{ medium_request_size_limit }}"
+
+ - name: collectionHierarchyAdd
+ uris: "{{ collection_prefix }}/v1/hierarchy/add"
+ upstream_url: "{{ content_service_url }}/collection/v4/hierarchy/add"
+ strip_uri: true
+ plugins:
+ - name: jwt
+ - name: cors
+ - "{{ statsd_pulgin }}"
+ - name: acl
+ config.whitelist:
+ - 'contentCreate'
+ - name: rate-limiting
+ config.policy: local
+ config.hour: "{{ medium_rate_limit_per_hour }}"
+ config.limit_by: credential
+ - name: request-size-limiting
+ config.allowed_payload_size: "{{ medium_request_size_limit }}"
+
+ - name: collectionHierarchyRemove
+ uris: "{{ collection_prefix }}/v1/hierarchy/remove"
+ upstream_url: "{{ content_service_url }}/collection/v4/hierarchy/remove"
+ strip_uri: true
+ plugins:
+ - name: jwt
+ - name: cors
+ - "{{ statsd_pulgin }}"
+ - name: acl
+ config.whitelist:
+ - 'contentCreate'
+ - name: rate-limiting
+ config.policy: local
+ config.hour: "{{ medium_rate_limit_per_hour }}"
+ config.limit_by: credential
+ - name: request-size-limiting
+ config.allowed_payload_size: "{{ medium_request_size_limit }}"
+
+ - name: collectionHierarchyUpdate
+ uris: "{{ collection_prefix }}/v1/hierarchy/update"
+ upstream_url: "{{ content_service_url }}/collection/v4/hierarchy/update"
+ strip_uri: true
+ plugins:
+ - name: jwt
+ - name: cors
+ - "{{ statsd_pulgin }}"
+ - name: acl
+ config.whitelist:
+ - 'contentCreate'
+ - name: rate-limiting
+ config.policy: local
+ config.hour: "{{ medium_rate_limit_per_hour }}"
+ config.limit_by: credential
+ - name: request-size-limiting
+ config.allowed_payload_size: "{{ medium_request_size_limit }}"
+
+ - name: collectionHierarchyRead
+ uris: "{{ collection_prefix }}/v1/hierarchy"
+ upstream_url: "{{ content_service_url }}/collection/v4/hierarchy"
+ strip_uri: true
+ plugins:
+ - name: jwt
+ - name: cors
+ - "{{ statsd_pulgin }}"
+ - name: acl
+ config.whitelist:
+ - 'contentCreate'
+ - name: rate-limiting
+ config.policy: local
+ config.hour: "{{ medium_rate_limit_per_hour }}"
+ config.limit_by: credential
+ - name: request-size-limiting
+ config.allowed_payload_size: "{{ medium_request_size_limit }}"
+
+
+ - name: collectionDialcodeLink
+ uris: "{{ collection_prefix }}/v1/dialcode/link"
+ upstream_url: "{{ content_service_url }}/collection/v4/dialcode/link"
+ strip_uri: true
+ plugins:
+ - name: jwt
+ - name: cors
+ - "{{ statsd_pulgin }}"
+ - name: acl
+ config.whitelist:
+ - 'contentCreate'
+ - name: rate-limiting
+ config.policy: local
+ config.hour: "{{ medium_rate_limit_per_hour }}"
+ config.limit_by: credential
+ - name: request-size-limiting
+ config.allowed_payload_size: "{{ medium_request_size_limit }}"
+
+ - name: collectionCopy
+ uris: "{{ collection_prefix }}/v1/copy"
+ upstream_url: "{{ content_service_url }}/collection/v4/copy"
+ strip_uri: true
+ plugins:
+ - name: jwt
+ - name: cors
+ - "{{ statsd_pulgin }}"
+ - name: acl
+ config.whitelist:
+ - 'contentCreate'
+ - name: rate-limiting
+ config.policy: local
+ config.hour: "{{ medium_rate_limit_per_hour }}"
+ config.limit_by: credential
+ - name: request-size-limiting
+ config.allowed_payload_size: "{{ medium_request_size_limit }}"
From f065ce699b2c8fa003187da6f3a9be947b536ecc Mon Sep 17 00:00:00 2001
From: rheafernandes
Date: Tue, 13 Oct 2020 17:29:48 +0530
Subject: [PATCH 006/184] Added content v4 apis
---
ansible/roles/kong-api/defaults/main.yml | 216 +++++++++++++++++++++++
1 file changed, 216 insertions(+)
diff --git a/ansible/roles/kong-api/defaults/main.yml b/ansible/roles/kong-api/defaults/main.yml
index 3e8c2d865..87c65505b 100644
--- a/ansible/roles/kong-api/defaults/main.yml
+++ b/ansible/roles/kong-api/defaults/main.yml
@@ -5585,3 +5585,219 @@ kong_apis:
config.limit_by: credential
- name: request-size-limiting
config.allowed_payload_size: "{{ medium_request_size_limit }}"
+
+ - name: contentCreate
+ uris: "{{ content_prefix }}/v1/create"
+ upstream_url: "{{ content_service_url }}/content/v4/create"
+ strip_uri: true
+ plugins:
+ - name: jwt
+ - name: cors
+ - "{{ statsd_pulgin }}"
+ - name: acl
+ config.whitelist:
+ - 'contentCreate'
+ - name: rate-limiting
+ config.policy: local
+ config.hour: "{{ medium_rate_limit_per_hour }}"
+ config.limit_by: credential
+ - name: request-size-limiting
+ config.allowed_payload_size: "{{ medium_request_size_limit }}"
+
+ - name: contentUpdate
+ uris: "{{ content_prefix }}/v1/update"
+ upstream_url: "{{ content_service_url }}/content/v4/update"
+ strip_uri: true
+ plugins:
+ - name: jwt
+ - name: cors
+ - "{{ statsd_pulgin }}"
+ - name: acl
+ config.whitelist:
+ - 'contentCreate'
+ - name: rate-limiting
+ config.policy: local
+ config.hour: "{{ medium_rate_limit_per_hour }}"
+ config.limit_by: credential
+ - name: request-size-limiting
+ config.allowed_payload_size: "{{ medium_request_size_limit }}"
+
+ - name: contentRead
+ uris: "{{ content_prefix }}/v1/read"
+ upstream_url: "{{ content_service_url }}/content/v4/read"
+ strip_uri: true
+ plugins:
+ - name: jwt
+ - name: cors
+ - "{{ statsd_pulgin }}"
+ - name: acl
+ config.whitelist:
+ - 'contentCreate'
+ - name: rate-limiting
+ config.policy: local
+ config.hour: "{{ medium_rate_limit_per_hour }}"
+ config.limit_by: credential
+ - name: request-size-limiting
+ config.allowed_payload_size: "{{ medium_request_size_limit }}"
+
+ - name: contentUpload
+ uris: "{{ content_prefix }}/v1/upload"
+ upstream_url: "{{ content_service_url }}/content/v4/upload"
+ strip_uri: true
+ plugins:
+ - name: jwt
+ - name: cors
+ - "{{ statsd_pulgin }}"
+ - name: acl
+ config.whitelist:
+ - 'contentCreate'
+ - name: rate-limiting
+ config.policy: local
+ config.hour: "{{ medium_rate_limit_per_hour }}"
+ config.limit_by: credential
+ - name: request-size-limiting
+ config.allowed_payload_size: "{{ medium_request_size_limit }}"
+
+ - name: contentUploadUrl
+ uris: "{{ content_prefix }}/v1/upload/url"
+ upstream_url: "{{ content_service_url }}/content/v4/upload/url"
+ strip_uri: true
+ plugins:
+ - name: jwt
+ - name: cors
+ - "{{ statsd_pulgin }}"
+ - name: acl
+ config.whitelist:
+ - 'contentCreate'
+ - name: rate-limiting
+ config.policy: local
+ config.hour: "{{ medium_rate_limit_per_hour }}"
+ config.limit_by: credential
+ - name: request-size-limiting
+ config.allowed_payload_size: "{{ medium_request_size_limit }}"
+
+ - name: contentCopy
+ uris: "{{ content_prefix }}/v1/copy"
+ upstream_url: "{{ content_service_url }}/content/v4/copy"
+ strip_uri: true
+ plugins:
+ - name: jwt
+ - name: cors
+ - "{{ statsd_pulgin }}"
+ - name: acl
+ config.whitelist:
+ - 'contentCreate'
+ - name: rate-limiting
+ config.policy: local
+ config.hour: "{{ medium_rate_limit_per_hour }}"
+ config.limit_by: credential
+ - name: request-size-limiting
+ config.allowed_payload_size: "{{ medium_request_size_limit }}"
+
+ - name: contentDialcodeLink
+ uris: "{{ content_prefix }}/v1/dialcode/link"
+ upstream_url: "{{ content_service_url }}/content/v4/dialcode/link"
+ strip_uri: true
+ plugins:
+ - name: jwt
+ - name: cors
+ - "{{ statsd_pulgin }}"
+ - name: acl
+ config.whitelist:
+ - 'contentCreate'
+ - name: rate-limiting
+ config.policy: local
+ config.hour: "{{ medium_rate_limit_per_hour }}"
+ config.limit_by: credential
+ - name: request-size-limiting
+ config.allowed_payload_size: "{{ medium_request_size_limit }}"
+
+ - name: contentImport
+ uris: "{{ content_prefix }}/v1/import"
+ upstream_url: "{{ content_service_url }}/content/v4/import"
+ strip_uri: true
+ plugins:
+ - name: jwt
+ - name: cors
+ - "{{ statsd_pulgin }}"
+ - name: acl
+ config.whitelist:
+ - 'contentCreate'
+ - name: rate-limiting
+ config.policy: local
+ config.hour: "{{ medium_rate_limit_per_hour }}"
+ config.limit_by: credential
+ - name: request-size-limiting
+ config.allowed_payload_size: "{{ medium_request_size_limit }}"
+
+ - name: contentFlag
+ uris: "{{ content_prefix }}/v1/flag"
+ upstream_url: "{{ content_service_url }}/content/v4/flag"
+ strip_uri: true
+ plugins:
+ - name: jwt
+ - name: cors
+ - "{{ statsd_pulgin }}"
+ - name: acl
+ config.whitelist:
+ - 'contentCreate'
+ - name: rate-limiting
+ config.policy: local
+ config.hour: "{{ medium_rate_limit_per_hour }}"
+ config.limit_by: credential
+ - name: request-size-limiting
+ config.allowed_payload_size: "{{ medium_request_size_limit }}"
+
+ - name: contentFlagAccept
+ uris: "{{ content_prefix }}/v1/flag/accept"
+ upstream_url: "{{ content_service_url }}/content/v4/flag/accept"
+ strip_uri: true
+ plugins:
+ - name: jwt
+ - name: cors
+ - "{{ statsd_pulgin }}"
+ - name: acl
+ config.whitelist:
+ - 'contentCreate'
+ - name: rate-limiting
+ config.policy: local
+ config.hour: "{{ medium_rate_limit_per_hour }}"
+ config.limit_by: credential
+ - name: request-size-limiting
+ config.allowed_payload_size: "{{ medium_request_size_limit }}"
+
+ - name: contentDiscard
+ uris: "{{ content_prefix }}/v1/flag/discard"
+ upstream_url: "{{ content_service_url }}/content/v4/flag/discard"
+ strip_uri: true
+ plugins:
+ - name: jwt
+ - name: cors
+ - "{{ statsd_pulgin }}"
+ - name: acl
+ config.whitelist:
+ - 'contentCreate'
+ - name: rate-limiting
+ config.policy: local
+ config.hour: "{{ medium_rate_limit_per_hour }}"
+ config.limit_by: credential
+ - name: request-size-limiting
+ config.allowed_payload_size: "{{ medium_request_size_limit }}"
+
+ - name: contentRetire
+ uris: "{{ content_prefix }}/v1/flag/retire"
+ upstream_url: "{{ content_service_url }}/content/v4/flag/retire"
+ strip_uri: true
+ plugins:
+ - name: jwt
+ - name: cors
+ - "{{ statsd_pulgin }}"
+ - name: acl
+ config.whitelist:
+ - 'contentCreate'
+ - name: rate-limiting
+ config.policy: local
+ config.hour: "{{ medium_rate_limit_per_hour }}"
+ config.limit_by: credential
+ - name: request-size-limiting
+ config.allowed_payload_size: "{{ medium_request_size_limit }}"
\ No newline at end of file
From f25f71ab506a0b74d905b8eaab70d5930a5c5544 Mon Sep 17 00:00:00 2001
From: rheafernandes
Date: Tue, 13 Oct 2020 17:33:04 +0530
Subject: [PATCH 007/184] Added content v4 apis
---
ansible/roles/kong-api/defaults/main.yml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/ansible/roles/kong-api/defaults/main.yml b/ansible/roles/kong-api/defaults/main.yml
index 87c65505b..5dc98bf3a 100644
--- a/ansible/roles/kong-api/defaults/main.yml
+++ b/ansible/roles/kong-api/defaults/main.yml
@@ -5613,8 +5613,8 @@ kong_apis:
- name: cors
- "{{ statsd_pulgin }}"
- name: acl
- config.whitelist:
- - 'contentCreate'
+ config.whitelist:
+ - 'contentCreate'
- name: rate-limiting
config.policy: local
config.hour: "{{ medium_rate_limit_per_hour }}"
From 22ef32dcaaeb48c870b0db2d19b65e61c0994280 Mon Sep 17 00:00:00 2001
From: rheafernandes
Date: Tue, 13 Oct 2020 17:44:38 +0530
Subject: [PATCH 008/184] Added changes to indentation
---
ansible/roles/kong-api/defaults/main.yml | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/ansible/roles/kong-api/defaults/main.yml b/ansible/roles/kong-api/defaults/main.yml
index 5dc98bf3a..05700d2eb 100644
--- a/ansible/roles/kong-api/defaults/main.yml
+++ b/ansible/roles/kong-api/defaults/main.yml
@@ -5739,8 +5739,8 @@ kong_apis:
- name: cors
- "{{ statsd_pulgin }}"
- name: acl
- config.whitelist:
- - 'contentCreate'
+ config.whitelist:
+ - 'contentCreate'
- name: rate-limiting
config.policy: local
config.hour: "{{ medium_rate_limit_per_hour }}"
@@ -5757,8 +5757,8 @@ kong_apis:
- name: cors
- "{{ statsd_pulgin }}"
- name: acl
- config.whitelist:
- - 'contentCreate'
+ config.whitelist:
+ - 'contentCreate'
- name: rate-limiting
config.policy: local
config.hour: "{{ medium_rate_limit_per_hour }}"
From e236b481ea2e9ae2a6974c6a9d4c186848ca3be1 Mon Sep 17 00:00:00 2001
From: rheafernandes
Date: Tue, 13 Oct 2020 17:54:34 +0530
Subject: [PATCH 009/184] Added changes to indentation
---
ansible/roles/kong-api/defaults/main.yml | 24 ++++++++++++------------
1 file changed, 12 insertions(+), 12 deletions(-)
diff --git a/ansible/roles/kong-api/defaults/main.yml b/ansible/roles/kong-api/defaults/main.yml
index 05700d2eb..e452265cf 100644
--- a/ansible/roles/kong-api/defaults/main.yml
+++ b/ansible/roles/kong-api/defaults/main.yml
@@ -5717,18 +5717,18 @@ kong_apis:
upstream_url: "{{ content_service_url }}/content/v4/import"
strip_uri: true
plugins:
- - name: jwt
- - name: cors
- - "{{ statsd_pulgin }}"
- - name: acl
- config.whitelist:
- - 'contentCreate'
- - name: rate-limiting
- config.policy: local
- config.hour: "{{ medium_rate_limit_per_hour }}"
- config.limit_by: credential
- - name: request-size-limiting
- config.allowed_payload_size: "{{ medium_request_size_limit }}"
+ - name: jwt
+ - name: cors
+ - "{{ statsd_pulgin }}"
+ - name: acl
+ config.whitelist:
+ - 'contentCreate'
+ - name: rate-limiting
+ config.policy: local
+ config.hour: "{{ medium_rate_limit_per_hour }}"
+ config.limit_by: credential
+ - name: request-size-limiting
+ config.allowed_payload_size: "{{ medium_request_size_limit }}"
- name: contentFlag
uris: "{{ content_prefix }}/v1/flag"
From 87b9e0838015caae80e5d280bf3c78a7a3749c34 Mon Sep 17 00:00:00 2001
From: rheafernandes
Date: Tue, 13 Oct 2020 18:02:01 +0530
Subject: [PATCH 010/184] Removed content onboarded v4 api's
---
ansible/roles/kong-api/defaults/main.yml | 216 -----------------------
1 file changed, 216 deletions(-)
diff --git a/ansible/roles/kong-api/defaults/main.yml b/ansible/roles/kong-api/defaults/main.yml
index e452265cf..3e8c2d865 100644
--- a/ansible/roles/kong-api/defaults/main.yml
+++ b/ansible/roles/kong-api/defaults/main.yml
@@ -5585,219 +5585,3 @@ kong_apis:
config.limit_by: credential
- name: request-size-limiting
config.allowed_payload_size: "{{ medium_request_size_limit }}"
-
- - name: contentCreate
- uris: "{{ content_prefix }}/v1/create"
- upstream_url: "{{ content_service_url }}/content/v4/create"
- strip_uri: true
- plugins:
- - name: jwt
- - name: cors
- - "{{ statsd_pulgin }}"
- - name: acl
- config.whitelist:
- - 'contentCreate'
- - name: rate-limiting
- config.policy: local
- config.hour: "{{ medium_rate_limit_per_hour }}"
- config.limit_by: credential
- - name: request-size-limiting
- config.allowed_payload_size: "{{ medium_request_size_limit }}"
-
- - name: contentUpdate
- uris: "{{ content_prefix }}/v1/update"
- upstream_url: "{{ content_service_url }}/content/v4/update"
- strip_uri: true
- plugins:
- - name: jwt
- - name: cors
- - "{{ statsd_pulgin }}"
- - name: acl
- config.whitelist:
- - 'contentCreate'
- - name: rate-limiting
- config.policy: local
- config.hour: "{{ medium_rate_limit_per_hour }}"
- config.limit_by: credential
- - name: request-size-limiting
- config.allowed_payload_size: "{{ medium_request_size_limit }}"
-
- - name: contentRead
- uris: "{{ content_prefix }}/v1/read"
- upstream_url: "{{ content_service_url }}/content/v4/read"
- strip_uri: true
- plugins:
- - name: jwt
- - name: cors
- - "{{ statsd_pulgin }}"
- - name: acl
- config.whitelist:
- - 'contentCreate'
- - name: rate-limiting
- config.policy: local
- config.hour: "{{ medium_rate_limit_per_hour }}"
- config.limit_by: credential
- - name: request-size-limiting
- config.allowed_payload_size: "{{ medium_request_size_limit }}"
-
- - name: contentUpload
- uris: "{{ content_prefix }}/v1/upload"
- upstream_url: "{{ content_service_url }}/content/v4/upload"
- strip_uri: true
- plugins:
- - name: jwt
- - name: cors
- - "{{ statsd_pulgin }}"
- - name: acl
- config.whitelist:
- - 'contentCreate'
- - name: rate-limiting
- config.policy: local
- config.hour: "{{ medium_rate_limit_per_hour }}"
- config.limit_by: credential
- - name: request-size-limiting
- config.allowed_payload_size: "{{ medium_request_size_limit }}"
-
- - name: contentUploadUrl
- uris: "{{ content_prefix }}/v1/upload/url"
- upstream_url: "{{ content_service_url }}/content/v4/upload/url"
- strip_uri: true
- plugins:
- - name: jwt
- - name: cors
- - "{{ statsd_pulgin }}"
- - name: acl
- config.whitelist:
- - 'contentCreate'
- - name: rate-limiting
- config.policy: local
- config.hour: "{{ medium_rate_limit_per_hour }}"
- config.limit_by: credential
- - name: request-size-limiting
- config.allowed_payload_size: "{{ medium_request_size_limit }}"
-
- - name: contentCopy
- uris: "{{ content_prefix }}/v1/copy"
- upstream_url: "{{ content_service_url }}/content/v4/copy"
- strip_uri: true
- plugins:
- - name: jwt
- - name: cors
- - "{{ statsd_pulgin }}"
- - name: acl
- config.whitelist:
- - 'contentCreate'
- - name: rate-limiting
- config.policy: local
- config.hour: "{{ medium_rate_limit_per_hour }}"
- config.limit_by: credential
- - name: request-size-limiting
- config.allowed_payload_size: "{{ medium_request_size_limit }}"
-
- - name: contentDialcodeLink
- uris: "{{ content_prefix }}/v1/dialcode/link"
- upstream_url: "{{ content_service_url }}/content/v4/dialcode/link"
- strip_uri: true
- plugins:
- - name: jwt
- - name: cors
- - "{{ statsd_pulgin }}"
- - name: acl
- config.whitelist:
- - 'contentCreate'
- - name: rate-limiting
- config.policy: local
- config.hour: "{{ medium_rate_limit_per_hour }}"
- config.limit_by: credential
- - name: request-size-limiting
- config.allowed_payload_size: "{{ medium_request_size_limit }}"
-
- - name: contentImport
- uris: "{{ content_prefix }}/v1/import"
- upstream_url: "{{ content_service_url }}/content/v4/import"
- strip_uri: true
- plugins:
- - name: jwt
- - name: cors
- - "{{ statsd_pulgin }}"
- - name: acl
- config.whitelist:
- - 'contentCreate'
- - name: rate-limiting
- config.policy: local
- config.hour: "{{ medium_rate_limit_per_hour }}"
- config.limit_by: credential
- - name: request-size-limiting
- config.allowed_payload_size: "{{ medium_request_size_limit }}"
-
- - name: contentFlag
- uris: "{{ content_prefix }}/v1/flag"
- upstream_url: "{{ content_service_url }}/content/v4/flag"
- strip_uri: true
- plugins:
- - name: jwt
- - name: cors
- - "{{ statsd_pulgin }}"
- - name: acl
- config.whitelist:
- - 'contentCreate'
- - name: rate-limiting
- config.policy: local
- config.hour: "{{ medium_rate_limit_per_hour }}"
- config.limit_by: credential
- - name: request-size-limiting
- config.allowed_payload_size: "{{ medium_request_size_limit }}"
-
- - name: contentFlagAccept
- uris: "{{ content_prefix }}/v1/flag/accept"
- upstream_url: "{{ content_service_url }}/content/v4/flag/accept"
- strip_uri: true
- plugins:
- - name: jwt
- - name: cors
- - "{{ statsd_pulgin }}"
- - name: acl
- config.whitelist:
- - 'contentCreate'
- - name: rate-limiting
- config.policy: local
- config.hour: "{{ medium_rate_limit_per_hour }}"
- config.limit_by: credential
- - name: request-size-limiting
- config.allowed_payload_size: "{{ medium_request_size_limit }}"
-
- - name: contentDiscard
- uris: "{{ content_prefix }}/v1/flag/discard"
- upstream_url: "{{ content_service_url }}/content/v4/flag/discard"
- strip_uri: true
- plugins:
- - name: jwt
- - name: cors
- - "{{ statsd_pulgin }}"
- - name: acl
- config.whitelist:
- - 'contentCreate'
- - name: rate-limiting
- config.policy: local
- config.hour: "{{ medium_rate_limit_per_hour }}"
- config.limit_by: credential
- - name: request-size-limiting
- config.allowed_payload_size: "{{ medium_request_size_limit }}"
-
- - name: contentRetire
- uris: "{{ content_prefix }}/v1/flag/retire"
- upstream_url: "{{ content_service_url }}/content/v4/flag/retire"
- strip_uri: true
- plugins:
- - name: jwt
- - name: cors
- - "{{ statsd_pulgin }}"
- - name: acl
- config.whitelist:
- - 'contentCreate'
- - name: rate-limiting
- config.policy: local
- config.hour: "{{ medium_rate_limit_per_hour }}"
- config.limit_by: credential
- - name: request-size-limiting
- config.allowed_payload_size: "{{ medium_request_size_limit }}"
\ No newline at end of file
From d15877765722d3dee275c2d9b950c32b1cfd99a9 Mon Sep 17 00:00:00 2001
From: satish Nirmalkar
Date: Tue, 13 Oct 2020 20:36:48 +0530
Subject: [PATCH 011/184] SB-20892 Onboarding dlete api
---
ansible/roles/kong-api/defaults/main.yml | 18 ++++++++++++++++++
ansible/roles/kong-consumer/defaults/main.yml | 2 ++
2 files changed, 20 insertions(+)
diff --git a/ansible/roles/kong-api/defaults/main.yml b/ansible/roles/kong-api/defaults/main.yml
index 0daa1bbbb..84979c0d7 100644
--- a/ansible/roles/kong-api/defaults/main.yml
+++ b/ansible/roles/kong-api/defaults/main.yml
@@ -4754,6 +4754,24 @@ kong_apis:
- name: request-size-limiting
config.allowed_payload_size: "{{ small_request_size_limit }}"
+ - name: deleteGroup
+ uris: "{{ group_service_prefix }}/v1/delete"
+ upstream_url: "{{ group_service_url }}/v1/group/delete"
+ strip_uri: true
+ plugins:
+ - name: jwt
+ - name: cors
+ - "{{ statsd_pulgin }}"
+ - name: acl
+ config.whitelist:
+ - 'groupAdmin'
+ - name: rate-limiting
+ config.policy: local
+ config.hour: "{{ medium_rate_limit_per_hour }}"
+ config.limit_by: credential
+ - name: request-size-limiting
+ config.allowed_payload_size: "{{ small_request_size_limit }}"
+
- name: groupActivityAgg
uris: "{{ data_service_prefix }}/v1/group/activity/agg"
upstream_url: "{{ lms_service_url }}/v1/group/activity/agg"
diff --git a/ansible/roles/kong-consumer/defaults/main.yml b/ansible/roles/kong-consumer/defaults/main.yml
index 77caf0ff4..2ab952531 100644
--- a/ansible/roles/kong-consumer/defaults/main.yml
+++ b/ansible/roles/kong-consumer/defaults/main.yml
@@ -25,6 +25,7 @@ mobile_device_groups:
- groupCreate
- groupUpdate
- groupAccess
+ - groupAdmin
- refreshTokenCreate
kong_all_consumer_groups:
@@ -79,6 +80,7 @@ kong_all_consumer_groups:
- groupCreate
- groupUpdate
- groupAccess
+ - groupAdmin
- dataAccess
- druidReportCreate
- druidReportAdmin
From 8b156a22f991a99585ad9462966f75076ec6298f Mon Sep 17 00:00:00 2001
From: rheafernandes
Date: Wed, 14 Oct 2020 18:27:35 +0530
Subject: [PATCH 012/184] Added changes to the acl as per requested
---
ansible/roles/kong-api/defaults/main.yml | 24 ++++++++++++------------
1 file changed, 12 insertions(+), 12 deletions(-)
diff --git a/ansible/roles/kong-api/defaults/main.yml b/ansible/roles/kong-api/defaults/main.yml
index 3e8c2d865..8a52df87f 100644
--- a/ansible/roles/kong-api/defaults/main.yml
+++ b/ansible/roles/kong-api/defaults/main.yml
@@ -5289,7 +5289,7 @@ kong_apis:
- "{{ statsd_pulgin }}"
- name: acl
config.whitelist:
- - 'contentCreate'
+ - 'contentUpdate'
- name: rate-limiting
config.policy: local
config.hour: "{{ medium_rate_limit_per_hour }}"
@@ -5307,7 +5307,7 @@ kong_apis:
- "{{ statsd_pulgin }}"
- name: acl
config.whitelist:
- - 'contentCreate'
+ - 'contentAccess'
- name: rate-limiting
config.policy: local
config.hour: "{{ medium_rate_limit_per_hour }}"
@@ -5361,7 +5361,7 @@ kong_apis:
- "{{ statsd_pulgin }}"
- name: acl
config.whitelist:
- - 'contentCreate'
+ - 'contentAdmin'
- name: rate-limiting
config.policy: local
config.hour: "{{ medium_rate_limit_per_hour }}"
@@ -5397,7 +5397,7 @@ kong_apis:
- "{{ statsd_pulgin }}"
- name: acl
config.whitelist:
- - 'contentCreate'
+ - 'contentUpdate'
- name: rate-limiting
config.policy: local
config.hour: "{{ medium_rate_limit_per_hour }}"
@@ -5415,7 +5415,7 @@ kong_apis:
- "{{ statsd_pulgin }}"
- name: acl
config.whitelist:
- - 'contentCreate'
+ - 'contentUpdate'
- name: rate-limiting
config.policy: local
config.hour: "{{ medium_rate_limit_per_hour }}"
@@ -5433,7 +5433,7 @@ kong_apis:
- "{{ statsd_pulgin }}"
- name: acl
config.whitelist:
- - 'contentCreate'
+ - 'contentAdmin'
- name: rate-limiting
config.policy: local
config.hour: "{{ medium_rate_limit_per_hour }}"
@@ -5451,7 +5451,7 @@ kong_apis:
- "{{ statsd_pulgin }}"
- name: acl
config.whitelist:
- - 'contentCreate'
+ - 'contentAdmin'
- name: rate-limiting
config.policy: local
config.hour: "{{ medium_rate_limit_per_hour }}"
@@ -5469,7 +5469,7 @@ kong_apis:
- "{{ statsd_pulgin }}"
- name: acl
config.whitelist:
- - 'contentCreate'
+ - 'contentAdmin'
- name: rate-limiting
config.policy: local
config.hour: "{{ medium_rate_limit_per_hour }}"
@@ -5487,7 +5487,7 @@ kong_apis:
- "{{ statsd_pulgin }}"
- name: acl
config.whitelist:
- - 'contentCreate'
+ - 'contentUpdate'
- name: rate-limiting
config.policy: local
config.hour: "{{ medium_rate_limit_per_hour }}"
@@ -5505,7 +5505,7 @@ kong_apis:
- "{{ statsd_pulgin }}"
- name: acl
config.whitelist:
- - 'contentCreate'
+ - 'contentUpdate'
- name: rate-limiting
config.policy: local
config.hour: "{{ medium_rate_limit_per_hour }}"
@@ -5523,7 +5523,7 @@ kong_apis:
- "{{ statsd_pulgin }}"
- name: acl
config.whitelist:
- - 'contentCreate'
+ - 'contentUpdate'
- name: rate-limiting
config.policy: local
config.hour: "{{ medium_rate_limit_per_hour }}"
@@ -5541,7 +5541,7 @@ kong_apis:
- "{{ statsd_pulgin }}"
- name: acl
config.whitelist:
- - 'contentCreate'
+ - 'contentAccess'
- name: rate-limiting
config.policy: local
config.hour: "{{ medium_rate_limit_per_hour }}"
From b5753b6273aec3bf56b5c0a8ab515abbe20f51e8 Mon Sep 17 00:00:00 2001
From: rheafernandes
Date: Wed, 14 Oct 2020 18:51:45 +0530
Subject: [PATCH 013/184] Added changes to the acl as per requested
---
ansible/roles/kong-api/defaults/main.yml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/ansible/roles/kong-api/defaults/main.yml b/ansible/roles/kong-api/defaults/main.yml
index 8a52df87f..5cb15cf39 100644
--- a/ansible/roles/kong-api/defaults/main.yml
+++ b/ansible/roles/kong-api/defaults/main.yml
@@ -5397,7 +5397,7 @@ kong_apis:
- "{{ statsd_pulgin }}"
- name: acl
config.whitelist:
- - 'contentUpdate'
+ - 'contentAccess'
- name: rate-limiting
config.policy: local
config.hour: "{{ medium_rate_limit_per_hour }}"
@@ -5560,7 +5560,7 @@ kong_apis:
- "{{ statsd_pulgin }}"
- name: acl
config.whitelist:
- - 'contentCreate'
+ - 'contentUpdate'
- name: rate-limiting
config.policy: local
config.hour: "{{ medium_rate_limit_per_hour }}"
From fdecf11afab7ec3b867494eccfbe916b4580899a Mon Sep 17 00:00:00 2001
From: SMY ALTAMASH <30286162+SMYALTAMASH@users.noreply.github.com>
Date: Thu, 15 Oct 2020 12:02:30 +0530
Subject: [PATCH 014/184] Degrading the permission from admin to search to be
used wity mobile devices. (#1989)
---
ansible/roles/kong-api/defaults/main.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/ansible/roles/kong-api/defaults/main.yml b/ansible/roles/kong-api/defaults/main.yml
index 25ad09a48..4fda41404 100644
--- a/ansible/roles/kong-api/defaults/main.yml
+++ b/ansible/roles/kong-api/defaults/main.yml
@@ -4587,7 +4587,7 @@ kong_apis:
- "{{ statsd_pulgin }}"
- name: acl
config.whitelist:
- - 'certificateAdmin'
+ - 'certificateAccess'
- name: rate-limiting
config.policy: local
config.hour: "{{ medium_rate_limit_per_hour }}"
From 6b384c1af02af97fa2034d489f3dec773a66a0a3 Mon Sep 17 00:00:00 2001
From: kaliraja <34502260+Kaali09@users.noreply.github.com>
Date: Tue, 20 Oct 2020 15:48:16 +0530
Subject: [PATCH 015/184] added the druid alert rules (#1996)
* Issue #TG607: added the druid alert rules
* Issue #TG607: added the druid alert rules
* Issue #TG607: updated the druid alert rules
* Issue #0000: added the datasource name in message field.
* Issue #0000: removed the rollup datasource
---
.../templates/alertrules.yaml | 16 +++
.../alertrules/templates/promrulesDruid.yml | 103 ++++++++++++++++++
2 files changed, 119 insertions(+)
create mode 100644 kubernetes/helm_charts/monitoring/alertrules/templates/promrulesDruid.yml
diff --git a/kubernetes/ansible/roles/sunbird-monitoring/templates/alertrules.yaml b/kubernetes/ansible/roles/sunbird-monitoring/templates/alertrules.yaml
index a646b18f9..5a6466670 100644
--- a/kubernetes/ansible/roles/sunbird-monitoring/templates/alertrules.yaml
+++ b/kubernetes/ansible/roles/sunbird-monitoring/templates/alertrules.yaml
@@ -43,3 +43,19 @@ kafka_telemetry_ingestion_backup_threshold_critical: "{{ kafka_telemetry_ingesti
kafka_telemetry_unique_backup_threshold_critical: "{{ kafka_telemetry_unique_backup_threshold_critical }}"
summary_backup_threshold_critical: "{{ summary_backup_threshold_critical }}"
summary_channel_backup_threshold_critical: "{{ summary_channel_backup_threshold_critical }}"
+
+
+raw_druid_datasource:
+ - content-model-snapshot
+ - offline-desktop-events
+ - summary-events
+ - telemetry-events-syncts
+ - telemetry-feedback-events
+ - audit-rollup-syncts
+ - sl_observation_status
+ - sl_observations_production
+ - telemetry-feedback-events
+
+druid_raw_ingestion_threshold: 200000
+druid_rollup_ingestion_threshold: 200000
+
diff --git a/kubernetes/helm_charts/monitoring/alertrules/templates/promrulesDruid.yml b/kubernetes/helm_charts/monitoring/alertrules/templates/promrulesDruid.yml
new file mode 100644
index 000000000..d6b702b21
--- /dev/null
+++ b/kubernetes/helm_charts/monitoring/alertrules/templates/promrulesDruid.yml
@@ -0,0 +1,103 @@
+---
+apiVersion: monitoring.coreos.com/v1
+kind: PrometheusRule
+metadata:
+ labels:
+ role: alert-rules
+ app: {{ .Values.prometheus_rule_selector_app }}
+ release: {{ .Values.prometheus_rule_selector_release }}
+ name: {{ .Values.fullnameOverride }}-druid-rules
+ namespace: {{ .Values.namespace }}
+spec:
+ groups:
+ - name: alertrules.process
+ rules:
+ {{- if .Values.raw_druid_datasource }}
+ ## druid segment unavailable count alert
+ {{ range $key := .Values.raw_druid_datasource }}
+ - alert: druid_segment_unavailable_count
+ expr: druid_segment_unavailable_count{exported_job={{ . | quote }}} > 0
+ for: 5m
+ labels:
+ severity: critical
+ module: dp_lag
+ annotations:
+ message: The druid segment unavailable count for the datasource {{ . }} is greater than 0.
+ lag: {{`({{ humanize $value }})`}}
+ job_id: Druid
+ alertname: DruidSegmentUnavailable
+ {{- end }}
+ ### kafka druid ingest lag
+ {{ range $key := .Values.raw_druid_datasource }}
+ - alert: druid_ingest_kafka_lag
+ expr: druid_ingest_kafka_lag{exported_job={{ . | quote }}} > {{ $.Values.druid_raw_ingestion_threshold }}
+ for: 5m
+ labels:
+ severity: critical
+ module: dp_lag
+ annotations:
+ message: The druid ingestion lag for datasource {{ . }} is greater than threshold {{ $.Values.druid_raw_ingestion_threshold | int }}
+ lag: {{`({{ humanize $value }})`}}
+ job_id: Druid
+ alertname: DruidKafkaIngestionLag
+ {{- end }}
+ ### druid ingest handoff failed alert rules
+ {{ range $key := .Values.raw_druid_datasource }}
+ - alert: druid_ingest_handoff_failed
+ expr: druid_ingest_handoff_failed{exported_job={{ . | quote }}} > 0
+ for: 5m
+ labels:
+ severity: critical
+ module: dp_lag
+ annotations:
+ message: The druid ingest handoff failed count for datasource {{ . }} is greater than 0.
+ lag: {{`({{ humanize $value }})`}}
+ job_id: Druid
+ alertname: DruidIngestHandoffFailed
+ {{- end }}
+ {{- end }}
+
+ {{- if .Values.rollup_druid_cluster }}
+ ## druid segment unavailable count alert
+ {{ range $key := .Values.rollup_druid_datasource }}
+ - alert: druid_segment_unavailable_count
+ expr: druid_segment_unavailable_count{exported_job={{ . | quote }}} > 0
+ for: 5m
+ labels:
+ severity: critical
+ module: dp_lag
+ annotations:
+ message: The druid segment unavailable count for the datasource {{ . }} is greater than 0.
+ lag: {{`({{ humanize $value }})`}}
+ job_id: Druid
+ alertname: DruidSegmentUnavailable
+ {{- end }}
+ ### kafka druid ingest lag
+ {{ range $key := .Values.rollup_druid_datasource }}
+ - alert: druid_ingest_kafka_lag
+ expr: druid_ingest_kafka_lag{exported_job={{ . | quote }}} > {{ $.Values.druid_rollup_ingestion_threshold }}
+ for: 5m
+ labels:
+ severity: critical
+ module: dp_lag
+ annotations:
+ message: The druid ingestion lag for datasource {{ . }} is greater than {{ $.Values.druid_rollup_ingestion_threshold | int }}
+ lag: {{`({{ humanize $value }})`}}
+ job_id: Druid
+ alertname: DruidKafkaIngestionLag
+ {{- end }}
+ ### druid ingest handoff failed alert rules
+ {{ range $key := .Values.rollup_druid_datasource }}
+ - alert: druid_ingest_handoff_failed
+ expr: druid_ingest_handoff_failed{exported_job={{ . | quote }}} > 0
+ for: 5m
+ labels:
+ severity: critical
+ module: dp_lag
+ annotations:
+ message: The druid ingest handoff failed count for datasource {{ . }} is greater than 0.
+ lag: {{`({{ humanize $value }})`}}
+ job_id: Druid
+ alertname: DruidIngestHandoffFailed
+ {{- end }}
+ {{- end }}
From 715a87c6e9b562e8fee65df78a8a6d97d9e12c33 Mon Sep 17 00:00:00 2001
From: Hari-stackroute <40484996+Hari-stackroute@users.noreply.github.com>
Date: Thu, 22 Oct 2020 13:27:57 +0530
Subject: [PATCH 016/184] SB-20938 added create and update feed api details
(#1998)
---
ansible/roles/kong-api/defaults/main.yml | 36 ++++++++++++++++++++++++
1 file changed, 36 insertions(+)
diff --git a/ansible/roles/kong-api/defaults/main.yml b/ansible/roles/kong-api/defaults/main.yml
index 4dee3c646..b615a9eac 100644
--- a/ansible/roles/kong-api/defaults/main.yml
+++ b/ansible/roles/kong-api/defaults/main.yml
@@ -4343,6 +4343,42 @@ kong_apis:
- name: request-size-limiting
config.allowed_payload_size: "{{ small_request_size_limit }}"
+ - name: userFeedCreate
+ uris: "{{ user_service_prefix }}/feed/v1/create"
+ upstream_url: "{{ learning_service_url }}/v1/user/feed/create"
+ strip_uri: true
+ plugins:
+ - name: jwt
+ - name: cors
+ - "{{ statsd_pulgin }}"
+ - name: acl
+ config.whitelist:
+ - 'userAccess'
+ - name: rate-limiting
+ config.policy: local
+ config.hour: "{{ medium_rate_limit_per_hour }}"
+ config.limit_by: credential
+ - name: request-size-limiting
+ config.allowed_payload_size: "{{ small_request_size_limit }}"
+
+ - name: userFeedUpdate
+ uris: "{{ user_service_prefix }}/feed/v1/update"
+ upstream_url: "{{ learning_service_url }}/v1/user/feed/update"
+ strip_uri: true
+ plugins:
+ - name: jwt
+ - name: cors
+ - "{{ statsd_pulgin }}"
+ - name: acl
+ config.whitelist:
+ - 'userAccess'
+ - name: rate-limiting
+ config.policy: local
+ config.hour: "{{ medium_rate_limit_per_hour }}"
+ config.limit_by: credential
+ - name: request-size-limiting
+ config.allowed_payload_size: "{{ small_request_size_limit }}"
+
- name: userMigrate
uris: "{{ user_service_prefix }}/v1/migrate"
upstream_url: "{{ learning_service_url }}/v1/user/migrate"
From f95f3782129299bba4bb78662e1611d1ed3b209e Mon Sep 17 00:00:00 2001
From: sknirmalkar89 <59080585+sknirmalkar89@users.noreply.github.com>
Date: Thu, 22 Oct 2020 15:00:50 +0530
Subject: [PATCH 017/184] SC-2059 Adding new membership update api (#1999)
---
ansible/roles/kong-api/defaults/main.yml | 18 ++++++++++++++++++
1 file changed, 18 insertions(+)
diff --git a/ansible/roles/kong-api/defaults/main.yml b/ansible/roles/kong-api/defaults/main.yml
index b615a9eac..4d533ea44 100644
--- a/ansible/roles/kong-api/defaults/main.yml
+++ b/ansible/roles/kong-api/defaults/main.yml
@@ -4829,6 +4829,24 @@ kong_apis:
- name: request-size-limiting
config.allowed_payload_size: "{{ small_request_size_limit }}"
+ - name: updateGroupMembership
+ uris: "{{ group_service_prefix }}/membership/v1/update"
+ upstream_url: "{{ group_service_url }}/v1/group/membership/update"
+ strip_uri: true
+ plugins:
+ - name: jwt
+ - name: cors
+ - "{{ statsd_pulgin }}"
+ - name: acl
+ config.whitelist:
+ - 'groupUpdate'
+ - name: rate-limiting
+ config.policy: local
+ config.hour: "{{ medium_rate_limit_per_hour }}"
+ config.limit_by: credential
+ - name: request-size-limiting
+ config.allowed_payload_size: "{{ small_request_size_limit }}"
+
- name: groupActivityAgg
uris: "{{ data_service_prefix }}/v1/group/activity/agg"
upstream_url: "{{ lms_service_url }}/v1/group/activity/agg"
From 83b5fb069c700105120f8eebbcc0561e2b8abea1 Mon Sep 17 00:00:00 2001
From: Hari-stackroute <40484996+Hari-stackroute@users.noreply.github.com>
Date: Thu, 22 Oct 2020 16:12:33 +0530
Subject: [PATCH 018/184] SB-20938 added feed-delete api details (#2000)
* SB-20938 added create and update feed api details
* SB-20938 added feed-delete api details
---
ansible/roles/kong-api/defaults/main.yml | 18 ++++++++++++++++++
1 file changed, 18 insertions(+)
diff --git a/ansible/roles/kong-api/defaults/main.yml b/ansible/roles/kong-api/defaults/main.yml
index 4d533ea44..893415959 100644
--- a/ansible/roles/kong-api/defaults/main.yml
+++ b/ansible/roles/kong-api/defaults/main.yml
@@ -4360,6 +4360,24 @@ kong_apis:
config.limit_by: credential
- name: request-size-limiting
config.allowed_payload_size: "{{ small_request_size_limit }}"
+
+ - name: userFeedDelete
+ uris: "{{ user_service_prefix }}/feed/v1/delete"
+ upstream_url: "{{ learning_service_url }}/v1/user/feed/delete"
+ strip_uri: true
+ plugins:
+ - name: jwt
+ - name: cors
+ - "{{ statsd_pulgin }}"
+ - name: acl
+ config.whitelist:
+ - 'userAccess'
+ - name: rate-limiting
+ config.policy: local
+ config.hour: "{{ medium_rate_limit_per_hour }}"
+ config.limit_by: credential
+ - name: request-size-limiting
+ config.allowed_payload_size: "{{ small_request_size_limit }}"
- name: userFeedUpdate
uris: "{{ user_service_prefix }}/feed/v1/update"
From af89610a2ac5123e9cd2de1c9adcde2d68e5ca26 Mon Sep 17 00:00:00 2001
From: Hari-stackroute <40484996+Hari-stackroute@users.noreply.github.com>
Date: Fri, 23 Oct 2020 12:05:49 +0530
Subject: [PATCH 019/184] SB-21121 limiting feeds to 30 (#2001)
* SB-21121 limiting feeds to 30
* SB-21121 limiting feeds to 30
* Update sunbird_learner-service.env
update the user-feed property.
---
.../roles/stack-sunbird/templates/sunbird_learner-service.env | 2 ++
1 file changed, 2 insertions(+)
diff --git a/ansible/roles/stack-sunbird/templates/sunbird_learner-service.env b/ansible/roles/stack-sunbird/templates/sunbird_learner-service.env
index 7c525f229..a03b1c5b4 100644
--- a/ansible/roles/stack-sunbird/templates/sunbird_learner-service.env
+++ b/ansible/roles/stack-sunbird/templates/sunbird_learner-service.env
@@ -112,6 +112,8 @@ sunbird_otp_allowed_attempt={{sunbird_otp_allowed_attempt|default(2)}}
SUNBIRD_KAFKA_URL={{kafka_urls}}
ENV_NAME={{env_name}}
notification_service_base_url=http://notification-service:9000
+# Release-3.4.0
+feed_limit={{feed_limit | default(30)}}
## Access Keys ##
accesstoken.publickey.basepath={{learner_device_basepath | default('/keys/')}}
From 37bccacc9e5218ae6213ada555495ea064e70fe5 Mon Sep 17 00:00:00 2001
From: SMY ALTAMASH <30286162+SMYALTAMASH@users.noreply.github.com>
Date: Tue, 27 Oct 2020 17:30:38 +0530
Subject: [PATCH 020/184] Implementing the keycloak URL whitelisting for the
entire sunbird stack. (#1995)
* Adding all the keycloak endpoints being used by entire sunbird stack
* Adding the nginx client IP for x-forwarded-for header and x-real-ip and making remote_addr as default
* Remove the mirror configuration
* Have a general rule for forgot-password and userdetails admin keycloak
---
.../core/nginx-public-ingress/values.j2 | 137 +++++++++---------
1 file changed, 66 insertions(+), 71 deletions(-)
diff --git a/kubernetes/helm_charts/core/nginx-public-ingress/values.j2 b/kubernetes/helm_charts/core/nginx-public-ingress/values.j2
index 9fbb0f7fb..85e92c821 100644
--- a/kubernetes/helm_charts/core/nginx-public-ingress/values.j2
+++ b/kubernetes/helm_charts/core/nginx-public-ingress/values.j2
@@ -116,43 +116,14 @@ proxyconfig: |-
proxy_set_header X-Forwarded-Proto $scheme;
ignore_invalid_headers off; #pass through headers from Jenkins which are considered invalid by Nginx server.
resolver {{ kube_dns_ip }} valid=30s;
- location ~* ^/auth/(.*)/impersonation {
- return 301 {{proto}}://{{ proxy_server_name }};
- }
- location ~* ^/auth/realms/master {
- return 301 {{proto}}://{{ proxy_server_name }};
- }
- location ~* ^/auth/admin/master/console/ {
- return 301 {{proto}}://{{ proxy_server_name }};
- }
- location ~* ^/auth/realms/(.+)/token/introspect/ {
- return 301 {{proto}}://$host/api/auth/v1/realms/$1/token/introspect;
- }
- location ~* ^/auth/realms/(.+)/token/ {
- return 301 {{proto}}://$host/api/auth/v1/realms/$1/token/;
- }
- location ~* ^/auth/realms/(.+)/userinfo/ {
- return 301 {{proto}}://$host/api/auth/v1/realms/$1/userinfo/;
- }
- location ~* ^/auth/realms/(.+)/logout/ {
- return 301 {{proto}}://$host/api/auth/v1/realms/$1/logout/;
- }
- location ~* ^/auth/realms/(.+)/certs/ {
- return 301 {{proto}}://$host/api/auth/v1/realms/$1/certs/;
- }
- location ~* ^/auth/realms/(.+)/clients-registrations/ {
- return 301 {{proto}}://$host/api/auth/v1/realms/$1/clients-registrations/;
- }
- location ~* ^/auth/admin/master/console/ {
- return 301 {{proto}}://{{ proxy_server_name }};
- }
+ # Mobile Devices Refresh token Endpoints
location ~* ^/auth/v1/refresh/token {
rewrite ^/auth/(.*) /auth/$1 break;
proxy_set_header Connection "";
proxy_set_header Host $host;
proxy_set_header X-Real-IP {{ nginx_client_public_ip_header | d('$remote_addr') }};
proxy_set_header X-Scheme $scheme;
- proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ proxy_set_header X-Forwarded-For {{ nginx_client_public_ip_header | d('$remote_addr') }};
proxy_set_header X-Forwarded-Proto $scheme;
proxy_connect_timeout 5;
proxy_send_timeout 60;
@@ -161,20 +132,34 @@ proxyconfig: |-
proxy_set_header X-Request-ID $sb_request_id;
proxy_pass http://kong;
}
- location /auth/ {
+ # Admin API Endpoints for sunbird realm fpr forgot password flow
+ location ~ /auth/admin/realms/sunbird/users/ {
rewrite ^/auth/(.*) /auth/$1 break;
proxy_set_header X-Request-ID $sb_request_id;
proxy_set_header Host $host;
proxy_set_header X-Real-IP {{ nginx_client_public_ip_header | d('$remote_addr') }};
proxy_set_header X-Scheme $scheme;
- proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ proxy_set_header X-Forwarded-For {{ nginx_client_public_ip_header | d('$remote_addr') }};
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Connection "";
proxy_http_version 1.1;
proxy_pass http://keycloak;
}
- # Caching keycloak static assets
- location ~ /auth/resources/(.+\.(png|svg|ico|js|eot|ttf|woff|woff2|css)) {
+ # Sunbird realm keycloak API endpoints
+ location ~ /auth/realms/sunbird/(get-required-action-link|login-actions/(action-token|authenticate|required-action)|protocol/openid-connect/(auth|certs|logout|token|userinfo)|.well-known/openid-configuration) {
+ rewrite ^/auth/(.*) /auth/$1 break;
+ proxy_set_header X-Request-ID $sb_request_id;
+ proxy_set_header Host $host;
+ proxy_set_header X-Real-IP {{ nginx_client_public_ip_header | d('$remote_addr') }};
+ proxy_set_header X-Scheme $scheme;
+ proxy_set_header X-Forwarded-For {{ nginx_client_public_ip_header | d('$remote_addr') }};
+ proxy_set_header X-Forwarded-Proto $scheme;
+ proxy_set_header Connection "";
+ proxy_http_version 1.1;
+ proxy_pass http://keycloak;
+ }
+ # Static Assets for keycloak endpoints with caching
+ location ~ /auth/(resources/(.+\.(png|svg|ico|js|eot|ttf|woff|woff2|css))|welcome-content/(.+\.(png|svg|ico|js|eot|ttf|woff|woff2|css))) {
# Enabling caching
proxy_cache_key $proxy_host$request_uri;
proxy_cache proxy_cache;
@@ -190,13 +175,13 @@ proxyconfig: |-
proxy_set_header Host $host;
proxy_set_header X-Real-IP {{ nginx_client_public_ip_header | d('$remote_addr') }};
proxy_set_header X-Scheme $scheme;
- proxy_set_header X-Forwarded-For {{ nginx_client_public_ip_header | d('$remote_addr') }};
+ proxy_set_header X-Forwarded-For {{ nginx_client_public_ip_header | d('$remote_addr') }};
proxy_connect_timeout 5;
proxy_send_timeout 60;
proxy_read_timeout 70;
proxy_http_version 1.1;
proxy_pass http://keycloak;
- }
+ }
# This is Caching mechanism for POST requests location search
location ~ /learner/data/v1/location/search {
# Enabling caching
@@ -984,40 +969,14 @@ keycloakconf: |
proxy_set_header X-Forwarded-Proto $scheme;
ignore_invalid_headers off; #pass through headers from Jenkins which are considered invalid by Nginx server.
resolver 127.0.0.11 valid=5s;
- location ~* ^/auth/(.*)/impersonation {
- return 301 {{proto}}://{{ proxy_server_name }};
- }
- location ~* ^/auth/realms/master {
- return 301 {{proto}}://{{ proxy_server_name }};
- }
- location ~* ^/auth/admin/master/console/ {
- return 301 {{proto}}://{{ proxy_server_name }};
- }
- location ~* ^/auth/realms/(.+)/token/introspect/ {
- return 301 {{proto}}://$host/api/auth/v1/realms/$1/token/introspect;
- }
- location ~* ^/auth/realms/(.+)/token/ {
- return 301 {{proto}}://$host/api/auth/v1/realms/$1/token/;
- }
- location ~* ^/auth/realms/(.+)/userinfo/ {
- return 301 {{proto}}://$host/api/auth/v1/realms/$1/userinfo/;
- }
- location ~* ^/auth/realms/(.+)/logout/ {
- return 301 {{proto}}://$host/api/auth/v1/realms/$1/logout/;
- }
- location ~* ^/auth/realms/(.+)/certs/ {
- return 301 {{proto}}://$host/api/auth/v1/realms/$1/certs/;
- }
- location ~* ^/auth/realms/(.+)/clients-registrations/ {
- return 301 {{proto}}://$host/api/auth/v1/realms/$1/clients-registrations/;
- }
+ # Refresh token endpoint being routed to kong
location ~* ^/auth/v1/refresh/token {
rewrite ^/auth/(.*) /auth/$1 break;
proxy_set_header Connection "";
proxy_set_header Host $host;
proxy_set_header X-Real-IP {{ nginx_client_public_ip_header | d('$remote_addr') }};
proxy_set_header X-Scheme $scheme;
- proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ proxy_set_header X-Forwarded-For {{ nginx_client_public_ip_header | d('$remote_addr') }};
proxy_set_header X-Forwarded-Proto $scheme;
proxy_connect_timeout 5;
proxy_send_timeout 60;
@@ -1026,19 +985,55 @@ keycloakconf: |
proxy_set_header X-Request-ID $sb_request_id;
proxy_pass http://kong;
}
- location ~* ^/auth/admin/master/console/ {
- return 301 {{proto}}://{{ merge_proxy_server_name }};
+ # Admin API Endpoints for sunbird realm fpr forgot password flow
+ location ~ /auth/admin/realms/sunbird/users/ {
+ rewrite ^/auth/(.*) /auth/$1 break;
+ proxy_set_header X-Request-ID $sb_request_id;
+ proxy_set_header Host $host;
+ proxy_set_header X-Real-IP {{ nginx_client_public_ip_header | d('$remote_addr') }};
+ proxy_set_header X-Scheme $scheme;
+ proxy_set_header X-Forwarded-For {{ nginx_client_public_ip_header | d('$remote_addr') }};
+ proxy_set_header X-Forwarded-Proto $scheme;
+ proxy_set_header Connection "";
+ proxy_http_version 1.1;
+ proxy_pass http://keycloak;
}
- location /auth/ {
- set $target {{ keycloak_url }};
+ # Sunbird realm keycloak API endpoints
+ location ~ /auth/realms/sunbird/(get-required-action-link|login-actions/(action-token|authenticate|required-action)|protocol/openid-connect/(auth|certs|logout|token|userinfo)|.well-known/openid-configuration) {
rewrite ^/auth/(.*) /auth/$1 break;
proxy_set_header X-Request-ID $sb_request_id;
- proxy_pass $target;
proxy_set_header Host $host;
proxy_set_header X-Real-IP {{ nginx_client_public_ip_header | d('$remote_addr') }};
proxy_set_header X-Scheme $scheme;
- proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ proxy_set_header X-Forwarded-For {{ nginx_client_public_ip_header | d('$remote_addr') }};
proxy_set_header X-Forwarded-Proto $scheme;
+ proxy_set_header Connection "";
+ proxy_http_version 1.1;
+ proxy_pass http://keycloak;
+ }
+ # Static Assets for keycloak endpoints with caching
+ location ~ /auth/(resources/(.+\.(png|svg|ico|js|eot|ttf|woff|woff2|css))|welcome-content/(.+\.(png|svg|ico|js|eot|ttf|woff|woff2|css))) {
+ # Enabling caching
+ proxy_cache_key $proxy_host$request_uri;
+ proxy_cache proxy_cache;
+ add_header X-Proxy-Cache $upstream_cache_status;
+ add_header X-Proxy-Cache-Date $upstream_http_date;
+ proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;
+ proxy_cache_revalidate on;
+ proxy_cache_background_update on;
+ proxy_cache_lock on;
+ proxy_cache_valid 200 14400;
+ rewrite ^/auth/(.*) /auth/$1 break;
+ proxy_set_header Connection "";
+ proxy_set_header Host $host;
+ proxy_set_header X-Real-IP {{ nginx_client_public_ip_header | d('$remote_addr') }};
+ proxy_set_header X-Scheme $scheme;
+ proxy_set_header X-Forwarded-For {{ nginx_client_public_ip_header | d('$remote_addr') }};
+ proxy_connect_timeout 5;
+ proxy_send_timeout 60;
+ proxy_read_timeout 70;
+ proxy_http_version 1.1;
+ proxy_pass http://keycloak;
}
location / {
rewrite ^/(.*) /$1 break;
From 244400778e0296b860d6141d2da1b01445fbbb76 Mon Sep 17 00:00:00 2001
From: Rhea Fernandes <32357913+rheafernandes@users.noreply.github.com>
Date: Tue, 27 Oct 2020 19:14:08 +0530
Subject: [PATCH 021/184] Added code changes for forms api support (#2006)
---
.../stack-sunbird/templates/content-service_application.conf | 1 +
.../stack-sunbird/templates/taxonomy-service_application.conf | 1 +
2 files changed, 2 insertions(+)
diff --git a/ansible/roles/stack-sunbird/templates/content-service_application.conf b/ansible/roles/stack-sunbird/templates/content-service_application.conf
index 12f649202..e5d252180 100644
--- a/ansible/roles/stack-sunbird/templates/content-service_application.conf
+++ b/ansible/roles/stack-sunbird/templates/content-service_application.conf
@@ -564,4 +564,5 @@ mimeTypeToPrimaryCategory {
channel.content.primarycategories=["Explanation Content", "Learning Resource", "Practice Question Set", "eTextbook", "Teacher Resource", "Course Assessment"]
channel.collection.primarycategories=["Course", "Digital Textbook", "Content Playlist"]
channel.asset.primarycategories=["Asset"]
+objectcategorydefinition.keyspace="{{ lp_cassandra_keyspace_prefix }}_category_store"
diff --git a/ansible/roles/stack-sunbird/templates/taxonomy-service_application.conf b/ansible/roles/stack-sunbird/templates/taxonomy-service_application.conf
index fe251b214..66a27cfe6 100644
--- a/ansible/roles/stack-sunbird/templates/taxonomy-service_application.conf
+++ b/ansible/roles/stack-sunbird/templates/taxonomy-service_application.conf
@@ -389,3 +389,4 @@ languageCode {
tamil : "ta"
telugu : "te"
}
+objectcategorydefinition.keyspace="{{ lp_cassandra_keyspace_prefix }}_category_store"
From fc8845be2f8487412710209cb864ba96b054460f Mon Sep 17 00:00:00 2001
From: sknirmalkar89 <59080585+sknirmalkar89@users.noreply.github.com>
Date: Wed, 28 Oct 2020 17:37:43 +0530
Subject: [PATCH 022/184] SB-20957 Create a new jenkins scripts for groups data
correction (#2007)
* SB-20957 new jenkins job for groups service
* SB-20957 adding jenkins to run paramter based jar
* SB-20957 adding jenkins to run paramter based jar
---
ansible/cassandra-deploy-decrypt.yml | 1 +
ansible/roles/cassandra-deploy-decrypt/defaults/main.yml | 1 +
ansible/roles/cassandra-deploy-decrypt/tasks/main.yml | 4 ++--
pipelines/deploy/cassandra-deploy/Jenkinsfile.decrypt | 2 +-
4 files changed, 5 insertions(+), 3 deletions(-)
diff --git a/ansible/cassandra-deploy-decrypt.yml b/ansible/cassandra-deploy-decrypt.yml
index 341631a4b..fa0053cdc 100644
--- a/ansible/cassandra-deploy-decrypt.yml
+++ b/ansible/cassandra-deploy-decrypt.yml
@@ -5,6 +5,7 @@
sunbird_cassandra_port: 9042
sunbird_cassandra_keyspace: sunbird
sunbird_encryption_key: "{{ core_vault_sunbird_encryption_key }}"
+ sunbird_cassandra_groups_keyspace: sunbird_groups
vars_files:
- ['{{inventory_dir}}/secrets.yml', 'secrets/{{env}}.yml']
roles:
diff --git a/ansible/roles/cassandra-deploy-decrypt/defaults/main.yml b/ansible/roles/cassandra-deploy-decrypt/defaults/main.yml
index c38c2c9d3..02efebd0e 100644
--- a/ansible/roles/cassandra-deploy-decrypt/defaults/main.yml
+++ b/ansible/roles/cassandra-deploy-decrypt/defaults/main.yml
@@ -1,2 +1,3 @@
cassandra_jar_path: ../
cassandra_deploy_path: /home/deployer
+cassandra_jar_name: user-declaration-util-1.0-SNAPSHOT-jar-with-dependencies.jar
diff --git a/ansible/roles/cassandra-deploy-decrypt/tasks/main.yml b/ansible/roles/cassandra-deploy-decrypt/tasks/main.yml
index 54787a84e..0275452cd 100644
--- a/ansible/roles/cassandra-deploy-decrypt/tasks/main.yml
+++ b/ansible/roles/cassandra-deploy-decrypt/tasks/main.yml
@@ -1,10 +1,10 @@
- name: Copy the jar
become: yes
copy:
- src: "{{cassandra_jar_path}}/user-declaration-util-1.0-SNAPSHOT-jar-with-dependencies.jar"
+ src: "{{cassandra_jar_path}}/{{cassandra_jar_name}}"
dest: "{{cassandra_deploy_path}}"
run_once: true
- name: Run the application
- shell: java -jar user-declaration-util-1.0-SNAPSHOT-jar-with-dependencies.jar
+ shell: "java -jar {{cassandra_jar_name}}"
run_once: true
diff --git a/pipelines/deploy/cassandra-deploy/Jenkinsfile.decrypt b/pipelines/deploy/cassandra-deploy/Jenkinsfile.decrypt
index c695d7a97..ae6eae690 100644
--- a/pipelines/deploy/cassandra-deploy/Jenkinsfile.decrypt
+++ b/pipelines/deploy/cassandra-deploy/Jenkinsfile.decrypt
@@ -30,7 +30,7 @@ node() {
unzip ${artifact}
"""
ansiblePlaybook = "${currentWs}/ansible/cassandra-deploy-decrypt.yml"
- ansibleExtraArgs = "--vault-password-file /var/lib/jenkins/secrets/vault-pass -v"
+ ansibleExtraArgs = "-e cassandra_jar_name=\"${params.cassandra_jar_name}\" --vault-password-file /var/lib/jenkins/secrets/vault-pass -v "
values.put('ansiblePlaybook', ansiblePlaybook)
values.put('ansibleExtraArgs', ansibleExtraArgs)
println values
From 8e63180028a3655794f5e31ca1dbe1ec3340659a Mon Sep 17 00:00:00 2001
From: Rajesh Rajendran
Date: Mon, 2 Nov 2020 12:20:36 +0530
Subject: [PATCH 023/184] Merge 3.3.0 to 3.4.0 (#2015)
* Issue #SB-21135 feat: Updated LMS configuration (#2003)
* Issue #SC-1929 feat: Courses logback changes
* Issue #SC-2041 feat: Updated issue certificate topic config
* Issue #SB-21135 feat: Updated LMS configuration
* Issue #SB-21135 feat: Updated LMS configuration
* Issue #SB-21135 feat: Updated LMS configuration
* Enanbling secured way to upload files using jenkins (#2004)
* Issue #SB-21123 fix: updated config for search-service (#2005)
* Issue #SB-21123 fix: updated config for search-service
* Issue #SB-21123 fix: updated variable name
* Merge 3.2.7 to 3.3.0 (#2008)
* Added the secor process alert rules. (#2012)
* added the druid alert rules (#1996)
* Issue #TG607: added the druid alert rules
* Issue #TG607: added the druid alert rules
* Issue #TG607: updated the druid alert rules
* Issue #0000: added the datasource name in message field.
* Issue #0000: removed the rollup datasource
* Issue #0000: added the secor process alert rules
* Issue #0000: added the email config
* Issue #0000: added the secor processes names
* Issue #0000: updated the alert name
* Issue #0000: removed the old secor alertrules
* Issue #TG-641: updated the alert rules
Co-authored-by: Pradyumna
Co-authored-by: SMY ALTAMASH <30286162+SMYALTAMASH@users.noreply.github.com>
Co-authored-by: Kumar Gauraw
Co-authored-by: kaliraja <34502260+Kaali09@users.noreply.github.com>
---
ansible/cert-file-upload.yml | 10 ++
.../roles/cert-file-upload/defaults/main.yml | 2 +
ansible/roles/cert-file-upload/tasks/main.yml | 7 ++
ansible/roles/kong-api/defaults/main.yml | 1 -
.../content-service_application.conf | 1 -
.../sunbird_knowledge-mw-service.env | 4 +-
.../templates/sunbird_lms-service.env | 4 +-
.../roles/sunbird-deploy/tasks/main.yml | 2 +-
.../templates/alertrules.yaml | 20 ++++
.../templates/prometheus-operator.yaml | 23 +++-
.../templates/daemonset.yaml | 2 +
.../core/nginx-public-ingress/values.j2 | 106 ++++++++++++++++--
.../alertrules/templates/promrulesProcess.yml | 24 ----
.../templates/promrulesSecorProcess.yml | 29 +++++
.../dashboards/dashboards/nginx-detailed.json | 38 +++----
pipelines/certs-templates/Jenkinsfile.upload | 61 ++++++++++
16 files changed, 268 insertions(+), 66 deletions(-)
create mode 100644 ansible/cert-file-upload.yml
create mode 100644 ansible/roles/cert-file-upload/defaults/main.yml
create mode 100644 ansible/roles/cert-file-upload/tasks/main.yml
create mode 100644 kubernetes/helm_charts/monitoring/alertrules/templates/promrulesSecorProcess.yml
create mode 100644 pipelines/certs-templates/Jenkinsfile.upload
diff --git a/ansible/cert-file-upload.yml b/ansible/cert-file-upload.yml
new file mode 100644
index 000000000..e29a7b6c2
--- /dev/null
+++ b/ansible/cert-file-upload.yml
@@ -0,0 +1,10 @@
+---
+- hosts: localhost
+ become: yes
+ vars_files:
+ - "{{inventory_dir}}/secrets.yml"
+ environment:
+ AZURE_STORAGE_ACCOUNT: "{{ sunbird_public_storage_account_name }}"
+ AZURE_STORAGE_KEY: "{{ sunbird_public_storage_account_key }}"
+ roles:
+ - cert-file-upload
diff --git a/ansible/roles/cert-file-upload/defaults/main.yml b/ansible/roles/cert-file-upload/defaults/main.yml
new file mode 100644
index 000000000..b74bef14c
--- /dev/null
+++ b/ansible/roles/cert-file-upload/defaults/main.yml
@@ -0,0 +1,2 @@
+file_name: "certUploadedfile"
+cert_template_artifacts_container_name: "e-credentials"
diff --git a/ansible/roles/cert-file-upload/tasks/main.yml b/ansible/roles/cert-file-upload/tasks/main.yml
new file mode 100644
index 000000000..9fcaf6a67
--- /dev/null
+++ b/ansible/roles/cert-file-upload/tasks/main.yml
@@ -0,0 +1,7 @@
+- name: rename the file to the correct name as required in blobstore
+ command: "mv /tmp/certUploadedfile /tmp/{{file_name}}"
+
+- name: Upload to azure blob storage
+ command: "az storage blob upload -c {{ cert_template_artifacts_container_name }} --name {{ file_name }} -f /tmp/{{file_name}}"
+ async: 3600
+ poll: 10
diff --git a/ansible/roles/kong-api/defaults/main.yml b/ansible/roles/kong-api/defaults/main.yml
index 893415959..1c01c239f 100644
--- a/ansible/roles/kong-api/defaults/main.yml
+++ b/ansible/roles/kong-api/defaults/main.yml
@@ -1,4 +1,3 @@
-
---
# Guideline for PR Merging: https://project-sunbird.atlassian.net/wiki/spaces/DevOps/pages/1210777612/API+Manager+Kong+BEST+Practices+Documentation.
diff --git a/ansible/roles/stack-sunbird/templates/content-service_application.conf b/ansible/roles/stack-sunbird/templates/content-service_application.conf
index e5d252180..fb31f84f4 100644
--- a/ansible/roles/stack-sunbird/templates/content-service_application.conf
+++ b/ansible/roles/stack-sunbird/templates/content-service_application.conf
@@ -565,4 +565,3 @@ channel.content.primarycategories=["Explanation Content", "Learning Resource", "
channel.collection.primarycategories=["Course", "Digital Textbook", "Content Playlist"]
channel.asset.primarycategories=["Asset"]
objectcategorydefinition.keyspace="{{ lp_cassandra_keyspace_prefix }}_category_store"
-
diff --git a/ansible/roles/stack-sunbird/templates/sunbird_knowledge-mw-service.env b/ansible/roles/stack-sunbird/templates/sunbird_knowledge-mw-service.env
index 6a17b9f2d..ec8132a2a 100644
--- a/ansible/roles/stack-sunbird/templates/sunbird_knowledge-mw-service.env
+++ b/ansible/roles/stack-sunbird/templates/sunbird_knowledge-mw-service.env
@@ -19,11 +19,11 @@ sunbird_content_service_blacklisted_channels={{content_service_blacklisted_chann
sunbird_default_channel={{sunbird_default_channel}}
sunbird_content_repo_api_base_url={{sunbird_content_repo_api_base_url}}
sunbird_content_repo_api_key={{sunbird_content_repo_api_key}}
-sunbird_search_service_api_base_url={{sunbird_search_service_api_base_url}}
+sunbird_search_service_api_base_url={{knowledge_mw_sunbird_search_service_api_base_url | default('http://search-service:9000')}}
sunbird_search_service_api_key={{sunbird_search_service_api_key}}
sunbird_dial_repo_api_base_url={{sunbird_dial_repo_api_base_url}}
sunbird_dial_repo_api_key={{sunbird_dial_repo_api_key}}
-sunbird_plugin_repo_api_base_url={{sunbird_plugin_repo_api_base_url}}
+sunbird_plugin_repo_api_base_url={{knowledge_mw_sunbird_plugin_repo_api_base_url | default('http://search-service:9000')}}
sunbird_plugin_repo_api_key={{sunbird_plugin_repo_api_key}}
sunbird_data_service_api_base_url={{sunbird_data_service_api_base_url}}
sunbird_data_service_api_key={{sunbird_data_service_api_key}}
diff --git a/ansible/roles/stack-sunbird/templates/sunbird_lms-service.env b/ansible/roles/stack-sunbird/templates/sunbird_lms-service.env
index 958982df0..42859c390 100644
--- a/ansible/roles/stack-sunbird/templates/sunbird_lms-service.env
+++ b/ansible/roles/stack-sunbird/templates/sunbird_lms-service.env
@@ -19,8 +19,8 @@ sunbird_pg_user={{sunbird_pg_user}}
sunbird_pg_password={{sunbird_pg_password}}
sunbird_installation={{sunbird_installation}}
sunbird_analytics_api_base_url={{sunbird_analytics_api_base_url}}
-sunbird_search_service_api_base_url={{sunbird_search_service_api_base_url}}
-ekstep_api_base_url={{sunbird_content_service_api_base_url}}
+sunbird_search_service_api_base_url={{ lms_search_service_api_base_url | default('http://search-service:9000') }}
+ekstep_api_base_url={{ lms_ekstep_api_base_url | default('http://content-service:9000') }}
sunbird_group_service_api_base_url={{sunbird_group_service_api_base_url}}
sunbird_mail_server_host={{sunbird_mail_server_host}}
sunbird_mail_server_port={{sunbird_mail_server_port}}
diff --git a/kubernetes/ansible/roles/sunbird-deploy/tasks/main.yml b/kubernetes/ansible/roles/sunbird-deploy/tasks/main.yml
index 95b651e36..9d7ad2ee9 100644
--- a/kubernetes/ansible/roles/sunbird-deploy/tasks/main.yml
+++ b/kubernetes/ansible/roles/sunbird-deploy/tasks/main.yml
@@ -41,7 +41,7 @@
when: release_name == "learner" or release_name == "lms" or release_name == "groups"
- name: helm upgrade
- shell: helm upgrade --install --atomic --timeout 10m {{ release_name }} {{ chart_path }} -n {{namespace}}
+ shell: helm upgrade --install --atomic --timeout {{helm_install_timeout | d('10m')}} {{ release_name }} {{ chart_path }} -n {{namespace}}
- name: Clean up keys
include_role:
diff --git a/kubernetes/ansible/roles/sunbird-monitoring/templates/alertrules.yaml b/kubernetes/ansible/roles/sunbird-monitoring/templates/alertrules.yaml
index 5a6466670..b448efd7d 100644
--- a/kubernetes/ansible/roles/sunbird-monitoring/templates/alertrules.yaml
+++ b/kubernetes/ansible/roles/sunbird-monitoring/templates/alertrules.yaml
@@ -59,3 +59,23 @@ raw_druid_datasource:
druid_raw_ingestion_threshold: 200000
druid_rollup_ingestion_threshold: 200000
+secor_process_names:
+ - channel-telemetry-backup
+ - derived-telemetry-backup
+ - derived-denorm-events-backup
+ - channel-summary-backup
+ - assess-events-backup
+ - assess-raw-events-backup
+ - device-profile-backup
+ - learning-events-backup
+ - learning-failed-backup
+ - content-consumption-events-backup
+ - failed-telemetry-backup
+ - extractor-duplicate-backup
+ - extractor-failed-backup
+ - unique-telemetry-backup
+ - denorm-events-backup
+ - raw-telemetry-backup
+ - ingestion-telemetry-backup
+ - ingestion-cluster-telemetry-backup
+ - telemetry-ingest-backup
diff --git a/kubernetes/ansible/roles/sunbird-monitoring/templates/prometheus-operator.yaml b/kubernetes/ansible/roles/sunbird-monitoring/templates/prometheus-operator.yaml
index 11d250f2e..ce05bde3a 100644
--- a/kubernetes/ansible/roles/sunbird-monitoring/templates/prometheus-operator.yaml
+++ b/kubernetes/ansible/roles/sunbird-monitoring/templates/prometheus-operator.yaml
@@ -145,11 +145,18 @@ alertmanager:
text: |-
{{ "{{" }} range .Alerts {{ "}}" }}
*Alert:* {{ "{{" }} .Annotations.alertname {{ "}}" }}
- *processName:* {{ "{{" }} .Annotations.job_id {{ "}}" }}
+ *ProcessName:* {{ "{{" }} .Annotations.job_id {{ "}}" }}
*AlertType:* {{ "{{" }} .Labels.severity {{ "}}" }}
*Details:* {{ "{{" }} .Annotations.message {{ "}}" }}
{{ "{{" }} end {{ "}}" }}
icon_emoji: ':dart:'
+
+ email_configs:
+ - send_resolved: true
+ to: '{{ default_mailing_list }}'
+ html: '{% raw %}{{ template "email.default.html" . }}{% endraw %}'
+ headers:
+ subject: '[{{ kubernetes_cluster_name }}] {% raw %}{{ .GroupLabels.alertname }}{% endraw %}'
- name: 'dp-lag_slack_warning'
slack_configs:
@@ -168,6 +175,13 @@ alertmanager:
*Details:* {{ "{{" }} .Annotations.message {{ "}}" }}
{{ "{{" }} end {{ "}}" }}
icon_emoji: ':dart:'
+
+ email_configs:
+ - send_resolved: true
+ to: '{{ default_mailing_list }}'
+ html: '{% raw %}{{ template "email.default.html" . }}{% endraw %}'
+ headers:
+ subject: '[{{ kubernetes_cluster_name }}] {% raw %}{{ .GroupLabels.alertname }}{% endraw %}'
- name: 'dp-lag_slack_critical'
slack_configs:
@@ -186,6 +200,13 @@ alertmanager:
*Details:* {{ "{{" }} .Annotations.message {{ "}}" }}
{{ "{{" }} end {{ "}}" }}
icon_emoji: ':dart:'
+
+ email_configs:
+ - send_resolved: true
+ to: '{{ default_mailing_list }}'
+ html: '{% raw %}{{ template "email.default.html" . }}{% endraw %}'
+ headers:
+ subject: '[{{ kubernetes_cluster_name }}] {% raw %}{{ .GroupLabels.alertname }}{% endraw %}'
{% for item in alert_teams %}
# Comment to ensure proper indentation while templating
diff --git a/kubernetes/helm_charts/core/nginx-public-ingress/templates/daemonset.yaml b/kubernetes/helm_charts/core/nginx-public-ingress/templates/daemonset.yaml
index 929a28e6c..3b647c055 100644
--- a/kubernetes/helm_charts/core/nginx-public-ingress/templates/daemonset.yaml
+++ b/kubernetes/helm_charts/core/nginx-public-ingress/templates/daemonset.yaml
@@ -10,6 +10,8 @@ spec:
app: nginx-public-ingress
updateStrategy:
type: RollingUpdate
+ rollingUpdate:
+ maxUnavailable: 25%
template:
metadata:
annotations:
diff --git a/kubernetes/helm_charts/core/nginx-public-ingress/values.j2 b/kubernetes/helm_charts/core/nginx-public-ingress/values.j2
index 85e92c821..b10380df3 100644
--- a/kubernetes/helm_charts/core/nginx-public-ingress/values.j2
+++ b/kubernetes/helm_charts/core/nginx-public-ingress/values.j2
@@ -169,7 +169,7 @@ proxyconfig: |-
proxy_cache_revalidate on;
proxy_cache_background_update on;
proxy_cache_lock on;
- proxy_cache_valid 200 14400;
+ proxy_cache_valid 200 43200;
rewrite ^/auth/(.*) /auth/$1 break;
proxy_set_header Connection "";
proxy_set_header Host $host;
@@ -194,7 +194,7 @@ proxyconfig: |-
proxy_cache_revalidate on;
proxy_cache_background_update on;
proxy_cache_lock on;
- proxy_cache_valid 200 14400;
+ proxy_cache_valid 200 43200;
proxy_set_header Connection "";
proxy_set_header Host $host;
proxy_set_header X-Real-IP {{ nginx_client_public_ip_header | d('$remote_addr') }};
@@ -219,7 +219,7 @@ proxyconfig: |-
proxy_cache_revalidate on;
proxy_cache_background_update on;
proxy_cache_lock on;
- proxy_cache_valid 200 3600s;
+ proxy_cache_valid 200 14400s;
# Increasing the proxy buffer size
proxy_buffer_size 16k;
proxy_busy_buffers_size 16k;
@@ -246,7 +246,7 @@ proxyconfig: |-
proxy_cache_revalidate on;
proxy_cache_background_update on;
proxy_cache_lock on;
- proxy_cache_valid 200 3600s;
+ proxy_cache_valid 200 14400s;
# Increasing the proxy buffer size
proxy_buffer_size 16k;
proxy_busy_buffers_size 16k;
@@ -273,7 +273,7 @@ proxyconfig: |-
proxy_cache_revalidate on;
proxy_cache_background_update on;
proxy_cache_lock on;
- proxy_cache_valid 200 14400;
+ proxy_cache_valid 200 43200;
rewrite ^/api/(.*) /$1 break;
proxy_set_header Connection "";
proxy_set_header Host $host;
@@ -297,7 +297,7 @@ proxyconfig: |-
proxy_cache_revalidate on;
proxy_cache_background_update on;
proxy_cache_lock on;
- proxy_cache_valid 200 14400;
+ proxy_cache_valid 200 43200;
rewrite ^/api/(.*) /$1 break;
proxy_set_header Connection "";
proxy_set_header Host $host;
@@ -705,6 +705,90 @@ proxyconfig: |-
proxy_set_header X-Request-ID $sb_request_id;
proxy_pass https://$offline_bucket/$url_full;
}
+ # compression for svg certs download
+ location /api/certreg/v2/certs/download {
+ rewrite ^/api/(.*) /$1 break;
+ # Compression
+ gzip on;
+ gzip_comp_level 5;
+ gzip_min_length 50000; # 50KB
+ gzip_proxied any;
+ gzip_vary on;
+ # Content types for compression
+ gzip_types
+ application/atom+xml
+ application/javascript
+ application/json
+ application/ld+json
+ application/manifest+json
+ application/rss+xml
+ application/vnd.geo+json
+ application/vnd.ms-fontobject
+ application/x-font-ttf
+ application/x-web-app-manifest+json
+ application/xhtml+xml
+ application/xml
+ font/opentype
+ image/bmp
+ image/svg+xml
+ image/x-icon
+ text/cache-manifest
+ text/css
+ text/plain
+ add_header test hello;
+ proxy_set_header Connection "";
+ proxy_set_header Host $host;
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header X-Scheme $scheme;
+ proxy_set_header X-Forwarded-For $remote_addr;
+ proxy_connect_timeout 5;
+ proxy_send_timeout 60;
+ proxy_read_timeout 70;
+ proxy_http_version 1.1;
+ proxy_set_header X-Request-ID $sb_request_id;
+ proxy_pass http://kong;
+ }
+ location /learner/certreg/v2/certs/download {
+ # Compression
+ gzip on;
+ gzip_comp_level 5;
+ gzip_min_length 50000; # 50KB
+ gzip_proxied any;
+ gzip_vary on;
+ # Content types for compression
+ gzip_types
+ application/atom+xml
+ application/javascript
+ application/json
+ application/ld+json
+ application/manifest+json
+ application/rss+xml
+ application/vnd.geo+json
+ application/vnd.ms-fontobject
+ application/x-font-ttf
+ application/x-web-app-manifest+json
+ application/xhtml+xml
+ application/xml
+ font/opentype
+ image/bmp
+ image/svg+xml
+ image/x-icon
+ text/cache-manifest
+ text/css
+ text/plain
+ add_header test hello;
+ proxy_set_header Host $host;
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header X-Scheme $scheme;
+ proxy_connect_timeout 5;
+ proxy_send_timeout 60;
+ proxy_read_timeout 70;
+ proxy_set_header X-Forwarded-Proto $scheme;
+ proxy_set_header Connection "";
+ proxy_http_version 1.1;
+ proxy_set_header X-Request-ID $sb_request_id;
+ proxy_pass http://player;
+ }
location / {
rewrite ^/(.*) /$1 break;
proxy_set_header Host $host;
@@ -747,14 +831,14 @@ proxyconfig: |-
}
location ~ /resourcebundles/v1/read|/learner/data/v1/(role/read|system/settings/get)|/v1/tenant/info {
proxy_cache_key $proxy_host$request_uri;
- proxy_cache proxy_cache;
+ proxy_cache framework_cache;
add_header X-Proxy-Cache $upstream_cache_status;
add_header X-Proxy-Cache-Date $upstream_http_date;
proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;
proxy_cache_revalidate on;
proxy_cache_background_update on;
proxy_cache_lock on;
- proxy_cache_valid 200 14400;
+ proxy_cache_valid 200 43200;
proxy_set_header Host $host;
proxy_set_header X-Real-IP {{ nginx_client_public_ip_header | d('$remote_addr') }};
proxy_set_header X-Scheme $scheme;
@@ -772,7 +856,7 @@ proxyconfig: |-
proxy_cache_revalidate on;
proxy_cache_background_update on;
proxy_cache_lock on;
- proxy_cache_valid 200 14400;
+ proxy_cache_valid 200 43200;
rewrite ^/api/channel/v1/read/(.*) /channel/v1/read/$1 break;
proxy_set_header Connection "";
proxy_set_header Host $host;
@@ -925,11 +1009,11 @@ nginxconfig: |
# caching for images and files
proxy_cache_path /tmp/proxy_cache levels=1:2 keys_zone=tmp_cache:5m max_size=10m inactive=300m use_temp_path=off;
# caching for apis
- proxy_cache_path /tmp/api_cache levels=1:2 keys_zone=proxy_cache:5m max_size=300m inactive=300m use_temp_path=off;
+ proxy_cache_path /tmp/api_cache levels=1:2 keys_zone=proxy_cache:5m max_size=600m inactive=1400m use_temp_path=off;
# cache framework
proxy_cache_path /tmp/framework_cache levels=1:2 keys_zone=framework_cache:5m max_size=700m inactive=300m use_temp_path=off;
# cache content
- proxy_cache_path /tmp/content_cache levels=1:2 keys_zone=content_cache:100m max_size=1500m inactive=300m use_temp_path=off;
+ proxy_cache_path /tmp/content_cache levels=1:2 keys_zone=content_cache:100m max_size=3000m inactive=600m use_temp_path=off;
# cache content metadata
proxy_cache_path /tmp/content_metadata levels=1:2 keys_zone=content_metadata:100m max_size=1000m inactive=300m use_temp_path=off;
diff --git a/kubernetes/helm_charts/monitoring/alertrules/templates/promrulesProcess.yml b/kubernetes/helm_charts/monitoring/alertrules/templates/promrulesProcess.yml
index cd2c2a701..39c76ee1a 100644
--- a/kubernetes/helm_charts/monitoring/alertrules/templates/promrulesProcess.yml
+++ b/kubernetes/helm_charts/monitoring/alertrules/templates/promrulesProcess.yml
@@ -60,30 +60,6 @@ spec:
job_id: kafka
alertname: TooManyKafkaProcessRunning
- - alert: secor_process_not_running_critical
- expr: namedprocess_namegroup_states{groupname="secor",state="Sleeping"} != {{ .Values.secor_job_count }}
- for: 1m
- labels:
- severity: critical
- module: dp_process
- annotations:
- message: Number of running processes should be {{ .Values.secor_job_count }} but currently {{`{{$value}}`}} processes are running.
- summary: Secor process is not running
- job_id: secor
- alertname: SecorJobNotRunning
-
- - alert: secor_process_not_running_critical
- expr: namedprocess_namegroup_states{groupname="processingsecor",state="Sleeping"} != {{ .Values.processingsecor_job_count }}
- for: 1m
- labels:
- severity: critical
- module: dp_process
- annotations:
- message: Number of running processes should be {{ .Values.secor_job_count }} but currently {{`{{$value}}`}} processes are running.
- summary: Secor process is not running
- job_id: secor
- alertname: SecorJobNotRunning
-
- alert: zookeeper_process_not_running_fatal
expr: namedprocess_namegroup_states{groupname="zookeeper",state="Sleeping"} < 1
for: 1m
diff --git a/kubernetes/helm_charts/monitoring/alertrules/templates/promrulesSecorProcess.yml b/kubernetes/helm_charts/monitoring/alertrules/templates/promrulesSecorProcess.yml
new file mode 100644
index 000000000..0343e106e
--- /dev/null
+++ b/kubernetes/helm_charts/monitoring/alertrules/templates/promrulesSecorProcess.yml
@@ -0,0 +1,29 @@
+---
+apiVersion: monitoring.coreos.com/v1
+kind: PrometheusRule
+metadata:
+ labels:
+ role: alert-rules
+ app: {{ .Values.prometheus_rule_selector_app }}
+ release: {{ .Values.prometheus_rule_selector_release }}
+ name: {{ .Values.fullnameOverride }}-secor-process-rules
+ namespace: {{ .Values.namespace }}
+spec:
+ groups:
+ - name: alertrules.process
+ rules:
+ {{- if .Values.secor_process_names }}
+ ## druid segment unavailable count alert
+ {{ range $key := .Values.secor_process_names }}
+ - alert: secor_process_not_running_critical {{ . }}
+ expr: sum without(state) (namedprocess_namegroup_states{groupname={{ . | quote }}}) == 0
+ for: 5m
+ labels:
+ severity: critical
+ module: dp_process
+ annotations:
+ message: The secor job {{ . }} is not running.
+ job_id: {{ . }}
+ alertname: SecorJobNotRunning
+ {{- end }}
+ {{- end }}
diff --git a/kubernetes/helm_charts/monitoring/dashboards/dashboards/nginx-detailed.json b/kubernetes/helm_charts/monitoring/dashboards/dashboards/nginx-detailed.json
index fbaea070b..a5bcfeb7c 100644
--- a/kubernetes/helm_charts/monitoring/dashboards/dashboards/nginx-detailed.json
+++ b/kubernetes/helm_charts/monitoring/dashboards/dashboards/nginx-detailed.json
@@ -17,7 +17,7 @@
"editable": true,
"gnetId": null,
"graphTooltip": 0,
- "iteration": 1601270090088,
+ "iteration": 1603867463241,
"links": [],
"panels": [
{
@@ -188,19 +188,19 @@
"steppedLine": false,
"targets": [
{
- "expr": "(sum(increase(nginx_http_requests_total{status!~\"4..|5..\"}[5m] offset 1d)) / sum(increase(nginx_http_requests_total[5m] ))) * 100",
+ "expr": "(sum(increase(nginx_http_requests_total{status!~\"4..|5..\"}[5m] )) / sum(increase(nginx_http_requests_total[5m] ))) * 100",
"interval": "",
"legendFormat": "Today",
"refId": "A"
},
{
- "expr": "(sum(increase(nginx_http_requests_total{status!~\"4..|5..\"}[5m] offset 1d)) / sum(increase(nginx_http_requests_total[5m] offset 1w))) * 100",
+ "expr": "(sum(increase(nginx_http_requests_total{status!~\"4..|5..\"}[5m] offset 1d)) / sum(increase(nginx_http_requests_total[5m] offset 1d))) * 100",
"interval": "",
"legendFormat": "Yesteday",
"refId": "B"
},
{
- "expr": "(sum(increase(nginx_http_requests_total{status!~\"4..|5..\"}[5m] offset 1d)) / sum(increase(nginx_http_requests_total[5m] offset 1d))) * 100",
+ "expr": "(sum(increase(nginx_http_requests_total{status!~\"4..|5..\"}[5m] offset 1w)) / sum(increase(nginx_http_requests_total[5m] offset 1w))) * 100",
"interval": "",
"legendFormat": "Last Week",
"refId": "C"
@@ -296,13 +296,13 @@
"steppedLine": false,
"targets": [
{
- "expr": "(sum(increase(nginx_http_requests_total{ status!~\"2..|3..\"}[5m] offset 1w)) / sum(increase(nginx_http_requests_total[5m]))) * 100",
+ "expr": "(sum(increase(nginx_http_requests_total{ status!~\"2..|3..\"}[5m])) / sum(increase(nginx_http_requests_total[5m]))) * 100",
"interval": "",
"legendFormat": "Today",
"refId": "A"
},
{
- "expr": "(sum(increase(nginx_http_requests_total{ status!~\"2..|3..\"}[5m] offset 1w)) / sum(increase(nginx_http_requests_total[5m] offset 1d))) * 100",
+ "expr": "(sum(increase(nginx_http_requests_total{ status!~\"2..|3..\"}[5m] offset 1d)) / sum(increase(nginx_http_requests_total[5m] offset 1d))) * 100",
"interval": "",
"legendFormat": "Yesterday",
"refId": "B"
@@ -451,7 +451,7 @@
"step": 2
},
{
- "expr": "sum(rate(nginx_http_requests_total{cluster=~\"$cluster\", status=\"444\"}[5m]))",
+ "expr": "sum(rate(nginx_http_requests_total{cluster=~\"$cluster\", status=\"345\"}[5m]))",
"format": "time_series",
"interval": "",
"intervalFactor": 1,
@@ -1062,13 +1062,11 @@
"legend": {
"alignAsTable": true,
"avg": false,
- "current": true,
+ "current": false,
"max": true,
"min": false,
"rightSide": true,
"show": true,
- "sort": "current",
- "sortDesc": true,
"total": false,
"values": true
},
@@ -1088,23 +1086,17 @@
"steppedLine": false,
"targets": [
{
- "expr": "sum(nginx_http_connections) by (instance)",
+ "expr": "sum(nginx_http_connections) by (state)",
"interval": "",
- "legendFormat": "{{instance}}",
+ "legendFormat": "{{ instance }}",
"refId": "A"
- },
- {
- "expr": "sum(nginx_http_connections)",
- "interval": "",
- "legendFormat": "Total",
- "refId": "B"
}
],
"thresholds": [],
"timeFrom": null,
"timeRegions": [],
"timeShift": null,
- "title": "Nginx Total Connection",
+ "title": "Nginx Connections",
"tooltip": {
"shared": true,
"sort": 0,
@@ -1120,7 +1112,7 @@
},
"yaxes": [
{
- "$$hashKey": "object:1799",
+ "$$hashKey": "object:142",
"format": "short",
"label": null,
"logBase": 1,
@@ -1129,7 +1121,7 @@
"show": true
},
{
- "$$hashKey": "object:1800",
+ "$$hashKey": "object:143",
"format": "short",
"label": null,
"logBase": 1,
@@ -1240,7 +1232,7 @@
}
}
],
- "refresh": "1m",
+ "refresh": "5m",
"schemaVersion": 25,
"style": "dark",
"tags": [],
@@ -1305,5 +1297,5 @@
"timezone": "",
"title": "Nginx Detailed",
"uid": "9wKzPxZMz",
- "version": 1
+ "version": 2
}
diff --git a/pipelines/certs-templates/Jenkinsfile.upload b/pipelines/certs-templates/Jenkinsfile.upload
new file mode 100644
index 000000000..8b0ef0a6b
--- /dev/null
+++ b/pipelines/certs-templates/Jenkinsfile.upload
@@ -0,0 +1,61 @@
+@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("upload") {
+ def inputFile = input message: 'Upload file', parameters: [file(name: 'certUploadedfile')]
+ new hudson.FilePath(new File("tmp/certUploadedfile")).copyFrom(inputFile)
+ }
+
+ stage('checkout public repo') {
+ folder = new File("$WORKSPACE/.git")
+ if (folder.exists())
+ {
+ println "Found .git folder. Clearing it.."
+ sh'git clean -fxd'
+ }
+ checkout scm
+ }
+
+ ansiColor('xterm') {
+ stage('deploy'){
+ values = [:]
+ envDir = sh(returnStdout: true, script: "echo $JOB_NAME").split('/')[-3].trim()
+ module = sh(returnStdout: true, script: "echo $JOB_NAME").split('/')[-2].trim()
+ jobName = sh(returnStdout: true, script: "echo $JOB_NAME").split('/')[-1].trim()
+ currentWs = sh(returnStdout: true, script: 'pwd').trim()
+ ansiblePlaybook = "${currentWs}/ansible/cert-file-upload.yml"
+ ansibleExtraArgs = "--extra-vars \"file_name=${params.file_name}\" --vault-password-file /var/lib/jenkins/secrets/vault-pass"
+ values.put('currentWs', currentWs)
+ values.put('env', envDir)
+ values.put('module', module)
+ values.put('jobName', jobName)
+ values.put('ansiblePlaybook', ansiblePlaybook)
+ values.put('ansibleExtraArgs', ansibleExtraArgs)
+ println values
+ ansible_playbook_run(values)
+ currentBuild.result = "SUCCESS"
+ currentBuild.description = "Artifact: ${values.artifact_version}, Private: ${params.private_branch}, Public: ${params.branch_or_tag}"
+ }
+ }
+
+ stage('remove tmp file'){
+ sh """
+ rm -rf /tmp/certUploadedfile
+ """
+ }
+ }
+ catch (err) {
+ currentBuild.result = "FAILURE"
+ throw err
+ }
+ finally {
+ slack_notify(currentBuild.result)
+ email_notify()
+ }
+}
From bac360bd5abf1bc6cd7180839eca312601ce6d41 Mon Sep 17 00:00:00 2001
From: Rajesh Rajendran
Date: Wed, 4 Nov 2020 12:58:06 +0530
Subject: [PATCH 024/184] Adding fluent-bit chart (#2019)
Adding type conversion for nginx logs
---
.../roles/logging/templates/fluent-bit.yaml | 27 +-
.../logging/fluent-bit/.helmignore | 23 +
.../helm_charts/logging/fluent-bit/Chart.yaml | 42 +-
.../helm_charts/logging/fluent-bit/OWNERS | 10 -
.../helm_charts/logging/fluent-bit/README.md | 191 ---
.../logging/fluent-bit/templates/NOTES.txt | 15 -
.../logging/fluent-bit/templates/_helpers.tpl | 90 +-
.../fluent-bit/templates/cluster-role.yaml | 28 -
.../templates/cluster-rolebinding.yaml | 19 -
.../logging/fluent-bit/templates/config.yaml | 271 ---
.../fluent-bit/templates/configMap.yaml | 166 ++
.../fluent-bit/templates/daemonset.yaml | 208 +--
.../fluent-bit/templates/endpoint.yaml | 27 +
.../logging/fluent-bit/templates/psp.yaml | 60 -
.../logging/fluent-bit/templates/secret.yaml | 30 -
.../logging/fluent-bit/templates/service.yaml | 34 +-
.../fluent-bit/templates/serviceMonitor.yaml | 27 +
.../fluent-bit/templates/serviceaccount.yaml | 38 +-
.../fluent-bit/templates/servicemonitor.yaml | 34 -
.../templates/tests/test-configmap.yaml | 48 -
.../fluent-bit/templates/tests/test.yaml | 53 -
.../logging/fluent-bit/values.yaml | 354 +---
.../dashboards/dashboards/fluent-bit.json | 1509 +++++++++++++++++
.../monitoring/dashboards/values.yaml | 3 +
24 files changed, 1973 insertions(+), 1334 deletions(-)
create mode 100644 kubernetes/helm_charts/logging/fluent-bit/.helmignore
mode change 100755 => 100644 kubernetes/helm_charts/logging/fluent-bit/Chart.yaml
delete mode 100644 kubernetes/helm_charts/logging/fluent-bit/OWNERS
delete mode 100644 kubernetes/helm_charts/logging/fluent-bit/README.md
delete mode 100644 kubernetes/helm_charts/logging/fluent-bit/templates/NOTES.txt
delete mode 100644 kubernetes/helm_charts/logging/fluent-bit/templates/cluster-role.yaml
delete mode 100644 kubernetes/helm_charts/logging/fluent-bit/templates/cluster-rolebinding.yaml
delete mode 100644 kubernetes/helm_charts/logging/fluent-bit/templates/config.yaml
create mode 100644 kubernetes/helm_charts/logging/fluent-bit/templates/configMap.yaml
create mode 100644 kubernetes/helm_charts/logging/fluent-bit/templates/endpoint.yaml
delete mode 100644 kubernetes/helm_charts/logging/fluent-bit/templates/psp.yaml
delete mode 100644 kubernetes/helm_charts/logging/fluent-bit/templates/secret.yaml
create mode 100644 kubernetes/helm_charts/logging/fluent-bit/templates/serviceMonitor.yaml
delete mode 100644 kubernetes/helm_charts/logging/fluent-bit/templates/servicemonitor.yaml
delete mode 100644 kubernetes/helm_charts/logging/fluent-bit/templates/tests/test-configmap.yaml
delete mode 100644 kubernetes/helm_charts/logging/fluent-bit/templates/tests/test.yaml
create mode 100644 kubernetes/helm_charts/monitoring/dashboards/dashboards/fluent-bit.json
diff --git a/kubernetes/ansible/roles/logging/templates/fluent-bit.yaml b/kubernetes/ansible/roles/logging/templates/fluent-bit.yaml
index f7bce5c1b..1d85dc620 100644
--- a/kubernetes/ansible/roles/logging/templates/fluent-bit.yaml
+++ b/kubernetes/ansible/roles/logging/templates/fluent-bit.yaml
@@ -1,24 +1,3 @@
-backend:
- type: es
- es:
- host: {{ logger_es6_host }}
- port: {{ logger_es_port }}
- index: logstash-fb
- type: flb_type
- logstash_prefix: logstash-fb
- replace_dots: "On"
- logstash_format: "On"
- retry_limit: "False"
- time_key: "@timestamp"
- # Optional username credential for Elastic X-Pack access
- http_user:
- # Password for user defined in HTTP_User
- http_passwd:
- # Optional TLS encryption to ElasticSearch instance
- tls: "off"
- tls_verify: "on"
- # TLS certificate for the Elastic (in PEM format). Use if tls=on and tls_verify=on.
- tls_ca: ""
- # TLS debugging levels = 1-4
- tls_debug: 1
-
+es:
+ endpoint: true
+ ips: {{groups['log-es'] | to_json}}
diff --git a/kubernetes/helm_charts/logging/fluent-bit/.helmignore b/kubernetes/helm_charts/logging/fluent-bit/.helmignore
new file mode 100644
index 000000000..0e8a0eb36
--- /dev/null
+++ b/kubernetes/helm_charts/logging/fluent-bit/.helmignore
@@ -0,0 +1,23 @@
+# Patterns to ignore when building packages.
+# This supports shell glob matching, relative path matching, and
+# negation (prefixed with !). Only one pattern per line.
+.DS_Store
+# Common VCS dirs
+.git/
+.gitignore
+.bzr/
+.bzrignore
+.hg/
+.hgignore
+.svn/
+# Common backup files
+*.swp
+*.bak
+*.tmp
+*.orig
+*~
+# Various IDEs
+.project
+.idea/
+*.tmproj
+.vscode/
diff --git a/kubernetes/helm_charts/logging/fluent-bit/Chart.yaml b/kubernetes/helm_charts/logging/fluent-bit/Chart.yaml
old mode 100755
new mode 100644
index 2aaf9640d..47ff4d0df
--- a/kubernetes/helm_charts/logging/fluent-bit/Chart.yaml
+++ b/kubernetes/helm_charts/logging/fluent-bit/Chart.yaml
@@ -1,21 +1,23 @@
-apiVersion: v1
+apiVersion: v2
name: fluent-bit
-version: 2.8.12
-appVersion: 1.3.7
-description: Fast and Lightweight Log/Data Forwarder for Linux, BSD and OSX
-keywords:
-- logging
-- monitoring
-- fluent
-- fluentd
-sources:
-- https://fluentbit.io
-icon: https://fluentbit.io/assets/img/logo1-default.png
-home: https://fluentbit.io
-maintainers:
-- name: kfox1111
- email: Kevin.Fox@pnnl.gov
-- name: edsiper
- email: eduardo@treasure-data.com
-- name: hectorj2f
- email: hfernandez@mesosphere.com
+description: Fluentbit logging helm
+
+# A chart can be either an 'application' or a 'library' chart.
+#
+# Application charts are a collection of templates that can be packaged into versioned archives
+# to be deployed.
+#
+# Library charts provide useful utilities or functions for the chart developer. They're included as
+# a dependency of application charts to inject those utilities and functions into the rendering
+# pipeline. Library charts do not define any templates and therefore cannot be deployed.
+type: application
+
+# This is the chart version. This version number should be incremented each time you make changes
+# to the chart and its templates, including the app version.
+# Versions are expected to follow Semantic Versioning (https://semver.org/)
+version: 0.1.0
+
+# This is the version number of the application being deployed. This version number should be
+# incremented each time you make changes to the application. Versions are not expected to
+# follow Semantic Versioning. They should reflect the version the application is using.
+appVersion: 1.6.3
diff --git a/kubernetes/helm_charts/logging/fluent-bit/OWNERS b/kubernetes/helm_charts/logging/fluent-bit/OWNERS
deleted file mode 100644
index fa1f0128d..000000000
--- a/kubernetes/helm_charts/logging/fluent-bit/OWNERS
+++ /dev/null
@@ -1,10 +0,0 @@
-approvers:
-- kfox1111
-- edsiper
-- hectorj2f
-- Towmeykaw
-reviewers:
-- kfox1111
-- edsiper
-- hectorj2f
-- Towmeykaw
diff --git a/kubernetes/helm_charts/logging/fluent-bit/README.md b/kubernetes/helm_charts/logging/fluent-bit/README.md
deleted file mode 100644
index 2ece5deed..000000000
--- a/kubernetes/helm_charts/logging/fluent-bit/README.md
+++ /dev/null
@@ -1,191 +0,0 @@
-# Fluent-Bit Chart
-
-[Fluent Bit](http://fluentbit.io/) is an open source and multi-platform Log Forwarder.
-
-## Chart Details
-
-This chart will do the following:
-
-* Install a configmap for Fluent Bit
-* Install a daemonset that provisions Fluent Bit [per-host architecture]
-
-## Installing the Chart
-
-To install the chart with the release name `my-release`:
-
-```bash
-$ helm install --name my-release stable/fluent-bit
-```
-
-When installing this chart on [Minikube](https://kubernetes.io/docs/getting-started-guides/minikube/), it's required to specify that so the DaemonSet will be able to mount the log files properly, make sure to append the _--set on\_minikube=true_ option at the end of the _helm_ command, e.g:
-
-```bash
-$ helm install --name my-release stable/fluent-bit --set on_minikube=true
-```
-
-## Configuration
-
-The following table lists the configurable parameters of the Fluent-Bit chart and the default values.
-
-| Parameter | Description | Default |
-| ----------------------- | ---------------------------------- | ----------------------- |
-| **Backend Selection** |
-| `backend.type` | Set the backend to which Fluent-Bit should flush the information it gathers | `forward` |
-| **Forward Backend** |
-| `backend.forward.host` | Target host where Fluent-Bit or Fluentd are listening for Forward messages | `fluentd` |
-| `backend.forward.port` | TCP Port of the target service | `24284` |
-| `backend.forward.shared_key` | A key string known by the remote Fluentd used for authorization. | `` |
-| `backend.forward.tls` | Enable or disable TLS support | `off` |
-| `backend.forward.tls_verify` | Force certificate validation | `on` |
-| `backend.forward.tls_debug` | Set TLS debug verbosity level. It accept the following values: 0-4 | `1` |
-| **ElasticSearch Backend** |
-| `backend.es.host` | IP address or hostname of the target Elasticsearch instance | `elasticsearch` |
-| `backend.es.port` | TCP port of the target Elasticsearch instance. | `9200` |
-| `backend.es.index` | Elastic Index name | `kubernetes_cluster` |
-| `backend.es.type` | Elastic Type name | `flb_type` |
-| `backend.es.retry_limit` | Max number of retries to attempt (False == no limit) | `False` |
-| `backend.es.time_key` | Elastic Time Key | `@timestamp` |
-| `backend.es.logstash_format` | Enable Logstash format compatibility. | `On` |
-| `backend.es.logstash_prefix` | Index Prefix. If Logstash_Prefix is equal to 'mydata' your index will become 'mydata-YYYY.MM.DD'. | `kubernetes_cluster` |
-| `backend.es.logstash_prefix_key` | Index Prefix key. When included, the value in the record that belongs to the key will be looked up and overwrite `Logstash_Prefix` for index generation. If `Logstash_Prefix_Key` = 'mydata' the index becomes 'mydata-YYYY.MM.DD'. | `` |
-| `backend.es.replace_dots` | Enable/Disable Replace_Dots option. | `On` |
-| `backend.es.http_user` | Optional username credential for Elastic X-Pack access. | `` |
-| `backend.es.http_passwd` | Password for user defined in HTTP_User. | `` |
-| `backend.es.http_passwd_secret` | Secret name for password for user defined in HTTP_User. | `` |
-| `backend.es.http_passwd_secret_key` | Secret key for password for user defined in HTTP_User. | `` |
-| `backend.es.tls` | Enable or disable TLS support | `off` |
-| `backend.es.tls_verify` | Force certificate validation | `on` |
-| `backend.es.tls_secret` | Existing secret storing TLS CA certificate for the Elastic instance. Specify if tls: on. Overrides `backend.es.tls_ca` | `` |
-| `backend.es.tls_secret_ca_key` | Existing secret key storing TLS CA certificate for the Elastic instance. Specify if tls: on. | `` |
-| `backend.es.tls_ca` | TLS CA certificate for the Elastic instance (in PEM format). Specify if tls: on. | `` |
-| `backend.es.tls_debug` | Set TLS debug verbosity level. It accept the following values: 0-4 | `1` |
-| **HTTP Backend** |
-| `backend.http.host` | IP address or hostname of the target HTTP Server | `127.0.0.1` |
-| `backend.http.port` | TCP port of the target HTTP Server | `80` |
-| `backend.http.uri` | Specify an optional HTTP URI for the target web server, e.g: /something | `"/"`
-| `backend.http.http_user` | Optional username credential for Basic Authentication. | `` |
-| `backend.http.http_passwd:` | Password for user defined in HTTP_User. | `` |
-| `backend.http.format` | Specify the data format to be used in the HTTP request body, by default it uses msgpack, optionally it can be set to json. | `msgpack` |
-| `backend.http.json_date_format` | Specify the format of the date. Supported formats are double and iso8601 | `double` |
-| `backend.http.headers` | HTTP Headers | `[]` |
-| `backend.http.tls` | Enable or disable TLS support | `off` |
-| `backend.http.tls_verify` | Force certificate validation | `on` |
-| `backend.http.tls_debug` | Set TLS debug verbosity level. It accept the following values: 0-4 | `1` |
-| **Splunk Backend** |
-| `backend.splunk.host` | IP address or hostname of the target Splunk Server | `127.0.0.1` |
-| `backend.splunk.port` | TCP port of the target Splunk Server | `8088` |
-| `backend.splunk.token` | Specify the Authentication Token for the HTTP Event Collector interface. | `` |
-| `backend.splunk.send_raw` | If enabled, record keys and values are set in the main map. | `off` |
-| `backend.splunk.tls` | Enable or disable TLS support | `on` |
-| `backend.splunk.tls_verify` | Force TLS certificate validation | `off` |
-| `backend.splunk.tls_debug` | Set TLS debug verbosity level. It accept the following values: 0-4 | `1` |
-| `backend.splunk.message_key` | Tag applied to all incoming logs | `kubernetes` |
-| **Stackdriver Backend** |
-| `backend.stackdriver.google_service_credentials` | Contents of a Google Cloud credentials JSON file. | `` |
-| `backend.stackdriver.service_account_email` | Account email associated to the service. Only available if no credentials file has been provided. | `` |
-| `backend.stackdriver.service_account_secret` | Private key content associated with the service account. Only available if no credentials file has been provided. | `` |
-| **Parsers** |
-| `parsers.enabled` | Enable custom parsers | `false` |
-| `parsers.regex` | List of regex parsers | `NULL` |
-| `parsers.json` | List of json parsers | `NULL` |
-| `parsers.logfmt` | List of logfmt parsers | `NULL` |
-| **General** |
-| `annotations` | Optional deamonset set annotations | `NULL` |
-| `audit.enable` | Enable collection of audit logs | `false` |
-| `audit.input.memBufLimit` | Specify Mem_Buf_Limit in tail input | `35mb` |
-| `audit.input.parser` | Specify Parser in tail input | `docker` |
-| `audit.input.tag` | Specify Tag in tail input | `audit.*` |
-| `audit.input.path` | Specify log file(s) through the use of common wildcards | `/var/log/kube-apiserver-audit.log` |
-| `audit.input.bufferChunkSize` | Specify Buffer_Chunk_Size in tail | `2MB` |
-| `audit.input.bufferMaxSize` | Specify Buffer_Max_Size in tail | `10MB` |
-| `audit.input.skipLongLines` | Specify Skip_Long_Lines in tail | `On` |
-| `audit.input.key` | Specify Key in tail | `kubernetes-audit` |
-| `podAnnotations` | Optional pod annotations | `NULL` |
-| `podLabels` | Optional pod labels | `NULL` |
-| `fullConfigMap` | User has provided entire config (parsers + system) | `false` |
-| `existingConfigMap` | ConfigMap override | `` |
-| `extraEntries.input` | Extra entries for existing [INPUT] section | `` |
-| `extraEntries.filter` | Extra entries for existing [FILTER] section | `` |
-| `extraEntries.output` | Extra entries for existing [OUPUT] section | `` |
-| `extraPorts` | List of extra ports | |
-| `extraVolumeMounts` | Mount an extra volume, required to mount ssl certificates when elasticsearch has tls enabled | |
-| `extraVolume` | Extra volume | |
-| `service.flush` | Interval to flush output (seconds) | `1` |
-| `service.logLevel` | Diagnostic level (error/warning/info/debug/trace) | `info` |
-| `filter.enableExclude` | Enable the use of monitoring for a pod annotation of `fluentbit.io/exclude: true`. If present, discard logs from that pod. | `true` |
-| `filter.enableParser` | Enable the use of monitoring for a pod annotation of `fluentbit.io/parser: parser_name`. parser_name must be the name of a parser contained within parsers.conf | `true` |
-| `filter.kubeURL` | Optional custom configmaps | `https://kubernetes.default.svc:443` |
-| `filter.kubeCAFile` | Optional custom configmaps | `/var/run/secrets/kubernetes.io/serviceaccount/ca.crt` |
-| `filter.kubeTokenFile` | Optional custom configmaps | `/var/run/secrets/kubernetes.io/serviceaccount/token` |
-| `filter.kubeTag` | Optional top-level tag for matching in filter | `kube` |
-| `filter.kubeTagPrefix` | Optional tag prefix used by Tail | `kube.var.log.containers.` |
-| `filter.mergeJSONLog` | If the log field content is a JSON string map, append the map fields as part of the log structure | `true` |
-| `filter.mergeLogKey` | If set, append the processed log keys under a new root key specified by this variable. | `nil` |
-| `filter.useJournal` | If true, the filter reads logs coming in Journald format. | `false` |
-| `image.fluent_bit.repository` | Image | `fluent/fluent-bit` |
-| `image.fluent_bit.tag` | Image tag | `1.3.7` |
-| `image.pullPolicy` | Image pull policy | `Always` |
-| `nameOverride` | Override name of app | `nil` |
-| `fullnameOverride` | Override full name of app | `nil` |
-| `image.pullSecrets` | Specify image pull secrets | `nil` |
-| `input.tail.memBufLimit` | Specify Mem_Buf_Limit in tail input | `5MB` |
-| `input.tail.parser` | Specify Parser in tail input. | `docker` |
-| `input.tail.path` | Specify log file(s) through the use of common wildcards. | `/var/log/containers/*.log` |
-| `input.tail.ignore_older` | Ignores files that have been last modified before this time in seconds. Supports m,h,d (minutes, hours,days) syntax. | `` |
-| `input.systemd.enabled` | [Enable systemd input](https://docs.fluentbit.io/manual/input/systemd) | `false` |
-| `input.systemd.filters.systemdUnit` | Please see https://docs.fluentbit.io/manual/input/systemd | `[docker.service, kubelet.service`, `node-problem-detector.service]` |
-| `input.systemd.maxEntries` | Please see https://docs.fluentbit.io/manual/input/systemd | `1000` |
-| `input.systemd.readFromTail` | Please see https://docs.fluentbit.io/manual/input/systemd | `true` |
-| `input.systemd.stripUnderscores` | Please see https://docs.fluentbit.io/manual/input/systemd | `false` |
-| `input.systemd.tag` | Please see https://docs.fluentbit.io/manual/input/systemd | `host.*` |
-| `rbac.create` | Specifies whether RBAC resources should be created. | `true` |
-| `rbac.pspEnabled` | Specifies whether a PodSecurityPolicy should be created. | `false` |
-| `serviceAccount.create` | Specifies whether a ServiceAccount should be created. | `true` |
-| `serviceAccount.name` | The name of the ServiceAccount to use. | `NULL` |
-| `serviceAccount.annotations` | Annotations to add to the service account. | `{}` |
-| `rawConfig` | Raw contents of fluent-bit.conf | `@INCLUDE fluent-bit-service.conf` `@INCLUDE fluent-bit-input.conf` `@INCLUDE fluent-bit-filter.conf` ` @INCLUDE fluent-bit-output.conf` |
-| `resources` | Pod resource requests & limits | `{}` |
-| `securityContext` | [Security settings for a container](https://kubernetes.io/docs/concepts/policy/security-context) | `{}` |
-| `podSecurityContext` | [Security settings for a pod](https://kubernetes.io/docs/concepts/policy/security-context) | `{}` |
-| `hostNetwork` | Use host's network | `false` |
-| `dnsPolicy` | Specifies the dnsPolicy to use | `ClusterFirst` |
-| `priorityClassName` | Specifies the priorityClassName to use | `NULL` |
-| `tolerations` | Optional daemonset tolerations | `NULL` |
-| `nodeSelector` | Node labels for fluent-bit pod assignment | `NULL` |
-| `affinity` | Expressions for affinity | `NULL` |
-| `metrics.enabled` | Specifies whether a service for metrics should be exposed | `false` |
-| `metrics.service.annotations` | Optional metrics service annotations | `NULL` |
-| `metrics.service.labels` | Additional labels for the fluent-bit metrics service definition, specified as a map. | None |
-| `metrics.service.port` | Port on where metrics should be exposed | `2020` |
-| `metrics.service.type` | Service type for metrics | `ClusterIP` |
-| `metrics.serviceMonitor.enabled` | Set this to `true` to create ServiceMonitor for Prometheus operator | `false` |
-| `metrics.serviceMonitor.additionalLabels` | Additional labels that can be used so ServiceMonitor will be discovered by Prometheus | `{}` |
-| `metrics.serviceMonitor.namespace` | Optional namespace in which to create ServiceMonitor | `nil` |
-| `metrics.serviceMonitor.interval` | Scrape interval. If not set, the Prometheus default scrape interval is used | `nil` |
-| `metrics.serviceMonitor.scrapeTimeout` | Scrape timeout. If not set, the Prometheus default scrape timeout is used | `nil` |
-| `trackOffsets` | Specify whether to track the file offsets for tailing docker logs. This allows fluent-bit to pick up where it left after pod restarts but requires access to a `hostPath` | `false` |
-| `testFramework.image` | `test-framework` image repository. | `dduportal/bats` |
-| `testFramework.tag` | `test-framework` image tag. | `0.4.0` |
-
-
-Specify each parameter using the `--set key=value[,key=value]` argument to `helm install`.
-
-Alternatively, a YAML file that specifies the values for the parameters can be provided while installing the chart. For example,
-
-```bash
-$ helm install --name my-release -f values.yaml stable/fluent-bit
-```
-
-> **Tip**: You can use the default [values.yaml](values.yaml)
-
-## Upgrading
-
-### From < 1.0.0 To >= 1.0.0
-
-Values `extraInputs`, `extraFilters` and `extraOutputs` have been removed in version `1.0.0` of the fluent-bit chart.
-To add additional entries to the existing sections, please use the `extraEntries.input`, `extraEntries.filter` and `extraEntries.output` values.
-For entire sections, please use the `rawConfig` value, inserting blocks of text as desired.
-
-### From < 1.8.0 to >= 1.8.0
-
-Version `1.8.0` introduces the use of release name as full name if it contains the chart name(fluent-bit in this case). E.g. with a release name of `fluent-bit`, this renames the DaemonSet from `fluent-bit-fluent-bit` to `fluent-bit`. The suggested approach is to delete the release and reinstall it.
diff --git a/kubernetes/helm_charts/logging/fluent-bit/templates/NOTES.txt b/kubernetes/helm_charts/logging/fluent-bit/templates/NOTES.txt
deleted file mode 100644
index bbfcc0bef..000000000
--- a/kubernetes/helm_charts/logging/fluent-bit/templates/NOTES.txt
+++ /dev/null
@@ -1,15 +0,0 @@
-fluent-bit is now running.
-
-{{- if eq .Values.backend.type "forward" }}
-
-It will forward all container logs to the svc named {{ .Values.backend.forward.host }} on port: {{ .Values.backend.forward.port }}
-{{- else if eq .Values.backend.type "es" }}
-
-It will forward all container logs to the svc named {{ .Values.backend.es.host }} on port: {{ .Values.backend.es.port }}
-{{- else if eq .Values.backend.type "http" }}
-
-It will forward all container logs to the svc named {{ .Values.backend.http.host }} on port: {{ .Values.backend.http.port }}
-{{- else if eq .Values.backend.type "splunk" }}
-
-It will forward all container logs to the svc named {{ .Values.backend.splunk.host }} on port: {{ .Values.backend.splunk.port }}
-{{- end }}
diff --git a/kubernetes/helm_charts/logging/fluent-bit/templates/_helpers.tpl b/kubernetes/helm_charts/logging/fluent-bit/templates/_helpers.tpl
index e9159a050..189773ee5 100644
--- a/kubernetes/helm_charts/logging/fluent-bit/templates/_helpers.tpl
+++ b/kubernetes/helm_charts/logging/fluent-bit/templates/_helpers.tpl
@@ -1,10 +1,9 @@
-{{/* vim: set filetype=mustache: */}}
{{/*
Expand the name of the chart.
*/}}
{{- define "fluent-bit.name" -}}
-{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}}
-{{- end -}}
+{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }}
+{{- end }}
{{/*
Create a default fully qualified app name.
@@ -12,67 +11,52 @@ We truncate at 63 chars because some Kubernetes name fields are limited to this
If release name contains chart name it will be used as a full name.
*/}}
{{- define "fluent-bit.fullname" -}}
-{{- if .Values.fullnameOverride -}}
-{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}}
-{{- else -}}
-{{- $name := default .Chart.Name .Values.nameOverride -}}
-{{- if contains $name .Release.Name -}}
-{{- .Release.Name | trunc 63 | trimSuffix "-" -}}
-{{- else -}}
-{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}}
-{{- end -}}
-{{- end -}}
-{{- end -}}
+{{- if .Values.fullnameOverride }}
+{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }}
+{{- else }}
+{{- $name := default .Chart.Name .Values.nameOverride }}
+{{- if contains $name .Release.Name }}
+{{- .Release.Name | trunc 63 | trimSuffix "-" }}
+{{- else }}
+{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }}
+{{- end }}
+{{- end }}
+{{- end }}
{{/*
Create chart name and version as used by the chart label.
*/}}
{{- define "fluent-bit.chart" -}}
-{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}}
-{{- end -}}
+{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }}
+{{- end }}
{{/*
-Return the appropriate apiVersion for RBAC APIs.
+Common labels
*/}}
-{{- define "rbac.apiVersion" -}}
-{{- if .Capabilities.APIVersions.Has "rbac.authorization.k8s.io/v1" -}}
-rbac.authorization.k8s.io/v1
-{{- else if .Capabilities.APIVersions.Has "rbac.authorization.k8s.io/v1beta1" -}}
-rbac.authorization.k8s.io/v1beta1
-{{- else -}}
-rbac.authorization.k8s.io/v1alpha1
-{{- end -}}
-{{- end -}}
+{{- define "fluent-bit.labels" -}}
+helm.sh/chart: {{ include "fluent-bit.chart" . }}
+{{ include "fluent-bit.selectorLabels" . }}
+{{- if .Chart.AppVersion }}
+app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
+{{- end }}
+app.kubernetes.io/managed-by: {{ .Release.Service }}
+{{- end }}
{{/*
-Create the name of the service account to use
+Selector labels
*/}}
-{{- define "fluent-bit.serviceAccountName" -}}
-{{- if .Values.serviceAccount.create -}}
- {{ default (include "fluent-bit.fullname" .) .Values.serviceAccount.name }}
-{{- else -}}
- {{ default "default" .Values.serviceAccount.name }}
-{{- end -}}
-{{- end -}}
+{{- define "fluent-bit.selectorLabels" -}}
+app.kubernetes.io/name: {{ include "fluent-bit.name" . }}
+app.kubernetes.io/instance: {{ .Release.Name }}
+{{- end }}
{{/*
-Return the appropriate apiGroup for PodSecurityPolicy.
-*/}}
-{{- define "rbac.pspApiGroup" -}}
-{{- if semverCompare "<1.14-0" .Capabilities.KubeVersion.GitVersion -}}
-{{- print "extensions" -}}
-{{- else if semverCompare ">=1.14-0" .Capabilities.KubeVersion.GitVersion -}}
-{{- print "policy" -}}
-{{- end -}}
-{{- end -}}
-
-{{/*
-Return the appropriate apiVersion for DaemonSet.
+Create the name of the service account to use
*/}}
-{{- define "daemonSet.apiVersion" -}}
-{{- if semverCompare "<1.9-0" .Capabilities.KubeVersion.GitVersion -}}
-{{- print "extensions/v1beta1" -}}
-{{- else -}}
-{{- print "apps/v1" -}}
-{{- end -}}
-{{- end -}}
+{{- define "fluent-bit.serviceAccountName" -}}
+{{- if .Values.serviceAccount.create }}
+{{- default (include "fluent-bit.fullname" .) .Values.serviceAccount.name }}
+{{- else }}
+{{- default "default" .Values.serviceAccount.name }}
+{{- end }}
+{{- end }}
diff --git a/kubernetes/helm_charts/logging/fluent-bit/templates/cluster-role.yaml b/kubernetes/helm_charts/logging/fluent-bit/templates/cluster-role.yaml
deleted file mode 100644
index 69c79891d..000000000
--- a/kubernetes/helm_charts/logging/fluent-bit/templates/cluster-role.yaml
+++ /dev/null
@@ -1,28 +0,0 @@
-{{- if .Values.rbac.create -}}
-apiVersion: {{ template "rbac.apiVersion" . }}
-kind: ClusterRole
-metadata:
- labels:
- app: {{ template "fluent-bit.name" . }}
- chart: {{ .Chart.Name }}-{{ .Chart.Version }}
- heritage: {{ .Release.Service }}
- release: {{ .Release.Name }}
- name: {{ template "fluent-bit.fullname" . }}
-rules:
- - apiGroups:
- - ""
- resources:
- - pods
- verbs:
- - get
-{{- if .Values.rbac.pspEnabled }}
- - apiGroups:
- - {{ template "rbac.pspApiGroup" . }}
- resources:
- - podsecuritypolicies
- resourceNames:
- - {{ template "fluent-bit.fullname" . }}
- verbs:
- - use
-{{- end }}
-{{- end -}}
diff --git a/kubernetes/helm_charts/logging/fluent-bit/templates/cluster-rolebinding.yaml b/kubernetes/helm_charts/logging/fluent-bit/templates/cluster-rolebinding.yaml
deleted file mode 100644
index 140e5279b..000000000
--- a/kubernetes/helm_charts/logging/fluent-bit/templates/cluster-rolebinding.yaml
+++ /dev/null
@@ -1,19 +0,0 @@
-{{- if .Values.rbac.create -}}
-apiVersion: {{ template "rbac.apiVersion" . }}
-kind: ClusterRoleBinding
-metadata:
- labels:
- app: {{ template "fluent-bit.name" . }}
- chart: {{ .Chart.Name }}-{{ .Chart.Version }}
- heritage: {{ .Release.Service }}
- release: {{ .Release.Name }}
- name: {{ template "fluent-bit.fullname" . }}
-roleRef:
- apiGroup: rbac.authorization.k8s.io
- kind: ClusterRole
- name: {{ template "fluent-bit.fullname" . }}
-subjects:
- - kind: ServiceAccount
- name: {{ template "fluent-bit.serviceAccountName" . }}
- namespace: {{ .Release.Namespace }}
-{{- end -}}
diff --git a/kubernetes/helm_charts/logging/fluent-bit/templates/config.yaml b/kubernetes/helm_charts/logging/fluent-bit/templates/config.yaml
deleted file mode 100644
index 37bba568f..000000000
--- a/kubernetes/helm_charts/logging/fluent-bit/templates/config.yaml
+++ /dev/null
@@ -1,271 +0,0 @@
-{{- if (empty .Values.existingConfigMap) -}}
-apiVersion: v1
-kind: ConfigMap
-metadata:
- name: {{ template "fluent-bit.fullname" . }}-config
- labels:
- app: {{ template "fluent-bit.name" . }}
- chart: {{ .Chart.Name }}-{{ .Chart.Version }}
- heritage: {{ .Release.Service }}
- release: {{ .Release.Name }}
-data:
- fluent-bit-service.conf: |
- [SERVICE]
- Flush {{ .Values.service.flush }}
- Daemon Off
- Log_Level {{ .Values.service.logLevel }}
- Parsers_File parsers.conf
-{{- if .Values.parsers.enabled }}
- Parsers_File parsers_custom.conf
-{{- end }}
-{{- if .Values.metrics.enabled }}
- HTTP_Server On
- HTTP_Listen 0.0.0.0
- HTTP_Port 2020
-{{- end }}
-
- fluent-bit-input.conf: |
- [INPUT]
- Name tail
- Path {{ .Values.input.tail.path }}
- Parser {{ .Values.input.tail.parser }}
- Tag {{ .Values.filter.kubeTag }}.*
- Refresh_Interval 5
- Mem_Buf_Limit {{ .Values.input.tail.memBufLimit }}
- Skip_Long_Lines On
-{{- if .Values.input.tail.ignore_older }}
- Ignore_Older {{ .Values.input.tail.ignore_older }}
-{{- end }}
-{{- if .Values.trackOffsets }}
- DB /tail-db/tail-containers-state.db
- DB.Sync Normal
-{{- end }}
-{{- if .Values.input.systemd.enabled }}
- [INPUT]
- Name systemd
- Tag {{ .Values.input.systemd.tag }}
-{{- range $value := .Values.input.systemd.filters.systemdUnit }}
- Systemd_Filter _SYSTEMD_UNIT={{ $value }}
-{{- end }}
- Max_Entries {{ .Values.input.systemd.maxEntries }}
- Read_From_Tail {{ .Values.input.systemd.readFromTail }}
- Strip_Underscores {{ .Values.input.systemd.stripUnderscores }}
-{{- end }}
-{{ .Values.extraEntries.input | indent 8 }}
-
-{{- if .Values.audit.enable }}
- [INPUT]
- Name tail
- Path {{ .Values.audit.input.path }}
- Parser {{ .Values.audit.input.parser }}
- DB /var/log/audit.db
- Tag {{ .Values.audit.input.tag }}
- Refresh_Interval 5
- Mem_Buf_Limit {{ .Values.audit.input.memBufLimit }}
- Buffer_Chunk_Size {{ .Values.audit.input.bufferChunkSize }}
- Buffer_Max_Size {{ .Values.audit.input.bufferMaxSize }}
- Skip_Long_Lines {{ .Values.audit.input.skipLongLines}}
- Key {{ .Values.audit.input.key}}
-{{ .Values.extraEntries.audit | indent 8 }}
-{{- end }}
-
- fluent-bit-filter.conf: |
- [FILTER]
- Name kubernetes
- Match {{ .Values.filter.kubeTag }}.*
- Kube_Tag_Prefix {{ .Values.filter.kubeTagPrefix }}
- Kube_URL {{ .Values.filter.kubeURL }}
- Kube_CA_File {{ .Values.filter.kubeCAFile }}
- Kube_Token_File {{ .Values.filter.kubeTokenFile }}
-{{- if .Values.filter.mergeJSONLog }}
- Merge_Log On
-{{- end }}
-
-{{- if .Values.filter.mergeLogKey }}
- Merge_Log_Key {{ .Values.filter.mergeLogKey }}
-{{- end }}
-
-{{- if .Values.filter.enableParser }}
- K8S-Logging.Parser On
-{{- end }}
-{{- if .Values.filter.enableExclude }}
- K8S-Logging.Exclude On
-{{- end }}
-{{- if .Values.filter.useJournal }}
- Use_Journal On
-{{- end }}
-{{ .Values.extraEntries.filter | indent 8 }}
-
- fluent-bit-output.conf: |
-{{ if eq .Values.backend.type "test" }}
- [OUTPUT]
- Name file
- Match *
- Path /tmp/fluent-bit.log
-{{ else if eq .Values.backend.type "forward" }}
- [OUTPUT]
- Name forward
- Match *
- Host {{ .Values.backend.forward.host }}
- Port {{ .Values.backend.forward.port }}
- Retry_Limit False
-{{- if .Values.backend.forward.shared_key }}
- Shared_Key {{ .Values.backend.forward.shared_key }}
-{{- end }}
-{{- if .Values.backend.forward.tls }}
- tls {{ .Values.backend.forward.tls }}
-{{- end }}
-{{- if .Values.backend.forward.tls_verify }}
- tls.verify {{ .Values.backend.forward.tls_verify }}
-{{- end }}
-{{- if .Values.backend.forward.tls_debug }}
- tls.debug {{ .Values.backend.forward.tls_debug }}
-{{- end }}
-{{ else if eq .Values.backend.type "es" }}
- [OUTPUT]
- Name es
- Match *
- Host {{ .Values.backend.es.host }}
- Port {{ .Values.backend.es.port }}
- Logstash_Format {{ default "On" .Values.backend.es.logstash_format }}
- Retry_Limit {{ .Values.backend.es.retry_limit }}
- Type {{ .Values.backend.es.type }}
-{{- if .Values.backend.es.time_key }}
- Time_Key {{ .Values.backend.es.time_key }}
-{{- end }}
-{{- if .Values.backend.es.replace_dots }}
- Replace_Dots {{ .Values.backend.es.replace_dots }}
-{{- end }}
-{{- if .Values.backend.es.logstash_prefix }}
- Logstash_Prefix {{ .Values.backend.es.logstash_prefix }}
-{{- if .Values.backend.es.logstash_prefix_key }}
- Logstash_Prefix_Key {{ .Values.backend.es.logstash_prefix_key }}
-{{- end }}
-{{ else if .Values.backend.es.index }}
- Index {{ .Values.backend.es.index }}
-{{- end }}
-{{- if .Values.backend.es.http_user }}
- HTTP_User {{ .Values.backend.es.http_user }}
-{{- if .Values.backend.es.http_passwd }}
- HTTP_Passwd {{ .Values.backend.es.http_passwd }}
-{{- else }}
- HTTP_Passwd ${HTTP_PASSWORD}
-{{- end }}
-{{- end }}
-{{if eq .Values.backend.es.tls "on" }}
- tls {{ .Values.backend.es.tls }}
- tls.verify {{ .Values.backend.es.tls_verify }}
- tls.debug {{ .Values.backend.es.tls_debug }}
-{{- if .Values.backend.es.tls_ca }}
- tls.ca_file /secure/es-tls-ca.crt
-{{- end }}
-{{- end }}
-{{ else if eq .Values.backend.type "splunk" }}
- [OUTPUT]
- Name splunk
- Match *
- Host {{ .Values.backend.splunk.host }}
- Port {{ .Values.backend.splunk.port }}
- Splunk_Token {{ .Values.backend.splunk.token }}
- Splunk_Send_Raw {{ .Values.backend.splunk.send_raw}}
- TLS {{ .Values.backend.splunk.tls }}
- TLS.Verify {{ .Values.backend.splunk.tls_verify }}
- tls.debug {{ .Values.backend.splunk.tls_debug }}
- Message_Key {{ .Values.backend.splunk.message_key }}
-{{ else if eq .Values.backend.type "stackdriver" }}
- [OUTPUT]
- Name stackdriver
- Match *
- resource global
-{{- if .Values.backend.stackdriver.google_service_credentials }}
- google_service_credentials /secure/google_service_credentials.json
-{{- else }}
- service_account_email {{ .Values.backend.stackdriver.service_account_email }}
- service_account_secret {{ .Values.backend.stackdriver.service_account_secret }}
-{{- end }}
-{{ else if eq .Values.backend.type "http" }}
- [OUTPUT]
- Name http
- Match *
- Host {{ .Values.backend.http.host }}
- Port {{ .Values.backend.http.port }}
- URI {{ .Values.backend.http.uri }}
-{{- if .Values.backend.http.http_user }}
- HTTP_User {{ .Values.backend.http.http_user }}
- HTTP_Passwd {{ .Values.backend.http.http_passwd }}
-{{- end }}
- tls {{ .Values.backend.http.tls }}
- tls.verify {{ .Values.backend.http.tls_verify }}
- tls.debug {{ .Values.backend.http.tls_debug }}
-{{- if .Values.backend.http.proxy }}
- Proxy {{ .Values.backend.http.proxy }}
-{{- end }}
- Format {{ .Values.backend.http.format }}
-{{- end }}
-{{- if .Values.backend.http.json_date_format }}
- json_date_format {{ .Values.backend.http.json_date_format }}
-{{- end }}
-{{- range .Values.backend.http.headers }}
- Header {{ . }}
-{{- end }}
-{{ .Values.extraEntries.output | indent 8 }}
-
-
- fluent-bit.conf: |
-{{ .Values.rawConfig | indent 4 }}
-
- parsers.conf: |
-{{- if .Values.parsers.regex }}
-{{- range .Values.parsers.regex }}
- [PARSER]
- Name {{ .name }}
- Format regex
- Regex {{ .regex }}
-{{- if .timeKey }}
- Time_Key {{ .timeKey }}
-{{- end }}
-{{- if .timeFormat }}
- Time_Format {{ .timeFormat }}
-{{- end }}
-{{ end }}
-{{- end }}
-{{- if .Values.parsers.json }}
-{{- range .Values.parsers.json }}
- [PARSER]
- Name {{ .name }}
- Format json
-{{- if .timeKeep }}
- Time_Keep {{ .timeKeep }}
-{{- end }}
-{{- if .timeKey }}
- Time_Key {{ .timeKey }}
-{{- end }}
-{{- if .timeFormat }}
- Time_Format {{ .timeFormat }}
-{{- end }}
-{{- if .decodeFieldAs }}
- Decode_Field_As {{ .decodeFieldAs }} {{ .decodeField | default "log" }}
-{{- end}}
-{{- if .extraEntries }}
-{{ .extraEntries | indent 8 }}
-{{- end }}
-{{ end }}
-{{- end }}
-{{- if .Values.parsers.logfmt }}
-{{- range .Values.parsers.logfmt }}
- [PARSER]
- Name {{ .name }}
- Format logfmt
-{{- if .timeKey }}
- Time_Key {{ .timeKey }}
-{{- end }}
-{{- if .timeFormat }}
- Time_Format {{ .timeFormat }}
-{{- end }}
-{{- if .extraEntries }}
-{{ .extraEntries | indent 8 }}
-{{- end }}
-{{ end }}
-{{- end }}
-
-{{- end -}}
diff --git a/kubernetes/helm_charts/logging/fluent-bit/templates/configMap.yaml b/kubernetes/helm_charts/logging/fluent-bit/templates/configMap.yaml
new file mode 100644
index 000000000..010761e6e
--- /dev/null
+++ b/kubernetes/helm_charts/logging/fluent-bit/templates/configMap.yaml
@@ -0,0 +1,166 @@
+---
+apiVersion: v1
+data:
+ filter-kubernetes.conf: |
+ [FILTER]
+ Name kubernetes
+ Match kube.*
+ Kube_URL https://kubernetes.default.svc:443
+ Kube_CA_File /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
+ Kube_Token_File /var/run/secrets/kubernetes.io/serviceaccount/token
+ Kube_Tag_Prefix kube.var.log.containers.
+ # Merge application log to kubernetes structure
+ Merge_Log On
+ # Disabling merge key as all the fileds will be in the root
+ # Else all merged content will be under
+ # log_processed:
+ # {
+ # }
+ # Merge_Log_Key log_processed
+ #
+ # Adding custom parsor not to do any json parse
+ Merge_Parser catchall
+ # Don't need merged logs
+ # More over, we're using custom parser, which catch all and tag it as log
+ Keep_Log Off
+ # Annotate pod to select the parser
+ # annotaions:
+ # fluentbit.io/parsers: nginx2
+ K8S-Logging.Parser On
+ # Disable fluent-bit from parsing logs
+ # annotaions:
+ # fluentbit.io/exclude: true
+ K8S-Logging.Exclude On
+ [FILTER]
+ # Discard all health debug and info logs
+ Name grep
+ Match kube.*
+ exclude message /^.*(?:debug|info|GET (\/service)?\/health).*$
+
+ fluent-bit.conf: |
+ [SERVICE]
+ Flush 1
+ Log_Level WARNING
+ Daemon off
+ Parsers_File parsers.conf
+ HTTP_Server On
+ HTTP_Listen 0.0.0.0
+ HTTP_Port 2020
+ storage.path /mnt/log/flb-storage/
+ storage.sync normal
+ storage.checksum off
+ storage.backlog.mem_limit 120M
+ # How many chunks from file system, which is in que to flush to es, has to be in memory(warm)
+ storage.max_chunks_up 50
+
+ @INCLUDE input-kubernetes.conf
+ @INCLUDE filter-kubernetes.conf
+ @INCLUDE output-elasticsearch.conf
+ input-kubernetes.conf: |
+ [INPUT]
+ Name tail
+ Tag kube.*
+ Path /var/log/containers/*.log
+ Parser docker
+ DB /mnt/log/flb_kube.db
+ Mem_Buf_Limit 120MB
+ # Set the initial buffer size to read files data.
+ # This value is used too to increase buffer size.
+ Buffer_Chunk_Size 256k
+ # Set the limit of the buffer size per monitored file.
+ # When a buffer needs to be increased (e.g: very long lines),
+ # this value is used to restrict how much the memory buffer can grow.
+ # If reading a file exceed this limit, the file is removed from the monitored file list
+ Buffer_Max_Size 512k
+ Skip_Long_Lines On
+ Refresh_Interval 1
+ storage.type filesystem
+ # Ignore older logs of 30m
+ Ignore_Older 30m
+ output-elasticsearch.conf: |
+ [OUTPUT]
+ Name es
+ Match *
+ Host ${FLUENT_ELASTICSEARCH_HOST}
+ Port ${FLUENT_ELASTICSEARCH_PORT}
+ Logstash_Format On
+ Replace_Dots On
+ Retry_Limit 10
+ Type _doc
+ # Networking Setup
+ net.connect_timeout 10
+ # net.source_address 127.0.0.1
+ net.keepalive on
+ net.keepalive_idle_timeout 100
+ net.keepalive_max_recycle 200
+ #
+ # Limit the maximum number of Chunks in the filesystem for the current output logical destination.
+ # After this LRU will kick in; that means LeastRecentlyUsed will get deleted
+ # 1 chunk =~ 2MB
+ # This config has some issues; see https://github.com/fluent/fluent-bit/issues/2688
+ storage.total_limit_size 20G
+ parsers.conf: |
+ [PARSER]
+ Name apache
+ Format regex
+ Regex ^(?[^ ]*) [^ ]* (?[^ ]*) \[(?[^\]]*)\] "(?\S+)(?: +(?[^\"]*?)(?: +\S*)?)?" (?[^ ]*) (?[^ ]*)(?: "(?[^\"]*)" "(?[^\"]*)")?$
+ Time_Key time
+ Time_Format %d/%b/%Y:%H:%M:%S %z
+
+ [PARSER]
+ Name apache2
+ Format regex
+ Regex ^(?[^ ]*) [^ ]* (?[^ ]*) \[(?[^\]]*)\] "(?\S+)(?: +(?[^ ]*) +\S*)?" (?[^ ]*) (?[^ ]*)(?: "(?[^\"]*)" "(?[^\"]*)")?$
+ Time_Key time
+ Time_Format %d/%b/%Y:%H:%M:%S %z
+
+ [PARSER]
+ Name apache_error
+ Format regex
+ Regex ^\[[^ ]* (?[^\]]*)\] \[(?[^\]]*)\](?: \[pid (?[^\]]*)\])?( \[client (?[^\]]*)\])? (?.*)$
+
+ [PARSER]
+ Name nginx
+ Format regex
+ Regex ^(?[^ ]*) (?[^ ]*) (?[^ ]*) \[(?[^\]]*)\] "(?\S+)(?: +(?[^\"]*?)(?: +\S*)?)?" (?[^ ]*) (?[^ ]*)(?: "(?[^\"]*)" "(?[^\"]*)")?$
+ Time_Key time
+ Time_Format %d/%b/%Y:%H:%M:%S %z
+
+ [PARSER]
+ Name json
+ Format json
+ Time_Key time
+ Time_Format %d/%b/%Y:%H:%M:%S %z
+
+ [PARSER]
+ Name docker
+ Format json
+ Time_Key time
+ Time_Format %Y-%m-%dT%H:%M:%S.%L
+ Time_Keep On
+ [PARSER]
+ Name nginx2
+ Format regex
+ # https://rubular.com/r/ZSLRpLS1B4XFbC
+ Regex ^(?[^ ]*) (?[^ ]*) (?[^ ]*) \[(?[^\]]*)\] "(?\S+)(?: +(?[^\"]*?)(?: +\S*)?)?" (?[^ ]*) (?[^ ]*) (?[^ ]*) (?[^ ]+) (?[^ ]+) (?\.*) (?:"(?[^\"]*)" "(?[^\"]*)") "(?[^\"]*)" "(?[^\"]*)" "(?[^\"]*)" "(?[^\"]*)" "(?[^\"]*)" "(?[^\"]*)"
+ Time_Key time
+ Types n_rstime:float n_rqtime:float n_rssize:integer n_rqsize:integer
+ Time_Format %d/%b/%Y:%H:%M:%S %z
+
+ [PARSER]
+ Name syslog
+ Format regex
+ Regex ^\<(?[0-9]+)\>(?[^ ]* {1,2}[^ ]* [^ ]*) (?[^ ]*) (?[a-zA-Z0-9_\/\.\-]*)(?:\[(?[0-9]+)\])?(?:[^\:]*\:)? *(?.*)$
+ Time_Key time
+ Time_Format %b %d %H:%M:%S
+ [PARSER]
+ Name catchall
+ Format regex
+ Regex ^(?.*)$
+
+kind: ConfigMap
+metadata:
+ name: fluent-bit-config
+ namespace: {{ default .Values.namespace .Release.Namespace }}
+ labels:
+{{- include "fluent-bit.labels" . | nindent 4 }}
diff --git a/kubernetes/helm_charts/logging/fluent-bit/templates/daemonset.yaml b/kubernetes/helm_charts/logging/fluent-bit/templates/daemonset.yaml
index 2eddf468c..0a5b093d8 100644
--- a/kubernetes/helm_charts/logging/fluent-bit/templates/daemonset.yaml
+++ b/kubernetes/helm_charts/logging/fluent-bit/templates/daemonset.yaml
@@ -1,192 +1,82 @@
-apiVersion: {{ template "daemonSet.apiVersion" . }}
+---
+apiVersion: apps/v1
kind: DaemonSet
metadata:
- name: {{ template "fluent-bit.fullname" . }}
+ name: fluent-bit
+ namespace: {{ default .Values.namespace .Release.Namespace }}
labels:
- app: {{ template "fluent-bit.name" . }}
- chart: {{ .Chart.Name }}-{{ .Chart.Version }}
- heritage: {{ .Release.Service }}
- release: {{ .Release.Name }}
+ k8s-app: fluent-bit-logging
+ version: v1
+ kubernetes.io/cluster-service: "true"
+ {{- include "fluent-bit.labels" . | nindent 4 }}
spec:
selector:
matchLabels:
- app: {{ template "fluent-bit.name" . }}
- release: {{ .Release.Name }}
-{{- if .Values.podLabels }}
-{{ toYaml .Values.podLabels | indent 6 }}
-{{- end }}
+ k8s-app: fluent-bit-logging
+ version: v1
+ kubernetes.io/cluster-service: "true"
+ {{- include "fluent-bit.labels" . | nindent 6 }}
updateStrategy:
type: RollingUpdate
+ rollingUpdate:
+ maxUnavailable: 25%
template:
metadata:
labels:
- app: {{ template "fluent-bit.name" . }}
- release: {{ .Release.Name }}
-{{- if .Values.podLabels }}
-{{ toYaml .Values.podLabels | indent 8 }}
-{{- end }}
+ k8s-app: fluent-bit-logging
+ version: v1
+ kubernetes.io/cluster-service: "true"
+{{- include "fluent-bit.labels" . | nindent 8 }}
annotations:
- checksum/config: {{ include (print $.Template.BasePath "/config.yaml") . | sha256sum }}
-{{- if .Values.podAnnotations }}
-{{ toYaml .Values.podAnnotations | indent 8 }}
-{{- end }}
+ fluent-bitRolloutID: {{ randAlphaNum 5 | quote }} # Restart fluent-bit after every deployment
+ fleuntbit.io/exlude: "true"
spec:
-{{- if .Values.podSecurityContext }}
- securityContext:
-{{ toYaml .Values.podSecurityContext | indent 8 }}
-{{- end }}
-{{- if .Values.priorityClassName }}
- priorityClassName: "{{ .Values.priorityClassName }}"
-{{- end }}
-{{- if .Values.image.pullSecrets }}
+{{- if .Values.imagepullsecrets }}
imagePullSecrets:
-{{ toYaml .Values.image.pullSecrets | indent 8 }}
+ - name: {{ .Values.imagepullsecrets }}
{{- end }}
- hostNetwork: {{ .Values.hostNetwork }}
- dnsPolicy: {{ .Values.dnsPolicy }}
- serviceAccountName: {{ template "fluent-bit.serviceAccountName" . }}
containers:
- name: fluent-bit
- image: "{{ .Values.image.fluent_bit.repository }}:{{ .Values.image.fluent_bit.tag }}"
- imagePullPolicy: "{{ .Values.image.pullPolicy }}"
- env:
-{{- if .Values.backend.es.http_passwd_secret }}
- - name: HTTP_PASSWORD
- valueFrom:
- secretKeyRef:
- name: {{ .Values.backend.es.http_passwd_secret }}
- key: {{ .Values.backend.es.http_passwd_secret_key }}
-{{- end }}
-{{- /* Only render empty array when no HTTP_PASSWORD */ -}}
-{{- if or .Values.env (not .Values.backend.es.http_passwd_secret) }}
-{{ toYaml .Values.env | indent 10 }}
-{{- end }}
- resources:
-{{ toYaml .Values.resources | indent 10 }}
-{{- if or .Values.metrics.enabled .Values.extraPorts }}
+ image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
+ imagePullPolicy: Always
ports:
-{{- if .Values.metrics.enabled }}
- - name: metrics
- containerPort: 2020
- protocol: TCP
-{{- end -}}
-{{- if .Values.extraPorts }}
-{{ toYaml .Values.extraPorts | indent 8 }}
-{{- end }}
-{{- end }}
-{{- if .Values.securityContext }}
- securityContext:
-{{ toYaml .Values.securityContext | indent 10 }}
-{{- end }}
+ - containerPort: 2020
+ name: http-metrics
+ env:
+ - name: FLUENT_ELASTICSEARCH_HOST
+ value: "{{ .Values.es_host }}"
+ - name: FLUENT_ELASTICSEARCH_PORT
+ value: "{{ .Values.es_port }}"
volumeMounts:
+ - mountPath: /mnt/log
+ name: datapath
- name: varlog
mountPath: /var/log
- name: varlibdockercontainers
mountPath: /var/lib/docker/containers
readOnly: true
- {{- if .Values.input.systemd.enabled }}
- - name: etcmachineid
- mountPath: /etc/machine-id
- readOnly: true
- {{- end }}
-{{- if .Values.fullConfigMap }}
- - name: config
- mountPath: /fluent-bit/etc
-{{- else }}
- - name: config
- mountPath: /fluent-bit/etc/fluent-bit.conf
- subPath: fluent-bit.conf
- - name: config
- mountPath: /fluent-bit/etc/fluent-bit-service.conf
- subPath: fluent-bit-service.conf
- - name: config
- mountPath: /fluent-bit/etc/fluent-bit-input.conf
- subPath: fluent-bit-input.conf
- - name: config
- mountPath: /fluent-bit/etc/fluent-bit-filter.conf
- subPath: fluent-bit-filter.conf
- - name: config
- mountPath: /fluent-bit/etc/fluent-bit-output.conf
- subPath: fluent-bit-output.conf
-
-{{- if .Values.parsers.enabled }}
- - name: config
- mountPath: /fluent-bit/etc/parsers_custom.conf
- subPath: parsers.conf
-{{- end }}
-{{- end }}
-{{- if and .Values.backend.type "stackdriver" .Values.backend.stackdriver.google_service_credentials }}
- - name: gcp-stackdriver-secret
- mountPath: /secure/google_service_credentials.json
- subPath: google_service_credentials.json
-{{- end }}
-{{- if or .Values.backend.es.tls_ca .Values.backend.es.tls_secret }}
- - name: es-tls-secret
- mountPath: /secure/es-tls-ca.crt
- subPath: {{ .Values.backend.es.tls_secret_ca_key | default "es-tls-ca.crt" | quote }}
-{{- end }}
-{{- if .Values.trackOffsets }}
- - name: tail-db
- mountPath: /tail-db
-{{- end }}
-{{- if .Values.extraVolumeMounts }}
-{{ toYaml .Values.extraVolumeMounts | indent 8 }}
-{{- end }}
-{{ if .Values.on_minikube }}
- - name: mnt
- mountPath: /mnt
- readOnly: true
-{{ end }}
+ - name: fluent-bit-config
+ mountPath: /fluent-bit/etc/
terminationGracePeriodSeconds: 10
- {{- if .Values.nodeSelector }}
- nodeSelector:
-{{ toYaml .Values.nodeSelector | indent 8 }}
- {{- end }}
- {{ if .Values.affinity }}
- affinity:
-{{ toYaml .Values.affinity | indent 8 }}
- {{- end }}
- {{- if .Values.tolerations }}
- tolerations:
-{{ toYaml .Values.tolerations | indent 8 }}
- {{- end }}
volumes:
+ - name: datapath
+ hostPath:
+ path: /mnt/log
- name: varlog
hostPath:
path: /var/log
- name: varlibdockercontainers
hostPath:
path: /var/lib/docker/containers
- {{- if .Values.input.systemd.enabled }}
- - name: etcmachineid
- hostPath:
- path: /etc/machine-id
- type: File
- {{- end }}
-{{- if or .Values.backend.es.tls_ca .Values.backend.es.tls_secret }}
- - name: es-tls-secret
- secret:
- secretName: {{ .Values.backend.es.tls_secret | default ( print ( include "fluent-bit.fullname" . ) "-es-tls-secret" ) | quote }}
-{{- end }}
-{{- if and .Values.backend.type "stackdriver" .Values.backend.stackdriver.google_service_credentials }}
- - name: gcp-stackdriver-secret
- secret:
- secretName: "{{ template "fluent-bit.fullname" . }}-gcp-stackdriver-secret"
-{{- end }}
-{{- if .Values.trackOffsets }}
- - name: tail-db
- hostPath:
- path: {{ .Values.taildb.directory }}
- type: DirectoryOrCreate
-{{- end }}
- - name: config
+ - name: fluent-bit-config
configMap:
- name: {{ if .Values.existingConfigMap }}{{ .Values.existingConfigMap }}{{- else }}{{ template "fluent-bit.fullname" . }}-config{{- end }}
-{{- if .Values.extraVolumes }}
-{{ toYaml .Values.extraVolumes | indent 6 }}
-{{- end }}
-{{ if .Values.on_minikube }}
- - name: mnt
- hostPath:
- path: /mnt
-{{ end }}
+ name: fluent-bit-config
+ serviceAccountName: fluent-bit
+ tolerations:
+ - key: node-role.kubernetes.io/master
+ operator: Exists
+ effect: NoSchedule
+ - operator: "Exists"
+ effect: "NoExecute"
+ - operator: "Exists"
+ effect: "NoSchedule"
diff --git a/kubernetes/helm_charts/logging/fluent-bit/templates/endpoint.yaml b/kubernetes/helm_charts/logging/fluent-bit/templates/endpoint.yaml
new file mode 100644
index 000000000..3502e6a2b
--- /dev/null
+++ b/kubernetes/helm_charts/logging/fluent-bit/templates/endpoint.yaml
@@ -0,0 +1,27 @@
+{{- if .Values.es.endpoint }}
+---
+kind: Service
+apiVersion: v1
+metadata:
+ name: log-es
+ namespace: {{ default .Values.namespace .Release.Namespace }}
+spec:
+ type: ClusterIP
+ ports:
+ - port: {{.Values.es_port}}
+ targetPort: {{.Values.es_port}}
+---
+kind: Endpoints
+apiVersion: v1
+metadata:
+ name: log-es
+ namespace: {{ default .Values.namespace .Release.Namespace }}
+spec:
+subsets:
+- addresses:
+{{- range $ip := .Values.es.ips }}
+ - ip: {{ $ip }}
+{{- end}}
+ ports:
+ - port: {{.Values.es_port}}
+{{- end }}
diff --git a/kubernetes/helm_charts/logging/fluent-bit/templates/psp.yaml b/kubernetes/helm_charts/logging/fluent-bit/templates/psp.yaml
deleted file mode 100644
index 67065b660..000000000
--- a/kubernetes/helm_charts/logging/fluent-bit/templates/psp.yaml
+++ /dev/null
@@ -1,60 +0,0 @@
-{{- if .Values.rbac.pspEnabled }}
-apiVersion: policy/v1beta1
-kind: PodSecurityPolicy
-metadata:
- name: {{ template "fluent-bit.fullname" . }}
-spec:
- # Prevents running in privileged mode
- privileged: false
- # Required to prevent escalations to root.
- allowPrivilegeEscalation: false
- # This is redundant with non-root + disallow privilege escalation,
- # but we can provide it for defense in depth.
- requiredDropCapabilities:
- - ALL
- volumes:
- - 'configMap'
- - 'secret'
- - 'hostPath'
- allowedHostPaths:
- - pathPrefix: "/var/log"
- - pathPrefix: "/var/lib/docker/containers"
- readOnly: true
-{{- if .Values.input.systemd.enabled }}
- - pathPrefix: "/etc/machine-id"
- readOnly: true
-{{- end }}
- - pathPrefix: "/fluent-bit/etc"
-{{- if .Values.trackOffsets }}
- - pathPrefix: {{ .Values.taildb.directory }}
-{{- end }}
-{{- if .Values.on_minikube }}
- - pathPrefix: "/mnt"
-{{- end }}
-{{- range .Values.extraVolumes }}
- {{- if .hostPath }}
- - pathPrefix: {{ .hostPath.path }}
- {{- end }}
-{{- end }}
- hostNetwork: {{ .Values.hostNetwork }}
- hostIPC: false
- hostPID: false
- runAsUser:
- rule: 'RunAsAny'
- seLinux:
- # This policy assumes the nodes are using AppArmor rather than SELinux.
- rule: 'RunAsAny'
- supplementalGroups:
- rule: 'MustRunAs'
- ranges:
- # Forbid adding the root group.
- - min: 1
- max: 65535
- fsGroup:
- rule: 'MustRunAs'
- ranges:
- # Forbid adding the root group.
- - min: 1
- max: 65535
- readOnlyRootFilesystem: false
-{{- end }}
diff --git a/kubernetes/helm_charts/logging/fluent-bit/templates/secret.yaml b/kubernetes/helm_charts/logging/fluent-bit/templates/secret.yaml
deleted file mode 100644
index 890747d4e..000000000
--- a/kubernetes/helm_charts/logging/fluent-bit/templates/secret.yaml
+++ /dev/null
@@ -1,30 +0,0 @@
-{{- if not .Values.backend.es.tls_secret }}
----
-apiVersion: v1
-kind: Secret
-metadata:
- name: "{{ template "fluent-bit.fullname" . }}-es-tls-secret"
- labels:
- app: {{ template "fluent-bit.name" . }}
- chart: {{ .Chart.Name }}-{{ .Chart.Version }}
- heritage: {{ .Release.Service }}
- release: {{ .Release.Name }}
-type: Opaque
-data:
- es-tls-ca.crt: {{ .Values.backend.es.tls_ca | b64enc | quote }}
-{{- end }}
-{{- if eq .Values.backend.type "stackdriver" }}
----
-apiVersion: v1
-kind: Secret
-metadata:
- name: "{{ template "fluent-bit.fullname" . }}-gcp-stackdriver-secret"
- labels:
- app: {{ template "fluent-bit.name" . }}
- chart: {{ .Chart.Name }}-{{ .Chart.Version }}
- heritage: {{ .Release.Service }}
- release: {{ .Release.Name }}
-type: Opaque
-data:
- google_service_credentials.json: {{ .Values.backend.stackdriver.google_service_credentials | b64enc | quote }}
-{{- end }}
diff --git a/kubernetes/helm_charts/logging/fluent-bit/templates/service.yaml b/kubernetes/helm_charts/logging/fluent-bit/templates/service.yaml
index 8bbc88f11..1f05e5253 100644
--- a/kubernetes/helm_charts/logging/fluent-bit/templates/service.yaml
+++ b/kubernetes/helm_charts/logging/fluent-bit/templates/service.yaml
@@ -1,30 +1,16 @@
-{{- if .Values.metrics.enabled }}
+---
apiVersion: v1
kind: Service
metadata:
-{{- if .Values.metrics.service.annotations }}
- annotations:
-{{ toYaml .Values.metrics.service.annotations | indent 4 }}
-{{- end }}
- name: {{ template "fluent-bit.fullname" . }}-metrics
+ name: fluent-bit-metrics
+ namespace: {{ default .Values.namespace .Release.Namespace }}
labels:
- app: {{ template "fluent-bit.name" . }}
- chart: {{ .Chart.Name }}-{{ .Chart.Version }}
- heritage: {{ .Release.Service }}
- release: {{ .Release.Name }}
- {{- if .Values.metrics.service }}
- {{- range $key, $value := .Values.metrics.service.labels }}
- {{ $key }}: {{ $value | quote }}
- {{- end }}
- {{- end }}
+{{- include "fluent-bit.labels" . | nindent 4 }}
spec:
- type: {{ .Values.metrics.service.type}}
- sessionAffinity: None
- ports:
- - port: {{ .Values.metrics.service.port }}
- targetPort: metrics
- name: metrics
selector:
- app: {{ template "fluent-bit.name" . }}
- release: {{ .Release.Name }}
-{{- end }}
+{{- include "fluent-bit.labels" . | nindent 4 }}
+ ports:
+ - name: http
+ port: 2020
+ targetPort: 2020
+ protocol: TCP
diff --git a/kubernetes/helm_charts/logging/fluent-bit/templates/serviceMonitor.yaml b/kubernetes/helm_charts/logging/fluent-bit/templates/serviceMonitor.yaml
new file mode 100644
index 000000000..35ee90c4f
--- /dev/null
+++ b/kubernetes/helm_charts/logging/fluent-bit/templates/serviceMonitor.yaml
@@ -0,0 +1,27 @@
+{{- if .Values.serviceMonitor.enabled }}
+{{- if and ( .Capabilities.APIVersions.Has "monitoring.coreos.com/v1" ) ( .Values.serviceMonitor.enabled ) }}
+apiVersion: monitoring.coreos.com/v1
+kind: ServiceMonitor
+metadata:
+ name: fluent-bit
+ namespace: {{ default .Values.namespace .Release.Namespace }}
+ labels:
+{{- include "fluent-bit.labels" . | nindent 4 }}
+{{- toYaml .Values.serviceMonitor.labels | nindent 4 }}
+spec:
+ endpoints:
+ - honorLabels: true
+ interval: 15s
+ path: /api/v1/metrics/prometheus
+ port: http
+ scheme: http
+ scrapeTimeout: 10s
+ jobLabel: fluent-bit
+ namespaceSelector:
+ matchNames:
+ - {{ default .Values.namespace .Release.Namespace }}
+ selector:
+ matchLabels:
+ {{- include "fluent-bit.labels" . | nindent 6 }}
+{{- end }}
+{{- end }}
diff --git a/kubernetes/helm_charts/logging/fluent-bit/templates/serviceaccount.yaml b/kubernetes/helm_charts/logging/fluent-bit/templates/serviceaccount.yaml
index 1a1b1a0b1..f162d2bc2 100644
--- a/kubernetes/helm_charts/logging/fluent-bit/templates/serviceaccount.yaml
+++ b/kubernetes/helm_charts/logging/fluent-bit/templates/serviceaccount.yaml
@@ -1,15 +1,29 @@
-{{- if .Values.serviceAccount.create -}}
apiVersion: v1
kind: ServiceAccount
metadata:
- labels:
- app: {{ template "fluent-bit.name" . }}
- chart: {{ .Chart.Name }}-{{ .Chart.Version }}
- heritage: {{ .Release.Service }}
- release: {{ .Release.Name }}
- name: {{ template "fluent-bit.serviceAccountName" . }}
- {{- with .Values.serviceAccount.annotations }}
- annotations:
- {{- toYaml . | nindent 4 }}
- {{- end }}
-{{- end -}}
+ name: fluent-bit
+ namespace: {{ default .Values.namespace .Release.Namespace }}
+---
+apiVersion: rbac.authorization.k8s.io/v1beta1
+kind: ClusterRole
+metadata:
+ name: fluent-bit-read
+rules:
+- apiGroups: [""]
+ resources:
+ - namespaces
+ - pods
+ verbs: ["get", "list", "watch"]
+---
+apiVersion: rbac.authorization.k8s.io/v1beta1
+kind: ClusterRoleBinding
+metadata:
+ name: fluent-bit-read
+roleRef:
+ apiGroup: rbac.authorization.k8s.io
+ kind: ClusterRole
+ name: fluent-bit-read
+subjects:
+- kind: ServiceAccount
+ name: fluent-bit
+ namespace: {{ default .Values.namespace .Release.Namespace }}
diff --git a/kubernetes/helm_charts/logging/fluent-bit/templates/servicemonitor.yaml b/kubernetes/helm_charts/logging/fluent-bit/templates/servicemonitor.yaml
deleted file mode 100644
index df0a03cf5..000000000
--- a/kubernetes/helm_charts/logging/fluent-bit/templates/servicemonitor.yaml
+++ /dev/null
@@ -1,34 +0,0 @@
-{{- if and .Values.metrics.enabled .Values.metrics.serviceMonitor.enabled (.Capabilities.APIVersions.Has "monitoring.coreos.com/v1") }}
-apiVersion: monitoring.coreos.com/v1
-kind: ServiceMonitor
-metadata:
- name: {{ include "fluent-bit.fullname" . }}
- {{- if .Values.metrics.serviceMonitor.namespace }}
- namespace: {{ .Values.metrics.serviceMonitor.namespace }}
- {{- end }}
- labels:
- app: {{ template "fluent-bit.name" . }}
- chart: {{ .Chart.Name }}-{{ .Chart.Version }}
- heritage: {{ .Release.Service }}
- release: {{ .Release.Name }}
- {{- if .Values.metrics.serviceMonitor.additionalLabels }}
-{{ toYaml .Values.metrics.serviceMonitor.additionalLabels | indent 4 }}
- {{- end }}
-spec:
- endpoints:
- - port: metrics
- path: /api/v1/metrics/prometheus
- {{- if .Values.metrics.serviceMonitor.interval }}
- interval: {{ .Values.metrics.serviceMonitor.interval }}
- {{- end }}
- {{- if .Values.metrics.serviceMonitor.scrapeTimeout }}
- scrapeTimeout: {{ .Values.metrics.serviceMonitor.scrapeTimeout }}
- {{- end }}
- namespaceSelector:
- matchNames:
- - {{ .Release.Namespace }}
- selector:
- matchLabels:
- app: {{ include "fluent-bit.name" . }}
- release: {{ .Release.Name }}
-{{- end }}
diff --git a/kubernetes/helm_charts/logging/fluent-bit/templates/tests/test-configmap.yaml b/kubernetes/helm_charts/logging/fluent-bit/templates/tests/test-configmap.yaml
deleted file mode 100644
index 49f0a0091..000000000
--- a/kubernetes/helm_charts/logging/fluent-bit/templates/tests/test-configmap.yaml
+++ /dev/null
@@ -1,48 +0,0 @@
-apiVersion: v1
-kind: ConfigMap
-metadata:
- name: {{ template "fluent-bit.fullname" . }}-test
- labels:
- app: {{ template "fluent-bit.fullname" . }}
- chart: "{{ .Chart.Name }}-{{ .Chart.Version }}"
- heritage: "{{ .Release.Service }}"
- release: "{{ .Release.Name }}"
-data:
- run.sh: |-
- {{- if eq .Values.backend.type "forward"}}
- {{- if eq .Values.backend.forward.tls "on"}}
- fluent-gem install fluent-plugin-secure-forward
- {{- end }}
- @test "Test fluentd" {
- fluentd -c /tests/fluentd.conf --dry-run
- }
- {{- else if eq .Values.backend.type "es"}}
- @test "Test Elasticssearch Indices" {
- url="http://{{ .Values.backend.es.host }}:{{ .Values.backend.es.port }}/_cat/indices?format=json"
- body=$(curl $url)
-
- result=$(echo $body | jq -cr '.[] | select(.index | contains("{{ .Values.backend.es.index }}"))')
- [ "$result" != "" ]
-
- result=$(echo $body | jq -cr '.[] | select((.index | contains("{{ .Values.backend.es.index }}")) and (.health != "green"))')
- [ "$result" == "" ]
- }
- {{- end }}
-
- fluentd.conf: |-
-
- {{- if eq .Values.backend.forward.tls "off" }}
- @type forward
- bind 0.0.0.0
- port {{ .Values.backend.forward.port }}
- {{- else }}
- @type secure_forward
- self_hostname myserver.local
- secure no
- {{- end }}
- shared_key {{ .Values.backend.forward.shared_key }}
-
-
-
- @type stdout
-
diff --git a/kubernetes/helm_charts/logging/fluent-bit/templates/tests/test.yaml b/kubernetes/helm_charts/logging/fluent-bit/templates/tests/test.yaml
deleted file mode 100644
index c030875e5..000000000
--- a/kubernetes/helm_charts/logging/fluent-bit/templates/tests/test.yaml
+++ /dev/null
@@ -1,53 +0,0 @@
-{{- if or (eq .Values.backend.type "forward") (and (eq .Values.backend.type "es") (eq .Values.backend.es.tls "off")) }}
-apiVersion: v1
-kind: Pod
-metadata:
- name: {{ template "fluent-bit.fullname" . }}-test
- labels:
- app: {{ template "fluent-bit.fullname" . }}
- chart: "{{ .Chart.Name }}-{{ .Chart.Version }}"
- heritage: "{{ .Release.Service }}"
- release: "{{ .Release.Name }}"
- annotations:
- "helm.sh/hook": test-success
-spec:
- initContainers:
- - name: test-framework
- image: "{{ .Values.testFramework.image}}:{{ .Values.testFramework.tag }}"
- command:
- - "bash"
- - "-c"
- - |
- set -ex
- # copy bats to tools dir
- cp -R /usr/local/libexec/ /tools/bats/
- volumeMounts:
- - mountPath: /tools
- name: tools
- containers:
- - name: {{ .Release.Name }}-test
- {{- if eq .Values.backend.type "forward"}}
- image: "fluent/fluentd:v1.4-debian-1"
- {{- else }}
- image: "dwdraju/alpine-curl-jq"
- {{- end }}
- command: ["/tools/bats/bats", "-t", "/tests/run.sh"]
- {{- if and (eq .Values.backend.forward.tls "on") (eq .Values.backend.type "forward") }}
- securityContext:
- # run as root to install fluent gems
- runAsUser: 0
- {{- end }}
- volumeMounts:
- - mountPath: /tests
- name: tests
- readOnly: true
- - mountPath: /tools
- name: tools
- volumes:
- - name: tests
- configMap:
- name: {{ template "fluent-bit.fullname" . }}-test
- - name: tools
- emptyDir: {}
- restartPolicy: Never
-{{- end }}
diff --git a/kubernetes/helm_charts/logging/fluent-bit/values.yaml b/kubernetes/helm_charts/logging/fluent-bit/values.yaml
index 2ecf44ce3..cf2ed26c7 100644
--- a/kubernetes/helm_charts/logging/fluent-bit/values.yaml
+++ b/kubernetes/helm_charts/logging/fluent-bit/values.yaml
@@ -1,309 +1,97 @@
-# Minikube stores its logs in a separate directory.
-# Enable if you install the chart in minikube.
-on_minikube: false
+# Default values for fluent-bit.
+# This is a YAML-formatted file.
+# Declare variables to be passed into your templates.
-image:
- fluent_bit:
- repository: fluent/fluent-bit
- tag: 1.3.7
- pullPolicy: Always
-
-testFramework:
- image: "dduportal/bats"
- tag: "0.4.0"
-
-nameOverride: ""
-fullnameOverride: ""
-
-# When enabled, exposes json and prometheus metrics on {{ .Release.Name }}-metrics service
-metrics:
- enabled: false
- service:
- # labels:
- # key: value
- annotations: {}
- # In order for Prometheus to consume metrics automatically use the following annotations:
- # prometheus.io/path: "/api/v1/metrics/prometheus"
- # prometheus.io/port: "2020"
- # prometheus.io/scrape: "true"
- port: 2020
- type: ClusterIP
- serviceMonitor:
- enabled: false
- additionalLabels: {}
- # namespace: monitoring
- # interval: 30s
- # scrapeTimeout: 10s
+replicaCount: 1
-# When enabled, fluent-bit will keep track of tailing offsets across pod restarts.
-trackOffsets: false
+image:
+ repository: fluent/fluent-bit
+ pullPolicy: IfNotPresent
+ # Overrides the image tag whose default is the chart appVersion.
+ tag: "1.6.3"
-## PriorityClassName
-## Ref: https://kubernetes.io/docs/concepts/configuration/pod-priority-preemption/#priorityclass
-priorityClassName: ""
+es_host: log-es.logging.svc.cluster.local
+es_port: 9200
-backend:
- type: forward
- forward:
- host: fluentd
- port: 24284
- tls: "off"
- tls_verify: "on"
- tls_debug: 1
- shared_key:
- es:
- host: elasticsearch
- port: 9200
- # Elastic Index Name
- index: kubernetes_cluster
- type: flb_type
- logstash_prefix: kubernetes_cluster
- replace_dots: "On"
- logstash_format: "On"
- retry_limit: "False"
- time_key: "@timestamp"
- # Optional username credential for Elastic X-Pack access
- http_user:
- # Password for user defined in HTTP_User
- http_passwd:
- # Optional TLS encryption to ElasticSearch instance
- tls: "off"
- tls_verify: "on"
- # TLS certificate for the Elastic (in PEM format). Use if tls=on and tls_verify=on.
- tls_ca: ""
- # TLS debugging levels = 1-4
- tls_debug: 1
- splunk:
- host: 127.0.0.1
- port: 8088
- token: ""
- send_raw: "on"
- tls: "on"
- tls_verify: "off"
- tls_debug: 1
- message_key: "kubernetes"
- stackdriver: {}
+# If es is external, We'll use kubernetes endpoint to loadBalance b/w that
+es:
+ endpoint: false
+ ips:
+ - ip1
+ - ip2
+ - ip3
- ##
- ## Ref: http://fluentbit.io/documentation/current/output/http.html
- ##
- http:
- host: 127.0.0.1
- port: 80
- uri: "/"
- http_user:
- http_passwd:
- tls: "off"
- tls_verify: "on"
- tls_debug: 1
- ## Specify the data format to be used in the HTTP request body
- ## Can be either 'msgpack' or 'json'
- format: msgpack
- # json_date_format: double or iso8601
- headers: []
-parsers:
- enabled: false
- ## List the respective parsers in key: value format per entry
- ## Regex required fields are name and regex. JSON and Logfmt required field
- ## is name.
- regex: []
- logfmt: []
- ## json parser config can be defined by providing an extraEntries field.
- ## The following entry:
- ## json:
- ## - extraEntries: |
- ## Decode_Field_As escaped log do_next
- ## Decode_Field_As json log
- ##
- ## translates into
- ##
- ## Command | Decoder | Field | Optional Action |
- ## ==============|===========|=======|===================|
- ## Decode_Field_As escaped log do_next
- ## Decode_Field_As json log
- ##
- json: []
+imagePullSecrets: []
+nameOverride: ""
+fullnameOverride: ""
-env: []
+serviceAccount:
+ # Specifies whether a service account should be created
+ create: true
+ # Annotations to add to the service account
+ annotations: {}
+ # The name of the service account to use.
+ # If not set and create is true, a name is generated using the fullname template
+ name: ""
-## Annotations to add to the DaemonSet's Pods
podAnnotations: {}
-## By default there different 'files' provides in the config
-## (fluent-bit.conf, custom_parsers.conf). This defeats
-## changing a configmap (since it uses subPath). If this
-## variable is set, the user is assumed to have provided,
-## in 'existingConfigMap' the entire config (etc/*) of fluent-bit,
-## parsers and system config. In this case, no subPath is
-## used
-fullConfigMap: false
-
-## ConfigMap override where fullname is {{.Release.Name}}-{{.Values.existingConfigMap}}
-## Defining existingConfigMap will cause templates/config.yaml
-## to NOT generate a ConfigMap resource
-##
-existingConfigMap: ""
-
-
-# NOTE If you want to add extra sections, add them here, inbetween the includes,
-# wherever they need to go. Sections order matters.
-
-rawConfig: |-
- @INCLUDE fluent-bit-service.conf
- @INCLUDE fluent-bit-input.conf
- @INCLUDE fluent-bit-filter.conf
- @INCLUDE fluent-bit-output.conf
-
-
-# WARNING!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-# This is to add extra entries to an existing section, NOT for adding new sections
-# Do not submit bugs against indent being wrong. Add your new sections to rawConfig
-# instead.
-#
-extraEntries:
- input: |-
-# # >=1 additional Key/Value entrie(s) for existing Input section
- audit: |-
-# # >=1 additional Key/Value entrie(s) for existing Input section
- filter: |-
-# # >=1 additional Key/Value entrie(s) for existing Filter section
- output: |-
-# # >=1 additional Key/Value entrie(s) for existing Ouput section
-# WARNING!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-
+podSecurityContext: {}
+ # fsGroup: 2000
-## Extra ports to add to the daemonset ports section
-extraPorts: []
+securityContext: {}
+ # capabilities:
+ # drop:
+ # - ALL
+ # readOnlyRootFilesystem: true
+ # runAsNonRoot: true
+ # runAsUser: 1000
-## Extra volumes containing additional files required for fluent-bit to work
-## (eg. CA certificates)
-## Ref: https://kubernetes.io/docs/concepts/storage/volumes/
-##
-extraVolumes: []
+service:
+ type: ClusterIP
+ port: 80
-## Extra volume mounts for the fluent-bit pod.
-## Ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-volume-storage/
-##
-extraVolumeMounts: []
+ingress:
+ enabled: false
+ annotations: {}
+ # kubernetes.io/ingress.class: nginx
+ # kubernetes.io/tls-acme: "true"
+ hosts:
+ - host: chart-example.local
+ paths: []
+ tls: []
+ # - secretName: chart-example-tls
+ # hosts:
+ # - chart-example.local
resources: {}
+ # We usually recommend not to specify default resources and to leave this as a conscious
+ # choice for the user. This also increases chances charts run on environments with little
+ # resources, such as Minikube. If you do want to specify resources, uncomment the following
+ # lines, adjust them as necessary, and remove the curly braces after 'resources:'.
# limits:
# cpu: 100m
# memory: 128Mi
# requests:
- # cpu: 10m
- # memory: 8Mi
+ # cpu: 100m
+ # memory: 128Mi
-# When enabled, pods will bind to the node's network namespace.
-hostNetwork: false
+autoscaling:
+ enabled: false
+ minReplicas: 1
+ maxReplicas: 100
+ targetCPUUtilizationPercentage: 80
+ # targetMemoryUtilizationPercentage: 80
-# Which DNS policy to use for the pod.
-# Consider switching to 'ClusterFirstWithHostNet' when 'hostNetwork' is enabled.
-dnsPolicy: ClusterFirst
+nodeSelector: {}
-## Node tolerations for fluent-bit scheduling to nodes with taints
-## Ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/
-##
tolerations: []
-# - key: "key"
-# operator: "Equal|Exists"
-# value: "value"
-# effect: "NoSchedule|PreferNoSchedule|NoExecute(1.6 only)"
-## Node labels for fluent-bit pod assignment
-## Ref: https://kubernetes.io/docs/user-guide/node-selection/
-##
-nodeSelector: {}
affinity: {}
-service:
- flush: 1
- logLevel: info
-
-input:
- tail:
- memBufLimit: 5MB
- parser: docker
- path: /var/log/containers/*.log
- ignore_older: ""
- systemd:
- enabled: false
- filters:
- systemdUnit:
- - docker.service
- - kubelet.service
- - node-problem-detector.service
- maxEntries: 1000
- readFromTail: true
- stripUnderscores: false
- tag: host.*
-
-audit:
- enable: false
- input:
- memBufLimit: 35MB
- parser: docker
- tag: audit.*
- path: /var/log/kube-apiserver-audit.log
- bufferChunkSize: 2MB
- bufferMaxSize: 10MB
- skipLongLines: On
- key: kubernetes-audit
-
-filter:
- kubeURL: https://kubernetes.default.svc:443
- kubeCAFile: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
- kubeTokenFile: /var/run/secrets/kubernetes.io/serviceaccount/token
- kubeTag: kube
- kubeTagPrefix: kube.var.log.containers.
-
-# If true, check to see if the log field content is a JSON string map, if so,
-# it append the map fields as part of the log structure.
- mergeJSONLog: true
-
-# If set, all unpacked keys from mergeJSONLog (Merge_Log) will be packed under
-# the key name specified on mergeLogKey (Merge_Log_Key)
- mergeLogKey: ""
-
-# If true, enable the use of monitoring for a pod annotation of
-# fluentbit.io/parser: parser_name. parser_name must be the name
-# of a parser contained within parsers.conf
- enableParser: true
-
-# If true, enable the use of monitoring for a pod annotation of
-# fluentbit.io/exclude: true. If present, discard logs from that pod.
- enableExclude: true
-
-# If true, the filter reads logs coming in Journald format.
- useJournal: false
-
-rbac:
- # Specifies whether RBAC resources should be created
- create: true
- # Specifies whether a PodSecurityPolicy should be created
- pspEnabled: false
-
-taildb:
- directory: /var/lib/fluent-bit
-
-serviceAccount:
- # Specifies whether a ServiceAccount should be created
- create: true
- # Annotations to add to the service account
- annotations: {}
- # The name of the ServiceAccount to use.
- # If not set and create is true, a name is generated using the fullname template
- name:
-
-## Specifies security settings for a container
-## Ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-container
-securityContext: {}
- # securityContext:
- # privileged: true
-
-## Specifies security settings for a pod
-## Ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-pod
-podSecurityContext: {}
- # podSecurityContext:
- # runAsUser: 1000
+serviceMonitor:
+ enabled: true
+ labels: # labels with which the prometheus choose the serviceMonitor
+ app: prometheus-operator
+ release: prometheus-operator
diff --git a/kubernetes/helm_charts/monitoring/dashboards/dashboards/fluent-bit.json b/kubernetes/helm_charts/monitoring/dashboards/dashboards/fluent-bit.json
new file mode 100644
index 000000000..6614407d9
--- /dev/null
+++ b/kubernetes/helm_charts/monitoring/dashboards/dashboards/fluent-bit.json
@@ -0,0 +1,1509 @@
+{
+ "annotations": {
+ "list": [
+ {
+ "builtIn": 1,
+ "datasource": "Prometheus",
+ "enable": true,
+ "hide": true,
+ "iconColor": "rgba(0, 211, 255, 1)",
+ "name": "Annotations & Alerts",
+ "type": "dashboard"
+ }
+ ]
+ },
+ "description": "Inspired by https://grafana.com/grafana/dashboards/7752",
+ "editable": true,
+ "gnetId": 7752,
+ "graphTooltip": 1,
+ "id": 60,
+ "links": [],
+ "panels": [
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorPrefix": false,
+ "colorValue": true,
+ "colors": [
+ "#d44a3a",
+ "rgba(237, 129, 40, 0.89)",
+ "#299c46"
+ ],
+ "datasource": "Prometheus",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 2,
+ "w": 2,
+ "x": 0,
+ "y": 0
+ },
+ "id": 6,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false
+ },
+ "tableColumn": "Active Fluent-bit",
+ "targets": [
+ {
+ "expr": "sum(kube_pod_info{pod=~\".*fluent-bit.*\"})",
+ "format": "time_series",
+ "interval": "",
+ "intervalFactor": 1,
+ "legendFormat": "Active Fluent-bit",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "0,1",
+ "title": "Fluent Bits",
+ "transparent": true,
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "avg"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#d44a3a",
+ "rgba(237, 129, 40, 0.89)",
+ "#299c46"
+ ],
+ "datasource": "Prometheus",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 2,
+ "w": 2,
+ "x": 2,
+ "y": 0
+ },
+ "id": 4,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false
+ },
+ "tableColumn": "",
+ "targets": [
+ {
+ "expr": "sum(kube_node_status_condition{condition=\"Ready\",status=\"true\"})",
+ "format": "time_series",
+ "instant": true,
+ "interval": "",
+ "intervalFactor": 1,
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "0,1",
+ "title": "Ready Nodes",
+ "transparent": true,
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorPrefix": false,
+ "colorValue": true,
+ "colors": [
+ "#299c46",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "datasource": "Prometheus",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "short",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 2,
+ "w": 2,
+ "x": 4,
+ "y": 0
+ },
+ "id": 36,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false
+ },
+ "tableColumn": "",
+ "targets": [
+ {
+ "expr": "sum(kube_node_status_condition{condition!=\"Ready\",status=\"true\"})",
+ "format": "time_series",
+ "instant": true,
+ "interval": "",
+ "intervalFactor": 1,
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "1,2",
+ "title": "Non-Ready Nodes",
+ "transparent": true,
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": false,
+ "colors": [
+ "#299c46",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "datasource": "Prometheus",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "percentunit",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 2,
+ "w": 3,
+ "x": 6,
+ "y": 0
+ },
+ "id": 33,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "pluginVersion": "6.5.2",
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": true,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": true,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "",
+ "targets": [
+ {
+ "expr": "1 - avg(rate(node_cpu_seconds_total{mode=\"idle\"}[1m]))",
+ "instant": false,
+ "refId": "A"
+ }
+ ],
+ "thresholds": "",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "CPU Utilisation",
+ "transparent": true,
+ "type": "singlestat",
+ "valueFontSize": "70%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": false,
+ "colors": [
+ "#299c46",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "datasource": "Prometheus",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "percentunit",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 2,
+ "w": 3,
+ "x": 9,
+ "y": 0
+ },
+ "id": 37,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "pluginVersion": "6.5.2",
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": true,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": true,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "",
+ "targets": [
+ {
+ "expr": "1 - sum(:node_memory_MemAvailable_bytes:sum) / sum(kube_node_status_allocatable_memory_bytes)",
+ "instant": false,
+ "refId": "A"
+ }
+ ],
+ "thresholds": "",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Memory Utilisation",
+ "transparent": true,
+ "type": "singlestat",
+ "valueFontSize": "70%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": false,
+ "colors": [
+ "#299c46",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "datasource": "Prometheus",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "percentunit",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 2,
+ "w": 3,
+ "x": 12,
+ "y": 0
+ },
+ "id": 34,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "pluginVersion": "6.5.2",
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": true,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": true,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "",
+ "targets": [
+ {
+ "expr": "sum(kube_pod_container_resource_requests_cpu_cores) / sum(kube_node_status_allocatable_cpu_cores)",
+ "instant": false,
+ "refId": "A"
+ }
+ ],
+ "thresholds": "",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "CPU Requests Commitment",
+ "transparent": true,
+ "type": "singlestat",
+ "valueFontSize": "70%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": false,
+ "colors": [
+ "#299c46",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "datasource": "Prometheus",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "percentunit",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 2,
+ "w": 3,
+ "x": 15,
+ "y": 0
+ },
+ "id": 38,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "pluginVersion": "6.5.2",
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": true,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": true,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "",
+ "targets": [
+ {
+ "expr": "sum(kube_pod_container_resource_requests_memory_bytes) / sum(kube_node_status_allocatable_memory_bytes)",
+ "instant": false,
+ "refId": "A"
+ }
+ ],
+ "thresholds": "",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Memory Requests Commitment",
+ "transparent": true,
+ "type": "singlestat",
+ "valueFontSize": "70%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": false,
+ "colors": [
+ "#299c46",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "datasource": "Prometheus",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "percentunit",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 2,
+ "w": 3,
+ "x": 18,
+ "y": 0
+ },
+ "id": 35,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "pluginVersion": "6.5.2",
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": true,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": true,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "",
+ "targets": [
+ {
+ "expr": "sum(kube_pod_container_resource_limits_cpu_cores) / sum(kube_node_status_allocatable_cpu_cores)",
+ "instant": false,
+ "refId": "A"
+ }
+ ],
+ "thresholds": "",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "CPU Limits Commitment",
+ "transparent": true,
+ "type": "singlestat",
+ "valueFontSize": "70%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": false,
+ "colors": [
+ "#299c46",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "datasource": "Prometheus",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "percentunit",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 2,
+ "w": 3,
+ "x": 21,
+ "y": 0
+ },
+ "id": 39,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "pluginVersion": "6.5.2",
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": true,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": true,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "",
+ "targets": [
+ {
+ "expr": "sum(kube_pod_container_resource_limits_memory_bytes) / sum(kube_node_status_allocatable_memory_bytes)",
+ "instant": false,
+ "refId": "A"
+ }
+ ],
+ "thresholds": "",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Memory Limits Commitment",
+ "transparent": true,
+ "type": "singlestat",
+ "valueFontSize": "70%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Prometheus",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "fill": 5,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 6,
+ "w": 12,
+ "x": 0,
+ "y": 2
+ },
+ "hiddenSeries": false,
+ "id": 2,
+ "legend": {
+ "alignAsTable": false,
+ "avg": false,
+ "current": true,
+ "hideEmpty": false,
+ "hideZero": false,
+ "max": false,
+ "min": false,
+ "rightSide": false,
+ "show": false,
+ "sort": "current",
+ "sortDesc": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "null",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": true,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "sum(rate(fluentbit_input_bytes_total[5m])) by (instance, name)",
+ "format": "time_series",
+ "hide": false,
+ "interval": "",
+ "intervalFactor": 1,
+ "legendFormat": "{{ instance }}/{{name}}",
+ "refId": "A"
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Input Bytes Processing Rate",
+ "tooltip": {
+ "shared": true,
+ "sort": 2,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "Bps",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Prometheus",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "fill": 5,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 6,
+ "w": 12,
+ "x": 12,
+ "y": 2
+ },
+ "hiddenSeries": false,
+ "id": 9,
+ "legend": {
+ "alignAsTable": false,
+ "avg": false,
+ "current": true,
+ "max": false,
+ "min": false,
+ "rightSide": false,
+ "show": false,
+ "sort": "current",
+ "sortDesc": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "null",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": true,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "sum(rate(fluentbit_output_proc_bytes_total[5m])) by (instance, name)",
+ "format": "time_series",
+ "hide": false,
+ "interval": "",
+ "intervalFactor": 1,
+ "legendFormat": "{{ instance }}/{{name}}",
+ "refId": "A"
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Output Bytes Processing Rate",
+ "tooltip": {
+ "shared": true,
+ "sort": 2,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "Bps",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": "0",
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Prometheus",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "fill": 5,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 6,
+ "w": 12,
+ "x": 0,
+ "y": 8
+ },
+ "hiddenSeries": false,
+ "id": 40,
+ "legend": {
+ "alignAsTable": false,
+ "avg": false,
+ "current": true,
+ "max": false,
+ "min": false,
+ "rightSide": false,
+ "show": false,
+ "sort": "current",
+ "sortDesc": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "null",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": true,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "sum(rate(fluentbit_input_records_total[5m])) by (instance, name)",
+ "format": "time_series",
+ "hide": false,
+ "interval": "",
+ "intervalFactor": 1,
+ "legendFormat": "{{ instance }}/{{name}}",
+ "refId": "A"
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Input Records Processing Rate",
+ "tooltip": {
+ "shared": true,
+ "sort": 2,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "rps",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Prometheus",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "fill": 5,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 6,
+ "w": 12,
+ "x": 12,
+ "y": 8
+ },
+ "hiddenSeries": false,
+ "id": 41,
+ "legend": {
+ "alignAsTable": false,
+ "avg": false,
+ "current": true,
+ "hideEmpty": false,
+ "hideZero": false,
+ "max": false,
+ "min": false,
+ "rightSide": false,
+ "show": false,
+ "sort": "current",
+ "sortDesc": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "null",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": true,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "sum(rate(fluentbit_output_proc_records_total[5m])) by (instance, name)",
+ "format": "time_series",
+ "hide": false,
+ "interval": "",
+ "intervalFactor": 1,
+ "legendFormat": "{{ instance }}/{{name}}",
+ "refId": "A"
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Output Record Processing Rate",
+ "tooltip": {
+ "shared": true,
+ "sort": 2,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "rps",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": "0",
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Prometheus",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "fill": 1,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 6,
+ "w": 12,
+ "x": 0,
+ "y": 14
+ },
+ "hiddenSeries": false,
+ "id": 11,
+ "legend": {
+ "alignAsTable": false,
+ "avg": true,
+ "current": true,
+ "hideEmpty": true,
+ "hideZero": true,
+ "max": true,
+ "min": false,
+ "rightSide": false,
+ "show": false,
+ "sort": "current",
+ "sortDesc": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "null",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": true,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "sum(rate(fluentbit_output_retries_total[1m])) by (instance, name)",
+ "format": "time_series",
+ "hide": false,
+ "interval": "",
+ "intervalFactor": 1,
+ "legendFormat": "{{instance}} Retries to {{name}}",
+ "refId": "A"
+ },
+ {
+ "expr": "sum(rate(fluentbit_output_retries_failed_total[1m])) by (instance, name)",
+ "format": "time_series",
+ "interval": "",
+ "intervalFactor": 1,
+ "legendFormat": "{{instance}} Failed Retries to {{ name }}",
+ "refId": "B"
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Output Retry/Failed Rates",
+ "tooltip": {
+ "shared": true,
+ "sort": 2,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "decimals": null,
+ "format": "short",
+ "label": "",
+ "logBase": 1,
+ "max": null,
+ "min": "0",
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": "0",
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Prometheus",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "fill": 1,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 6,
+ "w": 12,
+ "x": 12,
+ "y": 14
+ },
+ "hiddenSeries": false,
+ "id": 10,
+ "legend": {
+ "alignAsTable": false,
+ "avg": false,
+ "current": true,
+ "hideEmpty": true,
+ "hideZero": true,
+ "max": false,
+ "min": false,
+ "rightSide": false,
+ "show": true,
+ "sort": "current",
+ "sortDesc": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "null",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "sum(rate(fluentbit_output_errors_total[1m])) by (instance, name)",
+ "format": "time_series",
+ "hide": false,
+ "interval": "",
+ "intervalFactor": 1,
+ "legendFormat": "{{ instance }}/{{ name }}",
+ "refId": "A"
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Output Error Rate",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "errors/sec",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": "0",
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ }
+ ],
+ "refresh": "5m",
+ "schemaVersion": 25,
+ "style": "dark",
+ "tags": [],
+ "templating": {
+ "list": []
+ },
+ "time": {
+ "from": "now-30m",
+ "to": "now"
+ },
+ "timepicker": {
+ "refresh_intervals": [
+ "5s",
+ "10s",
+ "30s",
+ "1m",
+ "5m",
+ "15m",
+ "30m",
+ "1h",
+ "2h",
+ "1d"
+ ],
+ "time_options": [
+ "5m",
+ "15m",
+ "1h",
+ "6h",
+ "12h",
+ "24h",
+ "2d",
+ "7d",
+ "30d"
+ ]
+ },
+ "timezone": "",
+ "title": "Fluent Bit",
+ "uid": "fluentbit",
+ "version": 1
+}
diff --git a/kubernetes/helm_charts/monitoring/dashboards/values.yaml b/kubernetes/helm_charts/monitoring/dashboards/values.yaml
index 4a6efe46c..130365b53 100644
--- a/kubernetes/helm_charts/monitoring/dashboards/values.yaml
+++ b/kubernetes/helm_charts/monitoring/dashboards/values.yaml
@@ -421,6 +421,9 @@ dashboards2:
file: dashboards/api-manager-old.json
dashboardkong4:
file: dashboards/api-manager-req-resp-aggregated-beta.json
+ fluentbit:
+ fluent-bit:
+ file: dashboards/fluent-bit.json
nginx:
nginxdetailed:
file: dashboards/nginx-detailed.json
From 0259949ddb427ba3b6130ae401a16fa7705d9d35 Mon Sep 17 00:00:00 2001
From: Rajesh Rajendran
Date: Wed, 4 Nov 2020 15:58:34 +0530
Subject: [PATCH 025/184] Disabling storage retention for fluentbit (#2022)
(#2023)
Signed-off-by: Rajesh Rajendran
---
.../helm_charts/logging/fluent-bit/templates/configMap.yaml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/kubernetes/helm_charts/logging/fluent-bit/templates/configMap.yaml b/kubernetes/helm_charts/logging/fluent-bit/templates/configMap.yaml
index 010761e6e..b6fab89e3 100644
--- a/kubernetes/helm_charts/logging/fluent-bit/templates/configMap.yaml
+++ b/kubernetes/helm_charts/logging/fluent-bit/templates/configMap.yaml
@@ -98,7 +98,7 @@ data:
# After this LRU will kick in; that means LeastRecentlyUsed will get deleted
# 1 chunk =~ 2MB
# This config has some issues; see https://github.com/fluent/fluent-bit/issues/2688
- storage.total_limit_size 20G
+ # storage.total_limit_size 20G
parsers.conf: |
[PARSER]
Name apache
From 3e18b9fdac130c788b0579b840492a62cdc524fe Mon Sep 17 00:00:00 2001
From: Rajesh Rajendran
Date: Wed, 4 Nov 2020 16:23:08 +0530
Subject: [PATCH 026/184] enable api compression (#2024)
Signed-off-by: Rajesh Rajendran
---
.../core/nginx-public-ingress/values.j2 | 28 +++++++++++++++++++
1 file changed, 28 insertions(+)
diff --git a/kubernetes/helm_charts/core/nginx-public-ingress/values.j2 b/kubernetes/helm_charts/core/nginx-public-ingress/values.j2
index b10380df3..68e73dc52 100644
--- a/kubernetes/helm_charts/core/nginx-public-ingress/values.j2
+++ b/kubernetes/helm_charts/core/nginx-public-ingress/values.j2
@@ -326,6 +326,34 @@ proxyconfig: |-
if ( $http_authorization ) {
set $custom_header "$http_authorization";
}
+ # Compression
+ gzip on;
+ gzip_comp_level 5;
+ gzip_min_length 256; # 256Bytes
+ gzip_proxied any;
+ gzip_vary on;
+ # Content types for compression
+ gzip_types
+ application/atom+xml
+ application/javascript
+ application/json
+ application/ld+json
+ application/manifest+json
+ application/rss+xml
+ application/vnd.geo+json
+ application/vnd.ms-fontobject
+ application/x-font-ttf
+ application/x-web-app-manifest+json
+ application/xhtml+xml
+ application/xml
+ font/opentype
+ image/bmp
+ image/svg+xml
+ image/x-icon
+ text/cache-manifest
+ text/css
+ text/plain
+ #
proxy_set_header Authorization $custom_header;
rewrite ^/api/(.*) /$1 break;
proxy_set_header Connection "";
From 1a6945034396e587e2ce295fdfe63f628d7a80a6 Mon Sep 17 00:00:00 2001
From: Rajesh Rajendran
Date: Wed, 4 Nov 2020 16:57:36 +0530
Subject: [PATCH 027/184] Nginx enabled logging parser (#2027)
Signed-off-by: Rajesh Rajendran
---
.../core/nginx-public-ingress/templates/daemonset.yaml | 1 +
1 file changed, 1 insertion(+)
diff --git a/kubernetes/helm_charts/core/nginx-public-ingress/templates/daemonset.yaml b/kubernetes/helm_charts/core/nginx-public-ingress/templates/daemonset.yaml
index 3b647c055..865d1cc28 100644
--- a/kubernetes/helm_charts/core/nginx-public-ingress/templates/daemonset.yaml
+++ b/kubernetes/helm_charts/core/nginx-public-ingress/templates/daemonset.yaml
@@ -16,6 +16,7 @@ spec:
metadata:
annotations:
nginxRolloutID: {{ randAlphaNum 5 | quote }} # Restart nginx after every deployment
+ fluentbit.io/parser: nginx2
labels:
app: nginx-public-ingress
spec:
From 37c98e7ef5b995e9a740b73e6b6478e42d601a98 Mon Sep 17 00:00:00 2001
From: Pradyumna
Date: Thu, 5 Nov 2020 11:02:29 +0530
Subject: [PATCH 028/184] Issue #SC-2041 feat: Updated private ingress for
enc-service (#2028)
* Issue #SC-2041 feat: Updated private ingress for enc-service
---
.../core/nginx-private-ingress/templates/configmap.yaml | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/kubernetes/helm_charts/core/nginx-private-ingress/templates/configmap.yaml b/kubernetes/helm_charts/core/nginx-private-ingress/templates/configmap.yaml
index 66f4006da..7ac4bbf3f 100644
--- a/kubernetes/helm_charts/core/nginx-private-ingress/templates/configmap.yaml
+++ b/kubernetes/helm_charts/core/nginx-private-ingress/templates/configmap.yaml
@@ -122,6 +122,11 @@ data:
rewrite ^/analytics/(.*) /$1 break;
proxy_pass $target;
}
+ location /enc/ {
+ set $target http://enc-service.{{ .Values.namespace }}.svc.cluster.local:8013;
+ rewrite ^/enc/(.*) /$1 break;
+ proxy_pass $target;
+ }
}
}
kind: ConfigMap
From 931a9c57d19743de0dc7710c155e81280dac4d07 Mon Sep 17 00:00:00 2001
From: AMIT KUMAR
Date: Fri, 6 Nov 2020 12:51:46 +0530
Subject: [PATCH 029/184] Tg642 (#2031)
* Issue #TG642 feat:fix logback file
* Issue #TG642 feat:logback fix
---
.../stack-sunbird/templates/learner-service_logback.xml | 5 -----
1 file changed, 5 deletions(-)
diff --git a/ansible/roles/stack-sunbird/templates/learner-service_logback.xml b/ansible/roles/stack-sunbird/templates/learner-service_logback.xml
index 6fb82065f..b0509c2dc 100644
--- a/ansible/roles/stack-sunbird/templates/learner-service_logback.xml
+++ b/ansible/roles/stack-sunbird/templates/learner-service_logback.xml
@@ -100,7 +100,6 @@
-
@@ -111,10 +110,6 @@
-
-
-
-
From 03e8b4ad386c5218e912826b0ae956485f611c3a Mon Sep 17 00:00:00 2001
From: Kumar Gauraw
Date: Fri, 6 Nov 2020 14:17:28 +0530
Subject: [PATCH 030/184] Issue #DP-1337 fix: updated import api config (#2032)
---
ansible/inventory/env/group_vars/all.yml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/ansible/inventory/env/group_vars/all.yml b/ansible/inventory/env/group_vars/all.yml
index 44adcfaf9..b9cb15a62 100644
--- a/ansible/inventory/env/group_vars/all.yml
+++ b/ansible/inventory/env/group_vars/all.yml
@@ -619,8 +619,8 @@ sunbird_druid_broker_host: "http://{{groups['dp-druid-broker'][0]}}"
# Content-service
lp_cassandra_keyspace_prefix: "{{ env }}"
lp_kafka_url: "{{sunbird_processing_kafka_host}}"
-content_import_required_props: '["name","code","mimeType","contentType","artifactUrl","framework"]'
-content_import_remove_props: '["downloadUrl","variants","previewUrl","streamingUrl","itemSets","level1Name","level1Concept","level2Name","level2Concept","level3Name","level3Concept","me_totalPlaySessionCount","me_totalTimeSpentInSec","me_totalSessionsCount","me_totalTimespent","me_totalInteractions","me_creationSessions","me_creationTimespent","me_averageInteractionsPerMin","me_averageSessionsPerDevice","me_totalDevices","me_averageTimespentPerSession","me_averageRating","me_totalDownloads","me_totalSideloads","me_totalRatings","me_totalComments","me_totalDialcode","me_totalDialcodeLinkedToContent","me_totalDialcodeAttached","me_hierarchyLevel","origin","originData","contentPolicyCheck"]'
+content_import_required_props: '["name","code","mimeType","primaryCategory","artifactUrl","framework"]'
+content_import_remove_props: '["downloadUrl","variants","previewUrl","streamingUrl","itemSets","level1Name","level1Concept","level2Name","level2Concept","level3Name","level3Concept","me_totalPlaySessionCount","me_totalTimeSpentInSec","me_totalSessionsCount","me_totalTimespent","me_totalInteractions","me_creationSessions","me_creationTimespent","me_averageInteractionsPerMin","me_averageSessionsPerDevice","me_totalDevices","me_averageTimespentPerSession","me_averageRating","me_totalDownloads","me_totalSideloads","me_totalRatings","me_totalComments","me_totalDialcode","me_totalDialcodeLinkedToContent","me_totalDialcodeAttached","me_hierarchyLevel","origin","originData","contentPolicyCheck","questions"]'
# Print Service
#kp_sunbird_account_name: "{{azure_account_name}}"
From 684ffa01b6fcaaecc54fdb9a5cce6513700de8a2 Mon Sep 17 00:00:00 2001
From: Harsha
Date: Fri, 6 Nov 2020 16:52:41 +0530
Subject: [PATCH 031/184] Issue #DO-2719: enabling storage account for
discussion forum (#2034)
* adding nodebb storage variable
* adding nodebb storage variable
* adding nodebb storage variable
* removing unwanted file
---
ansible/inventory/env/group_vars/all.yml | 3 +++
ansible/roles/stack-sunbird/templates/sunbird_nodebb.env | 6 ++++--
.../helm_charts/core/nodebb/templates/deployment.yaml | 3 +++
3 files changed, 10 insertions(+), 2 deletions(-)
diff --git a/ansible/inventory/env/group_vars/all.yml b/ansible/inventory/env/group_vars/all.yml
index b9cb15a62..65eb1db11 100644
--- a/ansible/inventory/env/group_vars/all.yml
+++ b/ansible/inventory/env/group_vars/all.yml
@@ -646,3 +646,6 @@ dp_play_http_secret_key: "mysecretdpplaysecretkey"
# LMS Service vars
group_activity_agg_cache_ttl: 3600
group_activity_agg_cache_enable: false
+
+# nodebb variables
+sunbird_nodebb_storage_key: "{{ core_vault_sunbird_nodebb_storage_key }}"
diff --git a/ansible/roles/stack-sunbird/templates/sunbird_nodebb.env b/ansible/roles/stack-sunbird/templates/sunbird_nodebb.env
index 961c5822b..1f5f3155c 100644
--- a/ansible/roles/stack-sunbird/templates/sunbird_nodebb.env
+++ b/ansible/roles/stack-sunbird/templates/sunbird_nodebb.env
@@ -1,2 +1,4 @@
-sunbird_nodebb_url=https://{{ domain_name }}/discussions
-redis_nodebb_host="{{ groups['redis-nodebb'][0]}}"
+AZURE_STORAGE_ACCOUNT={{sunbird_nodebb_storage_account}}
+AZURE_STORAGE_ACCESS_KEY={{sunbird_nodebb_storage_key}}
+AZURE_STORAGE_CONTAINER={{sunbird_nodebb_container}}
+AZURE_STORAGE_HOSTNAME={{sunbird_nodebb_hostname}}
diff --git a/kubernetes/helm_charts/core/nodebb/templates/deployment.yaml b/kubernetes/helm_charts/core/nodebb/templates/deployment.yaml
index b25dd6987..10e4c3825 100644
--- a/kubernetes/helm_charts/core/nodebb/templates/deployment.yaml
+++ b/kubernetes/helm_charts/core/nodebb/templates/deployment.yaml
@@ -32,6 +32,9 @@ spec:
- name: {{ .Chart.Name }}
image: "{{ .Values.dockerhub }}/{{ .Values.repository }}:{{ .Values.image_tag }}"
imagePullPolicy: Always
+ envFrom:
+ - configMapRef:
+ name: {{ .Chart.Name }}-config
volumeMounts:
- name: nodebb-config-json
mountPath: /usr/src/app/config.json
From 8eaf37dfdbd69958381c21e11e655e3dac4dc6a6 Mon Sep 17 00:00:00 2001
From: Rajesh Rajendran
Date: Mon, 9 Nov 2020 16:04:07 +0530
Subject: [PATCH 032/184] Merge release-3.3.0 to 3.4.0 (#2037)
* Issue #SB-21135 feat: Updated LMS configuration (#2003)
* Issue #SC-1929 feat: Courses logback changes
* Issue #SC-2041 feat: Updated issue certificate topic config
* Issue #SB-21135 feat: Updated LMS configuration
* Issue #SB-21135 feat: Updated LMS configuration
* Issue #SB-21135 feat: Updated LMS configuration
* Enanbling secured way to upload files using jenkins (#2004)
* Issue #SB-21123 fix: updated config for search-service (#2005)
* Issue #SB-21123 fix: updated config for search-service
* Issue #SB-21123 fix: updated variable name
* Merge 3.2.7 to 3.3.0 (#2008)
* Added the secor process alert rules. (#2012)
* added the druid alert rules (#1996)
* Issue #TG607: added the druid alert rules
* Issue #TG607: added the druid alert rules
* Issue #TG607: updated the druid alert rules
* Issue #0000: added the datasource name in message field.
* Issue #0000: removed the rollup datasource
* Issue #0000: added the secor process alert rules
* Issue #0000: added the email config
* Issue #0000: added the secor processes names
* Issue #0000: updated the alert name
* Issue #0000: removed the old secor alertrules
* Issue #TG-641: updated the alert rules
* Issue #TG-641: added the druid monitoring vars (#2016)
* Same logging for nginx-public and private ingress (#2017)
Signed-off-by: Rajesh Rajendran
* Issue #SB-0000 feat: updating DEACTIVATE_JOB_API_HOST env var (#2018)
* Issue #SB-0000 feat: updating DEACTIVATE_JOB_API_HOST env var
* Issue #SB-0000 feat: api key env var added
* Issue #SB-0000 feat: using internal route for kong endpoint.
* Adding fluent-bit chart (#2019) (#2020)
Adding type conversion for nginx logs
* Disabling storage retention for fluentbit (#2022)
Signed-off-by: Rajesh Rajendran
* Nginx enabled logging parser (#2026)
Signed-off-by: Rajesh Rajendran
Co-authored-by: Pradyumna
Co-authored-by: SMY ALTAMASH <30286162+SMYALTAMASH@users.noreply.github.com>
Co-authored-by: Kumar Gauraw
Co-authored-by: kaliraja <34502260+Kaali09@users.noreply.github.com>
Co-authored-by: Ravinder Kumar
---
.../templates/sunbird_report-service.env | 3 ++-
.../roles/sunbird-monitoring/defaults/main.yml | 3 +++
.../sunbird-monitoring/templates/alertrules.yaml | 4 ++--
.../templates/configmap.yaml | 15 ++++++++++++---
4 files changed, 19 insertions(+), 6 deletions(-)
diff --git a/ansible/roles/stack-sunbird/templates/sunbird_report-service.env b/ansible/roles/stack-sunbird/templates/sunbird_report-service.env
index e9fba5a25..9d609a0cc 100644
--- a/ansible/roles/stack-sunbird/templates/sunbird_report-service.env
+++ b/ansible/roles/stack-sunbird/templates/sunbird_report-service.env
@@ -8,4 +8,5 @@ SUNBIRD_BASE_REPORT_URL=report
SUNBIRD_REPORTS_TABLE_NAME=report
SUNBIRD_REPORT_SUMMARY_TABLE_NAME={{sunbird_report_summary_table_name}}
SUNBIRD_ENV="https://{{domain_name}}"
-DEACTIVATE_JOB_API_HOST={{sunbird_analytics_api_base_url}}/report/jobs/deactivate
+DEACTIVATE_JOB_API_HOST=http://kong:8000/data/v1/report/jobs/deactivate
+DEACTIVATE_JOB_API_KEY={{sunbird_api_auth_token}}
\ No newline at end of file
diff --git a/kubernetes/ansible/roles/sunbird-monitoring/defaults/main.yml b/kubernetes/ansible/roles/sunbird-monitoring/defaults/main.yml
index 1ae68b62c..931267c55 100644
--- a/kubernetes/ansible/roles/sunbird-monitoring/defaults/main.yml
+++ b/kubernetes/ansible/roles/sunbird-monitoring/defaults/main.yml
@@ -205,3 +205,6 @@ prometheus_spec_overrides:
sb_test_var: dummy_var_not_to_throw_error
alertmanager_spec_overrides:
sb_test_var: dummy_var_not_to_throw_error
+
+druid_raw_ingestion_lag_threshold: 200000
+druid_rollup_ingestion_lag_threshold: 200000
diff --git a/kubernetes/ansible/roles/sunbird-monitoring/templates/alertrules.yaml b/kubernetes/ansible/roles/sunbird-monitoring/templates/alertrules.yaml
index b448efd7d..62ad4633d 100644
--- a/kubernetes/ansible/roles/sunbird-monitoring/templates/alertrules.yaml
+++ b/kubernetes/ansible/roles/sunbird-monitoring/templates/alertrules.yaml
@@ -56,8 +56,8 @@ raw_druid_datasource:
- sl_observations_production
- telemetry-feedback-events
-druid_raw_ingestion_threshold: 200000
-druid_rollup_ingestion_threshold: 200000
+druid_raw_ingestion_threshold: "{{ druid_raw_ingestion_lag_threshold | defaut(200000) }}"
+druid_rollup_ingestion_threshold: "{{ druid_rollup_ingestion_lag_threshold | defaut(200000)}}"
secor_process_names:
- channel-telemetry-backup
diff --git a/kubernetes/helm_charts/core/nginx-private-ingress/templates/configmap.yaml b/kubernetes/helm_charts/core/nginx-private-ingress/templates/configmap.yaml
index 7ac4bbf3f..8b25a0cd7 100644
--- a/kubernetes/helm_charts/core/nginx-private-ingress/templates/configmap.yaml
+++ b/kubernetes/helm_charts/core/nginx-private-ingress/templates/configmap.yaml
@@ -16,10 +16,19 @@ data:
default_type application/octet-stream;
lua_load_resty_core off;
lua_package_path "/etc/nginx/lua_modules/?.lua";
- log_format main '$remote_addr - $remote_user [$time_local] "$request" '
- '$status $body_bytes_sent "$http_referer" '
- '"$http_user_agent" "$http_x_forwarded_for"';
+ log_format main '$remote_addr - $remote_user [$time_local] '
+ '"$request" $status $request_length $body_bytes_sent'
+ ' $request_time $upstream_response_time $pipe'
+ ' "$http_referer" "$http_user_agent" "$sb_request_id"'
+ ' "$http_x_device_id" "$http_x_channel_id" "$http_x_app_id"'
+ ' "$http_x_app_ver" "$http_x_session_id"';
+ # If the client send request_id it should be preffered over the default one
+ map $http_x_request_id $sb_request_id {
+ default $http_x_request_id;
+ '' $request_id;
+ }
+
access_log /var/log/nginx/access.log main;
include /etc/nginx/conf.d/*.conf;
sendfile on;
From 1a9c3e898012a9b8d5865c22ecb1c27423e37818 Mon Sep 17 00:00:00 2001
From: Rajesh Rajendran
Date: Wed, 11 Nov 2020 10:30:34 +0530
Subject: [PATCH 033/184] Monitoring changes (#2039)
* Adding nginx service annotations
Signed-off-by: Rajesh Rajendran
* Adding auto pod discovery support for prom-operator
Signed-off-by: Rajesh Rajendran
* Adding cassandra exporter
* making default refresh rate at 60s
By default it'll be 1s, and refresh is a resource consuming operation.
Which is not good for heavy indexing indices
Signed-off-by: Rajesh Rajendran
* Adding file descriptors in load dashboard
Signed-off-by: Rajesh Rajendran
* Update nginx dashboard to fetch data from Promtheus
Signed-off-by: Rajesh Rajendran
---
ansible/cassandra-exporter.yaml | 6 +
ansible/esupgradelatest.yml | 11 +-
ansible/roles/cassandra-exporter/README.md | 43 +++
.../cassandra-exporter/defaults/main.yml | 15 ++
.../cassandra-exporter/handlers/main.yml | 15 ++
.../roles/cassandra-exporter/meta/main.yml | 60 +++++
.../roles/cassandra-exporter/tasks/main.yml | 97 +++++++
.../cassandra-exporter-config.yaml.j2 | 139 ++++++++++
.../templates/cassandra_exporter.sh.j2 | 2 +
.../prometheus-cassandra-exporter.service.j2 | 15 ++
.../roles/cassandra-exporter/tests/inventory | 2 +
.../roles/cassandra-exporter/tests/test.yml | 6 +
.../roles/cassandra-exporter/vars/main.yml | 1 +
.../templates/additional-scrape-configs.yaml | 32 +++
.../templates/daemonset.yaml | 4 +
.../core/nginx-public-ingress/values.j2 | 1 +
.../dashboards/dashboards/cassandra.json | 19 +-
.../dashboards/dashboards/load-metrics.json | 246 +++++++++++++++++-
.../dashboards/dashboards/nginx.json | 35 ++-
.../provision/cassandra/Jenkinsfile.exporter | 51 ++++
20 files changed, 763 insertions(+), 37 deletions(-)
create mode 100644 ansible/cassandra-exporter.yaml
create mode 100644 ansible/roles/cassandra-exporter/README.md
create mode 100644 ansible/roles/cassandra-exporter/defaults/main.yml
create mode 100644 ansible/roles/cassandra-exporter/handlers/main.yml
create mode 100644 ansible/roles/cassandra-exporter/meta/main.yml
create mode 100644 ansible/roles/cassandra-exporter/tasks/main.yml
create mode 100644 ansible/roles/cassandra-exporter/templates/cassandra-exporter-config.yaml.j2
create mode 100644 ansible/roles/cassandra-exporter/templates/cassandra_exporter.sh.j2
create mode 100644 ansible/roles/cassandra-exporter/templates/etc/systemd/system/prometheus-cassandra-exporter.service.j2
create mode 100644 ansible/roles/cassandra-exporter/tests/inventory
create mode 100644 ansible/roles/cassandra-exporter/tests/test.yml
create mode 100644 ansible/roles/cassandra-exporter/vars/main.yml
create mode 100644 pipelines/provision/cassandra/Jenkinsfile.exporter
diff --git a/ansible/cassandra-exporter.yaml b/ansible/cassandra-exporter.yaml
new file mode 100644
index 000000000..a5802cab7
--- /dev/null
+++ b/ansible/cassandra-exporter.yaml
@@ -0,0 +1,6 @@
+- hosts: cassandra
+ become: yes
+ vars_files:
+ - "{{inventory_dir}}/secrets.yml"
+ roles:
+ - cassandra-exporter
diff --git a/ansible/esupgradelatest.yml b/ansible/esupgradelatest.yml
index a0f7a9536..d14ea66e0 100644
--- a/ansible/esupgradelatest.yml
+++ b/ansible/esupgradelatest.yml
@@ -22,6 +22,14 @@
es_etc_cluster_name: "{{ node_name }}"
}
post_tasks:
+ # This will make some performance tuning
+ # Ref: https://aws.amazon.com/premiumsupport/knowledge-center/elasticsearch-indexing-performance/
+ #
+ # Number of replicas: 0 # this is make sure that there is no backup and hence, no disk write. Good for logging indices
+ # refresh_interval: 60s # Refresh interval is the setting which make sure the latest indexed data will be available for search.
+ # # But refresh is a heavy resource intensive operation, which can be run once in a minute than once in a second
+ # # https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-update-settings.html
+ #
- name: Changing log es index replica to zero
uri:
url: "http://{{groups['log-es'][0]}}:9200/_template/logstash"
@@ -32,7 +40,8 @@
],
"settings": {
"number_of_shards": 5,
- "number_of_replicas": 0
+ "number_of_replicas": 0,
+ "refresh_interval" : "60s"
}
}
body_format: json
diff --git a/ansible/roles/cassandra-exporter/README.md b/ansible/roles/cassandra-exporter/README.md
new file mode 100644
index 000000000..e388a8f39
--- /dev/null
+++ b/ansible/roles/cassandra-exporter/README.md
@@ -0,0 +1,43 @@
+Role Name
+=========
+
+Role to install `cassandra exporter java binary` as a `systemd` service
+
+Role Variables
+--------------
+
+| Name | Default Value | Description |
+| -------------- | ------------- | -----------------------------------|
+| `cassandra_exporter_version` | 2.2.0 | Cassandra exporter package version |
+| `cassandra_listen_address` | 0.0.0.0 | Cassandra exporter listening address |
+| `cassandra_listen_port` | 8080 | Cassandra exporter listening port |
+| `cassandra_exporter_binary_url` | https://github.com/criteo/cassandra_exporter/releases/download/{{cassandra_exporter_version}}/cassandra_exporter-{{cassandra_exporter_version}}-all.jar | Cassandra exporter jar download location |
+| `cassandra_exporter_config_url` | https://raw.githubusercontent.com/criteo/cassandra_exporter/master/config.yml | Cassandra exporter config download location |
+| `cassandra_exporter_config` | | Cassandra exporter config file in local disk, if defined ,`cassandra_exporter_config_url` is ignored |
+| `cassandra_exporter_user` | cassandra-exp | UNIX user to run the binary |
+| `cassandra_exporter_group` | cassandra-exp | UNIX group to run the binary |
+| `cassandra_exporter_root_dir` | /opt/cassandra_exporter | Base location where cassandra exporter stuff is downloaded |
+| `cassandra_exporter_dist_dir` | /opt/cassandra_exporter/dist | Location for binary and systemd service script |
+| `cassandra_exporter_config_dir` | /opt/cassandra_exporter/config | Location for config |
+
+
+Example Playbook
+----------------
+
+Including an example of how to use your role (for instance, with variables passed in as parameters) is always nice for users too:
+
+ - hosts: servers
+ become: true
+ become_method: sudo
+ roles:
+ - role: ansible-cassandra-exporter
+
+Usage
+-----
+
+You may install the role locally using `ansible-galaxy install -r requirements.yml -p roles/` where `requirements.yml` reads something like
+
+```
+- src: git+https://github.com/criteo/cassandra_exporter/ansible/roles
+ version: TBD
+```
diff --git a/ansible/roles/cassandra-exporter/defaults/main.yml b/ansible/roles/cassandra-exporter/defaults/main.yml
new file mode 100644
index 000000000..8a9309e8a
--- /dev/null
+++ b/ansible/roles/cassandra-exporter/defaults/main.yml
@@ -0,0 +1,15 @@
+---
+
+cassandra_exporter_version: 2.3.5
+
+cassandra_exporter_listen_address: "0.0.0.0"
+cassandra_exporter_listen_port: "8080"
+cassandra_exporter_binary_url: 'https://github.com/criteo/cassandra_exporter/releases/download/{{cassandra_exporter_version}}/cassandra_exporter-{{cassandra_exporter_version}}.jar'
+cassandra_exporter_config_url: 'https://raw.githubusercontent.com/criteo/cassandra_exporter/{{cassandra_exporter_version}}/config.yml'
+
+cassandra_exporter_user: cassandra-exp
+cassandra_exporter_group: cassandra-exp
+
+cassandra_exporter_root_dir: /opt/cassandra_exporter
+cassandra_exporter_dist_dir: "{{ cassandra_exporter_root_dir }}/dist"
+cassandra_exporter_config_dir: "{{ cassandra_exporter_root_dir }}/config"
diff --git a/ansible/roles/cassandra-exporter/handlers/main.yml b/ansible/roles/cassandra-exporter/handlers/main.yml
new file mode 100644
index 000000000..6973d9f19
--- /dev/null
+++ b/ansible/roles/cassandra-exporter/handlers/main.yml
@@ -0,0 +1,15 @@
+---
+
+- name: reenable cassandra exporter service
+ systemd:
+ daemon_reload: yes
+ enabled: yes
+ name: prometheus-cassandra-exporter
+
+- name: reinit cassandra exporter
+ command: initctl reload-configuration
+
+- name: restart cassandra exporter
+ service:
+ name: prometheus-cassandra-exporter
+ state: restarted
diff --git a/ansible/roles/cassandra-exporter/meta/main.yml b/ansible/roles/cassandra-exporter/meta/main.yml
new file mode 100644
index 000000000..326a6298c
--- /dev/null
+++ b/ansible/roles/cassandra-exporter/meta/main.yml
@@ -0,0 +1,60 @@
+galaxy_info:
+ author: Pankaj M. Tolani
+ description: DevOps Engineer
+ company: Autonomous Thingz Pty Ltd
+
+ # If the issue tracker for your role is not on github, uncomment the
+ # next line and provide a value
+ # issue_tracker_url: http://example.com/issue/tracker
+
+ # Some suggested licenses:
+ # - BSD (default)
+ # - MIT
+ # - GPLv2
+ # - GPLv3
+ # - Apache
+ # - CC-BY
+ license: license (GPLv2, CC-BY, etc)
+
+ min_ansible_version: 2.4
+
+ # If this a Container Enabled role, provide the minimum Ansible Container version.
+ # min_ansible_container_version:
+
+ # Optionally specify the branch Galaxy will use when accessing the GitHub
+ # repo for this role. During role install, if no tags are available,
+ # Galaxy will use this branch. During import Galaxy will access files on
+ # this branch. If Travis integration is configured, only notifications for this
+ # branch will be accepted. Otherwise, in all cases, the repo's default branch
+ # (usually master) will be used.
+ #github_branch:
+
+ #
+ # Provide a list of supported platforms, and for each platform a list of versions.
+ # If you don't wish to enumerate all versions for a particular platform, use 'all'.
+ # To view available platforms and versions (or releases), visit:
+ # https://galaxy.ansible.com/api/v1/platforms/
+ #
+ # platforms:
+ # - name: Fedora
+ # versions:
+ # - all
+ # - 25
+ # - name: SomePlatform
+ # versions:
+ # - all
+ # - 1.0
+ # - 7
+ # - 99.99
+
+ galaxy_tags: Cassandra, JMX, Exporter, Systemd, Service
+ # List tags for your role here, one per line. A tag is a keyword that describes
+ # and categorizes the role. Users find roles by searching for tags. Be sure to
+ # remove the '[]' above, if you add tags to this list.
+ #
+ # NOTE: A tag is limited to a single word comprised of alphanumeric characters.
+ # Maximum 20 tags per role.
+
+dependencies: []
+ # List your role dependencies here, one per line. Be sure to remove the '[]' above,
+ # if you add dependencies to this list.
diff --git a/ansible/roles/cassandra-exporter/tasks/main.yml b/ansible/roles/cassandra-exporter/tasks/main.yml
new file mode 100644
index 000000000..b342701b4
--- /dev/null
+++ b/ansible/roles/cassandra-exporter/tasks/main.yml
@@ -0,0 +1,97 @@
+---
+
+- name: 'create cassandra exporter group'
+ group:
+ name: '{{ cassandra_exporter_group }}'
+ system: yes
+ state: present
+
+- name: 'create cassandra exporter user'
+ user:
+ name: '{{ cassandra_exporter_user }}'
+ system: yes
+ shell: '/sbin/nologin'
+ group: '{{ cassandra_exporter_group }}'
+ createhome: no
+
+- name: 'create cassandra exporter directories'
+ file:
+ path: '{{ item }}'
+ state: directory
+ owner: '{{ cassandra_exporter_user }}'
+ group: '{{ cassandra_exporter_group }}'
+ mode: 0755
+ with_items:
+ - '{{ cassandra_exporter_root_dir }}'
+ - '{{ cassandra_exporter_dist_dir }}'
+ - '{{ cassandra_exporter_config_dir }}'
+
+- name: 'download cassandra exporter binary'
+ get_url:
+ url: '{{ cassandra_exporter_binary_url }}'
+ dest: '{{ cassandra_exporter_dist_dir }}/cassandra.jar'
+
+- name: 'Copy cassandra exporter config'
+ template:
+ src: cassandra-exporter-config.yaml.j2
+ dest: '{{ cassandra_exporter_config_dir }}/config.yml'
+ notify:
+ - restart cassandra exporter
+
+- name: 'set cassandra listen address'
+ lineinfile:
+ regexp: "^listenAddress"
+ dest: "{{ cassandra_exporter_config_dir }}/config.yml"
+ line: "listenAddress: {{ cassandra_exporter_listen_address }}"
+ notify:
+ - restart cassandra exporter
+
+- name: 'set cassandra listen port'
+ lineinfile:
+ regexp: "^listenPort"
+ dest: "{{ cassandra_exporter_config_dir }}/config.yml"
+ line: "listenPort: {{ cassandra_exporter_listen_port }}"
+ notify:
+ - restart cassandra exporter
+
+- name: 'generate the shell script'
+ template:
+ src: cassandra_exporter.sh.j2
+ dest: '{{ cassandra_exporter_dist_dir }}/cassandra_exporter.sh'
+ owner: root
+ group: root
+ mode: 0755
+ register: prometheus_cassandra_exporter_updated
+ notify:
+ - restart cassandra exporter
+
+- name: 'update group and owner for files'
+ file:
+ path: '{{ item }}'
+ state: file
+ owner: '{{ cassandra_exporter_user }}'
+ group: '{{ cassandra_exporter_group }}'
+ with_items:
+ - '{{ cassandra_exporter_dist_dir }}/cassandra.jar'
+ - '{{ cassandra_exporter_config_dir }}/config.yml'
+ when: prometheus_cassandra_exporter_updated is changed
+
+- name: 'create systemd service unit'
+ template:
+ src: etc/systemd/system/prometheus-cassandra-exporter.service.j2
+ dest: /etc/systemd/system/prometheus-cassandra-exporter.service
+ owner: root
+ group: root
+ mode: 0644
+ when: service_mgr | default(ansible_service_mgr) == 'systemd'
+ notify:
+ - reenable cassandra exporter service
+ - restart cassandra exporter
+
+- meta: flush_handlers
+
+- name: 'ensure prometheus cassandra exporter service is enabled and started'
+ service:
+ name: prometheus-cassandra-exporter
+ state: started
+ enabled: yes
diff --git a/ansible/roles/cassandra-exporter/templates/cassandra-exporter-config.yaml.j2 b/ansible/roles/cassandra-exporter/templates/cassandra-exporter-config.yaml.j2
new file mode 100644
index 000000000..f5d6b595f
--- /dev/null
+++ b/ansible/roles/cassandra-exporter/templates/cassandra-exporter-config.yaml.j2
@@ -0,0 +1,139 @@
+host: localhost:7199
+ssl: False
+user:
+password:
+listenAddress: 0.0.0.0
+listenPort: 8080
+# Regular expression to match environment variable names that will be added
+# as labels to all data points. The name of the label will be either
+# $1 from the regex below, or the entire environment variable name if no match groups are defined
+#
+# Example:
+# additionalLabelsFromEnvvars: "^ADDL\_(.*)$"
+additionalLabelsFromEnvvars:
+blacklist:
+ # To profile the duration of jmx call you can start the program with the following options
+ # > java -Dorg.slf4j.simpleLogger.defaultLogLevel=trace -jar cassandra_exporter.jar config.yml --oneshot
+ #
+ # To get intuition of what is done by cassandra when something is called you can look in cassandra
+ # https://github.com/apache/cassandra/tree/trunk/src/java/org/apache/cassandra/metrics
+ # Please avoid to scrape frequently those calls that are iterating over all sstables
+
+ # Unaccessible metrics (not enough privilege)
+ - java:lang:memorypool:.*usagethreshold.*
+
+ # Leaf attributes not interesting for us but that are presents in many path
+ - .*:999thpercentile
+ - .*:95thpercentile
+ - .*:fifteenminuterate
+ - .*:fiveminuterate
+ - .*:durationunit
+ - .*:rateunit
+ - .*:stddev
+ - .*:meanrate
+ - .*:mean
+ - .*:min
+
+ # Path present in many metrics but uninterresting
+ - .*:viewlockacquiretime:.*
+ - .*:viewreadtime:.*
+ - .*:cas[a-z]+latency:.*
+ - .*:colupdatetimedeltahistogram:.*
+
+ # Mostly for RPC, do not scrap them
+ # - org:apache:cassandra:db:.*
+ - org:apache:cassandra:db:batchlogmanager:.*
+ - org:apache:cassandra:db:caches:.*
+ - org:apache:cassandra:db:dynamicendpointsnitch:.*
+ - org:apache:cassandra:db:indexcolumnfamilies:.*
+ - org:apache:cassandra:db:indexsummaries:.*
+ - org:apache:cassandra:db:indextables:.*
+ - org:apache:cassandra:db:nativeaccess:.*
+ - org:apache:cassandra:db:storageproxy:.*
+
+ # columnfamily is an alias for Table metrics
+ # https://github.com/apache/cassandra/blob/8b3a60b9a7dbefeecc06bace617279612ec7092d/src/java/org/apache/cassandra/metrics/TableMetrics.java#L162
+ - org:apache:cassandra:metrics:columnfamily:.*
+
+ # Should we export metrics for system keyspaces/tables ?
+ - org:apache:cassandra:metrics:[^:]+:system[^:]*:.*
+
+ # Some another uninterresting metrics
+ - org:apache:cassandra:metrics:indextable:.*
+ - org:apache:cassandra:metrics:indexcolumnfamily:.*
+
+ - .*:waitingonfreememtablespace:.*
+ - .*:estimatedpartitionsizehistogram:.*
+ - .*:estimatedcolumncounthistogram:.*
+
+ # Don't scrap us
+ - com:criteo:nosql:cassandra:exporter:.*
+
+maxScrapFrequencyInSec:
+ 15:
+ - java:lang:garbagecollector:.*
+ - java:lang:memory:.*
+ - java:lang:threading:.*
+ - org:apache:cassandra:db:compactionmanager:compactions
+ - org:apache:cassandra:db:compactionmanager:corecompactorthreads
+ - org:apache:cassandra:db:compactionmanager:corevalidationthreads
+ - org:apache:cassandra:db:compactionmanager:maximumcompactorthreads
+ - org:apache:cassandra:db:storageservice:livenodes
+ - org:apache:cassandra:db:storageservice:unreachablenodes
+ - org:apache:cassandra:metrics:cache:keycache:hits:count
+ - org:apache:cassandra:metrics:cache:keycache:requests:count
+ - org:apache:cassandra:metrics:client:connectednativeclients:value
+ - org:apache:cassandra:metrics:clientrequest:.*:latency:count
+ - org:apache:cassandra:metrics:clientrequest:read:latency:oneminuterate
+ - org:apache:cassandra:metrics:clientrequest:read:timeouts:count
+ - org:apache:cassandra:metrics:clientrequest:read:totallatency:count
+ - org:apache:cassandra:metrics:clientrequest:read:unavailables:count
+ - org:apache:cassandra:metrics:clientrequest:write:latency:oneminuterate
+ - org:apache:cassandra:metrics:clientrequest:write:timeouts:count
+ - org:apache:cassandra:metrics:clientrequest:write:totallatency:count
+ - org:apache:cassandra:metrics:clientrequest:write:unavailables:count
+ - org:apache:cassandra:metrics:compaction:bytescompacted:count
+ - org:apache:cassandra:metrics:compaction:pendingtasks:value
+ - org:apache:cassandra:metrics:compaction:totalcompactionscompleted:count
+ - org:apache:cassandra:metrics:storage:.*
+ - org:apache:cassandra:metrics:table:[^:]+:[^:]+:percentrepaired:value
+ - org:apache:cassandra:metrics:table:percentrepaired:value
+ - org:apache:cassandra:metrics:threadpools:.*:activetasks:value
+ - org:apache:cassandra:metrics:threadpools:.*:pendingtasks:value
+ - org:apache:cassandra:metrics:threadpools:.*:totalblockedtasks:count
+ - org:apache:cassandra:metrics:table:.*:.*:readlatency:.*
+ - org:apache:cassandra:metrics:table:.*:.*:writelatency:.*
+ - org:apache:cassandra:metrics:table:.*:.*:rangelatency:.*
+ - org:apache:cassandra:metrics:table:.*:.*:sstablesperreadhistogram:.*
+ - org:apache:cassandra:metrics:table:.*:.*:livesstablecount:value
+ - org:apache:cassandra:metrics:table:.*:.*:pendingcompactions:value
+ - org:apache:cassandra:metrics:table:.*:.*:pendingflushes:count
+ - org:apache:cassandra:metrics:table:.*:.*:compactionbyteswritten:count
+ - org:apache:cassandra:metrics:streaming:totalincomingbytes:count
+ - org:apache:cassandra:metrics:streaming:totaloutgoingbytes:count
+ - org:apache:cassandra:metrics:table:.*:.*:tombstonescannedhistogram:.*
+ - org:apache:cassandra:metrics:commitlog:completedtasks:value
+ - org:apache:cassandra:metrics:table:.*:.*:memtableswitchcount:.*"
+
+ 60:
+ - org:apache:cassandra:metrics:droppedmessage:.*:oneminuterate
+ - org:apache:cassandra:metrics:connection:totaltimeouts:oneminuterate
+ - org:apache:cassandra:metrics:table:.*:.*:readlatency:oneminuterate
+ - org:apache:cassandra:metrics:table:.*:.*:keycachehitrate:value
+ - org:apache:cassandra:metrics:cache:chunkcache:oneminutehitrate:value
+ - org:apache:cassandra:metrics:connection:totaltimeouts:oneminuterate
+ - org:apache:cassandra:metrics:table:.*:.*:writelatency:oneminuterate
+ - org:apache:cassandra:metrics:commitlog:waitingoncommit:oneminuterate
+ 120:
+ - org:apache:cassandra:metrics:table:.*:.*:rowcachehit:count
+ - org:apache:cassandra:metrics:table:.*:.*:rowcachemiss:count
+ - org:apache:cassandra:metrics:threadpools:.*:completedtasks:value
+ - org:apache:cassandra:metrics:table:.*:.*:allmemtablesheapsize:value
+ - org:apache:cassandra:metrics:table:.*:.*:allmemtableslivedatasize:value
+ - org:apache:cassandra:metrics:table:$keyspace:.*:waitingonfreememtablespace:max
+
+ # Refresh those metrics only every hour as it is costly for cassandra to retrieve them
+ 3600:
+ - .*:snapshotssize:.*
+ - .*:estimated.*
+ - .*:totaldiskspaceused:.*
diff --git a/ansible/roles/cassandra-exporter/templates/cassandra_exporter.sh.j2 b/ansible/roles/cassandra-exporter/templates/cassandra_exporter.sh.j2
new file mode 100644
index 000000000..f57a253e7
--- /dev/null
+++ b/ansible/roles/cassandra-exporter/templates/cassandra_exporter.sh.j2
@@ -0,0 +1,2 @@
+#!/bin/bash
+java -jar {{ cassandra_exporter_dist_dir }}/cassandra.jar {{ cassandra_exporter_config_dir }}/config.yml
diff --git a/ansible/roles/cassandra-exporter/templates/etc/systemd/system/prometheus-cassandra-exporter.service.j2 b/ansible/roles/cassandra-exporter/templates/etc/systemd/system/prometheus-cassandra-exporter.service.j2
new file mode 100644
index 000000000..f0aac29b6
--- /dev/null
+++ b/ansible/roles/cassandra-exporter/templates/etc/systemd/system/prometheus-cassandra-exporter.service.j2
@@ -0,0 +1,15 @@
+[Unit]
+Description=Prometheus Cassandra Exporter
+After=network.target
+
+[Service]
+Type=simple
+User={{ cassandra_exporter_user }}
+Group={{ cassandra_exporter_group }}
+ExecStart={{ cassandra_exporter_dist_dir }}/cassandra_exporter.sh
+
+SyslogIdentifier=prometheus_cassandra_exporter
+Restart=always
+
+[Install]
+WantedBy=multi-user.target
diff --git a/ansible/roles/cassandra-exporter/tests/inventory b/ansible/roles/cassandra-exporter/tests/inventory
new file mode 100644
index 000000000..878877b07
--- /dev/null
+++ b/ansible/roles/cassandra-exporter/tests/inventory
@@ -0,0 +1,2 @@
+localhost
+
diff --git a/ansible/roles/cassandra-exporter/tests/test.yml b/ansible/roles/cassandra-exporter/tests/test.yml
new file mode 100644
index 000000000..4c29ffaef
--- /dev/null
+++ b/ansible/roles/cassandra-exporter/tests/test.yml
@@ -0,0 +1,6 @@
+---
+- hosts: localhost
+ become: true
+ become_method: sudo
+ roles:
+ - ansible-cassandra-exporter
diff --git a/ansible/roles/cassandra-exporter/vars/main.yml b/ansible/roles/cassandra-exporter/vars/main.yml
new file mode 100644
index 000000000..ed97d539c
--- /dev/null
+++ b/ansible/roles/cassandra-exporter/vars/main.yml
@@ -0,0 +1 @@
+---
diff --git a/kubernetes/ansible/roles/sunbird-monitoring/templates/additional-scrape-configs.yaml b/kubernetes/ansible/roles/sunbird-monitoring/templates/additional-scrape-configs.yaml
index b5dd70343..0af9d7c5f 100644
--- a/kubernetes/ansible/roles/sunbird-monitoring/templates/additional-scrape-configs.yaml
+++ b/kubernetes/ansible/roles/sunbird-monitoring/templates/additional-scrape-configs.yaml
@@ -8,6 +8,38 @@
fullnameOverride: "sunbird-monitoring"
scrapeconfig:
+ # This scrape config will enable us to annotate any pod and that pod will get automonitored
+ #
+ # annotations:
+ # prometheus.io/scrape: "true"
+ # prometheus.io/port: "2020"
+ # prometheus.io/path: /api/v1/metrics/prometheus
+ #
+ - job_name: 'kubernetes-pods'
+ kubernetes_sd_configs:
+ - role: pod
+ relabel_configs:
+ - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape]
+ action: keep
+ regex: true
+ - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_path]
+ action: replace
+ target_label: __metrics_path__
+ regex: (.+)
+ - source_labels: [__address__, __meta_kubernetes_pod_annotation_prometheus_io_port]
+ action: replace
+ regex: ([^:]+)(?::\d+)?;(\d+)
+ replacement: $1:$2
+ target_label: __address__
+ - action: labelmap
+ regex: __meta_kubernetes_pod_label_(.+)
+ - source_labels: [__meta_kubernetes_namespace]
+ action: replace
+ target_label: kubernetes_namespace
+ - source_labels: [__meta_kubernetes_pod_name]
+ action: replace
+ target_label: kubernetes_pod_name
+
- job_name: 'Druid'
metrics_path: /metrics/druid
static_configs:
diff --git a/kubernetes/helm_charts/core/nginx-public-ingress/templates/daemonset.yaml b/kubernetes/helm_charts/core/nginx-public-ingress/templates/daemonset.yaml
index 865d1cc28..96968c090 100644
--- a/kubernetes/helm_charts/core/nginx-public-ingress/templates/daemonset.yaml
+++ b/kubernetes/helm_charts/core/nginx-public-ingress/templates/daemonset.yaml
@@ -84,6 +84,10 @@ kind: Service
metadata:
name: nginx-public-ingress
namespace: {{ .Values.namespace }}
+{{- if service.annotations }}
+ annotations:
+{{ toyaml .Values.service.annotations | indent 4 }}
+{{- end }}
spec:
externalTrafficPolicy: Local
selector:
diff --git a/kubernetes/helm_charts/core/nginx-public-ingress/values.j2 b/kubernetes/helm_charts/core/nginx-public-ingress/values.j2
index 68e73dc52..f2d7a931c 100644
--- a/kubernetes/helm_charts/core/nginx-public-ingress/values.j2
+++ b/kubernetes/helm_charts/core/nginx-public-ingress/values.j2
@@ -3,6 +3,7 @@
namespace: {{ namespace }}
merge_domain_status: {{ merge_domain_status | lower }}
service:
+ annotations: {{nginx_public_ingress_service_annotations | d('{}') | to_json}}
type: {{ nginx_public_ingress_type | default('LoadBalancer') }}
{% if nginx_public_ingress_ip is defined %}
nginx_public_ingress_ip: {{ nginx_public_ingress_ip }}
diff --git a/kubernetes/helm_charts/monitoring/dashboards/dashboards/cassandra.json b/kubernetes/helm_charts/monitoring/dashboards/dashboards/cassandra.json
index c9b3c7910..599906dd0 100644
--- a/kubernetes/helm_charts/monitoring/dashboards/dashboards/cassandra.json
+++ b/kubernetes/helm_charts/monitoring/dashboards/dashboards/cassandra.json
@@ -15,8 +15,7 @@
"editable": true,
"gnetId": null,
"graphTooltip": 1,
- "id": 58,
- "iteration": 1592292254793,
+ "iteration": 1602231388710,
"links": [],
"panels": [
{
@@ -3732,7 +3731,7 @@
}
],
"refresh": false,
- "schemaVersion": 22,
+ "schemaVersion": 25,
"style": "dark",
"tags": [
"cassandra"
@@ -3742,7 +3741,7 @@
{
"allValue": null,
"current": {
- "selected": true,
+ "selected": false,
"text": "datacenter1",
"value": "datacenter1"
},
@@ -3750,7 +3749,6 @@
"definition": "",
"hide": 0,
"includeAll": false,
- "index": -1,
"label": null,
"multi": false,
"name": "datacenter",
@@ -3769,7 +3767,7 @@
{
"allValue": null,
"current": {
- "selected": true,
+ "selected": false,
"text": "Test Cluster",
"value": "Test Cluster"
},
@@ -3777,7 +3775,6 @@
"definition": "",
"hide": 0,
"includeAll": false,
- "index": -1,
"label": null,
"multi": false,
"name": "cluster",
@@ -3804,7 +3801,6 @@
"definition": "",
"hide": 0,
"includeAll": false,
- "index": -1,
"label": null,
"multi": false,
"name": "keyspace",
@@ -3823,6 +3819,7 @@
{
"allValue": ".*",
"current": {
+ "selected": true,
"text": "All",
"value": [
"$__all"
@@ -3832,7 +3829,6 @@
"definition": "",
"hide": 0,
"includeAll": true,
- "index": -1,
"label": null,
"multi": true,
"name": "table",
@@ -3920,8 +3916,5 @@
"timezone": "",
"title": "Cassandra",
"uid": "cassandra",
- "variables": {
- "list": []
- },
- "version": 1
+ "version": 6
}
diff --git a/kubernetes/helm_charts/monitoring/dashboards/dashboards/load-metrics.json b/kubernetes/helm_charts/monitoring/dashboards/dashboards/load-metrics.json
index 4a5e22f1a..81fd7ac63 100644
--- a/kubernetes/helm_charts/monitoring/dashboards/dashboards/load-metrics.json
+++ b/kubernetes/helm_charts/monitoring/dashboards/dashboards/load-metrics.json
@@ -15,8 +15,7 @@
"editable": true,
"gnetId": null,
"graphTooltip": 0,
- "id": 60,
- "iteration": 1589183133348,
+ "iteration": 1604302178229,
"links": [],
"panels": [
{
@@ -26,6 +25,12 @@
"dashes": false,
"datasource": "Prometheus",
"decimals": 2,
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
"fill": 1,
"fillGradient": 0,
"gridPos": {
@@ -67,6 +72,7 @@
{
"expr": "sum by (instance) (avg without (cpu) (rate(node_cpu_seconds_total{ mode!=\"idle\"}[5m]))) * on (instance) group_left(nodename) node_uname_info{job=~\".*node-exporter\", nodename=~\"$nodename\"}",
"format": "time_series",
+ "interval": "",
"intervalFactor": 1,
"legendFormat": "{{nodename}}",
"refId": "A"
@@ -92,6 +98,7 @@
},
"yaxes": [
{
+ "$$hashKey": "object:335",
"format": "percentunit",
"label": null,
"logBase": 1,
@@ -100,6 +107,7 @@
"show": true
},
{
+ "$$hashKey": "object:336",
"format": "short",
"label": null,
"logBase": 1,
@@ -120,6 +128,12 @@
"dashes": false,
"datasource": "Prometheus",
"decimals": 2,
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
"fill": 1,
"fillGradient": 0,
"gridPos": {
@@ -216,6 +230,12 @@
"dashLength": 10,
"dashes": false,
"datasource": "Prometheus",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
"fill": 1,
"fillGradient": 0,
"gridPos": {
@@ -312,6 +332,12 @@
"dashLength": 10,
"dashes": false,
"datasource": "Prometheus",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
"fill": 1,
"fillGradient": 0,
"gridPos": {
@@ -405,6 +431,12 @@
"dashLength": 10,
"dashes": false,
"datasource": "Prometheus",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
"fill": 1,
"fillGradient": 0,
"gridPos": {
@@ -498,6 +530,12 @@
"dashLength": 10,
"dashes": false,
"datasource": "Prometheus",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
"fill": 1,
"fillGradient": 0,
"gridPos": {
@@ -584,10 +622,206 @@
"align": false,
"alignLevel": null
}
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": null,
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "fill": 1,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 8,
+ "w": 12,
+ "x": 0,
+ "y": 45
+ },
+ "hiddenSeries": false,
+ "id": 9,
+ "legend": {
+ "alignAsTable": true,
+ "avg": false,
+ "current": true,
+ "max": true,
+ "min": false,
+ "rightSide": true,
+ "show": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "nullPointMode": "null",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 2,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "sum by (instance) (node_filefd_allocated) * on (instance) group_left(nodename) node_uname_info{job=~\".*node-exporter\", nodename=~\"$nodename\"}",
+ "interval": "",
+ "legendFormat": "{{nodename}}",
+ "refId": "A"
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Current File Descriptors",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "$$hashKey": "object:261",
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ },
+ {
+ "$$hashKey": "object:262",
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": null,
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "fill": 1,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 8,
+ "w": 12,
+ "x": 12,
+ "y": 45
+ },
+ "hiddenSeries": false,
+ "id": 10,
+ "legend": {
+ "alignAsTable": true,
+ "avg": false,
+ "current": true,
+ "max": true,
+ "min": false,
+ "rightSide": true,
+ "show": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "nullPointMode": "null",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 2,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "sum by (instance) (node_filefd_maximum) * on (instance) group_left(nodename) node_uname_info{job=~\".*node-exporter\", nodename=~\"$nodename\"}",
+ "interval": "",
+ "legendFormat": "{{nodename}}",
+ "refId": "A"
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Maximum Allowed File Descriptors",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "$$hashKey": "object:261",
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ },
+ {
+ "$$hashKey": "object:262",
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
}
],
"refresh": false,
- "schemaVersion": 22,
+ "schemaVersion": 25,
"style": "dark",
"tags": [],
"templating": {
@@ -595,6 +829,8 @@
{
"allValue": null,
"current": {
+ "selected": true,
+ "tags": [],
"text": "All",
"value": [
"$__all"
@@ -622,7 +858,7 @@
]
},
"time": {
- "from": "now-30m",
+ "from": "now-1h",
"to": "now"
},
"timepicker": {
@@ -653,5 +889,5 @@
"timezone": "",
"title": "Load metrics",
"uid": "B-a5y6eZz",
- "version": 11
+ "version": 2
}
diff --git a/kubernetes/helm_charts/monitoring/dashboards/dashboards/nginx.json b/kubernetes/helm_charts/monitoring/dashboards/dashboards/nginx.json
index 9eb4b39ed..67d7eee19 100644
--- a/kubernetes/helm_charts/monitoring/dashboards/dashboards/nginx.json
+++ b/kubernetes/helm_charts/monitoring/dashboards/dashboards/nginx.json
@@ -16,9 +16,9 @@
},
"editable": true,
"gnetId": null,
- "graphTooltip": 0,
- "id": 36,
- "iteration": 1595424666886,
+ "graphTooltip": 1,
+ "id": 81,
+ "iteration": 1605070117137,
"links": [],
"panels": [
{
@@ -26,7 +26,7 @@
"bars": false,
"dashLength": 10,
"dashes": false,
- "datasource": "prom-fed",
+ "datasource": "Prometheus",
"decimals": null,
"fieldConfig": {
"defaults": {
@@ -74,7 +74,7 @@
"steppedLine": false,
"targets": [
{
- "expr": "sum(rate(nginx_http_requests_total{cluster=~\"$cluster\"}[5m]))",
+ "expr": "sum(rate(nginx_http_requests_total[5m]))",
"format": "time_series",
"hide": false,
"interval": "",
@@ -84,21 +84,21 @@
"step": 2
},
{
- "expr": "sum(rate(nginx_http_requests_total{cluster=~\"$cluster\", cache_status!~\"MISS|NONE\"}[5m]))",
+ "expr": "sum(rate(nginx_http_requests_total{cache_status!~\"MISS|NONE\"}[5m]))",
"hide": false,
"interval": "",
"legendFormat": "Cached Response",
"refId": "B"
},
{
- "expr": "sum(rate(nginx_http_requests_total{cluster=~\"$cluster\"}[5m])) - sum(rate(nginx_http_requests_total{cluster=~\"$cluster\", cache_status!~\"MISS|NONE\"}[5m]))",
+ "expr": "sum(rate(nginx_http_requests_total[5m])) - sum(rate(nginx_http_requests_total{cache_status!~\"MISS|NONE\"}[5m]))",
"hide": false,
"interval": "",
"legendFormat": "Not Cached Response",
"refId": "C"
},
{
- "expr": "sum(rate(nginx_http_requests_total{cluster=~\"$cluster\", status=\"345\"}[5m]))",
+ "expr": "sum(rate(nginx_http_requests_total{ status=\"444\"}[5m]))",
"format": "time_series",
"hide": false,
"interval": "",
@@ -156,7 +156,7 @@
"bars": false,
"dashLength": 10,
"dashes": false,
- "datasource": "prom-fed",
+ "datasource": "Prometheus",
"fieldConfig": {
"defaults": {
"custom": {}
@@ -203,7 +203,7 @@
"steppedLine": false,
"targets": [
{
- "expr": "(sum(increase(nginx_http_requests_total{cluster=~\"$cluster\", status!~\"4..|5..\"}[5m])) / sum(increase(nginx_http_requests_total{cluster=~\"$cluster\"}[5m]))) * 100",
+ "expr": "(sum(increase(nginx_http_requests_total{ status!~\"4..|5..\"}[5m])) / sum(increase(nginx_http_requests_total[5m]))) * 100",
"format": "time_series",
"interval": "",
"intervalFactor": 1,
@@ -212,7 +212,7 @@
"step": 4
},
{
- "expr": "(sum(increase(nginx_http_requests_total{cluster=~\"$cluster\", status!~\"4..|5..\"}[5m])) by (status) / ignoring(status,cache_status) group_left sum(increase(nginx_http_requests_total{cluster=~\"$cluster\"}[5m]))) * 100",
+ "expr": "(sum(increase(nginx_http_requests_total{ status!~\"4..|5..\"}[5m])) by (status) / ignoring(status,cache_status) group_left sum(increase(nginx_http_requests_total[5m]))) * 100",
"format": "time_series",
"interval": "",
"intervalFactor": 1,
@@ -271,7 +271,7 @@
"bars": false,
"dashLength": 10,
"dashes": false,
- "datasource": "prom-fed",
+ "datasource": "Prometheus",
"fieldConfig": {
"defaults": {
"custom": {}
@@ -318,7 +318,7 @@
"steppedLine": false,
"targets": [
{
- "expr": "(sum(increase(nginx_http_requests_total{cluster=~\"$cluster\", status!~\"2..|3..\"}[5m]))/ sum(increase(nginx_http_requests_total{cluster=~\"$cluster\"}[5m]))) * 100",
+ "expr": "(sum(increase(nginx_http_requests_total{ status!~\"2..|3..\"}[5m]))/ sum(increase(nginx_http_requests_total[5m]))) * 100",
"format": "time_series",
"interval": "",
"intervalFactor": 1,
@@ -327,7 +327,7 @@
"step": 4
},
{
- "expr": "(sum(increase(nginx_http_requests_total{cluster=~\"$cluster\", status!~\"2..|3..\"}[5m])) by (status) / ignoring(status,cache_status) group_left sum(increase(nginx_http_requests_total{cluster=~\"$cluster\"}[5m]))) * 100",
+ "expr": "(sum(increase(nginx_http_requests_total{ status!~\"2..|3..\"}[5m])) by (status) / ignoring(status,cache_status) group_left sum(increase(nginx_http_requests_total[5m]))) * 100",
"format": "time_series",
"interval": "",
"intervalFactor": 1,
@@ -379,7 +379,7 @@
}
}
],
- "refresh": "1m",
+ "refresh": "5m",
"schemaVersion": 25,
"style": "dark",
"tags": [],
@@ -393,14 +393,14 @@
"value": "$__all"
},
"datasource": "prom-fed",
- "definition": "label_values(nginx_http_requests_total, cluster)",
+ "definition": "label_values(nginx_http_requests_total, sb_cluster)",
"hide": 0,
"includeAll": true,
"label": null,
"multi": false,
"name": "cluster",
"options": [],
- "query": "label_values(nginx_http_requests_total, cluster)",
+ "query": "label_values(nginx_http_requests_total, sb_cluster)",
"refresh": 1,
"regex": "",
"skipUrlSync": false,
@@ -419,7 +419,6 @@
},
"timepicker": {
"refresh_intervals": [
- "5s",
"10s",
"30s",
"1m",
diff --git a/pipelines/provision/cassandra/Jenkinsfile.exporter b/pipelines/provision/cassandra/Jenkinsfile.exporter
new file mode 100644
index 000000000..c240cfb38
--- /dev/null
+++ b/pipelines/provision/cassandra/Jenkinsfile.exporter
@@ -0,0 +1,51 @@
+@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') {
+ folder = new File("$WORKSPACE/.git")
+ if (folder.exists())
+ {
+ println "Found .git folder. Clearing it.."
+ sh'git clean -fxd'
+ }
+ checkout scm
+ }
+
+ ansiColor('xterm') {
+ stage('deploy'){
+ values = [:]
+ currentWs = sh(returnStdout: true, script: 'pwd').trim()
+ envDir = sh(returnStdout: true, script: "echo $JOB_NAME").split('/')[-3].trim()
+ module = sh(returnStdout: true, script: "echo $JOB_NAME").split('/')[-2].trim()
+ jobName = sh(returnStdout: true, script: "echo $JOB_NAME").split('/')[-1].trim()
+ ansiblePlaybook = "${currentWs}/ansible/cassandra-exporter.yaml"
+ ansibleExtraArgs = "--vault-password-file /var/lib/jenkins/secrets/vault-pass -v"
+ values.put('currentWs', currentWs)
+ values.put('env', envDir)
+ values.put('module', module)
+ values.put('jobName', jobName)
+ values.put('ansiblePlaybook', ansiblePlaybook)
+ values.put('ansibleExtraArgs', ansibleExtraArgs)
+ println values
+ ansible_playbook_run(values)
+ currentBuild.result = 'SUCCESS'
+ currentBuild.description = "Private: ${params.private_branch}, Public: ${params.branch_or_tag}"
+ }
+ }
+ summary()
+ }
+ catch (err) {
+ currentBuild.result = 'FAILURE'
+ throw err
+ }
+ finally {
+ slack_notify(currentBuild.result)
+ email_notify()
+ }
+}
From ddd117aa7cdc5f368ea876dd95e30b46e668e482 Mon Sep 17 00:00:00 2001
From: Rajesh Rajendran
Date: Fri, 13 Nov 2020 10:02:49 +0530
Subject: [PATCH 034/184] fix: nginx service annotation (#2040)
Signed-off-by: Rajesh Rajendran
---
.../core/nginx-public-ingress/templates/daemonset.yaml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/kubernetes/helm_charts/core/nginx-public-ingress/templates/daemonset.yaml b/kubernetes/helm_charts/core/nginx-public-ingress/templates/daemonset.yaml
index 96968c090..9b46899ba 100644
--- a/kubernetes/helm_charts/core/nginx-public-ingress/templates/daemonset.yaml
+++ b/kubernetes/helm_charts/core/nginx-public-ingress/templates/daemonset.yaml
@@ -84,7 +84,7 @@ kind: Service
metadata:
name: nginx-public-ingress
namespace: {{ .Values.namespace }}
-{{- if service.annotations }}
+{{- if .Values.service.annotations }}
annotations:
{{ toyaml .Values.service.annotations | indent 4 }}
{{- end }}
From 492da1703bb6faf898de4666c5fe7d05afc842f6 Mon Sep 17 00:00:00 2001
From: Rajesh Rajendran
Date: Fri, 13 Nov 2020 10:14:38 +0530
Subject: [PATCH 035/184] fix: empty service annotation (#2041)
Signed-off-by: Rajesh Rajendran
---
.../core/nginx-public-ingress/templates/daemonset.yaml | 2 +-
kubernetes/helm_charts/core/nginx-public-ingress/values.j2 | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/kubernetes/helm_charts/core/nginx-public-ingress/templates/daemonset.yaml b/kubernetes/helm_charts/core/nginx-public-ingress/templates/daemonset.yaml
index 9b46899ba..9fc5ce4cf 100644
--- a/kubernetes/helm_charts/core/nginx-public-ingress/templates/daemonset.yaml
+++ b/kubernetes/helm_charts/core/nginx-public-ingress/templates/daemonset.yaml
@@ -86,7 +86,7 @@ metadata:
namespace: {{ .Values.namespace }}
{{- if .Values.service.annotations }}
annotations:
-{{ toyaml .Values.service.annotations | indent 4 }}
+{{ toYaml .Values.service.annotations | indent 4 }}
{{- end }}
spec:
externalTrafficPolicy: Local
diff --git a/kubernetes/helm_charts/core/nginx-public-ingress/values.j2 b/kubernetes/helm_charts/core/nginx-public-ingress/values.j2
index f2d7a931c..07abf6f6e 100644
--- a/kubernetes/helm_charts/core/nginx-public-ingress/values.j2
+++ b/kubernetes/helm_charts/core/nginx-public-ingress/values.j2
@@ -3,7 +3,7 @@
namespace: {{ namespace }}
merge_domain_status: {{ merge_domain_status | lower }}
service:
- annotations: {{nginx_public_ingress_service_annotations | d('{}') | to_json}}
+ annotations: {{nginx_public_ingress_service_annotations | d('') | to_json}}
type: {{ nginx_public_ingress_type | default('LoadBalancer') }}
{% if nginx_public_ingress_ip is defined %}
nginx_public_ingress_ip: {{ nginx_public_ingress_ip }}
From 6f501363cc267cad8190c35b74435cf2fe552488 Mon Sep 17 00:00:00 2001
From: Rajesh Rajendran
Date: Fri, 13 Nov 2020 10:24:01 +0530
Subject: [PATCH 036/184] fix: default value for druid entry (#2042)
Signed-off-by: Rajesh Rajendran
---
.../roles/sunbird-monitoring/templates/alertrules.yaml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/kubernetes/ansible/roles/sunbird-monitoring/templates/alertrules.yaml b/kubernetes/ansible/roles/sunbird-monitoring/templates/alertrules.yaml
index 62ad4633d..4971aff4d 100644
--- a/kubernetes/ansible/roles/sunbird-monitoring/templates/alertrules.yaml
+++ b/kubernetes/ansible/roles/sunbird-monitoring/templates/alertrules.yaml
@@ -56,8 +56,8 @@ raw_druid_datasource:
- sl_observations_production
- telemetry-feedback-events
-druid_raw_ingestion_threshold: "{{ druid_raw_ingestion_lag_threshold | defaut(200000) }}"
-druid_rollup_ingestion_threshold: "{{ druid_rollup_ingestion_lag_threshold | defaut(200000)}}"
+druid_raw_ingestion_threshold: "{{ druid_raw_ingestion_lag_threshold | default(200000) }}"
+druid_rollup_ingestion_threshold: "{{ druid_rollup_ingestion_lag_threshold | default(200000)}}"
secor_process_names:
- channel-telemetry-backup
From 2b9e37bd6a65c4b668aca11150e11a4e5ce432ae Mon Sep 17 00:00:00 2001
From: Rhea Fernandes <32357913+rheafernandes@users.noreply.github.com>
Date: Wed, 18 Nov 2020 17:47:31 +0530
Subject: [PATCH 037/184] Added categories in configuration for channel apis
(#2043)
* Added Kafka Configuration for assessment service
---
.../assessment-service_application.conf | 6 ++++++
.../content-service_application.conf | 20 +++++++++++++++----
2 files changed, 22 insertions(+), 4 deletions(-)
diff --git a/ansible/roles/stack-sunbird/templates/assessment-service_application.conf b/ansible/roles/stack-sunbird/templates/assessment-service_application.conf
index efdbefc28..9cd36c459 100644
--- a/ansible/roles/stack-sunbird/templates/assessment-service_application.conf
+++ b/ansible/roles/stack-sunbird/templates/assessment-service_application.conf
@@ -370,3 +370,9 @@ languageCode {
tamil : "ta"
telugu : "te"
}
+
+kafka {
+ urls : "{{ kafka_urls }}"
+ topic.send.enable : true
+ topics.instruction : "{{ env_name }}.learning.job.request"
+}
\ No newline at end of file
diff --git a/ansible/roles/stack-sunbird/templates/content-service_application.conf b/ansible/roles/stack-sunbird/templates/content-service_application.conf
index fb31f84f4..21b453f76 100644
--- a/ansible/roles/stack-sunbird/templates/content-service_application.conf
+++ b/ansible/roles/stack-sunbird/templates/content-service_application.conf
@@ -560,8 +560,20 @@ mimeTypeToPrimaryCategory {
"text/x-url": ["Learnin Resource", "Teacher Resource"]
}
-#Default objectCategory mapping for channel
-channel.content.primarycategories=["Explanation Content", "Learning Resource", "Practice Question Set", "eTextbook", "Teacher Resource", "Course Assessment"]
-channel.collection.primarycategories=["Course", "Digital Textbook", "Content Playlist"]
-channel.asset.primarycategories=["Asset"]
objectcategorydefinition.keyspace="{{ lp_cassandra_keyspace_prefix }}_category_store"
+
+#Default objectCategory mapping for channel
+channel {
+ content{
+ primarycategories=["Course Assessment", "eTextbook", "Explanation Content", "Learning Resource", "Practice Question Set", "Teacher Resource"]
+ additionalcategories=["Classroom Teaching Video", "Concept Map", "Curiosity Question Set", "Experiential Resource", "Explanation Video", "Focus Spot", "Learning Outcome Definition", "Lesson Plan", "Marking Scheme Rubric", "Pedagogy Flow", "Previous Board Exam Papers", "TV Lesson", "Textbook"]
+ }
+ collection {
+ primarycategories=["Content Playlist", "Course", "Digital Textbook"]
+ additionalcategories=["Textbook", "Lesson Plan"]
+ }
+ asset {
+ primarycategories=["Asset", "CertAsset", "Certificate Template"]
+ additionalcategories=[]
+ }
+}
\ No newline at end of file
From f5b934bcfca94911e3f6f469d8f93b6659d5d730 Mon Sep 17 00:00:00 2001
From: Rhea Fernandes <32357913+rheafernandes@users.noreply.github.com>
Date: Thu, 19 Nov 2020 16:34:37 +0530
Subject: [PATCH 038/184] SB-21507 Required changes made for TV Lesson
collection object Type (#2045)
---
.../stack-sunbird/templates/content-service_application.conf | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/ansible/roles/stack-sunbird/templates/content-service_application.conf b/ansible/roles/stack-sunbird/templates/content-service_application.conf
index 21b453f76..814b9ed22 100644
--- a/ansible/roles/stack-sunbird/templates/content-service_application.conf
+++ b/ansible/roles/stack-sunbird/templates/content-service_application.conf
@@ -569,8 +569,8 @@ channel {
additionalcategories=["Classroom Teaching Video", "Concept Map", "Curiosity Question Set", "Experiential Resource", "Explanation Video", "Focus Spot", "Learning Outcome Definition", "Lesson Plan", "Marking Scheme Rubric", "Pedagogy Flow", "Previous Board Exam Papers", "TV Lesson", "Textbook"]
}
collection {
- primarycategories=["Content Playlist", "Course", "Digital Textbook"]
- additionalcategories=["Textbook", "Lesson Plan"]
+ primarycategories=["Content Playlist", "Course", "Digital Textbook", "Explanation Content"]
+ additionalcategories=["Textbook", "Lesson Plan", "TV Lesson"]
}
asset {
primarycategories=["Asset", "CertAsset", "Certificate Template"]
From 01e62960ac90cf7fffc5e9b70c8931b74b349fd2 Mon Sep 17 00:00:00 2001
From: Harsha
Date: Fri, 20 Nov 2020 13:36:23 +0530
Subject: [PATCH 039/184] updating dockerfile with plugins (#2047)
---
pipelines/build/nodebb/Dockerfile | 8 +++++---
1 file changed, 5 insertions(+), 3 deletions(-)
diff --git a/pipelines/build/nodebb/Dockerfile b/pipelines/build/nodebb/Dockerfile
index eea8d41c1..104c3d913 100644
--- a/pipelines/build/nodebb/Dockerfile
+++ b/pipelines/build/nodebb/Dockerfile
@@ -11,9 +11,11 @@ RUN npm install --only=prod && \
npm cache clean --force
-RUN npm install https://github.com/vrayulu/nodebb-plugin-sunbird-oidc.git
-RUN npm install https://github.com/ankitv89/nodebb-plugin-create-forum
-RUN npm install https://github.com/bandanasahu123/nodebb-plugin-for-telemetry
+RUN npm install https://github.com/Sunbird-Ed/nodebb-plugin-sunbird-oidc.git
+RUN npm install https://github.com/Sunbird-Ed/nodebb-plugin-sunbird-api.git
+RUN npm install https://github.com/Sunbird-Ed/nodebb-plugin-sunbird-telemetry.git
+RUN npm install https://github.com/Sunbird-Ed/nodebb-plugin-azure-storage.git
+
From 6a2670fc252089fff317325ca0100ae57e08b940 Mon Sep 17 00:00:00 2001
From: Rajesh Rajendran
Date: Fri, 20 Nov 2020 14:03:00 +0530
Subject: [PATCH 040/184] Compressing cached endpoints (#2048)
* Adding common compression block
* Compressing cached API
Signed-off-by: Rajesh Rajendran
---
.../templates/configMap.yaml | 2 +
.../core/nginx-public-ingress/values.j2 | 130 +++++++++---------
2 files changed, 68 insertions(+), 64 deletions(-)
diff --git a/kubernetes/helm_charts/core/nginx-public-ingress/templates/configMap.yaml b/kubernetes/helm_charts/core/nginx-public-ingress/templates/configMap.yaml
index ef909bb6a..87f6b5716 100644
--- a/kubernetes/helm_charts/core/nginx-public-ingress/templates/configMap.yaml
+++ b/kubernetes/helm_charts/core/nginx-public-ingress/templates/configMap.yaml
@@ -6,6 +6,8 @@ metadata:
data:
proxy-default.conf: |
{{ .Values.proxyconfig | indent 4 }}
+ compression.conf: |
+{{ .Values.compressionConfig | indent 4 }}
---
apiVersion: v1
diff --git a/kubernetes/helm_charts/core/nginx-public-ingress/values.j2 b/kubernetes/helm_charts/core/nginx-public-ingress/values.j2
index 07abf6f6e..d3817b724 100644
--- a/kubernetes/helm_charts/core/nginx-public-ingress/values.j2
+++ b/kubernetes/helm_charts/core/nginx-public-ingress/values.j2
@@ -185,8 +185,11 @@ proxyconfig: |-
}
# This is Caching mechanism for POST requests location search
location ~ /learner/data/v1/location/search {
+ # Enabling compression
+ include /etc/nginx/defaults.d/compression.conf;
# Enabling caching
- proxy_cache_key "$request_uri|$request_body";
+ # caching include Accept-Encoding header also, to provide gziped or plain content as per request
+ proxy_cache_key "$http_accept_encoding|$request_uri|$request_body";
proxy_cache framework_cache;
add_header X-Proxy-Cache $upstream_cache_status;
add_header X-Proxy-Cache-Date $upstream_http_date;
@@ -210,8 +213,11 @@ proxyconfig: |-
}
# Caching for content consumption
location ~ /api/(content/v1/read|course/v1/hierarchy) {
+ # Enabling compression
+ include /etc/nginx/defaults.d/compression.conf;
# Enabling caching
- proxy_cache_key "$request_uri|$request_body";
+ # caching include Accept-Encoding header also, to provide gziped or plain content as per request
+ proxy_cache_key "$http_accept_encoding|$request_uri|$request_body";
proxy_cache content_cache;
add_header X-Proxy-Cache $upstream_cache_status;
add_header X-Proxy-Cache-Date $upstream_http_date;
@@ -237,8 +243,11 @@ proxyconfig: |-
}
# This is Caching mechanism for Content search
location ~ /api/content/v1/search {
+ # Enabling compression
+ include /etc/nginx/defaults.d/compression.conf;
# Enabling caching
- proxy_cache_key "$request_uri|$request_body";
+ # caching include Accept-Encoding header also, to provide gziped or plain content as per request
+ proxy_cache_key "$http_accept_encoding|$request_uri|$request_body";
proxy_cache content_cache;
add_header X-Proxy-Cache $upstream_cache_status;
add_header X-Proxy-Cache-Date $upstream_http_date;
@@ -264,8 +273,11 @@ proxyconfig: |-
}
# This is Caching mechanism for POST requests
location ~ /api/org/v1/search|/api/data/v1/(form/read|location/search) {
+ # Enabling compression
+ include /etc/nginx/defaults.d/compression.conf;
# Enabling caching
- proxy_cache_key "$request_uri|$request_body";
+ # caching include Accept-Encoding header also, to provide gziped or plain content as per request
+ proxy_cache_key "$http_accept_encoding|$request_uri|$request_body";
proxy_cache framework_cache;
add_header X-Proxy-Cache $upstream_cache_status;
add_header X-Proxy-Cache-Date $upstream_http_date;
@@ -289,8 +301,11 @@ proxyconfig: |-
proxy_pass http://kong;
}
location ~ /api/(framework/v1/read|data/v1/system/settings/get) {
+ # Enabling compression
+ include /etc/nginx/defaults.d/compression.conf;
# Enabling caching
- proxy_cache_key $proxy_host$request_uri;
+ # caching include Accept-Encoding header also, to provide gziped or plain content as per request
+ proxy_cache_key "$http_accept_encoding|$request_uri|$request_body";
proxy_cache framework_cache;
add_header X-Proxy-Cache $upstream_cache_status;
add_header X-Proxy-Cache-Date $upstream_http_date;
@@ -327,34 +342,7 @@ proxyconfig: |-
if ( $http_authorization ) {
set $custom_header "$http_authorization";
}
- # Compression
- gzip on;
- gzip_comp_level 5;
- gzip_min_length 256; # 256Bytes
- gzip_proxied any;
- gzip_vary on;
- # Content types for compression
- gzip_types
- application/atom+xml
- application/javascript
- application/json
- application/ld+json
- application/manifest+json
- application/rss+xml
- application/vnd.geo+json
- application/vnd.ms-fontobject
- application/x-font-ttf
- application/x-web-app-manifest+json
- application/xhtml+xml
- application/xml
- font/opentype
- image/bmp
- image/svg+xml
- image/x-icon
- text/cache-manifest
- text/css
- text/plain
- #
+ include /etc/nginx/defaults.d/compression.conf;
proxy_set_header Authorization $custom_header;
rewrite ^/api/(.*) /$1 break;
proxy_set_header Connection "";
@@ -737,34 +725,7 @@ proxyconfig: |-
# compression for svg certs download
location /api/certreg/v2/certs/download {
rewrite ^/api/(.*) /$1 break;
- # Compression
- gzip on;
- gzip_comp_level 5;
- gzip_min_length 50000; # 50KB
- gzip_proxied any;
- gzip_vary on;
- # Content types for compression
- gzip_types
- application/atom+xml
- application/javascript
- application/json
- application/ld+json
- application/manifest+json
- application/rss+xml
- application/vnd.geo+json
- application/vnd.ms-fontobject
- application/x-font-ttf
- application/x-web-app-manifest+json
- application/xhtml+xml
- application/xml
- font/opentype
- image/bmp
- image/svg+xml
- image/x-icon
- text/cache-manifest
- text/css
- text/plain
- add_header test hello;
+ include /etc/nginx/defaults.d/compression.conf;
proxy_set_header Connection "";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
@@ -859,7 +820,11 @@ proxyconfig: |-
proxy_read_timeout 70;
}
location ~ /resourcebundles/v1/read|/learner/data/v1/(role/read|system/settings/get)|/v1/tenant/info {
- proxy_cache_key $proxy_host$request_uri;
+ # Enabling compression
+ include /etc/nginx/defaults.d/compression.conf;
+ # Enabling caching
+ # caching include Accept-Encoding header also, to provide gziped or plain content as per request
+ proxy_cache_key "$http_accept_encoding|$request_uri|$request_body";
proxy_cache framework_cache;
add_header X-Proxy-Cache $upstream_cache_status;
add_header X-Proxy-Cache-Date $upstream_http_date;
@@ -877,7 +842,11 @@ proxyconfig: |-
proxy_pass http://player;
}
location /api/channel/v1/read {
- proxy_cache_key $proxy_host$request_uri;
+ # Enabling compression
+ include /etc/nginx/defaults.d/compression.conf;
+ # Enabling caching
+ # caching include Accept-Encoding header also, to provide gziped or plain content as per request
+ proxy_cache_key "$http_accept_encoding|$request_uri|$request_body";
proxy_cache framework_cache;
add_header X-Proxy-Cache $upstream_cache_status;
add_header X-Proxy-Cache-Date $upstream_http_date;
@@ -1126,8 +1095,11 @@ keycloakconf: |
}
# Static Assets for keycloak endpoints with caching
location ~ /auth/(resources/(.+\.(png|svg|ico|js|eot|ttf|woff|woff2|css))|welcome-content/(.+\.(png|svg|ico|js|eot|ttf|woff|woff2|css))) {
+ # Enabling compression
+ include /etc/nginx/defaults.d/compression.conf;
# Enabling caching
- proxy_cache_key $proxy_host$request_uri;
+ # caching include Accept-Encoding header also, to provide gziped or plain content as per request
+ proxy_cache_key "$http_accept_encoding|$request_uri|$request_body";
proxy_cache proxy_cache;
add_header X-Proxy-Cache $upstream_cache_status;
add_header X-Proxy-Cache-Date $upstream_http_date;
@@ -1164,6 +1136,36 @@ keycloakconf: |
}
}
+compressionConfig: |-
+ # Compression
+ gzip on;
+ gzip_comp_level 5;
+ gzip_min_length 256; # 256Bytes
+ gzip_proxied any;
+ gzip_vary on;
+ # Content types for compression
+ gzip_types
+ application/atom+xml
+ application/javascript
+ application/json
+ application/ld+json
+ application/manifest+json
+ application/rss+xml
+ application/vnd.geo+json
+ application/vnd.ms-fontobject
+ application/x-font-ttf
+ application/x-web-app-manifest+json
+ application/xhtml+xml
+ application/xml
+ font/opentype
+ image/bmp
+ image/svg+xml
+ image/x-icon
+ text/cache-manifest
+ text/css
+ text/plain
+ ;
+
serviceMonitor:
enabled: true
labels: # labels with which the prometheus choose the serviceMonitor
From 1bde79b1f35afd78bff93d510d2c113869990afb Mon Sep 17 00:00:00 2001
From: Mahesh Kumar Gangula
Date: Sat, 21 Nov 2020 12:58:40 +0530
Subject: [PATCH 041/184] H5P Library update (#2051)
* Issue #000 fix: h5p lib update.
* Issue #000 fix: define a variable.
---
.../stack-sunbird/templates/content-service_application.conf | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/ansible/roles/stack-sunbird/templates/content-service_application.conf b/ansible/roles/stack-sunbird/templates/content-service_application.conf
index 814b9ed22..b49da3076 100644
--- a/ansible/roles/stack-sunbird/templates/content-service_application.conf
+++ b/ansible/roles/stack-sunbird/templates/content-service_application.conf
@@ -375,7 +375,7 @@ content {
}
h5p {
library {
- path: "https://s3.ap-south-1.amazonaws.com/ekstep-public-prod/content/templates/h5p-library-latest.zip"
+ path: "{{ h5p_library_path | default('https://sunbirddev.blob.core.windows.net/sunbird-content-dev/h5p-standalone-1.3.4.zip') }}"
}
}
copy {
From 097ee97519c8ad9fdde83e6e052659e047241add Mon Sep 17 00:00:00 2001
From: Kumar Gauraw
Date: Mon, 23 Nov 2020 09:53:47 +0530
Subject: [PATCH 042/184] Issue #SB-21521 fix: updated config for collection
categories (#2050)
---
.../stack-sunbird/templates/content-service_application.conf | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/ansible/roles/stack-sunbird/templates/content-service_application.conf b/ansible/roles/stack-sunbird/templates/content-service_application.conf
index b49da3076..c48ecb69b 100644
--- a/ansible/roles/stack-sunbird/templates/content-service_application.conf
+++ b/ansible/roles/stack-sunbird/templates/content-service_application.conf
@@ -569,8 +569,8 @@ channel {
additionalcategories=["Classroom Teaching Video", "Concept Map", "Curiosity Question Set", "Experiential Resource", "Explanation Video", "Focus Spot", "Learning Outcome Definition", "Lesson Plan", "Marking Scheme Rubric", "Pedagogy Flow", "Previous Board Exam Papers", "TV Lesson", "Textbook"]
}
collection {
- primarycategories=["Content Playlist", "Course", "Digital Textbook", "Explanation Content"]
- additionalcategories=["Textbook", "Lesson Plan", "TV Lesson"]
+ primarycategories=["Content Playlist", "Course", "Digital Textbook"]
+ additionalcategories=["Textbook", "Lesson Plan"]
}
asset {
primarycategories=["Asset", "CertAsset", "Certificate Template"]
From 23c186450adc9f045782271f3874499edeaca109 Mon Sep 17 00:00:00 2001
From: Rajesh Rajendran
Date: Mon, 23 Nov 2020 16:12:57 +0530
Subject: [PATCH 043/184] Caching course/v1/batch/read (#2049)
Signed-off-by: Rajesh Rajendran
---
kubernetes/helm_charts/core/nginx-public-ingress/values.j2 | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/kubernetes/helm_charts/core/nginx-public-ingress/values.j2 b/kubernetes/helm_charts/core/nginx-public-ingress/values.j2
index d3817b724..472077e83 100644
--- a/kubernetes/helm_charts/core/nginx-public-ingress/values.j2
+++ b/kubernetes/helm_charts/core/nginx-public-ingress/values.j2
@@ -212,7 +212,7 @@ proxyconfig: |-
proxy_pass http://player;
}
# Caching for content consumption
- location ~ /api/(content/v1/read|course/v1/hierarchy) {
+ location ~ /api/(content/v1/read|course/v1/hierarchy|course/v1/batch/read) {
# Enabling compression
include /etc/nginx/defaults.d/compression.conf;
# Enabling caching
From 05192e6738813439b99183721a4eb01835efde20 Mon Sep 17 00:00:00 2001
From: Rajesh Rajendran
Date: Mon, 23 Nov 2020 20:17:52 +0530
Subject: [PATCH 044/184] Nginx logging improvements (#2052)
* changing nginx recording rule to irate from rate
irate will take consecutive 2 data points and more accurate than rate
function.
ref: https://www.robustperception.io/irate-graphs-are-better-graphs
Signed-off-by: Rajesh Rajendran
* Removing istio and helm exporter metrics.
Signed-off-by: Rajesh Rajendran
* Adding wild card match to capture all unaccounted log entries.
Signed-off-by: Rajesh Rajendran
* Nginx exposing interface to enable custom logging
for example, in ansible overrides below entry will log all
Accept-Encoding headers.
nginx_additional_log_fields: '"$http_accept_encoding"'
Signed-off-by: Rajesh Rajendran
---
.../templates/additional-scrape-configs.yaml | 137 ------------------
.../templates/recordingRules.yaml | 10 +-
.../core/nginx-public-ingress/values.j2 | 2 +-
.../fluent-bit/templates/configMap.yaml | 6 +-
4 files changed, 10 insertions(+), 145 deletions(-)
diff --git a/kubernetes/ansible/roles/sunbird-monitoring/templates/additional-scrape-configs.yaml b/kubernetes/ansible/roles/sunbird-monitoring/templates/additional-scrape-configs.yaml
index 0af9d7c5f..e5eb3a5c7 100644
--- a/kubernetes/ansible/roles/sunbird-monitoring/templates/additional-scrape-configs.yaml
+++ b/kubernetes/ansible/roles/sunbird-monitoring/templates/additional-scrape-configs.yaml
@@ -68,143 +68,6 @@ scrapeconfig:
- targets: ["{{ groups['druid'] | difference(["localhost"]) | map('regex_replace', '^(.*)$', '\\1:9108' ) | list | join("\", \"") }}"]
{% endif %}
-
- - job_name: 'helm-exporter'
- static_configs:
- - targets: ['helm-exporter.monitoring.svc.cluster.local:9571']
- # Istio metrics
- - job_name: istio-mesh
- scrape_interval: 15s
- scrape_timeout: 10s
- metrics_path: /metrics
- scheme: http
- kubernetes_sd_configs:
- - role: endpoints
- namespaces:
- names:
- - istio-system
- relabel_configs:
- - source_labels: [__meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]
- separator: ;
- regex: istio-telemetry;prometheus
- replacement: $1
- action: keep
- - job_name: envoy-stats
- scrape_interval: 15s
- scrape_timeout: 10s
- metrics_path: /stats/prometheus
- scheme: http
- kubernetes_sd_configs:
- - role: pod
- relabel_configs:
- - source_labels: [__meta_kubernetes_pod_container_port_name]
- separator: ;
- regex: .*-envoy-prom
- replacement: $1
- action: keep
- - source_labels: [__address__, __meta_kubernetes_pod_annotation_prometheus_io_port]
- separator: ;
- regex: ([^:]+)(?::\d+)?;(\d+)
- target_label: __address__
- replacement: $1:15090
- action: replace
- - separator: ;
- regex: __meta_kubernetes_pod_label_(.+)
- replacement: $1
- action: labelmap
- - source_labels: [__meta_kubernetes_namespace]
- separator: ;
- regex: (.*)
- target_label: namespace
- replacement: $1
- action: replace
- - source_labels: [__meta_kubernetes_pod_name]
- separator: ;
- regex: (.*)
- target_label: pod_name
- replacement: $1
- action: replace
- - job_name: istio-policy
- scrape_interval: 15s
- scrape_timeout: 10s
- metrics_path: /metrics
- scheme: http
- kubernetes_sd_configs:
- - role: endpoints
- namespaces:
- names:
- - istio-system
- relabel_configs:
- - source_labels: [__meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]
- separator: ;
- regex: istio-policy;http-monitoring
- replacement: $1
- action: keep
- - job_name: istio-telemetry
- scrape_interval: 15s
- scrape_timeout: 10s
- metrics_path: /metrics
- scheme: http
- kubernetes_sd_configs:
- - role: endpoints
- namespaces:
- names:
- - istio-system
- relabel_configs:
- - source_labels: [__meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]
- separator: ;
- regex: istio-telemetry;http-monitoring
- replacement: $1
- action: keep
- - job_name: pilot
- scrape_interval: 15s
- scrape_timeout: 10s
- metrics_path: /metrics
- scheme: http
- kubernetes_sd_configs:
- - role: endpoints
- namespaces:
- names:
- - istio-system
- relabel_configs:
- - source_labels: [__meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]
- separator: ;
- regex: istio-pilot;http-monitoring
- replacement: $1
- action: keep
- - job_name: galley
- scrape_interval: 15s
- scrape_timeout: 10s
- metrics_path: /metrics
- scheme: http
- kubernetes_sd_configs:
- - role: endpoints
- namespaces:
- names:
- - istio-system
- relabel_configs:
- - source_labels: [__meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]
- separator: ;
- regex: istio-galley;http-monitoring
- replacement: $1
- action: keep
- - job_name: citadel
- scrape_interval: 15s
- scrape_timeout: 10s
- metrics_path: /metrics
- scheme: http
- kubernetes_sd_configs:
- - role: endpoints
- namespaces:
- names:
- - istio-system
- relabel_configs:
- - source_labels: [__meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]
- separator: ;
- regex: istio-citadel;http-monitoring
- replacement: $1
- action: keep
-
- job_name: 'redis_exporter_targets'
static_configs:
- targets: ["{{ groups['redis-exporter-targets'] | difference(["localhost"]) | map('regex_replace', '^(.*)$', '\\1:6379') | list | join("\", \"") }}"]
diff --git a/kubernetes/helm_charts/core/nginx-public-ingress/templates/recordingRules.yaml b/kubernetes/helm_charts/core/nginx-public-ingress/templates/recordingRules.yaml
index 5347313e2..1701d0833 100644
--- a/kubernetes/helm_charts/core/nginx-public-ingress/templates/recordingRules.yaml
+++ b/kubernetes/helm_charts/core/nginx-public-ingress/templates/recordingRules.yaml
@@ -12,10 +12,12 @@ spec:
groups:
- name: nginx-recording.rules
rules:
- - expr: sum(rate(nginx_http_requests_total[5m])) by (cache_status, host, env, status)
- record: job:nginx_http_requests_total:rate:sum:5m
- - expr: sum(rate(nginx_http_requests_total[15m])) by (cache_status, host, env, status)
- record: job:nginx_http_requests_total:rate:sum:15m
+ - expr: sum(irate(nginx_http_requests_total[1m])) by (cache_status, host, env, status)
+ record: job:nginx_http_requests_total:irate:sum:1m
+ - expr: sum(irate(nginx_http_requests_total[5m])) by (cache_status, host, env, status)
+ record: job:nginx_http_requests_total:irate:sum:5m
+ - expr: sum(irate(nginx_http_requests_total[15m])) by (cache_status, host, env, status)
+ record: job:nginx_http_requests_total:irate:sum:15m
- record: job:nginx_http_success_percentage:increase:sum:5m
expr: |-
(
diff --git a/kubernetes/helm_charts/core/nginx-public-ingress/values.j2 b/kubernetes/helm_charts/core/nginx-public-ingress/values.j2
index 472077e83..35c95435a 100644
--- a/kubernetes/helm_charts/core/nginx-public-ingress/values.j2
+++ b/kubernetes/helm_charts/core/nginx-public-ingress/values.j2
@@ -932,7 +932,7 @@ nginxconfig: |
' $request_time $upstream_response_time $pipe'
' "$http_referer" "$http_user_agent" "$sb_request_id"'
' "$http_x_device_id" "$http_x_channel_id" "$http_x_app_id"'
- ' "$http_x_app_ver" "$http_x_session_id"';
+ ' "$http_x_app_ver" "$http_x_session_id" {{nginx_additional_log_fields | default("")}}';
access_log /var/log/nginx/access.log main;
# Shared dictionary to store metrics
lua_shared_dict prometheus_metrics 100M;
diff --git a/kubernetes/helm_charts/logging/fluent-bit/templates/configMap.yaml b/kubernetes/helm_charts/logging/fluent-bit/templates/configMap.yaml
index b6fab89e3..8c3579e20 100644
--- a/kubernetes/helm_charts/logging/fluent-bit/templates/configMap.yaml
+++ b/kubernetes/helm_charts/logging/fluent-bit/templates/configMap.yaml
@@ -22,7 +22,7 @@ data:
Merge_Parser catchall
# Don't need merged logs
# More over, we're using custom parser, which catch all and tag it as log
- Keep_Log Off
+ Keep_Log Off
# Annotate pod to select the parser
# annotaions:
# fluentbit.io/parsers: nginx2
@@ -141,8 +141,8 @@ data:
[PARSER]
Name nginx2
Format regex
- # https://rubular.com/r/ZSLRpLS1B4XFbC
- Regex ^(?[^ ]*) (?[^ ]*) (?[^ ]*) \[(?[^\]]*)\] "(?\S+)(?: +(?[^\"]*?)(?: +\S*)?)?" (?[^ ]*) (?[^ ]*) (?[^ ]*) (?[^ ]+) (?[^ ]+) (?\.*) (?:"(?[^\"]*)" "(?[^\"]*)") "(?[^\"]*)" "(?[^\"]*)" "(?[^\"]*)" "(?[^\"]*)" "(?[^\"]*)" "(?[^\"]*)"
+ # https://rubular.com/r/IWnYbkLpdRI8Jh
+ Regex ^(?[^ ]*) (?[^ ]*) (?[^ ]*) \[(?[^\]]*)\] "(?\S+)(?: +(?[^\"]*?)(?: +\S*)?)?" (?[^ ]*) (?[^ ]*) (?[^ ]*) (?[^ ]+) (?[^ ]+) (?\.*) (?:"(?[^\"]*)" "(?[^\"]*)") "(?[^\"]*)" "(?[^\"]*)" "(?[^\"]*)" "(?[^\"]*)" "(?[^\"]*)" "(?[^\"]*)"\s*(?.*)$
Time_Key time
Types n_rstime:float n_rqtime:float n_rssize:integer n_rqsize:integer
Time_Format %d/%b/%Y:%H:%M:%S %z
From 31eac672097f0d2c57efcf7260fdbd96f9f60a4d Mon Sep 17 00:00:00 2001
From: Manjunath Davanam
Date: Wed, 25 Nov 2020 11:44:24 +0530
Subject: [PATCH 045/184] KP & DP flink jobs grafana dashboard (#2054)
* Issue #000 fix: KP flink jobs grafana update
* Issue #000 fix: KP flink jobs grafana update
* Issue #000 fix: Dp flink dashboard setup
---
.../dp-flink-jobs-metrics-dashboard.json | 5902 ++++++++
.../dashboards/dp-flink-lag-dashboard.json | 12517 ++++++++++++++++
.../kp-flink-jobs-metrics-dashboard.json | 350 +-
.../monitoring/dashboards/values.yaml | 4 +
4 files changed, 18699 insertions(+), 74 deletions(-)
create mode 100644 kubernetes/helm_charts/monitoring/dashboards/dashboards/dp-flink-jobs-metrics-dashboard.json
create mode 100644 kubernetes/helm_charts/monitoring/dashboards/dashboards/dp-flink-lag-dashboard.json
diff --git a/kubernetes/helm_charts/monitoring/dashboards/dashboards/dp-flink-jobs-metrics-dashboard.json b/kubernetes/helm_charts/monitoring/dashboards/dashboards/dp-flink-jobs-metrics-dashboard.json
new file mode 100644
index 000000000..049b371f4
--- /dev/null
+++ b/kubernetes/helm_charts/monitoring/dashboards/dashboards/dp-flink-jobs-metrics-dashboard.json
@@ -0,0 +1,5902 @@
+{
+ "annotations": {
+ "list": [
+ {
+ "builtIn": 1,
+ "datasource": "-- Grafana --",
+ "enable": true,
+ "hide": true,
+ "iconColor": "rgba(0, 211, 255, 1)",
+ "name": "Annotations & Alerts",
+ "type": "dashboard"
+ }
+ ]
+ },
+ "editable": true,
+ "gnetId": null,
+ "graphTooltip": 0,
+ "id": 39,
+ "links": [],
+ "panels": [
+ {
+ "collapsed": true,
+ "datasource": null,
+ "gridPos": {
+ "h": 1,
+ "w": 24,
+ "x": 0,
+ "y": 0
+ },
+ "id": 74,
+ "panels": [
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#73BF69",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "datasource": "Flink-Prometheus",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 5,
+ "w": 6,
+ "x": 0,
+ "y": 2
+ },
+ "id": 78,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "",
+ "targets": [
+ {
+ "expr": "sum(flink_taskmanager_job_task_operator_KafkaConsumer_records_lag_max { job = \"ingest-router-taskmanager-prometheus\" })",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Ingestion Router lag",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Flink-Prometheus",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "fill": 1,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 5,
+ "w": 12,
+ "x": 6,
+ "y": 2
+ },
+ "hiddenSeries": false,
+ "id": 76,
+ "legend": {
+ "avg": false,
+ "current": true,
+ "max": false,
+ "min": false,
+ "show": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "nullPointMode": "null",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 2,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "sum(flink_taskmanager_job_task_operator_KafkaConsumer_records_lag_max { job = \"ingest-router-taskmanager-prometheus\" })",
+ "interval": "",
+ "legendFormat": "Consumer lag",
+ "refId": "A"
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "IngestRouter lag",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "$$hashKey": "object:458",
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ },
+ {
+ "$$hashKey": "object:459",
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ }
+ ],
+ "title": "Ingest Router",
+ "type": "row"
+ },
+ {
+ "collapsed": true,
+ "datasource": null,
+ "gridPos": {
+ "h": 1,
+ "w": 24,
+ "x": 0,
+ "y": 1
+ },
+ "id": 2,
+ "panels": [
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#73BF69",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "datasource": "Flink-Prometheus",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 6,
+ "x": 0,
+ "y": 11
+ },
+ "id": 4,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "",
+ "targets": [
+ {
+ "expr": "sum(sum_over_time(flink_taskmanager_job_task_operator_TelemetryExtractorJob_success_batch_count[$__range]))",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Extractor Success",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#299c46",
+ "rgba(237, 129, 40, 0.89)",
+ "#E02F44"
+ ],
+ "datasource": "Flink-Prometheus",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 6,
+ "x": 6,
+ "y": 11
+ },
+ "id": 6,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "",
+ "targets": [
+ {
+ "expr": "sum(sum_over_time(flink_taskmanager_job_task_operator_TelemetryExtractorJob_duplicate_event_count[$__range]))",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Extractor Duplicates",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#299c46",
+ "rgba(237, 129, 40, 0.89)",
+ "#E02F44"
+ ],
+ "datasource": "Flink-Prometheus",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 6,
+ "x": 12,
+ "y": 11
+ },
+ "id": 59,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "",
+ "targets": [
+ {
+ "expr": "sum(sum_over_time(flink_taskmanager_job_task_operator_TelemetryExtractorJob_success_event_count[$__range]))",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Raw Events",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#d44a3a",
+ "rgba(237, 129, 40, 0.89)",
+ "#299c46"
+ ],
+ "datasource": "Flink-Prometheus",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 6,
+ "x": 18,
+ "y": 11
+ },
+ "id": 5,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "",
+ "targets": [
+ {
+ "expr": "sum(sum_over_time(flink_taskmanager_job_task_operator_TelemetryExtractorJob_failed_batch_count[$__range]))",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Extractor Failed",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Flink-Prometheus",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "fill": 1,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 8,
+ "w": 12,
+ "x": 0,
+ "y": 15
+ },
+ "hiddenSeries": false,
+ "id": 10,
+ "legend": {
+ "avg": false,
+ "current": false,
+ "max": false,
+ "min": false,
+ "show": true,
+ "total": true,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "nullPointMode": "null",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 2,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "sum(flink_taskmanager_job_task_operator_TelemetryExtractorJob_success_event_count)",
+ "format": "time_series",
+ "instant": false,
+ "interval": "",
+ "intervalFactor": 1,
+ "legendFormat": "ExtractorSuccess",
+ "refId": "A"
+ },
+ {
+ "expr": "sum(flink_taskmanager_job_task_operator_TelemetryExtractorJob_duplicate_event_count)",
+ "interval": "",
+ "legendFormat": "ExtractorDuplicates",
+ "refId": "B"
+ },
+ {
+ "expr": "sum(flink_taskmanager_job_task_operator_TelemetryExtractorJob_failed_batch_count)",
+ "interval": "",
+ "legendFormat": "ExtractorFailed",
+ "refId": "C"
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Telemetry Extractor",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "$$hashKey": "object:162",
+ "format": "short",
+ "label": "",
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ },
+ {
+ "$$hashKey": "object:163",
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Flink-Prometheus",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "fill": 1,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 8,
+ "w": 12,
+ "x": 12,
+ "y": 15
+ },
+ "hiddenSeries": false,
+ "id": 12,
+ "legend": {
+ "avg": false,
+ "current": true,
+ "max": false,
+ "min": false,
+ "show": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "nullPointMode": "null",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 2,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "sum(flink_taskmanager_job_task_operator_KafkaConsumer_records_lag_max { job = \"telemetry-extractor-taskmanager-prometheus\" })",
+ "interval": "",
+ "legendFormat": "Consumer lag",
+ "refId": "A"
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "TelemetryExtractor lag",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "$$hashKey": "object:378",
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ },
+ {
+ "$$hashKey": "object:379",
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ }
+ ],
+ "title": "TelemetryExtractor",
+ "type": "row"
+ },
+ {
+ "collapsed": false,
+ "datasource": null,
+ "gridPos": {
+ "h": 1,
+ "w": 24,
+ "x": 0,
+ "y": 2
+ },
+ "id": 14,
+ "panels": [],
+ "title": "Pipeline Preprocessor",
+ "type": "row"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#299c46",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "datasource": "Flink-Prometheus",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 5,
+ "x": 0,
+ "y": 3
+ },
+ "id": 16,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "",
+ "targets": [
+ {
+ "expr": "sum(sum_over_time(flink_taskmanager_job_task_operator_PipelinePreprocessorJob_validation_success_event_count[$__range])) + sum(sum_over_time(flink_taskmanager_job_task_operator_PipelinePreprocessorJob_validation_failed_event_count[$__range])) ",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Raw Events",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#299c46",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "datasource": "Flink-Prometheus",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 5,
+ "x": 5,
+ "y": 3
+ },
+ "id": 61,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "",
+ "targets": [
+ {
+ "expr": "sum(sum_over_time(flink_taskmanager_job_task_operator_PipelinePreprocessorJob_unique_event_count[$__range]))",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Unique Events",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#299c46",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "datasource": "Flink-Prometheus",
+ "decimals": null,
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 5,
+ "x": 10,
+ "y": 3
+ },
+ "id": 60,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "",
+ "targets": [
+ {
+ "expr": "sum(sum_over_time(flink_taskmanager_job_task_operator_PipelinePreprocessorJob_duplicate_event_count[$__range]))",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Duplicate Events",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#299c46",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "datasource": "Flink-Prometheus",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 5,
+ "x": 15,
+ "y": 3
+ },
+ "id": 22,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "",
+ "targets": [
+ {
+ "expr": "sum(sum_over_time(flink_taskmanager_job_task_operator_PipelinePreprocessorJob_validation_failed_event_count[$__range]))",
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Invalid Events",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#d44a3a",
+ "rgba(237, 129, 40, 0.89)",
+ "#299c46"
+ ],
+ "datasource": "Flink-Prometheus",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 4,
+ "x": 20,
+ "y": 3
+ },
+ "id": 67,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "",
+ "targets": [
+ {
+ "expr": "sum(sum_over_time(flink_taskmanager_job_task_operator_PipelinePreprocessorJob_validation_failed_event_count[$__range])) / (sum(sum_over_time(flink_taskmanager_job_task_operator_PipelinePreprocessorJob_validation_failed_event_count[$__range])) +sum(sum_over_time(flink_taskmanager_job_task_operator_PipelinePreprocessorJob_validation_success_event_count[$__range]))) * 100",
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Invalid Events %",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#299c46",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "datasource": "Flink-Prometheus",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 5,
+ "x": 0,
+ "y": 7
+ },
+ "id": 21,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "",
+ "targets": [
+ {
+ "expr": "sum(sum_over_time(flink_taskmanager_job_task_operator_PipelinePreprocessorJob_primary_route_success_count[$__range])) + sum(sum_over_time(flink_taskmanager_job_task_operator_PipelinePreprocessorJob_share_item_event_success_count[$__range]))",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Primary Events",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#299c46",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "datasource": "Flink-Prometheus",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 5,
+ "x": 5,
+ "y": 7
+ },
+ "id": 23,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "",
+ "targets": [
+ {
+ "expr": "sum(sum_over_time(flink_taskmanager_job_task_operator_PipelinePreprocessorJob_audit_route_success_count[$__range]))",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Audit Events",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#299c46",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "datasource": "Flink-Prometheus",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 5,
+ "x": 10,
+ "y": 7
+ },
+ "id": 17,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "",
+ "targets": [
+ {
+ "expr": "sum(sum_over_time(flink_taskmanager_job_task_operator_PipelinePreprocessorJob_log_route_success_count[$__range]))",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Log Events",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#299c46",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "datasource": "Flink-Prometheus",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 5,
+ "x": 15,
+ "y": 7
+ },
+ "id": 19,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "",
+ "targets": [
+ {
+ "expr": "sum(sum_over_time(flink_taskmanager_job_task_operator_PipelinePreprocessorJob_share_route_success_count[$__range]))",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Share Events",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#299c46",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "datasource": "Flink-Prometheus",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 4,
+ "x": 20,
+ "y": 7
+ },
+ "id": 18,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "",
+ "targets": [
+ {
+ "expr": "sum(sum_over_time(flink_taskmanager_job_task_operator_PipelinePreprocessorJob_error_route_success_count[$__range]))",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Error Events",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Flink-Prometheus",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "fill": 1,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 8,
+ "w": 12,
+ "x": 0,
+ "y": 11
+ },
+ "hiddenSeries": false,
+ "id": 25,
+ "legend": {
+ "avg": false,
+ "current": false,
+ "max": false,
+ "min": false,
+ "show": true,
+ "total": true,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "nullPointMode": "null",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 2,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "sum(flink_taskmanager_job_task_operator_PipelinePreprocessorJob_primary_route_success_count)",
+ "interval": "",
+ "legendFormat": "Primary Events",
+ "refId": "A"
+ },
+ {
+ "expr": "sum(flink_taskmanager_job_task_operator_PipelinePreprocessorJob_log_route_success_count)",
+ "interval": "",
+ "intervalFactor": 1,
+ "legendFormat": "Log Events",
+ "refId": "B"
+ },
+ {
+ "expr": "sum(flink_taskmanager_job_task_operator_PipelinePreprocessorJob_error_route_success_count)",
+ "interval": "",
+ "legendFormat": "Error Events",
+ "refId": "C"
+ },
+ {
+ "expr": "sum(flink_taskmanager_job_task_operator_PipelinePreprocessorJob_audit_route_success_count)",
+ "interval": "",
+ "legendFormat": "Audit Events",
+ "refId": "D"
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Pipeline Preprocessor",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Flink-Prometheus",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "fill": 1,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 8,
+ "w": 12,
+ "x": 12,
+ "y": 11
+ },
+ "hiddenSeries": false,
+ "id": 29,
+ "legend": {
+ "avg": false,
+ "current": true,
+ "max": false,
+ "min": false,
+ "show": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "nullPointMode": "null",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 2,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "sum(flink_taskmanager_job_task_operator_KafkaConsumer_records_lag_max { job = \"pipeline-preprocessor-taskmanager-prometheus\" })",
+ "interval": "",
+ "legendFormat": "Consumer lag",
+ "refId": "A"
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Preprocessor lag",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "collapsed": true,
+ "datasource": null,
+ "gridPos": {
+ "h": 1,
+ "w": 24,
+ "x": 0,
+ "y": 19
+ },
+ "id": 99,
+ "panels": [
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#299c46",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "datasource": "Flink-Prometheus",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 4,
+ "x": 0,
+ "y": 2
+ },
+ "id": 100,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "",
+ "targets": [
+ {
+ "expr": "sum(sum_over_time(flink_taskmanager_job_task_operator_DenormalizationJob_device_cache_hit{job=\"de-normalization-primary-taskmanager-prometheus\"}[$__range]))",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Device meta success",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#299c46",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "datasource": "Flink-Prometheus",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 4,
+ "x": 4,
+ "y": 2
+ },
+ "id": 101,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "",
+ "targets": [
+ {
+ "expr": "sum(sum_over_time(flink_taskmanager_job_task_operator_DenormalizationJob_user_cache_hit{job=\"de-normalization-primary-taskmanager-prometheus\"}[$__range]))",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "User meta success",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#299c46",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "datasource": "Flink-Prometheus",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 4,
+ "x": 8,
+ "y": 2
+ },
+ "id": 102,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "",
+ "targets": [
+ {
+ "expr": "sum(sum_over_time(flink_taskmanager_job_task_operator_DenormalizationJob_dialcode_cache_hit{job=\"de-normalization-primary-taskmanager-prometheus\"}[$__range]))",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Dialcode meta success",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#299c46",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "datasource": "Flink-Prometheus",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 4,
+ "x": 12,
+ "y": 2
+ },
+ "id": 103,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "",
+ "targets": [
+ {
+ "expr": "sum(sum_over_time(flink_taskmanager_job_task_operator_DenormalizationJob_content_cache_hit{job=\"de-normalization-primary-taskmanager-prometheus\"}[$__range]))",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Content meta success",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#299c46",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "datasource": "Flink-Prometheus",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 4,
+ "x": 16,
+ "y": 2
+ },
+ "id": 104,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "",
+ "targets": [
+ {
+ "expr": "sum(sum_over_time(flink_taskmanager_job_task_operator_DenormalizationJob_loc_cache_hit{job=\"de-normalization-primary-taskmanager-prometheus\"}[$__range]))",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Location meta success",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#d44a3a",
+ "rgba(237, 129, 40, 0.89)",
+ "#299c46"
+ ],
+ "datasource": "Flink-Prometheus",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 4,
+ "x": 20,
+ "y": 2
+ },
+ "id": 120,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "Expired events",
+ "targets": [
+ {
+ "expr": "sum(sum_over_time(flink_taskmanager_job_task_operator_DenormalizationJob_events_expired{job=\"de-normalization-primary-taskmanager-prometheus\"}[$__range]))",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "Expired events",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Expired Events",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#299c46",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "datasource": "Flink-Prometheus",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 5,
+ "x": 0,
+ "y": 6
+ },
+ "id": 106,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "",
+ "targets": [
+ {
+ "expr": "sum(sum_over_time(flink_taskmanager_job_task_operator_DenormalizationJob_device_cache_miss{job=\"de-normalization-primary-taskmanager-prometheus\"}[$__range]))",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Device meta miss",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#299c46",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "datasource": "Flink-Prometheus",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 5,
+ "x": 5,
+ "y": 6
+ },
+ "id": 107,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "",
+ "targets": [
+ {
+ "expr": "sum(sum_over_time(flink_taskmanager_job_task_operator_DenormalizationJob_user_cache_miss{job=\"de-normalization-primary-taskmanager-prometheus\"}[$__range]))",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "User meta miss",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#299c46",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "datasource": "Flink-Prometheus",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 5,
+ "x": 10,
+ "y": 6
+ },
+ "id": 108,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "",
+ "targets": [
+ {
+ "expr": "sum(sum_over_time(flink_taskmanager_job_task_operator_DenormalizationJob_dialcode_cache_miss{job=\"de-normalization-primary-taskmanager-prometheus\"}[$__range]))",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Dialcode meta miss",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#299c46",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "datasource": "Flink-Prometheus",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 5,
+ "x": 15,
+ "y": 6
+ },
+ "id": 109,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "",
+ "targets": [
+ {
+ "expr": "sum(sum_over_time(flink_taskmanager_job_task_operator_DenormalizationJob_content_cache_miss{job=\"de-normalization-primary-taskmanager-prometheus\"}[$__range]))",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Content meta miss",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#299c46",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "datasource": "Flink-Prometheus",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 4,
+ "x": 20,
+ "y": 6
+ },
+ "id": 110,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "",
+ "targets": [
+ {
+ "expr": "sum(sum_over_time(flink_taskmanager_job_task_operator_DenormalizationJob_loc_cache_miss{job=\"de-normalization-primary-taskmanager-prometheus\"}[$__range]))",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Location meta miss",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Flink-Prometheus",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "fill": 1,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 8,
+ "w": 12,
+ "x": 0,
+ "y": 10
+ },
+ "hiddenSeries": false,
+ "id": 111,
+ "interval": "",
+ "legend": {
+ "avg": false,
+ "current": false,
+ "max": false,
+ "min": false,
+ "show": true,
+ "total": true,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "nullPointMode": "null",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 2,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "sum(flink_taskmanager_job_task_operator_DenormalizationJob_loc_total{job=\"de-normalization-primary-taskmanager-prometheus\"})",
+ "interval": "",
+ "legendFormat": "Denorm success",
+ "refId": "A"
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "DenormalizationPrimary",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "$$hashKey": "object:1090",
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ },
+ {
+ "$$hashKey": "object:1091",
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Flink-Prometheus",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "fill": 1,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 8,
+ "w": 12,
+ "x": 12,
+ "y": 10
+ },
+ "hiddenSeries": false,
+ "id": 112,
+ "legend": {
+ "avg": false,
+ "current": true,
+ "max": false,
+ "min": false,
+ "show": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "nullPointMode": "null",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 2,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "sum(flink_taskmanager_job_task_operator_KafkaConsumer_records_lag_max { job = \"de-normalization-primary-taskmanager-prometheus\" })",
+ "interval": "",
+ "legendFormat": "Consumer lag",
+ "refId": "A"
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "DenormalizationPrimary lag",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "$$hashKey": "object:1018",
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ },
+ {
+ "$$hashKey": "object:1019",
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ }
+ ],
+ "title": "DenormalizationPrimary",
+ "type": "row"
+ },
+ {
+ "collapsed": true,
+ "datasource": null,
+ "gridPos": {
+ "h": 1,
+ "w": 24,
+ "x": 0,
+ "y": 20
+ },
+ "id": 114,
+ "panels": [
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#299c46",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "datasource": "Flink-Prometheus",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 4,
+ "x": 0,
+ "y": 1
+ },
+ "id": 115,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "",
+ "targets": [
+ {
+ "expr": "sum(sum_over_time(flink_taskmanager_job_task_operator_DenormalizationJob_device_cache_hit{job=\"de-normalization-secondary-taskmanager-prometheus\"}[$__range]))",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Device meta success",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#299c46",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "datasource": "Flink-Prometheus",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 4,
+ "x": 4,
+ "y": 1
+ },
+ "id": 116,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "",
+ "targets": [
+ {
+ "expr": "sum(sum_over_time(flink_taskmanager_job_task_operator_DenormalizationJob_user_cache_hit{job=\"de-normalization-secondary-taskmanager-prometheus\"}[$__range]))",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "User meta success",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#299c46",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "datasource": "Flink-Prometheus",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 4,
+ "x": 8,
+ "y": 1
+ },
+ "id": 117,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "",
+ "targets": [
+ {
+ "expr": "sum(sum_over_time(flink_taskmanager_job_task_operator_DenormalizationJob_dialcode_cache_hit{job=\"de-normalization-secondary-taskmanager-prometheus\"}[$__range]))",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Dialcode meta success",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#299c46",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "datasource": "Flink-Prometheus",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 4,
+ "x": 12,
+ "y": 1
+ },
+ "id": 118,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "",
+ "targets": [
+ {
+ "expr": "sum(sum_over_time(flink_taskmanager_job_task_operator_DenormalizationJob_content_cache_hit{job=\"de-normalization-secondary-taskmanager-prometheus\"}[$__range]))",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Content meta success",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#299c46",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "datasource": "Flink-Prometheus",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 4,
+ "x": 16,
+ "y": 1
+ },
+ "id": 119,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "",
+ "targets": [
+ {
+ "expr": "sum(sum_over_time(flink_taskmanager_job_task_operator_DenormalizationJob_loc_cache_hit{job=\"de-normalization-secondary-taskmanager-prometheus\"}[$__range]))",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Location meta success",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#d44a3a",
+ "rgba(237, 129, 40, 0.89)",
+ "#299c46"
+ ],
+ "datasource": "Flink-Prometheus",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 4,
+ "x": 20,
+ "y": 1
+ },
+ "id": 105,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "Expired events",
+ "targets": [
+ {
+ "expr": "sum(sum_over_time(flink_taskmanager_job_task_operator_DenormalizationJob_events_expired{job=\"de-normalization-secondary-taskmanager-prometheus\"}[$__range]))",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "Expired events",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Expired Events",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#299c46",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "datasource": "Flink-Prometheus",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 5,
+ "x": 0,
+ "y": 5
+ },
+ "id": 121,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "",
+ "targets": [
+ {
+ "expr": "sum(sum_over_time(flink_taskmanager_job_task_operator_DenormalizationJob_device_cache_miss{job=\"de-normalization-secondary-taskmanager-prometheus\"}[$__range]))",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Device meta miss",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#299c46",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "datasource": "Flink-Prometheus",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 5,
+ "x": 5,
+ "y": 5
+ },
+ "id": 122,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "",
+ "targets": [
+ {
+ "expr": "sum(sum_over_time(flink_taskmanager_job_task_operator_DenormalizationJob_user_cache_miss{job=\"de-normalization-secondary-taskmanager-prometheus\"}[$__range]))",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "User meta miss",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#299c46",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "datasource": "Flink-Prometheus",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 5,
+ "x": 10,
+ "y": 5
+ },
+ "id": 123,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "",
+ "targets": [
+ {
+ "expr": "sum(sum_over_time(flink_taskmanager_job_task_operator_DenormalizationJob_dialcode_cache_miss{job=\"de-normalization-secondary-taskmanager-prometheus\"}[$__range]))",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Dialcode meta miss",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#299c46",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "datasource": "Flink-Prometheus",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 5,
+ "x": 15,
+ "y": 5
+ },
+ "id": 124,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "",
+ "targets": [
+ {
+ "expr": "sum(sum_over_time(flink_taskmanager_job_task_operator_DenormalizationJob_content_cache_miss{job=\"de-normalization-secondary-taskmanager-prometheus\"}[$__range]))",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Content meta miss",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#299c46",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "datasource": "Flink-Prometheus",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 4,
+ "x": 20,
+ "y": 5
+ },
+ "id": 125,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "",
+ "targets": [
+ {
+ "expr": "sum(sum_over_time(flink_taskmanager_job_task_operator_DenormalizationJob_loc_cache_miss{job=\"de-normalization-secondary-taskmanager-prometheus\"}[$__range]))",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Location meta miss",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Flink-Prometheus",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "fill": 1,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 8,
+ "w": 12,
+ "x": 0,
+ "y": 9
+ },
+ "hiddenSeries": false,
+ "id": 126,
+ "interval": "",
+ "legend": {
+ "avg": false,
+ "current": false,
+ "max": false,
+ "min": false,
+ "show": true,
+ "total": true,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "nullPointMode": "null",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 2,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "sum(flink_taskmanager_job_task_operator_DenormalizationJob_loc_total{job=\"de-normalization-secondary-taskmanager-prometheus\"})",
+ "interval": "",
+ "legendFormat": "Denorm success",
+ "refId": "A"
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "DenormalizationSecondary",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "$$hashKey": "object:1090",
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ },
+ {
+ "$$hashKey": "object:1091",
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Flink-Prometheus",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "fill": 1,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 8,
+ "w": 12,
+ "x": 12,
+ "y": 9
+ },
+ "hiddenSeries": false,
+ "id": 127,
+ "legend": {
+ "avg": false,
+ "current": true,
+ "max": false,
+ "min": false,
+ "show": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "nullPointMode": "null",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 2,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "sum(flink_taskmanager_job_task_operator_KafkaConsumer_records_lag_max { job = \"de-normalization-secondary-taskmanager-prometheus\" })",
+ "interval": "",
+ "legendFormat": "Consumer lag",
+ "refId": "A"
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "DenormalizationSecondarylag",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "$$hashKey": "object:1018",
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ },
+ {
+ "$$hashKey": "object:1019",
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ }
+ ],
+ "title": "DenormalizationSecondary",
+ "type": "row"
+ },
+ {
+ "collapsed": true,
+ "datasource": null,
+ "gridPos": {
+ "h": 1,
+ "w": 24,
+ "x": 0,
+ "y": 21
+ },
+ "id": 44,
+ "panels": [
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#299c46",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "datasource": "Flink-Prometheus",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 6,
+ "x": 0,
+ "y": 16
+ },
+ "id": 46,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "",
+ "targets": [
+ {
+ "expr": "sum(sum_over_time(flink_taskmanager_job_task_operator_DruidValidatorJob_telemetry_route_success_count[$__range]))",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Telemetry Events",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#299c46",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "datasource": "Flink-Prometheus",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 6,
+ "x": 6,
+ "y": 16
+ },
+ "id": 47,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "",
+ "targets": [
+ {
+ "expr": "sum(sum_over_time(flink_taskmanager_job_task_operator_DruidValidatorJob_summary_route_success_count[$__range]))",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Summary Events",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#299c46",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "datasource": "Flink-Prometheus",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 6,
+ "x": 12,
+ "y": 16
+ },
+ "id": 48,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "",
+ "targets": [
+ {
+ "expr": "sum(sum_over_time(flink_taskmanager_job_task_operator_DruidValidatorJob_validation_failed_message_count[$__range]))",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Validation Failed",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#299c46",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "datasource": "Flink-Prometheus",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 6,
+ "x": 18,
+ "y": 16
+ },
+ "id": 49,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "",
+ "targets": [
+ {
+ "expr": "sum(sum_over_time(flink_taskmanager_job_task_operator_DruidValidatorJob_duplicate_event_count[$__range]))",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Duplicate Events",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Flink-Prometheus",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "fill": 1,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 8,
+ "w": 12,
+ "x": 0,
+ "y": 20
+ },
+ "hiddenSeries": false,
+ "id": 53,
+ "legend": {
+ "avg": false,
+ "current": false,
+ "max": false,
+ "min": false,
+ "show": true,
+ "total": true,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "nullPointMode": "null",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 2,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "sum(flink_taskmanager_job_task_operator_DruidValidatorJob_telemetry_route_success_count)",
+ "interval": "",
+ "legendFormat": "Telemetry Events",
+ "refId": "A"
+ },
+ {
+ "expr": "sum(flink_taskmanager_job_task_operator_DruidValidatorJob_summary_route_success_count)",
+ "interval": "",
+ "legendFormat": "Summary Events",
+ "refId": "B"
+ },
+ {
+ "expr": "sum(flink_taskmanager_job_task_operator_DruidValidatorJob_validation_failed_message_count)",
+ "interval": "",
+ "legendFormat": "Validation failed",
+ "refId": "C"
+ },
+ {
+ "expr": "sum(flink_taskmanager_job_task_operator_DruidValidatorJob_duplicate_event_count)",
+ "interval": "",
+ "legendFormat": "Duplicate Events",
+ "refId": "D"
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Druid Validator",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Flink-Prometheus",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "fill": 1,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 8,
+ "w": 12,
+ "x": 12,
+ "y": 20
+ },
+ "hiddenSeries": false,
+ "id": 52,
+ "legend": {
+ "avg": false,
+ "current": true,
+ "max": false,
+ "min": false,
+ "show": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "nullPointMode": "null",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 2,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "sum(flink_taskmanager_job_task_operator_KafkaConsumer_records_lag_max { job = \"druid-validator-taskmanager-prometheus\" })",
+ "interval": "",
+ "legendFormat": "Consumer lag",
+ "refId": "A"
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "DruidValidator lag",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ }
+ ],
+ "title": "Druid Validator",
+ "type": "row"
+ },
+ {
+ "collapsed": true,
+ "datasource": null,
+ "gridPos": {
+ "h": 1,
+ "w": 24,
+ "x": 0,
+ "y": 22
+ },
+ "id": 65,
+ "panels": [
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Flink-Prometheus",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "fill": 1,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 8,
+ "w": 12,
+ "x": 0,
+ "y": 7
+ },
+ "hiddenSeries": false,
+ "id": 63,
+ "legend": {
+ "avg": false,
+ "current": true,
+ "max": false,
+ "min": false,
+ "show": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "nullPointMode": "null",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 2,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "sum(flink_taskmanager_job_task_operator_SummaryDenormalizationJob_content_cache_hit)",
+ "legendFormat": "ContentCacheHit",
+ "refId": "A"
+ },
+ {
+ "expr": "sum(flink_taskmanager_job_task_operator_SummaryDenormalizationJob_content_cache_miss)",
+ "legendFormat": "ContentCacheMiss",
+ "refId": "B"
+ },
+ {
+ "expr": "sum(flink_taskmanager_job_task_operator_SummaryDenormalizationJob_content_total)",
+ "legendFormat": "ContentTotal",
+ "refId": "C"
+ },
+ {
+ "expr": "sum(flink_taskmanager_job_task_operator_SummaryDenormalizationJob_device_cache_hit)",
+ "legendFormat": "DeviceCacheHit",
+ "refId": "D"
+ },
+ {
+ "expr": "sum(flink_taskmanager_job_task_operator_SummaryDenormalizationJob_device_cache_miss)",
+ "legendFormat": "DeviceCacheMiss",
+ "refId": "E"
+ },
+ {
+ "expr": "sum(flink_taskmanager_job_task_operator_SummaryDenormalizationJob_device_total)",
+ "legendFormat": "DeviceTotal",
+ "refId": "F"
+ },
+ {
+ "expr": "sum(flink_taskmanager_job_task_operator_SummaryDenormalizationJob_dialcode_cache_hit)",
+ "legendFormat": "DialcodeCacheHit",
+ "refId": "G"
+ },
+ {
+ "expr": "sum(flink_taskmanager_job_task_operator_SummaryDenormalizationJob_dialcode_cache_miss)",
+ "legendFormat": "DialcodeCacheMiss",
+ "refId": "H"
+ },
+ {
+ "expr": "sum(flink_taskmanager_job_task_operator_SummaryDenormalizationJob_dialcode_total)",
+ "legendFormat": "DialcodeCacheMiss",
+ "refId": "I"
+ },
+ {
+ "expr": "sum(flink_taskmanager_job_task_operator_SummaryDenormalizationJob_user_cache_hit)",
+ "legendFormat": "UserCacheMiss",
+ "refId": "J"
+ },
+ {
+ "expr": "sum(flink_taskmanager_job_task_operator_SummaryDenormalizationJob_events_expired)",
+ "legendFormat": "ExpiredEvent",
+ "refId": "K"
+ },
+ {
+ "expr": "sum(flink_taskmanager_job_task_operator_SummaryDenormalizationJob_unique_event_count)",
+ "legendFormat": "UniqueEventCount",
+ "refId": "L"
+ },
+ {
+ "expr": "sum(flink_taskmanager_job_task_operator_SummaryDenormalizationJob_user_cache_hit)",
+ "legendFormat": "UserCacheHit",
+ "refId": "N"
+ },
+ {
+ "expr": "sum(flink_taskmanager_job_task_operator_SummaryDenormalizationJob_user_cache_miss)",
+ "legendFormat": "UserCacheMiss",
+ "refId": "M"
+ },
+ {
+ "expr": "sum(flink_taskmanager_job_task_operator_SummaryDenormalizationJob_user_total)",
+ "legendFormat": "UserTotal",
+ "refId": "O"
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "SummaryDenorm ",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Flink-Prometheus",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "fill": 1,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 8,
+ "w": 12,
+ "x": 12,
+ "y": 7
+ },
+ "hiddenSeries": false,
+ "id": 66,
+ "legend": {
+ "avg": false,
+ "current": true,
+ "max": false,
+ "min": false,
+ "show": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "nullPointMode": "null",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 2,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "sum(flink_taskmanager_job_task_operator_KafkaConsumer_records_lag_max{ job = \"summary-denormalization-taskmanager-prometheus\" })",
+ "interval": "",
+ "legendFormat": "Consumer lag",
+ "refId": "A"
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "SummaryDenorm lag",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "$$hashKey": "object:229",
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ },
+ {
+ "$$hashKey": "object:230",
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ }
+ ],
+ "title": "SummaryDenorm",
+ "type": "row"
+ },
+ {
+ "collapsed": true,
+ "datasource": null,
+ "gridPos": {
+ "h": 1,
+ "w": 24,
+ "x": 0,
+ "y": 23
+ },
+ "id": 71,
+ "panels": [
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Flink-Prometheus",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "fill": 1,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 8,
+ "w": 12,
+ "x": 0,
+ "y": 18
+ },
+ "hiddenSeries": false,
+ "id": 69,
+ "legend": {
+ "avg": false,
+ "current": false,
+ "max": false,
+ "min": false,
+ "show": true,
+ "total": false,
+ "values": false
+ },
+ "lines": true,
+ "linewidth": 1,
+ "nullPointMode": "null",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 2,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "sum(flink_taskmanager_job_task_operator_UserCacheUpdaterJobV2_success_message_count)",
+ "interval": "",
+ "legendFormat": "User-Cache-Updater-Success",
+ "refId": "A"
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "User-Cache-Updater-v2",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Flink-Prometheus",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "fill": 1,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 8,
+ "w": 12,
+ "x": 12,
+ "y": 18
+ },
+ "hiddenSeries": false,
+ "id": 72,
+ "legend": {
+ "avg": false,
+ "current": false,
+ "max": false,
+ "min": false,
+ "show": true,
+ "total": false,
+ "values": false
+ },
+ "lines": true,
+ "linewidth": 1,
+ "nullPointMode": "null",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 2,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "sum(flink_taskmanager_job_task_operator_KafkaConsumer_records_lag_max { job = \"user-cache-updater-v2-taskmanager-prometheus\" })",
+ "interval": "",
+ "legendFormat": "User-Cache-Updater-lag",
+ "refId": "A"
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "User-Cache-Updater-v2 lag",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ }
+ ],
+ "title": "UserCacheUpdaterV2",
+ "type": "row"
+ },
+ {
+ "collapsed": true,
+ "datasource": null,
+ "gridPos": {
+ "h": 1,
+ "w": 24,
+ "x": 0,
+ "y": 24
+ },
+ "id": 129,
+ "panels": [
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Flink-Prometheus",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "fill": 1,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 8,
+ "w": 12,
+ "x": 0,
+ "y": 10
+ },
+ "hiddenSeries": false,
+ "id": 130,
+ "legend": {
+ "avg": false,
+ "current": false,
+ "max": false,
+ "min": false,
+ "show": true,
+ "total": true,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "nullPointMode": "null",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 2,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "sum(flink_taskmanager_job_task_operator_DeviceProfileUpdaterJob_success_event_count)",
+ "format": "time_series",
+ "instant": false,
+ "interval": "",
+ "intervalFactor": 1,
+ "legendFormat": "Success",
+ "refId": "A"
+ },
+ {
+ "expr": "sum(flink_taskmanager_job_task_operator_DeviceProfileUpdaterJob_device_db_update_count)",
+ "interval": "",
+ "legendFormat": "DbUpdate",
+ "refId": "B"
+ },
+ {
+ "expr": "sum(flink_taskmanager_job_task_operator_DeviceProfileUpdaterJob_failed_event_count)",
+ "interval": "",
+ "legendFormat": "Failed",
+ "refId": "C"
+ },
+ {
+ "expr": "sum(flink_taskmanager_job_task_operator_DeviceProfileUpdaterJob_device_cache_update_count)",
+ "interval": "",
+ "legendFormat": "CacheUpdate",
+ "refId": "D"
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "DeviceProfileUpdater",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "$$hashKey": "object:162",
+ "format": "short",
+ "label": "",
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ },
+ {
+ "$$hashKey": "object:163",
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Flink-Prometheus",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "fill": 1,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 8,
+ "w": 12,
+ "x": 12,
+ "y": 10
+ },
+ "hiddenSeries": false,
+ "id": 131,
+ "legend": {
+ "avg": false,
+ "current": true,
+ "max": false,
+ "min": false,
+ "show": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "nullPointMode": "null",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 2,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "sum(flink_taskmanager_job_task_operator_KafkaConsumer_records_lag_max { job = \"device-profile-updater-taskmanager-prometheus\" })",
+ "interval": "",
+ "legendFormat": "Consumer lag",
+ "refId": "A"
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "DeviceProfileUpdater lag",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "$$hashKey": "object:378",
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ },
+ {
+ "$$hashKey": "object:379",
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ }
+ ],
+ "title": "DeviceProfileUpdater",
+ "type": "row"
+ },
+ {
+ "collapsed": true,
+ "datasource": null,
+ "gridPos": {
+ "h": 1,
+ "w": 24,
+ "x": 0,
+ "y": 25
+ },
+ "id": 133,
+ "panels": [
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Flink-Prometheus",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "fill": 1,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 8,
+ "w": 12,
+ "x": 0,
+ "y": 11
+ },
+ "hiddenSeries": false,
+ "id": 134,
+ "legend": {
+ "avg": false,
+ "current": false,
+ "max": false,
+ "min": false,
+ "show": true,
+ "total": true,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "nullPointMode": "null",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 2,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "sum(flink_taskmanager_job_task_operator_ContentCacheUpdaterJob_cache_hit_count)",
+ "format": "time_series",
+ "instant": false,
+ "interval": "",
+ "intervalFactor": 1,
+ "legendFormat": "Cache Hit",
+ "refId": "A"
+ },
+ {
+ "expr": "sum(flink_taskmanager_job_task_operator_ContentCacheUpdaterJob_dial_codes_api_hit_count)",
+ "interval": "",
+ "legendFormat": "DialCode Api Hit",
+ "refId": "B"
+ },
+ {
+ "expr": "sum(flink_taskmanager_job_task_operator_ContentCacheUpdaterJob_dial_codes_api_miss_count)",
+ "interval": "",
+ "legendFormat": "DialCode Api Miss",
+ "refId": "C"
+ },
+ {
+ "expr": "sum(flink_taskmanager_job_task_operator_ContentCacheUpdaterJob_dial_codes_cache_hit_count)",
+ "interval": "",
+ "legendFormat": "DialCode Cache Hit",
+ "refId": "D"
+ },
+ {
+ "expr": "sum(flink_taskmanager_job_task_operator_ContentCacheUpdaterJob_total_dial_code_count)",
+ "interval": "",
+ "legendFormat": "Total DialCode",
+ "refId": "E"
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "ContentCacheUpdater",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "$$hashKey": "object:162",
+ "format": "short",
+ "label": "",
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ },
+ {
+ "$$hashKey": "object:163",
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Flink-Prometheus",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "fill": 1,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 8,
+ "w": 12,
+ "x": 12,
+ "y": 11
+ },
+ "hiddenSeries": false,
+ "id": 135,
+ "legend": {
+ "avg": false,
+ "current": true,
+ "max": false,
+ "min": false,
+ "show": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "nullPointMode": "null",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 2,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "sum(flink_taskmanager_job_task_operator_KafkaConsumer_records_lag_max { job = \"content-cache-updater-taskmanager-prometheus\" })",
+ "interval": "",
+ "legendFormat": "Consumer lag",
+ "refId": "A"
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "ContentCacheUpdater lag",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "$$hashKey": "object:378",
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ },
+ {
+ "$$hashKey": "object:379",
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ }
+ ],
+ "title": "ContentCacheUpdater",
+ "type": "row"
+ }
+ ],
+ "refresh": "30s",
+ "schemaVersion": 25,
+ "style": "dark",
+ "tags": [],
+ "templating": {
+ "list": []
+ },
+ "time": {
+ "from": "now/d",
+ "to": "now"
+ },
+ "timepicker": {
+ "refresh_intervals": [
+ "5m"
+ ]
+ },
+ "timezone": "",
+ "title": "Data Pipeline Metrics Flink",
+ "uid": "YngLt0kGz",
+ "version": 39
+}
\ No newline at end of file
diff --git a/kubernetes/helm_charts/monitoring/dashboards/dashboards/dp-flink-lag-dashboard.json b/kubernetes/helm_charts/monitoring/dashboards/dashboards/dp-flink-lag-dashboard.json
new file mode 100644
index 000000000..af732fbff
--- /dev/null
+++ b/kubernetes/helm_charts/monitoring/dashboards/dashboards/dp-flink-lag-dashboard.json
@@ -0,0 +1,12517 @@
+{
+ "annotations": {
+ "list": [
+ {
+ "builtIn": 1,
+ "datasource": "-- Grafana --",
+ "enable": true,
+ "hide": true,
+ "iconColor": "rgba(0, 211, 255, 1)",
+ "name": "Annotations & Alerts",
+ "type": "dashboard"
+ }
+ ]
+ },
+ "editable": true,
+ "gnetId": null,
+ "graphTooltip": 0,
+ "id": 85,
+ "iteration": 1606284335462,
+ "links": [],
+ "panels": [
+ {
+ "collapsed": true,
+ "datasource": null,
+ "gridPos": {
+ "h": 1,
+ "w": 24,
+ "x": 0,
+ "y": 0
+ },
+ "id": 20,
+ "panels": [
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#73BF69",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "datasource": "Prometheus",
+ "description": "Threshold:\nWarning: 1M\nCritical: 2M",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 4,
+ "x": 0,
+ "y": 6
+ },
+ "id": 21,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "{consumergroup=\"ntpprod.flink.kp.events\", endpoint=\"metrics\", instance=\"11.4.35.172:9308\", job=\"ingestion-kafka-exporter\", namespace=\"monitoring\", pod=\"ingestion-kafka-exporter-75f7894b77-5h8bw\", service=\"ingestion-kafka-exporter\", topic=\"ntpprod.telemetry.raw\"}",
+ "targets": [
+ {
+ "expr": "sum without(partition) (kafka_consumergroup_lag{consumergroup=~\"ntpprod.flink.kp.events\", job=\"ingestion-kafka-exporter\"})",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "1000000,2000000",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "logstash Raw events lag",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#73BF69",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "datasource": "Prometheus",
+ "description": "Threshold:\nWarning: 1M\nCritical: 2M",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 4,
+ "x": 4,
+ "y": 6
+ },
+ "id": 113,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "{consumergroup=\"ntpprod.telemetry-log.indexer\", endpoint=\"metrics\", instance=\"11.4.33.35:9308\", job=\"processing-kafka-exporter\", namespace=\"monitoring\", pod=\"processing-kafka-exporter-5c4f4645d-cpxjn\", service=\"processing-kafka-exporter\", topic=\"ntpprod.druid.events.error\"}",
+ "targets": [
+ {
+ "expr": "sum without(partition) (kafka_consumergroup_lag{consumergroup=~\"ntpprod.telemetry-log.indexer\", job=\"processing-kafka-exporter\", topic=\"ntpprod.druid.events.error\"})",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "1000000,2000000",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "logstash Telemetry Error events lag",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#73BF69",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "datasource": "Prometheus",
+ "description": "Threshold:\nWarning: 1M\nCritical: 2M",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 4,
+ "x": 8,
+ "y": 6
+ },
+ "id": 114,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "{consumergroup=\"ntpprod.telemetry-log.indexer\", endpoint=\"metrics\", instance=\"11.4.33.35:9308\", job=\"processing-kafka-exporter\", namespace=\"monitoring\", pod=\"processing-kafka-exporter-5c4f4645d-cpxjn\", service=\"processing-kafka-exporter\", topic=\"ntpprod.druid.events.log\"}",
+ "targets": [
+ {
+ "expr": "sum without(partition) (kafka_consumergroup_lag{consumergroup=~\"ntpprod.telemetry-log.indexer\", job=\"processing-kafka-exporter\", topic=\"ntpprod.druid.events.log\"})",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "1000000,2000000",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "logstash Telemetry log events lag",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ }
+ ],
+ "title": "Logstash Lag",
+ "type": "row"
+ },
+ {
+ "collapsed": true,
+ "datasource": null,
+ "gridPos": {
+ "h": 1,
+ "w": 24,
+ "x": 0,
+ "y": 1
+ },
+ "id": 15,
+ "panels": [
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#73BF69",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "datasource": "Flink-Prometheus",
+ "description": "Threshold:\nWarning: 1M\nCritical: 2M",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 4,
+ "x": 0,
+ "y": 6
+ },
+ "id": 16,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "",
+ "targets": [
+ {
+ "expr": "sum(flink_taskmanager_job_task_operator_KafkaConsumer_records_lag_max { job = \"assessment-aggregator-taskmanager-prometheus\" })",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "1000000,2000000",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "AssessmentAggregator Lag",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#73BF69",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "datasource": "Flink-Prometheus",
+ "description": "Threshold:\nWarning: 1M\nCritical: 2M",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 4,
+ "x": 4,
+ "y": 6
+ },
+ "id": 17,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "",
+ "targets": [
+ {
+ "expr": "sum(flink_taskmanager_job_task_operator_KafkaConsumer_records_lag_max { job = \"activity-aggregate-updater-taskmanager-prometheus\" })",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "1000000,2000000",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "ActivityAggUpdater lag",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#73BF69",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "datasource": "Flink-Prometheus",
+ "description": "Threshold:\nWarning: 1M\nCritical: 2M",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 4,
+ "x": 8,
+ "y": 6
+ },
+ "id": 18,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "",
+ "targets": [
+ {
+ "expr": "sum(flink_taskmanager_job_task_operator_KafkaConsumer_records_lag_max { job = \"relation-cache-updater-taskmanager-prometheus\" })",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "1000000,2000000",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "RelationCache Updater lag",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#73BF69",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "datasource": "Flink-Prometheus",
+ "description": "Threshold:\nWarning: 1M\nCritical: 2M",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 4,
+ "x": 12,
+ "y": 6
+ },
+ "id": 111,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "",
+ "targets": [
+ {
+ "expr": "sum(flink_taskmanager_job_task_operator_KafkaConsumer_records_lag_max { job = \"post-publish-processor-taskmanager-prometheus\" })",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "1000000,2000000",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "PostPublishProcessor lag",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ }
+ ],
+ "title": "KP Flink Lag",
+ "type": "row"
+ },
+ {
+ "collapsed": true,
+ "datasource": null,
+ "gridPos": {
+ "h": 1,
+ "w": 24,
+ "x": 0,
+ "y": 2
+ },
+ "id": 41,
+ "panels": [
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#73BF69",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "datasource": "Prometheus",
+ "description": "Threshold: \nWarning: 1M\nCritical: 2M",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 4,
+ "x": 0,
+ "y": 3
+ },
+ "id": 42,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "{consumergroup=\"ntpprod-assessment-aggregator-group\", endpoint=\"metrics\", instance=\"11.4.35.172:9308\", job=\"ingestion-kafka-exporter\", namespace=\"monitoring\", pod=\"ingestion-kafka-exporter-75f7894b77-5h8bw\", service=\"ingestion-kafka-exporter\", topic=\"ntpprod.telemetry.assess\"}",
+ "targets": [
+ {
+ "expr": "sum without(partition) (kafka_consumergroup_lag{consumergroup=\"ntpprod-assessment-aggregator-group\", job=\"ingestion-kafka-exporter\"})",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "1000000,2000000",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "AssessmentAggregator Lag",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#73BF69",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "datasource": "Prometheus",
+ "description": "Threshold:\nWarning: 1M\nCritical: 2M",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 4,
+ "x": 4,
+ "y": 3
+ },
+ "id": 43,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "{consumergroup=\"ntpprod-activity-aggregate-group\", endpoint=\"metrics\", instance=\"11.4.35.172:9308\", job=\"ingestion-kafka-exporter\", namespace=\"monitoring\", pod=\"ingestion-kafka-exporter-75f7894b77-5h8bw\", service=\"ingestion-kafka-exporter\", topic=\"ntpprod.coursebatch.job.request\"}",
+ "targets": [
+ {
+ "expr": "sum without(partition) (kafka_consumergroup_lag{consumergroup=\"ntpprod-activity-aggregate-group\", job=\"ingestion-kafka-exporter\"})",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "1000000,2000000",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "ActivityAggUpdater lag",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#73BF69",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "datasource": "Prometheus",
+ "description": "Threshold: \nWarning: 1M\nCritical: 2M",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 4,
+ "x": 8,
+ "y": 3
+ },
+ "id": 44,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "{consumergroup=\"ntpprod-relation-cache-updater-group\", endpoint=\"metrics\", instance=\"11.4.35.172:9308\", job=\"ingestion-kafka-exporter\", namespace=\"monitoring\", pod=\"ingestion-kafka-exporter-75f7894b77-5h8bw\", service=\"ingestion-kafka-exporter\", topic=\"ntpprod.content.postpublish.request\"}",
+ "targets": [
+ {
+ "expr": "sum without(partition) (kafka_consumergroup_lag{consumergroup=\"ntpprod-relation-cache-updater-group\", job=\"ingestion-kafka-exporter\"})",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "1000000,2000000",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "RelationCache Updater lag",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#73BF69",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "datasource": "Prometheus",
+ "description": "Threshold: \nWarning: 1M\nCritical: 2M",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 4,
+ "x": 12,
+ "y": 3
+ },
+ "id": 112,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "{consumergroup=\"ntpprod-post-publish-processor-group\", endpoint=\"metrics\", instance=\"11.4.35.172:9308\", job=\"ingestion-kafka-exporter\", namespace=\"monitoring\", pod=\"ingestion-kafka-exporter-75f7894b77-5h8bw\", service=\"ingestion-kafka-exporter\", topic=\"ntpprod.content.postpublish.request\"}",
+ "targets": [
+ {
+ "expr": "sum without(partition) (kafka_consumergroup_lag{consumergroup=\"ntpprod-post-publish-processor-group\", job=\"ingestion-kafka-exporter\"})",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "1000000,2000000",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "PostPublishProcessor Lag",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ }
+ ],
+ "title": "KP Flink Consumer Group Lag",
+ "type": "row"
+ },
+ {
+ "collapsed": true,
+ "datasource": null,
+ "gridPos": {
+ "h": 1,
+ "w": 24,
+ "x": 0,
+ "y": 3
+ },
+ "id": 80,
+ "panels": [
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#73BF69",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "datasource": "InfluxDB_Datapipeline",
+ "description": "Threshold: \nWarning: 50k\nCritical: 100k",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 4,
+ "x": 0,
+ "y": 8
+ },
+ "id": 81,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "",
+ "targets": [
+ {
+ "groupBy": [
+ {
+ "params": [
+ "$__interval"
+ ],
+ "type": "time"
+ },
+ {
+ "params": [
+ "null"
+ ],
+ "type": "fill"
+ }
+ ],
+ "hide": false,
+ "orderByTime": "ASC",
+ "policy": "default",
+ "query": "SELECT sum(\"consumer_lag\") FROM \"pipeline_metrics\" WHERE (\"job_name\" = 'course-batch-updater' ) AND $timeFilter GROUP BY time($__interval) fill(none)",
+ "rawQuery": true,
+ "refId": "A",
+ "resultFormat": "time_series",
+ "select": [
+ [
+ {
+ "params": [
+ "value"
+ ],
+ "type": "field"
+ },
+ {
+ "params": [],
+ "type": "mean"
+ }
+ ]
+ ],
+ "tags": []
+ }
+ ],
+ "thresholds": "50000,100000",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "CourseBatchUpdater",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#73BF69",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "datasource": "InfluxDB_Datapipeline",
+ "description": "Threshold: \nWarning: 1M\nCritical: 2M",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 4,
+ "x": 4,
+ "y": 8
+ },
+ "id": 82,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "",
+ "targets": [
+ {
+ "groupBy": [
+ {
+ "params": [
+ "$__interval"
+ ],
+ "type": "time"
+ },
+ {
+ "params": [
+ "null"
+ ],
+ "type": "fill"
+ }
+ ],
+ "hide": false,
+ "orderByTime": "ASC",
+ "policy": "default",
+ "query": "SELECT sum(\"consumer_lag\") FROM \"pipeline_metrics\" WHERE (\"job_name\" = 'course-certificate-generator' ) AND $timeFilter GROUP BY time($__interval) fill(none)",
+ "rawQuery": true,
+ "refId": "A",
+ "resultFormat": "time_series",
+ "select": [
+ [
+ {
+ "params": [
+ "value"
+ ],
+ "type": "field"
+ },
+ {
+ "params": [],
+ "type": "mean"
+ }
+ ]
+ ],
+ "tags": []
+ }
+ ],
+ "thresholds": "1000000,2000000",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "CourseCertificateGenerator",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#73BF69",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "datasource": "InfluxDB_Datapipeline",
+ "description": "Threshold: \nWarning: 50K\nCritical: 100K",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 4,
+ "x": 8,
+ "y": 8
+ },
+ "id": 83,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "",
+ "targets": [
+ {
+ "groupBy": [
+ {
+ "params": [
+ "$__interval"
+ ],
+ "type": "time"
+ },
+ {
+ "params": [
+ "null"
+ ],
+ "type": "fill"
+ }
+ ],
+ "hide": false,
+ "orderByTime": "ASC",
+ "policy": "default",
+ "query": "SELECT sum(\"consumer_lag\") FROM \"pipeline_metrics\" WHERE (\"job_name\" = 'publish-pipeline' ) AND $timeFilter GROUP BY time($__interval) fill(none)",
+ "rawQuery": true,
+ "refId": "A",
+ "resultFormat": "time_series",
+ "select": [
+ [
+ {
+ "params": [
+ "value"
+ ],
+ "type": "field"
+ },
+ {
+ "params": [],
+ "type": "mean"
+ }
+ ]
+ ],
+ "tags": []
+ }
+ ],
+ "thresholds": "50000,100000",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "PublishPipeline",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#73BF69",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "datasource": "InfluxDB_Datapipeline",
+ "description": "Threshold: \nWarning: 50K\nCritical: 100K",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 4,
+ "x": 12,
+ "y": 8
+ },
+ "id": 84,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "",
+ "targets": [
+ {
+ "groupBy": [
+ {
+ "params": [
+ "$__interval"
+ ],
+ "type": "time"
+ },
+ {
+ "params": [
+ "null"
+ ],
+ "type": "fill"
+ }
+ ],
+ "hide": false,
+ "orderByTime": "ASC",
+ "policy": "default",
+ "query": "SELECT sum(\"consumer_lag\") FROM \"pipeline_metrics\" WHERE (\"job_name\" = 'composite-search-indexer') AND $timeFilter GROUP BY time($__interval) fill(null)",
+ "rawQuery": true,
+ "refId": "A",
+ "resultFormat": "time_series",
+ "select": [
+ [
+ {
+ "params": [
+ "value"
+ ],
+ "type": "field"
+ },
+ {
+ "params": [],
+ "type": "mean"
+ }
+ ]
+ ],
+ "tags": []
+ }
+ ],
+ "thresholds": "50000,100000",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "CompositeSearchIndexer",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#73BF69",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "datasource": "InfluxDB_Datapipeline",
+ "description": "Threshold: \nWarning: 50K\nCritical: 100k",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 4,
+ "x": 16,
+ "y": 8
+ },
+ "id": 85,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "",
+ "targets": [
+ {
+ "groupBy": [
+ {
+ "params": [
+ "$__interval"
+ ],
+ "type": "time"
+ },
+ {
+ "params": [
+ "null"
+ ],
+ "type": "fill"
+ }
+ ],
+ "hide": false,
+ "orderByTime": "ASC",
+ "policy": "default",
+ "query": "SELECT sum(\"consumer_lag\") FROM \"pipeline_metrics\" WHERE (\"job_name\" = 'audit-history-indexer' ) AND $timeFilter GROUP BY time($__interval) fill(none)",
+ "rawQuery": true,
+ "refId": "A",
+ "resultFormat": "time_series",
+ "select": [
+ [
+ {
+ "params": [
+ "value"
+ ],
+ "type": "field"
+ },
+ {
+ "params": [],
+ "type": "mean"
+ }
+ ]
+ ],
+ "tags": []
+ }
+ ],
+ "thresholds": "50000,100000",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "AuditHistoryIndexer",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#73BF69",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "datasource": "InfluxDB_Datapipeline",
+ "description": "Threshold: \nWarning: 50K\nCritical: 100K",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 4,
+ "x": 20,
+ "y": 8
+ },
+ "id": 86,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "",
+ "targets": [
+ {
+ "groupBy": [
+ {
+ "params": [
+ "$__interval"
+ ],
+ "type": "time"
+ },
+ {
+ "params": [
+ "null"
+ ],
+ "type": "fill"
+ }
+ ],
+ "hide": false,
+ "orderByTime": "ASC",
+ "policy": "default",
+ "query": "SELECT sum(\"consumer_lag\") FROM \"pipeline_metrics\" WHERE (\"job_name\" = 'audit-history-indexer' ) AND $timeFilter GROUP BY time($__interval) fill(none)",
+ "rawQuery": true,
+ "refId": "A",
+ "resultFormat": "time_series",
+ "select": [
+ [
+ {
+ "params": [
+ "value"
+ ],
+ "type": "field"
+ },
+ {
+ "params": [],
+ "type": "mean"
+ }
+ ]
+ ],
+ "tags": []
+ }
+ ],
+ "thresholds": "50000,100000",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "AuditHistoryIndexer",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#73BF69",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "datasource": "InfluxDB_Datapipeline",
+ "description": "Threshold:\nWarning: 50K\nCritical: 100K",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 4,
+ "x": 0,
+ "y": 12
+ },
+ "id": 87,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "",
+ "targets": [
+ {
+ "groupBy": [
+ {
+ "params": [
+ "$__interval"
+ ],
+ "type": "time"
+ },
+ {
+ "params": [
+ "null"
+ ],
+ "type": "fill"
+ }
+ ],
+ "hide": false,
+ "orderByTime": "ASC",
+ "policy": "default",
+ "query": "SELECT sum(\"consumer_lag\") FROM \"pipeline_metrics\" WHERE (\"job_name\" = 'audit-event-generator' ) AND $timeFilter GROUP BY time($__interval) fill(none)",
+ "rawQuery": true,
+ "refId": "A",
+ "resultFormat": "time_series",
+ "select": [
+ [
+ {
+ "params": [
+ "value"
+ ],
+ "type": "field"
+ },
+ {
+ "params": [],
+ "type": "mean"
+ }
+ ]
+ ],
+ "tags": []
+ }
+ ],
+ "thresholds": "50000,100000",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "AuditEventGenerator",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#73BF69",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "datasource": "InfluxDB_Datapipeline",
+ "description": "Threshold: \nWarning: 50K\nCritical: 100K",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 4,
+ "x": 4,
+ "y": 12
+ },
+ "id": 88,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "",
+ "targets": [
+ {
+ "groupBy": [
+ {
+ "params": [
+ "$__interval"
+ ],
+ "type": "time"
+ },
+ {
+ "params": [
+ "null"
+ ],
+ "type": "fill"
+ }
+ ],
+ "hide": false,
+ "orderByTime": "ASC",
+ "policy": "default",
+ "query": "SELECT sum(\"consumer_lag\") FROM \"pipeline_metrics\" WHERE (\"job_name\" = 'asset-enrichment' ) AND $timeFilter GROUP BY time($__interval) fill(none)",
+ "rawQuery": true,
+ "refId": "A",
+ "resultFormat": "time_series",
+ "select": [
+ [
+ {
+ "params": [
+ "value"
+ ],
+ "type": "field"
+ },
+ {
+ "params": [],
+ "type": "mean"
+ }
+ ]
+ ],
+ "tags": []
+ }
+ ],
+ "thresholds": "50000,100000",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "AssetEnrichment",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ }
+ ],
+ "title": "KP Samza Lag",
+ "type": "row"
+ },
+ {
+ "collapsed": false,
+ "datasource": null,
+ "gridPos": {
+ "h": 1,
+ "w": 24,
+ "x": 0,
+ "y": 4
+ },
+ "id": 2,
+ "panels": [],
+ "title": "DP Flink Lag",
+ "type": "row"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#73BF69",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "datasource": "Flink-Prometheus",
+ "description": "Threshold:\nWarning: 5M\nCritical: 10M",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 4,
+ "x": 0,
+ "y": 5
+ },
+ "id": 4,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "",
+ "targets": [
+ {
+ "expr": "sum(flink_taskmanager_job_task_operator_KafkaConsumer_records_lag_max { job = \"ingest-router-taskmanager-prometheus\" })",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "5000000,10000000",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Ingestion Router lag",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#73BF69",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "datasource": "Flink-Prometheus",
+ "description": "Threshold:\nWarning: 5M\nCritical: 10M",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 4,
+ "x": 4,
+ "y": 5
+ },
+ "id": 5,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "",
+ "targets": [
+ {
+ "expr": "sum(flink_taskmanager_job_task_operator_KafkaConsumer_records_lag_max { job = \"telemetry-extractor-taskmanager-prometheus\" })",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "5000000,10000000",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "TelemetryExtractor lag",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#73BF69",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "datasource": "Flink-Prometheus",
+ "description": "Threshold:\nWarning: 10M\nCritical: 15M",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 4,
+ "x": 8,
+ "y": 5
+ },
+ "id": 6,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "",
+ "targets": [
+ {
+ "expr": "sum(flink_taskmanager_job_task_operator_KafkaConsumer_records_lag_max { job = \"pipeline-preprocessor-taskmanager-prometheus\" })",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "10000000,15000000",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Preprocessor lag",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#73BF69",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "datasource": "Flink-Prometheus",
+ "description": "Threshold:\nWarning: 10M\nCritical: 15M",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 4,
+ "x": 12,
+ "y": 5
+ },
+ "id": 8,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "",
+ "targets": [
+ {
+ "expr": "sum(flink_taskmanager_job_task_operator_KafkaConsumer_records_lag_max { job = \"druid-validator-taskmanager-prometheus\" })",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "10000000,15000000",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "DruidValidator lag",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#73BF69",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "datasource": "Flink-Prometheus",
+ "description": "Threshold:\nWarning: 10M\nCritical: 15M",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 4,
+ "x": 16,
+ "y": 5
+ },
+ "id": 89,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "",
+ "targets": [
+ {
+ "expr": "sum(flink_taskmanager_job_task_operator_KafkaConsumer_records_lag_max { job = \"de-normalization-primary-taskmanager-prometheus\" })",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "10000000,15000000",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "DenormalizationPrimary lag",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#73BF69",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "datasource": "Flink-Prometheus",
+ "description": "Threshold:\nWarning: 10M\nCritical: 15M",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 4,
+ "x": 20,
+ "y": 5
+ },
+ "id": 90,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "",
+ "targets": [
+ {
+ "expr": "sum(flink_taskmanager_job_task_operator_KafkaConsumer_records_lag_max { job = \"de-normalization-secondary-taskmanager-prometheus\" })",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "10000000,15000000",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "DenormalizationSecondarylag",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#73BF69",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "datasource": "Flink-Prometheus",
+ "description": "Threshold:\nWarning: 10M\nCritical: 15M",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 4,
+ "x": 0,
+ "y": 9
+ },
+ "id": 10,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "flink_taskmanager_job_task_operator_KafkaConsumer_records_lag_max{endpoint=\"prom\", host=\"device_profile_updater_taskmanager_b48455c9c_fndpv\", instance=\"11.4.9.108:9251\", job=\"device-profile-updater-taskmanager-prometheus\", job_id=\"f9b614d1d00f894bb46f6cd115f1ed89\", job_name=\"Device_profile_updater\", namespace=\"flink-production\", operator_id=\"9b2fa66376e7322a8972db73e0d4b7a7\", operator_name=\"Source:_device_profile_consumer\", pod=\"device-profile-updater-taskmanager-b48455c9c-fndpv\", service=\"device-profile-updater-taskmanager-prometheus\", subtask_index=\"0\", task_attempt_id=\"c653c74983d1666988deb2db9b1ce007\", task_attempt_num=\"0\", task_id=\"9b2fa66376e7322a8972db73e0d4b7a7\", task_name=\"Source:_device_profile_consumer\", tm_id=\"1bb922c4b253c06e73a5650b25ae0170\"}",
+ "targets": [
+ {
+ "expr": "(flink_taskmanager_job_task_operator_KafkaConsumer_records_lag_max { job = \"device-profile-updater-taskmanager-prometheus\" })",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "10000000,15000000",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Device-Profile-Updater lag",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#73BF69",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "datasource": "Flink-Prometheus",
+ "description": "Threshold:\nWarning: 10M\nCritical: 15M",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 4,
+ "x": 4,
+ "y": 9
+ },
+ "id": 11,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "",
+ "targets": [
+ {
+ "expr": "sum(flink_taskmanager_job_task_operator_KafkaConsumer_records_lag_max { job = \"content-cache-updater-taskmanager-prometheus\" })",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "10000000,15000000",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Content-Cache-Updater lag",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#73BF69",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "datasource": "Flink-Prometheus",
+ "description": "Threshold:\nWarning: 10M\nCritical: 15M",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 4,
+ "x": 8,
+ "y": 9
+ },
+ "id": 13,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "",
+ "targets": [
+ {
+ "expr": "sum(flink_taskmanager_job_task_operator_KafkaConsumer_records_lag_max { job = \"user-cache-updater-v2-taskmanager-prometheus\" })",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "10000000,15000000",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "UserCacheUpdaterV2 lag",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#73BF69",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "datasource": "Flink-Prometheus",
+ "description": "Threshold:\nWarning: 10M\nCritical: 15M",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 4,
+ "x": 12,
+ "y": 9
+ },
+ "id": 9,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "",
+ "targets": [
+ {
+ "expr": "sum(flink_taskmanager_job_task_operator_KafkaConsumer_records_lag_max{ job = \"summary-denormalization-taskmanager-prometheus\" })",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "10000000,15000000",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "SummaryDenorm lag",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "collapsed": false,
+ "datasource": null,
+ "gridPos": {
+ "h": 1,
+ "w": 24,
+ "x": 0,
+ "y": 13
+ },
+ "id": 46,
+ "panels": [],
+ "title": "DP Flink Consumer Group Lag",
+ "type": "row"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#73BF69",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "datasource": "Prometheus",
+ "description": "Threshold:\nWarning: 5M\nCritical: 10M",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 4,
+ "x": 0,
+ "y": 14
+ },
+ "id": 47,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "{consumergroup=\"ntpprod-ingest-router-group\", endpoint=\"metrics\", instance=\"11.4.35.220:9308\", job=\"ingestion-kafka-exporter\", namespace=\"monitoring\", pod=\"ingestion-kafka-exporter-666bdff69c-4rqdd\", service=\"ingestion-kafka-exporter\", topic=\"ntpprod.telemetry.ingestion\"}",
+ "targets": [
+ {
+ "expr": "sum without(partition) (kafka_consumergroup_lag{consumergroup=\"ntpprod-ingest-router-group\", job=\"ingestion-kafka-exporter\", topic=\"ntpprod.telemetry.ingestion\"})",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "5000000,10000000",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Ingestion Router lag",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#73BF69",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "datasource": "Prometheus",
+ "description": "Threshold:\nWarning: 5M\nCritical: 10M",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 4,
+ "x": 4,
+ "y": 14
+ },
+ "id": 48,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "{consumergroup=\"ntpprod-telemetry-extractor-group\", endpoint=\"metrics\", instance=\"11.4.33.35:9308\", job=\"processing-kafka-exporter\", namespace=\"monitoring\", pod=\"processing-kafka-exporter-5c4f4645d-cpxjn\", service=\"processing-kafka-exporter\", topic=\"ntpprod.telemetry.ingest\"}",
+ "targets": [
+ {
+ "expr": "sum without(partition) (kafka_consumergroup_lag{consumergroup=\"ntpprod-telemetry-extractor-group\", job=\"processing-kafka-exporter\"})",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "5000000,10000000",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Telemetry Extractor lag",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#73BF69",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "datasource": "Prometheus",
+ "description": "Threshold:\nWarning: 10M\nCritical: 15M",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 4,
+ "x": 8,
+ "y": 14
+ },
+ "id": 49,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "{consumergroup=\"ntpprod-pipeline-preprocessor-group\", endpoint=\"metrics\", instance=\"11.4.33.35:9308\", job=\"processing-kafka-exporter\", namespace=\"monitoring\", pod=\"processing-kafka-exporter-5c4f4645d-cpxjn\", service=\"processing-kafka-exporter\", topic=\"ntpprod.telemetry.raw\"}",
+ "targets": [
+ {
+ "expr": "sum without(partition) (kafka_consumergroup_lag{consumergroup=\"ntpprod-pipeline-preprocessor-group\", job=\"processing-kafka-exporter\"})",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "10000000,15000000",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "PreProcessor lag",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#73BF69",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "datasource": "Prometheus",
+ "description": "Threshold:\nWarning: 10M\nCritical: 15M",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 4,
+ "x": 12,
+ "y": 14
+ },
+ "id": 51,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "{consumergroup=\"ntpprod-druid-validator-group\", endpoint=\"metrics\", instance=\"11.4.33.35:9308\", job=\"processing-kafka-exporter\", namespace=\"monitoring\", pod=\"processing-kafka-exporter-5c4f4645d-cpxjn\", service=\"processing-kafka-exporter\", topic=\"ntpprod.telemetry.denorm\"}",
+ "targets": [
+ {
+ "expr": "sum without(partition) (kafka_consumergroup_lag{consumergroup=\"ntpprod-druid-validator-group\", job=\"processing-kafka-exporter\"})",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "10000000,15000000",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "DruidValidator lag",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#73BF69",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "datasource": "Prometheus",
+ "description": "Threshold:\nWarning: 10M\nCritical: 15M",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 4,
+ "x": 16,
+ "y": 14
+ },
+ "id": 55,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "{consumergroup=\"ntpprod-telemetry-denorm-primary-group\", endpoint=\"metrics\", instance=\"11.4.33.35:9308\", job=\"processing-kafka-exporter\", namespace=\"monitoring\", pod=\"processing-kafka-exporter-5c4f4645d-cpxjn\", service=\"processing-kafka-exporter\", topic=\"ntpprod.telemetry.unique.primary\"}",
+ "targets": [
+ {
+ "expr": "sum without(partition) (kafka_consumergroup_lag{consumergroup=\"ntpprod-telemetry-denorm-primary-group\", job=\"processing-kafka-exporter\"})",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "10000000,15000000",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "DenormalizationPrimary lag",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#73BF69",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "datasource": "Prometheus",
+ "description": "Threshold:\nWarning: 10M\nCritical: 15M",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 4,
+ "x": 20,
+ "y": 14
+ },
+ "id": 91,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "{consumergroup=\"ntpprod-telemetry-denorm-secondary-group\", endpoint=\"metrics\", instance=\"11.4.33.35:9308\", job=\"processing-kafka-exporter\", namespace=\"monitoring\", pod=\"processing-kafka-exporter-5c4f4645d-cpxjn\", service=\"processing-kafka-exporter\", topic=\"ntpprod.telemetry.unique.secondary\"}",
+ "targets": [
+ {
+ "expr": "sum without(partition) (kafka_consumergroup_lag{consumergroup=\"ntpprod-telemetry-denorm-secondary-group\", job=\"processing-kafka-exporter\"})",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "10000000,15000000",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "DenormalizationSecondary lag",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#73BF69",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "datasource": "Prometheus",
+ "description": "Threshold:\nWarning: 10M\nCritical: 15M",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 4,
+ "x": 0,
+ "y": 18
+ },
+ "id": 53,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "{consumergroup=\"ntpprod-device-profile-updater-group\", endpoint=\"metrics\", instance=\"11.4.35.220:9308\", job=\"ingestion-kafka-exporter\", namespace=\"monitoring\", pod=\"ingestion-kafka-exporter-666bdff69c-4rqdd\", service=\"ingestion-kafka-exporter\", topic=\"ntpprod.events.deviceprofile\"}",
+ "targets": [
+ {
+ "expr": "sum without(partition) (kafka_consumergroup_lag{consumergroup=\"ntpprod-device-profile-updater-group\", job=\"ingestion-kafka-exporter\"})",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "10000000,15000000",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "DeviceProfileUpdater lag",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#73BF69",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "datasource": "Prometheus",
+ "description": "Threshold:\nWarning: 10M\nCritical: 15M",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 4,
+ "x": 4,
+ "y": 18
+ },
+ "id": 54,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "{consumergroup=\"ntpprod-content-cache-updater-group\", endpoint=\"metrics\", instance=\"11.4.35.220:9308\", job=\"ingestion-kafka-exporter\", namespace=\"monitoring\", pod=\"ingestion-kafka-exporter-666bdff69c-4rqdd\", service=\"ingestion-kafka-exporter\", topic=\"ntpprod.learning.graph.events\"}",
+ "targets": [
+ {
+ "expr": "sum without(partition) (kafka_consumergroup_lag{consumergroup=\"ntpprod-content-cache-updater-group\", job=\"ingestion-kafka-exporter\"})",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "10000000,15000000",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "ContentCacheUpdater lag",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#73BF69",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "datasource": "Prometheus",
+ "description": "Threshold:\nWarning: 10M\nCritical: 15M",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 4,
+ "x": 8,
+ "y": 18
+ },
+ "id": 92,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "{consumergroup=\"ntpprod-user-cache-updater-consumer-group\", endpoint=\"metrics\", instance=\"11.4.33.35:9308\", job=\"processing-kafka-exporter\", namespace=\"monitoring\", pod=\"processing-kafka-exporter-5c4f4645d-cpxjn\", service=\"processing-kafka-exporter\", topic=\"ntpprod.telemetry.audit\"}",
+ "targets": [
+ {
+ "expr": "sum without(partition) (kafka_consumergroup_lag{consumergroup=\"ntpprod-user-cache-updater-consumer-group\", job=\"processing-kafka-exporter\"})",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "10000000,15000000",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "UserCacheUpdaterV2 lag",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#73BF69",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "datasource": "Prometheus",
+ "description": "Threshold:\nWarning: 10M\nCritical: 15M",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 4,
+ "x": 12,
+ "y": 18
+ },
+ "id": 52,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "{consumergroup=\"ntpprod-summmary-denorm-group\", endpoint=\"metrics\", instance=\"11.4.33.35:9308\", job=\"processing-kafka-exporter\", namespace=\"monitoring\", pod=\"processing-kafka-exporter-5c4f4645d-cpxjn\", service=\"processing-kafka-exporter\", topic=\"ntpprod.telemetry.derived\"}",
+ "targets": [
+ {
+ "expr": "sum without(partition) (kafka_consumergroup_lag{consumergroup=\"ntpprod-summmary-denorm-group\", job=\"processing-kafka-exporter\"})",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "10000000,15000000",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "SummaryDenorm lag",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "collapsed": true,
+ "datasource": null,
+ "gridPos": {
+ "h": 1,
+ "w": 24,
+ "x": 0,
+ "y": 22
+ },
+ "id": 23,
+ "panels": [
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#73BF69",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "datasource": "Prometheus",
+ "description": "Threshold: \nWarning: 10M\nCritical: 15M",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 4,
+ "x": 0,
+ "y": 7
+ },
+ "id": 24,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "{consumergroup=\"ntpprod.telemetry.ingestion.events.backup\", endpoint=\"metrics\", instance=\"11.4.35.220:9308\", job=\"ingestion-kafka-exporter\", namespace=\"monitoring\", pod=\"ingestion-kafka-exporter-666bdff69c-4rqdd\", service=\"ingestion-kafka-exporter\", topic=\"ntpprod.telemetry.ingestion\"}",
+ "targets": [
+ {
+ "expr": "sum without(partition) (kafka_consumergroupzookeeper_lag_zookeeper{consumergroup=~\"$env.telemetry.ingestion.events.backup\", job=\"ingestion-kafka-exporter\"})",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "10000000,15000000",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "IngestionTelemetryBackup",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#73BF69",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "datasource": "Prometheus",
+ "description": "Threshold: \nWarning: 15M\nCritical: 20M",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 4,
+ "x": 4,
+ "y": 7
+ },
+ "id": 28,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "{consumergroup=\"ntpprod.telemetry.raw.events.backup\", endpoint=\"metrics\", instance=\"11.4.33.35:9308\", job=\"processing-kafka-exporter\", namespace=\"monitoring\", pod=\"processing-kafka-exporter-5c4f4645d-cpxjn\", service=\"processing-kafka-exporter\", topic=\"ntpprod.telemetry.raw\"}",
+ "targets": [
+ {
+ "expr": "sum without(partition) (kafka_consumergroupzookeeper_lag_zookeeper{consumergroup=~\"$env.telemetry.raw.events.backup\", job=\"processing-kafka-exporter\"}) ",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "15000000,20000000",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "RawTelemetryEventsBackup",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#73BF69",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "datasource": "Prometheus",
+ "description": "Threshold: \nWarning: 1M\nCritical: 2M",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 4,
+ "x": 8,
+ "y": 7
+ },
+ "id": 26,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "{consumergroup=\"ntpprod.telemetry.failed.backup\", endpoint=\"metrics\", instance=\"11.4.33.35:9308\", job=\"processing-kafka-exporter\", namespace=\"monitoring\", pod=\"processing-kafka-exporter-5c4f4645d-cpxjn\", service=\"processing-kafka-exporter\", topic=\"ntpprod.telemetry.failed\"}",
+ "targets": [
+ {
+ "expr": "sum without(partition) (kafka_consumergroupzookeeper_lag_zookeeper{consumergroup=~\"$env.telemetry.failed.backup\", job=\"processing-kafka-exporter\"}) ",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "1000000,2000000",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "FailedTelemetryEventsBackup",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#73BF69",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "datasource": "Prometheus",
+ "description": "Threshold: \nWarning: 1M\nCritical: 2M",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 4,
+ "x": 12,
+ "y": 7
+ },
+ "id": 27,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "{consumergroup=\"ntpprod.extractor.duplicate.backup\", endpoint=\"metrics\", instance=\"11.4.33.35:9308\", job=\"processing-kafka-exporter\", namespace=\"monitoring\", pod=\"processing-kafka-exporter-5c4f4645d-cpxjn\", service=\"processing-kafka-exporter\", topic=\"ntpprod.telemetry.extractor.duplicate\"}",
+ "targets": [
+ {
+ "expr": "sum without(partition) (kafka_consumergroupzookeeper_lag_zookeeper{consumergroup=~\"$env.extractor.duplicate.backup\", job=\"processing-kafka-exporter\"}) ",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "1000000,2000000",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "ExtractorDuplicateEventsBackup",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#73BF69",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "datasource": "Prometheus",
+ "description": "Threshold: \nWarning: 15M\nCritical: 20M",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 4,
+ "x": 16,
+ "y": 7
+ },
+ "id": 34,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "{consumergroup=\"ntpprod.telemetry.channel.backup\", endpoint=\"metrics\", instance=\"11.4.33.35:9308\", job=\"processing-kafka-exporter\", namespace=\"monitoring\", pod=\"processing-kafka-exporter-5c4f4645d-cpxjn\", service=\"processing-kafka-exporter\", topic=\"ntpprod.telemetry.denorm\"}",
+ "targets": [
+ {
+ "expr": "sum without (partition) (kafka_consumergroupzookeeper_lag_zookeeper{consumergroup=~\"$env.telemetry.channel.backup\", job=\"processing-kafka-exporter\"})",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "15000000,20000000",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "ChannelTelemetryEventsBackup",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#73BF69",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "datasource": "Prometheus",
+ "description": "Threshold: \nWarning: 15M\nCritical: 20M",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 4,
+ "x": 20,
+ "y": 7
+ },
+ "id": 30,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "{consumergroup=\"ntpprod.telemetry.derived.unique.backup\", endpoint=\"metrics\", instance=\"11.4.33.35:9308\", job=\"processing-kafka-exporter\", namespace=\"monitoring\", pod=\"processing-kafka-exporter-5c4f4645d-cpxjn\", service=\"processing-kafka-exporter\", topic=\"ntpprod.telemetry.derived.unique\"}",
+ "targets": [
+ {
+ "expr": "sum without(partition) (kafka_consumergroupzookeeper_lag_zookeeper{consumergroup=~\"$env.telemetry.derived.unique.backup\", job=\"processing-kafka-exporter\"})",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "15000000,20000000",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "DerivedUniqueTelemetryBackup",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#73BF69",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "datasource": "Prometheus",
+ "description": "Threshold: \nWarning: 1M\nCritical: 2M",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 4,
+ "x": 0,
+ "y": 11
+ },
+ "id": 29,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "{consumergroup=\"ntpprod.telemetry.assess.raw\", endpoint=\"metrics\", instance=\"11.4.33.35:9308\", job=\"processing-kafka-exporter\", namespace=\"monitoring\", pod=\"processing-kafka-exporter-5c4f4645d-cpxjn\", service=\"processing-kafka-exporter\", topic=\"ntpprod.telemetry.assess.raw\"}",
+ "targets": [
+ {
+ "expr": "sum without (partition) (kafka_consumergroupzookeeper_lag_zookeeper{consumergroup=~\"$env.telemetry.assess.raw\", job=\"processing-kafka-exporter\"})",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "1000000,2000000",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "AssesRawEventsBackup",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#73BF69",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "datasource": "Prometheus",
+ "description": "Threshold: \nWarning: 1M\nCritical: 2M",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 4,
+ "x": 4,
+ "y": 11
+ },
+ "id": 25,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "{consumergroup=\"ntpprod.extractor.failed.backup\", endpoint=\"metrics\", instance=\"11.4.33.35:9308\", job=\"processing-kafka-exporter\", namespace=\"monitoring\", pod=\"processing-kafka-exporter-5c4f4645d-cpxjn\", service=\"processing-kafka-exporter\", topic=\"ntpprod.telemetry.extractor.failed\"}",
+ "targets": [
+ {
+ "expr": "sum without(partition) (kafka_consumergroupzookeeper_lag_zookeeper{consumergroup=~\"$env.extractor.failed.backup\", job=\"processing-kafka-exporter\"})",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "1000000,2000000",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "ExtractorFailedEventsBackup",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#73BF69",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "datasource": "Prometheus",
+ "description": "Threshold: \nWarning: 15M\nCritical: 20M",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 4,
+ "x": 8,
+ "y": 11
+ },
+ "id": 32,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "{consumergroup=\"ntpprod.telemetry.unique.events.backup\", endpoint=\"metrics\", instance=\"11.4.33.35:9308\", job=\"processing-kafka-exporter\", namespace=\"monitoring\", pod=\"processing-kafka-exporter-5c4f4645d-cpxjn\", service=\"processing-kafka-exporter\", topic=\"ntpprod.telemetry.unique\"}",
+ "targets": [
+ {
+ "expr": "sum without(partition) (kafka_consumergroupzookeeper_lag_zookeeper{consumergroup=~\"$env.telemetry.unique.events.backup\", job=\"processing-kafka-exporter\", topic=\"ntpprod.telemetry.unique\"}) ",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "15000000,20000000",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "UniqueTelemetryEventsBackup",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#73BF69",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "datasource": "Prometheus",
+ "description": "Threshold: \nWarning: 15M\nCritical: 20M",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 4,
+ "x": 12,
+ "y": 11
+ },
+ "id": 33,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "{consumergroup=\"ntpprod.summary.channel.backup\", endpoint=\"metrics\", instance=\"11.4.33.35:9308\", job=\"processing-kafka-exporter\", namespace=\"monitoring\", pod=\"processing-kafka-exporter-5c4f4645d-cpxjn\", service=\"processing-kafka-exporter\", topic=\"ntpprod.druid.events.summary\"}",
+ "targets": [
+ {
+ "expr": "sum without(partition) (kafka_consumergroupzookeeper_lag_zookeeper{consumergroup=~\"$env.summary.channel.backup\", job=\"processing-kafka-exporter\"})",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "15000000,20000000",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "ChannelEventsSummaryBackup",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#73BF69",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "datasource": "Prometheus",
+ "description": "Threshod: \nWarning: 50K\nCritical: 1L",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 4,
+ "x": 16,
+ "y": 11
+ },
+ "id": 56,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "{consumergroup=\"ntpprod.failed.learning.events.backup\", endpoint=\"metrics\", instance=\"11.4.35.220:9308\", job=\"ingestion-kafka-exporter\", namespace=\"monitoring\", pod=\"ingestion-kafka-exporter-666bdff69c-4rqdd\", service=\"ingestion-kafka-exporter\", topic=\"ntpprod.learning.events.failed\"}",
+ "targets": [
+ {
+ "expr": "sum without(partition) (kafka_consumergroupzookeeper_lag_zookeeper{consumergroup=~\"$env.failed.learning.events.backup\", job=\"ingestion-kafka-exporter\"})",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "50000,100000",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "LearningFailedEventsBackup",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#73BF69",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "datasource": "Prometheus",
+ "description": "Threshold: \nWarning: 15M\nCritical: 20M",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 4,
+ "x": 20,
+ "y": 11
+ },
+ "id": 35,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "{consumergroup=\"ntpprod.telemetry.denorm.backup\", endpoint=\"metrics\", instance=\"11.4.33.35:9308\", job=\"processing-kafka-exporter\", namespace=\"monitoring\", pod=\"processing-kafka-exporter-5c4f4645d-cpxjn\", service=\"processing-kafka-exporter\", topic=\"ntpprod.telemetry.denorm\"}",
+ "targets": [
+ {
+ "expr": "sum without(partition) (kafka_consumergroupzookeeper_lag_zookeeper{consumergroup=~\"$env.telemetry.denorm.backup\", job=\"processing-kafka-exporter\"})",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "15000000,20000000",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "DenormTelemetryEventsBackup",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#73BF69",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "datasource": "Prometheus",
+ "description": "Threshold: \nWarning: 1M\nCritical: 2M",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 4,
+ "x": 0,
+ "y": 15
+ },
+ "id": 36,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "{consumergroup=\"ntpprod.events.device.profile.backup\", endpoint=\"metrics\", instance=\"11.4.35.220:9308\", job=\"ingestion-kafka-exporter\", namespace=\"monitoring\", pod=\"ingestion-kafka-exporter-666bdff69c-4rqdd\", service=\"ingestion-kafka-exporter\", topic=\"ntpprod.events.deviceprofile\"}",
+ "targets": [
+ {
+ "expr": "sum without(partition) (kafka_consumergroupzookeeper_lag_zookeeper{consumergroup=~\"$env.events.device.profile.backup\", job=\"ingestion-kafka-exporter\"})",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "1000000,2000000",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "DeviceProfileEventsBackup",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#73BF69",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "datasource": "Prometheus",
+ "description": "Threshold: \nWarning: 1M\nCritical: 2M",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 4,
+ "x": 4,
+ "y": 15
+ },
+ "id": 31,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "{consumergroup=\"ntpprod.telemetry.duplicate.backup\", endpoint=\"metrics\", instance=\"11.4.33.35:9308\", job=\"processing-kafka-exporter\", namespace=\"monitoring\", pod=\"processing-kafka-exporter-5c4f4645d-cpxjn\", service=\"processing-kafka-exporter\", topic=\"ntpprod.telemetry.duplicate\"}",
+ "targets": [
+ {
+ "expr": "sum without(partition) (kafka_consumergroupzookeeper_lag_zookeeper{consumergroup=~\"$env.telemetry.duplicate.backup\", job=\"processing-kafka-exporter\"}) ",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "1000000,2000000",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "DuplicateTelemetryEventsBackup",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#73BF69",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "datasource": "Prometheus",
+ "description": "Threshold: \nWarning: 1M\nCritical: 2M",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 4,
+ "x": 8,
+ "y": 15
+ },
+ "id": 38,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "{consumergroup=\"ntpprod.telemetry.assess.events.backup\", endpoint=\"metrics\", instance=\"11.4.35.220:9308\", job=\"ingestion-kafka-exporter\", namespace=\"monitoring\", pod=\"ingestion-kafka-exporter-666bdff69c-4rqdd\", service=\"ingestion-kafka-exporter\", topic=\"ntpprod.telemetry.assess\"}",
+ "targets": [
+ {
+ "expr": "sum without(partition) (kafka_consumergroupzookeeper_lag_zookeeper{consumergroup=~\"$env.telemetry.assess.events.backup\", job=\"ingestion-kafka-exporter\"})",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "1000000,2000000",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "AssessTelemetryEventsBackup",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#73BF69",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "datasource": "Prometheus",
+ "description": "Threshold: \nWarning: 15M\nCritical: 20M",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 4,
+ "x": 12,
+ "y": 15
+ },
+ "id": 39,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "{consumergroup=\"ntpprod.summary.backup\", endpoint=\"metrics\", instance=\"11.4.33.35:9308\", job=\"processing-kafka-exporter\", namespace=\"monitoring\", pod=\"processing-kafka-exporter-5c4f4645d-cpxjn\", service=\"processing-kafka-exporter\", topic=\"ntpprod.druid.events.summary\"}",
+ "targets": [
+ {
+ "expr": "sum without(partition) (kafka_consumergroupzookeeper_lag_zookeeper{consumergroup=~\"$env.summary.backup\", job=\"processing-kafka-exporter\"})",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "15000000,20000000",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "DerivedDenormEventsBackup",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#73BF69",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "datasource": "Prometheus",
+ "description": "Threshold: \nWarning: 1M\nCritical: 1.5M",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 4,
+ "x": 16,
+ "y": 15
+ },
+ "id": 37,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "{consumergroup=\"ntpprod.learning.graph.events.backup\", endpoint=\"metrics\", instance=\"11.4.35.220:9308\", job=\"ingestion-kafka-exporter\", namespace=\"monitoring\", pod=\"ingestion-kafka-exporter-666bdff69c-4rqdd\", service=\"ingestion-kafka-exporter\", topic=\"ntpprod.learning.graph.events\"}",
+ "targets": [
+ {
+ "expr": "sum without(partition) (kafka_consumergroupzookeeper_lag_zookeeper{consumergroup=~\"$env.learning.graph.events.backup\", job=\"ingestion-kafka-exporter\"})",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "1000000,1500000",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "LearningGraphEventsBackup",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#73BF69",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "datasource": "Prometheus",
+ "description": "Threshold: \nWarning: 4M\nCritical: 8M",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 4,
+ "x": 20,
+ "y": 15
+ },
+ "id": 57,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "{consumergroup=\"ntpprod.coursebatch.job.request.backup\", endpoint=\"metrics\", instance=\"11.4.35.220:9308\", job=\"ingestion-kafka-exporter\", namespace=\"monitoring\", pod=\"ingestion-kafka-exporter-666bdff69c-4rqdd\", service=\"ingestion-kafka-exporter\", topic=\"ntpprod.coursebatch.job.request\"}",
+ "targets": [
+ {
+ "expr": "sum without(partition) (kafka_consumergroupzookeeper_lag_zookeeper{consumergroup=~\"$env.coursebatch.job.request.backup\", job=\"ingestion-kafka-exporter\"})",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "4000000,8000000",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "CourceBatchEventsBackup",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ }
+ ],
+ "title": "Secor Lag",
+ "type": "row"
+ },
+ {
+ "collapsed": true,
+ "datasource": null,
+ "gridPos": {
+ "h": 1,
+ "w": 24,
+ "x": 0,
+ "y": 23
+ },
+ "id": 59,
+ "panels": [
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": null,
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "fill": 1,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 8,
+ "w": 24,
+ "x": 0,
+ "y": 12
+ },
+ "hiddenSeries": false,
+ "id": 61,
+ "legend": {
+ "alignAsTable": true,
+ "avg": false,
+ "current": false,
+ "max": true,
+ "min": false,
+ "rightSide": true,
+ "show": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "nullPointMode": "null",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 2,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "sum(dataproduct_workflowsummarymodel_time_taken_secs)",
+ "interval": "",
+ "legendFormat": "time_taken: {{ subsystem }}",
+ "refId": "A"
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Totatl Data Products time taken",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "$$hashKey": "object:404",
+ "format": "s",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ },
+ {
+ "$$hashKey": "object:405",
+ "format": "s",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "datasource": null,
+ "fieldConfig": {
+ "defaults": {
+ "custom": {
+ "align": "left"
+ },
+ "mappings": [
+ {
+ "from": "",
+ "id": 0,
+ "operator": "",
+ "text": "",
+ "to": "",
+ "type": 1,
+ "value": ""
+ }
+ ],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ },
+ {
+ "color": "red",
+ "value": 80
+ }
+ ]
+ },
+ "unit": "short"
+ },
+ "overrides": [
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "Value #A"
+ },
+ "properties": [
+ {
+ "id": "displayName",
+ "value": "Total"
+ }
+ ]
+ },
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "Value #B"
+ },
+ "properties": [
+ {
+ "id": "displayName",
+ "value": "Total"
+ }
+ ]
+ }
+ ]
+ },
+ "gridPos": {
+ "h": 5,
+ "w": 11,
+ "x": 0,
+ "y": 20
+ },
+ "id": 63,
+ "options": {
+ "frameIndex": 0,
+ "showHeader": true,
+ "sortBy": [
+ {
+ "desc": true,
+ "displayName": "report_date"
+ }
+ ]
+ },
+ "pluginVersion": "7.0.6",
+ "targets": [
+ {
+ "expr": "sum(sum_over_time(dataproduct_workflowsummarymodel_input_events[${__range_s}s])) by (report_date)",
+ "format": "table",
+ "hide": false,
+ "instant": true,
+ "interval": "",
+ "legendFormat": "input_events",
+ "refId": "A"
+ }
+ ],
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Total Data Products Input count",
+ "transformations": [
+ {
+ "id": "organize",
+ "options": {
+ "excludeByName": {
+ "Time": true,
+ "endpoint": true,
+ "instance": true,
+ "namespace": true,
+ "service": true,
+ "status": true
+ },
+ "indexByName": {},
+ "renameByName": {}
+ }
+ }
+ ],
+ "type": "table"
+ },
+ {
+ "datasource": null,
+ "fieldConfig": {
+ "defaults": {
+ "custom": {
+ "align": "left"
+ },
+ "mappings": [
+ {
+ "from": "",
+ "id": 0,
+ "operator": "",
+ "text": "",
+ "to": "",
+ "type": 1,
+ "value": ""
+ }
+ ],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ },
+ {
+ "color": "red",
+ "value": 80
+ }
+ ]
+ },
+ "unit": "short"
+ },
+ "overrides": [
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "Value #A"
+ },
+ "properties": [
+ {
+ "id": "displayName",
+ "value": "Total"
+ }
+ ]
+ },
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "Value #B"
+ },
+ "properties": [
+ {
+ "id": "displayName",
+ "value": "Total"
+ }
+ ]
+ }
+ ]
+ },
+ "gridPos": {
+ "h": 5,
+ "w": 13,
+ "x": 11,
+ "y": 20
+ },
+ "id": 65,
+ "options": {
+ "frameIndex": 0,
+ "showHeader": true,
+ "sortBy": [
+ {
+ "desc": true,
+ "displayName": "report_date"
+ }
+ ]
+ },
+ "pluginVersion": "7.0.6",
+ "targets": [
+ {
+ "expr": "sum(sum_over_time(dataproduct_workflowsummarymodel_output_events[${__range_s}s])) by (report_date)",
+ "format": "table",
+ "hide": false,
+ "instant": true,
+ "interval": "",
+ "legendFormat": "input_events",
+ "refId": "A"
+ }
+ ],
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Total Data Products Output count",
+ "transformations": [
+ {
+ "id": "organize",
+ "options": {
+ "excludeByName": {
+ "Time": true,
+ "endpoint": true,
+ "instance": true,
+ "namespace": true,
+ "service": true,
+ "status": true
+ },
+ "indexByName": {},
+ "renameByName": {}
+ }
+ }
+ ],
+ "type": "table"
+ }
+ ],
+ "title": "WFS Metrics",
+ "type": "row"
+ },
+ {
+ "collapsed": true,
+ "datasource": null,
+ "gridPos": {
+ "h": 1,
+ "w": 24,
+ "x": 0,
+ "y": 24
+ },
+ "id": 73,
+ "panels": [
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#73BF69",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "datasource": "Prometheus",
+ "description": "Datasource name: audit-rollup-syncts",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 4,
+ "x": 0,
+ "y": 9
+ },
+ "id": 74,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "druid_ingest_kafka_lag{cluster=\"rollup\", exported_job=\"audit-rollup-syncts\", instance=\"11.4.0.53:9108\", ip=\"11_4_0_53:8090\", job=\"druid-exporter\", role=\"druid/overlord\"}",
+ "targets": [
+ {
+ "expr": "druid_ingest_kafka_lag{cluster=\"rollup\",exported_job=\"audit-rollup-syncts\"}",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "AuditRollupSyncts",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#73BF69",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "datasource": "Prometheus",
+ "description": "Datasource name: error-rollup-syncts",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 4,
+ "x": 4,
+ "y": 9
+ },
+ "id": 75,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "druid_ingest_kafka_lag{cluster=\"rollup\", exported_job=\"error-rollup-syncts\", instance=\"11.4.0.53:9108\", ip=\"11_4_0_53:8090\", job=\"druid-exporter\", role=\"druid/overlord\"}",
+ "targets": [
+ {
+ "expr": "druid_ingest_kafka_lag{cluster=\"rollup\",exported_job=\"error-rollup-syncts\"}",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "ErrorRollupSyncts",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#73BF69",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "datasource": "Prometheus",
+ "description": "Datasource name: summary-distinct-counts",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 4,
+ "x": 8,
+ "y": 9
+ },
+ "id": 76,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "druid_ingest_kafka_lag{cluster=\"rollup\", exported_job=\"summary-distinct-counts\", instance=\"11.4.0.53:9108\", ip=\"11_4_0_53:8090\", job=\"druid-exporter\", role=\"druid/overlord\"}",
+ "targets": [
+ {
+ "expr": "druid_ingest_kafka_lag{cluster=\"rollup\",exported_job=\"summary-distinct-counts\"}",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "SummaryDistinctCounts",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#73BF69",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "datasource": "Prometheus",
+ "description": "Datasource name: summary-rollup-syncts",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 4,
+ "x": 12,
+ "y": 9
+ },
+ "id": 77,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "druid_ingest_kafka_lag{cluster=\"rollup\", exported_job=\"summary-rollup-syncts\", instance=\"11.4.0.53:9108\", ip=\"11_4_0_53:8090\", job=\"druid-exporter\", role=\"druid/overlord\"}",
+ "targets": [
+ {
+ "expr": "druid_ingest_kafka_lag{cluster=\"rollup\",exported_job=\"summary-rollup-syncts\"}",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "SummaryRollupSyncts",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#73BF69",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "datasource": "Prometheus",
+ "description": "Datasource name: summary-rollup-syncts",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 4,
+ "x": 16,
+ "y": 9
+ },
+ "id": 78,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "druid_ingest_kafka_lag{cluster=\"rollup\", exported_job=\"telemetry-rollup-syncts\", instance=\"11.4.0.53:9108\", ip=\"11_4_0_53:8090\", job=\"druid-exporter\", role=\"druid/overlord\"}",
+ "targets": [
+ {
+ "expr": "druid_ingest_kafka_lag{cluster=\"rollup\",exported_job=\"telemetry-rollup-syncts\"}",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "TelemetryRollupSyncts",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ }
+ ],
+ "title": "Druid Rollup Cluster DataSource Lag",
+ "type": "row"
+ },
+ {
+ "collapsed": true,
+ "datasource": null,
+ "gridPos": {
+ "h": 1,
+ "w": 24,
+ "x": 0,
+ "y": 25
+ },
+ "id": 67,
+ "panels": [
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#73BF69",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "datasource": "Prometheus",
+ "description": "DataSource name: summary-events",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 4,
+ "x": 0,
+ "y": 10
+ },
+ "id": 69,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "druid_ingest_kafka_lag{cluster=\"raw\", exported_job=\"summary-events\", instance=\"11.4.3.41:9108\", ip=\"11_4_3_41:8090\", job=\"druid-exporter\", role=\"druid/overlord\"}",
+ "targets": [
+ {
+ "expr": "druid_ingest_kafka_lag{cluster=\"raw\",exported_job=\"summary-events\"}",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Summary-Events",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#73BF69",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "datasource": "Prometheus",
+ "description": "Datasource name: telemetry-events-syncts",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 4,
+ "x": 4,
+ "y": 10
+ },
+ "id": 70,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "druid_ingest_kafka_lag{cluster=\"raw\", exported_job=\"telemetry-events-syncts\", instance=\"11.4.3.41:9108\", ip=\"11_4_3_41:8090\", job=\"druid-exporter\", role=\"druid/overlord\"}",
+ "targets": [
+ {
+ "expr": "druid_ingest_kafka_lag{cluster=\"raw\",exported_job=\"telemetry-events-syncts\"}",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "TelemetryEventsSyncts",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#73BF69",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "datasource": "Prometheus",
+ "description": "Datasource name: telemetry-feedback-events",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 4,
+ "x": 8,
+ "y": 10
+ },
+ "id": 71,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "druid_ingest_kafka_lag{cluster=\"raw\", exported_job=\"telemetry-feedback-events\", instance=\"11.4.3.41:9108\", ip=\"11_4_3_41:8090\", job=\"druid-exporter\", role=\"druid/overlord\"}",
+ "targets": [
+ {
+ "expr": "druid_ingest_kafka_lag{cluster=\"raw\",exported_job=\"telemetry-feedback-events\"}",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "TelemetryFeedbackEvents",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ }
+ ],
+ "title": "Druid Raw Cluster DataSource Lag",
+ "type": "row"
+ },
+ {
+ "collapsed": true,
+ "datasource": null,
+ "gridPos": {
+ "h": 1,
+ "w": 24,
+ "x": 0,
+ "y": 26
+ },
+ "id": 94,
+ "panels": [
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#73BF69",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "datasource": "Prometheus",
+ "description": "Threshold:\nCritical: 1",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 4,
+ "x": 0,
+ "y": 23
+ },
+ "id": 95,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "druid_segment_unavailable_count{cluster=\"rollup\", exported_job=\"audit-rollup-syncts\", instance=\"11.4.0.53:9108\", ip=\"11_4_0_53:8081\", job=\"druid-exporter\", role=\"druid/coordinator\"}",
+ "targets": [
+ {
+ "expr": "druid_segment_unavailable_count{cluster=\"rollup\",exported_job=\"audit-rollup-syncts\"}",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "1,1",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "AuditRollupSyncts",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#73BF69",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "datasource": "Prometheus",
+ "description": "Threshold:\nCritical: 1",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 4,
+ "x": 4,
+ "y": 23
+ },
+ "id": 96,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "druid_segment_unavailable_count{cluster=\"rollup\", exported_job=\"error-rollup-syncts\", instance=\"11.4.0.53:9108\", ip=\"11_4_0_53:8081\", job=\"druid-exporter\", role=\"druid/coordinator\"}",
+ "targets": [
+ {
+ "expr": "druid_segment_unavailable_count{cluster=\"rollup\",exported_job=\"error-rollup-syncts\"}",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "1,1",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "ErrorRollupSyncts",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#73BF69",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "datasource": "Prometheus",
+ "description": "Threshold:\nCritical: 1",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 4,
+ "x": 8,
+ "y": 23
+ },
+ "id": 97,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "druid_segment_unavailable_count{cluster=\"rollup\", exported_job=\"summary-distinct-counts\", instance=\"11.4.0.53:9108\", ip=\"11_4_0_53:8081\", job=\"druid-exporter\", role=\"druid/coordinator\"}",
+ "targets": [
+ {
+ "expr": "druid_segment_unavailable_count{cluster=\"rollup\",exported_job=\"summary-distinct-counts\"}",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "1,1",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "SummaryDistinctCounts",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#73BF69",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "datasource": "Prometheus",
+ "description": "Threshold:\nCritical: 1",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 4,
+ "x": 12,
+ "y": 23
+ },
+ "id": 98,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "druid_segment_unavailable_count{cluster=\"rollup\", exported_job=\"summary-monthly-rollup-syncts\", instance=\"11.4.0.53:9108\", ip=\"11_4_0_53:8081\", job=\"druid-exporter\", role=\"druid/coordinator\"}",
+ "targets": [
+ {
+ "expr": "druid_segment_unavailable_count{cluster=\"rollup\",exported_job=\"summary-monthly-rollup-syncts\"}",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "1,1",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "SummaryMonthlyRollupSyncts",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#73BF69",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "datasource": "Prometheus",
+ "description": "Threshold:\nCritical: 1",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 4,
+ "x": 16,
+ "y": 23
+ },
+ "id": 99,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "druid_segment_unavailable_count{cluster=\"rollup\", exported_job=\"summary-rollup-syncts\", instance=\"11.4.0.53:9108\", ip=\"11_4_0_53:8081\", job=\"druid-exporter\", role=\"druid/coordinator\"}",
+ "targets": [
+ {
+ "expr": "druid_segment_unavailable_count{cluster=\"rollup\",exported_job=\"summary-rollup-syncts\"}",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "1,1",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "SummaryRollupSyncts",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#73BF69",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "datasource": "Prometheus",
+ "description": "Threshold:\nCritical: 1",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 4,
+ "x": 20,
+ "y": 23
+ },
+ "id": 100,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "druid_segment_unavailable_count{cluster=\"rollup\", exported_job=\"telemetry-rollup-syncts\", instance=\"11.4.0.53:9108\", ip=\"11_4_0_53:8081\", job=\"druid-exporter\", role=\"druid/coordinator\"}",
+ "targets": [
+ {
+ "expr": "druid_segment_unavailable_count{cluster=\"rollup\",exported_job=\"telemetry-rollup-syncts\"}",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "1,1",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "TelemetryRollupSyncts",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ }
+ ],
+ "title": "Druid Rolllup Cluster Segment Unavailable Count",
+ "type": "row"
+ },
+ {
+ "collapsed": true,
+ "datasource": null,
+ "gridPos": {
+ "h": 1,
+ "w": 24,
+ "x": 0,
+ "y": 27
+ },
+ "id": 102,
+ "panels": [
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#73BF69",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "datasource": "Prometheus",
+ "description": "Threshold:\nCritical: 1",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 4,
+ "x": 0,
+ "y": 16
+ },
+ "id": 103,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "druid_segment_unavailable_count{cluster=\"raw\", exported_job=\"content-model-snapshot\", instance=\"11.4.3.41:9108\", ip=\"11_4_3_41:8081\", job=\"druid-exporter\", role=\"druid/coordinator\"}",
+ "targets": [
+ {
+ "expr": "druid_segment_unavailable_count{cluster=\"raw\",exported_job=\"content-model-snapshot\"}",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "1,1",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "ContentModelSnapshot",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#73BF69",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "datasource": "Prometheus",
+ "description": "Threshold:\nCritical: 1",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 4,
+ "x": 4,
+ "y": 16
+ },
+ "id": 104,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "druid_segment_unavailable_count{cluster=\"raw\", exported_job=\"offline-desktop-events\", instance=\"11.4.3.41:9108\", ip=\"11_4_3_41:8081\", job=\"druid-exporter\", role=\"druid/coordinator\"}",
+ "targets": [
+ {
+ "expr": "druid_segment_unavailable_count{cluster=\"raw\",exported_job=\"offline-desktop-events\"}",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "1,1",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "OfflineDesktopEvents",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#73BF69",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "datasource": "Prometheus",
+ "description": "Threshold:\nCritical: 1",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 4,
+ "x": 8,
+ "y": 16
+ },
+ "id": 105,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "druid_segment_unavailable_count{cluster=\"raw\", exported_job=\"pipeline-metrics\", instance=\"11.4.3.41:9108\", ip=\"11_4_3_41:8081\", job=\"druid-exporter\", role=\"druid/coordinator\"}",
+ "targets": [
+ {
+ "expr": "druid_segment_unavailable_count{cluster=\"raw\",exported_job=\"pipeline-metrics\"}",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "1,1",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "PipelineMetrics",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#73BF69",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "datasource": "Prometheus",
+ "description": "Threshold:\nCritical: 1",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 4,
+ "x": 12,
+ "y": 16
+ },
+ "id": 106,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "druid_segment_unavailable_count{cluster=\"raw\", exported_job=\"summary-events\", instance=\"11.4.3.41:9108\", ip=\"11_4_3_41:8081\", job=\"druid-exporter\", role=\"druid/coordinator\"}",
+ "targets": [
+ {
+ "expr": "druid_segment_unavailable_count{cluster=\"raw\",exported_job=\"summary-events\"}",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "1,1",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "SummaryEvents",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#73BF69",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "datasource": "Prometheus",
+ "description": "Threshold:\nCritical: 1",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 4,
+ "x": 16,
+ "y": 16
+ },
+ "id": 107,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "druid_segment_unavailable_count{cluster=\"raw\", exported_job=\"telemetry-error-events\", instance=\"11.4.3.41:9108\", ip=\"11_4_3_41:8081\", job=\"druid-exporter\", role=\"druid/coordinator\"}",
+ "targets": [
+ {
+ "expr": "druid_segment_unavailable_count{cluster=\"raw\",exported_job=\"telemetry-error-events\"}",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "1,1",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "TelemetryErrorEvents",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#73BF69",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "datasource": "Prometheus",
+ "description": "Threshold:\nCritical: 1",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 4,
+ "x": 20,
+ "y": 16
+ },
+ "id": 108,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "druid_segment_unavailable_count{cluster=\"raw\", exported_job=\"telemetry-events\", instance=\"11.4.3.41:9108\", ip=\"11_4_3_41:8081\", job=\"druid-exporter\", role=\"druid/coordinator\"}",
+ "targets": [
+ {
+ "expr": "druid_segment_unavailable_count{cluster=\"raw\",exported_job=\"telemetry-events\"}",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "1,1",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "TelemetryEvents",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#73BF69",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "datasource": "Prometheus",
+ "description": "Threshold:\nCritical: 1",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 4,
+ "x": 0,
+ "y": 20
+ },
+ "id": 109,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "druid_segment_unavailable_count{cluster=\"raw\", exported_job=\"telemetry-events-syncts\", instance=\"11.4.3.41:9108\", ip=\"11_4_3_41:8081\", job=\"druid-exporter\", role=\"druid/coordinator\"}",
+ "targets": [
+ {
+ "expr": "druid_segment_unavailable_count{cluster=\"raw\",exported_job=\"telemetry-events-syncts\"}",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "1,1",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "TelemetryEventsSyncts",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#73BF69",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "datasource": "Prometheus",
+ "description": "Threshold:\nCritical: 1",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 4,
+ "x": 4,
+ "y": 20
+ },
+ "id": 110,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "druid_segment_unavailable_count{cluster=\"raw\", exported_job=\"telemetry-feedback-events\", instance=\"11.4.3.41:9108\", ip=\"11_4_3_41:8081\", job=\"druid-exporter\", role=\"druid/coordinator\"}",
+ "targets": [
+ {
+ "expr": "druid_segment_unavailable_count{cluster=\"raw\",exported_job=\"telemetry-feedback-events\"}",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "1,1",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "TelemetryFeedbackEvents",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ }
+ ],
+ "title": "Druid Raw Cluster Segment Unavailable Count",
+ "type": "row"
+ },
+ {
+ "collapsed": true,
+ "datasource": null,
+ "gridPos": {
+ "h": 1,
+ "w": 24,
+ "x": 0,
+ "y": 28
+ },
+ "id": 116,
+ "panels": [
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#d44a3a",
+ "rgba(237, 129, 40, 0.89)",
+ "#73BF69"
+ ],
+ "datasource": "Prometheus",
+ "description": "Threshold:\nProcess Running: 1\nNot Running: 0",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 3,
+ "w": 4,
+ "x": 0,
+ "y": 13
+ },
+ "id": 117,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "{groupname=\"derived-telemetry-backup\", instance=\"11.4.3.67:1111\", job=\"process-exporter\"}",
+ "targets": [
+ {
+ "expr": "sum without(state) (namedprocess_namegroup_states{groupname=\"derived-telemetry-backup\"})",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "1,0",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "derived-telemetry-backup",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#d44a3a",
+ "rgba(237, 129, 40, 0.89)",
+ "#73BF69"
+ ],
+ "datasource": "Prometheus",
+ "description": "Threshold:\nProcess Running: 1\nNot Running: 0",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 3,
+ "w": 4,
+ "x": 4,
+ "y": 13
+ },
+ "id": 123,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "{groupname=\"derived-denorm-events-backup\", instance=\"11.4.3.67:1111\", job=\"process-exporter\"}",
+ "targets": [
+ {
+ "expr": "sum without(state) (namedprocess_namegroup_states{groupname=\"derived-denorm-events-backup\"})",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "1,0",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "derived-denorm-events-backup",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#d44a3a",
+ "rgba(237, 129, 40, 0.89)",
+ "#73BF69"
+ ],
+ "datasource": "Prometheus",
+ "description": "Threshold:\nProcess Running: 1\nNot Running: 0",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 3,
+ "w": 4,
+ "x": 8,
+ "y": 13
+ },
+ "id": 119,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "{groupname=\"channel-summary-backup\", instance=\"11.4.3.67:1111\", job=\"process-exporter\"}",
+ "targets": [
+ {
+ "expr": "sum without(state) (namedprocess_namegroup_states{groupname=\"channel-summary-backup\"})",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "0,0",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "channel-summary-backup",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#d44a3a",
+ "rgba(237, 129, 40, 0.89)",
+ "#73BF69"
+ ],
+ "datasource": "Prometheus",
+ "description": "Threshold:\nProcess Running: 1\nNot Running: 0",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 3,
+ "w": 4,
+ "x": 12,
+ "y": 13
+ },
+ "id": 120,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "{groupname=\"assess-events-backup\", instance=\"11.4.3.67:1111\", job=\"process-exporter\"}",
+ "targets": [
+ {
+ "expr": "sum without(state) (namedprocess_namegroup_states{groupname=\"assess-events-backup\"})",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "1,1",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "assess-events-backup",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#d44a3a",
+ "rgba(237, 129, 40, 0.89)",
+ "#73BF69"
+ ],
+ "datasource": "Prometheus",
+ "description": "Threshold:\nProcess Running: 1\nNot Running: 0",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 3,
+ "w": 4,
+ "x": 16,
+ "y": 13
+ },
+ "id": 121,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "{groupname=\"assess-raw-events-backup\", instance=\"11.4.3.67:1111\", job=\"process-exporter\"}",
+ "targets": [
+ {
+ "expr": "sum without(state) (namedprocess_namegroup_states{groupname=\"assess-raw-events-backup\"})",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "1,1",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "assess-raw-events-backup",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#d44a3a",
+ "rgba(237, 129, 40, 0.89)",
+ "#73BF69"
+ ],
+ "datasource": "Prometheus",
+ "description": "Threshold:\nProcess Running: 1\nNot Running: 0",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 3,
+ "w": 4,
+ "x": 20,
+ "y": 13
+ },
+ "id": 122,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "{groupname=\"device-profile-backup\", instance=\"11.4.3.67:1111\", job=\"process-exporter\"}",
+ "targets": [
+ {
+ "expr": "sum without(state) (namedprocess_namegroup_states{groupname=\"device-profile-backup\"})",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "1,1",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "device-profile-backup",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#d44a3a",
+ "rgba(237, 129, 40, 0.89)",
+ "#73BF69"
+ ],
+ "datasource": "Prometheus",
+ "description": "Threshold:\nProcess Running: 1\nNot Running: 0",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 3,
+ "w": 4,
+ "x": 0,
+ "y": 16
+ },
+ "id": 118,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "{groupname=\"learning-events-backup\", instance=\"11.4.3.67:1111\", job=\"process-exporter\"}",
+ "targets": [
+ {
+ "expr": "sum without(state) (namedprocess_namegroup_states{groupname=\"learning-events-backup\"})",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "0,0",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "learning-events-backup",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#d44a3a",
+ "rgba(237, 129, 40, 0.89)",
+ "#73BF69"
+ ],
+ "datasource": "Prometheus",
+ "description": "Threshold:\nProcess Running: 1\nNot Running: 0",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 3,
+ "w": 4,
+ "x": 4,
+ "y": 16
+ },
+ "id": 124,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "{groupname=\"learning-failed-backup\", instance=\"11.4.3.67:1111\", job=\"process-exporter\"}",
+ "targets": [
+ {
+ "expr": "sum without(state) (namedprocess_namegroup_states{groupname=\"learning-failed-backup\"})",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "0,0",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "learning-failed-backup",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#d44a3a",
+ "rgba(237, 129, 40, 0.89)",
+ "#73BF69"
+ ],
+ "datasource": "Prometheus",
+ "description": "Threshold:\nProcess Running: 1\nNot Running: 0",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 3,
+ "w": 4,
+ "x": 8,
+ "y": 16
+ },
+ "id": 125,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "{groupname=\"content-consumption-events-backup\", instance=\"11.4.3.67:1111\", job=\"process-exporter\"}",
+ "targets": [
+ {
+ "expr": "sum without(state) (namedprocess_namegroup_states{groupname=\"content-consumption-events-backup\"})",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "0,0",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "content-consumption-events-backup",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#d44a3a",
+ "rgba(237, 129, 40, 0.89)",
+ "#73BF69"
+ ],
+ "datasource": "Prometheus",
+ "description": "Threshold:\nProcess Running: 1\nNot Running: 0",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 3,
+ "w": 4,
+ "x": 12,
+ "y": 16
+ },
+ "id": 126,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "{groupname=\"failed-telemetry-backup\", instance=\"11.4.3.67:1111\", job=\"process-exporter\"}",
+ "targets": [
+ {
+ "expr": "sum without(state) (namedprocess_namegroup_states{groupname=\"failed-telemetry-backup\"})",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "0,0",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "failed-telemetry-backup",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#d44a3a",
+ "rgba(237, 129, 40, 0.89)",
+ "#73BF69"
+ ],
+ "datasource": "Prometheus",
+ "description": "Threshold:\nProcess Running: 1\nNot Running: 0",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 3,
+ "w": 4,
+ "x": 16,
+ "y": 16
+ },
+ "id": 127,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "{groupname=\"extractor-duplicate-backup\", instance=\"11.4.3.67:1111\", job=\"process-exporter\"}",
+ "targets": [
+ {
+ "expr": "sum without(state) (namedprocess_namegroup_states{groupname=\"extractor-duplicate-backup\"})",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "0,0",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "extractor-duplicate-backup",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#d44a3a",
+ "rgba(237, 129, 40, 0.89)",
+ "#73BF69"
+ ],
+ "datasource": "Prometheus",
+ "description": "Threshold:\nProcess Running: 1\nNot Running: 0",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 3,
+ "w": 4,
+ "x": 20,
+ "y": 16
+ },
+ "id": 128,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "{groupname=\"extractor-failed-backup\", instance=\"11.4.3.67:1111\", job=\"process-exporter\"}",
+ "targets": [
+ {
+ "expr": "sum without(state) (namedprocess_namegroup_states{groupname=\"extractor-failed-backup\"})",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "0,0",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "extractor-failed-backup",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#d44a3a",
+ "rgba(237, 129, 40, 0.89)",
+ "#73BF69"
+ ],
+ "datasource": "Prometheus",
+ "description": "Threshold:\nProcess Running: 1\nNot Running: 0",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 3,
+ "w": 4,
+ "x": 0,
+ "y": 19
+ },
+ "id": 129,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "{groupname=\"channel-telemetry-backup-1\", instance=\"11.4.3.67:1111\", job=\"process-exporter\"}",
+ "targets": [
+ {
+ "expr": "sum without(state) (namedprocess_namegroup_states{groupname=\"channel-telemetry-backup-1\"})",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "0,0",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "channel-telemetry-backup-1",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#d44a3a",
+ "rgba(237, 129, 40, 0.89)",
+ "#73BF69"
+ ],
+ "datasource": "Prometheus",
+ "description": "Threshold:\nProcess Running: 1\nNot Running: 0",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 3,
+ "w": 4,
+ "x": 4,
+ "y": 19
+ },
+ "id": 130,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "{groupname=\"channel-telemetry-backup-2\", instance=\"11.4.3.67:1111\", job=\"process-exporter\"}",
+ "targets": [
+ {
+ "expr": "sum without(state) (namedprocess_namegroup_states{groupname=\"channel-telemetry-backup-2\"})",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "0,0",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "channel-telemetry-backup-2",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#d44a3a",
+ "rgba(237, 129, 40, 0.89)",
+ "#73BF69"
+ ],
+ "datasource": "Prometheus",
+ "description": "Threshold:\nProcess Running: 1\nNot Running: 0",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 3,
+ "w": 4,
+ "x": 8,
+ "y": 19
+ },
+ "id": 131,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "{groupname=\"channel-telemetry-backup-3\", instance=\"11.4.3.67:1111\", job=\"process-exporter\"}",
+ "targets": [
+ {
+ "expr": "sum without(state) (namedprocess_namegroup_states{groupname=\"channel-telemetry-backup-3\"})",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "0,0",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "channel-telemetry-backup-3",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#d44a3a",
+ "rgba(237, 129, 40, 0.89)",
+ "#73BF69"
+ ],
+ "datasource": "Prometheus",
+ "description": "Threshold:\nProcess Running: 1\nNot Running: 0",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 3,
+ "w": 4,
+ "x": 12,
+ "y": 19
+ },
+ "id": 132,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "{groupname=\"channel-telemetry-backup-4\", instance=\"11.4.3.67:1111\", job=\"process-exporter\"}",
+ "targets": [
+ {
+ "expr": "sum without(state) (namedprocess_namegroup_states{groupname=\"channel-telemetry-backup-4\"})",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "0,0",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "channel-telemetry-backup-4",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#d44a3a",
+ "rgba(237, 129, 40, 0.89)",
+ "#73BF69"
+ ],
+ "datasource": "Prometheus",
+ "description": "Threshold:\nProcess Running: 1\nNot Running: 0",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 3,
+ "w": 4,
+ "x": 16,
+ "y": 19
+ },
+ "id": 133,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "{groupname=\"channel-telemetry-backup-5\", instance=\"11.4.3.67:1111\", job=\"process-exporter\"}",
+ "targets": [
+ {
+ "expr": "sum without(state) (namedprocess_namegroup_states{groupname=\"channel-telemetry-backup-5\"})",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "0,0",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "channel-telemetry-backup-5",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#d44a3a",
+ "rgba(237, 129, 40, 0.89)",
+ "#73BF69"
+ ],
+ "datasource": "Prometheus",
+ "description": "Threshold:\nProcess Running: 1\nNot Running: 0",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 3,
+ "w": 4,
+ "x": 20,
+ "y": 19
+ },
+ "id": 134,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "{groupname=\"channel-telemetry-backup-6\", instance=\"11.4.3.67:1111\", job=\"process-exporter\"}",
+ "targets": [
+ {
+ "expr": "sum without(state) (namedprocess_namegroup_states{groupname=\"channel-telemetry-backup-6\"})",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "0,0",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "channel-telemetry-backup-6",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#d44a3a",
+ "rgba(237, 129, 40, 0.89)",
+ "#73BF69"
+ ],
+ "datasource": "Prometheus",
+ "description": "Threshold:\nProcess Running: 1\nNot Running: 0",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 3,
+ "w": 4,
+ "x": 0,
+ "y": 22
+ },
+ "id": 135,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "{groupname=\"channel-telemetry-backup-7\", instance=\"11.4.3.67:1111\", job=\"process-exporter\"}",
+ "targets": [
+ {
+ "expr": "sum without(state) (namedprocess_namegroup_states{groupname=\"channel-telemetry-backup-7\"})",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "0,0",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "channel-telemetry-backup-7",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#d44a3a",
+ "rgba(237, 129, 40, 0.89)",
+ "#73BF69"
+ ],
+ "datasource": "Prometheus",
+ "description": "Threshold:\nProcess Running: 1\nNot Running: 0",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 3,
+ "w": 4,
+ "x": 4,
+ "y": 22
+ },
+ "id": 136,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "{groupname=\"channel-telemetry-backup-8\", instance=\"11.4.3.67:1111\", job=\"process-exporter\"}",
+ "targets": [
+ {
+ "expr": "sum without(state) (namedprocess_namegroup_states{groupname=\"channel-telemetry-backup-8\"})",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "0,0",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "channel-telemetry-backup-8",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#d44a3a",
+ "rgba(237, 129, 40, 0.89)",
+ "#73BF69"
+ ],
+ "datasource": "Prometheus",
+ "description": "Threshold:\nProcess Running: 1\nNot Running: 0",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 3,
+ "w": 4,
+ "x": 8,
+ "y": 22
+ },
+ "id": 137,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "{groupname=\"ingestion-telemetry-backup-1\", instance=\"11.4.3.66:1111\", job=\"process-exporter\"}",
+ "targets": [
+ {
+ "expr": "sum without(state) (namedprocess_namegroup_states{groupname=\"ingestion-telemetry-backup-1\"})",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "0,0",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "ingestion-telemetry-backup-1",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#d44a3a",
+ "rgba(237, 129, 40, 0.89)",
+ "#73BF69"
+ ],
+ "datasource": "Prometheus",
+ "description": "Threshold:\nProcess Running: 1\nNot Running: 0",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 3,
+ "w": 4,
+ "x": 12,
+ "y": 22
+ },
+ "id": 138,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "{groupname=\"ingestion-telemetry-backup-2\", instance=\"11.4.3.66:1111\", job=\"process-exporter\"}",
+ "targets": [
+ {
+ "expr": "sum without(state) (namedprocess_namegroup_states{groupname=\"ingestion-telemetry-backup-2\"})",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "0,0",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "ingestion-telemetry-backup-2",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#d44a3a",
+ "rgba(237, 129, 40, 0.89)",
+ "#73BF69"
+ ],
+ "datasource": "Prometheus",
+ "description": "Threshold:\nProcess Running: 1\nNot Running: 0",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 3,
+ "w": 4,
+ "x": 16,
+ "y": 22
+ },
+ "id": 139,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "{groupname=\"ingestion-telemetry-backup-3\", instance=\"11.4.3.66:1111\", job=\"process-exporter\"}",
+ "targets": [
+ {
+ "expr": "sum without(state) (namedprocess_namegroup_states{groupname=\"ingestion-telemetry-backup-3\"})",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "0,0",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "ingestion-telemetry-backup-3",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#d44a3a",
+ "rgba(237, 129, 40, 0.89)",
+ "#73BF69"
+ ],
+ "datasource": "Prometheus",
+ "description": "Threshold:\nProcess Running: 1\nNot Running: 0",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 3,
+ "w": 4,
+ "x": 20,
+ "y": 22
+ },
+ "id": 140,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "{groupname=\"ingestion-telemetry-backup-4\", instance=\"11.4.3.66:1111\", job=\"process-exporter\"}",
+ "targets": [
+ {
+ "expr": "sum without(state) (namedprocess_namegroup_states{groupname=\"ingestion-telemetry-backup-4\"})",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "0,0",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "ingestion-telemetry-backup-4",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#d44a3a",
+ "rgba(237, 129, 40, 0.89)",
+ "#73BF69"
+ ],
+ "datasource": "Prometheus",
+ "description": "Threshold:\nProcess Running: 1\nNot Running: 0",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 3,
+ "w": 4,
+ "x": 0,
+ "y": 25
+ },
+ "id": 141,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "{groupname=\"raw-telemetry-backup-1\", instance=\"11.4.3.66:1111\", job=\"process-exporter\"}",
+ "targets": [
+ {
+ "expr": "sum without(state) (namedprocess_namegroup_states{groupname=\"raw-telemetry-backup-1\"})",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "0,0",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "raw-telemetry-backup-1",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#d44a3a",
+ "rgba(237, 129, 40, 0.89)",
+ "#73BF69"
+ ],
+ "datasource": "Prometheus",
+ "description": "Threshold:\nProcess Running: 1\nNot Running: 0",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 3,
+ "w": 4,
+ "x": 4,
+ "y": 25
+ },
+ "id": 142,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "{groupname=\"raw-telemetry-backup-2\", instance=\"11.4.3.66:1111\", job=\"process-exporter\"}",
+ "targets": [
+ {
+ "expr": "sum without(state) (namedprocess_namegroup_states{groupname=\"raw-telemetry-backup-2\"})",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "0,0",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "raw-telemetry-backup-2",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#d44a3a",
+ "rgba(237, 129, 40, 0.89)",
+ "#73BF69"
+ ],
+ "datasource": "Prometheus",
+ "description": "Threshold:\nProcess Running: 1\nNot Running: 0",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 3,
+ "w": 4,
+ "x": 8,
+ "y": 25
+ },
+ "id": 143,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "{groupname=\"raw-telemetry-backup-3\", instance=\"11.4.3.66:1111\", job=\"process-exporter\"}",
+ "targets": [
+ {
+ "expr": "sum without(state) (namedprocess_namegroup_states{groupname=\"raw-telemetry-backup-3\"})",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "0,0",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "raw-telemetry-backup-3",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#d44a3a",
+ "rgba(237, 129, 40, 0.89)",
+ "#73BF69"
+ ],
+ "datasource": "Prometheus",
+ "description": "Threshold:\nProcess Running: 1\nNot Running: 0",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 3,
+ "w": 4,
+ "x": 12,
+ "y": 25
+ },
+ "id": 144,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "{groupname=\"raw-telemetry-backup-4\", instance=\"11.4.3.66:1111\", job=\"process-exporter\"}",
+ "targets": [
+ {
+ "expr": "sum without(state) (namedprocess_namegroup_states{groupname=\"raw-telemetry-backup-4\"})",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "0,0",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "raw-telemetry-backup-4",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#d44a3a",
+ "rgba(237, 129, 40, 0.89)",
+ "#73BF69"
+ ],
+ "datasource": "Prometheus",
+ "description": "Threshold:\nProcess Running: 1\nNot Running: 0",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 3,
+ "w": 4,
+ "x": 16,
+ "y": 25
+ },
+ "id": 145,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "{groupname=\"raw-telemetry-backup-5\", instance=\"11.4.3.66:1111\", job=\"process-exporter\"}",
+ "targets": [
+ {
+ "expr": "sum without(state) (namedprocess_namegroup_states{groupname=\"raw-telemetry-backup-5\"})",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "0,0",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "raw-telemetry-backup-5",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#d44a3a",
+ "rgba(237, 129, 40, 0.89)",
+ "#73BF69"
+ ],
+ "datasource": "Prometheus",
+ "description": "Threshold:\nProcess Running: 1\nNot Running: 0",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 3,
+ "w": 4,
+ "x": 20,
+ "y": 25
+ },
+ "id": 146,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "{groupname=\"raw-telemetry-backup-6\", instance=\"11.4.3.66:1111\", job=\"process-exporter\"}",
+ "targets": [
+ {
+ "expr": "sum without(state) (namedprocess_namegroup_states{groupname=\"raw-telemetry-backup-6\"})",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "0,0",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "raw-telemetry-backup-6",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#d44a3a",
+ "rgba(237, 129, 40, 0.89)",
+ "#73BF69"
+ ],
+ "datasource": "Prometheus",
+ "description": "Threshold:\nProcess Running: 1\nNot Running: 0",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 3,
+ "w": 4,
+ "x": 0,
+ "y": 28
+ },
+ "id": 147,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "{groupname=\"raw-telemetry-backup-7\", instance=\"11.4.3.66:1111\", job=\"process-exporter\"}",
+ "targets": [
+ {
+ "expr": "sum without(state) (namedprocess_namegroup_states{groupname=\"raw-telemetry-backup-7\"})",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "0,0",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "raw-telemetry-backup-7",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#d44a3a",
+ "rgba(237, 129, 40, 0.89)",
+ "#73BF69"
+ ],
+ "datasource": "Prometheus",
+ "description": "Threshold:\nProcess Running: 1\nNot Running: 0",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 3,
+ "w": 4,
+ "x": 4,
+ "y": 28
+ },
+ "id": 148,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "{groupname=\"raw-telemetry-backup-8\", instance=\"11.4.3.66:1111\", job=\"process-exporter\"}",
+ "targets": [
+ {
+ "expr": "sum without(state) (namedprocess_namegroup_states{groupname=\"raw-telemetry-backup-8\"})",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "0,0",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "raw-telemetry-backup-8",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#d44a3a",
+ "rgba(237, 129, 40, 0.89)",
+ "#73BF69"
+ ],
+ "datasource": "Prometheus",
+ "description": "Threshold:\nProcess Running: 1\nNot Running: 0",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 3,
+ "w": 4,
+ "x": 8,
+ "y": 28
+ },
+ "id": 149,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "{groupname=\"denorm-events-backup-1\", instance=\"11.4.3.65:1111\", job=\"process-exporter\"}",
+ "targets": [
+ {
+ "expr": "sum without(state) (namedprocess_namegroup_states{groupname=\"denorm-events-backup-1\"})",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "0,0",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "denorm-events-backup-1",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#d44a3a",
+ "rgba(237, 129, 40, 0.89)",
+ "#73BF69"
+ ],
+ "datasource": "Prometheus",
+ "description": "Threshold:\nProcess Running: 1\nNot Running: 0",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 3,
+ "w": 4,
+ "x": 12,
+ "y": 28
+ },
+ "id": 150,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "{groupname=\"denorm-events-backup-2\", instance=\"11.4.3.65:1111\", job=\"process-exporter\"}",
+ "targets": [
+ {
+ "expr": "sum without(state) (namedprocess_namegroup_states{groupname=\"denorm-events-backup-2\"})",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "0,0",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "denorm-events-backup-2",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#d44a3a",
+ "rgba(237, 129, 40, 0.89)",
+ "#73BF69"
+ ],
+ "datasource": "Prometheus",
+ "description": "Threshold:\nProcess Running: 1\nNot Running: 0",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 3,
+ "w": 4,
+ "x": 16,
+ "y": 28
+ },
+ "id": 151,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "{groupname=\"denorm-events-backup-3\", instance=\"11.4.3.65:1111\", job=\"process-exporter\"}",
+ "targets": [
+ {
+ "expr": "sum without(state) (namedprocess_namegroup_states{groupname=\"denorm-events-backup-3\"})",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "0,0",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "denorm-events-backup-3",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#d44a3a",
+ "rgba(237, 129, 40, 0.89)",
+ "#73BF69"
+ ],
+ "datasource": "Prometheus",
+ "description": "Threshold:\nProcess Running: 1\nNot Running: 0",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 3,
+ "w": 4,
+ "x": 20,
+ "y": 28
+ },
+ "id": 152,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "{groupname=\"denorm-events-backup-4\", instance=\"11.4.3.65:1111\", job=\"process-exporter\"}",
+ "targets": [
+ {
+ "expr": "sum without(state) (namedprocess_namegroup_states{groupname=\"denorm-events-backup-4\"})",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "0,0",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "denorm-events-backup-4",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#d44a3a",
+ "rgba(237, 129, 40, 0.89)",
+ "#73BF69"
+ ],
+ "datasource": "Prometheus",
+ "description": "Threshold:\nProcess Running: 1\nNot Running: 0",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 3,
+ "w": 4,
+ "x": 0,
+ "y": 31
+ },
+ "id": 153,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "{groupname=\"denorm-events-backup-5\", instance=\"11.4.3.65:1111\", job=\"process-exporter\"}",
+ "targets": [
+ {
+ "expr": "sum without(state) (namedprocess_namegroup_states{groupname=\"denorm-events-backup-5\"})",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "0,0",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "denorm-events-backup-5",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#d44a3a",
+ "rgba(237, 129, 40, 0.89)",
+ "#73BF69"
+ ],
+ "datasource": "Prometheus",
+ "description": "Threshold:\nProcess Running: 1\nNot Running: 0",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 3,
+ "w": 4,
+ "x": 4,
+ "y": 31
+ },
+ "id": 154,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "{groupname=\"denorm-events-backup-6\", instance=\"11.4.3.65:1111\", job=\"process-exporter\"}",
+ "targets": [
+ {
+ "expr": "sum without(state) (namedprocess_namegroup_states{groupname=\"denorm-events-backup-6\"})",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "0,0",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "denorm-events-backup-6",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#d44a3a",
+ "rgba(237, 129, 40, 0.89)",
+ "#73BF69"
+ ],
+ "datasource": "Prometheus",
+ "description": "Threshold:\nProcess Running: 1\nNot Running: 0",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 3,
+ "w": 4,
+ "x": 8,
+ "y": 31
+ },
+ "id": 155,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "{groupname=\"denorm-events-backup-7\", instance=\"11.4.3.65:1111\", job=\"process-exporter\"}",
+ "targets": [
+ {
+ "expr": "sum without(state) (namedprocess_namegroup_states{groupname=\"denorm-events-backup-7\"})",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "0,0",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "denorm-events-backup-7",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#d44a3a",
+ "rgba(237, 129, 40, 0.89)",
+ "#73BF69"
+ ],
+ "datasource": "Prometheus",
+ "description": "Threshold:\nProcess Running: 1\nNot Running: 0",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 3,
+ "w": 4,
+ "x": 12,
+ "y": 31
+ },
+ "id": 156,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "{groupname=\"denorm-events-backup-8\", instance=\"11.4.3.65:1111\", job=\"process-exporter\"}",
+ "targets": [
+ {
+ "expr": "sum without(state) (namedprocess_namegroup_states{groupname=\"denorm-events-backup-8\"})",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "0,0",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "denorm-events-backup-8",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#d44a3a",
+ "rgba(237, 129, 40, 0.89)",
+ "#73BF69"
+ ],
+ "datasource": "Prometheus",
+ "description": "Threshold:\nProcess Running: 1\nNot Running: 0",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 3,
+ "w": 4,
+ "x": 16,
+ "y": 31
+ },
+ "id": 157,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "{groupname=\"unique-telemetry-backup-1\", instance=\"11.4.3.65:1111\", job=\"process-exporter\"}",
+ "targets": [
+ {
+ "expr": "sum without(state) (namedprocess_namegroup_states{groupname=\"unique-telemetry-backup-1\"})",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "0,0",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "unique-telemetry-backup-1",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#d44a3a",
+ "rgba(237, 129, 40, 0.89)",
+ "#73BF69"
+ ],
+ "datasource": "Prometheus",
+ "description": "Threshold:\nProcess Running: 1\nNot Running: 0",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 3,
+ "w": 4,
+ "x": 20,
+ "y": 31
+ },
+ "id": 158,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "{groupname=\"unique-telemetry-backup-2\", instance=\"11.4.3.65:1111\", job=\"process-exporter\"}",
+ "targets": [
+ {
+ "expr": "sum without(state) (namedprocess_namegroup_states{groupname=\"unique-telemetry-backup-2\"})",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "0,0",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "unique-telemetry-backup-2",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#d44a3a",
+ "rgba(237, 129, 40, 0.89)",
+ "#73BF69"
+ ],
+ "datasource": "Prometheus",
+ "description": "Threshold:\nProcess Running: 1\nNot Running: 0",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 3,
+ "w": 4,
+ "x": 0,
+ "y": 34
+ },
+ "id": 159,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "{groupname=\"unique-telemetry-backup-3\", instance=\"11.4.3.65:1111\", job=\"process-exporter\"}",
+ "targets": [
+ {
+ "expr": "sum without(state) (namedprocess_namegroup_states{groupname=\"unique-telemetry-backup-3\"})",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "0,0",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "unique-telemetry-backup-3",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#d44a3a",
+ "rgba(237, 129, 40, 0.89)",
+ "#73BF69"
+ ],
+ "datasource": "Prometheus",
+ "description": "Threshold:\nProcess Running: 1\nNot Running: 0",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 3,
+ "w": 4,
+ "x": 4,
+ "y": 34
+ },
+ "id": 160,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "{groupname=\"unique-telemetry-backup-4\", instance=\"11.4.3.65:1111\", job=\"process-exporter\"}",
+ "targets": [
+ {
+ "expr": "sum without(state) (namedprocess_namegroup_states{groupname=\"unique-telemetry-backup-4\"})",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "0,0",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "unique-telemetry-backup-4",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#d44a3a",
+ "rgba(237, 129, 40, 0.89)",
+ "#73BF69"
+ ],
+ "datasource": "Prometheus",
+ "description": "Threshold:\nProcess Running: 1\nNot Running: 0",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 3,
+ "w": 4,
+ "x": 8,
+ "y": 34
+ },
+ "id": 161,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "{groupname=\"unique-telemetry-backup-5\", instance=\"11.4.3.65:1111\", job=\"process-exporter\"}",
+ "targets": [
+ {
+ "expr": "sum without(state) (namedprocess_namegroup_states{groupname=\"unique-telemetry-backup-5\"})",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "0,0",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "unique-telemetry-backup-5",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#d44a3a",
+ "rgba(237, 129, 40, 0.89)",
+ "#73BF69"
+ ],
+ "datasource": "Prometheus",
+ "description": "Threshold:\nProcess Running: 1\nNot Running: 0",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 3,
+ "w": 4,
+ "x": 12,
+ "y": 34
+ },
+ "id": 162,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "{groupname=\"unique-telemetry-backup-6\", instance=\"11.4.3.65:1111\", job=\"process-exporter\"}",
+ "targets": [
+ {
+ "expr": "sum without(state) (namedprocess_namegroup_states{groupname=\"unique-telemetry-backup-6\"})",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "0,0",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "unique-telemetry-backup-6",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#d44a3a",
+ "rgba(237, 129, 40, 0.89)",
+ "#73BF69"
+ ],
+ "datasource": "Prometheus",
+ "description": "Threshold:\nProcess Running: 1\nNot Running: 0",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 3,
+ "w": 4,
+ "x": 16,
+ "y": 34
+ },
+ "id": 163,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "{groupname=\"unique-telemetry-backup-7\", instance=\"11.4.3.65:1111\", job=\"process-exporter\"}",
+ "targets": [
+ {
+ "expr": "sum without(state) (namedprocess_namegroup_states{groupname=\"unique-telemetry-backup-7\"})",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "0,0",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "unique-telemetry-backup-7",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#d44a3a",
+ "rgba(237, 129, 40, 0.89)",
+ "#73BF69"
+ ],
+ "datasource": "Prometheus",
+ "description": "Threshold:\nProcess Running: 1\nNot Running: 0",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 3,
+ "w": 4,
+ "x": 20,
+ "y": 34
+ },
+ "id": 164,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "{groupname=\"unique-telemetry-backup-8\", instance=\"11.4.3.65:1111\", job=\"process-exporter\"}",
+ "targets": [
+ {
+ "expr": "sum without(state) (namedprocess_namegroup_states{groupname=\"unique-telemetry-backup-8\"})",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "0,0",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "unique-telemetry-backup-8",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ }
+ ],
+ "title": "Secor Process",
+ "type": "row"
+ }
+ ],
+ "refresh": false,
+ "schemaVersion": 25,
+ "style": "dark",
+ "tags": [],
+ "templating": {
+ "list": [
+ {
+ "current": {
+ "selected": false,
+ "text": "ntpprod",
+ "value": "ntpprod"
+ },
+ "hide": 2,
+ "label": "",
+ "name": "env",
+ "options": [
+ {
+ "selected": true,
+ "text": "ntpprod",
+ "value": "ntpprod"
+ }
+ ],
+ "query": "ntpprod",
+ "skipUrlSync": false,
+ "type": "constant"
+ }
+ ]
+ },
+ "time": {
+ "from": "now-6h",
+ "to": "now"
+ },
+ "timepicker": {
+ "refresh_intervals": [
+ "10s",
+ "30s",
+ "1m",
+ "5m",
+ "15m",
+ "30m",
+ "1h",
+ "2h",
+ "1d"
+ ]
+ },
+ "timezone": "",
+ "title": "Lag Dashboard",
+ "uid": "vfdQRdtMz",
+ "version": 121
+}
\ No newline at end of file
diff --git a/kubernetes/helm_charts/monitoring/dashboards/dashboards/kp-flink-jobs-metrics-dashboard.json b/kubernetes/helm_charts/monitoring/dashboards/dashboards/kp-flink-jobs-metrics-dashboard.json
index ea245a4b3..9ccb60dc4 100644
--- a/kubernetes/helm_charts/monitoring/dashboards/dashboards/kp-flink-jobs-metrics-dashboard.json
+++ b/kubernetes/helm_charts/monitoring/dashboards/dashboards/kp-flink-jobs-metrics-dashboard.json
@@ -15,7 +15,7 @@
"editable": true,
"gnetId": null,
"graphTooltip": 0,
- "id": 65,
+ "id": 109,
"links": [],
"panels": [
{
@@ -101,6 +101,100 @@
"ymin": null
},
"tableColumn": "",
+ "targets": [
+ {
+ "expr": "sum(sum_over_time(flink_taskmanager_job_task_operator_activity_aggregate_updater_total_events_count[$__range]))",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Total Events",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "$$hashKey": "object:2196",
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#73BF69",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "datasource": "Flink-Prometheus",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 8,
+ "x": 8,
+ "y": 1
+ },
+ "id": 70,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "$$hashKey": "object:2193",
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "$$hashKey": "object:2194",
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "",
"targets": [
{
"expr": "sum(sum_over_time(flink_taskmanager_job_task_operator_activity_aggregate_updater_batch_enrolment_update_count[$__range]))",
@@ -126,6 +220,100 @@
],
"valueName": "current"
},
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#73BF69",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "datasource": "Flink-Prometheus",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 8,
+ "x": 16,
+ "y": 1
+ },
+ "id": 71,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "$$hashKey": "object:2193",
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "$$hashKey": "object:2194",
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "",
+ "targets": [
+ {
+ "expr": "sum(sum_over_time(flink_taskmanager_job_task_operator_activity_aggregate_updater_processed_enrolment_count[$__range]))",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Processed Enrolment Count",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "$$hashKey": "object:2196",
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
{
"cacheTimeout": null,
"colorBackground": false,
@@ -153,8 +341,8 @@
"gridPos": {
"h": 4,
"w": 8,
- "x": 8,
- "y": 1
+ "x": 0,
+ "y": 5
},
"id": 6,
"interval": null,
@@ -247,8 +435,8 @@
"gridPos": {
"h": 4,
"w": 8,
- "x": 16,
- "y": 1
+ "x": 8,
+ "y": 5
},
"id": 62,
"interval": null,
@@ -319,9 +507,9 @@
"colorBackground": false,
"colorValue": true,
"colors": [
- "#299c46",
+ "#F2495C",
"rgba(237, 129, 40, 0.89)",
- "#E02F44"
+ "#299c46"
],
"datasource": "Flink-Prometheus",
"fieldConfig": {
@@ -339,21 +527,23 @@
"thresholdMarkers": true
},
"gridPos": {
- "h": 3,
- "w": 6,
- "x": 0,
+ "h": 4,
+ "w": 8,
+ "x": 16,
"y": 5
},
- "id": 59,
+ "id": 63,
"interval": null,
"links": [],
"mappingType": 1,
"mappingTypes": [
{
+ "$$hashKey": "object:1401",
"name": "value to text",
"value": 1
},
{
+ "$$hashKey": "object:1402",
"name": "range to text",
"value": 2
}
@@ -383,7 +573,7 @@
"tableColumn": "",
"targets": [
{
- "expr": "sum(sum_over_time(flink_taskmanager_job_task_operator_activity_aggregate_updater_db_update_count[$__range]))",
+ "expr": "sum(sum_over_time(flink_taskmanager_job_task_operator_activity_aggregate_updater_cache_miss_count[$__range]))",
"instant": true,
"interval": "",
"legendFormat": "",
@@ -393,11 +583,12 @@
"thresholds": "",
"timeFrom": null,
"timeShift": null,
- "title": "DB Update",
+ "title": "Cache Miss",
"type": "singlestat",
"valueFontSize": "80%",
"valueMaps": [
{
+ "$$hashKey": "object:1404",
"op": "=",
"text": "N/A",
"value": "null"
@@ -430,23 +621,21 @@
"thresholdMarkers": true
},
"gridPos": {
- "h": 3,
- "w": 6,
- "x": 6,
- "y": 5
+ "h": 4,
+ "w": 8,
+ "x": 0,
+ "y": 9
},
- "id": 64,
+ "id": 59,
"interval": null,
"links": [],
"mappingType": 1,
"mappingTypes": [
{
- "$$hashKey": "object:2152",
"name": "value to text",
"value": 1
},
{
- "$$hashKey": "object:2153",
"name": "range to text",
"value": 2
}
@@ -476,7 +665,7 @@
"tableColumn": "",
"targets": [
{
- "expr": "sum(sum_over_time(flink_taskmanager_job_task_operator_activity_aggregate_updater_db_read_count[$__range]))",
+ "expr": "sum(sum_over_time(flink_taskmanager_job_task_operator_activity_aggregate_updater_db_update_count[$__range]))",
"instant": true,
"interval": "",
"legendFormat": "",
@@ -486,12 +675,11 @@
"thresholds": "",
"timeFrom": null,
"timeShift": null,
- "title": "DB Read",
+ "title": "DB Update",
"type": "singlestat",
"valueFontSize": "80%",
"valueMaps": [
{
- "$$hashKey": "object:2155",
"op": "=",
"text": "N/A",
"value": "null"
@@ -504,9 +692,9 @@
"colorBackground": false,
"colorValue": true,
"colors": [
- "#73BF69",
+ "#299c46",
"rgba(237, 129, 40, 0.89)",
- "#d44a3a"
+ "#E02F44"
],
"datasource": "Flink-Prometheus",
"fieldConfig": {
@@ -524,23 +712,23 @@
"thresholdMarkers": true
},
"gridPos": {
- "h": 3,
- "w": 6,
- "x": 12,
- "y": 5
+ "h": 4,
+ "w": 8,
+ "x": 8,
+ "y": 9
},
- "id": 5,
+ "id": 64,
"interval": null,
"links": [],
"mappingType": 1,
"mappingTypes": [
{
- "$$hashKey": "object:1360",
+ "$$hashKey": "object:2152",
"name": "value to text",
"value": 1
},
{
- "$$hashKey": "object:1361",
+ "$$hashKey": "object:2153",
"name": "range to text",
"value": 2
}
@@ -570,7 +758,7 @@
"tableColumn": "",
"targets": [
{
- "expr": "sum(sum_over_time(flink_taskmanager_job_task_operator_activity_aggregate_updater_cache_hit_count[$__range]))",
+ "expr": "sum(sum_over_time(flink_taskmanager_job_task_operator_activity_aggregate_updater_db_read_count[$__range]))",
"instant": true,
"interval": "",
"legendFormat": "",
@@ -580,12 +768,12 @@
"thresholds": "",
"timeFrom": null,
"timeShift": null,
- "title": "Cache Hit",
+ "title": "DB Read",
"type": "singlestat",
"valueFontSize": "80%",
"valueMaps": [
{
- "$$hashKey": "object:1363",
+ "$$hashKey": "object:2155",
"op": "=",
"text": "N/A",
"value": "null"
@@ -598,9 +786,9 @@
"colorBackground": false,
"colorValue": true,
"colors": [
- "#F2495C",
+ "#73BF69",
"rgba(237, 129, 40, 0.89)",
- "#299c46"
+ "#d44a3a"
],
"datasource": "Flink-Prometheus",
"fieldConfig": {
@@ -618,23 +806,23 @@
"thresholdMarkers": true
},
"gridPos": {
- "h": 3,
- "w": 6,
- "x": 18,
- "y": 5
+ "h": 4,
+ "w": 8,
+ "x": 16,
+ "y": 9
},
- "id": 63,
+ "id": 5,
"interval": null,
"links": [],
"mappingType": 1,
"mappingTypes": [
{
- "$$hashKey": "object:1401",
+ "$$hashKey": "object:1360",
"name": "value to text",
"value": 1
},
{
- "$$hashKey": "object:1402",
+ "$$hashKey": "object:1361",
"name": "range to text",
"value": 2
}
@@ -664,7 +852,7 @@
"tableColumn": "",
"targets": [
{
- "expr": "sum(sum_over_time(flink_taskmanager_job_task_operator_activity_aggregate_updater_cache_miss_count[$__range]))",
+ "expr": "sum(sum_over_time(flink_taskmanager_job_task_operator_activity_aggregate_updater_cache_hit_count[$__range]))",
"instant": true,
"interval": "",
"legendFormat": "",
@@ -674,12 +862,12 @@
"thresholds": "",
"timeFrom": null,
"timeShift": null,
- "title": "Cache Miss",
+ "title": "Cache Hit",
"type": "singlestat",
"valueFontSize": "80%",
"valueMaps": [
{
- "$$hashKey": "object:1404",
+ "$$hashKey": "object:1363",
"op": "=",
"text": "N/A",
"value": "null"
@@ -691,8 +879,9 @@
"aliasColors": {
"ActivityAggregateFailed": "red",
"BatchEnolmentUpdate": "green",
- "Cache Miss": "yellow",
- "DB Update": "rgb(48, 243, 255)"
+ "Cache Miss": "dark-orange",
+ "DB Update": "rgb(48, 243, 255)",
+ "Total Events": "dark-purple"
},
"bars": false,
"dashLength": 10,
@@ -710,13 +899,13 @@
"h": 8,
"w": 12,
"x": 0,
- "y": 8
+ "y": 13
},
"hiddenSeries": false,
"id": 10,
"legend": {
"avg": false,
- "current": false,
+ "current": true,
"max": false,
"min": false,
"show": true,
@@ -735,6 +924,7 @@
"renderer": "flot",
"seriesOverrides": [
{
+ "$$hashKey": "object:249",
"alias": "ActivityAggregateFailed",
"yaxis": 1
}
@@ -766,6 +956,18 @@
"interval": "",
"legendFormat": "Cache Miss",
"refId": "D"
+ },
+ {
+ "expr": "sum(flink_taskmanager_job_task_operator_activity_aggregate_updater_total_events_count)",
+ "interval": "",
+ "legendFormat": "Total Events",
+ "refId": "E"
+ },
+ {
+ "expr": "sum(flink_taskmanager_job_task_operator_activity_aggregate_updater_processed_enrolment_count)",
+ "interval": "",
+ "legendFormat": "Processed Enrolments",
+ "refId": "F"
}
],
"thresholds": [],
@@ -829,19 +1031,19 @@
"h": 8,
"w": 12,
"x": 12,
- "y": 8
+ "y": 13
},
"hiddenSeries": false,
"id": 12,
"legend": {
"alignAsTable": false,
- "avg": true,
+ "avg": false,
"current": true,
- "max": true,
- "min": true,
+ "max": false,
+ "min": false,
"rightSide": false,
"show": true,
- "total": true,
+ "total": false,
"values": true
},
"lines": true,
@@ -860,7 +1062,7 @@
"steppedLine": false,
"targets": [
{
- "expr": "sum(flink_taskmanager_job_task_operator_KafkaConsumer_records_lag_max { job = \"activity-aggregate-updater-taskmanager-prometheus\" })",
+ "expr": "sum(flink_taskmanager_job_task_operator_KafkaConsumer_records_lag_max { job = \"activity-aggregate-updater-taskmanager-prometheus\"})",
"interval": "",
"legendFormat": "Consumer lag",
"refId": "A"
@@ -914,7 +1116,7 @@
"h": 1,
"w": 24,
"x": 0,
- "y": 16
+ "y": 21
},
"id": 14,
"panels": [],
@@ -949,7 +1151,7 @@
"h": 4,
"w": 4,
"x": 0,
- "y": 17
+ "y": 22
},
"id": 21,
"interval": null,
@@ -1043,7 +1245,7 @@
"h": 4,
"w": 4,
"x": 4,
- "y": 17
+ "y": 22
},
"id": 61,
"interval": null,
@@ -1137,7 +1339,7 @@
"h": 4,
"w": 4,
"x": 8,
- "y": 17
+ "y": 22
},
"id": 22,
"interval": null,
@@ -1231,7 +1433,7 @@
"h": 4,
"w": 4,
"x": 12,
- "y": 17
+ "y": 22
},
"id": 60,
"interval": null,
@@ -1326,7 +1528,7 @@
"h": 4,
"w": 4,
"x": 16,
- "y": 17
+ "y": 22
},
"id": 65,
"interval": null,
@@ -1421,7 +1623,7 @@
"h": 4,
"w": 4,
"x": 20,
- "y": 17
+ "y": 22
},
"id": 69,
"interval": null,
@@ -1510,13 +1712,13 @@
"h": 8,
"w": 12,
"x": 0,
- "y": 21
+ "y": 26
},
"hiddenSeries": false,
"id": 25,
"legend": {
"avg": false,
- "current": false,
+ "current": true,
"max": false,
"min": false,
"show": true,
@@ -1623,17 +1825,17 @@
"h": 8,
"w": 12,
"x": 12,
- "y": 21
+ "y": 26
},
"hiddenSeries": false,
"id": 29,
"legend": {
- "avg": true,
+ "avg": false,
"current": true,
- "max": true,
- "min": true,
+ "max": false,
+ "min": false,
"show": true,
- "total": true,
+ "total": false,
"values": true
},
"lines": true,
@@ -1713,7 +1915,7 @@
"list": []
},
"time": {
- "from": "now-5m",
+ "from": "now-7d",
"to": "now"
},
"timepicker": {
@@ -1723,6 +1925,6 @@
},
"timezone": "",
"title": "KP Flink Jobs Metrics",
- "uid": "YngLt0kGz",
- "version": 20
+ "uid": "YngLt0kG1",
+ "version": 21
}
\ No newline at end of file
diff --git a/kubernetes/helm_charts/monitoring/dashboards/values.yaml b/kubernetes/helm_charts/monitoring/dashboards/values.yaml
index 130365b53..ea60dd75d 100644
--- a/kubernetes/helm_charts/monitoring/dashboards/values.yaml
+++ b/kubernetes/helm_charts/monitoring/dashboards/values.yaml
@@ -393,6 +393,10 @@ dashboards:
file: dashboards/cassandra.json
dashboard25:
file: dashboards/kp-flink-jobs-metrics-dashboard.json
+ dashboard26:
+ file: dashboards/dp-flink-jobs-metrics-dashboard.json
+ dashboard27:
+ file: dashboards/dp-flink-lag-dashboard.json
dashboards1:
temporary:
From de030976ed4c5a5bb83fe91942ef0fab7a686fb3 Mon Sep 17 00:00:00 2001
From: Manjunath Davanam
Date: Wed, 25 Nov 2020 14:29:22 +0530
Subject: [PATCH 046/184] Removed the unwanted grafana dashboards. (#2055)
* Issue #000 fix: KP flink jobs grafana update
* Issue #000 fix: KP flink jobs grafana update
* Issue #000 fix: Dp flink dashboard setup
* Issue #000 fix: removed the unwanted dashboard files
---
.../helm_charts/monitoring/dashboards/values.yaml | 10 ----------
1 file changed, 10 deletions(-)
diff --git a/kubernetes/helm_charts/monitoring/dashboards/values.yaml b/kubernetes/helm_charts/monitoring/dashboards/values.yaml
index ea60dd75d..eb51998b2 100644
--- a/kubernetes/helm_charts/monitoring/dashboards/values.yaml
+++ b/kubernetes/helm_charts/monitoring/dashboards/values.yaml
@@ -351,18 +351,10 @@ dashboards:
file: dashboards/api-manager.json
dashboard2:
file: dashboards/device-register-apimetrics.json
- dashboard3:
- file: dashboards/dp-jobs-consumerLag.json
- dashboard4:
- file: dashboards/dp-percentage.json
dashboard5:
file: dashboards/druid.json
dashboard6:
file: dashboards/elasticsearch.json
- dashboard7:
- file: dashboards/ep-pipeline-metrics.json
- dashboard8:
- file: dashboards/ep-pipeline-consumerLag.json
dashboard9:
file: dashboards/host-details.json
dashboard10:
@@ -387,8 +379,6 @@ dashboards:
file: dashboards/weekly-report.json
dashboard21:
file: dashboards/process-exporter.json
- dashboard22:
- file: dashboards/DP-Jobs-Consumer-lag-prometheus.json
dashboard24:
file: dashboards/cassandra.json
dashboard25:
From 1f945213a99332deedaea2897a707b2f2550b222 Mon Sep 17 00:00:00 2001
From: Manjunath Davanam
Date: Wed, 25 Nov 2020 14:41:45 +0530
Subject: [PATCH 047/184] Kp grafana setup (#2056)
* Issue #000 fix: KP flink jobs grafana update
* Issue #000 fix: KP flink jobs grafana update
* Issue #000 fix: Dp flink dashboard setup
* Issue #000 fix: removed the unwanted dashboard files
* Issue #000 fix: removed the unwanted dashboard files
---
kubernetes/helm_charts/monitoring/dashboards/values.yaml | 4 ----
1 file changed, 4 deletions(-)
diff --git a/kubernetes/helm_charts/monitoring/dashboards/values.yaml b/kubernetes/helm_charts/monitoring/dashboards/values.yaml
index eb51998b2..1bb051533 100644
--- a/kubernetes/helm_charts/monitoring/dashboards/values.yaml
+++ b/kubernetes/helm_charts/monitoring/dashboards/values.yaml
@@ -383,10 +383,6 @@ dashboards:
file: dashboards/cassandra.json
dashboard25:
file: dashboards/kp-flink-jobs-metrics-dashboard.json
- dashboard26:
- file: dashboards/dp-flink-jobs-metrics-dashboard.json
- dashboard27:
- file: dashboards/dp-flink-lag-dashboard.json
dashboards1:
temporary:
From 0e4ee55e7b85fecb7969140e98869fcdddd34333 Mon Sep 17 00:00:00 2001
From: Rhea Fernandes <32357913+rheafernandes@users.noreply.github.com>
Date: Tue, 1 Dec 2020 16:17:21 +0530
Subject: [PATCH 048/184] Added changes to handle object definition in
questions (#2061)
---
.../templates/assessment-service_application.conf | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/ansible/roles/stack-sunbird/templates/assessment-service_application.conf b/ansible/roles/stack-sunbird/templates/assessment-service_application.conf
index efdbefc28..047221b7c 100644
--- a/ansible/roles/stack-sunbird/templates/assessment-service_application.conf
+++ b/ansible/roles/stack-sunbird/templates/assessment-service_application.conf
@@ -370,3 +370,10 @@ languageCode {
tamil : "ta"
telugu : "te"
}
+
+kafka {
+ urls : "{{ kafka_urls }}"
+ topic.send.enable : true
+ topics.instruction : "{{ env_name }}.learning.job.request"
+}
+objectcategorydefinition.keyspace="{{ lp_cassandra_keyspace_prefix }}_category_store"
\ No newline at end of file
From 135473878ab69d2505fd360909d385f7971bd18c Mon Sep 17 00:00:00 2001
From: Harsha
Date: Tue, 1 Dec 2020 18:13:51 +0530
Subject: [PATCH 049/184] feat: ansible role and jenkins file for mongodb
cluster (#2060)
* ansible role and jenkins file for mongodb cluster
---
ansible/mongodb-cluster.yml | 13 +
.../roles/mongodb-cluster/defaults/main.yml | 135 +++++
.../roles/mongodb-cluster/handlers/main.yml | 44 ++
.../library/mongodb_replication.py | 466 ++++++++++++++++++
ansible/roles/mongodb-cluster/meta/main.yml | 30 ++
.../tasks/auth_initialization.yml | 76 +++
.../roles/mongodb-cluster/tasks/configure.yml | 87 ++++
.../tasks/disable_transparent_hugepages.yml | 16 +
.../mongodb-cluster/tasks/install.amazon.yml | 49 ++
.../mongodb-cluster/tasks/install.debian.yml | 113 +++++
.../mongodb-cluster/tasks/install.redhat.yml | 55 +++
ansible/roles/mongodb-cluster/tasks/main.yml | 137 +++++
.../roles/mongodb-cluster/tasks/mms-agent.yml | 32 ++
.../mongodb-cluster/tasks/replication.yml | 57 +++
.../tasks/replication_init_auth.yml | 42 ++
...le-transparent-hugepages.amazon.service.j2 | 17 +
...le-transparent-hugepages.debian.service.j2 | 17 +
...le-transparent-hugepages.redhat.service.j2 | 17 +
.../mongodb-cluster/templates/mongod.conf.j2 | 118 +++++
.../templates/mongod_init.conf.j2 | 47 ++
.../mongodb-cluster/templates/mongodb.repo.j2 | 10 +
.../templates/mongodb.service.j2 | 34 ++
.../templates/monitoring-agent.config.j2 | 3 +
ansible/roles/mongodb-cluster/vars/Amazon.yml | 15 +
ansible/roles/mongodb-cluster/vars/Debian.yml | 6 +
ansible/roles/mongodb-cluster/vars/RedHat.yml | 16 +
ansible/roles/mongodb-cluster/vars/Ubuntu.yml | 6 +
.../provision/mongodb-cluster/Jenkinsfile | 51 ++
28 files changed, 1709 insertions(+)
create mode 100644 ansible/mongodb-cluster.yml
create mode 100644 ansible/roles/mongodb-cluster/defaults/main.yml
create mode 100644 ansible/roles/mongodb-cluster/handlers/main.yml
create mode 100644 ansible/roles/mongodb-cluster/library/mongodb_replication.py
create mode 100644 ansible/roles/mongodb-cluster/meta/main.yml
create mode 100644 ansible/roles/mongodb-cluster/tasks/auth_initialization.yml
create mode 100644 ansible/roles/mongodb-cluster/tasks/configure.yml
create mode 100644 ansible/roles/mongodb-cluster/tasks/disable_transparent_hugepages.yml
create mode 100644 ansible/roles/mongodb-cluster/tasks/install.amazon.yml
create mode 100644 ansible/roles/mongodb-cluster/tasks/install.debian.yml
create mode 100644 ansible/roles/mongodb-cluster/tasks/install.redhat.yml
create mode 100644 ansible/roles/mongodb-cluster/tasks/main.yml
create mode 100644 ansible/roles/mongodb-cluster/tasks/mms-agent.yml
create mode 100644 ansible/roles/mongodb-cluster/tasks/replication.yml
create mode 100644 ansible/roles/mongodb-cluster/tasks/replication_init_auth.yml
create mode 100644 ansible/roles/mongodb-cluster/templates/disable-transparent-hugepages.amazon.service.j2
create mode 100644 ansible/roles/mongodb-cluster/templates/disable-transparent-hugepages.debian.service.j2
create mode 100644 ansible/roles/mongodb-cluster/templates/disable-transparent-hugepages.redhat.service.j2
create mode 100644 ansible/roles/mongodb-cluster/templates/mongod.conf.j2
create mode 100644 ansible/roles/mongodb-cluster/templates/mongod_init.conf.j2
create mode 100644 ansible/roles/mongodb-cluster/templates/mongodb.repo.j2
create mode 100644 ansible/roles/mongodb-cluster/templates/mongodb.service.j2
create mode 100644 ansible/roles/mongodb-cluster/templates/monitoring-agent.config.j2
create mode 100644 ansible/roles/mongodb-cluster/vars/Amazon.yml
create mode 100644 ansible/roles/mongodb-cluster/vars/Debian.yml
create mode 100644 ansible/roles/mongodb-cluster/vars/RedHat.yml
create mode 100644 ansible/roles/mongodb-cluster/vars/Ubuntu.yml
create mode 100644 pipelines/provision/mongodb-cluster/Jenkinsfile
diff --git a/ansible/mongodb-cluster.yml b/ansible/mongodb-cluster.yml
new file mode 100644
index 000000000..81cab6a5f
--- /dev/null
+++ b/ansible/mongodb-cluster.yml
@@ -0,0 +1,13 @@
+- hosts: mongo
+ become: yes
+ vars_files:
+ - "{{inventory_dir}}/secrets.yml"
+ vars:
+ mongodb_replication_params:
+ mongodb_conf_auth: true
+ mongodb_conf_replSet: mongors
+ mongodb_conf_dbpath: /var/lib/mongodb
+ mongodb_conf_bind_ip: 0.0.0.0
+ mongodb_conf_port: 27017
+ roles:
+ - mongodb-cluster
diff --git a/ansible/roles/mongodb-cluster/defaults/main.yml b/ansible/roles/mongodb-cluster/defaults/main.yml
new file mode 100644
index 000000000..340a14c08
--- /dev/null
+++ b/ansible/roles/mongodb-cluster/defaults/main.yml
@@ -0,0 +1,135 @@
+---
+
+mongodb_package: mongodb-org
+mongodb_package_state: present
+mongodb_version: "4.2"
+mongodb_apt_keyserver: hkp://keyserver.ubuntu.com:80
+mongodb_apt_key_id:
+ "3.4": "0C49F3730359A14518585931BC711F9BA15703C6"
+ "3.6": "2930ADAE8CAF5059EE73BB4B58712A2291FA4AD5"
+ "4.0": "9DA31620334BD75D9DCB49F368818C72E52529D4"
+ "4.2": "4B7C549A058F8B6B"
+
+mongodb_pymongo_from_pip: true # Install latest PyMongo via PIP or package manager
+mongodb_pymongo_pip_version: 3.7.1
+
+mongodb_user_update_password: "on_create" # MongoDB user password update default policy
+mongodb_manage_service: true
+mongodb_manage_systemd_unit: true
+mongodb_systemd_unit_limit_nofile: 64000
+mongodb_systemd_unit_limit_nproc: 64000
+
+mongodb_disable_transparent_hugepages: false
+
+mongodb_use_numa: true
+
+mongodb_user: "{{ 'mongod' if ('RedHat' == ansible_os_family) else 'mongodb' }}"
+mongodb_uid:
+mongodb_gid:
+mongodb_daemon_name: "{{ 'mongod' if ('mongodb-org' in mongodb_package) else 'mongodb' }}"
+
+## net Options
+mongodb_net_bindip: 0.0.0.0 # Comma separated list of ip addresses to listen on
+mongodb_net_http_enabled: false # Enable http interface
+mongodb_net_ipv6: false # Enable IPv6 support (disabled by default)
+mongodb_net_maxconns: 65536 # Max number of simultaneous connections
+mongodb_net_port: 27017 # Specify port number
+mongodb_net_ssl: disabled # Enable or disable ssl connections
+mongodb_net_ssl_mode: "" # Set the ssl mode (RequireSSL / preferSSL / AllowSSL / disabled)
+mongodb_net_ssl_pemfile: "" # Location of the pemfile to use for ssl
+mongodb_net_ssl_host: "" # Valid ssl hostname
+
+## processManagement Options
+# Fork server process
+# Enabled by default for RedHat as the init scripts assume forking is enabled.
+mongodb_processmanagement_fork: false
+
+## security Options
+# Disable or enable security. Possible values: 'disabled', 'enabled'
+mongodb_security_authorization: "disabled"
+mongodb_security_keyfile: /etc/mongodb-keyfile # Specify path to keyfile with password for inter-process authentication
+mongodb_security_javascript_enabled: false
+
+## storage Options
+mongodb_storage_dbpath: /data/db # Directory for datafiles
+mongodb_storage_dirperdb: false # Use one directory per DB
+
+# The storage engine for the mongod database
+mongodb_storage_engine: "wiredTiger"
+# mmapv1 specific options
+mongodb_storage_quota_enforced: false # Limits each database to a certain number of files
+mongodb_storage_quota_maxfiles: 8 # Number of quota files per DB
+mongodb_storage_smallfiles: false # Very useful for non-data nodes
+
+mongodb_storage_journal_enabled: true # Enable journaling
+mongodb_storage_prealloc: true # Enable data file preallocation
+
+mongodb_wiredtiger_directory_for_indexes: false
+
+## systemLog Options
+## The destination to which MongoDB sends all log output. Specify either 'file' or 'syslog'.
+## If you specify 'file', you must also specify mongodb_systemlog_path.
+mongodb_systemlog_destination: "file"
+mongodb_systemlog_logappend: true # Append to logpath instead of over-writing
+mongodb_systemlog_logrotate: "rename" # Logrotation behavior
+mongodb_systemlog_path: /var/log/mongodb/{{ mongodb_daemon_name }}.log # Log file to send write to instead of stdout
+
+## operationProfiling Options
+mongodb_operation_profiling_slow_op_threshold_ms: 100
+mongodb_operation_profiling_mode: "off"
+
+## cloud options (MongoDB >= 4.0)
+mongodb_cloud_monitoring_free_state: "runtime"
+
+## replication Options
+mongodb_replication_replset: "mongors" # Enable replication
+mongodb_replication_replindexprefetch: "all" # specify index prefetching behavior (if secondary) [none|_id_only|all]
+mongodb_replication_oplogsize: 1024 # specifies a maximum size in megabytes for the replication operation log
+
+# MMS Agent
+mongodb_mms_agent_pkg: https://cloud.mongodb.com/download/agent/monitoring/mongodb-mms-monitoring-agent_7.2.0.488-1_amd64.ubuntu1604.deb
+mongodb_mms_group_id: ""
+mongodb_mms_api_key: ""
+mongodb_mms_base_url: https://mms.mongodb.com
+
+#master configuration
+
+mongodb_login_host: "{{ groups['mongo_master'][0] }}"
+host_name: "{{ groups['mongo_master'][0] }}"
+
+# password for inter-process authentication
+# please regenerate this file on production environment with command 'openssl rand -base64 741'
+mongodb_keyfile_content: |
+ 8pYcxvCqoe89kcp33KuTtKVf5MoHGEFjTnudrq5BosvWRoIxLowmdjrmUpVfAivh
+ CHjqM6w0zVBytAxH1lW+7teMYe6eDn2S/O/1YlRRiW57bWU3zjliW3VdguJar5i9
+ Z+1a8lI+0S9pWynbv9+Ao0aXFjSJYVxAm/w7DJbVRGcPhsPmExiSBDw8szfQ8PAU
+ 2hwRl7nqPZZMMR+uQThg/zV9rOzHJmkqZtsO4UJSilG9euLCYrzW2hdoPuCrEDhu
+ Vsi5+nwAgYR9dP2oWkmGN1dwRe0ixSIM2UzFgpaXZaMOG6VztmFrlVXh8oFDRGM0
+ cGrFHcnGF7oUGfWnI2Cekngk64dHA2qD7WxXPbQ/svn9EfTY5aPw5lXzKA87Ds8p
+ KHVFUYvmA6wVsxb/riGLwc+XZlb6M9gqHn1XSpsnYRjF6UzfRcRR2WyCxLZELaqu
+ iKxLKB5FYqMBH7Sqg3qBCtE53vZ7T1nefq5RFzmykviYP63Uhu/A2EQatrMnaFPl
+ TTG5CaPjob45CBSyMrheYRWKqxdWN93BTgiTW7p0U6RB0/OCUbsVX6IG3I9N8Uqt
+ l8Kc+7aOmtUqFkwo8w30prIOjStMrokxNsuK9KTUiPu2cj7gwYQ574vV3hQvQPAr
+ hhb9ohKr0zoPQt31iTj0FDkJzPepeuzqeq8F51HB56RZKpXdRTfY8G6OaOT68cV5
+ vP1O6T/okFKrl41FQ3CyYN5eRHyRTK99zTytrjoP2EbtIZ18z+bg/angRHYNzbgk
+ lc3jpiGzs1ZWHD0nxOmHCMhU4usEcFbV6FlOxzlwrsEhHkeiununlCsNHatiDgzp
+ ZWLnP/mXKV992/Jhu0Z577DHlh+3JIYx0PceB9yzACJ8MNARHF7QpBkhtuGMGZpF
+ T+c73exupZFxItXs1Bnhe3djgE3MKKyYvxNUIbcTJoe7nhVMrwO/7lBSpVLvC4p3
+ wR700U0LDaGGQpslGtiE56SemgoP
+
+
+# names and passwords for administrative users
+mongodb_user_admin_name:
+mongodb_user_admin_password:
+
+mongodb_root_admin_name:
+mongodb_root_admin_password:
+
+mongodb_root_backup_name:
+mongodb_root_backup_password:
+
+# setParameter config
+mongodb_set_parameters:
+
+# custom config options
+mongodb_config:
diff --git a/ansible/roles/mongodb-cluster/handlers/main.yml b/ansible/roles/mongodb-cluster/handlers/main.yml
new file mode 100644
index 000000000..62251cf1c
--- /dev/null
+++ b/ansible/roles/mongodb-cluster/handlers/main.yml
@@ -0,0 +1,44 @@
+---
+
+- name: reload systemd
+ systemd:
+ daemon_reload: yes
+
+- name: run disable-transparent-hugepages
+ systemd:
+ name: disable-transparent-hugepages
+ enabled: true
+ state: started
+ daemon_reload: yes
+
+- name: mongodb restart
+ service:
+ name: "{{ mongodb_daemon_name }}"
+ state: restarted
+ when: mongodb_manage_service | bool
+
+- name: mongodb-mms-monitoring-agent restart
+ service:
+ name: mongodb-mms-monitoring-agent
+ state: restarted
+ when: mongodb_manage_service | bool
+
+- name: restart sysfsutils
+ service:
+ name: sysfsutils
+ state: restarted
+
+- name: wait when mongodb is started
+ wait_for:
+ host: "{{ item }}"
+ port: "{{ mongodb_net_port }}"
+ timeout: 120
+ with_items: "{{ mongodb_net_bindip.split(',') | map('replace', '0.0.0.0', '127.0.0.1') | list }}"
+
+- name: wait when mongodb is started on localhost
+ wait_for:
+ host: "127.0.0.1"
+ port: "{{ mongodb_net_port }}"
+ delay: 5
+ timeout: 120
+
diff --git a/ansible/roles/mongodb-cluster/library/mongodb_replication.py b/ansible/roles/mongodb-cluster/library/mongodb_replication.py
new file mode 100644
index 000000000..edc2253f7
--- /dev/null
+++ b/ansible/roles/mongodb-cluster/library/mongodb_replication.py
@@ -0,0 +1,466 @@
+#!/usr/bin/python
+
+# (c) 2015-2018, Sergei Antipov, 2GIS LLC
+#
+# This file is part of Ansible
+#
+# Ansible is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# Ansible is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with Ansible. If not, see .
+
+DOCUMENTATION = '''
+---
+module: mongodb_replication
+short_description: Adds or removes a node from a MongoDB Replica Set.
+description:
+ - Adds or removes host from a MongoDB replica set. Initialize replica set if it needed.
+version_added: "2.4"
+options:
+ login_user:
+ description:
+ - The username used to authenticate with
+ required: false
+ default: null
+ login_password:
+ description:
+ - The password used to authenticate with
+ required: false
+ default: null
+ login_host:
+ description:
+ - The host running the database
+ required: false
+ default: localhost
+ login_port:
+ description:
+ - The port to connect to
+ required: false
+ default: 27017
+ login_database:
+ description:
+ - The database where login credentials are stored
+ required: false
+ default: admin
+ replica_set:
+ description:
+ - Replica set to connect to (automatically connects to primary for writes)
+ required: false
+ default: null
+ host_name:
+ description:
+ - The name of the host to add/remove from replica set
+ required: true
+ host_port:
+ description:
+ - The port of the host, which should be added/deleted from RS
+ required: true
+ default: null
+ host_type:
+ description:
+ - The type of the host in replica set
+ required: false
+ default: replica
+ choices: [ "replica", "arbiter" ]
+ ssl:
+ description:
+ - Whether to use an SSL connection when connecting to the database
+ default: False
+ ssl_cert_reqs:
+ description:
+ - Specifies whether a certificate is required from the other side of the connection, and whether it will be validated if provided.
+ required: false
+ default: "CERT_REQUIRED"
+ choices: ["CERT_REQUIRED", "CERT_OPTIONAL", "CERT_NONE"]
+ build_indexes:
+ description:
+ - Determines whether the mongod builds indexes on this member.
+ required: false
+ default: true
+ hidden:
+ description:
+ - When this value is true, the replica set hides this instance,
+ and does not include the member in the output of db.isMaster()
+ or isMaster
+ required: false
+ default: false
+ priority:
+ description:
+ - A number that indicates the relative eligibility of a member
+ to become a primary
+ required: false
+ default: 1.0
+ slave_delay:
+ description:
+ - The number of seconds behind the primary that this replica set
+ member should lag
+ required: false
+ default: 0
+ votes:
+ description:
+ - The number of votes a server will cast in a replica set election
+ default: 1
+ state:
+ state:
+ description:
+ - The replica set member state
+ required: false
+ default: present
+ choices: [ "present", "absent" ]
+notes:
+ - Requires the pymongo Python package on the remote host, version 3.2+. It
+ can be installed using pip or the OS package manager. @see http://api.mongodb.org/python/current/installation.html
+requirements: [ "pymongo" ]
+author: "Sergei Antipov @UnderGreen"
+'''
+
+EXAMPLES = '''
+# Add 'mongo1.dev:27017' host into replica set as replica (Replica will be initiated if it not exists)
+- mongodb_replication: replica_set=replSet host_name=mongo1.dev host_port=27017 state=present
+
+# Add 'mongo2.dev:30000' host into replica set as arbiter
+- mongodb_replication: replica_set=replSet host_name=mongo2.dev host_port=30000 host_type=arbiter state=present
+
+# Add 'mongo3.dev:27017' host into replica set as replica and authorization params
+- mongodb_replication: replica_set=replSet login_host=mongo1.dev login_user=siteRootAdmin login_password=123456 host_name=mongo3.dev host_port=27017 state=present
+
+# Add 'mongo4.dev:27017' host into replica set as replica via SSL
+- mongodb_replication: replica_set=replSet host_name=mongo4.dev host_port=27017 ssl=True state=present
+
+# Remove 'mongo4.dev:27017' host from the replica set
+- mongodb_replication: replica_set=replSet host_name=mongo4.dev host_port=27017 state=absent
+'''
+
+RETURN = '''
+host_name:
+ description: The name of the host to add/remove from replica set
+ returned: success
+ type: string
+ sample: "mongo3.dev"
+host_port:
+ description: The port of the host, which should be added/deleted from RS
+ returned: success
+ type: int
+ sample: 27017
+host_type:
+ description: The type of the host in replica set
+ returned: success
+ type: string
+ sample: "replica"
+'''
+import ConfigParser
+import ssl as ssl_lib
+import time
+from datetime import datetime as dtdatetime
+from distutils.version import LooseVersion
+try:
+ from pymongo.errors import ConnectionFailure
+ from pymongo.errors import OperationFailure
+ from pymongo.errors import ConfigurationError
+ from pymongo.errors import AutoReconnect
+ from pymongo.errors import ServerSelectionTimeoutError
+ from pymongo import version as PyMongoVersion
+ from pymongo import MongoClient
+except ImportError:
+ pymongo_found = False
+else:
+ pymongo_found = True
+
+# =========================================
+# MongoDB module specific support methods.
+#
+def check_compatibility(module, client):
+ srv_info = client.server_info()
+ if LooseVersion(PyMongoVersion) <= LooseVersion('3.2'):
+ module.fail_json(msg='Note: you must use pymongo 3.2+')
+ if LooseVersion(srv_info['version']) >= LooseVersion('3.4') and LooseVersion(PyMongoVersion) <= LooseVersion('3.4'):
+ module.fail_json(msg='Note: you must use pymongo 3.4+ with MongoDB 3.4.x')
+ if LooseVersion(srv_info['version']) >= LooseVersion('3.6') and LooseVersion(PyMongoVersion) <= LooseVersion('3.6'):
+ module.fail_json(msg='Note: you must use pymongo 3.6+ with MongoDB 3.6.x')
+
+
+def check_members(state, module, client, host_name, host_port, host_type):
+ admin_db = client['admin']
+ local_db = client['local']
+
+ if local_db.system.replset.count() > 1:
+ module.fail_json(msg='local.system.replset has unexpected contents')
+
+ cfg = local_db.system.replset.find_one()
+ if not cfg:
+ module.fail_json(msg='no config object retrievable from local.system.replset')
+
+ for member in cfg['members']:
+ if state == 'present':
+ if host_type == 'replica':
+ if "{0}:{1}".format(host_name, host_port) in member['host']:
+ module.exit_json(changed=False, host_name=host_name, host_port=host_port, host_type=host_type)
+ else:
+ if "{0}:{1}".format(host_name, host_port) in member['host'] and member['arbiterOnly']:
+ module.exit_json(changed=False, host_name=host_name, host_port=host_port, host_type=host_type)
+ else:
+ if host_type == 'replica':
+ if "{0}:{1}".format(host_name, host_port) not in member['host']:
+ module.exit_json(changed=False, host_name=host_name, host_port=host_port, host_type=host_type)
+ else:
+ if "{0}:{1}".format(host_name, host_port) not in member['host'] and member['arbiterOnly']:
+ module.exit_json(changed=False, host_name=host_name, host_port=host_port, host_type=host_type)
+
+def add_host(module, client, host_name, host_port, host_type, timeout=180, **kwargs):
+ start_time = dtdatetime.now()
+ while True:
+ try:
+ admin_db = client['admin']
+ local_db = client['local']
+
+ if local_db.system.replset.count() > 1:
+ module.fail_json(msg='local.system.replset has unexpected contents')
+
+ cfg = local_db.system.replset.find_one()
+ if not cfg:
+ module.fail_json(msg='no config object retrievable from local.system.replset')
+
+ cfg['version'] += 1
+ max_id = max(cfg['members'], key=lambda x:x['_id'])
+ new_host = { '_id': max_id['_id'] + 1, 'host': "{0}:{1}".format(host_name, host_port) }
+ if host_type == 'arbiter':
+ new_host['arbiterOnly'] = True
+
+ if not kwargs['build_indexes']:
+ new_host['buildIndexes'] = False
+
+ if kwargs['hidden']:
+ new_host['hidden'] = True
+
+ if kwargs['priority'] != 1.0:
+ new_host['priority'] = kwargs['priority']
+
+ if kwargs['slave_delay'] != 0:
+ new_host['slaveDelay'] = kwargs['slave_delay']
+
+ if kwargs['votes'] != 1:
+ new_host['votes'] = kwargs['votes']
+
+ cfg['members'].append(new_host)
+ admin_db.command('replSetReconfig', cfg)
+ return
+ except (OperationFailure, AutoReconnect) as e:
+ if (dtdatetime.now() - start_time).seconds > timeout:
+ module.fail_json(msg='reached timeout while waiting for rs.reconfig(): %s' % str(e))
+ time.sleep(5)
+
+def remove_host(module, client, host_name, timeout=180):
+ start_time = dtdatetime.now()
+ while True:
+ try:
+ admin_db = client['admin']
+ local_db = client['local']
+
+ if local_db.system.replset.count() > 1:
+ module.fail_json(msg='local.system.replset has unexpected contents')
+
+ cfg = local_db.system.replset.find_one()
+ if not cfg:
+ module.fail_json(msg='no config object retrievable from local.system.replset')
+
+ cfg['version'] += 1
+
+ if len(cfg['members']) == 1:
+ module.fail_json(msg="You can't delete last member of replica set")
+ for member in cfg['members']:
+ if host_name in member['host']:
+ cfg['members'].remove(member)
+ else:
+ fail_msg = "couldn't find member with hostname: {0} in replica set members list".format(host_name)
+ module.fail_json(msg=fail_msg)
+ except (OperationFailure, AutoReconnect) as e:
+ if (dtdatetime.now() - start_time).seconds > timeout:
+ module.fail_json(msg='reached timeout while waiting for rs.reconfig(): %s' % str(e))
+ time.sleep(5)
+
+def load_mongocnf():
+ config = ConfigParser.RawConfigParser()
+ mongocnf = os.path.expanduser('~/.mongodb.cnf')
+
+ try:
+ config.readfp(open(mongocnf))
+ creds = dict(
+ user=config.get('client', 'user'),
+ password=config.get('client', 'pass')
+ )
+ except (ConfigParser.NoOptionError, IOError):
+ return False
+
+ return creds
+
+def wait_for_ok_and_master(module, connection_params, timeout = 180):
+ start_time = dtdatetime.now()
+ while True:
+ try:
+ client = MongoClient(**connection_params)
+ authenticate(client, connection_params["username"], connection_params["password"])
+
+ status = client.admin.command('replSetGetStatus', check=False)
+ if status['ok'] == 1 and status['myState'] == 1:
+ return
+
+ except ServerSelectionTimeoutError:
+ pass
+
+ client.close()
+
+ if (dtdatetime.now() - start_time).seconds > timeout:
+ module.fail_json(msg='reached timeout while waiting for rs.status() to become ok=1')
+
+ time.sleep(1)
+
+def authenticate(client, login_user, login_password):
+ if login_user is None and login_password is None:
+ mongocnf_creds = load_mongocnf()
+ if mongocnf_creds is not False:
+ login_user = mongocnf_creds['user']
+ login_password = mongocnf_creds['password']
+ elif login_password is None and login_user is not None:
+ module.fail_json(msg='when supplying login arguments, both login_user and login_password must be provided')
+
+ if login_user is not None and login_password is not None:
+ client.admin.authenticate(login_user, login_password)
+
+# =========================================
+# Module execution.
+#
+
+def main():
+ module = AnsibleModule(
+ argument_spec = dict(
+ login_user=dict(default=None),
+ login_password=dict(default=None, no_log=True),
+ login_host=dict(default='localhost'),
+ login_port=dict(default='27017'),
+ login_database=dict(default="admin"),
+ replica_set=dict(default=None),
+ host_name=dict(default='localhost'),
+ host_port=dict(default='27017'),
+ host_type=dict(default='replica', choices=['replica','arbiter']),
+ ssl=dict(default=False, type='bool'),
+ ssl_cert_reqs=dict(default='CERT_REQUIRED', choices=['CERT_NONE', 'CERT_OPTIONAL', 'CERT_REQUIRED']),
+ build_indexes = dict(type='bool', default='yes'),
+ hidden = dict(type='bool', default='no'),
+ priority = dict(default='1.0'),
+ slave_delay = dict(type='int', default='0'),
+ votes = dict(type='int', default='1'),
+ state=dict(default='present', choices=['absent', 'present']),
+ )
+ )
+
+ if not pymongo_found:
+ module.fail_json(msg='the python pymongo (>= 3.2) module is required')
+
+ login_user = module.params['login_user']
+ login_password = module.params['login_password']
+ login_host = module.params['login_host']
+ login_port = module.params['login_port']
+ login_database = module.params['login_database']
+ replica_set = module.params['replica_set']
+ host_name = module.params['host_name']
+ host_port = module.params['host_port']
+ host_type = module.params['host_type']
+ ssl = module.params['ssl']
+ state = module.params['state']
+ priority = float(module.params['priority'])
+
+ replica_set_created = False
+
+ try:
+ if replica_set is None:
+ module.fail_json(msg='replica_set parameter is required')
+ else:
+ connection_params = {
+ "host": login_host,
+ "port": int(login_port),
+ "username": login_user,
+ "password": login_password,
+ "authsource": login_database,
+ "serverselectiontimeoutms": 5000,
+ "replicaset": replica_set,
+ }
+
+ if ssl:
+ connection_params["ssl"] = ssl
+ connection_params["ssl_cert_reqs"] = getattr(ssl_lib, module.params['ssl_cert_reqs'])
+
+ client = MongoClient(**connection_params)
+ authenticate(client, login_user, login_password)
+ client['admin'].command('replSetGetStatus')
+
+ except ServerSelectionTimeoutError:
+ try:
+ connection_params = {
+ "host": login_host,
+ "port": int(login_port),
+ "username": login_user,
+ "password": login_password,
+ "authsource": login_database,
+ "serverselectiontimeoutms": 10000,
+ }
+
+ if ssl:
+ connection_params["ssl"] = ssl
+ connection_params["ssl_cert_reqs"] = getattr(ssl_lib, module.params['ssl_cert_reqs'])
+
+ client = MongoClient(**connection_params)
+ authenticate(client, login_user, login_password)
+ if state == 'present':
+ new_host = { '_id': 0, 'host': "{0}:{1}".format(host_name, host_port) }
+ if priority != 1.0: new_host['priority'] = priority
+ config = { '_id': "{0}".format(replica_set), 'members': [new_host] }
+ client['admin'].command('replSetInitiate', config)
+ client.close()
+ wait_for_ok_and_master(module, connection_params)
+ replica_set_created = True
+ module.exit_json(changed=True, host_name=host_name, host_port=host_port, host_type=host_type)
+ except OperationFailure as e:
+ module.fail_json(msg='Unable to initiate replica set: %s' % str(e))
+ except ConnectionFailure as e:
+ module.fail_json(msg='unable to connect to database: %s' % str(e))
+
+ # reconnect again
+ client = MongoClient(**connection_params)
+ authenticate(client, login_user, login_password)
+ check_compatibility(module, client)
+ check_members(state, module, client, host_name, host_port, host_type)
+
+ if state == 'present':
+ if host_name is None and not replica_set_created:
+ module.fail_json(msg='host_name parameter required when adding new host into replica set')
+
+ try:
+ if not replica_set_created:
+ add_host(module, client, host_name, host_port, host_type,
+ build_indexes = module.params['build_indexes'],
+ hidden = module.params['hidden'],
+ priority = float(module.params['priority']),
+ slave_delay = module.params['slave_delay'],
+ votes = module.params['votes'])
+ except OperationFailure as e:
+ module.fail_json(msg='Unable to add new member to replica set: %s' % str(e))
+
+ elif state == 'absent':
+ try:
+ remove_host(module, client, host_name)
+ except OperationFailure as e:
+ module.fail_json(msg='Unable to remove member of replica set: %s' % str(e))
+
+ module.exit_json(changed=True, host_name=host_name, host_port=host_port, host_type=host_type)
+
+# import module snippets
+from ansible.module_utils.basic import *
+main()
diff --git a/ansible/roles/mongodb-cluster/meta/main.yml b/ansible/roles/mongodb-cluster/meta/main.yml
new file mode 100644
index 000000000..94bbca05a
--- /dev/null
+++ b/ansible/roles/mongodb-cluster/meta/main.yml
@@ -0,0 +1,30 @@
+---
+dependencies: []
+
+galaxy_info:
+ author: Sergei Antipov
+ company: Self-employed
+ description: Manage MongoDB with authentication and replica sets
+ license: GPLv2
+ min_ansible_version: 2.5
+ platforms:
+ - name: Ubuntu
+ versions:
+ - trusty
+ - xenial
+ - bionic
+ - name: Debian
+ versions:
+ - jessie
+ - stretch
+ - name: EL
+ versions:
+ - 6
+ - 7
+ - name: Amazon
+ versions:
+ - Candidate
+ galaxy_tags:
+ - database
+ - nosql
+ - mongodb
diff --git a/ansible/roles/mongodb-cluster/tasks/auth_initialization.yml b/ansible/roles/mongodb-cluster/tasks/auth_initialization.yml
new file mode 100644
index 000000000..033071ff3
--- /dev/null
+++ b/ansible/roles/mongodb-cluster/tasks/auth_initialization.yml
@@ -0,0 +1,76 @@
+---
+- name: Use different mongod.conf for auth initialization
+ template:
+ src: mongod_init.conf.j2
+ dest: /etc/mongod.conf
+ owner: root
+ group: root
+ mode: 0644
+ notify:
+ - mongodb restart
+ - wait when mongodb is started on localhost
+
+- name: Flush all handlers at this point
+ meta: flush_handlers
+
+- name: create administrative user "{{ mongodb_user_admin_name }}"
+ mongodb_user:
+ database: admin
+ name: "{{ item.name }}"
+ password: "{{ item.password }}"
+ update_password: "{{ mongodb_user_update_password }}"
+ roles: "{{ item.roles }}"
+ login_port: "{{ mongodb_net_port }}"
+ with_items:
+ - {
+ name: "{{ mongodb_user_admin_name }}",
+ password: "{{ mongodb_user_admin_password }}",
+ roles: "userAdminAnyDatabase"
+ }
+ no_log: true
+
+- name: create administrative user "{{ mongodb_root_admin_name }}"
+ mongodb_user:
+ database: admin
+ name: "{{ item.name }}"
+ password: "{{ item.password }}"
+ update_password: "{{ mongodb_user_update_password }}"
+ roles: "{{ item.roles }}"
+ login_port: "{{ mongodb_net_port }}"
+ with_items:
+ - {
+ name: "{{ mongodb_root_admin_name }}",
+ password: "{{ mongodb_root_admin_password }}",
+ roles: "root"
+ }
+ no_log: true
+
+- name: create backup user "{{ mongodb_root_backup_name }}"
+ mongodb_user:
+ database: admin
+ name: "{{ item.name }}"
+ password: "{{ item.password }}"
+ update_password: "{{ mongodb_user_update_password }}"
+ roles: "{{ item.roles }}"
+ login_port: "{{ mongodb_net_port }}"
+ with_items:
+ - {
+ name: "{{ mongodb_root_backup_name }}",
+ password: "{{ mongodb_root_backup_password }}",
+ roles: "backup,clusterMonitor"
+ }
+ no_log: true
+
+- name: Move back mongod.conf
+ template:
+ src: mongod.conf.j2
+ dest: /etc/mongod.conf
+ owner: root
+ group: root
+ mode: 0644
+ notify:
+ - mongodb restart
+ - wait when mongodb is started on localhost
+
+- name: Flush all handlers at this point
+ meta: flush_handlers
diff --git a/ansible/roles/mongodb-cluster/tasks/configure.yml b/ansible/roles/mongodb-cluster/tasks/configure.yml
new file mode 100644
index 000000000..5abfd2fea
--- /dev/null
+++ b/ansible/roles/mongodb-cluster/tasks/configure.yml
@@ -0,0 +1,87 @@
+---
+- name: create mongodb group
+ group:
+ name: "{{ mongodb_user }}"
+ state: present
+
+- name: create mongodb user
+ user:
+ name: "{{ mongodb_user }}"
+ group: "{{ mongodb_user }}"
+ state: present
+
+# Workaround because default(omit) is not working. At least in Ansible 2.8.
+
+- name: set mongodb gid
+ group:
+ name: "{{ mongodb_user }}"
+ gid: "{{ mongodb_gid }}"
+ state: present
+ when: mongodb_gid is defined
+
+- name: set mongodb uid
+ user:
+ name: "{{ mongodb_user }}"
+ uid: "{{ mongodb_uid }}"
+ group: "{{ mongodb_user }}"
+ state: present
+ when: mongodb_uid is defined
+
+- name: Create keyFile
+ copy:
+ dest: "{{ mongodb_security_keyfile }}"
+ content: "{{ mongodb_keyfile_content }}"
+ owner: "{{ mongodb_user }}"
+ group: "root"
+ mode: 0600
+ when: mongodb_replication_replset | length > 0
+
+- name: Create log dir if missing
+ file:
+ state: directory
+ dest: "{{ mongodb_systemlog_path|dirname }}"
+ owner: "{{ mongodb_user }}"
+ group: "{{ mongodb_user }}"
+ mode: 0755
+ when: mongodb_systemlog_destination == "file"
+
+- name: Check than logfile exists
+ stat: path={{ mongodb_systemlog_path }}
+ register: logfile_stat
+ when: mongodb_systemlog_destination == "file"
+
+- name: Create log if missing
+ file:
+ state: touch
+ dest: "{{ mongodb_systemlog_path }}"
+ owner: "{{ mongodb_user }}"
+ group: "{{ mongodb_user }}"
+ mode: 0644
+ when: ( mongodb_systemlog_destination == "file"
+ and logfile_stat is defined
+ and not logfile_stat.stat.exists )
+
+- name: Ensure dbpath directory
+ file:
+ path: "{{ mongodb_storage_dbpath }}"
+ state: directory
+ owner: "{{ mongodb_user }}"
+ group: "{{ mongodb_user }}"
+ setype: 'mongod_var_lib_t'
+ recurse: true
+ follow: true
+
+- name: Configure mongodb
+ template:
+ src: mongod.conf.j2
+ dest: /etc/mongod.conf
+ backup: true
+ owner: root
+ group: root
+ mode: 0644
+ notify:
+ - mongodb restart
+ - wait when mongodb is started on localhost
+
+- name: Flush all handlers at this point
+ meta: flush_handlers
diff --git a/ansible/roles/mongodb-cluster/tasks/disable_transparent_hugepages.yml b/ansible/roles/mongodb-cluster/tasks/disable_transparent_hugepages.yml
new file mode 100644
index 000000000..654674ba7
--- /dev/null
+++ b/ansible/roles/mongodb-cluster/tasks/disable_transparent_hugepages.yml
@@ -0,0 +1,16 @@
+---
+- name: Create disable transparent hugepages systemd service file
+ template:
+ src: "{{ item }}"
+ dest: /etc/systemd/system/disable-transparent-hugepages.service
+ owner: root
+ group: root
+ mode: 0644
+ with_first_found:
+ - "disable-transparent-hugepages.{{ ansible_distribution | lower }}.service.j2"
+ - "disable-transparent-hugepages.{{ ansible_os_family | lower }}.service.j2"
+ notify: "run disable-transparent-hugepages"
+ when:
+ - ansible_service_mgr == "systemd"
+ - mongodb_disable_transparent_hugepages | bool
+
diff --git a/ansible/roles/mongodb-cluster/tasks/install.amazon.yml b/ansible/roles/mongodb-cluster/tasks/install.amazon.yml
new file mode 100644
index 000000000..783298a4d
--- /dev/null
+++ b/ansible/roles/mongodb-cluster/tasks/install.amazon.yml
@@ -0,0 +1,49 @@
+---
+- name: Establish some role-related facts
+ set_fact:
+ mongodb_major_version: "{{ mongodb_version[0:3] }}"
+
+- name: Add YUM repository
+ template:
+ src: mongodb.repo.j2
+ dest: /etc/yum.repos.d/mongodb.repo
+ mode: 0644
+ with_items: "{{ mongodb_major_version }}"
+ loop_control:
+ loop_var: version_item
+ when: mongodb_package == 'mongodb-org'
+
+- name: Install MongoDB package
+ yum:
+ name: "{{ mongodb_package }}{% if (mongodb_version | length > 3) %}={{ mongodb_version }}{% endif %}"
+ state: "{{ mongodb_package_state }}"
+ lock_timeout: "{{ yum_lock_timeout }}"
+
+- name: Install numactl package
+ yum:
+ name: numactl
+ state: present
+ lock_timeout: "{{ yum_lock_timeout }}"
+ when: mongodb_use_numa | bool
+
+- name: Install PyMongo package
+ yum:
+ name: python-pymongo
+ state: present
+ lock_timeout: "{{ yum_lock_timeout }}"
+ when: not mongodb_pymongo_from_pip
+
+- name: Install PIP
+ yum:
+ name:
+ - python-devel
+ - python-pip
+ lock_timeout: "{{ yum_lock_timeout }}"
+ when: mongodb_pymongo_from_pip
+
+- name: Install PyMongo from PIP
+ pip:
+ name: pymongo
+ state: "{{ mongodb_pymongo_pip_version is defined | ternary('present', 'latest') }}"
+ version: "{{ mongodb_pymongo_pip_version | default(omit) }}"
+ when: mongodb_pymongo_from_pip
diff --git a/ansible/roles/mongodb-cluster/tasks/install.debian.yml b/ansible/roles/mongodb-cluster/tasks/install.debian.yml
new file mode 100644
index 000000000..9daf1a243
--- /dev/null
+++ b/ansible/roles/mongodb-cluster/tasks/install.debian.yml
@@ -0,0 +1,113 @@
+---
+- name: Establish some role-related facts
+ set_fact:
+ mongodb_major_version: "{{ mongodb_version[0:3] }}"
+
+- name: Disable transparent huge pages on systemd systems
+ include_tasks: disable_transparent_hugepages.yml
+ when:
+ - mongodb_disable_transparent_hugepages | bool
+ - ansible_service_mgr == "systemd"
+
+ #- name: Add APT key
+ # apt_key:
+ # keyserver: "{{ mongodb_apt_keyserver }}"
+ # id: "{{ mongodb_apt_key_id[mongodb_major_version] }}"
+ # when: mongodb_package == 'mongodb-org'
+
+- name: Add APT Key
+ become: yes
+ shell: "apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 4B7C549A058F8B6B"
+
+- name: Fail when used wrong mongodb_version variable with Debian Stretch
+ fail:
+ msg: "mongodb_version variable should be '3.6' or '4.0' or '4.2' for Debian Stretch"
+ when:
+ - mongodb_package == 'mongodb-org'
+ - (mongodb_major_version != '3.6' and mongodb_major_version != '4.0' and mongodb_major_version != '4.2')
+ - ansible_distribution_release == 'stretch'
+
+- name: Fail when used wrong mongodb_version variable with Ubuntu 18.04
+ fail:
+ msg: "mongodb_version variable should be '4.0' or '4.2', or else mongodb_package should be 'mongodb' for Ubuntu 18.04"
+ when:
+ - mongodb_package == 'mongodb-org'
+ - (mongodb_major_version != '4.0' and mongodb_major_version != '4.2')
+ - ansible_distribution_release == "bionic"
+
+- name: Fail when used wrong mongodb_version variable
+ fail:
+ msg: "mongodb_version variable should be '3.4', '3.6' or '4.0' or '4.2'"
+ when: (mongodb_package == 'mongodb-org' and
+ (mongodb_version is not defined
+ or mongodb_repository[mongodb_major_version] is not defined))
+
+- name: Add APT repository
+ apt_repository:
+ repo: "{{ mongodb_repository[version_item] }}"
+ update_cache: true
+ with_items: "{{ mongodb_major_version }}"
+ loop_control:
+ loop_var: version_item
+ when: mongodb_package == 'mongodb-org'
+
+- name: Install MongoDB package
+ apt:
+ name: "{{ mongodb_package }}{% if (mongodb_version | length > 3) %}={{ mongodb_version }}{% endif %}"
+ state: "{{ mongodb_package_state }}"
+ update_cache: true
+
+- name: Install numactl package
+ apt:
+ name: numactl
+ state: present
+ when: mongodb_use_numa | bool
+
+- name: Add systemd configuration if present
+ template:
+ src: mongodb.service.j2
+ dest: "/lib/systemd/system/{{mongodb_daemon_name}}.service"
+ owner: root
+ group: root
+ mode: '0644'
+ when:
+ - ansible_service_mgr == "systemd"
+ - mongodb_manage_systemd_unit | bool
+ notify:
+ - reload systemd
+
+- name: Add symlink for systemd
+ file:
+ src: "/lib/systemd/system/{{mongodb_daemon_name}}.service"
+ dest: "/etc/systemd/system/multi-user.target.wants/{{mongodb_daemon_name}}.service"
+ state: link
+ when:
+ - ansible_service_mgr == "systemd"
+ - mongodb_manage_systemd_unit | bool
+ notify:
+ - reload systemd
+
+- name: Install PyMongo package
+ apt:
+ name: python-pymongo
+ when: not mongodb_pymongo_from_pip
+
+- name: Install PIP
+ apt:
+ pkg:
+ - python-dev
+ - python-pip
+ when: mongodb_pymongo_from_pip | bool
+
+- name: Install setuptools (required for ansible 2.7+)
+ apt:
+ pkg:
+ - python-setuptools
+ when: mongodb_pymongo_from_pip | bool
+
+- name: Install PyMongo from PIP
+ pip:
+ name: pymongo
+ state: "{{ mongodb_pymongo_pip_version is defined | ternary('present', 'latest') }}"
+ version: "{{ mongodb_pymongo_pip_version | default(omit) }}"
+ when: mongodb_pymongo_from_pip | bool
diff --git a/ansible/roles/mongodb-cluster/tasks/install.redhat.yml b/ansible/roles/mongodb-cluster/tasks/install.redhat.yml
new file mode 100644
index 000000000..f2829181b
--- /dev/null
+++ b/ansible/roles/mongodb-cluster/tasks/install.redhat.yml
@@ -0,0 +1,55 @@
+---
+
+- name: Establish some role-related facts
+ set_fact:
+ mongodb_major_version: "{{ mongodb_version[0:3] }}"
+
+- name: Install EPEL release repository
+ package:
+ name: epel-release
+ state: present
+
+- name: Add YUM repository
+ template:
+ src: mongodb.repo.j2
+ dest: /etc/yum.repos.d/mongodb.repo
+ mode: 0644
+ with_items: "{{ mongodb_major_version }}"
+ loop_control:
+ loop_var: version_item
+ when: mongodb_package == 'mongodb-org'
+
+- name: Install MongoDB package
+ yum:
+ name: "{{ mongodb_package }}{% if (mongodb_version | length > 3) %}={{ mongodb_version }}{% endif %}"
+ state: "{{ mongodb_package_state }}"
+ lock_timeout: "{{ yum_lock_timeout }}"
+
+- name: Install numactl package
+ yum:
+ name: numactl
+ state: present
+ lock_timeout: "{{ yum_lock_timeout }}"
+ when: mongodb_use_numa | bool
+
+- name: Install PyMongo package
+ yum:
+ name: python-pymongo
+ state: present
+ lock_timeout: "{{ yum_lock_timeout }}"
+ when: not mongodb_pymongo_from_pip
+
+- name: Install PIP
+ yum:
+ name:
+ - python-devel
+ - python-pip
+ lock_timeout: "{{ yum_lock_timeout }}"
+ when: mongodb_pymongo_from_pip | bool
+
+- name: Install PyMongo from PIP
+ pip:
+ name: pymongo
+ state: "{{ mongodb_pymongo_pip_version is defined | ternary('present', 'latest') }}"
+ version: "{{ mongodb_pymongo_pip_version | default(omit) }}"
+ when: mongodb_pymongo_from_pip | bool
diff --git a/ansible/roles/mongodb-cluster/tasks/main.yml b/ansible/roles/mongodb-cluster/tasks/main.yml
new file mode 100644
index 000000000..2ab22c9c1
--- /dev/null
+++ b/ansible/roles/mongodb-cluster/tasks/main.yml
@@ -0,0 +1,137 @@
+---
+
+- name: Check value of variable mongodb_net_ssl_host
+ fail:
+ msg: 'Set mongodb_net_ssl_mode is preferSSL or set valid hostname for mongodb_net_ssl_host!'
+ when: ( mongodb_net_ssl_mode == 'requireSSL'
+ and mongodb_net_ssl_host == '' )
+
+- name: Check value of variable mongodb_login_host
+ fail:
+ msg: 'Set mongodb_login_host equal mongodb_net_ssl_host!'
+ when: ( mongodb_net_ssl_mode == 'requireSSL'
+ and mongodb_net_ssl_host != mongodb_login_host
+ and not mongodb_replication_replset )
+
+- name: Include OS-specific variables
+ include_vars: "{{ item }}"
+ with_first_found:
+ - "{{ ansible_distribution_release }}.yml"
+ - "{{ ansible_distribution }}.yml"
+ - "{{ ansible_os_family }}.yml"
+
+- name: Include installation tasks
+ include: "{{ item }}"
+ with_first_found:
+ - "install.{{ ansible_distribution | lower }}.yml"
+ - "install.{{ ansible_os_family | lower }}.yml"
+ tags: [mongodb]
+
+- name: Include configuration.yml
+ include: configure.yml
+ tags: [mongodb]
+
+- name: Include replication and auth configuration
+ include: replication_init_auth.yml
+ when: ( mongodb_replication_replset | length > 0
+ and mongodb_security_authorization == 'enabled'
+ and mongodb_master is defined and mongodb_master )
+ tags: [mongodb]
+
+- name: Include replication configuration
+ include: replication.yml
+ when: mongodb_replication_replset | length > 0
+ tags: [mongodb]
+
+- name: Check where admin user already exists
+ command: >
+ mongo --quiet {{ '--ssl --host ' + mongodb_net_ssl_host if mongodb_net_ssl_mode == 'requireSSL' else '' }} -u {{ mongodb_user_admin_name }} \
+ -p {{ mongodb_user_admin_password }} --port {{ mongodb_net_port }} --eval 'db.version()' admin
+ register: mongodb_user_admin_check
+ changed_when: false
+ check_mode: no
+ ignore_errors: true
+ when: ( mongodb_security_authorization == 'enabled'
+ and not mongodb_replication_replset )
+ no_log: true
+ tags: [mongodb]
+
+- name: Include authorization configuration
+ include: auth_initialization.yml
+ when: ( mongodb_security_authorization == 'enabled'
+ and not mongodb_replication_replset
+ and mongodb_user_admin_check.rc != 0 )
+ tags: [mongodb]
+
+- name: create normal users with replicaset
+ mongodb_user:
+ database: "{{ item.database }}"
+ name: "{{ item.name }}"
+ password: "{{ item.password }}"
+ update_password: "{{ mongodb_user_update_password }}"
+ roles: "{{ item.roles }}"
+ login_user: "{{ mongodb_user_admin_name }}"
+ login_password: "{{ mongodb_user_admin_password }}"
+ login_port: "{{ mongodb_login_port|default(27017) }}"
+ login_host: "{{ mongodb_login_host|default('localhost') }}"
+ ssl: "{{ True if mongodb_net_ssl_mode == 'requireSSL' else False }}"
+ with_items:
+ - "{{ mongodb_users | default([]) }}"
+ when: ( mongodb_replication_replset
+ and mongodb_security_authorization == 'enabled'
+ and mongodb_master is defined and mongodb_master )
+ no_log: true
+ tags: [mongodb]
+
+- name: create normal users without replicaset
+ mongodb_user:
+ database: "{{ item.database }}"
+ name: "{{ item.name }}"
+ password: "{{ item.password }}"
+ update_password: "{{ mongodb_user_update_password }}"
+ roles: "{{ item.roles }}"
+ login_user: "{{ mongodb_user_admin_name }}"
+ login_password: "{{ mongodb_user_admin_password }}"
+ login_port: "{{ mongodb_net_port }}"
+ login_host: "{{ mongodb_login_host|default('localhost') }}"
+ ssl: "{{ True if mongodb_net_ssl_mode == 'requireSSL' else False }}"
+ with_items:
+ - "{{ mongodb_users | default([]) }}"
+ when: ( mongodb_security_authorization == 'enabled'
+ and not mongodb_replication_replset )
+ no_log: true
+ ignore_errors: true
+ tags: [mongodb]
+
+- name: create oplog user with replicaset
+ mongodb_user:
+ database: admin
+ user: "{{ item.user }}"
+ password: "{{ item.password }}"
+ update_password: "{{ mongodb_user_update_password }}"
+ roles:
+ - db: local
+ role: read
+ login_user: "{{ mongodb_user_admin_name }}"
+ login_password: "{{ mongodb_user_admin_password }}"
+ login_port: "{{ mongodb_login_port|default(27017) }}"
+ login_host: "{{ mongodb_login_host|default('localhost') }}"
+ ssl: "{{ True if mongodb_net_ssl_mode == 'requireSSL' else False }}"
+ with_items:
+ - "{{ mongodb_oplog_users | default([]) }}"
+ when: ( mongodb_replication_replset | length > 0
+ and mongodb_security_authorization == 'enabled'
+ and mongodb_master is defined and mongodb_master )
+ no_log: true
+ tags: [mongodb]
+
+- name: service started
+ service:
+ name: "{{ mongodb_daemon_name }}"
+ state: started
+ enabled: yes
+
+- name: Include MMS Agent configuration
+ include: mms-agent.yml
+ when: mongodb_mms_api_key | length > 0
+ tags: [mongodb]
diff --git a/ansible/roles/mongodb-cluster/tasks/mms-agent.yml b/ansible/roles/mongodb-cluster/tasks/mms-agent.yml
new file mode 100644
index 000000000..84aba16ba
--- /dev/null
+++ b/ansible/roles/mongodb-cluster/tasks/mms-agent.yml
@@ -0,0 +1,32 @@
+---
+- name: Install MMS agent (Debian)
+ apt:
+ deb: "{{ mongodb_mms_agent_pkg }}"
+ when: ansible_distribution == 'Debian' or ansible_distribution == 'Ubuntu'
+
+- name: Install MMS agent (RHEL)
+ yum:
+ name: "{{ mongodb_mms_agent_pkg }}"
+ state: present
+ when: ansible_distribution == 'CentOS' or ansible_distribution == 'RedHat'
+
+- name: Configure the MMS agent pt. 1
+ file:
+ state: directory
+ path: /etc/mongodb-mms
+ owner: "{{ mongodb_user }}"
+ group: "{{ mongodb_user }}"
+ mode: 0755
+
+- name: Configure the MMS agent pt. 2
+ template:
+ src: monitoring-agent.config.j2
+ dest: /etc/mongodb-mms/monitoring-agent.config
+ notify: mongodb-mms-monitoring-agent restart
+
+- name: Ensure that the MMS agent is started
+ service:
+ name: mongodb-mms-monitoring-agent
+ state: started
+ enabled: yes
+
diff --git a/ansible/roles/mongodb-cluster/tasks/replication.yml b/ansible/roles/mongodb-cluster/tasks/replication.yml
new file mode 100644
index 000000000..3b5d106d1
--- /dev/null
+++ b/ansible/roles/mongodb-cluster/tasks/replication.yml
@@ -0,0 +1,57 @@
+---
+
+- name: Replication configuration
+ mongodb_replication:
+ build_indexes: "{{ item.build_indexes|default(omit) }}"
+ login_host: "{{ mongodb_login_host|default('localhost') }}"
+ login_port: "{{ mongodb_login_port|default(27017) }}"
+ login_user: "{{ mongodb_root_admin_name }}"
+ login_password: "{{ mongodb_root_admin_password }}"
+ replica_set: "{{ mongodb_replication_replset }}"
+ host_name: "{{ host_name }}"
+ host_port: "{{ item.host_port|default(27017) }}"
+ host_type: "{{ item.host_type|default('replica') }}"
+ hidden: "{{ item.hidden|default(false) }}"
+ priority: "{{ item.priority|default(1.0) }}"
+ votes: "{{ item.votes|default(omit) }}"
+ ssl: "{{ True if mongodb_net_ssl_mode == 'requireSSL' else False }}"
+ when: mongodb_security_authorization == 'enabled'
+ with_items:
+ - "{{ mongodb_replication_params|default([]) }}"
+
+- name: Replication configuration without auth on master
+ mongodb_replication:
+ build_indexes: "{{ item.build_indexes|default(omit) }}"
+ login_host: "{{ mongodb_login_host|default('localhost') }}"
+ login_port: "{{ mongodb_login_port|default(27017) }}"
+ replica_set: "{{ mongodb_replication_replset }}"
+ host_name: "{{ host_name }}"
+ host_port: "{{ item.host_port|default(27017) }}"
+ host_type: "{{ item.host_type|default('replica') }}"
+ hidden: "{{ item.hidden|default(false) }}"
+ priority: "{{ item.priority|default(1.0) }}"
+ votes: "{{ item.votes|default(omit) }}"
+ ssl: "{{ True if mongodb_net_ssl_mode == 'requireSSL' else False }}"
+ when: ( mongodb_security_authorization == 'disabled'
+ and mongodb_master is defined and mongodb_master )
+ with_items:
+ - "{{ mongodb_replication_params|default([]) }}"
+
+- name: Replication configuration without auth on replicas and arbiters
+ mongodb_replication:
+ build_indexes: "{{ item.build_indexes|default(omit) }}"
+ login_host: "{{ mongodb_login_host|default('localhost') }}"
+ login_port: "{{ mongodb_login_port|default(27017) }}"
+ replica_set: "{{ mongodb_replication_replset }}"
+ host_name: "{{ host_name }}"
+ host_port: "{{ item.host_port|default(27017) }}"
+ host_type: "{{ item.host_type|default('replica') }}"
+ hidden: "{{ item.hidden|default(false) }}"
+ priority: "{{ item.priority|default(1.0) }}"
+ votes: "{{ item.votes|default(omit) }}"
+ ssl: "{{ True if mongodb_net_ssl_mode == 'requireSSL' else False }}"
+ when: ( mongodb_security_authorization == 'disabled'
+ and ( mongodb_master is not defined or not mongodb_master) )
+ with_items:
+ - "{{ mongodb_replication_params|default([]) }}"
+
diff --git a/ansible/roles/mongodb-cluster/tasks/replication_init_auth.yml b/ansible/roles/mongodb-cluster/tasks/replication_init_auth.yml
new file mode 100644
index 000000000..359d5545e
--- /dev/null
+++ b/ansible/roles/mongodb-cluster/tasks/replication_init_auth.yml
@@ -0,0 +1,42 @@
+---
+- name: Replication configuration | 1st Pt.
+ mongodb_replication:
+ build_indexes: "{{ item.build_indexes|default(omit) }}"
+ login_host: "{{ mongodb_login_host|default('localhost') }}"
+ login_port: "{{ mongodb_net_port|default(27017) }}"
+ login_user: "{{ mongodb_root_admin_name }}"
+ login_password: "{{ mongodb_root_admin_password }}"
+ replica_set: "{{ mongodb_replication_replset }}"
+ host_name: "{{ host_name }}"
+ host_port: "{{ item.host_port|default(27017) }}"
+ host_type: "{{ item.host_type|default('replica') }}"
+ hidden: "{{ item.hidden|default(false) }}"
+ priority: "{{ item.priority|default(1.0) }}"
+ votes: "{{ item.votes|default(omit) }}"
+ ssl: "{{ True if mongodb_net_ssl_mode == 'requireSSL' else False }}"
+ with_items:
+ - "{{ mongodb_replication_params|default([]) }}"
+ register: mongodb_replica_init
+ ignore_errors: true
+
+- include: auth_initialization.yml
+ when: mongodb_replica_init is failed
+
+- name: Replication configuration | 2nd Pt
+ mongodb_replication:
+ build_indexes: "{{ item.build_indexes|default(omit) }}"
+ login_host: "{{ mongodb_login_host|default('localhost') }}"
+ login_port: "{{ mongodb_net_port|default(27017) }}"
+ login_user: "{{ mongodb_root_admin_name }}"
+ login_password: "{{ mongodb_root_admin_password }}"
+ replica_set: "{{ mongodb_replication_replset }}"
+ host_name: "{{ host_name }}"
+ host_port: "{{ item.host_port|default(27017) }}"
+ host_type: "{{ item.host_type|default('replica') }}"
+ hidden: "{{ item.hidden|default(false) }}"
+ priority: "{{ item.priority|default(1.0) }}"
+ votes: "{{ item.votes|default(omit) }}"
+ ssl: "{{ True if mongodb_net_ssl_mode == 'requireSSL' else False }}"
+ when: mongodb_replica_init is failed
+ with_items:
+ - "{{ mongodb_replication_params|default([]) }}"
diff --git a/ansible/roles/mongodb-cluster/templates/disable-transparent-hugepages.amazon.service.j2 b/ansible/roles/mongodb-cluster/templates/disable-transparent-hugepages.amazon.service.j2
new file mode 100644
index 000000000..d728e1567
--- /dev/null
+++ b/ansible/roles/mongodb-cluster/templates/disable-transparent-hugepages.amazon.service.j2
@@ -0,0 +1,17 @@
+# {{ ansible_managed }}
+[Unit]
+Description="Disable Transparent Hugepage before MongoDB boots"
+#WARN: check service name on your system
+# If you are using MongoDB Cloud, service name is "mongodb-mms-automation-agent.service"
+Before={{ mongodb_daemon_name }}.service
+
+[Service]
+Type=oneshot
+ExecStart=-/bin/bash -c 'echo never > /sys/kernel/mm/redhat_transparent_hugepage/enabled'
+ExecStart=-/bin/bash -c 'echo never > /sys/kernel/mm/redhat_transparent_hugepage/defrag'
+ExecStart=-/bin/bash -c 'echo 0 > /sys/kernel/mm/redhat_transparent_hugepage/khugepaged/defrag'
+
+[Install]
+#WARN: check service name on your system
+# If you are using MongoDB Cloud, service name is "mongodb-mms-automation-agent.service"
+RequiredBy={{ mongodb_daemon_name }}.service
diff --git a/ansible/roles/mongodb-cluster/templates/disable-transparent-hugepages.debian.service.j2 b/ansible/roles/mongodb-cluster/templates/disable-transparent-hugepages.debian.service.j2
new file mode 100644
index 000000000..b940261da
--- /dev/null
+++ b/ansible/roles/mongodb-cluster/templates/disable-transparent-hugepages.debian.service.j2
@@ -0,0 +1,17 @@
+# {{ ansible_managed }}
+[Unit]
+Description="Disable Transparent Hugepage before MongoDB boots"
+#WARN: check service name on your system
+# If you are using MongoDB Cloud, service name is "mongodb-mms-automation-agent.service"
+Before={{ mongodb_daemon_name }}.service
+
+[Service]
+Type=oneshot
+ExecStart=-/bin/bash -c 'echo never > /sys/kernel/mm/transparent_hugepage/enabled'
+ExecStart=-/bin/bash -c 'echo never > /sys/kernel/mm/transparent_hugepage/defrag'
+ExecStart=-/bin/bash -c 'echo 0 > /sys/kernel/mm/transparent_hugepage/khugepaged/defrag'
+
+[Install]
+#WARN: check service name on your system
+# If you are using MongoDB Cloud, service name is "mongodb-mms-automation-agent.service"
+RequiredBy={{ mongodb_daemon_name }}.service
diff --git a/ansible/roles/mongodb-cluster/templates/disable-transparent-hugepages.redhat.service.j2 b/ansible/roles/mongodb-cluster/templates/disable-transparent-hugepages.redhat.service.j2
new file mode 100644
index 000000000..d728e1567
--- /dev/null
+++ b/ansible/roles/mongodb-cluster/templates/disable-transparent-hugepages.redhat.service.j2
@@ -0,0 +1,17 @@
+# {{ ansible_managed }}
+[Unit]
+Description="Disable Transparent Hugepage before MongoDB boots"
+#WARN: check service name on your system
+# If you are using MongoDB Cloud, service name is "mongodb-mms-automation-agent.service"
+Before={{ mongodb_daemon_name }}.service
+
+[Service]
+Type=oneshot
+ExecStart=-/bin/bash -c 'echo never > /sys/kernel/mm/redhat_transparent_hugepage/enabled'
+ExecStart=-/bin/bash -c 'echo never > /sys/kernel/mm/redhat_transparent_hugepage/defrag'
+ExecStart=-/bin/bash -c 'echo 0 > /sys/kernel/mm/redhat_transparent_hugepage/khugepaged/defrag'
+
+[Install]
+#WARN: check service name on your system
+# If you are using MongoDB Cloud, service name is "mongodb-mms-automation-agent.service"
+RequiredBy={{ mongodb_daemon_name }}.service
diff --git a/ansible/roles/mongodb-cluster/templates/mongod.conf.j2 b/ansible/roles/mongodb-cluster/templates/mongod.conf.j2
new file mode 100644
index 000000000..ebdead935
--- /dev/null
+++ b/ansible/roles/mongodb-cluster/templates/mongod.conf.j2
@@ -0,0 +1,118 @@
+# {{ ansible_managed }}
+
+net:
+ bindIp: {{ mongodb_net_bindip }}
+ {% if mongodb_major_version is version("3.6", "<") -%}
+ http:
+ enabled: {{ mongodb_net_http_enabled | to_nice_json }}
+ {% endif -%}
+ ipv6: {{ mongodb_net_ipv6 | to_nice_json }}
+ maxIncomingConnections: {{ mongodb_net_maxconns }}
+ port: {{ mongodb_net_port }}
+ {% if mongodb_net_ssl_pemfile is defined and mongodb_net_ssl_mode is defined and mongodb_net_ssl == 'enabled' -%}
+ ssl:
+ mode: {{ mongodb_net_ssl_mode }}
+ PEMKeyFile: {{ mongodb_net_ssl_pemfile }}
+ {%- endif %}
+ {%- if mongodb_config['net'] is defined and mongodb_config['net'] is iterable %}
+ {%- for item in mongodb_config['net'] -%}
+ {{ item }}
+ {% endfor %}
+ {% endif %}
+
+processManagement:
+ fork: false
+
+{% if mongodb_replication_replset -%}
+replication:
+ oplogSizeMB: {{ mongodb_replication_oplogsize | int }}
+ replSetName: {{ mongodb_replication_replset }}
+ {% if mongodb_storage_engine == 'mmapv1' -%}
+ secondaryIndexPrefetch: {{ mongodb_replication_replindexprefetch }}
+ {%- endif %}
+ {%- if mongodb_config['replication'] is defined and mongodb_config['replication'] is iterable %}
+ {%- for item in mongodb_config['replication'] -%}
+ {{ item }}
+ {% endfor %}
+ {% endif %}
+{% endif %}
+
+security:
+ authorization: {{ mongodb_security_authorization }}
+ {% if mongodb_replication_replset and mongodb_security_authorization == 'enabled' -%}
+ keyFile: {{ mongodb_security_keyfile }}
+ {% endif -%}
+ javascriptEnabled: {{ mongodb_security_javascript_enabled | to_nice_json }}
+ {%- if mongodb_config['security'] is defined and mongodb_config['security'] is iterable %}
+ {%- for item in mongodb_config['security'] -%}
+ {{ item }}
+ {% endfor %}
+ {% endif %}
+
+storage:
+ dbPath: {{ mongodb_storage_dbpath }}
+ directoryPerDB: {{ mongodb_storage_dirperdb | to_nice_json }}
+ engine: {{ mongodb_storage_engine }}
+ journal:
+ enabled: {{ mongodb_storage_journal_enabled | to_nice_json }}
+ {% if mongodb_storage_engine == 'mmapv1' -%}
+ mmapv1:
+ quota:
+ enforced: {{ mongodb_storage_quota_enforced | to_nice_json }}
+ maxFilesPerDB: {{ mongodb_storage_quota_maxfiles }}
+ smallFiles: {{ mongodb_storage_smallfiles | to_nice_json }}
+ {% endif -%}
+ {% if mongodb_storage_engine == 'wiredTiger' -%}
+ wiredTiger:
+ engineConfig:
+ {% if mongodb_wiredtiger_cache_size is defined -%}
+ cacheSizeGB: {{ mongodb_wiredtiger_cache_size }}
+ {% endif -%}
+ directoryForIndexes: {{ mongodb_wiredtiger_directory_for_indexes | to_nice_json }}
+ {%- endif %}
+ {%- if mongodb_config['storage'] is defined and mongodb_config['storage'] is iterable %}
+ {%- for item in mongodb_config['storage'] -%}
+ {{ item }}
+ {% endfor %}
+ {% endif %}
+
+systemLog:
+ destination: {{ mongodb_systemlog_destination }}
+ {% if mongodb_systemlog_destination == 'file' -%}
+ logAppend: {{ mongodb_systemlog_logappend | to_nice_json }}
+ logRotate: {{ mongodb_systemlog_logrotate }}
+ path: {{ mongodb_systemlog_path }}
+ {%- endif %}
+ {%- if mongodb_config['systemLog'] is defined and mongodb_config['systemLog'] is iterable %}
+ {%- for item in mongodb_config['systemLog'] -%}
+ {{ item }}
+ {% endfor %}
+ {% endif %}
+
+operationProfiling:
+ slowOpThresholdMs: {{ mongodb_operation_profiling_slow_op_threshold_ms }}
+ mode: {{ mongodb_operation_profiling_mode }}
+ {%- if mongodb_config['operationProfiling'] is defined and mongodb_config['operationProfiling'] is iterable %}
+ {%- for item in mongodb_config['operationProfiling'] -%}
+ {{ item }}
+ {% endfor %}
+ {% endif %}
+
+{% if mongodb_major_version is version("4.0", ">=") -%}
+cloud:
+ monitoring:
+ free:
+ state: {{ mongodb_cloud_monitoring_free_state }}
+ {%- if mongodb_config['cloud'] is defined and mongodb_config['cloud'] is iterable %}
+ {%- for item in mongodb_config['cloud'] -%}
+ {{ item }}
+ {% endfor %}
+ {% endif %}
+{% endif %}
+
+{% if mongodb_set_parameters -%}
+setParameter:
+ {% for key, value in mongodb_set_parameters.items() -%}
+ {{ key }}: {{ value }}
+ {% endfor %}
+{% endif %}
diff --git a/ansible/roles/mongodb-cluster/templates/mongod_init.conf.j2 b/ansible/roles/mongodb-cluster/templates/mongod_init.conf.j2
new file mode 100644
index 000000000..7d279d01a
--- /dev/null
+++ b/ansible/roles/mongodb-cluster/templates/mongod_init.conf.j2
@@ -0,0 +1,47 @@
+# {{ ansible_managed }}
+
+net:
+ bindIp: '127.0.0.1'
+ {% if mongodb_major_version is version("3.6", "<") -%}
+ http:
+ enabled: {{ mongodb_net_http_enabled | to_nice_json }}
+ {% endif -%}
+ ipv6: {{ mongodb_net_ipv6 | to_nice_json }}
+ maxIncomingConnections: {{ mongodb_net_maxconns }}
+ port: {{ mongodb_net_port }}
+
+processManagement:
+ fork: false
+
+security:
+ authorization: 'disabled'
+
+storage:
+ dbPath: {{ mongodb_storage_dbpath }}
+ directoryPerDB: {{ mongodb_storage_dirperdb | to_nice_json }}
+ engine: {{ mongodb_storage_engine }}
+ journal:
+ enabled: {{ mongodb_storage_journal_enabled | to_nice_json }}
+ {% if mongodb_storage_engine == 'mmapv1' -%}
+ mmapv1:
+ quota:
+ enforced: {{ mongodb_storage_quota_enforced | to_nice_json }}
+ maxFilesPerDB: {{ mongodb_storage_quota_maxfiles }}
+ smallFiles: {{ mongodb_storage_smallfiles | to_nice_json }}
+ {% endif -%}
+ {% if mongodb_storage_engine == 'wiredTiger' -%}
+ wiredTiger:
+ engineConfig:
+ {% if mongodb_wiredtiger_cache_size is defined -%}
+ cacheSizeGB: {{ mongodb_wiredtiger_cache_size }}
+ {% endif -%}
+ directoryForIndexes: {{ mongodb_wiredtiger_directory_for_indexes | to_nice_json }}
+ {% endif %}
+
+systemLog:
+ destination: {{ mongodb_systemlog_destination }}
+ {% if mongodb_systemlog_destination == 'file' -%}
+ logAppend: {{ mongodb_systemlog_logappend | to_nice_json }}
+ logRotate: {{ mongodb_systemlog_logrotate }}
+ path: {{ mongodb_systemlog_path }}
+ {% endif -%}
diff --git a/ansible/roles/mongodb-cluster/templates/mongodb.repo.j2 b/ansible/roles/mongodb-cluster/templates/mongodb.repo.j2
new file mode 100644
index 000000000..727f2cb1b
--- /dev/null
+++ b/ansible/roles/mongodb-cluster/templates/mongodb.repo.j2
@@ -0,0 +1,10 @@
+[mongodb-org-{{ mongodb_major_version }}]
+name=MongoDB {{ mongodb_major_version }} Repository
+baseurl={{ mongodb_repository[version_item] }}
+{% if mongodb_repository_gpgkey[version_item] is defined and mongodb_repository_gpgkey[version_item] != '' %}
+gpgcheck=1
+gpgkey={{ mongodb_repository_gpgkey[version_item] }}
+{% else %}
+gpgcheck=0
+{% endif %}
+enabled=1
diff --git a/ansible/roles/mongodb-cluster/templates/mongodb.service.j2 b/ansible/roles/mongodb-cluster/templates/mongodb.service.j2
new file mode 100644
index 000000000..61eb82c4c
--- /dev/null
+++ b/ansible/roles/mongodb-cluster/templates/mongodb.service.j2
@@ -0,0 +1,34 @@
+# {{ ansible_managed }}
+[Unit]
+Description=An object/document-oriented database
+Documentation=man:mongod(1)
+After=network-online.target
+
+[Service]
+User={{ mongodb_user }}
+{% if mongodb_use_numa | bool %}
+ExecStart=/usr/bin/numactl --interleave=all /usr/bin/mongod --config /etc/mongod.conf
+{% else %}
+ExecStart=/usr/bin/mongod --config /etc/mongod.conf
+{% endif %}
+# file size
+LimitFSIZE=infinity
+# cpu time
+LimitCPU=infinity
+# virtual memory size
+LimitAS=infinity
+# open files
+LimitNOFILE={{ mongodb_systemd_unit_limit_nofile }}
+# processes/threads
+LimitNPROC={{ mongodb_systemd_unit_limit_nproc }}
+# locked memory
+LimitMEMLOCK=infinity
+# total threads (user+kernel)
+TasksMax=infinity
+TasksAccounting=false
+
+# Recommended limits for for mongod as specified in
+# http://docs.mongodb.org/manual/reference/ulimit/#recommended-settings
+
+[Install]
+WantedBy=multi-user.target
diff --git a/ansible/roles/mongodb-cluster/templates/monitoring-agent.config.j2 b/ansible/roles/mongodb-cluster/templates/monitoring-agent.config.j2
new file mode 100644
index 000000000..2a50d10f4
--- /dev/null
+++ b/ansible/roles/mongodb-cluster/templates/monitoring-agent.config.j2
@@ -0,0 +1,3 @@
+mmsApiKey={{ mongodb_mms_api_key }}
+mmsBaseUrl={{ mongodb_mms_base_url }}
+mmsGroupId={{ mongodb_mms_group_id }}
diff --git a/ansible/roles/mongodb-cluster/vars/Amazon.yml b/ansible/roles/mongodb-cluster/vars/Amazon.yml
new file mode 100644
index 000000000..1ad42a267
--- /dev/null
+++ b/ansible/roles/mongodb-cluster/vars/Amazon.yml
@@ -0,0 +1,15 @@
+---
+mongodb_repository:
+ "4.2": "https://repo.mongodb.org/yum/amazon/2/mongodb-org/4.2/x86_64/"
+ "4.0": "https://repo.mongodb.org/yum/amazon/2/mongodb-org/4.0/x86_64/"
+ "3.6": "https://repo.mongodb.org/yum/amazon/2013.03/mongodb-org/3.6/x86_64/"
+ "3.4": "https://repo.mongodb.org/yum/amazon/2013.03/mongodb-org/3.4/x86_64/"
+
+mongodb_repository_gpgkey:
+ "4.2": "https://www.mongodb.org/static/pgp/server-4.2.asc"
+ "4.0": "https://www.mongodb.org/static/pgp/server-4.0.asc"
+ "3.6": "https://www.mongodb.org/static/pgp/server-3.6.asc"
+
+mongodb_pidfile_path: "{{ '/var/run/mongodb/mongod.pid' if ('mongodb-org' in mongodb_package) else '' }}"
+
+yum_lock_timeout: 180
diff --git a/ansible/roles/mongodb-cluster/vars/Debian.yml b/ansible/roles/mongodb-cluster/vars/Debian.yml
new file mode 100644
index 000000000..c4a956d0b
--- /dev/null
+++ b/ansible/roles/mongodb-cluster/vars/Debian.yml
@@ -0,0 +1,6 @@
+---
+mongodb_repository:
+ "3.4": "deb http://repo.mongodb.org/apt/debian {{ ansible_distribution_release }}/mongodb-org/3.4 main"
+ "3.6": "deb http://repo.mongodb.org/apt/debian {{ ansible_distribution_release }}/mongodb-org/3.6 main"
+ "4.0": "deb http://repo.mongodb.org/apt/debian {{ ansible_distribution_release }}/mongodb-org/4.0 main"
+ "4.2": "deb http://repo.mongodb.org/apt/debian {{ ansible_distribution_release }}/mongodb-org/4.2 main"
diff --git a/ansible/roles/mongodb-cluster/vars/RedHat.yml b/ansible/roles/mongodb-cluster/vars/RedHat.yml
new file mode 100644
index 000000000..d04db94e3
--- /dev/null
+++ b/ansible/roles/mongodb-cluster/vars/RedHat.yml
@@ -0,0 +1,16 @@
+---
+mongodb_repository:
+ "3.4": "https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/3.4/$basearch/"
+ "3.6": "https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/3.6/$basearch/"
+ "4.0": "https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/4.0/$basearch/"
+ "4.2": "https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/4.2/$basearch/"
+
+mongodb_repository_gpgkey:
+ "3.4": "https://www.mongodb.org/static/pgp/server-3.4.asc"
+ "3.6": "https://www.mongodb.org/static/pgp/server-3.6.asc"
+ "4.0": "https://www.mongodb.org/static/pgp/server-4.0.asc"
+ "4.2": "https://www.mongodb.org/static/pgp/server-4.2.asc"
+
+mongodb_pidfile_path: "{{ '/var/run/mongodb/mongod.pid' if ('mongodb-org' in mongodb_package) else '' }}"
+
+yum_lock_timeout: 180
diff --git a/ansible/roles/mongodb-cluster/vars/Ubuntu.yml b/ansible/roles/mongodb-cluster/vars/Ubuntu.yml
new file mode 100644
index 000000000..1054614c7
--- /dev/null
+++ b/ansible/roles/mongodb-cluster/vars/Ubuntu.yml
@@ -0,0 +1,6 @@
+---
+mongodb_repository:
+ "3.4": "deb http://repo.mongodb.org/apt/ubuntu {{ ansible_distribution_release }}/mongodb-org/3.4 multiverse"
+ "3.6": "deb http://repo.mongodb.org/apt/ubuntu {{ ansible_distribution_release }}/mongodb-org/3.6 multiverse"
+ "4.0": "deb http://repo.mongodb.org/apt/ubuntu {{ ansible_distribution_release }}/mongodb-org/4.0 multiverse"
+ "4.2": "deb http://repo.mongodb.org/apt/ubuntu {{ ansible_distribution_release }}/mongodb-org/4.2 multiverse"
diff --git a/pipelines/provision/mongodb-cluster/Jenkinsfile b/pipelines/provision/mongodb-cluster/Jenkinsfile
new file mode 100644
index 000000000..5485868e0
--- /dev/null
+++ b/pipelines/provision/mongodb-cluster/Jenkinsfile
@@ -0,0 +1,51 @@
+@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') {
+ folder = new File("$WORKSPACE/.git")
+ if (folder.exists())
+ {
+ println "Found .git folder. Clearing it.."
+ sh'git clean -fxd'
+ }
+ checkout scm
+ }
+
+ ansiColor('xterm') {
+ stage('deploy'){
+ values = [:]
+ currentWs = sh(returnStdout: true, script: 'pwd').trim()
+ envDir = sh(returnStdout: true, script: "echo $JOB_NAME").split('/')[-3].trim()
+ module = sh(returnStdout: true, script: "echo $JOB_NAME").split('/')[-2].trim()
+ jobName = sh(returnStdout: true, script: "echo $JOB_NAME").split('/')[-1].trim()
+ ansiblePlaybook = "${currentWs}/ansible/mongodb-cluster.yml"
+ ansibleExtraArgs = "--vault-password-file /var/lib/jenkins/secrets/vault-pass -v"
+ values.put('currentWs', currentWs)
+ values.put('env', envDir)
+ values.put('module', module)
+ values.put('jobName', jobName)
+ values.put('ansiblePlaybook', ansiblePlaybook)
+ values.put('ansibleExtraArgs', ansibleExtraArgs)
+ println values
+ ansible_playbook_run(values)
+ currentBuild.result = 'SUCCESS'
+ currentBuild.description = "Private: ${params.private_branch}, Public: ${params.branch_or_tag}"
+ }
+ }
+ summary()
+ }
+ catch (err) {
+ currentBuild.result = 'FAILURE'
+ throw err
+ }
+ finally {
+ slack_notify(currentBuild.result)
+ email_notify()
+ }
+}
From 4d254caab6adfbfe51f23a68e92d7be071e1fe7e Mon Sep 17 00:00:00 2001
From: Rhea Fernandes <32357913+rheafernandes@users.noreply.github.com>
Date: Tue, 1 Dec 2020 19:25:15 +0530
Subject: [PATCH 050/184] Sc 1928 (#2064)
* Added changes to handle object definition in questions
* Added change to ItemSet Module
---
.../stack-sunbird/templates/assessment-service_application.conf | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/ansible/roles/stack-sunbird/templates/assessment-service_application.conf b/ansible/roles/stack-sunbird/templates/assessment-service_application.conf
index 047221b7c..5fbc0d35a 100644
--- a/ansible/roles/stack-sunbird/templates/assessment-service_application.conf
+++ b/ansible/roles/stack-sunbird/templates/assessment-service_application.conf
@@ -107,7 +107,7 @@ play.modules {
# If there are any built-in modules that you want to disable, you can list them here.
#disabled += ""
- enabled += modules.ItemSetModule
+ enabled += modules.AssessmentModule
}
## IDE
From ba7300f8d2056212465e102bdb22e5256b0dfdd5 Mon Sep 17 00:00:00 2001
From: Harsha
Date: Wed, 2 Dec 2020 19:02:30 +0530
Subject: [PATCH 051/184] jenkinsfile and ansible playbook for nodebb UI
deployment (#2068)
* jenkinsfile and ansible playbook for nodebb UI deployment
---
ansible/nodebbui-upload.yml | 19 +++++++++
pipelines/deploy/NodebbUI/Jenkinsfile | 58 +++++++++++++++++++++++++++
2 files changed, 77 insertions(+)
create mode 100644 ansible/nodebbui-upload.yml
create mode 100644 pipelines/deploy/NodebbUI/Jenkinsfile
diff --git a/ansible/nodebbui-upload.yml b/ansible/nodebbui-upload.yml
new file mode 100644
index 000000000..92b484a58
--- /dev/null
+++ b/ansible/nodebbui-upload.yml
@@ -0,0 +1,19 @@
+- hosts: local
+ become: yes
+ gather_facts: no
+ vars_files:
+ - "{{inventory_dir}}/secrets.yml"
+ environment:
+ AZURE_STORAGE_ACCOUNT: "{{ sunbird_public_storage_account_name }}"
+ AZURE_STORAGE_SAS_TOKEN: "{{ sunbird_public_storage_account_sas }}"
+ tasks:
+ - name: delete batch
+ shell: |
+ azcopy rm "https://{{ sunbird_public_storage_account_name }}.blob.core.windows.net/{{ nodebbui_container_name }}{{sunbird_public_storage_account_sas}}" --recursive=true
+ async: 3600
+ poll: 10
+
+ - name: upload batch
+ command: "az storage blob upload-batch --destination {{ nodebbui_container_name }} --source {{ source_name }}"
+ async: 3600
+ poll: 10
diff --git a/pipelines/deploy/NodebbUI/Jenkinsfile b/pipelines/deploy/NodebbUI/Jenkinsfile
new file mode 100644
index 000000000..150a57f44
--- /dev/null
+++ b/pipelines/deploy/NodebbUI/Jenkinsfile
@@ -0,0 +1,58 @@
+@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') {
+ folder = new File("$WORKSPACE/.git")
+ if (folder.exists())
+ {
+ println "Found .git folder. Clearing it.."
+ sh'git clean -fxd'
+ }
+ 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)
+ values.put('artifact', artifact)
+ artifact_download(values)
+ }
+ stage('deploy artifact'){
+ sh """
+ unzip -o ${artifact} -d discussion-ui
+ """
+
+ ansiblePlaybook = "${currentWs}/ansible/nodebbui-upload.yml"
+ ansibleExtraArgs = "--extra-vars \"source_name=${currentWs}/discussion-ui\" --vault-password-file /var/lib/jenkins/secrets/vault-pass"
+ values.put('ansiblePlaybook', ansiblePlaybook)
+ values.put('ansibleExtraArgs', ansibleExtraArgs)
+ println values
+ ansible_playbook_run(values)
+
+ currentBuild.result = 'SUCCESS'
+ archiveArtifacts artifacts: "${artifact}", fingerprint: true, onlyIfSuccessful: true
+ archiveArtifacts artifacts: 'metadata.json', onlyIfSuccessful: true
+ currentBuild.description = "Artifact: ${values.artifact_version}, Private: ${params.private_branch}, Public: ${params.branch_or_tag}"
+ }
+ }
+ summary()
+ }
+ catch (err) {
+ currentBuild.result = 'FAILURE'
+ throw err
+ }
+ finally {
+ slack_notify(currentBuild.result)
+ email_notify()
+ }
+}
From d061da2d422dea4ff6210d7cf4864127a328e0ac Mon Sep 17 00:00:00 2001
From: Harsha
Date: Thu, 3 Dec 2020 11:48:53 +0530
Subject: [PATCH 052/184] mongodb changes for nodebb (#2069)
* mongodb changes for nodebb
* default value for mongodb host
---
ansible/inventory/env/group_vars/all.yml | 1 +
.../helm_charts/core/nodebb/templates/deployment.yaml | 7 +++----
kubernetes/helm_charts/core/nodebb/values.j2 | 2 +-
3 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/ansible/inventory/env/group_vars/all.yml b/ansible/inventory/env/group_vars/all.yml
index 65eb1db11..3012f6009 100644
--- a/ansible/inventory/env/group_vars/all.yml
+++ b/ansible/inventory/env/group_vars/all.yml
@@ -649,3 +649,4 @@ group_activity_agg_cache_enable: false
# nodebb variables
sunbird_nodebb_storage_key: "{{ core_vault_sunbird_nodebb_storage_key }}"
+mongo_nodebb_host: "{{ groups['mongo'] | join ',' }}"
diff --git a/kubernetes/helm_charts/core/nodebb/templates/deployment.yaml b/kubernetes/helm_charts/core/nodebb/templates/deployment.yaml
index 10e4c3825..ef395da3a 100644
--- a/kubernetes/helm_charts/core/nodebb/templates/deployment.yaml
+++ b/kubernetes/helm_charts/core/nodebb/templates/deployment.yaml
@@ -60,14 +60,13 @@ data:
{
"url": "{{ .Values.nodebb_url }}",
"secret": "100101",
- "database": "redis",
+ "database": "mongo",
"port": "4567",
"redis": {
- "host": "{{ .Values.redis_nodebb_host }}",
- "port": 6379,
+ "host": "{{ .Values.mongo_nodebb_host }}",
+ "port": 27017,
"username": "",
"password": "",
- "database": "0"
}
}
diff --git a/kubernetes/helm_charts/core/nodebb/values.j2 b/kubernetes/helm_charts/core/nodebb/values.j2
index b5cbc5fd9..1d7089ab1 100644
--- a/kubernetes/helm_charts/core/nodebb/values.j2
+++ b/kubernetes/helm_charts/core/nodebb/values.j2
@@ -24,4 +24,4 @@ strategy:
maxunavailable: {{ nodebb_maxunavailable|default('25%') }}
nodebb_url: {{ sunbird_nodebb_url }}
-redis_nodebb_host: {{ redis_nodebb_host }}
+mongo_nodebb_host: {{ mongo_nodebb_host }}
From 0fc16ac59133bfce6c13adb41c6ec807900a912d Mon Sep 17 00:00:00 2001
From: Keshav Prasad
Date: Thu, 3 Dec 2020 12:02:52 +0530
Subject: [PATCH 053/184] feat: TG-713 adding code to inject keys to portal
(#2070)
* feat: TG-508 dependency for injecting access keys
* fix: updating player deployment file
* fix: add KC public mount to portal
* fix: updated secret name
---
.../roles/deploy-player/tasks/main.yml | 31 ++++++++++++++++
.../core/player/templates/configmap.yaml | 22 ++++++------
.../core/player/templates/deployment.yaml | 36 +++++++++++++------
kubernetes/helm_charts/core/player/values.j2 | 2 ++
4 files changed, 70 insertions(+), 21 deletions(-)
diff --git a/kubernetes/ansible/roles/deploy-player/tasks/main.yml b/kubernetes/ansible/roles/deploy-player/tasks/main.yml
index fb4076534..5213285e5 100644
--- a/kubernetes/ansible/roles/deploy-player/tasks/main.yml
+++ b/kubernetes/ansible/roles/deploy-player/tasks/main.yml
@@ -32,9 +32,40 @@
- name: create configmap
shell: "kubectl create configmap player-config --from-env-file={{role_path}}/templates/{{ release_name }}.env -n {{namespace}} --dry-run -o=yaml | kubectl apply -f -"
+- name: Load role to decrypt private keys, copy to helm chart and encrypt private keys
+ include_role:
+ name: mount-keys
+ tasks_from: "{{outer_item.1}}"
+ vars:
+ private_key_path: "{{ outer_item.0.values_to_pass.basepath }}"
+ private_key_prefix: "{{ outer_item.0.values_to_pass.keyprefix }}"
+ private_key_sign_start: "{{ outer_item.0.values_to_pass.keystart }}"
+ private_key_sign_end: "{{ outer_item.0.values_to_pass.keycount if outer_item.0.values_to_pass.keycount > '0' else '0' }}"
+ when: release_name == "player"
+ with_subelements:
+ - "{{adminutil_access_values}}"
+ - role_to_run
+ loop_control:
+ loop_var: outer_item
+
+- name: Create the token pubic key file
+ copy:
+ dest: "{{ chart_path }}/keys/{{ adminutil_refresh_token_public_key_kid }}"
+ content: "{{ core_vault_sunbird_sso_publickey }}"
+ when: release_name == "player"
+
- name: helm install and upgrade
shell: helm upgrade --install --atomic --timeout 10m {{ release_name }} {{ chart_path }} -n {{namespace}}
+- name: Clean up keys
+ include_role:
+ name: mount-keys
+ tasks_from: "{{item}}"
+ when: release_name == "player"
+ with_items:
+ - remove-from-helm.yml
+ - remove-keys-from-inventory.yml
+
- name: Get the deployment rollout status
shell: "kubectl get deployments -A | grep -i {{ release_name }} | awk -F' ' '{print $3}' | awk -F/ '{if ($1 ~ $2){exit 0} else {exit 1}}'"
register: task_result
diff --git a/kubernetes/helm_charts/core/player/templates/configmap.yaml b/kubernetes/helm_charts/core/player/templates/configmap.yaml
index 557247253..37553c79c 100644
--- a/kubernetes/helm_charts/core/player/templates/configmap.yaml
+++ b/kubernetes/helm_charts/core/player/templates/configmap.yaml
@@ -1,11 +1,11 @@
-#apiVersion: v1
-#data:
-# {{- range $key, $val := .Values.playerenv }}
-# {{ $key }}: {{ default "''" $val }}
-# {{- end }}
-# sunbird_cassandra_replication_strategy: {{ .Values.sunbird_cassandra_replication_strategy | toJson }}
-#kind: ConfigMap
-#metadata:
-# creationTimestamp: null
-# name: {{ .Chart.Name }}-config
-# namespace: {{ .Values.namespace }}
+---
+{{- $keys := .Files.Glob "keys/*" }}
+{{ if $keys }}
+apiVersion: v1
+kind: Secret
+metadata:
+ name: player-access-keys
+type: Opaque
+data:
+{{ (.Files.Glob "keys/*").AsSecrets | indent 2 }}
+{{ end }}
diff --git a/kubernetes/helm_charts/core/player/templates/deployment.yaml b/kubernetes/helm_charts/core/player/templates/deployment.yaml
index e83cd8204..642ecf275 100644
--- a/kubernetes/helm_charts/core/player/templates/deployment.yaml
+++ b/kubernetes/helm_charts/core/player/templates/deployment.yaml
@@ -24,12 +24,6 @@ spec:
imagePullSecrets:
- name: {{ .Values.imagepullsecrets }}
{{- end }}
- {{- if .Values.sunbird_portal_player_cdn_enabled }}
- volumes:
- - name: player-cdn-config
- configMap:
- name: player-cdn-config
- {{- end }}
containers:
- name: {{ .Chart.Name }}
image: "{{ .Values.dockerhub }}/{{ .Values.repository }}:{{ .Values.image_tag }}"
@@ -46,14 +40,36 @@ spec:
{{ toYaml .Values.livenessProbe | indent 10 }}
readinessProbe:
{{ toYaml .Values.readinessProbe | indent 10 }}
- {{- end }}
- {{- if .Values.sunbird_portal_player_cdn_enabled }}
+{{- end }}
+{{- $keys := .Files.Glob "keys/*" }}
+{{- if or .Values.sunbird_portal_player_cdn_enabled $keys }}
volumeMounts:
+{{- end }}
+{{- if .Values.sunbird_portal_player_cdn_enabled }}
- name: player-cdn-config
mountPath: /home/sunbird/app_dist/dist/index_cdn.ejs
subPath: index_cdn.ejs
- {{- end }}
-
+{{- end }}
+{{- $keys := .Files.Glob "keys/*" }}
+{{- if $keys }}
+ - mountPath: {{ .Values.player_access_basepath }}
+ name: access-keys
+{{- end }}
+{{- $keys := .Files.Glob "keys/*" }}
+{{- if or .Values.sunbird_portal_player_cdn_enabled $keys }}
+ volumes:
+{{- end }}
+{{- if .Values.sunbird_portal_player_cdn_enabled }}
+ - name: player-cdn-config
+ configMap:
+ name: player-cdn-config
+{{- end }}
+{{- $keys := .Files.Glob "keys/*" }}
+{{- if $keys }}
+ - name: access-keys
+ secret:
+ secretName: player-access-keys
+{{- end }}
---
apiVersion: v1
kind: Service
diff --git a/kubernetes/helm_charts/core/player/values.j2 b/kubernetes/helm_charts/core/player/values.j2
index 7f83b5b08..c21f6302b 100644
--- a/kubernetes/helm_charts/core/player/values.j2
+++ b/kubernetes/helm_charts/core/player/values.j2
@@ -25,3 +25,5 @@ strategy:
sunbird_portal_player_cdn_enabled: {{sunbird_portal_player_cdn_enabled|lower}}
{{ player_liveness_readiness | to_nice_yaml }}
+
+player_access_basepath: {{ player_access_basepath | default('/home/sunbird/app_dist/keys/') }}
From d52b244a38d39649bed039a2edfddae0cf1aa6b6 Mon Sep 17 00:00:00 2001
From: Rhea Fernandes <32357913+rheafernandes@users.noreply.github.com>
Date: Thu, 3 Dec 2020 15:21:19 +0530
Subject: [PATCH 054/184] SC-1928 Onboarded Question and Question Set APIs
(#2065)
* SC-1928 Onboarded Question and Question Set APIs
* Added ingress configuration
* Added changes to handle external data
* Added changes to handle external data
* Onboarded update hierarchy api's
* Added expected changes
---
ansible/roles/kong-api/defaults/main.yml | 255 ++++++++++++++++++
.../assessment-service_application.conf | 4 +-
2 files changed, 258 insertions(+), 1 deletion(-)
diff --git a/ansible/roles/kong-api/defaults/main.yml b/ansible/roles/kong-api/defaults/main.yml
index 1c01c239f..4a365fed3 100644
--- a/ansible/roles/kong-api/defaults/main.yml
+++ b/ansible/roles/kong-api/defaults/main.yml
@@ -76,6 +76,8 @@ object_category_definition_prefix: /object/category/definition
dataset_service_prefix: /dataset
asset_prefix: /asset
collection_prefix: /collection
+question_prefix: /question
+questionset_prefix: /questionset
# Service URLs
@@ -95,6 +97,7 @@ report_service_url: "http://report-service:3030"
group_service_url: "http://groups-service:9000"
analytics_api_service_url: "http://analytics-service:9000"
taxonomy_service_url: "http://taxonomy-service:9000"
+assessment_service_url: "http://assessment-service:9000"
premium_consumer_rate_limits:
- api: createContent
@@ -5692,3 +5695,255 @@ kong_apis:
config.limit_by: credential
- name: request-size-limiting
config.allowed_payload_size: "{{ medium_request_size_limit }}"
+
+ - name: questionCreate
+ uris: "{{ question_prefix }}/v1/create"
+ upstream_url: "{{ assessment_service_url }}/question/v4/create"
+ strip_uri: true
+ plugins:
+ - name: jwt
+ - name: cors
+ - "{{ statsd_pulgin }}"
+ - name: acl
+ config.whitelist:
+ - 'contentCreate'
+ - name: rate-limiting
+ config.policy: local
+ config.hour: "{{ medium_rate_limit_per_hour }}"
+ config.limit_by: credential
+ - name: request-size-limiting
+ config.allowed_payload_size: "{{ medium_request_size_limit }}"
+
+ - name: questionRead
+ uris: "{{ question_prefix }}/v1/read"
+ upstream_url: "{{ assessment_service_url }}/question/v4/read"
+ strip_uri: true
+ plugins:
+ - name: jwt
+ - name: cors
+ - "{{ statsd_pulgin }}"
+ - name: acl
+ config.whitelist:
+ - 'contentAccess'
+ - name: rate-limiting
+ config.policy: local
+ config.hour: "{{ medium_rate_limit_per_hour }}"
+ config.limit_by: credential
+ - name: request-size-limiting
+ config.allowed_payload_size: "{{ medium_request_size_limit }}"
+
+ - name: questionUpdate
+ uris: "{{ question_prefix }}/v1/update"
+ upstream_url: "{{ assessment_service_url }}/question/v4/update"
+ strip_uri: true
+ plugins:
+ - name: jwt
+ - name: cors
+ - "{{ statsd_pulgin }}"
+ - name: acl
+ config.whitelist:
+ - 'contentUpdate'
+ - name: rate-limiting
+ config.policy: local
+ config.hour: "{{ medium_rate_limit_per_hour }}"
+ config.limit_by: credential
+ - name: request-size-limiting
+ config.allowed_payload_size: "{{ medium_request_size_limit }}"
+
+ - name: questionRetire
+ uris: "{{ question_prefix }}/v1/retire"
+ upstream_url: "{{ assessment_service_url }}/question/v4/retire"
+ strip_uri: true
+ plugins:
+ - name: jwt
+ - name: cors
+ - "{{ statsd_pulgin }}"
+ - name: acl
+ config.whitelist:
+ - 'contentAdmin'
+ - name: rate-limiting
+ config.policy: local
+ config.hour: "{{ medium_rate_limit_per_hour }}"
+ config.limit_by: credential
+ - name: request-size-limiting
+ config.allowed_payload_size: "{{ medium_request_size_limit }}"
+
+ - name: questionReview
+ uris: "{{ question_prefix }}/v1/review"
+ upstream_url: "{{ assessment_service_url }}/question/v4/review"
+ strip_uri: true
+ plugins:
+ - name: jwt
+ - name: cors
+ - "{{ statsd_pulgin }}"
+ - name: acl
+ config.whitelist:
+ - 'contentAdmin'
+ - name: rate-limiting
+ config.policy: local
+ config.hour: "{{ medium_rate_limit_per_hour }}"
+ config.limit_by: credential
+ - name: request-size-limiting
+ config.allowed_payload_size: "{{ medium_request_size_limit }}"
+
+ - name: questionPublish
+ uris: "{{ question_prefix }}/v1/publish"
+ upstream_url: "{{ assessment_service_url }}/question/v4/publish"
+ strip_uri: true
+ plugins:
+ - name: jwt
+ - name: cors
+ - "{{ statsd_pulgin }}"
+ - name: acl
+ config.whitelist:
+ - 'contentCreate'
+ - name: rate-limiting
+ config.policy: local
+ config.hour: "{{ medium_rate_limit_per_hour }}"
+ config.limit_by: credential
+ - name: request-size-limiting
+ config.allowed_payload_size: "{{ medium_request_size_limit }}"
+
+ - name: questionSetCreate
+ uris: "{{ questionset_prefix }}/v1/create"
+ upstream_url: "{{ assessment_service_url }}/questionset/v4/create"
+ strip_uri: true
+ plugins:
+ - name: jwt
+ - name: cors
+ - "{{ statsd_pulgin }}"
+ - name: acl
+ config.whitelist:
+ - 'contentCreate'
+ - name: rate-limiting
+ config.policy: local
+ config.hour: "{{ medium_rate_limit_per_hour }}"
+ config.limit_by: credential
+ - name: request-size-limiting
+ config.allowed_payload_size: "{{ medium_request_size_limit }}"
+
+ - name: questionSetRead
+ uris: "{{ questionset_prefix }}/v1/read"
+ upstream_url: "{{ assessment_service_url }}/questionset/v4/read"
+ strip_uri: true
+ plugins:
+ - name: jwt
+ - name: cors
+ - "{{ statsd_pulgin }}"
+ - name: acl
+ config.whitelist:
+ - 'contentAccess'
+ - name: rate-limiting
+ config.policy: local
+ config.hour: "{{ medium_rate_limit_per_hour }}"
+ config.limit_by: credential
+ - name: request-size-limiting
+ config.allowed_payload_size: "{{ medium_request_size_limit }}"
+
+ - name: questionSetUpdate
+ uris: "{{ questionset_prefix }}/v1/update"
+ upstream_url: "{{ assessment_service_url }}/questionset/v4/update"
+ strip_uri: true
+ plugins:
+ - name: jwt
+ - name: cors
+ - "{{ statsd_pulgin }}"
+ - name: acl
+ config.whitelist:
+ - 'contentUpdate'
+ - name: rate-limiting
+ config.policy: local
+ config.hour: "{{ medium_rate_limit_per_hour }}"
+ config.limit_by: credential
+ - name: request-size-limiting
+ config.allowed_payload_size: "{{ medium_request_size_limit }}"
+
+ - name: questionSetRetire
+ uris: "{{ questionset_prefix }}/v1/retire"
+ upstream_url: "{{ assessment_service_url }}/questionset/v4/retire"
+ strip_uri: true
+ plugins:
+ - name: jwt
+ - name: cors
+ - "{{ statsd_pulgin }}"
+ - name: acl
+ config.whitelist:
+ - 'contentAdmin'
+ - name: rate-limiting
+ config.policy: local
+ config.hour: "{{ medium_rate_limit_per_hour }}"
+ config.limit_by: credential
+ - name: request-size-limiting
+ config.allowed_payload_size: "{{ medium_request_size_limit }}"
+
+ - name: questionSetReview
+ uris: "{{ questionset_prefix }}/v1/review"
+ upstream_url: "{{ assessment_service_url }}/questionset/v4/review"
+ strip_uri: true
+ plugins:
+ - name: jwt
+ - name: cors
+ - "{{ statsd_pulgin }}"
+ - name: acl
+ config.whitelist:
+ - 'contentAdmin'
+ - name: rate-limiting
+ config.policy: local
+ config.hour: "{{ medium_rate_limit_per_hour }}"
+ config.limit_by: credential
+ - name: request-size-limiting
+ config.allowed_payload_size: "{{ medium_request_size_limit }}"
+
+ - name: questionSetPublish
+ uris: "{{ questionset_prefix }}/v1/publish"
+ upstream_url: "{{ assessment_service_url }}/questionset/v4/publish"
+ strip_uri: true
+ plugins:
+ - name: jwt
+ - name: cors
+ - "{{ statsd_pulgin }}"
+ - name: acl
+ config.whitelist:
+ - 'contentAdmin'
+ - name: rate-limiting
+ config.policy: local
+ config.hour: "{{ medium_rate_limit_per_hour }}"
+ config.limit_by: credential
+ - name: request-size-limiting
+ config.allowed_payload_size: "{{ medium_request_size_limit }}"
+
+ - name: questionSetUpdateHierarchy
+ uris: "{{ questionset_prefix }}/v1/hierarchy/update"
+ upstream_url: "{{ assessment_service_url }}/questionset/v4/hierarchy/update"
+ strip_uri: true
+ plugins:
+ - name: jwt
+ - name: cors
+ - "{{ statsd_pulgin }}"
+ - name: acl
+ config.whitelist:
+ - 'contentUpdate'
+ - name: rate-limiting
+ config.policy: local
+ config.hour: "{{ medium_rate_limit_per_hour }}"
+ config.limit_by: credential
+ - name: request-size-limiting
+ config.allowed_payload_size: "{{ medium_request_size_limit }}"
+
+ - name: questionSetReadHierarchy
+ uris: "{{ questionset_prefix }}/v1/hierarchy"
+ upstream_url: "{{ assessment_service_url }}/questionset/v4/hierarchy"
+ strip_uri: true
+ plugins:
+ - name: jwt
+ - name: cors
+ - "{{ statsd_pulgin }}"
+ - name: acl
+ config.whitelist:
+ - 'contentAccess'
+ - name: rate-limiting
+ config.policy: local
+ config.hour: "{{ medium_rate_limit_per_hour }}"
+ config.limit_by: credential
+ - name: request-size-limiting
+ config.allowed_payload_size: "{{ medium_request_size_limit }}"
\ No newline at end of file
diff --git a/ansible/roles/stack-sunbird/templates/assessment-service_application.conf b/ansible/roles/stack-sunbird/templates/assessment-service_application.conf
index 5fbc0d35a..16e226d91 100644
--- a/ansible/roles/stack-sunbird/templates/assessment-service_application.conf
+++ b/ansible/roles/stack-sunbird/templates/assessment-service_application.conf
@@ -376,4 +376,6 @@ kafka {
topic.send.enable : true
topics.instruction : "{{ env_name }}.learning.job.request"
}
-objectcategorydefinition.keyspace="{{ lp_cassandra_keyspace_prefix }}_category_store"
\ No newline at end of file
+objectcategorydefinition.keyspace="{{ lp_cassandra_keyspace_prefix }}_category_store"
+question.keyspace="{{ lp_cassandra_keyspace_prefix }}_question_store"
+questionset.keyspace="{{ lp_cassandra_keyspace_prefix }}_hierarchy_store"
\ No newline at end of file
From ce06614ab843f6440c52dfe27d435ace656f6877 Mon Sep 17 00:00:00 2001
From: Rajesh Rajendran
Date: Fri, 4 Dec 2020 04:18:41 +0000
Subject: [PATCH 055/184] Scripts to deploy discussionsmw service (#2063)
* Adding helm chart for discussionsmw
Signed-off-by: Rajesh Rajendran
* Adding env file for discussionsmw
* fix: configmap and livenessProbe
* fix: typo
Signed-off-by: Rajesh Rajendran
---
ansible/roles/stack-sunbird/defaults/main.yml | 43 ++++++++++----
.../sunbird_discussions-mw-service.env | 0
.../core/discussionsmw/.helmignore | 22 +++++++
.../helm_charts/core/discussionsmw/Chart.yaml | 5 ++
.../core/discussionsmw/templates/_helpers.tpl | 45 ++++++++++++++
.../discussionsmw/templates/configmap.yaml | 11 ++++
.../discussionsmw/templates/deployment.yaml | 59 +++++++++++++++++++
.../helm_charts/core/discussionsmw/values.j2 | 25 ++++++++
8 files changed, 199 insertions(+), 11 deletions(-)
create mode 100644 ansible/roles/stack-sunbird/templates/sunbird_discussions-mw-service.env
create mode 100644 kubernetes/helm_charts/core/discussionsmw/.helmignore
create mode 100644 kubernetes/helm_charts/core/discussionsmw/Chart.yaml
create mode 100644 kubernetes/helm_charts/core/discussionsmw/templates/_helpers.tpl
create mode 100644 kubernetes/helm_charts/core/discussionsmw/templates/configmap.yaml
create mode 100644 kubernetes/helm_charts/core/discussionsmw/templates/deployment.yaml
create mode 100644 kubernetes/helm_charts/core/discussionsmw/values.j2
diff --git a/ansible/roles/stack-sunbird/defaults/main.yml b/ansible/roles/stack-sunbird/defaults/main.yml
index 37e8e3485..cd27fce92 100644
--- a/ansible/roles/stack-sunbird/defaults/main.yml
+++ b/ansible/roles/stack-sunbird/defaults/main.yml
@@ -147,7 +147,7 @@ max_kafka_message_size: "5242880"
sunbird_gzip_enable: true
sunbird_analytics_blob_account_name:
sunbird_analytics_blob_account_key:
-sunbird_portal_player_cdn_enabled:
+sunbird_portal_player_cdn_enabled:
sunbird_portal_preview_cdn_url:
cdn_file_path:
sunbird_portal_cdn_blob_url:
@@ -211,7 +211,7 @@ proxy_replicas: 1
proxy_reservation_memory: 32M
proxy_limit_memory: 64M
nginx_per_ip_connection_limit: 400
-merge_proxy_server_name:
+merge_proxy_server_name:
proxy_prometheus: false
networks:
@@ -246,7 +246,7 @@ upstream_url: "ekstep-public-{{ekstep_s3_env}}.s3-ap-south-1.amazonaws.com"
plugin_upstream_url: "ekstep-public-{{ekstep_s3_env}}.s3-ap-south-1.amazonaws.com"
sunbird_offline_azure_storage_account_url: "{{ sunbird_public_storage_account_name }}.blob.core.windows.net/{{ offline_installer_container_name }}"
# Override this dictionary in your common.yaml
-proxy:
+proxy:
# repository: 'proxy'
# image_tag: 2.4.0
@@ -258,14 +258,14 @@ service_env:
learner:
- ../../../../ansible/roles/stack-sunbird/templates/sunbird_learner-service.env
- ../../../../ansible/roles/stack-sunbird/templates/learner-service_logback.xml
- lms:
+ lms:
- ../../../../ansible/roles/stack-sunbird/templates/sunbird_lms-service.env
- ../../../../ansible/roles/stack-sunbird/templates/lms-service_logback.xml
knowledgemw: ../../../../ansible/roles/stack-sunbird/templates/sunbird_knowledge-mw-service.env
apimanager: ../../../../ansible/roles/stack-api-manager/templates/api-manager.env
cert: ../../../../ansible/roles/stack-sunbird/templates/sunbird_cert-service.env
certregistry: ../../../../ansible/roles/stack-sunbird/templates/sunbird_cert-registry-service.env
- content:
+ content:
- ../../../../ansible/roles/stack-sunbird/templates/content-service_application.conf
- ../../../../ansible/roles/stack-sunbird/templates/content-service_logback.xml
assessment:
@@ -277,18 +277,19 @@ service_env:
userorg: ../../../../ansible/roles/stack-sunbird/templates/sunbird_user-org-service.env
player: ../../../../ansible/roles/stack-sunbird/templates/sunbird_player.env
print: ../../../../ansible/roles/stack-sunbird/templates/sunbird_print-service.env
- search:
+ search:
- ../../../../ansible/roles/stack-sunbird/templates/search-service_application.conf
- ../../../../ansible/roles/stack-sunbird/templates/search-service_logback.xml
- taxonomy:
+ taxonomy:
- ../../../../ansible/roles/stack-sunbird/templates/taxonomy-service_application.conf
- ../../../../ansible/roles/stack-sunbird/templates/taxonomy-service_logback.xml
report: ../../../../ansible/roles/stack-sunbird/templates/sunbird_report-service.env
telemetry-dp-logstash: ../../../../ansible/roles/stack-sunbird/templates/telemetry-logstash-datapipeline.conf
nodebb: ../../../../ansible/roles/stack-sunbird/templates/sunbird_nodebb.env
analytics: ../../../../ansible/roles/stack-sunbird/templates/analytics_api_service.conf
+ discussionsmw: ../../../../ansible/roles/stack-sunbird/templates/sunbird_discussions-mw-service.env
-sunbird_portal_player_cdn_enabled: false
+sunbird_portal_player_cdn_enabled: false
########### stack-apimanager defaults vars ##### for kubernetes #########
kong_database: postgres
@@ -381,7 +382,7 @@ assessment_liveness_readiness:
failureThreshold: 5
cert_liveness_readiness:
- healthcheck: true
+ healthcheck: true
readinessProbe:
httpGet:
path: /service/health
@@ -541,7 +542,7 @@ player_liveness_readiness:
failureThreshold: 5
print_liveness_readiness:
- healthcheck: true
+ healthcheck: true
readinessProbe:
httpGet:
path: /health
@@ -599,6 +600,26 @@ userorg_liveness_readiness:
timeoutSeconds: 10
failureThreshold: 5
+discussionsmw_liveness_readiness:
+ healthcheck: true
+ readinessProbe:
+ httpGet:
+ path: /health
+ port: 3002
+ initialDelaySeconds: 30
+ periodSeconds: 30
+ timeoutSeconds: 10
+ failureThreshold: 5
+ successThreshold: 2
+ livenessProbe:
+ httpGet:
+ path: /health
+ port: 3002
+ initialDelaySeconds: 30
+ periodSeconds: 30
+ timeoutSeconds: 10
+ failureThreshold: 5
+
search_liveness_readiness:
healthcheck: true
readinessProbe:
@@ -751,7 +772,7 @@ report_config: "{{ env_name }}_report_config"
job_request: "{{ env_name }}_job_request"
experiment_definition: "{{ env_name }}_experiment_definition"
-#### Exhuats API consumer
+#### Exhuats API consumer
exhaust_api_consumer_ids: ["273f3b18-5dda-4a27-984a-060c7cd398d3"] # being used in analytics api to access the analytics exhaust api
user_profile_read_url: "http://learner-service:9000/v1/user/read/" # being used in analytics api to get user details
diff --git a/ansible/roles/stack-sunbird/templates/sunbird_discussions-mw-service.env b/ansible/roles/stack-sunbird/templates/sunbird_discussions-mw-service.env
new file mode 100644
index 000000000..e69de29bb
diff --git a/kubernetes/helm_charts/core/discussionsmw/.helmignore b/kubernetes/helm_charts/core/discussionsmw/.helmignore
new file mode 100644
index 000000000..50af03172
--- /dev/null
+++ b/kubernetes/helm_charts/core/discussionsmw/.helmignore
@@ -0,0 +1,22 @@
+# Patterns to ignore when building packages.
+# This supports shell glob matching, relative path matching, and
+# negation (prefixed with !). Only one pattern per line.
+.DS_Store
+# Common VCS dirs
+.git/
+.gitignore
+.bzr/
+.bzrignore
+.hg/
+.hgignore
+.svn/
+# Common backup files
+*.swp
+*.bak
+*.tmp
+*~
+# Various IDEs
+.project
+.idea/
+*.tmproj
+.vscode/
diff --git a/kubernetes/helm_charts/core/discussionsmw/Chart.yaml b/kubernetes/helm_charts/core/discussionsmw/Chart.yaml
new file mode 100644
index 000000000..bdb14d7af
--- /dev/null
+++ b/kubernetes/helm_charts/core/discussionsmw/Chart.yaml
@@ -0,0 +1,5 @@
+apiVersion: v1
+appVersion: "1.0"
+description: A Helm chart for Kubernetes
+name: discussionsmw
+version: 0.1.0
diff --git a/kubernetes/helm_charts/core/discussionsmw/templates/_helpers.tpl b/kubernetes/helm_charts/core/discussionsmw/templates/_helpers.tpl
new file mode 100644
index 000000000..4dda28416
--- /dev/null
+++ b/kubernetes/helm_charts/core/discussionsmw/templates/_helpers.tpl
@@ -0,0 +1,45 @@
+{{/* vim: set filetype=mustache: */}}
+{{/*
+Expand the name of the chart.
+*/}}
+{{- define "content.name" -}}
+{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}}
+{{- end -}}
+
+{{/*
+Create a default fully qualified app name.
+We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).
+If release name contains chart name it will be used as a full name.
+*/}}
+{{- define "content.fullname" -}}
+{{- if .Values.fullnameOverride -}}
+{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}}
+{{- else -}}
+{{- $name := default .Chart.Name .Values.nameOverride -}}
+{{- if contains $name .Release.Name -}}
+{{- .Release.Name | trunc 63 | trimSuffix "-" -}}
+{{- else -}}
+{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}}
+{{- end -}}
+{{- end -}}
+{{- end -}}
+
+{{/*
+Create chart name and version as used by the chart label.
+*/}}
+{{- define "content.chart" -}}
+{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}}
+{{- end -}}
+
+{{/*
+Common labels
+*/}}
+{{- define "content.labels" -}}
+app.kubernetes.io/name: {{ include "content.name" . }}
+helm.sh/chart: {{ include "content.chart" . }}
+app.kubernetes.io/instance: {{ .Release.Name }}
+{{- if .Chart.AppVersion }}
+app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
+{{- end }}
+app.kubernetes.io/managed-by: {{ .Release.Service }}
+{{- end -}}
diff --git a/kubernetes/helm_charts/core/discussionsmw/templates/configmap.yaml b/kubernetes/helm_charts/core/discussionsmw/templates/configmap.yaml
new file mode 100644
index 000000000..e86595441
--- /dev/null
+++ b/kubernetes/helm_charts/core/discussionsmw/templates/configmap.yaml
@@ -0,0 +1,11 @@
+#apiVersion: v1
+#data:
+# {{- range $key, $val := .Values.knowledgemwenv }}
+# {{ $key }}: {{ $val }}
+# {{- end }}
+# sunbird_cassandra_replication_strategy: {{ .Values.sunbird_cassandra_replication_strategy | toJson }}
+#kind: ConfigMap
+#metadata:
+# creationTimestamp: null
+# name: {{ .Chart.Name }}-config
+# namespace: {{ .Values.namespace }}
diff --git a/kubernetes/helm_charts/core/discussionsmw/templates/deployment.yaml b/kubernetes/helm_charts/core/discussionsmw/templates/deployment.yaml
new file mode 100644
index 000000000..7cfc8ef45
--- /dev/null
+++ b/kubernetes/helm_charts/core/discussionsmw/templates/deployment.yaml
@@ -0,0 +1,59 @@
+---
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: {{ .Chart.Name }}
+ namespace: {{ .Values.namespace }}
+ annotations:
+ reloader.stakater.com/auto: "true"
+spec:
+ replicas: {{ .Values.replicaCount }}
+ strategy:
+ rollingUpdate:
+ maxSurge: {{ .Values.strategy.maxsurge }}
+ maxUnavailable: {{ .Values.strategy.maxunavailable }}
+ selector:
+ matchLabels:
+ app: {{ .Chart.Name }}
+ template:
+ metadata:
+ labels:
+ app: {{ .Chart.Name }}
+ spec:
+{{- if .Values.imagepullsecrets }}
+ imagePullSecrets:
+ - name: {{ .Values.imagepullsecrets }}
+{{- end }}
+ containers:
+ - name: {{ .Chart.Name }}
+ image: "{{ .Values.dockerhub }}/{{ .Values.repository }}:{{ .Values.image_tag }}"
+ imagePullPolicy: Always
+ envFrom:
+ - configMapRef:
+ name: discussionsmw-config
+ resources:
+{{ toYaml .Values.resources | indent 10 }}
+ ports:
+ - containerPort: {{ .Values.network.port }}
+ {{- if .Values.healthcheck }}
+ livenessProbe:
+{{ toYaml .Values.livenessProbe | indent 10 }}
+ readinessProbe:
+{{ toYaml .Values.readinessProbe | indent 10 }}
+ {{- end }}
+
+---
+apiVersion: v1
+kind: Service
+metadata:
+ name: disussionsmw-service
+ namespace: {{ .Values.namespace }}
+ labels:
+ app: {{ .Chart.Name }}
+spec:
+ ports:
+ - name: http-{{ .Chart.Name }}
+ protocol: TCP
+ port: {{ .Values.network.targetport }}
+ selector:
+ app: {{ .Chart.Name }}
diff --git a/kubernetes/helm_charts/core/discussionsmw/values.j2 b/kubernetes/helm_charts/core/discussionsmw/values.j2
new file mode 100644
index 000000000..220b22d58
--- /dev/null
+++ b/kubernetes/helm_charts/core/discussionsmw/values.j2
@@ -0,0 +1,25 @@
+### Default variable file for disussions_mw service ###
+
+namespace: {{ namespace }}
+imagepullsecrets: {{ imagepullsecrets }}
+dockerhub: {{ dockerhub }}
+
+replicaCount: {{disussions_mw_replicacount|default(1)}}
+repository: {{disussions_mw_repository|default('discussion-middleware')}}
+image_tag: {{ image_tag }}
+resources:
+ requests:
+ cpu: {{disussions_mw_cpu_req|default('100m')}}
+ memory: {{disussions_mw_mem_req|default('100Mi')}}
+ limits:
+ cpu: {{disussions_mw_cpu_limit|default('1')}}
+ memory: {{disussions_mw_mem_limit|default('1024Mi')}}
+network:
+ port: 3002
+ targetport: 3002
+strategy:
+ type: RollingUpdate
+ maxsurge: {{ disussions_mw_maxsurge|default('25%') }}
+ maxunavailable: {{ disussions_mw_maxunavailable|default('25%') }}
+
+{{ discussionsmw_liveness_readiness | to_nice_yaml }}
From 87f27689dbd086e5256e7c7075369338f982d423 Mon Sep 17 00:00:00 2001
From: Rajeev Sathish
Date: Fri, 4 Dec 2020 17:12:45 +0530
Subject: [PATCH 056/184] Issue #SB-21908 language changes (#2072)
---
utils/portal/labels/all_labels_as.json | 1 +
utils/portal/labels/all_labels_bn.json | 1 +
utils/portal/labels/all_labels_en.json | 1 +
utils/portal/labels/all_labels_gu.json | 1 +
utils/portal/labels/all_labels_hi.json | 1 +
utils/portal/labels/all_labels_kn.json | 1 +
utils/portal/labels/all_labels_ml.json | 1 +
utils/portal/labels/all_labels_mr.json | 1 +
utils/portal/labels/all_labels_or.json | 1 +
utils/portal/labels/all_labels_ta.json | 1 +
utils/portal/labels/all_labels_te.json | 1 +
utils/portal/labels/all_labels_ur.json | 1 +
12 files changed, 12 insertions(+)
create mode 100644 utils/portal/labels/all_labels_as.json
create mode 100644 utils/portal/labels/all_labels_bn.json
create mode 100644 utils/portal/labels/all_labels_en.json
create mode 100644 utils/portal/labels/all_labels_gu.json
create mode 100644 utils/portal/labels/all_labels_hi.json
create mode 100644 utils/portal/labels/all_labels_kn.json
create mode 100644 utils/portal/labels/all_labels_ml.json
create mode 100644 utils/portal/labels/all_labels_mr.json
create mode 100644 utils/portal/labels/all_labels_or.json
create mode 100644 utils/portal/labels/all_labels_ta.json
create mode 100644 utils/portal/labels/all_labels_te.json
create mode 100644 utils/portal/labels/all_labels_ur.json
diff --git a/utils/portal/labels/all_labels_as.json b/utils/portal/labels/all_labels_as.json
new file mode 100644
index 000000000..78da1f654
--- /dev/null
+++ b/utils/portal/labels/all_labels_as.json
@@ -0,0 +1 @@
+{"dflt":{"nontrk":{"frmelmnts":{"btn":{"create":"প্ৰস্তুত কৰক"},"lbl":{"ActivityTextbooks":"কার্য্যসমূহ","ACTIVITY_TEXTBOOK_TITLE":"কার্য্যসমূহ","chapter":"শিক্ষণৰ ম’ডিউল","collection_task":"কার্য্যসমূহ","desktop":{"download":"ডাউনল'ড","downloadBook":"ডাউনল'ড","find_more":"অধিক বিষয়বস্তু বিচাৰক","find_more_tasks":"অধিক বিষয়বস্তু বিচাৰক","update":"আপডেট কৰক","updateTextbook":"আপডেট কৰক"},"downloadBooks":"অফলাইন অৱস্থাত প্ৰৱেশাধিকাৰ পাবলৈ ডাউনল’ড কৰক","downloadoffline":"অফলাইন অৱস্থাত প্ৰৱেশাধিকাৰ পাবলৈ ডাউনল’ড কৰক","download_to_access_offline":"অফলাইন অৱস্থাত প্ৰৱেশাধিকাৰ পাবলৈ ডাউনল’ড কৰক","fromTheLearningTask":"শিক্ষণ কার্য্যৰ পৰা","fromTheTextBook":"শিক্ষণ কার্য্যৰ পৰা","import":"অফলাইন অৱস্থাত প্ৰৱেশাধিকাৰ পাবলৈ ডাউনল’ড কৰক","learningmodule":"শিক্ষণৰ ম’ডিউল","mynotebook":"মোৰ টোকাবহী","noBookfoundButtonText":"অধিক চাওক","noBookfoundSubTitle":"আপোনাৰ ব’ৰ্ডত এতিয়াও বিষয়বস্তু সংযোজন কৰিবলৈ আছে। {instance} ত থকা অধিক বিষয়বস্তু চাবলৈ এই বাটনটো টিপক","noBookfoundTitle":"ব’ৰ্ডে বিষয়বস্তু সংযোজন কৰি আছে","noTaskfoundSubTitle":"আপোনাৰ ব’ৰ্ডত এতিয়াও বিষয়বস্তু সংযোজন কৰিবলৈ আছে। {instance} ত থকা অধিক বিষয়বস্তু চাবলৈ এই বাটনটো টিপক","noTaskfoundTitle":"ব’ৰ্ডে বিষয়বস্তু সংযোজন কৰি আছে","seemore":"অধিক চাওক","task":"কার্য্যসমূহ","tasks":"কার্য্যসমূহ","task_title":"কার্য্যসমূহ","textbooks":"কার্য্যসমূহ"}},"messages":{"stmsg":{"m0125":"বিষয়বস্তু প্ৰস্তুত বা আপল’ড কৰা আৰম্ভ কৰক। বৰ্তমান আপোনাৰ খচৰা হিচাপে ছে’ভ কৰি থোৱা কোনো বিষয়বস্তু নাই","ms0001":"বিষয়বস্তু প্ৰস্তুত বা আপল’ড কৰা আৰম্ভ কৰক। বৰ্তমান আপোনাৰ খচৰা হিচাপে ছে’ভ কৰি থোৱা কোনো বিষয়বস্তু নাই"}}},"trk":{"completed_learning":"শিক্ষণ সম্পূৰ্ণ হ’ল","essages":{"fmsg":{"m0082":"এই শিক্ষণ কার্য্যটো এতিয়ালৈকে মুকলি হোৱা নাই। আপুনি ইয়াত যোগদান কৰিব নোৱাৰে"}},"frmelmnts":{"btn":{"create":"প্ৰস্তুত কৰক","enroll":"যোগদান কৰক","resumecourse":"পুনৰ আৰম্ভ কৰক","unenroll":"ত্যাগ কৰক","viewcoursestats":"শব্দ লেখ চাওক","viewCourseStatsDashboard":"ডেছব’ৰ্ড চাওক"},"instn":{"t0062":"এই কার্য্যটোৰ বাবে আপুনি এতিয়ালৈকে কোনো বেটছ প্ৰস্তুত কৰা নাই। এটা কার্য্য প্ৰস্তুত কৰক আৰু ডেছব’ৰ্ড পৰীক্ষা কৰক","t0063":"আপুনি এতিয়ালৈকে কোনো কার্য্য প্ৰস্তুত কৰা নাই। এটা নতুন কার্য্য প্ৰস্তুত কৰক আৰু ডেছব’ৰ্ড পুনৰ পৰীক্ষা কৰক"},"lbl":{"accessCourse":"শিক্ষণৰ সামগ্ৰীৰ প্ৰৱেশাধিকাৰ লাভ কৰক","accessToLogin":"এই বিষয়বস্তুৰ প্ৰৱেশাধিকাৰ লাভ কৰিবলৈ, আপুনি লগ ইন কৰিব লাগিব আৰু কার্য্যটোত যোগদান কৰিব লাগিব","ActivityCourses":"কার্য্যসমূহ","ACTIVITY_COURSE_TITLE":"কার্য্যসমূহ","addCourse":"সংযোজন কৰক","completedCourse":"সম্পূৰ্ণ হোৱা কাৰ্যসমূহ","completingCourseSuccessfully":"শিক্ষণ সফলতাৰে সম্পূৰ্ণ কৰাৰ কাৰণে,","copyAsCourse":"শিক্ষণ সামগ্ৰী হিচাপে প্ৰতিলিপি কৰক","courseContainCertificate":"এই শিক্ষণে আপোনালৈ এখন প্ৰমাণপত্ৰ আগবঢ়ায়","courseDetails":"শিক্ষণৰ সবিশেষ","courseProgress":"অগ্রগতি","courseRelevantFor":"এই শিক্ষণ এইসকলৰ বাবে প্ৰাসংগিক:","courses":"কার্য্যসমূহ","coursestructure":"শিক্ষণৰ ম’ডিউল","courseSuccessMessage":"আপুনি আপোনাৰ শিক্ষণ সফলতাৰে সম্পূর্ণ কৰিলে","courseSuccessNotificationMessage":"আপোনাৰ পঞ্জীকৃত যোগাযোগ সবিশেষত আপোনাৰ প্ৰমাণপত্ৰৰ বিষয়ে ৭ দিনৰ ভিতৰত আপোনাক জনোৱা হ’ব","courseWithoutCertificateNote":"টোকা: এই শিক্ষণে আপোনাক কোনো প্ৰমাণপত্ৰ প্ৰদান নকৰে","dashboardnocourseselected":"কোনো বাছনি কৰা হোৱা নাই","dashboardnocourseselecteddesc":"তালিকা খনৰ পৰা বাছি লওঁক","downloadCourseQRCode":"কিউ আৰ কোড ডাউনল'ড কৰক","downloadQRCode":{"tooltip":"ক্লিক কৰি কিউ আৰ কোড বিলাক ডাউনল'ড কৰক আৰু সিহতক প্ৰকাশিত পাঠ্য়ক্ৰমৰ লগত লিংক কৰক"},"getUnlimitedAccess":"আপোনাৰ মোবাইল ফোনত পাঠ্যপুথি, টিভি শ্ৰেণী আৰু পাঠ্যক্ৰমসমূহৰ অসীমিত অফলাইন প্ৰৱেশাধিকাৰ লাভ কৰক।","joinTrainingToAcessContent":"এই বিষয়বস্তুত প্ৰৱেশ কৰিবলৈ, আপুনি লগ ইন কৰিব লাগিব আৰু কাৰ্যটোত যোগদান কৰিব লাগিব","moduleFinish":"আপুনি এই কার্য্য সম্পূৰ্ণ কৰিলে","moduleProgress":"কার্য্যৰ অগ্ৰগতি","mytrainings":"মোৰ কার্য্যসমূহ","nextModule":"পৰৱৰ্তী কার্য্য","oneCourse":"কার্য্য","prevModule":"পূৰ্বৰ কার্য্য","returnToCourses":"পিছুৱাই যাওক","sectionTitle":"কার্য্যসমূহ","selectChapter":"কার্য্য বাছি লওক","selectContentFromCourse":"বিষয়বস্তু বাছনি কৰক","trainingAttended":"উপস্থিত থকা শিক্ষণ","courseDontContainCertificate":"বৰ্তমান, এই শিক্ষণ কার্য্যৰ কোনো প্ৰমাণপত্ৰ নাই। কার্য্যটোৰ প্ৰস্তুতকৰ্তাই পাছত এখন প্ৰমাণপত্ৰ সংলগ্ন কৰিব পাৰে।"},"tab":{"courses":"কার্য্যসমূহ"}},"messages":{"dashboard":{"emsg":{"m002":"ব্যৱহাৰকাৰীয়ে এই শিক্ষণ কাৰ্যৰ বাবে কোনো বেটছত যোগদান কৰা নাই"}},"emsg":{"m0002":"এই শিক্ষণ কার্য্য আৰু উপলব্ধ নহয়","m0003":"এই শিক্ষণ কার্য্যৰ কোনো মুকলি বেটছ্ নাই"},"fmsg":{"dataSettingNotSubmitted":"প্ৰ’ফাইল ভাগবতৰাৰ ছেটিংছ আপডেট কৰিব পৰা নাই। পাছত পুনৰ চেষ্টা কৰক","m0001":"দুঃখিত ! আমি আপোনাৰ নামভৰ্তি হোৱা শিক্ষণ কার্য্যৰ তথ্য লাভ কৰিব পৰা নাই। পাছত পুনৰ চেষ্টা কৰক","m0002":"দুঃখিত ! আমি আপোনাৰ বাবে অন্য শিক্ষণ কার্য্য বিচাৰি পোৱা নাই। পাছত পুনৰ চেষ্টা কৰক","m0086":"এই বিষয়বস্তু আৰু উপলব্ধ নহয়"},"imsg":{"m0001":"এই বিষয়বস্তুটো অনুপযুক্ত হিচাপে উঠাই দিয়া হৈছে। এইটো বৰ্তমান নিৰীক্ষণৰ অধীনত","m0026":"নমস্কাৰ, এই বিষয়বস্তু বৰ্তমান উপলব্ধ নহয়। সম্ভৱতঃ ইয়াক পৰিৱৰ্তন কৰি থকা হৈছে"},"stmsg":{"m0125":"বিষয়বস্তু প্ৰস্তুত বা আপল’ড কৰা আৰম্ভ কৰক। বৰ্তমান আপুনি কোনো খচৰা বিষয়বস্তু ছে’ভ কৰি থোৱা নাই"}}}},"crs":{"nontrk":{"frmelmnts":{"lbl":{"ActivityTextbooks":"পাঠ্যক্ৰমসমুহ","ACTIVITY_TEXTBOOK_TITLE":"পাঠ্যক্ৰমসমূহ","chapter":"পাঠ্যক্ৰমৰ মডিউল","desktop":{"downloadBook":"পাঠ্যক্ৰম ডাউনল’ড কৰক","find_more":"{instance}ত অধিক পাঠ্যক্ৰম আৰু সম্পৰ্কীয় বিষয়বস্তু বিচাৰক","updateTextbook":"পাঠ্যক্ৰম আপডেট কৰক"},"downloadBooks":"অফলাইন হৈ থকা অৱস্থাত প্ৰৱেশাধিকাৰ পাবৰ বাবে পাঠ্যক্ৰমসমূহ ডাউনল’ড কৰক","fromTheTextBook":"পাঠ্যক্ৰমটোৰ পৰা","noBookfoundTitle":"ব’ৰ্ডে পাঠ্যক্ৰমসমূহ সংযোজন কৰি আছে","textbooks":"পাঠ্যক্ৰমসমূহ"}}},"trk":{"completedCourse":"পাঠ্যক্ৰম সম্পূৰ্ণ হ’ল","frmelmnts":{"btn":{"createCourse":"পাঠ্যক্ৰম প্ৰস্তুত কৰক","enroll":"পাঠ্যক্ৰমত যোগদান কৰক","resumecourse":"পাঠ্যক্ৰম পুনৰ আৰম্ভ কৰক","unenroll":"পাঠ্যক্ৰম ত্যাগ কৰক","viewcoursestats":"পাঠ্যক্ৰমৰ ডাটা শব্দ লেখ চাওক","viewCourseStatsDashboard":"পাঠ্যক্ৰমৰ ডেচব'ৰ্ড দর্শন কৰক"},"instn":{"t0062":"আপুনি এই পাঠ্যক্ৰমৰ বাবে এতিয়ালৈকে এটা বেটছ্ গঠন কৰা নাই। নতুন বেটছ্ গঠন কৰক আৰু ডেছব’ৰ্ড পুনৰ পৰীক্ষা কৰক।","t0063":"আপুনি এতিয়ালৈকে একো পাঠ্যক্ৰম তৈয়াৰ কৰা নাই। এটা নতুন পাঠ্যক্ৰম তৈয়াৰ কৰক আৰু আকৌ ডেছব’ৰ্ড পৰীক্ষণ কৰক।"},"lbl":{"accessCourse":"পাঠ্যক্ৰমত প্ৰৱেশ লাভ কৰক","accessToLogin":"পাঠ্যক্ৰমৰ প্ৰৱেশযোগ্যতা লাভ কৰিবলৈ আপুনি লগ ইন কৰিব লাগিব আৰু পাঠ্যক্ৰমত যোগদান কৰিব লাগিব","ActivityCourses":"পাঠ্যক্ৰমসমূহ","ACTIVITY_COURSE_TITLE":"পাঠ্যক্ৰমসমূহ","addCourse":"পাঠ্যক্ৰম যোগ কৰক","completedCourse":"পাঠ্যক্ৰম সম্পূৰ্ণ হ’ল","completingCourseSuccessfully":"পাঠ্যক্ৰম সফলতাৰে সম্পূৰ্ণ কৰাৰ কাৰণে,","copyAsCourse":"পাঠ্যক্ৰম হিচাপে প্ৰতিলিপি কৰক","courseContainCertificate":"এইটো এটা প্ৰমাণপত্ৰ থকা পাঠ্যক্ৰম","courseDetails":"পাঠ্যক্ৰমৰ সবিশেষ","courseDontContainCertificate":"বৰ্তমান, এই পাঠ্যক্ৰমৰ কোনো প্ৰমাণপত্ৰ নাই। পাঠ্যক্ৰমৰ প্ৰস্তুতকৰ্তাই পাছত এখন প্ৰমাণপত্ৰ সংলগ্ন কৰিব পাৰে ।","courseLastUpdatedOn":"ত পাঠ্যক্ৰম শেহতীয়াকৈ আপডেট কৰা হৈছিল","courseProgress":"পাঠ্যক্ৰমৰ অগ্ৰগতি","courseRelevantFor":"এই পাঠ্যক্ৰমটো এইসকলৰ বাবে প্ৰাসংগিক:","courses":"পাঠ্যক্ৰমসমূহ","coursestructure":"পাঠ্যক্ৰমৰ মডিউলসমূহ","courseSuccessMessage":"আপুনি এই পাঠ্যক্ৰম সফলতাৰে সম্পূর্ণ কৰিলে","courseSuccessNotificationMessage":"আপোনাৰ পঞ্জীকৃত যোগাযোগ সবিশেষত আপোনাৰ প্ৰমাণপত্ৰৰ বিষয়ে ৭ দিনৰ ভিতৰত আপোনাক জনোৱা হ’ব","courseWithoutCertificateNote":"টোকা: এই পাঠ্যক্ৰমৰ কোনো প্ৰমাণপত্ৰ নাই","dashboardnocourseselected":"কোনো পাঠ্যক্ৰম নির্বাচিত নহ’ল","dashboardnocourseselecteddesc":"তালিকা খনৰপৰা এটা পাঠ্যক্ৰম বাছনি কৰক","downloadCourseQRCode":"পাঠ্যক্ৰমৰ কিউ আৰ ক’ড ডাউনল'ড কৰক","downloadQRCode":{"tooltip":"কিউ আৰ ক’ডবিলাক ডাউনল'ড কৰিবলৈ ক্লিক কৰক আৰু সেইসমূহক প্ৰকাশিত পাঠ্যক্ৰমৰ লগত লিংক কৰক"},"enrollcourse":"পাঠ্যক্ৰমত যোগদান কৰক","getUnlimitedAccess":"আপোনাৰ মোবাইল ফোনত পাঠ্যপুথি, পাঠ আৰু পাঠ্যক্ৰমসমূহৰ অসীমিত অফলাইন প্ৰৱেশাধিকাৰ লাভ কৰক।","joinTrainingToAcessContent":"বিষয়বস্তুৰ সম্পূৰ্ণ প্ৰৱেশাধিকাৰ লাভ কৰিবলৈ আপুনি পাঠ্যক্ৰমত যোগদান কৰিবই লাগিব।","moduleFinish":"আপুনি এই অধ্যায় সমাপ্ত কৰিলে","moduleProgress":"মডিউলৰ অগ্ৰগতি","mytrainings":"মোৰ পাঠ্যক্ৰমসমূহ","nextModule":"পৰৱৰ্তী মডিউল","oneCourse":"পাঠ্যক্ৰম","prevModule":"পূৰ্বৰ মডিউল","returnToCourses":"পাঠ্যক্ৰমসমূহলৈ ঘূৰি যাওক","sectionTitle":"পাঠ্যক্ৰমসমূহ","selectChapter":"মডিউল বাছনি কৰক","selectContentFromCourse":"পাঠ্যক্ৰমৰ বাবে বিষয়বস্তু বাছনি কৰক","signinenrollTitle":"এই পাঠ্যক্ৰমটোত যোগদান কৰিবলৈ লগ ইন কৰক","trainingAttended":"উপস্থিত থকা পাঠ্যক্ৰম সমূহ","userName":"ব্যৱহাৰকাৰীৰ নাম"},"tab":{"courses":"পাঠ্যক্ৰমসমূহ"}},"messages":{"dashboard":{"emsg":{"m002":"ব্যৱহাৰকাৰী এই পাঠ্যক্ৰমৰ কোনো বেটছত তালিকাভুক্ত হোৱা নাই"}},"emsg":{"m0002":"পাঠ্যক্ৰমটো বৰ্তমান উপলব্ধ নহয়","m0003":"এই পাঠ্যক্ৰমৰ কোনো মুকলি বেটছ্ নাই"},"fmsg":{"m0001":"গ্ৰাহকীভুক্ত হোৱা পাঠ্যক্ৰমবোৰ আমদানি কৰাত বিফলতা,পাছত পুনৰ চেষ্টা কৰক","m0002":"অন্য পাঠ্যক্ৰমবোৰ বিচাৰি পাব পৰা হোৱা নাই, পাছত পুনৰ চেষ্টা কৰক...","m0082":"এই পাঠ্যক্ৰমটো গ্ৰাহকীভুক্ত হোৱাৰ বাবে মুকলি হোৱা নাই","m0086":"এই পাঠ্যক্ৰমটো লেখকৰদ্বাৰা প্ৰত্যাহাৰ কৰা হৈছে আৰু গতিকে ই কোনোপধ্যেই উপলব্ধ নহ’ব"},"imsg":{"m0001":"এই পাঠ্যক্ৰমটো উপযুক্ত নহয় বুলি চিহ্নিত কৰা হৈছে আৰু বৰ্তমান পুনৰীক্ষণ পৰ্যায়ত আছে।","m0026":"এই পাঠ্যক্ৰম বৰ্তমান উপলব্ধ নহয়। প্ৰস্তুতকৰ্তাই এই পাঠ্যক্ৰমৰ কিছুমান সালসলনি কৰিছে বাবে সম্ভৱ এনে হৈছে।"},"stmsg":{"m0125":"ৰিছ’ৰ্চ, কিতাপ, পাঠ্যক্ৰম প্ৰস্তুত , সংগ্ৰহ নতুবা আপল’ড কৰা আৰম্ভ কৰক. এই মূহুৰ্তত আপোনাৰ কোনো অগ্ৰগতি হৈ থকা কামৰ খচৰা নাই"}}}},"tbk":{"nontrk":{"frmelmnts":{"lbl":{"ActivityTextbooks":"পাঠ্যপুথিসমূহ","ACTIVITY_TEXTBOOK_TITLE":"পাঠ্যপুথিসমূহ","chapter":"অধ্যায়","copyAsCourse":"পাঠ্যক্ৰম হিচাপে প্ৰতিলিপি কৰক","desktop":{"deleteCollection":"{name} পাঠ্যপুথি ডিলিট কৰা কাৰ্যই ইয়াক মাই ডাউনল’ড্ছৰ পৰা আঁতৰাইছে। অব্যাহত ৰখাৰ বাবে ডিলিটত ক্লিক কৰক।","downloadBook":"পাঠ্যপুথি ডাউনল’ড কৰক","find_more":"{instance}ত অধিক পাঠ্যপুথি আৰু বিষয়বস্তু বিচাৰক","updateTextbook":"পাঠ্যপুথি আপডেট কৰক"},"dialCodeDescription":"QR ক’ড হ’ল আপোনাৰ পাঠ্যপুথিৰ QR ক’ড ইমেজৰ তলত থকা ৬টা অংকৰ এটা আলফানিউমাৰিক (বৰ্ণ আৰু সংখ্যা থকা) ক’ড","dialCodeDescriptionGetPage":"QR ক’ড হ’ল আপোনাৰ পাঠ্যপুথিৰ QR ক’ড ইমেজৰ তলত থকা ৬টা অংকৰ এটা আলফানিউমাৰিক (বৰ্ণ আৰু সংখ্যা থকা) ক’ড","downloadBooks":"অফলাইন হৈ থকা অৱস্থাত প্ৰৱেশাধিকাৰ পাবৰ বাবে কিতাপসমূহ ডাউনল’ড কৰক","fromTheTextBook":"পাঠ্যপুথিৰ পৰা","getUnlimitedAccess":"আপোনাৰ মোবাইল ফোনত পাঠ্যপুথি, পাঠ আৰু পাঠ্যক্ৰমসমূহৰ অসীমিত অফলাইন প্ৰৱেশাধিকাৰ লাভ কৰক","import":"অফলাইন হৈ থকা অৱস্থাত প্ৰৱেশাধিকাৰ পাবৰ বাবে কিতাপসমূহ ডাউনল’ড কৰক","installAppDesc":"আপোনাৰ ডিভাইচত অফলাইন পাঠ, পাঠ্যপুথি আৰু বিষয়বস্তু সংৰক্ষণ কৰক","mynotebook":"মোৰ টোকাবহী","noBookfoundButtonText":"অধিক কিতাপ আৰু বিষয়বস্তু চাওক","noBookfoundSubTitle":"আপোনাৰ ব’ৰ্ডত এতিয়াও অধিক কিতাপ সংযোজন কৰিবলৈ আছে। {instance}ত থকা অধিক কিতাপ আৰু বিষয়বস্তু চাবলৈ এই বাটনটোত টিপক","noBookfoundTitle":"ব’ৰ্ডে কিতাপসমূহ সংযোজন কৰি আছে","textbooks":"পাঠ্যপুথিসমূহ"}},"messages":{"stmsg":{"m0125":"ৰিছ’ৰ্চ, কিতাপ, পাঠ্যক্ৰম প্ৰস্তুত , সংগ্ৰহ নতুবা আপল’ড কৰা আৰম্ভ কৰক. এই মূহুৰ্তত আপোনাৰ কোনো অগ্ৰগতি হৈ থকা কামৰ খচৰা নাই"}}},"trk":{"frmelmnts":{"btn":{"enroll":"পঢ়ক","resumecourse":"পঢ়ি থকাটো পুনৰ আৰম্ভ কৰক","unenroll":"বন্ধ কৰক"},"instn":{"t0062":"আপুনি এতিয়ালৈকে এই পাঠ্যক্ৰমৰ বাবে কোনো শিক্ষণ /পঠনৰ বেটছ্ প্ৰস্তুত কৰা নাই। এটা বেটছ্ প্ৰস্তুত কৰক আৰু ডেছব”ৰ্ড পৰীক্ষণ কৰক","t0063":"আপুনি এতিয়ালৈকে কোনো পাঠ্যপুথি প্ৰস্তুত কৰা নাই। পাঠ্যপুথি প্ৰস্তুত কৰক আৰু ডেছব’ৰ্ড পৰীক্ষণ কৰক"},"lbl":{"accessCourse":"পাঠ্যপুথিত প্ৰৱেশ কৰক","accessToLogin":"পাঠ্যপুথিত প্ৰৱেশ কৰিবলৈ আপুনি লগ ইন কৰিব লাগিব আৰু শিক্ষণ/পঠন বেটছত যোগদান কৰিব লাগিব","ActivityCourses":"পাঠ্যপুথি","ACTIVITY_COURSE_TITLE":"পাঠ্যপুথি","addCourse":"পাঠ্যপুথি যোগ কৰক","completedCourse":"সম্পূৰ্ণ হোৱা পাঠ্যপুথিসমূহ","completingCourseSuccessfully":"শিক্ষণ সফলতাৰে সম্পূৰ্ণ কৰাৰ কাৰণে,","copyAsCourse":"পাঠ্যপুথি হিচাপে প্ৰতিলিপি কৰক","courseDetails":"পাঠ্যপুথিৰ সবিশেষ","courses":"পাঠ্যপুথিসমূহ","coursestructure":"অধ্যায়","joinTrainingToAcessContent":"বিষয়বস্তুৰ প্ৰৱেশাধিকাৰ লাভ কৰিবলৈ, আপুনি শিক্ষণ বেটছত যোগদান কৰিব লাগিব","moduleFinish":"আপুনি এই অধ্যায় সম্পূৰ্ণ কৰিলে","moduleProgress":"অধ্যায়ৰ অগ্ৰগতি","mytrainings":"মোৰ ডিজিটেল পাঠ্যপুথিসমূহ","nextModule":"পৰৱৰ্তী অধ্যায়","oneCourse":"ডিজিটেল পাঠ্যপুথি","prevModule":"পূৰ্বৰ অধ্যায়","sectionTitle":"ডিজিটেল পাঠ্যপুথিসমূহ","selectChapter":"অধ্যায় বাছি লওক","trainingAttended":"পঢ়ি উঠা পাঠ্যপুথিসমূহ","courseContainCertificate":"এই শিক্ষণে আপোনালৈ এখন প্ৰমাণপত্ৰ আগবঢ়ায়","courseDontContainCertificate":"বৰ্তমান, এই শিক্ষণ কার্য্যৰ কোনো প্ৰমাণপত্ৰ নাই। কার্য্যটোৰ প্ৰস্তুতকৰ্তাই পাছত এখন প্ৰমাণপত্ৰ সংলগ্ন কৰিব পাৰে।"},"tab":{"courses":"ডিজিটেল পাঠ্যপুথি"}},"messages":{"emsg":{"m0002":"এই পাঠ্যপুথি আৰু উপলব্ধ নহয়"},"fmsg":{"dataSettingNotSubmitted":"প্ৰ’ফাইল ভাগবতৰাৰ ছেটিংছ আপডেট কৰিব পৰা নাই। পাছত পুনৰ চেষ্টা কৰক","m0001":"দুঃখিত ! আমি আপুনি বিচাৰি থকা পাঠ্যপুথিখন পোৱা নাই। পাছত পুনৰ চেষ্টা কৰক","m0002":"দুঃখিত ! আমি আপোনাৰ বাবে অন্য পাঠ্যপুথি বিচাৰি পোৱা নাই। পাছত পুনৰ চেষ্টা কৰক","m0086":"এই পাঠ্যপুথি আৰু উপলব্ধ নহয়"}}}},"tvc":{"nontrk":{"frmelmnts":{"lbl":{"ActivityTvClasses":"টিভি শ্ৰেণীসমূহ","ACTIVITY_TEXTBOOK_TITLE":"টিভি শ্ৰেণীসমূহ","ACTIVITY_TV_CLASS_TITLE":"টিভি শ্ৰেণীসমূহ","chapter":"টিভিৰ কার্য্যসূচী","collection_tv_classes":"টিভি শ্ৰেণীসমূহ","desktop":{"downloadBook":"টিভি শ্ৰেণীসমূহ ডাউনল’ড কৰক","downloadTVclasses":"টিভি শ্ৰেণীসমূহ ডাউনল’ড কৰক","find_more":"{instance}ত অধিক টিভি শ্ৰেণী আৰু সম্পৰ্কীয় বিষয়বস্তু বিচাৰক","find_more_TVclasses":"{instance}ত অধিক টিভি শ্ৰেণী আৰু সম্পৰ্কীয় বিষয়বস্তু বিচাৰক","updateTextbook":"টিভি শ্ৰেণীসমূহ আপডেট কৰক","updateTVclasses":"টিভি শ্ৰেণীসমূহ আপডেট কৰক"},"downloadBooks":"অফলাইন হৈ থকা অৱস্থাত প্ৰৱেশাধিকাৰ পাবৰ বাবে টিভি শ্ৰেণীসমূহ ডাউনল’ড কৰক","downloadTVclasses":"অফলাইন হৈ থকা অৱস্থাত প্ৰৱেশাধিকাৰ পাবৰ বাবে টিভি শ্ৰেণীসমূহ ডাউনল’ড কৰক","fromTheTextBook":"টিভি শ্ৰেণীৰ পৰা","fromTheTVclasses":"টিভি শ্ৰেণীৰ পৰা","noBookfoundTitle":"ব’ৰ্ডে টিভি শ্ৰেণীসমূহ সংযোজন কৰি আছে","textbooks":"টিভি শ্ৰেণীসমূহ","TVclassesfoundTitle":"ব’ৰ্ডে টিভি শ্ৰেণীসমূহ সংযোজন কৰি আছে","tv_classes":"টিভি শ্ৰেণীসমূহ","tv_program":"টিভিৰ কার্য্যসূচী"}}},"trk":{"frmelmnts":{"btn":{"enroll":"চাওক","resumecourse":"চাই থকাটো পুনৰ আৰম্ভ কৰক"},"instn":{"t0062":"আপুনি এতিয়ালৈকে এই টিভি শ্ৰেণীৰ বাবে কোনো শিক্ষণৰ বেটছ্ প্ৰস্তুত কৰা নাই। এটা বেটছ্ প্ৰস্তুত কৰক আৰু ডেছব”ৰ্ড পৰীক্ষণ কৰক","t0063":"আপুনি এতিয়ালৈকে কোনো টিভি শ্ৰেণী প্ৰস্তুত কৰা নাই। এটা টিভি শ্ৰেণী প্ৰস্তুত কৰক আৰু ডেছব’ৰ্ড পৰীক্ষণ কৰক"},"lbl":{"accessCourse":"টিভি শ্ৰেণীসমূহত প্ৰৱেশ কৰক","accessToLogin":"পাঠ্যপুথিত প্ৰৱেশ কৰিবলৈ আপুনি লগ ইন কৰিব লাগিব আৰু শিক্ষণ বেটছত যোগদান কৰিব লাগিব","ActivityCourses":"টিভি শ্ৰেণীসমূহ","ACTIVITY_COURSE_TITLE":"টিভি শ্ৰেণীসমূহ","addCourse":"টিভি শ্ৰেণী যোগ কৰক","completedCourse":"সম্পূৰ্ণ হোৱা টিভি শ্ৰেণীসমূহ","copyAsCourse":"টিভি শ্ৰেণী হিচাপে প্ৰতিলিপি কৰক","courseContainCertificate":"এই শিক্ষণে আপোনালৈ এখন প্ৰমাণপত্ৰ আগবঢ়ায়","courseDetails":"টিভি শ্ৰেণীৰ সবিশেষ","courses":"টিভি শ্ৰেণীসমূহ","coursestructure":"টিভিৰ কার্য্যসূচী","moduleFinish":"আপুনি এই কার্য্যসূচী সম্পূৰ্ণ কৰিলে","moduleProgress":"কাৰ্য্যসূচীৰ অগ্ৰগতি","mytrainings":"মোৰ টিভি শ্ৰেণীসমূহ","nextModule":"পৰৱৰ্তী কার্য্যসূচী","oneCourse":"টিভি শ্ৰেণী","prevModule":"পূৰ্বৰ কার্য্যসূচী","sectionTitle":"টিভি শ্ৰেণীসমূহ","selectChapter":"কার্য্যসূচী বাছি লওক","trainingAttended":"চাই উঠা টিভি শ্ৰেণীসমূহ","courseDontContainCertificate":"বৰ্তমান, এই শিক্ষণ কার্য্যৰ কোনো প্ৰমাণপত্ৰ নাই। কার্য্যটোৰ প্ৰস্তুতকৰ্তাই পাছত এখন প্ৰমাণপত্ৰ সংলগ্ন কৰিব পাৰে।"},"tab":{"courses":"টিভি শ্ৰেণীসমূহ"}},"messages":{"emsg":{"m0002":"টিভি শ্ৰেণীৰ কার্য্য আৰু উপলব্ধ নহয়"},"fmsg":{"m0001":"দুঃখিত ! আমি আপুনি বিচাৰি থকা টিভি শ্ৰেণীসমূহ পোৱা নাই। পাছত পুনৰ চেষ্টা কৰক","m0002":"দুঃখিত ! আমি আপোনাৰ বাবে অন্য টিভি শ্ৰেণী বিচাৰি পোৱা নাই। পাছত পুনৰ চেষ্টা কৰক","m0086":"এই টিভি শ্ৰেণী আৰু উপলব্ধ নহয়"}}}}}
\ No newline at end of file
diff --git a/utils/portal/labels/all_labels_bn.json b/utils/portal/labels/all_labels_bn.json
new file mode 100644
index 000000000..975c8abde
--- /dev/null
+++ b/utils/portal/labels/all_labels_bn.json
@@ -0,0 +1 @@
+{"dflt":{"nontrk":{"frmelmnts":{"btn":{"create":"তৈরি করুন"},"lbl":{"ActivityTextbooks":"কাজগুলি","ACTIVITY_TEXTBOOK_TITLE":"টাস্কগুলি","chapter":"শেখার মডিউল","collection_task":"করণীয় কাজগুলি","desktop":{"download":"ডাউনলোড করুন","downloadBook":"ডাউনলোড করুন","find_more":"আরও বিষয়বস্তু সন্ধান করুন","find_more_tasks":"আরও বিষয়বস্তু সন্ধান করুন","update":"আপডেট করুন","updateTextbook":"আপডেট করুন"},"downloadBooks":"অফলাইনে অ্যাকসেস করতে ডাউনলোড করুন","downloadoffline":"অফলাইনে অ্যাক্সেস পাওয়ার জন্য ডাউনলোড করুন","download_to_access_offline":"অফলাইনে অ্যাক্সেস বা প্রবেশ করার জন্য ডাউনলোড করুন","fromTheLearningTask":"প্রশিক্ষণের কাজ থেকে","fromTheTextBook":"প্রশিক্ষণের কাজগুলি থেকে","import":"অফলাইনে অ্যাক্সেস করতে ডাউনলোড করুন","learningmodule":"প্রশিক্ষণ মডিউল","mynotebook":"আমার নোটবুক","noBookfoundButtonText":"আরো দেখুন","noBookfoundSubTitle":"আপনার বোর্ডে এখনও বিষয়বস্তু যোগ করা যাবে। {instance}-এ আরও বিষয়বস্তু দেখার জন্য বাটন-টিতে ট্যাপ করুন","noBookfoundTitle":"বোর্ড বিষয়বস্তু যুক্ত করছে","noTaskfoundSubTitle":"আপনার বোর্ডে এখনও বিষয়বস্তূ যোগ করা বাকি আছে। {instance}-এ আরও বিষয়বস্তু দেখার জন্য বাটন বা বোতামটিতে ট্যাপ করুন","noTaskfoundTitle":"বোর্ড বিষয়বস্তু যুক্ত করছে","seemore":"আরো দেখুন","task":"কাজগুলি","tasks":"কাজগুলি","task_title":"করণীয় কাজগুলি","textbooks":"কাজগুলি"}},"messages":{"stmsg":{"m0125":"বিষয়বস্তু তৈরি বা আপলোড করা শুরু করুন। বর্তমানে আপনার খসড়া হিসেবে কোনও বিষয়বস্তু সংরক্ষণ করা নেই।","ms0001":"বিষয়বস্তু তৈরি বা আপলোড করা শুরু করুন। বর্তমানে আপনার কোনও বিষয়বস্তু ড্রাফ্ট বা খসড়া হিসেবে সংরক্ষণ করা নেই।"}}},"trk":{"completed_learning":"শেখা সম্পূর্ণ হয়েছে","essages":{"fmsg":{"m0082":"এই প্রশিক্ষণ কাজটি এখনও পর্যন্ত খোলা হয়নি। আপনি এটিতে যোগদান করতে পারবেন না।"}},"frmelmnts":{"btn":{"create":"তৈরি করুন","enroll":"যোগদান করুন","resumecourse":"আবার শুরু করুন","unenroll":"ছাড়ুন","viewcoursestats":"পরিসংখ্যান দেখুন","viewCourseStatsDashboard":"ড্যাশবোর্ড দেখুন"},"instn":{"t0062":"আপনি এখনও পর্যন্ত এই টাস্কের জন্য কোনও ব্যাচ তৈরি করেন নি। একটি টাস্ক তৈরি করুন এবং ড্যাশবোর্ডটি চেক করুন","t0063":"আপনি এখনও পর্যন্ত কোনও টাস্ক তৈরি করেননি। একটি নতুন টাস্ক তৈরি করুন ও ড্যাশবোর্ডটি আবার চেক করুন।"},"lbl":{"accessCourse":"শিক্ষণীয় বিষয়বস্তুগুলি পেতে থাকুন","accessToLogin":"বিষয়বস্তুটি অ্যাক্সেস করতে আপনাকে লগ ইন করতে হবে এবং কাজে যোগদান করতে হবে","ActivityCourses":"টাস্কগুলি","ACTIVITY_COURSE_TITLE":"কাজ গুলি","addCourse":"যোগ করুন","completedCourse":"সম্পূর্ণ হওয়া কাজগুলি","completingCourseSuccessfully":"শেখা সফলভাবে সম্পূর্ণ করার জন্য,","copyAsCourse":"প্রশিক্ষণের বিষয়বস্তু হিসাবে কপি করুন","courseContainCertificate":"এই প্রশিক্ষণটি সম্পূর্ণ করার পর আপনি একটি সার্টিফিকেট বা শংসাপত্র পাবেন","courseDetails":"প্রশিক্ষণ সংক্রান্ত বিবরণ","courseProgress":"এই প্রশিক্ষণটি নিম্নলিখিত ক্ষেত্রে প্রাসঙ্গিক:","courseRelevantFor":"এই প্রশিক্ষণটি নিম্নলিখিত ক্ষেত্রে প্রাসঙ্গিক:","courses":"প্রদত্ত কাজগুলি","coursestructure":"শেখার মডিউল","courseSuccessMessage":"আপনি সফলভাবে আপনার প্রশিক্ষণ সম্পূর্ণ করেছেন","courseSuccessNotificationMessage":"আপনাকে আগামী 7 দিনের মধ্যে আপনার নথিভুক্ত যোগাযোগের ঠিকানা বা ফোন নম্বরে আপনার শংসাপত্রের বিষয়ে জানানো হবে।","courseWithoutCertificateNote":"বিজ্ঞপ্তি: এই প্রশিক্ষণটির জন্য আপনাকে কোনও শংসাপত্র দেওয়া হবে না","dashboardnocourseselected":"কোনও নির্বাচন করা হয়নি","dashboardnocourseselecteddesc":"তালিকাটি থেকে নির্বাচন করুন","downloadCourseQRCode":"QR কোডটি ডাউনলোড করুন","downloadQRCode":{"tooltip":"QR কোডগুলি ডাউনলোড করতে ক্লিক করুন এবং এগুলি আপনার প্রকাশিত বিষয়বস্তুর সাথে লিঙ্কযুক্ত করুন"},"getUnlimitedAccess":"আপনার মোবাইল ফোনের মাধ্যমে অফলাইন থাকাকালীন টেক্সটবুক, টিভিতে সম্প্রচারিত শিক্ষণীয় অনুষ্ঠান ও কোর্সগুলিতে অবাধে অ্যাক্সেস পেতে থাকুন।","joinTrainingToAcessContent":"বিষয়বস্তুতে অ্যাকসেস পেতে গেলে, আপনাকে লগইন করতে হবে ও টাস্কটিতে যোগদান করতে হবে।","moduleFinish":"আপনি এই কাজটি সম্পূর্ণ করেছেন","moduleProgress":"কাজের অগ্রগতি","mytrainings":"আমার করণীয় কাজগুলি","nextModule":"পরবর্তী কাজ","oneCourse":"টাস্ক","prevModule":"পূর্ববর্তী কাজ","returnToCourses":"ফিরে যান","sectionTitle":"করণীয় কাজগুলি","selectChapter":"কাজ নির্বাচন করুন","selectContentFromCourse":"বিষয়বস্তু নির্বাচন করুন","trainingAttended":"প্রশিক্ষণে উপস্থিতির সংখ্যা","courseDontContainCertificate":"বর্তমানে, এই প্রশিক্ষণ কাজের জন্য কোনো শংসাপত্র দেওয়া হয় না। পরবর্তী কালে প্রশিক্ষণের উদ্যোক্তা একটি শংসাপত্র অ্যাটাচ করে দিতে পারেন"},"tab":{"courses":"কাজগুলি"}},"messages":{"dashboard":{"emsg":{"m002":"ব্যবহারকারী ব্যক্তি প্রশিক্ষণের উদ্দেশ্যে দেওয়া কাজটি করার জন্য কোনও ব্যাচে যোগদান করেননি"}},"emsg":{"m0002":"প্রশিক্ষণের জন্য প্রয়োজনীয় এই কাজটি আর পাওয়া যাবে না","m0003":"এই শিক্ষণীয় কাজটির কোনও ওপেন ব্যাচ নেই"},"fmsg":{"dataSettingNotSubmitted":"প্রোফাইল শেয়ার করার সেটিংস আপডেট করা যায়নি। পরে আবার চেষ্টা করুন","m0001":"দুঃখিত! আপনি যে প্রশিক্ষণ কাজের জন্য নিজেকে নথিভুক্ত করেছিলেন সে বিষয় আমরা কোনও তথ্য পাইনি। পরে আবার চেষ্টা করুন","m0002":"দুঃখিত! আমরা আপনার জন্য অন্যান্য শেখার কাজগুলি দিতে পারছি না। পরে আবার চেষ্টা করুন","m0086":"এই বিষয়বস্তুটি আর পাওয়া যাবে না"},"imsg":{"m0001":"এই বিষয়বস্তুটি অনুপযুক্ত হিসাবে চিহ্নিত করা হয়েছে। এটি বর্তমানে পুর্নবিবেচনা করে দেখা হচ্ছে।","m0026":"হাই, বর্তমানে এই বিষয়বস্তুটি আপনি পাবেন না। হতে পারে যে বিষয়বস্তুটিতে কিছু পরিবর্তন করা হচ্ছে।"},"stmsg":{"m0125":"বিষয়বস্তু তৈরি বা আপলোড করা শুরু করুন। বর্তমানে আপনি কোনও খসড়া বিষয়বস্তু সংরক্ষণ করেননি"}}}},"crs":{"nontrk":{"frmelmnts":{"lbl":{"ActivityTextbooks":"কোর্স গুলি","ACTIVITY_TEXTBOOK_TITLE":"কোর্সগুলো","chapter":"কোর্স মডিউল","desktop":{"downloadBook":"কোর্স ডাউনলোড করুন","find_more":"{instance} এ আরও কোর্স এবং সম্পর্কিত বিষয়বস্তু সন্ধান করুন","updateTextbook":"কোর্স আপডেট করুন"},"downloadBooks":"অফলাইনে থাকাকালীন কোর্সগুলিতে অ্যাক্সেস পেতে সেগুলি ডাউনলোড করুন","fromTheTextBook":"কোর্সটি থেকে","noBookfoundTitle":"বোর্ড কোর্সগুলি যুক্ত করছে","textbooks":"কোর্সগুলো"}}},"trk":{"completedCourse":"কোর্স বা পাঠক্রম সম্পূর্ণ হয়েছে","frmelmnts":{"btn":{"createCourse":"কোর্স তৈরি করুন","enroll":"কোর্সে যোগ দিন","resumecourse":"কোর্সটি আবার শুরু করুন","unenroll":"কোর্সটি ছেড়ে দিন","viewcoursestats":"কোর্সের পরিসংখ্যান দেখুন","viewCourseStatsDashboard":"কোর্স ড্যাশবোর্ডটি দেখুন"},"instn":{"t0062":"আপনি এখনো এই কোর্সের জন্য একটিও ব্যাচ তৈরি করেননি। একটি নতুন ব্যাচ তৈরি করুন এবং আবার ড্যাশবোর্ডটি চেক করুন।","t0063":"আপনি এখনো কোনও কোর্স তৈরি করেনি। নতুন কোর্স তৈরি করুন এবং আবার ড্যাশবোর্ডটি চেক করুন।"},"lbl":{"accessCourse":"কোর্সটিতে অ্যাক্সেস করুন","accessToLogin":"কোর্সটি করার জন্য আপনাকে লগ-ইন করতে হবে ও কোর্সটিতে যোগদান করতে হবে","ActivityCourses":"কোর্সগুলি","ACTIVITY_COURSE_TITLE":"কোর্সগুলি","addCourse":"কোর্সটিকে যুক্ত করুন","completedCourse":"কোর্সগুলি সম্পূর্ণ হয়েছে","completingCourseSuccessfully":"প্রশিক্ষণটি সফলভাবে সম্পূর্ণ করার জন্য","copyAsCourse":"কোর্স হিসেবে কপি করুন","courseContainCertificate":"এটি একটি শংসাপত্রের কোর্স","courseDetails":"কোর্স-সংক্রান্ত বিবরণ","courseDontContainCertificate":"বর্তমানে, এই প্রশিক্ষণটির জন্য কোনও শংসাপত্র দেওয়া হয় না। যে ব্যক্তি প্রশিক্ষণটির উদ্যোক্তা তিনি পরে একটি শংসাপত্র অ্যাটাচ বা সংযুক্ত করে দিতে পারেন।","courseLastUpdatedOn":"কোর্সটি শেষ আপডেট করা হয়েছে","courseProgress":"কোর্সের অগ্রগতি","courseRelevantFor":"কোর্সটি এর জন্য প্রাসঙ্গিক:","courses":"কোর্সগুলি","coursestructure":"কোর্সের মডিউলগুলি","courseSuccessMessage":"আপনি সফলভাবে কোর্সটি শেষ করেছেন","courseSuccessNotificationMessage":"আপনাকে কোর্স শংসাপত্র সম্পর্কে ৭ দিনের মধ্যে আপনার নিবন্ধিত যোগাযোগ ঠিকানায় অবহিত করা হবে","courseWithoutCertificateNote":"দ্রষ্টব্য: এই কোর্সটির পর কোনও শংসাপত্র পাওয়া যাবে না","dashboardnocourseselected":"কোনও কোর্স নির্বাচিত নির্বাচন করা হয়নি","dashboardnocourseselecteddesc":"তালিকাটি থেকে একটি কোর্স নির্বাচন করুন","downloadCourseQRCode":"কোর্সের QR কোড ডাউনলোড করুন","downloadQRCode":{"tooltip":"QR কোড ডাউনলোড করতে হলে ক্লিক করুন এবং প্রকাশিত কোর্সের সাথে লিংকযুক্ত করুন"},"enrollcourse":"কোর্সে যোগ দিন","getUnlimitedAccess":"আপনার মোবাইল ফোন থেকে অফলাইনে টেক্সটবুক, প্রশিক্ষণ এবং কোর্সগুলিতে অবাধ অ্যাক্সেস পান","joinTrainingToAcessContent":"সমগ্র বিষয়বস্তুটিতে অ্যাক্সেস পাওয়ার জন্য আপনাকে অবশ্যই কোর্সটিতে যোগদান করতে হবে।","moduleFinish":"আপনি এই মডিউলটি সম্পূর্ণ করেছেন","moduleProgress":"মডিউলের অগ্রগতি","mytrainings":"আমার কোর্সগুলি","nextModule":"পরবর্তী মডিউল","oneCourse":"কোর্স","prevModule":"আগের মডিউলটি","returnToCourses":"কোর্সে ফিরে আসুন","sectionTitle":"কোর্সগুলি","selectChapter":"মডিউল নির্বাচন করুন","selectContentFromCourse":"কোর্সের জন্য বিষয়বস্তু নির্বাচন করুন","signinenrollTitle":"এই কোর্সে ভর্তির জন্য লগ ইন করুন","trainingAttended":"যতগুলি কোর্সে উপস্থিত ছিলেন","userName":"ব্যবহারকারীর নাম"},"tab":{"courses":"কোর্সগুলি"}},"messages":{"dashboard":{"emsg":{"m002":"এই কোর্সের কোনো ব্যাচের মধ্যে এই ব্যবহারকারীর নাম নথিভুক্ত করা হয়নি"}},"emsg":{"m0002":"কোর্সটি এখন বন্ধ আছে","m0003":"এই কোর্সটির কোনও ওপেন ব্যাচ নেই"},"fmsg":{"m0001":"নথিভুক্ত কোর্সটিকে আনা যায়নি, পরে আবার চেষ্টা করুন","m0002":"অন্যান্য কোর্স আনা যায়নি, পরে আবার চেষ্টা করুন","m0082":"এই কোর্সটি তালিকাভুক্তির জন্য উন্মুক্ত নয়","m0086":"এই কোর্সটি যিনি তৈরি করেছিলেন তিনি সেটি প্রত্যাহার করে নিয়েছেন ও সেই জন্য কোর্সটি আর করা যাবে না।"},"imsg":{"m0001":"এই কোর্সটি অনুপযুক্ত হিসেবে চিহ্নিত করা হয়েছে ও বর্তমানে কোর্সটি নিয়ে পুনর্বিবেচনা করা হচ্ছে","m0026":"এই কোর্সটি এখন আপাতত উপলব্ধ নয়। সম্ভবত এর সৃষ্টা এই কোর্সটিতে কিছু পরিবর্তন করেছেন।"},"stmsg":{"m0125":"প্রয়োজনীয় বিষয়বস্তু, বই, কোর্স তৈরি করা বা সংগৃহীত তথ্য আপলোড করা শুরু করুন। এই মুহুর্তে আপনি সঠিকভাবে কাজ করছেন কি না সে বিষয়ে কোনও নথি বা ড্রাফ্ট নেই।"}}}},"tbk":{"nontrk":{"frmelmnts":{"lbl":{"ActivityTextbooks":"টেক্সটবুকগুলি","ACTIVITY_TEXTBOOK_TITLE":"টেক্সটবুকগুলি","chapter":"অধ্যায়","copyAsCourse":"কোর্স হিসেবে কপি করুন","desktop":{"deleteCollection":"{name} টেক্সটবুকটি ডিলিট করা হলে My Download (মাই ডাউনলোড) ফোল্ডার থেকে সেটি সম্পূর্ণ অপসারিত হবে। প্রক্রিয়াটি সম্পূর্ণ করার জন্য ডিলিট-এ ক্লিক করুন।","downloadBook":"টেক্সটবুকটি ডাউনলোড করুন","find_more":"{instance}-এ আরও টেক্সটবুক এবং বিষয়বস্তু সন্ধান করুন","updateTextbook":"টেক্সটবুক আপডেট করুন"},"dialCodeDescription":"QR কোডটি আপনার টেক্সট বুকের QR কোড ছবিটির নীচে দেওয়া ৬ সংখ্যার আলফা-নিউমেরিক কোড","dialCodeDescriptionGetPage":"QR কোড হল ৬ সংখ্যার আলফা-নিউমেরিক কোড যা আপনার টেক্সটবুকের QR কোড চিত্রের নিচে দেখতে পাবেন","downloadBooks":"অফলাইনে থাকাকালীন অ্যাক্সেসের জন্য বইগুলি ডাউনলোড করুন","fromTheTextBook":"টেক্সটবুক থেকে","getUnlimitedAccess":"আপনার মোবাইল ফোনের মাধ্যমে অফলাইন থাকাকালীন অসংখ্য টেক্সটবুক, প্রশিক্ষণ ও কোর্সের সন্ধান পেতে থাকুন","import":"অফলাইনে থাকাকালীন অ্যাক্সেসের জন্য বইগুলি ডাউনলোড করুন","installAppDesc":"অফলাইনে থাকাকালীন আপনার ডিভাইসে প্রশিক্ষণ, টেক্সটবুক এবং বিষয়বস্তু সংগ্রহ করুন","mynotebook":"আমার নোটবুক","noBookfoundButtonText":"আরও বই এবং বিষয়বস্তু দেখুন","noBookfoundSubTitle":"আপনার বোর্ডটিতে এখনও আরও বই যোগ করা যাবে। {instance} তে আরও বই এবং বিষয়বস্তু দেখতে বোতামটিতে ট্যাপ করুন","noBookfoundTitle":"বোর্ড বই যোগ করছে","textbooks":"টেক্সটবুক"}},"messages":{"stmsg":{"m0125":"বিষয়বস্তু, বই, কোর্স, রচনা সমগ্র ইত্যাদি তৈরি করা বা আপলোড করা শুরু করুন।এই মুহুর্তে আপনার কোন কাজের অগ্রগতির খসড়া নেই"}}},"trk":{"frmelmnts":{"btn":{"enroll":"পড়ুন","resumecourse":"আবার পড়া শুরু করুন","unenroll":"বন্ধ করুন"},"instn":{"t0062":"আপনি এখনও পর্যন্ত এই টেক্সটবুকের জন্য কোনও প্রশিক্ষণ/ পড়ার ব্যাচ তৈরি করেননি। একটি ব্যাচ তৈরি করুন এবং ড্যাশবোর্ডটি চেক করুন","t0063":"আপনি এখনও পর্যন্ত কোনও টেক্সটবুক তৈরি করেননি। একটি টেক্সটবুক তৈরি করুন এবং ড্যাশবোর্ডটি চেক করুন"},"lbl":{"accessCourse":"টেক্সটবুকটিতে অ্যাক্সেস করুন","accessToLogin":"টেক্সটবুকটি অ্যাক্সেস করতে আপনাকে অবশ্যই লগ ইন করতে হবে এবং প্রশিক্ষণ / পড়ার ব্যাচে যোগদান করতে হবে","ActivityCourses":"টেক্সটবুক","ACTIVITY_COURSE_TITLE":"টেক্সটবুক","addCourse":"টেক্সটবুকটি যুক্ত করুন","completedCourse":"সম্পূর্ণ হওয়া টেক্সটবুকগুলি","completingCourseSuccessfully":"সাফল্যের সাথে শেখার জন্য,","copyAsCourse":"টেক্সটবুক হিসাবে কপি করুন","courseDetails":"টেক্সটবুকের বিস্তারিত বিবরণ","courses":"টেক্সটবুকগুলি","coursestructure":"অধ্যায়","joinTrainingToAcessContent":"বিষয়বস্তু অ্যাক্সেস করতে, আপনাকে প্রশিক্ষণ ব্যাচে যোগদান করতে হবে","moduleFinish":"আপনি এই অধ্যায়টি সম্পূর্ণ করেছেন","moduleProgress":"অধ্যায়ের অগ্রগতি","mytrainings":"আমার ডিজিটাল টেক্সটবুকগুলি","nextModule":"পরবর্তী অধ্যায়","oneCourse":"ডিজিটাল টেক্সটবুক","prevModule":"আগের অধ্যায়টি","sectionTitle":"ডিজিটাল টেক্সটবুক","selectChapter":"অধ্যায় নির্বাচন করুন","trainingAttended":"টেক্সটবুকগুলি পড়া হয়েছে","courseContainCertificate":"এই প্রশিক্ষণটির পর আপনাকে একটি শংসাপত্র দেওয়া হবে","courseDontContainCertificate":"বর্তমানে, এই প্রশিক্ষণ কাজটির জন্য কোনও শংসাপত্র দেওয়া হয় না। যে ব্যক্তি প্রশিক্ষণ কাজটির উদ্যোক্তা তিনি পরে একটি শংসাপত্র অ্যাটাচ বা সংযুক্ত করে দিতে পারেন।"},"tab":{"courses":"ডিজিটাল টেক্সটবুক"}},"messages":{"emsg":{"m0002":"এই টেক্সটবুকটি আর পাওয়া যাবে না"},"fmsg":{"dataSettingNotSubmitted":"প্রোফাইল শেয়ার করার সেটিংস আপডেট করা যায়নি। পরে আবার চেষ্টা করুন","m0001":"দুঃখিত! আপনি যে টেক্সটবুকটি সন্ধান করেছিলেন তা আমরা পাইনি। পরে আবার চেষ্টা করুন","m0002":"দুঃখিত! আমরা আপনার জন্য অন্যান্য টেক্সটবুক পাইনি। পরে আবার চেষ্টা করুন","m0086":"এই টেক্সটবুকটি আর পাওয়া যাবে না"}}}},"tvc":{"nontrk":{"frmelmnts":{"lbl":{"ActivityTvClasses":"টিভিতে সম্প্রচারিত শিক্ষাদানের অনুষ্ঠানগুলি","ACTIVITY_TEXTBOOK_TITLE":"টিভিতে সম্প্রচারিত শিক্ষণীয় অনুষ্ঠানগুলি","ACTIVITY_TV_CLASS_TITLE":"টিভিতে সম্প্রচারিত শিক্ষণীয় অনুষ্ঠানগুলি","chapter":"টিভির অনুষ্ঠান","collection_tv_classes":"টিভি ক্লাসগুলি","desktop":{"downloadBook":"টিভিতে সম্প্রচারিত শিক্ষাদানের অনুষ্ঠানগুলি ডাউনলোড করুন","downloadTVclasses":"শিক্ষার্থীদের শিক্ষাদানের উদ্দেশ্যে টিভিতে সম্প্রচারিত অনুষ্ঠানগুলি ডাউনলোড করুন","find_more":"{instance}-এ টিভিতে সম্প্রচারিত আরও শিক্ষণীয় অনুষ্ঠান ও সেই সংক্রান্ত বিষয়বস্তু খুঁজে পান।","find_more_TVclasses":"{instance} এ আরও টিভি ক্লাস এবং সম্পর্কিত বিষয়বস্তু সন্ধান করুন","updateTextbook":"টিভি ক্লাসগুলি আপলোড করুন","updateTVclasses":"টিভিতে সম্প্রচারিত শিক্ষাদানের অনুষ্ঠানগুলি আপডেট করুন"},"downloadBooks":"অফলাইন থাকাকালীন অ্যাকসেস করার জন্য টিভিতে সম্প্রচারিত শিক্ষণীয় অনুষ্ঠানগুলি ডাউনলোড করুন","downloadTVclasses":"টিভি ক্লাস গুলি ডাউনলোড করুন, অফলাইন এ অ্যাকসেস করার জন্য","fromTheTextBook":"টিভিতে সম্প্রচারিত শিক্ষণীয় অনুষ্ঠানগুলি থেকে","fromTheTVclasses":"টিভির ক্লাস থেকে","noBookfoundTitle":"বোর্ড টিভি ক্লাস যুক্ত করছে","textbooks":"টিভি ক্লাসগুলি","TVclassesfoundTitle":"বোর্ড টিভি ক্লাস যুক্ত করছে","tv_classes":"টিভিতে সম্প্রচারিত শিক্ষণীয় অনুষ্ঠানগুলি","tv_program":"টিভির অনুষ্ঠান"}}},"trk":{"frmelmnts":{"btn":{"enroll":"দেখুন","resumecourse":"পুনরায় দেখা শুরু করুন"},"instn":{"t0062":"আপনি এখনও পর্যন্ত এই টিভি ক্লাসের জন্য কোনও প্রশিক্ষণ ব্যাচ তৈরি করেন নি। একটি ব্যাচ তৈরি করুন এবং ড্যাশবোর্ডটি চেক করুন","t0063":"আপনি এখনও পর্যন্ত টিভিতে কোনও সম্প্রচারযোগ্য শিক্ষণীয় অনুষ্ঠান তৈরি করেননি। টিভিতে সম্প্রচারযোগ্য একটি শিক্ষণীয় অনুষ্ঠান তৈরি করুন এবং ড্যাশবোর্ডটি চেক করুন"},"lbl":{"accessCourse":"টিভিতে সম্প্রচারিত শিক্ষণীয় অনুষ্ঠানগুলিতে অ্যাকসেস করুন।","accessToLogin":"টিভিতে সম্প্রচারিত শিক্ষণীয় অনুষ্ঠানগুলিতে অ্যাক্সেস করতে আপনাকে লগ ইন করতে হবে এবং শিক্ষার্থীদের ব্যাচে যোগদান করতে হবে","ActivityCourses":"টিভিতে সম্প্রচারিত শিক্ষণীয় অনুষ্ঠানগুলি","ACTIVITY_COURSE_TITLE":"টিভিতে সম্প্রচারিত শিক্ষাদানের অনুষ্ঠানগুলি","addCourse":"টিভিতে সম্প্রচারিত শিক্ষণীয় অনুষ্ঠানগুলি যোগ করুন","completedCourse":"টিভি ক্লাস সম্পূর্ণ করেছেন","copyAsCourse":"টিভি ক্লাস হিসাবে কপি করুন","courseContainCertificate":"এই প্রশিক্ষণের আপনাকে একটি শংসাপত্র দেওয়া হবে","courseDetails":"টিভিতে সম্প্রচারিত শিক্ষণীয় অনুষ্ঠানের বিবরণ","courses":"টিভি ক্লাসগুলি","coursestructure":"টিভি অনুষ্ঠান","moduleFinish":"আপনি এই প্রোগ্রামটি সম্পূর্ণ করেছেন","moduleProgress":"অনুষ্ঠান প্রক্রিয়াটির অগ্রগতি","mytrainings":"টিভিতে সম্প্রচারিত আমার প্রয়োজনীয় ও শিক্ষণীয় অনুষ্ঠানগুলি","nextModule":"পরবর্তী অনুষ্ঠান","oneCourse":"টিভিতে সম্প্রচারিত শিক্ষণীয় অনুষ্ঠান","prevModule":"পূর্ববর্তী অনুষ্ঠান","sectionTitle":"টিভিতে সম্প্রচারিত শিক্ষাদানের অনুষ্ঠানগুলি","selectChapter":"অনুষ্ঠান নির্বাচন করুন","trainingAttended":"টিভিতে সম্প্রচারিত শিক্ষণীয় অনুষ্ঠানগুলি দেখা হয়েছে","courseDontContainCertificate":"বর্তমানে, এই প্রশিক্ষণ কাজটির জন্য কোনও শংসাপত্র দেওয়া হয় না। যে ব্যক্তি প্রশিক্ষণ কাজটির উদ্যোক্তা তিনি পরে একটি শংসাপত্র অ্যাটাচ বা সংযুক্ত করে দিতে পারেন।"},"tab":{"courses":"টিভিতে সম্প্রচারিত শিক্ষাদানের অনুষ্ঠানগুলি"}},"messages":{"emsg":{"m0002":"এই টিভি ক্লাস টাস্কটি আর পাওয়া যাবে না।"},"fmsg":{"m0001":"দুঃখিত! আপনি যে টিভি ক্লাসগুলির সন্ধান করছিলেন তা আমরা পাইনি। পরে আবার চেষ্টা করুন","m0002":"দুঃখিত! আমরা আপনার জন্য অন্যান্য টিভি ক্লাস এনে দিতে পারিনি। পরে আবার চেষ্টা করুন","m0086":"টিভিতে সম্প্রচারিত এই শিক্ষণীয় অনুষ্ঠানটি আর পাওয়া যাবে না"}}}}}
\ No newline at end of file
diff --git a/utils/portal/labels/all_labels_en.json b/utils/portal/labels/all_labels_en.json
new file mode 100644
index 000000000..f72420504
--- /dev/null
+++ b/utils/portal/labels/all_labels_en.json
@@ -0,0 +1 @@
+{"dflt":{"nontrk":{"frmelmnts":{"btn":{"create":"Create"},"lbl":{"ActivityTextbooks":"Tasks","ACTIVITY_TEXTBOOK_TITLE":"Tasks","chapter":"Learning module","collection_task":"Tasks","desktop":{"download":"Download","downloadBook":"Download","find_more":"Find more content","find_more_tasks":"Find more content","update":"Update","updateTextbook":"Update"},"downloadBooks":"Download to access offline","downloadoffline":"Download to access offline","download_to_access_offline":"Download to access offline","fromTheLearningTask":"from the learning task","fromTheTextBook":"from the learning task","import":"Download to access offline","learningmodule":"Learning module","mynotebook":"My Notebook","noBookfoundButtonText":"See more","noBookfoundSubTitle":"Your board is yet to add content. Tap the button to see more content on {instance}","noBookfoundTitle":"Board is adding content","noTaskfoundSubTitle":"Your board is yet to add content. Tap the button to see more content on {instance}","noTaskfoundTitle":"Board is adding content","seemore":"See more","task":"Tasks","tasks":"Tasks","task_title":"Tasks","textbooks":"Tasks"}},"messages":{"stmsg":{"m0125":"Start creating or uploading content. You currently do not have any content saved as a draft","ms0001":"Start creating or uploading content. You currently do not have any content saved as a draft"}}},"trk":{"completed_learning":"Learning completed","essages":{"fmsg":{"m0082":"This learning task is not open, as yet. You cannot join it"}},"frmelmnts":{"btn":{"create":"Create","enroll":"Join","resumecourse":"Resume","unenroll":"Leave","viewcoursestats":"View stats","viewCourseStatsDashboard":"View dashboard"},"instn":{"t0062":"You have not created any batch for this task as yet. Create a task and check the dashboard","t0063":"You have not created any task as yet. Create a new task and check the dashboard again."},"lbl":{"accessCourse":"Access learning material","accessToLogin":"To access the content you have to log in and join the task","ActivityCourses":"Tasks","ACTIVITY_COURSE_TITLE":"Tasks","addCourse":"Add","completedCourse":"Completed Tasks","completingCourseSuccessfully":"For successfully completing learning on,","copyAsCourse":"Copy as learning material","courseContainCertificate":"This learning offers you a certificate","courseDetails":"Learning details","courseProgress":"Progress","courseRelevantFor":"This learning is relevant for:","courses":"Tasks","coursestructure":"Learning module","courseSuccessMessage":"You have successfully completed your learning","courseSuccessNotificationMessage":"You will be informed about your certificate on your registered contact details within 7 days","courseWithoutCertificateNote":"Note: This learning does not offer you a certificate","dashboardnocourseselected":"No selection made","dashboardnocourseselecteddesc":"Select from the list","downloadCourseQRCode":"Download the QR code","downloadQRCode":{"tooltip":"Click to download QR codes and link them to your publication"},"getUnlimitedAccess":"Get unlimited access to textbooks, TV classes and courses offline on your mobile phone","joinTrainingToAcessContent":"To access the content, you have to log in and join the task","moduleFinish":"You have completed this task","moduleProgress":"Task progress","mytrainings":"My tasks","nextModule":"Next task","oneCourse":"Task","prevModule":"Prev. task","returnToCourses":"Back","sectionTitle":"Tasks","selectChapter":"Select task","selectContentFromCourse":"Select contents","trainingAttended":"Learning attended","courseDontContainCertificate":"Currently, this learning task does not have a certificate. The task creator may attach a certificate later"},"tab":{"courses":"Tasks"}},"messages":{"dashboard":{"emsg":{"m002":"User has not joined any batch for this learning task"}},"emsg":{"m0002":"This learning task is no longer available","m0003":"This learning task does not have an open batch"},"fmsg":{"dataSettingNotSubmitted":"Could not update profile share settings. Try again later","m0001":"Sorry! We could not get information for the learning task that you have enrolled for. Try again later","m0002":"Sorry! We could not get other learning tasks for you. Try again later","m0086":"This content is no longer available"},"imsg":{"m0001":"This content has been flagged as inappropriate. It is currently under review","m0026":"Hi, this content is currently unavailable. It may be undergoing change"},"stmsg":{"m0125":"Start creating or uploading content. Currently you have not saved any draft content"}}}},"crs":{"nontrk":{"frmelmnts":{"lbl":{"ActivityTextbooks":"Courses","ACTIVITY_TEXTBOOK_TITLE":"Courses","chapter":"Course module","desktop":{"downloadBook":"Download course","find_more":"Find more courses and related content on {instance}","updateTextbook":"Update course"},"downloadBooks":"Download courses to access while offline","fromTheTextBook":"from the course","noBookfoundTitle":"Board is adding courses","textbooks":"Courses"}}},"trk":{"completedCourse":"Course completed","frmelmnts":{"btn":{"createCourse":"Create course","enroll":"Join Course","resumecourse":"Resume Course","unenroll":"Leave course","viewcoursestats":"View course stats","viewCourseStatsDashboard":"View course dashboard"},"instn":{"t0062":"You haven't created a batch for this course yet. Create a new batch and check the dashboard again.","t0063":"You have not created any course as yet. Create a new course and check the dashboard again."},"lbl":{"accessCourse":"Access course","accessToLogin":"To access the course you have to log in and join the course","ActivityCourses":"Courses","ACTIVITY_COURSE_TITLE":"Courses","addCourse":"Add course","completedCourse":"Courses completed","completingCourseSuccessfully":"For successfully completing the course,","copyAsCourse":"Copy as course","courseContainCertificate":"This is a certificate course","courseDetails":"Course details","courseDontContainCertificate":"Currently, this course does not have a certificate. The course creator may attach a certificate later.","courseLastUpdatedOn":"Course last updated on","courseProgress":"Course progress","courseRelevantFor":"The course is relevant for:","courses":"Courses","coursestructure":"Course modules","courseSuccessMessage":"You have successfully completed the course","courseSuccessNotificationMessage":"You will be notified about the course certificate on your registered contact details within 7 days","courseWithoutCertificateNote":"Note: This course does not have a certificate","dashboardnocourseselected":"No course selected","dashboardnocourseselecteddesc":"Select a course from the list","downloadCourseQRCode":"Download Course QR Code","downloadQRCode":{"tooltip":"Click to download QR codes and link them to the published course"},"enrollcourse":"Join Course","getUnlimitedAccess":"Get unlimited access to textbooks, lessons and courses offline on your mobile phone","joinTrainingToAcessContent":"You must join the course to get complete access to content","moduleFinish":"You have completed this module","moduleProgress":"Module progress","mytrainings":"My courses","nextModule":"Next module","oneCourse":"Course","prevModule":"Prev. module","returnToCourses":"Return to Courses","sectionTitle":"Courses","selectChapter":"Select module","selectContentFromCourse":"Select contents for course","signinenrollTitle":"Log in to join this course","trainingAttended":"Courses attended","userName":"User name"},"tab":{"courses":"Courses"}},"messages":{"dashboard":{"emsg":{"m002":"The user is not enrolled in any batch of this course"}},"emsg":{"m0002":"The course is not available now","m0003":"This course does not have any open batches"},"fmsg":{"m0001":"Could not fetch enroled courses, try again later","m0002":"Could not fetch other courses, try again later","m0082":"This course is not open for enrolment","m0086":"This course is retired by the author and hence is not available anymore"},"imsg":{"m0001":"This course is flagged as inappropriate and is currently under review.","m0026":"Hi, this course is not available now. It is likely that the creator has made some changes to the course."},"stmsg":{"m0125":"Start creating Resource, Book, Course, Collection or Upload. You have no work-in-progress draft at the moment"}}}},"tbk":{"nontrk":{"frmelmnts":{"lbl":{"ActivityTextbooks":"Textbooks","ACTIVITY_TEXTBOOK_TITLE":"Textbooks","chapter":"Chapter","copyAsCourse":"Copy as course","desktop":{"deleteCollection":"Deleting {name} textbook removes it from My Downloads. Click Delete to continue.","downloadBook":"Download textbook","find_more":"Find more textbooks and content on {instance}","updateTextbook":"Update textbook"},"dialCodeDescription":"QR code is the 6 digit alphanumeric code found beneath the QR code image in your text book","dialCodeDescriptionGetPage":"QR code is the 6 digit alphanumeric code found beneath the QR code image in your text book.","downloadBooks":"Download books to access while offline","fromTheTextBook":"from the textbook","getUnlimitedAccess":"Get unlimited access to textbooks, lessons and courses offline on your mobile phone","import":"Download books to access while offline","installAppDesc":"Store lessons, textbooks and content offline on your device","mynotebook":"My Notebook","noBookfoundButtonText":"See more books and contents","noBookfoundSubTitle":"Your board is yet to add more books. Tap the button to see more books and content on {instance}","noBookfoundTitle":"Board is adding books","textbooks":"Textbooks"}},"messages":{"stmsg":{"m0125":"Start creating Resource, Book, Course, Collection or Upload. You have no work-in-progress draft at the moment"}}},"trk":{"frmelmnts":{"btn":{"enroll":"Read","resumecourse":"Resume reading","unenroll":"Close"},"instn":{"t0062":"You have not created any learning/reading batch for this textbook as yet. Create a batch and check the dashboard","t0063":"You have not created any textbook as yet. Create a textbook and check the dashboard"},"lbl":{"accessCourse":"Access textbook","accessToLogin":"To access the textbook you have to log in and join the learning/reading batch","ActivityCourses":"Textbook","ACTIVITY_COURSE_TITLE":"Textbook","addCourse":"Add textbook","completedCourse":"Completed textbooks","completingCourseSuccessfully":"For successfully completing learning,","copyAsCourse":"Copy as textbook","courseDetails":"Textbook details","courses":"Textbooks","coursestructure":"Chapter","joinTrainingToAcessContent":"To access the content, you have to join the learning batch","moduleFinish":"You have completed this chapter","moduleProgress":"Chapter progress","mytrainings":"My digital textbooks","nextModule":"Next chapter","oneCourse":"Digital textbook","prevModule":"Prev. chapter","sectionTitle":"Digital textbooks","selectChapter":"Select chapter","trainingAttended":"Textbooks read","courseContainCertificate":"This learning offers you a certificate","courseDontContainCertificate":"Currently, this learning task does not have a certificate. The task creator may attach a certificate later."},"tab":{"courses":"Digital textbook"}},"messages":{"emsg":{"m0002":"This textbook is no longer available"},"fmsg":{"dataSettingNotSubmitted":"Could not update profile share settings. Try again later","m0001":"Sorry! We could not get the textbook you were looking for. Try again later","m0002":"Sorry! We could not get other textbooks for you. Try again later","m0086":"This textbook is not available anymore"}}}},"tvc":{"nontrk":{"frmelmnts":{"lbl":{"ActivityTvClasses":"TV classes","ACTIVITY_TEXTBOOK_TITLE":"TV classes","ACTIVITY_TV_CLASS_TITLE":"TV classes","chapter":"TV program","collection_tv_classes":"TV classes","desktop":{"downloadBook":"Download TV classes","downloadTVclasses":"Download TV classes","find_more":"Find more TV classes and related content on {instance}","find_more_TVclasses":"Find more TV classes and related content on {instance}","updateTextbook":"Update TV classes","updateTVclasses":"Update TV classes"},"downloadBooks":"Download TV classes to access while offline","downloadTVclasses":"Download TV classes to access while offline","fromTheTextBook":"from the TV class","fromTheTVclasses":"from the TV class","noBookfoundTitle":"Board is adding TV class","textbooks":"TV classes","TVclassesfoundTitle":"Board is adding TV class","tv_classes":"TV classes","tv_program":"TV program"}}},"trk":{"frmelmnts":{"btn":{"enroll":"Watch","resumecourse":"Resume watching"},"instn":{"t0062":"You have not created any learning batch for this TV class as yet. Create a batch and check the dashboard","t0063":"You have not created any TV class as yet. Create a TV class and check the dashboard"},"lbl":{"accessCourse":"Access TV classes","accessToLogin":"To access the TV class you have to log in and join the learning batch","ActivityCourses":"TV classes","ACTIVITY_COURSE_TITLE":"TV classes","addCourse":"Add TV class","completedCourse":"Completed TV classes","copyAsCourse":"Copy as TV class","courseContainCertificate":"This learning offers you a certificate","courseDetails":"TV class details","courses":"TV classes","coursestructure":"TV program","moduleFinish":"You have completed this program","moduleProgress":"Program progress","mytrainings":"My TV classes","nextModule":"Next program","oneCourse":"TV class","prevModule":"Prev. program","sectionTitle":"TV classes","selectChapter":"Select program","trainingAttended":"TV classes watched","courseDontContainCertificate":"Currently, this learning task does not have a certificate. The task creator may attach a certificate later"},"tab":{"courses":"TV classes"}},"messages":{"emsg":{"m0002":"This TV class task is no longer available"},"fmsg":{"m0001":"Sorry! We could not get the TV classes you were looking for. Try again later","m0002":"Sorry! We could not get other TV classes for you. Try again later","m0086":"This TV Class is not available anymore"}}}}}
diff --git a/utils/portal/labels/all_labels_gu.json b/utils/portal/labels/all_labels_gu.json
new file mode 100644
index 000000000..9a041430f
--- /dev/null
+++ b/utils/portal/labels/all_labels_gu.json
@@ -0,0 +1 @@
+{"dflt":{"nontrk":{"frmelmnts":{"btn":{"create":"બનાવો"},"lbl":{"ActivityTextbooks":"કાર્ય","ACTIVITY_TEXTBOOK_TITLE":"કાર્ય","chapter":"શીખવાનું મોડ્યુલ","collection_task":"કાર્ય","desktop":{"download":"ડાઉનલોડ કરો","downloadBook":"ડાઉનલોડ કરો","find_more":"વધુ કન્ટેન્ટ શોધો","find_more_tasks":"વધુ કન્ટેન્ટ શોધો","update":"અપડેટ","updateTextbook":"અપડેટ"},"downloadBooks":"ઑફ્લાઇન એક્સેસ કરવા માટે ડાઉનલોડ કરો","downloadoffline":"ઑફ્લાઇન એક્સેસ કરવા માટે ડાઉનલોડ કરો","download_to_access_offline":"ઑફ્લાઇન એક્સેસ કરવા માટે ડાઉનલોડ કરો","fromTheLearningTask":"શીખવાની ક્રિયા માટેની બેચ","fromTheTextBook":"શીખવાની ક્રિયા માટેની બેચ","import":"ઑફ્લાઇન એક્સેસ કરવા માટે ડાઉનલોડ કરો","learningmodule":"શીખવાનું મોડ્યુલ","mynotebook":"મારી નોટબુક","noBookfoundButtonText":"વધુ જુઓ","noBookfoundSubTitle":"તમારું બોર્ડ હજી કન્ટેન્ટ ઉમેરવા માટે બાકી છે. {instance} પર વધુ કન્ટેન્ટ જોવા માટે આ બટન દબાવો","noBookfoundTitle":"બોર્ડ કન્ટેન્ટ ઉમેરી રહ્યું છે.","noTaskfoundSubTitle":"તમારું બોર્ડ હજી કન્ટેન્ટ ઉમેરવા માટે બાકી છે. {instance} પર વધુ કન્ટેન્ટ જોવા માટે આ બટન દબાવો","noTaskfoundTitle":"બોર્ડ કન્ટેન્ટ ઉમેરી રહ્યું છે.","seemore":"વધુ જુઓ","task":"કાર્ય","tasks":"કાર્ય","task_title":"કાર્ય","textbooks":"કાર્ય"}},"messages":{"stmsg":{"m0125":"કન્ટેન્ટ બનાવવા અથવા અપલોડ કરવાનું પ્રારંભ કરો. હાલમાં તમે કોઈપણ ડ્રાફ્ટ કન્ટેન્ટ સાચવી નથી","ms0001":"કન્ટેન્ટ બનાવવા અથવા અપલોડ કરવાનું પ્રારંભ કરો. હાલમાં તમે કોઈપણ ડ્રાફ્ટ કન્ટેન્ટ સાચવી નથી"}}},"trk":{"completed_learning":"ભણવાનું પૂર્ણ થયું","essages":{"fmsg":{"m0082":"આ શીખવાનું કાર્ય હજી સુધી ખુલ્લું નથી. તમે તેમાં જોડાઈ શકતા નથી"}},"frmelmnts":{"btn":{"create":"બનાવો","enroll":"જોડાઓ","resumecourse":"ફરી શરુ કરવું","unenroll":"છોડી દો","viewcoursestats":"આંકડા જુઓ","viewCourseStatsDashboard":"ડેશબોર્ડ જુઓ"},"instn":{"t0062":"તમે હજી સુધી આ કાર્ય માટે કોઈ બેચ બનાવી નથી. એક કાર્ય બનાવો અને ડેશબોર્ડ તપાસો","t0063":"તમે હજી સુધી કોઈ કાર્ય બનાવ્યું નથી. એક નવું કાર્ય બનાવો અને ફરીથી ડેશબોર્ડ તપાસો."},"lbl":{"accessCourse":"શીખવાની સામગ્રી ઍક્સેસ કરો","accessToLogin":"કોર્સને એક્સેસ કરવા માટે તમારે લોગ ઈન કરવું પડશે અને કોર્સમાં જોડાવું પડશે","ActivityCourses":"કાર્ય","ACTIVITY_COURSE_TITLE":"કાર્ય","addCourse":"ઉમેરો","completedCourse":"પૂર્ણ કાર્યો","completingCourseSuccessfully":"સફળતાપૂર્વક અધ્યયન પૂર્ણ કરવા માટે,","copyAsCourse":"શીખવાની સામગ્રી તરીકે કોપી કરો","courseContainCertificate":"આ શિક્ષણ તમને પ્રમાણપત્ર પ્રદાન કરે છે","courseDetails":"વિગતો શીખવી","courseProgress":"પ્રગતિ","courseRelevantFor":"આ શિક્ષણ આના માટે સંબંધિત છે:","courses":"કાર્ય","coursestructure":"શીખવાનું મોડ્યુલ","courseSuccessMessage":"તમે સફળતાપૂર્વક તમારું શિક્ષણ પૂર્ણ કર્યું છે","courseSuccessNotificationMessage":"તમને 7 દિવસની અંદર તમારી નોંધણી કરેલ સંપર્ક વિગતો પર કોર્સ સર્ટિફિકેટ વિશે સૂચિત કરવામાં આવશે","courseWithoutCertificateNote":"નોંધ: આ શિક્ષણ તમને પ્રમાણપત્ર આપતું નથી","dashboardnocourseselected":"કોઈ પસંદગી કરી નથી","dashboardnocourseselecteddesc":"સૂચિમાંથી પસંદ કરો","downloadCourseQRCode":"QR કોડ ડાઉનલોડ કરો","downloadQRCode":{"tooltip":"QR કોડ્સ ડાઉનલોડ કરવા ક્લિક કરો અને તમારું પ્રકાશન સાથે જોડો."},"getUnlimitedAccess":"તમારા મોબાઇલ ફોન પર ઓફલાઇન પાઠ્યપુસ્તકો, ટેલિવિઝન વર્ગો અને કોર્સની અમર્યાદિત એક્સેસ મેળવો.","joinTrainingToAcessContent":"કોર્સને એક્સેસ કરવા માટે તમારે લોગ ઈન કરવું પડશે અને કોર્સમાં જોડાવું પડશે","moduleFinish":"તમે આ કાર્ય પૂર્ણ કર્યું છે","moduleProgress":"કાર્ય પ્રગતિ","mytrainings":"મારા કાર્યો","nextModule":"આગળનું કાર્ય","oneCourse":"કાર્ય","prevModule":"અગાઉનું કાર્ય","returnToCourses":"બેક(પાછળ )","sectionTitle":"કાર્ય","selectChapter":"કાર્ય પસંદ કરો","selectContentFromCourse":"કન્ટેન્ટસ પસંદ કરો","trainingAttended":"અધ્યયનમાં ભાગ લીધો","courseDontContainCertificate":"હાલમાં, આ શીખવાની ક્રિયામાં કોઈ પ્રમાણપત્ર નથી. કાર્ય નિર્માતા પછીથી પ્રમાણપત્ર જોડી શકે છે."},"tab":{"courses":"કાર્ય"}},"messages":{"dashboard":{"emsg":{"m002":"વપરાશકર્તા આ શીખવાની ક્રિયા માટે કોઈપણ બેચમાં જોડાયો નથી"}},"emsg":{"m0002":"આ શીખવાનું કાર્ય હવે ઉપલબ્ધ નથી","m0003":"આ શીખવાની ક્રિયામાં ખુલ્લી બેચ નથી"},"fmsg":{"dataSettingNotSubmitted":"પ્રોફાઇલ શેર સેટિંગ્સને અપડેટ કરી શકીયા નથી. પછીથી ફરી પ્રયાસ કરો","m0001":"માફ કરશો! તમે જે શિક્ષણ કાર્ય માટે નોંધણી કરાવી છે તે વિશેની માહિતી અમે મેળવી શક્યા નહીં. પછીથી ફરી પ્રયાસ કરો","m0002":"માફ કરશો! અમે તમારા માટે અન્ય શીખવાની ક્રિયાઓ મેળવી શક્યા નહીં. પછીથી ફરી પ્રયાસ કરો","m0086":"આ કન્ટેન્ટ હવે ઉપલબ્ધ નથી"},"imsg":{"m0001":"આ સામગ્રીને અયોગ્ય તરીકે ચિહ્નિત કરવામાં આવી છે. હાલમાં તેની સમીક્ષા ચાલી રહી છે","m0026":"હાય, આ સામગ્રી હાલમાં અનુપલબ્ધ છે. તેમાં ફેરફાર થઈ શકે છે"},"stmsg":{"m0125":"કન્ટેન્ટ બનાવવા અથવા અપલોડ કરવાનું પ્રારંભ કરો. હાલમાં તમે કોઈપણ ડ્રાફ્ટ કન્ટેન્ટ સાચવી નથી"}}}},"crs":{"nontrk":{"frmelmnts":{"lbl":{"ActivityTextbooks":"કોર્સ","ACTIVITY_TEXTBOOK_TITLE":"કોર્સ","chapter":"કોર્સ મોડ્યૂલ","desktop":{"downloadBook":"કોર્સ ડાઉનલોડ કરો.","find_more":"{instance} પર વધુ કોર્સ અને સંબંધિત કન્ટેન્ટ શોધો","updateTextbook":"સુધારો કોર્સ"},"downloadBooks":"ઑફ્લાઇન હોય ત્યારે એક્સેસ કરવા માટે કોર્સ ડાઉનલોડ કરો","fromTheTextBook":"કોર્સ માંથી","noBookfoundTitle":"બોર્ડ કોર્સ ઉમેરી રહ્યું છે.","textbooks":"કોર્સ"}}},"trk":{"completedCourse":"કોર્સ પૂર્ણ","frmelmnts":{"btn":{"createCourse":"કોર્સ બનાવો","enroll":"કોર્સમાં જોડાઓ","resumecourse":"કોર્સ ફરી શરૂ કરો.","unenroll":"કોર્સ છોડી દો","viewcoursestats":"કોર્સનાં આંકડા જુઓ","viewCourseStatsDashboard":"કોર્સ ડેશબોર્ડ જુઓ"},"instn":{"t0062":"તમે હજી સુધી આ કોર્સ માટે બેચ બનાવી નથી. નવી બેચ બનાવો અને ફરીથી ડેશબોર્ડ તપાસો.","t0063":"તમે હજી સુધી કોઈ કોર્સ બનાવ્યો નથી. નવો કોર્સ બનાવો અને ફરીથી ડેશબોર્ડ તપાસો."},"lbl":{"accessCourse":"એક્સેસ કોર્સ","accessToLogin":"કોર્સ પ્લેયરને એક્સેસ કરવા માટે તમારે લોગ ઈન કરવું પડશે અને તેમાં જોડાવું પડશે","ActivityCourses":"કોર્સ","ACTIVITY_COURSE_TITLE":"કોર્સ","addCourse":"કોર્સ ઉમેરો","completedCourse":"કોર્સ પૂર્ણ","completingCourseSuccessfully":"સફળતાપૂર્વક કોર્સ પૂર્ણ કરવા માટે,","copyAsCourse":"કોર્સ તરીકે કોપિ કરો","courseContainCertificate":"આ કોર્સમાં પ્રમાણપત્ર ઉપલબ્ધ છે","courseDetails":"કોર્સની વિગતો","courseDontContainCertificate":"હાલમાં, આ કોર્સમાં પ્રમાણપત્ર નથી. કોર્સ નિર્માતા પછીથી પ્રમાણપત્ર જોડી શકે છે.\n","courseLastUpdatedOn":"કોર્સ છેલ્લે અપડેટ થયેલ","courseProgress":"કોર્સ પ્રગતિ\n","courseRelevantFor":"કોર્સ આ માટે સંબંધિત છે:","courses":"કોર્સ","coursestructure":"કોર્સ મોડ્યુલ","courseSuccessMessage":"તમે સફળતાપૂર્વક કોર્સ પૂર્ણ કર્યો છે.","courseSuccessNotificationMessage":"તમને 7 દિવસની અંદર તમારી નોંધણી કરેલ સંપર્ક વિગતો પર કોર્સ સર્ટિફિકેટ વિશે સૂચિત કરવામાં આવશે","courseWithoutCertificateNote":"નોંધ: આ અભ્યાસક્રમમાં પ્રમાણપત્ર નથી","dashboardnocourseselected":"કોઈ કોર્સ પસંદ કરેલ નથી.","dashboardnocourseselecteddesc":"સૂચિમાંથી કોઈ કોર્સ પસંદ કરો.","downloadCourseQRCode":"કોર્સ QR કોડ ડાઉનલોડ કરો.","downloadQRCode":{"tooltip":"QR કોડ્સ ડાઉનલોડ કરવા ક્લિક કરો અને તેમને પ્રકાશિત કોર્સ સાથે જોડો."},"enrollcourse":"કોર્સમાં જોડાઓ","getUnlimitedAccess":"તમારા મોબાઇલ ફોન પર ઓફલાઇન પાઠ્યપુસ્તકો, પાઠ અને કોર્સની અમર્યાદિત એક્સેસ મેળવો.","joinTrainingToAcessContent":"કન્ટેન્ટનો સંપૂર્ણ એક્સેસ મેળવવા માટે તમારે કોર્સમાં જોડાવું આવશ્યક છે","moduleFinish":"તમે આ મોડ્યુલ સમાપ્ત કર્યું છે","moduleProgress":"મોડ્યુલ પ્રગતિ\n","mytrainings":"મારા કોર્સ","nextModule":"આગળનું મોડ્યુલ","oneCourse":"કોર્સ","prevModule":"અગાઉનું મોડ્યુલ","returnToCourses":"કોર્સ પર પાછા જાઓ","sectionTitle":"કોર્સ","selectChapter":"મોડ્યુલ પસંદ કરો","selectContentFromCourse":"કોર્સ માટે કન્ટેન્ટસ પસંદ કરો","signinenrollTitle":"આ કોર્સમાં જોડાવા માટે લોગ ઇન કરો.","trainingAttended":"કોર્સમાં હાજરી આપી હતી","userName":"વપરાશકર્તાનું નામ"},"tab":{"courses":"કોર્સ"}},"messages":{"dashboard":{"emsg":{"m002":"વપરાશકર્તા આ કોર્સની કોઈપણ બેચમાં નોંધાયેલ નથી"}},"emsg":{"m0002":"કોર્સ હવે અસ્તિત્વમાં નથી","m0003":"આ કોર્સમાં કોઈ ખુલ્લી બેચ નથી"},"fmsg":{"m0001":"નોંધ કરેલ કોર્સ લાવવામાં અસમર્થ, કૃપા કરીને પછીથી ફરી પ્રયાસ કરો .","m0002":"અન્ય કોર્સ લાવવામાં અસમર્થ, કૃપા કરીને પછીથી ફરી પ્રયાસ કરો...","m0082":"આ કોર્સ નોંધણી માટે ઓપન નથી.","m0086":"આ કોર્સને લેખક દ્વારા રોક લગાવાયેલ છે અને તેથી તે હવે ઉપલબ્ધ નથી."},"imsg":{"m0001":"આ કોર્સ અયોગ્ય તરીકે ચિહ્નિત થયેલ છે અને હાલમાં રિવ્યુ હેઠળ છે.","m0026":"હેલો , આ કોર્સ હવે ઉપલબ્ધ નથી. સંભવ છે કે નિર્માતાએ કોર્સમાં કેટલાક ફેરફારો કર્યા છે."},"stmsg":{"m0125":"રિસોર્સ, બુક, કોર્સ, કલેકશન અથવા અપલોડ બનાવવાનું ચાલુ કરો. અત્યારે તમારી પાસે વર્ક-ઇન-પ્રોગ્રેસ ડ્રાફ્ટ નથી"}}}},"tbk":{"nontrk":{"frmelmnts":{"lbl":{"ActivityTextbooks":"પાઠયપુસ્તકો\n","ACTIVITY_TEXTBOOK_TITLE":"પાઠયપુસ્તકો\n","chapter":"પ્રકરણ","copyAsCourse":"કોર્સ તરીકે કોપિ કરો","desktop":{"deleteCollection":"{name} કન્ટેન્ટ ડીલીટ કરવાથી તે મારા ડાઉનલોડ્સથી દૂર થાય છે. ચાલુ રાખવા માટે ડીલીટ પર ક્લિક કરો.","downloadBook":"પાઠયપુસ્તક ડાઉનલોડ કરો","find_more":"{instance} પર વધુ પાઠયપુસ્તક અને કન્ટેન્ટ શોધો","updateTextbook":"પાઠયપુસ્તક અપડેટ કરો"},"dialCodeDescription":"QR કોડ એ 6 અંકનો આલ્ફાન્યુમેરિક કોડ છે જે તમારા પાઠયપુસ્તકમાં QR કોડ ઇમેજની નીચે જોવા મળે છે","dialCodeDescriptionGetPage":"QR કોડ એ 6 અંકનો આલ્ફાન્યુમેરિક કોડ છે જે તમારા પાઠયપુસ્તકમાં QR કોડ ઇમેજની નીચે જોવા મળે છે","downloadBooks":"ઑફ્લાઇન હોય ત્યારે એક્સેસ કરવા માટે પુસ્તકો ડાઉનલોડ કરો","fromTheTextBook":"પાઠયપુસ્તકમાંથી","getUnlimitedAccess":"તમારા મોબાઇલ ફોન પર ઓફલાઇન પાઠ્યપુસ્તકો, પાઠ અને કોર્સની અમર્યાદિત એક્સેસ મેળવો.","import":"ઑફ્લાઇન હોય ત્યારે એક્સેસ કરવા માટે પુસ્તકો ડાઉનલોડ કરો","installAppDesc":"પાઠ, પાઠયપુસ્તકો અને કન્ટેન્ટને તમારા ઉપકરણ પર ઑફ્લાઈન સ્ટોર કરો","mynotebook":"મારી નોટબુક","noBookfoundButtonText":"વધુ પુસ્તકો અને કન્ટેન્ટસ જુઓ","noBookfoundSubTitle":"તમારું બોર્ડ હજી વધુ પુસ્તકો ઉમેરવા માટે બાકી છે. {instance} પર વધુ પુસ્તકો અને કન્ટેન્ટ જોવા માટે આ બટન દબાવો","noBookfoundTitle":"બોર્ડ પુસ્તકો ઉમેરી રહ્યું છે.","textbooks":"પાઠયપુસ્તકો\n"}},"messages":{"stmsg":{"m0125":"રિસોર્સ, બુક, કોર્સ, કલેકશન અથવા અપલોડ બનાવવાનું ચાલુ કરો. અત્યારે તમારી પાસે વર્ક-ઇન-પ્રોગ્રેસ ડ્રાફ્ટ નથી"}}},"trk":{"frmelmnts":{"btn":{"enroll":"વાંચો","resumecourse":"વાંચન ફરી શરૂ કરો","unenroll":"બંધ કરો"},"instn":{"t0062":"તમે હજી સુધી આ પાઠયપુસ્તક માટે કોઈ શીખવાની / વાંચવાની બેચ બનાવી નથી. એક બેચ બનાવો અને ડેશબોર્ડ તપાસો","t0063":"તમે હજી સુધી કોઈપાઠયપુસ્તક બનાવ્યો નથી. નવો પાઠયપુસ્તક બનાવો અને ફરીથી ડેશબોર્ડ તપાસો."},"lbl":{"accessCourse":"પાઠયપુસ્તક ઍક્સેસ કરો","accessToLogin":"પાઠયપુસ્તકને એક્સેસ કરવા માટે તમારે લોગ ઇન કરવું પડશે અને ભણતર / વાંચન બેચમાં જોડાવું પડશે","ActivityCourses":"પાઠયપુસ્તક","ACTIVITY_COURSE_TITLE":"પાઠયપુસ્તક","addCourse":"પાઠયપુસ્તક ઉમેરો","completedCourse":"પાઠયપુસ્તકો પૂર્ણ","completingCourseSuccessfully":"સફળતાપૂર્વક અધ્યયન પૂર્ણ કરવા માટે,","copyAsCourse":"પાઠયપુસ્તક તરીકે કોપિ કરો","courseDetails":"પાઠયપુસ્તક વિગતો","courses":"પાઠયપુસ્તકો\n","coursestructure":"પ્રકરણ","joinTrainingToAcessContent":"કન્ટેન્ટને એક્સેસ કરવા માટે, તમારે શીખવાની બેચમાં જોડાવું પડશે","moduleFinish":"તમે આ પ્રકરણ પૂર્ણ કર્યું છે","moduleProgress":"પ્રકરણ પ્રગતિ\n","mytrainings":"મારા ડિજિટલ પાઠયપુસ્તકો","nextModule":"આગળનું પ્રકરણ","oneCourse":"ડિજિટલ પાઠયપુસ્તક","prevModule":"અગાઉનું પ્રકરણ","sectionTitle":"ડિજિટલ પાઠયપુસ્તકો","selectChapter":"પ્રકરણ પસંદ કરો","trainingAttended":"પાઠયપુસ્તકો વાંચ્યા","courseContainCertificate":"આ શિક્ષણ તમને પ્રમાણપત્ર પ્રદાન કરે છે","courseDontContainCertificate":"હાલમાં, આ શીખવાની ક્રિયામાં કોઈ પ્રમાણપત્ર નથી. કાર્ય નિર્માતા પછીથી પ્રમાણપત્ર જોડી શકે છે."},"tab":{"courses":"ડિજિટલ પાઠયપુસ્તક"}},"messages":{"emsg":{"m0002":"આ પાઠયપુસ્તકો હવે ઉપલબ્ધ નથી"},"fmsg":{"dataSettingNotSubmitted":"પ્રોફાઇલ શેર સેટિંગ્સને અપડેટ કરી શકી નથી. પછીથી ફરી પ્રયાસ કરો","m0001":"માફ કરશો! તમે જે પાઠયપુસ્તક શોધી રહ્યા હતા તે અમે મેળવી શક્યા નહીં. પછીથી ફરી પ્રયાસ કરો","m0002":"માફ કરશો! અમે તમારા માટે અન્ય પાઠયપુસ્તકો મેળવી શક્યા નહીં. પછીથી ફરી પ્રયાસ કરો","m0086":"આ પાઠયપુસ્તકો હવે ઉપલબ્ધ નથી"}}}},"tvc":{"nontrk":{"frmelmnts":{"lbl":{"ActivityTvClasses":"ટેલિવિઝન વર્ગો","ACTIVITY_TEXTBOOK_TITLE":"ટેલિવિઝન વર્ગો","ACTIVITY_TV_CLASS_TITLE":"ટેલિવિઝન વર્ગો","chapter":"ટેલિવિઝન કાર્યક્રમો","collection_tv_classes":"ટેલિવિઝન વર્ગો","desktop":{"downloadBook":"ડાઉનલોડ ટેલિવિઝન વર્ગો","downloadTVclasses":"ડાઉનલોડ ટેલિવિઝન વર્ગો","find_more":"{instance} પર વધુ ટેલિવિઝન વર્ગો અને સંબંધિત કન્ટેન્ટ શોધો.","find_more_TVclasses":"{instance} પર વધુ ટેલિવિઝન વર્ગો અને સંબંધિત કન્ટેન્ટ શોધો.","updateTextbook":"અપડેટ ટેલિવિઝન વર્ગો","updateTVclasses":"અપડેટ ટેલિવિઝન વર્ગો"},"downloadBooks":"ઑફ્લાઇન હોય ત્યારે એક્સેસ કરવા માટે ટેલિવિઝન વર્ગો ડાઉનલોડ કરો","downloadTVclasses":"ઑફ્લાઇન હોય ત્યારે એક્સેસ કરવા માટે ટેલિવિઝન વર્ગો ડાઉનલોડ કરો","fromTheTextBook":"ટેલિવિઝન વર્ગ માંથી","fromTheTVclasses":"ટેલિવિઝન વર્ગ માંથી","noBookfoundTitle":"બોર્ડ ટેલિવિઝન વર્ગો ઉમેરી રહ્યું છે.","textbooks":"ટેલિવિઝન વર્ગો","TVclassesfoundTitle":"બોર્ડ ટેલિવિઝન વર્ગો ઉમેરી રહ્યું છે.","tv_classes":"ટેલિવિઝન વર્ગો","tv_program":"ટેલિવિઝન કાર્યક્રમો"}}},"trk":{"frmelmnts":{"btn":{"enroll":"જુઓ","resumecourse":"જોવાનું ફરી શરૂ કરો"},"instn":{"t0062":"તમે હજી સુધી આ ટેલિવિઝન વર્ગો માટે કોઈ શીખવાની બેચ બનાવી નથી. એક બેચ બનાવો અને ડેશબોર્ડ તપાસો","t0063":"તમે હજી સુધી કોઈ ટેલિવિઝન વર્ગો બનાવ્યો નથી. નવો ટેલિવિઝન વર્ગો બનાવો અને ફરીથી ડેશબોર્ડ તપાસો."},"lbl":{"accessCourse":"ટેલિવિઝન વર્ગો ઍક્સેસ કરો","accessToLogin":"ટેલિવિઝન વર્ગને એક્સેસ કરવા માટે તમારે લોગ ઇન કરવું પડશે અને શીખવાની બેચમાં જોડાવું પડશે","ActivityCourses":"ટેલિવિઝન વર્ગો","ACTIVITY_COURSE_TITLE":"ટેલિવિઝન વર્ગો","addCourse":"ટેલિવિઝન વર્ગ ઉમેરો","completedCourse":"પૂર્ણ કરેલા ટેલિવિઝન વર્ગો","copyAsCourse":"ટેલિવિઝન વર્ગ તરીકે કોપિ કરો","courseContainCertificate":"આ અભ્યાસ તમને પ્રમાણપત્ર આપે છે","courseDetails":"ટેલિવિઝન વર્ગોની વિગતો","courses":"ટેલિવિઝન વર્ગો","coursestructure":"ટેલિવિઝન કાર્યક્રમો","moduleFinish":"તમે આ પ્રોગ્રામ પૂર્ણ કર્યો છે","moduleProgress":"કાર્યક્રમની પ્રગતિ","mytrainings":"મારા ટેલિવિઝન વર્ગો","nextModule":"આગળનો કાર્યક્રમ","oneCourse":"ટેલિવિઝન વર્ગ","prevModule":"અગાઉના કાર્યક્રમ","sectionTitle":"ટેલિવિઝન વર્ગો","selectChapter":"કાર્યક્ર પસંદ કરો","trainingAttended":"ટેલિવિઝન વર્ગો જોયા છે","courseDontContainCertificate":"હાલમાં, આ શીખવાની ક્રિયામાં કોઈ પ્રમાણપત્ર નથી. કાર્ય નિર્માતા પછીથી પ્રમાણપત્ર જોડી શકે છે."},"tab":{"courses":"ટેલિવિઝન વર્ગો"}},"messages":{"emsg":{"m0002":"આ ટેલિવિઝન વર્ગનું કાર્ય હવે ઉપલબ્ધ નથી"},"fmsg":{"m0001":"માફ કરશો! તમે જે ટેલિવિઝન વર્ગો શોધી રહ્યા હતા તે અમે મેળવી શક્યા નહીં. પછીથી ફરી પ્રયાસ કરો","m0002":"માફ કરશો! અમે તમારા માટે અન્ય ટેલિવિઝન વર્ગ મેળવી શક્યા નથી. પછીથી ફરી પ્રયાસ કરો","m0086":"આ ટેલિવિઝન વર્ગ હવે ઉપલબ્ધ નથી"}}}}}
\ No newline at end of file
diff --git a/utils/portal/labels/all_labels_hi.json b/utils/portal/labels/all_labels_hi.json
new file mode 100644
index 000000000..8d61d43f2
--- /dev/null
+++ b/utils/portal/labels/all_labels_hi.json
@@ -0,0 +1 @@
+{"dflt":{"nontrk":{"frmelmnts":{"btn":{"create":"निर्माण करें"},"lbl":{"ActivityTextbooks":"कार्य","ACTIVITY_TEXTBOOK_TITLE":"कार्य","chapter":"अभ्यास मॉड्यूल","collection_task":"कार्य","desktop":{"download":"डाउनलोड","downloadBook":"डाउनलोड","find_more":"अधिक कंटेंट खोजें","find_more_tasks":"अधिक कंटेंट खोजें","update":"अद्यतित करें","updateTextbook":"अद्यतित करें"},"downloadBooks":"ऑफ़लाइन अभिगम के लिए डाउनलोड करें","downloadoffline":"ऑफ़लाइन अभिगम के लिए डाउनलोड करें","download_to_access_offline":"ऑफ़लाइन अभिगम के लिए डाउनलोड करें","fromTheLearningTask":"अभ्यास कार्य से","fromTheTextBook":"अभ्यास कार्य से","import":"ऑफ़लाइन अभिगम के लिए डाउनलोड करें","learningmodule":"अध्ययन मॉड्यूल","mynotebook":"मेरी किताब","noBookfoundButtonText":"और देखें","noBookfoundSubTitle":"आपके बोर्ड में सामग्री जोड़ना बाकी है। {instance} पर अधिक सामग्री देखने के लिए बटन पर क्लिक करें","noBookfoundTitle":"बोर्ड द्वारा कंटेन्ट जोड़ा जा रहा है","noTaskfoundSubTitle":"आपके बोर्ड में कंटेन्ट जोड़ना बाकी है। {instance} पर अधिक कंटेन्ट देखने के लिए बटन पर क्लिक करें","noTaskfoundTitle":"बोर्ड कंटेन्ट जोड़ रहा है","seemore":"और देखें","task":"कार्य","tasks":"कार्य","task_title":"कार्य","textbooks":"कार्य"}},"messages":{"stmsg":{"m0125":"कंटेन्ट बनाना या अपलोड करना प्रारंभ करें। फिलहाल आपके पास किसी भी कंटेन्ट को ड्राफ्ट के रूप में सहेजा नहीं गया है","ms0001":"कंटेन्ट बनाना या अपलोड करना प्रारंभ करें। फिलहाल आपके किसी भी कंटेन्ट को ड्राफ्ट के रूप में सहेजा नहीं गया है"}}},"trk":{"completed_learning":"अभ्यास पूर्ण हुआ","essages":{"fmsg":{"m0082":"यह अभ्यास कार्य अभी तक खुला नहीं है। आप इसमें शामिल नहीं हो सकते"}},"frmelmnts":{"btn":{"create":"निर्माण करें","enroll":"नामांकन करें","resumecourse":"फिर से आरंभ करें","unenroll":"छोड़े","viewcoursestats":"सांख्यिकीय देखें","viewCourseStatsDashboard":"डैशबोर्ड देखें"},"instn":{"t0062":"आपने अभी तक इस कार्य के लिए कोई बैच नहीं बनाई है। नया कार्य बनाएँ और डैशबोर्ड देखें","t0063":"आपने अभी तक कोई कार्य नहीं बनाया है। नया कार्य बनाएँ और दोबारा डैशबोर्ड देखें।"},"lbl":{"accessCourse":"अभ्यास सामग्री का अभिगम करें","accessToLogin":"कंटेन्ट के अभिगम के लिए आपको लॉग इन कर, कोर्स में शामिल होना होगा","ActivityCourses":"कार्य","ACTIVITY_COURSE_TITLE":"कार्य","addCourse":"जोड़े","completedCourse":"कार्य पूर्ण हुआ","completingCourseSuccessfully":"सफलतापूर्वक अभ्यास को पूरा करने के लिए,","copyAsCourse":"अध्ययन सामग्री के रूप मे कॉपी करें","courseContainCertificate":"यह अध्ययन आपको प्रमाणपत्र प्रदान करता है","courseDetails":"अध्ययन का विवरण","courseProgress":"प्रगति","courseRelevantFor":"यह अध्ययन प्रासंगिक हैं:","courses":"कार्य","coursestructure":"अध्ययन मॉड्यूल","courseSuccessMessage":"आपने अपना अध्ययन सफलतापूर्वक पूर्ण किया हैं","courseSuccessNotificationMessage":"आपको ७ दिनों के भीतर अपने पंजीकृत संपर्क विवरण पर आपके प्रमाण पत्र के बारे में सूचित किया जाएगा","courseWithoutCertificateNote":"टिप्पणी: यह अध्ययन आपको प्रमाण पत्र प्रदान नहीं करता है","dashboardnocourseselected":"कोई चयन नहीं हुआ","dashboardnocourseselecteddesc":"सूची से चुनिए","downloadCourseQRCode":"QR कोड डाउनलोड करें","downloadQRCode":{"tooltip":"QR कोड डाउनलोड करने के लिये क्लिक करें और प्रकाशित कंटेन्ट से लिंक करें"},"getUnlimitedAccess":"अपने मोबाइल पर पाठ्यपुस्तकों, टीवी क्लास और कोर्स का असीमित अभिगम प्राप्त करें","joinTrainingToAcessContent":"कंटेन्ट के अभिगम के लिए आपको लॉग इन कर, कार्य में शामिल होना होगा","moduleFinish":"आपने यह कार्य पूर्ण किया है","moduleProgress":"कार्य की प्रगति","mytrainings":"मेरे कार्य","nextModule":"अगला कार्य","oneCourse":"कार्य","prevModule":"पिछला कार्य","returnToCourses":"पीछे","sectionTitle":"कार्य","selectChapter":"कार्य चुनिए","selectContentFromCourse":"कंटेन्ट का चयन करें","trainingAttended":"अध्ययन मे भाग लिया","courseDontContainCertificate":"फिलहाल इस कोर्स में प्रमाण-पत्र नहीं है| कोर्स निर्माता बाद में प्रमाण पत्र संलग्न कर सकता है।"},"tab":{"courses":"कार्य"}},"messages":{"dashboard":{"emsg":{"m002":"इस अभ्यास कार्य के लिए उपयोगकर्ता किसी भी बैच में शामिल नहीं हुआ है"}},"emsg":{"m0002":"यह अभ्यास कार्य अब उपलब्ध नहीं है","m0003":"इस अभ्यास कार्य में चलित बैच नहीं है"},"fmsg":{"dataSettingNotSubmitted":"प्रोफ़ाइल साझाकरण सेटिंग अद्यतित नहीं की जा सकी। पुन: प्रयास करें","m0001":"क्षमा करें! नामांकित शिक्षण कार्य की जानकारी लाने में असमर्थ, पुनः प्रयास करें","m0002":"क्षमा करें! हम आपके लिए अन्य अभ्यास कार्य प्राप्त नहीं कर सके। पुनः प्रयास करें","m0086":"यह कंटेन्ट अब उपलब्ध नहीं है"},"imsg":{"m0001":"इस सामग्री को अनुपयुक्त चिह्नित किया गया है। फिलहाल इसकी समीक्षा चल रही है","m0026":"नमस्ते, यह कंटेन्ट वर्तमान में अनुपलब्ध है। इसमें बदलाव किया जा रहा है"},"stmsg":{"m0125":"कंटेन्ट बनाना या अपलोड करना प्रारंभ करें। वर्तमान में आपने कोई ड्राफ्ट कंटेन्ट नहीं सहेजी है"}}}},"crs":{"nontrk":{"frmelmnts":{"lbl":{"ActivityTextbooks":"कोर्स","ACTIVITY_TEXTBOOK_TITLE":"कोर्स","chapter":"कोर्स मॉड्यूल","desktop":{"downloadBook":"कोर्स डाउनलोड करें","find_more":"{instance} पर अधिक कोर्स और संबंधित कंटेन्ट ढूंढें","updateTextbook":"कोर्स अद्यतित करें"},"downloadBooks":"ऑफ़लाइन अभिगम के लिए कोर्स को डाउनलोड करें","fromTheTextBook":"कोर्स से","noBookfoundTitle":"बोर्ड कोर्स जोड़ रहा है","textbooks":"कोर्स"}}},"trk":{"completedCourse":"कोर्स पूर्ण हुआ","frmelmnts":{"btn":{"createCourse":"कोर्स बनाएं","enroll":"कोर्स मे भाग लिजिए","resumecourse":"कोर्स पुनः आरंभ करें","unenroll":"कोर्स छोड़े","viewcoursestats":"कोर्स सांख्यिकीय देखें","viewCourseStatsDashboard":"कोर्स डैशबोर्ड देखें"},"instn":{"t0062":"आपने इस कोर्स के लिए बैच नहीं बनाया है। बैच निर्मित करें व पुनः अपने डैशबोर्ड की जाँच करें।","t0063":"आपने अभी तक कोई कोर्स नहीं बनाया है। नया कोर्स बनाए और दोबारा डैशबोर्ड देखें।"},"lbl":{"accessCourse":"कोर्स का अभिगम","accessToLogin":"कोर्स के अभिगम के लिए आपको लॉग इन कर, कोर्स में शामिल होना होगा","ActivityCourses":"कोर्स","ACTIVITY_COURSE_TITLE":"कोर्स","addCourse":"कोर्स जोड़े","completedCourse":"कोर्स पूर्ण हुआ","completingCourseSuccessfully":"कोर्स सफलतापूर्वक पूर्ण हुआ","copyAsCourse":"कोर्स के रूप में कॉपी करें","courseContainCertificate":"इस कोर्स में सर्टिफिकेट उपलब्ध है","courseDetails":"कोर्स विवरण","courseDontContainCertificate":"फिलहाल इस कोर्स में प्रमाण-पत्र नहीं है| कोर्स निर्माता बाद में प्रमाण पत्र संलग्न कर सकता है।","courseLastUpdatedOn":"कोर्स की अंतिम अद्यतन तारीख","courseProgress":"कोर्स प्रगति","courseRelevantFor":"यह कोर्स प्रासंगिक हैं:","courses":"कोर्स","coursestructure":"कोर्स मॉड्यूल","courseSuccessMessage":"आपने कोर्स सफलतापूर्वक पूर्ण किया हैं","courseSuccessNotificationMessage":"प्रमाण पत्र संबंधित सूचना आपके पंजीकृत संपर्क विवरण मे ७ दिनों के भीतर भेजी जाएगी","courseWithoutCertificateNote":"टिप्पणी: इस कोर्स में प्रमाण पत्र नहीं है","dashboardnocourseselected":"कोई कोर्स नहीं चुना है","dashboardnocourseselecteddesc":"सूची से कोर्स चुनिए","downloadCourseQRCode":"कोर्स का QR कोड डाउनलोड करें","downloadQRCode":{"tooltip":"QR कोड डाउनलोड करने के लिये क्लिक करें और प्रकाशित कोर्स से लिंक करें"},"enrollcourse":"कोर्स में नामांकन कीजिये","getUnlimitedAccess":"अपने मोबाइल पर पाठ्यपुस्तकों, पाठों और कोर्स का असीमित अभिगम प्राप्त करें","joinTrainingToAcessContent":"पूरे कंटेन्ट का अभिगम करने के लिए कोर्स में शामिल होना होगा","moduleFinish":"आपने यह मॉड्यूल पूर्ण कर लिया हैं","moduleProgress":"मॉड्यूल की प्रगति","mytrainings":"मेरे कोर्स","nextModule":"अगला मॉड्यूल","oneCourse":"कोर्स","prevModule":"पिछला मॉड्यूल","returnToCourses":"कोर्स पर जायें","sectionTitle":"कोर्स","selectChapter":"मॉड्यूल चुनिये","selectContentFromCourse":"कोर्स के लिए कंटेन्ट का चयन करें","signinenrollTitle":"कोर्स में नामांकन हेतु लॉग इन करें","trainingAttended":"कोर्स में भाग लिया","userName":"उपयोगकर्ता का नाम"},"tab":{"courses":"कोर्स"}},"messages":{"dashboard":{"emsg":{"m002":"उपयोगकर्ता इस पाठ्यक्रम के किसी भी बैच में नामांकित नहीं है"}},"emsg":{"m0002":"यह कोर्स अभी उपलब्ध नहीं है","m0003":"इस कोर्स में कोई चलित बैच नहीं है"},"fmsg":{"m0001":"नामांकित कोर्स लाने में असमर्थ, पुनः प्रयास करें","m0002":"कोर्स लाने में असमर्थ, पुनः प्रयास करें","m0082":"यह कोर्स नामांकन के लिये उपलब्ध नहीं है","m0086":"यह कोर्स रचयिता द्वारा निवृत्त करने के कारण उपलब्ध नहीं है"},"imsg":{"m0001":"यह कोर्स अनुचित फ्लैग होने के कारण निरिक्षण में है।","m0026":"नमस्ते, फिलहाल यह कोर्स उपलब्ध नहीं है। शायद कोर्स रचियता ने कोर्स में परिवर्तन किया है"},"stmsg":{"m0125":"संसाधन, पुस्तक, कोर्स, या कलेक्शन अपलोड कीजिये। फिलहाल आपका कोई भी प्रालेख उपलब्ध नहीं है।"}}}},"tbk":{"nontrk":{"frmelmnts":{"lbl":{"ActivityTextbooks":"पाठ्यपुस्तकें","ACTIVITY_TEXTBOOK_TITLE":"पाठ्यपुस्तकें","chapter":"अध्याय","copyAsCourse":"कोर्स के रूप में कॉपी करें","desktop":{"deleteCollection":"{name} पाठ्यपुस्तक हटाने पर यह डाउनलोड फ़ोल्डर से भी हटा दिया जायेंगा| जारी रखने के लिए हटाएं बटन पर क्लिक करें।","downloadBook":"पाठ्यपुस्तक डाउनलोड करें","find_more":"{instance} पर अधिक पुस्तकें और कंटेंट ढूंढें","updateTextbook":"पाठ्यपुस्तक अद्यतित करें"},"dialCodeDescription":"QR कोड ६ वर्णाक्षर का मेल होता है, जो आपकी पाठ्यपुस्तक के QR कोड की छवि के नीचे छपा है","dialCodeDescriptionGetPage":"QR कोड ६ वर्णाक्षर का मेल होता है, जो आपकी पाठ्यपुस्तक के QR कोड की छवि के नीचे छपा है","downloadBooks":"ऑफ़लाइन रहते हुए अभिगम के लिए पुस्तकों को डाउनलोड करें","fromTheTextBook":"पाठ्यपुस्तक से","getUnlimitedAccess":"अपने मोबाइल पर पाठ्यपुस्तकों, पाठों और कोर्स का असीमित अभिगम प्राप्त करें","import":"ऑफ़लाइन रहते हुए अभिगम के लिए पुस्तकों को डाउनलोड करें","installAppDesc":"अपने डिवाइस पर पाठ, पाठ्यपुस्तकों और कंटेन्ट को ऑफ़लाइन सहेजे","mynotebook":"मेरी किताब","noBookfoundButtonText":"अधिक पुस्तकें और कंटेंट देखे","noBookfoundSubTitle":"आपके बोर्ड में अभी और किताबें नहीं हैं। {instance} पर अधिक पुस्तकें और कंटेन्ट देखने के लिए बटन पर क्लिक करें","noBookfoundTitle":"बोर्ड द्वारा पुस्तकें जोड़ी जा रही हैं","textbooks":"पाठ्यपुस्तकें"}},"messages":{"stmsg":{"m0125":"संसाधन, पुस्तक, कोर्स, या कलेक्शन अपलोड कीजिये। फिलहाल आपका कोई भी प्रालेख उपलब्ध नहीं है।"}}},"trk":{"frmelmnts":{"btn":{"enroll":"पढ़े","resumecourse":"पुनः पढ़ना शुरू करें","unenroll":"समाप्त"},"instn":{"t0062":"आपने इस पाठ्यपुस्तक के लिए अभी तक अध्ययन बैच नहीं बनाया है। एक बैच बनाएं और डैशबोर्ड की जांच करें","t0063":"आपने अभी तक कोई पाठ्यपुस्तक नहीं बनाई है। नई पाठ्यपुस्तक बनाएँ और डैशबोर्ड देखें।"},"lbl":{"accessCourse":"पाठ्यपुस्तक का अभिगम करें","accessToLogin":"पाठ्यपुस्तक का अभिगम करने के लिए आपको लॉग इन करना होगा और लर्निंग / रीडिंग बैच से जुड़ना होगा","ActivityCourses":"पाठ्यपुस्तक","ACTIVITY_COURSE_TITLE":"पाठ्यपुस्तक","addCourse":"पाठ्यपुस्तक जोड़ें","completedCourse":"आपके द्वारा पूर्ण पाठ्यपुस्तकें","completingCourseSuccessfully":"सफलतापूर्वक अभ्यास को पूरा करने के लिए,","copyAsCourse":"पाठ्यपुस्तक के रूप में कॉपी करें","courseDetails":"पाठ्यपुस्तक विवरण","courses":"पाठ्यपुस्तकें","coursestructure":"अध्याय","joinTrainingToAcessContent":"कंटेन्ट तक पहुंचने के लिए, आपको अभ्यास बैच में शामिल होना होगा","moduleFinish":"आपने यह अध्याय पूर्ण किया है","moduleProgress":"अध्याय की प्रगति","mytrainings":"मेरी डिजिटल पाठ्यपुस्तकें","nextModule":"अगला अध्याय","oneCourse":"डिजिटल पाठ्यपुस्तक","prevModule":"पिछला अध्याय","sectionTitle":"डिजिटल पाठ्यपुस्तकें","selectChapter":"अध्याय चुनिए","trainingAttended":"पढ़ी हुई पाठ्यपुस्तकें","courseContainCertificate":"यह अध्ययन आपको प्रमाणपत्र प्रदान करता है","courseDontContainCertificate":"फिलहाल इस कोर्स में प्रमाणपत्र नहीं है| कोर्स निर्माता बाद में प्रमाण-पत्र संलग्न कर सकता है।"},"tab":{"courses":"डिजिटल पाठ्यपुस्तक"}},"messages":{"emsg":{"m0002":"यह पाठ्यपुस्तक अब उपलब्ध नहीं है"},"fmsg":{"dataSettingNotSubmitted":"प्रोफ़ाइल साझाकरण सेटिंग अद्यतित नहीं की जा सकी। पुन: प्रयास करें","m0001":"क्षमा करें! हम वह पाठ्यपुस्तक नहीं ला सके जिसे आप ढूंढ रहे थे। पुनः प्रयास करें","m0002":"क्षमा करें! हम आपके लिए अन्य पाठ्यपुस्तकें नहीं प्राप्त कर सके। पुनः प्रयास करें","m0086":"यह पाठ्यपुस्तक अब उपलब्ध नहीं है"}}}},"tvc":{"nontrk":{"frmelmnts":{"lbl":{"ActivityTvClasses":"टीवी कक्षाएँ","ACTIVITY_TEXTBOOK_TITLE":"टीवी कक्षाएँ","ACTIVITY_TV_CLASS_TITLE":"टीवी कक्षाएँ","chapter":"टीवी कार्यक्रम","collection_tv_classes":"टीवी कक्षाएँ","desktop":{"downloadBook":"टीवी कक्षाएँ डाउनलोड करें","downloadTVclasses":"टीवी कक्षाएं डाउनलोड करें","find_more":"{instance} पर अधिक टीवी कक्षाएं और संबंधित कंटेन्ट खोजें","find_more_TVclasses":"{instance} पर अधिक टीवी कक्षाएं और संबंधित कंटेन्ट खोजें","updateTextbook":"टीवी कक्षाएँ अद्यतित करें","updateTVclasses":"टीवी कक्षाएँ अद्यतित करें"},"downloadBooks":"ऑफ़लाइन अभिगम के लिए टीवी कक्षाएं डाउनलोड करें","downloadTVclasses":"ऑफ़लाइन अभिगम के लिए टीवी कक्षाएं डाउनलोड करें","fromTheTextBook":"टीवी कक्षा से","fromTheTVclasses":"टीवी क्लास से","noBookfoundTitle":"बोर्ड द्वारा टीवी कक्षाएँ जोड़ी जा रही हैं","textbooks":"टीवी कक्षाएँ","TVclassesfoundTitle":"बोर्ड द्वारा टीवी कक्षाएँ जोड़ी जा रही हैं","tv_classes":"टीवी कक्षाएँ","tv_program":"टीवी कार्यक्रम"}}},"trk":{"frmelmnts":{"btn":{"enroll":"देखें","resumecourse":"पुनः देखना शुरू करें"},"instn":{"t0062":"आपने अभी तक इस टीवी वर्ग के लिए कोई अध्ययन बैच नहीं बनाया है। बैच बनाएँ और डैशबोर्ड की जांच करें","t0063":"आपने अभी तक कोई टीवी क्लास नहीं बनाई है। नई टीवी क्लास बनाए और डैशबोर्ड देखें।"},"lbl":{"accessCourse":"टीवी कक्षाओं का अभिगम करें","accessToLogin":"टीवी कक्षाओं के अभिगम के लिए आपको लॉग इन कर अभ्यास बैच में शामिल होना होगा","ActivityCourses":"टीवी कक्षाएँ","ACTIVITY_COURSE_TITLE":"टीवी कक्षाएँ","addCourse":"टीवी कक्षा जोड़ें","completedCourse":"पूर्ण टीवी कक्षाएँ","copyAsCourse":"टीवी कक्षा के रूप मे कॉपी करें","courseContainCertificate":"यह अध्ययन आपको प्रमाणपत्र प्रदान करता है","courseDetails":"टीवी क्लास विवरण","courses":"टीवी कक्षाएँ","coursestructure":"टीवी कार्यक्रम","moduleFinish":"आपने यह कार्यक्रम पूर्ण किया है","moduleProgress":"कार्यक्रम की प्रगति","mytrainings":"मेरी टीवी कक्षाएँ","nextModule":"अगला कार्यक्रम","oneCourse":"टीवी कक्षा","prevModule":"पिछला कार्यक्रम","sectionTitle":"टीवी कक्षाएँ","selectChapter":"कार्यक्रम चुनिए","trainingAttended":"आपके द्वारा देखी गयी टीवी कक्षाएँ","courseDontContainCertificate":"फिलहाल इस कोर्स में प्रमाणपत्र नहीं है| कोर्स निर्माता बाद में प्रमाण-पत्र संलग्न कर सकता है।"},"tab":{"courses":"टीवी कक्षाएँ"}},"messages":{"emsg":{"m0002":"यह टीवी कक्षा कार्य अब उपलब्ध नहीं है"},"fmsg":{"m0001":"क्षमा करें! हम वह टीवी कक्षा नहीं ला सके जिसे आप ढूंढ रहे थे। पुनः प्रयास करें","m0002":"क्षमा करें! हम आपके लिए अन्य टीवी कक्षाएँ प्राप्त नहीं कर सके। पुनः प्रयास करें","m0086":"यह टीवी क्लास अब उपलब्ध नहीं है"}}}}}
diff --git a/utils/portal/labels/all_labels_kn.json b/utils/portal/labels/all_labels_kn.json
new file mode 100644
index 000000000..a30355af4
--- /dev/null
+++ b/utils/portal/labels/all_labels_kn.json
@@ -0,0 +1 @@
+{"dflt":{"nontrk":{"frmelmnts":{"btn":{"create":"ರಚಿಸಿ"},"lbl":{"ActivityTextbooks":"ಟಾಸ್ಕ್ ಗಳು","ACTIVITY_TEXTBOOK_TITLE":"ಟಾಸ್ಕ್ ಗಳು","chapter":"ಕಲಿಕಾ ಮಾಡ್ಯೂಲ್","collection_task":"ಟಾಸ್ಕ್ ಗಳು","desktop":{"download":"ಡೌನ್ಲೋಡ್","downloadBook":"ಡೌನ್ಲೋಡ್","find_more":"ಇನ್ನೂ ಹೆಚ್ಚು ಪಠ್ಯಾಂಶ ನೋಡಿ","find_more_tasks":"ಇನ್ನೂ ಹೆಚ್ಚು ಪಠ್ಯಾಂಶ ನೋಡಿ","update":"ಅಪ್ ಡೇಟ್","updateTextbook":"ಅಪ್ ಡೇಟ್"},"downloadBooks":"ಆಫ್ಲೈನ್ ಲಭ್ಯತೆಗೆ ಡೌನ್ಲೋಡ್ ಮಾಡಿ","downloadoffline":"ಆಫ್ಲೈನ್ ಲಭ್ಯತೆಗೆ ಡೌನ್ಲೋಡ್ ಮಾಡಿ","download_to_access_offline":"ಆಫ್ಲೈನ್ ಲಭ್ಯತೆಗೆ ಡೌನ್ಲೋಡ್ ಮಾಡಿ","fromTheLearningTask":"ಕಲಿಕಾ ಟಾಸ್ಕ್ ನಿಂದ","fromTheTextBook":"ಕಲಿಕಾ ಟಾಸ್ಕ್ ನಿಂದ","import":"ಆಫ್ಲೈನ್ ಲಭ್ಯತೆಗೆ ಡೌನ್ಲೋಡ್ ಮಾಡಿ","learningmodule":"ಕಲಿಕಾ ಮಾಡ್ಯೂಲ್","mynotebook":"ನನ್ನ ನೋಟ್ ಪುಸ್ತಕ","noBookfoundButtonText":"ಇನ್ನೂ ಹೆಚ್ಚು ನೋಡಿ","noBookfoundSubTitle":"ನಿಮ್ಮ ಮಂಡಳಿಯು ಪಠ್ಯಾಂಶವನ್ನು ಇನ್ನೂ ಸೇರಿಸಬೇಕಿದೆ. {instance} ದಲ್ಲಿ ಹೆಚ್ಚು ಪಠ್ಯಾಂಶ ನೋಡಲು ಬಟನ್ ಒತ್ತಿ","noBookfoundTitle":"ಮಂಡಳಿಯು ಪಠ್ಯಾಂಶಗಳನ್ನು ಸೇರಿಸುತ್ತಿದೆ","noTaskfoundSubTitle":"ನಿಮ್ಮ ಮಂಡಳಿಯು ಪಠ್ಯಾಂಶವನ್ನು ಇನ್ನೂ ಸೇರಿಸಬೇಕಿದೆ. {instance} ದಲ್ಲಿ ಹೆಚ್ಚು ಪಠ್ಯಾಂಶ ನೋಡಲು ಬಟನ್ ಒತ್ತಿ","noTaskfoundTitle":"ಮಂಡಳಿಯು ಪುಸ್ತಕಗಳನ್ನು ಸೇರಿಸುತ್ತಿದೆ","seemore":"ಇನ್ನೂ ಹೆಚ್ಚು ನೋಡಿ","task":"ಟಾಸ್ಕ್ ಗಳು","tasks":"ಟಾಸ್ಕ್ ಗಳು","task_title":"ಟಾಸ್ಕ್ ಗಳು","textbooks":"ಟಾಸ್ಕ್ ಗಳು"}},"messages":{"stmsg":{"m0125":"ಪಠ್ಯಾಂಶ ರಚಿಸಲು ಅಥವಾ ಅಪ್ಲೋಡ್ ಮಾಡಲು ಆರಂಭಿಸಿ. ಸದ್ಯ ನೀವು ಯಾವುದೇ ಪಠ್ಯಾಂಶವನ್ನು ಡ್ರಾಫ್ಟ್ ಎಂದು ಸೇವ್ ಮಾಡಿಲ್ಲ","ms0001":"ಪಠ್ಯಾಂಶ ರಚಿಸಲು ಅಥವಾ ಅಪ್ಲೋಡ್ ಮಾಡಲು ಆರಂಭಿಸಿ. ಸದ್ಯ ನೀವು ಯಾವುದೇ ಪಠ್ಯಾಂಶವನ್ನು ಡ್ರಾಫ್ಟ್ ಎಂದು ಸೇವ್ ಮಾಡಿಲ್ಲ"}}},"trk":{"completed_learning":"ಕಲಿಕೆಯು ಪೂರ್ಣವಾಯಿತು","essages":{"fmsg":{"m0082":"ಈ ಕಲಿಕಾ ಟಾಸ್ಕ್ ಇನ್ನೂ ಆರಂಭವಾಗಿಲ್ಲ. ನೀವು ಇದಕ್ಕೆ ಸೇರಲು ಆಗುವುದಿಲ್ಲ"}},"frmelmnts":{"btn":{"create":"ರಚಿಸಿ","enroll":"ಸೇರಿ","resumecourse":"ಪುನರಾರಂಭಿಸಿ","unenroll":"ಬಿಡಿ","viewcoursestats":"ಅಂಕಿಅಂಶ ವೀಕ್ಷಿಸಿ","viewCourseStatsDashboard":"ಡ್ಯಾಶ್ ಬೋರ್ಡ್ ನೋಡಿ"},"instn":{"t0062":"ನೀವು ಈ ಟಾಸ್ಕ್ ಗೆ ಇನ್ನೂ ಯಾವುದೇ ಬ್ಯಾಚ್ ರಚಿಸಿಲ್ಲ. ಒಂದು ಟಾಸ್ಕ್ ರಚಿಸಿ ಮತ್ತು ಡ್ಯಾಶ್ ಬೋರ್ಡ್ ಪರಿಶೀಲಿಸಿ","t0063":"ನೀವು ಇನ್ನೂ ಯಾವುದೇ ಟಾಸ್ಕ್ ರಚಿಸಿಲ್ಲ. ಒಂದು ಹೊಸ ಟಾಸ್ಕ್ ರಚಿಸಿ ಮತ್ತು ಡ್ಯಾಶ್ ಬೋರ್ಡ್ ಪುನಃ ಪರಿಶೀಲಿಸಿ"},"lbl":{"accessCourse":"ಕಲಿಕಾ ಸಾಮಗ್ರಿಯ ಲಭ್ಯತೆ","accessToLogin":"ಪಠ್ಯಾಂಶದ ಲಭ್ಯತೆ ಹೊಂದಲು, ನೀವು ಲಾಗ್ ಇನ್ ಆಗಿ, ಟಾಸ್ಕ್ ಸೇರಬೇಕು","ActivityCourses":"ಟಾಸ್ಕ್ ಗಳು","ACTIVITY_COURSE_TITLE":"ಟಾಸ್ಕ್ ಗಳು","addCourse":"ಸೇರಿಸಿ","completedCourse":"ಪೂರ್ಣಗೊಂಡ ಟಾಸ್ಕ್ ಗಳು","completingCourseSuccessfully":"ಯಶಸ್ವಿಯಾಗಿ ಕಲಿಕೆಯನ್ನು ಪೂರ್ಣಗೊಳಿಸಲು,","copyAsCourse":"ಕಲಿಕಾ ಸಾಮಗ್ರಿಯಂತೆ ಕಾಪಿ ಮಾಡಿ","courseContainCertificate":"ಈ ಕಲಿಕೆಯು ನಿಮಗೆ ಪ್ರಮಾಣಪತ್ರವನ್ನು ನೀಡುತ್ತದೆ","courseDetails":"ಕಲಿಕಾ ವಿವರಗಳು","courseProgress":"ಪ್ರಗತಿ","courseRelevantFor":"ಈ ಕಲಿಕೆಯು ಇವರಿಗೆ ಪ್ರಸ್ತುತವಾಗಿದೆ:","courses":"ಟಾಸ್ಕ್ ಗಳು","coursestructure":"ಕಲಿಕಾ ಮಾಡ್ಯೂಲ್","courseSuccessMessage":"ನೀವು ಯಶಸ್ವಿಯಾಗಿ ನಿಮ್ಮ ಕಲಿಕೆಯನ್ನು ಪೂರ್ಣಗೊಳಿಸಿದಿರಿ","courseSuccessNotificationMessage":"ನೀವು 7 ದಿನಗಳ ಒಳಗಾಗಿ ನಿಮ್ಮ ನೋಂದಾಯಿತ ಸಂಪರ್ಕ ವಿವರಕ್ಕೆ ಪ್ರಮಾಣಪತ್ರದ ಕುರಿತು ಸೂಚನೆ ಪಡೆಯುವಿರಿ","courseWithoutCertificateNote":"ಟಿಪ್ಪಣಿ: ಈ ಕಲಿಕೆಯು ನಿಮಗೆ ಪ್ರಮಾಣಪತ್ರ ನೀಡುವುದಿಲ್ಲ","dashboardnocourseselected":"ಏನೂ ಆಯ್ಕೆ ಮಾಡಿಲ್ಲ","dashboardnocourseselecteddesc":"ಪಟ್ಟಿಯಿಂದ ಆಯ್ಕೆ ಮಾಡಿ","downloadCourseQRCode":"QR Code ಡೌನ್ಲೋಡ್ ಮಾಡಿ","downloadQRCode":{"tooltip":"QR codes ಡೌನ್ಲೋಡ್ ಗೆ ಇಲ್ಲಿ ಒತ್ತಿ ಮತ್ತು ಅವನ್ನು ನೀವು ಪ್ರಕಟಿಸಿದ್ದಕ್ಕೆ ಲಿಂಕ್ ಮಾಡಿ"},"getUnlimitedAccess":"ನಿಮ್ಮ ಮೊಬೈಲ್ ಫೋನಿನಲ್ಲಿ ಪಠ್ಯಪುಸ್ತಕಗಳು, ಟಿವಿ ತರಗತಿಗಳು ಮತ್ತು ಕೋರ್ಸ್ ಗೆ ಆಫ್ಲೈನ್ನಲ್ಲಿ ಮಿತಿಯಿಲ್ಲದ ಲಭ್ಯತೆ ಪಡೆಯಿರಿ","joinTrainingToAcessContent":"ಪಠ್ಯಾಂಶದ ಲಭ್ಯತೆ ಹೊಂದಲು, ನೀವು ಲಾಗ್ ಇನ್ ಆಗಿ, ಟಾಸ್ಕ್ ಸೇರಬೇಕು","moduleFinish":"ನೀವು ಈ ಟಾಸ್ಕ್ ಮುಗಿಸಿದ್ದೀರಿ","moduleProgress":"ಟಾಸ್ಕ್ ಪ್ರಗತಿ","mytrainings":"ನನ್ನ ಟಾಸ್ಕ್ ಗಳು","nextModule":"ಮುಂದಿನ ಟಾಸ್ಕ್","oneCourse":"ಟಾಸ್ಕ್","prevModule":"ಹಿಂದಿನ ಟಾಸ್ಕ್","returnToCourses":"ಹಿಂದೆ","sectionTitle":"ಟಾಸ್ಕ್ ಗಳು","selectChapter":"ಟಾಸ್ಕ್ ಆಯ್ಕೆ ಮಾಡಿ","selectContentFromCourse":"ಪಠ್ಯಾಂಶಗಳನ್ನು ಆಯ್ಕೆ ಮಾಡಿ","trainingAttended":"ಕಲಿಕೆಗೆ ಹಾಜರಾಗಿದ್ದು","courseDontContainCertificate":"ಪ್ರಸ್ತುತ, ಈ ಕಲಿಕಾ ಟಾಸ್ಕ್ ಗೆ ಪ್ರಮಾಣಪತ್ರ ಇಲ್ಲ. ಟಾಸ್ಕ್ ರಚಿಸಿದವರು ನಂತರ ಇದಕ್ಕೆ ಪ್ರಮಾಣಪತ್ರವನ್ನು ಲಗತ್ತಿಸಬಹುದು."},"tab":{"courses":"ಟಾಸ್ಕ್ ಗಳು"}},"messages":{"dashboard":{"emsg":{"m002":"ಬಳಕೆದಾರರು ಈ ಕಲಿಕಾ ಟಾಸ್ಕ್ ಗೆ ಇನ್ನೂ ಯಾವುದೇ ಬ್ಯಾಚ್ ಸೇರಿಲ್ಲ"}},"emsg":{"m0002":"ಈ ಕಲಿಕಾ ಟಾಸ್ಕ್ ಇನ್ನು ಮುಂದೆ ಲಭ್ಯವಿಲ್ಲ","m0003":"ಈ ಕಲಿಕಾ ಟಾಸ್ಕ್ ತೆರೆದಿರುವ ಬ್ಯಾಚ್ ಹೊಂದಿಲ್ಲ"},"fmsg":{"dataSettingNotSubmitted":"ಪ್ರೊಫೈಲ್ ಹಂಚಿಕೆ ಸೆಟ್ಟಿಂಗ್ಸ್ ನವೀಕರಿಸಲಾಗಲಿಲ್ಲ. ಬಳಿಕ ಪುನಃ ಪ್ರಯತ್ನಿಸಿ.","m0001":"ಕ್ಷಮಿಸಿ! ನೀವು ನೋಂದಾಯಿಸಿದ ಕಲಿಕಾ ಟಾಸ್ಕ್ ಕುರಿತ ಮಾಹಿತಿಯನ್ನು ಪಡೆಯಲು ಆಗಲಿಲ್ಲ. ಬಳಿಕ ಪುನಃ ಪ್ರಯತ್ನಿಸಿ","m0002":"ಕ್ಷಮಿಸಿ! ನಿಮಗಾಗಿ ಕಲಿಕಾ ಟಾಸ್ಕ್ ಪಡೆಯಲು ಆಗಲಿಲ್ಲ, ಬಳಿಕ ಪುನಃ ಪ್ರಯತ್ನಿಸಿ","m0086":"ಈ ಪಠ್ಯಾಂಶವು ಇನ್ನು ಮುಂದೆ ಲಭ್ಯವಿಲ್ಲ"},"imsg":{"m0001":"ಈ ಪಠ್ಯಾಂಶವನ್ನು ಸೂಕ್ತವಾಗಿಲ್ಲ ಎಂದು ಫ್ಲಾಗ್ ಮಾಡಲಾಗಿದೆ. ಇದು ಸದ್ಯ ಪರಿಶೀಲನೆಯಲ್ಲಿದೆ","m0026":"ಹಲೋ, ಈ ಪಠ್ಯಾಂಶವು ಪ್ರಸ್ತುತ ಲಭ್ಯವಿಲ್ಲ. ಇದನ್ನು ಬದಲಾಯಿಸುತ್ತಿರಬಹುದು"},"stmsg":{"m0125":"ಪಠ್ಯಾಂಶ ರಚಿಸಲು ಅಥವಾ ಅಪ್ಲೋಡ್ ಮಾಡಲು ಆರಂಭಿಸಿ. ಸದ್ಯ ನೀವು ಯಾವುದೇ ಕರಡು ಪಠ್ಯಾಂಶವನ್ನು ಸೇವ್ ಮಾಡಿಲ್ಲ"}}}},"crs":{"nontrk":{"frmelmnts":{"lbl":{"ActivityTextbooks":"ಕೋರ್ಸ್ ಗಳು","ACTIVITY_TEXTBOOK_TITLE":"ಕೋರ್ಸ್ ಗಳು","chapter":"ಕೋರ್ಸ್ ಮಾಡ್ಯೂಲ್","desktop":{"downloadBook":"ಕೋರ್ಸ್ ಡೌನ್ಲೋಡ್ ಮಾಡಿ","find_more":"{instance} ದಲ್ಲಿ ಹೆಚ್ಚು ಕೋರ್ಸ್ ಗಳು ಮತ್ತು ಸಂಬಂಧಿತ ಪಠ್ಯಾಂಶವನ್ನು ನೋಡಿ","updateTextbook":"ಕೋರ್ಸ್ ಅಪ್ಡೇಟ್ ಮಾಡಿ"},"downloadBooks":"ಆಫ್ಲೈನ್ ಲಭ್ಯತೆಗೆ ಕೋರ್ಸ್ ಗಳನ್ನು ಡೌನ್ಲೋಡ್ ಮಾಡಿ","fromTheTextBook":"ಕೋರ್ಸ್ ನಿಂದ","noBookfoundTitle":"ಮಂಡಳಿಯು ಕೋರ್ಸ್ ಗಳನ್ನು ಸೇರಿಸುತ್ತಿದೆ","textbooks":"ಕೋರ್ಸ್ ಗಳು"}}},"trk":{"completedCourse":"ಕೋರ್ಸ್ ಪೂರ್ಣಗೊಂಡಿತು","frmelmnts":{"btn":{"createCourse":"ಕೋರ್ಸ್ ರಚಿಸಿ","enroll":"ಕೋರ್ಸ್ ಗೆ ಸೇರಿ","resumecourse":"ಕೋರ್ಸ್ ಪುನರಾರಂಭಿಸಿ","unenroll":"ಕೋರ್ಸ್ ಬಿಡಿ","viewcoursestats":"ಕೋರ್ಸ್ ನ ಅಂಕಿಅಂಶಗಳನ್ನು ವೀಕ್ಷಿಸಿ","viewCourseStatsDashboard":"ಕೋರ್ಸ್ ಡ್ಯಾಶ್ ಬೋರ್ಡ್ ವೀಕ್ಷಿಸಿ"},"instn":{"t0062":"ಈ ಕೋರ್ಸ್ ಗೆ ನೀವಿನ್ನೂ ಬ್ಯಾಚ್ ರಚಿಸಿಲ್ಲ. ಹೊಸ ಬ್ಯಾಚ್ ರಚಿಸಿ ಮತ್ತು ಡ್ಯಾಶ್ ಬೋರ್ಡ್ ಅನ್ನು ಪರಿಶೀಲಿಸಿ.","t0063":"ನೀವು ಇನ್ನೂ ಯಾವುದೇ ಕೋರ್ಸ್ ರಚಿಸಿಲ್ಲ. ಹೊಸ ಕೋರ್ಸ್ ರಚಿಸಿ ಮತ್ತು ಡ್ಯಾಶ್ ಬೋರ್ಡ್ ಅನ್ನು ಪುನಃ ಪರಿಶೀಲಿಸಿ."},"lbl":{"accessCourse":"ಕೋರ್ಸ್ ಪಡೆಯಿರಿ","accessToLogin":"ಕೋರ್ಸ್ ಲಭ್ಯತೆ ಹೊಂದಲು ನೀವು ಲಾಗ್ ಇನ್ ಆಗಿ, ಕೋರ್ಸ್ ಸೇರಿಕೊಳ್ಳಬೇಕು","ActivityCourses":"ಕೋರ್ಸ್ ಗಳು","ACTIVITY_COURSE_TITLE":"ಕೋರ್ಸ್ ಗಳು","addCourse":"ಕೋರ್ಸ್ ಸೇರಿಸಿ","completedCourse":"ಕೋರ್ಸ್ ಪೂರ್ಣಗೊಂಡಿತು","completingCourseSuccessfully":"ಯಶಸ್ವಿಯಾಗಿ ಕೋರ್ಸ್ ಪೂರ್ಣಗೊಳಿಸಲು,","copyAsCourse":"ಕೋರ್ಸ್ ನಂತೆ ಕಾಪಿ ಮಾಡಿ","courseContainCertificate":"ಇದೊಂದು ಪ್ರಮಾಣಪತ್ರದ ಕೋರ್ಸ್","courseDetails":"ಕೋರ್ಸ್ ವಿವರಗಳು","courseDontContainCertificate":"ಪ್ರಸ್ತುತ, ಈ ಕೋರ್ಸ್ ಗೆ ಪ್ರಮಾಣಪತ್ರ ಇಲ್ಲ. ಕೋರ್ಸ್ ರಚಿಸಿದವರು ನಂತರ ಇದಕ್ಕೆ ಪ್ರಮಾಣಪತ್ರವನ್ನು ಲಗತ್ತಿಸಬಹುದು.","courseLastUpdatedOn":"ಕೋರ್ಸ್ ಕೊನೆಯಬಾರಿ ನವೀಕರಿಸಿದ್ದು","courseProgress":"ಕೋರ್ಸ್ ಪ್ರಗತಿ","courseRelevantFor":"ಇವರಿಗೆ ಕೋರ್ಸ್ ಪ್ರಸ್ತುತವಾಗಿದೆ:","courses":"ಕೋರ್ಸ್ ಗಳು","coursestructure":"ಕೋರ್ಸ್ ಮಾಡ್ಯೂಲ್ ಗಳು","courseSuccessMessage":"ನೀವು ಈ ಕೋರ್ಸ್ ಯಶಸ್ವಿಯಾಗಿ ಪೂರ್ಣಗೊಳಿಸಿದಿರಿ","courseSuccessNotificationMessage":"ನೀವು 7 ದಿನಗಳ ಒಳಗಾಗಿ ನಿಮ್ಮ ನೋಂದಾಯಿತ ಸಂಪರ್ಕ ವಿವರಕ್ಕೆ ಕೋರ್ಸ್ ಪ್ರಮಾಣಪತ್ರದ ಕುರಿತು ಸೂಚನೆ ಪಡೆಯುವಿರಿ","courseWithoutCertificateNote":"ಟಿಪ್ಪಣಿ: ಈ ಕೋರ್ಸ್ ಗೆ ಪ್ರಮಾಣಪತ್ರ ಇಲ್ಲ","dashboardnocourseselected":"ಕೋರ್ಸ್ ಆಯ್ಕೆ ಮಾಡಿಲ್ಲ","dashboardnocourseselecteddesc":"ಮೇಲಿನ ಪಟ್ಟಿಯಿಂದ ಕೋರ್ಸ್ ಆಯ್ಕೆಮಾಡಿ","downloadCourseQRCode":"ಕೋರ್ಸ್ QR Code ಡೌನ್ಲೋಡ್ ಮಾಡಿ","downloadQRCode":{"tooltip":"QR code ಡೌನ್ಲೋಡ್ ಮಾಡಲು ಇಲ್ಲಿ ಒತ್ತಿ ಮತ್ತು ಅವನ್ನು ಪ್ರಕಟಿಸಿದ ಕೋರ್ಸ್ ಗಳಿಗೆ ಕೊಂಡಿಯಾಗಿಸಿ"},"enrollcourse":"ಕೋರ್ಸ್ ಗೆ ಸೇರಿ","getUnlimitedAccess":"ನಿಮ್ಮ ಮೊಬೈಲ್ ಫೋನಿನಲ್ಲಿ ಪಠ್ಯಪುಸ್ತಕಗಳು, ಪಾಠಗಳು ಮತ್ತು ಕೋರ್ಸ್ ಗೆ ಆಫ್ಲೈನ್ನಲ್ಲಿ ಮಿತಿಯಿಲ್ಲದ ಲಭ್ಯತೆ ಪಡೆಯಿರಿ","joinTrainingToAcessContent":"ಪಠ್ಯಾಂಶದ ಪೂರ್ಣ ಲಭ್ಯತೆ ಪಡೆಯಲು ನೀವು ಕೋರ್ಸ್ ಗೆ ಸೇರಿಕೊಳ್ಳಬೇಕು","moduleFinish":"ನೀವು ಈ ಮಾಡ್ಯೂಲನ್ನು ಮುಗಿಸಿದ್ದೀರಿ","moduleProgress":"ಮಾಡ್ಯೂಲ್ ಪ್ರಗತಿ","mytrainings":"ನನ್ನ ಕೋರ್ಸ್ ಗಳು","nextModule":"ಮುಂದಿನ ಮಾಡ್ಯೂಲ್","oneCourse":"ಕೋರ್ಸ್","prevModule":"ಹಿಂದಿನ ಮಾಡ್ಯೂಲ್","returnToCourses":"ಕೋರ್ಸ್ ಗೆ ಹಿಂತಿರುಗಿ","sectionTitle":"ಕೋರ್ಸ್ ಗಳು","selectChapter":"ಮಾಡ್ಯೂಲ್ ಆಯ್ಕೆ ಮಾಡಿ","selectContentFromCourse":"ಕೋರ್ಸ್ ಗೆ ಪಠ್ಯಾಂಶಗಳನ್ನು ಆಯ್ಕೆ ಮಾಡಿ","signinenrollTitle":"ಈ ಕೋರ್ಸ್ ಸೇರಲು ಲಾಗ್ ಇನ್ ಆಗಿ","trainingAttended":"ಹಾಜರಾದ ಕೋರ್ಸ್ ಗಳು","userName":"ಬಳಕೆದಾರರ ಹೆಸರು"},"tab":{"courses":"ಕೋರ್ಸ್ ಗಳು"}},"messages":{"dashboard":{"emsg":{"m002":"ಬಳಕೆದಾರರು ಈ ಕೋರ್ಸ್ ನ ಯಾವುದೇ ಬ್ಯಾಚಿಗೆ ದಾಖಲಾಗಿಲ್ಲ"}},"emsg":{"m0002":"ಕೋರ್ಸ್ ಈಗ ಲಭ್ಯವಿಲ್ಲ","m0003":"ಈ ಕೋರ್ಸ್ ಯಾವುದೇ ಓಪನ್ ಬ್ಯಾಚ್ ಹೊಂದಿಲ್ಲ"},"fmsg":{"m0001":"ನೋಂದಾಯಿತ ಕೋರ್ಸ್ ಗಳನ್ನು ಪಡೆಯಲು ವಿಫಲವಾಯಿತು, ಬಳಿಕ ಪುನಃ ಪ್ರಯತ್ನಿಸಿ","m0002":"ಇತರ ಕೋರ್ಸುಗಳನ್ನು ಪಡೆಯಲು ಆಗಲಿಲ್ಲ, ಬಳಿಕ ಪುನಃ ಪ್ರಯತ್ನಿಸಿ","m0082":"ಈ ಕೋರ್ಸ್ ದಾಖಲಾತಿಗೆ ಇನ್ನೂ ತೆರೆದಿಲ್ಲ","m0086":"ಲೇಖಕರು ಈ ಕೋರ್ಸ್ ತೆಗೆದುಹಾಕಿದ್ದಾರೆ, ಹೀಗಾಗಿ ಅದು ಇನ್ನು ಲಭ್ಯವಾಗುವುದಿಲ್ಲ"},"imsg":{"m0001":"ಈ ಕೋರ್ಸ್ ಸೂಕ್ತವಲ್ಲವೆಂದು ಫ್ಲ್ಯಾಗ್ ಮಾಡಲಾಗಿದೆ ಮತ್ತು ಪ್ರಸ್ತುತ ಪರಿಶೀಲನೆಯಲ್ಲಿದೆ.","m0026":"ಹಾಯ್, ಈ ಕೋರ್ಸ್ ಈಗ ಲಭ್ಯವಿಲ್ಲ. ರಚನಾಕಾರರು ಕೋರ್ಸ್ ನಲ್ಲಿ ಕೆಲವು ಬದಲಾವಣೆಗಳನ್ನು ಮಾಡಿರಬಹುದು."},"stmsg":{"m0125":"ಸಂಪನ್ಮೂಲ, ಪುಸ್ತಕ, ಕೋರ್ಸ್, ಸಂಗ್ರಹ ಅಥವಾ ಅಪ್ ಲೋಡ್ ಅನ್ನು ರಚಿಸಲು ಆರಂಭಿಸಿ. ಈಗ ಸಧ್ಯಕ್ಕೆ ನಿಮ್ಮ ಯಾವುದೇ ಡ್ರಾಫ್ಟ್(ಕರಡು) ಕೆಲಸದ-ಪ್ರಗತಿಯಲ್ಲಿ ಇಲ್ಲ."}}}},"tbk":{"nontrk":{"frmelmnts":{"lbl":{"ActivityTextbooks":"ಪಠ್ಯಪುಸ್ತಕಗಳು","ACTIVITY_TEXTBOOK_TITLE":"ಪಠ್ಯ ಪುಸ್ತಕಗಳು","chapter":"ಅಧ್ಯಾಯ","copyAsCourse":"ಕೋರ್ಸ್ ನಂತೆ ಕಾಪಿ","desktop":{"deleteCollection":"{name} ಪಠ್ಯಪುಸ್ತಕವನ್ನು ಡಿಲೀಟ್ ಮಾಡಿದರೆ, ಅದು ಮೈ ಡೌನ್ಲೋಡ್ ನಿಂದ ತೆಗೆದುಹಾಕುತ್ತದೆ. ಮುಂದುವರೆಸಲು ಡಿಲೀಟ್ ಕ್ಲಿಕ್ ಮಾಡಿ.","downloadBook":"ಪಠ್ಯಪುಸ್ತಕ ಡೌನ್ಲೋಡ್ ಮಾಡಿ","find_more":"{instance} ದಲ್ಲಿ ಹೆಚ್ಚು ಪುಸ್ತಕಗಳು ಮತ್ತು ಪಠ್ಯಾಂಶವನ್ನು ನೋಡಿ","updateTextbook":"ಪಠ್ಯಪುಸ್ತಕ ಅಪ್ ಡೇಟ್ ಮಾಡಿ"},"dialCodeDescription":"QR ಕೋಡ್ ನಿಮ್ಮ ಪಠ್ಯ ಪುಸ್ತಕದಲ್ಲಿ QR ಸಂಕೇತದ ಕೆಳಗೆ ಕಂಡುಬರುವ 6 ಅಂಕಿಯ ಆಲ್ಫಾನ್ಯೂಮರಿಕ್ ಸಂಕೇತವಾಗಿದೆ","dialCodeDescriptionGetPage":"QR ಸಂಕೇತವು ನಿಮ್ಮ ಪಠ್ಯ ಪುಸ್ತಕದಲ್ಲಿ QR ಸಂಕೇತದ ಇಮೇಜ್ ಕೆಳಗೆ ಕಂಡುಬರುವ 6 ಅಂಕಿಯ ಆಲ್ಫಾನ್ಯೂಮರಿಕ್ ಸಂಕೇತವಾಗಿದೆ.","downloadBooks":"ಆಫ್ಲೈನ್ ಇದ್ದಾಗ ನೋಡಲು ಪುಸ್ತಕಗಳನ್ನು ಡೌನ್ಲೋಡ್ ಮಾಡಿ","fromTheTextBook":"ಪಠ್ಯಪುಸ್ತಕದಿಂದ","getUnlimitedAccess":"ನಿಮ್ಮ ಮೊಬೈಲ್ ಫೋನಿನಲ್ಲಿ ಪಠ್ಯಪುಸ್ತಕಗಳು, ಪಾಠಗಳು ಮತ್ತು ಕೋರ್ಸ್ ಗೆ ಆಫ್ಲೈನ್ನಲ್ಲಿ ಮಿತಿಯಿಲ್ಲದ ಲಭ್ಯತೆ ಪಡೆಯಿರಿ","import":"ಆಫ್ಲೈನ್ ಇದ್ದಾಗ ನೋಡಲು ಪುಸ್ತಕಗಳನ್ನು ಡೌನ್ಲೋಡ್ ಮಾಡಿ","installAppDesc":"ನಿಮ್ಮ ಡಿವೈಸಿನಲ್ಲಿ ಪಾಠಗಳು, ಪಠ್ಯಪುಸ್ತಕಗಳು ಮತ್ತು ಪಠ್ಯಾಂಶಗಳನ್ನು ಆಫ್ಲೈನಿನಲ್ಲಿ ಸಂಗ್ರಹಿಸಿ","mynotebook":"ನನ್ನ ನೋಟ್ ಪುಸ್ತಕ","noBookfoundButtonText":"ಹೆಚ್ಚು ಪುಸ್ತಕಗಳು ಮತ್ತು ಪಠ್ಯಾಂಶವನ್ನು ನೋಡಿ.","noBookfoundSubTitle":"ನಿಮ್ಮ ಮಂಡಳಿಯು ಹೆಚ್ಚು ಪುಸ್ತಕಗಳನ್ನು ಇನ್ನೂ ಸೇರಿಸಬೇಕಿದೆ. {instance} ದಲ್ಲಿ ಹೆಚ್ಚು ಪುಸ್ತಕಗಳು ಮತ್ತು ಪಠ್ಯಾಂಶವನ್ನು ನೋಡಲು ಬಟನ್ ಒತ್ತಿ","noBookfoundTitle":"ಮಂಡಳಿಯು ಪುಸ್ತಕಗಳನ್ನು ಸೇರಿಸುತ್ತಿದೆ","textbooks":"ಡಿಜಿಟಲ್ ಪಠ್ಯಪುಸ್ತಕಗಳು"}},"messages":{"stmsg":{"m0125":"ಸಂಪನ್ಮೂಲ, ಪುಸ್ತಕ, ಕೋರ್ಸ್, ಸಂಗ್ರಹ ಅಥವಾ ಅಪ್ ಲೋಡ್ ಅನ್ನು ರಚಿಸಲು ಆರಂಭಿಸಿ. ಈಗ ಸಧ್ಯಕ್ಕೆ ನಿಮ್ಮ ಯಾವುದೇ ಡ್ರಾಫ್ಟ್(ಕರಡು) ಕೆಲಸದ-ಪ್ರಗತಿಯಲ್ಲಿ ಇಲ್ಲ."}}},"trk":{"frmelmnts":{"btn":{"enroll":"ಓದಿ","resumecourse":"ಓದುವುದನ್ನು ಪುನರಾರಂಭಿಸಿ","unenroll":"ಕ್ಲೋಸ್"},"instn":{"t0062":"ನೀವು ಈ ಪಠ್ಯಪುಸ್ತಕಕ್ಕೆ ಇನ್ನೂ ಯಾವುದೇ ಕಲಿಕಾ/ಓದುವ ಬ್ಯಾಚ್ ರಚಿಸಿಲ್ಲ. ಒಂದು ಬ್ಯಾಚ್ ರಚಿಸಿ ಮತ್ತು ಡ್ಯಾಶ್ ಬೋರ್ಡ್ ಪರಿಶೀಲಿಸಿ","t0063":"ನೀವು ಇನ್ನೂ ಯಾವುದೇ ಪಠ್ಯಪುಸ್ತಕ ರಚಿಸಿಲ್ಲ. ಒಂದು ಪಠ್ಯಪುಸ್ತಕ ರಚಿಸಿ ಮತ್ತು ಡ್ಯಾಶ್ ಬೋರ್ಡ್ ಪರಿಶೀಲಿಸಿ."},"lbl":{"accessCourse":"ಪಠ್ಯಪುಸ್ತಕ ಪಡೆಯಿರಿ","accessToLogin":"ಪಠ್ಯಪುಸ್ತಕದ ಲಭ್ಯತೆ ಹೊಂದಲು ನೀವು ಲಾಗ್ ಇನ್ ಆಗಿ, ಕಲಿಕಾ/ಓದುವ ಬ್ಯಾಚ್ ಸೇರಬೇಕು","ActivityCourses":"ಪಠ್ಯಪುಸ್ತಕ","ACTIVITY_COURSE_TITLE":"ಪಠ್ಯಪುಸ್ತಕ","addCourse":"ಪಠ್ಯಪುಸ್ತಕ ಸೇರಿಸಿ","completedCourse":"ಪೂರ್ಣಗೊಳಿಸಿದ ಪಠ್ಯಪುಸ್ತಕಗಳು","completingCourseSuccessfully":"ಯಶಸ್ವಿಯಾಗಿ ಕಲಿಕೆಯನ್ನು ಪೂರ್ಣಗೊಳಿಸಲು,","copyAsCourse":"ಪಠ್ಯಪುಸ್ತಕದಂತೆ ಕಾಪಿ ಮಾಡಿ","courseDetails":"ಪಠ್ಯಪುಸ್ತಕದ ವಿವರಗಳು","courses":"ಪಠ್ಯಪುಸ್ತಕಗಳು","coursestructure":"ಅಧ್ಯಾಯ","joinTrainingToAcessContent":"ಪಠ್ಯಾಂಶವನ್ನು ಪಡೆಯಲು ನೀವು, ಲಾಗ್ ಇನ್ ಆಗಿ, ಕಲಿಕಾ ಬ್ಯಾಚ್ ಸೇರಬೇಕು","moduleFinish":"ನೀವು ಈ ಅಧ್ಯಾಯವನ್ನು ಮುಗಿಸಿದ್ದೀರಿ","moduleProgress":"ಅಧ್ಯಾಯದ ಪ್ರಗತಿ","mytrainings":"ನನ್ನ ಡಿಜಿಟಲ್ ಪಠ್ಯಪುಸ್ತಕಗಳು","nextModule":"ಮುಂದಿನ ಅಧ್ಯಾಯ","oneCourse":"ಡಿಜಿಟಲ್ ಪಠ್ಯಪುಸ್ತಕ","prevModule":"ಹಿಂದಿನ ಅಧ್ಯಾಯ","sectionTitle":"ಡಿಜಿಟಲ್ ಪಠ್ಯಪುಸ್ತಕಗಳು","selectChapter":"ಅಧ್ಯಾಯ ಆಯ್ಕೆ ಮಾಡಿ","trainingAttended":"ಪಠ್ಯಪುಸ್ತಕಗಳ ಓದು","courseContainCertificate":"ಈ ಕಲಿಕೆಯು ನಿಮಗೆ ಪ್ರಮಾಣಪತ್ರವನ್ನು ನೀಡುತ್ತದೆ","courseDontContainCertificate":"ಪ್ರಸ್ತುತ, ಈ ಕಲಿಕಾ ಟಾಸ್ಕ್ ಗೆ ಪ್ರಮಾಣಪತ್ರ ಇಲ್ಲ. ಟಾಸ್ಕ್ ರಚಿಸಿದವರು ನಂತರ ಇದಕ್ಕೆ ಪ್ರಮಾಣಪತ್ರವನ್ನು ಲಗತ್ತಿಸಬಹುದು."},"tab":{"courses":"ಡಿಜಿಟಲ್ ಪಠ್ಯಪುಸ್ತಕ"}},"messages":{"emsg":{"m0002":"ಈ ಪಠ್ಯಪುಸ್ತಕವು ಇನ್ನು ಮುಂದೆ ಲಭ್ಯವಿಲ್ಲ"},"fmsg":{"dataSettingNotSubmitted":"ಪ್ರೊಫೈಲ್ ಹಂಚಿಕೆ ಸೆಟ್ಟಿಂಗ್ಸ್ ನವೀಕರಿಸಲಾಗಲಿಲ್ಲ. ಬಳಿಕ ಪುನಃ ಪ್ರಯತ್ನಿಸಿ.","m0001":"ಕ್ಷಮಿಸಿ! ನೀವು ಹುಡುಕುತ್ತಿರುವ ಪಠ್ಯಪುಸ್ತಕವನ್ನು ಪಡೆಯಲು ಆಗಲಿಲ್ಲ. ಬಳಿಕ ಪುನಃ ಪ್ರಯತ್ನಿಸಿ","m0002":"ಕ್ಷಮಿಸಿ! ಬೇರೆ ಪಠ್ಯಪುಸ್ತಕಗಳನ್ನು ಪಡೆಯಲು ಆಗಲಿಲ್ಲ. ಬಳಿಕ ಪುನಃ ಪ್ರಯತ್ನಿಸಿ","m0086":"ಈ ಪಠ್ಯಪುಸ್ತಕವು ಇನ್ನು ಮುಂದೆ ಲಭ್ಯವಿಲ್ಲ"}}}},"tvc":{"nontrk":{"frmelmnts":{"lbl":{"ActivityTvClasses":"ಟಿವಿ ತರಗತಿಗಳು","ACTIVITY_TEXTBOOK_TITLE":"ಟಿವಿ ತರಗತಿಗಳು","ACTIVITY_TV_CLASS_TITLE":"ಟಿವಿ ತರಗತಿಗಳು","chapter":"ಟಿವಿ ಕಾರ್ಯಕ್ರಮ","collection_tv_classes":"ಟಿವಿ ತರಗತಿಗಳು","desktop":{"downloadBook":"ಟಿವಿ ತರಗತಿಗಳನ್ನು ಡೌನ್ಲೋಡ್ ಮಾಡಿ","downloadTVclasses":"ಟಿವಿ ತರಗತಿಗಳನ್ನು ಡೌನ್ಲೋಡ್ ಮಾಡಿ","find_more":"{instance} ದಲ್ಲಿ ಹೆಚ್ಚು ಟಿವಿ ತರಗತಿಗಳು ಮತ್ತು ಸಂಬಂಧಿತ ಪಠ್ಯಾಂಶವನ್ನು ನೋಡಿ","find_more_TVclasses":"{instance} ದಲ್ಲಿ ಹೆಚ್ಚು ಟಿವಿ ತರಗತಿಗಳು ಮತ್ತು ಸಂಬಂಧಿತ ಪಠ್ಯಾಂಶವನ್ನು ನೋಡಿ","updateTextbook":"ಟಿವಿ ತರಗತಿಗಳನ್ನು ನವೀಕರಿಸಿ","updateTVclasses":"ಟಿವಿ ತರಗತಿಗಳನ್ನು ನವೀಕರಿಸಿ"},"downloadBooks":"ಆಫ್ಲೈನ್ ಲಭ್ಯತೆಗೆ ಟಿವಿ ತರಗತಿಗಳನ್ನು ಡೌನ್ಲೋಡ್ ಮಾಡಿ","downloadTVclasses":"ಆಫ್ಲೈನ್ ಲಭ್ಯತೆಗೆ ಟಿವಿ ತರಗತಿಗಳನ್ನು ಡೌನ್ಲೋಡ್ ಮಾಡಿ","fromTheTextBook":"ಟಿವಿ ತರಗತಿಯಿಂದ","fromTheTVclasses":"ಟಿವಿ ತರಗತಿಯಿಂದ","noBookfoundTitle":"ಮಂಡಳಿಯು ಟಿವಿ ತರಗತಿಯನ್ನು ಸೇರಿಸುತ್ತಿದೆ","textbooks":"ಟಿವಿ ತರಗತಿಗಳು","TVclassesfoundTitle":"ಮಂಡಳಿಯು ಟಿವಿ ತರಗತಿಯನ್ನು ಸೇರಿಸುತ್ತಿದೆ","tv_classes":"ಟಿವಿ ತರಗತಿಗಳು","tv_program":"ಟಿವಿ ಕಾರ್ಯಕ್ರಮ"}}},"trk":{"frmelmnts":{"btn":{"enroll":"ವೀಕ್ಷಿಸಿ","resumecourse":"ನೋಡುವುದು ಪುನರಾರಂಭಿಸಿ"},"instn":{"t0062":"ನೀವು ಈ ಟಿವಿ ತರಗತಿಗೆ ಇನ್ನೂ ಯಾವುದೇ ಕಲಿಕಾ ಬ್ಯಾಚ್ ರಚಿಸಿಲ್ಲ. ಒಂದು ಬ್ಯಾಚ್ ರಚಿಸಿ ಮತ್ತು ಡ್ಯಾಶ್ ಬೋರ್ಡ್ ಪರಿಶೀಲಿಸಿ","t0063":"ನೀವು ಇನ್ನೂ ಯಾವುದೇ ಟಿವಿ ತರಗತಿ ರಚಿಸಿಲ್ಲ. ಒಂದು ಟಿವಿ ತರಗತಿ ರಚಿಸಿ ಮತ್ತು ಡ್ಯಾಶ್ ಬೋರ್ಡ್ ಪರಿಶೀಲಿಸಿ"},"lbl":{"accessCourse":"ಟಿವಿ ತರಗತಿಗಳನ್ನು ಪಡೆಯಿರಿ","accessToLogin":"ಟಿವಿ ತರಗತಿಯ ಲಭ್ಯತೆ ಹೊಂದಲು ನೀವು ಲಾಗ್ ಇನ್ ಆಗಿ, ಕಲಿಕಾ ಬ್ಯಾಚ್ ಸೇರಬೇಕು","ActivityCourses":"ಟಿವಿ ತರಗತಿಗಳು","ACTIVITY_COURSE_TITLE":"ಟಿವಿ ತರಗತಿಗಳು","addCourse":"ಟಿವಿ ತರಗತಿ ಸೇರಿಸಿ","completedCourse":"ಟಿವಿ ತರಗತಿಯು ಪೂರ್ಣಗೊಂಡಿತು","copyAsCourse":"ಟಿವಿ ತರಗತಿಯಂತೆ ಕಾಪಿ ಮಾಡಿ","courseContainCertificate":"ಈ ಕಲಿಕೆಯು ನಿಮಗೆ ಪ್ರಮಾಣಪತ್ರವನ್ನು ನೀಡುತ್ತದೆ","courseDetails":"ಟಿವಿ ತರಗತಿಯ ವಿವರಗಳು","courses":"ಟಿವಿ ತರಗತಿಗಳು","coursestructure":"ಟಿವಿ ಕಾರ್ಯಕ್ರಮ","moduleFinish":"ನೀವು ಈ ಕಾರ್ಯಕ್ರಮವನ್ನು ಮುಗಿಸಿದ್ದೀರಿ","moduleProgress":"ಕಾರ್ಯಕ್ರಮದ ಪ್ರಗತಿ","mytrainings":"ನನ್ನ ಟಿವಿ ತರಗತಿಗಳು","nextModule":"ಮುಂದಿನ ಕಾರ್ಯಕ್ರಮ","oneCourse":"ಟಿವಿ ತರಗತಿ","prevModule":"ಹಿಂದಿನ ಕಾರ್ಯಕ್ರಮ","sectionTitle":"ಟಿವಿ ತರಗತಿಗಳು","selectChapter":"ಕಾರ್ಯಕ್ರಮ ಆಯ್ಕೆ ಮಾಡಿ","trainingAttended":"ವೀಕ್ಷಿಸಿದ ಟಿವಿ ತರಗತಿಗಳು","courseDontContainCertificate":"ಪ್ರಸ್ತುತ, ಈ ಕಲಿಕಾ ಟಾಸ್ಕ್ ಗೆ ಪ್ರಮಾಣಪತ್ರ ಇಲ್ಲ. ಟಾಸ್ಕ್ ರಚಿಸಿದವರು ನಂತರ ಇದಕ್ಕೆ ಪ್ರಮಾಣಪತ್ರವನ್ನು ಲಗತ್ತಿಸಬಹುದು"},"tab":{"courses":"ಟಿವಿ ತರಗತಿಗಳು"}},"messages":{"emsg":{"m0002":"ಈ ಟಿವಿ ತರಗತಿ ಟಾಸ್ಕ್ ಇನ್ನು ಮುಂದೆ ಲಭ್ಯವಿಲ್ಲ"},"fmsg":{"m0001":"ಕ್ಷಮಿಸಿ! ನೀವು ಹುಡುಕುತ್ತಿರುವ ಟಿವಿ ತರಗತಿಗಳನ್ನು ಪಡೆಯಲು ಆಗಲಿಲ್ಲ. ಬಳಿಕ ಪುನಃ ಪ್ರಯತ್ನಿಸಿ","m0002":"ಕ್ಷಮಿಸಿ! ಬೇರೆ ಟಿವಿ ತರಗತಿಯನ್ನು ಪಡೆಯಲು ಆಗಲಿಲ್ಲ. ಬಳಿಕ ಪುನಃ ಪ್ರಯತ್ನಿಸಿ","m0086":"ಈ ಟಿವಿ ತರಗತಿಯು ಇನ್ನು ಮುಂದೆ ಲಭ್ಯವಿಲ್ಲ"}}}}}
diff --git a/utils/portal/labels/all_labels_ml.json b/utils/portal/labels/all_labels_ml.json
new file mode 100644
index 000000000..c843c841e
--- /dev/null
+++ b/utils/portal/labels/all_labels_ml.json
@@ -0,0 +1 @@
+{"dflt":{"nontrk":{"frmelmnts":{"btn":{"create":"സൃഷ്ടിക്കുക"},"lbl":{"ActivityTextbooks":"ടാസ്ക്കുകൾ","ACTIVITY_TEXTBOOK_TITLE":"ടാസ്ക്കുകൾ","chapter":"പഠന മൊഡ്യൂൾ","collection_task":"ടാസ്ക്കുകൾ","desktop":{"download":"ഡൗൺലോഡുചെയ്യുക","downloadBook":"ഡൗൺലോഡുചെയ്യുക","find_more":"കൂടുതൽ ഉള്ളടക്കം കണ്ടെത്തുക","find_more_tasks":"കൂടുതൽ ഉള്ളടക്കം കണ്ടെത്തുക","update":"അപ്ഡേറ്റ് ചെയ്യുക","updateTextbook":"അപ്ഡേറ്റ് ചെയ്യുക"},"downloadBooks":"ഓഫ്ലൈനിലായിരിക്കുമ്പോൾ ആക്സസ് ചെയ്യുന്നതിന് ഡൗൺലോഡ് ചെയ്യുക","downloadoffline":"ഓഫ്ലൈനിലായിരിക്കുമ്പോൾ ആക്സസ് ചെയ്യുന്നതിന് ഡൗൺലോഡ് ചെയ്യുക","download_to_access_offline":"ഓഫ്ലൈനിലായിരിക്കുമ്പോൾ ആക്സസ് ചെയ്യുന്നതിന് ഡൗൺലോഡ് ചെയ്യുക","fromTheLearningTask":"പഠന പ്രവർത്തനത്തിൽ നിന്ന്","fromTheTextBook":"പഠന പ്രവർത്തനത്തിൽ നിന്ന്","import":"ഓഫ്ലൈനിലായിരിക്കുമ്പോൾ ആക്സസ് ചെയ്യുന്നതിന് ഡൗൺലോഡ് ചെയ്യുക","learningmodule":"പഠന മൊഡ്യൂൾ","mynotebook":"എന്റെ നോട്ട്ബുക്ക്","noBookfoundButtonText":"കൂടുതൽ കാണുക","noBookfoundSubTitle":"നിങ്ങളുടെ ബോർഡ് ഇതുവരെ ഉള്ളടക്കം ചേർത്തിട്ടില്ല.{instance}ൽ കൂടുതൽ ഉള്ളടക്കം കാണാൻ ബട്ടൺ ടാപ്പുചെയ്യുക","noBookfoundTitle":"ബോർഡ് ഉള്ളടക്കം ചേർക്കുന്നു","noTaskfoundSubTitle":"നിങ്ങളുടെ ബോർഡ് ഇതുവരെ ഉള്ളടക്കം ചേർത്തിട്ടില്ല.{instance}ൽ കൂടുതൽ ഉള്ളടക്കം കാണാൻ ബട്ടൺ ടാപ്പുചെയ്യുക","noTaskfoundTitle":"ബോർഡ് ഉള്ളടക്കം ചേർക്കുന്നു","seemore":"കൂടുതൽ കാണുക","task":"ടാസ്കുകൾ","tasks":"ടാസ്ക്കുകൾ","task_title":"ടാസ്ക്കുകൾ","textbooks":"ടാസ്ക്കുകൾ"}},"messages":{"stmsg":{"m0125":"ഉള്ളടക്കം സൃഷ്ടിക്കുകയോ അപ്ലോഡുചെയ്യുകയോ ചെയ്യുക. നിങ്ങൾക്ക് നിലവിൽ ഡ്രാഫ്റ്റായി സംരക്ഷിച്ച ഉള്ളടക്കമൊന്നുമില്ല","ms0001":"ഉള്ളടക്കം സൃഷ്ടിക്കുകയോ അപ്ലോഡുചെയ്യുകയോ ചെയ്യുക. നിങ്ങൾക്ക് നിലവിൽ ഡ്രാഫ്റ്റായി സംരക്ഷിച്ച ഉള്ളടക്കമൊന്നുമില്ല"}}},"trk":{"completed_learning":"പഠനം പൂർത്തിയായിരിക്കുന്നു","essages":{"fmsg":{"m0082":"ഈ പഠന പ്രവർത്തനം ഇതുവരെ തുറന്നിട്ടില്ല. നിങ്ങൾക്ക് അതിൽ ചേരാനാവില്ല"}},"frmelmnts":{"btn":{"create":"സൃഷ്ടിക്കുക","enroll":"ചേരുക","resumecourse":"പുനരാരംഭിക്കുക","unenroll":"ഉപേക്ഷിക്കുക","viewcoursestats":"സ്ഥിതിവിവരക്കണക്കുകൾ കാണുക","viewCourseStatsDashboard":"ഡാഷ്ബോർഡ് കാണുക"},"instn":{"t0062":"ഈ ടാസ്കിനായി നിങ്ങൾ ഇതുവരെ ഒരു ബാച്ചും സൃഷ്ടിച്ചിട്ടില്ല. ഒരു ടാസ്ക് സൃഷ്ടിച്ച് ഡാഷ്ബോർഡ് പരിശോധിക്കുക","t0063":"നിങ്ങൾ ഇതുവരെ ഒരു ജോലിയും സൃഷ്ടിച്ചിട്ടില്ല. ഒരു പുതിയ ടാസ്ക് സൃഷ്ടിച്ച് ഡാഷ്ബോർഡ് വീണ്ടും പരിശോധിക്കുക."},"lbl":{"accessCourse":"പഠന സാമഗ്രികൾ ആക്സസ്സുചെയ്യുക","accessToLogin":"ഉള്ളടക്കം ആക്സസ് ചെയ്യുന്നതിന് നിങ്ങൾ ലോഗിൻ ചെയ്ത് ടാസ്കി ൽ ചേരണം","ActivityCourses":"ടാസ്ക്കുകൾ","ACTIVITY_COURSE_TITLE":"ടാസ്ക്കുകൾ","addCourse":"ചേർക്കുക","completedCourse":"ടാസ്ക്കുകൾ പൂർത്തിയായിരിക്കുന്നു","completingCourseSuccessfully":"പഠനം വിജയകരമായി പൂർത്തിയാക്കിയതിന്,","copyAsCourse":"പഠന സാമഗ്രിയായി പകർത്തുക","courseContainCertificate":"ഈ പഠനം നിങ്ങൾക്ക് ഒരു സർട്ടിഫിക്കറ്റ് വാഗ്ദാനം ചെയ്യുന്നു","courseDetails":"പഠന വിശദാംശങ്ങൾ","courseProgress":"പുരോഗതി","courseRelevantFor":"ഈ പഠനം ചുവടെ പറയുന്നവയ്ക് ഉചിതമാണ് :","courses":"ടാസ്ക്കുകൾ","coursestructure":"പഠന മൊഡ്യൂൾ","courseSuccessMessage":"നിങ്ങളുടെ പഠനം വിജയകരമായി പൂർത്തിയാക്കിയിരിക്കുന്നു","courseSuccessNotificationMessage":"7 ദിവസത്തിനുള്ളിൽ സർട്ടിഫിക്കറ്റിനെക്കുറിച്ച് രജിസ്റ്റർ ചെയ്ത കോൺടാക്റ്റ് വിശദാംശങ്ങളിൽ നിങ്ങളെ അറിയിക്കും","courseWithoutCertificateNote":"കുറിപ്പ്: ഈ പഠനം നിങ്ങൾക്ക് ഒരു സർട്ടിഫിക്കറ്റ് വാഗ്ദാനം ചെയ്യുന്നില്ല","dashboardnocourseselected":"തിരഞ്ഞെടുക്കലൊന്നും നടത്തിയിട്ടില്ല","dashboardnocourseselecteddesc":"ലിസ്റ്റിൽ നിന്ന് തിരഞ്ഞെടുക്കുക","downloadCourseQRCode":"QR കോഡ് ഡൗൺലോഡുചെയ്യുക","downloadQRCode":{"tooltip":"QR കോഡുകൾ ഡൗൺലോഡുചെയ്യാൻ ക്ലിക്കുചെയ്ത് അവ നിങ്ങളുടെ പ്രസിദ്ധീകരണത്തിലേക്ക് ലിങ്കുചെയ്യുക"},"getUnlimitedAccess":"നിങ്ങളുടെ മൊബൈൽ ഫോണിൽ പാഠപുസ്തകങ്ങൾ, ടിവി ക്ലാസുകൾ, കോഴ്സുകൾ എന്നിവ ഓഫ്ലൈനായി പരിധിയില്ലാതെ നേടുക.","joinTrainingToAcessContent":"ഉള്ളടക്കം ആക്സസ് ചെയ്യുന്നതിന് നിങ്ങൾ ലോഗിൻ ചെയ്ത് ടാസ്കിൽ ചേരണം","moduleFinish":"നിങ്ങൾ ഈ ടാസ്ക് പൂർത്തിയാക്കിയിരിക്കുന്നു","moduleProgress":"ടാസ്ക് പുരോഗതി","mytrainings":"എന്റെ ടാസ്ക്കുകൾ","nextModule":"അടുത്ത ടാസ്ക്","oneCourse":"ടാസ്ക്","prevModule":"മുമ്പത്തെ ടാസ്ക്","returnToCourses":"തിരികെ","sectionTitle":"ടാസ്ക്കുകൾ","selectChapter":"ടാസ്ക് തിരഞ്ഞെടുക്കുക","selectContentFromCourse":"ഉള്ളടക്കങ്ങൾ തിരഞ്ഞെടുക്കുക","trainingAttended":"പങ്കെടുത്ത പഠനം","courseDontContainCertificate":"നിലവിൽ, ഈ പഠന പ്രവർത്തനത്തിന് ഒരു സർട്ടിഫിക്കറ്റ് ഇല്ല. ടാസ്ക് സ്രഷ്ടാവിന് പിന്നീട് ഒരു സർട്ടിഫിക്കറ്റ് അറ്റാച്ചുചെയ്യാം"},"tab":{"courses":"ടാസ്ക്കുകൾ"}},"messages":{"dashboard":{"emsg":{"m002":"ഈ പഠന പ്രവർത്തനത്തിനായി ഉപയോക്താവ് ഒരു ബാച്ചിലും ചേർന്നിട്ടില്ല"}},"emsg":{"m0002":"ഈ പഠന പ്രവർത്തനം ഇനി ലഭ്യമല്ല","m0003":"ഈ പഠന പ്രവർത്തനത്തിന് ഒരു ഓപ്പൺ ബാച്ച് ഇല്ല"},"fmsg":{"dataSettingNotSubmitted":"പ്രൊഫൈൽ പങ്കിടൽ ക്രമീകരണങ്ങൾ അപ്ഡേറ്റുചെയ്യാനായില്ല. പിന്നീട് വീണ്ടും ശ്രമിക്കുക","m0001":"ക്ഷമിക്കണം! നിങ്ങൾ പേര് ചേർത്ത പഠന പ്രവർത്തനത്തിനായി ഞങ്ങൾക്ക് വിവരങ്ങൾ നേടാനായില്ല. പിന്നീട് വീണ്ടും ശ്രമിക്കുകv","m0002":"ക്ഷമിക്കണം! നിങ്ങൾക്കായി മറ്റ് പഠന പ്രവർത്തനങ്ങൾ ഞങ്ങൾക്ക് നേടാനായില്ല. പിന്നീട് വീണ്ടും ശ്രമിക്കുക","m0086":"ഈ ഉള്ളടക്കം ലഭ്യമല്ല"},"imsg":{"m0001":"ഈ ഉള്ളടക്കം അനുചിതമെന്ന് ഫ്ലാഗുചെയ്തു. ഇത് നിലവിൽ അവലോകനത്തിലാണ്","m0026":"ഹായ്, ഈ ഉള്ളടക്കം നിലവിൽ ലഭ്യമല്ല. ഇത് മാറ്റത്തിന് വിധേയമായിരിക്കാം"},"stmsg":{"m0125":"ഉള്ളടക്കം സൃഷ്ടിക്കുകയോ അപ്ലോഡുചെയ്യുകയോ ചെയ്യുക. നിലവിൽ നിങ്ങൾ ഒരു ഡ്രാഫ്റ്റ് ഉള്ളടക്കവും സംരക്ഷിച്ചിട്ടില്ല"}}}},"crs":{"nontrk":{"frmelmnts":{"lbl":{"ActivityTextbooks":"കോഴ്സുകൾ","ACTIVITY_TEXTBOOK_TITLE":"കോഴ്സുകൾ","chapter":"കോഴ്സ് മൊഡ്യൂൾ","desktop":{"downloadBook":"കോഴ്സ് ഡൗൺലോഡുചെയ്യുക","find_more":"{instance}ൽ കൂടുതൽ കോഴ്സുകളും അനുബന്ധ ഉള്ളടക്കവും കണ്ടെത്തുക","updateTextbook":"കോഴ്സ് അപ്ഡേറ്റുചെയ്യുക"},"downloadBooks":"ഓഫ്ലൈനിലായിരിക്കുമ്പോൾ ആക്സസ് ചെയ്യുന്നതിന് കോഴ്സുകൾ ഡൺലോഡ് ചെയ്യുക","fromTheTextBook":"കോഴ്സിൽ നിന്ന്","noBookfoundTitle":"ബോർഡ് കോഴ്സുകൾ ചേർക്കുന്നു","textbooks":"കോഴ്സുകൾ"}}},"trk":{"completedCourse":"കോഴ്സ് പൂർത്തിയായിരിക്കുന്നു","frmelmnts":{"btn":{"createCourse":"കോഴ്സ് സൃഷ്ടിക്കുക","enroll":"കോഴ്സിൽ ചേരുക","resumecourse":"കോഴ്സ് പുനരാരംഭിക്കുക","unenroll":"കോഴ്സ് ഉപേക്ഷിക്കുക","viewcoursestats":"കോഴ്സ് സ്ഥിതിവിവരക്കണക്കുകൾ കാണുക","viewCourseStatsDashboard":"കോഴ്സ് ഡാഷ്ബോർഡ് കാണുക"},"instn":{"t0062":"ഈ കോഴ്സിനായി നിങ്ങൾ ഇതുവരെ ഒരു ബാച്ച് സൃഷ്ടിച്ചിട്ടില്ല. പുതിയ ബാച്ച് സൃഷ്ടിച്ച് ഡാഷ്ബോർഡ് വീണ്ടും പരിശോധിക്കുക.","t0063":"നിങ്ങൾ ഇതുവരെ ഒരു കോഴ്സും സൃഷ്ടിച്ചിട്ടില്ല. ഒരു പുതിയ കോഴ്സ് സൃഷ്ടിച്ച് ഡാഷ്ബോർഡ് വീണ്ടും പരിശോധിക്കുക."},"lbl":{"accessCourse":"കോഴ്സ് ആക്സസ് ചെയ്യുക","accessToLogin":"കോഴ്സ് ആക്സസ് ചെയ്യുന്നതിന് നിങ്ങൾ ലോഗിൻ ചെയ്ത് കോഴ്സിൽ ചേരണം","ActivityCourses":"കോഴ്സുകൾ","ACTIVITY_COURSE_TITLE":"കോഴ്സുകൾ","addCourse":"കോഴ്സ് ചേർക്കുക","completedCourse":"കോഴ്സ് പൂർത്തിയായിരിക്കുന്നു","completingCourseSuccessfully":"കോഴ്സ് വിജയകരമായി പൂർത്തിയാക്കിയതിന്,","copyAsCourse":"കോഴ്സായി പകർത്തുക","courseContainCertificate":"ഇതൊരു സർട്ടിഫിക്കറ്റ് കോഴ്സാണ്","courseDetails":"കോഴ്സ് വിശദാംശങ്ങൾ","courseDontContainCertificate":"നിലവിൽ, ഈ കോഴ്സിന് ഒരു സർട്ടിഫിക്കറ്റ് ഇല്ല. കോഴ്സ് സ്രഷ്ടാവിന് പിന്നീട് ഒരു സർട്ടിഫിക്കറ്റ് അറ്റാച്ചുചെയ്യാം.","courseLastUpdatedOn":"കോഴ്സ് അവസാനം അപ്ഡേറ്റുചെയ്തത്","courseProgress":"കോഴ്സ് പുരോഗതി","courseRelevantFor":"കോഴ്സ് ചുവടെ പറയുന്നവയ്ക്ക് യോജിച്ചതാണ്:","courses":"കോഴ്സുകൾ","coursestructure":"കോഴ്സ് മൊഡ്യൂളുകൾ","courseSuccessMessage":"നിങ്ങൾ കോഴ്സ് വിജയകരമായി പൂർത്തിയാക്കിയിരിക്കുന്നു","courseSuccessNotificationMessage":"7 ദിവസത്തിനുള്ളിൽ കോഴ്സ് സർട്ടിഫിക്കറ്റിനെക്കുറിച്ച് രജിസ്റ്റർ ചെയ്ത കോൺടാക്റ്റ് വിശദാംശങ്ങളിൽ നിങ്ങളെ അറിയിക്കും","courseWithoutCertificateNote":"കുറിപ്പ്: ഈ കോഴ്സിന് സർട്ടിഫിക്കറ്റ് ഇല്ല","dashboardnocourseselected":"കോഴ്സുകളൊന്നും തിരഞ്ഞെടുത്തിട്ടില്ല!","dashboardnocourseselecteddesc":"മുകളിലുള്ള പട്ടികയിൽ നിന്ന് ഒരു കോഴ്സ് തിരഞ്ഞെടുക്കുക","downloadCourseQRCode":"കോഴ്സ് QR കോഡ് ഡൗൺലോഡുചെയ്യുക","downloadQRCode":{"tooltip":"QR കോഡുകൾ ഡൗൺലോഡുചെയ്യാൻ ക്ലിക്കുചെയ്ത് അവ പ്രസിദ്ധീകരിച്ച കോഴ്സുകളിലേക്ക് ലിങ്കുചെയ്യുക"},"enrollcourse":"കോഴ്സിൽ ചേരുക","getUnlimitedAccess":"നിങ്ങളുടെ മൊബൈൽ ഫോണിൽ ടെസ്റ്റ്ബുക്കുകൾ, പാഠങ്ങൾ, കോഴ്സുകൾ എന്നിവ ഓഫ്ലൈനായി പരിധിയില്ലാതെ നേടുക.","joinTrainingToAcessContent":"ഉള്ളടക്കത്തിലേക്ക് പൂർണ്ണ ആക്സസ് ലഭിക്കുന്നതിന് നിങ്ങൾ കോഴ്സിൽ ചേരണം","moduleFinish":"നിങ്ങൾ ഈ മൊഡ്യൂൾ പൂർത്തിയാക്കിയിരിക്കുന്നു","moduleProgress":"മൊഡ്യൂൾ പുരോഗതി","mytrainings":"എന്റെ കോഴ്സുകൾ","nextModule":"അടുത്ത മൊഡ്യൂൾ","oneCourse":"കോഴ്സ്","prevModule":"മുമ്പത്തെ. മൊഡ്യൂൾ","returnToCourses":"കോഴ്സുകളിലേക്ക് മടങ്ങുക","sectionTitle":"കോഴ്സുകൾ","selectChapter":"മൊഡ്യൂൾ തിരഞ്ഞെടുക്കുക","selectContentFromCourse":"കോഴ്സിനായി ഉള്ളടക്കങ്ങൾ തിരഞ്ഞെടുക്കുക","signinenrollTitle":"ഈ കോഴ്സിൽ ചേരാൻ ലോഗിൻ ചെയ്യുക","trainingAttended":"പങ്കെടുത്ത കോഴ്സുകൾ","userName":"ഉപയോക്താവിന്റെ പേര്"},"tab":{"courses":"കോഴ്സുകൾ"}},"messages":{"dashboard":{"emsg":{"m002":"ഈ കോഴ്സിന്റെ ഒരു ബാച്ചിലും ഉപയോക്താവ് ചേർത്തിട്ടില്ല"}},"emsg":{"m0002":"കോഴ്സ് ഇപ്പോൾ നിലവിലില്ല","m0003":"ഈ കോഴ്സിന് ഓപ്പൺ ബാച്ചുകളൊന്നുമില്ല"},"fmsg":{"m0001":"പേര് ചേർക്കപ്പെട്ട കോഴ്സുകൾ ലഭ്യമാക്കുന്നത് പരാജയപ്പെട്ടു, ദയവായി വീണ്ടും ശ്രമിക്കുക ...","m0002":"മറ്റ് കോഴ്സുകൾ ലഭ്യമാക്കാനായില്ല , പിന്നീട് വീണ്ടും ശ്രമിക്കുക ...","m0082":"പേര് ചേർക്കുന്നതിനായി ഈ കോഴ്സ് തുറന്നിട്ടില്ല","m0086":"ഈ കോഴ്സ് രചയിതാവ് വിരമിച്ചതിനാൽ ഇനി ലഭ്യമല്ല"},"imsg":{"m0001":"ഈ കോഴ്സ് അനുചിതമെന്ന് ഫ്ലാഗുചെയ്തു, നിലവിൽ അവലോകനത്തിലാണ്.","m0026":"ഹായ്, ഈ കോഴ്സ് ഇപ്പോൾ ലഭ്യമല്ല. സ്രഷ്ടാവ് കോഴ്സിൽ ചില മാറ്റങ്ങൾ വരുത്തിയിട്ടുണ്ടാകാം"},"stmsg":{"m0125":"പഠന വിഭവം,പുസ്തകം, കോഴ്സ്, ശേഖരം സൃഷ്ടിക്കാൻ തുടങ്ങുക അല്ലെങ്കിൽ അപ്ലോഡ്ചെയ്യുക .നിങ്ങൾക്ക് ഇപ്പോൾ പ്രവർത്തന പുരോഗതി ഡ്രാഫ്റ്റ് ഇല്ല"}}}},"tbk":{"nontrk":{"frmelmnts":{"lbl":{"ActivityTextbooks":"പാഠപുസ്തകങ്ങൾ","ACTIVITY_TEXTBOOK_TITLE":"പാഠപുസ്തകങ്ങൾ","chapter":"അധ്യായം","copyAsCourse":"കോഴ്സായി പകർത്തുക","desktop":{"deleteCollection":"{Name} പാഠപുസ്തകം ഡിലീറ്റ് ചെയ്യുന്നത് എന്റെ ഡൗൺലോഡുകളിൽ നിന്ന് അതിനെ നീക്കംചെയ്യുന്നു.തുടരുന്നതിന് ഡിലീറ്റ് ചെയ്യുക ക്ലിക്കുചെയ്യുക.","downloadBook":"പാഠപുസ്തകം ഡൗൺലോഡുചെയ്യുക","find_more":"{instance}ൽ കൂടുതൽ പാഠപുസ്തകങ്ങളും ഉള്ളടക്കവും കണ്ടെത്തുക","updateTextbook":"പാഠപുസ്തകം അപ്ഡേറ്റുചെയ്യുക"},"dialCodeDescription":"നിങ്ങളുടെ ടെക്സ്റ്റ് ബുക്കിലെ QR കോഡ് ചിത്രത്തിന് ചുവടെ കാണുന്ന 6 അക്ക ആൽഫാന്യൂമെറിക് കോഡാണ് QR കോഡ്","dialCodeDescriptionGetPage":"നിങ്ങളുടെ പാഠ പുസ്തകത്തിലെ QR കോഡ് ചിത്രത്തിന് ചുവടെ കാണുന്ന 6 അക്ക ആൽഫാന്യൂമെറിക് കോഡാണ് QR കോഡ്.","downloadBooks":"ഓഫ്ലൈനിലായിരിക്കുമ്പോൾ ആക്സസ് ചെയ്യുന്നതിന് വേണ്ടി പുസ്തകങ്ങൾ ഡൗൺലോഡ് ചെയ്യുക","fromTheTextBook":"പാഠപുസ്തകത്തിൽ നിന്ന്","getUnlimitedAccess":"നിങ്ങളുടെ മൊബൈൽ ഫോണിൽ ടെസ്റ്റ്ബുക്കുകൾ, പാഠങ്ങൾ, കോഴ്സുകൾ എന്നിവ ഓഫ്ലൈനായി പരിധിയില്ലാതെ നേടുക.","import":"ഓഫ്ലൈനിലായിരിക്കുമ്പോൾ ആക്സസ് ചെയ്യുന്നതിന് വേണ്ടി പുസ്തകങ്ങൾ ഡൗൺലോഡ് ചെയ്യുക","installAppDesc":"പാഠങ്ങളും പാഠപുസ്തകങ്ങളും ഉള്ളടക്കവും ഓഫ്ലൈനിൽ നിങ്ങളുടെ ഉപകരണത്തിൽ സംഭരിക്കുക","mynotebook":"എന്റെ നോട്ട്ബുക്ക്","noBookfoundButtonText":"കൂടുതൽ പുസ്തകങ്ങളും ഉള്ളടക്കങ്ങളും കാണുക","noBookfoundSubTitle":"നിങ്ങളുടെ ബോർഡ് ഇതുവരെ കൂടുതൽ പുസ്തകങ്ങൾ ചേർത്തിട്ടില്ല.{instance}ൽ കൂടുതൽ പുസ്തകങ്ങളും ഉള്ളടക്കവും കാണാൻ ബട്ടൺ ടാപ്പുചെയ്യുക","noBookfoundTitle":"ബോർഡ് പുസ്തകങ്ങൾ ചേർക്കുന്നു","textbooks":"പാഠപുസ്തകങ്ങൾ"}},"messages":{"stmsg":{"m0125":"പഠന വിഭവം,പുസ്തകം, കോഴ്സ്, ശേഖരം സൃഷ്ടിക്കാൻ തുടങ്ങുക അല്ലെങ്കിൽ അപ്ലോഡ്ചെയ്യുക .നിങ്ങൾക്ക് ഇപ്പോൾ പ്രവർത്തന പുരോഗതി ഡ്രാഫ്റ്റ് ഇല്ല"}}},"trk":{"frmelmnts":{"btn":{"enroll":"വായിക്കുക","resumecourse":"വായന പുനരാരംഭിക്കുക","unenroll":"അടയ്ക്കുക"},"instn":{"t0062":"ഈ പാഠപുസ്തകത്തിനായി നിങ്ങൾ ഇതുവരെ ഒരു പഠന / വായനാ ബാച്ചും സൃഷ്ടിച്ചിട്ടില്ല. ഒരു ബാച്ച് സൃഷ്ടിച്ച് ഡാഷ്ബോർഡ് പരിശോധിക്കുക","t0063":"നിങ്ങൾ ഇതുവരെ ഒരു പാഠപുസ്തകവും സൃഷ്ടിച്ചിട്ടില്ല. ഒരു പാഠപുസ്തകം സൃഷ്ടിച്ച് ഡാഷ്ബോർഡ് പരിശോധിക്കുക"},"lbl":{"accessCourse":"പാഠപുസ്തകം നേടുക","accessToLogin":"പാഠപുസ്തകം ആക്സസ് ചെയ്യുന്നതിന് നിങ്ങൾ ലോഗിൻ ചെയ്ത് പഠന / വായനാ ബാച്ചിൽ ചേരണം","ActivityCourses":"പാഠപുസ്തകം","ACTIVITY_COURSE_TITLE":"പാഠപുസ്തകം","addCourse":"പാഠപുസ്തകം ചേർക്കുക","completedCourse":"പൂർത്തിയാക്കിയ പാഠപുസ്തകങ്ങൾ","completingCourseSuccessfully":"പഠനം വിജയകരമായി പൂർത്തിയാക്കിയതിന്,","copyAsCourse":"പാഠപുസ്തകമായി പകർത്തുക","courseDetails":"പാഠപുസ്തക വിശദാംശങ്ങൾ","courses":"പാഠപുസ്തകങ്ങൾ","coursestructure":"അധ്യായം","joinTrainingToAcessContent":"ഉള്ളടക്കം ആക്സസ് ചെയ്യുന്നതിന്, നിങ്ങൾ പഠന ബാച്ചിൽ ചേരണം","moduleFinish":"നിങ്ങൾ ഈ അധ്യായം പൂർത്തിയാക്കിയിരിക്കുന്നു","moduleProgress":"അധ്യായം പുരോഗതി","mytrainings":"എന്റെ ഡിജിറ്റൽ പാഠപുസ്തകങ്ങൾ","nextModule":"അടുത്ത അധ്യായം","oneCourse":"ഡിജിറ്റൽ പാഠപുസ്തകം","prevModule":"മുമ്പത്തെ അധ്യായം","sectionTitle":"ഡിജിറ്റൽ പാഠപുസ്തകങ്ങൾ","selectChapter":"അധ്യായം തിരഞ്ഞെടുക്കുക","trainingAttended":"പാഠപുസ്തകങ്ങൾ വായിച്ചു","courseContainCertificate":"ഈ പഠനം നിങ്ങൾക്ക് ഒരു സർട്ടിഫിക്കറ്റ് വാഗ്ദാനം ചെയ്യുന്നു","courseDontContainCertificate":"നിലവിൽ, ഈ പഠന പ്രവർത്തനത്തിന് ഒരു സർട്ടിഫിക്കറ്റ് ഇല്ല. ടാസ്ക് സ്രഷ്ടാവിന് പിന്നീട് ഒരു സർട്ടിഫിക്കറ്റ് അറ്റാച്ചുചെയ്യാം"},"tab":{"courses":"ഡിജിറ്റൽ പാഠപുസ്തകം"}},"messages":{"emsg":{"m0002":"ഈ പാഠപുസ്തകം ഇനി ലഭ്യമല്ല"},"fmsg":{"dataSettingNotSubmitted":"പ്രൊഫൈൽ പങ്കിടൽ ക്രമീകരണങ്ങൾ അപ്ഡേറ്റുചെയ്യാനായില്ല. പിന്നീട് വീണ്ടും ശ്രമിക്കുക","m0001":"ക്ഷമിക്കണം! നിങ്ങൾ തിരയുന്ന പാഠപുസ്തകം ഞങ്ങൾക്ക് നേടാനായില്ല. പിന്നീട് വീണ്ടും ശ്രമിക്കുക","m0002":"ക്ഷമിക്കണം! നിങ്ങൾക്ക് മറ്റ് പാഠപുസ്തകങ്ങൾ നേടാനായില്ല. പിന്നീട് വീണ്ടും ശ്രമിക്കുക","m0086":"ഈ പാഠപുസ്തകം ഇനി ലഭ്യമല്ല"}}}},"tvc":{"nontrk":{"frmelmnts":{"lbl":{"ActivityTvClasses":"ടിവി ക്ലാസുകൾ","ACTIVITY_TEXTBOOK_TITLE":"ടിവി ക്ലാസുകൾ","ACTIVITY_TV_CLASS_TITLE":"ടിവി ക്ലാസുകൾ","chapter":"ടി വി പ്രോഗ്രാം","collection_tv_classes":"ടിവി ക്ലാസുകൾ","desktop":{"downloadBook":"ടിവി ക്ലാസുകൾ ഡൗൺലോഡുചെയ്യുക","downloadTVclasses":"ടിവി ക്ലാസുകൾ ഡൗൺലോഡുചെയ്യുക","find_more":"{instance}ൽ കൂടുതൽ ടിവി ക്ലാസുകളും അനുബന്ധ ഉള്ളടക്കവും കണ്ടെത്തുക","find_more_TVclasses":"{instance}ൽ കൂടുതൽ ടിവി ക്ലാസുകളും അനുബന്ധ ഉള്ളടക്കവും കണ്ടെത്തുക","updateTextbook":"ടിവി ക്ലാസുകൾ അപ്ഡേറ്റുചെയ്യുക","updateTVclasses":"ടിവി ക്ലാസുകൾ അപ്ഡേറ്റുചെയ്യുക"},"downloadBooks":"ഓഫ്ലൈനിലായിരിക്കുമ്പോൾ ആക്സസ്സുചെയ്യുന്നതിന് ടിവി ക്ലാസുകൾ ഡൗൺലോഡുചെയ്യുക","downloadTVclasses":"ഓഫ്ലൈനിലായിരിക്കുമ്പോൾ ആക്സസ്സുചെയ്യുന്നതിന് ടിവി ക്ലാസുകൾ ഡൗൺലോഡുചെയ്യുക","fromTheTextBook":"ടിവി ക്ലാസ്സിൽ നിന്ന്","fromTheTVclasses":"ടിവി ക്ലാസ്സിൽ നിന്ന്","noBookfoundTitle":"ബോർഡ് ടിവി ക്ലാസുകൾ ചേർക്കുന്നു","textbooks":"ടിവി ക്ലാസുകൾ","TVclassesfoundTitle":"ബോർഡ് ടിവി ക്ലാസുകൾ ചേർക്കുന്നു","tv_classes":"ടിവി ക്ലാസുകൾ","tv_program":"ടി വി പ്രോഗ്രാം"}}},"trk":{"frmelmnts":{"btn":{"enroll":"കാണുക","resumecourse":"കാണുന്നത് പുനരാരംഭിക്കുക"},"instn":{"t0062":"ഈ ടിവി ക്ലാസ്സിനായി ഇതുവരെ ഒരു പഠന ബാച്ചും സൃഷ്ടിച്ചിട്ടില്ല. ഒരു ബാച്ച് സൃഷ്ടിച്ച് ഡാഷ്ബോർഡ് പരിശോധിക്കുക","t0063":"നിങ്ങൾ ഇതുവരെ ഒരു ടിവി ക്ലാസും സൃഷ്ടിച്ചിട്ടില്ല. ഒരു ടിവി ക്ലാസ് സൃഷ്ടിച്ച് ഡാഷ്ബോർഡ് പരിശോധിക്കുക"},"lbl":{"accessCourse":"ടിവി ക്ലാസുകൾ നേടുക","accessToLogin":"ടിവി ക്ലാസ് ആക്സസ് ചെയ്യുന്നതിന് നിങ്ങൾ ലോഗിൻ ചെയ്ത് പഠന ബാച്ചിൽ ചേരണം","ActivityCourses":"ടിവി ക്ലാസുകൾ","ACTIVITY_COURSE_TITLE":"ടിവി ക്ലാസുകൾ","addCourse":"ടിവി ക്ലാസ് ചേർക്കുക","completedCourse":"പൂർത്തിയാക്കിയ ടിവി ക്ലാസുകൾ","copyAsCourse":"ടിവി ക്ലാസായി പകർത്തുക","courseContainCertificate":"ഈ പഠനം നിങ്ങൾക്ക് ഒരു സർട്ടിഫിക്കറ്റ് വാഗ്ദാനം ചെയ്യുന്നു","courseDetails":"ടിവി ക്ലാസ് വിശദാംശങ്ങൾ","courses":"ടിവി ക്ലാസുകൾ","coursestructure":"ടി വി പ്രോഗ്രാം","moduleFinish":"നിങ്ങൾ ഈ പ്രോഗ്രാം പൂർത്തിയാക്കിയിരിക്കുന്നു","moduleProgress":"പ്രോഗ്രാം പുരോഗതി","mytrainings":"എന്റെ ടിവി ക്ലാസുകൾ","nextModule":"അടുത്ത പ്രോഗ്രാം","oneCourse":"ടിവി ക്ലാസ്","prevModule":"മുമ്പത്തെ. പ്രോഗ്രാം","sectionTitle":"ടിവി ക്ലാസുകൾ","selectChapter":"പ്രോഗ്രാം തിരഞ്ഞെടുക്കുക","trainingAttended":"ടിവി ക്ലാസുകൾ കണ്ടു","courseDontContainCertificate":"നിലവിൽ, ഈ പഠന പ്രവർത്തനത്തിന് ഒരു സർട്ടിഫിക്കറ്റ് ഇല്ല. ടാസ്ക് സ്രഷ്ടാവിന് പിന്നീട് ഒരു സർട്ടിഫിക്കറ്റ് അറ്റാച്ചുചെയ്യാം"},"tab":{"courses":"ടിവി ക്ലാസുകൾ"}},"messages":{"emsg":{"m0002":"ഈ ടിവി ക്ലാസ് ടാസ്ക് ഇനി ലഭ്യമല്ല"},"fmsg":{"m0001":"ക്ഷമിക്കണം! നിങ്ങൾ തിരയുന്ന ടിവി ക്ലാസുകൾ ഞങ്ങൾക്ക് നേടാനായില്ല. പിന്നീട് വീണ്ടും ശ്രമിക്കുക","m0002":"ക്ഷമിക്കണം! ഞങ്ങൾക്ക് നിങ്ങൾക്കായി മറ്റ് ടിവി ക്ലാസുകൾ നേടാനായില്ല. പിന്നീട് വീണ്ടും ശ്രമിക്കുക","m0086":"ഈ ടിവി ക്ലാസ് ഇപ്പോൾ ലഭ്യമല്ല"}}}}}
\ No newline at end of file
diff --git a/utils/portal/labels/all_labels_mr.json b/utils/portal/labels/all_labels_mr.json
new file mode 100644
index 000000000..b0ea46593
--- /dev/null
+++ b/utils/portal/labels/all_labels_mr.json
@@ -0,0 +1 @@
+{"dflt":{"nontrk":{"frmelmnts":{"btn":{"create":"निर्माण करा"},"lbl":{"ActivityTextbooks":"कार्ये","ACTIVITY_TEXTBOOK_TITLE":"कार्ये","chapter":"अभ्यासक्रम विभाग","collection_task":"कार्ये","desktop":{"download":"डाउनलोड","downloadBook":"डाउनलोड","find_more":"अधिक सामग्री मिळवा","find_more_tasks":"अधिक सामग्री पहा","update":"अपडेट","updateTextbook":"अपडेट"},"downloadBooks":"ऑफलाइन प्रवेश मिळवण्यासाठी डाउनलोड करा","downloadoffline":"ऑफलाइन प्रवेश मिळवण्यासाठी डाउनलोड करा","download_to_access_offline":"ऑफलाइन प्रवेश मिळवण्यासाठी डाउनलोड करा","fromTheLearningTask":"अभ्यास कार्यामधील","fromTheTextBook":"अभ्यास कार्यामधून","import":"ऑफलाइन प्रवेश मिळवण्यासाठी डाउनलोड करा","learningmodule":"अभ्यास विभाग","mynotebook":"माझी नोटबुक","noBookfoundButtonText":"अधिक पहा","noBookfoundSubTitle":"तुमच्या बोर्डाने अजून सामग्री जोडलेली नाही. {instance}वर अधिक सामग्री पाहण्यासाठी बटण टॅप करा","noBookfoundTitle":"बोर्ड सामग्री जोडत आहे","noTaskfoundSubTitle":"तुमच्या बोर्डाने अजून सामग्री जोडलेली नाही. {instance}वर अधिक सामग्री पाहण्यासाठी बटण टॅप करा","noTaskfoundTitle":"बोर्ड सामग्री जोडत आहे","seemore":"अधिक पहा","task":"कार्ये","tasks":"कार्ये","task_title":"कार्ये","textbooks":"कार्ये"}},"messages":{"stmsg":{"m0125":"सामग्री निर्माण किंवाअपलोड करण्यास सुरू करा. तुमच्याकडे अजून कोणत्याही सामग्रीचा मसुदा सेव्ह केलेला नाही","ms0001":"सामग्री निर्माण किंवा अपलोड करण्यास सुरुवात करा. सध्या तुमच्याकडे कोणत्याही सामग्रीचा मसुदा सेव्ह केलेला नाही"}}},"trk":{"completed_learning":"अभ्यासक्रम पूर्ण झाला","essages":{"fmsg":{"m0082":"हे अभ्यास कार्य अजून सुरू झालेले नाही. तुम्ही त्यात सहभागी होऊ शकत नाही"}},"frmelmnts":{"btn":{"create":"निर्माण करा","enroll":"सहभागी व्हा","resumecourse":"पुन्हा सुरू करा","unenroll":"सोडा","viewcoursestats":"आकडेवारी पहा","viewCourseStatsDashboard":"डॅशबोर्ड पहा"},"instn":{"t0062":"या कार्यासाठी तुम्ही अजून कोणतीही बॅच निर्माण केलेली नाही. कार्य निर्माण करा व डॅशबोर्ड तपासा","t0063":"तुम्ही अजून कोणतेही कार्य निर्माण केलेले नाही. नवीन कार्य निर्माण करा व पुन्हा डॅशबोर्ड तपासा."},"lbl":{"accessCourse":"अभ्यास सामग्रीवर प्रवेश मिळवा","accessToLogin":"सामग्रीवर प्रवेश मिळवण्यासाठी लॉगिन करून कार्यात सहभागी होणे आवश्यक आहे","ActivityCourses":"कार्ये","ACTIVITY_COURSE_TITLE":"कार्ये","addCourse":"जोडा","completedCourse":"पूर्ण झालेली कार्ये","completingCourseSuccessfully":"अभ्यासक्रम यशस्वीरीत्या पूर्ण करण्यासाठी,","copyAsCourse":"अभ्यास साहित्य म्हणून कॉपी करा","courseContainCertificate":"या अभ्यासक्रमानंतर तुम्हाला प्रमाणपत्र मिळेल","courseDetails":"अभ्यास तपशील","courseProgress":"प्रगती","courseRelevantFor":"हा अभ्यासक्रम यांना अनुरूप आहे:","courses":"कार्ये","coursestructure":"अभ्यासक्रम विभाग","courseSuccessMessage":"तुम्ही तुमचा अभ्यासक्रम यशस्वीरीत्या पूर्ण केला आहे","courseSuccessNotificationMessage":"तुम्ही नोंदवलेल्या संपर्क तपशिलांवर ७ दिवसात तुम्हाला तुमच्या प्रमाणपत्राबद्दल कळवले जाईल","courseWithoutCertificateNote":"सूचना: या अभ्यासक्रमानंतर तुम्हाला प्रमाणपत्र मिळणार नाही","dashboardnocourseselected":"निवड केलेली नाही","dashboardnocourseselecteddesc":"यादीमधून निवडा","downloadCourseQRCode":"QR कोड डाउनलोड करा","downloadQRCode":{"tooltip":"QR कोड डाउनलोड करून तुमच्या प्रकाशनासोबत जोडण्यासाठी क्लिक करा"},"getUnlimitedAccess":"तुमच्या मोबाइल फोनवर ऑफलाइन स्वरूपात पाठ्यपुस्तके, टीव्ही वर्ग व कोर्सेस यांवर अमर्यादित प्रवेश मिळवा","joinTrainingToAcessContent":"सामग्रीवर प्रवेश मिळवण्यासाठी तुम्हला लॉगिन करून कार्यात सहभागी व्हावे लागेल","moduleFinish":"तुम्ही हे कार्य पूर्ण केले आहे","moduleProgress":"कार्य प्रगती","mytrainings":"माझी कार्ये","nextModule":"पुढील कार्य","oneCourse":"कार्य","prevModule":"मागील कार्य","returnToCourses":"मागे","sectionTitle":"कार्ये","selectChapter":"कार्य निवडा","selectContentFromCourse":"सामग्री निवडा","trainingAttended":"स्वीकारलेले अभ्यासक्रम","courseDontContainCertificate":"सध्या या अभ्यास कार्याला प्रमाणपत्र नाही. कार्य निर्माता कालांतराने प्रमाणपत्र जोडण्याची शक्यता आहे."},"tab":{"courses":"कार्ये"}},"messages":{"dashboard":{"emsg":{"m002":"या अभ्यास कार्यासाठी वापरकर्ता कोणतीही बॅचमध्ये सहभागी झालेला नाही"}},"emsg":{"m0002":"हे अभ्यास कार्य आता उपलब्ध नाही","m0003":"या अभ्यास कार्यासाठी चालू बॅच नाही"},"fmsg":{"dataSettingNotSubmitted":"प्रोफाइल सामायिकरण सेटिंग अपडेट करू शकलो नाही. नंतर पुन्हा प्रयत्न करा","m0001":"क्षमस्व! तुम्ही ज्या अभ्यास कार्यासाठी नोंदणी केली आहे त्याबद्दल आम्हाला माहिती मिळत नाही . नंतर पुन्हा प्रयत्न करा","m0002":"क्षमस्व! आम्ही तुमच्यासाठी इतर अभ्यास कार्य आणू शकलो नाही. नंतर पुन्हा प्रयत्न करा","m0086":"ही सामग्री आता उपलब्ध नाही"},"imsg":{"m0001":"हा मजकूर अनुचित म्हणून ध्वजांकित केला गेला आहे. त्याचे पुनरावलोकन चालू आहे","m0026":"नमस्कार, ही सामग्री सध्या उपलब्ध नाही. त्यात फेरबदल होत असल्याची शक्यता आहे"},"stmsg":{"m0125":"सामग्री निर्माण किंवा अपलोड करण्यास सुरू करा. सध्या तुम्ही कोणत्याही सामग्रीचा मसुदा सेव्ह केलेला नाही"}}}},"crs":{"nontrk":{"frmelmnts":{"lbl":{"ActivityTextbooks":"कोर्सेस","ACTIVITY_TEXTBOOK_TITLE":"कोर्सेस","chapter":"कोर्स विभाग","desktop":{"downloadBook":"कोर्स डाउनलोड करा","find_more":"{instance} वर अधिक कोर्सेस व संबंधित सामग्री पहा","updateTextbook":"कोर्स अपडेट करा"},"downloadBooks":"ऑफलाइन असताना प्रवेश करण्यासाठी कोर्सेस डाउनलोड करा","fromTheTextBook":"कोर्समधील","noBookfoundTitle":"बोर्ड कोर्सेस जोडत आहे","textbooks":"कोर्सेस"}}},"trk":{"completedCourse":"अभ्यासक्रम संपला","frmelmnts":{"btn":{"createCourse":"कोर्स तयार करा","enroll":"नाव नोंदवा","resumecourse":"कोर्स पुन्हा सुरु करा","unenroll":"कोर्स सोडा","viewcoursestats":"अभ्यासक्रमाची सांख्यिकी माहिती","viewCourseStatsDashboard":"कोर्सचा फलक पहा"},"instn":{"t0062":"या कोर्ससाठी तुम्ही अजून बॅच तयार केलेली नाही. नवीन बॅच तयार करा व पुन्हा फलक तपासा.","t0063":"तुम्ही अजून कोणताही कोर्स तयार केलेला नाही. नवीन कोर्स तयार करा व पुन्हा फलक चेक करा."},"lbl":{"accessCourse":"कोर्स प्रवेश","accessToLogin":"कोर्स प्लेयर वापरण्यासाठी तुम्हाला लॉग इन करून कोर्स मध्ये सामील व्हावे लागेल","ActivityCourses":"कोर्सेस","ACTIVITY_COURSE_TITLE":"कोर्सस","addCourse":"कोर्स जोडा","completedCourse":"पूर्ण केलेले कोर्स","completingCourseSuccessfully":"अभ्यासक्रम यशस्वीरीत्या पूर्ण करण्यासाठी","copyAsCourse":"कोर्स म्हणून कॉपी करा","courseContainCertificate":"या कोर्सला प्रमाणपत्र आहे","courseDetails":"कोर्स तपशील","courseDontContainCertificate":"सध्या या कोर्सला प्रमाणपत्र नाही. कोर्सचा निर्माता कालांतराने प्रमाणपत्र जोडू शकतो.","courseLastUpdatedOn":"कोर्स शेवटचा उपडेट केला","courseProgress":"कोर्स प्रगती","courseRelevantFor":"या कोर्स संबंधित माहिती:","courses":"कोर्सेस","coursestructure":"कौरसेचे विभाग","courseSuccessMessage":"तुम्ही कोर्स यशस्वीरीत्या पूर्ण केला आहे","courseSuccessNotificationMessage":"7 दिवसांच्या आत तुम्ही नोंदवलेल्या संपर्क तपशिलांद्वारे तुम्हाला कोर्स प्रमाणपत्राबाबत सूचित केले जाईल","courseWithoutCertificateNote":"सूचना: या कोर्सला प्रमाणपत्र नाही","dashboardnocourseselected":"कोणताही कोर्स निवडलेला नाही!","dashboardnocourseselecteddesc":"वरील यादीमधून एक कोर्स निवडा","downloadCourseQRCode":"कोर्ससाठी QR कोड डाउनलोड करा","downloadQRCode":{"tooltip":"QR कोड्स डाउनलोड करून त्यांना कोर्सशी निगडित करायला इथे क्लिक करा"},"enrollcourse":"कोर्स साठी नोंदणी करा","getUnlimitedAccess":"तुमच्या मोबाइल फोनवरून अमर्याद ऑफलाइन पाठ्यपुस्तके, पाठ व कोर्सवर वापर-अधिकार मिळवा","joinTrainingToAcessContent":"मजकुराचा पूर्ण लाभ घेण्यासाठी कोर्समध्ये प्रवेश घेणे आवश्यक आहे","moduleFinish":"तुम्ही हा विभाग पूर्ण केला आहे","moduleProgress":"विभाग प्रगती","mytrainings":"माझे कोर्स","nextModule":"पुढील विभाग","oneCourse":"कोर्स","prevModule":"मागील विभाग","returnToCourses":"पुन्हा कोर्सकडे वळा","sectionTitle":"कोर्सेस","selectChapter":"विभाग निवडा","selectContentFromCourse":"कोर्ससाठी मजकूर निवडा","signinenrollTitle":"या कोर्ससाठी नोंदणी करण्यासाठी लॉग इन करा","trainingAttended":"घेतलेले कोर्स","userName":"वापरकर्ता नाव"},"tab":{"courses":"कोर्स"}},"messages":{"dashboard":{"emsg":{"m002":"या कोर्समधील कोणत्याही बॅचमध्ये वापरकर्त्याची नोंद नाही"}},"emsg":{"m0002":"हा कोर्स आता उपलब्ध नाही","m0003":"या कोर्समध्ये एकही चालू बॅच नाही"},"fmsg":{"m0001":"नोंदणीकृत कोर्स दाखवण्यास असमर्थ, नंतर पुन्हा प्रयत्न करा","m0002":"इतर कोर्स दाखवण्यास असमर्थ, नंतर प्रयत्न करा","m0082":"हा कोर्स अजून नोंदणीसाठी उपलब्ध नाही","m0086":"हा कोर्स निर्मात्याने गैरलागू केला असल्याने, तो आता उपलब्ध नाही."},"imsg":{"m0001":"हा कोर्स अनुचित म्हणून ध्वजांकित केलेला असून, आम्ही या वेळी त्याचा आढावा घेत आहोत.","m0026":"नमस्कार, हा कोर्स सध्या उपलब्ध नाही. निर्मात्याने या कोर्समध्ये काही बदल केल्याची शक्यता आहे."},"stmsg":{"m0125":"संसाधन, पुस्तक, अभ्यासक्रम, संचय अथवा अपलोड निर्माण करण्यास सुरुवात करा. सध्या तुमच्याकडे कोणताही 'काम-चालू-आहे' असा मसुदा नाही."}}}},"tbk":{"nontrk":{"frmelmnts":{"lbl":{"ActivityTextbooks":"पाठ्यपुस्तके","ACTIVITY_TEXTBOOK_TITLE":"पाठ्यपुस्तके (लवकरच येत आहेत)","chapter":"धडा","copyAsCourse":"कोर्स म्हणून कॉपी करा","desktop":{"deleteCollection":"{name} पाठ्यपुस्तक डिलिट केल्यास ते 'माझे डाउनलोड' वरून काढून टाकले जाईल. पुढे जाण्यास डिलिट क्लिक करा.","downloadBook":"पाठ्यपुस्तक डाउनलोड करा","find_more":"{instance}वर आणखी पाठ्यपुस्तके व मजकूर शोधा","updateTextbook":"पाठ्यपुस्तक अपडेट करा"},"dialCodeDescription":"QR कोड म्हणजे तुमच्या पाठ्यपुस्तकातील QR कोडच्या प्रतिमेखाली आढळणारा ६ आकडी वर्ण-संख्यायुक्त कोड.","dialCodeDescriptionGetPage":"QR कोड हा तुमच्या पाठ्यपुस्तकातील 'QR कोड' आकृतीच्या खाली आढळणारा ६ आकडी अल्फान्यूमेरिक कोड आहे.","downloadBooks":"ऑफलाईन वाचण्यासाठी पुस्तके डाउनलोड करा","fromTheTextBook":"पाठ्यपुस्तकातून","getUnlimitedAccess":"तुमच्या मोबाइल फोनवरून अमर्याद ऑफलाइन पाठ्यपुस्तके, पाठ व कोर्सवर वापर-अधिकार मिळवा","import":"ऑफलाईन वाचण्यासाठी पुस्तके डाउनलोड करा","installAppDesc":"पाठ, पाठ्यपुस्तके आणि मजकूर आपल्या यंत्रावर ऑफलाईन संचित करा","mynotebook":"माझी नोटबुक","noBookfoundButtonText":"अधिक पुस्तके व मजकूर पहा","noBookfoundSubTitle":"तुमचा बोर्ड अजून पुस्तके समाविष्ट करत आहे. {instance} वर अधिक पुस्तके व मजकूर पाहण्यासाठी बटण टॅप करा","noBookfoundTitle":"बोर्ड पुस्तके समाविष्ट करत आहे","textbooks":"पाठ्यपुस्तके"}},"messages":{"stmsg":{"m0125":"संसाधन, पुस्तक, अभ्यासक्रम, संचय अथवा अपलोड निर्माण करण्यास सुरुवात करा. सध्या तुमच्याकडे कोणताही 'काम-चालू-आहे' असा मसुदा नाही."}}},"trk":{"frmelmnts":{"btn":{"enroll":"वाचा","resumecourse":"वाचन पुन्हा सुरू करा","unenroll":"बंद करा"},"instn":{"t0062":"तुम्ही अजून या पाठ्यपुस्तकाच्या अभ्यासवर्गाची बॅच निर्माण केलेली नाही. बॅच निर्माण करा व डॅशबोर्ड तपासा","t0063":"तुम्ही अजून कोणतेही पाठ्यपुस्तक निर्माण केलेले नाही. पाठ्यपुस्तक निर्माण करा व डॅशबोर्ड तपासा"},"lbl":{"accessCourse":"पाठ्यपुस्तकावर प्रवेश करा","accessToLogin":"पाठ्यपुस्तकावर प्रवेश मिळवण्यासाठी लॉगिन करून अभ्यासवर्ग/वाचन बॅचमध्ये सहभागी होणे आवश्यक आहे","ActivityCourses":"पाठ्यपुस्तक","ACTIVITY_COURSE_TITLE":"पाठ्यपुस्तक","addCourse":"पाठ्यपुस्तक जोडा","completedCourse":"पूर्ण केलेली पाठ्यपुस्तके","completingCourseSuccessfully":"यशस्वीरीत्या अभ्यासक्रम पूर्ण करण्यासाठी,","copyAsCourse":"पाठ्यपुस्तक म्हणून कॉपी करा","courseDetails":"पाठ्यपुस्तक तपशील","courses":"पाठ्यपुस्तके","coursestructure":"पाठ","joinTrainingToAcessContent":"सामग्रीवर प्रवेश मिळवण्यासाठी अभ्यासवर्गाच्या बॅचमध्ये सहभागी होणे आवश्यक आहे","moduleFinish":"तुम्ही हा पाठ पूर्ण केला आहे","moduleProgress":"पाठ प्रगती","mytrainings":"माझी डिजिटल पाठ्यपुस्तके","nextModule":"पुढील पाठ","oneCourse":"डिजिटल पाठ्यपुस्तक","prevModule":"मागील पाठ","sectionTitle":"डिजिटल पाठ्यपुस्तके","selectChapter":"पाठ निवडा","trainingAttended":"वाचलेली पाठ्यपुस्तके","courseContainCertificate":"या अभ्यासक्रमानंतर तुम्हाला प्रमाणपत्र मिळेल","courseDontContainCertificate":"सध्या या अभ्यास कार्याला प्रमाणपत्र नाही. कार्य निर्माता कालांतराने प्रमाणपत्र जोडण्याची शक्यता आहे."},"tab":{"courses":"डिजिटल पाठ्यपुस्तक"}},"messages":{"emsg":{"m0002":"हे पाठ्यपुस्तक आता उपलब्ध नाही"},"fmsg":{"dataSettingNotSubmitted":"प्रोफाइल सामायिकरण सेटिंग अपडेट करू शकलो नाही. नंतर पुन्हा प्रयत्न करा","m0001":"क्षमस्व! तुम्ही शोधात असलेले पाठ्यपुस्तक आम्ही आणू शकलो नाही. नंतर पुन्हा प्रयत्न करा","m0002":"क्षमस्व! आम्ही तुमच्यासाठी इतर पाठ्यपुस्तके आणू शकलो नाही. नंतर पुन्हा प्रयत्न करा","m0086":"हे पाठ्यपुस्तक आता उपलब्ध नाही"}}}},"tvc":{"nontrk":{"frmelmnts":{"lbl":{"ActivityTvClasses":"टीव्ही वर्ग","ACTIVITY_TEXTBOOK_TITLE":"टीव्ही वर्ग","ACTIVITY_TV_CLASS_TITLE":"टीव्ही वर्ग","chapter":"टीव्ही कार्यक्रम","collection_tv_classes":"टीव्ही वर्ग","desktop":{"downloadBook":"टीव्ही वर्ग डाउनलोड करा","downloadTVclasses":"टीव्ही वर्ग डाउनलोड करा","find_more":"{instance} वर आणखी टीव्ही वर्ग व संबंधित सामग्री मिळवा","find_more_TVclasses":"{instance} वर अधिक टीव्ही वर्ग व संबंधित सामग्री पहा","updateTextbook":"टीव्ही वर्ग अपडेट करा","updateTVclasses":"टीव्ही वर्ग अपडेट करा"},"downloadBooks":"ऑफलाइन असताना प्रवेश मिळवण्यासाठी टीव्ही वर्ग डाउनलोड करा","downloadTVclasses":"ऑफलाइन प्रवेश मिळवण्यासाठी टीव्ही वर्ग डाउनलोड करा","fromTheTextBook":"टीव्ही वर्गामधील","fromTheTVclasses":"टीव्ही वर्गामधून","noBookfoundTitle":"बोर्ड टीव्ही वर्ग जोडत आहे","textbooks":"टीव्ही वर्ग","TVclassesfoundTitle":"बोर्ड टीव्ही वर्ग जोडत आहे","tv_classes":"टीव्ही वर्ग","tv_program":"टीव्ही कार्यक्रम"}}},"trk":{"frmelmnts":{"btn":{"enroll":"पहा","resumecourse":"पाहणे पुन्हा सुरू करा"},"instn":{"t0062":"तुम्ही या टीव्ही वर्गाच्या अभ्यासासाठी अजून बॅच निर्माण केलेली नाही. बॅच निर्माण करा व डॅशबोर्ड तपासा","t0063":"तुम्ही अजून कोणताही टीव्ही वर्ग निर्माण केलेला नाही. टीव्ही वर्ग निर्माण करा व डॅशबोर्ड तपासा"},"lbl":{"accessCourse":"टीव्ही वर्गांवर प्रवेश मिळवा","accessToLogin":"टीव्ही वर्गात प्रवेश करण्यासाठी लॉगिन करून अभ्यासवर्गाच्या बॅचमध्ये सहभागी व्हा","ActivityCourses":"टीव्ही वर्ग","ACTIVITY_COURSE_TITLE":"टीव्ही वर्ग","addCourse":"टीव्ही वर्ग जोडा","completedCourse":"टीव्ही वर्ग पूर्ण","copyAsCourse":"टीव्ही वर्ग म्हणून कॉपी करा","courseContainCertificate":"या अभ्यासक्रमानंतर तुम्हाला प्रमाणपत्र मिळेल","courseDetails":"टीव्ही वर्ग तपशील","courses":"टीव्ही वर्ग","coursestructure":"टीव्ही कार्यक्रम","moduleFinish":"तुम्ही हा कार्यक्रम पूर्ण केला आहे","moduleProgress":"कार्यक्रम प्रगती","mytrainings":"माझे टीव्ही वर्ग","nextModule":"पुढील कार्यक्रम","oneCourse":"टीव्ही वर्ग","prevModule":"मागील कार्यक्रम","sectionTitle":"टीव्ही वर्ग","selectChapter":"कार्यक्रम निवडा","trainingAttended":"पाहिलेले टीव्ही वर्ग","courseDontContainCertificate":"सध्या या अभ्यास कार्याला प्रमाणपत्र नाही. कार्य निर्माता कालांतराने प्रमाणपत्र जोडण्याची शक्यता आहे."},"tab":{"courses":"टीव्ही वर्ग"}},"messages":{"emsg":{"m0002":"हे टीव्ही वर्ग कार्य आता उपलब्ध नाही"},"fmsg":{"m0001":"क्षमस्व! तुम्ही शोधत असलेले टीव्ही वर्ग आम्ही आणू शकलो नाही. नंतर पुन्हा प्रयत्न करा","m0002":"क्षमस्व! आम्ही तुमच्यासाठी इतर टीव्ही वर्ग आणू शकलो नाही. नंतर पुन्हा प्रयत्न करा","m0086":"हा टीव्ही वर्ग आता उपलब्ध नाही"}}}}}
\ No newline at end of file
diff --git a/utils/portal/labels/all_labels_or.json b/utils/portal/labels/all_labels_or.json
new file mode 100644
index 000000000..ef1f70465
--- /dev/null
+++ b/utils/portal/labels/all_labels_or.json
@@ -0,0 +1 @@
+{"dflt":{"nontrk":{"frmelmnts":{"btn":{"create":"ସୃଷ୍ଟି କରନ୍ତୁ"},"lbl":{"ActivityTextbooks":"ଟାସ୍କଗୁଡ଼ିକ","ACTIVITY_TEXTBOOK_TITLE":"ଟାସ୍କଗୁଡ଼ିକ","chapter":"ଶିକ୍ଷଣ ମଡ୍ୟୁଲ","collection_task":"ଟାସ୍କଗୁଡ଼ିକ","desktop":{"download":"ଡାଉନଲୋଡ଼ କରନ୍ତୁ","downloadBook":"ଡାଉନଲୋଡ଼ କରନ୍ତୁ","find_more":"ଅଧିକ କଣ୍ଟେଣ୍ଟ୍ ଦେଖନ୍ତୁ","find_more_tasks":"ଅଧିକ କଣ୍ଟେଣ୍ଟ୍ ଦେଖନ୍ତୁ","update":"ଅପଡେଟ କରନ୍ତୁ","updateTextbook":"ଅପଡେଟ କରନ୍ତୁ"},"downloadBooks":"ଅଫଲାଇନ୍ ଆକ୍ସେସ୍ କରିବା ପାଇଁ ଡାଉନଲୋଡ୍ କରନ୍ତୁ","downloadoffline":"ଅଫଲାଇନ୍ ଥିବା ସମୟରେ ଆକ୍ସେସ୍ କରିବା ପାଇଁ ଡାଉନଲୋଡ୍ କରନ୍ତୁ","download_to_access_offline":"ଅଫଲାଇନ୍ ଥିବା ସମୟରେ ଆକ୍ସେସ୍ କରିବା ପାଇଁ ଡାଉନଲୋଡ୍ କରନ୍ତୁ","fromTheLearningTask":"ଶିଖୁଥିବା ଟାସ୍କରୁ","fromTheTextBook":"ଶିଖୁଥିବା ଟାସ୍କରୁ","import":"ଅଫଲାଇନ୍ ଥିବା ସମୟରେ ଆକ୍ସେସ୍ କରିବା ପାଇଁ ଡାଉନଲୋଡ୍ କରନ୍ତୁ","learningmodule":"ଶିକ୍ଷଣ ମଡ୍ୟୁଲ","mynotebook":"ମୋ ନୋଟବୁକ୍","noBookfoundButtonText":"ଅଧିକ ଦେଖନ୍ତୁ","noBookfoundSubTitle":"ଆପଣଙ୍କ ବୋର୍ଡ କଣ୍ଟେଣ୍ଟ୍ ସାମିଲ କରିବାର ଅଛି । {instance} ରେ ଅଧିକ କଣ୍ଟେଣ୍ଟ ଦେଖିବା ପାଇଁ ଏହି ବଟନ୍ ଟ୍ୟାପ୍ କରନ୍ତୁ","noBookfoundTitle":"ବୋର୍ଡ କଣ୍ଟେଣ୍ଟ୍ ସାମିଲ କରୁଛି","noTaskfoundSubTitle":"ଆପଣଙ୍କ ବୋର୍ଡ କଣ୍ଟେଣ୍ଟ୍ ସାମିଲ କରିବାର ଅଛି । {instance} ରେ ଅଧିକ କଣ୍ଟେଣ୍ଟ ଦେଖିବା ପାଇଁ ଏହି ବଟନ୍ ଟ୍ୟାପ୍ କରନ୍ତୁ","noTaskfoundTitle":"ବୋର୍ଡ କଣ୍ଟେଣ୍ଟ୍ ସାମିଲ କରୁଛି","seemore":"ଅଧିକ ଦେଖନ୍ତୁ","task":"ଟାସ୍କଗୁଡ଼ିକ","tasks":"ଟାସ୍କଗୁଡ଼ିକ","task_title":"ଟାସ୍କଗୁଡ଼ିକ","textbooks":"ଟାସ୍କଗୁଡ଼ିକ"}},"messages":{"stmsg":{"m0125":"କଣ୍ଟେଣ୍ଟ୍ ସୃଷ୍ଟି କରିବା କିମ୍ବା ଅପଲୋଡ୍ କରିବା ଆରମ୍ଭ କରନ୍ତୁ । ଏବେ ଆପଣ କୌଣସି କଣ୍ଟେଣ୍ଟ୍ ଡ୍ରାଫ୍ଟ ଭାବରେ ସେଭ୍ କରିନାହାନ୍ତି","ms0001":"କଣ୍ଟେଣ୍ଟ୍ ସୃଷ୍ଟି କରିବା କିମ୍ବା ଅପଲୋଡ୍ କରିବା ଆରମ୍ଭ କରନ୍ତୁ । ଏବେ ଆପଣ କୌଣସି କଣ୍ଟେଣ୍ଟ୍ କୁ ଡ୍ରାଫ୍ଟ ଭାବରେ ସେଭ୍ କରିନାହାନ୍ତି"}}},"trk":{"completed_learning":"ଶିକ୍ଷା ସମାପ୍ତ ହେଲା","essages":{"fmsg":{"m0082":"ଏବେ ଏହି ଶିକ୍ଷଣ ଟାସ୍କ ସକ୍ରିୟ ନାହିଁ । ଆପଣ ଏଥିରେ ଯୋଗ ଦେଇପାରିବେ ନାହିଁ"}},"frmelmnts":{"btn":{"create":"ସୃଷ୍ଟି କରନ୍ତୁ","enroll":"ଯୋଗ ଦିଅନ୍ତୁ","resumecourse":"ପୁନଃ ଆରମ୍ଭ କରନ୍ତୁ","unenroll":"ଛାଡ଼ନ୍ତୁ","viewcoursestats":"ପରିସଂଖ୍ୟାନ ଦେଖନ୍ତୁ","viewCourseStatsDashboard":"ଡ୍ୟାସବୋର୍ଡ ଦେଖନ୍ତୁ"},"instn":{"t0062":"ଏହି ଟାସ୍କ ପାଇଁ ଆପଣ ଏପର୍ଯ୍ୟନ୍ତ କୌଣସି ବ୍ୟାଚ୍ ସୃଷ୍ଟି କରିନାହାଁନ୍ତି । ଟାସ୍କ ସୃଷ୍ଟି କରନ୍ତୁ ଏବଂ ଡାସବୋର୍ଡ ଯାଞ୍ଚ କରନ୍ତୁ","t0063":"ଆପଣ ଏପର୍ଯ୍ୟନ୍ତ କୌଣସି ଟାସ୍କ ସୃଷ୍ଟି କରିନାହାଁନ୍ତି । ନୂଆ ଟାସ୍କ ସୃଷ୍ଟି କରନ୍ତୁ ଏବଂ ଡାସବୋର୍ଡ ଯାଞ୍ଚ କରନ୍ତୁ ।"},"lbl":{"accessCourse":"ଶିକ୍ଷଣ ସାମଗ୍ରୀ ଆକ୍ସେସ୍ କରନ୍ତୁ","accessToLogin":"କଣ୍ଟେଣ୍ଟ ଆକ୍ସେସ୍ କରିବା ପାଇଁ ଆପଣଙ୍କୁ ଲଗ୍ ଇନ୍ କରି ଟାସ୍କରେ ଯୋଗ ଦେବାକୁ ପଡ଼ିବ","ActivityCourses":"ଟାସ୍କଗୁଡ଼ିକ","ACTIVITY_COURSE_TITLE":"ଟାସ୍କଗୁଡ଼ିକ","addCourse":"ଯୋଡନ୍ତୁ","completedCourse":"ଶେଷ ହୋଇଥିବା ଟାସ୍କଗୁଡ଼ିକ","completingCourseSuccessfully":"ସଫଳତାର ସହିତ ଶିକ୍ଷା ଶେଷ କରିବା ପାଇଁ","copyAsCourse":"ଶିକ୍ଷଣ ସାମଗ୍ରୀ ଭାବରେ କପି କରନ୍ତୁ","courseContainCertificate":"ଏହି ଶିକ୍ଷା ଆପଣଙ୍କୁ ସାର୍ଟିଫିକେଟ୍ ଦେଇଥାଏ","courseDetails":"ଶିକ୍ଷଣ ବିବରଣୀ","courseProgress":"ପ୍ରଗତି","courseRelevantFor":"ଏହି ଶିକ୍ଷା ଏହିମାନଙ୍କ ପାଇଁ ଉଦ୍ଦିଷ୍ଟ:","courses":"ଟାସ୍କଗୁଡ଼ିକ","coursestructure":"ଶିକ୍ଷଣ ମଡ୍ୟୁଲ","courseSuccessMessage":"ଆପଣ ସଫଳତାର ସହ ନିଜର ଶିକ୍ଷା ଶେଷ କରିଛନ୍ତି","courseSuccessNotificationMessage":"7 ଦିନ ମଧ୍ୟରେ ଆପଣଙ୍କର ପଞ୍ଜୀକୃତ ଯୋଗାଯୋଗ ବିବରଣୀ ମାଧ୍ୟମରେ ସାର୍ଟିଫିକେଟ୍ ସମ୍ପର୍କିତ ସୂଚନା ଆପଣଙ୍କୁ ଦିଆଯିବ","courseWithoutCertificateNote":"ନୋଟ୍ : ଏହି ପାଠ୍ୟକ୍ରମରେ ସାର୍ଟିଫିକେଟ୍ ନାହିଁ","dashboardnocourseselected":"କୌଣସି ଚୟନ ହୋଇନାହିଁ","dashboardnocourseselecteddesc":"ସୂଚୀରୁ ଚୟନ କରନ୍ତୁ","downloadCourseQRCode":"QR କୋଡ଼୍ ଡାଉନଲୋଡ୍ କରନ୍ତୁ","downloadQRCode":{"tooltip":"QR କୋଡ୍ ଡାଉନଲୋଡ୍ କରି ଆପଣଙ୍କ ପ୍ରକାଶନ ସହିତ ଲିଙ୍କ କରିବା ପାଇଁ କ୍ଲିକ୍ କରନ୍ତୁ"},"getUnlimitedAccess":"ଆପଣଙ୍କ ମୋବାଇଲ ଫୋନରେ ପାଠ୍ୟପୁସ୍ତକ, TV କ୍ଲାସ୍ ଓ କୋର୍ସ ଅଫଲାଇନ୍ ପାଆନ୍ତୁ","joinTrainingToAcessContent":"କଣ୍ଟେଣ୍ଟ ଆକ୍ସେସ୍ କରିବା ପାଇଁ ଆପଣଙ୍କୁ ଲଗ୍ ଇନ୍ କରି ଟାସ୍କରେ ଯୋଗ ଦେବାକୁ ପଡ଼ିବ","moduleFinish":"ଆପଣ ଏହି ଟାସ୍କ ଶେଷ କରିଛନ୍ତି","moduleProgress":"ଟାସ୍କ ପ୍ରଗତି","mytrainings":"ମୋ ଟାସ୍କଗୁଡ଼ିକ","nextModule":"ପରବର୍ତ୍ତୀ ଟାସ୍କ","oneCourse":"ଟାସ୍କ","prevModule":"ପୂର୍ବ ଟାସ୍କ","returnToCourses":"ପଛକୁ ଯାଆନ୍ତୁ","sectionTitle":"ଟାସ୍କଗୁଡ଼ିକ","selectChapter":"ଟାସ୍କ ଚୟନ କରନ୍ତୁ","selectContentFromCourse":"କଣ୍ଟେଣ୍ଟ୍ ଚୟନ କରନ୍ତୁ","trainingAttended":"ଭାଗ ନେଇଥିବା ଶିକ୍ଷା","courseDontContainCertificate":"ଏବେ ଏହି ଶିକ୍ଷା ଟାସ୍କରେ ସାର୍ଟିଫିକେଟ୍ ନାହିଁ । ଟାସ୍କ ସୃଷ୍ଟିକର୍ତ୍ତା ପରେ ଏଥିରେ ସାର୍ଟିଫିକେଟ୍ ସାମିଲ କରିପାରନ୍ତି"},"tab":{"courses":"ଟାସ୍କଗୁଡ଼ିକ"}},"messages":{"dashboard":{"emsg":{"m002":"ଏହି ଶିକ୍ଷା ଟାସ୍କ ପାଇଁ ବ୍ୟବହାରକାରୀ କୌଣସି ବ୍ୟାଚରେ ଯୋଗ ଦେଇନାହାନ୍ତି"}},"emsg":{"m0002":"ଏହି ଶିକ୍ଷା ଟାସ୍କ ଆଉ ଉପଲବ୍ଧ ନାହିଁ","m0003":"ଏହି ଶିକ୍ଷା ଟାସ୍କରେ କୌଣସି ବ୍ୟାଚ୍ ଖାଲି ନାହିଁ"},"fmsg":{"dataSettingNotSubmitted":"ପ୍ରୋଫାଇଲ୍ ସେୟାର୍ ସେଟିଂସ୍ ଅପଡେଟ୍ ହୋଇ ପାରୁନାହିଁ । କିଛି ସମୟ ପରେ ଆଉଥରେ ଚେଷ୍ଟା କରନ୍ତୁ","m0001":"ଆମେ ଦୁଃଖିତ ! ଆପଣ ନାମାଙ୍କନ କରିଥିବା ଶିକ୍ଷଣ ଟାସ୍କ ସମ୍ବନ୍ଧରେ ଆମେ କୌଣସି ସୂଚନା ପାଇଲୁ ନାହିଁ । କିଛି ସମୟ ପରେ ଆଉଥରେ ଚେଷ୍ଟା କରନ୍ତୁ","m0002":"ଆମେ ଦୁଃଖିତ ! ଆପଣଙ୍କ ପାଇଁ ଅନ୍ୟ ଶିକ୍ଷା ଟାସ୍କ ମିଳିଲା ନାହିଁ । ପରେ ଆଉଥରେ ଚେଷ୍ଟା କରନ୍ତୁ","m0086":"ଏହି କଣ୍ଟେଣ୍ଟ ଆଉ ଉପଲବ୍ଧ ନାହିଁ"},"imsg":{"m0001":"ଏହି କଣ୍ଟେଣ୍ଟକୁ ଅସଙ୍ଗତ ଭାବରେ ଫ୍ଲାଗ୍ କରାଯାଇଛି । ଏବେ ଏହାକୁ ରିଭିଉ କରାଯାଉଛି","m0026":"ଏହି କଣ୍ଟେଣ୍ଟ୍ ଏବେ ଉପଲବ୍ଧ ନାହିଁ । ଏଥିରେ କିଛି ପରିବର୍ତ୍ତନ ହେଉଥାଇପାରେ ।"},"stmsg":{"m0125":"କଣ୍ଟେଣ୍ଟ୍ ସୃଷ୍ଟି କରିବା କିମ୍ବା ଅପଲୋଡ୍ କରିବା ଆରମ୍ଭ କରନ୍ତୁ । ଏବେ ଆପଣ କୌଣସି ଡ୍ରାଫ୍ଟ କଣ୍ଟେଣ୍ଟ୍ ସେଭ୍ କରିନାହାନ୍ତି"}}}},"crs":{"nontrk":{"frmelmnts":{"lbl":{"ActivityTextbooks":"କୋର୍ସଗୁଡ଼ିକ","ACTIVITY_TEXTBOOK_TITLE":"କୋର୍ସଗୁଡ଼ିକ","chapter":"କୋର୍ସ ମଡ୍ୟୁଲ","desktop":{"downloadBook":"କୋର୍ସ ଡାଉନଲୋଡ୍ କରନ୍ତୁ","find_more":"{instance} ରେ ଅଧିକ କୋର୍ସ ଓ କଣ୍ଟେଣ୍ଟ୍ ଦେଖନ୍ତୁ","updateTextbook":"କୋର୍ସ ଅପଡେଟ୍ କରନ୍ତୁ"},"downloadBooks":"ଅଫଲାଇନ୍ ଥିବା ସମୟରେ ଆକ୍ସେସ୍ କରିବା ପାଇଁ କୋର୍ସ ଡାଉନଲୋଡ୍ କରନ୍ତୁ","fromTheTextBook":"କୋର୍ସରୁ","noBookfoundTitle":"ବୋର୍ଡ କୋର୍ସ ଯୋଗ କରୁଛି","textbooks":"କୋର୍ସଗୁଡ଼ିକ"}}},"trk":{"completedCourse":"କୋର୍ସ ଶେଷହେଲା","frmelmnts":{"btn":{"createCourse":"କୋର୍ସ ସୃଷ୍ଟି କରନ୍ତୁ","enroll":"କୋର୍ସରେ ନାମାଙ୍କନ କରନ୍ତୁ","resumecourse":"କୋର୍ସ ପୁନଃ ଆରମ୍ଭ କରନ୍ତୁ","unenroll":"କୋର୍ସରୁ ବାହାରିଯାଆନ୍ତୁ","viewcoursestats":"କୋର୍ସ ପରିସଂଖ୍ୟାନ ଦେଖନ୍ତୁ","viewCourseStatsDashboard":"କୋର୍ସ ଡ୍ୟାସବୋର୍ଡ ଦେଖନ୍ତୁ"},"instn":{"t0062":"ଆପଣଏବେ ପର୍ଯ୍ୟନ୍ତ ଏହି କୋର୍ସ ନିମନ୍ତେ କୌଣସି ବ୍ୟାଚ୍ ତିଆରି କରିନାହାନ୍ତି | ନୂଆ ବ୍ୟାଚ୍ ତିଆରି କରନ୍ତୁ ଏବଂ ଡ୍ୟାସବୋର୍ଡକୁ ପୁଣିଥରେ ଯାଞ୍ଚ କରନ୍ତୁ ।","t0063":"ଆପଣ ଏବେ ପର୍ଯ୍ୟନ୍ତ କୌଣସି କୋର୍ସ ତିଆରି କରିନାହାନ୍ତି । ନୂଆ କୋର୍ସ ତିଆରି କରନ୍ତୁ ଏବଂ ଡ୍ୟାସବୋର୍ଡକୁ ପୁଣିଥରେ ଯାଞ୍ଚ କରନ୍ତୁ ।"},"lbl":{"accessCourse":"କୋର୍ସକୁ ଆକ୍ସେସ୍ କରନ୍ତୁ","accessToLogin":"କୋର୍ସ ଆକ୍ସେସ୍ କରିବା ପାଇଁ ଆପଣଙ୍କୁ ଲଗ୍ ଇନ୍ କରି କୋର୍ସରେ ଯୋଗଦାନ କରିବାକୁ ପଡିବ","ActivityCourses":"କୋର୍ସଗୁଡ଼ିକ","ACTIVITY_COURSE_TITLE":"କୋର୍ସଗୁଡ଼ିକ","addCourse":"କୋର୍ସ ଯୋଗ କରନ୍ତୁ","completedCourse":"ଶେଷ ହୋଇଥିବା କୋର୍ସଗୁଡ଼ିକ","completingCourseSuccessfully":"ଏହି କୋର୍ସକୁ ସଫଳତାର ସହିତ ଶେଷ କରିବା ପାଇଁ,","copyAsCourse":"କୋର୍ସ ଭାବରେ କପି କରନ୍ତୁ","courseContainCertificate":"ଏହା ଏକ ସାର୍ଟିଫିକେଟ୍ କୋର୍ସ ଅଟେ","courseDetails":"କୋର୍ସ ବିବରଣୀ","courseDontContainCertificate":"ଏହି କୋର୍ସରେ ସାର୍ଟିଫିକେଟ୍ ମିଳେ ନାହିଁ | କୋର୍ସ ପ୍ରସ୍ତୁତକର୍ତ୍ତା ପରେ ସାର୍ଟିଫିକେଟ୍ ବ୍ୟବସ୍ଥା କରିପାରନ୍ତି |","courseLastUpdatedOn":"ଶେଷଥର ପାଇଁ କୋର୍ସ ଅପଡ଼େଟ୍ ହୋଇଥିବା ତାରିଖ","courseProgress":"କୋର୍ସ ପ୍ରଗତି","courseRelevantFor":"ଏହି କୋର୍ସ ଏହିମାନଙ୍କ ପାଇଁ ଉଦ୍ଦିଷ୍ଟ:","courses":"କୋର୍ସଗୁଡ଼ିକ","coursestructure":"କୋର୍ସ ମଡ୍ୟୁଲଗୁଡ଼ିକ","courseSuccessMessage":"ଆପଣ ଏହି କୋର୍ସ ସଫଳତାର ସହିତ ଶେଷ କରିଛନ୍ତି","courseSuccessNotificationMessage":"7 ଦିନ ମଧ୍ୟରେ ଆପଣଙ୍କର ପଞ୍ଜୀକୃତ ଯୋଗାଯୋଗ ବିବରଣୀ ମାଧ୍ୟମରେ କୋର୍ସ ସାର୍ଟିଫିକେଟ୍ ସମ୍ପର୍କିତ ସୂଚନା ଆପଣଙ୍କୁ ଦିଆଯିବ","courseWithoutCertificateNote":"ନୋଟ୍ : ଏହି କୋର୍ସରେ ସାର୍ଟିଫିକେଟ୍ ମିଳେ ନାହିଁ","dashboardnocourseselected":"କୌଣସି କୋର୍ସ ଚୟନ କରାଯାଇନାହିଁ","dashboardnocourseselecteddesc":"ସୂଚୀ ମଧ୍ୟରୁ ଏକ କୋର୍ସ ଚୟନ କରନ୍ତୁ","downloadCourseQRCode":"କୋର୍ସ QR କୋଡ଼୍ ଡାଉନଲୋଡ୍ କରନ୍ତୁ","downloadQRCode":{"tooltip":"QR କୋଡ୍ ଡାଉନଲୋଡ୍ କରି ତାହାକୁ ପ୍ରକାଶିତ କୋର୍ସ ସହିତ ଲିଙ୍କ କରିବା ପାଇଁ କ୍ଲିକ୍ କରନ୍ତୁ"},"enrollcourse":"କୋର୍ସରେ ଯୋଗ ଦିଅନ୍ତୁ","getUnlimitedAccess":"ଆପଣଙ୍କ ମୋବାଇଲ ଫୋନରେ ଅସୀମିତ ଅଫଲାଇନ ପାଠ୍ୟପୁସ୍ତକ, ଲେସନ୍ ଏବଂ କୋର୍ସ ପାଆନ୍ତୁ","joinTrainingToAcessContent":"କଣ୍ଟେଣ୍ଟକୁ ସମ୍ପୂର୍ଣ୍ଣ ଆକ୍ସେସ୍ କରିବା ପାଇଁ ଆପଣଙ୍କୁ କୋର୍ସରେ ଯୋଗଦେବାକୁ ପଡ଼ିବ","moduleFinish":"ଆପଣ ଏହି ମଡ୍ୟୁଲ ଶେଷ କରିଛନ୍ତି","moduleProgress":"ମଡ୍ୟୁଲ୍ ପ୍ରଗତି","mytrainings":"ମୋ କୋର୍ସଗୁଡ଼ିକ","nextModule":"ପରବର୍ତ୍ତୀ ମଡ୍ୟୁଲ୍","oneCourse":"କୋର୍ସ","prevModule":"ପୂର୍ବ ମଡ୍ୟୁଲ୍","returnToCourses":"କୋର୍ସକୁ ଫେରନ୍ତୁ","sectionTitle":"କୋର୍ସଗୁଡ଼ିକ","selectChapter":"ମଡ୍ୟୁଲ୍ ଚୟନ କରନ୍ତୁ","selectContentFromCourse":"କୋର୍ସ ପାଇଁ କଣ୍ଟେଣ୍ଟ୍ ଚୟନ କରନ୍ତୁ","signinenrollTitle":"ଏହି କୋର୍ସରେ ନାମାଙ୍କନ କରିବା ନିମନ୍ତେ ଲଗ୍ ଇନ୍ କରନ୍ତୁ","trainingAttended":"ଭାଗନେଇଥିବା କୋର୍ସଗୁଡ଼ିକ","userName":"ବ୍ୟବହାରକାରୀଙ୍କ ନାମ"},"tab":{"courses":"କୋର୍ସଗୁଡ଼ିକ"}},"messages":{"dashboard":{"emsg":{"m002":"ଏହି କୋର୍ସର କୌଣସି ବ୍ୟାଚରେ ୟୁଜର ପଂଜିକୃତ ହୋଇନାହାନ୍ତି"}},"emsg":{"m0002":"ଏହି କୋର୍ସ ଆଉ ନାହିଁ","m0003":"ଏହି କୋର୍ସରେ କୌଣସି ଓପନ୍ ବ୍ୟାଚ୍ ନାହିଁ"},"fmsg":{"m0001":"ନାମାଙ୍କିତ କୋର୍ସଗୁଡ଼ିକୁ ଆଣିପାରୁନାହିଁ, କିଛି ସମୟ ପରେ ପୁଣିଥରେ ପ୍ରୟାସ କରନ୍ତୁ","m0002":"ଅନ୍ୟ ପାଠ୍ୟକ୍ରମଗୁଡ଼ିକୁ ଆଣିପାରୁନାହିଁ, କିଛି ସମୟ ପରେ ପ୍ରୟାସ କରନ୍ତୁ...","m0082":"ଏହି କୋର୍ସ ନାମାଙ୍କନ ନିମନ୍ତେ ଉପଲବ୍ଧ ନାହିଁ","m0086":"ଏହି କୋର୍ସଟି ଗଠନକାରୀଙ୍କ ଦ୍ୱାରା ବାହାର କରାଯାଇଛି ଏବଂ ସେଥିପାଇଁ ଏହା ଆଉ ଉପଲବ୍ଧ ନାହିଁ"},"imsg":{"m0001":"ଏହି କୋର୍ସକୁ ଅନୁପଯୁକ୍ତ ବୋଲି ଚିହ୍ନଟ କରାଯାଇଛି ଏବଂ ବର୍ତ୍ତମାନ ସମୀକ୍ଷା କରାଯାଉଅଛି ।","m0026":"ଏହି କୋର୍ସ ଏବେ ଉପଲବ୍ଧ ନାହିଁ | ଏହି କୋର୍ସରେ ନିର୍ମାତା କିଛି ପରିବର୍ତ୍ତନ କରିଥିବାର ସମ୍ଭାବନା ଅଛି ।"},"stmsg":{"m0125":"ସଂସାଧନ, ପୁସ୍ତକ, କୋର୍ସ, ସଂଗ୍ରହ ସୃଷ୍ଟି କିମ୍ବା ଅପଲୋଡ଼ ଆରମ୍ଭ କରନ୍ତୁ । ଏବେ ଆପଣଙ୍କ ପାଖରେ କୌଣସି ପ୍ରଗତିରତ କାର୍ଯ୍ୟ ଡ୍ରାଫ୍ଟ ଭାବରେ ନାହିଁ"}}}},"tbk":{"nontrk":{"frmelmnts":{"lbl":{"ActivityTextbooks":"ପାଠ୍ୟପୁସ୍ତକଗୁଡ଼ିକ","ACTIVITY_TEXTBOOK_TITLE":"ପାଠ୍ୟପୁସ୍ତକ","chapter":"ଅଧ୍ୟାୟ","copyAsCourse":"କୋର୍ସ ଭାବରେ କପି କରନ୍ତୁ","desktop":{"deleteCollection":"{name} ପାଠ୍ୟପୁସ୍ତକ ଡିଲିଟ୍ କରିବା ଦ୍ୱାରା ଏହା ମାଇଁ ଡାଉନଲୋଡ୍ ରୁ ହଟିଯିବ । ଜାରି ରଖିବା ପାଇଁ ଡିଲିଟ୍ ଉପରେ କ୍ଲିକ୍ କରନ୍ତୁ","downloadBook":"ପାଠ୍ୟପୁସ୍ତକ ଡାଉନଲୋଡ୍ କରନ୍ତୁ","find_more":"{instance} ରେ ଅଧିକ ପାଠ୍ୟପୁସ୍ତକ ଓ କଣ୍ଟେଣ୍ଟ୍ ଦେଖନ୍ତୁ","updateTextbook":"ପାଠ୍ୟପୁସ୍ତକ ଅପଡେଟ୍ କରନ୍ତୁ"},"dialCodeDescription":"QR କୋଡ଼ 6 ଅଙ୍କର ଆକ୍ଷରିକ କୋଡ଼ ଅଟେ ଯାହା ଆପଣଙ୍କ ପାଠ୍ୟପୁସ୍ତକରେ QR କୋଡ଼ ଛବି ତଳେ ପାଇପାରିବେ","dialCodeDescriptionGetPage":"QR କୋଡ଼ 6 ଅଙ୍କର ଆକ୍ଷରିକ କୋଡ଼ ଅଟେ ଯାହା ଆପଣଙ୍କ ପାଠ୍ୟପୁସ୍ତକରେ ଥିବା QR କୋଡ଼ ଛବି ତଳେ ପାଇପାରିବେ ।","downloadBooks":"ଅଫଲାଇନ୍ ଥିବା ସମୟରେ ଆକ୍ସେସ୍ କରିବା ପାଇଁ ବହି ଡାଉନଲୋଡ୍ କରନ୍ତୁ","fromTheTextBook":"ପାଠ୍ୟପୁସ୍ତକରୁ","getUnlimitedAccess":"ଆପଣଙ୍କ ମୋବାଇଲ ଫୋନରେ ଅସୀମିତ ଅଫଲାଇନ ପାଠ୍ୟପୁସ୍ତକ, ଲେସନ୍ ଏବଂ କୋର୍ସ ପାଆନ୍ତୁ","import":"ଅଫଲାଇନ୍ ଥିବା ସମୟରେ ଆକ୍ସେସ୍ କରିବା ପାଇଁ ବହି ଡାଉନଲୋଡ୍ କରନ୍ତୁ","installAppDesc":"ଆପଣଙ୍କ ଡିଭାଇସରେ ଲେସନ୍, ପାଠ୍ୟପୁସ୍ତକ ଓ କଣ୍ଟେଣ୍ଟ୍ ଅଫଲାଇନରେ ରଖନ୍ତୁ","mynotebook":"ମୋ ନୋଟବୁକ୍","noBookfoundButtonText":"ଅଧିକ ପୁସ୍ତକ ଓ କଣ୍ଟେଣ୍ଟ୍ ଦେଖନ୍ତୁ","noBookfoundSubTitle":"ଆପଣଙ୍କ ବୋର୍ଡ ଅଧିକ ପୁସ୍ତକ ସାମିଲ କରିବ । {instance} ରେ ଅଧିକ ପୁସ୍ତକ ଓ କଣ୍ଟେଣ୍ଟ ଦେଖିବା ପାଇଁ ଏହି ବଟନ୍ ଟ୍ୟାପ୍ କରନ୍ତୁ","noBookfoundTitle":"ବୋର୍ଡ ପୁସ୍ତକ ସାମିଲ କରୁଛି","textbooks":"ପାଠ୍ୟପୁସ୍ତକ"}},"messages":{"stmsg":{"m0125":"ସଂସାଧନ, ପୁସ୍ତକ, କୋର୍ସ, ସଂଗ୍ରହ ସୃଷ୍ଟି କିମ୍ବା ଅପଲୋଡ଼ ଆରମ୍ଭ କରନ୍ତୁ । ଏବେ ଆପଣଙ୍କ ପାଖରେ କୌଣସି ପ୍ରଗତିରତ କାର୍ଯ୍ୟ ଡ୍ରାଫ୍ଟ ନାହିଁ"}}},"trk":{"frmelmnts":{"btn":{"enroll":"ପଢ଼ନ୍ତୁ","resumecourse":"ପଢ଼ିବା ପୁନଃଆରମ୍ଭ କରନ୍ତୁ","unenroll":"ବନ୍ଦ କରନ୍ତୁ"},"instn":{"t0062":"ଏହି ପାଠ୍ୟପୁସ୍ତକ ପାଇଁ ଆପଣ ଏବେ ପର୍ଯ୍ୟନ୍ତ କୌଣସି ଶିକ୍ଷା/ପଢ଼ିବା ବ୍ୟାଚ୍ ସୃଷ୍ଟି କରିନାହାଁନ୍ତି । ବ୍ୟାଚ୍ ସୃଷ୍ଟି କରନ୍ତୁ ଓ ଡାସବୋର୍ଡ ଯାଞ୍ଚ କରନ୍ତୁ","t0063":"ଆପଣ ଏବେ ପର୍ଯ୍ୟନ୍ତ କୌଣସି ପାଠ୍ୟପୁସ୍ତକ ସୃଷ୍ଟି କରିନାହାଁନ୍ତି । ପାଠ୍ୟପୁସ୍ତକ ସୃଷ୍ଟି କରନ୍ତୁ ଓ ଡାସବୋର୍ଡ ଯାଞ୍ଚ କରନ୍ତୁ"},"lbl":{"accessCourse":"ପାଠ୍ୟପୁସ୍ତକ ଆକ୍ସେସ୍ କରନ୍ତୁ","accessToLogin":"ପାଠ୍ୟପୁସ୍ତକ ଆକ୍ସେସ୍ କରିବା ପାଇଁ ଆପଣଙ୍କୁ ଲଗ୍ ଇନ୍ କରି ଶିକ୍ଷା/ପଢିବା ବ୍ୟାଚ୍ ରେ ଯୋଗ ଦେବାକୁ ପଡ଼ିବ","ActivityCourses":"ପାଠ୍ୟପୁସ୍ତକ","ACTIVITY_COURSE_TITLE":"ପାଠ୍ୟପୁସ୍ତକ","addCourse":"ପାଠ୍ୟପୁସ୍ତକ ଯୋଗ କରନ୍ତୁ","completedCourse":"ଶେଷ ହୋଇଥିବା ପାଠ୍ୟପୁସ୍ତକ","completingCourseSuccessfully":"ସଫଳତାର ସହ ଶିକ୍ଷା ଶେଷ କରିବା ପାଇଁ,","copyAsCourse":"ପାଠ୍ୟପୁସ୍ତକ ଭାବରେ କପି କରନ୍ତୁ","courseDetails":"ପାଠ୍ୟପୁସ୍ତକ ବିବରଣୀ","courses":"ପାଠ୍ୟପୁସ୍ତକ","coursestructure":"ଅଧ୍ୟାୟ","joinTrainingToAcessContent":"କଣ୍ଟେଣ୍ଟ ଆକ୍ସେସ୍ କରିବା ପାଇଁ, ଆପଣଙ୍କୁ ଶିକ୍ଷା ବ୍ୟାଚରେ ଯୋଗ ଦେବାକୁ ପଡ଼ିବ","moduleFinish":"ଆପଣ ଏହି ଅଧ୍ୟାୟ ଶେଷ କରିଛନ୍ତି","moduleProgress":"ଅଧ୍ୟାୟ ପ୍ରଗତି","mytrainings":"ମୋ ଡିଜିଟାଲ ପାଠ୍ୟପୁସ୍ତକଗୁଡ଼ିକ","nextModule":"ପରବର୍ତ୍ତୀ ଅଧ୍ୟାୟ","oneCourse":"ଡିଜିଟାଲ ପାଠ୍ୟପୁସ୍ତକ","prevModule":"ପୂର୍ବ ଅଧ୍ୟାୟ","sectionTitle":"ଡିଜିଟାଲ୍ ପାଠ୍ୟପୁସ୍ତକ","selectChapter":"ଅଧ୍ୟାୟ ଚୟନ କରନ୍ତୁ","trainingAttended":"ପଢ଼ି ସାରିଥିବା ପାଠ୍ୟପୁସ୍ତକ","courseContainCertificate":"ଏହି ଶିକ୍ଷା ଆପଣଙ୍କୁ ସାର୍ଟିଫିକେଟ୍ ଦେଇଥାଏ","courseDontContainCertificate":"ଏବେ ଏହି ଶିକ୍ଷା ଟାସ୍କରେ ସାର୍ଟିଫିକେଟ୍ ନାହିଁ । ଟାସ୍କ ସୃଷ୍ଟିକର୍ତ୍ତା ପରେ ଏଥିରେ ସାର୍ଟିଫିକେଟ୍ ସାମିଲ କରିପାରନ୍ତି ।"},"tab":{"courses":"ଡିଜିଟାଲ ପାଠ୍ୟପୁସ୍ତକ"}},"messages":{"emsg":{"m0002":"ଏହି ପାଠ୍ୟପୁସ୍ତକ ଆଉ ଉପଲବ୍ଧ ନାହିଁ"},"fmsg":{"dataSettingNotSubmitted":"ପ୍ରୋଫାଇଲ୍ ସେୟାର୍ ସେଟିଂସ୍ ଅପଡେଟ୍ ହୋଇ ପାରୁନାହିଁ । କିଛି ସମୟ ପରେ ଆଉଥରେ ଚେଷ୍ଟା କରନ୍ତୁ","m0001":"ଆମେ ଦୁଃଖିତ! ଆପଣ ଖୋଜୁଥିବା ପାଠ୍ୟପୁସ୍ତକ ଆମେ ପାଇଲୁ ନାହିଁ । କିଛି ସମୟ ପରେ ଆଉଥରେ ଚେଷ୍ଟା କରନ୍ତୁ","m0002":"ଆମେ ଦୁଃଖିତ ! ଆପଣଙ୍କ ପାଇଁ ଅନ୍ୟ ପାଠ୍ୟପୁସ୍ତକ ମିଳିଲା ନାହିଁ । ପରେ ଆଉଥରେ ଚେଷ୍ଟା କରନ୍ତୁ","m0086":"ଏହି ପାଠ୍ୟପୁସ୍ତକ ଆଉ ଉପଲବ୍ଧ ନାହିଁ"}}}},"tvc":{"nontrk":{"frmelmnts":{"lbl":{"ActivityTvClasses":"TV କ୍ଲାସଗୁଡ଼ିକ","ACTIVITY_TEXTBOOK_TITLE":"TV କ୍ଲାସଗୁଡ଼ିକ","ACTIVITY_TV_CLASS_TITLE":"TV କ୍ଲାସଗୁଡ଼ିକ","chapter":"TV କାର୍ଯ୍ୟକ୍ରମ","collection_tv_classes":"TV କ୍ଲାସଗୁଡ଼ିକ","desktop":{"downloadBook":"TV କ୍ଲାସଗୁଡ଼ିକ ଡାଉନଲୋଡ଼୍ କରନ୍ତୁ","downloadTVclasses":"TV କ୍ଲାସଗୁଡ଼ିକ ଡାଉନଲୋଡ଼୍ କରନ୍ତୁ","find_more":"{instance} ରେ ଅଧିକ TV କ୍ଲାସ୍ ଓ ସେ ସମ୍ପର୍କିତ କଣ୍ଟେଣ୍ଟ୍ ଦେଖନ୍ତୁ","find_more_TVclasses":"{instance} ରେ ଅଧିକ TV କ୍ଲାସ୍ ଓ ସେ ସମ୍ପର୍କିତ କଣ୍ଟେଣ୍ଟ୍ ଦେଖନ୍ତୁ","updateTextbook":"TV କ୍ଲାସଗୁଡ଼ିକ ଅପଡ଼େଟ୍ କରନ୍ତୁ","updateTVclasses":"TV କ୍ଲାସଗୁଡ଼ିକ ଅପଡ଼େଟ୍ କରନ୍ତୁ"},"downloadBooks":"ଅଫଲାଇନ ଥିବା ସମୟରେ ଆକ୍ସେସ୍ କରିବା ପାଇଁ TV କ୍ଲାସଗୁଡ଼ିକ ଡାଉନଲୋଡ଼୍ କରନ୍ତୁ","downloadTVclasses":"ଅଫଲାଇନ ଥିବା ସମୟରେ ଆକ୍ସେସ୍ କରିବା ପାଇଁ TV କ୍ଲାସଗୁଡ଼ିକ ଡାଉନଲୋଡ଼୍ କରନ୍ତୁ","fromTheTextBook":"TV କ୍ଲାସରୁ","fromTheTVclasses":"TV କ୍ଲାସରୁ","noBookfoundTitle":"ବୋର୍ଡ TV କ୍ଲାସ ଯୋଗ କରୁଛି","textbooks":"TV କ୍ଲାସଗୁଡ଼ିକ","TVclassesfoundTitle":"ବୋର୍ଡ TV କ୍ଲାସ ଯୋଗ କରୁଛି","tv_classes":"TV କ୍ଲାସଗୁଡ଼ିକ","tv_program":"TV କାର୍ଯ୍ୟକ୍ରମ"}}},"trk":{"frmelmnts":{"btn":{"enroll":"ଦେଖନ୍ତୁ","resumecourse":"ଦେଖିବା ପୁନଃଆରମ୍ଭ କରନ୍ତୁ"},"instn":{"t0062":"ଏହି TV କ୍ଲାସ୍ ପାଇଁ ଆପଣ ଏବେ ପର୍ଯ୍ୟନ୍ତ କୌଣସି ଶିକ୍ଷା ବ୍ୟାଚ୍ ସୃଷ୍ଟି କରିନାହାଁନ୍ତି । ବ୍ୟାଚ୍ ସୃଷ୍ଟି କରନ୍ତୁ ଓ ଡାସବୋର୍ଡ ଯାଞ୍ଚ କରନ୍ତୁ","t0063":"ଆପଣ ଏବେ ପର୍ଯ୍ୟନ୍ତ କୌଣସି TV କ୍ଲାସ୍ ସୃଷ୍ଟି କରିନାହାଁନ୍ତି । ଗୋଟିଏ TV କ୍ଲାସ୍ ସୃଷ୍ଟି କରନ୍ତୁ ଏବଂ ଡ୍ୟାସବୋର୍ଡ ଯାଞ୍ଚ କରନ୍ତୁ"},"lbl":{"accessCourse":"TV କ୍ଲାସଗୁଡ଼ିକ ଆକ୍ସେସ୍ କରନ୍ତୁ","accessToLogin":"TV କ୍ଲାସ୍ ଆକ୍ସେସ୍ କରିବା ପାଇଁ ଆପଣଙ୍କୁ ଲଗ୍ ଇନ୍ କରି ଶିକ୍ଷା ବ୍ୟାଚ୍ ରେ ଯୋଗ ଦେବାକୁ ପଡ଼ିବ","ActivityCourses":"TV କ୍ଲାସଗୁଡ଼ିକ","ACTIVITY_COURSE_TITLE":"TV କ୍ଲାସଗୁଡ଼ିକ","addCourse":"TV କ୍ଲାସ୍ ଯୋଗ କରନ୍ତୁ","completedCourse":"ଶେଷ କରିଥିବା TV କ୍ଲାସଗୁଡ଼ିକ","copyAsCourse":"TV କ୍ଲାସ୍ ଭାବରେ କପି କରନ୍ତୁ","courseContainCertificate":"ଏହି ଶିକ୍ଷା ଆପଣଙ୍କୁ ସାର୍ଟିଫିକେଟ୍ ଦେଇଥାଏ","courseDetails":"TV କ୍ଲାସ୍ ବିବରଣୀ","courses":"TV କ୍ଲାସଗୁଡ଼ିକ","coursestructure":"TV କାର୍ଯ୍ୟକ୍ରମ","moduleFinish":"ଆପଣ ଏହି କାର୍ଯ୍ୟକ୍ରମ ଶେଷ କରିଛନ୍ତି","moduleProgress":"କାର୍ଯ୍ୟକ୍ରମ ପ୍ରଗତି","mytrainings":"ମୋର TV କ୍ଲାସଗୁଡ଼ିକ","nextModule":"ପରବର୍ତ୍ତୀ କାର୍ଯ୍ୟକ୍ରମ","oneCourse":"TV କ୍ଲାସ୍","prevModule":"ପୂର୍ବ କାର୍ଯ୍ୟକ୍ରମ","sectionTitle":"TV କ୍ଲାସଗୁଡ଼ିକ","selectChapter":"କାର୍ଯ୍ୟକ୍ରମ ଚୟନ କରନ୍ତୁ","trainingAttended":"ଦେଖିଥିବା TV କ୍ଲାସ୍","courseDontContainCertificate":"ଏବେ ଏହି ଶିକ୍ଷା ଟାସ୍କରେ ସାର୍ଟିଫିକେଟ୍ ନାହିଁ । ଟାସ୍କ ସୃଷ୍ଟିକର୍ତ୍ତା ପରେ ଏଥିରେ ସାର୍ଟିଫିକେଟ୍ ସାମିଲ କରିପାରନ୍ତି"},"tab":{"courses":"TV କ୍ଲାସଗୁଡ଼ିକ"}},"messages":{"emsg":{"m0002":"ଏହି TV କ୍ଲାସ୍ ଟାସ୍କ ଆଉ ଉପଲବ୍ଧ ନାହିଁ"},"fmsg":{"m0001":"ଆମେ ଦୁଃଖିତ! ଆପଣ ଖୋଜୁଥିବା TV କ୍ଲାସଗୁଡ଼ିକୁ ଆମେ ପାଇଲୁ ନାହିଁ । କିଛି ସମୟ ପରେ ଆଉଥରେ ଚେଷ୍ଟା କରନ୍ତୁ","m0002":"ଆମେ ଦୁଃଖିତ ! ଆପଣଙ୍କ ପାଇଁ ଅନ୍ୟ TV କ୍ଲାସ୍ ମିଳିଲା ନାହିଁ । ପରେ ଆଉଥରେ ଚେଷ୍ଟା କରନ୍ତୁ","m0086":"ଏହି TV କ୍ଲାସ୍ ଆଉ ଉପଲବ୍ଧ ନାହିଁ"}}}}}
\ No newline at end of file
diff --git a/utils/portal/labels/all_labels_ta.json b/utils/portal/labels/all_labels_ta.json
new file mode 100644
index 000000000..d49f88f19
--- /dev/null
+++ b/utils/portal/labels/all_labels_ta.json
@@ -0,0 +1 @@
+{"dflt":{"nontrk":{"frmelmnts":{"btn":{"create":"உருவாக்கு"},"lbl":{"ActivityTextbooks":"பணிகள்","ACTIVITY_TEXTBOOK_TITLE":"பணிகள்","chapter":"கற்றல் மாடுயூல்","collection_task":"பணிகள்","desktop":{"download":"பதிவிறக்கம்","downloadBook":"பதிவிறக்கம்","find_more":"மேலும் உள்ளடக்கத்தைக் கண்டறியவும்","find_more_tasks":"மேலும் உள்ளடக்கத்தைக் கண்டறியவும்","update":"புதுப்பிப்பு","updateTextbook":"புதுப்பித்தல்"},"downloadBooks":"ஆஃப்லைனில் அணுக பதிவிறக்கவும்","downloadoffline":"ஆஃப்லைனில் அணுக பதிவிறக்கவும்","download_to_access_offline":"ஆஃப்லைனில் அணுக பதிவிறக்கவும்","fromTheLearningTask":"கற்றல் பணியிலிருந்து","fromTheTextBook":"கற்றல் பணியிலிருந்து","import":"ஆஃப்லைனில் அணுக பதிவிறக்கவும்","learningmodule":"கற்றல் மாடுயூல்","mynotebook":"எனது குறிப்பேடு","noBookfoundButtonText":"மேலும் பார்க்க","noBookfoundSubTitle":"உங்கள் கல்வி வாரியம் இன்னும் உள்ளடக்கத்தைச் சேர்க்கவில்லை. {instance} இல் கூடுதல் உள்ளடக்கத்தைக் காண பொத்தானைத் தட்டவும்","noBookfoundTitle":"வாரியம் உள்ளடக்கத்தைச் சேர்க்கிறது","noTaskfoundSubTitle":"உங்கள் போர்டு இன்னும் உள்ளடக்கத்தைச் சேர்க்கவில்லை. {instance} இல் கூடுதல் உள்ளடக்கத்தைக் காண பொத்தானைத் தட்டவும்","noTaskfoundTitle":"வாரியம் உள்ளடக்கத்தைச் சேர்க்கிறது","seemore":"மேலும் பார்க்க","task":"பணிகள்","tasks":"பணிகள்","task_title":"பணிகள்","textbooks":"பணிகள்"}},"messages":{"stmsg":{"m0125":"உள்ளடக்கத்தை உருவாக்க அல்லது பதிவேற்றத் தொடங்குங்கள். உங்களிடம் தற்போது எந்த உள்ளடக்கமும் வரைவாக சேமிக்கப்படவில்லை","ms0001":"உள்ளடக்கத்தை உருவாக்க அல்லது பதிவேற்றத் தொடங்குங்கள். உங்களிடம் தற்போது எந்த உள்ளடக்கமும் வரைவாக சேமிக்கப்படவில்லை"}}},"trk":{"completed_learning":"கற்றல் முடிந்தது","essages":{"fmsg":{"m0082":"இந்த கற்றல் பணி இன்னும் திறக்கப்படவில்லை. நீங்கள் அதில் சேர முடியாது"}},"frmelmnts":{"btn":{"create":"உருவாக்கு","enroll":"சேர்","resumecourse":"தற்குறிப்பு","unenroll":"விடுங்கள்","viewcoursestats":"புள்ளிவிவரங்களை காண","viewCourseStatsDashboard":"டாஷ்போர்டைக் காண்க"},"instn":{"t0062":"இந்த பணிக்காக நீங்கள் இதுவரை எந்த தொகுப்பையும் உருவாக்கவில்லை. ஒரு பணியை உருவாக்கி டாஷ்போர்டை சரிபார்க்கவும்","t0063":"நீங்கள் இதுவரை எந்த பணியையும் உருவாக்கவில்லை. புதிய பணியை உருவாக்கி, டாஷ்போர்டை மீண்டும் சரிபார்க்கவும்."},"lbl":{"accessCourse":"கற்றல் பொருள் அணுக","accessToLogin":"உள்ளடக்கத்தை அணுக நீங்கள் உள்நுழைந்து பணியில் சேர வேண்டும்","ActivityCourses":"பணிகள்","ACTIVITY_COURSE_TITLE":"பணிகள்","addCourse":"சேர்","completedCourse":"முடிக்கப்பட்ட பணிகள்","completingCourseSuccessfully":"கற்றலை வெற்றிகரமாக முடிக்க,","copyAsCourse":"கற்றல் பொருளாக நகலெடுக்கவும்","courseContainCertificate":"இந்த கற்றல் உங்களுக்கு ஒரு சான்றிதழை வழங்குகிறது","courseDetails":"கற்றல் விவரங்கள்","courseProgress":"முன்னேற்றம்","courseRelevantFor":"இந்த கற்றல் இதற்கு பொருத்தமானது:","courses":"பணிகள்","coursestructure":"கற்றல் மாடுயூல்","courseSuccessMessage":"உங்கள் கற்றலை வெற்றிகரமாக முடித்துவிட்டீர்கள்","courseSuccessNotificationMessage":"உங்கள் பதிவு செய்யப்பட்ட தொடர்பு விவரங்களில் உங்கள் சான்றிதழ் குறித்து 7 நாட்களுக்குள் உங்களுக்கு அறிவிக்கப்படும்","courseWithoutCertificateNote":"குறிப்பு: இந்த கற்றல் உங்களுக்கு சான்றிதழை வழங்காது","dashboardnocourseselected":"தேர்வு எதுவும் செய்யப்படவில்லை","dashboardnocourseselecteddesc":"பட்டியலிலிருந்து தேர்ந்தெடுக்கவும்","downloadCourseQRCode":"QR குறியீட்டைப் பதிவிறக்கவும்","downloadQRCode":{"tooltip":"QR குறியீடுகளைப் பதிவிறக்க கிளிக் செய்து அவற்றை உங்கள் வெளியீட்டில் இணைக்கவும்"},"getUnlimitedAccess":"உங்க காய்பேசியில் பாடப்புத்தகங்கள், டிவி வகுப்புகள் மற்றும் பாடநெறிகளை ஆஃப்லைனில் வரம்பற்ற அணுகலைப் பெறுங்கள்","joinTrainingToAcessContent":"உள்ளடக்கத்தை அணுக, நீங்கள் உள்நுழைந்து பணியில் சேர வேண்டும்","moduleFinish":"இந்த பணியை முடித்துவிட்டீர்கள்","moduleProgress":"பணி முன்னேற்றம்","mytrainings":"எனது பணிகள்","nextModule":"அடுத்த பணி","oneCourse":"பணி","prevModule":"முந்தைய. பணி","returnToCourses":"பின்","sectionTitle":"பணிகள்","selectChapter":"பணியைத் தேர்ந்தெடுக்கவும்","selectContentFromCourse":"உள்ளடக்கங்களைத் தேர்ந்தெடுக்கவும்","trainingAttended":"கற்றல் கலந்து கொண்டது","courseDontContainCertificate":"தற்போது, இந்த கற்றல் பணிக்கு சான்றிதழ் இல்லை. பணியை உருவாக்கியவர் பின்னர் ஒரு சான்றிதழை இணைக்கலாம்."},"tab":{"courses":"பணிகள்"}},"messages":{"dashboard":{"emsg":{"m002":"இந்த கற்றல் பணிக்காக பயனர் எந்த தொகுப்பிலும் சேரவில்லை"}},"emsg":{"m0002":"இந்த கற்றல் பணி இனி கிடைக்காது","m0003":"இந்த கற்றல் பணிக்கு திறந்த தொகுதி இல்லை"},"fmsg":{"dataSettingNotSubmitted":"சுயவிவரப் பகிர்வு அமைப்புகளைப் புதுப்பிக்க முடியவில்லை. பின்னர் மீண்டும் முயற்சிக்கவும்","m0001":"மன்னிக்கவும்! நீங்கள் பதிவுசெய்த கற்றல் பணிக்கான தகவல்களை நாங்கள் பெற முடியவில்லை. பின்னர் மீண்டும் முயற்சிக்கவும்","m0002":"மன்னிக்கவும்! உங்களுக்காக பிற கற்றல் பணிகளை எங்களால் பெற முடியவில்லை. பின்னர் மீண்டும் முயற்சிக்கவும்","m0086":"இந்த உள்ளடக்கம் இனி கிடைக்காது"},"imsg":{"m0001":"இந்த உள்ளடக்கம் பொருத்தமற்றது என கொடியிடப்பட்டுள்ளது. இது தற்போது மதிப்பாய்வில் உள்ளது","m0026":"வணக்கம், இந்த உள்ளடக்கம் தற்போது கிடைக்கவில்லை. இது மாற்றத்திற்கு உள்ளாகலாம்"},"stmsg":{"m0125":"உள்ளடக்கத்தை உருவாக்க அல்லது பதிவேற்றத் தொடங்குங்கள். தற்போது நீங்கள் எந்த உள்ளடக்கத்தையும் சேமிக்கவில்லை"}}}},"crs":{"nontrk":{"frmelmnts":{"lbl":{"ActivityTextbooks":"பாடநெறிகள்","ACTIVITY_TEXTBOOK_TITLE":"பாடநெறிகள்","chapter":"பாடநெறி மாடுயூல்","desktop":{"downloadBook":"பாடநெறிகளை பதிவிறக்க","find_more":"{instance} இல் கூடுதல் பாடநெறிகள் மற்றும் தொடர்புடைய உள்ளடக்கத்தைக் கண்டறியவும்","updateTextbook":"பாடநெறியை புதுப்பிக்கவும்"},"downloadBooks":"ஆஃப்லைனில் இருக்கும்போது அணுக படிப்புகளைப் பதிவிறக்கவும்","fromTheTextBook":"பாடநெறியிலிருந்து","noBookfoundTitle":"வாரியம் படிப்புகளைச் சேர்க்கிறது","textbooks":"பாடநெறிகள்"}}},"trk":{"completedCourse":"பாடநெறிகள் வெற்றிகரமாக முடித்துவிட்டீர்கள்","frmelmnts":{"btn":{"createCourse":"பாடநெறி உருவாக்குங்கள்","enroll":"பாடநெறியில் இணையுங்கள்","resumecourse":"பாடநெறியை தொடரு","unenroll":"பாடநெறியில் இருந்து விலகு","viewcoursestats":"பாடநெறியின் புள்ளிவிவரங்களை காண","viewCourseStatsDashboard":"டாஷ்போர்டைக் காண்க"},"instn":{"t0062":"இந்த பாடநெறிக்கான தொகுப்பை நீங்கள் இன்னும் உருவாக்கவில்லை. புதிய தொகுப்பை உருவாக்கியப் பின்னர் DASHBOARD (டாஷ்போர்ட்) ஐ மீண்டும் சரிபார்க்கவும்","t0063":"நீங்கள் இதுவரை எந்த பாடநெறியையும் உருவாக்கவில்லை. புதிய பாடநெறியை உருவாக்கியபின் dashboard (தாஷ்போர்ட்) ஐ பார்க்கவும்"},"lbl":{"accessCourse":"பாடநெறியை அணுக","accessToLogin":"பாடநெறிகளை அணுக நீங்கள் உள்நுழைந்து பாடநெறியில் சேர வேண்டும்","ActivityCourses":"பாடநெறிகள்","ACTIVITY_COURSE_TITLE":"பாடநெறிகள்","addCourse":"பாடநெறியை சேர்க்கவும்","completedCourse":"பாடநெறிகள் முடிவடைந்தது","completingCourseSuccessfully":"பயிற்சியை வெற்றிகரமாக முடிக்க","copyAsCourse":"பாடநெறிகளாக நகலெடுக்கவும்","courseContainCertificate":"இது ஒரு சான்றிதழ் பெறக்கூடிய பாடநெறியாகும்","courseDetails":"பாடநெறியின் விவரங்கள்","courseDontContainCertificate":"தற்போது, இந்த பாடநெறிக்கு சான்றிதழ் இல்லை. பாடநெறி உருவாக்கியவர் பின்னர் ஒரு சான்றிதழை இணைக்கலாம்.","courseLastUpdatedOn":"கடைசியாக புதுப்பிக்கப்பட்டது நாள்","courseProgress":"பாடநெறியில் உங்கள் முன்னேற்றம்","courseRelevantFor":"பாடநெறி இதற்கு பொருத்தமானது:","courses":"பாடநெறிகள்","coursestructure":"பாடநெறி மாடியுள்கள்","courseSuccessMessage":"இந்த பாடநெறியை வெற்றிகரமாக முடித்துவிட்டீர்கள்","courseSuccessNotificationMessage":"உங்கள் பதிவு செய்யப்பட்ட தொடர்பு விவரங்களில் 7 நாட்களுக்குள் பாட சான்றிதழ் குறித்து உங்களுக்கு அறிவிக்கப்படும்","courseWithoutCertificateNote":"குறிப்பு: இந்த பாடநெறிக்கு சான்றிதழ் இல்லை","dashboardnocourseselected":"எந்த பாடநெறியும் தேர்வுசெய்யப்படவில்லை","dashboardnocourseselecteddesc":"மேற்கண்ட பட்டியலில் இருந்து பாடநெறியை தேர்வு செய்யவும்","downloadCourseQRCode":"பாடநெறி QR குறியீட்டைப் பதிவிறக்கவும்","downloadQRCode":{"tooltip":"QR குறியீடுகளைப் பதிவிறக்க கிளிக் செய்து அவற்றை வெளியிடப்பட்ட பாடத்திட்டத்துடன் இணைக்கவும்"},"enrollcourse":"பாடநெறியில் இணை","getUnlimitedAccess":"உங்கள் கைப்பேசியில் பாடப்புத்தகங்கள், பாடங்கள் மற்றும் பயிற்சிகள் ஆகியவற்றை ஆஃப்லைனில் வரம்பற்று அணுகுங்கள்.","joinTrainingToAcessContent":"உள்ளடக்கத்திற்கான முழுமையான அணுகலைப் பெற நீங்கள் பாடநெறியில் சேரவேண்டும்.","moduleFinish":"இந்த அத்தியாயத்தை முடித்துவிட்டீர்கள்","moduleProgress":"மாடுயூல் முன்னேற்றம்","mytrainings":"என் பாடநெறிகள்","nextModule":"அடுத்த மாடுயூல்","oneCourse":"பாடநெறி","prevModule":"முந்தைய மாடுயூல்","returnToCourses":"பாடநெறிகளுக்குத் திரும்பு","sectionTitle":"பாடநெறிகள்","selectChapter":"மாடுயூலை தேர்ந்தெடுக்கவும்","selectContentFromCourse":"பாடநெறிக்கான உள்ளடக்கங்களைத் தேர்ந்தெடுக்கவும்","signinenrollTitle":"இந்த பாடநெறிக்குத் தங்களை பதிவுசெய்துக்கொள்ள உள்நுழையவும்","trainingAttended":"பங்குபெற்ற பாடநெறிகள்","userName":"பயனர் பெயர்"},"tab":{"courses":"பாடநெறிகள்"}},"messages":{"dashboard":{"emsg":{"m002":"இந்த பாடநெறியின் எந்த தொகுப்பிலும் பயனர் தன்னை பதிவு செய்யுதுக்கொள்ளவில்லை"}},"emsg":{"m0002":"பாடநெறி இனி இல்லை","m0003":"இந்த பாடநெறியில் தொகுதிகள் எதுவும் இல்லை"},"fmsg":{"m0001":"பதிவுசெய்யப்பட்ட பாடநெறிகளை பெறமுடியவில்லை, தயவுசெய்து பின்னர் முயற்சிக்கவும்","m0002":"மற்ற பாடநெறிகளை பெறமுடியவில்லை , தயவுசெய்து பின்னர் முயற்சிக்கவும்","m0082":"இந்த பாடநெறி சேர்க்கைக்கு திறக்கப்படவில்லை","m0086":"ஆசிரியரால் நீக்கப்பட்ட இந்த பாடநெறி இனி கிடைக்காது"},"imsg":{"m0001":"இந்த பாடநெறி பொருத்தமற்றதாக குறியிடப்பட்டு தற்போது மறு ஆய்வு செய்யப்படுகிறது. தயவு செய்து பின்னர் முயற்சிக்கவும்","m0026":"வணக்கம், இப்பொழுது இந்தப் பாடநெறி கிடைக்கவில்லை. படைப்பாளர் இந்த பாடநெறியில் சில மாற்றங்களை செய்துள்ளார் என காணப்படுகிறது."},"stmsg":{"m0125":"வளம், புத்தகம், பாடம், சேகரிப்பு அல்லது பதிவேற்றத்தை உருவாக்க தொடங்கவும். தற்போது வேலைக்கு முன்னேற்ற வரைவு எதுவும் இல்லை"}}}},"tbk":{"nontrk":{"frmelmnts":{"lbl":{"ActivityTextbooks":"பாடப்புத்தகங்கள்","ACTIVITY_TEXTBOOK_TITLE":"பாடப்புத்தகங்கள்","chapter":"அத்தியாயம்","copyAsCourse":"பாடநெறிகளை நகலெடு","desktop":{"deleteCollection":"{name} பாடப்புத்தகத்தை நீக்குவது எனது பதிவிறக்கங்களிலிருந்து அதை நீக்குகிறது. தொடர நீக்கு என்பதைக் கிளிக் செய்க.","downloadBook":"பாடப்புத்தகத்தை பதிவிறக்கவும்","find_more":"மேலும் பாடபுத்தகங்கள் மற்றும் உள்ளடக்கங்களை {instance} வில் பெறுங்கள்","updateTextbook":"பாடப்புத்தகத்தை புதுப்பிக்கவும்"},"dialCodeDescription":"QR குறியீடு என்பது உங்கள் பாடப்புத்தகத்தில் QR குறீயீட்டின் கீழ் காணப்படும் 6 இலக்க எண்ணெழுத்து குறியீடாகும் .","dialCodeDescriptionGetPage":"QR குறியீடு என்பது உங்கள் பாடப்புத்தகத்தில் QR குறீயீட்டின் கீழ் காணப்படும் 6 இலக்க எண்ணெழுத்து குறியீடாகும்.","downloadBooks":"ஆஃப்லைனில் இருக்கும்போது அணுக புத்தகங்களைப் பதிவிறக்கவும்","fromTheTextBook":"பாடப்புத்தகத்தில் இருந்து","getUnlimitedAccess":"உங்கள் கைப்பேசியில் பாடப்புத்தங்கள், பாடங்கள் மற்றும் பயிற்சிகள் ஆகியவற்றை ஆஃப்லைனில் வரம்பற்று அணுகுங்கள்.","import":"ஆஃப்லைனில் இருக்கும்போது அணுக புத்தகங்களைப் பதிவிறக்கவும்","installAppDesc":"பாடங்கள், பாடப்புத்தகங்கள் மற்றும் உள்ளடக்கத்தை ஆஃப்லைனில் உங்கள் சாதனத்தில் சேமிக்கவும்","mynotebook":"எனது குறிப்பேடு","noBookfoundButtonText":"மேலும் புத்தகங்கள் மட்டும் உள்ளடக்கத்தைப் பாருங்கள்","noBookfoundSubTitle":"உங்களது கல்வி வாரியம் இன்னும் அதிக புத்தகங்களை இணைக்கவுள்ளது. மேலும் புத்தகங்கள் மட்டும் பாடங்களை {instance}இல் காண, இந்த பொத்தானை அழுத்தவும்.","noBookfoundTitle":"கல்வி வாரியம் மேலும் புத்தகங்களை இணையக்க உள்ளது.","textbooks":"பாடப்புத்தகங்கள்"}},"messages":{"stmsg":{"m0125":"வளம், புத்தகம், பாடம், சேகரிப்பு அல்லது பதிவேற்றத்தை உருவாக்க தொடங்கவும். தற்போது வேலைக்கு முன்னேற்ற வரைவு எதுவும் இல்லை"}}},"trk":{"frmelmnts":{"btn":{"enroll":"படி","resumecourse":"வாசிப்பை மீண்டும் தொடங்குங்கள்","unenroll":"மூடு"},"instn":{"t0062":"இந்த பாடப்புத்தகத்திற்கான கற்றல் / வாசிப்பு தொகுதியை நீங்கள் இதுவரை உருவாக்கவில்லை. ஒரு தொகுதியை உருவாக்கி டாஷ்போர்டை சரிபார்க்கவும்","t0063":"நீங்கள் இதுவரை எந்த பாடப்புத்தகத்தையும் உருவாக்கவில்லை. ஒரு பாடப்புத்தகத்தை உருவாக்கி டாஷ்போர்டை சரிபார்க்கவும்"},"lbl":{"accessCourse":"பாடப்புத்தகத்தை அணுகவும்","accessToLogin":"பாடப்புத்தகத்தை அணுக நீங்கள் உள்நுழைந்து கற்றல் / வாசிப்பு தொகுப்பில் சேர வேண்டும்","ActivityCourses":"பாடப்புத்தகம்","ACTIVITY_COURSE_TITLE":"பாடப்புத்தகம்","addCourse":"பாடப்புத்தகத்தைச் சேர்க்கவும்","completedCourse":"பாடப்புத்தகங்கள் நிறைவு","completingCourseSuccessfully":"கற்றலை வெற்றிகரமாக முடிக்க,","copyAsCourse":"பாடப்புத்தகமாக நகலெடுக்கவும்","courseDetails":"பாடப்புத்தக விவரங்கள்","courses":"பாடப்புத்தகங்கள்","coursestructure":"அத்தியாயம்","joinTrainingToAcessContent":"உள்ளடக்கத்தை அணுக, நீங்கள் கற்றல் தொகுப்பில் சேர வேண்டும்","moduleFinish":"இந்த அத்தியாயத்தை முடித்துவிட்டீர்கள்","moduleProgress":"அத்தியாயம் முன்னேற்றம்","mytrainings":"எனது டிஜிட்டல் பாடப்புத்தகங்கள்","nextModule":"அடுத்த அத்தியாயம்","oneCourse":"டிஜிட்டல் பாடப்புத்தகம்","prevModule":"முந்தைய. அத்தியாயம்","sectionTitle":"டிஜிட்டல் பாடப்புத்தகம்","selectChapter":"அத்தியாயத்தைத் தேர்ந்தெடுக்கவும்","trainingAttended":"படித்த பாடப்புத்தகங்கள்","courseContainCertificate":"இந்த கற்றல் உங்களுக்கு ஒரு சான்றிதழை வழங்குகிறது","courseDontContainCertificate":"தற்போது, இந்த கற்றல் பணிக்கு சான்றிதழ் இல்லை. பணியை உருவாக்கியவர் பின்னர் ஒரு சான்றிதழை இணைக்கலாம்."},"tab":{"courses":"டிஜிட்டல் பாடப்புத்தகம்"}},"messages":{"emsg":{"m0002":"இந்த பாடப்புத்தகம் இனி கிடைக்காது"},"fmsg":{"dataSettingNotSubmitted":"சுயவிவரப் பகிர்வு அமைப்புகளைப் புதுப்பிக்க முடியவில்லை. பின்னர் மீண்டும் முயற்சிக்கவும்","m0001":"மன்னிக்கவும்! நீங்கள் தேடும் பாடப்புத்தகத்தை எங்களால் பெற முடியவில்லை. பின்னர் மீண்டும் முயற்சிக்கவும்","m0002":"மன்னிக்கவும்! உங்களுக்காக பிற பாடப்புத்தகங்களை எங்களால் பெற முடியவில்லை. பின்னர் மீண்டும் முயற்சிக்கவும்","m0086":"இந்த பாடப்புத்தகம் இனி கிடைக்காது"}}}},"tvc":{"nontrk":{"frmelmnts":{"lbl":{"ActivityTvClasses":"தொலைக்காட்சி வகுப்புகள்","ACTIVITY_TEXTBOOK_TITLE":"டிவி வகுப்புகள்","ACTIVITY_TV_CLASS_TITLE":"தொலைக்காட்சி வகுப்புகள்","chapter":"டிவி நிகழ்ச்சி","collection_tv_classes":"டிவி வகுப்புகள்","desktop":{"downloadBook":"டிவி வகுப்புகளைப் பதிவிறக்குக","downloadTVclasses":"தொலைக்காட்சிவகுப்புகளைப் பதிவிறக்குக","find_more":"{instance} ல் மேலும் தொலைக்காட்சி வகுப்புகள் மற்றும் தொடர்புடைய உள்ளடக்கத்தைக் கண்டறியவும்","find_more_TVclasses":"{instance} இல் மேலும் தொலைக்காட்சி வகுப்புகள் மற்றும் தொடர்புடைய உள்ளடக்கத்தைக் கண்டறியவும்","updateTextbook":"டிவி வகுப்புகளைப் புதுப்பிக்கவும்","updateTVclasses":"தொலைக்காட்சி வகுப்புகளைப் புதுப்பிக்கவும்"},"downloadBooks":"ஆஃப்லைனில் இருக்கும்போது அணுக டிவி வகுப்புகளைப் பதிவிறக்குக","downloadTVclasses":"ஆஃப்லைனில் இருக்கும்போது அணுக தொலைக்காட்சி வகுப்புகளைப் பதிவிறக்குக","fromTheTextBook":"டிவி வகுப்பிலிருந்து","fromTheTVclasses":"தொலைக்காட்சி வகுப்பிலிருந்து","noBookfoundTitle":"உங்கள் வாரியம் டிவி வகுப்பை சேர்க்கிறது","textbooks":"டிவி வகுப்புகள்","TVclassesfoundTitle":"போர்டு தொலைக்காட்சிவகுப்பைச் சேர்க்கிறது","tv_classes":"தொலைக்காட்சி வகுப்புகள்","tv_program":"தொலைக்காட்சி நிகழ்ச்சி"}}},"trk":{"frmelmnts":{"btn":{"enroll":"பாருங்கள்","resumecourse":"பார்ப்பதை மீண்டும் தொடங்குங்கள்"},"instn":{"t0062":"இந்த தொலைக்காட்சி வகுப்பிற்காக நீங்கள் இதுவரை எந்த கற்றல் தொகுதியையும் உருவாக்கவில்லை. ஒரு தொகுதியை உருவாக்கி டாஷ்போர்டை சரிபார்க்கவும்","t0063":"நீங்கள் இதுவரை எந்த டிவி வகுப்பையும் உருவாக்கவில்லை.டிவி வகுப்பை உருவாக்கி டாஷ்போர்டை சரிபார்க்கவும்"},"lbl":{"accessCourse":"டிவி வகுப்புகளை அணுகவும்","accessToLogin":"டிவி வகுப்பை அணுக நீங்கள் உள்நுழைந்து கற்றல் தொகுப்பில் சேர வேண்டும்","ActivityCourses":"டிவி வகுப்புகள்","ACTIVITY_COURSE_TITLE":"டிவி வகுப்புகள்","addCourse":"டிவி வகுப்பைச் சேர்க்கவும்","completedCourse":"டிவி வகுப்புகள் முடிவடைந்தது","copyAsCourse":"டிவி வகுப்பாக நகலெடுக்கவும்","courseContainCertificate":"இந்த கற்றல் உங்களுக்கு ஒரு சான்றிதழை வழங்குகிறது","courseDetails":"டிவி வகுப்பு விவரங்கள்","courses":"டிவி வகுப்புகள்","coursestructure":"தொலைக்காட்சி நிகழ்ச்சி","moduleFinish":"இந்த திட்டத்தை முடித்துவிட்டீர்கள்","moduleProgress":"நிரல் முன்னேற்றம்","mytrainings":"எனது தொலைக்காட்சி வகுப்புகள்","nextModule":"அடுத்த நிரல்","oneCourse":"டிவி வகுப்பு","prevModule":"முந்தைய நிரல்","sectionTitle":"தொலைக்காட்சி வகுப்புகள்","selectChapter":"நிரலைத் தேர்ந்தெடுக்கவும்","trainingAttended":"பார்த்த டிவி வகுப்புகள்","courseDontContainCertificate":"தற்போது, இந்த கற்றல் பணிக்கு சான்றிதழ் இல்லை. பணியை உருவாக்கியவர் பின்னர் ஒரு சான்றிதழை இணைக்கலாம்."},"tab":{"courses":"தொலைக்காட்சி வகுப்புகள்"}},"messages":{"emsg":{"m0002":"இந்த டிவி வகுப்பு பணி இனி கிடைக்காது"},"fmsg":{"m0001":"மன்னிக்கவும்! நீங்கள் தேடும் டிவி எங்களால் பெற முடியவில்லை. பின்னர் மீண்டும் முயற்சிக்கவும்","m0002":"மன்னிக்கவும்! உங்களுக்காக பிற டிவி வகுப்புகளை எங்களால் பெற முடியவில்லை. பின்னர் மீண்டும் முயற்சிக்கவும்","m0086":"இந்த டிவி வகுப்பு இனி கிடைக்காது"}}}}}
\ No newline at end of file
diff --git a/utils/portal/labels/all_labels_te.json b/utils/portal/labels/all_labels_te.json
new file mode 100644
index 000000000..598dc8892
--- /dev/null
+++ b/utils/portal/labels/all_labels_te.json
@@ -0,0 +1 @@
+{"dflt":{"nontrk":{"frmelmnts":{"btn":{"create":"సృష్టించండి"},"lbl":{"ActivityTextbooks":"పనులు","ACTIVITY_TEXTBOOK_TITLE":"పనులు","chapter":"మాడ్యూల్ నేర్చుకోవడం","collection_task":"పనులు","desktop":{"download":"డౌన్లోడ్","downloadBook":"డౌన్లోడ్","find_more":"మరింత కంటెంట్ను కనుగొనండి","find_more_tasks":"మరింత కంటెంట్ను కనుగొనండి","update":"నవీకరణ","updateTextbook":"నవీకరణ"},"downloadBooks":"ఆఫ్లైన్లో ప్రాప్యత చేయడానికి డౌన్లోడ్ చేయండి","downloadoffline":"ఆఫ్లైన్లో ప్రాప్యత చేయడానికి డౌన్లోడ్ చేయండి","download_to_access_offline":"ఆఫ్లైన్లో ప్రాప్యత చేయడానికి డౌన్లోడ్ చేయండి","fromTheLearningTask":"అభ్యాస పని నుండి","fromTheTextBook":"అభ్యాస పని నుండి","import":"ఆఫ్లైన్లో ప్రాప్యత చేయడానికి డౌన్లోడ్ చేయండి","learningmodule":"మాడ్యూల్ నేర్చుకోవడం","mynotebook":"నా నోట్బుక్","noBookfoundButtonText":"ఇంకా చూడు","noBookfoundSubTitle":"మీ బోర్డు ఇంకా కంటెంట్ను జోడించలేదు. మరింత కంటెంట్ చూడటానికి {instance} బటన్ నొక్కండి","noBookfoundTitle":"బోర్డు కంటెంట్ను జోడిస్తోంది","noTaskfoundSubTitle":"మీ బోర్డు ఇంకా కంటెంట్ను జోడించలేదు. మరింత కంటెంట్ చూడటానికి {instance} బటన్ నొక్కండి","noTaskfoundTitle":"బోర్డు కంటెంట్ను జోడిస్తోంది","seemore":"ఇంకా చూడు","task":"పనులు","tasks":"పనులు","task_title":"పనులు","textbooks":"పనులు"}},"messages":{"stmsg":{"m0125":"కంటెంట్ను సృష్టించడం లేదా అప్లోడ్ చేయడం ప్రారంభించండి. మీకు ప్రస్తుతం డ్రాఫ్ట్ వలె సేవ్ చేయబడిన కంటెంట్ లేదు","ms0001":"కంటెంట్ను సృష్టించడం లేదా అప్లోడ్ చేయడం ప్రారంభించండి. మీకు ప్రస్తుతం డ్రాఫ్ట్ వలె సేవ్ చేయబడిన కంటెంట్ లేదు"}}},"trk":{"completed_learning":"అభ్యాసం పూర్తయింది","essages":{"fmsg":{"m0082":"ఈ అభ్యాస పని ఇంకా తెరవలేదు. మీరు అందులో చేరలేరు"}},"frmelmnts":{"btn":{"create":"సృష్టించండి","enroll":"చేరండి","resumecourse":"పునఃప్రారంభం","unenroll":"వదిలివేయండి","viewcoursestats":"గణాంకాలను చూడండి","viewCourseStatsDashboard":"డాష్బోర్డ్ను చూడండి"},"instn":{"t0062":"ఈ పని కోసం మీరు ఇంకా ఏ బ్యాచ్ను సృష్టించలేదు. ఒక పనిని సృష్టించండి మరియు డాష్బోర్డ్ను తనిఖీ చేయండి","t0063":"మీరు ఇంకా ఏ పనిని సృష్టించలేదు. క్రొత్త పనిని సృష్టించండి మరియు డాష్బోర్డ్ను మళ్లీ తనిఖీ చేయండి."},"lbl":{"accessCourse":"అభ్యాస సామగ్రిని యాక్సెస్ చేయండి","accessToLogin":"కంటెంట్ను యాక్సెస్ చేయడానికి మీరు లాగిన్ అయి పనిలో చేరాలి","ActivityCourses":"పనులు","ACTIVITY_COURSE_TITLE":"పనులు","addCourse":"జోడించు","completedCourse":"పూర్తి చేసిన పనులు","completingCourseSuccessfully":"నేర్చుకోవడం విజయవంతంగా పూర్తి చేయడానికి,","copyAsCourse":"అభ్యాస సామగ్రిగా కాపీ చేయండి","courseContainCertificate":"ఈ అభ్యాసం మీకు ధృవీకరణ పత్రాన్ని అందిస్తుంది","courseDetails":"వివరాలు నేర్చుకోవడం","courseProgress":"పురోగతి","courseRelevantFor":"ఈ అభ్యాసం వీటికి సంబంధించినది:","courses":"పనులు","coursestructure":"మాడ్యూల్ నేర్చుకోవడం","courseSuccessMessage":"మీరు మీ అభ్యాసాన్ని విజయవంతంగా పూర్తి చేసారు","courseSuccessNotificationMessage":"మీ రిజిస్టర్డ్ సంప్రదింపు వివరాలపై మీ సర్టిఫికేట్ గురించి 7 రోజుల్లో మీకు తెలియజేయబడుతుంది","courseWithoutCertificateNote":"గమనిక: ఈ అభ్యాసం మీకు సర్టిఫికేట్ ఇవ్వదు","dashboardnocourseselected":"ఎంపిక చేయలేదు","dashboardnocourseselecteddesc":"జాబితా నుండి ఎంచుకోండి","downloadCourseQRCode":"QR కోడ్ను డౌన్లోడ్ చేయండి","downloadQRCode":{"tooltip":"QR కోడ్లను డౌన్లోడ్ చేయడానికి క్లిక్ చేసి, వాటిని మీ ప్రచురణకు లింక్ చేయండి"},"getUnlimitedAccess":"మీ మొబైల్ ఫోన్లో పాఠ్యపుస్తకాలు, టీవీ తరగతులు మరియు కోర్సులకు ఆఫ్లైన్లో అపరిమిత ప్రాప్యతను పొందండి","joinTrainingToAcessContent":"కంటెంట్ను ప్రాప్యత చేయడానికి, మీరు లాగిన్ అయి పనిలో చేరాలి","moduleFinish":"మీరు ఈ పనిని పూర్తి చేసారు","moduleProgress":"పని పురోగతి","mytrainings":"నా పనులు","nextModule":"తదుపరి పని","oneCourse":"పని","prevModule":"మునుపటి. పని","returnToCourses":"తిరిగి","sectionTitle":"పనులు","selectChapter":"విధిని ఎంచుకోండి","selectContentFromCourse":"విషయాలను ఎంచుకోండి","trainingAttended":"నేర్చుకోవడం హాజరయ్యారు","courseDontContainCertificate":"ప్రస్తుతం, ఈ అభ్యాస పనికి సర్టిఫికేట్ లేదు. విధి సృష్టికర్త తరువాత ప్రమాణపత్రాన్ని అటాచ్ చేయవచ్చు"},"tab":{"courses":"పనులు"}},"messages":{"dashboard":{"emsg":{"m002":"ఈ అభ్యాస పని కోసం వినియోగదారు ఏ బ్యాచ్లోనూ చేరలేదు"}},"emsg":{"m0002":"ఈ అభ్యాస పని ఇకపై అందుబాటులో లేదు","m0003":"ఈ అభ్యాస పనికి ఓపెన్ బ్యాచ్ లేదు"},"fmsg":{"dataSettingNotSubmitted":"ప్రొఫైల్ వాటా సెట్టింగ్లను నవీకరించడం సాధ్యం కాలేదు. తరువాత మళ్ళీ ప్రయత్నించండి","m0001":"క్షమించండి! మీరు నమోదు చేసిన అభ్యాస పని కోసం మేము సమాచారాన్ని పొందుతాము. తరువాత మళ్ళీ ప్రయత్నించండి","m0002":"క్షమించండి! మేము మీ కోసం ఇతర అభ్యాస పనులను పొందలేకపోయాము. తరువాత మళ్ళీ ప్రయత్నించండి","m0086":"ఈ కంటెంట్ ఇకపై అందుబాటులో లేదు"},"imsg":{"m0001":"ఈ కంటెంట్ అనుచితమైనదిగా ఫ్లాగ్ చేయబడింది. ఇది ప్రస్తుతం సమీక్షలో ఉంది","m0026":"హాయ్, ఈ కంటెంట్ ప్రస్తుతం అందుబాటులో లేదు. ఇది మార్పుకు లోనవుతుంది"},"stmsg":{"m0125":"కంటెంట్ను సృష్టించడం లేదా అప్లోడ్ చేయడం ప్రారంభించండి. ప్రస్తుతం మీరు డ్రాఫ్ట్ కంటెంట్ను సేవ్ చేయలేదు"}}}},"crs":{"nontrk":{"frmelmnts":{"lbl":{"ActivityTextbooks":"కోర్సులు","ACTIVITY_TEXTBOOK_TITLE":"కోర్సులు","chapter":"కోర్సు మాడ్యూల్","desktop":{"downloadBook":"కోర్సును డౌన్లోడ్ చేయండి","find_more":"మరిన్ని కోర్సులు మరియు సంబంధిత కంటెంట్ను కనుగొనండి{instance}","updateTextbook":"కోర్సును నవీకరించండి"},"downloadBooks":"ఆఫ్లైన్లో ఉన్నప్పుడు ప్రాప్యత చేయడానికి కోర్సులను డౌన్లోడ్ చేయండి","fromTheTextBook":"కోర్సు నుండి","noBookfoundTitle":"బోర్డు కోర్సులను జోడిస్తోంది","textbooks":"కోర్సులు"}}},"trk":{"completedCourse":"కోర్సు ముగిసింది","frmelmnts":{"btn":{"createCourse":"కోర్సును సృష్టించండి","enroll":"నమోదుచేయి","resumecourse":"కోర్సు కొనసాగించండి","unenroll":"శిక్షణను వదిలివేయండి","viewcoursestats":"కోర్సు గణాంకాలను వీక్షించండి","viewCourseStatsDashboard":"శిక్షణ డాష్బోర్డ్ను చూడండి"},"instn":{"t0062":"మీరు ఇంకా ఈ కోర్సు కోసం బ్యాచ్ని సృష్టించలేదు. క్రొత్త బ్యాచ్ని సృష్టించండి మరియు మళ్లీ డాష్బోర్డ్ను తనిఖీ చేయండి.","t0063":"మీరు ఇంకా ఏ కోర్సును సృష్టించలేదు. క్రొత్త కోర్సు సృష్టించి, మళ్ళీ డాష్బోర్డ్ను తనిఖీ చేయండి."},"lbl":{"accessCourse":"యాక్సెస్ కోర్సు","accessToLogin":"కోర్సు ప్లేయర్ను ఆక్సెస్ చెయ్యడానికి మీరు లాగిన్ అయి చేరాలి","ActivityCourses":"కోర్సులు","ACTIVITY_COURSE_TITLE":"కోర్సులు","addCourse":"కోర్సును జోడించండి.","completedCourse":"కోర్సు ముగిసింది","completingCourseSuccessfully":"శిక్షణను విజయవంతంగా పూర్తి చేసినందుకు","copyAsCourse":"కోర్సుగా కాపీ చేయండి","courseContainCertificate":"ఈ కోర్సులో సర్టిఫికేట్ ఉంది","courseDetails":"కోర్సు వివరాలు","courseDontContainCertificate":"ప్రస్తుతం, ఈ కోర్సుకు సర్టిఫికేట్ లేదు. కోర్సు సృష్టికర్త తరువాత ప్రమాణపత్రాన్ని అటాచ్ చేయవచ్చు.","courseLastUpdatedOn":"కోర్సు చివరిగా నవీకరించబడింది","courseProgress":"కోర్సు పురోగతి","courseRelevantFor":"కోర్సు సంబంధించినది","courses":"కోర్సులు","coursestructure":"కోర్సు నిర్మాణం","courseSuccessMessage":"మీరు కోర్సును విజయవంతంగా పూర్తి చేసారు","courseSuccessNotificationMessage":"7 రోజుల్లోపు మీ రిజిస్టర్డ్ సంప్రదింపు వివరాలపై కోర్సు సర్టిఫికేట్ గురించి మీకు తెలియజేయబడుతుంది","courseWithoutCertificateNote":"గమనిక: ఈ కోర్సుకు సర్టిఫికేట్ లేదు","dashboardnocourseselected":"ఏ కోర్సు ఎంచుకోలేదు!","dashboardnocourseselecteddesc":"దయచేసి పైన జాబితా నుండి ఒక కోర్సు ఎంచుకోండి","downloadCourseQRCode":"శిక్షణ QR కోడ్ను డౌన్లోడ్ చేయండి","downloadQRCode":{"tooltip":"QR కోడ్లను డౌన్లోడ్ చేయడానికి క్లిక్ చేసి, వాటిని ప్రచురించిన శిక్షణకు లింక్ చేయండి"},"enrollcourse":"కోర్సు నమోదు చేయండి","getUnlimitedAccess":"మీ మొబైల్ ఫోన్లో పాఠ్యపుస్తకాలు, పాఠాలు మరియు శిక్షణలకు ఆఫ్లైన్లో అపరిమిత ప్రాప్యతను పొందండి.","joinTrainingToAcessContent":"కంటెంట్కు పూర్తి ప్రాప్యత పొందడానికి మీరు తప్పనిసరిగా కోర్సులో చేరాలి","moduleFinish":"మీరు ఈ మాడ్యూల్ పూర్తి చేసారు","moduleProgress":"మాడ్యూల్ పురోగతి","mytrainings":"నా శిక్షణలు","nextModule":"తదుపరి మాడ్యూల్","oneCourse":"కోర్సు","prevModule":"మునుపటి. మాడ్యూల్","returnToCourses":"శిక్షణలకు తిరిగి వెళ్ళు","sectionTitle":"కోర్సులు","selectChapter":"మాడ్యూల్ ఎంచుకోండి","selectContentFromCourse":"కోర్సు కోసం విషయాలను ఎంచుకోండి","signinenrollTitle":"ఈ కోర్సు కోసం నమోదు చేయడానికి సైన్ ఇన్ చేయండి:","trainingAttended":"శిక్షణలు హాజరయ్యాయి","userName":"వినియోగదారు పేరు"},"tab":{"courses":"కోర్సులు"}},"messages":{"dashboard":{"emsg":{"m002":"ఈ కోర్సు యొక్క ఏ బ్యాచ్లలోనూ వినియోగదారు నమోదు చేయబడలేదు"}},"emsg":{"m0002":"కోర్సు ఇక లేదు","m0003":"ఈ కోర్సులో ఓపెన్ బ్యాచ్లు లేవు"},"fmsg":{"m0001":"పొందుపర్చిన కోర్సులు విఫలమయ్యాయి, దయచేసి తర్వాత మళ్లీ ప్రయత్నించండి","m0002":"ఇతర కోర్సులు పొందడంలో విఫలమైంది, దయచేసి తర్వాత మళ్లీ ప్రయత్నించండి ...","m0082":"నమోదు కోసం ఈ కోర్సు తెరవబడలేదు","m0086":"ఈ కోర్సు రచయితచే రిటైర్ చేయబడింది, అందుకే ఇక అందుబాటులో లేదు."},"imsg":{"m0001":"ఈ కోర్సు తగనిదిగా ఫ్లాగ్ చేయబడింది మరియు ప్రస్తుతం సమీక్షలో ఉంది. దయచేసి తర్వాత మళ్లీ తనిఖీ చేయండి.","m0026":"హాయ్, ఈ కోర్సు ఇప్పుడు అందుబాటులో లేదు. ఇది సృష్టికర్త కొన్ని మార్పులను కోర్సులో చేసింది."},"stmsg":{"m0125":"రిసోర్స్, బుక్, కోర్సు, కలెక్షన్ లేదా అప్లోడ్ సృష్టించడం ప్రారంభించండి. ప్రస్తుతానికి మీ వద్ద పని-లో-పురోగతి డ్రాఫ్ట్ లేదు"}}}},"tbk":{"nontrk":{"frmelmnts":{"lbl":{"ActivityTextbooks":"పాఠ్య పుస్తకాలు","ACTIVITY_TEXTBOOK_TITLE":"పాఠ్యపుస్తకాలు","chapter":"అధ్యాయం","copyAsCourse":"కోర్సుగా కాపీ చేయండి","desktop":{"deleteCollection":"{Name} పాఠ్యపుస్తకాన్ని తొలగించడం నా డౌన్లోడ్ల నుండి తీసివేస్తుంది. కొనసాగించడానికి తొలగించు క్లిక్ చేయండి.","downloadBook":"పాఠ్యపుస్తకాన్ని డౌన్లోడ్ చేయండి","find_more":"మరిన్ని పాఠ్యపుస్తకాలు మరియు కంటెంట్ను {instance}లో కనుగొనండి","updateTextbook":"పాఠ్యపుస్తకాన్ని నవీకరించండి"},"dialCodeDescription":"QR కోడ్ మీ టెక్స్ట్ బుక్లోని QR కోడ్ ఇమేజ్ క్రింద కనిపించే 6 అంకెల ఆల్ఫాన్యూమరిక్ కోడ్","dialCodeDescriptionGetPage":"QR కోడ్ మీ టెక్స్ట్ బుక్లోని QR కోడ్ ఇమేజ్ క్రింద కనిపించే 6 అంకెల ఆల్ఫాన్యూమరిక్ కోడ్.","downloadBooks":"ఆఫ్లైన్లో ఉన్నప్పుడు ప్రాప్యత చేయడానికి పుస్తకాలను డౌన్లోడ్ చేయండి","fromTheTextBook":"పాఠ్య పుస్తకం నుండి","getUnlimitedAccess":"మీ మొబైల్ ఫోన్లో పాఠ్యపుస్తకాలు, పాఠాలు మరియు కోర్సులకు ఆఫ్లైన్లో అపరిమిత ప్రాప్యతను పొందండి","import":"ఆఫ్లైన్లో ఉన్నప్పుడు ప్రాప్యత చేయడానికి పుస్తకాలను డౌన్లోడ్ చేయండి","installAppDesc":"పాఠాలు, పాఠ్యపుస్తకాలు మరియు కంటెంట్ను ఆఫ్లైన్లో మీ పరికరంలో నిల్వ చేయండి","mynotebook":"నా నోట్బుక్","noBookfoundButtonText":"మరిన్ని పుస్తకాలు మరియు విషయాలను చూడండి","noBookfoundSubTitle":"మీ బోర్డు ఇంకా ఎక్కువ పుస్తకాలను జోడించలేదు. మరిన్ని పుస్తకాలు మరియు కంటెంట్ చూడటానికి {instance} బటన్ నొక్కండి","noBookfoundTitle":"బోర్డు పుస్తకాలను జోడిస్తోంది","textbooks":"పాఠ్యపుస్తకాలు"}},"messages":{"stmsg":{"m0125":"వనరు, పుస్తకం, కోర్సు, సేకరణ లేదా అప్లోడ్ సృష్టించడం ప్రారంభించండి. ప్రస్తుతానికి మీకు పనిలో పురోగతి డ్రాఫ్ట్ లేదు"}}},"trk":{"frmelmnts":{"btn":{"enroll":"చదవండి","resumecourse":"పఠనాన్ని తిరిగి ప్రారంభించండి","unenroll":"ముగింపు"},"instn":{"t0062":"ఈ పాఠ్య పుస్తకం కోసం మీరు ఇంకా ఎటువంటి అభ్యాస / పఠన బ్యాచ్ను సృష్టించలేదు. ఒక బ్యాచ్ను సృష్టించండి మరియు డాష్బోర్డ్ను తనిఖీ చేయండి","t0063":"మీరు ఇంకా ఏ పాఠ్యపుస్తకాన్ని సృష్టించలేదు. పాఠ్యపుస్తకాన్ని సృష్టించండి మరియు డాష్బోర్డ్ను తనిఖీ చేయండి"},"lbl":{"accessCourse":"పాఠ్యపుస్తకాన్ని యాక్సెస్ చేయండి","accessToLogin":"పాఠ్యపుస్తకాన్ని ఆక్సెస్ చెయ్యడానికి మీరు లాగిన్ అయి లెర్నింగ్ / రీడింగ్ బ్యాచ్లో చేరాలి","ActivityCourses":"పాఠ్య పుస్తకం","ACTIVITY_COURSE_TITLE":"పాఠ్య పుస్తకం","addCourse":"పాఠ్యపుస్తకాన్ని జోడించండి","completedCourse":"పాఠ్యపుస్తకాలు పూర్తయ్యాయి","completingCourseSuccessfully":"నేర్చుకోవడం విజయవంతంగా పూర్తి చేసినందుకు","copyAsCourse":"పాఠ్యపుస్తకంగా కాపీ చేయండి","courseDetails":"పాఠ్యపుస్తక వివరాలు","courses":"పాఠ్యపుస్తకాలు","coursestructure":"అధ్యాయం","joinTrainingToAcessContent":"కంటెంట్ను యాక్సెస్ చేయడానికి, మీరు లెర్నింగ్ బ్యాచ్లో చేరాలి","moduleFinish":"మీరు ఈ అధ్యాయాన్ని పూర్తి చేసారు","moduleProgress":"అధ్యాయం పురోగతి","mytrainings":"నా డిజిటల్ పాఠ్యపుస్తకాలు","nextModule":"తదుపరి అధ్యాయం","oneCourse":"డిజిటల్ పాఠ్య పుస్తకం","prevModule":"మునుపటి. అధ్యాయం","sectionTitle":"డిజిటల్ పాఠ్యపుస్తకాలు","selectChapter":"అధ్యాయాన్ని ఎంచుకోండి","trainingAttended":"పాఠ్యపుస్తకాలు చదివారు","courseContainCertificate":"ప్రస్తుతం, ఈ అభ్యాస పనికి సర్టిఫికేట్ లేదు. విధి సృష్టికర్త తరువాత ప్రమాణపత్రాన్ని అటాచ్ చేయవచ్చు.","courseDontContainCertificate":"ప్రస్తుతం, ఈ అభ్యాస పనికి సర్టిఫికేట్ లేదు. విధి సృష్టికర్త తరువాత ప్రమాణపత్రాన్ని అటాచ్ చేయవచ్చు."},"tab":{"courses":"డిజిటల్ పాఠ్య పుస్తకం"}},"messages":{"emsg":{"m0002":"ఈ పాఠ్య పుస్తకం ఇకపై అందుబాటులో లేదు"},"fmsg":{"dataSettingNotSubmitted":"ప్రొఫైల్ వాటా సెట్టింగ్లను నవీకరించడం సాధ్యం కాలేదు. తరువాత మళ్ళీ ప్రయత్నించండి","m0001":"క్షమించండి! మీరు వెతుకుతున్న పాఠ్యపుస్తకాన్ని మేము పొందలేకపోయాము. తరువాత మళ్ళీ ప్రయత్నించండి","m0002":"క్షమించండి! మేము మీ కోసం ఇతర పాఠ్యపుస్తకాలను పొందలేకపోయాము. తరువాత మళ్ళీ ప్రయత్నించండి","m0086":"ఈ పాఠ్య పుస్తకం ఇప్పుడు అందుబాటులో లేదు"}}}},"tvc":{"nontrk":{"frmelmnts":{"lbl":{"ActivityTvClasses":"టీవీ క్లాసులు","ACTIVITY_TEXTBOOK_TITLE":"టీవీ క్లాసులు","ACTIVITY_TV_CLASS_TITLE":"టీవీ క్లాసులు","chapter":"టీవీ కార్యక్రమం","collection_tv_classes":"టీవీ క్లాసులు","desktop":{"downloadBook":"టీవీ తరగతులను డౌన్లోడ్ చేయండి","downloadTVclasses":"టీవీ తరగతులను డౌన్లోడ్ చేయండి","find_more":"మరిన్ని టీవీ తరగతులు మరియు సంబంధిత కంటెంట్ను {instance}లో కనుగొనండి","find_more_TVclasses":"మరిన్ని టీవీ తరగతులు మరియు సంబంధిత కంటెంట్ను కనుగొనండి{instance}","updateTextbook":"టీవీ తరగతులను నవీకరించండి","updateTVclasses":"టీవీ తరగతులను నవీకరించండి"},"downloadBooks":"ఆఫ్లైన్లో ఉన్నప్పుడు యాక్సెస్ చేయడానికి టీవీ క్లాస్లను డౌన్లోడ్ చేయండి","downloadTVclasses":"ఆఫ్లైన్లో ఉన్నప్పుడు యాక్సెస్ చేయడానికి టీవీ క్లాస్లను డౌన్లోడ్ చేయండి","fromTheTextBook":"టీవీ క్లాస్ నుండి","fromTheTVclasses":"టీవీ క్లాస్ నుండి","noBookfoundTitle":"బోర్డు టీవీ క్లాస్ని జతచేస్తోంది","textbooks":"టీవీ క్లాసులు","TVclassesfoundTitle":"బోర్డు టీవీ క్లాస్ని జతచేస్తోంది","tv_classes":"టీవీ క్లాసులు","tv_program":"టీవీ కార్యక్రమం"}}},"trk":{"frmelmnts":{"btn":{"enroll":"చూడండి","resumecourse":"చూడటం పునః ప్రారంభించండి"},"instn":{"t0062":"మీరు ఇంకా ఈ టీవీ క్లాస్ కోసం ఎటువంటి లెర్నింగ్ బ్యాచ్ను సృష్టించలేదు. ఒక బ్యాచ్ను సృష్టించండి మరియు డాష్బోర్డ్ను తనిఖీ చేయండి","t0063":"మీరు ఇంకా ఏ టీవీ క్లాస్ని సృష్టించలేదు. టీవీ క్లాస్ని సృష్టించండి మరియు డాష్బోర్డ్ను తనిఖీ చేయండి"},"lbl":{"accessCourse":"టీవీ తరగతులను యాక్సెస్ చేయండి","accessToLogin":"టీవీ తరగతిని ఆక్సెస్ చెయ్యడానికి మీరు లాగిన్ అయి లెర్నింగ్ బ్యాచ్లో చేరాలి","ActivityCourses":"టీవీ క్లాసులు","ACTIVITY_COURSE_TITLE":"టీవీ క్లాసులు","addCourse":"టీవీ క్లాస్ని జోడించండి","completedCourse":"టీవీ తరగతులు పూర్తి చేశారు","copyAsCourse":"టీవీ క్లాస్గా కాపీ చేయండి","courseContainCertificate":"ఈ అభ్యాసం మీకు ధృవీకరణ పత్రాన్ని అందిస్తుంది","courseDetails":"టీవీ క్లాస్ వివరాలు","courses":"టీవీ క్లాసులు","coursestructure":"టీవీ కార్యక్రమం","moduleFinish":"మీరు ఈ కార్యక్రమాన్ని పూర్తి చేసారు","moduleProgress":"ప్రోగ్రామ్ పురోగతి","mytrainings":"నా టీవీ క్లాసులు","nextModule":"తదుపరి ప్రోగ్రామ్","oneCourse":"టీవీ క్లాస్","prevModule":"మునుపటి. ప్రోగ్రామ్","sectionTitle":"టీవీ క్లాసులు","selectChapter":"ప్రోగ్రామ్ను ఎంచుకోండి","trainingAttended":"టీవీ క్లాసులు చూశారు","courseDontContainCertificate":"ప్రస్తుతం, ఈ అభ్యాస పనికి సర్టిఫికేట్ లేదు. విధి సృష్టికర్త తరువాత ప్రమాణపత్రాన్ని అటాచ్ చేయవచ్చు"},"tab":{"courses":"టీవీ క్లాసులు"}},"messages":{"emsg":{"m0002":"ఈ టీవీ క్లాస్ టాస్క్ ఇప్పుడు అందుబాటులో లేదు"},"fmsg":{"m0001":"క్షమించండి! మీరు వెతుకుతున్న టీవీ తరగతులను మేము పొందలేకపోయాము. తరువాత మళ్ళీ ప్రయత్నించండి","m0002":"క్షమించండి! మేము మీ కోసం ఇతర టీవీ తరగతులను పొందలేకపోయాము. తరువాత మళ్ళీ ప్రయత్నించండి","m0086":"ఈ టీవీ క్లాస్ ఇప్పుడు అందుబాటులో లేదు"}}}}}
\ No newline at end of file
diff --git a/utils/portal/labels/all_labels_ur.json b/utils/portal/labels/all_labels_ur.json
new file mode 100644
index 000000000..8b1eca097
--- /dev/null
+++ b/utils/portal/labels/all_labels_ur.json
@@ -0,0 +1 @@
+{"dflt":{"nontrk":{"frmelmnts":{"btn":{"create":"بنائیں"},"lbl":{"ActivityTextbooks":"کام","ACTIVITY_TEXTBOOK_TITLE":"ٹاسکس","chapter":"سیکھنےکاماڈیول","collection_task":"ٹاسکس","desktop":{"download":"ڈاؤن لوڈ","downloadBook":"ڈاؤن لوڈ","find_more":"مزید مواد تلاش کریں","find_more_tasks":"مزید مشمولات تلاش کریں","update":"اپ ڈیٹ","updateTextbook":"اپ ڈیٹ"},"downloadBooks":"آف لائن تک رسائی کے لئے ڈاؤن لوڈ کریں","downloadoffline":"آف لائن تک رسائی کے لئے ڈاؤن لوڈ کریں","download_to_access_offline":"آف لائن تک رسائی کے لئے ڈاؤن لوڈ کریں","fromTheLearningTask":"سیکھنے کے کام سے","fromTheTextBook":"سیکھنے کے کام سے","import":"آف لائن تک رسائی کے لئے ڈاؤن لوڈ کریں","learningmodule":"سیکھنے کا ماڈیول","mynotebook":"میری نوٹ بک","noBookfoundButtonText":"مزید دیکھیں","noBookfoundSubTitle":"آپ کے بورڈ میں مواد شامل ہونی باقی ہے۔ مزید مشمولات دیکھنے کیلئے {instance} بٹن کو ٹیپ کریں","noBookfoundTitle":"بورڈ مواد شامل کررہا ہے","noTaskfoundSubTitle":"آپ کے بورڈ میں ابھی تک مواد شامل نہیں ہے۔ مزید مشمولات دیکھنے کیلئے {instance} بٹن کوٹیپ کریں","noTaskfoundTitle":"بورڈ مواد شامل کررہا ہے","seemore":"دیکھیں مزید","task":"ٹاسکس","tasks":"کام","task_title":"ٹاسکس","textbooks":"کام"}},"messages":{"stmsg":{"m0125":"مواد بنانا یا اپ لوڈ کرنا شروع کریں۔ اس وقت آپ کے پاس کوئی مواد ڈرافٹ کے بطور محفوظ نہیں ہے","ms0001":"مواد بنانا یا اپ لوڈ کرنا شروع کریں۔ اس وقت آپ کے پاس کوئی مواد ڈرافٹ کے بطور محفوظ نہیں ہے"}}},"trk":{"completed_learning":"سیکھنا مکمل ہوا","essages":{"fmsg":{"m0082":"سیکھنے کا یہ کام ابھی تک کھلا نہیں ہے۔ آپ اس میں شامل نہیں ہو سکتے"}},"frmelmnts":{"btn":{"create":"بنانا","enroll":"شامل ہوں","resumecourse":"جاری رکھیں","unenroll":"چھوڑ دو","viewcoursestats":"اعدادوشمار دیکھیں","viewCourseStatsDashboard":"ڈیش بورڈ دیکھیں"},"instn":{"t0062":"آپ نے ابھی تک اس کام کے لئے کوئی بیچ تشکیل نہیں دیا ہے۔ ایک کام بنائیں اور ڈیش بورڈ چیک کریں","t0063":"آپ نے ابھی تک کوئی کام تخلیق نہیں کیا ہے۔ نیا کام بنائیں اور ڈیش بورڈ کو دوبارہ چیک کریں۔"},"lbl":{"accessCourse":"مواد سیکھنے کیلئے رسائی حاصل کریں","accessToLogin":"مواد تک رسائی حاصل کرنے کے لئے آپ کو لاگ ان کر اس کام میں شامل ہونا ہوگا","ActivityCourses":"ٹاسکس","ACTIVITY_COURSE_TITLE":"ٹاسکس","addCourse":"شامل کریں","completedCourse":"مکمل ٹاسکس","completingCourseSuccessfully":"کامیابی سے مکمل سیکھنے کیلئے ،","copyAsCourse":"سیکھنے کے مواد کے طور پر کاپی کریں","courseContainCertificate":"یہ تعلیم آپ کو ایک سرٹیفیکیٹ پیش کرتی ہے","courseDetails":"سیکھنے کی تفصیلات","courseProgress":"ترقی","courseRelevantFor":"یہ سیکھنے کے لئے متعلقہ ہے:","courses":"ٹاسکس","coursestructure":"سیکھنےکاماڈیول","courseSuccessMessage":"آپ نے اپنی تعلیم کامیابی کے ساتھ مکمل کرلی ہے","courseSuccessNotificationMessage":"آپ کو 7 دن کے اندر اپنے رجسٹرڈ رابطے کی تفصیلات پر اپنے سرٹیفکیٹ کے بارے میں بتایا جائے گا","courseWithoutCertificateNote":"نوٹ: یہ لرننگ آپ کو سرٹیفکیٹ پیش نہیں کرتی ہے","dashboardnocourseselected":"کوئی انتخاب نہیں ہوا","dashboardnocourseselecteddesc":"فہرست میں سے منتخب کریں","downloadCourseQRCode":"QR کوڈ ڈاؤن لوڈ کریں","downloadQRCode":{"tooltip":"QRکوڈز کو ڈاؤن لوڈ کرنے کے لئے کلک کریں اور انہیں اپنی اشاعت سے جوڑیں"},"getUnlimitedAccess":"اپنے موبائل فون پر درسی کتب ، ٹی وی کلاس اور کورس آف لائن تک لامحدود رسائی حاصل کریں","joinTrainingToAcessContent":"مواد تک رسائی حاصل کرنے کے لئے ، آپ کو لاگ ان کرکے اس کام میں شامل ہونا ہوگا","moduleFinish":"آپ نے یہ کام مکمل کرلیا ہے","moduleProgress":"کام کی پیش رفت","mytrainings":"میرے کام","nextModule":"اگلا کام","oneCourse":"ٹاسک","prevModule":"پچھلا کام","returnToCourses":"پیچھے","sectionTitle":"کام","selectChapter":"کام منتخب کریں","selectContentFromCourse":"مشمولات منتخب کریں","trainingAttended":"تعلیم میں شرکت","courseDontContainCertificate":"فی الحال ، اس سیکھنے کے کام میں سرٹیفیکیٹ نہیں ہے۔ ٹاسک تخلیق کار بعد میں ایک سرٹیفیکیٹ منسلک کرسکتا ہے"},"tab":{"courses":"ٹاسکس"}},"messages":{"dashboard":{"emsg":{"m002":"صارف نے اس سیکھنے کے کام کے لئے کسی بھی بیچ میں شامل نہیں ہوا ہے"}},"emsg":{"m0002":"سیکھنے کا یہ کام اب دستیاب نہیں ہے","m0003":"اس سیکھنے کے کام میں کھلا بیچ نہیں ہے"},"fmsg":{"dataSettingNotSubmitted":"پروفائل شیئر کی ترتیبات کو اپ ڈیٹ نہیں کیا جاسکا۔ بعد میں دوبارہ کوشش کریں","m0001":"معذرت! ہم آپ کے لئے درج کردہ سیکھنے کے کام کے لئے معلومات حاصل نہیں کر سکتے ہیں. بعد میں دوبارہ کوشش کریں","m0002":"معذرت! ہم آپ کے لئے دوسرے سیکھنے کے کاموں کو نہیں لا سکے۔ بعد میں دوبارہ کوشش کریں","m0086":"یہ مواد اب دستیاب نہیں ہے"},"imsg":{"m0001":"اس مشمول کو نامناسب قرار دیا گیا ہے۔ فی الحال یہ زیر جائزہ ہے","m0026":"ہیلو ، یہ مواد اس وقت دستیاب نہیں ہے۔ اس میں تبدیلی ہوسکتی ہے"},"stmsg":{"m0125":"مواد بنانا یا اپ لوڈ کرنا شروع کریں۔ فی الحال آپ نے کوئی مسودہ مواد کو محفوظ نہیں کیا ہے"}}}},"crs":{"nontrk":{"frmelmnts":{"lbl":{"ActivityTextbooks":"کورسز","ACTIVITY_TEXTBOOK_TITLE":"کورسز","chapter":"کورس ماڈیول","desktop":{"downloadBook":"کورس ڈاؤن لوڈ کریں","find_more":"مزید کورسز اور متعلقہ مواد {instance} پر تلاش کریں","updateTextbook":"کورس کو اپ ڈیٹ کریں"},"downloadBooks":"آف لائن رہتے ہوئے رسائی کے لئے کورسز ڈاؤن لوڈ کریں","fromTheTextBook":"کورس سے","noBookfoundTitle":"بورڈ کورسز کا شامل کر رہا ہے","textbooks":"کورسز"}}},"trk":{"completedCourse":"کورس مکمل ہو گیا ہے","frmelmnts":{"btn":{"createCourse":"کورس بنائیں","enroll":"کورس میں داخلہ لیں","resumecourse":"کورس دوبارہ شروع کریں","unenroll":"کورس چھوڑیں","viewcoursestats":"کورس کے اعداد و شمار دیکھیں","viewCourseStatsDashboard":"کورس ڈیش بورڈ دیکھیں"},"instn":{"t0062":"اس کورس کے لئے آپ نے ابھی تک بیچ نہیں بنایا ہے۔ نیا بیچ بنائیں اور ڈیش بورڈ دوبارہ چیک کریں۔","t0063":"آپ نے ابھی تک کوئی کورس نہیں بنای ہے۔ نئ کورس بنائیں اور ڈیش بورڈ دوبارہ چیک کریں۔"},"lbl":{"accessCourse":"رسائی کورس","accessToLogin":"کورس تک رسائی حاصل کرنے کے لئے, آپ کو لاگ ان کر کورس میں شامل ہونا پڑے گا","ActivityCourses":"کورسز","ACTIVITY_COURSE_TITLE":"کورسز","addCourse":"کورس شامل کریں","completedCourse":"مکمل کورسز","completingCourseSuccessfully":"کورس کامیابی کے ساتھ مکمل کرنے کیلئے ،","copyAsCourse":"بطور کورس نقل کریں","courseContainCertificate":"یہ ایک سرٹیفکیٹ کورس ہے","courseDetails":"کورس کی تفصیلات","courseDontContainCertificate":"فی الحال ، اس کورس کے پاس سرٹیفیکیٹ نہیں ہے۔ کورس تخلیق کار بعد میں ایک سرٹیفیکیٹ منسلک کرسکتا ہے","courseLastUpdatedOn":"کورس آخری بار اپ ڈیٹ ہوا","courseProgress":"کورس کی ترقی","courseRelevantFor":"کورس کے لئے متعلقہ ہے:","courses":"کورسز","coursestructure":"کورس ماڈیول","courseSuccessMessage":"آپ نے کامیابی کے ساتھ کورس مکمل کیا ہے","courseSuccessNotificationMessage":"رابطے کیلئے دی گئی تفصیلات پر آپ کو 7 دن کے اندر کورس کے سرٹیفکیٹ کے بارے میں مطلع کیا جائے گا","courseWithoutCertificateNote":"نوٹ: اس کورس میں سرٹیفکیٹ نہیں ہے","dashboardnocourseselected":"کوئی کورس منتخب نہیں","dashboardnocourseselecteddesc":"مندرجہ بالا فہرست سے کورس منتخب کریں.","downloadCourseQRCode":"کورس کا QR کوڈ ڈاؤن لوڈ کریں","downloadQRCode":{"tooltip":"QR کوڈز کو ڈاؤن لوڈ کرنے کے لئے کلک کریں اور انہیں شائع کورس سے لنک کریں"},"enrollcourse":"کورس میں داخلہ لیں","getUnlimitedAccess":"اپنے موبائل فون پر آف لائن درسی کتابیں، سبق اور کورسز کی لامحدود رسائی حاصل کریں.","joinTrainingToAcessContent":"مواد تک مکمل رسائی حاصل کرنے آپ کو کورس میں شامل ہونا پڑے گا","moduleFinish":"آپ نے یہ ماڈیول مکمل کرلیا ہے","moduleProgress":"ماڈیول پیش رفت","mytrainings":"میرے کورسز","nextModule":"اگلا ماڈیول","oneCourse":"کورس","prevModule":"پچھلا ماڈیول","returnToCourses":"کورسز پر واپس جائیں","sectionTitle":"کورسز","selectChapter":"ماڈیول منتخب کریں","selectContentFromCourse":"کورس کے لئے مواد منتخب کریں","signinenrollTitle":"اس کورس میں داخلے کے لئےلاگ ان کریں.","trainingAttended":"کورسز میں شرکت","userName":"صارف نام"},"tab":{"courses":"کورسز"}},"messages":{"dashboard":{"emsg":{"m002":"صارف اس کورس کے کسی بھی بیچ میں درج نہیں ہے"}},"emsg":{"m0002":"کورس اب دستیاب نہیں ہے","m0003":"اس کورس میں کوئی کھلا بیچز نہیں ہے"},"fmsg":{"m0001":"اندراج نصاب کو حاصل کرنے میں ناکامی ہوئ، بعد میں دوبارہ کوشش کریں","m0002":"دیگر نصاب حاصل کرنے میں ناکامی ہوئ، بعد میں دوبارہ کوشش کریں۔۔۔","m0082":"یہ کورس اندراج کے لئے کھلا نہیں ہے","m0086":"یہ کورس مصنف کی طرف سے ریٹائرکردیا گیا ہے اور اس وجہ سے اب دستیاب نہیں ہے."},"imsg":{"m0001":"یہ کورس نامناسب طور پر نشان دہ کی گئ ہے اور فی الحال جائزے کے تحت ہے۔","m0026":"ہیلو، یہ کورس اب دستیاب نہیں ہے۔ یہ ممکن ہے کہ خالق نے کورس میں کچھ تبدیلیاں کی ہوں."},"stmsg":{"m0125":"وسائل، کتاب، کورس، مجموعہ یا اپ لوڈ بنانے شروع کریں. آپ اس وقت کوئی کام میں پیش رفت کا مسودہ نہیں رکھتے ہیں"}}}},"tbk":{"nontrk":{"frmelmnts":{"lbl":{"ActivityTextbooks":"درسی کتابیں","ACTIVITY_TEXTBOOK_TITLE":"درسی کتابیں","chapter":"باب","copyAsCourse":"کورس کے طور پر کاپی کریں","desktop":{"deleteCollection":"درسی کتاب {name} کو مٹانے سے یہ میرے ڈاؤن لوڈز سے ہٹ جاتا ہے۔ جاری رکھنے کے لئے 'مٹا دیں' پر کلک کریں۔","downloadBook":"درسی کتاب ڈاؤن لوڈ کریں","find_more":"{instance} پر مزید درسی کتابیں اور مواد تلاش کریں","updateTextbook":"نصابی کتاب اپ ڈیٹ کریں"},"dialCodeDescription":"ڈائل کوڈ آپ کے درسی کتاب میں QR کوڈ کے تحت پایا گیا 6 عددی حروف تہجی کوڈ ہے","dialCodeDescriptionGetPage":"QR کوڈ آپ کے ٹیکسٹ بک میں QR کوڈ کی تصویر کے نیچے پایا گیا 6 عددی حروف تہجی کوڈ ہے.","downloadBooks":"آف لائن کتابوں تک رسائی حاصل کرنے کے لئے انھیں ڈاؤن لوڈ کریں","fromTheTextBook":"درسی کتاب سے","getUnlimitedAccess":"اپنے موبائل فون پر آف لائن درسی کتابیں، سبق اور کورسز کی لامحدود رسائی حاصل کریں.","import":"آف لائن تک رسائی کے لیے کتابیں ڈاؤن لوڈ کریں","installAppDesc":"اپنے آلہ پر سبق ، درسی کتابیں اور مواد آف لائن اسٹور کریں","mynotebook":"میری نوٹ بک","noBookfoundButtonText":"مزید کتابیں اور مواد دیکھیں","noBookfoundSubTitle":"آپ کے بورڈ میں مزید کتابیں شامل ہونی باقی ہے۔ مزید کتابیں اور مواد کو {instance} پر دیکھنے کے لئے بٹن کوٹیپ کریں","noBookfoundTitle":"بورڈ کتابیں شامل کررہا ہے","textbooks":"درسی کتابیں"}},"messages":{"stmsg":{"m0125":"وسائل، کتاب، کورس، مجموعہ یا اپ لوڈ بنانے شروع کریں. آپ اس وقت کوئی کام میں پیش رفت کا مسودہ نہیں رکھتے ہیں"}}},"trk":{"frmelmnts":{"btn":{"enroll":"پڑھیں","resumecourse":"دوبارہ پڑھنا شروع کریں","unenroll":"بند"},"instn":{"t0062":"آپ نے ابھی تک اس درسی کتاب کے لئے کوئی سیکھنے / پڑھنے والا بیچ نہیں بنایا ہے۔ ایک بیچ بنائیں اور ڈیش بورڈ چیک کریں","t0063":"آپ نے ابھی تک کوئی درسی کتاب نہیں بنائی ہے۔ ایک درسی کتاب بنائیں اور ڈیش بورڈ چیک کریں"},"lbl":{"accessCourse":"درسی کتاب تک رسائی","accessToLogin":"درسی کتاب تک رسائی حاصل کرنے کے لئے آپ کو لاگ ان کرنا ہوگا اور سیکھنے / پڑھنے والے بیچ میں شامل ہونا ہوگا","ActivityCourses":"درسی کتاب","ACTIVITY_COURSE_TITLE":"درسی کتاب","addCourse":"درسی کتاب شامل کریں","completedCourse":"مکمل درسی کتابیں","completingCourseSuccessfully":"کامیابی کے ساتھ سیکھنے کو مکمل کرنے کے لئے،","copyAsCourse":"بطور درسی کتاب نقل کریں","courseDetails":"درسی کتاب کی تفصیلات","courses":"درسی کتابیں","coursestructure":"باب","joinTrainingToAcessContent":"مواد تک رسائی حاصل کرنے کے لئے ، آپ کو سیکھنے والے بیچ میں شامل ہونا چاہئے","moduleFinish":"آپ نے یہ باب مکمل کرلیا ہے","moduleProgress":"باب کی پیش رفت","mytrainings":"میری ڈیجیٹل درسی کتابیں","nextModule":"اگلا باب","oneCourse":"ڈیجیٹل درسی کتاب","prevModule":"پچھلا باب","sectionTitle":"ڈیجیٹل درسی کتابیں","selectChapter":"باب منتخب کریں","trainingAttended":"درسی کتابیں پڑھیں","courseContainCertificate":"یہ تعلیم آپ کو ایک سرٹیفکیٹ فراہم کرتا ہے","courseDontContainCertificate":"فی الحال ، اس سیکھنے کے کام کے پاس سرٹیفیکیٹ نہیں ہے۔ ٹاسک تخلیق کار بعد میں ایک سرٹیفیکیٹ منسلک کرسکتا ہے"},"tab":{"courses":"ڈیجیٹل درسی کتاب"}},"messages":{"emsg":{"m0002":"یہ درسی کتاب اب دستیاب نہیں ہے"},"fmsg":{"dataSettingNotSubmitted":"پروفائل حصہ داری کی ترتیبات کو اپ ڈیٹ نہیں کیا جاسکا۔ بعد میں دوبارہ کوشش کریں","m0001":"معذرت! ہمیں درسی کتاب نہیں مل سکی جس کی آپ تلاش کر رہے تھے۔ بعد میں دوبارہ کوشش کریں","m0002":"معذرت! ہم آپ کے لئے دوسری درسی کتابیں نہیں لا سکے۔ بعد میں دوبارہ کوشش کریں","m0086":"یہ درسی کتاب اب دستیاب نہیں ہے"}}}},"tvc":{"nontrk":{"frmelmnts":{"lbl":{"ActivityTvClasses":"ٹی وی کلاسز","ACTIVITY_TEXTBOOK_TITLE":"ٹی وی کلاسز","ACTIVITY_TV_CLASS_TITLE":"ٹی وی کلاسز","chapter":"ٹی وی پروگرام","collection_tv_classes":"ٹی وی کلاسز","desktop":{"downloadBook":"ٹی وی کلاسز ڈاؤن لوڈ کریں","downloadTVclasses":"ٹی وی کلاسز ڈاؤن لوڈ کریں","find_more":"مزید ٹی وی کلاسز اور متعلقہ مواد{instance} پر تلاش کریں","find_more_TVclasses":"مزید ٹی وی کلاسز اور متعلقہ مواد{instance} پر تلاش کریں","updateTextbook":"ٹی وی کلاسز اپ ڈیٹ کریں","updateTVclasses":"ٹی وی کلاسز اپ ڈیٹ کریں"},"downloadBooks":"آف لائن رہتے ہوئے تک رسائی حاصل کرنے کے لئے ٹی وی کلاسز ڈاؤن لوڈ کریں","downloadTVclasses":"آف لائن رہتے ہوئے ٹی وی کلاسز تک رسائی حاصل کرنے کے لئے انھیں ڈاؤن لوڈ کریں","fromTheTextBook":"ٹی وی کلاس سے","fromTheTVclasses":"ٹی وی کلاس سے","noBookfoundTitle":"بورڈ ٹی وی کلاس کو شامل کررہا ہے","textbooks":"ٹی وی کلاسز","TVclassesfoundTitle":"بورڈ ٹی وی کلاس کو شامل کررہا ہے","tv_classes":"ٹی وی کلاسز","tv_program":"ٹی وی پروگرام"}}},"trk":{"frmelmnts":{"btn":{"enroll":"دیکھو","resumecourse":"دوبارہ دیکھنا شروع کریں"},"instn":{"t0062":"آپ نے ابھی تک اس ٹی وی کلاس کے لئے کوئی سیکھنے والا بیچ نہیں بنایا ہے۔ ایک بیچ بنائیں اور ڈیش بورڈ چیک کریں","t0063":"آپ نے ابھی تک کوئی ٹی وی کلاس نہیں بنائی ہے۔ ایک ٹی وی کلاس بنائیں اور ڈیش بورڈ چیک کریں"},"lbl":{"accessCourse":"ٹی وی کلاسز تک رسائی حاصل کریں","accessToLogin":"ٹی وی کلاس تک رسائی حاصل کرنے کے لئے آپ کو لاگ کر سیکھنے والے بیچ میں شامل ہونا ہوگا","ActivityCourses":"ٹی وی کلاسز","ACTIVITY_COURSE_TITLE":"ٹی وی کلاسز","addCourse":"ٹی وی کلاس شامل کریں","completedCourse":"مکمل ٹی وی کلاسز","copyAsCourse":"ٹی وی کلاس کے بطور نقل کریں","courseContainCertificate":"یہ تعلیم آپ کو ایک سرٹیفیکیٹ پیش کرتی ہے","courseDetails":"ٹی وی کلاس کی تفصیلات","courses":"ٹی وی کلاسز","coursestructure":"ٹی وی پروگرام","moduleFinish":"آپ نے یہ پروگرام مکمل کرلیا ہے","moduleProgress":"پروگرام کی پیشرفت","mytrainings":"میرے ٹی وی کلاسز","nextModule":"اگلا پروگرام","oneCourse":"ٹی وی کلاس","prevModule":"پچھلا پروگرام","sectionTitle":"ٹی وی کلاسز","selectChapter":"پروگرام منتخب کریں","trainingAttended":"ٹی وی کلاسز دیکھی گئی","courseDontContainCertificate":"فی الحال ، اس سیکھنے کے کام کے پاس سرٹیفیکیٹ نہیں ہے۔ ٹاسک تخلیق کار بعد میں ایک سرٹیفیکیٹ منسلک کرسکتا ہے"},"tab":{"courses":"ٹی وی کلاسز"}},"messages":{"emsg":{"m0002":"یہ ٹی وی کلاس ٹاسک اب دستیاب نہیں ہے"},"fmsg":{"m0001":"معذرت! ہم ٹی وی کی کلاسیں حاصل نہیں کر سکتے تھے جو آپ تلاش کر رہے تھے. بعد میں پھر کوشش کریں","m0002":"معذرت! ہم آپ کے لئے ٹی وی کی دوسری کلاسیں نہیں لے سکے۔ بعد میں دوبارہ کوشش کریں","m0086":"یہ ٹی وی کلاس اب دستیاب نہیں ہے"}}}}}
From bc33b71cee237067220bd21fde22ae6562788196 Mon Sep 17 00:00:00 2001
From: Harsha
Date: Mon, 7 Dec 2020 12:43:41 +0530
Subject: [PATCH 057/184] nodebb config and nginx changes (#2073)
* replacing host with uri for mongodb
* nginx route for nodebb ui
* nginx route for nodebb ui
* nginx route for nodebb ui
* nginx route for nodebb
* nginx route for nodebb
---
ansible/inventory/env/group_vars/all.yml | 2 +-
.../templates/configmap.yaml | 5 ++++
.../core/nginx-public-ingress/values.j2 | 26 +++++++++++++++++++
.../core/nodebb/templates/deployment.yaml | 5 ++--
4 files changed, 34 insertions(+), 4 deletions(-)
diff --git a/ansible/inventory/env/group_vars/all.yml b/ansible/inventory/env/group_vars/all.yml
index 3012f6009..445a29e68 100644
--- a/ansible/inventory/env/group_vars/all.yml
+++ b/ansible/inventory/env/group_vars/all.yml
@@ -649,4 +649,4 @@ group_activity_agg_cache_enable: false
# nodebb variables
sunbird_nodebb_storage_key: "{{ core_vault_sunbird_nodebb_storage_key }}"
-mongo_nodebb_host: "{{ groups['mongo'] | join ',' }}"
+mongo_nodebb_host: "{{ groups['mongo'] | join(':27017,')}}:27017"
diff --git a/kubernetes/helm_charts/core/nginx-private-ingress/templates/configmap.yaml b/kubernetes/helm_charts/core/nginx-private-ingress/templates/configmap.yaml
index 8b25a0cd7..a79679825 100644
--- a/kubernetes/helm_charts/core/nginx-private-ingress/templates/configmap.yaml
+++ b/kubernetes/helm_charts/core/nginx-private-ingress/templates/configmap.yaml
@@ -136,6 +136,11 @@ data:
rewrite ^/enc/(.*) /$1 break;
proxy_pass $target;
}
+ location /nodebb/ {
+ set $target http://nodebb-service.{{ .Values.namespace }}.svc.cluster.local:4567;
+ rewrite ^/enc/(.*) /$1 break;
+ proxy_pass $target;
+ }
}
}
kind: ConfigMap
diff --git a/kubernetes/helm_charts/core/nginx-public-ingress/values.j2 b/kubernetes/helm_charts/core/nginx-public-ingress/values.j2
index 07abf6f6e..5fccc4434 100644
--- a/kubernetes/helm_charts/core/nginx-public-ingress/values.j2
+++ b/kubernetes/helm_charts/core/nginx-public-ingress/values.j2
@@ -571,6 +571,32 @@ proxyconfig: |-
proxy_set_header X-Request-ID $sb_request_id;
proxy_pass https://$s3_bucket/content-editor/$url_full;
}
+
+ location ~* ^/discussion-ui/(.*) {
+ # Enabling compression
+ gzip on;
+ gzip_min_length 100000;
+ gzip_proxied expired no-cache no-store private auth;
+ gzip_types application/javascript application/x-javascript text/css text/javascript;
+ set $s3_bucket "{{discussion_upstream_url}}";
+ set $url_full '$1';
+ proxy_http_version 1.1;
+ proxy_set_header Host "{{discussion_upstream_url.split('/')[0]|lower}}";
+ proxy_set_header Authorization '';
+ proxy_hide_header Access-Control-Allow-Origin;
+ proxy_hide_header Access-Control-Allow-Methods;
+ proxy_hide_header x-amz-id-2;
+ proxy_hide_header x-amz-request-id;
+ proxy_hide_header Set-Cookie;
+ proxy_ignore_headers "Set-Cookie";
+ proxy_buffering off;
+ proxy_intercept_errors on;
+ add_header Access-Control-Allow-Origin "*" ;
+ add_header Access-Control-Allow-Methods GET;
+ proxy_set_header X-Request-ID $sb_request_id;
+ proxy_pass https://$s3_bucket/discussion-ui/$url_full;
+ }
+
location ~* ^/collection-editor/(.*) {
# Enabling compression
gzip on;
diff --git a/kubernetes/helm_charts/core/nodebb/templates/deployment.yaml b/kubernetes/helm_charts/core/nodebb/templates/deployment.yaml
index ef395da3a..46b2eb8a4 100644
--- a/kubernetes/helm_charts/core/nodebb/templates/deployment.yaml
+++ b/kubernetes/helm_charts/core/nodebb/templates/deployment.yaml
@@ -62,9 +62,8 @@ data:
"secret": "100101",
"database": "mongo",
"port": "4567",
- "redis": {
- "host": "{{ .Values.mongo_nodebb_host }}",
- "port": 27017,
+ "mongo": {
+ "uri": "mongodb://{{ .Values.mongo_nodebb_host }}",
"username": "",
"password": "",
}
From 78dde442067e22522314973bb83c821ac9a022eb Mon Sep 17 00:00:00 2001
From: SMY ALTAMASH <30286162+SMYALTAMASH@users.noreply.github.com>
Date: Tue, 8 Dec 2020 11:53:16 +0530
Subject: [PATCH 058/184] Desktop Build and Deploy Automation Scripts with
Jenkinspipeline, Docker containers, Ansbile, Shell Scripts and custom logic.
(#2075)
* Add new files for offline desktop build automation
* Making unzip before running playbook
* Removing artifact folder refrernce
* Fixing indentation issues in jenkinspipeline
* Adding the logic to build the Env specific Builder Artifacts
* Adding build script changes to offline installer
* Adding the logic to run the build script
* Making changes to the repo name
* Deploy artifacts logic changes
* Rewriting the offline desktop deploy logic
* Changing the upload logic of the offline installer
* Making changes to the jenkinsfile so that we have a unified pipeline structure
* Removing unused role which existed earlier
* Making changes to jenkinsfile to have jenkins local variables for parsing env directory
* Adding jenkinsfile changes to remove docker image if it existed
* Removing docker image if it exists
* Adding correct location for downloading built package
* Remove the assets copying from jenkinspipeline
* Let ansible handle assets copy
* Artifact name parsing logic change
* Having the correct docker image name to be removed as part of resource cleanup for next build and deployment
* Remove the logic of zipping the artifacts
* Adding logic of removing the docker image in finally step rather than middle
* Making shell module in a single line
* Removing unwanted code in JenkinsPipeline
---
ansible/offline-installer.yml | 3 +-
.../defaults/main.yml | 0
ansible/roles/desktop-deploy/tasks/main.yml | 76 +++++++++++++
.../desktop-deploy/templates/build.sh.j2 | 28 +++++
.../roles/desktop-deploy/templates/envfile.j2 | 3 +
.../templates/setupOfflineInstaller.sh.j2 | 15 +--
.../offline-installer-deploy/tasks/main.yml | 50 ---------
.../offline-installer-deploy/tasks/remove.yml | 8 --
.../tasks/uploadToAzure.yml | 103 ------------------
.../templates/32-bit-prerequisite.sh.j2 | 7 --
.../templates/Dockerfile.j2 | 13 ---
.../templates/artifacts.sh.j2 | 15 ---
.../templates/build.sh.j2 | 18 ---
.../templates/env.json.j2 | 10 --
.../templates/envfile.j2 | 3 -
.../templates/metadata.sh.j2 | 8 --
pipelines/offlineinstaller/Jenkinsfile | 91 +++++-----------
17 files changed, 143 insertions(+), 308 deletions(-)
rename ansible/roles/{offline-installer-deploy => desktop-deploy}/defaults/main.yml (100%)
create mode 100644 ansible/roles/desktop-deploy/tasks/main.yml
create mode 100644 ansible/roles/desktop-deploy/templates/build.sh.j2
create mode 100644 ansible/roles/desktop-deploy/templates/envfile.j2
rename ansible/roles/{offline-installer-deploy => desktop-deploy}/templates/setupOfflineInstaller.sh.j2 (63%)
delete mode 100644 ansible/roles/offline-installer-deploy/tasks/main.yml
delete mode 100644 ansible/roles/offline-installer-deploy/tasks/remove.yml
delete mode 100644 ansible/roles/offline-installer-deploy/tasks/uploadToAzure.yml
delete mode 100644 ansible/roles/offline-installer-deploy/templates/32-bit-prerequisite.sh.j2
delete mode 100644 ansible/roles/offline-installer-deploy/templates/Dockerfile.j2
delete mode 100644 ansible/roles/offline-installer-deploy/templates/artifacts.sh.j2
delete mode 100644 ansible/roles/offline-installer-deploy/templates/build.sh.j2
delete mode 100644 ansible/roles/offline-installer-deploy/templates/env.json.j2
delete mode 100644 ansible/roles/offline-installer-deploy/templates/envfile.j2
delete mode 100644 ansible/roles/offline-installer-deploy/templates/metadata.sh.j2
diff --git a/ansible/offline-installer.yml b/ansible/offline-installer.yml
index d2ee56b9e..24e511c3d 100644
--- a/ansible/offline-installer.yml
+++ b/ansible/offline-installer.yml
@@ -1,7 +1,6 @@
---
- hosts: local
- become: yes
vars_files:
- ['{{inventory_dir}}/secrets.yml', 'secrets/{{env}}.yml']
roles:
- - offline-installer-deploy
+ - desktop-deploy
diff --git a/ansible/roles/offline-installer-deploy/defaults/main.yml b/ansible/roles/desktop-deploy/defaults/main.yml
similarity index 100%
rename from ansible/roles/offline-installer-deploy/defaults/main.yml
rename to ansible/roles/desktop-deploy/defaults/main.yml
diff --git a/ansible/roles/desktop-deploy/tasks/main.yml b/ansible/roles/desktop-deploy/tasks/main.yml
new file mode 100644
index 000000000..0d301fbed
--- /dev/null
+++ b/ansible/roles/desktop-deploy/tasks/main.yml
@@ -0,0 +1,76 @@
+---
+- name: Copy the desktop assests folder from inside the private repo location to root location.
+ shell: "cp -r {{offline_repo_location}}/private/desktop-assets {{offline_repo_location}}/"
+
+- name: get the date and time for the artifact
+ set_fact:
+ time: "{{ lookup('pipe', 'date +\"%Y-%b-%d\"') }}-{{offline_installer_type}}"
+
+- name: create a directory to store artifacts
+ file:
+ path: "{{offline_repo_location}}/desktop_uploader_assets/{{time}}"
+ state: directory
+ recurse: yes
+
+- name: Get the environment name for the artifact name
+ shell: "cat {{offline_repo_location}}/desktop-assets/{{offline_target_env}}/appConfig.json | jq -r '.APP_NAME'"
+ register: env_name
+
+- name: Display the environment name of the installer
+ debug:
+ msg: "{{env_name.stdout}}"
+
+- name: Create a variable to inject environment name to upload to azure blob
+ set_fact:
+ environment_name: "{{ env_name.stdout }}"
+
+- name: Get the version from the package.json file
+ shell: "cat {{offline_repo_location}}/app_dist/package.json | jq -r '.version'"
+ register: version
+
+- name: Display the version number of the installer
+ debug:
+ msg: "{{version.stdout}}"
+
+- name: Create a variable to inject version in the template
+ set_fact:
+ installer_version: "{{ version.stdout }}"
+
+- name: copy the installer script file and build script for building offline installer
+ template:
+ src: "{{item}}.j2"
+ dest: "{{offline_repo_location}}/{{item}}"
+ mode: '0755'
+ with_items:
+ - build.sh
+ - envfile
+ - setupOfflineInstaller.sh
+
+- name: run the installer script
+ shell: "bash -x {{offline_repo_location}}/build.sh"
+
+- name: Ensure azure blob storage container exists
+ command: az storage container create --name {{offline_installer_container_name}} --public-access blob
+ environment:
+ AZURE_STORAGE_ACCOUNT: "{{sunbird_public_storage_account_name}}"
+ AZURE_STORAGE_KEY: "{{sunbird_public_storage_account_key}}"
+
+- name: Upload to azure blob storage
+ command: az storage blob upload-batch --destination {{offline_installer_container_name}} --source "desktop_uploader_assets"
+ args:
+ chdir: "{{offline_repo_location}}/"
+ environment:
+ AZURE_STORAGE_ACCOUNT: "{{sunbird_public_storage_account_name}}"
+ AZURE_STORAGE_KEY: "{{sunbird_public_storage_account_key}}"
+ async: 60
+ poll: 10
+
+- name: Upload to latest.json file to blob
+ command: az storage blob upload-batch --destination "{{offline_installer_container_name}}/latest" --source "{{offline_repo_location}}/desktop_uploader_assets/{{time}}/"
+ args:
+ chdir: "{{offline_repo_location}}/"
+ environment:
+ AZURE_STORAGE_ACCOUNT: "{{sunbird_public_storage_account_name}}"
+ AZURE_STORAGE_KEY: "{{sunbird_public_storage_account_key}}"
+ async: 60
+ poll: 10
diff --git a/ansible/roles/desktop-deploy/templates/build.sh.j2 b/ansible/roles/desktop-deploy/templates/build.sh.j2
new file mode 100644
index 000000000..2f431915e
--- /dev/null
+++ b/ansible/roles/desktop-deploy/templates/build.sh.j2
@@ -0,0 +1,28 @@
+#!/bin/bash
+set -eo pipefail
+
+cd {{offline_repo_location}}/
+
+# Run the docker image and run the OS Specific build along with environment specific build
+docker run -d --env-file envfile --env ELECTRON_CACHE="/root/.cache/electron" --env ELECTRON_BUILDER_CACHE="/root/.cache/electron-builder" --name offline_deploy -w /project electronuserland/builder:wine sleep infinity
+docker cp . offline_deploy:/project/
+docker exec offline_deploy bash -x /project/setupOfflineInstaller.sh
+
+# Copy the built artifacts
+if [ "{{offline_installer_type}}" == "windows32bit" ];
+then
+ docker cp 'offline_deploy:/project/app_dist/dist/{{installer_version}}/win/ia32/{{environment_name}} Setup {{installer_version}}.exe' '{{offline_repo_location}}/desktop_uploader_assets/{{time}}/{{environment_name}}_{{installer_version}}_windows32bit.exe'
+
+ elif [ "{{offline_installer_type}}" == "windows64bit" ];
+ then
+ docker cp 'offline_deploy:/project/app_dist/dist/{{installer_version}}/win/x64/{{environment_name}} Setup {{installer_version}}.exe' '{{offline_repo_location}}/desktop_uploader_assets/{{time}}/{{environment_name}}_{{installer_version}}_windows64bit.exe'
+
+ elif [ "{{offline_installer_type}}" == "linux64bit" ];
+ then
+ docker cp 'offline_deploy:/project/app_dist/dist/{{installer_version}}/linux/x64/{{environment_name}}_{{installer_version}}_amd64.deb' '{{offline_repo_location}}/desktop_uploader_assets/{{time}}/{{environment_name}}_{{installer_version}}_linux64bit.deb'
+fi
+
+# Generate the latest.json file
+echo "{\"version\":\"{{installer_version}}\",\"windows\":{\"32bit\":\"{{environment_name}}_{{installer_version}}_windows32bit.exe\",\"64bit\":\"{{environment_name}}_{{installer_version}}_windows64bit.exe\"},\"linux\":{\"64bit\":\"{{environment_name}}_{{installer_version}}_linux64bit.deb\"}}" | jq '.' | tee -a '{{offline_repo_location}}/desktop_uploader_assets/{{time}}/latest.json'
+
+echo "Build the installer succesfully"
diff --git a/ansible/roles/desktop-deploy/templates/envfile.j2 b/ansible/roles/desktop-deploy/templates/envfile.j2
new file mode 100644
index 000000000..576b57e74
--- /dev/null
+++ b/ansible/roles/desktop-deploy/templates/envfile.j2
@@ -0,0 +1,3 @@
+offline_desktop_assets_token={{offline_desktop_assets_token}}
+offline_target_env={{offline_target_env}}
+offline_app_base_url_token={{offline_app_base_url_token}}
diff --git a/ansible/roles/offline-installer-deploy/templates/setupOfflineInstaller.sh.j2 b/ansible/roles/desktop-deploy/templates/setupOfflineInstaller.sh.j2
similarity index 63%
rename from ansible/roles/offline-installer-deploy/templates/setupOfflineInstaller.sh.j2
rename to ansible/roles/desktop-deploy/templates/setupOfflineInstaller.sh.j2
index 84f24a3c1..f569c990e 100644
--- a/ansible/roles/offline-installer-deploy/templates/setupOfflineInstaller.sh.j2
+++ b/ansible/roles/desktop-deploy/templates/setupOfflineInstaller.sh.j2
@@ -1,27 +1,22 @@
#!/bin/bash
-# Downgrade the node version
-npm install -g n
-n 8.16
-cd /project/src
+cd /project/app_dist
if [ "{{offline_installer_type}}" != "windows32bit" ];
then
-#Build the offline installer
- npm install
- npm run dist
+ #Build the offline installer
+ yarn install
+ node scripts/metadata.js
+ rm -rf scripts
fi
if [ "{{offline_installer_type}}" == "windows32bit" ];
then
-# npm run dist
npm run dist-win32
elif [ "{{offline_installer_type}}" == "windows64bit" ];
then
- npm install
npm run dist-win64
elif [ "{{offline_installer_type}}" == "linux64bit" ];
then
- npm install
npm run dist-linux
fi
diff --git a/ansible/roles/offline-installer-deploy/tasks/main.yml b/ansible/roles/offline-installer-deploy/tasks/main.yml
deleted file mode 100644
index 31bc47f62..000000000
--- a/ansible/roles/offline-installer-deploy/tasks/main.yml
+++ /dev/null
@@ -1,50 +0,0 @@
----
-- name: get the date and time for the artifact
- set_fact:
- time: "{{ lookup('pipe', 'date +\"%Y-%b-%d-%H-%M-%S\"') }}-{{offline_installer_type}}"
- when: uploadInstaller is not defined
-
-- name: copy the env.json file to the repo
- template:
- src: "{{item}}.j2"
- dest: "{{offline_repo_location}}/offline-installer-repo/src/{{item}}"
- mode: '0755'
- with_items:
- - env.json
- when: uploadInstaller is not defined
-
-- name: copy the installer script file and build script for building offline installer
- template:
- src: "{{item}}.j2"
- dest: "{{offline_repo_location}}/offline-installer-repo/{{item}}"
- mode: '0755'
- with_items:
- - build.sh
- - envfile
- - 32-bit-prerequisite.sh
- when: uploadInstaller is not defined
-
-- name: create a directory to store artifacts
- file:
- path: "{{offline_repo_location}}/offline-installer-repo/offline_artifacts/{{time}}"
- state: directory
- recurse: yes
- when: uploadInstaller is not defined
-
-- name: copy the installer script file and build script for building offline installer
- template:
- src: "{{item}}.j2"
- dest: "{{offline_repo_location}}/offline-installer-repo/{{item}}"
- mode: '0755'
- with_items:
- - setupOfflineInstaller.sh
- when: uploadInstaller is not defined
-
-- name: upload to azure
- include: uploadToAzure.yml
- when: uploadInstaller is defined
-
-- name: Delete offline installer folder if any issue
- include: remove.yml
- when: removeOfflineInstallerFolder is defined
-
diff --git a/ansible/roles/offline-installer-deploy/tasks/remove.yml b/ansible/roles/offline-installer-deploy/tasks/remove.yml
deleted file mode 100644
index da1512de9..000000000
--- a/ansible/roles/offline-installer-deploy/tasks/remove.yml
+++ /dev/null
@@ -1,8 +0,0 @@
-- name: Delete offline installer repo
- file:
- path: "{{offline_repo_location}}/offline-installer-repo/"
- state: absent
-
-- name: Notify build failure
- fail:
- msg: "Please check the build script, it had been failed"
diff --git a/ansible/roles/offline-installer-deploy/tasks/uploadToAzure.yml b/ansible/roles/offline-installer-deploy/tasks/uploadToAzure.yml
deleted file mode 100644
index aa7c01b65..000000000
--- a/ansible/roles/offline-installer-deploy/tasks/uploadToAzure.yml
+++ /dev/null
@@ -1,103 +0,0 @@
-- name: Ensure azure blob storage container exists
- command: az storage container create --name {{offline_installer_container_name}} --public-access blob
- environment:
- AZURE_STORAGE_ACCOUNT: "{{sunbird_public_storage_account_name}}"
- AZURE_STORAGE_KEY: "{{sunbird_public_storage_account_key}}"
-
-- name: Get the environment name for the artifact name
- shell: "cat {{offline_repo_location}}/offline-installer-repo/src/package.json | jq -r '.name'"
- register: env_name
-
-- name: Display the environment name of the installer
- debug:
- msg: "{{env_name.stdout}}"
-
-- name: Create a variable to inject environment name to upload to azure blob
- set_fact:
- environment_name: "{{ env_name.stdout }}"
-
-- name: Get the version from the package.json file
- shell: "cat {{offline_repo_location}}/offline-installer-repo/src/package.json | jq -r '.version'"
- register: version
-
-- name: Display the version number of the installer
- debug:
- msg: "{{version.stdout}}"
-
-- name: Create a variable to inject version in the template
- set_fact:
- installer_version: "{{ version.stdout }}"
-
-- name: get the directory name
- shell: "ls {{offline_repo_location}}/offline-installer-repo/offline_artifacts/"
- register: folderName
-
-- debug:
- msg: "{{folderName.stdout}}"
-
-- name: set the folder name to copy the artifacts
- set_fact:
- time: "{{folderName.stdout}}"
-
-- name: copy the installer artifacts and metadata files to upload it to azure blob and generate latest.json file
- template:
- src: "{{item}}.j2"
- dest: "{{offline_repo_location}}/offline-installer-repo/{{item}}"
- mode: '0755'
- with_items:
- - artifacts.sh
- - metadata.sh
-
-- name: copy the artifacts and generate the metadata file
- shell: "bash {{offline_repo_location}}/offline-installer-repo/{{item}}"
- args:
- chdir: "{{offline_repo_location}}/offline-installer-repo/"
- with_items:
- - artifacts.sh
- - metadata.sh
-
-- name: Upload to azure blob storage
- command: az storage blob upload-batch --destination {{offline_installer_container_name}} --source "offline_artifacts"
- args:
- chdir: "{{offline_repo_location}}/offline-installer-repo/"
- environment:
- AZURE_STORAGE_ACCOUNT: "{{sunbird_public_storage_account_name}}"
- AZURE_STORAGE_KEY: "{{sunbird_public_storage_account_key}}"
- async: 60
- poll: 10
-
-- name: Upload to latest.json file to blob
- command: az storage blob upload-batch --destination "{{offline_installer_container_name}}/latest" --source "{{folderName.stdout}}"
- args:
- chdir: "{{offline_repo_location}}/offline-installer-repo/offline_artifacts/"
- environment:
- AZURE_STORAGE_ACCOUNT: "{{sunbird_public_storage_account_name}}"
- AZURE_STORAGE_KEY: "{{sunbird_public_storage_account_key}}"
- async: 60
- poll: 10
-
-- name: Create a zip of the folder to archieve the artifact
- archive:
- path:
- - "{{offline_repo_location}}/offline-installer-repo/offline_artifacts/{{folderName.stdout}}"
- dest: "{{offline_repo_location}}/{{offline_installer_type}}.zip"
- owner: jenkins
- group: jenkins
- format: zip
-
-- name: copy latest.json file to archieve it in jenkins
- copy:
- src: "{{offline_repo_location}}/offline-installer-repo/offline_artifacts/{{folderName.stdout}}/latest.json"
- dest: "{{offline_repo_location}}/latest.json"
- owner: jenkins
- group: jenkins
- remote_src: yes
-
-- name: change the ownership of the directory to jenkins user
- file:
- path: "{{offline_repo_location}}"
- state: directory
- recurse: yes
- owner: jenkins
- group: jenkins
-
diff --git a/ansible/roles/offline-installer-deploy/templates/32-bit-prerequisite.sh.j2 b/ansible/roles/offline-installer-deploy/templates/32-bit-prerequisite.sh.j2
deleted file mode 100644
index cbfa755b0..000000000
--- a/ansible/roles/offline-installer-deploy/templates/32-bit-prerequisite.sh.j2
+++ /dev/null
@@ -1,7 +0,0 @@
-#!/bin/bash
-
-#Build the offline installer
-cd /private/src/
-rm -rf node_modules
-npm install leveldown --verbose
-npm run dist
diff --git a/ansible/roles/offline-installer-deploy/templates/Dockerfile.j2 b/ansible/roles/offline-installer-deploy/templates/Dockerfile.j2
deleted file mode 100644
index 348c4c6e0..000000000
--- a/ansible/roles/offline-installer-deploy/templates/Dockerfile.j2
+++ /dev/null
@@ -1,13 +0,0 @@
-#FROM electronuserland/builder:wine
-#MAINTAINER "S M Y ALTAMASH" ""
-#ENV ELECTRON_CACHE="/root/.cache/electron"
-#ENV ELECTRON_BUILDER_CACHE="/root/.cache/electron-builder"
-#ENV GITHUB_ACCESS_TOKEN={{offline_git_access_token}}
-#ENV GITHUB_PRIVATE_REPO={{offline_git_private_repo}}
-#ENV TARGET_ENVIRONMENT={{offline_target_env}}
-#WORKDIR /private/
-#ADD . /private/
-#WORKDIR /private/src/
-#CMD npm install && npm run dist
-#CMD npm run dist-win64
-#CMD npm run dist-linux
diff --git a/ansible/roles/offline-installer-deploy/templates/artifacts.sh.j2 b/ansible/roles/offline-installer-deploy/templates/artifacts.sh.j2
deleted file mode 100644
index ea5db269d..000000000
--- a/ansible/roles/offline-installer-deploy/templates/artifacts.sh.j2
+++ /dev/null
@@ -1,15 +0,0 @@
-#!/bin/bash
-
-
-if [ "{{offline_installer_type}}" == "windows32bit" ];
-then
- cp '{{offline_repo_location}}/offline-installer-repo/src/dist/{{installer_version}}/win/ia32/{{environment_name}} Setup {{installer_version}}.exe' offline_artifacts/{{time}}/{{environment_name}}_{{installer_version}}_windows32bit.exe
-elif [ "{{offline_installer_type}}" == "windows64bit" ];
-then
- cp '{{offline_repo_location}}/offline-installer-repo/src/dist/{{installer_version}}/win/x64/{{environment_name}} Setup {{installer_version}}.exe' offline_artifacts/{{time}}/{{environment_name}}_{{installer_version}}_windows64bit.exe
-elif [ "{{offline_installer_type}}" == "linux64bit" ];
-then
- cp '{{offline_repo_location}}/offline-installer-repo/src/dist/{{installer_version}}/linux/x64/{{environment_name}}_{{installer_version}}_amd64.deb' offline_artifacts/{{time}}/{{environment_name}}_{{installer_version}}_linux64bit.deb
-fi
-
-
diff --git a/ansible/roles/offline-installer-deploy/templates/build.sh.j2 b/ansible/roles/offline-installer-deploy/templates/build.sh.j2
deleted file mode 100644
index 720b64b8c..000000000
--- a/ansible/roles/offline-installer-deploy/templates/build.sh.j2
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/bin/bash
-
-echo "Offline Installer for Sunbird"
-
-# Build script
-set -eo pipefail
-
-if [ "{{offline_installer_type}}" == "windows32bit" ];
-then
-
- docker run --rm -v ${PWD}:/private/ i386/node:8.16.2-stretch bash -x /private/32-bit-prerequisite.sh
-
-fi
-
-#chmod +x setupOfflineInstaller.sh
-docker run --rm --env-file envfile --env ELECTRON_CACHE="/root/.cache/electron" --env ELECTRON_BUILDER_CACHE="/root/.cache/electron-builder" -v ${PWD}:/project electronuserland/builder:wine bash -x setupOfflineInstaller.sh
-
-echo "Build the installer succesfully"
diff --git a/ansible/roles/offline-installer-deploy/templates/env.json.j2 b/ansible/roles/offline-installer-deploy/templates/env.json.j2
deleted file mode 100644
index 8705f96ab..000000000
--- a/ansible/roles/offline-installer-deploy/templates/env.json.j2
+++ /dev/null
@@ -1,10 +0,0 @@
-{
- "APP_BASE_URL": "https://sunbird.org",
- "CHANNEL": "sunbird",
- "TELEMETRY_SYNC_INTERVAL_IN_SECS": 30,
- "APP_ID": "local.sunbird.desktop",
- "TELEMETRY_PACKET_SIZE": 200,
- "APP_BASE_URL_TOKEN": "{{offline_app_base_url_token}}",
- "APP_NAME": "SUNBIRD",
- "MODE": "standalone"
-}
diff --git a/ansible/roles/offline-installer-deploy/templates/envfile.j2 b/ansible/roles/offline-installer-deploy/templates/envfile.j2
deleted file mode 100644
index 9b98165e0..000000000
--- a/ansible/roles/offline-installer-deploy/templates/envfile.j2
+++ /dev/null
@@ -1,3 +0,0 @@
-GITHUB_ACCESS_TOKEN={{offline_git_access_token}}
-GITHUB_PRIVATE_REPO={{offline_git_private_repo}}
-TARGET_ENVIRONMENT={{offline_target_env}}
diff --git a/ansible/roles/offline-installer-deploy/templates/metadata.sh.j2 b/ansible/roles/offline-installer-deploy/templates/metadata.sh.j2
deleted file mode 100644
index 9d7e7a0dd..000000000
--- a/ansible/roles/offline-installer-deploy/templates/metadata.sh.j2
+++ /dev/null
@@ -1,8 +0,0 @@
-#!/bin/bash
-
-env_name={{environment_name}}
-version={{installer_version}}
-artifactFolder=$(find offline_artifacts/* -type d)
-
-# constructing the latest.json file
-echo "{\"version\":\"${version}\",\"windows\":{\"32bit\":\"${env_name}_${version}_windows32bit.exe\",\"64bit\":\"${env_name}_${version}_windows64bit.exe\"},\"linux\":{\"64bit\":\"${env_name}_${version}_linux64bit.deb\"}}" | jq '.' | tee -a {{offline_repo_location}}/offline-installer-repo/${artifactFolder}/latest.json
diff --git a/pipelines/offlineinstaller/Jenkinsfile b/pipelines/offlineinstaller/Jenkinsfile
index 30856efc0..94ef72b08 100644
--- a/pipelines/offlineinstaller/Jenkinsfile
+++ b/pipelines/offlineinstaller/Jenkinsfile
@@ -1,5 +1,4 @@
@Library('deploy-conf') _
-// node('jenkins-offline-slave') {
node() {
try {
String ANSI_GREEN = "\u001B[32m"
@@ -8,76 +7,46 @@ node() {
String ANSI_RED = "\u001B[31m"
String ANSI_YELLOW = "\u001B[33m"
- stage('checkout offline installer repo') {
- cleanWs()
+ stage('checkout public repo') {
+ folder = new File("$WORKSPACE/.git")
+ if (folder.exists())
+ {
+ println "Found .git folder. Clearing it.."
+ sh'git clean -fxd'
+ }
checkout scm
- sh """
- git clone https://github.com/Sunbird-Ed/sunbird-desktop-app.git -b ${sunbirded_installer_branch_or_tag} offline-installer-repo
- """
}
ansiColor('xterm') {
- envDir = sh(returnStdout: true, script: "echo $JOB_NAME").split('/')[-3].trim()
- module = sh(returnStdout: true, script: "echo $JOB_NAME").split('/')[-2].trim()
- jobName = sh(returnStdout: true, script: "echo $JOB_NAME").split('/')[-1].trim()
- currentWs = sh(returnStdout: true, script: 'pwd').trim()
- stage('Pre requisites for installer') {
- values = [:]
- ansiblePlaybook = "${currentWs}/ansible/offline-installer.yml --vault-password-file /var/lib/jenkins/secrets/vault-pass "
- ansibleExtraArgs = " --extra-vars \"offline_repo_location=$currentWs offline_installer_type=${offline_installer_type}\" -vv"
- values.put('currentWs', currentWs)
- values.put('env', envDir)
- values.put('module', module)
- values.put('jobName', jobName)
- values.put('ansiblePlaybook', ansiblePlaybook)
- values.put('ansibleExtraArgs', ansibleExtraArgs)
- println values
- ansible_playbook_run(values)
+ stage('get artifact') {
+ values = lp_dp_params()
+ currentWs = sh(returnStdout: true, script: 'pwd').trim()
+ artifact = values.artifact_name + ":" + values.artifact_version
+ values.put('currentWs', currentWs)
+ values.put('artifact', artifact)
+ artifact_download(values)
+ sh """
+ unzip ${artifact}
+ tar -xvzf app_dist.tar.gz
+ """
}
- try {
- stage('Build Installer, create and upload it to azure') {
- dir('offline-installer-repo') {
- sh """
- bash -x build.sh
- """
- }
- values = [:]
- ansiblePlaybook = "${currentWs}/ansible/offline-installer.yml --vault-password-file /var/lib/jenkins/secrets/vault-pass "
- ansibleExtraArgs = " --extra-vars \"offline_repo_location=$currentWs uploadInstaller=True offline_installer_type=${offline_installer_type}\""
- values.put('currentWs', currentWs)
- values.put('env', envDir)
- values.put('module', module)
- values.put('jobName', jobName)
- values.put('ansiblePlaybook', ansiblePlaybook)
- values.put('ansibleExtraArgs', ansibleExtraArgs)
- println values
- ansible_playbook_run(values)
- archiveArtifacts artifacts: '*.zip', onlyIfSuccessful: true
- archiveArtifacts artifacts: 'latest.json', onlyIfSuccessful: true
- }
- }
- catch (err) {
- values = [:]
- ansiblePlaybook = "${currentWs}/ansible/offline-installer.yml --vault-password-file /var/lib/jenkins/secrets/vault-pass "
- ansibleExtraArgs = " --extra-vars \"offline_repo_location=$currentWs removeOfflineInstallerFolder=True offline_installer_type=${offline_installer_type}\""
- values.put('currentWs', currentWs)
- values.put('env', envDir)
- values.put('module', module)
- values.put('jobName', jobName)
- values.put('ansiblePlaybook', ansiblePlaybook)
- values.put('ansibleExtraArgs', ansibleExtraArgs)
- println values
- ansible_playbook_run(values)
- currentBuild.result = 'SUCCESS'
- }
- }
+ stage('Install the offline desktop Application') {
+ ansiblePlaybook = "${currentWs}/ansible/offline-installer.yml --vault-password-file /var/lib/jenkins/secrets/vault-pass "
+ ansibleExtraArgs = " --extra-vars \"offline_repo_location=$currentWs offline_installer_type=${offline_installer_type}\" -vv"
+ values.put('ansiblePlaybook', ansiblePlaybook)
+ values.put('ansibleExtraArgs', ansibleExtraArgs)
+ println values
+ ansible_playbook_run(values)
+ }
+
+ }
summary()
-
- }
+ }
catch (err) {
currentBuild.result = "FAILURE"
throw err
}
finally {
+ sh "docker rm -f offline_deploy || true"
slack_notify(currentBuild.result)
email_notify()
}
From 0b2af50cdbe3a8bab089f26bb87df7e6f3d07d08 Mon Sep 17 00:00:00 2001
From: kaliraja <34502260+Kaali09@users.noreply.github.com>
Date: Tue, 8 Dec 2020 16:26:14 +0530
Subject: [PATCH 059/184] redis multiprocess monitoring alertrules (#2058)
* Issue #0000: updated the redis alert rules
* Issue #0000: updated the redis alert rules
* Issue #0000: added the redis alert rules
---
.../roles/sunbird-monitoring/defaults/main.yml | 2 ++
.../sunbird-monitoring/templates/alertrules.yaml | 5 +++++
.../alertrules/templates/promrulesDruid.yml | 2 +-
.../alertrules/templates/promrulesProcess.yml | 14 ++++++++++++++
4 files changed, 22 insertions(+), 1 deletion(-)
diff --git a/kubernetes/ansible/roles/sunbird-monitoring/defaults/main.yml b/kubernetes/ansible/roles/sunbird-monitoring/defaults/main.yml
index 931267c55..942d95e64 100644
--- a/kubernetes/ansible/roles/sunbird-monitoring/defaults/main.yml
+++ b/kubernetes/ansible/roles/sunbird-monitoring/defaults/main.yml
@@ -208,3 +208,5 @@ alertmanager_spec_overrides:
druid_raw_ingestion_lag_threshold: 200000
druid_rollup_ingestion_lag_threshold: 200000
+rollup_druid_datasource: ""
+redis_process_names: ""
diff --git a/kubernetes/ansible/roles/sunbird-monitoring/templates/alertrules.yaml b/kubernetes/ansible/roles/sunbird-monitoring/templates/alertrules.yaml
index 4971aff4d..ed09e111c 100644
--- a/kubernetes/ansible/roles/sunbird-monitoring/templates/alertrules.yaml
+++ b/kubernetes/ansible/roles/sunbird-monitoring/templates/alertrules.yaml
@@ -58,6 +58,8 @@ raw_druid_datasource:
druid_raw_ingestion_threshold: "{{ druid_raw_ingestion_lag_threshold | default(200000) }}"
druid_rollup_ingestion_threshold: "{{ druid_rollup_ingestion_lag_threshold | default(200000)}}"
+rollup_druid_datasource:
+ {{ rollup_druid_datasource | to_yaml | indent( width=2) }}
secor_process_names:
- channel-telemetry-backup
@@ -79,3 +81,6 @@ secor_process_names:
- ingestion-telemetry-backup
- ingestion-cluster-telemetry-backup
- telemetry-ingest-backup
+
+redis_process_names:
+ {{ redis_process_names | to_yaml | indent( width=2) }}
diff --git a/kubernetes/helm_charts/monitoring/alertrules/templates/promrulesDruid.yml b/kubernetes/helm_charts/monitoring/alertrules/templates/promrulesDruid.yml
index d6b702b21..303d05e71 100644
--- a/kubernetes/helm_charts/monitoring/alertrules/templates/promrulesDruid.yml
+++ b/kubernetes/helm_charts/monitoring/alertrules/templates/promrulesDruid.yml
@@ -57,7 +57,7 @@ spec:
{{- end }}
{{- end }}
- {{- if .Values.rollup_druid_cluster }}
+ {{- if .Values.rollup_druid_datasource }}
## druid segment unavailable count alert
{{ range $key := .Values.rollup_druid_datasource }}
- alert: druid_segment_unavailable_count
diff --git a/kubernetes/helm_charts/monitoring/alertrules/templates/promrulesProcess.yml b/kubernetes/helm_charts/monitoring/alertrules/templates/promrulesProcess.yml
index 39c76ee1a..dcf9b8aab 100644
--- a/kubernetes/helm_charts/monitoring/alertrules/templates/promrulesProcess.yml
+++ b/kubernetes/helm_charts/monitoring/alertrules/templates/promrulesProcess.yml
@@ -193,6 +193,20 @@ spec:
job_id: Druid-MiddleManager
alertname: MiddleManagerProcessNotRunning
+ {{- if .Values.redis_process_names }}
+ {{- range $key, $value := .Values.redis_process_names }}
+ - alert: redisserver_process_not_running_fatal
+ expr: sum without(state) (namedprocess_namegroup_states{groupname={{ $value | quote }}}) == 0
+ for: 5m
+ labels:
+ severity: critical
+ module: dp_process
+ annotations:
+ message: The {{ $key }} redis process which runs on port {{ $value }} is not running.
+ summary: redis-server process is not running
+ job_id: Redis
+ alertname: RedisProcessNotRunning
+ {{- end }}
- alert: redisserver_process_not_running_fatal
expr: sum without(state) (namedprocess_namegroup_states{groupname="redis-server"}) == 0
From 9f35c4fa9fe369fc5a50bd50087ec6b491c416f8 Mon Sep 17 00:00:00 2001
From: Keshav Prasad
Date: Wed, 9 Dec 2020 07:43:13 +0530
Subject: [PATCH 060/184] fixes negative stride ansible error when keys are
zero (#2078)
* fixes negative stride ansible error when keys are zero
* fix: update keycount for keys
---
kubernetes/ansible/roles/helm-deploy/defaults/main.yml | 6 +++---
kubernetes/ansible/roles/helm-deploy/tasks/main.yml | 2 +-
kubernetes/ansible/roles/sunbird-deploy/tasks/main.yml | 2 +-
3 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/kubernetes/ansible/roles/helm-deploy/defaults/main.yml b/kubernetes/ansible/roles/helm-deploy/defaults/main.yml
index c8ac5d34f..6e960fbb8 100644
--- a/kubernetes/ansible/roles/helm-deploy/defaults/main.yml
+++ b/kubernetes/ansible/roles/helm-deploy/defaults/main.yml
@@ -98,7 +98,7 @@ adminutil_keys_values:
basepath: "/keys/"
keyprefix: "{{ adminutil__device_keyprefix }}"
keystart: "{{ adminutil__device_keystart }}"
- keycount: "{{ adminutil__device_keystart + adminutil__device_keycount - 1 }}"
+ keycount: "{{ adminutil__device_keycount|int }}"
role_to_run:
- decrypt.yml
- copy-to-helm.yml
@@ -107,7 +107,7 @@ adminutil_keys_values:
basepath: "/keys/"
keyprefix: "{{ adminutil__access_keyprefix }}"
keystart: "{{ adminutil__access_keystart }}"
- keycount: "{{ adminutil__access_keystart + adminutil__access_keycount - 1 }}"
+ keycount: "{{ adminutil__access_keycount|int }}"
role_to_run:
- decrypt.yml
- copy-to-helm.yml
@@ -116,7 +116,7 @@ adminutil_keys_values:
basepath: "/keys/"
keyprefix: "{{ adminutil__desktop_keyprefix }}"
keystart: "{{ adminutil__desktop_keystart }}"
- keycount: "{{ adminutil__desktop_keystart + adminutil__desktop_keycount - 1 }}"
+ keycount: "{{ adminutil__desktop_keycount|int }}"
role_to_run:
- decrypt.yml
- copy-to-helm.yml
diff --git a/kubernetes/ansible/roles/helm-deploy/tasks/main.yml b/kubernetes/ansible/roles/helm-deploy/tasks/main.yml
index 0ca459932..9ef163db2 100644
--- a/kubernetes/ansible/roles/helm-deploy/tasks/main.yml
+++ b/kubernetes/ansible/roles/helm-deploy/tasks/main.yml
@@ -22,7 +22,7 @@
private_key_path: "{{ outer_item.0.values_to_pass.basepath }}"
private_key_prefix: "{{ outer_item.0.values_to_pass.keyprefix }}"
private_key_sign_start: "{{ outer_item.0.values_to_pass.keystart }}"
- private_key_sign_end: "{{ outer_item.0.values_to_pass.keycount if outer_item.0.values_to_pass.keycount > '0' else '0' }}"
+ private_key_sign_end: "{{ outer_item.0.values_to_pass.keycount if outer_item.0.values_to_pass.keycount > '0' else '1' }}"
when: release_name == "adminutils"
with_subelements:
- "{{adminutil_keys_values}}"
diff --git a/kubernetes/ansible/roles/sunbird-deploy/tasks/main.yml b/kubernetes/ansible/roles/sunbird-deploy/tasks/main.yml
index 9d7ad2ee9..9a46ad013 100644
--- a/kubernetes/ansible/roles/sunbird-deploy/tasks/main.yml
+++ b/kubernetes/ansible/roles/sunbird-deploy/tasks/main.yml
@@ -26,7 +26,7 @@
private_key_path: "{{ outer_item.0.values_to_pass.basepath }}"
private_key_prefix: "{{ outer_item.0.values_to_pass.keyprefix }}"
private_key_sign_start: "{{ outer_item.0.values_to_pass.keystart }}"
- private_key_sign_end: "{{ outer_item.0.values_to_pass.keycount if outer_item.0.values_to_pass.keycount > '0' else '0' }}"
+ private_key_sign_end: "{{ outer_item.0.values_to_pass.keycount if outer_item.0.values_to_pass.keycount > '0' else '1' }}"
when: release_name == "learner" or release_name == "lms" or release_name == "groups"
with_subelements:
- "{{adminutil_access_values}}"
From 139df1b21f96d4eb805bcb4bb77bc85c7a961443 Mon Sep 17 00:00:00 2001
From: Keshav Prasad
Date: Wed, 9 Dec 2020 07:44:13 +0530
Subject: [PATCH 061/184] fixes negative stride ansible error when keys are
zero (#2080)
* fix: update keycount for keys
* fixes negative stride ansible error when keys are zero
---
kubernetes/ansible/roles/deploy-player/tasks/main.yml | 2 +-
kubernetes/ansible/roles/helm-deploy/defaults/main.yml | 6 +++---
kubernetes/ansible/roles/helm-deploy/tasks/main.yml | 2 +-
kubernetes/ansible/roles/sunbird-deploy/tasks/main.yml | 2 +-
4 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/kubernetes/ansible/roles/deploy-player/tasks/main.yml b/kubernetes/ansible/roles/deploy-player/tasks/main.yml
index 5213285e5..25fb73c77 100644
--- a/kubernetes/ansible/roles/deploy-player/tasks/main.yml
+++ b/kubernetes/ansible/roles/deploy-player/tasks/main.yml
@@ -40,7 +40,7 @@
private_key_path: "{{ outer_item.0.values_to_pass.basepath }}"
private_key_prefix: "{{ outer_item.0.values_to_pass.keyprefix }}"
private_key_sign_start: "{{ outer_item.0.values_to_pass.keystart }}"
- private_key_sign_end: "{{ outer_item.0.values_to_pass.keycount if outer_item.0.values_to_pass.keycount > '0' else '0' }}"
+ private_key_sign_end: "{{ outer_item.0.values_to_pass.keycount if outer_item.0.values_to_pass.keycount > '0' else '1' }}"
when: release_name == "player"
with_subelements:
- "{{adminutil_access_values}}"
diff --git a/kubernetes/ansible/roles/helm-deploy/defaults/main.yml b/kubernetes/ansible/roles/helm-deploy/defaults/main.yml
index c8ac5d34f..6e960fbb8 100644
--- a/kubernetes/ansible/roles/helm-deploy/defaults/main.yml
+++ b/kubernetes/ansible/roles/helm-deploy/defaults/main.yml
@@ -98,7 +98,7 @@ adminutil_keys_values:
basepath: "/keys/"
keyprefix: "{{ adminutil__device_keyprefix }}"
keystart: "{{ adminutil__device_keystart }}"
- keycount: "{{ adminutil__device_keystart + adminutil__device_keycount - 1 }}"
+ keycount: "{{ adminutil__device_keycount|int }}"
role_to_run:
- decrypt.yml
- copy-to-helm.yml
@@ -107,7 +107,7 @@ adminutil_keys_values:
basepath: "/keys/"
keyprefix: "{{ adminutil__access_keyprefix }}"
keystart: "{{ adminutil__access_keystart }}"
- keycount: "{{ adminutil__access_keystart + adminutil__access_keycount - 1 }}"
+ keycount: "{{ adminutil__access_keycount|int }}"
role_to_run:
- decrypt.yml
- copy-to-helm.yml
@@ -116,7 +116,7 @@ adminutil_keys_values:
basepath: "/keys/"
keyprefix: "{{ adminutil__desktop_keyprefix }}"
keystart: "{{ adminutil__desktop_keystart }}"
- keycount: "{{ adminutil__desktop_keystart + adminutil__desktop_keycount - 1 }}"
+ keycount: "{{ adminutil__desktop_keycount|int }}"
role_to_run:
- decrypt.yml
- copy-to-helm.yml
diff --git a/kubernetes/ansible/roles/helm-deploy/tasks/main.yml b/kubernetes/ansible/roles/helm-deploy/tasks/main.yml
index 0ca459932..9ef163db2 100644
--- a/kubernetes/ansible/roles/helm-deploy/tasks/main.yml
+++ b/kubernetes/ansible/roles/helm-deploy/tasks/main.yml
@@ -22,7 +22,7 @@
private_key_path: "{{ outer_item.0.values_to_pass.basepath }}"
private_key_prefix: "{{ outer_item.0.values_to_pass.keyprefix }}"
private_key_sign_start: "{{ outer_item.0.values_to_pass.keystart }}"
- private_key_sign_end: "{{ outer_item.0.values_to_pass.keycount if outer_item.0.values_to_pass.keycount > '0' else '0' }}"
+ private_key_sign_end: "{{ outer_item.0.values_to_pass.keycount if outer_item.0.values_to_pass.keycount > '0' else '1' }}"
when: release_name == "adminutils"
with_subelements:
- "{{adminutil_keys_values}}"
diff --git a/kubernetes/ansible/roles/sunbird-deploy/tasks/main.yml b/kubernetes/ansible/roles/sunbird-deploy/tasks/main.yml
index 9d7ad2ee9..9a46ad013 100644
--- a/kubernetes/ansible/roles/sunbird-deploy/tasks/main.yml
+++ b/kubernetes/ansible/roles/sunbird-deploy/tasks/main.yml
@@ -26,7 +26,7 @@
private_key_path: "{{ outer_item.0.values_to_pass.basepath }}"
private_key_prefix: "{{ outer_item.0.values_to_pass.keyprefix }}"
private_key_sign_start: "{{ outer_item.0.values_to_pass.keystart }}"
- private_key_sign_end: "{{ outer_item.0.values_to_pass.keycount if outer_item.0.values_to_pass.keycount > '0' else '0' }}"
+ private_key_sign_end: "{{ outer_item.0.values_to_pass.keycount if outer_item.0.values_to_pass.keycount > '0' else '1' }}"
when: release_name == "learner" or release_name == "lms" or release_name == "groups"
with_subelements:
- "{{adminutil_access_values}}"
From 522cf9c2175f4c8554460fbd131b1875fa30377d Mon Sep 17 00:00:00 2001
From: SMY ALTAMASH <30286162+SMYALTAMASH@users.noreply.github.com>
Date: Wed, 9 Dec 2020 14:31:36 +0530
Subject: [PATCH 062/184] Changing Desktop Device ACLs to correct Standards.
(#2082)
Changing Desktop Device ACLs to correct Standards.
---
ansible/roles/kong-api/defaults/main.yml | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/ansible/roles/kong-api/defaults/main.yml b/ansible/roles/kong-api/defaults/main.yml
index 4a365fed3..c7ff75e75 100644
--- a/ansible/roles/kong-api/defaults/main.yml
+++ b/ansible/roles/kong-api/defaults/main.yml
@@ -3018,7 +3018,7 @@ kong_apis:
- "{{ statsd_pulgin }}"
- name: acl
config.whitelist:
- - 'desktopAdmin'
+ - 'desktopSuperAdmin'
- name: rate-limiting
config.policy: local
config.hour: "{{ medium_rate_limit_per_hour }}"
@@ -3036,7 +3036,7 @@ kong_apis:
- "{{ statsd_pulgin }}"
- name: acl
config.whitelist:
- - 'desktopApp'
+ - 'desktopAdmin'
- name: rate-limiting
config.policy: local
config.hour: "{{ medium_rate_limit_per_hour }}"
@@ -3054,7 +3054,7 @@ kong_apis:
- "{{ statsd_pulgin }}"
- name: acl
config.whitelist:
- - 'desktopApp'
+ - 'desktopAdmin'
- name: rate-limiting
config.policy: local
config.hour: "{{ medium_rate_limit_per_hour }}"
@@ -5946,4 +5946,4 @@ kong_apis:
config.hour: "{{ medium_rate_limit_per_hour }}"
config.limit_by: credential
- name: request-size-limiting
- config.allowed_payload_size: "{{ medium_request_size_limit }}"
\ No newline at end of file
+ config.allowed_payload_size: "{{ medium_request_size_limit }}"
From ce12fe97fc3e79003dc7f59c3c3984dcda803608 Mon Sep 17 00:00:00 2001
From: G33tha
Date: Thu, 10 Dec 2020 21:23:45 +0530
Subject: [PATCH 063/184] Create faq-en.json
---
utils/DesktopFAQ/faq-en.json | 68 ++++++++++++++++++++++++++++++++++++
1 file changed, 68 insertions(+)
create mode 100644 utils/DesktopFAQ/faq-en.json
diff --git a/utils/DesktopFAQ/faq-en.json b/utils/DesktopFAQ/faq-en.json
new file mode 100644
index 000000000..e5b3bbdb6
--- /dev/null
+++ b/utils/DesktopFAQ/faq-en.json
@@ -0,0 +1,68 @@
+{
+ "faqs": [
+ {
+ "topic": "I cannot see my board, medium, class and subject",
+ "description": "Your State does not currently support all boards, mediums, classes and subjects. As soon as your State adds them, you will see it in the list"
+ },
+ {
+ "topic": "I have downloaded content, but I am unable to play it because it says that I need the Internet",
+ "description": "You may have downloaded YouTube content. You can play YouTube content only when you are online. Connect the computer to the Internet try again. "
+ },
+ {
+ "topic": "I need to update my DIKSHA desktop app",
+ "description": "Connect your computer to the Internet and check https://diksha.gov.in/desktop/latest for the latest app version "
+ },
+ {
+ "topic": "I do not have access to a laptop with an Internet connection, but I want to add or update content on the desktop app",
+ "description": "If you have a mobile phone, download the DIKSHA mobile app from the google playstore. \nBrowse for the content in the app. \nDownload the content from the DIKSHA library. \nCopy it on a pendrive or SD card and upload it to the DIKSHA desktop app."
+ },
+ {
+ "topic": "I do not find content for a particular topic, or I find the content irrelevant",
+ "description": "Browse DIKSHA's online library to search for the content. If it is still unavailable, send your feedback about content to the State SCERT"
+ },
+ {
+ "topic": "The app is very slow",
+ "description": "To speed up the app performance, do the following:\n Go to your computer’s system configuration. The minimum configuration should be:\n2 GB RAM \nDual Core Processor \n If your computer matches or exceeds this configuration, restart the app.\n After doing this, if it is still slow, go to Task Manager , \nselect all unused background processes and click End Task "
+ },
+ {
+ "topic": "I am unable to copy content to a pendrive",
+ "description": "To copy the content to a pen drive, do the following:\nGo to your computer Settings. Check if the USB drive is write-protected. If it is, disable the protection \nCheck if the pen drive has free space. Delete unwanted files from the pendrive "
+ },
+ {
+ "topic": "I had loaded content on my pendrive, but now I see that it is empty",
+ "description": "Your pendrive or computer may be infected with a virus. Check that:\n* You have an anti virus software installed on your machine\n* Your pendrive is write-protected before you plug it into unknown machines"
+ },
+ {
+ "topic": "It takes time to copy content to and from my pendrive",
+ "description": "The time taken to copy depends on the size of the content file. Some large textbooks take time to copy. We recommend that you do not stop the process in between. Doing so may lead to inconsistent files."
+ },
+ {
+ "topic": "My computer does not have any free space because of DIKSHA content",
+ "description": "Delete downloaded content from the My Downloads tab of the app to free up space on your computer"
+ },
+ {
+ "topic": "Unable to install DIKSHA Desktop application on my Ubuntu system",
+ "description": "To install DIKSHA Desktop application on your ubuntu system:
\n1) Open your terminal
\n2) Run the command cd to change the directory to where the exe file is downloaded. For example, if the exe is saved in the downloads folder, then run the command cd Downloads
\n3) Run the command sudo dpkg -i
\nOn successfully running this command the application is launched
"
+ }
+ ],
+ "constants": {
+ "charactersLeft": "characters left",
+ "explainMsg": "Could you explain the problem?",
+ "faqMsg": "Frequently asked questions",
+ "help": "Help",
+ "helpMsg": "Did this answer help you?",
+ "initiateEmailButton": "Initiate email",
+ "knowMoreMsg": "What more would you like to know?",
+ "noMsg": "No",
+ "reportIssue": "Report an issue",
+ "reportIssueMsg": "Report other issue",
+ "resolveMsg": "Look through the list to resolve your issue",
+ "sorryMsg": "Sorry about that!",
+ "submitButton": "Submit",
+ "tellMoreMsg": "Tell us more about the problem you faced",
+ "thanksMsg": "Thank you for your response!",
+ "triggerEmailMsg": "After you add details in the text box and tap the Initiate email button, we will trigger an email on your behalf. You can add further details and/or attach files there.",
+ "typeHere": "Type Here...",
+ "yesMsg": "Yes"
+ }
+}
From f381e09e4c56eee236e3bc0d144856fc87e552ca Mon Sep 17 00:00:00 2001
From: Keshav Prasad
Date: Fri, 11 Dec 2020 12:34:47 +0530
Subject: [PATCH 064/184] feat: adding configs of 3.5 (#2086)
---
.../Core/jobs/OfflineInstaller/config.xml | 80 ++++++
.../Core/jobs/OfflineInstaller/config.xml | 235 ++++++++++++++++++
.../Core/jobs/UploadDesktopFaq/config.xml | 156 ++++++++++++
.../Core/jobs/UploadPortalLabel/config.xml | 189 ++++++++++++++
4 files changed, 660 insertions(+)
create mode 100644 deploy/jenkins/jobs/Build/jobs/Core/jobs/OfflineInstaller/config.xml
create mode 100644 deploy/jenkins/jobs/Deploy/jobs/dev/jobs/Core/jobs/OfflineInstaller/config.xml
create mode 100644 deploy/jenkins/jobs/Deploy/jobs/dev/jobs/Core/jobs/UploadDesktopFaq/config.xml
create mode 100644 deploy/jenkins/jobs/Deploy/jobs/dev/jobs/Core/jobs/UploadPortalLabel/config.xml
diff --git a/deploy/jenkins/jobs/Build/jobs/Core/jobs/OfflineInstaller/config.xml b/deploy/jenkins/jobs/Build/jobs/Core/jobs/OfflineInstaller/config.xml
new file mode 100644
index 000000000..8c1f5a557
--- /dev/null
+++ b/deploy/jenkins/jobs/Build/jobs/Core/jobs/OfflineInstaller/config.xml
@@ -0,0 +1,80 @@
+
+
+
+
+ hudson.model.ParametersDefinitionProperty
+ com.sonyericsson.rebuild.RebuildSettings
+
+
+
+
+ false
+
+
+
+ -1
+ 10
+ -1
+ 1
+
+
+
+
+ false
+ false
+
+
+
+
+ github_release_tag
+ <font color=red size=2><b>CAUTION: If the value is blank, latest code will be built. Specify github tag name to build from a tag.</b></font>
+
+ false
+
+
+
+
+ 0
+ 0
+
+ false
+ project
+ false
+
+
+
+
+
+
+
+
+
+ 2
+
+
+ https://github.com/Sunbird-Ed/SunbirdEd-portal
+
+
+
+
+ release-3.5.0
+
+
+ false
+
+
+
+ true
+ false
+
+ 0
+ false
+
+
+
+ Jenkinsfile.desktop
+ false
+
+
+ false
+
diff --git a/deploy/jenkins/jobs/Deploy/jobs/dev/jobs/Core/jobs/OfflineInstaller/config.xml b/deploy/jenkins/jobs/Deploy/jobs/dev/jobs/Core/jobs/OfflineInstaller/config.xml
new file mode 100644
index 000000000..20b153b78
--- /dev/null
+++ b/deploy/jenkins/jobs/Deploy/jobs/dev/jobs/Core/jobs/OfflineInstaller/config.xml
@@ -0,0 +1,235 @@
+
+
+
+ false
+
+
+
+ -1
+ -1
+ -1
+ 5
+
+
+
+
+
+ ArtifactUpload/dev/Core/OfflineInstaller
+
+
+
+ false
+ false
+
+
+
+
+ absolute_job_path
+ <font color=dimgray size=2><b>Do not change this value! The metadata.json will be copied from this job.</b></font>
+ ArtifactUpload/dev/Core/OfflineInstaller
+ false
+
+
+ private_branch
+
+ choice-parameter-2544395024638227
+ 1
+
+ false
+
+
+
+ false
+
+
+ offlineInstaller
+ Deploy/dev/Core/offlineInstaller
+
+
+ ET_FORMATTED_HTML
+ true
+
+
+ branch_or_tag
+
+ choice-parameter-2620434998790477
+ 1
+
+ false
+
+
+
+ false
+
+
+ offlineInstaller
+ Deploy/dev/Core/offlineInstaller
+
+
+ ET_FORMATTED_HTML
+ true
+
+
+ offline_installer_type
+ <font color=dimgray size=2><b>Choose the type of installer you wanted to build</b></font>
+
+
+ windows64bit
+ linux64bit
+ windows32bit
+
+
+
+
+ artifact_source
+ <font color=dimgray size=2><b>
+ArtifactRepo - Download the artifact from azure blob, JenkinsJob - Use the atrifact from Jenkins job.</b></font>
+ choice-parameter-1754928650096303
+ 1
+
+ false
+
+
+
+ false
+
+
+ offlineInstaller
+ Deploy/dev/Core/offlineInstaller
+
+
+ PT_SINGLE_SELECT
+ false
+ 1
+
+
+ build_number
+
+ choice-parameter-1754928651800681
+ 1
+
+ false
+
+
+
+ false
+
+
+ offlineInstaller
+ Deploy/dev/Core/offlineInstaller
+
+ artifact_source
+ ET_FORMATTED_HTML
+ true
+
+
+ artifact_version
+
+ choice-parameter-1754928653885653
+ 1
+
+ false
+
+
+
+ false
+
+
+ offlineInstaller
+ Deploy/dev/Core/offlineInstaller
+
+ artifact_source
+ ET_FORMATTED_HTML
+ true
+
+
+
+
+ 0
+ 0
+
+ false
+ project
+ false
+
+
+
+
+
+
+
+ ArtifactUpload/dev/Core/OfflineInstaller
+
+ SUCCESS
+ 0
+ BLUE
+ true
+
+
+
+
+
+
+
+ 2
+
+
+ https://github.com/project-sunbird/sunbird-devops.git
+
+
+
+
+ ${branch_or_tag}
+
+
+ false
+
+
+
+ true
+ false
+
+ 1
+ false
+
+
+
+ pipelines/offlineinstaller/Jenkinsfile
+ false
+
+
+ false
+
diff --git a/deploy/jenkins/jobs/Deploy/jobs/dev/jobs/Core/jobs/UploadDesktopFaq/config.xml b/deploy/jenkins/jobs/Deploy/jobs/dev/jobs/Core/jobs/UploadDesktopFaq/config.xml
new file mode 100644
index 000000000..69ec6f249
--- /dev/null
+++ b/deploy/jenkins/jobs/Deploy/jobs/dev/jobs/Core/jobs/UploadDesktopFaq/config.xml
@@ -0,0 +1,156 @@
+
+
+
+ false
+
+
+
+ -1
+ -1
+ -1
+ 5
+
+
+
+
+ false
+ false
+
+
+
+
+ private_branch
+
+ choice-parameter-2544395024638227
+ 1
+
+ false
+
+
+
+ false
+
+
+ UploadDesktopFaq
+ Deploy/dev/Core/UploadDesktopFaq
+
+
+ ET_FORMATTED_HTML
+ true
+
+
+ branch_or_tag
+
+ choice-parameter-2620434998790477
+ 1
+
+ false
+
+
+
+ false
+
+
+ UploadDesktopFaq
+ Deploy/dev/Core/UploadDesktopFaq
+
+
+ ET_FORMATTED_HTML
+ true
+
+
+ desktop_container
+
+
+
+ public
+
+
+
+
+ destination_path
+
+
+
+ desktopFAQ/faq-en.json
+
+
+
+
+ tag
+
+
+
+ upload-desktop-faq
+
+
+
+
+ src_file_path
+
+
+
+ utils/DesktopFAQ/faq-en.json
+
+
+
+
+
+
+ 0
+ 0
+
+ false
+ project
+ false
+
+
+
+
+
+
+
+
+
+ 2
+
+
+ https://github.com/project-sunbird/sunbird-devops.git
+
+
+
+
+ ${branch_or_tag}
+
+
+ false
+
+
+
+ true
+ false
+
+ 0
+ false
+
+
+
+ pipelines/deploy/desktop-faq/Jenkinsfile
+ false
+
+
+ false
+
diff --git a/deploy/jenkins/jobs/Deploy/jobs/dev/jobs/Core/jobs/UploadPortalLabel/config.xml b/deploy/jenkins/jobs/Deploy/jobs/dev/jobs/Core/jobs/UploadPortalLabel/config.xml
new file mode 100644
index 000000000..6c02e23d5
--- /dev/null
+++ b/deploy/jenkins/jobs/Deploy/jobs/dev/jobs/Core/jobs/UploadPortalLabel/config.xml
@@ -0,0 +1,189 @@
+
+
+
+ false
+
+
+
+ -1
+ -1
+ -1
+ 5
+
+
+
+
+ false
+ false
+
+
+
+
+ private_branch
+
+ choice-parameter-2544395024638227
+ 1
+
+ false
+
+
+
+ false
+
+
+ UploadPortalLabel
+ Deploy/dev/Core/UploadPortalLabel
+
+
+ ET_FORMATTED_HTML
+ true
+
+
+ branch_or_tag
+
+ choice-parameter-2620434998790477
+ 1
+
+ false
+
+
+
+ false
+
+
+ UploadPortalLabel
+ Deploy/dev/Core/UploadPortalLabel
+
+
+ ET_FORMATTED_HTML
+ true
+
+
+ desktop_container
+
+
+
+ label
+
+
+
+
+ destination_path
+
+
+
+ all_labels_ta.json
+ all_labels_bn.json
+ all_labels_en.json
+ all_labels_hi.json
+ all_labels_kn.json
+ all_labels_mr.json
+ all_labels_te.json
+ all_labels_ur.json
+ all_labels_gu.json
+ all_labels_ml.json
+ all_labels_as.json
+ all_labels_or.json
+
+
+
+
+ src_file_path
+
+
+
+ utils/portal/labels/all_labels_ta.json
+ utils/portal/labels/all_labels_bn.json
+ utils/portal/labels/all_labels_en.json
+ utils/portal/labels/all_labels_hi.json
+ utils/portal/labels/all_labels_kn.json
+ utils/portal/labels/all_labels_mr.json
+ utils/portal/labels/all_labels_te.json
+ utils/portal/labels/all_labels_ur.json
+ utils/portal/labels/all_labels_gu.json
+ utils/portal/labels/all_labels_ml.json
+ utils/portal/labels/all_labels_as.json
+ utils/portal/labels/all_labels_or.json
+
+
+
+
+ tag
+
+
+
+ upload-label
+
+
+
+
+
+
+ 0
+ 0
+
+ false
+ project
+ false
+
+
+
+
+
+
+
+
+
+ SUCCESS
+ 0
+ BLUE
+ true
+
+
+
+
+
+
+
+ 2
+
+
+ https://github.com/project-sunbird/sunbird-devops.git
+
+
+
+
+ release-3.5.0
+
+
+ false
+
+
+
+ true
+ false
+
+ 0
+ false
+
+
+
+ pipelines/deploy/desktop-faq/Jenkinsfile
+ false
+
+
+ false
+
From 2ed36d487b438cb476f3252d3cf712ad303b71c0 Mon Sep 17 00:00:00 2001
From: harishkumar gangula
Date: Fri, 11 Dec 2020 12:45:17 +0530
Subject: [PATCH 065/184] Issue #SB-21202 feat: Add all language faqs
---
utils/DesktopFAQ/faq-as.json | 68 ++++++++++++++++++++++++++++++++++++
utils/DesktopFAQ/faq-bn.json | 68 ++++++++++++++++++++++++++++++++++++
utils/DesktopFAQ/faq-en.json | 4 +--
utils/DesktopFAQ/faq-gu.json | 68 ++++++++++++++++++++++++++++++++++++
utils/DesktopFAQ/faq-hi.json | 68 ++++++++++++++++++++++++++++++++++++
utils/DesktopFAQ/faq-kn.json | 68 ++++++++++++++++++++++++++++++++++++
utils/DesktopFAQ/faq-ml.json | 68 ++++++++++++++++++++++++++++++++++++
utils/DesktopFAQ/faq-mr.json | 68 ++++++++++++++++++++++++++++++++++++
utils/DesktopFAQ/faq-or.json | 68 ++++++++++++++++++++++++++++++++++++
utils/DesktopFAQ/faq-pa.json | 68 ++++++++++++++++++++++++++++++++++++
utils/DesktopFAQ/faq-ta.json | 68 ++++++++++++++++++++++++++++++++++++
utils/DesktopFAQ/faq-te.json | 68 ++++++++++++++++++++++++++++++++++++
utils/DesktopFAQ/faq-ur.json | 68 ++++++++++++++++++++++++++++++++++++
13 files changed, 818 insertions(+), 2 deletions(-)
create mode 100644 utils/DesktopFAQ/faq-as.json
create mode 100644 utils/DesktopFAQ/faq-bn.json
create mode 100644 utils/DesktopFAQ/faq-gu.json
create mode 100644 utils/DesktopFAQ/faq-hi.json
create mode 100644 utils/DesktopFAQ/faq-kn.json
create mode 100644 utils/DesktopFAQ/faq-ml.json
create mode 100644 utils/DesktopFAQ/faq-mr.json
create mode 100644 utils/DesktopFAQ/faq-or.json
create mode 100644 utils/DesktopFAQ/faq-pa.json
create mode 100644 utils/DesktopFAQ/faq-ta.json
create mode 100644 utils/DesktopFAQ/faq-te.json
create mode 100644 utils/DesktopFAQ/faq-ur.json
diff --git a/utils/DesktopFAQ/faq-as.json b/utils/DesktopFAQ/faq-as.json
new file mode 100644
index 000000000..243f8c5a4
--- /dev/null
+++ b/utils/DesktopFAQ/faq-as.json
@@ -0,0 +1,68 @@
+{
+ "faqs": [
+ {
+ "topic": "মই মোৰ ব'ৰ্ড, মাধ্যম, শ্ৰেণী আৰু বিষয় চাব পৰা নাই",
+ "description": "আপোনাৰ ৰাজ্যই বৰ্তমান সকলো ব’ৰ্ড, মাধ্যম, শ্ৰেণী আৰু বিষয় সমৰ্থন নকৰে। আপোনাৰ ৰাজ্যই এইসমূহ যোগ কৰাৰ লগে লগেই, আপুনি তালিকা খনত এয়া দেখা পাব।"
+ },
+ {
+ "topic": "মই বিষয়বস্তু ডাউনল’ড কৰিলোঁ, কিন্তু মই এয়া চলাব পৰা নাই কাৰণ ইয়াত কোৱা হৈছে যে মোক ইণ্টাৰনেটৰ প্ৰয়োজন ",
+ "description": "আপুনি ইউটিউব কনটেণ্ট নিশ্চয় ডাউনল’ড কৰিলে। ইউটিউব কনটেণ্ট আপুনি কেৱল অনলাইন হৈ থকা অৱস্থাতহে চলাব পাৰিব। কম্পিউটাৰটো ইণ্টাৰনেটৰ সৈতে সংযোগ কৰক আৰু পুনৰ চেষ্টা কৰক।"
+ },
+ {
+ "topic": "মই মোৰ DIKSHA ডেস্কটপ এপটো আপডেট কৰাৰ প্ৰয়োজন হৈছে",
+ "description": "আপোনাৰ কম্পিউটাৰটো ইণ্টাৰনেটৰ সৈতে সংযোগ কৰক আৰু শেহতীয়া এপ সংস্কৰণৰ বাবে https://staging.sunbirded.org/desktop/latest পৰীক্ষা কৰক"
+ },
+ {
+ "topic": "ইণ্টাৰনেট সংযোগ থকা লেপটপৰ সৈতে মোৰ প্ৰৱেশাধিকাৰ নাই, কিন্তু মই ডেস্কটপ এপত বিষয়বস্তু যোগ দিব আৰু আপডেট কৰিব বিচাৰোঁ",
+ "description": "যদি আপোনাৰ এটা ম’বাইল ফোন আছে, তেন্তে গুগল প্লে’ষ্ট’ৰৰ পৰা DIKSHA ম’বাইল এপটো ডাউনল’ড কৰক।\nএপটোত বিষয়বস্তুৰ বাবে ব্ৰাউজ কৰক।\nDIKSHA লাইব্ৰেৰীৰ পৰা বিষয়বস্তু ডাউনল’ড কৰক।\nএয়া এটা পে’নড্ৰাইভ বা SD কাৰ্ডলৈ ক’পি কৰক আৰু ইয়াক DIKSHA ডেস্কটপ এপত আপল’ড কৰক।"
+ },
+ {
+ "topic": "মই এটা বিশেষ বিষয়ৰ বাবে বিষয়বস্তু বিচাৰি পোৱা নাই, নতুবা মই অপ্ৰাসংগিক বিষয়বস্তু বিচাৰি পাইছোঁ",
+ "description": "বিষয়বস্তুৰ সন্ধান কৰিবলৈ DIKSHAৰ অনলাইন লাইব্ৰেৰী ব্ৰাউজ কৰক। তেতিয়াও যদি এয়া উপলব্ধ নোহোৱাকৈ থাকে, তেন্তে বিষয়বস্তু সম্পৰ্কে আপোনাৰ মতামত ৰাজ্যিক SCERTলৈ প্ৰেৰণ কৰক"
+ },
+ {
+ "topic": "এপটো বৰ লেহেমীয়া গতিৰ",
+ "description": "এপটোৰ কাৰ্যকাৰিতা দ্ৰুত কৰিবলৈ, নিম্নোক্তসমূহ কৰক:\n আপোনাৰ কম্পিউটাৰৰ ছিষ্টেম কনফিগাৰেচনলৈ যাওক। ন্যূনতম কনফিগাৰেচন হ’ব লাগে:\n2 GB RAM 2 GB RAM \nডুৱেল ক’ৰ প্ৰচেছৰ \n যদিহে আপোনাৰ কম্পিউটাৰ এই কনফিগাৰেচনৰ সৈতে মিলে বা অতিক্ৰম কৰে, এপটো পুনৰ আৰম্ভ কৰক।\n এইটো কৰাৰ পাছত, যদিহে তেতিয়াও ই মন্থৰ হৈ থাকে তেতিয়া Task Manager লৈ যাওক,\nসকলো অব্যৱহৃত বেকগ্ৰাউণ্ড প্ৰক্ৰিয়া বাছনি কৰক আৰু End Task ত ক্লিক কৰক"
+ },
+ {
+ "topic": "মই পে’নড্ৰাইভলৈ বিষয়বস্তু ক’পি কৰিব পৰা নাই",
+ "description": "বিষয়বস্তুটো পে’ন ড্ৰাইভলৈ ক’পি কৰিবলৈ, তলত দিয়াবোৰ কৰক:\nকম্পিউটাৰৰ চেটিংছলৈ যাওক। USB ড্ৰাইভটো ৰাইট কৰাৰ বাবে সুৰক্ষিত হয়নে নহয় পৰীক্ষা কৰক। যদিহে হয়, সুৰক্ষা নিষ্ক্ৰিয় কৰক \nপে’ন ড্ৰাইভটোত খালি ঠাই আছেনে নাই পৰীক্ষা কৰক। পে’ন ড্ৰাইভটোৰ পৰা অদৰকাৰী ফাইলবোৰ ডিলিট কৰক "
+ },
+ {
+ "topic": "মই পে’নড্ৰাইভত বিষয়বস্তু ভৰালোঁ, কিন্তু এতিয়া মই দেখিছোঁ যে এইটো খালি হৈ আছে",
+ "description": "আপোনাৰ পে’ন ড্ৰাইভ বা কম্পিউটাৰ ভাইৰাছৰদ্বাৰা আক্ৰান্ত হ’ব পাৰে। এয়া পৰীক্ষা কৰক:\n* আপোনাৰ মেচিনত এটা এণ্টি ভাইৰাছ ছফটৱেৰ ইনষ্টল হৈ আছে\n* অচিনাকী মেচিনত আপুনি সংযুক্ত কৰাৰ আগতে আপোনাৰ পে’নড্ৰাইভটো ৰাইট কৰাৰ বাবে সুৰক্ষিত হ’ব লাগিব"
+ },
+ {
+ "topic": "মোৰ পে’নড্ৰাইভলৈ বা পে’নড্ৰাইভৰ পৰা বিষয়বস্তু ক’পি কৰোঁতে সময় লাগে",
+ "description": "ক’পি কৰিবলৈ লগা সময় বিষয়বস্তুটোৰ ফাইলৰ আকাৰৰ ওপৰত নিৰ্ভৰ কৰে। কিছুমান বৃহৎ আকাৰৰ পাঠ্যপুথি ক’পি কৰোঁতে সময় লাগে। আমি পৰামৰ্শ দিও যে আপুনি প্ৰক্ৰিয়াটো মাজতে বন্ধ কৰি নিদিব। এনে কৰাৰ ফলত ফাইলবোৰ সংগতিহীন হৈ পৰিব। "
+ },
+ {
+ "topic": "DIKSHAৰ বিষয়বস্তুৰ বাবে মোৰ কম্পিউটাৰত কোনো খালি ঠাই নাই",
+ "description": "আপোনাৰ কম্পিউটাৰত ঠাই খালি কৰিবলৈ এপটোৰ মাই ডাউনল’ডছ্ টেবটোৰ পৰা ডাউনল’ড হৈ থকা বিষয়বস্তু ডিলিট কৰক"
+ },
+ {
+ "topic": "মোৰ উবান্তু ছিষ্টেমত DIKSHA ডেস্কটপ এপ্লিকেশ্বন ইনষ্টল কৰিব পৰা নাই",
+ "description": "আপোনাৰ উবান্তু ছিষ্টেমত DIKSHA ডেস্কটপ এপ্লিকেশ্বন ইনষ্টল কৰিবলৈ:
\n1) আপোনাৰ টাৰ্মিনেল খোলক
\n2) exe ফাইলটো য’ত ডাউনল’ড হৈছে তাত নামপঞ্জী সলনি কৰিবলৈ cd নিৰ্দেশটো চলাওক। উদাহৰণস্বৰূপে, যদি exe ডাউনল’ড ফ’ল্ডাৰত ছে’ভ হৈ আছে, তেন্তে cd Downloads নিৰ্দেশটো চলাওক
\n3) sudo dpkg -i নিৰ্দেশটো চলাওক
\nএই নিৰ্দেশটো সফলতাৰে চলালে এপ্লিকেশ্বনটো আৰম্ভ হয়
"
+ }
+ ],
+ "constants": {
+ "charactersLeft": "থাকি যোৱা আখৰসমূহ",
+ "explainMsg": "অসুবিধাটো বৰ্ণনা কৰিব পাৰিবনে ?",
+ "faqMsg": "সঘনাই সোধা প্ৰশ্নসমূহ",
+ "help": "সহায়",
+ "helpMsg": "এই উত্তৰটোৱে আপোনাক সহায় কৰিলেনে ?",
+ "initiateEmailButton": "ইমেইল আৰম্ভ কৰক",
+ "knowMoreMsg": "আপুনি আৰু কিবা জানিব খুজিছে?",
+ "noMsg": "নহয়",
+ "reportIssue": "সমস্যা এটা উত্থাপন কৰক",
+ "reportIssueMsg": "অন্য এটা সমস্যা উত্থাপন কৰক",
+ "resolveMsg": "আপোনাৰ অসুবিধাটো সমাধান কৰিবলৈ তালিকাখন চাওক",
+ "sorryMsg": "সেইটোৰ বাবে দুঃখিত!",
+ "submitButton": "প্ৰদান কৰক",
+ "tellMoreMsg": "আপুনি সন্মুখীন হোৱা অসুবিধাটোৰ বিষয়ে আমাক অলপ বেছিকৈ জনাওক",
+ "thanksMsg": "আপোনাৰ সঁহাৰিৰ বাবে ধন্যবাদ !",
+ "triggerEmailMsg": "আপুনি টেক্সট্ বক্সত সবিশেষ যোগ দিয়া আৰু ইমেইল যোগাযোগৰ সুচনা আৰম্ভ কৰা বাটনত টিপাৰ পাছত, আমি আপোনাৰ হৈ এখন ইমেইল পঠাম। আপুনি তাত অধিক সবিশেষ যোগ দিব আৰু / বা ফাইল সংলগ্ন কৰিব পাৰিব।",
+ "typeHere": "ইয়াত লিখক...",
+ "yesMsg": "হয়"
+ }
+}
\ No newline at end of file
diff --git a/utils/DesktopFAQ/faq-bn.json b/utils/DesktopFAQ/faq-bn.json
new file mode 100644
index 000000000..9bf1afd2e
--- /dev/null
+++ b/utils/DesktopFAQ/faq-bn.json
@@ -0,0 +1,68 @@
+{
+ "faqs": [
+ {
+ "topic": "আমি আমার বোর্ড, মিডিয়াম বা মাধ্যম, ক্লাস ও বিষয় দেখতে পাচ্ছি না",
+ "description": "আপনার রাজ্য বর্তমানে সবধরনের বোর্ড, মিডিয়াম, ক্লাস ও বিষয়গুলি পড়ানোর সুযোগ প্রদান করছে না। যত তাড়াতাড়ি আপনার রাজ্য সেগুলি অন্তর্ভুক্ত করবে সেই অনুযায়ী আপনি সেগুলি তালিকায় দেখতে পাবেন।"
+ },
+ {
+ "topic": "আমি বিষয়বস্তুটি ডাউনলোড করেছি, কিন্তু আমি এটি চালু করতে পারছি না কারণ এখানে বলা হচ্ছে আমার ইন্টারনেট সংযোগ থাকা প্রয়োজন",
+ "description": "আপনি YouTube-এর বিষয়বস্তু ডাউনলোড করে থাকতে পারেন। শুধুমাত্র অনলাইন থাকার সময় আপনি YouTube-এর বিষয়বস্তু চালাতে পারবেন। আপনার কম্পিউটারটি ইন্টারনেটের সাথে যুক্ত করে আবার চেষ্টা করুন।"
+ },
+ {
+ "topic": "আমার DIKSHA ডেস্কটপ অ্যাপটি আপডেট করা প্রয়োজন",
+ "description": "আপনার কম্পিউটারটি ইন্টারনেটের সঙ্গে যুক্ত করুন ও সাম্প্রতিকতম অ্যাপ সংস্করণটির জন্য https://staging.sunbirded.org/desktop/latest চেক করুন"
+ },
+ {
+ "topic": "ইন্টারনেট সংযোগ সহ কোনও ল্যাপটপে আমার অ্যাকসেস নেই, কিন্তু আমার ডেস্কটপ অ্যাপে আমি বিষয়বস্তু যোগ করতে বা আপডেট করতে চাই",
+ "description": "যদি আপনার কোনো মোবাইল ফোন থাকে তবে DIKSHA মোবাইল অ্যাপটি google playstore থেকে ডাউনলোড করুন।\nঅ্যাপটির মধ্যে বিষয়বস্তুটি ব্রাউজ করুন।\nবিষয়বস্তুটি DIKSHA লাইব্রেরী থেকে ডাউনলোড করুন।\nএটিকে কোনও পেনড্রাইভ বা SD কার্ডে কপি করুন ও DIKSHA ডেস্কটপ অ্যাপে সেটি আপলোড করুন।"
+ },
+ {
+ "topic": "আমি একটি নির্দিষ্ট প্রসঙ্গের ওপর বিষয়বস্তু খুঁজে পাচ্ছি না, অথবা আমি দেখছি বিষয়বস্তুটি অপ্রাসঙ্গিক",
+ "description": "নির্দিষ্ট বিষয়বস্তু খুঁজে পেতে DIKSHA-এর অনলাইন লাইব্রেরীতে ব্রাউজ করুন। যদি তারপরেও আপনি খুঁজে না পান তবে বিষয়বস্তু সম্পর্কে আপনার ফিডব্যাক বা প্রতিক্রিয়া রাজ্য SCERT-এর কাছে পাঠান"
+ },
+ {
+ "topic": "এই অ্যাপটি খুবই ধীরে কাজ করে",
+ "description": "অ্যাপটির কার্যক্ষমতার গতি বৃদ্ধি করতে, নিম্নলিখিত পদ্ধতিটি অনুসরণ করুন:\n আপনার কম্পিউটারের সিস্টেম কনফিগারেশনে যান। নূন্যতম কনফিগারেশন হওয়া প্রয়োজন:\n2 GB RAM \nডুয়েল কোর প্রসেসর \n যদি আপনার কম্পিউটারে এই বা এর থেকে উন্নত কনফিগারেশন থাকে তবে অ্যাপটি রিস্টার্ট করুন।\n এটি করার পরেও, যদি অ্যাপটি ধীরে কাজ করে তবে টাস্ক ম্যানেজারে যান, সব অব্যবহৃত ব্যাকগ্রাউন্ড প্রসেসগুলি নির্বাচন করুন ও এন্ড টাস্কে ক্লিক করুন"
+ },
+ {
+ "topic": "আমি একটি পেনড্রাইভে বিষয়বস্তু কপি করতে পারছি না",
+ "description": "একটি পেন ড্রাইভে কোনও বিষয়বস্তু কপি করার জন্য নিম্নলিখিত পদ্ধতিটি অনুসরণ করুন:\nআপনার কম্পিউটার সেটিংসে যান। USB ড্রাইভটি রাইট-প্রোটেক্টেড কিনা সেটি চেক করুন। যদি রাইট-প্রোটেক্টেড হয়, প্রোটেকশনটি নিষ্ক্রিয় করুন \nপেন ড্রাইভটিতে খালি জায়গা আছে কিনা তা চেক করুন। পেন ড্রাইভ থেকে অপ্রয়োজনীয় ফাইলগুলি ডিলিট করুন "
+ },
+ {
+ "topic": "আমার পেনড্রাইভে আমি বিষয়বস্তু লোড করেছিলাম, কিন্তু এখন দেখছি সেটি খালি",
+ "description": "আপনার কম্পিউটার বা পেনড্রাইভটিতে ভাইরাস থাকতে পারে, চেক করুন যে:\n\n*আপনার কম্পিউটারে কোনও অ্যান্টি ভাইরাস সফ্টওয়্যার ইনস্টল করা আছে কিনা\n*কোনও অজানা কম্পিউটারে লাগানোর আগে আপনার পেনড্রাইভটি রাইট-প্রোটেক্টেড করা আছে কিনা"
+ },
+ {
+ "topic": "আমার পেনড্রাইভ থেকে ও সেটিতে বিষয়বস্তু কপি হতে সময় লাগছে",
+ "description": "ফাইলটির আকারের ওপর নির্ভর করে যে ফাইলটি কপি হতে কত সময় লাগবে। বড় টেক্সটবুকগুলি কপি হতে বেশি সময় লাগে। আমরা সুপারিশ করব প্রক্রিয়াটি চলাকালীন মাঝপথে সেটি বন্ধ করবেন না। সেটি করলে কপি হওয়া ফাইলটিতে ত্রুটি থেকে যেতে পারে।"
+ },
+ {
+ "topic": "DIKSHA-এর বিষয়বস্তু রাখার কারণে আমার কম্পিউটারে খালি জায়গা নেই।",
+ "description": "ডাউনলোড করা বিষয়বস্তু অ্যাপটির মাই ডাউনলোড ট্যাব থেকে ডিলিট করে আপনার কম্পিউটারে জায়গা খালি করুন।"
+ },
+ {
+ "topic": "আমার উবানটু সিস্টেমে DIKSHA ডেস্কটপ অ্যাপটি ইনস্টল করা যাচ্ছে না",
+ "description": "আপনার উবান্টু সিস্টেমে DIKSHA ডেস্কটপ অ্যাপ্লিকেশন ইনস্টল করতে:
\n1) আপনার টার্মিনালটি খুলুন
\n2) যেখানে এক্সটেনসন ফাইলটি ডাউনলোড করা হয়েছে সেখানে ডিরেক্টরিটি পরিবর্তন করতে কম্যান্ডটি cd টাইপ করে চালু করুন। উদাহরণস্বরূপ, যদি এক্সটেনসন ফাইলটি ডাউনলোড ফোল্ডারে সংরক্ষণ করা থাকে, তবে কম্যান্ডটি cd Download টাইপ করে চালু করুন
\n3) sudo dpkg -i টাইপ করে কম্যান্ডটি চালু করুন
\nএই কম্যান্ডটি সফলভাবে চালু হওয়াতে অ্যাপ্লিকেশনটি চালু হয়েছে
"
+ }
+ ],
+ "constants": {
+ "charactersLeft": "অক্ষর বাকি",
+ "explainMsg": "আপনি কি সমস্যা টি ব্যাখ্যা করতে পারবেন?",
+ "faqMsg": "সচরাচর জিজ্ঞাস্য",
+ "help": "সাহায্য ",
+ "helpMsg": "এই উত্তরটি আপনাকে সাহায্য করেছিল?",
+ "initiateEmailButton": "ইমেইল পাঠান\n",
+ "knowMoreMsg": "আপনি আর কি জানতে চান?",
+ "noMsg": "না",
+ "reportIssue": "সমস্যা রিপোর্ট করুন",
+ "reportIssueMsg": "অন্যান্য সমস্যা গুলি রিপোর্ট করুন",
+ "resolveMsg": "আপনার সমস্যা সমাধানের জন্য তালিকা টি দেখুন",
+ "sorryMsg": "এর জন্যে দুঃখিত!",
+ "submitButton": "জমা দিন",
+ "tellMoreMsg": "আপনি যে সমস্যার সম্মুখীন হয়েছেন তার সম্পর্কে আমাদের আরো বলুন",
+ "thanksMsg": "আপনার প্রতিক্রিয়ার জন্য ধন্যবাদ!",
+ "triggerEmailMsg": "আপনি টেক্সট বাক্সে বিশদ যুক্ত করার পরে, ইনিশিয়েটিভ ইমেল বোতামটি তে ক্লিক করুন, আমরা আপনার হয়ে একটি ইমেল ট্রিগার করব। আপনি আরও বিস্তারিত যোগ করতে পারেন এবং/ অথবা সংযুক্ত ফাইল যোগ করতে পারেন",
+ "typeHere": "এখানে লিখুন...",
+ "yesMsg": "হ্যাঁ "
+ }
+}
\ No newline at end of file
diff --git a/utils/DesktopFAQ/faq-en.json b/utils/DesktopFAQ/faq-en.json
index e5b3bbdb6..413c849e6 100644
--- a/utils/DesktopFAQ/faq-en.json
+++ b/utils/DesktopFAQ/faq-en.json
@@ -10,7 +10,7 @@
},
{
"topic": "I need to update my DIKSHA desktop app",
- "description": "Connect your computer to the Internet and check https://diksha.gov.in/desktop/latest for the latest app version "
+ "description": "Connect your computer to the Internet and check https://staging.sunbirded.org/desktop/latest for the latest app version "
},
{
"topic": "I do not have access to a laptop with an Internet connection, but I want to add or update content on the desktop app",
@@ -65,4 +65,4 @@
"typeHere": "Type Here...",
"yesMsg": "Yes"
}
-}
+}
\ No newline at end of file
diff --git a/utils/DesktopFAQ/faq-gu.json b/utils/DesktopFAQ/faq-gu.json
new file mode 100644
index 000000000..9410f95a4
--- /dev/null
+++ b/utils/DesktopFAQ/faq-gu.json
@@ -0,0 +1,68 @@
+{
+ "faqs": [
+ {
+ "topic": "હું મારું બોર્ડ, માધ્યમ, વર્ગ અને વિષય જોઈ શકતો નથી",
+ "description": "તમારું રાજ્ય હાલમાં બધા બોર્ડ, માધ્યમો, વર્ગો અને વિષયોને સપોર્ટ કરતું નથી. જલદી તમારું રાજ્ય તેમને ઉમેરશે, તમે તેને સૂચિમાં જોશો"
+ },
+ {
+ "topic": "મેં કન્ટેન્ટ ડાઉનલોડ કરું છે, પરંતુ હું તે ચલાવવામાં અસમર્થ છું કારણ કે તે કહે છે કે મને ઇન્ટરનેટની જરૂર છે",
+ "description": "તમે યુટ્યુબ કન્ટેન્ટ ડાઉનલોડ કરી હશે. તમે ઓનલાઇન હોવ ત્યારે જ તમે યુટ્યુબ સામગ્રી ચલાવી શકો છો. કમ્પ્યુટરને ઇન્ટરનેટથી કનેક્ટ કરો ફરીથી પ્રયાસ કરો."
+ },
+ {
+ "topic": "મારે મારી DIKSHA ડેસ્કટોપ એપ્લિકેશનને અપડેટ કરવાની જરૂર છે",
+ "description": "તમારા કમ્પ્યુટરને ઇન્ટરનેટથી કનેક્ટ કરો અને નવીનતમ એપ્લિકેશન સંસ્કરણ માટે https://staging.sunbirded.org/desktop/latest તપાસો.\n"
+ },
+ {
+ "topic": "મને ઇન્ટરનેટ કનેક્શનવાળા લેપટોપની ઍક્સેસ નથી, પરંતુ હું ડેસ્કટોપ એપ્લિકેશન પર સામગ્રી ઉમેરવા અથવા અપડેટ કરવા માંગું છું",
+ "description": "જો તમારી પાસે મોબાઈલ ફોન છે, તો ગૂગલ પ્લે સ્ટોર પરથી DIKSHA મોબાઇલ એપ્લિકેશન ડાઉનલોડ કરો. એપ્લિકેશનમાંની સામગ્રી માટે બ્રાઉઝ કરો. DIKSHA લાઇબ્રેરીમાંથી સામગ્રી ડાઉનલોડ કરો. તેને પેનડ્રાઇવ અથવા એસડી કાર્ડ પર કોપી કરો અને તેને DIKSHA ડેસ્કટોપ એપ્લિકેશન પર અપલોડ કરો."
+ },
+ {
+ "topic": "મને કોઈ ખાસ વિષય માટે સામગ્રી મળી નથી, અથવા મને સામગ્રી અપ્રસ્તુત લાગે છે\n",
+ "description": "કન્ટેન્ટ શોધવા માટે DIKSHAની ઓનલાઇન લાઇબ્રેરી બ્રાઉઝ કરો. જો તે હજી અનુપલબ્ધ છે, તો કન્ટેન્ટ વિશેનો પ્રતિસાદ રાજ્ય SCERTને મોકલો"
+ },
+ {
+ "topic": "એપ્લિકેશન ખૂબ ધીમી છે",
+ "description": "એપ્લિકેશન પ્રદર્શનને ઝડપી બનાવવા માટે, નીચે આપેલા કાર્યો કરો: તમારા કમ્પ્યુટરની સિસ્ટમ ગોઠવણી પર જાઓ. લઘુત્તમ ગોઠવણી આ હોવી જોઈએ: \n\n 2 જીબી રેમ \n ડ્યુઅલ કોર પ્રોસેસર \n \n જો તમારું કમ્પ્યુટર આ ગોઠવણીથી મેળ ખાય છે અથવા ઓળંગાઈ ગયું છે, તો એપ્લિકેશનને ફરીથી પ્રારંભ કરો. \n આ કર્યા પછી, જો તે હજી ધીમું છે, તો ટાસ્ક મેનેજર પર જાઓ, બધી ન વપરાયેલી પૃષ્ઠભૂમિ પ્રક્રિયાઓ પસંદ કરો અને કાર્ય સમાપ્ત કરો ક્લિક કરો."
+ },
+ {
+ "topic": "હું પેનડ્રાઇવ પર કન્ટેન્ટની કોપી કરવામાં અસમર્થ છું",
+ "description": "પેન ડ્રાઇવ પરની સામગ્રીની કોપી કરવા માટે, નીચેની વિગતો કરો: \n\n તમારા કમ્પ્યુટર સેટિંગ્સ પર જાઓ. યુએસબી ડ્રાઇવ લખવા સુરક્ષિત છે કે કેમ તે તપાસો. જો તે છે, તો સુરક્ષાને બંધ કરો \n પેન ડ્રાઇવમાં ખાલી જગ્યા છે કે કેમ તે તપાસો. પેનડ્રાઈવેમાં જે ફાઇલો જરૂરી નથી તેને કાઢી નાખો \n "
+ },
+ {
+ "topic": "મારી પેનડ્રાઈવ પર મેં કન્ટેન્ટ લોડ કરી હતી, પરંતુ હવે હું જોઉં છું કે તે ખાલી છે",
+ "description": "તમારું પેનડ્રાઇવ અથવા કમ્પ્યુટર વાયરસથી ચેપ લાગ્યું છે. તે તપાસો:\n * તમારી પાસે તમારા મશીન પર એન્ટી વાયરસ સોફ્ટવેર ઇન્સ્ટોલ કરેલું છે .\n* તમારા પેનડ્રાઇવને તમે અજાણ્યા મશીનોમાં પ્લગ કરતાં પહેલાં તે લખાણ સુરક્ષિત છે."
+ },
+ {
+ "topic": "મારા પેનડ્રાઇવ પર અને તેની કન્ટેન્ટની કોપી કરવામાં સમય લાગે છે",
+ "description": "કોપી કરવા માટે લેવાયેલ સમય સામગ્રી ફાઇલના કદ પર આધારિત છે. કેટલાક મોટા પાઠયપુસ્તકોની કોપી કરવામાં સમય લે છે. અમે ભલામણ કરીએ છીએ કે તમે પ્રક્રિયા વચ્ચે ન રોકો. આમ કરવાથી અસંગત ફાઇલો થઈ શકે છે."
+ },
+ {
+ "topic": "DIKSHA સામગ્રીને કારણે મારા કમ્પ્યુટર પાસે કોઈ ખાલી જગ્યા નથી",
+ "description": "તમારા કમ્પ્યુટર પર જગ્યા ખાલી કરવા માટે એપ્લિકેશનના મારા ડાઉનલોડ ટેબ પરથી ડાઉનલોડ કરેલી સામગ્રી ડીલીટ નાખો"
+ },
+ {
+ "topic": "મારી ઉબુન્ટુ સિસ્ટમ પર DIKSHA ડેસ્કટોપ એપ્લિકેશન ઇન્સ્ટોલ કરવામાં અસમર્થ",
+ "description": " તમારી ઉબુન્ટુ સિસ્ટમ પર DIKSHA ડેસ્કટોપ એપ્લિકેશનને ઇન્સ્ટોલ કરવા માટે:
\n 1) તમારું ટર્મિનલ ખોલો
\n 2) ડિરેક્ટરીને બદલવા માટે cd આદેશ ચલાવો જ્યાં એક્સેપ્ ફાઇલ ડાઉનલોડ થયેલ છે. ઉદાહરણ તરીકે, જો એક્સેલ ડાઉનલોડ્સ ફોલ્ડરમાં સાચવવામાં આવે છે, તો પછી સીડી ડાઉનલોડ્સ આદેશ ચલાવો
\n 3) sudo dpkg -i
\n આ આદેશ સફળતાપૂર્વક ચલાવવા પર એપ્લિકેશન શરૂ થઈ છે
"
+ }
+ ],
+ "constants": {
+ "charactersLeft": "અક્ષરો બાકી છે.",
+ "explainMsg": "શું તમે સમસ્યા સમજાવી શકો છો?",
+ "faqMsg": "વારંવાર પૂછાતા પ્રશ્નો",
+ "help": "મદદ કરો",
+ "helpMsg": "શું આ જવાબ તમને મદદ કરશે?",
+ "initiateEmailButton": "ઇમેઇલ શરૂ કરો",
+ "knowMoreMsg": " શું તમે વધુ માહિતી જાણવા માંગો છો?",
+ "noMsg": "ના",
+ "reportIssue": "સમસ્યાની જાણ કરો.",
+ "reportIssueMsg": "અન્ય સમસ્યાની જાણ કરો.",
+ "resolveMsg": "તમારી સમસ્યાનું નિરાકરણ લાવવા યાદી જુઓ",
+ "sorryMsg": "તે વિશે માફ કરશો!",
+ "submitButton": "સબમિટ કરો",
+ "tellMoreMsg": "તમે જે સમસ્યાનો સામનો કર્યો હતો તેના વિશે અમને વધુ કહો",
+ "thanksMsg": "તમારી પ્રતિક્રિયા બદલ આભાર!",
+ "triggerEmailMsg": "તમે ટેક્સ્ટ બોક્સમાં વિગતો ઉમેરો અને ઇનિશિએટ ઇ-મેઇલ બટન પર ટેપ કરો પછી, અમે તમારા વતી એક ઇ-મેઇલ ટ્રિગર કરીશું. તમે ત્યાં વધુ વિગતો ઉમેરી શકો છો અને / અથવા ફાઇલો જોડી શકો છો.",
+ "typeHere": "અહી લખો...",
+ "yesMsg": "હા"
+ }
+}
\ No newline at end of file
diff --git a/utils/DesktopFAQ/faq-hi.json b/utils/DesktopFAQ/faq-hi.json
new file mode 100644
index 000000000..9736c8cfc
--- /dev/null
+++ b/utils/DesktopFAQ/faq-hi.json
@@ -0,0 +1,68 @@
+{
+ "faqs": [
+ {
+ "topic": "मैं अपना बोर्ड, माध्यम, कक्षा और विषय नहीं देख सकता",
+ "description": "आपका राज्य वर्तमान में सभी बोर्डों, माध्यमों, कक्षाओं और विषयों का समर्थन नहीं करता है । जैसे ही आपका राज्य उन्हें जोड़ता है, आप इसे सूची में देखेंगे"
+ },
+ {
+ "topic": "मैंने कंटेन्ट डाउनलोड की है, लेकिन मैं इसे खोलने में असमर्थ हूं क्योंकि यह कहता है कि मुझे इंटरनेट की आवश्यकता है",
+ "description": "हो सकता है आपने YouTube कंटेन्ट डाउनलोड कर ली होगी। आप YouTube कंटेन्ट तभी तक खोल सकते हैं जब आप ऑनलाइन हों। कंप्यूटर को फिर से इंटरनेट से कनेक्ट करने का प्रयास करें।"
+ },
+ {
+ "topic": "मुझे अपने दीक्षा डेस्कटॉप ऐप को अपडेट करने की आवश्यकता है",
+ "description": "अपने कंप्यूटर को इंटरनेट से कनेक्ट करें और नवीनतम ऐप संस्करण के लिए https://staging.sunbirded.org/desktop/latest देखें"
+ },
+ {
+ "topic": "मेरे पास इंटरनेट कनेक्शन वाले लैपटॉप का अभिगम नहीं है, लेकिन मैं डेस्कटॉप ऐप पर कंटेन्ट जोड़ना या अपडेट करना चाहता हूं",
+ "description": "अगर आपके पास मोबाइल फोन है तो गूगल प्लेस्टोर से दीक्षा मोबाइल एप डाउनलोड करें।\nऐप में कंटेन्ट के लिए ब्राउज़ करें।\nदीक्षा पुस्तकालय से कंटेन्ट डाउनलोड करें।\nइसे पेनड्राइव या एसडी कार्ड पर कॉपी करें और दीक्षा डेस्कटॉप ऐप पर अपलोड करें।"
+ },
+ {
+ "topic": "मुझे किसी विशेष विषय के लिए कंटेन्ट नहीं मिलती है, या मुझे कंटेन्ट अप्रासंगिक लगती है",
+ "description": "सामग्री की खोज के लिए दीक्षा की ऑनलाइन लाइब्रेरी ब्राउज़ करें। यदि यह अभी भी अनुपलब्ध है, तो सामग्री के बारे में अपनी प्रतिक्रिया राज्य SCERT को भेजें"
+ },
+ {
+ "topic": "ऐप बहुत धीमा है",
+ "description": "ऐप प्रदर्शन को गति देने के लिए, निम्नलिखित करें:\n अपने कंप्यूटर के सिस्टम कॉन्फ़िगरेशन पर जाएं। न्यूनतम विन्यास होना चाहिए:\n2 जीबी रैम \nड्यूल कोर प्रोसेसर \n यदि आपका कंप्यूटर इस विन्यास से मेल खाता है या उससे अधिक है, तो ऐप को फिर से शुरू करें।\n ऐसा करने के बाद, यदि यह अभी भी धीमा है, तो टास्क मैनेजर पर जाएं,\nसभी अप्रयुक्त पृष्ठभूमि प्रक्रियाओं का चयन करें और एंड टास्क पर क्लिक करें"
+ },
+ {
+ "topic": "मैं पेनड्राइव में कंटेन्ट की प्रतिलिपि बनाने में असमर्थ हूं",
+ "description": "कंटेन्ट को पेन ड्राइव पर कॉपी करने के लिए, निम्नलिखित करें:\nअपने कंप्यूटर सेटिंग पर जाएं। जांच करें कि USB ड्राइव लिखने से संरक्षित है या नहीं। यदि ऐसा है, तो सुरक्षा को अक्षम करें \nचेक करें कि पेन ड्राइव में खाली जगह है या नहीं। पेनड्राइव से अवांछित फ़ाइलों को हटाएं "
+ },
+ {
+ "topic": "मैंने अपने पेनड्राइव पर कंटेन्ट लोड की थी, लेकिन अब मैं देख रहा हूं कि यह खाली है",
+ "description": "आपका पेनड्राइव या कंप्यूटर वायरस से संक्रमित हो सकता है। जाँच करें कि:\n* आपके पास एक एंटी वायरस सॉफ़्टवेयर है जो आपकी मशीन पर स्थापित है\n* अज्ञात मशीनों में आपका पेनड्राइव प्लग करने से पहले लिखनें से सुरक्षित है।"
+ },
+ {
+ "topic": "मेरे पेनड्राइव से और में कंटेन्ट को कॉपी करने में समय लगता है",
+ "description": "कॉपी करने के लिए लिया गया समय कंटेन्ट फ़ाइल के आकार पर निर्भर करता है। कुछ बड़ी पाठ्यपुस्तकों को कॉपी करने में समय लगता है। हमारा सुझाव है कि आप इस प्रक्रिया को बीच में न रोकें। ऐसा करने से असंगत फ़ाइलें बन सकती हैं।"
+ },
+ {
+ "topic": "DIKSHA कंटेन्ट के कारण मेरे कंप्यूटर में खाली जगह नहीं है",
+ "description": "अपने कंप्यूटर पर जगह खाली करने के लिए ऐप के माई डाउनलोड टैब से डाउनलोड की गई कंटेन्ट को हटाएं"
+ },
+ {
+ "topic": "मेरे Ubuntu सिस्टम पर दीक्षा डेस्कटॉप एप्लिकेशन इंस्टॉल करने में असमर्थ",
+ "description": " अपने ubuntu सिस्टम पर DIKSHA डेस्कटॉप एप्लिकेशन इंस्टॉल करने के लिए: p>\n
1) अपना टर्मिनल खोलें
\n 2) निर्देशिका को बदलने के लिए कमांड सीडी <स्थान> को चलाएँ जहाँ एक्स फ़ाइल है डाउनलोड किया गया है। उदाहरण के लिए, यदि exe डाउनलोड फ़ोल्डर में सहेजा गया है, तो कमांड cd डाउनलोड चलाएं
\n 3) कमांड sudo dpkg -i चलाएं
\n सफलतापूर्वक इस कमांड को चलाने पर एप्लिकेशन लॉन्च किया गया है
"
+ }
+ ],
+ "constants": {
+ "charactersLeft": "अक्षर बाकी",
+ "explainMsg": "आपकी समस्या हमें विस्तार में बतायें",
+ "faqMsg": "अक्सर पूछे जाने वाले प्रश्न",
+ "help": "सहायता",
+ "helpMsg": "क्या आप इस उत्तर से संतुष्ट हैं?",
+ "initiateEmailButton": "ईमेल भेजें",
+ "knowMoreMsg": "आप कोई और जानकारी चाहते हैं?",
+ "noMsg": "नहीं",
+ "reportIssue": "समस्या रिपोर्ट करें",
+ "reportIssueMsg": "अन्य समस्या रिपोर्ट करें",
+ "resolveMsg": "अपनी समस्या का हल सूची में देखें",
+ "sorryMsg": "क्षमा करें!",
+ "submitButton": "दाख़िल करें",
+ "tellMoreMsg": "आपकी समस्या हमें विस्तार में बतायें",
+ "thanksMsg": "आपकी प्रतिक्रिया के लिए धन्यवाद",
+ "triggerEmailMsg": "आप अपना विवरण भर कर, 'ईमेल आरम्भ करें' का बटन दबायें। हम आपकी ओर से ईमेल ट्रिगर करेंगे| आप इस ईमेल में अधिक विवरण व संलग्न जोड़ सकते है।",
+ "typeHere": "यहाँ टाइप करें...",
+ "yesMsg": "हाँ"
+ }
+}
\ No newline at end of file
diff --git a/utils/DesktopFAQ/faq-kn.json b/utils/DesktopFAQ/faq-kn.json
new file mode 100644
index 000000000..1be7171ac
--- /dev/null
+++ b/utils/DesktopFAQ/faq-kn.json
@@ -0,0 +1,68 @@
+{
+ "faqs": [
+ {
+ "topic": "ನನ್ನ ಮಂಡಳಿ, ಮಾಧ್ಯಮ, ತರಗತಿ ಮತ್ತು ವಿಷಯ ಕಾಣುತ್ತಿಲ್ಲ",
+ "description": "ನಿಮ್ಮ ರಾಜ್ಯವು ಸದ್ಯಕ್ಕೆ ಎಲ್ಲ ಮಂಡಳಿಗಳು, ಮಾಧ್ಯಮಗಳು, ತರಗತಿಗಳು ಮತ್ತು ವಿಷಯಗಳನ್ನು ಬೆಂಬಲಿಸುತ್ತಿಲ್ಲ. ನಿಮ್ಮ ರಾಜ್ಯವು ಅವುಗಳನ್ನು ಸೇರಿಸಿದ ನಂತರ, ನೀವು ಪಟ್ಟಿಯಲ್ಲಿ ಅವನ್ನು ಕಾಣುತ್ತೀರಿ "
+ },
+ {
+ "topic": "ನಾನು ಪಠ್ಯಾಂಶವನ್ನು ಡೌನ್ಲೋಡ್ ಮಾಡಿದೆ, ಆದರೆ ಪ್ಲೇ ಮಾಡಲು ಆಗುತ್ತಿಲ್ಲ, ಯಾಕೆಂದರೆ ಅದು ಇಂಟರ್ನೆಟ್ ಬೇಕೆಂದು ಹೇಳುತ್ತಿದೆ",
+ "description": "ನೀವು ಯು ಟ್ಯೂಬ್ ಪಠ್ಯಾಂಶವನ್ನು ಡೌನ್ಲೋಡ್ ಮಾಡಿರಬಹುದು. ನೀವು ಆನ್ಲೈನ್ ಇದ್ದಾಗ ಮಾತ್ರ ಯು ಟ್ಯೂಬ್ ಪಠ್ಯಾಂಶವನ್ನು ನೋಡಬಹುದು. ಕಂಪ್ಯೂಟರನ್ನು ಇಂಟರ್ನೆಟ್ ಗೆ ಸಂಪರ್ಕಿಸಿ, ಮತ್ತೊಮ್ಮೆ ಪ್ರಯತ್ನಿಸಿ."
+ },
+ {
+ "topic": "ನನಗೆ ದೀಕ್ಷಾ ಡೆಸ್ಕ್ ಟಾಪ್ ಆಪ್ ಅನ್ನು ಅಪ್ಡೇಟ್ ಮಾಡಬೇಕಿದೆ",
+ "description": "ನಿಮ್ಮ ಕಂಪ್ಯೂಟರನ್ನು ಇಂಟರ್ನೆಟ್ ಗೆ ಸಂಪರ್ಕಿಸಿ ಮತ್ತು ಇತ್ತೀಚಿನ ಆಪ್ ಆವೃತ್ತಿಗೆ https://staging.sunbirded.org/desktop/latest ಅನ್ನು ಪರೀಕ್ಷಿಸಿ"
+ },
+ {
+ "topic": "ನನಗೆ ಇಂಟರ್ನೆಟ್ ಸಂಪರ್ಕ ಇರುವ ಲ್ಯಾಪ್ಟಾಪ್ ಗೆ ಲಭ್ಯತೆ ಇಲ್ಲ, ಆದರೆ ಡೆಸ್ಕ್ ಟಾಪ್ ಆಪ್ ನಲ್ಲಿ ನಾನು ಪಠ್ಯಾಂಶಗಳನ್ನು ಸೇರಿಸಲು ಅಥವಾ ನವೀಕರಿಸಲು ಬಯಸಿದ್ದೇನೆ. ",
+ "description": "ನಿಮ್ಮ ಬಳಿ ಮೊಬೈಲ್ ಫೋನಿದ್ದರೆ, ಗೂಗಲ್ ಪ್ಲೇ ಸ್ಟೋರಿನಿಂದ ದೀಕ್ಷಾ ಮೊಬೈಲ್ ಆಪ್ ಡೌನ್ಲೋಡ್ ಮಾಡಿ.\nಆಪ್ ನಲ್ಲಿ ಪಠ್ಯಾಂಶವನ್ನು ಹುಡುಕಿರಿ. \nದೀಕ್ಷಾ ಗ್ರಂಥಾಲಯದಿಂದ ಪಠ್ಯಾಂಶವನ್ನು ಡೌನ್ಲೋಡ್ ಮಾಡಿ.\nಅದನ್ನು ಪೆನ್ ಡ್ರೈವಿಗೆ ಅಥವಾ ಎಸ್ ಡಿ ಕಾರ್ಡಿಗೆ ಕಾಪಿ ಮಾಡಿ ಮತ್ತು ದೀಕ್ಷಾ ಡೆಸ್ಕ್ ಟಾಪ್ ಆಪ್ ಗೆ ಅಪ್ಲೋಡ್ ಮಾಡಿ. "
+ },
+ {
+ "topic": "ನನಗೆ ನಿರ್ದಿಷ್ಟವಾದ ಅಧ್ಯಾಯದ ಪಠ್ಯಾಂಶ ಕಾಣುತ್ತಿಲ್ಲ, ಅಥವಾ ಸಂಬಂಧವಿಲ್ಲದ ಪಠ್ಯಾಂಶ ಕಾಣುತ್ತಿದೆ",
+ "description": "ಪಠ್ಯಾಂಶವನ್ನು ಹುಡುಕಲು ದೀಕ್ಷಾದ ಆನ್ಲೈನ್ ಗ್ರಂಥಾಲಯದಲ್ಲಿ ಬ್ರೌಸ್ ಮಾಡಿ. ಆಗಲೂ ಸಿಗದಿದ್ದರೆ, ಪಠ್ಯಾಂಶ ಕುರಿತ ಹಿಮ್ಮಾಹಿತಿಯನ್ನು ನಿಮ್ಮ ಡಿ.ಎಸ್.ಇ.ಆರ್.ಟಿ.ಗೆ ಕಳಿಸಿ. "
+ },
+ {
+ "topic": "ಆಪ್ ತುಂಬಾ ನಿಧಾನವಿದೆ",
+ "description": "ಆಪ್ ಕಾರ್ಯಕ್ಷಮತೆಯನ್ನು ವೇಗವಾಗಿಸಲು, ಕೆಳಗಿನಂತೆ ಮಾಡಿ: \n ನಿಮ್ಮ ಕಂಪ್ಯೂಟರ್ ಸಿಸ್ಟಮ್ ಕಾನ್ಫಿಗರೇಶನ್ ಗೆ ಹೋಗಿ. ಕನಿಷ್ಟ ಕಾನ್ಫಿಗರೇಶನ್ ಹೀಗಿರಬೇಕು: \n 2 GB RAM \nDual Core Processor \n ನಿಮ್ಮ ಕಂಪ್ಯೂಟರ್ ಕಾನ್ಫಿಗರೇಶನ್ ಗೆ ಹೊಂದುತ್ತಿದ್ದರೆ ಅಥವಾ ಇದಕ್ಕಿಂದ ಹೆಚ್ಚಿನದಿದ್ದರೆ, ಆಪ್ ಅನ್ನು ರಿಸ್ಟಾರ್ಟ್ ಮಾಡಿ. \n ಹೀಗೆ ಮಾಡಿದ ನಂತರವೂ, ನಿಧಾನವಾಗಿದ್ದರೆ, ಇಲ್ಲಿಗೆ ಹೋಗಿಟಾಸ್ಕ್ ಮ್ಯಾನೇಜರ್ ,\nಬಳಕೆಮಾಡದ ಎಲ್ಲ ಬ್ಯಾಕ್ ಗ್ರೌಂಡ್ ಪ್ರಕ್ರಿಯೆಗಳನ್ನು ಆಯ್ಕೆ ಮಾಡಿ ಮತ್ತು ಕ್ಲಿಕ್ ಮಾಡಿ ಎಂಡ್ ಟಾಸ್ಕ್ "
+ },
+ {
+ "topic": "ನನಗೆ ಪಠ್ಯಾಂಶವನ್ನು ಪೆನ್ ಡ್ರೈವಿಗೆ ಕಾಪಿ ಮಾಡಲು ಆಗುತ್ತಿಲ್ಲ",
+ "description": "ಪಠ್ಯಾಂಶವನ್ನು ಪೆನ್ ಡ್ರೈವಿಗೆ ಕಾಪಿ ಮಾಡಲು, ಕೆಳಗೆ ಸೂಚಿಸಿರುವಂತೆ ಮಾಡಿ: \nನಿಮ್ಮ ಕಂಪ್ಯೂಟರ್ ಸೆಟ್ಟಿಂಗ್ಸ್ ಗೆ ಹೋಗಿ. ಯುಎಸ್ಬಿ ಡ್ರೈವ್ ರೈಟ್ ಪ್ರೊಟೆಕ್ಟೆಡ್ ಎಂದು ಇದೆಯೇ ನೋಡಿ. ಹಾಗಿದ್ದರೆ, ಪ್ರೊಟೆಕ್ಷನ್ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ \nಪೆನ್ ಡ್ರೈವಿನಲ್ಲಿ ಖಾಲಿ ಜಾಗವಿದೆಯೇ ನೋಡಿ. ಪೆನ್ ಡ್ರೈವಿನಲ್ಲಿ ಅನಗತ್ಯ ಫೈಲುಗಳನ್ನು ಡಿಲೀಟ್ ಮಾಡಿ "
+ },
+ {
+ "topic": "ನನ್ನ ಪೆನ್ ಡ್ರವಿಗೆ ಪಠ್ಯಾಂಶವನ್ನು ಲೋಡ್ ಮಾಡಿರುವೆ, ಆದರೆ ಈಗ ಅದು ಖಾಲಿಯಾಗಿ ಕಾಣುತ್ತಿದೆ",
+ "description": "ನಿಮ್ಮ ಪೆನ್ ಡ್ರೈವ್ ಅಥವಾ ಕಂಪ್ಯೂಟರ್ ಗೆ ವೈರಸ್ ದಾಳಿಯಾಗಿರಬಹುದು. ಇದನ್ನು ಪರೀಕ್ಷಿಸಿ: \n* ನಿಮ್ಮ ಸಿಸ್ಟಮ್ ನಲ್ಲಿ ಆಂಟಿ ವೈರಸ್ ಸಾಫ್ಟ್ ವೇರ್ ಇನ್ ಸ್ಟಾಲ್ ಆಗಿದೆಯೇ ನೋಡಿ\n* ಅಪರಿಚಿತ ಕಂಪ್ಯೂಟರ್ ಗೆ ನಿಮ್ಮ ಪೆನ್ ಡ್ರೈವ್ ಹಾಕುವ ಮೊದಲು, ಅದು ರೈಟ್-ಪ್ರೊಟೆಕ್ಟೆಡ್ ಆಗಿದೆಯೇ ನೋಡಿ"
+ },
+ {
+ "topic": "ಪಠ್ಯಾಂಶವನ್ನು ನನ್ನ ಪೆನ್ ಡ್ರೈವಿಗೆ ಮತ್ತು ನನ್ನ ಪೆನ್ ಡ್ರೈವಿನಿಂದ ಕಾಪಿ ಮಾಡಲು ಸಮಯ ತೆಗೆದುಕೊಳ್ಳುತ್ತದೆ",
+ "description": "ಕಾಪಿ ಮಾಡಲು ತೆಗೆದುಕೊಳ್ಳುವ ಸಮಯವು ಪಠ್ಯಾಂಶ ಫೈಲಿನ ಗಾತ್ರವನ್ನು ಅವಲಂಬಿಸಿರುತ್ತದೆ. ದೊಡ್ಡ ಪಠ್ಯಪುಸ್ತಕಗಳಾದರೆ ಕಾಪಿಯಾಗಲು ಸಮಯ ತೆಗೆದುಕೊಳ್ಳುತವೆ. ಮಧ್ಯದಲ್ಲಿ ಕಾಪಿ ಪ್ರಕ್ರಿಯೆಯನ್ನು ನಿಲ್ಲಿಸಬೇಡಿ. ಹಾಗೆ ಮಾಡಿದರೆ ಫೈಲುಗಳು ಸರಿಯಾಗಿ ಕಾಪಿಯಾಗುವುದಿಲ್ಲ."
+ },
+ {
+ "topic": "ದೀಕ್ಷಾ ಪಠ್ಯಾಂಶದಿಂದಾಗಿ ನನ್ನ ಕಂಪ್ಯೂಟರಿನಲ್ಲಿ ಖಾಲಿ ಜಾಗ ಉಳಿದಿಲ್ಲ",
+ "description": "ನಿಮ್ಮ ಕಂಪ್ಯೂಟರಿನಲ್ಲಿ ಜಾಗ ಖಾಲಿ ಮಾಡಲು ಆಪ್ ನ ಮೈ ಡೌನ್ಲೋಡ್ಸ್ ಟ್ಯಾಬಿನಿಂದ ಡೌನ್ಲೋಡ್ ಆಗಿರುವ ಪಠ್ಯಾಂಶಗಳನ್ನು ಡಿಲೀಟ್ ಮಾಡಿ"
+ },
+ {
+ "topic": "ನನ್ನ ಉಬಂಟು ಸಿಸ್ಟಮ್ ನಲ್ಲಿ ದೀಕ್ಷಾ ಡೆಸ್ಕ್ ಟಾಪ್ ಅಪ್ಲಿಕೇಶನ್ ಸ್ಥಾಪಿಸಲು ಆಗುತ್ತಿಲ್ಲ",
+ "description": "ನಿಮ್ಮ ಉಬಂಟು ಸಿಸ್ಟಮ್ ನಲ್ಲಿ ದೀಕ್ಷಾ ಡೆಸ್ಕ್ ಟಾಪ್ ಅಪ್ಲಿಕೇಷನ್ ಹಾಕಿಕೊಳ್ಳಲು:
\n
1) ನಿಮ್ಮ ಟರ್ಮಿನಲ್ ಓಪನ್ ಮಾಡಿ
\n2) ಕಮಾಂಡ್ ಸಿಡಿ ರನ್ ಮಾಡಿ exe ಫೈಲ್ ಡೌನ್ಲೋಡ್ ಆಗಿರುವಲ್ಲಿ ಡೈರೆಕ್ಟರಿಯನ್ನು ಬದಲಿಸಲು. ಉದಾಹರಣೆಗೆ, exe ಯು ಡೌನ್ಲೋಡ್ಸ್ ಫೋಲ್ಡರಿನಲ್ಲಿ ಸೇವ್ ಆಗಿದ್ದರೆ, ಆಗ ಕಮಾಂಡ್ ಸಿಡಿ ಡೌನ್ಲೋಡ್ಸ್ ಅನ್ನು ರನ್ ಮಾಡಿ
\n3) ಕಮಾಂಡ್ sudo dpkg ರನ್ ಮಾಡಿ -i
\nಈ ಕಮಾಂಡ್ ಅನ್ನು ಯಶಸ್ವಿಯಾಗಿ ರನ್ ಮಾಡಿದ ನಂತರ, ಅಪ್ಲಿಕೇಶನ್ ಶುರುವಾಗುತ್ತದೆ
"
+ }
+ ],
+ "constants": {
+ "charactersLeft": "ಉಳಿದಿರುವ ಅಕ್ಷರಗಳು",
+ "explainMsg": "ನೀವು ತೊಂದರೆಯನ್ನು ವಿವರಿಸುವಿರಾ?",
+ "faqMsg": "ಪದೇಪದೇ ಕೇಳುವ ಪ್ರಶ್ನೆಗಳು",
+ "help": "ಸಹಾಯ",
+ "helpMsg": "ಈ ಉತ್ತರದಿಂದ ನಿಮಗೆ ಸಹಾಯವಾಯಿತೇ? ",
+ "initiateEmailButton": "ಇಮೇಲ್ ಆರಂಭಿಸಿ ",
+ "knowMoreMsg": "ಇನ್ನೂ ಹೆಚ್ಚಿನದೇನದನ್ನು ತಿಳಿಯಲು ಬಯಸುವಿರಿ? ",
+ "noMsg": "ಇಲ್ಲ",
+ "reportIssue": "ಸಮಸ್ಯೆ ಇದೆಯೆಂದು ವರದಿ ಮಾಡಿ",
+ "reportIssueMsg": "ಬೇರೆ ಸಮಸ್ಯೆ ಬಗ್ಗೆ ವರದಿ ಮಾಡಿ ",
+ "resolveMsg": "ನಿಮ್ಮ ಸಮಸ್ಯೆ ಪರಿಹರಿಸಿಕೊಳ್ಳಲು ಪೂರ್ಣ ಪಟ್ಟಿಯನ್ನು ನೋಡಿ",
+ "sorryMsg": "ಅದಕ್ಕಾಗಿ ವಿಷಾದಿಸುತ್ತೇವೆ!",
+ "submitButton": "ಸಲ್ಲಿಸಿ",
+ "tellMoreMsg": "ನೀವು ಎದುರಿಸಿದ ತೊಂದರೆಯ ಬಗ್ಗೆ ಹೆಚ್ಚಿನ ಮಾಹಿತಿ ಹೇಳಿ. ",
+ "thanksMsg": "ನಿಮ್ಮ ಪ್ರತಿಕ್ರಿಯೆಗೆ ಧನ್ಯವಾದಗಳು!",
+ "triggerEmailMsg": "ನೀವು ಟೆಕ್ಸ್ಟ್ ಬಾಕ್ಸಿನಲ್ಲಿ ವಿವರಗಳನ್ನು ಸೇರಿಸಿದ ನಂತರ, ಇಮೇಲ್ ಆರಂಭಿಸಿ ಬಟನ್ ಅನ್ನು ಒತ್ತಿರಿ, ನಾವು ನಿಮ್ಮ ಪರವಾಗಿ ಇಮೇಲ್ ಶುರು ಮಾಡುತ್ತೇವೆ. ನೀವು ಹೆಚ್ಚಿನ ಮಾಹಿತಿಯನ್ನು /ಅಥವ ಅಲ್ಲಿ ಫೈಲುಗಳನ್ನು ಸೇರಿಸಬಹುದು.",
+ "typeHere": "ಇಲ್ಲಿ ಟೈಪ್ ಮಾಡಿ...",
+ "yesMsg": "ಹೌದು"
+ }
+}
\ No newline at end of file
diff --git a/utils/DesktopFAQ/faq-ml.json b/utils/DesktopFAQ/faq-ml.json
new file mode 100644
index 000000000..d0b40c43e
--- /dev/null
+++ b/utils/DesktopFAQ/faq-ml.json
@@ -0,0 +1,68 @@
+{
+ "faqs": [
+ {
+ "topic": "എന്റെ ബോർഡ്, മീഡിയം, ക്ലാസ്, വിഷയം എന്നിവ കാണാൻ എനിക്ക് കഴിയുന്നില്ല ",
+ "description": "നിങ്ങളുടെ സംസ്ഥാനം നിലവിൽ എല്ലാ ബോർഡുകളും മീഡിയങ്ങളും ക്ലാസുകളും വിഷയങ്ങളും പിന്തുണയ്ക്കുന്നില്ല. നിങ്ങളുടെ സംസ്ഥാനം അവരെ ചേർത്താലുടൻ, നിങ്ങൾക്ക് അത് പട്ടികയിൽ കാണാം "
+ },
+ {
+ "topic": "ഞാൻ ഉള്ളടക്കം ഡ download ൺലോഡ് ചെയ്തു, പക്ഷേ എനിക്ക് ഇന്റർനെറ്റ് ആവശ്യമാണെന്ന് പറയുന്നതിനാൽ എനിക്ക് പ്ലേ ചെയ്യാൻ കഴിയില്ല",
+ "description": "നിങ്ങൾ YouTube ഉള്ളടക്കം ഡൗൺലോഡ് ചെയ്തിരിക്കാം. നിങ്ങൾ ഓൺലൈനിൽ ആയിരിക്കുമ്പോൾ മാത്രമേ നിങ്ങൾക്ക് YouTube ഉള്ളടക്കം പ്ലേ ചെയ്യാൻ കഴിയൂ. കമ്പ്യൂട്ടർ ഇന്റർനെറ്റിലേക്ക് കണക്റ്റു ചെയ്തു വീണ്ടും ശ്രമിക്കുക."
+ },
+ {
+ "topic": "എന്റെ DIKSHA ഡെസ്ക്ടോപ്പ് അപ്ലിക്കേഷൻ അപ്ഡേറ്റ് ചെയ്യേണ്ടതുണ്ട്",
+ "description": "നിങ്ങളുടെ കമ്പ്യൂട്ടർ ഇന്റർനെറ്റിലേക്ക് കണക്റ്റുചെയ്ത് ഏറ്റവും പുതിയ അപ്ലിക്കേഷൻ പതിപ്പിനായി https://staging.sunbirded.org/desktop/latest പരിശോധിക്കുക"
+ },
+ {
+ "topic": "എനിക്ക് ഇന്റർനെറ്റ് കണക്ഷനുള്ള ഒരു ലാപ്ടോപ്പ് ഇല്ല, പക്ഷേ ഡെസ്ക്ടോപ്പ് അപ്ലിക്കേഷനിൽ ഉള്ളടക്കം ചേർക്കാനോ അപ്ഡേറ്റുചെയ്യാനോ ഞാൻ ആഗ്രഹിക്കുന്നു",
+ "description": "നിങ്ങൾക്ക് ഒരു മൊബൈൽ ഫോൺ ഉണ്ടെങ്കിൽ, google പ്ലേസ്റ്റോറിൽ നിന്ന് DIKSHA മൊബൈൽ അപ്ലിക്കേഷൻ ഡൗൺലോഡുചെയ്യുക. അപ്ലിക്കേഷനിലെ ഉള്ളടക്കത്തിനായി ബ്രൗസുചെയ്യുക. DIKSHA ലൈബ്രറിയിൽ നിന്ന് ഉള്ളടക്കം ഡൗൺലോഡുചെയ്യുക.ഒരു പെൻഡ്രൈവ് അല്ലെങ്കിൽ SD കാർഡിൽ പകർത്തി അത് DIKSHA ഡെസ്ക്ടോപ്പ് അപ്ലിക്കേഷനിൽ അപ്ലോഡുചെയ്യുക."
+ },
+ {
+ "topic": "ഒരു പ്രത്യേക വിഷയത്തിൽ എനിക്ക് ഉള്ളടക്കം കണ്ടെത്താൻ കഴിയില്ല, അല്ലെങ്കിൽ എനിക്ക് ലഭിക്കുന്ന ഉള്ളടക്കം അപ്രസക്തമാണ്",
+ "description": "ഉള്ളടക്കത്തിനായി തിരയുന്നതിന് DIKSHA യുടെ ഓൺലൈൻ ലൈബ്രറി ബ്രൗസ് ചെയ്യുക.അവിടെ ലഭ്യമല്ലെങ്കിൽ, ഉള്ളടക്കത്തെക്കുറിച്ചുള്ള നിങ്ങളുടെ ഫീഡ്ബാക്ക് സംസ്ഥാന SCERT ലേക്ക് അയയ്ക്കുക"
+ },
+ {
+ "topic": "അപ്ലിക്കേഷൻ മന്ദഗതിയിലാണ്",
+ "description": "അപ്ലിക്കേഷൻ പ്രകടനം വേഗത്തിലാക്കാൻ,ചുവടെപറയുന്നവ ചെയ്യുക:\n നിങ്ങളുടെ കമ്പ്യൂട്ടറിന്റെ സിസ്റ്റം കോൺഫിഗറേഷനിലേക്ക് പോകുക. ഏറ്റവും കുറഞ്ഞ കോൺഫിഗറേഷൻ ഇതായിരിക്കണം:\n2 GB RAM \nDual Core Processor \n നിങ്ങളുടെ കമ്പ്യൂട്ടറിന്റെ കോൺഫിഗറേഷൻ തുല്യമോ അതിൽ കൂടുതലോ ആണെങ്കിൽ, അപ്ലിക്കേഷൻ പുനരാരംഭിക്കുക.\n ഇത് ചെയ്തതിനു ശേഷവും അപ്ലിക്കേഷൻ മന്ദഗതിയിലാണെങ്കിൽ, ടാസ്ക് മാനേജർ ലേക്ക് പോകുക,ഉപയോഗിക്കാത്ത എല്ലാ പശ്ചാത്തല പ്രക്രിയകളും തിരഞ്ഞെടുത്ത് ടാസ്ക് അവസാനിപ്പിക്കുക ക്ലിക്കുചെയ്യുക"
+ },
+ {
+ "topic": " പെൻഡ്രൈവിലേക്ക് ഉള്ളടക്കം പകർത്താൻ എനിക്ക് കഴിയില്ല ",
+ "description": "ഒരു പെൻ ഡ്രൈവിലേക്ക് ഉള്ളടക്കം പകർത്താൻ,ചുവടെപറയുന്നവ ചെയ്യുക:\nനിങ്ങളുടെ കമ്പ്യൂട്ടർ ക്രമീകരണങ്ങളിലേക്ക് പോകുക.USB ഡ്രൈവ് എഴുത്ത് പരിരക്ഷിതമാണോയെന്ന് പരിശോധിക്കുക. അങ്ങനെയാണെങ്കിൽ, പരിരക്ഷണം പ്രവർത്തനരഹിതമാക്കുക \nപെൻഡ്രൈവിൽ ഇടമുണ്ടോയെന്ന് പരിശോധിക്കുക. പെൻഡ്രൈവിൽ നിന്ന് അനാവശ്യ ഫയലുകൾ ഡിലീറ്റ് ചെയ്യുക "
+ },
+ {
+ "topic": "എന്റെ പെൻഡ്രൈവിൽ ഞാൻ ഉള്ളടക്കം ലോഡുചെയ്തിരുന്നു, പക്ഷേ ഇപ്പോൾ അത് ശൂന്യമായി ഞാൻ കാണുന്നു",
+ "description": "നിങ്ങളുടെ പെൻ ഡ്രൈവ് അല്ലെങ്കിൽ കമ്പ്യൂട്ടർ ഒരു വൈറസ് ബാധിച്ചേക്കാം. പരിശോധിക്കുക:\n* നിങ്ങളുടെ ഉപകരണത്തിൽ ആന്റി വൈറസ് സോഫ്റ്റ്വെയർ ഇൻസ്റ്റാൾ ചെയ്തിട്ടുണ്ടോ \n* അജ്ഞാത ഉപകരണങ്ങളിലേക്ക് കണക്റ്റുചെയ്യുന്നതിന് മുമ്പ് നിങ്ങളുടെ പെൻ ഡ്രൈവ് പുനരാലേഖനം ചെയ്യപ്പെടുന്നുണ്ടോ"
+ },
+ {
+ "topic": "എന്റെ പെൻ ഡ്രൈവിലേക്കും പെൻ ഡ്രൈവിൽ നിന്നോ ഉള്ളടക്കം പകർത്താൻ സമയമെടുക്കും",
+ "description": "പകർത്താൻ എടുക്കുന്ന സമയം ഉള്ളടക്ക ഫയലിന്റെ വലുപ്പത്തെ ആശ്രയിച്ചിരിക്കുന്നു. ചില വലിയ പാഠപുസ്തകങ്ങൾ പകർത്താൻ സമയമെടുക്കും.അതിനിടയിൽ പ്രക്രിയ നിർത്തരുതെന്ന് ഞങ്ങൾ ശുപാർശ ചെയ്യുന്നു. അങ്ങനെ ചെയ്യുന്നത് പൊരുത്തമില്ലാത്ത ഫയലുകളിലേക്ക് നയിച്ചേക്കാം."
+ },
+ {
+ "topic": "DIKSHA ഉള്ളടക്കം കാരണം എന്റെ കമ്പ്യൂട്ടറിൽ ഇടമില്ല",
+ "description": "നിങ്ങളുടെ കമ്പ്യൂട്ടറിൽ ഇടം ശൂന്യമാക്കുന്നതിന് അപ്ലിക്കേഷന്റെ എന്റെ ഡൗൺലോഡുകൾ ടാബിൽ നിന്ന് ഡൗൺലോഡുചെയ്ത ഉള്ളടക്കം ഡിലീറ്റ് ചെയ്യുക"
+ },
+ {
+ "topic": "എന്റെ ഉബുണ്ടു സിസ്റ്റത്തിൽ DIKSHA ഡെസ്ക്ടോപ്പ് ആപ്ലിക്കേഷൻ ഇൻസ്റ്റാൾ ചെയ്യാൻ കഴിയുന്നില്ല ",
+ "description": " നിങ്ങളുടെ ഉബുണ്ടു സിസ്റ്റത്തിൽ DIKSHA ഡെസ്ക്ടോപ്പ് അപ്ലിക്കേഷൻ ഇൻസ്റ്റാൾ ചെയ്യുന്നതിന്:
1) നിങ്ങളുടെ ടെർമിനൽ തുറക്കുക
\n 2)exe ഫയൽ ഡൗൺലോഡ് ചെയ്ത സ്ഥലത്തേക്ക് ഡയറക്ടറി മാറ്റുന്നതിന് cd കമാൻഡ് പ്രവർത്തിപ്പിക്കുക. ഉദാഹരണത്തിന്, ഡൗൺലോഡ് ഫോൾഡറിൽ exe സംരക്ഷിച്ചിട്ടുണ്ടെങ്കിൽ,കമാൻഡ് cd ഡൗൺലോഡുകൾ പ്രവർത്തിപ്പിക്കുക
\n3) sudo dpkg -i കമാൻഡ് പ്രവർത്തിപ്പിക്കുക
\n ഈ കമാൻഡ് വിജയകരമായി പ്രവർത്തിപ്പിക്കുമ്പോൾ അപ്ലിക്കേഷൻ സമാരംഭിച്ചു
"
+ }
+ ],
+ "constants": {
+ "charactersLeft": "പ്രതീകങ്ങൾ ശേഷിക്കുന്നു",
+ "explainMsg": "നിങ്ങൾക്ക് പ്രശ്നം വിശദീകരിക്കാമോ?",
+ "faqMsg": "പതിവായി ചോദിക്കുന്ന ചോദ്യങ്ങൾ",
+ "help": "സഹായം",
+ "helpMsg": "ഈ ഉത്തരം നിങ്ങളെ സഹായിച്ചോ?\n",
+ "initiateEmailButton": "ഇമെയിൽ ആരംഭിക്കുക",
+ "knowMoreMsg": "കൂടുതൽ എന്താണ് നിങ്ങൾ അറിയാൻ ആഗ്രഹിക്കുന്നത്?",
+ "noMsg": "ഇല്ല",
+ "reportIssue": "ഒരു പ്രശ്നം റിപ്പോർട്ടുചെയ്യുക",
+ "reportIssueMsg": "മറ്റ് പ്രശ്നം റിപ്പോർട്ട് ചെയ്യുക",
+ "resolveMsg": "നിങ്ങളുടെ പ്രശ്നം പരിഹരിക്കാൻ പട്ടികയിലൂടെ നോക്കുക",
+ "sorryMsg": "ക്ഷമിക്കണം!",
+ "submitButton": "സമർപ്പിക്കുക",
+ "tellMoreMsg": "നിങ്ങൾ നേരിട്ട പ്രശ്നത്തെക്കുറിച്ച് ഞങ്ങളോട് കൂടുതൽ പറയുക",
+ "thanksMsg": "നിങ്ങളുടെ പ്രതികരണത്തിന് നന്ദി!",
+ "triggerEmailMsg": "ടെക്സ്റ്റ് ബോക്സിൽ നിങ്ങൾ വിശദാംശങ്ങൾ ചേർത്ത് ഇമെയിൽ ആരംഭിക്കുക ബട്ടൺ ടാപ്പുചെയ്ത ശേഷം, നിങ്ങളുടെ താൽപ്പര്യാർത്ഥം ഞങ്ങൾ ഒരു ഇമെയിൽ പ്രവർത്തനക്ഷമമാക്കും. നിങ്ങൾക്ക് കൂടുതൽ വിശദാംശങ്ങൾ ചേർക്കാനും അല്ലെങ്കിൽ അവിടെ ഫയലുകൾ അറ്റാച്ചുചെയ്യാനും കഴിയും.",
+ "typeHere": "ഇവിടെ ടൈപ്പ് ചെയ്യുക...",
+ "yesMsg": "അതെ"
+ }
+}
\ No newline at end of file
diff --git a/utils/DesktopFAQ/faq-mr.json b/utils/DesktopFAQ/faq-mr.json
new file mode 100644
index 000000000..ba4453fdc
--- /dev/null
+++ b/utils/DesktopFAQ/faq-mr.json
@@ -0,0 +1,68 @@
+{
+ "faqs": [
+ {
+ "topic": "मला माझे बोर्ड, माध्यम, इयत्ता व विषय दिसत नाहीत ",
+ "description": "तुमचे राज्य सध्या सर्व बोर्ड, माध्यमे, इयत्ता व विषयांना समर्थन देत नाही. तुमच्या राज्याने हे जोडताच, तुम्हाला ते यादीत दिसेल."
+ },
+ {
+ "topic": "मी सामग्री डाउनलोड केली आहे, पण 'इंटरनेट आवश्यक आहे' या कारणास्तव मी ती चालवू शकत नाही ",
+ "description": "तुम्ही यूट्यूब वरची सामग्री डाउनलोड केलेली असू शकते. तुम्ही यूट्यूब सामग्री फक्त ऑनलाइन असताना चालवू शकता. कॉम्प्युटर इंटरनेटशी जोडून पुन्हा प्रयत्न करा."
+ },
+ {
+ "topic": "मला माझा DIKSHA डेस्कटॉप ऍप अपडेट करायचा आहे ",
+ "description": "ऍपच्या नवीनतम आवृत्तीसाठी तुमचा कॉम्प्युटर इंटरनेटशी जोडून https://staging.sunbirded.org/desktop/latest तपासा "
+ },
+ {
+ "topic": "माझ्याकडे इंटरनेट कनेक्शन असलेला लॅपटॉप नाही, पण मला डेस्कटॉप ऍपवर सामग्री जोडायची किंवा अपडेट करायची आहे ",
+ "description": "तुमच्याकडे मोबाइल फोन असल्यास, गूगल प्लेस्टोर वरून DIKSHA मोबाइल ऍप डाउनलोड करा.\nऍपवरून सामग्री ब्राउझ करा.\nDIKSHA लायब्ररी मधून सामग्री डाउनलोड करा.\nती पेन ड्राइव्ह किंवा SD कार्ड वर कॉपी करून DIKSHA डेस्कटॉप ऍपवर अपलोड करा."
+ },
+ {
+ "topic": "मला एका विशिष्ट विषयाची सामग्री मिळत नाही, किंवा मिळालेली सामग्री असंबद्ध आहे ",
+ "description": "सामग्री शोधण्यासाठी दीक्षा DIKSHAची ऑनलाइन लायब्ररी ब्राउझ करा. तिथेही सामग्री उपलब्ध नसल्यास, तुमचा सामग्री विषयी अभिप्राय राज्य SCERTकडे पाठवा "
+ },
+ {
+ "topic": "ऍपचा वेग खूप कमी आहे ",
+ "description": "तुमच्या ऍपची कार्यक्षमता वाढवण्यासाठी खालीलप्रमाणे करा:\n तुमच्या कॉम्प्युटरच्या सिस्टिम कॉन्फिगरेशन वर जा. तुमचे किमान कॉन्फिगरेशन असायला हवे: \n2 GB RAM \nDual Core Processor \n तुमच्या कॉम्पुटरचे कॉन्फिगरेशन एवढे, किंवा यापेक्षा जास्त असल्यास, ऍप पुन्हा सुरू करा.\n हे करूनही ऍपचा वेग कमी असल्यास कार्य व्यवस्थापक इथे जा,\nवापरात नसलेल्या सर्व पार्श्वभूमी प्रक्रिया सिलेक्ट करा व कार्य संपवा क्लिक करा "
+ },
+ {
+ "topic": "मी सामग्री पेन ड्राइव्ह वर कॉपी करू शकत नाही आहे ",
+ "description": "सामग्री पेन ड्राइव्ह वर कॉपी करण्यासाठी खालीलप्रमाणे करा:\nतुमच्या कॉम्प्युटर सेटिंग्ज वर जा. तुमचा USB ड्राइव्ह लिखाण-प्रतिबंधित आहे का, हे तपासा.असल्यास, प्रतिबंध अक्षम करा \nपेन ड्राइव्ह वर मोकळी जागा आहे का पहा. नको असलेल्या फाइल्स पेन ड्राइव्ह वरून डिलीट करा "
+ },
+ {
+ "topic": "मी माझ्या पेन ड्राइव्ह वर सामग्री लोड केली होती, पण आता ती रिकामी आहे असे दिसते ",
+ "description": "तुमचा पेन ड्राइव्ह किंवा कॉम्पुटर व्हायरसने बाधित झाला असण्याची शक्यता आहे. हे तपासा:\n*तुमच्या यंत्रावर अँटी-व्हायरस सॉफ्टवेअर स्थापित केले आहे का \n*अज्ञात यंत्रांशी जोडण्याआधी तुमची पेन ड्राइव्ह लिखाण-प्रतिबंधित केली आहे का "
+ },
+ {
+ "topic": "माझ्या पेन ड्राइव्हवर, किंवा पेन ड्राइव्ह वरून सामग्री कॉपी करण्यास खूप वेळ लागतो ",
+ "description": "कॉपी करण्यासाठी लागणारा वेळ सामग्रीच्या फाइलच्या आकारमानावर अवलंबून आहे. काही मोठी पाठ्यपुस्तके कॉपी करण्यास वेळ लागतो. कॉपीची प्रक्रिया मध्येच थांबवू नये असा आमचा सल्ला आहे. असे केल्यास फाइल्स मध्ये विसंगती येऊ शकते. "
+ },
+ {
+ "topic": "DIKSHAच्या सामग्रीमुळे माझ्या कॉम्प्युटरवर मोकळी जागा उरली नाही ",
+ "description": "तुमच्या कॉम्प्युटरवर जागा मोकळी करण्यासाठी, ऍपवरील माझे डाउनलोड टॅब वरून डाउनलोड केलेली सामग्री डिलीट करा "
+ },
+ {
+ "topic": "माझ्या उबंटू सिस्टिम वर DIKSHA डेस्कटॉप ऍप स्थापित करण्यास अयशस्वी ",
+ "description": "तुमच्या उबंटू सिस्टिम वर DIKSHA डेस्कटॉप ऍप स्थापित करण्यासाठी:
\n१) तुमचे टर्मिनल उघडा
\n२) निर्देशिका बदलून exe फाइल जिथे डाउनलोड केलेली आहे तिथे नेण्यासाठी cd <स्थान> ही आज्ञा करा. उदा:, exe डाउनलोड फोल्डर मध्ये सेव्ह केली असल्यास, cd Downloads
ही आज्ञा करा \n३) sudo dpkg -i
ही आज्ञा करा \nही आज्ञा यशस्वीरीत्या केल्यानंतर हे ऍप सुरू केले जाईल
\n"
+ }
+ ],
+ "constants": {
+ "charactersLeft": "उर्वरित वर्ण ",
+ "explainMsg": "तुम्ही समस्येचे स्पष्टीकरण द्याल का?",
+ "faqMsg": "विचारण्यात येणारे प्रश्न",
+ "help": "सहायता",
+ "helpMsg": "ह्या उत्तराची तुम्हाला मदत झाली का?",
+ "initiateEmailButton": "ईमेल आरंभ करा",
+ "knowMoreMsg": "तुम्हाला आणखीन काही जाणून घ्यायचे आहे का?",
+ "noMsg": "नाही",
+ "reportIssue": "तक्रार दाखल करा",
+ "reportIssueMsg": "इतर तक्रारी दाखल करा",
+ "resolveMsg": "तुमच्या समस्येचे निराकरण करण्यासाठी सूची पहा",
+ "sorryMsg": "क्षमस्व!",
+ "submitButton": "सबमिट करा",
+ "tellMoreMsg": "तुमच्या समस्येबद्दल आम्हाला अधिक सांगा",
+ "thanksMsg": "तुमच्या प्रतिसादासाठी धन्यवाद!",
+ "triggerEmailMsg": "तुम्ही माहिती जोडल्यानंतर आणि 'ईमेल आरंभ करा' बटण टॅप केल्यानंतर, आम्ही तुमच्या वतीने ईमेल ट्रिगर करू. तेथे तुम्ही अधिक माहिती आणि / किंवा फायली संलग्न करू शकता.",
+ "typeHere": "येथे टाईप करा",
+ "yesMsg": "होय"
+ }
+}
\ No newline at end of file
diff --git a/utils/DesktopFAQ/faq-or.json b/utils/DesktopFAQ/faq-or.json
new file mode 100644
index 000000000..315ef2437
--- /dev/null
+++ b/utils/DesktopFAQ/faq-or.json
@@ -0,0 +1,68 @@
+{
+ "faqs": [
+ {
+ "topic": "ମୁ ମୋର ବୋର୍ଡ , ମାଧ୍ୟମ, ଶ୍ରେଣୀ ଓ ବିଷୟ ଦେଖିପାରୁନାହିଁ ",
+ "description": "ଆପଣଙ୍କ ରାଜ୍ୟ ବର୍ତ୍ତମାନ ସବୁ ବୋର୍ଡ ,ମାଧ୍ୟମ ,ଶ୍ରେଣୀ ଏବଂ ବିଷୟକୁ ସପୋର୍ଟ କରୁନାହିଁ | ଆପଣଙ୍କ ରାଜ୍ୟ ଏସବୁକୁ ଯୋଡିବା ମାତ୍ରେ, ଆପଣ ତାହାକୁ ଏହି ସୂଚୀରେ ଦେଖିପାରିବେ "
+ },
+ {
+ "topic": "ମୁଁ କଣ୍ଟେଣ୍ଟ୍ ଡାଉନଲୋଡ୍ କରିଛି, କିନ୍ତୁ ମୁଁ ଏହାକୁ ପ୍ଲେ କରିପାରୁ ନାହିଁ କାରଣ ଇଣ୍ଟରନେଟ୍ ଆବଶ୍ୟକ ବୋଲି ଏହା ଦର୍ଶାଉଛି ",
+ "description": "ଆପଣ YouTube କଣ୍ଟେଣ୍ଟ୍ ଡାଉନଲୋଡ୍ କରିଥାଇପାରନ୍ତି । କେବଳ ଅନଲାଇନ୍ ଥିବା ସମୟରେ ହିଁ ଆପଣ YouTube କଣ୍ଟେଣ୍ଟ୍ ପ୍ଲେ କରିପାରିବେ । କମ୍ପ୍ୟୁଟରକୁ ଇଣ୍ଟରନେଟ୍ ରେ କନେକ୍ଟ କରନ୍ତୁ ଏବଂ ଆଉଥରେ ଚେଷ୍ଟା କରନ୍ତୁ ।"
+ },
+ {
+ "topic": "ମୋର DIKSHA ଡେସ୍କଟପ ଆପ୍ ଅପଡେଟ୍ କରିବାର ଅଛି",
+ "description": "ଆପଣଙ୍କ କମ୍ପ୍ୟୁଟରକୁ ଇଣ୍ଟରନେଟରେ କନେକ୍ଟ କରନ୍ତୁ, ଏବଂ ସଦ୍ୟତମ ଆପ୍ ଭର୍ସନ୍ ପାଇଁ ଦେଖନ୍ତୁ, https://staging.sunbirded.org/desktop/latest"
+ },
+ {
+ "topic": "ଇଣ୍ଟରନେଟ୍ କନେକ୍ସନ୍ ଥିବା ଲାପଟପ୍ ମୋ ପାଖରେ ନାହିଁ, କିନ୍ତୁ ମୁଁ ଡେସ୍କଟପ୍ ଆପ୍ ରେ ଥିବା କଣ୍ଟେଣ୍ଟ୍ ଯୋଗ କରିବାକୁ କିମ୍ବା ଅପଡେଟ୍ କରିବାକୁ ଚାହୁଁଛି ।",
+ "description": "ଯଦି ଆପଣଙ୍କର ମୋବାଇଲ୍ ଫୋନ୍ ଥାଏ, ତେବେ google playstore ରୁ DIKSHA ମୋବାଇଲ୍ ଆପ୍ ଡାଉନଲୋଡ୍ କରନ୍ତୁ ।\nଆପ୍ ରେ କଣ୍ଟେଣ୍ଟ୍ ବ୍ରାଉଜ୍ କରନ୍ତୁ ।\nDIKSHA ଲାଇବ୍ରେରୀରୁ କଣ୍ଟେଣ୍ଟ୍ ଡାଉନଲୋଡ୍ କରନ୍ତୁ ।\nଏହାକୁ ପେନଡ୍ରାଇଭ୍ କିମ୍ବା SD କାର୍ଡରେ କପି କରନ୍ତୁ ଏବଂ DIKSHA ଡେସ୍କଟପ୍ ଆପ୍ ରେ ଅପଲୋଡ୍ କରନ୍ତୁ ।"
+ },
+ {
+ "topic": "ଏକ ନିର୍ଦ୍ଦିଷ୍ଟ ବିଷୟରେ ମୁଁ କଣ୍ଟେଣ୍ଟ୍ ପାଉନାହିଁ, ବା ମୋତେ କଣ୍ଟେଣ୍ଟ୍ ଅପ୍ରାସଙ୍ଗିକ ଲାଗୁଛି",
+ "description": "କଣ୍ଟେଣ୍ଟ୍ ସର୍ଚ୍ଚ କରିବା ପାଇଁ, DIKSHA ର ଅନଲାଇନ୍ ଲାଇବ୍ରେରୀ ବ୍ରାଉଜ୍ କରନ୍ତୁ । ତଥାପି ଯଦି ଏହା ଉପଲବ୍ଧ ନଥାଏ, କଣ୍ଟେଣ୍ଟ୍ ସମ୍ବନ୍ଧରେ ଆପଣଙ୍କ ଫିଡବ୍ୟାକ୍ ରାଜ୍ୟ SCERT କୁ ପଠାନ୍ତୁ "
+ },
+ {
+ "topic": "ଏହି ଆପ୍ ବହୁତ ସ୍ଲୋ ଅଟେ",
+ "description": "ଆପ୍ କାର୍ଯ୍ୟକ୍ଷମତାକୁ ଗତିଶୀଳ କରିବା ପାଇଁ, ନିମ୍ନଲିଖିତ କାର୍ଯ୍ୟ କରନ୍ତୁ: \n ଆପଣଙ୍କ କମ୍ପ୍ୟୁଟରର ସିଷ୍ଟମ୍ କନଫିଗରେସନ୍ କୁ ଯାଆନ୍ତୁ । ସର୍ବନିମ୍ନ କନଫିଗରେସନ୍ ଏହା ହେବା ଉଚିତ୍:\n2 GB RAM \nଡୁଆଲ୍ କୋର୍ ପ୍ରୋସେସର \n ଯଦି ଆପଣଙ୍କ କମ୍ପ୍ୟୁଟରରେ ଏହି କନଫିଗରେସନ୍ ଅଛି କିମ୍ବା ଏହାଠାରୁ ଅଧିକ ଅଛି, ତେବେ ଆପ୍ ରିଷ୍ଟାର୍ଟ କରନ୍ତୁ ।\n ଏହା କରିବା ପରେ ମଧ୍ୟ ଯଦି ସ୍ଲୋ ହୁଏ, ତେବେ ଏଠାକୁ ଯାଆନ୍ତୁ: ଟାସ୍କ ମ୍ୟାନେଜର୍ , ସମସ୍ତ ଅବ୍ୟବହୃତ ବ୍ୟାକଗ୍ରାଉଣ୍ଡ ପ୍ରୋସେସ୍ କୁ ସିଲେକ୍ଟ କରନ୍ତୁ ଏବଂ ଏଣ୍ଡ୍ ଟାସ୍କ ରେ କ୍ଲିକ୍ କରନ୍ତୁ "
+ },
+ {
+ "topic": "ମୁଁ ପେନଡ୍ରାଇଭକୁ କଣ୍ଟେଣ୍ଟ୍ କପି କରିବାରେ ବିଫଳ",
+ "description": "କଣ୍ଟେଣ୍ଟକୁ ପେନଡ୍ରାଇଭକୁ କପି କରିବା ପାଇଁ, ନିମ୍ନଲିଖିତ ସୋପାନ ଅନୁସରଣ କରନ୍ତୁ: \nକମ୍ପ୍ୟୁଟର ସେଟିଂସ୍ କୁ ଯାଆନ୍ତୁ । USB ଡ୍ରାଇଭ୍ ରାଇଟ୍-ପ୍ରୋଟେକ୍ଟେଡ୍ କି ନାହିଁ ଯାଞ୍ଚକରନ୍ତୁ । ଯଦି ଏହା ସେପରି ହୋଇଥାଏ, ପ୍ରୋଟେକ୍ସନକୁ ଡିସେବଲ୍ କରନ୍ତୁ \nପେନଡ୍ରାଇଭରେ ଫ୍ରି ସ୍ପେସ୍ ଅଛି କି ନାହିଁ ଯାଞ୍ଚକରନ୍ତୁ । ପେନଡ୍ରାଇଭରୁ ଅଦରକାରୀ ଫାଇଲ୍ ଡିଲିଟ୍ କରନ୍ତୁ "
+ },
+ {
+ "topic": "ମୁଁ ପେନଡ୍ରାଇଭରେ କଣ୍ଟେଣ୍ଟ୍ ଲୋଡ୍ କରିଛି, କିନ୍ତୁ ଏବେ ଏହା ଖାଲି ଦେଖାଉଛି ",
+ "description": "ଆପଣଙ୍କ ପେନଡ୍ରାଇଭ୍ କିମ୍ବା କମ୍ପ୍ୟୁଟର ଭାଇରସ୍ ଦ୍ୱାରା ପ୍ରଭାବିତ ହୋଇଥାଇପାରେ । ଯାଞ୍ଚକରନ୍ତୁ କି:\n* ଆପଣଙ୍କ ମେସିନ୍ ରେ ଆଣ୍ଟି ଭାଇରସ୍ ସଫ୍ଟୱେର୍ ଇନଷ୍ଟଲ୍ ହୋଇଛି \n* ଅଜଣା ମେସିନ୍ ସହ ପ୍ଲଗ୍ ଇନ୍ କରିବା ପୂର୍ବରୁ ଯାଞ୍ଚକରନ୍ତୁ କି ଆପଣଙ୍କ ପେନଡ୍ରାଇଭ୍ ରାଇଟ୍-ପ୍ରୋଟେକ୍ଟେଡ୍ ଅଛି "
+ },
+ {
+ "topic": "ମୋ ପେନଡ୍ରାଇଭକୁ ଏବଂ ପେନଡ୍ରାଇଭରୁ କଣ୍ଟେଣ୍ଟ୍ କପି କରିବା ପାଇଁ ଅଧିକ ସମୟ ଲାଗୁଛି ",
+ "description": "କପି କରିବାକୁ ଲାଗୁଥିବା ସମୟ କଣ୍ଟେଣ୍ଟ୍ ଫାଇଲର ଆକାର ଉପରେ ନିର୍ଭର କରେ । କିଛି ବୃହତ୍ ପାଠ୍ୟପୁସ୍ତକ କପି ହେବାକୁ ଅଧିକ ସମୟ ଲାଗେ । ଆମେ ସୁପାରିଶ କରୁଛୁ କି ଏହି ପ୍ରକ୍ରିୟା ଚାଲିବା ସମୟରେ ଆପଣ ବନ୍ଦ କରନ୍ତୁ ନାହିଁ । ଏପରି କରିବା ଦ୍ୱାରା ଫାଇଲ୍ ଠିକ୍ ରହିବ ନାହିଁ । "
+ },
+ {
+ "topic": "DIKSHA କଣ୍ଟେଣ୍ଟ୍ ହେତୁ ମୋ କମ୍ପ୍ୟୁଟରରେ କିଛି ଫ୍ରି ସ୍ପେସ୍ ନାହିଁ ",
+ "description": "ଆପଣଙ୍କ କମ୍ପ୍ୟୁଟରରେ ସ୍ପେସ୍ ଫ୍ରି କରିବା ପାଇଁ, ଆପ୍ ର ମାଇଁ ଡାଉନଲୋଡସ୍ ଟ୍ୟାବ୍ ରୁ ଡାଉନଲୋଡ୍ ହୋଇଥିବା କଣ୍ଟେଣ୍ଟ୍ ଡିଲିଟ୍ କରନ୍ତୁ "
+ },
+ {
+ "topic": "ମୋ Ubuntu ସିଷ୍ଟମରେ DIKSHA Desktop ଆପ୍ଲିକେସନ୍ ଇନଷ୍ଟଲ୍ କରିବାରେ ବିଫଳ",
+ "description": "ଆପଣଙ୍କ ubuntu ସିଷ୍ଟମରେ DIKSHA ଡେସ୍କଟପ ଆପ୍ଲିକେସନ୍ ଇନଷ୍ଟଲ୍ କରିବା ପାଇଁ:
\n1) ଆପଣଙ୍କ ଟର୍ମିନାଲ୍ ଓପନ୍ କରନ୍ତୁ
\n2) ଯେଉଁଠାରେ exe ଫାଇଲ୍ ଡାଉନଲୋଡ୍ ହୋଇଛି, ସେହି ଡିରେକ୍ଟୋରି ବଦଳାଇବା ପାଇଁ, command cd ରନ୍ କରନ୍ତୁ । ଉଦାହରଣ ସ୍ୱରୂପ, ଯଦି exe ଫାଇଲ୍ ଡାଉନଲୋଡସ୍ ଫୋଲଡରରେ ସେଭ୍ ହୋଇଛି, ତେବେ command cd Downloads ରନ୍ କରନ୍ତୁ
\n3) sudo dpkg -i ରନ୍ କରନ୍ତୁ
\nଏହି command ସଫଳତାର ସହ ରନ୍ କରିବା ପରେ, ଆପ୍ଲିକେସନ୍ ଲଞ୍ଚ୍ ହେବ
"
+ }
+ ],
+ "constants": {
+ "charactersLeft": "ଏତିକି ଅକ୍ଷର ବାକି ",
+ "explainMsg": "ଆପଣ ସମସ୍ୟାଟିର ବ୍ୟାଖ୍ୟା କରିପାରିବେ କି ?",
+ "faqMsg": "ବାରମ୍ବାର ପଚରା ଯାଉଥିବା ପ୍ରଶ୍ନ ",
+ "help": " ସାହାଯ୍ୟ",
+ "helpMsg": "ଏହି ଉତ୍ତର ଆପଣଙ୍କ କାମରେ ଆସିଲା କି ?",
+ "initiateEmailButton": "ଇମେଲ ଆରମ୍ଭ କରନ୍ତୁ ",
+ "knowMoreMsg": "ଆପଣ ଆଉ କଣ ଜାଣିବାକୁ ଚାହୁଁଛନ୍ତି ?",
+ "noMsg": "ନାହିଁ ",
+ "reportIssue": "ଅସୁବିଧା ଜଣାନ୍ତୁ",
+ "reportIssueMsg": "ଅନ୍ୟ ସମସ୍ୟା ଜଣାନ୍ତୁ",
+ "resolveMsg": "ଆପଣଙ୍କ ସମସ୍ୟାର ସମାଧାନ କରିବା ନିମନ୍ତେ ପୂରା ସୂଚୀ ଦେଖନ୍ତୁ ",
+ "sorryMsg": "ସେଥିପାଇଁ ଦୁଃଖିତ",
+ "submitButton": "ସବମିଟ୍ କରନ୍ତୁ",
+ "tellMoreMsg": "ଆପଣ ସମ୍ମୁଖୀନ ହେଉଥିବା ସମସ୍ୟା ସମ୍ପର୍କରେ ଆମକୁ ଅଧିକ ବିବରଣୀ ଦିଅନ୍ତୁ",
+ "thanksMsg": "ଆପଣଙ୍କ ପ୍ରତିକ୍ରିୟା ପାଇଁ ଧନ୍ୟବାଦ ",
+ "triggerEmailMsg": "ଟେକ୍ସଟ୍ ବକ୍ସରେ ଆପଣ ବିସ୍ତୃତ ବିବରଣୀ ଯୋଗ କରି ଇନିସିଏଟ୍ ଇମେଲ୍ ବଟମ୍ ଟ୍ୟାପ୍ କଲେ, ଆମେ ଆପଣଙ୍କ ତରଫରୁ ଏକ ଇମେଲ୍ ଟ୍ରିଗର କରିବୁ | ଆପଣ ସେଠାରେ ଅଧିକ ବିବରଣୀ ଓ /କିମ୍ବା ଫାଇଲ୍ ଆଟାଚ୍ କରିପାରିବେ",
+ "typeHere": "ଏଠାରେ ଲେଖନ୍ତୁ ",
+ "yesMsg": "ହଁ "
+ }
+}
\ No newline at end of file
diff --git a/utils/DesktopFAQ/faq-pa.json b/utils/DesktopFAQ/faq-pa.json
new file mode 100644
index 000000000..23b6a878f
--- /dev/null
+++ b/utils/DesktopFAQ/faq-pa.json
@@ -0,0 +1,68 @@
+{
+ "faqs": [
+ {
+ "topic": "ਮੈਂ ਆਪਣਾ ਬੋਰਡ, ਮਾਧਿਅਮ, ਕਲਾਸ ਅਤੇ ਵਿਸ਼ਾ ਨਹੀਂ ਦੇਖ ਸਕਦਾ",
+ "description": "ਤੁਹਾਡਾ ਰਾਜ ਇਸ ਸਮੇਂ ਸਾਰੇ ਬੋਰਡਾਂ, ਮਾਧਿਅਮ, ਕਲਾਸਾਂ ਅਤੇ ਵਿਸ਼ਿਆਂ ਦਾ ਸਮਰਥਨ ਨਹੀਂ ਕਰਦਾ। ਜਿਉਂ ਹੀ ਤੁਹਾਡਾ ਰਾਜ ਉਹਨਾਂ ਨੂੰ ਸ਼ਾਮਲ ਕਰੇਗਾ, ਤੁਸੀਂ ਇਸਨੂੰ ਸੂਚੀ ਵਿੱਚ ਵੇਖੋਗੇ"
+ },
+ {
+ "topic": "ਮੈਂ ਕੰਟੇਂਟ ਡਾਊਨਲੋਡ ਕੀਤੇ ਹਨ, ਪਰ ਮੈਂ ਇਸਨੂੰ ਚਲਾਉਣ ਵਿੱਚ ਅਸਮਰੱਥ ਹਾਂ ਕਿਉਂਕਿ ਇਹ ਕਹਿੰਦਾ ਹੈ ਕਿ ਮੈਨੂੰ ਇੰਟਰਨੈਟ ਦੀ ਜ਼ਰੂਰਤ ਹੈ",
+ "description": "ਤੁਸੀਂ ਯੂਟਿਊਬ ਕੰਟੇਂਟ ਨੂੰ ਡਾਊਨਲੋਡ ਕੀਤਾ ਹੋ ਸਕਦਾ ਹੈ। ਤੁਸੀਂ ਉਦੋਂ ਹੀ ਯੂਟਿਊਬ ਕੰਟੇਂਟ ਨੂੰ ਚਲਾ ਸਕਦੇ ਹੋ ਜਦੋਂ ਤੁਸੀਂ ਆਨਲਾਈਨ ਹੋ। ਕੰਪਿਊਟਰ ਨੂੰ ਇੰਟਰਨੈਟ ਨਾਲ ਕਨੈਕਟ ਕਰੋ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।"
+ },
+ {
+ "topic": "ਮੈਨੂੰ ਆਪਣੀ DIKSHA ਡੈਸਕਟਾਪ ਐਪ ਨੂੰ ਅਪਡੇਟ ਕਰਨ ਦੀ ਜ਼ਰੂਰਤ ਹੈ",
+ "description": "ਆਪਣੇ ਕੰਪਿਊਟਰ ਨੂੰ ਇੰਟਰਨੈਟ ਨਾਲ ਕਨੈਕਟ ਕਰੋ ਅਤੇ ਨਵੀਨਤਮ ਐਪ ਸੰਸਕਰਣ ਲਈ https://staging.sunbirded.org/desktop/latest ਚੈੱਕ ਕਰੋ"
+ },
+ {
+ "topic": "ਮੇਰੇ ਕੋਲ ਇੰਟਰਨੈਟ ਕਨੈਕਸ਼ਨ ਵਾਲੇ ਲੈਪਟਾਪ ਤੱਕ ਐਕਸੈਸ ਨਹੀਂ ਹੈ, ਪਰ ਮੈਂ ਡੈਸਕਟੌਪ ਐਪ 'ਤੇ ਕੰਟੇਂਟ ਨੂੰ ਸ਼ਾਮਲ ਕਰਨਾ ਜਾਂ ਅਪਡੇਟ ਕਰਨਾ ਚਾਹੁੰਦਾ ਹਾਂ",
+ "description": "ਜੇ ਤੁਹਾਡੇ ਕੋਲ ਮੋਬਾਈਲ ਫ਼ੋਨ ਹੈ, DIKSHA ਮੋਬਾਈਲ ਐਪ ਨੂੰ ਗੂਗਲ ਪਲੇਸਟੋਰ ਤੋਂ ਡਾਊਨਲੋਡ ਕਰੋ।\nਐਪ ਵਿਚਲੇ ਕੰਟੇਂਟ ਲਈ ਬਰਾਊਜ਼ ਕਰੋ।\nDIKSHA ਲਾਇਬ੍ਰੇਰੀ ਤੋਂ ਕੰਟੇਂਟ ਡਾਊਨਲੋਡ ਕਰੋ।\nਇਸਨੂੰ ਪੈੱਨਡਰਾਈਵ ਜਾਂ SD ਕਾਰਡ 'ਤੇ ਕਾਪੀ ਕਰੋ ਅਤੇ ਇਸਨੂੰ DIKSHA ਐਪ 'ਤੇ ਅਪਲੋਡ ਕਰੋ।"
+ },
+ {
+ "topic": "ਮੈਨੂੰ ਕਿਸੇ ਖ਼ਾਸ ਵਿਸ਼ੇ ਲਈ ਕੰਟੇਂਟ ਨਹੀਂ ਮਿਲਦੇ, ਜਾਂ ਅਢੁੱਕਵੇਂ ਕੰਟੇਂਟ ਮਿਲਦੇ ਹਨ",
+ "description": "ਕੰਟੇਂਟ ਦੀ ਭਾਲ ਕਰਨ ਲਈ DIKSHA ਦੀ ਆਨਲਾਈਨ ਲਾਇਬ੍ਰੇਰੀ ਨੂੰ ਬਰਾਊਜ਼ ਕਰੋ। ਜੇ ਇਹ ਅਜੇ ਵੀ ਉਪਲੱਬਧ ਨਹੀਂ ਹੈ, ਤਾਂ ਕੰਟੇਂਟ ਬਾਰੇ ਆਪਣੀ ਫੀਡਬੈਕ ਸਟੇਟ SCERT ਨੂੰ ਭੇਜੋ"
+ },
+ {
+ "topic": "ਐਪ ਬਹੁਤ ਹੌਲੀ ਹੈ",
+ "description": "ਐਪ ਦੀ ਕਾਰਗੁਜ਼ਾਰੀ ਨੂੰ ਤੇਜ਼ ਕਰਨ ਲਈ, ਇਹ ਕਰੋ:\n ਆਪਣੇ ਕੰਪਿਊਟਰ ਦੀ ਸਿਸਟਮ ਕੌਨਫਿਗਰੇਸ਼ਨ 'ਤੇ ਜਾਓ। ਘੱਟੋ ਘੱਟ ਕੌਂਫਿਗਰੇਸ਼ਨ ਹੋਣੀ ਚਾਹੀਦੀ ਹੈ:\n2 GB RAM \nDual Core Processor \n ਜੇ ਤੁਹਾਡਾ ਕੰਪਿਊਟਰ ਇਸ ਕੌਂਫਿਗਰੇਸ਼ਨ ਨਾਲ ਮੇਲ ਖਾਂਦਾ ਜਾਂ ਵੱਧ ਹੈ, ਤਾਂ ਐਪ ਨੂੰ ਮੁੜ ਚਾਲੂ ਕਰੋ।\n ਅਜਿਹਾ ਕਰਨ ਤੋਂ ਬਾਅਦ, ਜੇ ਇਹ ਅਜੇ ਵੀ ਹੌਲੀ ਹੈ, ਟਾਸਕ ਮੈਨੇਜਰ 'ਤੇ ਜਾਓ,\nਸਾਰੀਆਂ ਨਾ ਵਰਤੀਆਂ ਬੈਕਗਰਾਂਊਡ ਪ੍ਰਕਿਰਿਆਵਾਂ ਨੂੰ ਚੁਣੋ ਅਤੇ ਕਲਿੱਕ ਕਰੋEnd Task "
+ },
+ {
+ "topic": "ਮੈਂ ਪੈੱਨਡਰਾਈਵ ਵਿੱਚ ਕੰਟੇਂਟ ਦੀ ਨਕਲ ਕਰਨ ਵਿੱਚ ਅਸਮਰੱਥ ਹਾਂ",
+ "description": "ਪੈੱਨਡਰਾਈਵ 'ਤੇ ਕੰਟੇਂਟ ਦੀ ਨਕਲ ਕਰਨ ਲਈ, ਇਹ ਕਰੋ:\nਆਪਣੀ ਕੰਪਿਊਟਰ ਸੈਟਿੰਗਸ 'ਤੇ ਜਾਓ। ਜਾਂਚ ਕਰੋ ਕਿ ਕੀ USB ਡਰਾਈਵ ਲਿਖਣ ਤੋਂ ਸੁਰੱਖਿਅਤ ਹੈ। ਜੇ ਇਹ ਹੈ, ਤਾਂ ਸੁਰੱਖਿਆ ਨੂੰ ਅਯੋਗ ਕਰੋ \nਜਾਂਚ ਕਰੋ ਕਿ ਕੀ ਪੈੱਨਡਰਾਈਵ ਵਿੱਚ ਖ਼ਾਲੀ ਥਾਂ ਹੈ। ਆਪਣੀ ਪੈੱਨਡਰਾਈਵ ਤੋਂ ਅਣਚਾਹੀਆਂ ਫਾਈਲਾਂ ਨੂੰ ਡੀਲੀਟ ਕਰੋ \n"
+ },
+ {
+ "topic": "ਮੈਂ ਆਪਣੀ ਪੇਨਡਰਾਈਵ 'ਤੇ ਕੰਟੇਂਟ ਲੋਡ ਕੀਤੇ ਸਨ, ਪਰ ਹੁਣ ਮੈਂ ਵੇਖਦਾ ਹਾਂ ਕਿ ਇਹ ਖ਼ਾਲੀ ਹੈ",
+ "description": "ਤੁਹਾਡੀ ਪੇਨਡਰਾਈਵ ਜਾਂ ਕੰਪਿਊਟਰ ਕਿਸੇ ਵਾਇਰਸ ਨਾਲ ਸੰਕਰਮਿਤ ਹੋ ਸਕਦਾ ਹੈ। ਇਹ ਵੇਖੋ ਕਿ:\n* ਤੁਹਾਡੀ ਮਸ਼ੀਨ 'ਤੇ ਇਕ ਐਂਟੀ ਵਾਇਰਸ ਸਾਫਟਵੇਅਰ ਸਥਾਪਤ ਹੈ\n* ਤੁਹਾਡੀ ਪੇਨਡਰਾਈਵ ਨੂੰ ਅਣਜਾਣ ਮਸ਼ੀਨਾਂ ਵਿਚ ਲਗਾਉਣ ਤੋਂ ਪਹਿਲਾਂ ਲਿਖਤ-ਸੁਰੱਖਿਅਤ ਕੀਤਾ ਗਿਆ ਹੈ"
+ },
+ {
+ "topic": "ਮੇਰੀ ਪੇਨਡਰਾਈਵ 'ਤੇ ਅਤੇ ਪੇਨਡਰਾਈਵ ਤੋਂ ਕੰਟੇਂਟ ਦੀ ਨਕਲ ਕਰਨ ਲਈ ਸਮਾਂ ਲਗਦਾ ਹੈ",
+ "description": "ਕਾਪੀ ਕਰਨ ਲਈ ਲਿਆ ਗਿਆ ਸਮਾਂ ਕੰਟੇਂਟ ਫਾਈਲ ਦੇ ਅਕਾਰ 'ਤੇ ਨਿਰਭਰ ਕਰਦਾ ਹੈ। ਕੁਝ ਵੱਡੀਆਂ ਪਾਠ-ਪੁਸਤਕਾਂ ਦੀ ਨਕਲ ਕਰਨ ਲਈ ਸਮਾਂ ਲੱਗਦਾ ਹੈ। ਅਸੀਂ ਤੁਹਾਨੂੰ ਸਿਫਾਰਸ਼ ਕਰਦੇ ਹਾਂ ਕਿ ਤੁਸੀਂ ਪ੍ਰਕਿਰਿਆ ਨੂੰ ਵਿਚਕਾਰ ਨਾ ਰੋਕੋ। ਅਜਿਹਾ ਕਰਨ ਨਾਲ ਅਸੰਗਤ ਫਾਈਲਾਂ ਲੱਗ ਸਕਦੀਆਂ ਹਨ।"
+ },
+ {
+ "topic": "ਮੇਰੇ ਕੰਪਿਊਟਰ ਵਿੱਚ DIKSHA ਕੰਟੇਂਟ ਕਾਰਨ ਕੋਈ ਖ਼ਾਲੀ ਥਾਂ ਨਹੀਂ ਹੈ",
+ "description": "ਆਪਣੇ ਕੰਪਿਊਟਰ 'ਤੇ ਜਗ੍ਹਾ ਖ਼ਾਲੀ ਕਰਨ ਲਈ ਐਪ ਦੀ ਮਾਈ ਡਾਊਨਲੋਡਸ ਟੈਬ ਤੋਂ ਡਾਊਨਲੋਡ ਕੀਤੇ ਕੰਟੇਂਟ ਨੂੰ ਡੀਲੀਟ ਕਰੋ"
+ },
+ {
+ "topic": "ਮੇਰੇ ਉਬੰਤੂ ਸਿਸਟਮ 'ਤੇ DIKSHA ਡੈਸਕਟਾਪ ਐਪਲੀਕੇਸ਼ਨ ਸਥਾਪਤ ਕਰਨ ਵਿੱਚ ਅਸਮਰੱਥ",
+ "description": "ਆਪਣੇ ਉਬੰਤੂ ਸਿਸਟਮ 'ਤੇ DIKSHA ਡੈਸਕਟਾਪ ਐਪਲੀਕੇਸ਼ਨ ਨੂੰ ਸਥਾਪਤ ਕਰਨ ਲਈ:
\n1) ਆਪਣਾ ਟਰਮੀਨਲ ਖੋਲ੍ਹੋ
\n2) ਡਾਇਰੈਕਟਰੀ ਨੂੰ ਤਬਦੀਲ ਕਰਨ ਲਈ ਸੀਡੀ <ਲੋਕੇਸ਼ਨ> ਕਮਾਂਡ ਚਲਾਓ, ਜਿੱਥੇ exe ਫਾਈਲ ਡਾਊਨਲੋਡ ਕੀਤੀ ਗਈ ਹੈ। ਉਦਾਹਰਣ ਲਈ, ਜੇ exe ਨੂੰ ਡਾਊਨਲੋਡਸ ਫੋਲਡਰ ਵਿੱਚ ਸੇਵ ਕੀਤਾ ਗਿਆ ਹੈ, ਤਾਂ ਸੀਡੀ ਡਾਊਨਲੋਡਸ ਕਮਾਂਡ ਚਲਾਓ
\n3) sudo dpkg -i <ਫਾਈਲ ਦਾ ਨਾਮ>ਕਮਾਂਡ ਚਲਾਓ
\nਇਸ ਕਮਾਂਡ ਨੂੰ ਸਫ਼ਲਤਾਪੂਰਵਕ ਚਲਾਉਣ 'ਤੇ ਐਪਲੀਕੇਸ਼ਨ ਲਾਂਚ ਹੋ ਜਾਂਦੀ ਹੈ
"
+ }
+ ],
+ "constants": {
+ "charactersLeft": "ਅੱਖਰ ਬਚੇ",
+ "explainMsg": "ਕੀ ਤੁਸੀਂ ਸਮੱਸਿਆ ਬਾਰੇ ਦੱਸ ਸਕਦੇ ਹੋ?",
+ "faqMsg": "ਅਕਸਰ ਪੁੱਛੇ ਜਾਣ ਵਾਲੇ ਸਵਾਲ",
+ "help": "ਮਦਦ ",
+ "helpMsg": "ਕੀ ਇਸ ਜਵਾਬ ਨੇ ਤੁਹਾਡੀ ਮਦਦ ਕੀਤੀ?",
+ "initiateEmailButton": "ਈਮੇਲ ਅਰੰਭ ਕਰੋ",
+ "knowMoreMsg": "ਤੁਸੀਂ ਹੋਰ ਕੀ ਜਾਣਨਾ ਚਾਹੋਗੇ?",
+ "noMsg": "ਨਹੀਂ",
+ "reportIssue": " ਮੁੱਦੇ ਦੀ ਰਿਪੋਰਟ ਕਰੋ",
+ "reportIssueMsg": "ਹੋਰ ਮੁੱਦੇ ਦੀ ਰਿਪੋਰਟ ਕਰੋ",
+ "resolveMsg": "ਆਪਣੇ ਮੁੱਦੇ ਨੂੰ ਸੁਲਝਾਉਣ ਲਈ ਸੂਚੀ ਨੂੰ ਵੇਖੋ",
+ "sorryMsg": "ਉਸ ਲਈ ਮੈ ਅਫ਼ਸੋਸ ਕਰਦਾਂ!",
+ "submitButton": "ਜਮ੍ਹਾ ਕਰੋ",
+ "tellMoreMsg": "ਆਪਣੀਆ ਸਮੱਸਿਆ ਦੇ ਬਾਰੇ ਸਾਨੂੰ ਹੋਰ ਦੱਸੋ",
+ "thanksMsg": "ਤੁਹਾਡੇ ਜਵਾਬ ਲਈ ਧੰਨਵਾਦ!",
+ "triggerEmailMsg": "ਟੈਕਸਟ ਬਾਕਸ ਵਿੱਚ ਵੇਰਵੇ ਸ਼ਾਮਲ ਕਰਨ ਅਤੇ ਈਮੇਲ ਅਰੰਭ ਬਟਨ ਨੂੰ ਟੈਪ ਕਰਨ ਤੋਂ ਬਾਅਦ, ਅਸੀਂ ਤੁਹਾਡੇ ਵੱਲੋਂ ਇਕ ਈਮੇਲ ਜਾਰੀ ਕਰਾਂਗੇ।ਤੁਸੀਂ ਇਸ ਈਮੇਲ ਵਿੱਚ ਹੋਰ ਵੇਰਵੇ ਅਤੇ /ਜਾਂ ਫਾਈਲਾਂ ਨੂੰ ਇੱਥੇ ਜੋੜ ਸਕਦੇ ਹੋ।",
+ "typeHere": "ਇੱਥੇ ਟਾਈਪ ਕਰੋ ...",
+ "yesMsg": "ਹਾਂ"
+ }
+}
\ No newline at end of file
diff --git a/utils/DesktopFAQ/faq-ta.json b/utils/DesktopFAQ/faq-ta.json
new file mode 100644
index 000000000..73ac9b753
--- /dev/null
+++ b/utils/DesktopFAQ/faq-ta.json
@@ -0,0 +1,68 @@
+{
+ "faqs": [
+ {
+ "topic": "எனது வாரியம், மொழி வழி கல்வி, வகுப்பு மற்றும் தலைப்பு ஆகியவற்றை என்னால் பார்க்க முடியவில்லை ",
+ "description": "உங்கள் மாநிலம் தற்போது அனைத்து வாரியங்கள், ஊடகங்கள், வகுப்புகள் மற்றும் பாடங்களை ஆதரிக்கவில்லை. உங்கள் மாநிலம் அவற்றைச் சேர்த்தவுடன், அதை நீங்கள் பட்டியலில் காண்பீர்கள்"
+ },
+ {
+ "topic": "நான் உள்ளடக்கத்தைப் பதிவிறக்கம் செய்தேன், ஆனால் எனக்கு இணையம் தேவை என்று கூறியதால் என்னால் அதை இயக்க முடியவில்லை",
+ "description": "நீங்கள் YouTube உள்ளடக்கத்தை பதிவிறக்கம் செய்திருக்கலாம். நீங்கள் ஆன்லைனில் இருக்கும்போது மட்டுமே YouTube உள்ளடக்கத்தை இயக்க முடியும். கணினியை இணையத்துடன் இணைக்க மீண்டும் முயற்சிக்கவும்."
+ },
+ {
+ "topic": "எனது DIKSHA டெஸ்க்டாப் செயலியை புதுப்பிக்க வேண்டும்",
+ "description": "உங்கள் கணினியை இணையத்துடன் இணைத்து, சமீபத்திய பயன்பாட்டு பதிப்பிற்காக https://staging.sunbirded.org/desktop/latest க்கு செல்லவும் "
+ },
+ {
+ "topic": "இணைய இணைப்புடன் மடிக்கணினிக்கு அணுகல் இல்லை, ஆனால் டெஸ்க்டாப் செயலியில் உள்ளடக்கத்தை சேர்க்க அல்லது புதுப்பிக்க விரும்புகிறேன்",
+ "description": "உங்களிடம் கைப்பேசி இருந்தால், கூகிள் பிளேஸ்டோரிலிருந்து DIKSHA மொபைல் செயலியை பதிவிறக்கவும். செயலியில் உள்ள உள்ளடக்கத்திற்காக உலாவுக. DIKSHA நூலகத்திலிருந்து உள்ளடக்கத்தைப் பதிவிறக்கவும். பென்ட்ரைவ் அல்லது எஸ்டி கார்டில் நகலெடுத்து அதை DIKSHA டெஸ்க்டாப் செயலியில் பதிவேற்றவும்."
+ },
+ {
+ "topic": "ஒரு குறிப்பிட்ட தலைப்புக்கான உள்ளடக்கம் கிடைக்கவில்லை, அல்லது பொருத்தமற்ற உள்ளடக்கத்தைக் காண்கிறேன்",
+ "description": "உள்ளடக்கத்தைத் தேட DIKSHA இன் ஆன்லைன் நூலகத்தை உலாவுக. இது இன்னும் கிடைக்கவில்லை என்றால், உள்ளடக்கத்தைப் பற்றிய உங்கள் கருத்தை மாநில SCERT க்கு அனுப்புங்கள்"
+ },
+ {
+ "topic": "பயன்பாடு மிகவும் மெதுவாக உள்ளது",
+ "description": "செயலியின் செயல்திறனை விரைவுபடுத்த, பின்வருவனவற்றைச் செய்யுங்கள்: உங்கள் கணினியின் கணினி உள்ளமைவுக்குச் செல்லவும். குறைந்தபட்ச உள்ளமைவு இருக்க வேண்டும்: 2 ஜிபி ரேம் இரட்டை கோர் செயலி உங்கள் கணினி இந்த உள்ளமைவுடன் பொருந்தினால் அல்லது மீறினால், பயன்பாட்டை மறுதொடக்கம் செய்யுங்கள். இதைச் செய்தபின், அது இன்னும் மெதுவாக இருந்தால், பணி நிர்வாகி க்குச் சென்று, பயன்படுத்தப்படாத அனைத்து பின்னணி செயல்முறைகளையும் தேர்ந்தெடுத்து பணியை முடிக்க என்பதைக் கிளிக் செய்க"
+ },
+ {
+ "topic": "பென்ட்ரைவிற்கு உள்ளடக்கத்தை நகலெடுக்க என்னால் முடியவில்லை",
+ "description": "உள்ளடக்கத்தை பென் டிரைவில் நகலெடுக்க, பின்வருவனவற்றைச் செய்யுங்கள்: உங்கள் கணினி அமைப்புகளுக்குச் செல்லவும். யூ.எஸ்.பி டிரைவ் எழுத-பாதுகாக்கப்பட்டதா என சரிபார்க்கவும். அது இருந்தால், பாதுகாப்பை முடக்கவும் பென் டிரைவிற்கு இலவச இடம் இருக்கிறதா என்று சோதிக்கவும். பென்ட்ரைவிலிருந்து தேவையற்ற கோப்புகளை நீக்கு "
+ },
+ {
+ "topic": "எனது பென்ட்ரைவில் உள்ளடக்கத்தை ஏற்றினேன், ஆனால் இப்போது அது காலியாக இருப்பதைக் காண்கிறேன்",
+ "description": "உங்கள் பென்ட்ரைவ் அல்லது கணினி வைரஸால் பாதிக்கப்படலாம். இதைச் சரிபார்க்கவும்: * உங்கள் கணினியில் ஒரு வைரஸ் எதிர்ப்பு மென்பொருள் நிறுவப்பட்டுள்ளது * நீங்கள் அறியப்படாத கணினிகளில் செருகுவதற்கு முன்பு உங்கள் பென்ட்ரைவ் எழுத-பாதுகாக்கப்படுகிறது"
+ },
+ {
+ "topic": "எனது பென்ட்ரைவிலிருந்து உள்ளடக்கத்தை நகலெடுக்க நேரம் எடுக்கும்",
+ "description": "நகலெடுக்க எடுக்கப்பட்ட நேரம் உள்ளடக்கக் கோப்பின் அளவைப் பொறுத்தது. சில பெரிய பாடப்புத்தகங்கள் நகலெடுக்க நேரம் எடுக்கும். இடையில் செயல்பாட்டை நிறுத்த வேண்டாம் என்று நாங்கள் பரிந்துரைக்கிறோம். அவ்வாறு செய்வது சீரற்ற கோப்புகளுக்கு வழிவகுக்கும்."
+ },
+ {
+ "topic": "DIKSHA உள்ளடக்கம் காரணமாக எனது கணினியில் இடம் இல்லை",
+ "description": "உங்கள் கணினியில் இடத்தை விடுவிக்க பயன்பாட்டின் எனது பதிவிறக்கங்கள் தாவலில் இருந்து பதிவிறக்கம் செய்யப்பட்ட உள்ளடக்கத்தை நீக்கு"
+ },
+ {
+ "topic": "எனது உபுண்டு கணினியில் DIKSHA டெஸ்க்டாப் செயலியை நிறுவ முடியவில்லை",
+ "description": " உங்கள் உபுண்டு கணினியில் DIKSHA டெஸ்க்டாப் செயலியை நிறுவ: p>
1) உங்கள் டெர்மினல் திறக்கவும்
2) கோப்பகத்தை exe கோப்பு இருக்கும் இடத்திற்கு மாற்ற cd கட்டளையை இயக்கவும் பதிவிறக்கம் செய்யப்பட்டது. எடுத்துக்காட்டாக, பதிவிறக்க கோப்புறையில் exe சேமிக்கப்பட்டால், cd பதிவிறக்கங்கள்
3) கட்டளையை இயக்கவும் sudo dpkg -i
இந்த கட்டளையை வெற்றிகரமாக இயக்கும் போது பயன்பாடு தொடங்கப்பட்டது
"
+ }
+ ],
+ "constants": {
+ "charactersLeft": "விடுபட்ட எழுத்துக்கள்",
+ "explainMsg": "பிரச்சனையை நீங்கள் விளக்க முடியுமா?",
+ "faqMsg": "அடிக்கடி கேட்கப்படும் கேள்விகள்",
+ "help": "உதவி",
+ "helpMsg": "இந்த பதில் உங்களுக்கு உதவியதா?",
+ "initiateEmailButton": "மின்னஞ்சல் தொடங்குக",
+ "knowMoreMsg": "நீங்கள் இன்னும் தெரிந்து கொள்ள விரும்புகிறீர்களா?",
+ "noMsg": "இல்லை",
+ "reportIssue": "சிக்கலைப் புகாரளி",
+ "reportIssueMsg": "பிற சிக்கலைப் புகாரளி",
+ "resolveMsg": "உங்கள் சிக்கலை தீர்க்க பட்டியலை பாருங்கள்",
+ "sorryMsg": "மன்னிக்கவும்!",
+ "submitButton": "சமர்ப்பி",
+ "tellMoreMsg": "நீங்கள் சந்தித்த பிரச்சனை பற்றி மேலும் சொல்லுங்கள்",
+ "thanksMsg": "உங்கள் பதிலுக்கு நன்றி!",
+ "triggerEmailMsg": "நீங்கள் உரை பெட்டியில் விவரங்களைச் சேர்த்து, மின்னஞ்சல் தொடங்குக பொத்தானைத் தட்டவும், உங்கள் சார்பாக ஒரு மின்னஞ்சலை தூண்டுகிறோம். நீங்கள் மேலும் விவரங்களைச் சேர்க்க மற்றும் / அல்லது அங்கு கோப்புகளை இணைக்க முடியும்.",
+ "typeHere": "இங்கே உள்ளிடவும் ...",
+ "yesMsg": "ஆம்"
+ }
+}
\ No newline at end of file
diff --git a/utils/DesktopFAQ/faq-te.json b/utils/DesktopFAQ/faq-te.json
new file mode 100644
index 000000000..dc7b45332
--- /dev/null
+++ b/utils/DesktopFAQ/faq-te.json
@@ -0,0 +1,68 @@
+{
+ "faqs": [
+ {
+ "topic": "నా బోర్డు, మీడియం, క్లాస్ మరియు సబ్జెక్టును నేను చూడలేను",
+ "description": "మీ రాష్ట్రం ప్రస్తుతం అన్ని బోర్డులు, మాధ్యమాలు, తరగతులు మరియు విషయాలకు మద్దతు ఇవ్వదు. మీ రాష్ట్రం వాటిని జోడించిన వెంటనే, మీరు దానిని జాబితాలో చూస్తారు"
+ },
+ {
+ "topic": "నేను కంటెంట్ను డౌన్లోడ్ చేసాను, కాని నేను దీన్ని ప్లే చేయలేకపోతున్నాను ఎందుకంటే నాకు ఇంటర్నెట్ అవసరం అని చెప్పింది",
+ "description": "మీరు యూట్యూబ్ కంటెంట్ను డౌన్లోడ్ చేసి ఉండవచ్చు. మీరు ఆన్లైన్లో ఉన్నప్పుడు మాత్రమే మీరు యూట్యూబ్ కంటెంట్ను ప్లే చేయవచ్చు. కంప్యూటర్ను ఇంటర్నెట్కు కనెక్ట్ చేయండి మళ్లీ ప్రయత్నించండి."
+ },
+ {
+ "topic": "నేను నా DIKSHA డెస్క్టాప్ అనువర్తనాన్ని నవీకరించాలి",
+ "description": "మీ కంప్యూటర్ను ఇంటర్నెట్కు కనెక్ట్ చేయండి మరియు తాజా అనువర్తన సంస్కరణ కోసం https://staging.sunbirded.org/desktop/latest ని తనిఖీ చేయండి"
+ },
+ {
+ "topic": "నాకు ఇంటర్నెట్ కనెక్షన్ ఉన్న ల్యాప్టాప్కు ప్రాప్యత లేదు, కానీ నేను డెస్క్టాప్ అనువర్తనంలో కంటెంట్ను జోడించాలనుకుంటున్నాను లేదా నవీకరించాలనుకుంటున్నాను",
+ "description": "మీకు మొబైల్ ఫోన్ ఉంటే, గూగుల్ ప్లేస్టోర్ నుండి DIKSHA మొబైల్ అనువర్తనాన్ని డౌన్లోడ్ చేయండి.\n అనువర్తనంలోని కంటెంట్ కోసం బ్రౌజ్ చేయండి.\n DIKSHA లైబ్రరీ నుండి కంటెంట్ను డౌన్లోడ్ చేయండి.\n దీన్ని పెన్డ్రైవ్ లేదా SD కార్డ్లో కాపీ చేసి, DIKSHA డెస్క్టాప్ అనువర్తనానికి అప్లోడ్ చేయండి."
+ },
+ {
+ "topic": "నేను ఒక నిర్దిష్ట అంశం కోసం కంటెంట్ను కనుగొనలేదు, లేదా కంటెంట్ అసంబద్ధం అని నేను భావిస్తున్నాను",
+ "description": "కంటెంట్ కోసం శోధించడానికి DIKSHA యొక్క ఆన్లైన్ లైబ్రరీని బ్రౌజ్ చేయండి. ఇది ఇప్పటికీ అందుబాటులో లేకపోతే, కంటెంట్ గురించి మీ అభిప్రాయాన్ని స్టేట్ SCERT కి పంపండి"
+ },
+ {
+ "topic": "అనువర్తనం చాలా నెమ్మదిగా ఉంది",
+ "description": "అనువర్తన పనితీరును వేగవంతం చేయడానికి, కింది వాటిని చేయండి:\n మీ కంప్యూటర్ సిస్టమ్ కాన్ఫిగరేషన్కు వెళ్లండి. కనీస కాన్ఫిగరేషన్ ఉండాలి:\n 2 GB RAM \n ద్వంద్వ కోర్ ప్రాసెసర్ li> \n మీ కంప్యూటర్ ఈ కాన్ఫిగరేషన్తో సరిపోలితే లేదా మించి ఉంటే, అనువర్తనాన్ని మళ్ళీ ప్రారంభించండి.\n దీన్ని చేసిన తర్వాత, అది ఇంకా నెమ్మదిగా ఉంటే, టాస్క్ మేనేజర్ కు వెళ్లండి,\n ఉపయోగించని అన్ని నేపథ్య ప్రక్రియలను ఎంచుకోండి మరియు ఎండ్ టాస్క్ క్లిక్ చేయండి"
+ },
+ {
+ "topic": "నేను పెన్డ్రైవ్కు కంటెంట్ను కాపీ చేయలేకపోతున్నాను",
+ "description": "పెన్ డ్రైవ్కు కంటెంట్ను కాపీ చేయడానికి, కింది వాటిని చేయండి:\n మీ కంప్యూటర్ సెట్టింగ్లకు వెళ్లండి. USB డ్రైవ్ వ్రాసే-రక్షించబడిందో లేదో తనిఖీ చేయండి. అది ఉంటే, రక్షణను నిలిపివేయండి \n పెన్ డ్రైవ్లో ఖాళీ స్థలం ఉందో లేదో తనిఖీ చేయండి. పెన్డ్రైవ్ నుండి అవాంఛిత ఫైల్లను తొలగించండి "
+ },
+ {
+ "topic": "నేను నా పెన్డ్రైవ్లో కంటెంట్ను లోడ్ చేసాను, కాని ఇప్పుడు అది ఖాళీగా ఉందని నేను చూశాను",
+ "description": "మీ పెన్డ్రైవ్ లేదా కంప్యూటర్ వైరస్ బారిన పడవచ్చు. దాన్ని తనిఖీ చేయండి:\n * మీ మెషీన్లో యాంటీ వైరస్ సాఫ్ట్వేర్ ఇన్స్టాల్ చేయబడింది\n * మీరు తెలియని యంత్రాలలో ప్లగ్ చేయడానికి ముందు మీ పెన్డ్రైవ్ వ్రాతపూర్వకంగా రక్షించబడుతుంది"
+ },
+ {
+ "topic": "నా పెన్డ్రైవ్కు మరియు నుండి కంటెంట్ను కాపీ చేయడానికి సమయం పడుతుంది",
+ "description": "కాపీ చేయడానికి తీసుకున్న సమయం కంటెంట్ ఫైల్ పరిమాణంపై ఆధారపడి ఉంటుంది. కొన్ని పెద్ద పాఠ్యపుస్తకాలు కాపీ చేయడానికి సమయం పడుతుంది. ఈ ప్రక్రియను మీరు మధ్యలో ఆపవద్దని మేము సిఫార్సు చేస్తున్నాము. అలా చేయడం వలన అస్థిరమైన ఫైళ్లు ఏర్పడవచ్చు."
+ },
+ {
+ "topic": "DIKSHA కంటెంట్ కారణంగా నా కంప్యూటర్కు ఖాళీ స్థలం లేదు",
+ "description": "మీ కంప్యూటర్లో ఖాళీ స్థలం కోసం ఖాళీ చేయడానికి అనువర్తనం యొక్క నా డౌన్లోడ్ ట్యాబ్ నుండి డౌన్లోడ్ చేసిన కంటెంట్ను తొలగించండి"
+ },
+ {
+ "topic": "నా ఉబుంటు సిస్టమ్లో DIKSHA డెస్క్టాప్ అప్లికేషన్ను ఇన్స్టాల్ చేయడం సాధ్యం కాలేదు",
+ "description": "> మీ ఉబుంటు సిస్టమ్లో DIKSHA డెస్క్టాప్ అప్లికేషన్ను ఇన్స్టాల్ చేయడానికి:
\n 1) మీ టెర్మినల్ తెరవండి
\n 2)cd ఆదేశాన్ని అమలు చేయండి డైరెక్టరీని exe ఫైల్ డౌన్లోడ్ చేయబడిన చోటికి మార్చడానికి. ఉదాహరణకు, డౌన్లోడ్ ఫోల్డర్లో exe సేవ్ చేయబడితే, cd డౌన్లోడ్లు ఆదేశాన్ని అమలు చేయండి
\n 3) sudo dpkg -i ఆదేశాన్ని అమలు చేయండి
\n ఈ ఆదేశాన్ని విజయవంతంగా అమలు చేస్తున్నప్పుడు అప్లికేషన్ ప్రారంభించబడింది
"
+ }
+ ],
+ "constants": {
+ "charactersLeft": "అక్షరాలు మిగిలి ఉన్నాయి",
+ "explainMsg": "మీరు సమస్యను వివరించగలరా?",
+ "faqMsg": "తరచుగా అడిగే ప్రశ్నలు",
+ "help": "సహాయం కావాలి",
+ "helpMsg": "ఈ సమాధానం మీకు సహాయపడిందా?",
+ "initiateEmailButton": "ఇమెయిల్ను ప్రారంభించండి",
+ "knowMoreMsg": "మీరు మరింత తెలుసుకోవాలనుకుంటున్న విషయం ఏంటి?",
+ "noMsg": "కాదు",
+ "reportIssue": "సమస్యను నివేదించండి",
+ "reportIssueMsg": "ఇతర సమస్యను నివేదించండి",
+ "resolveMsg": "మీ సమస్యను పరిష్కరించడానికి జాబితాను చూడండి",
+ "sorryMsg": "అలా జరిగినందుకు క్షమించండి!",
+ "submitButton": "సమర్పించండి",
+ "tellMoreMsg": "మీరు ఎదుర్కొన్న సమస్య గురించి మాకు మరింత తెలియజేయండి",
+ "thanksMsg": "మీ ప్రతిస్పందన కోసం ధన్యవాదాలు!",
+ "triggerEmailMsg": "మీరు టెక్స్ట్ బాక్స్లో వివరాలను జోడించి, ఇమెయిల్(Initiate) బటన్ను నొక్కితే, మీ తరపున మేము ఒక ఇమెయిల్ను ప్రేరేపిస్తాము. మీరు మరింత వివరాలను జోడించవచ్చు మరియు / లేదా అక్కడ ఫైల్లను అటాచ్ చేయవచ్చు.",
+ "typeHere": "ఇక్కడ టైపు చేయండి..",
+ "yesMsg": "అవును"
+ }
+}
\ No newline at end of file
diff --git a/utils/DesktopFAQ/faq-ur.json b/utils/DesktopFAQ/faq-ur.json
new file mode 100644
index 000000000..71445fd94
--- /dev/null
+++ b/utils/DesktopFAQ/faq-ur.json
@@ -0,0 +1,68 @@
+{
+ "faqs": [
+ {
+ "topic": "میں اپنا بورڈ ، میڈیم ، کلاس اور سبجیکٹ نہیں دیکھ سکتا ہوں",
+ "description": "آپ کی ریاست فی الحال تمام بورڈ ، میڈیم ، کلاس اور مضامین کی حمایت نہیں کرتی ہے۔ جیسے ہی آپ کی ریاست نے ان کو شامل کیا ، آپ اسے فہرست میں دیکھیں گے"
+ },
+ {
+ "topic": "میں نے یہ مواد ڈاؤن لوڈ کیا ہے ، لیکن میں اسے کھولنے سے قاصر ہوں کیونکہ اس کے مطابق مجھے انٹرنیٹ کی ضرورت ہے",
+ "description": "ہوسکتا ہے کہ آپ نے YouTube کا مواد ڈاؤن لوڈ کیا ہو۔ جب آپ آن لائن ہوں تو آپ YouTube کا مواد کھول سکتے ہیں۔ کمپیوٹر کو دوبارہ انٹرنیٹ سے جوڑنے کی کوشش کریں۔"
+ },
+ {
+ "topic": "مجھے اپنی DIKSHA ڈیسک ٹاپ ایپ کو اپ ڈیٹ کرنے کی ضرورت ہے",
+ "description": "اپنے کمپیوٹر کو انٹرنیٹ سے جڑیں اورhttps://staging.sunbirded.org/desktop/latest پر جدید ایپ ورژن کے لئے چیک کریں"
+ },
+ {
+ "topic": "مجھے انٹرنیٹ کنیکشن والے لیپ ٹاپ تک رسائی حاصل نہیں ہے ، لیکن میں ڈیسک ٹاپ ایپ پر مواد شامل یا اپ ڈیٹ کرنا چاہتا ہوں",
+ "description": "اگر آپ کے پاس موبائل فون ہے تو ، گوگل پلے اسٹور سے DIKSHA موبائل اپلی کیشن ڈاؤن لوڈ کریں۔\nایپ میں موجود مواد کے لئے براؤز کریں۔\nDIKSHA لائبریری سے مواد ڈاؤن لوڈ کریں۔\nاسے PenDrive یا SD کارڈ میں کاپی کریں اور DIKSHA ڈیسک ٹاپ ایپ پر اپ لوڈ کریں۔"
+ },
+ {
+ "topic": "مجھے کسی خاص عنوان کے لئے مواد نہیں ملتا ہے ، یا مجھے یہ مواد غیر متعلق معلوم ہوتا ہے",
+ "description": "مواد کی تلاش کے لئے DIKSHA کی آن لائن لائبریری کو براؤز کریں۔ اگر یہ ابھی بھی دستیاب نہیں ہے تو، مواد کے بارے میں اپنی رائے اسٹیٹ SCERT کو بھیجیں"
+ },
+ {
+ "topic": "ایپ بہت آہستہ ہے",
+ "description": "ایپ کی کارکردگی کو تیز کرنے کے لئے ، درج ذیل کام کریں:\n اپنے کمپیوٹر سسٹم کی تشکیل پر جائیں.کم از کم ترتیب یہ ہونی چاہئے:\n 2 GB RAM\n اگر آپ کا کمپیوٹر اس ترتیب سے میچ کرتا ہے یا اس سے زیادہ ہے تو ، ایپ کو دوبارہ شروع کریں۔\n ایسا کرنے کے بعد ، اگر یہ اب بھی آہستہ ہے ، توٹاسک مینیجر کے پاس جاؤ\nغیر استعمال شدہ پس منظر کے تمام عمل منتخب کریں اوراینڈ ٹاسک پر کلک کریں"
+ },
+ {
+ "topic": "میں پین ڈرائیو میں مواد کو کاپی کرنے سے قاصر ہوں",
+ "description": "پین ڈرائیو میں مواد کی کاپی کرنے کے لئے ، درج ذیل کریں:\n\nاپنے کمپیوٹر کی ترتیبات پر جائیں۔ چیک کریں کہ USB ڈرائیو کو تحریری شکل سے محفوظ ہے یا نہیں۔ اگر ایسا ہے تو ، تحفظ کو غیر فعال کریں li>\n چیک کریں کہ پین ڈرائیو میں خالی جگہ ہے یا نہیں ۔ پین ڈرائیو سے ناپسندیدہ فائلوں کو حذف کریں \n "
+ },
+ {
+ "topic": "میں نے اپنی پین ڈرائیو پر موجود مواد کو لوڈ کیا ، لیکن اب میں دیکھ رہا ہوں کہ یہ خالی ہے",
+ "description": "آپ کا پینڈرایو یا کمپیوٹر کسی وائرس سے متاثر ہوسکتا ہے۔چیک کریں کہ:\n* آپ کی مشین پر ایک اینٹی وائرس سوفٹویئر نصب ہے\n* آپ کی پینڈرائیو نامعلوم مشینوں میں پلگ کرنے سے پہلے تحریری طور پر محفوظ ہے"
+ },
+ {
+ "topic": "میرے پین ڈرائیو پر اور اس سے مواد کو کاپی کرنے میں وقت لگتا ہے",
+ "description": "کاپی کرنے میں جو وقت لیا گیا ہے اس کا انحصار مواد کی فائل کے سائز پر ہوتا ہے۔ کچھ بڑی درسی کتب کاپی کرنے میں وقت لگتا ہے۔ ہمارا مشورہ ہے کہ آپ اس عمل میں مداخلت نہ کریں۔ ایسا کرنے سے متضاد فائلیں پیدا ہوسکتی ہیں۔"
+ },
+ {
+ "topic": "میرے کمپیوٹر میں DIKSHA مشمولات کی وجہ سے کوئی خالی جگہ نہیں ہے",
+ "description": "اپنے کمپیوٹر پر جگہ خالی کرنے کے لئے ایپ کے میرے ڈاؤن لوڈ والے ٹیب سے ڈاؤن لوڈ کردہ مواد کو ہٹا دیں"
+ },
+ {
+ "topic": "میرے Ubuntu سسٹم پر DIKSHA ڈیسک ٹاپ ایپلی کیشن انسٹال کرنے سے قاصر ہے",
+ "description": "میرے Ubuntu سسٹم پر DIKSHA ڈیسک ٹاپ ایپلی کیشن انسٹال کرنے کے لئے:
\n اپنا ٹرمینل کھولیں p>\n
ڈائرکٹری تبدیل کرنے کے لئے سی ڈی کمانڈ چلائیں<مقام>جہاں exe فائل ڈاؤن لوڈ کی گئی ہے.مثال کے طور پر ، اگر ڈاؤن لوڈز فولڈر میں exe کو محفوظ کیا گیا ہے تو ، پھر سی ڈی ڈاؤن لوڈ کمانڈ چلائیں
\nکمانڈ sudo dpkg-i چلائیں\n
\n اس کمانڈ کو کامیابی کے ساتھ چلانے پر ایپلیکیشن لانچ کی جاتی ہے p>"
+ }
+ ],
+ "constants": {
+ "charactersLeft": "حروف باقی ہیں",
+ "explainMsg": "کیا آپ اس مسئلے کو سمجھا سکے؟",
+ "faqMsg": "اکثر پوچھے گئے سوالات",
+ "help": "مدد",
+ "helpMsg": "کیا اس جواب نے آ پکی مدد کی؟",
+ "initiateEmailButton": "ای میل شروع کریں",
+ "knowMoreMsg": "آپ اور کیا جاننا چاہتے ہے؟",
+ "noMsg": "نہیں",
+ "reportIssue": "مسئلہ کی اطلاع دیں",
+ "reportIssueMsg": "دوسرے مسئلے کی اطلاع دیں",
+ "resolveMsg": "اپنے مسئلے کو حل کرنے کے لۓ فہرست دیکھیں",
+ "sorryMsg": "اس کے لئے معذرت!",
+ "submitButton": "جمع کریں",
+ "tellMoreMsg": "ہمیں اس مسئلے کے بارے میں مزید بتائیے",
+ "thanksMsg": "آپکے جواب کا شکریہ!",
+ "triggerEmailMsg": "ٹیکسٹ باکس میں تفصیلات شامل کرنے کے بعد اور ابتدائی ای میل بٹن کو شروع کرنے کے بعد، ہم آپ کی طرف سے ایک ای میل کو متحرک کریں گے. آپ مزید تفصیلات شامل کر سکتے ہیں اور / یا وہاں فائلیں منسلک کرسکتے ہیں.",
+ "typeHere": "یہاں ٹائپ کریں ...",
+ "yesMsg": "جی ہاں"
+ }
+}
\ No newline at end of file
From 0f69cc461ca73d69d5584cf95a86900cb034c2fd Mon Sep 17 00:00:00 2001
From: Keshav Prasad
Date: Fri, 11 Dec 2020 13:16:23 +0530
Subject: [PATCH 066/184] fix: adding missed job and updating branches (#2088)
---
.../Core/jobs/OfflineInstaller/config.xml | 108 ++++++++++++++++++
.../Core/jobs/OfflineInstaller/config.xml | 2 +-
.../Core/jobs/UploadPortalLabel/config.xml | 2 +-
3 files changed, 110 insertions(+), 2 deletions(-)
create mode 100644 deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/OfflineInstaller/config.xml
diff --git a/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/OfflineInstaller/config.xml b/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/OfflineInstaller/config.xml
new file mode 100644
index 000000000..a68c1ef3a
--- /dev/null
+++ b/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/OfflineInstaller/config.xml
@@ -0,0 +1,108 @@
+
+
+
+
+ hudson.model.ParametersDefinitionProperty
+ com.sonyericsson.rebuild.RebuildSettings
+
+
+
+
+ false
+
+
+
+ -1
+ -1
+ -1
+ 5
+
+
+
+
+ false
+ false
+
+
+
+
+ absolute_job_path
+ <font color=dimgray size=2><b>Do not change this value! The metadata.json will be copied from this job.</b></font>
+ Build/Core/OfflineInstaller
+ false
+
+
+ build_number
+ <font color=darkgreen size=2><b>OPTIONAL: Specify the build job number to upload / copy the artifact built in that job.</b></font>
+ lastSuccessfulBuild
+ false
+
+
+ artifact_source
+ <font color=dimgray size=2><b>
+ArtifactRepo - Upload and keep a copy of the artifact in Jenkins, JenkinsJob - Just keep a copy of the artifact in Jenkins.</b></font>
+
+
+ ArtifactRepo
+ JenkinsJob
+
+
+
+
+
+
+ 0
+ 0
+
+ false
+ project
+ false
+
+
+
+
+
+
+
+ Build/Core/OfflineInstaller
+
+ SUCCESS
+ 0
+ BLUE
+ true
+
+
+
+
+
+
+
+ 2
+
+
+ https://github.com/project-sunbird/sunbird-devops.git
+
+
+
+
+ ${public_repo_branch}
+
+
+ false
+
+
+
+ true
+ false
+
+ 0
+ false
+
+
+
+ pipelines/upload/artifacts/Jenkinsfile
+ false
+
+
+ false
+
diff --git a/deploy/jenkins/jobs/Build/jobs/Core/jobs/OfflineInstaller/config.xml b/deploy/jenkins/jobs/Build/jobs/Core/jobs/OfflineInstaller/config.xml
index 8c1f5a557..c05a06a6b 100644
--- a/deploy/jenkins/jobs/Build/jobs/Core/jobs/OfflineInstaller/config.xml
+++ b/deploy/jenkins/jobs/Build/jobs/Core/jobs/OfflineInstaller/config.xml
@@ -57,7 +57,7 @@
- release-3.5.0
+ ${github_release_tag}
false
diff --git a/deploy/jenkins/jobs/Deploy/jobs/dev/jobs/Core/jobs/UploadPortalLabel/config.xml b/deploy/jenkins/jobs/Deploy/jobs/dev/jobs/Core/jobs/UploadPortalLabel/config.xml
index 6c02e23d5..42e8c9e0e 100644
--- a/deploy/jenkins/jobs/Deploy/jobs/dev/jobs/Core/jobs/UploadPortalLabel/config.xml
+++ b/deploy/jenkins/jobs/Deploy/jobs/dev/jobs/Core/jobs/UploadPortalLabel/config.xml
@@ -166,7 +166,7 @@ return """<b>This parameter is not used</b>"""
- release-3.5.0
+ ${branch_or_tag}
false
From 9ec2430b1c299b081b5859b8c8365b1b07788204 Mon Sep 17 00:00:00 2001
From: harishkumar gangula
Date: Fri, 11 Dec 2020 15:36:43 +0530
Subject: [PATCH 067/184] Issue #SB-21202 feat: Add all language faqs (#2087)
---
utils/DesktopFAQ/faq-as.json | 68 ++++++++++++++++++++++++++++++++++++
utils/DesktopFAQ/faq-bn.json | 68 ++++++++++++++++++++++++++++++++++++
utils/DesktopFAQ/faq-en.json | 4 +--
utils/DesktopFAQ/faq-gu.json | 68 ++++++++++++++++++++++++++++++++++++
utils/DesktopFAQ/faq-hi.json | 68 ++++++++++++++++++++++++++++++++++++
utils/DesktopFAQ/faq-kn.json | 68 ++++++++++++++++++++++++++++++++++++
utils/DesktopFAQ/faq-ml.json | 68 ++++++++++++++++++++++++++++++++++++
utils/DesktopFAQ/faq-mr.json | 68 ++++++++++++++++++++++++++++++++++++
utils/DesktopFAQ/faq-or.json | 68 ++++++++++++++++++++++++++++++++++++
utils/DesktopFAQ/faq-pa.json | 68 ++++++++++++++++++++++++++++++++++++
utils/DesktopFAQ/faq-ta.json | 68 ++++++++++++++++++++++++++++++++++++
utils/DesktopFAQ/faq-te.json | 68 ++++++++++++++++++++++++++++++++++++
utils/DesktopFAQ/faq-ur.json | 68 ++++++++++++++++++++++++++++++++++++
13 files changed, 818 insertions(+), 2 deletions(-)
create mode 100644 utils/DesktopFAQ/faq-as.json
create mode 100644 utils/DesktopFAQ/faq-bn.json
create mode 100644 utils/DesktopFAQ/faq-gu.json
create mode 100644 utils/DesktopFAQ/faq-hi.json
create mode 100644 utils/DesktopFAQ/faq-kn.json
create mode 100644 utils/DesktopFAQ/faq-ml.json
create mode 100644 utils/DesktopFAQ/faq-mr.json
create mode 100644 utils/DesktopFAQ/faq-or.json
create mode 100644 utils/DesktopFAQ/faq-pa.json
create mode 100644 utils/DesktopFAQ/faq-ta.json
create mode 100644 utils/DesktopFAQ/faq-te.json
create mode 100644 utils/DesktopFAQ/faq-ur.json
diff --git a/utils/DesktopFAQ/faq-as.json b/utils/DesktopFAQ/faq-as.json
new file mode 100644
index 000000000..243f8c5a4
--- /dev/null
+++ b/utils/DesktopFAQ/faq-as.json
@@ -0,0 +1,68 @@
+{
+ "faqs": [
+ {
+ "topic": "মই মোৰ ব'ৰ্ড, মাধ্যম, শ্ৰেণী আৰু বিষয় চাব পৰা নাই",
+ "description": "আপোনাৰ ৰাজ্যই বৰ্তমান সকলো ব’ৰ্ড, মাধ্যম, শ্ৰেণী আৰু বিষয় সমৰ্থন নকৰে। আপোনাৰ ৰাজ্যই এইসমূহ যোগ কৰাৰ লগে লগেই, আপুনি তালিকা খনত এয়া দেখা পাব।"
+ },
+ {
+ "topic": "মই বিষয়বস্তু ডাউনল’ড কৰিলোঁ, কিন্তু মই এয়া চলাব পৰা নাই কাৰণ ইয়াত কোৱা হৈছে যে মোক ইণ্টাৰনেটৰ প্ৰয়োজন ",
+ "description": "আপুনি ইউটিউব কনটেণ্ট নিশ্চয় ডাউনল’ড কৰিলে। ইউটিউব কনটেণ্ট আপুনি কেৱল অনলাইন হৈ থকা অৱস্থাতহে চলাব পাৰিব। কম্পিউটাৰটো ইণ্টাৰনেটৰ সৈতে সংযোগ কৰক আৰু পুনৰ চেষ্টা কৰক।"
+ },
+ {
+ "topic": "মই মোৰ DIKSHA ডেস্কটপ এপটো আপডেট কৰাৰ প্ৰয়োজন হৈছে",
+ "description": "আপোনাৰ কম্পিউটাৰটো ইণ্টাৰনেটৰ সৈতে সংযোগ কৰক আৰু শেহতীয়া এপ সংস্কৰণৰ বাবে https://staging.sunbirded.org/desktop/latest পৰীক্ষা কৰক"
+ },
+ {
+ "topic": "ইণ্টাৰনেট সংযোগ থকা লেপটপৰ সৈতে মোৰ প্ৰৱেশাধিকাৰ নাই, কিন্তু মই ডেস্কটপ এপত বিষয়বস্তু যোগ দিব আৰু আপডেট কৰিব বিচাৰোঁ",
+ "description": "যদি আপোনাৰ এটা ম’বাইল ফোন আছে, তেন্তে গুগল প্লে’ষ্ট’ৰৰ পৰা DIKSHA ম’বাইল এপটো ডাউনল’ড কৰক।\nএপটোত বিষয়বস্তুৰ বাবে ব্ৰাউজ কৰক।\nDIKSHA লাইব্ৰেৰীৰ পৰা বিষয়বস্তু ডাউনল’ড কৰক।\nএয়া এটা পে’নড্ৰাইভ বা SD কাৰ্ডলৈ ক’পি কৰক আৰু ইয়াক DIKSHA ডেস্কটপ এপত আপল’ড কৰক।"
+ },
+ {
+ "topic": "মই এটা বিশেষ বিষয়ৰ বাবে বিষয়বস্তু বিচাৰি পোৱা নাই, নতুবা মই অপ্ৰাসংগিক বিষয়বস্তু বিচাৰি পাইছোঁ",
+ "description": "বিষয়বস্তুৰ সন্ধান কৰিবলৈ DIKSHAৰ অনলাইন লাইব্ৰেৰী ব্ৰাউজ কৰক। তেতিয়াও যদি এয়া উপলব্ধ নোহোৱাকৈ থাকে, তেন্তে বিষয়বস্তু সম্পৰ্কে আপোনাৰ মতামত ৰাজ্যিক SCERTলৈ প্ৰেৰণ কৰক"
+ },
+ {
+ "topic": "এপটো বৰ লেহেমীয়া গতিৰ",
+ "description": "এপটোৰ কাৰ্যকাৰিতা দ্ৰুত কৰিবলৈ, নিম্নোক্তসমূহ কৰক:\n আপোনাৰ কম্পিউটাৰৰ ছিষ্টেম কনফিগাৰেচনলৈ যাওক। ন্যূনতম কনফিগাৰেচন হ’ব লাগে:\n2 GB RAM 2 GB RAM \nডুৱেল ক’ৰ প্ৰচেছৰ \n যদিহে আপোনাৰ কম্পিউটাৰ এই কনফিগাৰেচনৰ সৈতে মিলে বা অতিক্ৰম কৰে, এপটো পুনৰ আৰম্ভ কৰক।\n এইটো কৰাৰ পাছত, যদিহে তেতিয়াও ই মন্থৰ হৈ থাকে তেতিয়া Task Manager লৈ যাওক,\nসকলো অব্যৱহৃত বেকগ্ৰাউণ্ড প্ৰক্ৰিয়া বাছনি কৰক আৰু End Task ত ক্লিক কৰক"
+ },
+ {
+ "topic": "মই পে’নড্ৰাইভলৈ বিষয়বস্তু ক’পি কৰিব পৰা নাই",
+ "description": "বিষয়বস্তুটো পে’ন ড্ৰাইভলৈ ক’পি কৰিবলৈ, তলত দিয়াবোৰ কৰক:\nকম্পিউটাৰৰ চেটিংছলৈ যাওক। USB ড্ৰাইভটো ৰাইট কৰাৰ বাবে সুৰক্ষিত হয়নে নহয় পৰীক্ষা কৰক। যদিহে হয়, সুৰক্ষা নিষ্ক্ৰিয় কৰক \nপে’ন ড্ৰাইভটোত খালি ঠাই আছেনে নাই পৰীক্ষা কৰক। পে’ন ড্ৰাইভটোৰ পৰা অদৰকাৰী ফাইলবোৰ ডিলিট কৰক "
+ },
+ {
+ "topic": "মই পে’নড্ৰাইভত বিষয়বস্তু ভৰালোঁ, কিন্তু এতিয়া মই দেখিছোঁ যে এইটো খালি হৈ আছে",
+ "description": "আপোনাৰ পে’ন ড্ৰাইভ বা কম্পিউটাৰ ভাইৰাছৰদ্বাৰা আক্ৰান্ত হ’ব পাৰে। এয়া পৰীক্ষা কৰক:\n* আপোনাৰ মেচিনত এটা এণ্টি ভাইৰাছ ছফটৱেৰ ইনষ্টল হৈ আছে\n* অচিনাকী মেচিনত আপুনি সংযুক্ত কৰাৰ আগতে আপোনাৰ পে’নড্ৰাইভটো ৰাইট কৰাৰ বাবে সুৰক্ষিত হ’ব লাগিব"
+ },
+ {
+ "topic": "মোৰ পে’নড্ৰাইভলৈ বা পে’নড্ৰাইভৰ পৰা বিষয়বস্তু ক’পি কৰোঁতে সময় লাগে",
+ "description": "ক’পি কৰিবলৈ লগা সময় বিষয়বস্তুটোৰ ফাইলৰ আকাৰৰ ওপৰত নিৰ্ভৰ কৰে। কিছুমান বৃহৎ আকাৰৰ পাঠ্যপুথি ক’পি কৰোঁতে সময় লাগে। আমি পৰামৰ্শ দিও যে আপুনি প্ৰক্ৰিয়াটো মাজতে বন্ধ কৰি নিদিব। এনে কৰাৰ ফলত ফাইলবোৰ সংগতিহীন হৈ পৰিব। "
+ },
+ {
+ "topic": "DIKSHAৰ বিষয়বস্তুৰ বাবে মোৰ কম্পিউটাৰত কোনো খালি ঠাই নাই",
+ "description": "আপোনাৰ কম্পিউটাৰত ঠাই খালি কৰিবলৈ এপটোৰ মাই ডাউনল’ডছ্ টেবটোৰ পৰা ডাউনল’ড হৈ থকা বিষয়বস্তু ডিলিট কৰক"
+ },
+ {
+ "topic": "মোৰ উবান্তু ছিষ্টেমত DIKSHA ডেস্কটপ এপ্লিকেশ্বন ইনষ্টল কৰিব পৰা নাই",
+ "description": "আপোনাৰ উবান্তু ছিষ্টেমত DIKSHA ডেস্কটপ এপ্লিকেশ্বন ইনষ্টল কৰিবলৈ:
\n1) আপোনাৰ টাৰ্মিনেল খোলক
\n2) exe ফাইলটো য’ত ডাউনল’ড হৈছে তাত নামপঞ্জী সলনি কৰিবলৈ cd নিৰ্দেশটো চলাওক। উদাহৰণস্বৰূপে, যদি exe ডাউনল’ড ফ’ল্ডাৰত ছে’ভ হৈ আছে, তেন্তে cd Downloads নিৰ্দেশটো চলাওক
\n3) sudo dpkg -i নিৰ্দেশটো চলাওক
\nএই নিৰ্দেশটো সফলতাৰে চলালে এপ্লিকেশ্বনটো আৰম্ভ হয়
"
+ }
+ ],
+ "constants": {
+ "charactersLeft": "থাকি যোৱা আখৰসমূহ",
+ "explainMsg": "অসুবিধাটো বৰ্ণনা কৰিব পাৰিবনে ?",
+ "faqMsg": "সঘনাই সোধা প্ৰশ্নসমূহ",
+ "help": "সহায়",
+ "helpMsg": "এই উত্তৰটোৱে আপোনাক সহায় কৰিলেনে ?",
+ "initiateEmailButton": "ইমেইল আৰম্ভ কৰক",
+ "knowMoreMsg": "আপুনি আৰু কিবা জানিব খুজিছে?",
+ "noMsg": "নহয়",
+ "reportIssue": "সমস্যা এটা উত্থাপন কৰক",
+ "reportIssueMsg": "অন্য এটা সমস্যা উত্থাপন কৰক",
+ "resolveMsg": "আপোনাৰ অসুবিধাটো সমাধান কৰিবলৈ তালিকাখন চাওক",
+ "sorryMsg": "সেইটোৰ বাবে দুঃখিত!",
+ "submitButton": "প্ৰদান কৰক",
+ "tellMoreMsg": "আপুনি সন্মুখীন হোৱা অসুবিধাটোৰ বিষয়ে আমাক অলপ বেছিকৈ জনাওক",
+ "thanksMsg": "আপোনাৰ সঁহাৰিৰ বাবে ধন্যবাদ !",
+ "triggerEmailMsg": "আপুনি টেক্সট্ বক্সত সবিশেষ যোগ দিয়া আৰু ইমেইল যোগাযোগৰ সুচনা আৰম্ভ কৰা বাটনত টিপাৰ পাছত, আমি আপোনাৰ হৈ এখন ইমেইল পঠাম। আপুনি তাত অধিক সবিশেষ যোগ দিব আৰু / বা ফাইল সংলগ্ন কৰিব পাৰিব।",
+ "typeHere": "ইয়াত লিখক...",
+ "yesMsg": "হয়"
+ }
+}
\ No newline at end of file
diff --git a/utils/DesktopFAQ/faq-bn.json b/utils/DesktopFAQ/faq-bn.json
new file mode 100644
index 000000000..9bf1afd2e
--- /dev/null
+++ b/utils/DesktopFAQ/faq-bn.json
@@ -0,0 +1,68 @@
+{
+ "faqs": [
+ {
+ "topic": "আমি আমার বোর্ড, মিডিয়াম বা মাধ্যম, ক্লাস ও বিষয় দেখতে পাচ্ছি না",
+ "description": "আপনার রাজ্য বর্তমানে সবধরনের বোর্ড, মিডিয়াম, ক্লাস ও বিষয়গুলি পড়ানোর সুযোগ প্রদান করছে না। যত তাড়াতাড়ি আপনার রাজ্য সেগুলি অন্তর্ভুক্ত করবে সেই অনুযায়ী আপনি সেগুলি তালিকায় দেখতে পাবেন।"
+ },
+ {
+ "topic": "আমি বিষয়বস্তুটি ডাউনলোড করেছি, কিন্তু আমি এটি চালু করতে পারছি না কারণ এখানে বলা হচ্ছে আমার ইন্টারনেট সংযোগ থাকা প্রয়োজন",
+ "description": "আপনি YouTube-এর বিষয়বস্তু ডাউনলোড করে থাকতে পারেন। শুধুমাত্র অনলাইন থাকার সময় আপনি YouTube-এর বিষয়বস্তু চালাতে পারবেন। আপনার কম্পিউটারটি ইন্টারনেটের সাথে যুক্ত করে আবার চেষ্টা করুন।"
+ },
+ {
+ "topic": "আমার DIKSHA ডেস্কটপ অ্যাপটি আপডেট করা প্রয়োজন",
+ "description": "আপনার কম্পিউটারটি ইন্টারনেটের সঙ্গে যুক্ত করুন ও সাম্প্রতিকতম অ্যাপ সংস্করণটির জন্য https://staging.sunbirded.org/desktop/latest চেক করুন"
+ },
+ {
+ "topic": "ইন্টারনেট সংযোগ সহ কোনও ল্যাপটপে আমার অ্যাকসেস নেই, কিন্তু আমার ডেস্কটপ অ্যাপে আমি বিষয়বস্তু যোগ করতে বা আপডেট করতে চাই",
+ "description": "যদি আপনার কোনো মোবাইল ফোন থাকে তবে DIKSHA মোবাইল অ্যাপটি google playstore থেকে ডাউনলোড করুন।\nঅ্যাপটির মধ্যে বিষয়বস্তুটি ব্রাউজ করুন।\nবিষয়বস্তুটি DIKSHA লাইব্রেরী থেকে ডাউনলোড করুন।\nএটিকে কোনও পেনড্রাইভ বা SD কার্ডে কপি করুন ও DIKSHA ডেস্কটপ অ্যাপে সেটি আপলোড করুন।"
+ },
+ {
+ "topic": "আমি একটি নির্দিষ্ট প্রসঙ্গের ওপর বিষয়বস্তু খুঁজে পাচ্ছি না, অথবা আমি দেখছি বিষয়বস্তুটি অপ্রাসঙ্গিক",
+ "description": "নির্দিষ্ট বিষয়বস্তু খুঁজে পেতে DIKSHA-এর অনলাইন লাইব্রেরীতে ব্রাউজ করুন। যদি তারপরেও আপনি খুঁজে না পান তবে বিষয়বস্তু সম্পর্কে আপনার ফিডব্যাক বা প্রতিক্রিয়া রাজ্য SCERT-এর কাছে পাঠান"
+ },
+ {
+ "topic": "এই অ্যাপটি খুবই ধীরে কাজ করে",
+ "description": "অ্যাপটির কার্যক্ষমতার গতি বৃদ্ধি করতে, নিম্নলিখিত পদ্ধতিটি অনুসরণ করুন:\n আপনার কম্পিউটারের সিস্টেম কনফিগারেশনে যান। নূন্যতম কনফিগারেশন হওয়া প্রয়োজন:\n2 GB RAM \nডুয়েল কোর প্রসেসর \n যদি আপনার কম্পিউটারে এই বা এর থেকে উন্নত কনফিগারেশন থাকে তবে অ্যাপটি রিস্টার্ট করুন।\n এটি করার পরেও, যদি অ্যাপটি ধীরে কাজ করে তবে টাস্ক ম্যানেজারে যান, সব অব্যবহৃত ব্যাকগ্রাউন্ড প্রসেসগুলি নির্বাচন করুন ও এন্ড টাস্কে ক্লিক করুন"
+ },
+ {
+ "topic": "আমি একটি পেনড্রাইভে বিষয়বস্তু কপি করতে পারছি না",
+ "description": "একটি পেন ড্রাইভে কোনও বিষয়বস্তু কপি করার জন্য নিম্নলিখিত পদ্ধতিটি অনুসরণ করুন:\nআপনার কম্পিউটার সেটিংসে যান। USB ড্রাইভটি রাইট-প্রোটেক্টেড কিনা সেটি চেক করুন। যদি রাইট-প্রোটেক্টেড হয়, প্রোটেকশনটি নিষ্ক্রিয় করুন \nপেন ড্রাইভটিতে খালি জায়গা আছে কিনা তা চেক করুন। পেন ড্রাইভ থেকে অপ্রয়োজনীয় ফাইলগুলি ডিলিট করুন "
+ },
+ {
+ "topic": "আমার পেনড্রাইভে আমি বিষয়বস্তু লোড করেছিলাম, কিন্তু এখন দেখছি সেটি খালি",
+ "description": "আপনার কম্পিউটার বা পেনড্রাইভটিতে ভাইরাস থাকতে পারে, চেক করুন যে:\n\n*আপনার কম্পিউটারে কোনও অ্যান্টি ভাইরাস সফ্টওয়্যার ইনস্টল করা আছে কিনা\n*কোনও অজানা কম্পিউটারে লাগানোর আগে আপনার পেনড্রাইভটি রাইট-প্রোটেক্টেড করা আছে কিনা"
+ },
+ {
+ "topic": "আমার পেনড্রাইভ থেকে ও সেটিতে বিষয়বস্তু কপি হতে সময় লাগছে",
+ "description": "ফাইলটির আকারের ওপর নির্ভর করে যে ফাইলটি কপি হতে কত সময় লাগবে। বড় টেক্সটবুকগুলি কপি হতে বেশি সময় লাগে। আমরা সুপারিশ করব প্রক্রিয়াটি চলাকালীন মাঝপথে সেটি বন্ধ করবেন না। সেটি করলে কপি হওয়া ফাইলটিতে ত্রুটি থেকে যেতে পারে।"
+ },
+ {
+ "topic": "DIKSHA-এর বিষয়বস্তু রাখার কারণে আমার কম্পিউটারে খালি জায়গা নেই।",
+ "description": "ডাউনলোড করা বিষয়বস্তু অ্যাপটির মাই ডাউনলোড ট্যাব থেকে ডিলিট করে আপনার কম্পিউটারে জায়গা খালি করুন।"
+ },
+ {
+ "topic": "আমার উবানটু সিস্টেমে DIKSHA ডেস্কটপ অ্যাপটি ইনস্টল করা যাচ্ছে না",
+ "description": "আপনার উবান্টু সিস্টেমে DIKSHA ডেস্কটপ অ্যাপ্লিকেশন ইনস্টল করতে:
\n1) আপনার টার্মিনালটি খুলুন
\n2) যেখানে এক্সটেনসন ফাইলটি ডাউনলোড করা হয়েছে সেখানে ডিরেক্টরিটি পরিবর্তন করতে কম্যান্ডটি cd টাইপ করে চালু করুন। উদাহরণস্বরূপ, যদি এক্সটেনসন ফাইলটি ডাউনলোড ফোল্ডারে সংরক্ষণ করা থাকে, তবে কম্যান্ডটি cd Download টাইপ করে চালু করুন
\n3) sudo dpkg -i টাইপ করে কম্যান্ডটি চালু করুন
\nএই কম্যান্ডটি সফলভাবে চালু হওয়াতে অ্যাপ্লিকেশনটি চালু হয়েছে
"
+ }
+ ],
+ "constants": {
+ "charactersLeft": "অক্ষর বাকি",
+ "explainMsg": "আপনি কি সমস্যা টি ব্যাখ্যা করতে পারবেন?",
+ "faqMsg": "সচরাচর জিজ্ঞাস্য",
+ "help": "সাহায্য ",
+ "helpMsg": "এই উত্তরটি আপনাকে সাহায্য করেছিল?",
+ "initiateEmailButton": "ইমেইল পাঠান\n",
+ "knowMoreMsg": "আপনি আর কি জানতে চান?",
+ "noMsg": "না",
+ "reportIssue": "সমস্যা রিপোর্ট করুন",
+ "reportIssueMsg": "অন্যান্য সমস্যা গুলি রিপোর্ট করুন",
+ "resolveMsg": "আপনার সমস্যা সমাধানের জন্য তালিকা টি দেখুন",
+ "sorryMsg": "এর জন্যে দুঃখিত!",
+ "submitButton": "জমা দিন",
+ "tellMoreMsg": "আপনি যে সমস্যার সম্মুখীন হয়েছেন তার সম্পর্কে আমাদের আরো বলুন",
+ "thanksMsg": "আপনার প্রতিক্রিয়ার জন্য ধন্যবাদ!",
+ "triggerEmailMsg": "আপনি টেক্সট বাক্সে বিশদ যুক্ত করার পরে, ইনিশিয়েটিভ ইমেল বোতামটি তে ক্লিক করুন, আমরা আপনার হয়ে একটি ইমেল ট্রিগার করব। আপনি আরও বিস্তারিত যোগ করতে পারেন এবং/ অথবা সংযুক্ত ফাইল যোগ করতে পারেন",
+ "typeHere": "এখানে লিখুন...",
+ "yesMsg": "হ্যাঁ "
+ }
+}
\ No newline at end of file
diff --git a/utils/DesktopFAQ/faq-en.json b/utils/DesktopFAQ/faq-en.json
index e5b3bbdb6..413c849e6 100644
--- a/utils/DesktopFAQ/faq-en.json
+++ b/utils/DesktopFAQ/faq-en.json
@@ -10,7 +10,7 @@
},
{
"topic": "I need to update my DIKSHA desktop app",
- "description": "Connect your computer to the Internet and check https://diksha.gov.in/desktop/latest for the latest app version "
+ "description": "Connect your computer to the Internet and check https://staging.sunbirded.org/desktop/latest for the latest app version "
},
{
"topic": "I do not have access to a laptop with an Internet connection, but I want to add or update content on the desktop app",
@@ -65,4 +65,4 @@
"typeHere": "Type Here...",
"yesMsg": "Yes"
}
-}
+}
\ No newline at end of file
diff --git a/utils/DesktopFAQ/faq-gu.json b/utils/DesktopFAQ/faq-gu.json
new file mode 100644
index 000000000..9410f95a4
--- /dev/null
+++ b/utils/DesktopFAQ/faq-gu.json
@@ -0,0 +1,68 @@
+{
+ "faqs": [
+ {
+ "topic": "હું મારું બોર્ડ, માધ્યમ, વર્ગ અને વિષય જોઈ શકતો નથી",
+ "description": "તમારું રાજ્ય હાલમાં બધા બોર્ડ, માધ્યમો, વર્ગો અને વિષયોને સપોર્ટ કરતું નથી. જલદી તમારું રાજ્ય તેમને ઉમેરશે, તમે તેને સૂચિમાં જોશો"
+ },
+ {
+ "topic": "મેં કન્ટેન્ટ ડાઉનલોડ કરું છે, પરંતુ હું તે ચલાવવામાં અસમર્થ છું કારણ કે તે કહે છે કે મને ઇન્ટરનેટની જરૂર છે",
+ "description": "તમે યુટ્યુબ કન્ટેન્ટ ડાઉનલોડ કરી હશે. તમે ઓનલાઇન હોવ ત્યારે જ તમે યુટ્યુબ સામગ્રી ચલાવી શકો છો. કમ્પ્યુટરને ઇન્ટરનેટથી કનેક્ટ કરો ફરીથી પ્રયાસ કરો."
+ },
+ {
+ "topic": "મારે મારી DIKSHA ડેસ્કટોપ એપ્લિકેશનને અપડેટ કરવાની જરૂર છે",
+ "description": "તમારા કમ્પ્યુટરને ઇન્ટરનેટથી કનેક્ટ કરો અને નવીનતમ એપ્લિકેશન સંસ્કરણ માટે https://staging.sunbirded.org/desktop/latest તપાસો.\n"
+ },
+ {
+ "topic": "મને ઇન્ટરનેટ કનેક્શનવાળા લેપટોપની ઍક્સેસ નથી, પરંતુ હું ડેસ્કટોપ એપ્લિકેશન પર સામગ્રી ઉમેરવા અથવા અપડેટ કરવા માંગું છું",
+ "description": "જો તમારી પાસે મોબાઈલ ફોન છે, તો ગૂગલ પ્લે સ્ટોર પરથી DIKSHA મોબાઇલ એપ્લિકેશન ડાઉનલોડ કરો. એપ્લિકેશનમાંની સામગ્રી માટે બ્રાઉઝ કરો. DIKSHA લાઇબ્રેરીમાંથી સામગ્રી ડાઉનલોડ કરો. તેને પેનડ્રાઇવ અથવા એસડી કાર્ડ પર કોપી કરો અને તેને DIKSHA ડેસ્કટોપ એપ્લિકેશન પર અપલોડ કરો."
+ },
+ {
+ "topic": "મને કોઈ ખાસ વિષય માટે સામગ્રી મળી નથી, અથવા મને સામગ્રી અપ્રસ્તુત લાગે છે\n",
+ "description": "કન્ટેન્ટ શોધવા માટે DIKSHAની ઓનલાઇન લાઇબ્રેરી બ્રાઉઝ કરો. જો તે હજી અનુપલબ્ધ છે, તો કન્ટેન્ટ વિશેનો પ્રતિસાદ રાજ્ય SCERTને મોકલો"
+ },
+ {
+ "topic": "એપ્લિકેશન ખૂબ ધીમી છે",
+ "description": "એપ્લિકેશન પ્રદર્શનને ઝડપી બનાવવા માટે, નીચે આપેલા કાર્યો કરો: તમારા કમ્પ્યુટરની સિસ્ટમ ગોઠવણી પર જાઓ. લઘુત્તમ ગોઠવણી આ હોવી જોઈએ: \n\n 2 જીબી રેમ \n ડ્યુઅલ કોર પ્રોસેસર \n \n જો તમારું કમ્પ્યુટર આ ગોઠવણીથી મેળ ખાય છે અથવા ઓળંગાઈ ગયું છે, તો એપ્લિકેશનને ફરીથી પ્રારંભ કરો. \n આ કર્યા પછી, જો તે હજી ધીમું છે, તો ટાસ્ક મેનેજર પર જાઓ, બધી ન વપરાયેલી પૃષ્ઠભૂમિ પ્રક્રિયાઓ પસંદ કરો અને કાર્ય સમાપ્ત કરો ક્લિક કરો."
+ },
+ {
+ "topic": "હું પેનડ્રાઇવ પર કન્ટેન્ટની કોપી કરવામાં અસમર્થ છું",
+ "description": "પેન ડ્રાઇવ પરની સામગ્રીની કોપી કરવા માટે, નીચેની વિગતો કરો: \n\n તમારા કમ્પ્યુટર સેટિંગ્સ પર જાઓ. યુએસબી ડ્રાઇવ લખવા સુરક્ષિત છે કે કેમ તે તપાસો. જો તે છે, તો સુરક્ષાને બંધ કરો \n પેન ડ્રાઇવમાં ખાલી જગ્યા છે કે કેમ તે તપાસો. પેનડ્રાઈવેમાં જે ફાઇલો જરૂરી નથી તેને કાઢી નાખો \n "
+ },
+ {
+ "topic": "મારી પેનડ્રાઈવ પર મેં કન્ટેન્ટ લોડ કરી હતી, પરંતુ હવે હું જોઉં છું કે તે ખાલી છે",
+ "description": "તમારું પેનડ્રાઇવ અથવા કમ્પ્યુટર વાયરસથી ચેપ લાગ્યું છે. તે તપાસો:\n * તમારી પાસે તમારા મશીન પર એન્ટી વાયરસ સોફ્ટવેર ઇન્સ્ટોલ કરેલું છે .\n* તમારા પેનડ્રાઇવને તમે અજાણ્યા મશીનોમાં પ્લગ કરતાં પહેલાં તે લખાણ સુરક્ષિત છે."
+ },
+ {
+ "topic": "મારા પેનડ્રાઇવ પર અને તેની કન્ટેન્ટની કોપી કરવામાં સમય લાગે છે",
+ "description": "કોપી કરવા માટે લેવાયેલ સમય સામગ્રી ફાઇલના કદ પર આધારિત છે. કેટલાક મોટા પાઠયપુસ્તકોની કોપી કરવામાં સમય લે છે. અમે ભલામણ કરીએ છીએ કે તમે પ્રક્રિયા વચ્ચે ન રોકો. આમ કરવાથી અસંગત ફાઇલો થઈ શકે છે."
+ },
+ {
+ "topic": "DIKSHA સામગ્રીને કારણે મારા કમ્પ્યુટર પાસે કોઈ ખાલી જગ્યા નથી",
+ "description": "તમારા કમ્પ્યુટર પર જગ્યા ખાલી કરવા માટે એપ્લિકેશનના મારા ડાઉનલોડ ટેબ પરથી ડાઉનલોડ કરેલી સામગ્રી ડીલીટ નાખો"
+ },
+ {
+ "topic": "મારી ઉબુન્ટુ સિસ્ટમ પર DIKSHA ડેસ્કટોપ એપ્લિકેશન ઇન્સ્ટોલ કરવામાં અસમર્થ",
+ "description": " તમારી ઉબુન્ટુ સિસ્ટમ પર DIKSHA ડેસ્કટોપ એપ્લિકેશનને ઇન્સ્ટોલ કરવા માટે:
\n 1) તમારું ટર્મિનલ ખોલો
\n 2) ડિરેક્ટરીને બદલવા માટે cd આદેશ ચલાવો જ્યાં એક્સેપ્ ફાઇલ ડાઉનલોડ થયેલ છે. ઉદાહરણ તરીકે, જો એક્સેલ ડાઉનલોડ્સ ફોલ્ડરમાં સાચવવામાં આવે છે, તો પછી સીડી ડાઉનલોડ્સ આદેશ ચલાવો
\n 3) sudo dpkg -i
\n આ આદેશ સફળતાપૂર્વક ચલાવવા પર એપ્લિકેશન શરૂ થઈ છે
"
+ }
+ ],
+ "constants": {
+ "charactersLeft": "અક્ષરો બાકી છે.",
+ "explainMsg": "શું તમે સમસ્યા સમજાવી શકો છો?",
+ "faqMsg": "વારંવાર પૂછાતા પ્રશ્નો",
+ "help": "મદદ કરો",
+ "helpMsg": "શું આ જવાબ તમને મદદ કરશે?",
+ "initiateEmailButton": "ઇમેઇલ શરૂ કરો",
+ "knowMoreMsg": " શું તમે વધુ માહિતી જાણવા માંગો છો?",
+ "noMsg": "ના",
+ "reportIssue": "સમસ્યાની જાણ કરો.",
+ "reportIssueMsg": "અન્ય સમસ્યાની જાણ કરો.",
+ "resolveMsg": "તમારી સમસ્યાનું નિરાકરણ લાવવા યાદી જુઓ",
+ "sorryMsg": "તે વિશે માફ કરશો!",
+ "submitButton": "સબમિટ કરો",
+ "tellMoreMsg": "તમે જે સમસ્યાનો સામનો કર્યો હતો તેના વિશે અમને વધુ કહો",
+ "thanksMsg": "તમારી પ્રતિક્રિયા બદલ આભાર!",
+ "triggerEmailMsg": "તમે ટેક્સ્ટ બોક્સમાં વિગતો ઉમેરો અને ઇનિશિએટ ઇ-મેઇલ બટન પર ટેપ કરો પછી, અમે તમારા વતી એક ઇ-મેઇલ ટ્રિગર કરીશું. તમે ત્યાં વધુ વિગતો ઉમેરી શકો છો અને / અથવા ફાઇલો જોડી શકો છો.",
+ "typeHere": "અહી લખો...",
+ "yesMsg": "હા"
+ }
+}
\ No newline at end of file
diff --git a/utils/DesktopFAQ/faq-hi.json b/utils/DesktopFAQ/faq-hi.json
new file mode 100644
index 000000000..9736c8cfc
--- /dev/null
+++ b/utils/DesktopFAQ/faq-hi.json
@@ -0,0 +1,68 @@
+{
+ "faqs": [
+ {
+ "topic": "मैं अपना बोर्ड, माध्यम, कक्षा और विषय नहीं देख सकता",
+ "description": "आपका राज्य वर्तमान में सभी बोर्डों, माध्यमों, कक्षाओं और विषयों का समर्थन नहीं करता है । जैसे ही आपका राज्य उन्हें जोड़ता है, आप इसे सूची में देखेंगे"
+ },
+ {
+ "topic": "मैंने कंटेन्ट डाउनलोड की है, लेकिन मैं इसे खोलने में असमर्थ हूं क्योंकि यह कहता है कि मुझे इंटरनेट की आवश्यकता है",
+ "description": "हो सकता है आपने YouTube कंटेन्ट डाउनलोड कर ली होगी। आप YouTube कंटेन्ट तभी तक खोल सकते हैं जब आप ऑनलाइन हों। कंप्यूटर को फिर से इंटरनेट से कनेक्ट करने का प्रयास करें।"
+ },
+ {
+ "topic": "मुझे अपने दीक्षा डेस्कटॉप ऐप को अपडेट करने की आवश्यकता है",
+ "description": "अपने कंप्यूटर को इंटरनेट से कनेक्ट करें और नवीनतम ऐप संस्करण के लिए https://staging.sunbirded.org/desktop/latest देखें"
+ },
+ {
+ "topic": "मेरे पास इंटरनेट कनेक्शन वाले लैपटॉप का अभिगम नहीं है, लेकिन मैं डेस्कटॉप ऐप पर कंटेन्ट जोड़ना या अपडेट करना चाहता हूं",
+ "description": "अगर आपके पास मोबाइल फोन है तो गूगल प्लेस्टोर से दीक्षा मोबाइल एप डाउनलोड करें।\nऐप में कंटेन्ट के लिए ब्राउज़ करें।\nदीक्षा पुस्तकालय से कंटेन्ट डाउनलोड करें।\nइसे पेनड्राइव या एसडी कार्ड पर कॉपी करें और दीक्षा डेस्कटॉप ऐप पर अपलोड करें।"
+ },
+ {
+ "topic": "मुझे किसी विशेष विषय के लिए कंटेन्ट नहीं मिलती है, या मुझे कंटेन्ट अप्रासंगिक लगती है",
+ "description": "सामग्री की खोज के लिए दीक्षा की ऑनलाइन लाइब्रेरी ब्राउज़ करें। यदि यह अभी भी अनुपलब्ध है, तो सामग्री के बारे में अपनी प्रतिक्रिया राज्य SCERT को भेजें"
+ },
+ {
+ "topic": "ऐप बहुत धीमा है",
+ "description": "ऐप प्रदर्शन को गति देने के लिए, निम्नलिखित करें:\n अपने कंप्यूटर के सिस्टम कॉन्फ़िगरेशन पर जाएं। न्यूनतम विन्यास होना चाहिए:\n2 जीबी रैम \nड्यूल कोर प्रोसेसर \n यदि आपका कंप्यूटर इस विन्यास से मेल खाता है या उससे अधिक है, तो ऐप को फिर से शुरू करें।\n ऐसा करने के बाद, यदि यह अभी भी धीमा है, तो टास्क मैनेजर पर जाएं,\nसभी अप्रयुक्त पृष्ठभूमि प्रक्रियाओं का चयन करें और एंड टास्क पर क्लिक करें"
+ },
+ {
+ "topic": "मैं पेनड्राइव में कंटेन्ट की प्रतिलिपि बनाने में असमर्थ हूं",
+ "description": "कंटेन्ट को पेन ड्राइव पर कॉपी करने के लिए, निम्नलिखित करें:\nअपने कंप्यूटर सेटिंग पर जाएं। जांच करें कि USB ड्राइव लिखने से संरक्षित है या नहीं। यदि ऐसा है, तो सुरक्षा को अक्षम करें \nचेक करें कि पेन ड्राइव में खाली जगह है या नहीं। पेनड्राइव से अवांछित फ़ाइलों को हटाएं "
+ },
+ {
+ "topic": "मैंने अपने पेनड्राइव पर कंटेन्ट लोड की थी, लेकिन अब मैं देख रहा हूं कि यह खाली है",
+ "description": "आपका पेनड्राइव या कंप्यूटर वायरस से संक्रमित हो सकता है। जाँच करें कि:\n* आपके पास एक एंटी वायरस सॉफ़्टवेयर है जो आपकी मशीन पर स्थापित है\n* अज्ञात मशीनों में आपका पेनड्राइव प्लग करने से पहले लिखनें से सुरक्षित है।"
+ },
+ {
+ "topic": "मेरे पेनड्राइव से और में कंटेन्ट को कॉपी करने में समय लगता है",
+ "description": "कॉपी करने के लिए लिया गया समय कंटेन्ट फ़ाइल के आकार पर निर्भर करता है। कुछ बड़ी पाठ्यपुस्तकों को कॉपी करने में समय लगता है। हमारा सुझाव है कि आप इस प्रक्रिया को बीच में न रोकें। ऐसा करने से असंगत फ़ाइलें बन सकती हैं।"
+ },
+ {
+ "topic": "DIKSHA कंटेन्ट के कारण मेरे कंप्यूटर में खाली जगह नहीं है",
+ "description": "अपने कंप्यूटर पर जगह खाली करने के लिए ऐप के माई डाउनलोड टैब से डाउनलोड की गई कंटेन्ट को हटाएं"
+ },
+ {
+ "topic": "मेरे Ubuntu सिस्टम पर दीक्षा डेस्कटॉप एप्लिकेशन इंस्टॉल करने में असमर्थ",
+ "description": " अपने ubuntu सिस्टम पर DIKSHA डेस्कटॉप एप्लिकेशन इंस्टॉल करने के लिए: p>\n
1) अपना टर्मिनल खोलें
\n 2) निर्देशिका को बदलने के लिए कमांड सीडी <स्थान> को चलाएँ जहाँ एक्स फ़ाइल है डाउनलोड किया गया है। उदाहरण के लिए, यदि exe डाउनलोड फ़ोल्डर में सहेजा गया है, तो कमांड cd डाउनलोड चलाएं
\n 3) कमांड sudo dpkg -i चलाएं
\n सफलतापूर्वक इस कमांड को चलाने पर एप्लिकेशन लॉन्च किया गया है
"
+ }
+ ],
+ "constants": {
+ "charactersLeft": "अक्षर बाकी",
+ "explainMsg": "आपकी समस्या हमें विस्तार में बतायें",
+ "faqMsg": "अक्सर पूछे जाने वाले प्रश्न",
+ "help": "सहायता",
+ "helpMsg": "क्या आप इस उत्तर से संतुष्ट हैं?",
+ "initiateEmailButton": "ईमेल भेजें",
+ "knowMoreMsg": "आप कोई और जानकारी चाहते हैं?",
+ "noMsg": "नहीं",
+ "reportIssue": "समस्या रिपोर्ट करें",
+ "reportIssueMsg": "अन्य समस्या रिपोर्ट करें",
+ "resolveMsg": "अपनी समस्या का हल सूची में देखें",
+ "sorryMsg": "क्षमा करें!",
+ "submitButton": "दाख़िल करें",
+ "tellMoreMsg": "आपकी समस्या हमें विस्तार में बतायें",
+ "thanksMsg": "आपकी प्रतिक्रिया के लिए धन्यवाद",
+ "triggerEmailMsg": "आप अपना विवरण भर कर, 'ईमेल आरम्भ करें' का बटन दबायें। हम आपकी ओर से ईमेल ट्रिगर करेंगे| आप इस ईमेल में अधिक विवरण व संलग्न जोड़ सकते है।",
+ "typeHere": "यहाँ टाइप करें...",
+ "yesMsg": "हाँ"
+ }
+}
\ No newline at end of file
diff --git a/utils/DesktopFAQ/faq-kn.json b/utils/DesktopFAQ/faq-kn.json
new file mode 100644
index 000000000..1be7171ac
--- /dev/null
+++ b/utils/DesktopFAQ/faq-kn.json
@@ -0,0 +1,68 @@
+{
+ "faqs": [
+ {
+ "topic": "ನನ್ನ ಮಂಡಳಿ, ಮಾಧ್ಯಮ, ತರಗತಿ ಮತ್ತು ವಿಷಯ ಕಾಣುತ್ತಿಲ್ಲ",
+ "description": "ನಿಮ್ಮ ರಾಜ್ಯವು ಸದ್ಯಕ್ಕೆ ಎಲ್ಲ ಮಂಡಳಿಗಳು, ಮಾಧ್ಯಮಗಳು, ತರಗತಿಗಳು ಮತ್ತು ವಿಷಯಗಳನ್ನು ಬೆಂಬಲಿಸುತ್ತಿಲ್ಲ. ನಿಮ್ಮ ರಾಜ್ಯವು ಅವುಗಳನ್ನು ಸೇರಿಸಿದ ನಂತರ, ನೀವು ಪಟ್ಟಿಯಲ್ಲಿ ಅವನ್ನು ಕಾಣುತ್ತೀರಿ "
+ },
+ {
+ "topic": "ನಾನು ಪಠ್ಯಾಂಶವನ್ನು ಡೌನ್ಲೋಡ್ ಮಾಡಿದೆ, ಆದರೆ ಪ್ಲೇ ಮಾಡಲು ಆಗುತ್ತಿಲ್ಲ, ಯಾಕೆಂದರೆ ಅದು ಇಂಟರ್ನೆಟ್ ಬೇಕೆಂದು ಹೇಳುತ್ತಿದೆ",
+ "description": "ನೀವು ಯು ಟ್ಯೂಬ್ ಪಠ್ಯಾಂಶವನ್ನು ಡೌನ್ಲೋಡ್ ಮಾಡಿರಬಹುದು. ನೀವು ಆನ್ಲೈನ್ ಇದ್ದಾಗ ಮಾತ್ರ ಯು ಟ್ಯೂಬ್ ಪಠ್ಯಾಂಶವನ್ನು ನೋಡಬಹುದು. ಕಂಪ್ಯೂಟರನ್ನು ಇಂಟರ್ನೆಟ್ ಗೆ ಸಂಪರ್ಕಿಸಿ, ಮತ್ತೊಮ್ಮೆ ಪ್ರಯತ್ನಿಸಿ."
+ },
+ {
+ "topic": "ನನಗೆ ದೀಕ್ಷಾ ಡೆಸ್ಕ್ ಟಾಪ್ ಆಪ್ ಅನ್ನು ಅಪ್ಡೇಟ್ ಮಾಡಬೇಕಿದೆ",
+ "description": "ನಿಮ್ಮ ಕಂಪ್ಯೂಟರನ್ನು ಇಂಟರ್ನೆಟ್ ಗೆ ಸಂಪರ್ಕಿಸಿ ಮತ್ತು ಇತ್ತೀಚಿನ ಆಪ್ ಆವೃತ್ತಿಗೆ https://staging.sunbirded.org/desktop/latest ಅನ್ನು ಪರೀಕ್ಷಿಸಿ"
+ },
+ {
+ "topic": "ನನಗೆ ಇಂಟರ್ನೆಟ್ ಸಂಪರ್ಕ ಇರುವ ಲ್ಯಾಪ್ಟಾಪ್ ಗೆ ಲಭ್ಯತೆ ಇಲ್ಲ, ಆದರೆ ಡೆಸ್ಕ್ ಟಾಪ್ ಆಪ್ ನಲ್ಲಿ ನಾನು ಪಠ್ಯಾಂಶಗಳನ್ನು ಸೇರಿಸಲು ಅಥವಾ ನವೀಕರಿಸಲು ಬಯಸಿದ್ದೇನೆ. ",
+ "description": "ನಿಮ್ಮ ಬಳಿ ಮೊಬೈಲ್ ಫೋನಿದ್ದರೆ, ಗೂಗಲ್ ಪ್ಲೇ ಸ್ಟೋರಿನಿಂದ ದೀಕ್ಷಾ ಮೊಬೈಲ್ ಆಪ್ ಡೌನ್ಲೋಡ್ ಮಾಡಿ.\nಆಪ್ ನಲ್ಲಿ ಪಠ್ಯಾಂಶವನ್ನು ಹುಡುಕಿರಿ. \nದೀಕ್ಷಾ ಗ್ರಂಥಾಲಯದಿಂದ ಪಠ್ಯಾಂಶವನ್ನು ಡೌನ್ಲೋಡ್ ಮಾಡಿ.\nಅದನ್ನು ಪೆನ್ ಡ್ರೈವಿಗೆ ಅಥವಾ ಎಸ್ ಡಿ ಕಾರ್ಡಿಗೆ ಕಾಪಿ ಮಾಡಿ ಮತ್ತು ದೀಕ್ಷಾ ಡೆಸ್ಕ್ ಟಾಪ್ ಆಪ್ ಗೆ ಅಪ್ಲೋಡ್ ಮಾಡಿ. "
+ },
+ {
+ "topic": "ನನಗೆ ನಿರ್ದಿಷ್ಟವಾದ ಅಧ್ಯಾಯದ ಪಠ್ಯಾಂಶ ಕಾಣುತ್ತಿಲ್ಲ, ಅಥವಾ ಸಂಬಂಧವಿಲ್ಲದ ಪಠ್ಯಾಂಶ ಕಾಣುತ್ತಿದೆ",
+ "description": "ಪಠ್ಯಾಂಶವನ್ನು ಹುಡುಕಲು ದೀಕ್ಷಾದ ಆನ್ಲೈನ್ ಗ್ರಂಥಾಲಯದಲ್ಲಿ ಬ್ರೌಸ್ ಮಾಡಿ. ಆಗಲೂ ಸಿಗದಿದ್ದರೆ, ಪಠ್ಯಾಂಶ ಕುರಿತ ಹಿಮ್ಮಾಹಿತಿಯನ್ನು ನಿಮ್ಮ ಡಿ.ಎಸ್.ಇ.ಆರ್.ಟಿ.ಗೆ ಕಳಿಸಿ. "
+ },
+ {
+ "topic": "ಆಪ್ ತುಂಬಾ ನಿಧಾನವಿದೆ",
+ "description": "ಆಪ್ ಕಾರ್ಯಕ್ಷಮತೆಯನ್ನು ವೇಗವಾಗಿಸಲು, ಕೆಳಗಿನಂತೆ ಮಾಡಿ: \n ನಿಮ್ಮ ಕಂಪ್ಯೂಟರ್ ಸಿಸ್ಟಮ್ ಕಾನ್ಫಿಗರೇಶನ್ ಗೆ ಹೋಗಿ. ಕನಿಷ್ಟ ಕಾನ್ಫಿಗರೇಶನ್ ಹೀಗಿರಬೇಕು: \n 2 GB RAM \nDual Core Processor \n ನಿಮ್ಮ ಕಂಪ್ಯೂಟರ್ ಕಾನ್ಫಿಗರೇಶನ್ ಗೆ ಹೊಂದುತ್ತಿದ್ದರೆ ಅಥವಾ ಇದಕ್ಕಿಂದ ಹೆಚ್ಚಿನದಿದ್ದರೆ, ಆಪ್ ಅನ್ನು ರಿಸ್ಟಾರ್ಟ್ ಮಾಡಿ. \n ಹೀಗೆ ಮಾಡಿದ ನಂತರವೂ, ನಿಧಾನವಾಗಿದ್ದರೆ, ಇಲ್ಲಿಗೆ ಹೋಗಿಟಾಸ್ಕ್ ಮ್ಯಾನೇಜರ್ ,\nಬಳಕೆಮಾಡದ ಎಲ್ಲ ಬ್ಯಾಕ್ ಗ್ರೌಂಡ್ ಪ್ರಕ್ರಿಯೆಗಳನ್ನು ಆಯ್ಕೆ ಮಾಡಿ ಮತ್ತು ಕ್ಲಿಕ್ ಮಾಡಿ ಎಂಡ್ ಟಾಸ್ಕ್ "
+ },
+ {
+ "topic": "ನನಗೆ ಪಠ್ಯಾಂಶವನ್ನು ಪೆನ್ ಡ್ರೈವಿಗೆ ಕಾಪಿ ಮಾಡಲು ಆಗುತ್ತಿಲ್ಲ",
+ "description": "ಪಠ್ಯಾಂಶವನ್ನು ಪೆನ್ ಡ್ರೈವಿಗೆ ಕಾಪಿ ಮಾಡಲು, ಕೆಳಗೆ ಸೂಚಿಸಿರುವಂತೆ ಮಾಡಿ: \nನಿಮ್ಮ ಕಂಪ್ಯೂಟರ್ ಸೆಟ್ಟಿಂಗ್ಸ್ ಗೆ ಹೋಗಿ. ಯುಎಸ್ಬಿ ಡ್ರೈವ್ ರೈಟ್ ಪ್ರೊಟೆಕ್ಟೆಡ್ ಎಂದು ಇದೆಯೇ ನೋಡಿ. ಹಾಗಿದ್ದರೆ, ಪ್ರೊಟೆಕ್ಷನ್ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ \nಪೆನ್ ಡ್ರೈವಿನಲ್ಲಿ ಖಾಲಿ ಜಾಗವಿದೆಯೇ ನೋಡಿ. ಪೆನ್ ಡ್ರೈವಿನಲ್ಲಿ ಅನಗತ್ಯ ಫೈಲುಗಳನ್ನು ಡಿಲೀಟ್ ಮಾಡಿ "
+ },
+ {
+ "topic": "ನನ್ನ ಪೆನ್ ಡ್ರವಿಗೆ ಪಠ್ಯಾಂಶವನ್ನು ಲೋಡ್ ಮಾಡಿರುವೆ, ಆದರೆ ಈಗ ಅದು ಖಾಲಿಯಾಗಿ ಕಾಣುತ್ತಿದೆ",
+ "description": "ನಿಮ್ಮ ಪೆನ್ ಡ್ರೈವ್ ಅಥವಾ ಕಂಪ್ಯೂಟರ್ ಗೆ ವೈರಸ್ ದಾಳಿಯಾಗಿರಬಹುದು. ಇದನ್ನು ಪರೀಕ್ಷಿಸಿ: \n* ನಿಮ್ಮ ಸಿಸ್ಟಮ್ ನಲ್ಲಿ ಆಂಟಿ ವೈರಸ್ ಸಾಫ್ಟ್ ವೇರ್ ಇನ್ ಸ್ಟಾಲ್ ಆಗಿದೆಯೇ ನೋಡಿ\n* ಅಪರಿಚಿತ ಕಂಪ್ಯೂಟರ್ ಗೆ ನಿಮ್ಮ ಪೆನ್ ಡ್ರೈವ್ ಹಾಕುವ ಮೊದಲು, ಅದು ರೈಟ್-ಪ್ರೊಟೆಕ್ಟೆಡ್ ಆಗಿದೆಯೇ ನೋಡಿ"
+ },
+ {
+ "topic": "ಪಠ್ಯಾಂಶವನ್ನು ನನ್ನ ಪೆನ್ ಡ್ರೈವಿಗೆ ಮತ್ತು ನನ್ನ ಪೆನ್ ಡ್ರೈವಿನಿಂದ ಕಾಪಿ ಮಾಡಲು ಸಮಯ ತೆಗೆದುಕೊಳ್ಳುತ್ತದೆ",
+ "description": "ಕಾಪಿ ಮಾಡಲು ತೆಗೆದುಕೊಳ್ಳುವ ಸಮಯವು ಪಠ್ಯಾಂಶ ಫೈಲಿನ ಗಾತ್ರವನ್ನು ಅವಲಂಬಿಸಿರುತ್ತದೆ. ದೊಡ್ಡ ಪಠ್ಯಪುಸ್ತಕಗಳಾದರೆ ಕಾಪಿಯಾಗಲು ಸಮಯ ತೆಗೆದುಕೊಳ್ಳುತವೆ. ಮಧ್ಯದಲ್ಲಿ ಕಾಪಿ ಪ್ರಕ್ರಿಯೆಯನ್ನು ನಿಲ್ಲಿಸಬೇಡಿ. ಹಾಗೆ ಮಾಡಿದರೆ ಫೈಲುಗಳು ಸರಿಯಾಗಿ ಕಾಪಿಯಾಗುವುದಿಲ್ಲ."
+ },
+ {
+ "topic": "ದೀಕ್ಷಾ ಪಠ್ಯಾಂಶದಿಂದಾಗಿ ನನ್ನ ಕಂಪ್ಯೂಟರಿನಲ್ಲಿ ಖಾಲಿ ಜಾಗ ಉಳಿದಿಲ್ಲ",
+ "description": "ನಿಮ್ಮ ಕಂಪ್ಯೂಟರಿನಲ್ಲಿ ಜಾಗ ಖಾಲಿ ಮಾಡಲು ಆಪ್ ನ ಮೈ ಡೌನ್ಲೋಡ್ಸ್ ಟ್ಯಾಬಿನಿಂದ ಡೌನ್ಲೋಡ್ ಆಗಿರುವ ಪಠ್ಯಾಂಶಗಳನ್ನು ಡಿಲೀಟ್ ಮಾಡಿ"
+ },
+ {
+ "topic": "ನನ್ನ ಉಬಂಟು ಸಿಸ್ಟಮ್ ನಲ್ಲಿ ದೀಕ್ಷಾ ಡೆಸ್ಕ್ ಟಾಪ್ ಅಪ್ಲಿಕೇಶನ್ ಸ್ಥಾಪಿಸಲು ಆಗುತ್ತಿಲ್ಲ",
+ "description": "ನಿಮ್ಮ ಉಬಂಟು ಸಿಸ್ಟಮ್ ನಲ್ಲಿ ದೀಕ್ಷಾ ಡೆಸ್ಕ್ ಟಾಪ್ ಅಪ್ಲಿಕೇಷನ್ ಹಾಕಿಕೊಳ್ಳಲು:
\n
1) ನಿಮ್ಮ ಟರ್ಮಿನಲ್ ಓಪನ್ ಮಾಡಿ
\n2) ಕಮಾಂಡ್ ಸಿಡಿ ರನ್ ಮಾಡಿ exe ಫೈಲ್ ಡೌನ್ಲೋಡ್ ಆಗಿರುವಲ್ಲಿ ಡೈರೆಕ್ಟರಿಯನ್ನು ಬದಲಿಸಲು. ಉದಾಹರಣೆಗೆ, exe ಯು ಡೌನ್ಲೋಡ್ಸ್ ಫೋಲ್ಡರಿನಲ್ಲಿ ಸೇವ್ ಆಗಿದ್ದರೆ, ಆಗ ಕಮಾಂಡ್ ಸಿಡಿ ಡೌನ್ಲೋಡ್ಸ್ ಅನ್ನು ರನ್ ಮಾಡಿ
\n3) ಕಮಾಂಡ್ sudo dpkg ರನ್ ಮಾಡಿ -i
\nಈ ಕಮಾಂಡ್ ಅನ್ನು ಯಶಸ್ವಿಯಾಗಿ ರನ್ ಮಾಡಿದ ನಂತರ, ಅಪ್ಲಿಕೇಶನ್ ಶುರುವಾಗುತ್ತದೆ
"
+ }
+ ],
+ "constants": {
+ "charactersLeft": "ಉಳಿದಿರುವ ಅಕ್ಷರಗಳು",
+ "explainMsg": "ನೀವು ತೊಂದರೆಯನ್ನು ವಿವರಿಸುವಿರಾ?",
+ "faqMsg": "ಪದೇಪದೇ ಕೇಳುವ ಪ್ರಶ್ನೆಗಳು",
+ "help": "ಸಹಾಯ",
+ "helpMsg": "ಈ ಉತ್ತರದಿಂದ ನಿಮಗೆ ಸಹಾಯವಾಯಿತೇ? ",
+ "initiateEmailButton": "ಇಮೇಲ್ ಆರಂಭಿಸಿ ",
+ "knowMoreMsg": "ಇನ್ನೂ ಹೆಚ್ಚಿನದೇನದನ್ನು ತಿಳಿಯಲು ಬಯಸುವಿರಿ? ",
+ "noMsg": "ಇಲ್ಲ",
+ "reportIssue": "ಸಮಸ್ಯೆ ಇದೆಯೆಂದು ವರದಿ ಮಾಡಿ",
+ "reportIssueMsg": "ಬೇರೆ ಸಮಸ್ಯೆ ಬಗ್ಗೆ ವರದಿ ಮಾಡಿ ",
+ "resolveMsg": "ನಿಮ್ಮ ಸಮಸ್ಯೆ ಪರಿಹರಿಸಿಕೊಳ್ಳಲು ಪೂರ್ಣ ಪಟ್ಟಿಯನ್ನು ನೋಡಿ",
+ "sorryMsg": "ಅದಕ್ಕಾಗಿ ವಿಷಾದಿಸುತ್ತೇವೆ!",
+ "submitButton": "ಸಲ್ಲಿಸಿ",
+ "tellMoreMsg": "ನೀವು ಎದುರಿಸಿದ ತೊಂದರೆಯ ಬಗ್ಗೆ ಹೆಚ್ಚಿನ ಮಾಹಿತಿ ಹೇಳಿ. ",
+ "thanksMsg": "ನಿಮ್ಮ ಪ್ರತಿಕ್ರಿಯೆಗೆ ಧನ್ಯವಾದಗಳು!",
+ "triggerEmailMsg": "ನೀವು ಟೆಕ್ಸ್ಟ್ ಬಾಕ್ಸಿನಲ್ಲಿ ವಿವರಗಳನ್ನು ಸೇರಿಸಿದ ನಂತರ, ಇಮೇಲ್ ಆರಂಭಿಸಿ ಬಟನ್ ಅನ್ನು ಒತ್ತಿರಿ, ನಾವು ನಿಮ್ಮ ಪರವಾಗಿ ಇಮೇಲ್ ಶುರು ಮಾಡುತ್ತೇವೆ. ನೀವು ಹೆಚ್ಚಿನ ಮಾಹಿತಿಯನ್ನು /ಅಥವ ಅಲ್ಲಿ ಫೈಲುಗಳನ್ನು ಸೇರಿಸಬಹುದು.",
+ "typeHere": "ಇಲ್ಲಿ ಟೈಪ್ ಮಾಡಿ...",
+ "yesMsg": "ಹೌದು"
+ }
+}
\ No newline at end of file
diff --git a/utils/DesktopFAQ/faq-ml.json b/utils/DesktopFAQ/faq-ml.json
new file mode 100644
index 000000000..d0b40c43e
--- /dev/null
+++ b/utils/DesktopFAQ/faq-ml.json
@@ -0,0 +1,68 @@
+{
+ "faqs": [
+ {
+ "topic": "എന്റെ ബോർഡ്, മീഡിയം, ക്ലാസ്, വിഷയം എന്നിവ കാണാൻ എനിക്ക് കഴിയുന്നില്ല ",
+ "description": "നിങ്ങളുടെ സംസ്ഥാനം നിലവിൽ എല്ലാ ബോർഡുകളും മീഡിയങ്ങളും ക്ലാസുകളും വിഷയങ്ങളും പിന്തുണയ്ക്കുന്നില്ല. നിങ്ങളുടെ സംസ്ഥാനം അവരെ ചേർത്താലുടൻ, നിങ്ങൾക്ക് അത് പട്ടികയിൽ കാണാം "
+ },
+ {
+ "topic": "ഞാൻ ഉള്ളടക്കം ഡ download ൺലോഡ് ചെയ്തു, പക്ഷേ എനിക്ക് ഇന്റർനെറ്റ് ആവശ്യമാണെന്ന് പറയുന്നതിനാൽ എനിക്ക് പ്ലേ ചെയ്യാൻ കഴിയില്ല",
+ "description": "നിങ്ങൾ YouTube ഉള്ളടക്കം ഡൗൺലോഡ് ചെയ്തിരിക്കാം. നിങ്ങൾ ഓൺലൈനിൽ ആയിരിക്കുമ്പോൾ മാത്രമേ നിങ്ങൾക്ക് YouTube ഉള്ളടക്കം പ്ലേ ചെയ്യാൻ കഴിയൂ. കമ്പ്യൂട്ടർ ഇന്റർനെറ്റിലേക്ക് കണക്റ്റു ചെയ്തു വീണ്ടും ശ്രമിക്കുക."
+ },
+ {
+ "topic": "എന്റെ DIKSHA ഡെസ്ക്ടോപ്പ് അപ്ലിക്കേഷൻ അപ്ഡേറ്റ് ചെയ്യേണ്ടതുണ്ട്",
+ "description": "നിങ്ങളുടെ കമ്പ്യൂട്ടർ ഇന്റർനെറ്റിലേക്ക് കണക്റ്റുചെയ്ത് ഏറ്റവും പുതിയ അപ്ലിക്കേഷൻ പതിപ്പിനായി https://staging.sunbirded.org/desktop/latest പരിശോധിക്കുക"
+ },
+ {
+ "topic": "എനിക്ക് ഇന്റർനെറ്റ് കണക്ഷനുള്ള ഒരു ലാപ്ടോപ്പ് ഇല്ല, പക്ഷേ ഡെസ്ക്ടോപ്പ് അപ്ലിക്കേഷനിൽ ഉള്ളടക്കം ചേർക്കാനോ അപ്ഡേറ്റുചെയ്യാനോ ഞാൻ ആഗ്രഹിക്കുന്നു",
+ "description": "നിങ്ങൾക്ക് ഒരു മൊബൈൽ ഫോൺ ഉണ്ടെങ്കിൽ, google പ്ലേസ്റ്റോറിൽ നിന്ന് DIKSHA മൊബൈൽ അപ്ലിക്കേഷൻ ഡൗൺലോഡുചെയ്യുക. അപ്ലിക്കേഷനിലെ ഉള്ളടക്കത്തിനായി ബ്രൗസുചെയ്യുക. DIKSHA ലൈബ്രറിയിൽ നിന്ന് ഉള്ളടക്കം ഡൗൺലോഡുചെയ്യുക.ഒരു പെൻഡ്രൈവ് അല്ലെങ്കിൽ SD കാർഡിൽ പകർത്തി അത് DIKSHA ഡെസ്ക്ടോപ്പ് അപ്ലിക്കേഷനിൽ അപ്ലോഡുചെയ്യുക."
+ },
+ {
+ "topic": "ഒരു പ്രത്യേക വിഷയത്തിൽ എനിക്ക് ഉള്ളടക്കം കണ്ടെത്താൻ കഴിയില്ല, അല്ലെങ്കിൽ എനിക്ക് ലഭിക്കുന്ന ഉള്ളടക്കം അപ്രസക്തമാണ്",
+ "description": "ഉള്ളടക്കത്തിനായി തിരയുന്നതിന് DIKSHA യുടെ ഓൺലൈൻ ലൈബ്രറി ബ്രൗസ് ചെയ്യുക.അവിടെ ലഭ്യമല്ലെങ്കിൽ, ഉള്ളടക്കത്തെക്കുറിച്ചുള്ള നിങ്ങളുടെ ഫീഡ്ബാക്ക് സംസ്ഥാന SCERT ലേക്ക് അയയ്ക്കുക"
+ },
+ {
+ "topic": "അപ്ലിക്കേഷൻ മന്ദഗതിയിലാണ്",
+ "description": "അപ്ലിക്കേഷൻ പ്രകടനം വേഗത്തിലാക്കാൻ,ചുവടെപറയുന്നവ ചെയ്യുക:\n നിങ്ങളുടെ കമ്പ്യൂട്ടറിന്റെ സിസ്റ്റം കോൺഫിഗറേഷനിലേക്ക് പോകുക. ഏറ്റവും കുറഞ്ഞ കോൺഫിഗറേഷൻ ഇതായിരിക്കണം:\n2 GB RAM \nDual Core Processor \n നിങ്ങളുടെ കമ്പ്യൂട്ടറിന്റെ കോൺഫിഗറേഷൻ തുല്യമോ അതിൽ കൂടുതലോ ആണെങ്കിൽ, അപ്ലിക്കേഷൻ പുനരാരംഭിക്കുക.\n ഇത് ചെയ്തതിനു ശേഷവും അപ്ലിക്കേഷൻ മന്ദഗതിയിലാണെങ്കിൽ, ടാസ്ക് മാനേജർ ലേക്ക് പോകുക,ഉപയോഗിക്കാത്ത എല്ലാ പശ്ചാത്തല പ്രക്രിയകളും തിരഞ്ഞെടുത്ത് ടാസ്ക് അവസാനിപ്പിക്കുക ക്ലിക്കുചെയ്യുക"
+ },
+ {
+ "topic": " പെൻഡ്രൈവിലേക്ക് ഉള്ളടക്കം പകർത്താൻ എനിക്ക് കഴിയില്ല ",
+ "description": "ഒരു പെൻ ഡ്രൈവിലേക്ക് ഉള്ളടക്കം പകർത്താൻ,ചുവടെപറയുന്നവ ചെയ്യുക:\nനിങ്ങളുടെ കമ്പ്യൂട്ടർ ക്രമീകരണങ്ങളിലേക്ക് പോകുക.USB ഡ്രൈവ് എഴുത്ത് പരിരക്ഷിതമാണോയെന്ന് പരിശോധിക്കുക. അങ്ങനെയാണെങ്കിൽ, പരിരക്ഷണം പ്രവർത്തനരഹിതമാക്കുക \nപെൻഡ്രൈവിൽ ഇടമുണ്ടോയെന്ന് പരിശോധിക്കുക. പെൻഡ്രൈവിൽ നിന്ന് അനാവശ്യ ഫയലുകൾ ഡിലീറ്റ് ചെയ്യുക "
+ },
+ {
+ "topic": "എന്റെ പെൻഡ്രൈവിൽ ഞാൻ ഉള്ളടക്കം ലോഡുചെയ്തിരുന്നു, പക്ഷേ ഇപ്പോൾ അത് ശൂന്യമായി ഞാൻ കാണുന്നു",
+ "description": "നിങ്ങളുടെ പെൻ ഡ്രൈവ് അല്ലെങ്കിൽ കമ്പ്യൂട്ടർ ഒരു വൈറസ് ബാധിച്ചേക്കാം. പരിശോധിക്കുക:\n* നിങ്ങളുടെ ഉപകരണത്തിൽ ആന്റി വൈറസ് സോഫ്റ്റ്വെയർ ഇൻസ്റ്റാൾ ചെയ്തിട്ടുണ്ടോ \n* അജ്ഞാത ഉപകരണങ്ങളിലേക്ക് കണക്റ്റുചെയ്യുന്നതിന് മുമ്പ് നിങ്ങളുടെ പെൻ ഡ്രൈവ് പുനരാലേഖനം ചെയ്യപ്പെടുന്നുണ്ടോ"
+ },
+ {
+ "topic": "എന്റെ പെൻ ഡ്രൈവിലേക്കും പെൻ ഡ്രൈവിൽ നിന്നോ ഉള്ളടക്കം പകർത്താൻ സമയമെടുക്കും",
+ "description": "പകർത്താൻ എടുക്കുന്ന സമയം ഉള്ളടക്ക ഫയലിന്റെ വലുപ്പത്തെ ആശ്രയിച്ചിരിക്കുന്നു. ചില വലിയ പാഠപുസ്തകങ്ങൾ പകർത്താൻ സമയമെടുക്കും.അതിനിടയിൽ പ്രക്രിയ നിർത്തരുതെന്ന് ഞങ്ങൾ ശുപാർശ ചെയ്യുന്നു. അങ്ങനെ ചെയ്യുന്നത് പൊരുത്തമില്ലാത്ത ഫയലുകളിലേക്ക് നയിച്ചേക്കാം."
+ },
+ {
+ "topic": "DIKSHA ഉള്ളടക്കം കാരണം എന്റെ കമ്പ്യൂട്ടറിൽ ഇടമില്ല",
+ "description": "നിങ്ങളുടെ കമ്പ്യൂട്ടറിൽ ഇടം ശൂന്യമാക്കുന്നതിന് അപ്ലിക്കേഷന്റെ എന്റെ ഡൗൺലോഡുകൾ ടാബിൽ നിന്ന് ഡൗൺലോഡുചെയ്ത ഉള്ളടക്കം ഡിലീറ്റ് ചെയ്യുക"
+ },
+ {
+ "topic": "എന്റെ ഉബുണ്ടു സിസ്റ്റത്തിൽ DIKSHA ഡെസ്ക്ടോപ്പ് ആപ്ലിക്കേഷൻ ഇൻസ്റ്റാൾ ചെയ്യാൻ കഴിയുന്നില്ല ",
+ "description": " നിങ്ങളുടെ ഉബുണ്ടു സിസ്റ്റത്തിൽ DIKSHA ഡെസ്ക്ടോപ്പ് അപ്ലിക്കേഷൻ ഇൻസ്റ്റാൾ ചെയ്യുന്നതിന്:
1) നിങ്ങളുടെ ടെർമിനൽ തുറക്കുക
\n 2)exe ഫയൽ ഡൗൺലോഡ് ചെയ്ത സ്ഥലത്തേക്ക് ഡയറക്ടറി മാറ്റുന്നതിന് cd കമാൻഡ് പ്രവർത്തിപ്പിക്കുക. ഉദാഹരണത്തിന്, ഡൗൺലോഡ് ഫോൾഡറിൽ exe സംരക്ഷിച്ചിട്ടുണ്ടെങ്കിൽ,കമാൻഡ് cd ഡൗൺലോഡുകൾ പ്രവർത്തിപ്പിക്കുക
\n3) sudo dpkg -i കമാൻഡ് പ്രവർത്തിപ്പിക്കുക
\n ഈ കമാൻഡ് വിജയകരമായി പ്രവർത്തിപ്പിക്കുമ്പോൾ അപ്ലിക്കേഷൻ സമാരംഭിച്ചു
"
+ }
+ ],
+ "constants": {
+ "charactersLeft": "പ്രതീകങ്ങൾ ശേഷിക്കുന്നു",
+ "explainMsg": "നിങ്ങൾക്ക് പ്രശ്നം വിശദീകരിക്കാമോ?",
+ "faqMsg": "പതിവായി ചോദിക്കുന്ന ചോദ്യങ്ങൾ",
+ "help": "സഹായം",
+ "helpMsg": "ഈ ഉത്തരം നിങ്ങളെ സഹായിച്ചോ?\n",
+ "initiateEmailButton": "ഇമെയിൽ ആരംഭിക്കുക",
+ "knowMoreMsg": "കൂടുതൽ എന്താണ് നിങ്ങൾ അറിയാൻ ആഗ്രഹിക്കുന്നത്?",
+ "noMsg": "ഇല്ല",
+ "reportIssue": "ഒരു പ്രശ്നം റിപ്പോർട്ടുചെയ്യുക",
+ "reportIssueMsg": "മറ്റ് പ്രശ്നം റിപ്പോർട്ട് ചെയ്യുക",
+ "resolveMsg": "നിങ്ങളുടെ പ്രശ്നം പരിഹരിക്കാൻ പട്ടികയിലൂടെ നോക്കുക",
+ "sorryMsg": "ക്ഷമിക്കണം!",
+ "submitButton": "സമർപ്പിക്കുക",
+ "tellMoreMsg": "നിങ്ങൾ നേരിട്ട പ്രശ്നത്തെക്കുറിച്ച് ഞങ്ങളോട് കൂടുതൽ പറയുക",
+ "thanksMsg": "നിങ്ങളുടെ പ്രതികരണത്തിന് നന്ദി!",
+ "triggerEmailMsg": "ടെക്സ്റ്റ് ബോക്സിൽ നിങ്ങൾ വിശദാംശങ്ങൾ ചേർത്ത് ഇമെയിൽ ആരംഭിക്കുക ബട്ടൺ ടാപ്പുചെയ്ത ശേഷം, നിങ്ങളുടെ താൽപ്പര്യാർത്ഥം ഞങ്ങൾ ഒരു ഇമെയിൽ പ്രവർത്തനക്ഷമമാക്കും. നിങ്ങൾക്ക് കൂടുതൽ വിശദാംശങ്ങൾ ചേർക്കാനും അല്ലെങ്കിൽ അവിടെ ഫയലുകൾ അറ്റാച്ചുചെയ്യാനും കഴിയും.",
+ "typeHere": "ഇവിടെ ടൈപ്പ് ചെയ്യുക...",
+ "yesMsg": "അതെ"
+ }
+}
\ No newline at end of file
diff --git a/utils/DesktopFAQ/faq-mr.json b/utils/DesktopFAQ/faq-mr.json
new file mode 100644
index 000000000..ba4453fdc
--- /dev/null
+++ b/utils/DesktopFAQ/faq-mr.json
@@ -0,0 +1,68 @@
+{
+ "faqs": [
+ {
+ "topic": "मला माझे बोर्ड, माध्यम, इयत्ता व विषय दिसत नाहीत ",
+ "description": "तुमचे राज्य सध्या सर्व बोर्ड, माध्यमे, इयत्ता व विषयांना समर्थन देत नाही. तुमच्या राज्याने हे जोडताच, तुम्हाला ते यादीत दिसेल."
+ },
+ {
+ "topic": "मी सामग्री डाउनलोड केली आहे, पण 'इंटरनेट आवश्यक आहे' या कारणास्तव मी ती चालवू शकत नाही ",
+ "description": "तुम्ही यूट्यूब वरची सामग्री डाउनलोड केलेली असू शकते. तुम्ही यूट्यूब सामग्री फक्त ऑनलाइन असताना चालवू शकता. कॉम्प्युटर इंटरनेटशी जोडून पुन्हा प्रयत्न करा."
+ },
+ {
+ "topic": "मला माझा DIKSHA डेस्कटॉप ऍप अपडेट करायचा आहे ",
+ "description": "ऍपच्या नवीनतम आवृत्तीसाठी तुमचा कॉम्प्युटर इंटरनेटशी जोडून https://staging.sunbirded.org/desktop/latest तपासा "
+ },
+ {
+ "topic": "माझ्याकडे इंटरनेट कनेक्शन असलेला लॅपटॉप नाही, पण मला डेस्कटॉप ऍपवर सामग्री जोडायची किंवा अपडेट करायची आहे ",
+ "description": "तुमच्याकडे मोबाइल फोन असल्यास, गूगल प्लेस्टोर वरून DIKSHA मोबाइल ऍप डाउनलोड करा.\nऍपवरून सामग्री ब्राउझ करा.\nDIKSHA लायब्ररी मधून सामग्री डाउनलोड करा.\nती पेन ड्राइव्ह किंवा SD कार्ड वर कॉपी करून DIKSHA डेस्कटॉप ऍपवर अपलोड करा."
+ },
+ {
+ "topic": "मला एका विशिष्ट विषयाची सामग्री मिळत नाही, किंवा मिळालेली सामग्री असंबद्ध आहे ",
+ "description": "सामग्री शोधण्यासाठी दीक्षा DIKSHAची ऑनलाइन लायब्ररी ब्राउझ करा. तिथेही सामग्री उपलब्ध नसल्यास, तुमचा सामग्री विषयी अभिप्राय राज्य SCERTकडे पाठवा "
+ },
+ {
+ "topic": "ऍपचा वेग खूप कमी आहे ",
+ "description": "तुमच्या ऍपची कार्यक्षमता वाढवण्यासाठी खालीलप्रमाणे करा:\n तुमच्या कॉम्प्युटरच्या सिस्टिम कॉन्फिगरेशन वर जा. तुमचे किमान कॉन्फिगरेशन असायला हवे: \n2 GB RAM \nDual Core Processor \n तुमच्या कॉम्पुटरचे कॉन्फिगरेशन एवढे, किंवा यापेक्षा जास्त असल्यास, ऍप पुन्हा सुरू करा.\n हे करूनही ऍपचा वेग कमी असल्यास कार्य व्यवस्थापक इथे जा,\nवापरात नसलेल्या सर्व पार्श्वभूमी प्रक्रिया सिलेक्ट करा व कार्य संपवा क्लिक करा "
+ },
+ {
+ "topic": "मी सामग्री पेन ड्राइव्ह वर कॉपी करू शकत नाही आहे ",
+ "description": "सामग्री पेन ड्राइव्ह वर कॉपी करण्यासाठी खालीलप्रमाणे करा:\nतुमच्या कॉम्प्युटर सेटिंग्ज वर जा. तुमचा USB ड्राइव्ह लिखाण-प्रतिबंधित आहे का, हे तपासा.असल्यास, प्रतिबंध अक्षम करा \nपेन ड्राइव्ह वर मोकळी जागा आहे का पहा. नको असलेल्या फाइल्स पेन ड्राइव्ह वरून डिलीट करा "
+ },
+ {
+ "topic": "मी माझ्या पेन ड्राइव्ह वर सामग्री लोड केली होती, पण आता ती रिकामी आहे असे दिसते ",
+ "description": "तुमचा पेन ड्राइव्ह किंवा कॉम्पुटर व्हायरसने बाधित झाला असण्याची शक्यता आहे. हे तपासा:\n*तुमच्या यंत्रावर अँटी-व्हायरस सॉफ्टवेअर स्थापित केले आहे का \n*अज्ञात यंत्रांशी जोडण्याआधी तुमची पेन ड्राइव्ह लिखाण-प्रतिबंधित केली आहे का "
+ },
+ {
+ "topic": "माझ्या पेन ड्राइव्हवर, किंवा पेन ड्राइव्ह वरून सामग्री कॉपी करण्यास खूप वेळ लागतो ",
+ "description": "कॉपी करण्यासाठी लागणारा वेळ सामग्रीच्या फाइलच्या आकारमानावर अवलंबून आहे. काही मोठी पाठ्यपुस्तके कॉपी करण्यास वेळ लागतो. कॉपीची प्रक्रिया मध्येच थांबवू नये असा आमचा सल्ला आहे. असे केल्यास फाइल्स मध्ये विसंगती येऊ शकते. "
+ },
+ {
+ "topic": "DIKSHAच्या सामग्रीमुळे माझ्या कॉम्प्युटरवर मोकळी जागा उरली नाही ",
+ "description": "तुमच्या कॉम्प्युटरवर जागा मोकळी करण्यासाठी, ऍपवरील माझे डाउनलोड टॅब वरून डाउनलोड केलेली सामग्री डिलीट करा "
+ },
+ {
+ "topic": "माझ्या उबंटू सिस्टिम वर DIKSHA डेस्कटॉप ऍप स्थापित करण्यास अयशस्वी ",
+ "description": "तुमच्या उबंटू सिस्टिम वर DIKSHA डेस्कटॉप ऍप स्थापित करण्यासाठी:
\n१) तुमचे टर्मिनल उघडा
\n२) निर्देशिका बदलून exe फाइल जिथे डाउनलोड केलेली आहे तिथे नेण्यासाठी cd <स्थान> ही आज्ञा करा. उदा:, exe डाउनलोड फोल्डर मध्ये सेव्ह केली असल्यास, cd Downloads
ही आज्ञा करा \n३) sudo dpkg -i
ही आज्ञा करा \nही आज्ञा यशस्वीरीत्या केल्यानंतर हे ऍप सुरू केले जाईल
\n"
+ }
+ ],
+ "constants": {
+ "charactersLeft": "उर्वरित वर्ण ",
+ "explainMsg": "तुम्ही समस्येचे स्पष्टीकरण द्याल का?",
+ "faqMsg": "विचारण्यात येणारे प्रश्न",
+ "help": "सहायता",
+ "helpMsg": "ह्या उत्तराची तुम्हाला मदत झाली का?",
+ "initiateEmailButton": "ईमेल आरंभ करा",
+ "knowMoreMsg": "तुम्हाला आणखीन काही जाणून घ्यायचे आहे का?",
+ "noMsg": "नाही",
+ "reportIssue": "तक्रार दाखल करा",
+ "reportIssueMsg": "इतर तक्रारी दाखल करा",
+ "resolveMsg": "तुमच्या समस्येचे निराकरण करण्यासाठी सूची पहा",
+ "sorryMsg": "क्षमस्व!",
+ "submitButton": "सबमिट करा",
+ "tellMoreMsg": "तुमच्या समस्येबद्दल आम्हाला अधिक सांगा",
+ "thanksMsg": "तुमच्या प्रतिसादासाठी धन्यवाद!",
+ "triggerEmailMsg": "तुम्ही माहिती जोडल्यानंतर आणि 'ईमेल आरंभ करा' बटण टॅप केल्यानंतर, आम्ही तुमच्या वतीने ईमेल ट्रिगर करू. तेथे तुम्ही अधिक माहिती आणि / किंवा फायली संलग्न करू शकता.",
+ "typeHere": "येथे टाईप करा",
+ "yesMsg": "होय"
+ }
+}
\ No newline at end of file
diff --git a/utils/DesktopFAQ/faq-or.json b/utils/DesktopFAQ/faq-or.json
new file mode 100644
index 000000000..315ef2437
--- /dev/null
+++ b/utils/DesktopFAQ/faq-or.json
@@ -0,0 +1,68 @@
+{
+ "faqs": [
+ {
+ "topic": "ମୁ ମୋର ବୋର୍ଡ , ମାଧ୍ୟମ, ଶ୍ରେଣୀ ଓ ବିଷୟ ଦେଖିପାରୁନାହିଁ ",
+ "description": "ଆପଣଙ୍କ ରାଜ୍ୟ ବର୍ତ୍ତମାନ ସବୁ ବୋର୍ଡ ,ମାଧ୍ୟମ ,ଶ୍ରେଣୀ ଏବଂ ବିଷୟକୁ ସପୋର୍ଟ କରୁନାହିଁ | ଆପଣଙ୍କ ରାଜ୍ୟ ଏସବୁକୁ ଯୋଡିବା ମାତ୍ରେ, ଆପଣ ତାହାକୁ ଏହି ସୂଚୀରେ ଦେଖିପାରିବେ "
+ },
+ {
+ "topic": "ମୁଁ କଣ୍ଟେଣ୍ଟ୍ ଡାଉନଲୋଡ୍ କରିଛି, କିନ୍ତୁ ମୁଁ ଏହାକୁ ପ୍ଲେ କରିପାରୁ ନାହିଁ କାରଣ ଇଣ୍ଟରନେଟ୍ ଆବଶ୍ୟକ ବୋଲି ଏହା ଦର୍ଶାଉଛି ",
+ "description": "ଆପଣ YouTube କଣ୍ଟେଣ୍ଟ୍ ଡାଉନଲୋଡ୍ କରିଥାଇପାରନ୍ତି । କେବଳ ଅନଲାଇନ୍ ଥିବା ସମୟରେ ହିଁ ଆପଣ YouTube କଣ୍ଟେଣ୍ଟ୍ ପ୍ଲେ କରିପାରିବେ । କମ୍ପ୍ୟୁଟରକୁ ଇଣ୍ଟରନେଟ୍ ରେ କନେକ୍ଟ କରନ୍ତୁ ଏବଂ ଆଉଥରେ ଚେଷ୍ଟା କରନ୍ତୁ ।"
+ },
+ {
+ "topic": "ମୋର DIKSHA ଡେସ୍କଟପ ଆପ୍ ଅପଡେଟ୍ କରିବାର ଅଛି",
+ "description": "ଆପଣଙ୍କ କମ୍ପ୍ୟୁଟରକୁ ଇଣ୍ଟରନେଟରେ କନେକ୍ଟ କରନ୍ତୁ, ଏବଂ ସଦ୍ୟତମ ଆପ୍ ଭର୍ସନ୍ ପାଇଁ ଦେଖନ୍ତୁ, https://staging.sunbirded.org/desktop/latest"
+ },
+ {
+ "topic": "ଇଣ୍ଟରନେଟ୍ କନେକ୍ସନ୍ ଥିବା ଲାପଟପ୍ ମୋ ପାଖରେ ନାହିଁ, କିନ୍ତୁ ମୁଁ ଡେସ୍କଟପ୍ ଆପ୍ ରେ ଥିବା କଣ୍ଟେଣ୍ଟ୍ ଯୋଗ କରିବାକୁ କିମ୍ବା ଅପଡେଟ୍ କରିବାକୁ ଚାହୁଁଛି ।",
+ "description": "ଯଦି ଆପଣଙ୍କର ମୋବାଇଲ୍ ଫୋନ୍ ଥାଏ, ତେବେ google playstore ରୁ DIKSHA ମୋବାଇଲ୍ ଆପ୍ ଡାଉନଲୋଡ୍ କରନ୍ତୁ ।\nଆପ୍ ରେ କଣ୍ଟେଣ୍ଟ୍ ବ୍ରାଉଜ୍ କରନ୍ତୁ ।\nDIKSHA ଲାଇବ୍ରେରୀରୁ କଣ୍ଟେଣ୍ଟ୍ ଡାଉନଲୋଡ୍ କରନ୍ତୁ ।\nଏହାକୁ ପେନଡ୍ରାଇଭ୍ କିମ୍ବା SD କାର୍ଡରେ କପି କରନ୍ତୁ ଏବଂ DIKSHA ଡେସ୍କଟପ୍ ଆପ୍ ରେ ଅପଲୋଡ୍ କରନ୍ତୁ ।"
+ },
+ {
+ "topic": "ଏକ ନିର୍ଦ୍ଦିଷ୍ଟ ବିଷୟରେ ମୁଁ କଣ୍ଟେଣ୍ଟ୍ ପାଉନାହିଁ, ବା ମୋତେ କଣ୍ଟେଣ୍ଟ୍ ଅପ୍ରାସଙ୍ଗିକ ଲାଗୁଛି",
+ "description": "କଣ୍ଟେଣ୍ଟ୍ ସର୍ଚ୍ଚ କରିବା ପାଇଁ, DIKSHA ର ଅନଲାଇନ୍ ଲାଇବ୍ରେରୀ ବ୍ରାଉଜ୍ କରନ୍ତୁ । ତଥାପି ଯଦି ଏହା ଉପଲବ୍ଧ ନଥାଏ, କଣ୍ଟେଣ୍ଟ୍ ସମ୍ବନ୍ଧରେ ଆପଣଙ୍କ ଫିଡବ୍ୟାକ୍ ରାଜ୍ୟ SCERT କୁ ପଠାନ୍ତୁ "
+ },
+ {
+ "topic": "ଏହି ଆପ୍ ବହୁତ ସ୍ଲୋ ଅଟେ",
+ "description": "ଆପ୍ କାର୍ଯ୍ୟକ୍ଷମତାକୁ ଗତିଶୀଳ କରିବା ପାଇଁ, ନିମ୍ନଲିଖିତ କାର୍ଯ୍ୟ କରନ୍ତୁ: \n ଆପଣଙ୍କ କମ୍ପ୍ୟୁଟରର ସିଷ୍ଟମ୍ କନଫିଗରେସନ୍ କୁ ଯାଆନ୍ତୁ । ସର୍ବନିମ୍ନ କନଫିଗରେସନ୍ ଏହା ହେବା ଉଚିତ୍:\n2 GB RAM \nଡୁଆଲ୍ କୋର୍ ପ୍ରୋସେସର \n ଯଦି ଆପଣଙ୍କ କମ୍ପ୍ୟୁଟରରେ ଏହି କନଫିଗରେସନ୍ ଅଛି କିମ୍ବା ଏହାଠାରୁ ଅଧିକ ଅଛି, ତେବେ ଆପ୍ ରିଷ୍ଟାର୍ଟ କରନ୍ତୁ ।\n ଏହା କରିବା ପରେ ମଧ୍ୟ ଯଦି ସ୍ଲୋ ହୁଏ, ତେବେ ଏଠାକୁ ଯାଆନ୍ତୁ: ଟାସ୍କ ମ୍ୟାନେଜର୍ , ସମସ୍ତ ଅବ୍ୟବହୃତ ବ୍ୟାକଗ୍ରାଉଣ୍ଡ ପ୍ରୋସେସ୍ କୁ ସିଲେକ୍ଟ କରନ୍ତୁ ଏବଂ ଏଣ୍ଡ୍ ଟାସ୍କ ରେ କ୍ଲିକ୍ କରନ୍ତୁ "
+ },
+ {
+ "topic": "ମୁଁ ପେନଡ୍ରାଇଭକୁ କଣ୍ଟେଣ୍ଟ୍ କପି କରିବାରେ ବିଫଳ",
+ "description": "କଣ୍ଟେଣ୍ଟକୁ ପେନଡ୍ରାଇଭକୁ କପି କରିବା ପାଇଁ, ନିମ୍ନଲିଖିତ ସୋପାନ ଅନୁସରଣ କରନ୍ତୁ: \nକମ୍ପ୍ୟୁଟର ସେଟିଂସ୍ କୁ ଯାଆନ୍ତୁ । USB ଡ୍ରାଇଭ୍ ରାଇଟ୍-ପ୍ରୋଟେକ୍ଟେଡ୍ କି ନାହିଁ ଯାଞ୍ଚକରନ୍ତୁ । ଯଦି ଏହା ସେପରି ହୋଇଥାଏ, ପ୍ରୋଟେକ୍ସନକୁ ଡିସେବଲ୍ କରନ୍ତୁ \nପେନଡ୍ରାଇଭରେ ଫ୍ରି ସ୍ପେସ୍ ଅଛି କି ନାହିଁ ଯାଞ୍ଚକରନ୍ତୁ । ପେନଡ୍ରାଇଭରୁ ଅଦରକାରୀ ଫାଇଲ୍ ଡିଲିଟ୍ କରନ୍ତୁ "
+ },
+ {
+ "topic": "ମୁଁ ପେନଡ୍ରାଇଭରେ କଣ୍ଟେଣ୍ଟ୍ ଲୋଡ୍ କରିଛି, କିନ୍ତୁ ଏବେ ଏହା ଖାଲି ଦେଖାଉଛି ",
+ "description": "ଆପଣଙ୍କ ପେନଡ୍ରାଇଭ୍ କିମ୍ବା କମ୍ପ୍ୟୁଟର ଭାଇରସ୍ ଦ୍ୱାରା ପ୍ରଭାବିତ ହୋଇଥାଇପାରେ । ଯାଞ୍ଚକରନ୍ତୁ କି:\n* ଆପଣଙ୍କ ମେସିନ୍ ରେ ଆଣ୍ଟି ଭାଇରସ୍ ସଫ୍ଟୱେର୍ ଇନଷ୍ଟଲ୍ ହୋଇଛି \n* ଅଜଣା ମେସିନ୍ ସହ ପ୍ଲଗ୍ ଇନ୍ କରିବା ପୂର୍ବରୁ ଯାଞ୍ଚକରନ୍ତୁ କି ଆପଣଙ୍କ ପେନଡ୍ରାଇଭ୍ ରାଇଟ୍-ପ୍ରୋଟେକ୍ଟେଡ୍ ଅଛି "
+ },
+ {
+ "topic": "ମୋ ପେନଡ୍ରାଇଭକୁ ଏବଂ ପେନଡ୍ରାଇଭରୁ କଣ୍ଟେଣ୍ଟ୍ କପି କରିବା ପାଇଁ ଅଧିକ ସମୟ ଲାଗୁଛି ",
+ "description": "କପି କରିବାକୁ ଲାଗୁଥିବା ସମୟ କଣ୍ଟେଣ୍ଟ୍ ଫାଇଲର ଆକାର ଉପରେ ନିର୍ଭର କରେ । କିଛି ବୃହତ୍ ପାଠ୍ୟପୁସ୍ତକ କପି ହେବାକୁ ଅଧିକ ସମୟ ଲାଗେ । ଆମେ ସୁପାରିଶ କରୁଛୁ କି ଏହି ପ୍ରକ୍ରିୟା ଚାଲିବା ସମୟରେ ଆପଣ ବନ୍ଦ କରନ୍ତୁ ନାହିଁ । ଏପରି କରିବା ଦ୍ୱାରା ଫାଇଲ୍ ଠିକ୍ ରହିବ ନାହିଁ । "
+ },
+ {
+ "topic": "DIKSHA କଣ୍ଟେଣ୍ଟ୍ ହେତୁ ମୋ କମ୍ପ୍ୟୁଟରରେ କିଛି ଫ୍ରି ସ୍ପେସ୍ ନାହିଁ ",
+ "description": "ଆପଣଙ୍କ କମ୍ପ୍ୟୁଟରରେ ସ୍ପେସ୍ ଫ୍ରି କରିବା ପାଇଁ, ଆପ୍ ର ମାଇଁ ଡାଉନଲୋଡସ୍ ଟ୍ୟାବ୍ ରୁ ଡାଉନଲୋଡ୍ ହୋଇଥିବା କଣ୍ଟେଣ୍ଟ୍ ଡିଲିଟ୍ କରନ୍ତୁ "
+ },
+ {
+ "topic": "ମୋ Ubuntu ସିଷ୍ଟମରେ DIKSHA Desktop ଆପ୍ଲିକେସନ୍ ଇନଷ୍ଟଲ୍ କରିବାରେ ବିଫଳ",
+ "description": "ଆପଣଙ୍କ ubuntu ସିଷ୍ଟମରେ DIKSHA ଡେସ୍କଟପ ଆପ୍ଲିକେସନ୍ ଇନଷ୍ଟଲ୍ କରିବା ପାଇଁ:
\n1) ଆପଣଙ୍କ ଟର୍ମିନାଲ୍ ଓପନ୍ କରନ୍ତୁ
\n2) ଯେଉଁଠାରେ exe ଫାଇଲ୍ ଡାଉନଲୋଡ୍ ହୋଇଛି, ସେହି ଡିରେକ୍ଟୋରି ବଦଳାଇବା ପାଇଁ, command cd ରନ୍ କରନ୍ତୁ । ଉଦାହରଣ ସ୍ୱରୂପ, ଯଦି exe ଫାଇଲ୍ ଡାଉନଲୋଡସ୍ ଫୋଲଡରରେ ସେଭ୍ ହୋଇଛି, ତେବେ command cd Downloads ରନ୍ କରନ୍ତୁ
\n3) sudo dpkg -i ରନ୍ କରନ୍ତୁ
\nଏହି command ସଫଳତାର ସହ ରନ୍ କରିବା ପରେ, ଆପ୍ଲିକେସନ୍ ଲଞ୍ଚ୍ ହେବ
"
+ }
+ ],
+ "constants": {
+ "charactersLeft": "ଏତିକି ଅକ୍ଷର ବାକି ",
+ "explainMsg": "ଆପଣ ସମସ୍ୟାଟିର ବ୍ୟାଖ୍ୟା କରିପାରିବେ କି ?",
+ "faqMsg": "ବାରମ୍ବାର ପଚରା ଯାଉଥିବା ପ୍ରଶ୍ନ ",
+ "help": " ସାହାଯ୍ୟ",
+ "helpMsg": "ଏହି ଉତ୍ତର ଆପଣଙ୍କ କାମରେ ଆସିଲା କି ?",
+ "initiateEmailButton": "ଇମେଲ ଆରମ୍ଭ କରନ୍ତୁ ",
+ "knowMoreMsg": "ଆପଣ ଆଉ କଣ ଜାଣିବାକୁ ଚାହୁଁଛନ୍ତି ?",
+ "noMsg": "ନାହିଁ ",
+ "reportIssue": "ଅସୁବିଧା ଜଣାନ୍ତୁ",
+ "reportIssueMsg": "ଅନ୍ୟ ସମସ୍ୟା ଜଣାନ୍ତୁ",
+ "resolveMsg": "ଆପଣଙ୍କ ସମସ୍ୟାର ସମାଧାନ କରିବା ନିମନ୍ତେ ପୂରା ସୂଚୀ ଦେଖନ୍ତୁ ",
+ "sorryMsg": "ସେଥିପାଇଁ ଦୁଃଖିତ",
+ "submitButton": "ସବମିଟ୍ କରନ୍ତୁ",
+ "tellMoreMsg": "ଆପଣ ସମ୍ମୁଖୀନ ହେଉଥିବା ସମସ୍ୟା ସମ୍ପର୍କରେ ଆମକୁ ଅଧିକ ବିବରଣୀ ଦିଅନ୍ତୁ",
+ "thanksMsg": "ଆପଣଙ୍କ ପ୍ରତିକ୍ରିୟା ପାଇଁ ଧନ୍ୟବାଦ ",
+ "triggerEmailMsg": "ଟେକ୍ସଟ୍ ବକ୍ସରେ ଆପଣ ବିସ୍ତୃତ ବିବରଣୀ ଯୋଗ କରି ଇନିସିଏଟ୍ ଇମେଲ୍ ବଟମ୍ ଟ୍ୟାପ୍ କଲେ, ଆମେ ଆପଣଙ୍କ ତରଫରୁ ଏକ ଇମେଲ୍ ଟ୍ରିଗର କରିବୁ | ଆପଣ ସେଠାରେ ଅଧିକ ବିବରଣୀ ଓ /କିମ୍ବା ଫାଇଲ୍ ଆଟାଚ୍ କରିପାରିବେ",
+ "typeHere": "ଏଠାରେ ଲେଖନ୍ତୁ ",
+ "yesMsg": "ହଁ "
+ }
+}
\ No newline at end of file
diff --git a/utils/DesktopFAQ/faq-pa.json b/utils/DesktopFAQ/faq-pa.json
new file mode 100644
index 000000000..23b6a878f
--- /dev/null
+++ b/utils/DesktopFAQ/faq-pa.json
@@ -0,0 +1,68 @@
+{
+ "faqs": [
+ {
+ "topic": "ਮੈਂ ਆਪਣਾ ਬੋਰਡ, ਮਾਧਿਅਮ, ਕਲਾਸ ਅਤੇ ਵਿਸ਼ਾ ਨਹੀਂ ਦੇਖ ਸਕਦਾ",
+ "description": "ਤੁਹਾਡਾ ਰਾਜ ਇਸ ਸਮੇਂ ਸਾਰੇ ਬੋਰਡਾਂ, ਮਾਧਿਅਮ, ਕਲਾਸਾਂ ਅਤੇ ਵਿਸ਼ਿਆਂ ਦਾ ਸਮਰਥਨ ਨਹੀਂ ਕਰਦਾ। ਜਿਉਂ ਹੀ ਤੁਹਾਡਾ ਰਾਜ ਉਹਨਾਂ ਨੂੰ ਸ਼ਾਮਲ ਕਰੇਗਾ, ਤੁਸੀਂ ਇਸਨੂੰ ਸੂਚੀ ਵਿੱਚ ਵੇਖੋਗੇ"
+ },
+ {
+ "topic": "ਮੈਂ ਕੰਟੇਂਟ ਡਾਊਨਲੋਡ ਕੀਤੇ ਹਨ, ਪਰ ਮੈਂ ਇਸਨੂੰ ਚਲਾਉਣ ਵਿੱਚ ਅਸਮਰੱਥ ਹਾਂ ਕਿਉਂਕਿ ਇਹ ਕਹਿੰਦਾ ਹੈ ਕਿ ਮੈਨੂੰ ਇੰਟਰਨੈਟ ਦੀ ਜ਼ਰੂਰਤ ਹੈ",
+ "description": "ਤੁਸੀਂ ਯੂਟਿਊਬ ਕੰਟੇਂਟ ਨੂੰ ਡਾਊਨਲੋਡ ਕੀਤਾ ਹੋ ਸਕਦਾ ਹੈ। ਤੁਸੀਂ ਉਦੋਂ ਹੀ ਯੂਟਿਊਬ ਕੰਟੇਂਟ ਨੂੰ ਚਲਾ ਸਕਦੇ ਹੋ ਜਦੋਂ ਤੁਸੀਂ ਆਨਲਾਈਨ ਹੋ। ਕੰਪਿਊਟਰ ਨੂੰ ਇੰਟਰਨੈਟ ਨਾਲ ਕਨੈਕਟ ਕਰੋ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।"
+ },
+ {
+ "topic": "ਮੈਨੂੰ ਆਪਣੀ DIKSHA ਡੈਸਕਟਾਪ ਐਪ ਨੂੰ ਅਪਡੇਟ ਕਰਨ ਦੀ ਜ਼ਰੂਰਤ ਹੈ",
+ "description": "ਆਪਣੇ ਕੰਪਿਊਟਰ ਨੂੰ ਇੰਟਰਨੈਟ ਨਾਲ ਕਨੈਕਟ ਕਰੋ ਅਤੇ ਨਵੀਨਤਮ ਐਪ ਸੰਸਕਰਣ ਲਈ https://staging.sunbirded.org/desktop/latest ਚੈੱਕ ਕਰੋ"
+ },
+ {
+ "topic": "ਮੇਰੇ ਕੋਲ ਇੰਟਰਨੈਟ ਕਨੈਕਸ਼ਨ ਵਾਲੇ ਲੈਪਟਾਪ ਤੱਕ ਐਕਸੈਸ ਨਹੀਂ ਹੈ, ਪਰ ਮੈਂ ਡੈਸਕਟੌਪ ਐਪ 'ਤੇ ਕੰਟੇਂਟ ਨੂੰ ਸ਼ਾਮਲ ਕਰਨਾ ਜਾਂ ਅਪਡੇਟ ਕਰਨਾ ਚਾਹੁੰਦਾ ਹਾਂ",
+ "description": "ਜੇ ਤੁਹਾਡੇ ਕੋਲ ਮੋਬਾਈਲ ਫ਼ੋਨ ਹੈ, DIKSHA ਮੋਬਾਈਲ ਐਪ ਨੂੰ ਗੂਗਲ ਪਲੇਸਟੋਰ ਤੋਂ ਡਾਊਨਲੋਡ ਕਰੋ।\nਐਪ ਵਿਚਲੇ ਕੰਟੇਂਟ ਲਈ ਬਰਾਊਜ਼ ਕਰੋ।\nDIKSHA ਲਾਇਬ੍ਰੇਰੀ ਤੋਂ ਕੰਟੇਂਟ ਡਾਊਨਲੋਡ ਕਰੋ।\nਇਸਨੂੰ ਪੈੱਨਡਰਾਈਵ ਜਾਂ SD ਕਾਰਡ 'ਤੇ ਕਾਪੀ ਕਰੋ ਅਤੇ ਇਸਨੂੰ DIKSHA ਐਪ 'ਤੇ ਅਪਲੋਡ ਕਰੋ।"
+ },
+ {
+ "topic": "ਮੈਨੂੰ ਕਿਸੇ ਖ਼ਾਸ ਵਿਸ਼ੇ ਲਈ ਕੰਟੇਂਟ ਨਹੀਂ ਮਿਲਦੇ, ਜਾਂ ਅਢੁੱਕਵੇਂ ਕੰਟੇਂਟ ਮਿਲਦੇ ਹਨ",
+ "description": "ਕੰਟੇਂਟ ਦੀ ਭਾਲ ਕਰਨ ਲਈ DIKSHA ਦੀ ਆਨਲਾਈਨ ਲਾਇਬ੍ਰੇਰੀ ਨੂੰ ਬਰਾਊਜ਼ ਕਰੋ। ਜੇ ਇਹ ਅਜੇ ਵੀ ਉਪਲੱਬਧ ਨਹੀਂ ਹੈ, ਤਾਂ ਕੰਟੇਂਟ ਬਾਰੇ ਆਪਣੀ ਫੀਡਬੈਕ ਸਟੇਟ SCERT ਨੂੰ ਭੇਜੋ"
+ },
+ {
+ "topic": "ਐਪ ਬਹੁਤ ਹੌਲੀ ਹੈ",
+ "description": "ਐਪ ਦੀ ਕਾਰਗੁਜ਼ਾਰੀ ਨੂੰ ਤੇਜ਼ ਕਰਨ ਲਈ, ਇਹ ਕਰੋ:\n ਆਪਣੇ ਕੰਪਿਊਟਰ ਦੀ ਸਿਸਟਮ ਕੌਨਫਿਗਰੇਸ਼ਨ 'ਤੇ ਜਾਓ। ਘੱਟੋ ਘੱਟ ਕੌਂਫਿਗਰੇਸ਼ਨ ਹੋਣੀ ਚਾਹੀਦੀ ਹੈ:\n2 GB RAM \nDual Core Processor \n ਜੇ ਤੁਹਾਡਾ ਕੰਪਿਊਟਰ ਇਸ ਕੌਂਫਿਗਰੇਸ਼ਨ ਨਾਲ ਮੇਲ ਖਾਂਦਾ ਜਾਂ ਵੱਧ ਹੈ, ਤਾਂ ਐਪ ਨੂੰ ਮੁੜ ਚਾਲੂ ਕਰੋ।\n ਅਜਿਹਾ ਕਰਨ ਤੋਂ ਬਾਅਦ, ਜੇ ਇਹ ਅਜੇ ਵੀ ਹੌਲੀ ਹੈ, ਟਾਸਕ ਮੈਨੇਜਰ 'ਤੇ ਜਾਓ,\nਸਾਰੀਆਂ ਨਾ ਵਰਤੀਆਂ ਬੈਕਗਰਾਂਊਡ ਪ੍ਰਕਿਰਿਆਵਾਂ ਨੂੰ ਚੁਣੋ ਅਤੇ ਕਲਿੱਕ ਕਰੋEnd Task "
+ },
+ {
+ "topic": "ਮੈਂ ਪੈੱਨਡਰਾਈਵ ਵਿੱਚ ਕੰਟੇਂਟ ਦੀ ਨਕਲ ਕਰਨ ਵਿੱਚ ਅਸਮਰੱਥ ਹਾਂ",
+ "description": "ਪੈੱਨਡਰਾਈਵ 'ਤੇ ਕੰਟੇਂਟ ਦੀ ਨਕਲ ਕਰਨ ਲਈ, ਇਹ ਕਰੋ:\nਆਪਣੀ ਕੰਪਿਊਟਰ ਸੈਟਿੰਗਸ 'ਤੇ ਜਾਓ। ਜਾਂਚ ਕਰੋ ਕਿ ਕੀ USB ਡਰਾਈਵ ਲਿਖਣ ਤੋਂ ਸੁਰੱਖਿਅਤ ਹੈ। ਜੇ ਇਹ ਹੈ, ਤਾਂ ਸੁਰੱਖਿਆ ਨੂੰ ਅਯੋਗ ਕਰੋ \nਜਾਂਚ ਕਰੋ ਕਿ ਕੀ ਪੈੱਨਡਰਾਈਵ ਵਿੱਚ ਖ਼ਾਲੀ ਥਾਂ ਹੈ। ਆਪਣੀ ਪੈੱਨਡਰਾਈਵ ਤੋਂ ਅਣਚਾਹੀਆਂ ਫਾਈਲਾਂ ਨੂੰ ਡੀਲੀਟ ਕਰੋ \n"
+ },
+ {
+ "topic": "ਮੈਂ ਆਪਣੀ ਪੇਨਡਰਾਈਵ 'ਤੇ ਕੰਟੇਂਟ ਲੋਡ ਕੀਤੇ ਸਨ, ਪਰ ਹੁਣ ਮੈਂ ਵੇਖਦਾ ਹਾਂ ਕਿ ਇਹ ਖ਼ਾਲੀ ਹੈ",
+ "description": "ਤੁਹਾਡੀ ਪੇਨਡਰਾਈਵ ਜਾਂ ਕੰਪਿਊਟਰ ਕਿਸੇ ਵਾਇਰਸ ਨਾਲ ਸੰਕਰਮਿਤ ਹੋ ਸਕਦਾ ਹੈ। ਇਹ ਵੇਖੋ ਕਿ:\n* ਤੁਹਾਡੀ ਮਸ਼ੀਨ 'ਤੇ ਇਕ ਐਂਟੀ ਵਾਇਰਸ ਸਾਫਟਵੇਅਰ ਸਥਾਪਤ ਹੈ\n* ਤੁਹਾਡੀ ਪੇਨਡਰਾਈਵ ਨੂੰ ਅਣਜਾਣ ਮਸ਼ੀਨਾਂ ਵਿਚ ਲਗਾਉਣ ਤੋਂ ਪਹਿਲਾਂ ਲਿਖਤ-ਸੁਰੱਖਿਅਤ ਕੀਤਾ ਗਿਆ ਹੈ"
+ },
+ {
+ "topic": "ਮੇਰੀ ਪੇਨਡਰਾਈਵ 'ਤੇ ਅਤੇ ਪੇਨਡਰਾਈਵ ਤੋਂ ਕੰਟੇਂਟ ਦੀ ਨਕਲ ਕਰਨ ਲਈ ਸਮਾਂ ਲਗਦਾ ਹੈ",
+ "description": "ਕਾਪੀ ਕਰਨ ਲਈ ਲਿਆ ਗਿਆ ਸਮਾਂ ਕੰਟੇਂਟ ਫਾਈਲ ਦੇ ਅਕਾਰ 'ਤੇ ਨਿਰਭਰ ਕਰਦਾ ਹੈ। ਕੁਝ ਵੱਡੀਆਂ ਪਾਠ-ਪੁਸਤਕਾਂ ਦੀ ਨਕਲ ਕਰਨ ਲਈ ਸਮਾਂ ਲੱਗਦਾ ਹੈ। ਅਸੀਂ ਤੁਹਾਨੂੰ ਸਿਫਾਰਸ਼ ਕਰਦੇ ਹਾਂ ਕਿ ਤੁਸੀਂ ਪ੍ਰਕਿਰਿਆ ਨੂੰ ਵਿਚਕਾਰ ਨਾ ਰੋਕੋ। ਅਜਿਹਾ ਕਰਨ ਨਾਲ ਅਸੰਗਤ ਫਾਈਲਾਂ ਲੱਗ ਸਕਦੀਆਂ ਹਨ।"
+ },
+ {
+ "topic": "ਮੇਰੇ ਕੰਪਿਊਟਰ ਵਿੱਚ DIKSHA ਕੰਟੇਂਟ ਕਾਰਨ ਕੋਈ ਖ਼ਾਲੀ ਥਾਂ ਨਹੀਂ ਹੈ",
+ "description": "ਆਪਣੇ ਕੰਪਿਊਟਰ 'ਤੇ ਜਗ੍ਹਾ ਖ਼ਾਲੀ ਕਰਨ ਲਈ ਐਪ ਦੀ ਮਾਈ ਡਾਊਨਲੋਡਸ ਟੈਬ ਤੋਂ ਡਾਊਨਲੋਡ ਕੀਤੇ ਕੰਟੇਂਟ ਨੂੰ ਡੀਲੀਟ ਕਰੋ"
+ },
+ {
+ "topic": "ਮੇਰੇ ਉਬੰਤੂ ਸਿਸਟਮ 'ਤੇ DIKSHA ਡੈਸਕਟਾਪ ਐਪਲੀਕੇਸ਼ਨ ਸਥਾਪਤ ਕਰਨ ਵਿੱਚ ਅਸਮਰੱਥ",
+ "description": "ਆਪਣੇ ਉਬੰਤੂ ਸਿਸਟਮ 'ਤੇ DIKSHA ਡੈਸਕਟਾਪ ਐਪਲੀਕੇਸ਼ਨ ਨੂੰ ਸਥਾਪਤ ਕਰਨ ਲਈ:
\n1) ਆਪਣਾ ਟਰਮੀਨਲ ਖੋਲ੍ਹੋ
\n2) ਡਾਇਰੈਕਟਰੀ ਨੂੰ ਤਬਦੀਲ ਕਰਨ ਲਈ ਸੀਡੀ <ਲੋਕੇਸ਼ਨ> ਕਮਾਂਡ ਚਲਾਓ, ਜਿੱਥੇ exe ਫਾਈਲ ਡਾਊਨਲੋਡ ਕੀਤੀ ਗਈ ਹੈ। ਉਦਾਹਰਣ ਲਈ, ਜੇ exe ਨੂੰ ਡਾਊਨਲੋਡਸ ਫੋਲਡਰ ਵਿੱਚ ਸੇਵ ਕੀਤਾ ਗਿਆ ਹੈ, ਤਾਂ ਸੀਡੀ ਡਾਊਨਲੋਡਸ ਕਮਾਂਡ ਚਲਾਓ
\n3) sudo dpkg -i <ਫਾਈਲ ਦਾ ਨਾਮ>ਕਮਾਂਡ ਚਲਾਓ
\nਇਸ ਕਮਾਂਡ ਨੂੰ ਸਫ਼ਲਤਾਪੂਰਵਕ ਚਲਾਉਣ 'ਤੇ ਐਪਲੀਕੇਸ਼ਨ ਲਾਂਚ ਹੋ ਜਾਂਦੀ ਹੈ
"
+ }
+ ],
+ "constants": {
+ "charactersLeft": "ਅੱਖਰ ਬਚੇ",
+ "explainMsg": "ਕੀ ਤੁਸੀਂ ਸਮੱਸਿਆ ਬਾਰੇ ਦੱਸ ਸਕਦੇ ਹੋ?",
+ "faqMsg": "ਅਕਸਰ ਪੁੱਛੇ ਜਾਣ ਵਾਲੇ ਸਵਾਲ",
+ "help": "ਮਦਦ ",
+ "helpMsg": "ਕੀ ਇਸ ਜਵਾਬ ਨੇ ਤੁਹਾਡੀ ਮਦਦ ਕੀਤੀ?",
+ "initiateEmailButton": "ਈਮੇਲ ਅਰੰਭ ਕਰੋ",
+ "knowMoreMsg": "ਤੁਸੀਂ ਹੋਰ ਕੀ ਜਾਣਨਾ ਚਾਹੋਗੇ?",
+ "noMsg": "ਨਹੀਂ",
+ "reportIssue": " ਮੁੱਦੇ ਦੀ ਰਿਪੋਰਟ ਕਰੋ",
+ "reportIssueMsg": "ਹੋਰ ਮੁੱਦੇ ਦੀ ਰਿਪੋਰਟ ਕਰੋ",
+ "resolveMsg": "ਆਪਣੇ ਮੁੱਦੇ ਨੂੰ ਸੁਲਝਾਉਣ ਲਈ ਸੂਚੀ ਨੂੰ ਵੇਖੋ",
+ "sorryMsg": "ਉਸ ਲਈ ਮੈ ਅਫ਼ਸੋਸ ਕਰਦਾਂ!",
+ "submitButton": "ਜਮ੍ਹਾ ਕਰੋ",
+ "tellMoreMsg": "ਆਪਣੀਆ ਸਮੱਸਿਆ ਦੇ ਬਾਰੇ ਸਾਨੂੰ ਹੋਰ ਦੱਸੋ",
+ "thanksMsg": "ਤੁਹਾਡੇ ਜਵਾਬ ਲਈ ਧੰਨਵਾਦ!",
+ "triggerEmailMsg": "ਟੈਕਸਟ ਬਾਕਸ ਵਿੱਚ ਵੇਰਵੇ ਸ਼ਾਮਲ ਕਰਨ ਅਤੇ ਈਮੇਲ ਅਰੰਭ ਬਟਨ ਨੂੰ ਟੈਪ ਕਰਨ ਤੋਂ ਬਾਅਦ, ਅਸੀਂ ਤੁਹਾਡੇ ਵੱਲੋਂ ਇਕ ਈਮੇਲ ਜਾਰੀ ਕਰਾਂਗੇ।ਤੁਸੀਂ ਇਸ ਈਮੇਲ ਵਿੱਚ ਹੋਰ ਵੇਰਵੇ ਅਤੇ /ਜਾਂ ਫਾਈਲਾਂ ਨੂੰ ਇੱਥੇ ਜੋੜ ਸਕਦੇ ਹੋ।",
+ "typeHere": "ਇੱਥੇ ਟਾਈਪ ਕਰੋ ...",
+ "yesMsg": "ਹਾਂ"
+ }
+}
\ No newline at end of file
diff --git a/utils/DesktopFAQ/faq-ta.json b/utils/DesktopFAQ/faq-ta.json
new file mode 100644
index 000000000..73ac9b753
--- /dev/null
+++ b/utils/DesktopFAQ/faq-ta.json
@@ -0,0 +1,68 @@
+{
+ "faqs": [
+ {
+ "topic": "எனது வாரியம், மொழி வழி கல்வி, வகுப்பு மற்றும் தலைப்பு ஆகியவற்றை என்னால் பார்க்க முடியவில்லை ",
+ "description": "உங்கள் மாநிலம் தற்போது அனைத்து வாரியங்கள், ஊடகங்கள், வகுப்புகள் மற்றும் பாடங்களை ஆதரிக்கவில்லை. உங்கள் மாநிலம் அவற்றைச் சேர்த்தவுடன், அதை நீங்கள் பட்டியலில் காண்பீர்கள்"
+ },
+ {
+ "topic": "நான் உள்ளடக்கத்தைப் பதிவிறக்கம் செய்தேன், ஆனால் எனக்கு இணையம் தேவை என்று கூறியதால் என்னால் அதை இயக்க முடியவில்லை",
+ "description": "நீங்கள் YouTube உள்ளடக்கத்தை பதிவிறக்கம் செய்திருக்கலாம். நீங்கள் ஆன்லைனில் இருக்கும்போது மட்டுமே YouTube உள்ளடக்கத்தை இயக்க முடியும். கணினியை இணையத்துடன் இணைக்க மீண்டும் முயற்சிக்கவும்."
+ },
+ {
+ "topic": "எனது DIKSHA டெஸ்க்டாப் செயலியை புதுப்பிக்க வேண்டும்",
+ "description": "உங்கள் கணினியை இணையத்துடன் இணைத்து, சமீபத்திய பயன்பாட்டு பதிப்பிற்காக https://staging.sunbirded.org/desktop/latest க்கு செல்லவும் "
+ },
+ {
+ "topic": "இணைய இணைப்புடன் மடிக்கணினிக்கு அணுகல் இல்லை, ஆனால் டெஸ்க்டாப் செயலியில் உள்ளடக்கத்தை சேர்க்க அல்லது புதுப்பிக்க விரும்புகிறேன்",
+ "description": "உங்களிடம் கைப்பேசி இருந்தால், கூகிள் பிளேஸ்டோரிலிருந்து DIKSHA மொபைல் செயலியை பதிவிறக்கவும். செயலியில் உள்ள உள்ளடக்கத்திற்காக உலாவுக. DIKSHA நூலகத்திலிருந்து உள்ளடக்கத்தைப் பதிவிறக்கவும். பென்ட்ரைவ் அல்லது எஸ்டி கார்டில் நகலெடுத்து அதை DIKSHA டெஸ்க்டாப் செயலியில் பதிவேற்றவும்."
+ },
+ {
+ "topic": "ஒரு குறிப்பிட்ட தலைப்புக்கான உள்ளடக்கம் கிடைக்கவில்லை, அல்லது பொருத்தமற்ற உள்ளடக்கத்தைக் காண்கிறேன்",
+ "description": "உள்ளடக்கத்தைத் தேட DIKSHA இன் ஆன்லைன் நூலகத்தை உலாவுக. இது இன்னும் கிடைக்கவில்லை என்றால், உள்ளடக்கத்தைப் பற்றிய உங்கள் கருத்தை மாநில SCERT க்கு அனுப்புங்கள்"
+ },
+ {
+ "topic": "பயன்பாடு மிகவும் மெதுவாக உள்ளது",
+ "description": "செயலியின் செயல்திறனை விரைவுபடுத்த, பின்வருவனவற்றைச் செய்யுங்கள்: உங்கள் கணினியின் கணினி உள்ளமைவுக்குச் செல்லவும். குறைந்தபட்ச உள்ளமைவு இருக்க வேண்டும்: 2 ஜிபி ரேம் இரட்டை கோர் செயலி உங்கள் கணினி இந்த உள்ளமைவுடன் பொருந்தினால் அல்லது மீறினால், பயன்பாட்டை மறுதொடக்கம் செய்யுங்கள். இதைச் செய்தபின், அது இன்னும் மெதுவாக இருந்தால், பணி நிர்வாகி க்குச் சென்று, பயன்படுத்தப்படாத அனைத்து பின்னணி செயல்முறைகளையும் தேர்ந்தெடுத்து பணியை முடிக்க என்பதைக் கிளிக் செய்க"
+ },
+ {
+ "topic": "பென்ட்ரைவிற்கு உள்ளடக்கத்தை நகலெடுக்க என்னால் முடியவில்லை",
+ "description": "உள்ளடக்கத்தை பென் டிரைவில் நகலெடுக்க, பின்வருவனவற்றைச் செய்யுங்கள்: உங்கள் கணினி அமைப்புகளுக்குச் செல்லவும். யூ.எஸ்.பி டிரைவ் எழுத-பாதுகாக்கப்பட்டதா என சரிபார்க்கவும். அது இருந்தால், பாதுகாப்பை முடக்கவும் பென் டிரைவிற்கு இலவச இடம் இருக்கிறதா என்று சோதிக்கவும். பென்ட்ரைவிலிருந்து தேவையற்ற கோப்புகளை நீக்கு "
+ },
+ {
+ "topic": "எனது பென்ட்ரைவில் உள்ளடக்கத்தை ஏற்றினேன், ஆனால் இப்போது அது காலியாக இருப்பதைக் காண்கிறேன்",
+ "description": "உங்கள் பென்ட்ரைவ் அல்லது கணினி வைரஸால் பாதிக்கப்படலாம். இதைச் சரிபார்க்கவும்: * உங்கள் கணினியில் ஒரு வைரஸ் எதிர்ப்பு மென்பொருள் நிறுவப்பட்டுள்ளது * நீங்கள் அறியப்படாத கணினிகளில் செருகுவதற்கு முன்பு உங்கள் பென்ட்ரைவ் எழுத-பாதுகாக்கப்படுகிறது"
+ },
+ {
+ "topic": "எனது பென்ட்ரைவிலிருந்து உள்ளடக்கத்தை நகலெடுக்க நேரம் எடுக்கும்",
+ "description": "நகலெடுக்க எடுக்கப்பட்ட நேரம் உள்ளடக்கக் கோப்பின் அளவைப் பொறுத்தது. சில பெரிய பாடப்புத்தகங்கள் நகலெடுக்க நேரம் எடுக்கும். இடையில் செயல்பாட்டை நிறுத்த வேண்டாம் என்று நாங்கள் பரிந்துரைக்கிறோம். அவ்வாறு செய்வது சீரற்ற கோப்புகளுக்கு வழிவகுக்கும்."
+ },
+ {
+ "topic": "DIKSHA உள்ளடக்கம் காரணமாக எனது கணினியில் இடம் இல்லை",
+ "description": "உங்கள் கணினியில் இடத்தை விடுவிக்க பயன்பாட்டின் எனது பதிவிறக்கங்கள் தாவலில் இருந்து பதிவிறக்கம் செய்யப்பட்ட உள்ளடக்கத்தை நீக்கு"
+ },
+ {
+ "topic": "எனது உபுண்டு கணினியில் DIKSHA டெஸ்க்டாப் செயலியை நிறுவ முடியவில்லை",
+ "description": " உங்கள் உபுண்டு கணினியில் DIKSHA டெஸ்க்டாப் செயலியை நிறுவ: p>
1) உங்கள் டெர்மினல் திறக்கவும்
2) கோப்பகத்தை exe கோப்பு இருக்கும் இடத்திற்கு மாற்ற cd கட்டளையை இயக்கவும் பதிவிறக்கம் செய்யப்பட்டது. எடுத்துக்காட்டாக, பதிவிறக்க கோப்புறையில் exe சேமிக்கப்பட்டால், cd பதிவிறக்கங்கள்
3) கட்டளையை இயக்கவும் sudo dpkg -i
இந்த கட்டளையை வெற்றிகரமாக இயக்கும் போது பயன்பாடு தொடங்கப்பட்டது
"
+ }
+ ],
+ "constants": {
+ "charactersLeft": "விடுபட்ட எழுத்துக்கள்",
+ "explainMsg": "பிரச்சனையை நீங்கள் விளக்க முடியுமா?",
+ "faqMsg": "அடிக்கடி கேட்கப்படும் கேள்விகள்",
+ "help": "உதவி",
+ "helpMsg": "இந்த பதில் உங்களுக்கு உதவியதா?",
+ "initiateEmailButton": "மின்னஞ்சல் தொடங்குக",
+ "knowMoreMsg": "நீங்கள் இன்னும் தெரிந்து கொள்ள விரும்புகிறீர்களா?",
+ "noMsg": "இல்லை",
+ "reportIssue": "சிக்கலைப் புகாரளி",
+ "reportIssueMsg": "பிற சிக்கலைப் புகாரளி",
+ "resolveMsg": "உங்கள் சிக்கலை தீர்க்க பட்டியலை பாருங்கள்",
+ "sorryMsg": "மன்னிக்கவும்!",
+ "submitButton": "சமர்ப்பி",
+ "tellMoreMsg": "நீங்கள் சந்தித்த பிரச்சனை பற்றி மேலும் சொல்லுங்கள்",
+ "thanksMsg": "உங்கள் பதிலுக்கு நன்றி!",
+ "triggerEmailMsg": "நீங்கள் உரை பெட்டியில் விவரங்களைச் சேர்த்து, மின்னஞ்சல் தொடங்குக பொத்தானைத் தட்டவும், உங்கள் சார்பாக ஒரு மின்னஞ்சலை தூண்டுகிறோம். நீங்கள் மேலும் விவரங்களைச் சேர்க்க மற்றும் / அல்லது அங்கு கோப்புகளை இணைக்க முடியும்.",
+ "typeHere": "இங்கே உள்ளிடவும் ...",
+ "yesMsg": "ஆம்"
+ }
+}
\ No newline at end of file
diff --git a/utils/DesktopFAQ/faq-te.json b/utils/DesktopFAQ/faq-te.json
new file mode 100644
index 000000000..dc7b45332
--- /dev/null
+++ b/utils/DesktopFAQ/faq-te.json
@@ -0,0 +1,68 @@
+{
+ "faqs": [
+ {
+ "topic": "నా బోర్డు, మీడియం, క్లాస్ మరియు సబ్జెక్టును నేను చూడలేను",
+ "description": "మీ రాష్ట్రం ప్రస్తుతం అన్ని బోర్డులు, మాధ్యమాలు, తరగతులు మరియు విషయాలకు మద్దతు ఇవ్వదు. మీ రాష్ట్రం వాటిని జోడించిన వెంటనే, మీరు దానిని జాబితాలో చూస్తారు"
+ },
+ {
+ "topic": "నేను కంటెంట్ను డౌన్లోడ్ చేసాను, కాని నేను దీన్ని ప్లే చేయలేకపోతున్నాను ఎందుకంటే నాకు ఇంటర్నెట్ అవసరం అని చెప్పింది",
+ "description": "మీరు యూట్యూబ్ కంటెంట్ను డౌన్లోడ్ చేసి ఉండవచ్చు. మీరు ఆన్లైన్లో ఉన్నప్పుడు మాత్రమే మీరు యూట్యూబ్ కంటెంట్ను ప్లే చేయవచ్చు. కంప్యూటర్ను ఇంటర్నెట్కు కనెక్ట్ చేయండి మళ్లీ ప్రయత్నించండి."
+ },
+ {
+ "topic": "నేను నా DIKSHA డెస్క్టాప్ అనువర్తనాన్ని నవీకరించాలి",
+ "description": "మీ కంప్యూటర్ను ఇంటర్నెట్కు కనెక్ట్ చేయండి మరియు తాజా అనువర్తన సంస్కరణ కోసం https://staging.sunbirded.org/desktop/latest ని తనిఖీ చేయండి"
+ },
+ {
+ "topic": "నాకు ఇంటర్నెట్ కనెక్షన్ ఉన్న ల్యాప్టాప్కు ప్రాప్యత లేదు, కానీ నేను డెస్క్టాప్ అనువర్తనంలో కంటెంట్ను జోడించాలనుకుంటున్నాను లేదా నవీకరించాలనుకుంటున్నాను",
+ "description": "మీకు మొబైల్ ఫోన్ ఉంటే, గూగుల్ ప్లేస్టోర్ నుండి DIKSHA మొబైల్ అనువర్తనాన్ని డౌన్లోడ్ చేయండి.\n అనువర్తనంలోని కంటెంట్ కోసం బ్రౌజ్ చేయండి.\n DIKSHA లైబ్రరీ నుండి కంటెంట్ను డౌన్లోడ్ చేయండి.\n దీన్ని పెన్డ్రైవ్ లేదా SD కార్డ్లో కాపీ చేసి, DIKSHA డెస్క్టాప్ అనువర్తనానికి అప్లోడ్ చేయండి."
+ },
+ {
+ "topic": "నేను ఒక నిర్దిష్ట అంశం కోసం కంటెంట్ను కనుగొనలేదు, లేదా కంటెంట్ అసంబద్ధం అని నేను భావిస్తున్నాను",
+ "description": "కంటెంట్ కోసం శోధించడానికి DIKSHA యొక్క ఆన్లైన్ లైబ్రరీని బ్రౌజ్ చేయండి. ఇది ఇప్పటికీ అందుబాటులో లేకపోతే, కంటెంట్ గురించి మీ అభిప్రాయాన్ని స్టేట్ SCERT కి పంపండి"
+ },
+ {
+ "topic": "అనువర్తనం చాలా నెమ్మదిగా ఉంది",
+ "description": "అనువర్తన పనితీరును వేగవంతం చేయడానికి, కింది వాటిని చేయండి:\n మీ కంప్యూటర్ సిస్టమ్ కాన్ఫిగరేషన్కు వెళ్లండి. కనీస కాన్ఫిగరేషన్ ఉండాలి:\n 2 GB RAM \n ద్వంద్వ కోర్ ప్రాసెసర్ li> \n మీ కంప్యూటర్ ఈ కాన్ఫిగరేషన్తో సరిపోలితే లేదా మించి ఉంటే, అనువర్తనాన్ని మళ్ళీ ప్రారంభించండి.\n దీన్ని చేసిన తర్వాత, అది ఇంకా నెమ్మదిగా ఉంటే, టాస్క్ మేనేజర్ కు వెళ్లండి,\n ఉపయోగించని అన్ని నేపథ్య ప్రక్రియలను ఎంచుకోండి మరియు ఎండ్ టాస్క్ క్లిక్ చేయండి"
+ },
+ {
+ "topic": "నేను పెన్డ్రైవ్కు కంటెంట్ను కాపీ చేయలేకపోతున్నాను",
+ "description": "పెన్ డ్రైవ్కు కంటెంట్ను కాపీ చేయడానికి, కింది వాటిని చేయండి:\n మీ కంప్యూటర్ సెట్టింగ్లకు వెళ్లండి. USB డ్రైవ్ వ్రాసే-రక్షించబడిందో లేదో తనిఖీ చేయండి. అది ఉంటే, రక్షణను నిలిపివేయండి
\n పెన్ డ్రైవ్లో ఖాళీ స్థలం ఉందో లేదో తనిఖీ చేయండి. పెన్డ్రైవ్ నుండి అవాంఛిత ఫైల్లను తొలగించండి "
+ },
+ {
+ "topic": "నేను నా పెన్డ్రైవ్లో కంటెంట్ను లోడ్ చేసాను, కాని ఇప్పుడు అది ఖాళీగా ఉందని నేను చూశాను",
+ "description": "మీ పెన్డ్రైవ్ లేదా కంప్యూటర్ వైరస్ బారిన పడవచ్చు. దాన్ని తనిఖీ చేయండి:\n * మీ మెషీన్లో యాంటీ వైరస్ సాఫ్ట్వేర్ ఇన్స్టాల్ చేయబడింది\n * మీరు తెలియని యంత్రాలలో ప్లగ్ చేయడానికి ముందు మీ పెన్డ్రైవ్ వ్రాతపూర్వకంగా రక్షించబడుతుంది"
+ },
+ {
+ "topic": "నా పెన్డ్రైవ్కు మరియు నుండి కంటెంట్ను కాపీ చేయడానికి సమయం పడుతుంది",
+ "description": "కాపీ చేయడానికి తీసుకున్న సమయం కంటెంట్ ఫైల్ పరిమాణంపై ఆధారపడి ఉంటుంది. కొన్ని పెద్ద పాఠ్యపుస్తకాలు కాపీ చేయడానికి సమయం పడుతుంది. ఈ ప్రక్రియను మీరు మధ్యలో ఆపవద్దని మేము సిఫార్సు చేస్తున్నాము. అలా చేయడం వలన అస్థిరమైన ఫైళ్లు ఏర్పడవచ్చు."
+ },
+ {
+ "topic": "DIKSHA కంటెంట్ కారణంగా నా కంప్యూటర్కు ఖాళీ స్థలం లేదు",
+ "description": "మీ కంప్యూటర్లో ఖాళీ స్థలం కోసం ఖాళీ చేయడానికి అనువర్తనం యొక్క నా డౌన్లోడ్ ట్యాబ్ నుండి డౌన్లోడ్ చేసిన కంటెంట్ను తొలగించండి"
+ },
+ {
+ "topic": "నా ఉబుంటు సిస్టమ్లో DIKSHA డెస్క్టాప్ అప్లికేషన్ను ఇన్స్టాల్ చేయడం సాధ్యం కాలేదు",
+ "description": "> మీ ఉబుంటు సిస్టమ్లో DIKSHA డెస్క్టాప్ అప్లికేషన్ను ఇన్స్టాల్ చేయడానికి: \n 1) మీ టెర్మినల్ తెరవండి
\n 2)cd ఆదేశాన్ని అమలు చేయండి డైరెక్టరీని exe ఫైల్ డౌన్లోడ్ చేయబడిన చోటికి మార్చడానికి. ఉదాహరణకు, డౌన్లోడ్ ఫోల్డర్లో exe సేవ్ చేయబడితే, cd డౌన్లోడ్లు ఆదేశాన్ని అమలు చేయండి
\n 3) sudo dpkg -i ఆదేశాన్ని అమలు చేయండి
\n ఈ ఆదేశాన్ని విజయవంతంగా అమలు చేస్తున్నప్పుడు అప్లికేషన్ ప్రారంభించబడింది
"
+ }
+ ],
+ "constants": {
+ "charactersLeft": "అక్షరాలు మిగిలి ఉన్నాయి",
+ "explainMsg": "మీరు సమస్యను వివరించగలరా?",
+ "faqMsg": "తరచుగా అడిగే ప్రశ్నలు",
+ "help": "సహాయం కావాలి",
+ "helpMsg": "ఈ సమాధానం మీకు సహాయపడిందా?",
+ "initiateEmailButton": "ఇమెయిల్ను ప్రారంభించండి",
+ "knowMoreMsg": "మీరు మరింత తెలుసుకోవాలనుకుంటున్న విషయం ఏంటి?",
+ "noMsg": "కాదు",
+ "reportIssue": "సమస్యను నివేదించండి",
+ "reportIssueMsg": "ఇతర సమస్యను నివేదించండి",
+ "resolveMsg": "మీ సమస్యను పరిష్కరించడానికి జాబితాను చూడండి",
+ "sorryMsg": "అలా జరిగినందుకు క్షమించండి!",
+ "submitButton": "సమర్పించండి",
+ "tellMoreMsg": "మీరు ఎదుర్కొన్న సమస్య గురించి మాకు మరింత తెలియజేయండి",
+ "thanksMsg": "మీ ప్రతిస్పందన కోసం ధన్యవాదాలు!",
+ "triggerEmailMsg": "మీరు టెక్స్ట్ బాక్స్లో వివరాలను జోడించి, ఇమెయిల్(Initiate) బటన్ను నొక్కితే, మీ తరపున మేము ఒక ఇమెయిల్ను ప్రేరేపిస్తాము. మీరు మరింత వివరాలను జోడించవచ్చు మరియు / లేదా అక్కడ ఫైల్లను అటాచ్ చేయవచ్చు.",
+ "typeHere": "ఇక్కడ టైపు చేయండి..",
+ "yesMsg": "అవును"
+ }
+}
\ No newline at end of file
diff --git a/utils/DesktopFAQ/faq-ur.json b/utils/DesktopFAQ/faq-ur.json
new file mode 100644
index 000000000..71445fd94
--- /dev/null
+++ b/utils/DesktopFAQ/faq-ur.json
@@ -0,0 +1,68 @@
+{
+ "faqs": [
+ {
+ "topic": "میں اپنا بورڈ ، میڈیم ، کلاس اور سبجیکٹ نہیں دیکھ سکتا ہوں",
+ "description": "آپ کی ریاست فی الحال تمام بورڈ ، میڈیم ، کلاس اور مضامین کی حمایت نہیں کرتی ہے۔ جیسے ہی آپ کی ریاست نے ان کو شامل کیا ، آپ اسے فہرست میں دیکھیں گے"
+ },
+ {
+ "topic": "میں نے یہ مواد ڈاؤن لوڈ کیا ہے ، لیکن میں اسے کھولنے سے قاصر ہوں کیونکہ اس کے مطابق مجھے انٹرنیٹ کی ضرورت ہے",
+ "description": "ہوسکتا ہے کہ آپ نے YouTube کا مواد ڈاؤن لوڈ کیا ہو۔ جب آپ آن لائن ہوں تو آپ YouTube کا مواد کھول سکتے ہیں۔ کمپیوٹر کو دوبارہ انٹرنیٹ سے جوڑنے کی کوشش کریں۔"
+ },
+ {
+ "topic": "مجھے اپنی DIKSHA ڈیسک ٹاپ ایپ کو اپ ڈیٹ کرنے کی ضرورت ہے",
+ "description": "اپنے کمپیوٹر کو انٹرنیٹ سے جڑیں اورhttps://staging.sunbirded.org/desktop/latest پر جدید ایپ ورژن کے لئے چیک کریں"
+ },
+ {
+ "topic": "مجھے انٹرنیٹ کنیکشن والے لیپ ٹاپ تک رسائی حاصل نہیں ہے ، لیکن میں ڈیسک ٹاپ ایپ پر مواد شامل یا اپ ڈیٹ کرنا چاہتا ہوں",
+ "description": "اگر آپ کے پاس موبائل فون ہے تو ، گوگل پلے اسٹور سے DIKSHA موبائل اپلی کیشن ڈاؤن لوڈ کریں۔\nایپ میں موجود مواد کے لئے براؤز کریں۔\nDIKSHA لائبریری سے مواد ڈاؤن لوڈ کریں۔\nاسے PenDrive یا SD کارڈ میں کاپی کریں اور DIKSHA ڈیسک ٹاپ ایپ پر اپ لوڈ کریں۔"
+ },
+ {
+ "topic": "مجھے کسی خاص عنوان کے لئے مواد نہیں ملتا ہے ، یا مجھے یہ مواد غیر متعلق معلوم ہوتا ہے",
+ "description": "مواد کی تلاش کے لئے DIKSHA کی آن لائن لائبریری کو براؤز کریں۔ اگر یہ ابھی بھی دستیاب نہیں ہے تو، مواد کے بارے میں اپنی رائے اسٹیٹ SCERT کو بھیجیں"
+ },
+ {
+ "topic": "ایپ بہت آہستہ ہے",
+ "description": "ایپ کی کارکردگی کو تیز کرنے کے لئے ، درج ذیل کام کریں:\n اپنے کمپیوٹر سسٹم کی تشکیل پر جائیں.کم از کم ترتیب یہ ہونی چاہئے:\n 2 GB RAM\n اگر آپ کا کمپیوٹر اس ترتیب سے میچ کرتا ہے یا اس سے زیادہ ہے تو ، ایپ کو دوبارہ شروع کریں۔\n ایسا کرنے کے بعد ، اگر یہ اب بھی آہستہ ہے ، توٹاسک مینیجر کے پاس جاؤ\nغیر استعمال شدہ پس منظر کے تمام عمل منتخب کریں اوراینڈ ٹاسک پر کلک کریں"
+ },
+ {
+ "topic": "میں پین ڈرائیو میں مواد کو کاپی کرنے سے قاصر ہوں",
+ "description": "پین ڈرائیو میں مواد کی کاپی کرنے کے لئے ، درج ذیل کریں:\n\nاپنے کمپیوٹر کی ترتیبات پر جائیں۔ چیک کریں کہ USB ڈرائیو کو تحریری شکل سے محفوظ ہے یا نہیں۔ اگر ایسا ہے تو ، تحفظ کو غیر فعال کریں li>\n چیک کریں کہ پین ڈرائیو میں خالی جگہ ہے یا نہیں ۔ پین ڈرائیو سے ناپسندیدہ فائلوں کو حذف کریں \n "
+ },
+ {
+ "topic": "میں نے اپنی پین ڈرائیو پر موجود مواد کو لوڈ کیا ، لیکن اب میں دیکھ رہا ہوں کہ یہ خالی ہے",
+ "description": "آپ کا پینڈرایو یا کمپیوٹر کسی وائرس سے متاثر ہوسکتا ہے۔چیک کریں کہ:\n* آپ کی مشین پر ایک اینٹی وائرس سوفٹویئر نصب ہے\n* آپ کی پینڈرائیو نامعلوم مشینوں میں پلگ کرنے سے پہلے تحریری طور پر محفوظ ہے"
+ },
+ {
+ "topic": "میرے پین ڈرائیو پر اور اس سے مواد کو کاپی کرنے میں وقت لگتا ہے",
+ "description": "کاپی کرنے میں جو وقت لیا گیا ہے اس کا انحصار مواد کی فائل کے سائز پر ہوتا ہے۔ کچھ بڑی درسی کتب کاپی کرنے میں وقت لگتا ہے۔ ہمارا مشورہ ہے کہ آپ اس عمل میں مداخلت نہ کریں۔ ایسا کرنے سے متضاد فائلیں پیدا ہوسکتی ہیں۔"
+ },
+ {
+ "topic": "میرے کمپیوٹر میں DIKSHA مشمولات کی وجہ سے کوئی خالی جگہ نہیں ہے",
+ "description": "اپنے کمپیوٹر پر جگہ خالی کرنے کے لئے ایپ کے میرے ڈاؤن لوڈ والے ٹیب سے ڈاؤن لوڈ کردہ مواد کو ہٹا دیں"
+ },
+ {
+ "topic": "میرے Ubuntu سسٹم پر DIKSHA ڈیسک ٹاپ ایپلی کیشن انسٹال کرنے سے قاصر ہے",
+ "description": "میرے Ubuntu سسٹم پر DIKSHA ڈیسک ٹاپ ایپلی کیشن انسٹال کرنے کے لئے:
\n اپنا ٹرمینل کھولیں p>\n
ڈائرکٹری تبدیل کرنے کے لئے سی ڈی کمانڈ چلائیں<مقام>جہاں exe فائل ڈاؤن لوڈ کی گئی ہے.مثال کے طور پر ، اگر ڈاؤن لوڈز فولڈر میں exe کو محفوظ کیا گیا ہے تو ، پھر سی ڈی ڈاؤن لوڈ کمانڈ چلائیں
\nکمانڈ sudo dpkg-i چلائیں\n
\n اس کمانڈ کو کامیابی کے ساتھ چلانے پر ایپلیکیشن لانچ کی جاتی ہے p>"
+ }
+ ],
+ "constants": {
+ "charactersLeft": "حروف باقی ہیں",
+ "explainMsg": "کیا آپ اس مسئلے کو سمجھا سکے؟",
+ "faqMsg": "اکثر پوچھے گئے سوالات",
+ "help": "مدد",
+ "helpMsg": "کیا اس جواب نے آ پکی مدد کی؟",
+ "initiateEmailButton": "ای میل شروع کریں",
+ "knowMoreMsg": "آپ اور کیا جاننا چاہتے ہے؟",
+ "noMsg": "نہیں",
+ "reportIssue": "مسئلہ کی اطلاع دیں",
+ "reportIssueMsg": "دوسرے مسئلے کی اطلاع دیں",
+ "resolveMsg": "اپنے مسئلے کو حل کرنے کے لۓ فہرست دیکھیں",
+ "sorryMsg": "اس کے لئے معذرت!",
+ "submitButton": "جمع کریں",
+ "tellMoreMsg": "ہمیں اس مسئلے کے بارے میں مزید بتائیے",
+ "thanksMsg": "آپکے جواب کا شکریہ!",
+ "triggerEmailMsg": "ٹیکسٹ باکس میں تفصیلات شامل کرنے کے بعد اور ابتدائی ای میل بٹن کو شروع کرنے کے بعد، ہم آپ کی طرف سے ایک ای میل کو متحرک کریں گے. آپ مزید تفصیلات شامل کر سکتے ہیں اور / یا وہاں فائلیں منسلک کرسکتے ہیں.",
+ "typeHere": "یہاں ٹائپ کریں ...",
+ "yesMsg": "جی ہاں"
+ }
+}
\ No newline at end of file
From 5192fdb34907ab7abb18c4340882dcb0d1ca975f Mon Sep 17 00:00:00 2001
From: keshavprasadms
Date: Fri, 11 Dec 2020 17:59:21 +0530
Subject: [PATCH 068/184] fix: updating main deploy file to keycloak 3,
removing unused vars
---
.../keycloak-deploy-6.0/defaults/main.yml | 86 +
.../files/python-keycloak-0.12.0/PKG-INFO | 19 +
.../files/python-keycloak-0.12.0/README.md | 210 ++
.../keycloak-realm.json | 1999 +++++++++++++
.../keycloak/__init__.py | 19 +
.../keycloak/authorization/__init__.py | 87 +
.../keycloak/authorization/permission.py | 98 +
.../keycloak/authorization/policy.py | 107 +
.../keycloak/authorization/role.py | 39 +
.../keycloak/connection.py | 199 ++
.../keycloak/exceptions.py | 93 +
.../keycloak/keycloak_admin.py | 670 +++++
.../keycloak/keycloak_main.py | 89 +
.../keycloak/keycloak_openid.py | 390 +++
.../keycloak/keycloak_patch.py | 54 +
.../python_keycloak.egg-info/PKG-INFO | 18 +
.../python_keycloak.egg-info/SOURCES.txt | 0
.../dependency_links.txt | 1 +
.../python_keycloak.egg-info/requires.txt | 3 +
.../python_keycloak.egg-info/top_level.txt | 1 +
.../keycloak/tests/__init__.py | 0
.../keycloak/tests/test_connection.py | 148 +
.../keycloak/urls_patterns.py | 54 +
.../python_keycloak.egg-info/PKG-INFO | 18 +
.../python_keycloak.egg-info/SOURCES.txt | 21 +
.../dependency_links.txt | 1 +
.../python_keycloak.egg-info/requires.txt | 3 +
.../python_keycloak.egg-info/top_level.txt | 1 +
.../files/python-keycloak-0.12.0/roles.json | 41 +
.../files/python-keycloak-0.12.0/setup.cfg | 7 +
.../files/python-keycloak-0.12.0/setup.py | 25 +
.../keycloak-deploy-6.0/tasks/bootstrap.yml | 91 +
.../keycloak-deploy-6.0/tasks/custom.yml | 62 +
.../keycloak-deploy-6.0/tasks/deploy.yml | 205 ++
.../roles/keycloak-deploy-6.0/tasks/main.yml | 13 +
.../templates/Msg91Creds.json.j2 | 7 +
.../keycloak-deploy-6.0/templates/clients.j2 | 262 ++
.../templates/clients.json | 262 ++
.../templates/keycloak-bootstrap.conf.j2 | 14 +
.../templates/keycloak-realm.j2 | 2648 +++++++++++++++++
.../templates/module.xml.j2 | 10 +
.../templates/standalone-ha-single.xml | 0
.../templates/standalone-ha.xml | 673 +++++
.../templates/standalone.xml | 471 +++
.../roles/keycloak-deploy/defaults/main.yml | 2 +
.../roles/keycloak-deploy/tasks/deploy.yml | 96 +-
.../keycloak-deploy/templates/module.xml.j2 | 2 +-
.../templates/standalone-ha.xml | 330 +-
.../templates/standalone.conf.j2 | 73 +
49 files changed, 9457 insertions(+), 265 deletions(-)
create mode 100644 ansible/roles/keycloak-deploy-6.0/defaults/main.yml
create mode 100644 ansible/roles/keycloak-deploy-6.0/files/python-keycloak-0.12.0/PKG-INFO
create mode 100644 ansible/roles/keycloak-deploy-6.0/files/python-keycloak-0.12.0/README.md
create mode 100644 ansible/roles/keycloak-deploy-6.0/files/python-keycloak-0.12.0/keycloak-realm.json
create mode 100644 ansible/roles/keycloak-deploy-6.0/files/python-keycloak-0.12.0/keycloak/__init__.py
create mode 100644 ansible/roles/keycloak-deploy-6.0/files/python-keycloak-0.12.0/keycloak/authorization/__init__.py
create mode 100644 ansible/roles/keycloak-deploy-6.0/files/python-keycloak-0.12.0/keycloak/authorization/permission.py
create mode 100644 ansible/roles/keycloak-deploy-6.0/files/python-keycloak-0.12.0/keycloak/authorization/policy.py
create mode 100644 ansible/roles/keycloak-deploy-6.0/files/python-keycloak-0.12.0/keycloak/authorization/role.py
create mode 100644 ansible/roles/keycloak-deploy-6.0/files/python-keycloak-0.12.0/keycloak/connection.py
create mode 100644 ansible/roles/keycloak-deploy-6.0/files/python-keycloak-0.12.0/keycloak/exceptions.py
create mode 100644 ansible/roles/keycloak-deploy-6.0/files/python-keycloak-0.12.0/keycloak/keycloak_admin.py
create mode 100644 ansible/roles/keycloak-deploy-6.0/files/python-keycloak-0.12.0/keycloak/keycloak_main.py
create mode 100644 ansible/roles/keycloak-deploy-6.0/files/python-keycloak-0.12.0/keycloak/keycloak_openid.py
create mode 100644 ansible/roles/keycloak-deploy-6.0/files/python-keycloak-0.12.0/keycloak/keycloak_patch.py
create mode 100644 ansible/roles/keycloak-deploy-6.0/files/python-keycloak-0.12.0/keycloak/python_keycloak.egg-info/PKG-INFO
create mode 100644 ansible/roles/keycloak-deploy-6.0/files/python-keycloak-0.12.0/keycloak/python_keycloak.egg-info/SOURCES.txt
create mode 100644 ansible/roles/keycloak-deploy-6.0/files/python-keycloak-0.12.0/keycloak/python_keycloak.egg-info/dependency_links.txt
create mode 100644 ansible/roles/keycloak-deploy-6.0/files/python-keycloak-0.12.0/keycloak/python_keycloak.egg-info/requires.txt
create mode 100644 ansible/roles/keycloak-deploy-6.0/files/python-keycloak-0.12.0/keycloak/python_keycloak.egg-info/top_level.txt
create mode 100644 ansible/roles/keycloak-deploy-6.0/files/python-keycloak-0.12.0/keycloak/tests/__init__.py
create mode 100644 ansible/roles/keycloak-deploy-6.0/files/python-keycloak-0.12.0/keycloak/tests/test_connection.py
create mode 100644 ansible/roles/keycloak-deploy-6.0/files/python-keycloak-0.12.0/keycloak/urls_patterns.py
create mode 100644 ansible/roles/keycloak-deploy-6.0/files/python-keycloak-0.12.0/python_keycloak.egg-info/PKG-INFO
create mode 100644 ansible/roles/keycloak-deploy-6.0/files/python-keycloak-0.12.0/python_keycloak.egg-info/SOURCES.txt
create mode 100644 ansible/roles/keycloak-deploy-6.0/files/python-keycloak-0.12.0/python_keycloak.egg-info/dependency_links.txt
create mode 100644 ansible/roles/keycloak-deploy-6.0/files/python-keycloak-0.12.0/python_keycloak.egg-info/requires.txt
create mode 100644 ansible/roles/keycloak-deploy-6.0/files/python-keycloak-0.12.0/python_keycloak.egg-info/top_level.txt
create mode 100644 ansible/roles/keycloak-deploy-6.0/files/python-keycloak-0.12.0/roles.json
create mode 100644 ansible/roles/keycloak-deploy-6.0/files/python-keycloak-0.12.0/setup.cfg
create mode 100644 ansible/roles/keycloak-deploy-6.0/files/python-keycloak-0.12.0/setup.py
create mode 100644 ansible/roles/keycloak-deploy-6.0/tasks/bootstrap.yml
create mode 100644 ansible/roles/keycloak-deploy-6.0/tasks/custom.yml
create mode 100644 ansible/roles/keycloak-deploy-6.0/tasks/deploy.yml
create mode 100644 ansible/roles/keycloak-deploy-6.0/tasks/main.yml
create mode 100644 ansible/roles/keycloak-deploy-6.0/templates/Msg91Creds.json.j2
create mode 100644 ansible/roles/keycloak-deploy-6.0/templates/clients.j2
create mode 100644 ansible/roles/keycloak-deploy-6.0/templates/clients.json
create mode 100644 ansible/roles/keycloak-deploy-6.0/templates/keycloak-bootstrap.conf.j2
create mode 100644 ansible/roles/keycloak-deploy-6.0/templates/keycloak-realm.j2
create mode 100644 ansible/roles/keycloak-deploy-6.0/templates/module.xml.j2
rename ansible/roles/{keycloak-deploy => keycloak-deploy-6.0}/templates/standalone-ha-single.xml (100%)
create mode 100644 ansible/roles/keycloak-deploy-6.0/templates/standalone-ha.xml
create mode 100644 ansible/roles/keycloak-deploy-6.0/templates/standalone.xml
create mode 100644 ansible/roles/keycloak-deploy/templates/standalone.conf.j2
diff --git a/ansible/roles/keycloak-deploy-6.0/defaults/main.yml b/ansible/roles/keycloak-deploy-6.0/defaults/main.yml
new file mode 100644
index 000000000..b68604449
--- /dev/null
+++ b/ansible/roles/keycloak-deploy-6.0/defaults/main.yml
@@ -0,0 +1,86 @@
+---
+sunbird_auth_version: 1.0v
+keycloak_pkg_src: https://downloads.jboss.org/keycloak/3.2.0.Final/keycloak-3.2.0.Final.tar.gz
+postgresql_driver_src: https://jdbc.postgresql.org/download/postgresql-9.4.1212.jar
+keycloak_pkg_file: "keycloak-3.2.0.Final.tar.gz"
+keycloak_sms_provider_build: "keycloak-email-phone-autthenticator-1.0-SNAPSHOT.jar"
+keycloak_subsystem: '
+
+ auth
+ '
+keycloak_cache_container: '
+
+
+
+
+
+
+ '
+keycloak_default_ds: '
+
+
+ jdbc:h2:${jboss.server.data.dir}/keycloak;AUTO_SERVER=TRUE
+
+ h2
+
+ sa
+ sa
+
+ '
+
+keycloak_ds_driver_path: "/opt/keycloak/modules/system/layers/keycloak/org/postgresql/main"
+wildfly_dir: /opt/keycloak
+keycloak_download_dir: /opt
+keycloak_download_url: https://downloads.jboss.org/keycloak/3.2.0.Final/keycloak-3.2.0.Final.tar.gz
+wildfly_user: keycloak
+wildfly_group: keycloak
+wildfly_standalone_config_path: /opt/keycloak/keycloak/standalone/configuration/standalone-ha.xml
+keycloak_ext:
+keycloak_download_file: keycloak-3.2.0.Final.tar.gz
+
+keycloak_ds_driver_url: https://jdbc.postgresql.org/download/postgresql-9.2.1212.jar
+keycloak_ds_driver_name: "postgresql"
+keycloak_ds_driver_module: '
+
+
+
+
+
+
+
+
+
+
+
+ '
+keycloak_custom_driver: '
+
+
+ org.postgresql.xa.PGXADataSource
+
+ org.postgresql.ds.PGPoolingDataSource
+ '
+keycloak_custom_ds: '
+
+ jdbc:postgresql://11.0.0.6:5432/keycloak
+ org.postgresql.Driver
+ postgresql
+
+ keycloak
+ KeyCloaK#2
+
+
+
+ true
+
+
+ '
+
+theme: "sunrise.tar.gz"
+dest_theme: "/opt/keycloak/themes/"
+theme_file: sunrise
+keycloak_home: /opt/keycloak
+login_theme: artifacts/sunbird/login
+email_theme: artifacts/sunbird/email
+tenant_name: sunbird
diff --git a/ansible/roles/keycloak-deploy-6.0/files/python-keycloak-0.12.0/PKG-INFO b/ansible/roles/keycloak-deploy-6.0/files/python-keycloak-0.12.0/PKG-INFO
new file mode 100644
index 000000000..e71b54e3b
--- /dev/null
+++ b/ansible/roles/keycloak-deploy-6.0/files/python-keycloak-0.12.0/PKG-INFO
@@ -0,0 +1,19 @@
+Metadata-Version: 1.1
+Name: python-keycloak
+Version: 0.12.0
+Summary: python-keycloak is a Python package providing access to the Keycloak API.
+Home-page: https://bitbucket.org/agriness/python-keycloak
+Author: Marcos Pereira
+Author-email: marcospereira.mpj@gmail.com
+License: GNU General Public License - V3
+Description-Content-Type: UNKNOWN
+Description: UNKNOWN
+Keywords: keycloak openid
+Platform: UNKNOWN
+Classifier: Programming Language :: Python :: 3
+Classifier: License :: OSI Approved :: GNU General Public License v3 (GPLv3)
+Classifier: Development Status :: 3 - Alpha
+Classifier: Operating System :: MacOS
+Classifier: Operating System :: Unix
+Classifier: Operating System :: Microsoft :: Windows
+Classifier: Topic :: Utilities
diff --git a/ansible/roles/keycloak-deploy-6.0/files/python-keycloak-0.12.0/README.md b/ansible/roles/keycloak-deploy-6.0/files/python-keycloak-0.12.0/README.md
new file mode 100644
index 000000000..c6b0940b0
--- /dev/null
+++ b/ansible/roles/keycloak-deploy-6.0/files/python-keycloak-0.12.0/README.md
@@ -0,0 +1,210 @@
+[](http://python-keycloak.readthedocs.io/en/latest/?badge=latest)
+
+Python Keycloak
+====================
+
+For review- see https://bitbucket.org/agriness/python-keycloak
+
+**python-keycloak** is a Python package providing access to the Keycloak API.
+
+## Installation
+
+### Via Pypi Package:
+
+``` $ pip install python-keycloak ```
+
+### Manually
+
+``` $ python setup.py install ```
+
+## Dependencies
+
+python-keycloak depends on:
+
+* Python 3
+* [requests](http://docs.python-requests.org/en/master/)
+* [python-jose](http://python-jose.readthedocs.io/en/latest/)
+
+### Tests Dependencies
+
+* unittest
+* [httmock](https://github.com/patrys/httmock)
+
+## Bug reports
+
+Please report bugs and feature requests at
+https://bitbucket.org/agriness/python-keycloak/issues
+
+## Documentation
+
+The documentation for python-keycloak is available on [readthedocs](http://python-keycloak.readthedocs.io).
+
+## Contributors
+
+* [Agriness Team](http://www.agriness.com/pt/)
+* [Marcos Pereira](marcospereira.mpj@gmail.com)
+* [Martin Devlin](martin.devlin@pearson.com)
+* [Shon T. Urbas](shon.urbas@gmail.com>)
+
+## Usage
+
+```python
+from keycloak import KeycloakOpenID
+
+# Configure client
+keycloak_openid = KeycloakOpenID(server_url="http://localhost:8080/auth/",
+ client_id="example_client",
+ realm_name="example_realm",
+ client_secret_key="secret")
+
+# Get WellKnow
+config_well_know = keycloak_openid.well_know()
+
+# Get Token
+token = keycloak_openid.token("user", "password")
+
+# Get Userinfo
+userinfo = keycloak_openid.userinfo(token['access_token'])
+
+# Refresh token
+token = keycloak_openid.refresh_token(token['refresh_token'])
+
+# Logout
+keycloak_openid.logout(token['refresh_token'])
+
+# Get Certs
+certs = keycloak_openid.certs()
+
+# Get RPT (Entitlement)
+token = keycloak_openid.token("user", "password")
+rpt = keycloak_openid.entitlement(token['access_token'], "resource_id")
+
+# Instropect RPT
+token_rpt_info = keycloak_openid.introspect(keycloak_openid.introspect(token['access_token'], rpt=rpt['rpt'],
+ token_type_hint="requesting_party_token"))
+
+# Introspect Token
+token_info = keycloak_openid.introspect(token['access_token']))
+
+# Decode Token
+KEYCLOAK_PUBLIC_KEY = "secret"
+options = {"verify_signature": True, "verify_aud": True, "exp": True}
+token_info = keycloak_openid.decode_token(token['access_token'], key=KEYCLOAK_PUBLIC_KEY, options=options)
+
+# Get permissions by token
+token = keycloak_openid.token("user", "password")
+keycloak_openid.load_authorization_config("example-authz-config.json")
+policies = keycloak_openid.get_policies(token['access_token'], method_token_info='decode', key=KEYCLOAK_PUBLIC_KEY)
+permissions = keycloak_openid.get_permissions(token['access_token'], method_token_info='introspect')
+
+# KEYCLOAK ADMIN
+
+from keycloak import KeycloakAdmin
+
+keycloak_admin = KeycloakAdmin(server_url="http://localhost:8080/auth/",
+ username='example-admin',
+ password='secret',
+ realm_name="example_realm",
+ verify=True)
+
+# Add user
+new_user = keycloak_admin.create_user({"email": "example@example.com",
+ "username": "example@example.com",
+ "enabled": True,
+ "firstName": "Example",
+ "lastName": "Example",
+ "realmRoles": ["user_default", ],
+ "attributes": {"example": "1,2,3,3,"}})
+
+
+# Add user and set password
+new_user = keycloak_admin.create_user({"email": "example@example.com",
+ "username": "example@example.com",
+ "enabled": True,
+ "firstName": "Example",
+ "lastName": "Example",
+ "credentials": [{"value": "secret","type": "password",}],
+ "realmRoles": ["user_default", ],
+ "attributes": {"example": "1,2,3,3,"}})
+
+# User counter
+count_users = keycloak_admin.users_count()
+
+# Get users Returns a list of users, filtered according to query parameters
+users = keycloak_admin.get_users({})
+
+# Get user ID from name
+user-id-keycloak = keycloak_admin.get_user_id("example@example.com")
+
+# Get User
+user = keycloak_admin.get_user("user-id-keycloak")
+
+# Update User
+response = keycloak_admin.update_user(user_id="user-id-keycloak",
+ payload={'firstName': 'Example Update'})
+
+# Update User Password
+response = set_user_password(user_id="user-id-keycloak", password="secret", temporary=True)
+
+# Delete User
+response = keycloak_admin.delete_user(user_id="user-id-keycloak")
+
+# Get consents granted by the user
+consents = keycloak_admin.consents_user(user_id="user-id-keycloak")
+
+# Send User Action
+response = keycloak_admin.send_update_account(user_id="user-id-keycloak",
+ payload=json.dumps(['UPDATE_PASSWORD']))
+
+# Send Verify Email
+response = keycloak_admin.send_verify_email(user_id="user-id-keycloak")
+
+# Get sessions associated with the user
+sessions = keycloak_admin.get_sessions(user_id="user-id-keycloak")
+
+# Get themes, social providers, auth providers, and event listeners available on this server
+server_info = keycloak_admin.get_server_info()
+
+# Get clients belonging to the realm Returns a list of clients belonging to the realm
+clients = keycloak_admin.get_clients()
+
+# Get client - id (not client-id) from client by name
+client_id=keycloak_admin.get_client_id("my-client")
+
+# Get representation of the client - id of client (not client-id)
+client = keycloak_admin.get_client(client_id="client_id")
+
+# Get all roles for the realm or client
+realm_roles = keycloak_admin.get_realm_roles()
+
+# Get all roles for the client
+client_roles = keycloak_admin.get_client_roles(client_id="client_id")
+
+# Get client role
+role = keycloak_admin.get_client_role(client_id="client_id", role_name="role_name")
+
+# Warning: Deprecated
+# Get client role id from name
+role_id = keycloak_admin.get_client_role_id(client_id="client_id", role_name="test")
+
+# Create client role
+keycloak_admin.create_client_role(client_id, "test")
+
+# Assign client role to user. Note that BOTH role_name and role_id appear to be required.
+keycloak_admin.assign_client_role(client_id="client_id", user_id="user_id", role_id="role_id", role_name="test")
+
+# Create new group
+group = keycloak_admin.create_group(name="Example Group")
+
+# Get all groups
+groups = keycloak_admin.get_groups()
+
+# Get group
+group = keycloak_admin.get_group(group_id='group_id')
+
+# Get group by name
+group = keycloak_admin.get_group_by_name(name_or_path='group_id', search_in_subgroups=True)
+
+# Function to trigger user sync from provider
+sync_users(storage_id="storage_di", action="action")
+```
diff --git a/ansible/roles/keycloak-deploy-6.0/files/python-keycloak-0.12.0/keycloak-realm.json b/ansible/roles/keycloak-deploy-6.0/files/python-keycloak-0.12.0/keycloak-realm.json
new file mode 100644
index 000000000..72416d4de
--- /dev/null
+++ b/ansible/roles/keycloak-deploy-6.0/files/python-keycloak-0.12.0/keycloak-realm.json
@@ -0,0 +1,1999 @@
+{
+ "id": "sunbird",
+ "realm": "sunbird",
+ "notBefore": 0,
+ "revokeRefreshToken": false,
+ "accessTokenLifespan": 21600,
+ "accessTokenLifespanForImplicitFlow": 7200,
+ "ssoSessionIdleTimeout": 1800,
+ "ssoSessionMaxLifespan": 21600,
+ "offlineSessionIdleTimeout": 43200,
+ "accessCodeLifespan": 60,
+ "accessCodeLifespanUserAction": 300,
+ "accessCodeLifespanLogin": 1800,
+ "actionTokenGeneratedByAdminLifespan": 43200,
+ "actionTokenGeneratedByUserLifespan": 300,
+ "enabled": true,
+ "sslRequired": "external",
+ "registrationAllowed": false,
+ "registrationEmailAsUsername": false,
+ "rememberMe": true,
+ "verifyEmail": false,
+ "loginWithEmailAllowed": true,
+ "duplicateEmailsAllowed": false,
+ "resetPasswordAllowed": true,
+ "editUsernameAllowed": false,
+ "bruteForceProtected": false,
+ "permanentLockout": false,
+ "maxFailureWaitSeconds": 900,
+ "minimumQuickLoginWaitSeconds": 60,
+ "waitIncrementSeconds": 60,
+ "quickLoginCheckMilliSeconds": 1000,
+ "maxDeltaTimeSeconds": 43200,
+ "failureFactor": 30,
+ "roles": {
+ "realm": [
+ {
+ "id": "7b955d7f-0a1e-4935-8391-642886d34612",
+ "name": "offline_access",
+ "description": "${role_offline-access}",
+ "scopeParamRequired": true,
+ "composite": false,
+ "clientRole": false,
+ "containerId": "sunbird"
+ },
+ {
+ "id": "96adf368-c8e2-4b39-b2a5-2559573edb63",
+ "name": "uma_authorization",
+ "description": "${role_uma_authorization}",
+ "scopeParamRequired": false,
+ "composite": false,
+ "clientRole": false,
+ "containerId": "sunbird"
+ }
+ ],
+ "client": {
+ "realm-management": [
+ {
+ "id": "3f8bf7e5-5d66-4394-8f06-1270529c605f",
+ "name": "manage-authorization",
+ "description": "${role_manage-authorization}",
+ "scopeParamRequired": false,
+ "composite": false,
+ "clientRole": true,
+ "containerId": "b2f45201-1362-4b10-83c3-207d470f44bf"
+ },
+ {
+ "id": "601fa2c9-29d4-49c1-87ac-939a1260f6ce",
+ "name": "query-realms",
+ "description": "${role_query-realms}",
+ "scopeParamRequired": false,
+ "composite": false,
+ "clientRole": true,
+ "containerId": "b2f45201-1362-4b10-83c3-207d470f44bf"
+ },
+ {
+ "id": "9aa1dcd9-cb93-4496-af5f-41b9ecacc1da",
+ "name": "view-authorization",
+ "description": "${role_view-authorization}",
+ "scopeParamRequired": false,
+ "composite": false,
+ "clientRole": true,
+ "containerId": "b2f45201-1362-4b10-83c3-207d470f44bf"
+ },
+ {
+ "id": "98999987-faf5-4c4e-958a-e5463bc4edc6",
+ "name": "manage-events",
+ "description": "${role_manage-events}",
+ "scopeParamRequired": false,
+ "composite": false,
+ "clientRole": true,
+ "containerId": "b2f45201-1362-4b10-83c3-207d470f44bf"
+ },
+ {
+ "id": "f898fca8-5361-49d5-900a-ebf5b775a939",
+ "name": "impersonation",
+ "description": "${role_impersonation}",
+ "scopeParamRequired": false,
+ "composite": false,
+ "clientRole": true,
+ "containerId": "b2f45201-1362-4b10-83c3-207d470f44bf"
+ },
+ {
+ "id": "698dfeb0-b8d2-4240-b8a8-acd4b7a12ad3",
+ "name": "view-realm",
+ "description": "${role_view-realm}",
+ "scopeParamRequired": false,
+ "composite": false,
+ "clientRole": true,
+ "containerId": "b2f45201-1362-4b10-83c3-207d470f44bf"
+ },
+ {
+ "id": "3ff462fc-b33c-431a-b54b-861c3298d910",
+ "name": "manage-users",
+ "description": "${role_manage-users}",
+ "scopeParamRequired": false,
+ "composite": false,
+ "clientRole": true,
+ "containerId": "b2f45201-1362-4b10-83c3-207d470f44bf"
+ },
+ {
+ "id": "be1802b1-558c-404c-bcb9-b9bf77af9788",
+ "name": "manage-identity-providers",
+ "description": "${role_manage-identity-providers}",
+ "scopeParamRequired": false,
+ "composite": false,
+ "clientRole": true,
+ "containerId": "b2f45201-1362-4b10-83c3-207d470f44bf"
+ },
+ {
+ "id": "387b44e4-e901-4431-b9af-6abd9377ed46",
+ "name": "query-clients",
+ "description": "${role_query-clients}",
+ "scopeParamRequired": false,
+ "composite": false,
+ "clientRole": true,
+ "containerId": "b2f45201-1362-4b10-83c3-207d470f44bf"
+ },
+ {
+ "id": "a408b6e8-03c9-46a2-97ba-305d09db0c3c",
+ "name": "view-events",
+ "description": "${role_view-events}",
+ "scopeParamRequired": false,
+ "composite": false,
+ "clientRole": true,
+ "containerId": "b2f45201-1362-4b10-83c3-207d470f44bf"
+ },
+ {
+ "id": "41c2f39a-3008-4f9d-9e1e-a7738c118570",
+ "name": "query-groups",
+ "description": "${role_query-groups}",
+ "scopeParamRequired": false,
+ "composite": false,
+ "clientRole": true,
+ "containerId": "b2f45201-1362-4b10-83c3-207d470f44bf"
+ },
+ {
+ "id": "26d3289b-d2eb-4cf2-a501-f1e3fa07344c",
+ "name": "manage-clients",
+ "description": "${role_manage-clients}",
+ "scopeParamRequired": false,
+ "composite": false,
+ "clientRole": true,
+ "containerId": "b2f45201-1362-4b10-83c3-207d470f44bf"
+ },
+ {
+ "id": "e2077ab0-6efb-450d-9cba-89cacd887b71",
+ "name": "create-client",
+ "description": "${role_create-client}",
+ "scopeParamRequired": false,
+ "composite": false,
+ "clientRole": true,
+ "containerId": "b2f45201-1362-4b10-83c3-207d470f44bf"
+ },
+ {
+ "id": "46019462-3dc8-46a8-9786-ffcbad293f43",
+ "name": "view-users",
+ "description": "${role_view-users}",
+ "scopeParamRequired": false,
+ "composite": true,
+ "composites": {
+ "client": {
+ "realm-management": [
+ "query-groups",
+ "query-users"
+ ]
+ }
+ },
+ "clientRole": true,
+ "containerId": "b2f45201-1362-4b10-83c3-207d470f44bf"
+ },
+ {
+ "id": "d269f220-e93f-4b43-96a1-9f2c117a2dfb",
+ "name": "view-clients",
+ "description": "${role_view-clients}",
+ "scopeParamRequired": false,
+ "composite": true,
+ "composites": {
+ "client": {
+ "realm-management": [
+ "query-clients"
+ ]
+ }
+ },
+ "clientRole": true,
+ "containerId": "b2f45201-1362-4b10-83c3-207d470f44bf"
+ },
+ {
+ "id": "0c998f1b-7363-47fb-a493-4b6f4aacb0ba",
+ "name": "realm-admin",
+ "description": "${role_realm-admin}",
+ "scopeParamRequired": false,
+ "composite": true,
+ "composites": {
+ "client": {
+ "realm-management": [
+ "manage-authorization",
+ "query-realms",
+ "view-authorization",
+ "manage-events",
+ "impersonation",
+ "view-realm",
+ "manage-users",
+ "manage-identity-providers",
+ "query-clients",
+ "view-events",
+ "query-groups",
+ "manage-clients",
+ "create-client",
+ "view-users",
+ "view-clients",
+ "manage-realm",
+ "view-identity-providers",
+ "query-users"
+ ]
+ }
+ },
+ "clientRole": true,
+ "containerId": "b2f45201-1362-4b10-83c3-207d470f44bf"
+ },
+ {
+ "id": "d77bf5a5-5877-450b-b11e-5f874f410e10",
+ "name": "manage-realm",
+ "description": "${role_manage-realm}",
+ "scopeParamRequired": false,
+ "composite": false,
+ "clientRole": true,
+ "containerId": "b2f45201-1362-4b10-83c3-207d470f44bf"
+ },
+ {
+ "id": "d97009ed-d0c7-4afb-b9a3-6ee03ef01a74",
+ "name": "view-identity-providers",
+ "description": "${role_view-identity-providers}",
+ "scopeParamRequired": false,
+ "composite": false,
+ "clientRole": true,
+ "containerId": "b2f45201-1362-4b10-83c3-207d470f44bf"
+ },
+ {
+ "id": "57118202-c5e5-4c49-829b-c2ed796bfdea",
+ "name": "query-users",
+ "description": "${role_query-users}",
+ "scopeParamRequired": false,
+ "composite": false,
+ "clientRole": true,
+ "containerId": "b2f45201-1362-4b10-83c3-207d470f44bf"
+ }
+ ],
+ "security-admin-console": [],
+ "android": [],
+ "admin-cli": [],
+ "trampoline": [],
+ "broker": [
+ {
+ "id": "19ef58ac-2d90-40a4-a158-0e2f8893264a",
+ "name": "read-token",
+ "description": "${role_read-token}",
+ "scopeParamRequired": false,
+ "composite": false,
+ "clientRole": true,
+ "containerId": "c3950efa-6684-44c2-b50a-c7b3d16df04b"
+ }
+ ],
+ "portal": [],
+ "account": [
+ {
+ "id": "1fef7ac5-b042-462b-8298-0446044788b3",
+ "name": "manage-account",
+ "description": "${role_manage-account}",
+ "scopeParamRequired": false,
+ "composite": true,
+ "composites": {
+ "client": {
+ "account": [
+ "manage-account-links"
+ ]
+ }
+ },
+ "clientRole": true,
+ "containerId": "c2d24d3f-65ca-46de-9cd8-3eeb71a7f83d"
+ },
+ {
+ "id": "f8786348-6fa4-4b13-828e-9f080c9c6824",
+ "name": "manage-account-links",
+ "description": "${role_manage-account-links}",
+ "scopeParamRequired": false,
+ "composite": false,
+ "clientRole": true,
+ "containerId": "c2d24d3f-65ca-46de-9cd8-3eeb71a7f83d"
+ },
+ {
+ "id": "91c5c738-9c39-4c4d-bae8-75f18fd7c5e4",
+ "name": "view-profile",
+ "description": "${role_view-profile}",
+ "scopeParamRequired": false,
+ "composite": false,
+ "clientRole": true,
+ "containerId": "c2d24d3f-65ca-46de-9cd8-3eeb71a7f83d"
+ }
+ ]
+ }
+ },
+ "groups": [],
+ "defaultRoles": [
+ "offline_access",
+ "uma_authorization"
+ ],
+ "requiredCredentials": [
+ "password"
+ ],
+ "passwordPolicy": "hashIterations(20000)",
+ "otpPolicyType": "totp",
+ "otpPolicyAlgorithm": "HmacSHA1",
+ "otpPolicyInitialCounter": 0,
+ "otpPolicyDigits": 6,
+ "otpPolicyLookAheadWindow": 1,
+ "otpPolicyPeriod": 30,
+ "clientScopeMappings": {
+ "realm-management": [
+ {
+ "client": "admin-cli",
+ "roles": [
+ "realm-admin"
+ ]
+ },
+ {
+ "client": "security-admin-console",
+ "roles": [
+ "realm-admin"
+ ]
+ }
+ ]
+ },
+ "clients": [
+ {
+ "id": "9a901d18-377b-4615-9b89-677b544be3c5",
+ "clientId": "trampoline",
+ "rootUrl": "",
+ "adminUrl": "",
+ "baseUrl": "/",
+ "surrogateAuthRequired": false,
+ "enabled": true,
+ "clientAuthenticatorType": "client-secret",
+ "secret": "",
+ "redirectUris": [
+ ],
+ "webOrigins": [
+ ],
+ "notBefore": 0,
+ "bearerOnly": false,
+ "consentRequired": false,
+ "standardFlowEnabled": false,
+ "implicitFlowEnabled": false,
+ "directAccessGrantsEnabled": true,
+ "serviceAccountsEnabled": false,
+ "publicClient": false,
+ "frontchannelLogout": false,
+ "protocol": "openid-connect",
+ "attributes": {
+ "saml.assertion.signature": "false",
+ "saml.force.post.binding": "false",
+ "saml.multivalued.roles": "false",
+ "saml.encrypt": "false",
+ "saml_force_name_id_format": "false",
+ "saml.client.signature": "false",
+ "saml.authnstatement": "false",
+ "saml.server.signature": "false",
+ "saml.server.signature.keyinfo.ext": "false",
+ "saml.onetimeuse.condition": "false"
+ },
+ "fullScopeAllowed": true,
+ "nodeReRegistrationTimeout": -1,
+ "protocolMappers": [
+ {
+ "id": "12134027-94cc-401c-bbf6-be565078ddfb",
+ "name": "role list",
+ "protocol": "saml",
+ "protocolMapper": "saml-role-list-mapper",
+ "consentRequired": false,
+ "config": {
+ "single": "false",
+ "attribute.nameformat": "Basic",
+ "attribute.name": "Role"
+ }
+ },
+ {
+ "id": "6a956bf1-6c40-4549-b335-9fe8c788b18f",
+ "name": "family name",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-usermodel-property-mapper",
+ "consentRequired": true,
+ "consentText": "${familyName}",
+ "config": {
+ "userinfo.token.claim": "true",
+ "user.attribute": "lastName",
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "claim.name": "family_name",
+ "jsonType.label": "String"
+ }
+ },
+ {
+ "id": "d32ba1d4-3fef-42ff-aa2b-98cb4bfef6f9",
+ "name": "full name",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-full-name-mapper",
+ "consentRequired": true,
+ "consentText": "${fullName}",
+ "config": {
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "userinfo.token.claim": "true"
+ }
+ },
+ {
+ "id": "9e899fc7-1ddd-447d-810c-d91333d6621c",
+ "name": "username",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-usermodel-property-mapper",
+ "consentRequired": true,
+ "consentText": "${username}",
+ "config": {
+ "userinfo.token.claim": "true",
+ "user.attribute": "username",
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "claim.name": "preferred_username",
+ "jsonType.label": "String"
+ }
+ },
+ {
+ "id": "74e4d13f-bd02-4f17-bbbc-d4b79bab1971",
+ "name": "email",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-usermodel-property-mapper",
+ "consentRequired": true,
+ "consentText": "${email}",
+ "config": {
+ "userinfo.token.claim": "true",
+ "user.attribute": "email",
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "claim.name": "email",
+ "jsonType.label": "String"
+ }
+ },
+ {
+ "id": "48fe23c2-a6fb-4c5e-8930-28ad1913829a",
+ "name": "given name",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-usermodel-property-mapper",
+ "consentRequired": true,
+ "consentText": "${givenName}",
+ "config": {
+ "userinfo.token.claim": "true",
+ "user.attribute": "firstName",
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "claim.name": "given_name",
+ "jsonType.label": "String"
+ }
+ }
+ ],
+ "useTemplateConfig": false,
+ "useTemplateScope": false,
+ "useTemplateMappers": false
+ },
+ {
+ "id": "da893beb-6ac7-420d-b51b-f05dadf56bbc",
+ "clientId": "android",
+ "rootUrl": "",
+ "baseUrl": "/",
+ "surrogateAuthRequired": false,
+ "enabled": true,
+ "clientAuthenticatorType": "client-secret",
+ "secret": "",
+ "redirectUris": [
+ ],
+ "webOrigins": [],
+ "notBefore": 0,
+ "bearerOnly": false,
+ "consentRequired": false,
+ "standardFlowEnabled": true,
+ "implicitFlowEnabled": false,
+ "directAccessGrantsEnabled": true,
+ "serviceAccountsEnabled": false,
+ "publicClient": true,
+ "frontchannelLogout": false,
+ "protocol": "openid-connect",
+ "attributes": {
+ "saml.assertion.signature": "false",
+ "saml.force.post.binding": "false",
+ "saml.multivalued.roles": "false",
+ "saml.encrypt": "false",
+ "saml_force_name_id_format": "false",
+ "saml.client.signature": "false",
+ "saml.authnstatement": "false",
+ "saml.server.signature": "false",
+ "saml.server.signature.keyinfo.ext": "false",
+ "saml.onetimeuse.condition": "false"
+ },
+ "fullScopeAllowed": true,
+ "nodeReRegistrationTimeout": -1,
+ "protocolMappers": [
+ {
+ "id": "ff7dac46-16b4-4ab6-a054-dd03d5411fa9",
+ "name": "role list",
+ "protocol": "saml",
+ "protocolMapper": "saml-role-list-mapper",
+ "consentRequired": false,
+ "config": {
+ "single": "false",
+ "attribute.nameformat": "Basic",
+ "attribute.name": "Role"
+ }
+ },
+ {
+ "id": "32fad9c0-0dfe-45b2-94a1-3e2f74d756ec",
+ "name": "family name",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-usermodel-property-mapper",
+ "consentRequired": true,
+ "consentText": "${familyName}",
+ "config": {
+ "userinfo.token.claim": "true",
+ "user.attribute": "lastName",
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "claim.name": "family_name",
+ "jsonType.label": "String"
+ }
+ },
+ {
+ "id": "4fb4d644-c609-4a27-a407-d451bcd83e16",
+ "name": "given name",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-usermodel-property-mapper",
+ "consentRequired": true,
+ "consentText": "${givenName}",
+ "config": {
+ "userinfo.token.claim": "true",
+ "user.attribute": "firstName",
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "claim.name": "given_name",
+ "jsonType.label": "String"
+ }
+ },
+ {
+ "id": "84e7c6e5-1afb-44d8-b507-1ed31fa0f351",
+ "name": "email",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-usermodel-property-mapper",
+ "consentRequired": true,
+ "consentText": "${email}",
+ "config": {
+ "userinfo.token.claim": "true",
+ "user.attribute": "email",
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "claim.name": "email",
+ "jsonType.label": "String"
+ }
+ },
+ {
+ "id": "e7ca189f-94de-4996-a192-e93ba960bbba",
+ "name": "full name",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-full-name-mapper",
+ "consentRequired": true,
+ "consentText": "${fullName}",
+ "config": {
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "userinfo.token.claim": "true"
+ }
+ },
+ {
+ "id": "16bedb3b-7571-4106-9a47-66151915ac31",
+ "name": "username",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-usermodel-property-mapper",
+ "consentRequired": true,
+ "consentText": "${username}",
+ "config": {
+ "userinfo.token.claim": "true",
+ "user.attribute": "username",
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "claim.name": "preferred_username",
+ "jsonType.label": "String"
+ }
+ }
+ ],
+ "useTemplateConfig": false,
+ "useTemplateScope": false,
+ "useTemplateMappers": false
+ },
+ {
+ "id": "8891d8e9-35e6-4a1c-b32b-027be03b0f24",
+ "clientId": "admin-cli",
+ "name": "${client_admin-cli}",
+ "surrogateAuthRequired": false,
+ "enabled": true,
+ "clientAuthenticatorType": "client-secret",
+ "secret": "",
+ "redirectUris": [],
+ "webOrigins": [],
+ "notBefore": 0,
+ "bearerOnly": false,
+ "consentRequired": false,
+ "standardFlowEnabled": false,
+ "implicitFlowEnabled": false,
+ "directAccessGrantsEnabled": true,
+ "serviceAccountsEnabled": false,
+ "publicClient": true,
+ "frontchannelLogout": false,
+ "protocol": "openid-connect",
+ "attributes": {},
+ "fullScopeAllowed": false,
+ "nodeReRegistrationTimeout": 0,
+ "protocolMappers": [
+ {
+ "id": "32d6a3a4-8635-4a36-bd14-8ac5b73a49cc",
+ "name": "full name",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-full-name-mapper",
+ "consentRequired": true,
+ "consentText": "${fullName}",
+ "config": {
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "userinfo.token.claim": "true"
+ }
+ },
+ {
+ "id": "900fa741-d1b2-467e-88a6-b454a9519568",
+ "name": "given name",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-usermodel-property-mapper",
+ "consentRequired": true,
+ "consentText": "${givenName}",
+ "config": {
+ "userinfo.token.claim": "true",
+ "user.attribute": "firstName",
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "claim.name": "given_name",
+ "jsonType.label": "String"
+ }
+ },
+ {
+ "id": "8ea14714-d160-49b8-b612-59102d50ef53",
+ "name": "family name",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-usermodel-property-mapper",
+ "consentRequired": true,
+ "consentText": "${familyName}",
+ "config": {
+ "userinfo.token.claim": "true",
+ "user.attribute": "lastName",
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "claim.name": "family_name",
+ "jsonType.label": "String"
+ }
+ },
+ {
+ "id": "bd167b99-5d23-49c1-90c7-85c2b088fed7",
+ "name": "role list",
+ "protocol": "saml",
+ "protocolMapper": "saml-role-list-mapper",
+ "consentRequired": false,
+ "config": {
+ "single": "false",
+ "attribute.nameformat": "Basic",
+ "attribute.name": "Role"
+ }
+ },
+ {
+ "id": "c4fe56a1-8d15-455a-b87b-cf051454b57c",
+ "name": "username",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-usermodel-property-mapper",
+ "consentRequired": true,
+ "consentText": "${username}",
+ "config": {
+ "userinfo.token.claim": "true",
+ "user.attribute": "username",
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "claim.name": "preferred_username",
+ "jsonType.label": "String"
+ }
+ },
+ {
+ "id": "26e3bf4c-8f9a-4548-b0db-5bbb7c398991",
+ "name": "email",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-usermodel-property-mapper",
+ "consentRequired": true,
+ "consentText": "${email}",
+ "config": {
+ "userinfo.token.claim": "true",
+ "user.attribute": "email",
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "claim.name": "email",
+ "jsonType.label": "String"
+ }
+ }
+ ],
+ "useTemplateConfig": false,
+ "useTemplateScope": false,
+ "useTemplateMappers": false
+ },
+ {
+ "id": "c3950efa-6684-44c2-b50a-c7b3d16df04b",
+ "clientId": "broker",
+ "name": "${client_broker}",
+ "surrogateAuthRequired": false,
+ "enabled": true,
+ "clientAuthenticatorType": "client-secret",
+ "secret": "",
+ "redirectUris": [],
+ "webOrigins": [],
+ "notBefore": 0,
+ "bearerOnly": false,
+ "consentRequired": false,
+ "standardFlowEnabled": true,
+ "implicitFlowEnabled": false,
+ "directAccessGrantsEnabled": false,
+ "serviceAccountsEnabled": false,
+ "publicClient": false,
+ "frontchannelLogout": false,
+ "protocol": "openid-connect",
+ "attributes": {},
+ "fullScopeAllowed": false,
+ "nodeReRegistrationTimeout": 0,
+ "protocolMappers": [
+ {
+ "id": "54c3bbc3-850b-4636-82d1-ed4f3a46a00a",
+ "name": "username",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-usermodel-property-mapper",
+ "consentRequired": true,
+ "consentText": "${username}",
+ "config": {
+ "userinfo.token.claim": "true",
+ "user.attribute": "username",
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "claim.name": "preferred_username",
+ "jsonType.label": "String"
+ }
+ },
+ {
+ "id": "0f0d9b74-c476-4981-a783-dd4bdbe041ec",
+ "name": "role list",
+ "protocol": "saml",
+ "protocolMapper": "saml-role-list-mapper",
+ "consentRequired": false,
+ "config": {
+ "single": "false",
+ "attribute.nameformat": "Basic",
+ "attribute.name": "Role"
+ }
+ },
+ {
+ "id": "d6f625cc-eac1-49d0-bea5-17e6f9d3860c",
+ "name": "given name",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-usermodel-property-mapper",
+ "consentRequired": true,
+ "consentText": "${givenName}",
+ "config": {
+ "userinfo.token.claim": "true",
+ "user.attribute": "firstName",
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "claim.name": "given_name",
+ "jsonType.label": "String"
+ }
+ },
+ {
+ "id": "bbf35056-9bbe-49a0-aefc-2bde2379ccdc",
+ "name": "family name",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-usermodel-property-mapper",
+ "consentRequired": true,
+ "consentText": "${familyName}",
+ "config": {
+ "userinfo.token.claim": "true",
+ "user.attribute": "lastName",
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "claim.name": "family_name",
+ "jsonType.label": "String"
+ }
+ },
+ {
+ "id": "38b04951-1043-4dc6-9504-7b0f31ed71a4",
+ "name": "email",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-usermodel-property-mapper",
+ "consentRequired": true,
+ "consentText": "${email}",
+ "config": {
+ "userinfo.token.claim": "true",
+ "user.attribute": "email",
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "claim.name": "email",
+ "jsonType.label": "String"
+ }
+ },
+ {
+ "id": "88bb836b-7feb-45eb-b004-fb3be8436908",
+ "name": "full name",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-full-name-mapper",
+ "consentRequired": true,
+ "consentText": "${fullName}",
+ "config": {
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "userinfo.token.claim": "true"
+ }
+ }
+ ],
+ "useTemplateConfig": false,
+ "useTemplateScope": false,
+ "useTemplateMappers": false
+ },
+ {
+ "id": "b2f45201-1362-4b10-83c3-207d470f44bf",
+ "clientId": "realm-management",
+ "name": "${client_realm-management}",
+ "surrogateAuthRequired": false,
+ "enabled": true,
+ "clientAuthenticatorType": "client-secret",
+ "secret": "",
+ "redirectUris": [],
+ "webOrigins": [],
+ "notBefore": 0,
+ "bearerOnly": true,
+ "consentRequired": false,
+ "standardFlowEnabled": true,
+ "implicitFlowEnabled": false,
+ "directAccessGrantsEnabled": false,
+ "serviceAccountsEnabled": false,
+ "publicClient": false,
+ "frontchannelLogout": false,
+ "protocol": "openid-connect",
+ "attributes": {},
+ "fullScopeAllowed": false,
+ "nodeReRegistrationTimeout": 0,
+ "protocolMappers": [
+ {
+ "id": "71605238-bf41-400e-8c03-a5d78f54b00b",
+ "name": "email",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-usermodel-property-mapper",
+ "consentRequired": true,
+ "consentText": "${email}",
+ "config": {
+ "userinfo.token.claim": "true",
+ "user.attribute": "email",
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "claim.name": "email",
+ "jsonType.label": "String"
+ }
+ },
+ {
+ "id": "a0cb6f3a-30ef-4475-b73f-ca6c2f1f3675",
+ "name": "given name",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-usermodel-property-mapper",
+ "consentRequired": true,
+ "consentText": "${givenName}",
+ "config": {
+ "userinfo.token.claim": "true",
+ "user.attribute": "firstName",
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "claim.name": "given_name",
+ "jsonType.label": "String"
+ }
+ },
+ {
+ "id": "3a7708b1-63b9-4116-af7f-969fc1bf61a4",
+ "name": "role list",
+ "protocol": "saml",
+ "protocolMapper": "saml-role-list-mapper",
+ "consentRequired": false,
+ "config": {
+ "single": "false",
+ "attribute.nameformat": "Basic",
+ "attribute.name": "Role"
+ }
+ },
+ {
+ "id": "c393d7b7-fa22-4e90-9ad7-07d520632c20",
+ "name": "username",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-usermodel-property-mapper",
+ "consentRequired": true,
+ "consentText": "${username}",
+ "config": {
+ "userinfo.token.claim": "true",
+ "user.attribute": "username",
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "claim.name": "preferred_username",
+ "jsonType.label": "String"
+ }
+ },
+ {
+ "id": "2d8cbac4-e4dd-4fa6-bf71-98adf826b9dd",
+ "name": "family name",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-usermodel-property-mapper",
+ "consentRequired": true,
+ "consentText": "${familyName}",
+ "config": {
+ "userinfo.token.claim": "true",
+ "user.attribute": "lastName",
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "claim.name": "family_name",
+ "jsonType.label": "String"
+ }
+ },
+ {
+ "id": "e77aae69-8ea4-4ee4-bcd6-ba7ef3958c02",
+ "name": "full name",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-full-name-mapper",
+ "consentRequired": true,
+ "consentText": "${fullName}",
+ "config": {
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "userinfo.token.claim": "true"
+ }
+ }
+ ],
+ "useTemplateConfig": false,
+ "useTemplateScope": false,
+ "useTemplateMappers": false
+ },
+ {
+ "id": "8c12290d-d62f-48ce-913b-c93bf995ca59",
+ "clientId": "portal",
+ "rootUrl": "",
+ "adminUrl": "/callback",
+ "baseUrl": "/",
+ "surrogateAuthRequired": false,
+ "enabled": true,
+ "clientAuthenticatorType": "client-secret",
+ "secret": "",
+ "redirectUris": [
+ ],
+ "webOrigins": [
+ ""
+ ],
+ "notBefore": 0,
+ "bearerOnly": false,
+ "consentRequired": false,
+ "standardFlowEnabled": true,
+ "implicitFlowEnabled": false,
+ "directAccessGrantsEnabled": false,
+ "serviceAccountsEnabled": false,
+ "publicClient": true,
+ "frontchannelLogout": false,
+ "protocol": "openid-connect",
+ "attributes": {
+ "saml.assertion.signature": "false",
+ "saml.force.post.binding": "false",
+ "saml.multivalued.roles": "false",
+ "saml.encrypt": "false",
+ "saml_force_name_id_format": "false",
+ "saml.client.signature": "false",
+ "saml.authnstatement": "false",
+ "saml.server.signature": "false",
+ "saml.server.signature.keyinfo.ext": "false",
+ "saml.onetimeuse.condition": "false"
+ },
+ "fullScopeAllowed": true,
+ "nodeReRegistrationTimeout": -1,
+ "protocolMappers": [
+ {
+ "id": "63071ff2-a5e5-4d38-b534-a9f25a075403",
+ "name": "full name",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-full-name-mapper",
+ "consentRequired": true,
+ "consentText": "${fullName}",
+ "config": {
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "userinfo.token.claim": "true"
+ }
+ },
+ {
+ "id": "9bf9cad5-dbce-41e9-aa36-d84cc5a768a2",
+ "name": "username",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-usermodel-property-mapper",
+ "consentRequired": true,
+ "consentText": "${username}",
+ "config": {
+ "userinfo.token.claim": "true",
+ "user.attribute": "username",
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "claim.name": "preferred_username",
+ "jsonType.label": "String"
+ }
+ },
+ {
+ "id": "238e55b7-6545-467e-856b-f95477afe1ff",
+ "name": "role list",
+ "protocol": "saml",
+ "protocolMapper": "saml-role-list-mapper",
+ "consentRequired": false,
+ "config": {
+ "single": "false",
+ "attribute.nameformat": "Basic",
+ "attribute.name": "Role"
+ }
+ },
+ {
+ "id": "edb1ff4e-b452-46bc-8c3b-d6075f6ee579",
+ "name": "family name",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-usermodel-property-mapper",
+ "consentRequired": true,
+ "consentText": "${familyName}",
+ "config": {
+ "userinfo.token.claim": "true",
+ "user.attribute": "lastName",
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "claim.name": "family_name",
+ "jsonType.label": "String"
+ }
+ },
+ {
+ "id": "7a0118e2-57ff-4d23-bf74-cbfe1f545d1d",
+ "name": "given name",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-usermodel-property-mapper",
+ "consentRequired": true,
+ "consentText": "${givenName}",
+ "config": {
+ "userinfo.token.claim": "true",
+ "user.attribute": "firstName",
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "claim.name": "given_name",
+ "jsonType.label": "String"
+ }
+ },
+ {
+ "id": "b59a913e-118a-4dc4-a8d7-66c44ced5345",
+ "name": "email",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-usermodel-property-mapper",
+ "consentRequired": true,
+ "consentText": "${email}",
+ "config": {
+ "userinfo.token.claim": "true",
+ "user.attribute": "email",
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "claim.name": "email",
+ "jsonType.label": "String"
+ }
+ }
+ ],
+ "useTemplateConfig": false,
+ "useTemplateScope": false,
+ "useTemplateMappers": false
+ },
+ {
+ "id": "79c518d7-b41a-4e6f-be42-4ef365824100",
+ "clientId": "security-admin-console",
+ "name": "${client_security-admin-console}",
+ "baseUrl": "/auth/admin/sunbird/console/index.html",
+ "surrogateAuthRequired": false,
+ "enabled": true,
+ "clientAuthenticatorType": "client-secret",
+ "secret": "",
+ "redirectUris": [
+ "/auth/admin/sunbird/console/*"
+ ],
+ "webOrigins": [],
+ "notBefore": 0,
+ "bearerOnly": false,
+ "consentRequired": false,
+ "standardFlowEnabled": true,
+ "implicitFlowEnabled": false,
+ "directAccessGrantsEnabled": false,
+ "serviceAccountsEnabled": false,
+ "publicClient": true,
+ "frontchannelLogout": false,
+ "protocol": "openid-connect",
+ "attributes": {},
+ "fullScopeAllowed": false,
+ "nodeReRegistrationTimeout": 0,
+ "protocolMappers": [
+ {
+ "id": "c989a8c8-cb8b-40ff-b4b9-86122bad7aa9",
+ "name": "role list",
+ "protocol": "saml",
+ "protocolMapper": "saml-role-list-mapper",
+ "consentRequired": false,
+ "config": {
+ "single": "false",
+ "attribute.nameformat": "Basic",
+ "attribute.name": "Role"
+ }
+ },
+ {
+ "id": "b180fb8c-997c-4f6a-b774-af677f903139",
+ "name": "family name",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-usermodel-property-mapper",
+ "consentRequired": true,
+ "consentText": "${familyName}",
+ "config": {
+ "userinfo.token.claim": "true",
+ "user.attribute": "lastName",
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "claim.name": "family_name",
+ "jsonType.label": "String"
+ }
+ },
+ {
+ "id": "c373dc9a-49d7-4d28-9b94-06cf20fb1955",
+ "name": "full name",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-full-name-mapper",
+ "consentRequired": true,
+ "consentText": "${fullName}",
+ "config": {
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "userinfo.token.claim": "true"
+ }
+ },
+ {
+ "id": "24c7b1c4-62c2-4d92-ab19-49bfaedcc3d4",
+ "name": "email",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-usermodel-property-mapper",
+ "consentRequired": true,
+ "consentText": "${email}",
+ "config": {
+ "userinfo.token.claim": "true",
+ "user.attribute": "email",
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "claim.name": "email",
+ "jsonType.label": "String"
+ }
+ },
+ {
+ "id": "883a39a7-37b4-46ef-a761-3e51b95ccc35",
+ "name": "given name",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-usermodel-property-mapper",
+ "consentRequired": true,
+ "consentText": "${givenName}",
+ "config": {
+ "userinfo.token.claim": "true",
+ "user.attribute": "firstName",
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "claim.name": "given_name",
+ "jsonType.label": "String"
+ }
+ },
+ {
+ "id": "95ed8e44-38cc-4f09-8adc-19c12d5eada0",
+ "name": "locale",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-usermodel-attribute-mapper",
+ "consentRequired": false,
+ "consentText": "${locale}",
+ "config": {
+ "userinfo.token.claim": "true",
+ "user.attribute": "locale",
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "claim.name": "locale",
+ "jsonType.label": "String"
+ }
+ },
+ {
+ "id": "c66c6a41-eb22-443f-8a77-e68d404ad26f",
+ "name": "username",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-usermodel-property-mapper",
+ "consentRequired": true,
+ "consentText": "${username}",
+ "config": {
+ "userinfo.token.claim": "true",
+ "user.attribute": "username",
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "claim.name": "preferred_username",
+ "jsonType.label": "String"
+ }
+ }
+ ],
+ "useTemplateConfig": false,
+ "useTemplateScope": false,
+ "useTemplateMappers": false
+ },
+ {
+ "id": "c2d24d3f-65ca-46de-9cd8-3eeb71a7f83d",
+ "clientId": "account",
+ "name": "${client_account}",
+ "baseUrl": "/auth/realms/sunbird/account",
+ "surrogateAuthRequired": false,
+ "enabled": true,
+ "clientAuthenticatorType": "client-secret",
+ "secret": "",
+ "defaultRoles": [
+ "manage-account",
+ "view-profile"
+ ],
+ "redirectUris": [
+ "/auth/realms/sunbird/account/*"
+ ],
+ "webOrigins": [],
+ "notBefore": 0,
+ "bearerOnly": false,
+ "consentRequired": false,
+ "standardFlowEnabled": true,
+ "implicitFlowEnabled": false,
+ "directAccessGrantsEnabled": false,
+ "serviceAccountsEnabled": false,
+ "publicClient": false,
+ "frontchannelLogout": false,
+ "protocol": "openid-connect",
+ "attributes": {},
+ "fullScopeAllowed": false,
+ "nodeReRegistrationTimeout": 0,
+ "protocolMappers": [
+ {
+ "id": "a64118ab-33c8-4060-9f3e-3ed817ba8e0d",
+ "name": "role list",
+ "protocol": "saml",
+ "protocolMapper": "saml-role-list-mapper",
+ "consentRequired": false,
+ "config": {
+ "single": "false",
+ "attribute.nameformat": "Basic",
+ "attribute.name": "Role"
+ }
+ },
+ {
+ "id": "1f4a0c5e-7c8a-4693-8be5-14681b243868",
+ "name": "username",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-usermodel-property-mapper",
+ "consentRequired": true,
+ "consentText": "${username}",
+ "config": {
+ "userinfo.token.claim": "true",
+ "user.attribute": "username",
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "claim.name": "preferred_username",
+ "jsonType.label": "String"
+ }
+ },
+ {
+ "id": "8d88a133-a399-4e75-b051-5b0d4ae850ab",
+ "name": "full name",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-full-name-mapper",
+ "consentRequired": true,
+ "consentText": "${fullName}",
+ "config": {
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "userinfo.token.claim": "true"
+ }
+ },
+ {
+ "id": "45593258-916c-4158-8577-d9806c16415a",
+ "name": "email",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-usermodel-property-mapper",
+ "consentRequired": true,
+ "consentText": "${email}",
+ "config": {
+ "userinfo.token.claim": "true",
+ "user.attribute": "email",
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "claim.name": "email",
+ "jsonType.label": "String"
+ }
+ },
+ {
+ "id": "027be48e-b7dc-4c3a-a648-414a466b67dd",
+ "name": "family name",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-usermodel-property-mapper",
+ "consentRequired": true,
+ "consentText": "${familyName}",
+ "config": {
+ "userinfo.token.claim": "true",
+ "user.attribute": "lastName",
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "claim.name": "family_name",
+ "jsonType.label": "String"
+ }
+ },
+ {
+ "id": "c93937f9-0446-4be9-8b47-3c6de857497e",
+ "name": "given name",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-usermodel-property-mapper",
+ "consentRequired": true,
+ "consentText": "${givenName}",
+ "config": {
+ "userinfo.token.claim": "true",
+ "user.attribute": "firstName",
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "claim.name": "given_name",
+ "jsonType.label": "String"
+ }
+ }
+ ],
+ "useTemplateConfig": false,
+ "useTemplateScope": false,
+ "useTemplateMappers": false
+ }
+ ],
+ "clientTemplates": [],
+ "browserSecurityHeaders": {
+ "xContentTypeOptions": "nosniff",
+ "xRobotsTag": "none",
+ "xFrameOptions": "SAMEORIGIN",
+ "xXSSProtection": "1; mode=block",
+ "contentSecurityPolicy": "frame-src 'self'"
+ },
+ "smtpServer": {
+ "password": "",
+ "starttls": "",
+ "auth": "true",
+ "port": "587",
+ "host": "",
+ "from": "",
+ "ssl": "",
+ "user": ""
+ },
+ "loginTheme": "sunrise",
+ "eventsEnabled": false,
+ "eventsListeners": [
+ "jboss-logging"
+ ],
+ "enabledEventTypes": [],
+ "adminEventsEnabled": false,
+ "adminEventsDetailsEnabled": false,
+ "components": {
+ "org.keycloak.services.clientregistration.policy.ClientRegistrationPolicy": [
+ {
+ "id": "84078bbb-e005-44c8-9c7d-a1b4821558da",
+ "name": "Max Clients Limit",
+ "providerId": "max-clients",
+ "subType": "anonymous",
+ "subComponents": {},
+ "config": {
+ "max-clients": [
+ "200"
+ ]
+ }
+ },
+ {
+ "id": "346d857e-4385-4f8f-a2fc-072fd11a10ec",
+ "name": "Allowed Protocol Mapper Types",
+ "providerId": "allowed-protocol-mappers",
+ "subType": "authenticated",
+ "subComponents": {},
+ "config": {
+ "allowed-protocol-mapper-types": [
+ "saml-user-attribute-mapper",
+ "oidc-usermodel-attribute-mapper",
+ "oidc-usermodel-property-mapper",
+ "saml-role-list-mapper",
+ "saml-user-property-mapper",
+ "oidc-full-name-mapper",
+ "oidc-address-mapper",
+ "oidc-sha256-pairwise-sub-mapper"
+ ],
+ "consent-required-for-all-mappers": [
+ "true"
+ ]
+ }
+ },
+ {
+ "id": "eed64f9f-4b66-45ad-bdb4-4070e3802366",
+ "name": "Allowed Client Templates",
+ "providerId": "allowed-client-templates",
+ "subType": "authenticated",
+ "subComponents": {},
+ "config": {}
+ },
+ {
+ "id": "17ac4eaa-9139-4b3a-b1db-c82d44c1531d",
+ "name": "Allowed Client Templates",
+ "providerId": "allowed-client-templates",
+ "subType": "anonymous",
+ "subComponents": {},
+ "config": {}
+ },
+ {
+ "id": "38532936-be91-40e4-b65d-c0abfaf9547c",
+ "name": "Full Scope Disabled",
+ "providerId": "scope",
+ "subType": "anonymous",
+ "subComponents": {},
+ "config": {}
+ },
+ {
+ "id": "8c1690a2-6eea-4d61-ab66-7a015e3bea3c",
+ "name": "Allowed Protocol Mapper Types",
+ "providerId": "allowed-protocol-mappers",
+ "subType": "anonymous",
+ "subComponents": {},
+ "config": {
+ "allowed-protocol-mapper-types": [
+ "oidc-usermodel-property-mapper",
+ "saml-user-property-mapper",
+ "oidc-full-name-mapper",
+ "oidc-sha256-pairwise-sub-mapper",
+ "oidc-address-mapper",
+ "oidc-usermodel-attribute-mapper",
+ "saml-role-list-mapper",
+ "saml-user-attribute-mapper"
+ ],
+ "consent-required-for-all-mappers": [
+ "true"
+ ]
+ }
+ },
+ {
+ "id": "3dcc314c-07f8-484d-9535-29424dbaddfc",
+ "name": "Trusted Hosts",
+ "providerId": "trusted-hosts",
+ "subType": "anonymous",
+ "subComponents": {},
+ "config": {
+ "host-sending-registration-request-must-match": [
+ "true"
+ ],
+ "client-uris-must-match": [
+ "true"
+ ]
+ }
+ },
+ {
+ "id": "ab52b781-64b9-42a0-99f5-cbeba6710763",
+ "name": "Consent Required",
+ "providerId": "consent-required",
+ "subType": "anonymous",
+ "subComponents": {},
+ "config": {}
+ }
+ ],
+ "org.keycloak.keys.KeyProvider": [
+ {
+ "id": "bd30c46f-9ee3-443d-9faa-6ed8075aac87",
+ "name": "rsa-generated",
+ "providerId": "rsa-generated",
+ "subComponents": {},
+ "config": {
+ "priority": [
+ "100"
+ ]
+ }
+ },
+ {
+ "id": "a93cc73f-b070-48cd-bf08-9b290707c2f5",
+ "name": "hmac-generated",
+ "providerId": "hmac-generated",
+ "subComponents": {},
+ "config": {
+ "priority": [
+ "100"
+ ]
+ }
+ }
+ ]
+ },
+ "internationalizationEnabled": true,
+ "supportedLocales": [
+ "de",
+ "no",
+ "ru",
+ "sv",
+ "pt-BR",
+ "ja",
+ "lt",
+ "en",
+ "it",
+ "fr",
+ "es",
+ "ca"
+ ],
+ "defaultLocale": "en",
+ "authenticationFlows": [
+ {
+ "id": "6c9d3423-9956-4d08-a124-41cd17aceb5a",
+ "alias": "Direct Grant 2",
+ "description": "OpenID Connect Resource Owner Grant",
+ "providerId": "basic-flow",
+ "topLevel": true,
+ "builtIn": false,
+ "authenticationExecutions": [
+ {
+ "authenticator": "direct-grant-validate-username",
+ "requirement": "REQUIRED",
+ "priority": 10,
+ "userSetupAllowed": false,
+ "autheticatorFlow": false
+ },
+ {
+ "authenticator": "direct-grant-validate-password",
+ "requirement": "DISABLED",
+ "priority": 20,
+ "userSetupAllowed": false,
+ "autheticatorFlow": false
+ },
+ {
+ "authenticator": "direct-grant-validate-otp",
+ "requirement": "OPTIONAL",
+ "priority": 30,
+ "userSetupAllowed": false,
+ "autheticatorFlow": false
+ }
+ ]
+ },
+ {
+ "id": "a7a49eb1-4386-499a-8a8f-13454b428f98",
+ "alias": "Direct Grant w/o Password",
+ "description": "Grant user access using only the username and no password.",
+ "providerId": "basic-flow",
+ "topLevel": true,
+ "builtIn": false,
+ "authenticationExecutions": []
+ },
+ {
+ "id": "c7b2f9c2-525b-486a-b2a8-148606caac0e",
+ "alias": "Handle Existing Account",
+ "description": "Handle what to do if there is existing account with same email/username like authenticated identity provider",
+ "providerId": "basic-flow",
+ "topLevel": false,
+ "builtIn": true,
+ "authenticationExecutions": [
+ {
+ "authenticator": "idp-confirm-link",
+ "requirement": "REQUIRED",
+ "priority": 10,
+ "userSetupAllowed": false,
+ "autheticatorFlow": false
+ },
+ {
+ "authenticator": "idp-email-verification",
+ "requirement": "ALTERNATIVE",
+ "priority": 20,
+ "userSetupAllowed": false,
+ "autheticatorFlow": false
+ },
+ {
+ "requirement": "ALTERNATIVE",
+ "priority": 30,
+ "flowAlias": "Verify Existing Account by Re-authentication",
+ "userSetupAllowed": false,
+ "autheticatorFlow": true
+ }
+ ]
+ },
+ {
+ "id": "c4674fef-8631-43c5-8f44-deb8867fa866",
+ "alias": "Verify Existing Account by Re-authentication",
+ "description": "Reauthentication of existing account",
+ "providerId": "basic-flow",
+ "topLevel": false,
+ "builtIn": true,
+ "authenticationExecutions": [
+ {
+ "authenticator": "idp-username-password-form",
+ "requirement": "REQUIRED",
+ "priority": 10,
+ "userSetupAllowed": false,
+ "autheticatorFlow": false
+ },
+ {
+ "authenticator": "auth-otp-form",
+ "requirement": "OPTIONAL",
+ "priority": 20,
+ "userSetupAllowed": false,
+ "autheticatorFlow": false
+ }
+ ]
+ },
+ {
+ "id": "35016b3a-a041-47fd-8a85-a131c6f7b745",
+ "alias": "browser",
+ "description": "browser based authentication",
+ "providerId": "basic-flow",
+ "topLevel": true,
+ "builtIn": true,
+ "authenticationExecutions": [
+ {
+ "authenticator": "auth-cookie",
+ "requirement": "ALTERNATIVE",
+ "priority": 10,
+ "userSetupAllowed": false,
+ "autheticatorFlow": false
+ },
+ {
+ "authenticator": "auth-spnego",
+ "requirement": "DISABLED",
+ "priority": 20,
+ "userSetupAllowed": false,
+ "autheticatorFlow": false
+ },
+ {
+ "authenticator": "identity-provider-redirector",
+ "requirement": "ALTERNATIVE",
+ "priority": 25,
+ "userSetupAllowed": false,
+ "autheticatorFlow": false
+ },
+ {
+ "requirement": "ALTERNATIVE",
+ "priority": 30,
+ "flowAlias": "forms",
+ "userSetupAllowed": false,
+ "autheticatorFlow": true
+ }
+ ]
+ },
+ {
+ "id": "8e85927e-349d-4a0a-a7da-efb352ba78ce",
+ "alias": "clients",
+ "description": "Base authentication for clients",
+ "providerId": "client-flow",
+ "topLevel": true,
+ "builtIn": true,
+ "authenticationExecutions": [
+ {
+ "authenticator": "client-secret",
+ "requirement": "ALTERNATIVE",
+ "priority": 10,
+ "userSetupAllowed": false,
+ "autheticatorFlow": false
+ },
+ {
+ "authenticator": "client-jwt",
+ "requirement": "ALTERNATIVE",
+ "priority": 20,
+ "userSetupAllowed": false,
+ "autheticatorFlow": false
+ }
+ ]
+ },
+ {
+ "id": "b62ac783-8af6-429e-a8ff-7c8073195675",
+ "alias": "direct grant",
+ "description": "OpenID Connect Resource Owner Grant",
+ "providerId": "basic-flow",
+ "topLevel": true,
+ "builtIn": true,
+ "authenticationExecutions": [
+ {
+ "authenticator": "direct-grant-validate-username",
+ "requirement": "REQUIRED",
+ "priority": 10,
+ "userSetupAllowed": false,
+ "autheticatorFlow": false
+ },
+ {
+ "authenticator": "direct-grant-validate-password",
+ "requirement": "DISABLED",
+ "priority": 20,
+ "userSetupAllowed": false,
+ "autheticatorFlow": false
+ },
+ {
+ "authenticator": "direct-grant-validate-otp",
+ "requirement": "OPTIONAL",
+ "priority": 30,
+ "userSetupAllowed": false,
+ "autheticatorFlow": false
+ }
+ ]
+ },
+ {
+ "id": "e16e69c8-a3e8-480c-8201-8474d614e172",
+ "alias": "docker auth",
+ "description": "Used by Docker clients to authenticate against the IDP",
+ "providerId": "basic-flow",
+ "topLevel": true,
+ "builtIn": true,
+ "authenticationExecutions": [
+ {
+ "authenticator": "docker-http-basic-authenticator",
+ "requirement": "REQUIRED",
+ "priority": 10,
+ "userSetupAllowed": false,
+ "autheticatorFlow": false
+ }
+ ]
+ },
+ {
+ "id": "487ab3f9-33bf-49e2-8b03-5c45c85ea8b5",
+ "alias": "first broker login",
+ "description": "Actions taken after first broker login with identity provider account, which is not yet linked to any Keycloak account",
+ "providerId": "basic-flow",
+ "topLevel": true,
+ "builtIn": true,
+ "authenticationExecutions": [
+ {
+ "authenticatorConfig": "review profile config",
+ "authenticator": "idp-review-profile",
+ "requirement": "REQUIRED",
+ "priority": 10,
+ "userSetupAllowed": false,
+ "autheticatorFlow": false
+ },
+ {
+ "authenticatorConfig": "create unique user config",
+ "authenticator": "idp-create-user-if-unique",
+ "requirement": "ALTERNATIVE",
+ "priority": 20,
+ "userSetupAllowed": false,
+ "autheticatorFlow": false
+ },
+ {
+ "requirement": "ALTERNATIVE",
+ "priority": 30,
+ "flowAlias": "Handle Existing Account",
+ "userSetupAllowed": false,
+ "autheticatorFlow": true
+ }
+ ]
+ },
+ {
+ "id": "a6d19ee2-387a-4db8-9ecb-2e9f806a88a1",
+ "alias": "forms",
+ "description": "Username, password, otp and other auth forms.",
+ "providerId": "basic-flow",
+ "topLevel": false,
+ "builtIn": true,
+ "authenticationExecutions": [
+ {
+ "authenticator": "auth-username-password-form",
+ "requirement": "REQUIRED",
+ "priority": 10,
+ "userSetupAllowed": false,
+ "autheticatorFlow": false
+ },
+ {
+ "authenticator": "auth-otp-form",
+ "requirement": "OPTIONAL",
+ "priority": 20,
+ "userSetupAllowed": false,
+ "autheticatorFlow": false
+ }
+ ]
+ },
+ {
+ "id": "43fc7877-ad15-4c93-b327-15d4ca83f3e1",
+ "alias": "registration",
+ "description": "registration flow",
+ "providerId": "basic-flow",
+ "topLevel": true,
+ "builtIn": true,
+ "authenticationExecutions": [
+ {
+ "authenticator": "registration-page-form",
+ "requirement": "REQUIRED",
+ "priority": 10,
+ "flowAlias": "registration form",
+ "userSetupAllowed": false,
+ "autheticatorFlow": true
+ }
+ ]
+ },
+ {
+ "id": "8a77377f-60eb-4a23-8bfe-b7c360d7b48f",
+ "alias": "registration form",
+ "description": "registration form",
+ "providerId": "form-flow",
+ "topLevel": false,
+ "builtIn": true,
+ "authenticationExecutions": [
+ {
+ "authenticator": "registration-user-creation",
+ "requirement": "REQUIRED",
+ "priority": 20,
+ "userSetupAllowed": false,
+ "autheticatorFlow": false
+ },
+ {
+ "authenticator": "registration-profile-action",
+ "requirement": "REQUIRED",
+ "priority": 40,
+ "userSetupAllowed": false,
+ "autheticatorFlow": false
+ },
+ {
+ "authenticator": "registration-password-action",
+ "requirement": "REQUIRED",
+ "priority": 50,
+ "userSetupAllowed": false,
+ "autheticatorFlow": false
+ },
+ {
+ "authenticator": "registration-recaptcha-action",
+ "requirement": "DISABLED",
+ "priority": 60,
+ "userSetupAllowed": false,
+ "autheticatorFlow": false
+ }
+ ]
+ },
+ {
+ "id": "30bd3dd1-f2f1-4708-a07d-08cf759c7b28",
+ "alias": "reset credentials",
+ "description": "Reset credentials for a user if they forgot their password or something",
+ "providerId": "basic-flow",
+ "topLevel": true,
+ "builtIn": true,
+ "authenticationExecutions": [
+ {
+ "authenticator": "reset-credentials-choose-user",
+ "requirement": "REQUIRED",
+ "priority": 10,
+ "userSetupAllowed": false,
+ "autheticatorFlow": false
+ },
+ {
+ "authenticator": "reset-credential-email",
+ "requirement": "REQUIRED",
+ "priority": 20,
+ "userSetupAllowed": false,
+ "autheticatorFlow": false
+ },
+ {
+ "authenticator": "reset-password",
+ "requirement": "REQUIRED",
+ "priority": 30,
+ "userSetupAllowed": false,
+ "autheticatorFlow": false
+ },
+ {
+ "authenticator": "reset-otp",
+ "requirement": "OPTIONAL",
+ "priority": 40,
+ "userSetupAllowed": false,
+ "autheticatorFlow": false
+ }
+ ]
+ },
+ {
+ "id": "226a50b1-059a-44ef-8cfe-082dee5d60b9",
+ "alias": "saml ecp",
+ "description": "SAML ECP Profile Authentication Flow",
+ "providerId": "basic-flow",
+ "topLevel": true,
+ "builtIn": true,
+ "authenticationExecutions": [
+ {
+ "authenticator": "http-basic-authenticator",
+ "requirement": "REQUIRED",
+ "priority": 10,
+ "userSetupAllowed": false,
+ "autheticatorFlow": false
+ }
+ ]
+ }
+ ],
+ "authenticatorConfig": [
+ {
+ "id": "aec72381-3c1d-4a96-b436-ddb72b3737b9",
+ "alias": "create unique user config",
+ "config": {
+ "require.password.update.after.registration": "false"
+ }
+ },
+ {
+ "id": "51f3fa48-bf74-4df9-9724-c0a9d6fe7c80",
+ "alias": "review profile config",
+ "config": {
+ "update.profile.on.first.login": "missing"
+ }
+ }
+ ],
+ "requiredActions": [
+ {
+ "alias": "CONFIGURE_TOTP",
+ "name": "Configure OTP",
+ "providerId": "CONFIGURE_TOTP",
+ "enabled": true,
+ "defaultAction": false,
+ "config": {}
+ },
+ {
+ "alias": "UPDATE_PASSWORD",
+ "name": "Update Password",
+ "providerId": "UPDATE_PASSWORD",
+ "enabled": true,
+ "defaultAction": false,
+ "config": {}
+ },
+ {
+ "alias": "UPDATE_PROFILE",
+ "name": "Update Profile",
+ "providerId": "UPDATE_PROFILE",
+ "enabled": true,
+ "defaultAction": false,
+ "config": {}
+ },
+ {
+ "alias": "VERIFY_EMAIL",
+ "name": "Verify Email",
+ "providerId": "VERIFY_EMAIL",
+ "enabled": true,
+ "defaultAction": false,
+ "config": {}
+ },
+ {
+ "alias": "terms_and_conditions",
+ "name": "Terms and Conditions",
+ "providerId": "terms_and_conditions",
+ "enabled": true,
+ "defaultAction": false,
+ "config": {}
+ }
+ ],
+ "browserFlow": "browser",
+ "registrationFlow": "registration",
+ "directGrantFlow": "Direct Grant 2",
+ "resetCredentialsFlow": "reset credentials",
+ "clientAuthenticationFlow": "clients",
+ "dockerAuthenticationFlow": "docker auth",
+ "attributes": {
+ "_browser_header.xXSSProtection": "1; mode=block",
+ "_browser_header.xFrameOptions": "SAMEORIGIN",
+ "permanentLockout": "false",
+ "quickLoginCheckMilliSeconds": "1000",
+ "_browser_header.xRobotsTag": "none",
+ "maxFailureWaitSeconds": "900",
+ "minimumQuickLoginWaitSeconds": "60",
+ "failureFactor": "30",
+ "actionTokenGeneratedByUserLifespan": "300",
+ "maxDeltaTimeSeconds": "43200",
+ "_browser_header.xContentTypeOptions": "nosniff",
+ "actionTokenGeneratedByAdminLifespan": "43200",
+ "bruteForceProtected": "false",
+ "_browser_header.contentSecurityPolicy": "frame-src 'self'",
+ "waitIncrementSeconds": "60"
+ },
+ "keycloakVersion": "3.2.0.Final"
+}
diff --git a/ansible/roles/keycloak-deploy-6.0/files/python-keycloak-0.12.0/keycloak/__init__.py b/ansible/roles/keycloak-deploy-6.0/files/python-keycloak-0.12.0/keycloak/__init__.py
new file mode 100644
index 000000000..cf1f95540
--- /dev/null
+++ b/ansible/roles/keycloak-deploy-6.0/files/python-keycloak-0.12.0/keycloak/__init__.py
@@ -0,0 +1,19 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2017 Marcos Pereira
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public License
+# along with this program. If not, see .
+
+from .keycloak_openid import *
+from .keycloak_admin import *
diff --git a/ansible/roles/keycloak-deploy-6.0/files/python-keycloak-0.12.0/keycloak/authorization/__init__.py b/ansible/roles/keycloak-deploy-6.0/files/python-keycloak-0.12.0/keycloak/authorization/__init__.py
new file mode 100644
index 000000000..4a1d86dbe
--- /dev/null
+++ b/ansible/roles/keycloak-deploy-6.0/files/python-keycloak-0.12.0/keycloak/authorization/__init__.py
@@ -0,0 +1,87 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2017 Marcos Pereira
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public License
+# along with this program. If not, see .
+
+import ast
+import json
+
+from .permission import Permission
+from .policy import Policy
+from .role import Role
+
+
+class Authorization:
+ """
+ Keycloak Authorization (policies, roles, scopes and resources).
+
+ https://keycloak.gitbooks.io/documentation/authorization_services/index.html
+
+ """
+
+ def __init__(self):
+ self._policies = {}
+
+ @property
+ def policies(self):
+ return self._policies
+
+ @policies.setter
+ def policies(self, value):
+ self._policies = value
+
+ def load_config(self, data):
+ """
+ Load policies, roles and permissions (scope/resources).
+
+ :param data: keycloak authorization data (dict)
+ :return:
+ """
+ for pol in data['policies']:
+ if pol['type'] == 'role':
+ policy = Policy(name=pol['name'],
+ type=pol['type'],
+ logic=pol['logic'],
+ decision_strategy=pol['decisionStrategy'])
+
+ config_roles = json.loads(pol['config']['roles'])
+ for role in config_roles:
+ policy.add_role(Role(name=role['id'],
+ required=role['required']))
+
+ self.policies[policy.name] = policy
+
+ if pol['type'] == 'scope':
+ permission = Permission(name=pol['name'],
+ type=pol['type'],
+ logic=pol['logic'],
+ decision_strategy=pol['decisionStrategy'])
+
+ permission.scopes = ast.literal_eval(pol['config']['scopes'])
+
+ for policy_name in ast.literal_eval(pol['config']['applyPolicies']):
+ self.policies[policy_name].add_permission(permission)
+
+ if pol['type'] == 'resource':
+ permission = Permission(name=pol['name'],
+ type=pol['type'],
+ logic=pol['logic'],
+ decision_strategy=pol['decisionStrategy'])
+
+ permission.resources = ast.literal_eval(pol['config']['resources'])
+
+ for policy_name in ast.literal_eval(pol['config']['applyPolicies']):
+ self.policies[policy_name].add_permission(permission)
+
diff --git a/ansible/roles/keycloak-deploy-6.0/files/python-keycloak-0.12.0/keycloak/authorization/permission.py b/ansible/roles/keycloak-deploy-6.0/files/python-keycloak-0.12.0/keycloak/authorization/permission.py
new file mode 100644
index 000000000..94eca7795
--- /dev/null
+++ b/ansible/roles/keycloak-deploy-6.0/files/python-keycloak-0.12.0/keycloak/authorization/permission.py
@@ -0,0 +1,98 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2017 Marcos Pereira
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public License
+# along with this program. If not, see .
+
+
+class Permission:
+ """
+ Consider this simple and very common permission:
+
+ A permission associates the object being protected with the policies that must be evaluated to determine whether access is granted.
+
+ X CAN DO Y ON RESOURCE Z
+
+ where …
+ X represents one or more users, roles, or groups, or a combination of them. You can
+ also use claims and context here.
+ Y represents an action to be performed, for example, write, view, and so on.
+ Z represents a protected resource, for example, "/accounts".
+
+ https://keycloak.gitbooks.io/documentation/authorization_services/topics/permission/overview.html
+
+ """
+
+ def __init__(self, name, type, logic, decision_strategy):
+ self._name = name
+ self._type = type
+ self._logic = logic
+ self._decision_strategy = decision_strategy
+ self._resources = []
+ self._scopes = []
+
+ def __repr__(self):
+ return "" % (self.name, self.type)
+
+ def __str__(self):
+ return "Permission: %s (%s)" % (self.name, self.type)
+
+ @property
+ def name(self):
+ return self._name
+
+ @name.setter
+ def name(self, value):
+ self._name = value
+
+ @property
+ def type(self):
+ return self._type
+
+ @type.setter
+ def type(self, value):
+ self._type = value
+
+ @property
+ def logic(self):
+ return self._logic
+
+ @logic.setter
+ def logic(self, value):
+ self._logic = value
+
+ @property
+ def decision_strategy(self):
+ return self._decision_strategy
+
+ @decision_strategy.setter
+ def decision_strategy(self, value):
+ self._decision_strategy = value
+
+ @property
+ def resources(self):
+ return self._resources
+
+ @resources.setter
+ def resources(self, value):
+ self._resources = value
+
+ @property
+ def scopes(self):
+ return self._scopes
+
+ @scopes.setter
+ def scopes(self, value):
+ self._scopes = value
+
diff --git a/ansible/roles/keycloak-deploy-6.0/files/python-keycloak-0.12.0/keycloak/authorization/policy.py b/ansible/roles/keycloak-deploy-6.0/files/python-keycloak-0.12.0/keycloak/authorization/policy.py
new file mode 100644
index 000000000..66512bac3
--- /dev/null
+++ b/ansible/roles/keycloak-deploy-6.0/files/python-keycloak-0.12.0/keycloak/authorization/policy.py
@@ -0,0 +1,107 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2017 Marcos Pereira
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public License
+# along with this program. If not, see .
+
+from ..exceptions import KeycloakAuthorizationConfigError
+
+
+class Policy:
+ """
+ A policy defines the conditions that must be satisfied to grant access to an object.
+ Unlike permissions, you do not specify the object being protected but rather the conditions
+ that must be satisfied for access to a given object (for example, resource, scope, or both).
+ Policies are strongly related to the different access control mechanisms (ACMs) that you can use to
+ protect your resources. With policies, you can implement strategies for attribute-based access control
+ (ABAC), role-based access control (RBAC), context-based access control, or any combination of these.
+
+ https://keycloak.gitbooks.io/documentation/authorization_services/topics/policy/overview.html
+
+ """
+
+ def __init__(self, name, type, logic, decision_strategy):
+ self._name = name
+ self._type = type
+ self._logic = logic
+ self._decision_strategy = decision_strategy
+ self._roles = []
+ self._permissions = []
+
+ def __repr__(self):
+ return "" % (self.name, self.type)
+
+ def __str__(self):
+ return "Policy: %s (%s)" % (self.name, self.type)
+
+ @property
+ def name(self):
+ return self._name
+
+ @name.setter
+ def name(self, value):
+ self._name = value
+
+ @property
+ def type(self):
+ return self._type
+
+ @type.setter
+ def type(self, value):
+ self._type = value
+
+ @property
+ def logic(self):
+ return self._logic
+
+ @logic.setter
+ def logic(self, value):
+ self._logic = value
+
+ @property
+ def decision_strategy(self):
+ return self._decision_strategy
+
+ @decision_strategy.setter
+ def decision_strategy(self, value):
+ self._decision_strategy = value
+
+ @property
+ def roles(self):
+ return self._roles
+
+ @property
+ def permissions(self):
+ return self._permissions
+
+ def add_role(self, role):
+ """
+ Add keycloak role in policy.
+
+ :param role: keycloak role.
+ :return:
+ """
+ if self.type != 'role':
+ raise KeycloakAuthorizationConfigError(
+ "Can't add role. Policy type is different of role")
+ self._roles.append(role)
+
+ def add_permission(self, permission):
+ """
+ Add keycloak permission in policy.
+
+ :param permission: keycloak permission.
+ :return:
+ """
+ self._permissions.append(permission)
diff --git a/ansible/roles/keycloak-deploy-6.0/files/python-keycloak-0.12.0/keycloak/authorization/role.py b/ansible/roles/keycloak-deploy-6.0/files/python-keycloak-0.12.0/keycloak/authorization/role.py
new file mode 100644
index 000000000..8d398b09e
--- /dev/null
+++ b/ansible/roles/keycloak-deploy-6.0/files/python-keycloak-0.12.0/keycloak/authorization/role.py
@@ -0,0 +1,39 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2017 Marcos Pereira
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public License
+# along with this program. If not, see .
+
+
+class Role:
+ """
+ Roles identify a type or category of user. Admin, user,
+ manager, and employee are all typical roles that may exist in an organization.
+
+ https://keycloak.gitbooks.io/documentation/server_admin/topics/roles.html
+
+ """
+
+ def __init__(self, name, required=False):
+ self.name = name
+ self.required = required
+
+ @property
+ def get_name(self):
+ return self.name
+
+ def __eq__(self, other):
+ if isinstance(other, str):
+ return self.name == other
+ return NotImplemented
diff --git a/ansible/roles/keycloak-deploy-6.0/files/python-keycloak-0.12.0/keycloak/connection.py b/ansible/roles/keycloak-deploy-6.0/files/python-keycloak-0.12.0/keycloak/connection.py
new file mode 100644
index 000000000..503b688a7
--- /dev/null
+++ b/ansible/roles/keycloak-deploy-6.0/files/python-keycloak-0.12.0/keycloak/connection.py
@@ -0,0 +1,199 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2017 Marcos Pereira
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public License
+# along with this program. If not, see .
+
+try:
+ from urllib.parse import urljoin
+except ImportError:
+ from urlparse import urljoin
+
+from .exceptions import *
+import requests
+
+
+class ConnectionManager(object):
+ """ Represents a simple server connection.
+ Args:
+ base_url (str): The server URL.
+ headers (dict): The header parameters of the requests to the server.
+ timeout (int): Timeout to use for requests to the server.
+ verify (bool): Verify server SSL.
+ """
+
+ def __init__(self, base_url, headers={}, timeout=60, verify=True):
+ self._base_url = base_url
+ self._headers = headers
+ self._timeout = timeout
+ self._verify = verify
+
+ @property
+ def base_url(self):
+ """ Return base url in use for requests to the server. """
+ return self._base_url
+
+ @base_url.setter
+ def base_url(self, value):
+ """ """
+ self._base_url = value
+
+ @property
+ def timeout(self):
+ """ Return timeout in use for request to the server. """
+ return self._timeout
+
+ @timeout.setter
+ def timeout(self, value):
+ """ """
+ self._timeout = value
+
+ @property
+ def verify(self):
+ """ Return verify in use for request to the server. """
+ return self._verify
+
+ @verify.setter
+ def verify(self, value):
+ """ """
+ self._verify = value
+
+ @property
+ def headers(self):
+ """ Return header request to the server. """
+ return self._headers
+
+ @headers.setter
+ def headers(self, value):
+ """ """
+ self._headers = value
+
+ def param_headers(self, key):
+ """ Return a specific header parameter.
+ :arg
+ key (str): Header parameters key.
+ :return:
+ If the header parameters exist, return its value.
+ """
+ return self.headers.get(key)
+
+ def clean_headers(self):
+ """ Clear header parameters. """
+ self.headers = {}
+
+ def exist_param_headers(self, key):
+ """ Check if the parameter exists in the header.
+ :arg
+ key (str): Header parameters key.
+ :return:
+ If the header parameters exist, return True.
+ """
+ return self.param_headers(key) is not None
+
+ def add_param_headers(self, key, value):
+ """ Add a single parameter inside the header.
+ :arg
+ key (str): Header parameters key.
+ value (str): Value to be added.
+ """
+ self.headers[key] = value
+
+ def del_param_headers(self, key):
+ """ Remove a specific parameter.
+ :arg
+ key (str): Key of the header parameters.
+ """
+ self.headers.pop(key, None)
+
+ def raw_get(self, path, **kwargs):
+ """ Submit get request to the path.
+ :arg
+ path (str): Path for request.
+ :return
+ Response the request.
+ :exception
+ HttpError: Can't connect to server.
+ """
+
+ try:
+ return requests.get(urljoin(self.base_url, path),
+ params=kwargs,
+ headers=self.headers,
+ timeout=self.timeout,
+ verify=self.verify)
+ except Exception as e:
+ raise KeycloakConnectionError(
+ "Can't connect to server (%s)" % e)
+
+ def raw_post(self, path, data, **kwargs):
+ """ Submit post request to the path.
+ :arg
+ path (str): Path for request.
+ data (dict): Payload for request.
+ :return
+ Response the request.
+ :exception
+ HttpError: Can't connect to server.
+ """
+ try:
+ return requests.post(urljoin(self.base_url, path),
+ params=kwargs,
+ data=data,
+ headers=self.headers,
+ timeout=self.timeout,
+ verify=self.verify)
+ except Exception as e:
+ raise KeycloakConnectionError(
+ "Can't connect to server (%s)" % e)
+
+ def raw_put(self, path, data, **kwargs):
+ """ Submit put request to the path.
+ :arg
+ path (str): Path for request.
+ data (dict): Payload for request.
+ :return
+ Response the request.
+ :exception
+ HttpError: Can't connect to server.
+ """
+ try:
+ return requests.put(urljoin(self.base_url, path),
+ params=kwargs,
+ data=data,
+ headers=self.headers,
+ timeout=self.timeout,
+ verify=self.verify)
+ except Exception as e:
+ raise KeycloakConnectionError(
+ "Can't connect to server (%s)" % e)
+
+ def raw_delete(self, path, **kwargs):
+ """ Submit delete request to the path.
+
+ :arg
+ path (str): Path for request.
+ :return
+ Response the request.
+ :exception
+ HttpError: Can't connect to server.
+ """
+ try:
+ return requests.delete(urljoin(self.base_url, path),
+ params=kwargs,
+ headers=self.headers,
+ timeout=self.timeout,
+ verify=self.verify)
+ except Exception as e:
+ raise KeycloakConnectionError(
+ "Can't connect to server (%s)" % e)
diff --git a/ansible/roles/keycloak-deploy-6.0/files/python-keycloak-0.12.0/keycloak/exceptions.py b/ansible/roles/keycloak-deploy-6.0/files/python-keycloak-0.12.0/keycloak/exceptions.py
new file mode 100644
index 000000000..27d8b14c1
--- /dev/null
+++ b/ansible/roles/keycloak-deploy-6.0/files/python-keycloak-0.12.0/keycloak/exceptions.py
@@ -0,0 +1,93 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2017 Marcos Pereira
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public License
+# along with this program. If not, see .
+
+import requests
+
+
+class KeycloakError(Exception):
+ def __init__(self, error_message="", response_code=None,
+ response_body=None):
+
+ Exception.__init__(self, error_message)
+
+ self.response_code = response_code
+ self.response_body = response_body
+ self.error_message = error_message
+
+ def __str__(self):
+ if self.response_code is not None:
+ return "{0}: {1}".format(self.response_code, self.error_message)
+ else:
+ return "{0}".format(self.error_message)
+
+
+class KeycloakAuthenticationError(KeycloakError):
+ pass
+
+
+class KeycloakConnectionError(KeycloakError):
+ pass
+
+
+class KeycloakOperationError(KeycloakError):
+ pass
+
+
+class KeycloakGetError(KeycloakOperationError):
+ pass
+
+
+class KeycloakSecretNotFound(KeycloakOperationError):
+ pass
+
+
+class KeycloakRPTNotFound(KeycloakOperationError):
+ pass
+
+
+class KeycloakAuthorizationConfigError(KeycloakOperationError):
+ pass
+
+
+class KeycloakInvalidTokenError(KeycloakOperationError):
+ pass
+
+
+def raise_error_from_response(response, error, expected_code=200):
+
+ if expected_code == response.status_code:
+ if expected_code == requests.codes.no_content:
+ return {}
+ try:
+ return response.json()
+ except ValueError:
+ return response.content
+
+ try:
+ message = response.json()['message']
+ except (KeyError, ValueError):
+ message = response.content
+
+ if isinstance(error, dict):
+ error = error.get(response.status_code, KeycloakOperationError)
+ else:
+ if response.status_code == 401:
+ error = KeycloakAuthenticationError
+
+ raise error(error_message=message,
+ response_code=response.status_code,
+ response_body=response.content)
diff --git a/ansible/roles/keycloak-deploy-6.0/files/python-keycloak-0.12.0/keycloak/keycloak_admin.py b/ansible/roles/keycloak-deploy-6.0/files/python-keycloak-0.12.0/keycloak/keycloak_admin.py
new file mode 100644
index 000000000..79f5c2c6d
--- /dev/null
+++ b/ansible/roles/keycloak-deploy-6.0/files/python-keycloak-0.12.0/keycloak/keycloak_admin.py
@@ -0,0 +1,670 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2017 Marcos Pereira
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public License
+# along with this program. If not, see .
+
+# Unless otherwise stated in the comments, "id", in e.g. user_id, refers to the
+# internal Keycloak server ID, usually a uuid string
+from keycloak.urls_patterns import URL_ADMIN_CLIENT_ROLE
+from .urls_patterns import \
+ URL_ADMIN_USERS_COUNT, URL_ADMIN_USER, URL_ADMIN_USER_CONSENTS, \
+ URL_ADMIN_SEND_UPDATE_ACCOUNT, URL_ADMIN_RESET_PASSWORD, URL_ADMIN_SEND_VERIFY_EMAIL, URL_ADMIN_GET_SESSIONS, \
+ URL_ADMIN_SERVER_INFO, URL_ADMIN_CLIENTS, URL_ADMIN_CLIENT, URL_ADMIN_CLIENT_ROLES, URL_ADMIN_REALM_ROLES, \
+ URL_ADMIN_GROUP, URL_ADMIN_GROUPS, URL_ADMIN_GROUP_CHILD, URL_ADMIN_USER_GROUP,\
+ URL_ADMIN_GROUP_PERMISSIONS, URL_ADMIN_USER_CLIENT_ROLES, URL_ADMIN_USER_STORAGE, URL_ADMIN_REALM
+
+from .keycloak_openid import KeycloakOpenID
+
+from .exceptions import raise_error_from_response, KeycloakGetError
+
+from .urls_patterns import (
+ URL_ADMIN_USERS,
+)
+
+from .connection import ConnectionManager
+import json
+
+
+class KeycloakAdmin:
+
+ def __init__(self, server_url, username, password, realm_name='master', client_id='admin-cli', verify=True):
+ """
+
+ :param server_url: Keycloak server url
+ :param username: admin username
+ :param password: admin password
+ :param realm_name: realm name
+ :param client_id: client id
+ :param verify: True if want check connection SSL
+ """
+ self._username = username
+ self._password = password
+ self._client_id = client_id
+ self._realm_name = realm_name
+
+ # Get token Admin
+ keycloak_openid = KeycloakOpenID(server_url=server_url, client_id=client_id, realm_name=realm_name,
+ verify=verify)
+ self._token = keycloak_openid.token(username, password)
+
+ self._connection = ConnectionManager(base_url=server_url,
+ headers={'Authorization': 'Bearer ' + self.token.get('access_token'),
+ 'Content-Type': 'application/json'},
+ timeout=60,
+ verify=verify)
+
+ @property
+ def realm_name(self):
+ return self._realm_name
+
+ @realm_name.setter
+ def realm_name(self, value):
+ self._realm_name = value
+
+ @property
+ def connection(self):
+ return self._connection
+
+ @connection.setter
+ def connection(self, value):
+ self._connection = value
+
+ @property
+ def client_id(self):
+ return self._client_id
+
+ @client_id.setter
+ def client_id(self, value):
+ self._client_id = value
+
+ @property
+ def username(self):
+ return self._username
+
+ @username.setter
+ def username(self, value):
+ self._username = value
+
+ @property
+ def password(self):
+ return self._password
+
+ @password.setter
+ def password(self, value):
+ self._password = value
+
+ @property
+ def token(self):
+ return self._token
+
+ @token.setter
+ def token(self, value):
+ self._token = value
+
+ def get_users(self, query=None):
+ """
+ Get users Returns a list of users, filtered according to query parameters
+
+ :return: users list
+ """
+ params_path = {"realm-name": self.realm_name}
+ data_raw = self.connection.raw_get(URL_ADMIN_USERS.format(**params_path), **query)
+ return raise_error_from_response(data_raw, KeycloakGetError)
+
+ def create_user(self, payload):
+ """
+ Create a new user Username must be unique
+
+ UserRepresentation
+ http://www.keycloak.org/docs-api/3.3/rest-api/index.html#_userrepresentation
+
+ :param payload: UserRepresentation
+
+ :return: UserRepresentation
+ """
+ params_path = {"realm-name": self.realm_name}
+ data_raw = self.connection.raw_post(URL_ADMIN_USERS.format(**params_path),
+ data=json.dumps(payload))
+ return raise_error_from_response(data_raw, KeycloakGetError, expected_code=201)
+
+ def users_count(self):
+ """
+ User counter
+
+ :return: counter
+ """
+ params_path = {"realm-name": self.realm_name}
+ data_raw = self.connection.raw_get(URL_ADMIN_USERS_COUNT.format(**params_path))
+ return raise_error_from_response(data_raw, KeycloakGetError)
+
+ def get_user_id(self, username):
+ """
+ Get internal keycloak user id from username
+ This is required for further actions against this user.
+
+ UserRepresentation
+ http://www.keycloak.org/docs-api/3.3/rest-api/index.html#_userrepresentation
+
+ :param username: id in UserRepresentation
+
+ :return: user_id
+ """
+ params_path = {"realm-name": self.realm_name, "username": username}
+ data_raw = self.connection.raw_get(URL_ADMIN_USERS.format(**params_path))
+ data_content = raise_error_from_response(data_raw, KeycloakGetError)
+
+ for user in data_content:
+ this_use_rname = json.dumps(user["username"]).strip('"')
+ if this_use_rname == username:
+ return json.dumps(user["id"]).strip('"')
+
+ return None
+
+ def get_user(self, user_id):
+ """
+ Get representation of the user
+
+ :param user_id: User id
+
+ UserRepresentation: http://www.keycloak.org/docs-api/3.3/rest-api/index.html#_userrepresentation
+
+ :return: UserRepresentation
+ """
+ params_path = {"realm-name": self.realm_name, "id": user_id}
+ data_raw = self.connection.raw_get(URL_ADMIN_USER.format(**params_path))
+ return raise_error_from_response(data_raw, KeycloakGetError)
+
+ def update_user(self, user_id, payload):
+ """
+ Update the user
+
+ :param user_id: User id
+ :param payload: UserRepresentation
+
+ :return: Http response
+ """
+ params_path = {"realm-name": self.realm_name, "id": user_id}
+ data_raw = self.connection.raw_put(URL_ADMIN_USER.format(**params_path),
+ data=json.dumps(payload))
+ return raise_error_from_response(data_raw, KeycloakGetError, expected_code=204)
+
+ def delete_user(self, user_id):
+ """
+ Delete the user
+
+ :param user_id: User id
+
+ :return: Http response
+ """
+ params_path = {"realm-name": self.realm_name, "id": user_id}
+ data_raw = self.connection.raw_delete(URL_ADMIN_USER.format(**params_path))
+ return raise_error_from_response(data_raw, KeycloakGetError, expected_code=204)
+
+ def set_user_password(self, user_id, password, temporary=True):
+ """
+ Set up a password for the user. If temporary is True, the user will have to reset
+ the temporary password next time they log in.
+
+ http://www.keycloak.org/docs-api/3.2/rest-api/#_users_resource
+ http://www.keycloak.org/docs-api/3.2/rest-api/#_credentialrepresentation
+
+ :param user_id: User id
+ :param password: New password
+ :param temporary: True if password is temporary
+
+ :return:
+ """
+ payload = {"type": "password", "temporary": temporary, "value": password}
+ params_path = {"realm-name": self.realm_name, "id": user_id}
+ data_raw = self.connection.raw_put(URL_ADMIN_RESET_PASSWORD.format(**params_path),
+ data=json.dumps(payload))
+ return raise_error_from_response(data_raw, KeycloakGetError, expected_code=204)
+
+ def consents_user(self, user_id):
+ """
+ Get consents granted by the user
+
+ :param user_id: User id
+
+ :return: consents
+ """
+ params_path = {"realm-name": self.realm_name, "id": user_id}
+ data_raw = self.connection.raw_get(URL_ADMIN_USER_CONSENTS.format(**params_path))
+ return raise_error_from_response(data_raw, KeycloakGetError)
+
+ def send_update_account(self, user_id, payload, client_id=None, lifespan=None, redirect_uri=None):
+ """
+ Send a update account email to the user An email contains a
+ link the user can click to perform a set of required actions.
+
+ :param user_id:
+ :param payload:
+ :param client_id:
+ :param lifespan:
+ :param redirect_uri:
+
+ :return:
+ """
+ params_path = {"realm-name": self.realm_name, "id": user_id}
+ params_query = {"client_id": client_id, "lifespan": lifespan, "redirect_uri": redirect_uri}
+ data_raw = self.connection.raw_put(URL_ADMIN_SEND_UPDATE_ACCOUNT.format(**params_path),
+ data=payload, **params_query)
+ return raise_error_from_response(data_raw, KeycloakGetError)
+
+ def send_verify_email(self, user_id, client_id=None, redirect_uri=None):
+ """
+ Send a update account email to the user An email contains a
+ link the user can click to perform a set of required actions.
+
+ :param user_id: User id
+ :param client_id: Client id
+ :param redirect_uri: Redirect uri
+
+ :return:
+ """
+ params_path = {"realm-name": self.realm_name, "id": user_id}
+ params_query = {"client_id": client_id, "redirect_uri": redirect_uri}
+ data_raw = self.connection.raw_put(URL_ADMIN_SEND_VERIFY_EMAIL.format(**params_path),
+ data={}, **params_query)
+ return raise_error_from_response(data_raw, KeycloakGetError)
+
+ def get_sessions(self, user_id):
+ """
+ Get sessions associated with the user
+
+ :param user_id: id of user
+
+ UserSessionRepresentation
+ http://www.keycloak.org/docs-api/3.3/rest-api/index.html#_usersessionrepresentation
+
+ :return: UserSessionRepresentation
+ """
+ params_path = {"realm-name": self.realm_name, "id": user_id}
+ data_raw = self.connection.raw_get(URL_ADMIN_GET_SESSIONS.format(**params_path))
+ return raise_error_from_response(data_raw, KeycloakGetError)
+
+ def get_server_info(self):
+ """
+ Get themes, social providers, auth providers, and event listeners available on this server
+
+ ServerInfoRepresentation
+ http://www.keycloak.org/docs-api/3.3/rest-api/index.html#_serverinforepresentation
+
+ :return: ServerInfoRepresentation
+ """
+ data_raw = self.connection.raw_get(URL_ADMIN_SERVER_INFO)
+ return raise_error_from_response(data_raw, KeycloakGetError)
+
+ def get_groups(self):
+ """
+ Get groups belonging to the realm. Returns a list of groups belonging to the realm
+
+ GroupRepresentation
+ http://www.keycloak.org/docs-api/3.2/rest-api/#_grouprepresentation
+
+ :return: array GroupRepresentation
+ """
+ params_path = {"realm-name": self.realm_name}
+ data_raw = self.connection.raw_get(URL_ADMIN_GROUPS.format(**params_path))
+ return raise_error_from_response(data_raw, KeycloakGetError)
+
+ def get_group(self, group_id):
+ """
+ Get group by id. Returns full group details
+
+ GroupRepresentation
+ http://www.keycloak.org/docs-api/3.2/rest-api/#_grouprepresentation
+
+ :return: Keycloak server response (GroupRepresentation)
+ """
+ params_path = {"realm-name": self.realm_name, "id": group_id}
+ data_raw = self.connection.raw_get(URL_ADMIN_GROUP.format(**params_path))
+ return raise_error_from_response(data_raw, KeycloakGetError)
+
+ def get_group_by_name(self, name_or_path, search_in_subgroups=False):
+ """
+ Get group id based on name or path.
+ A straight name or path match with a top-level group will return first.
+ Subgroups are traversed, the first to match path (or name with path) is returned.
+
+ GroupRepresentation
+ http://www.keycloak.org/docs-api/3.2/rest-api/#_grouprepresentation
+
+ :param name: group name
+ :param path: group path
+ :param search_in_subgroups: True if want search in the subgroups
+ :return: Keycloak server response (GroupRepresentation)
+ """
+
+ groups = self.get_groups()
+
+ # TODO: Review this code is necessary
+ for group in groups:
+ if group['name'] == name_or_path or group['path'] == name_or_path:
+ return group
+ elif search_in_subgroups and group["subGroups"]:
+ for subgroup in group["subGroups"]:
+ if subgroup['name'] == name_or_path or subgroup['path'] == name_or_path:
+ return subgroup
+
+ return None
+
+ def create_group(self, name=None, client_roles={}, realm_roles=[], sub_groups=[], path=None, parent=None):
+ """
+ Create a group in the Realm
+
+ GroupRepresentation
+ http://www.keycloak.org/docs-api/3.2/rest-api/#_grouprepresentation
+
+ :param name: group name
+ :param client_roles: (Dict) Client roles to include in groupp # Not demonstrated to work
+ :param realm_roles: (List) Realm roles to include in group # Not demonstrated to work
+ :param sub_groups: (List) Subgroups to include in groupp # Not demonstrated to work
+ :param path: group path
+ :param parent: parent group's id. Required to create a sub-group.
+
+ :return: Keycloak server response (GroupRepresentation)
+ """
+
+ data = {"name": name or path,
+ "path": path,
+ "clientRoles": client_roles,
+ "realmRoles": realm_roles,
+ "subGroups": sub_groups}
+
+ if parent is None:
+ params_path = {"realm-name": self.realm_name}
+ data_raw = self.connection.raw_post(URL_ADMIN_GROUPS.format(**params_path),
+ data=json.dumps(data))
+ else:
+ params_path = {"realm-name": self.realm_name, "id": parent}
+ data_raw = self.connection.raw_post(URL_ADMIN_GROUP_CHILD.format(**params_path),
+ data=json.dumps(data))
+
+ return raise_error_from_response(data_raw, KeycloakGetError, expected_code=201)
+
+ def group_set_permissions(self, group_id, enabled=True):
+ """
+ Enable/Disable permissions for a group. Cannot delete group if disabled
+
+ :param group_id: id of group
+ :param enabled: boolean
+ :return: Keycloak server response
+ """
+
+ params_path = {"realm-name": self.realm_name, "id": group_id}
+ data_raw = self.connection.raw_put(URL_ADMIN_GROUP_PERMISSIONS.format(**params_path),
+ data=json.dumps({"enabled": enabled}))
+ return raise_error_from_response(data_raw, KeycloakGetError)
+
+ def group_user_add(self, user_id, group_id):
+ """
+ Add user to group (user_id and group_id)
+
+ :param group_id: id of group
+ :param user_id: id of user
+ :param group_id: id of group to add to
+ :return: Keycloak server response
+ """
+
+ params_path = {"realm-name": self.realm_name, "id": user_id, "group-id": group_id}
+ data_raw = self.connection.raw_put(URL_ADMIN_USER_GROUP.format(**params_path), data=None)
+ return raise_error_from_response(data_raw, KeycloakGetError, expected_code=204)
+
+ def group_user_remove(self, user_id, group_id):
+ """
+ Remove user from group (user_id and group_id)
+
+ :param group_id: id of group
+ :param user_id: id of user
+ :param group_id: id of group to add to
+ :return: Keycloak server response
+ """
+
+ params_path = {"realm-name": self.realm_name, "id": user_id, "group-id": group_id}
+ data_raw = self.connection.raw_delete(URL_ADMIN_USER_GROUP.format(**params_path))
+ return raise_error_from_response(data_raw, KeycloakGetError, expected_code=204)
+
+ def delete_group(self, group_id):
+ """
+ Deletes a group in the Realm
+
+ :param group_id: id of group to delete
+ :return: Keycloak server response
+ """
+
+ params_path = {"realm-name": self.realm_name, "id": group_id}
+ data_raw = self.connection.raw_delete(URL_ADMIN_GROUP.format(**params_path))
+ return raise_error_from_response(data_raw, KeycloakGetError, expected_code=204)
+
+ def get_clients(self):
+ """
+ Get clients belonging to the realm Returns a list of clients belonging to the realm
+
+ ClientRepresentation
+ http://www.keycloak.org/docs-api/3.3/rest-api/index.html#_clientrepresentation
+
+ :return: Keycloak server response (ClientRepresentation)
+ """
+
+ params_path = {"realm-name": self.realm_name}
+ data_raw = self.connection.raw_get(URL_ADMIN_CLIENTS.format(**params_path))
+
+ return raise_error_from_response(data_raw, KeycloakGetError)
+
+ def get_client(self, client_id):
+ """
+ Get representation of the client
+
+ ClientRepresentation
+ http://www.keycloak.org/docs-api/3.3/rest-api/index.html#_clientrepresentation
+
+ :param client_id: id of client (not client-id)
+ :return: Keycloak server response (ClientRepresentation)
+ """
+
+ params_path = {"realm-name": self.realm_name, "id": client_id}
+ data_raw = self.connection.raw_get(URL_ADMIN_CLIENT.format(**params_path))
+ return raise_error_from_response(data_raw, KeycloakGetError)
+
+ def get_client_id(self, client_name):
+ """
+ Get internal keycloak client id from client-id.
+ This is required for further actions against this client.
+
+ :param client_name: name in ClientRepresentation
+ http://www.keycloak.org/docs-api/3.3/rest-api/index.html#_clientrepresentation
+ :return: client_id (uuid as string)
+ """
+
+ clients = self.get_clients()
+
+ for client in clients:
+ if client_name == client['name']:
+ return client["id"]
+
+ return None
+
+ def create_client(self, payload):
+ """
+ Create a client
+
+ ClientRepresentation: http://www.keycloak.org/docs-api/3.3/rest-api/index.html#_clientrepresentation
+
+ :param payload: ClientRepresentation
+ :return: Keycloak server response (UserRepresentation)
+ """
+
+ params_path = {"realm-name": self.realm_name}
+ data_raw = self.connection.raw_post(URL_ADMIN_CLIENTS.format(**params_path),
+ data=json.dumps(payload))
+ return raise_error_from_response(data_raw, KeycloakGetError, expected_code=201)
+
+ def delete_client(self, client_id):
+ """
+ Get representation of the client
+
+ ClientRepresentation
+ http://www.keycloak.org/docs-api/3.3/rest-api/index.html#_clientrepresentation
+
+ :param client_id: keycloak client id (not oauth client-id)
+ :return: Keycloak server response (ClientRepresentation)
+ """
+
+ params_path = {"realm-name": self.realm_name, "id": client_id}
+ data_raw = self.connection.raw_delete(URL_ADMIN_CLIENT.format(**params_path))
+ return raise_error_from_response(data_raw, KeycloakGetError, expected_code=204)
+
+ def get_realm_roles(self):
+ """
+ Get all roles for the realm or client
+
+ RoleRepresentation
+ http://www.keycloak.org/docs-api/3.3/rest-api/index.html#_rolerepresentation
+
+ :return: Keycloak server response (RoleRepresentation)
+ """
+
+ params_path = {"realm-name": self.realm_name}
+ data_raw = self.connection.raw_get(URL_ADMIN_REALM_ROLES.format(**params_path))
+ return raise_error_from_response(data_raw, KeycloakGetError)
+
+ def get_client_roles(self, client_id):
+ """
+ Get all roles for the client
+
+ :param client_id: id of client (not client-id)
+
+ RoleRepresentation
+ http://www.keycloak.org/docs-api/3.3/rest-api/index.html#_rolerepresentation
+
+ :return: Keycloak server response (RoleRepresentation)
+ """
+
+ params_path = {"realm-name": self.realm_name, "id": client_id}
+ data_raw = self.connection.raw_get(URL_ADMIN_CLIENT_ROLES.format(**params_path))
+ return raise_error_from_response(data_raw, KeycloakGetError)
+
+ def get_client_role(self, client_id, role_name):
+ """
+ Get client role id by name
+ This is required for further actions with this role.
+
+ :param client_id: id of client (not client-id)
+ :param role_name: role’s name (not id!)
+
+ RoleRepresentation
+ http://www.keycloak.org/docs-api/3.3/rest-api/index.html#_rolerepresentation
+
+ :return: role_id
+ """
+ params_path = {"realm-name": self.realm_name, "id": client_id, "role-name": role_name}
+ data_raw = self.connection.raw_get(URL_ADMIN_CLIENT_ROLE.format(**params_path))
+ return raise_error_from_response(data_raw, KeycloakGetError)
+
+ def get_client_role_id(self, client_id, role_name):
+ """
+ Warning: Deprecated
+
+ Get client role id by name
+ This is required for further actions with this role.
+
+ :param client_id: id of client (not client-id)
+ :param role_name: role’s name (not id!)
+
+ RoleRepresentation
+ http://www.keycloak.org/docs-api/3.3/rest-api/index.html#_rolerepresentation
+
+ :return: role_id
+ """
+ role = self.get_client_role(client_id, role_name)
+ return role.get("id")
+
+ def create_client_role(self, payload):
+ """
+ Create a client role
+
+ RoleRepresentation
+ http://www.keycloak.org/docs-api/3.3/rest-api/index.html#_rolerepresentation
+
+ :param payload: id of client (not client-id), role_name: name of role
+ :return: Keycloak server response (RoleRepresentation)
+ """
+
+ params_path = {"realm-name": self.realm_name, "id": self.client_id}
+ data_raw = self.connection.raw_post(URL_ADMIN_CLIENT_ROLES.format(**params_path),
+ data=json.dumps(payload))
+ return raise_error_from_response(data_raw, KeycloakGetError, expected_code=201)
+
+ def delete_client_role(self, role_name):
+ """
+ Create a client role
+
+ RoleRepresentation
+ http://www.keycloak.org/docs-api/3.3/rest-api/index.html#_rolerepresentation
+
+ :param role_name: role’s name (not id!)
+ """
+ params_path = {"realm-name": self.realm_name, "id": self.client_id, "role-name": role_name}
+ data_raw = self.connection.raw_delete(URL_ADMIN_CLIENT_ROLE.format(**params_path))
+ return raise_error_from_response(data_raw, KeycloakGetError, expected_code=204)
+
+ def assign_client_role(self, user_id, client_id, roles):
+ """
+ Assign a client role to a user
+
+ :param client_id: id of client (not client-id)
+ :param user_id: id of user
+ :param client_id: id of client containing role,
+ :param roles: roles list or role (use RoleRepresentation)
+ :return Keycloak server response
+ """
+
+ payload = roles if isinstance(roles, list) else [roles]
+ params_path = {"realm-name": self.realm_name, "id": user_id, "client-id": client_id}
+ data_raw = self.connection.raw_post(URL_ADMIN_USER_CLIENT_ROLES.format(**params_path),
+ data=json.dumps(payload))
+ return raise_error_from_response(data_raw, KeycloakGetError, expected_code=204)
+
+ def sync_users(self, storage_id, action):
+ """
+ Function to trigger user sync from provider
+
+ :param storage_id:
+ :param action:
+ :return:
+ """
+ data = {'action': action}
+ params_query = {"action": action}
+
+ params_path = {"realm-name": self.realm_name, "id": storage_id}
+ data_raw = self.connection.raw_post(URL_ADMIN_USER_STORAGE.format(**params_path),
+ data=json.dumps(data), **params_query)
+ return raise_error_from_response(data_raw, KeycloakGetError)
+
+ def import_realm(self, payload):
+ """
+ Imports a realm from a full representation of that realm
+
+ Realmrepresentation
+ http://www.keycloak.org/docs-api/2.5/rest-api/index.html#_import_a_realm
+
+ :param payload: Realmrepresentation
+
+ :return: Realmrepresentation
+ """
+ data_raw = self.connection.raw_post(URL_ADMIN_REALM,
+ data = json.dumps(payload))
+ return raise_error_from_response(data_raw, KeycloakGetError, expected_code=201)
\ No newline at end of file
diff --git a/ansible/roles/keycloak-deploy-6.0/files/python-keycloak-0.12.0/keycloak/keycloak_main.py b/ansible/roles/keycloak-deploy-6.0/files/python-keycloak-0.12.0/keycloak/keycloak_main.py
new file mode 100644
index 000000000..4705499cb
--- /dev/null
+++ b/ansible/roles/keycloak-deploy-6.0/files/python-keycloak-0.12.0/keycloak/keycloak_main.py
@@ -0,0 +1,89 @@
+import json
+
+from keycloak import KeycloakOpenID
+from keycloak import KeycloakAdmin
+import urllib2, argparse, json
+
+# Import realm
+def keycloak_import_realm(keycloak_realm_file):
+ data = json.load(open(keycloak_realm_file))
+ realm_import = keycloak_admin.import_realm(data)
+
+# Add user and set password
+def keycloak_create_user(email, username, firstName, lastName, password):
+ new_user = keycloak_admin.create_user({"email": email,
+ "username": username,
+ "emailVerified": True,
+ "enabled": True,
+ "firstName": firstName,
+ "lastName": lastName,
+ "credentials": [{"value": "12345","type": password}],
+ "realmRoles": ["user_default"]})
+
+# Create the user and assign the role to access the user management API
+def update_user_roles(config):
+ realm_json = json.load(open(config['keycloak_realm_json_file_path']))
+
+ # Get the id of realm-management
+ for client in realm_json['clients']:
+ if config['clientId'] == client['clientId']:
+ client_id = client["id"]
+ break
+
+ user = keycloak_admin.get_users({"username":config['keycloak_api_management_username']})
+ user_id = user[0]['id']
+
+ # Read the role from file
+ with open(config['keycloak_user_manager_roles_json_file_path'], 'r') as data_file:
+ json_data = data_file.read()
+
+ roles = json.loads(json_data)
+
+ # Get only client roles
+ clientRoles = roles[config['clientId']]
+
+ keycloak_admin.assign_client_role(user_id, client_id, clientRoles)
+
+if __name__ == "__main__":
+ parser = argparse.ArgumentParser(description='Configure keycloak user apis')
+ parser.add_argument('keycloak_bootstrap_config', help='configuration json file that is needed for keycloak bootstrap')
+ args = parser.parse_args()
+
+ with open(args.keycloak_bootstrap_config) as keycloak_bootstrap_config:
+ config = json.load(keycloak_bootstrap_config)
+
+ try:
+ # Get access token
+ keycloak_admin = KeycloakAdmin(server_url=config['keycloak_auth_server_url'],
+ username=config['keycloak_management_user'],
+ password=config['keycloak_management_password'],
+ realm_name="master",
+ client_id='admin-cli',
+ verify=False)
+ # Import realm
+ keycloak_import_realm(config['keycloak_realm_json_file_path'])
+
+ # Set realm name to sunbird
+ keycloak_admin.realm_name = config['keycloak_realm']
+
+ # Add user for user api
+ keycloak_create_user(email=config['keycloak_api_management_user_email'],
+ username=config['keycloak_api_management_username'],
+ firstName=config['keycloak_api_management_user_first_name'],
+ lastName=config['keycloak_api_management_user_last_name'],
+ password=config['keycloak_api_management_user_password'])
+
+ # Update user roles for access user management API's
+ config['clientId'] = "realm-management"
+ update_user_roles(config)
+
+ # Update user roles for SSO
+ config['clientId'] = "admin-cli"
+ update_user_roles(config)
+ # If keycloak is returning the error realm does exists
+ except Exception as e:
+ if "409" in str(e):
+ print "Skipping error: " + str(e)
+ else:
+ raise
+
diff --git a/ansible/roles/keycloak-deploy-6.0/files/python-keycloak-0.12.0/keycloak/keycloak_openid.py b/ansible/roles/keycloak-deploy-6.0/files/python-keycloak-0.12.0/keycloak/keycloak_openid.py
new file mode 100644
index 000000000..f1dcde44e
--- /dev/null
+++ b/ansible/roles/keycloak-deploy-6.0/files/python-keycloak-0.12.0/keycloak/keycloak_openid.py
@@ -0,0 +1,390 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2017 Marcos Pereira
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public License
+# along with this program. If not, see .
+
+from .authorization import Authorization
+from .exceptions import raise_error_from_response, KeycloakGetError, \
+ KeycloakRPTNotFound, KeycloakAuthorizationConfigError, KeycloakInvalidTokenError
+from .urls_patterns import (
+ URL_TOKEN,
+ URL_USERINFO,
+ URL_WELL_KNOWN,
+ URL_LOGOUT,
+ URL_CERTS,
+ URL_ENTITLEMENT,
+ URL_INTROSPECT
+)
+from .connection import ConnectionManager
+from jose import jwt
+import json
+
+
+class KeycloakOpenID:
+
+ def __init__(self, server_url, realm_name, client_id, client_secret_key=None, verify=True):
+ """
+
+ :param server_url: Keycloak server url
+ :param client_id: client id
+ :param realm_name: realm name
+ :param client_secret_key: client secret key
+ :param verify: True if want check connection SSL
+ """
+ self._client_id = client_id
+ self._client_secret_key = client_secret_key
+ self._realm_name = realm_name
+ self._connection = ConnectionManager(base_url=server_url,
+ headers={},
+ timeout=60,
+ verify=verify)
+
+ self._authorization = Authorization()
+
+ @property
+ def client_id(self):
+ return self._client_id
+
+ @client_id.setter
+ def client_id(self, value):
+ self._client_id = value
+
+ @property
+ def client_secret_key(self):
+ return self._client_secret_key
+
+ @client_secret_key.setter
+ def client_secret_key(self, value):
+ self._client_secret_key = value
+
+ @property
+ def realm_name(self):
+ return self._realm_name
+
+ @realm_name.setter
+ def realm_name(self, value):
+ self._realm_name = value
+
+ @property
+ def connection(self):
+ return self._connection
+
+ @connection.setter
+ def connection(self, value):
+ self._connection = value
+
+ @property
+ def authorization(self):
+ return self._authorization
+
+ @authorization.setter
+ def authorization(self, value):
+ self._authorization = value
+
+ def _add_secret_key(self, payload):
+ """
+ Add secret key if exist.
+
+ :param payload:
+ :return:
+ """
+ if self.client_secret_key:
+ payload.update({"client_secret": self.client_secret_key})
+
+ return payload
+
+ def _build_name_role(self, role):
+ """
+
+ :param role:
+ :return:
+ """
+ return self.client_id + "/" + role
+
+ def _token_info(self, token, method_token_info, **kwargs):
+ """
+
+ :param token:
+ :param method_token_info:
+ :param kwargs:
+ :return:
+ """
+ if method_token_info == 'introspect':
+ token_info = self.introspect(token)
+ else:
+ token_info = self.decode_token(token, **kwargs)
+
+ return token_info
+
+ def well_know(self):
+ """ The most important endpoint to understand is the well-known configuration
+ endpoint. It lists endpoints and other configuration options relevant to
+ the OpenID Connect implementation in Keycloak.
+
+ :return It lists endpoints and other configuration options relevant.
+ """
+
+ params_path = {"realm-name": self.realm_name}
+ data_raw = self.connection.raw_get(URL_WELL_KNOWN.format(**params_path))
+
+ return raise_error_from_response(data_raw, KeycloakGetError)
+
+ def auth_url(self, redirect_uri):
+ """
+
+ http://openid.net/specs/openid-connect-core-1_0.html#AuthorizationEndpoint
+
+ :return:
+ """
+ return NotImplemented
+
+ def token(self, username, password, grant_type=["password"]):
+ """
+ The token endpoint is used to obtain tokens. Tokens can either be obtained by
+ exchanging an authorization code or by supplying credentials directly depending on
+ what flow is used. The token endpoint is also used to obtain new access tokens
+ when they expire.
+
+ http://openid.net/specs/openid-connect-core-1_0.html#TokenEndpoint
+
+ :param username:
+ :param password:
+ :param grant_type:
+ :return:
+ """
+ params_path = {"realm-name": self.realm_name}
+ payload = {"username": username, "password": password,
+ "client_id": self.client_id, "grant_type": grant_type}
+
+ payload = self._add_secret_key(payload)
+ data_raw = self.connection.raw_post(URL_TOKEN.format(**params_path),
+ data=payload)
+ return raise_error_from_response(data_raw, KeycloakGetError)
+
+ def refresh_token(self, refresh_token, grant_type=["refresh_token"]):
+ """
+ The token endpoint is used to obtain tokens. Tokens can either be obtained by
+ exchanging an authorization code or by supplying credentials directly depending on
+ what flow is used. The token endpoint is also used to obtain new access tokens
+ when they expire.
+
+ http://openid.net/specs/openid-connect-core-1_0.html#TokenEndpoint
+
+ :param refresh_token:
+ :param grant_type:
+ :return:
+ """
+ params_path = {"realm-name": self.realm_name}
+ payload = {"client_id": self.client_id, "grant_type": grant_type, "refresh_token": refresh_token}
+ payload = self._add_secret_key(payload)
+ data_raw = self.connection.raw_post(URL_TOKEN.format(**params_path),
+ data=payload)
+ return raise_error_from_response(data_raw, KeycloakGetError)
+
+ def userinfo(self, token):
+ """
+ The userinfo endpoint returns standard claims about the authenticated user,
+ and is protected by a bearer token.
+
+ http://openid.net/specs/openid-connect-core-1_0.html#UserInfo
+
+ :param token:
+ :return:
+ """
+
+ self.connection.add_param_headers("Authorization", "Bearer " + token)
+ params_path = {"realm-name": self.realm_name}
+
+ data_raw = self.connection.raw_get(URL_USERINFO.format(**params_path))
+
+ return raise_error_from_response(data_raw, KeycloakGetError)
+
+ def logout(self, refresh_token):
+ """
+ The logout endpoint logs out the authenticated user.
+ :param refresh_token:
+ :return:
+ """
+ params_path = {"realm-name": self.realm_name}
+ payload = {"client_id": self.client_id, "refresh_token": refresh_token}
+
+ payload = self._add_secret_key(payload)
+ data_raw = self.connection.raw_post(URL_LOGOUT.format(**params_path),
+ data=payload)
+
+ return raise_error_from_response(data_raw, KeycloakGetError, expected_code=204)
+
+ def certs(self):
+ """
+ The certificate endpoint returns the public keys enabled by the realm, encoded as a
+ JSON Web Key (JWK). Depending on the realm settings there can be one or more keys enabled
+ for verifying tokens.
+
+ https://tools.ietf.org/html/rfc7517
+
+ :return:
+ """
+ params_path = {"realm-name": self.realm_name}
+ data_raw = self.connection.raw_get(URL_CERTS.format(**params_path))
+ return raise_error_from_response(data_raw, KeycloakGetError)
+
+ def entitlement(self, token, resource_server_id):
+ """
+ Client applications can use a specific endpoint to obtain a special security token
+ called a requesting party token (RPT). This token consists of all the entitlements
+ (or permissions) for a user as a result of the evaluation of the permissions and authorization
+ policies associated with the resources being requested. With an RPT, client applications can
+ gain access to protected resources at the resource server.
+
+ :return:
+ """
+ self.connection.add_param_headers("Authorization", "Bearer " + token)
+ params_path = {"realm-name": self.realm_name, "resource-server-id": resource_server_id}
+ data_raw = self.connection.raw_get(URL_ENTITLEMENT.format(**params_path))
+
+ return raise_error_from_response(data_raw, KeycloakGetError)
+
+ def introspect(self, token, rpt=None, token_type_hint=None):
+ """
+ The introspection endpoint is used to retrieve the active state of a token. It is can only be
+ invoked by confidential clients.
+
+ https://tools.ietf.org/html/rfc7662
+
+ :param token:
+ :param rpt:
+ :param token_type_hint:
+
+ :return:
+ """
+ params_path = {"realm-name": self.realm_name}
+
+ payload = {"client_id": self.client_id, "token": token}
+
+ if token_type_hint == 'requesting_party_token':
+ if rpt:
+ payload.update({"token": rpt, "token_type_hint": token_type_hint})
+ self.connection.add_param_headers("Authorization", "Bearer " + token)
+ else:
+ raise KeycloakRPTNotFound("Can't found RPT.")
+
+ payload = self._add_secret_key(payload)
+
+ data_raw = self.connection.raw_post(URL_INTROSPECT.format(**params_path),
+ data=payload)
+
+ return raise_error_from_response(data_raw, KeycloakGetError)
+
+ def decode_token(self, token, key, algorithms=['RS256'], **kwargs):
+ """
+ A JSON Web Key (JWK) is a JavaScript Object Notation (JSON) data
+ structure that represents a cryptographic key. This specification
+ also defines a JWK Set JSON data structure that represents a set of
+ JWKs. Cryptographic algorithms and identifiers for use with this
+ specification are described in the separate JSON Web Algorithms (JWA)
+ specification and IANA registries established by that specification.
+
+ https://tools.ietf.org/html/rfc7517
+
+ :param token:
+ :param key:
+ :param algorithms:
+ :return:
+ """
+
+ return jwt.decode(token, key, algorithms=algorithms,
+ audience=self.client_id, **kwargs)
+
+ def load_authorization_config(self, path):
+ """
+ Load Keycloak settings (authorization)
+
+ :param path: settings file (json)
+ :return:
+ """
+ authorization_file = open(path, 'r')
+ authorization_json = json.loads(authorization_file.read())
+ self.authorization.load_config(authorization_json)
+ authorization_file.close()
+
+ def get_policies(self, token, method_token_info='introspect', **kwargs):
+ """
+ Get policies by user token
+
+ :param token: user token
+ :return: policies list
+ """
+
+ if not self.authorization.policies:
+ raise KeycloakAuthorizationConfigError(
+ "Keycloak settings not found. Load Authorization Keycloak settings."
+ )
+
+ token_info = self._token_info(token, method_token_info, **kwargs)
+
+ if method_token_info == 'introspect' and not token_info['active']:
+ raise KeycloakInvalidTokenError(
+ "Token expired or invalid."
+ )
+
+ user_resources = token_info['resource_access'].get(self.client_id)
+
+ if not user_resources:
+ return None
+
+ policies = []
+
+ for policy_name, policy in self.authorization.policies.items():
+ for role in user_resources['roles']:
+ if self._build_name_role(role) in policy.roles:
+ policies.append(policy)
+
+ return list(set(policies))
+
+ def get_permissions(self, token, method_token_info='introspect', **kwargs):
+ """
+ Get permission by user token
+
+ :param token: user token
+ :param method_token_info: Decode token method
+ :param kwargs: parameters for decode
+ :return: permissions list
+ """
+
+ if not self.authorization.policies:
+ raise KeycloakAuthorizationConfigError(
+ "Keycloak settings not found. Load Authorization Keycloak settings."
+ )
+
+ token_info = self._token_info(token, method_token_info, **kwargs)
+
+ if method_token_info == 'introspect' and not token_info['active']:
+ raise KeycloakInvalidTokenError(
+ "Token expired or invalid."
+ )
+
+ user_resources = token_info['resource_access'].get(self.client_id)
+
+ if not user_resources:
+ return None
+
+ permissions = []
+
+ for policy_name, policy in self.authorization.policies.items():
+ for role in user_resources['roles']:
+ if self._build_name_role(role) in policy.roles:
+ permissions += policy.permissions
+
+ return list(set(permissions))
diff --git a/ansible/roles/keycloak-deploy-6.0/files/python-keycloak-0.12.0/keycloak/keycloak_patch.py b/ansible/roles/keycloak-deploy-6.0/files/python-keycloak-0.12.0/keycloak/keycloak_patch.py
new file mode 100644
index 000000000..8c0e811f6
--- /dev/null
+++ b/ansible/roles/keycloak-deploy-6.0/files/python-keycloak-0.12.0/keycloak/keycloak_patch.py
@@ -0,0 +1,54 @@
+import json
+
+from keycloak import KeycloakOpenID
+from keycloak import KeycloakAdmin
+import urllib2, argparse, json
+
+# Create client
+def keycloak_create_client(config):
+ data = json.load(open(config['keycloak_clients']))
+
+ # Get the existing clients
+ keycloak_admin.realm_name = config['keycloak_realm']
+ clients = keycloak_admin.get_clients()
+
+ # 1. Read the clients to be added from json
+ # 2. Check if client already exists in keycloak
+ # 3. Add the client if not exist
+ for rec in data['clients']:
+ client_exist_falg = 0
+ for client in clients:
+ if rec['clientId'] == client['clientId']:
+ client_exist_falg = 1
+ break
+ if (client_exist_falg == 0):
+ keycloak_admin.create_client(rec)
+ print rec['clientId'] + " client created"
+ else :
+ print rec['clientId'] + " client already exist"
+
+if __name__ == "__main__":
+ parser = argparse.ArgumentParser(description='Configure keycloak user apis')
+ parser.add_argument('keycloak_bootstrap_config', help='configuration json file that is needed for keycloak bootstrap')
+ args = parser.parse_args()
+
+ with open(args.keycloak_bootstrap_config) as keycloak_bootstrap_config:
+ config = json.load(keycloak_bootstrap_config)
+
+ try:
+ # Get access token
+ keycloak_admin = KeycloakAdmin(server_url=config['keycloak_auth_server_url'],
+ username=config['keycloak_management_user'],
+ password=config['keycloak_management_password'],
+ realm_name="master",
+ client_id='admin-cli',
+ verify=False)
+
+
+ # Create clients
+ keycloak_create_client(config)
+
+ except urllib2.HTTPError as e:
+ error_message = e.read()
+ print(error_message)
+ raise
diff --git a/ansible/roles/keycloak-deploy-6.0/files/python-keycloak-0.12.0/keycloak/python_keycloak.egg-info/PKG-INFO b/ansible/roles/keycloak-deploy-6.0/files/python-keycloak-0.12.0/keycloak/python_keycloak.egg-info/PKG-INFO
new file mode 100644
index 000000000..e98a1ee3c
--- /dev/null
+++ b/ansible/roles/keycloak-deploy-6.0/files/python-keycloak-0.12.0/keycloak/python_keycloak.egg-info/PKG-INFO
@@ -0,0 +1,18 @@
+Metadata-Version: 1.1
+Name: python-keycloak
+Version: 0.12.0
+Summary: python-keycloak is a Python package providing access to the Keycloak API.
+Home-page: https://bitbucket.org/agriness/python-keycloak
+Author: Marcos Pereira
+Author-email: marcospereira.mpj@gmail.com
+License: GNU General Public License - V3
+Description: UNKNOWN
+Keywords: keycloak openid
+Platform: UNKNOWN
+Classifier: Programming Language :: Python :: 3
+Classifier: License :: OSI Approved :: GNU General Public License v3 (GPLv3)
+Classifier: Development Status :: 3 - Alpha
+Classifier: Operating System :: MacOS
+Classifier: Operating System :: Unix
+Classifier: Operating System :: Microsoft :: Windows
+Classifier: Topic :: Utilities
diff --git a/ansible/roles/keycloak-deploy-6.0/files/python-keycloak-0.12.0/keycloak/python_keycloak.egg-info/SOURCES.txt b/ansible/roles/keycloak-deploy-6.0/files/python-keycloak-0.12.0/keycloak/python_keycloak.egg-info/SOURCES.txt
new file mode 100644
index 000000000..e69de29bb
diff --git a/ansible/roles/keycloak-deploy-6.0/files/python-keycloak-0.12.0/keycloak/python_keycloak.egg-info/dependency_links.txt b/ansible/roles/keycloak-deploy-6.0/files/python-keycloak-0.12.0/keycloak/python_keycloak.egg-info/dependency_links.txt
new file mode 100644
index 000000000..8b1378917
--- /dev/null
+++ b/ansible/roles/keycloak-deploy-6.0/files/python-keycloak-0.12.0/keycloak/python_keycloak.egg-info/dependency_links.txt
@@ -0,0 +1 @@
+
diff --git a/ansible/roles/keycloak-deploy-6.0/files/python-keycloak-0.12.0/keycloak/python_keycloak.egg-info/requires.txt b/ansible/roles/keycloak-deploy-6.0/files/python-keycloak-0.12.0/keycloak/python_keycloak.egg-info/requires.txt
new file mode 100644
index 000000000..d6eafdf65
--- /dev/null
+++ b/ansible/roles/keycloak-deploy-6.0/files/python-keycloak-0.12.0/keycloak/python_keycloak.egg-info/requires.txt
@@ -0,0 +1,3 @@
+requests==2.18.4
+httmock==1.2.5
+python-jose==1.4.0
diff --git a/ansible/roles/keycloak-deploy-6.0/files/python-keycloak-0.12.0/keycloak/python_keycloak.egg-info/top_level.txt b/ansible/roles/keycloak-deploy-6.0/files/python-keycloak-0.12.0/keycloak/python_keycloak.egg-info/top_level.txt
new file mode 100644
index 000000000..26c07c1da
--- /dev/null
+++ b/ansible/roles/keycloak-deploy-6.0/files/python-keycloak-0.12.0/keycloak/python_keycloak.egg-info/top_level.txt
@@ -0,0 +1 @@
+keycloak
diff --git a/ansible/roles/keycloak-deploy-6.0/files/python-keycloak-0.12.0/keycloak/tests/__init__.py b/ansible/roles/keycloak-deploy-6.0/files/python-keycloak-0.12.0/keycloak/tests/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/ansible/roles/keycloak-deploy-6.0/files/python-keycloak-0.12.0/keycloak/tests/test_connection.py b/ansible/roles/keycloak-deploy-6.0/files/python-keycloak-0.12.0/keycloak/tests/test_connection.py
new file mode 100644
index 000000000..97ec1792d
--- /dev/null
+++ b/ansible/roles/keycloak-deploy-6.0/files/python-keycloak-0.12.0/keycloak/tests/test_connection.py
@@ -0,0 +1,148 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2017 Marcos Pereira
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public License
+# along with this program. If not, see .
+
+from httmock import urlmatch, response, HTTMock, all_requests
+
+from ..connection import ConnectionManager
+
+
+try:
+ import unittest
+except ImportError:
+ import unittest2 as unittest
+
+
+class TestConnection(unittest.TestCase):
+
+ def setUp(self):
+ self._conn = ConnectionManager(
+ base_url="http://localhost:8080/",
+ headers={},
+ timeout=60)
+
+ @all_requests
+ def response_content_success(self, url, request):
+ headers = {'content-type': 'application/json'}
+ content = b'response_ok'
+ return response(200, content, headers, None, 5, request)
+
+ def test_raw_get(self):
+ with HTTMock(self.response_content_success):
+ resp = self._conn.raw_get("/known_path")
+ self.assertEqual(resp.content, b'response_ok')
+ self.assertEqual(resp.status_code, 200)
+
+ def test_raw_post(self):
+
+ @urlmatch(path="/known_path", method="post")
+ def response_post_success(url, request):
+ headers = {'content-type': 'application/json'}
+ content = 'response'.encode("utf-8")
+ return response(201, content, headers, None, 5, request)
+
+ with HTTMock(response_post_success):
+ resp = self._conn.raw_post("/known_path",
+ {'field': 'value'})
+ self.assertEqual(resp.content, b'response')
+ self.assertEqual(resp.status_code, 201)
+
+ def test_raw_put(self):
+ @urlmatch(netloc="localhost", path="/known_path", method="put")
+ def response_put_success(url, request):
+ headers = {'content-type': 'application/json'}
+ content = 'response'.encode("utf-8")
+ return response(200, content, headers, None, 5, request)
+
+ with HTTMock(response_put_success):
+ resp = self._conn.raw_put("/known_path",
+ {'field': 'value'})
+ self.assertEqual(resp.content, b'response')
+ self.assertEqual(resp.status_code, 200)
+
+ def test_raw_get_fail(self):
+
+ @urlmatch(netloc="localhost", path="/known_path", method="get")
+ def response_get_fail(url, request):
+ headers = {'content-type': 'application/json'}
+ content = "404 page not found".encode("utf-8")
+ return response(404, content, headers, None, 5, request)
+
+ with HTTMock(response_get_fail):
+ resp = self._conn.raw_get("/known_path")
+
+ self.assertEqual(resp.content, b"404 page not found")
+ self.assertEqual(resp.status_code, 404)
+
+ def test_raw_post_fail(self):
+
+ @urlmatch(netloc="localhost", path="/known_path", method="post")
+ def response_post_fail(url, request):
+ headers = {'content-type': 'application/json'}
+ content = str(["Start can't be blank"]).encode("utf-8")
+ return response(404, content, headers, None, 5, request)
+
+ with HTTMock(response_post_fail):
+ resp = self._conn.raw_post("/known_path",
+ {'field': 'value'})
+ self.assertEqual(resp.content, str(["Start can't be blank"]).encode("utf-8"))
+ self.assertEqual(resp.status_code, 404)
+
+ def test_raw_put_fail(self):
+
+ @urlmatch(netloc="localhost", path="/known_path", method="put")
+ def response_put_fail(url, request):
+ headers = {'content-type': 'application/json'}
+ content = str(["Start can't be blank"]).encode("utf-8")
+ return response(404, content, headers, None, 5, request)
+
+ with HTTMock(response_put_fail):
+ resp = self._conn.raw_put("/known_path",
+ {'field': 'value'})
+ self.assertEqual(resp.content, str(["Start can't be blank"]).encode("utf-8"))
+ self.assertEqual(resp.status_code, 404)
+
+ def test_add_param_headers(self):
+ self._conn.add_param_headers("test", "value")
+ self.assertEqual(self._conn.headers,
+ {"test": "value"})
+
+ def test_del_param_headers(self):
+ self._conn.add_param_headers("test", "value")
+ self._conn.del_param_headers("test")
+ self.assertEqual(self._conn.headers, {})
+
+ def test_clean_param_headers(self):
+ self._conn.add_param_headers("test", "value")
+ self.assertEqual(self._conn.headers,
+ {"test": "value"})
+ self._conn.clean_headers()
+ self.assertEqual(self._conn.headers, {})
+
+ def test_exist_param_headers(self):
+ self._conn.add_param_headers("test", "value")
+ self.assertTrue(self._conn.exist_param_headers("test"))
+ self.assertFalse(self._conn.exist_param_headers("test_no"))
+
+ def test_get_param_headers(self):
+ self._conn.add_param_headers("test", "value")
+ self.assertTrue(self._conn.exist_param_headers("test"))
+ self.assertFalse(self._conn.exist_param_headers("test_no"))
+
+ def test_get_headers(self):
+ self._conn.add_param_headers("test", "value")
+ self.assertEqual(self._conn.headers,
+ {"test": "value"})
diff --git a/ansible/roles/keycloak-deploy-6.0/files/python-keycloak-0.12.0/keycloak/urls_patterns.py b/ansible/roles/keycloak-deploy-6.0/files/python-keycloak-0.12.0/keycloak/urls_patterns.py
new file mode 100644
index 000000000..b57212950
--- /dev/null
+++ b/ansible/roles/keycloak-deploy-6.0/files/python-keycloak-0.12.0/keycloak/urls_patterns.py
@@ -0,0 +1,54 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2017 Marcos Pereira
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public License
+# along with this program. If not, see .
+
+# OPENID URLS
+URL_WELL_KNOWN = "realms/{realm-name}/.well-known/openid-configuration"
+URL_TOKEN = "realms/{realm-name}/protocol/openid-connect/token"
+URL_USERINFO = "realms/{realm-name}/protocol/openid-connect/userinfo"
+URL_LOGOUT = "realms/{realm-name}/protocol/openid-connect/logout"
+URL_CERTS = "realms/{realm-name}/protocol/openid-connect/certs"
+URL_INTROSPECT = "realms/{realm-name}/protocol/openid-connect/token/introspect"
+URL_ENTITLEMENT = "realms/{realm-name}/authz/entitlement/{resource-server-id}"
+
+# ADMIN URLS
+URL_ADMIN_USERS = "admin/realms/{realm-name}/users"
+URL_ADMIN_USERS_COUNT = "admin/realms/{realm-name}/users/count"
+URL_ADMIN_USER = "admin/realms/{realm-name}/users/{id}"
+URL_ADMIN_USER_CONSENTS = "admin/realms/{realm-name}/users/{id}/consents"
+URL_ADMIN_SEND_UPDATE_ACCOUNT = "admin/realms/{realm-name}/users/{id}/execute-actions-email"
+URL_ADMIN_SEND_VERIFY_EMAIL = "admin/realms/{realm-name}/users/{id}/send-verify-email"
+URL_ADMIN_RESET_PASSWORD = "admin/realms/{realm-name}/users/{id}/reset-password"
+URL_ADMIN_GET_SESSIONS = "admin/realms/{realm-name}/users/{id}/sessions"
+URL_ADMIN_USER_CLIENT_ROLES = "admin/realms/{realm-name}/users/{id}/role-mappings/clients/{client-id}"
+URL_ADMIN_USER_GROUP = "admin/realms/{realm-name}/users/{id}/groups/{group-id}"
+
+URL_ADMIN_SERVER_INFO = "admin/serverinfo"
+
+URL_ADMIN_GROUPS = "admin/realms/{realm-name}/groups"
+URL_ADMIN_GROUP = "admin/realms/{realm-name}/groups/{id}"
+URL_ADMIN_GROUP_CHILD = "admin/realms/{realm-name}/groups/{id}/children"
+URL_ADMIN_GROUP_PERMISSIONS = "admin/realms/{realm-name}/groups/{id}/management/permissions"
+
+URL_ADMIN_CLIENTS = "admin/realms/{realm-name}/clients"
+URL_ADMIN_CLIENT = "admin/realms/{realm-name}/clients/{id}"
+URL_ADMIN_CLIENT_ROLES = "admin/realms/{realm-name}/clients/{id}/roles"
+URL_ADMIN_CLIENT_ROLE = "admin/realms/{realm-name}/clients/{id}/roles/{role-name}"
+
+URL_ADMIN_REALM_ROLES = "admin/realms/{realm-name}/roles"
+
+URL_ADMIN_USER_STORAGE = "admin/realms/{realm-name}/user-storage/{id}/sync"
+URL_ADMIN_REALM = "admin/realms"
diff --git a/ansible/roles/keycloak-deploy-6.0/files/python-keycloak-0.12.0/python_keycloak.egg-info/PKG-INFO b/ansible/roles/keycloak-deploy-6.0/files/python-keycloak-0.12.0/python_keycloak.egg-info/PKG-INFO
new file mode 100644
index 000000000..e98a1ee3c
--- /dev/null
+++ b/ansible/roles/keycloak-deploy-6.0/files/python-keycloak-0.12.0/python_keycloak.egg-info/PKG-INFO
@@ -0,0 +1,18 @@
+Metadata-Version: 1.1
+Name: python-keycloak
+Version: 0.12.0
+Summary: python-keycloak is a Python package providing access to the Keycloak API.
+Home-page: https://bitbucket.org/agriness/python-keycloak
+Author: Marcos Pereira
+Author-email: marcospereira.mpj@gmail.com
+License: GNU General Public License - V3
+Description: UNKNOWN
+Keywords: keycloak openid
+Platform: UNKNOWN
+Classifier: Programming Language :: Python :: 3
+Classifier: License :: OSI Approved :: GNU General Public License v3 (GPLv3)
+Classifier: Development Status :: 3 - Alpha
+Classifier: Operating System :: MacOS
+Classifier: Operating System :: Unix
+Classifier: Operating System :: Microsoft :: Windows
+Classifier: Topic :: Utilities
diff --git a/ansible/roles/keycloak-deploy-6.0/files/python-keycloak-0.12.0/python_keycloak.egg-info/SOURCES.txt b/ansible/roles/keycloak-deploy-6.0/files/python-keycloak-0.12.0/python_keycloak.egg-info/SOURCES.txt
new file mode 100644
index 000000000..d948eb4a5
--- /dev/null
+++ b/ansible/roles/keycloak-deploy-6.0/files/python-keycloak-0.12.0/python_keycloak.egg-info/SOURCES.txt
@@ -0,0 +1,21 @@
+README.md
+setup.cfg
+setup.py
+keycloak/__init__.py
+keycloak/connection.py
+keycloak/exceptions.py
+keycloak/keycloak_admin.py
+keycloak/keycloak_main.py
+keycloak/keycloak_openid.py
+keycloak/urls_patterns.py
+keycloak/authorization/__init__.py
+keycloak/authorization/permission.py
+keycloak/authorization/policy.py
+keycloak/authorization/role.py
+keycloak/tests/__init__.py
+keycloak/tests/test_connection.py
+python_keycloak.egg-info/PKG-INFO
+python_keycloak.egg-info/SOURCES.txt
+python_keycloak.egg-info/dependency_links.txt
+python_keycloak.egg-info/requires.txt
+python_keycloak.egg-info/top_level.txt
\ No newline at end of file
diff --git a/ansible/roles/keycloak-deploy-6.0/files/python-keycloak-0.12.0/python_keycloak.egg-info/dependency_links.txt b/ansible/roles/keycloak-deploy-6.0/files/python-keycloak-0.12.0/python_keycloak.egg-info/dependency_links.txt
new file mode 100644
index 000000000..8b1378917
--- /dev/null
+++ b/ansible/roles/keycloak-deploy-6.0/files/python-keycloak-0.12.0/python_keycloak.egg-info/dependency_links.txt
@@ -0,0 +1 @@
+
diff --git a/ansible/roles/keycloak-deploy-6.0/files/python-keycloak-0.12.0/python_keycloak.egg-info/requires.txt b/ansible/roles/keycloak-deploy-6.0/files/python-keycloak-0.12.0/python_keycloak.egg-info/requires.txt
new file mode 100644
index 000000000..f3221c8ab
--- /dev/null
+++ b/ansible/roles/keycloak-deploy-6.0/files/python-keycloak-0.12.0/python_keycloak.egg-info/requires.txt
@@ -0,0 +1,3 @@
+requests==2.20.0
+httmock==1.2.5
+python-jose==1.4.0
diff --git a/ansible/roles/keycloak-deploy-6.0/files/python-keycloak-0.12.0/python_keycloak.egg-info/top_level.txt b/ansible/roles/keycloak-deploy-6.0/files/python-keycloak-0.12.0/python_keycloak.egg-info/top_level.txt
new file mode 100644
index 000000000..26c07c1da
--- /dev/null
+++ b/ansible/roles/keycloak-deploy-6.0/files/python-keycloak-0.12.0/python_keycloak.egg-info/top_level.txt
@@ -0,0 +1 @@
+keycloak
diff --git a/ansible/roles/keycloak-deploy-6.0/files/python-keycloak-0.12.0/roles.json b/ansible/roles/keycloak-deploy-6.0/files/python-keycloak-0.12.0/roles.json
new file mode 100644
index 000000000..cc5e0b324
--- /dev/null
+++ b/ansible/roles/keycloak-deploy-6.0/files/python-keycloak-0.12.0/roles.json
@@ -0,0 +1,41 @@
+{
+ "realm-management" : [
+ {
+ "id": "3ff462fc-b33c-431a-b54b-861c3298d910",
+ "name": "manage-users",
+ "description": "${role_manage-users}",
+ "scopeParamRequired": false,
+ "composite": false,"clientRole": true,
+ "containerId": "b2f45201-1362-4b10-83c3-207d470f44bf"
+ },
+ {
+ "id": "57118202-c5e5-4c49-829b-c2ed796bfdea",
+ "name": "query-users",
+ "description": "${role_query-users}",
+ "scopeParamRequired": false,
+ "composite": false,
+ "clientRole": true,
+ "containerId": "b2f45201-1362-4b10-83c3-207d470f44bf"
+ },
+ {
+ "id":"46019462-3dc8-46a8-9786-ffcbad293f43",
+ "name":"view-users",
+ "description":"${role_view-users}",
+ "scopeParamRequired":false,
+ "composite":true,
+ "clientRole":true,
+ "containerId":"b2f45201-1362-4b10-83c3-207d470f44bf"
+ }
+ ],
+ "admin-cli": [
+ {
+ "id":"30ab6b4f-b17c-4fff-a5fa-1181686bb409",
+ "name":"admin",
+ "description":"admin role",
+ "scopeParamRequired":false,
+ "composite":true,
+ "clientRole":true,
+ "containerId":"8891d8e9-35e6-4a1c-b32b-027be03b0f24"
+ }
+ ]
+}
diff --git a/ansible/roles/keycloak-deploy-6.0/files/python-keycloak-0.12.0/setup.cfg b/ansible/roles/keycloak-deploy-6.0/files/python-keycloak-0.12.0/setup.cfg
new file mode 100644
index 000000000..9f88734b5
--- /dev/null
+++ b/ansible/roles/keycloak-deploy-6.0/files/python-keycloak-0.12.0/setup.cfg
@@ -0,0 +1,7 @@
+[metadata]
+description-file = README.md
+
+[egg_info]
+tag_build =
+tag_date = 0
+
diff --git a/ansible/roles/keycloak-deploy-6.0/files/python-keycloak-0.12.0/setup.py b/ansible/roles/keycloak-deploy-6.0/files/python-keycloak-0.12.0/setup.py
new file mode 100644
index 000000000..7f8e077f9
--- /dev/null
+++ b/ansible/roles/keycloak-deploy-6.0/files/python-keycloak-0.12.0/setup.py
@@ -0,0 +1,25 @@
+# -*- coding: utf-8 -*-
+
+from setuptools import setup
+
+setup(
+ name='python-keycloak',
+ version='0.12.0',
+ url='https://bitbucket.org/agriness/python-keycloak',
+ license='GNU General Public License - V3',
+ author='Marcos Pereira',
+ author_email='marcospereira.mpj@gmail.com',
+ keywords='keycloak openid',
+ description=u'python-keycloak is a Python package providing access to the Keycloak API.',
+ packages=['keycloak', 'keycloak.authorization', 'keycloak.tests'],
+ install_requires=['requests==2.20.0', 'httmock==1.2.5', 'python-jose==1.4.0'],
+ classifiers=[
+ 'Programming Language :: Python :: 3',
+ 'License :: OSI Approved :: GNU General Public License v3 (GPLv3)',
+ 'Development Status :: 3 - Alpha',
+ 'Operating System :: MacOS',
+ 'Operating System :: Unix',
+ 'Operating System :: Microsoft :: Windows',
+ 'Topic :: Utilities'
+ ]
+)
diff --git a/ansible/roles/keycloak-deploy-6.0/tasks/bootstrap.yml b/ansible/roles/keycloak-deploy-6.0/tasks/bootstrap.yml
new file mode 100644
index 000000000..bd8eda695
--- /dev/null
+++ b/ansible/roles/keycloak-deploy-6.0/tasks/bootstrap.yml
@@ -0,0 +1,91 @@
+---
+- name: start service
+ become: true
+ command: /etc/init.d/keycloak start
+ poll: 5
+ async: 5
+ ignore_errors: true
+
+- name: Create admin user
+ become_user: "{{ wildfly_user }}"
+ command: "{{ wildfly_dir }}/bin/add-user-keycloak.sh -r master -u {{ keycloak_management_user }} -p {{ keycloak_management_password }}"
+ when: keycloak_management_user is defined and
+ keycloak_management_password is defined
+ ignore_errors: true
+
+- name: status service
+ become: true
+ command: /etc/init.d/keycloak status
+ register: keycloak
+ poll: 5
+ async: 10
+
+- name: stop service
+ become: true
+ command: /etc/init.d/keycloak stop && Pkill keycloak
+ when: "keycloak.stdout.find('running') != -1"
+ poll: 5
+ async: 10
+ ignore_errors: true
+
+- name: start service
+ become: true
+ command: /etc/init.d/keycloak start
+ poll: 5
+ async: 5
+
+- name: Waiting Until Keycloak is fully functional
+ wait_for:
+ host: "{{ inventory_hostname }}"
+ port: 8080
+ delay: 5
+
+- name: Install dependencies for keycloak
+ apt:
+ name: "{{ item }}"
+ update_cache: true
+ with_items:
+ - python-pip
+ - python-setuptools
+
+- name: Copying python libraries
+ copy:
+ src: "{{ role_path }}/files/python-keycloak-0.12.0"
+ dest: /tmp/
+
+- name: Initialize python library to run keycloak bootstrap script
+ shell: cd /tmp/python-keycloak-0.12.0 && python setup.py install
+
+- name: Save keycalok vars to json
+ template:
+ src: "keycloak-bootstrap.conf.j2"
+ dest: "/tmp/keycloak-bootstrap.conf.json"
+ mode: "0644"
+
+- name: Copy realm json file to tmp location
+ template:
+ src: "keycloak-realm.j2"
+ dest: "/tmp/keycloak-realm.json"
+ mode: "0644"
+
+- name: Copy user manager roles file to tmp location
+ copy:
+ src: "files/python-keycloak-0.12.0/roles.json"
+ dest: "/tmp/roles.json"
+ mode: "0644"
+
+- name: Pausing for 60 seconds sometime for keycloak to run completely
+ pause:
+ seconds: 60
+
+- name: Copy the keycloak bootstrap script
+ copy:
+ src: "{{ role_path }}/files/python-keycloak-0.12.0/keycloak"
+ dest: /tmp
+
+- name: Run the keycloak bootstrap script
+ shell: cd /tmp/keycloak/ && python keycloak_main.py /tmp/keycloak-bootstrap.conf.json
+ register: out
+ until: '"404" not in out.stderr'
+ retries: 2
+ delay: 10
diff --git a/ansible/roles/keycloak-deploy-6.0/tasks/custom.yml b/ansible/roles/keycloak-deploy-6.0/tasks/custom.yml
new file mode 100644
index 000000000..d7c25d63e
--- /dev/null
+++ b/ansible/roles/keycloak-deploy-6.0/tasks/custom.yml
@@ -0,0 +1,62 @@
+---
+- name: Install dependencies for keycloak
+ apt:
+ name: "{{ item }}"
+ update_cache: true
+ with_items:
+ - python-pip
+ - python-setuptools
+ run_once: true
+
+- name: Copying python libraries
+ copy:
+ src: '{{ role_path }}/files/python-keycloak-0.12.0'
+ dest: /tmp/
+ run_once: true
+
+- name: Initialize python library to run keycloak paython script
+ shell: cd /tmp/python-keycloak-0.12.0 && python setup.py install
+ run_once: true
+
+- name: Save keycloak vars to json
+ template:
+ src: "keycloak-bootstrap.conf.j2"
+ dest: "/tmp/keycloak-bootstrap.conf.json"
+ mode: "0644"
+ run_once: true
+
+- name: Copy realm json file to tmp location
+ template:
+ src: "keycloak-realm.j2"
+ dest: "/tmp/keycloak-realm.json"
+ mode: "0644"
+ run_once: true
+
+- name: Copy clients file to tmp location
+ template:
+ src: "clients.j2"
+ dest: "/tmp/clients.json"
+ mode: "0644"
+ run_once: true
+
+- name: Copy user manager roles file to tmp location
+ copy:
+ src: "files/python-keycloak-0.12.0/roles.json"
+ dest: "/tmp/roles.json"
+ mode: "0644"
+ run_once: true
+
+- name: Copy the keycloak paython script
+ copy:
+ src: "{{ role_path }}/files/python-keycloak-0.12.0/keycloak"
+ dest: /tmp
+ run_once: true
+
+- name: Run the keycloak paython script to import clients if not exist
+ shell: cd /tmp/keycloak/ && python keycloak_patch.py /tmp/keycloak-bootstrap.conf.json
+ register: out
+ until: '"404" not in out.stderr'
+ retries: 2
+ delay: 10
+ run_once: true
+ ignore_errors: true
diff --git a/ansible/roles/keycloak-deploy-6.0/tasks/deploy.yml b/ansible/roles/keycloak-deploy-6.0/tasks/deploy.yml
new file mode 100644
index 000000000..a796e2ad1
--- /dev/null
+++ b/ansible/roles/keycloak-deploy-6.0/tasks/deploy.yml
@@ -0,0 +1,205 @@
+- name: Get the list of all the services running in our OS
+ become: yes
+ service_facts:
+
+- name: Stop the monit to ensure that it doesn't start keycloak
+ service: name=monit state=stopped
+ become: yes
+ when: ansible_facts.services.monit is defined
+
+- name: Status service
+ become: true
+ command: /etc/init.d/keycloak status
+ register: keycloak
+ poll: 5
+ async: 10
+
+- name: Stop service
+ become: true
+ command: /etc/init.d/keycloak stop && Pkill keycloak
+ when: "keycloak.stdout.find('running') != -1"
+ poll: 5
+ async: 10
+ ignore_errors: true
+
+- name: Adding ENV Vars to bashrc
+ lineinfile:
+ path: '/etc/environment'
+ line: '{{item.var}}={{item.value}}'
+ regexp: "{{ item.var }}.*"
+ with_items:
+ - {var: 'sunbird_lms_base_url', value: '{{ sunbird_lms_base_url }}'}
+ - {var: 'sunbird_authorization', value: '{{ sunbird_authorization }}'}
+ - {var: 'sunbird_encryption_key', value: '{{ sunbird_encryption_key }}'}
+ - {var: 'sunbird_sso_username', value: '{{ sunbird_sso_username }}'}
+ - {var: 'sunbird_sso_password', value: '{{ sunbird_sso_password }}'}
+ - {var: 'sunbird_sso_url', value: '{{ keycloak_auth_server_url }}/'}
+ - {var: 'sunbird_sso_realm', value: '{{ keycloak_realm }}'}
+ - {var: 'sunbird_sso_client_id', value: '{{ sunbird_sso_client_id }}'}
+ - {var: 'sunbird_cassandra_host', value: '{{ sunbird_cassandra_host }}'}
+ - {var: 'sunbird_user_service_base_url', value: '{{ sunbird_user_service_base_url }}'}
+
+- name: Remove keycloak
+ become: true
+ file:
+ path: "{{ keycloak_home }}"
+ state: absent
+ owner: "{{ wildfly_user }}"
+ group: "{{ wildfly_group }}"
+ force: true
+
+- name: Creating keycloak directory
+ become: true
+ file:
+ path: "{{ keycloak_home }}"
+ state: directory
+ owner: "{{ wildfly_user }}"
+ group: "{{ wildfly_group }}"
+
+- name: Extarct the folder
+ unarchive:
+ src: "{{ artifact_path }}"
+ dest: "{{ keycloak_home }}"
+ owner: "{{ wildfly_user }}"
+ group: "{{ wildfly_group }}"
+
+- name: Creating keycloak directory in proper structure
+ become: yes
+ shell: "cd {{ keycloak_home }} ; mv sunbird_auth_1.0v/* ./ ; rm -rf sunbird_auth_1.0v; chown -R keycloak:keycloak {{ keycloak_home }}"
+
+- name: Create required directories
+ file:
+ path: "{{ item.dest }}"
+ mode: "{{ item.mode }}"
+ state: directory
+ with_items:
+ - {dest: '{{ keycloak_home }}/providers', mode: '0755'}
+ - {dest: '{{ keycloak_home }}/modules/system/layers/keycloak/org/postgresql/main', mode: '0755'}
+ - {dest: '{{ keycloak_home }}/themes/{{ tenant_name }}/login/messages', mode: '0755'}
+ - {dest: '{{ keycloak_home }}/themes/{{ tenant_name }}/login/resources/css/fonts/notosans', mode: '0755'}
+ - {dest: '{{ keycloak_home }}/themes/{{ tenant_name }}/login/resources/css/themes/default/assets/fonts', mode: '0755'}
+ - {dest: '{{ keycloak_home }}/themes/{{ tenant_name }}/login/resources/img', mode: '0755'}
+ - {dest: '{{ keycloak_home }}/themes/{{ tenant_name }}/login/resources/js', mode: '0755'}
+ - {dest: '{{ keycloak_home }}/themes/{{ tenant_name }}/email/html', mode: '0755'}
+ - {dest: '{{ keycloak_home }}/themes/{{ tenant_name }}/email/messages', mode: '0755'}
+ - {dest: '{{ keycloak_home }}/themes/{{ tenant_name }}/email/text', mode: '0755'}
+
+- name: Copy login theme
+ copy:
+ src: "{{ login_theme }}/"
+ dest: "{{ keycloak_home }}/themes/{{ tenant_name }}/login/"
+ force: "yes"
+
+- name: Copy Custom Validation theme html to login theme
+ copy:
+ src: "../../../sunbird-auth/keycloak/sms-provider/templates/"
+ dest: "{{ keycloak_home }}/themes/{{ tenant_name }}/login/"
+ force: true
+
+- name: Copy email theme
+ copy:
+ src: "{{ email_theme }}/"
+ dest: "{{ keycloak_home }}/themes/{{ tenant_name }}/email/"
+ force: true
+
+- name: Create directory for sunbird auth package config
+ file:
+ path: sunbird_auth_{{ sunbird_auth_version }}.config
+ state: directory
+ mode: 0755
+ force: true
+
+- name: Keycloak configuration XML file - Multi-node keycloak
+ template:
+ src: "standalone-ha.xml"
+ dest: "sunbird_auth_{{ sunbird_auth_version }}.config/standalone-ha.xml"
+ mode: 0750
+ when: groups['keycloak'] | length > 1
+
+- name: Keycloak configuration XML file - Single node keycloak
+ template:
+ src: "standalone-ha-single.xml"
+ dest: "sunbird_auth_{{ sunbird_auth_version }}.config/standalone-ha.xml"
+ mode: 0750
+ when: groups['keycloak'] | length < 2
+
+- name: Postgresql Configuration- module.xml
+ template:
+ src: "roles/keycloak-deploy/templates/module.xml.j2"
+ dest: "sunbird_auth_{{ sunbird_auth_version }}.config/module.xml"
+ mode: 0750
+
+- name: SMS provider configuration file
+ template:
+ src: "roles/keycloak-deploy/templates/Msg91Creds.json.j2"
+ dest: "sunbird_auth_{{ sunbird_auth_version }}.config/Msg91Creds.json"
+ mode: 0755
+ when: "{{ msg_91_required|default(false) }}"
+ ignore_errors: true
+
+- name: Keycloak configuration XML file
+ copy:
+ src: "sunbird_auth_{{ sunbird_auth_version }}.config/standalone-ha.xml"
+ dest: "{{ keycloak_home }}/standalone/configuration/standalone-ha.xml"
+ mode: 0750
+ owner: "{{ wildfly_user }}"
+ group: "{{ wildfly_group }}"
+ remote_src: true
+
+- name: Postgresql Configuration- module.xml
+ copy:
+ src: "sunbird_auth_{{ sunbird_auth_version }}.config/module.xml"
+ dest: "{{ keycloak_home }}/modules/system/layers/keycloak/org/postgresql/main/module.xml"
+ mode: 0750
+ owner: "{{ wildfly_user }}"
+ group: "{{ wildfly_group }}"
+ remote_src: true
+
+- name: Create a directory for SMS provider configuration
+ file:
+ path: "{{ keycloak_home }}/bin/sms-provider"
+ state: directory
+ mode: 0755
+ when: "{{ msg_91_required|default(false) }}"
+ ignore_errors: true
+
+- name: SMS provider configuration file
+ copy:
+ src: "sunbird_auth_{{ sunbird_auth_version }}.config/Msg91Creds.json"
+ dest: "{{ keycloak_home }}/bin/sms-provider/Msg91Creds.json"
+ owner: "{{ wildfly_user }}"
+ group: "{{ wildfly_group }}"
+ mode: 0755
+ remote_src: true
+ when: "{{ msg_91_required|default(false) }}"
+ ignore_errors: true
+
+- name: Remove the sunbird_auth_{{ sunbird_auth_version }}.config
+ become: true
+ file:
+ path: ./sunbird_auth_{{ sunbird_auth_version }}.config
+ state: absent
+ force: true
+
+- name: Overriding JAVA_HOME
+ become: true
+ lineinfile:
+ regexp: '^SERVER_OPTS=""'
+ insertafter: '^SERVER_OPTS=""'
+ line: 'JAVA_HOME=""'
+ path: "{{ keycloak_home }}/bin/standalone.sh"
+
+- name: Start service
+ become: true
+ command: /etc/init.d/keycloak start
+ poll: 5
+ async: 5
+
+- name: get the list of all services in the system
+ become: yes
+ service_facts:
+
+- name: After succesful migration and staring of keycloak, start back monit if installed
+ service: name=monit state=started
+ become: yes
+ when: ansible_facts.services.monit is defined
diff --git a/ansible/roles/keycloak-deploy-6.0/tasks/main.yml b/ansible/roles/keycloak-deploy-6.0/tasks/main.yml
new file mode 100644
index 000000000..e0b3ae699
--- /dev/null
+++ b/ansible/roles/keycloak-deploy-6.0/tasks/main.yml
@@ -0,0 +1,13 @@
+---
+- include: bootstrap.yml
+ tags:
+ - bootstrap
+
+- include: deploy.yml
+ tags:
+ - deploy
+
+- include: custom.yml
+ tags:
+ - custom
+
diff --git a/ansible/roles/keycloak-deploy-6.0/templates/Msg91Creds.json.j2 b/ansible/roles/keycloak-deploy-6.0/templates/Msg91Creds.json.j2
new file mode 100644
index 000000000..d584b8be7
--- /dev/null
+++ b/ansible/roles/keycloak-deploy-6.0/templates/Msg91Creds.json.j2
@@ -0,0 +1,7 @@
+{
+ "auth_key": "{{vault_auth_key}}",
+ "sender": "{{vault_sender}}",
+ "country": "{{vault_country}}",
+ "route": "{{vault_route}}",
+ "sms_method_type": "{{vault_sms_method_type}}"
+}
diff --git a/ansible/roles/keycloak-deploy-6.0/templates/clients.j2 b/ansible/roles/keycloak-deploy-6.0/templates/clients.j2
new file mode 100644
index 000000000..c34437cf6
--- /dev/null
+++ b/ansible/roles/keycloak-deploy-6.0/templates/clients.j2
@@ -0,0 +1,262 @@
+{
+ "clients": [
+ {
+ "clientId": "google-auth-android",
+ "rootUrl": "{{proto}}://{{proxy_server_name}}",
+ "adminUrl": "",
+ "baseUrl": "/",
+ "surrogateAuthRequired": false,
+ "enabled": true,
+ "clientAuthenticatorType": "client-secret",
+ "redirectUris": [
+ "{{proto}}://{{proxy_server_name}}/*"
+ ],
+ "webOrigins": [],
+ "notBefore": 0,
+ "bearerOnly": false,
+ "consentRequired": false,
+ "standardFlowEnabled": false,
+ "implicitFlowEnabled": false,
+ "directAccessGrantsEnabled": true,
+ "serviceAccountsEnabled": false,
+ "publicClient": false,
+ "frontchannelLogout": false,
+ "protocol": "openid-connect",
+ "attributes": {
+ "saml.assertion.signature": "false",
+ "saml.force.post.binding": "false",
+ "saml.multivalued.roles": "false",
+ "saml.encrypt": "false",
+ "saml_force_name_id_format": "false",
+ "saml.client.signature": "false",
+ "saml.authnstatement": "false",
+ "saml.server.signature": "false",
+ "saml.server.signature.keyinfo.ext": "false",
+ "saml.onetimeuse.condition": "false"
+ },
+ "fullScopeAllowed": true,
+ "nodeReRegistrationTimeout": -1,
+ "protocolMappers": [
+ {
+ "name": "full name",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-full-name-mapper",
+ "consentRequired": true,
+ "consentText": "${fullName}",
+ "config": {
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "userinfo.token.claim": "true"
+ }
+ },
+ {
+ "name": "username",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-usermodel-property-mapper",
+ "consentRequired": true,
+ "consentText": "${username}",
+ "config": {
+ "userinfo.token.claim": "true",
+ "user.attribute": "username",
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "claim.name": "preferred_username",
+ "jsonType.label": "String"
+ }
+ },
+ {
+ "name": "family name",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-usermodel-property-mapper",
+ "consentRequired": true,
+ "consentText": "${familyName}",
+ "config": {
+ "userinfo.token.claim": "true",
+ "user.attribute": "lastName",
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "claim.name": "family_name",
+ "jsonType.label": "String"
+ }
+ },
+ {
+ "name": "role list",
+ "protocol": "saml",
+ "protocolMapper": "saml-role-list-mapper",
+ "consentRequired": false,
+ "config": {
+ "single": "false",
+ "attribute.nameformat": "Basic",
+ "attribute.name": "Role"
+ }
+ },
+ {
+ "name": "given name",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-usermodel-property-mapper",
+ "consentRequired": true,
+ "consentText": "${givenName}",
+ "config": {
+ "userinfo.token.claim": "true",
+ "user.attribute": "firstName",
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "claim.name": "given_name",
+ "jsonType.label": "String"
+ }
+ },
+ {
+ "name": "email",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-usermodel-property-mapper",
+ "consentRequired": true,
+ "consentText": "${email}",
+ "config": {
+ "userinfo.token.claim": "true",
+ "user.attribute": "email",
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "claim.name": "email",
+ "jsonType.label": "String"
+ }
+ }
+ ],
+ "useTemplateConfig": false,
+ "useTemplateScope": false,
+ "useTemplateMappers": false,
+ "access": {
+ "view": true,
+ "configure": true,
+ "manage": true
+ }
+ },
+ {
+ "clientId": "trampoline-android",
+ "rootUrl": "{{proto}}://{{proxy_server_name}}",
+ "adminUrl": "",
+ "baseUrl": "/",
+ "surrogateAuthRequired": false,
+ "enabled": true,
+ "clientAuthenticatorType": "client-secret",
+ "redirectUris": [],
+ "webOrigins": [],
+ "notBefore": 0,
+ "bearerOnly": false,
+ "consentRequired": false,
+ "standardFlowEnabled": false,
+ "implicitFlowEnabled": false,
+ "directAccessGrantsEnabled": true,
+ "serviceAccountsEnabled": false,
+ "publicClient": false,
+ "frontchannelLogout": false,
+ "protocol": "openid-connect",
+ "attributes": {
+ "saml.assertion.signature": "false",
+ "saml.force.post.binding": "false",
+ "saml.multivalued.roles": "false",
+ "saml.encrypt": "false",
+ "saml_force_name_id_format": "false",
+ "saml.client.signature": "false",
+ "saml.authnstatement": "false",
+ "saml.server.signature": "false",
+ "saml.server.signature.keyinfo.ext": "false",
+ "saml.onetimeuse.condition": "false"
+ },
+ "fullScopeAllowed": true,
+ "nodeReRegistrationTimeout": -1,
+ "protocolMappers": [
+ {
+ "name": "role list",
+ "protocol": "saml",
+ "protocolMapper": "saml-role-list-mapper",
+ "consentRequired": false,
+ "config": {
+ "single": "false",
+ "attribute.nameformat": "Basic",
+ "attribute.name": "Role"
+ }
+ },
+ {
+ "name": "family name",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-usermodel-property-mapper",
+ "consentRequired": true,
+ "consentText": "${familyName}",
+ "config": {
+ "userinfo.token.claim": "true",
+ "user.attribute": "lastName",
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "claim.name": "family_name",
+ "jsonType.label": "String"
+ }
+ },
+ {
+ "name": "full name",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-full-name-mapper",
+ "consentRequired": true,
+ "consentText": "${fullName}",
+ "config": {
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "userinfo.token.claim": "true"
+ }
+ },
+ {
+ "name": "username",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-usermodel-property-mapper",
+ "consentRequired": true,
+ "consentText": "${username}",
+ "config": {
+ "userinfo.token.claim": "true",
+ "user.attribute": "username",
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "claim.name": "preferred_username",
+ "jsonType.label": "String"
+ }
+ },
+ {
+ "name": "email",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-usermodel-property-mapper",
+ "consentRequired": true,
+ "consentText": "${email}",
+ "config": {
+ "userinfo.token.claim": "true",
+ "user.attribute": "email",
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "claim.name": "email",
+ "jsonType.label": "String"
+ }
+ },
+ {
+ "name": "given name",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-usermodel-property-mapper",
+ "consentRequired": true,
+ "consentText": "${givenName}",
+ "config": {
+ "userinfo.token.claim": "true",
+ "user.attribute": "firstName",
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "claim.name": "given_name",
+ "jsonType.label": "String"
+ }
+ }
+ ],
+ "useTemplateConfig": false,
+ "useTemplateScope": false,
+ "useTemplateMappers": false,
+ "access": {
+ "view": true,
+ "configure": true,
+ "manage": true
+ }
+ }
+ ]
+}
\ No newline at end of file
diff --git a/ansible/roles/keycloak-deploy-6.0/templates/clients.json b/ansible/roles/keycloak-deploy-6.0/templates/clients.json
new file mode 100644
index 000000000..c34437cf6
--- /dev/null
+++ b/ansible/roles/keycloak-deploy-6.0/templates/clients.json
@@ -0,0 +1,262 @@
+{
+ "clients": [
+ {
+ "clientId": "google-auth-android",
+ "rootUrl": "{{proto}}://{{proxy_server_name}}",
+ "adminUrl": "",
+ "baseUrl": "/",
+ "surrogateAuthRequired": false,
+ "enabled": true,
+ "clientAuthenticatorType": "client-secret",
+ "redirectUris": [
+ "{{proto}}://{{proxy_server_name}}/*"
+ ],
+ "webOrigins": [],
+ "notBefore": 0,
+ "bearerOnly": false,
+ "consentRequired": false,
+ "standardFlowEnabled": false,
+ "implicitFlowEnabled": false,
+ "directAccessGrantsEnabled": true,
+ "serviceAccountsEnabled": false,
+ "publicClient": false,
+ "frontchannelLogout": false,
+ "protocol": "openid-connect",
+ "attributes": {
+ "saml.assertion.signature": "false",
+ "saml.force.post.binding": "false",
+ "saml.multivalued.roles": "false",
+ "saml.encrypt": "false",
+ "saml_force_name_id_format": "false",
+ "saml.client.signature": "false",
+ "saml.authnstatement": "false",
+ "saml.server.signature": "false",
+ "saml.server.signature.keyinfo.ext": "false",
+ "saml.onetimeuse.condition": "false"
+ },
+ "fullScopeAllowed": true,
+ "nodeReRegistrationTimeout": -1,
+ "protocolMappers": [
+ {
+ "name": "full name",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-full-name-mapper",
+ "consentRequired": true,
+ "consentText": "${fullName}",
+ "config": {
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "userinfo.token.claim": "true"
+ }
+ },
+ {
+ "name": "username",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-usermodel-property-mapper",
+ "consentRequired": true,
+ "consentText": "${username}",
+ "config": {
+ "userinfo.token.claim": "true",
+ "user.attribute": "username",
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "claim.name": "preferred_username",
+ "jsonType.label": "String"
+ }
+ },
+ {
+ "name": "family name",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-usermodel-property-mapper",
+ "consentRequired": true,
+ "consentText": "${familyName}",
+ "config": {
+ "userinfo.token.claim": "true",
+ "user.attribute": "lastName",
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "claim.name": "family_name",
+ "jsonType.label": "String"
+ }
+ },
+ {
+ "name": "role list",
+ "protocol": "saml",
+ "protocolMapper": "saml-role-list-mapper",
+ "consentRequired": false,
+ "config": {
+ "single": "false",
+ "attribute.nameformat": "Basic",
+ "attribute.name": "Role"
+ }
+ },
+ {
+ "name": "given name",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-usermodel-property-mapper",
+ "consentRequired": true,
+ "consentText": "${givenName}",
+ "config": {
+ "userinfo.token.claim": "true",
+ "user.attribute": "firstName",
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "claim.name": "given_name",
+ "jsonType.label": "String"
+ }
+ },
+ {
+ "name": "email",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-usermodel-property-mapper",
+ "consentRequired": true,
+ "consentText": "${email}",
+ "config": {
+ "userinfo.token.claim": "true",
+ "user.attribute": "email",
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "claim.name": "email",
+ "jsonType.label": "String"
+ }
+ }
+ ],
+ "useTemplateConfig": false,
+ "useTemplateScope": false,
+ "useTemplateMappers": false,
+ "access": {
+ "view": true,
+ "configure": true,
+ "manage": true
+ }
+ },
+ {
+ "clientId": "trampoline-android",
+ "rootUrl": "{{proto}}://{{proxy_server_name}}",
+ "adminUrl": "",
+ "baseUrl": "/",
+ "surrogateAuthRequired": false,
+ "enabled": true,
+ "clientAuthenticatorType": "client-secret",
+ "redirectUris": [],
+ "webOrigins": [],
+ "notBefore": 0,
+ "bearerOnly": false,
+ "consentRequired": false,
+ "standardFlowEnabled": false,
+ "implicitFlowEnabled": false,
+ "directAccessGrantsEnabled": true,
+ "serviceAccountsEnabled": false,
+ "publicClient": false,
+ "frontchannelLogout": false,
+ "protocol": "openid-connect",
+ "attributes": {
+ "saml.assertion.signature": "false",
+ "saml.force.post.binding": "false",
+ "saml.multivalued.roles": "false",
+ "saml.encrypt": "false",
+ "saml_force_name_id_format": "false",
+ "saml.client.signature": "false",
+ "saml.authnstatement": "false",
+ "saml.server.signature": "false",
+ "saml.server.signature.keyinfo.ext": "false",
+ "saml.onetimeuse.condition": "false"
+ },
+ "fullScopeAllowed": true,
+ "nodeReRegistrationTimeout": -1,
+ "protocolMappers": [
+ {
+ "name": "role list",
+ "protocol": "saml",
+ "protocolMapper": "saml-role-list-mapper",
+ "consentRequired": false,
+ "config": {
+ "single": "false",
+ "attribute.nameformat": "Basic",
+ "attribute.name": "Role"
+ }
+ },
+ {
+ "name": "family name",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-usermodel-property-mapper",
+ "consentRequired": true,
+ "consentText": "${familyName}",
+ "config": {
+ "userinfo.token.claim": "true",
+ "user.attribute": "lastName",
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "claim.name": "family_name",
+ "jsonType.label": "String"
+ }
+ },
+ {
+ "name": "full name",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-full-name-mapper",
+ "consentRequired": true,
+ "consentText": "${fullName}",
+ "config": {
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "userinfo.token.claim": "true"
+ }
+ },
+ {
+ "name": "username",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-usermodel-property-mapper",
+ "consentRequired": true,
+ "consentText": "${username}",
+ "config": {
+ "userinfo.token.claim": "true",
+ "user.attribute": "username",
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "claim.name": "preferred_username",
+ "jsonType.label": "String"
+ }
+ },
+ {
+ "name": "email",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-usermodel-property-mapper",
+ "consentRequired": true,
+ "consentText": "${email}",
+ "config": {
+ "userinfo.token.claim": "true",
+ "user.attribute": "email",
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "claim.name": "email",
+ "jsonType.label": "String"
+ }
+ },
+ {
+ "name": "given name",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-usermodel-property-mapper",
+ "consentRequired": true,
+ "consentText": "${givenName}",
+ "config": {
+ "userinfo.token.claim": "true",
+ "user.attribute": "firstName",
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "claim.name": "given_name",
+ "jsonType.label": "String"
+ }
+ }
+ ],
+ "useTemplateConfig": false,
+ "useTemplateScope": false,
+ "useTemplateMappers": false,
+ "access": {
+ "view": true,
+ "configure": true,
+ "manage": true
+ }
+ }
+ ]
+}
\ No newline at end of file
diff --git a/ansible/roles/keycloak-deploy-6.0/templates/keycloak-bootstrap.conf.j2 b/ansible/roles/keycloak-deploy-6.0/templates/keycloak-bootstrap.conf.j2
new file mode 100644
index 000000000..71551589f
--- /dev/null
+++ b/ansible/roles/keycloak-deploy-6.0/templates/keycloak-bootstrap.conf.j2
@@ -0,0 +1,14 @@
+{
+ "keycloak_auth_server_url": "http://localhost:8080/auth/",
+ "keycloak_management_user": "{{ keycloak_management_user }}",
+ "keycloak_management_password": "{{ keycloak_management_password }}",
+ "keycloak_realm": "{{ keycloak_realm }}",
+ "keycloak_realm_json_file_path": "/tmp/keycloak-realm.json",
+ "keycloak_user_manager_roles_json_file_path": "/tmp/roles.json",
+ "keycloak_api_management_username": "{{ keycloak_api_management_username }}",
+ "keycloak_api_management_user_email": "{{ keycloak_api_management_user_email }}",
+ "keycloak_api_management_user_first_name": "{{ keycloak_api_management_user_first_name }}",
+ "keycloak_api_management_user_last_name": "{{ keycloak_api_management_user_last_name }}",
+ "keycloak_api_management_user_password": "{{ keycloak_api_management_user_password }}",
+ "keycloak_clients": "/tmp/clients.json"
+}
diff --git a/ansible/roles/keycloak-deploy-6.0/templates/keycloak-realm.j2 b/ansible/roles/keycloak-deploy-6.0/templates/keycloak-realm.j2
new file mode 100644
index 000000000..7ce7e8820
--- /dev/null
+++ b/ansible/roles/keycloak-deploy-6.0/templates/keycloak-realm.j2
@@ -0,0 +1,2648 @@
+{
+ "id": "sunbird",
+ "realm": "sunbird",
+ "notBefore": 1548955037,
+ "revokeRefreshToken": false,
+ "accessTokenLifespan": 86400,
+ "accessTokenLifespanForImplicitFlow": 5184000,
+ "ssoSessionIdleTimeout": 86400,
+ "ssoSessionMaxLifespan": 86400,
+ "offlineSessionIdleTimeout": 15552000,
+ "accessCodeLifespan": 60,
+ "accessCodeLifespanUserAction": 300,
+ "accessCodeLifespanLogin": 43200,
+ "actionTokenGeneratedByAdminLifespan": 43200,
+ "actionTokenGeneratedByUserLifespan": 300,
+ "enabled": true,
+ "sslRequired": {{ '"none"' if proto=='http' else '"external"' }},
+ "registrationAllowed": true,
+ "registrationEmailAsUsername": false,
+ "rememberMe": true,
+ "verifyEmail": false,
+ "loginWithEmailAllowed": true,
+ "duplicateEmailsAllowed": false,
+ "resetPasswordAllowed": true,
+ "editUsernameAllowed": false,
+ "bruteForceProtected": true,
+ "permanentLockout": false,
+ "maxFailureWaitSeconds": 900,
+ "minimumQuickLoginWaitSeconds": 60,
+ "waitIncrementSeconds": 60,
+ "quickLoginCheckMilliSeconds": 1000,
+ "maxDeltaTimeSeconds": 43200,
+ "failureFactor": 30,
+ "roles": {
+ "realm": [
+ {
+ "id": "7b955d7f-0a1e-4935-8391-642886d34612",
+ "name": "offline_access",
+ "description": "${role_offline-access}",
+ "scopeParamRequired": true,
+ "composite": false,
+ "clientRole": false,
+ "containerId": "sunbird"
+ },
+ {
+ "id": "d6e505fe-c3c5-4689-946e-7f69d3f64c6c",
+ "name": "admin",
+ "description": "role_admin",
+ "scopeParamRequired": false,
+ "composite": true,
+ "composites": {
+ "realm": [
+ "offline_access",
+ "uma_authorization"
+ ]
+ },
+ "clientRole": false,
+ "containerId": "sunbird"
+ },
+ {
+ "id": "96adf368-c8e2-4b39-b2a5-2559573edb63",
+ "name": "uma_authorization",
+ "description": "${role_uma_authorization}",
+ "scopeParamRequired": false,
+ "composite": false,
+ "clientRole": false,
+ "containerId": "sunbird"
+ }
+ ],
+ "client": {
+ "realm-management": [
+ {
+ "id": "3f8bf7e5-5d66-4394-8f06-1270529c605f",
+ "name": "manage-authorization",
+ "description": "${role_manage-authorization}",
+ "scopeParamRequired": false,
+ "composite": false,
+ "clientRole": true,
+ "containerId": "b2f45201-1362-4b10-83c3-207d470f44bf"
+ },
+ {
+ "id": "601fa2c9-29d4-49c1-87ac-939a1260f6ce",
+ "name": "query-realms",
+ "description": "${role_query-realms}",
+ "scopeParamRequired": false,
+ "composite": false,
+ "clientRole": true,
+ "containerId": "b2f45201-1362-4b10-83c3-207d470f44bf"
+ },
+ {
+ "id": "9aa1dcd9-cb93-4496-af5f-41b9ecacc1da",
+ "name": "view-authorization",
+ "description": "${role_view-authorization}",
+ "scopeParamRequired": false,
+ "composite": false,
+ "clientRole": true,
+ "containerId": "b2f45201-1362-4b10-83c3-207d470f44bf"
+ },
+ {
+ "id": "98999987-faf5-4c4e-958a-e5463bc4edc6",
+ "name": "manage-events",
+ "description": "${role_manage-events}",
+ "scopeParamRequired": false,
+ "composite": false,
+ "clientRole": true,
+ "containerId": "b2f45201-1362-4b10-83c3-207d470f44bf"
+ },
+ {
+ "id": "f898fca8-5361-49d5-900a-ebf5b775a939",
+ "name": "impersonation",
+ "description": "${role_impersonation}",
+ "scopeParamRequired": false,
+ "composite": false,
+ "clientRole": true,
+ "containerId": "b2f45201-1362-4b10-83c3-207d470f44bf"
+ },
+ {
+ "id": "698dfeb0-b8d2-4240-b8a8-acd4b7a12ad3",
+ "name": "view-realm",
+ "description": "${role_view-realm}",
+ "scopeParamRequired": false,
+ "composite": false,
+ "clientRole": true,
+ "containerId": "b2f45201-1362-4b10-83c3-207d470f44bf"
+ },
+ {
+ "id": "3ff462fc-b33c-431a-b54b-861c3298d910",
+ "name": "manage-users",
+ "description": "${role_manage-users}",
+ "scopeParamRequired": false,
+ "composite": false,
+ "clientRole": true,
+ "containerId": "b2f45201-1362-4b10-83c3-207d470f44bf"
+ },
+ {
+ "id": "be1802b1-558c-404c-bcb9-b9bf77af9788",
+ "name": "manage-identity-providers",
+ "description": "${role_manage-identity-providers}",
+ "scopeParamRequired": false,
+ "composite": false,
+ "clientRole": true,
+ "containerId": "b2f45201-1362-4b10-83c3-207d470f44bf"
+ },
+ {
+ "id": "387b44e4-e901-4431-b9af-6abd9377ed46",
+ "name": "query-clients",
+ "description": "${role_query-clients}",
+ "scopeParamRequired": false,
+ "composite": false,
+ "clientRole": true,
+ "containerId": "b2f45201-1362-4b10-83c3-207d470f44bf"
+ },
+ {
+ "id": "a408b6e8-03c9-46a2-97ba-305d09db0c3c",
+ "name": "view-events",
+ "description": "${role_view-events}",
+ "scopeParamRequired": false,
+ "composite": false,
+ "clientRole": true,
+ "containerId": "b2f45201-1362-4b10-83c3-207d470f44bf"
+ },
+ {
+ "id": "41c2f39a-3008-4f9d-9e1e-a7738c118570",
+ "name": "query-groups",
+ "description": "${role_query-groups}",
+ "scopeParamRequired": false,
+ "composite": false,
+ "clientRole": true,
+ "containerId": "b2f45201-1362-4b10-83c3-207d470f44bf"
+ },
+ {
+ "id": "26d3289b-d2eb-4cf2-a501-f1e3fa07344c",
+ "name": "manage-clients",
+ "description": "${role_manage-clients}",
+ "scopeParamRequired": false,
+ "composite": false,
+ "clientRole": true,
+ "containerId": "b2f45201-1362-4b10-83c3-207d470f44bf"
+ },
+ {
+ "id": "e2077ab0-6efb-450d-9cba-89cacd887b71",
+ "name": "create-client",
+ "description": "${role_create-client}",
+ "scopeParamRequired": false,
+ "composite": false,
+ "clientRole": true,
+ "containerId": "b2f45201-1362-4b10-83c3-207d470f44bf"
+ },
+ {
+ "id": "46019462-3dc8-46a8-9786-ffcbad293f43",
+ "name": "view-users",
+ "description": "${role_view-users}",
+ "scopeParamRequired": false,
+ "composite": true,
+ "composites": {
+ "client": {
+ "realm-management": [
+ "query-groups",
+ "query-users"
+ ]
+ }
+ },
+ "clientRole": true,
+ "containerId": "b2f45201-1362-4b10-83c3-207d470f44bf"
+ },
+ {
+ "id": "d269f220-e93f-4b43-96a1-9f2c117a2dfb",
+ "name": "view-clients",
+ "description": "${role_view-clients}",
+ "scopeParamRequired": false,
+ "composite": true,
+ "composites": {
+ "client": {
+ "realm-management": [
+ "query-clients"
+ ]
+ }
+ },
+ "clientRole": true,
+ "containerId": "b2f45201-1362-4b10-83c3-207d470f44bf"
+ },
+ {
+ "id": "0c998f1b-7363-47fb-a493-4b6f4aacb0ba",
+ "name": "realm-admin",
+ "description": "${role_realm-admin}",
+ "scopeParamRequired": false,
+ "composite": true,
+ "composites": {
+ "client": {
+ "realm-management": [
+ "manage-authorization",
+ "query-realms",
+ "view-authorization",
+ "manage-events",
+ "impersonation",
+ "view-realm",
+ "manage-users",
+ "manage-identity-providers",
+ "query-clients",
+ "view-events",
+ "query-groups",
+ "manage-clients",
+ "create-client",
+ "view-users",
+ "view-clients",
+ "manage-realm",
+ "view-identity-providers",
+ "query-users"
+ ]
+ }
+ },
+ "clientRole": true,
+ "containerId": "b2f45201-1362-4b10-83c3-207d470f44bf"
+ },
+ {
+ "id": "d77bf5a5-5877-450b-b11e-5f874f410e10",
+ "name": "manage-realm",
+ "description": "${role_manage-realm}",
+ "scopeParamRequired": false,
+ "composite": false,
+ "clientRole": true,
+ "containerId": "b2f45201-1362-4b10-83c3-207d470f44bf"
+ },
+ {
+ "id": "d97009ed-d0c7-4afb-b9a3-6ee03ef01a74",
+ "name": "view-identity-providers",
+ "description": "${role_view-identity-providers}",
+ "scopeParamRequired": false,
+ "composite": false,
+ "clientRole": true,
+ "containerId": "b2f45201-1362-4b10-83c3-207d470f44bf"
+ },
+ {
+ "id": "57118202-c5e5-4c49-829b-c2ed796bfdea",
+ "name": "query-users",
+ "description": "${role_query-users}",
+ "scopeParamRequired": false,
+ "composite": false,
+ "clientRole": true,
+ "containerId": "b2f45201-1362-4b10-83c3-207d470f44bf"
+ }
+ ],
+ "security-admin-console": [],
+ "android": [],
+ "admin-cli": [
+ {
+ "id": "30ab6b4f-b17c-4fff-a5fa-1181686bb409",
+ "name": "admin",
+ "description": "admin role",
+ "scopeParamRequired": false,
+ "composite": true,
+ "composites": {
+ "realm": [
+ "offline_access",
+ "admin",
+ "uma_authorization"
+ ]
+ },
+ "clientRole": true,
+ "containerId": "8891d8e9-35e6-4a1c-b32b-027be03b0f24"
+ }
+ ],
+ "trampoline": [],
+ "broker": [
+ {
+ "id": "19ef58ac-2d90-40a4-a158-0e2f8893264a",
+ "name": "read-token",
+ "description": "${role_read-token}",
+ "scopeParamRequired": false,
+ "composite": false,
+ "clientRole": true,
+ "containerId": "c3950efa-6684-44c2-b50a-c7b3d16df04b"
+ }
+ ],
+ "portal": [],
+ "account": [
+ {
+ "id": "1fef7ac5-b042-462b-8298-0446044788b3",
+ "name": "manage-account",
+ "description": "${role_manage-account}",
+ "scopeParamRequired": false,
+ "composite": true,
+ "composites": {
+ "client": {
+ "account": [
+ "manage-account-links"
+ ]
+ }
+ },
+ "clientRole": true,
+ "containerId": "c2d24d3f-65ca-46de-9cd8-3eeb71a7f83d"
+ },
+ {
+ "id": "f8786348-6fa4-4b13-828e-9f080c9c6824",
+ "name": "manage-account-links",
+ "description": "${role_manage-account-links}",
+ "scopeParamRequired": false,
+ "composite": false,
+ "clientRole": true,
+ "containerId": "c2d24d3f-65ca-46de-9cd8-3eeb71a7f83d"
+ },
+ {
+ "id": "91c5c738-9c39-4c4d-bae8-75f18fd7c5e4",
+ "name": "view-profile",
+ "description": "${role_view-profile}",
+ "scopeParamRequired": false,
+ "composite": false,
+ "clientRole": true,
+ "containerId": "c2d24d3f-65ca-46de-9cd8-3eeb71a7f83d"
+ }
+ ],
+ "google-auth": [],
+ "google-auth-android": [],
+ "trampoline-android": []
+ }
+ },
+ "groups": [],
+ "defaultRoles": [
+ "offline_access",
+ "uma_authorization"
+ ],
+ "requiredCredentials": [
+ "password"
+ ],
+ "passwordPolicy": "hashIterations(20000)",
+ "otpPolicyType": "totp",
+ "otpPolicyAlgorithm": "HmacSHA1",
+ "otpPolicyInitialCounter": 0,
+ "otpPolicyDigits": 6,
+ "otpPolicyLookAheadWindow": 1,
+ "otpPolicyPeriod": 120,
+ "clientScopeMappings": {
+ "realm-management": [
+ {
+ "client": "admin-cli",
+ "roles": [
+ "realm-admin"
+ ]
+ },
+ {
+ "client": "security-admin-console",
+ "roles": [
+ "realm-admin"
+ ]
+ }
+ ]
+ },
+ "clients": [
+ {
+ "id": "9a901d18-377b-4615-9b89-677b544be3c5",
+ "clientId": "trampoline",
+ "rootUrl": "{{proto}}://{{proxy_server_name}}",
+ "adminUrl": "",
+ "baseUrl": "/",
+ "surrogateAuthRequired": false,
+ "enabled": true,
+ "clientAuthenticatorType": "client-secret",
+ "secret": "{{sunbird_trampoline_secret}}",
+ "redirectUris": [],
+ "webOrigins": [],
+ "notBefore": 0,
+ "bearerOnly": false,
+ "consentRequired": false,
+ "standardFlowEnabled": false,
+ "implicitFlowEnabled": false,
+ "directAccessGrantsEnabled": true,
+ "serviceAccountsEnabled": false,
+ "publicClient": false,
+ "frontchannelLogout": false,
+ "protocol": "openid-connect",
+ "attributes": {
+ "saml.assertion.signature": "false",
+ "saml.force.post.binding": "false",
+ "saml.multivalued.roles": "false",
+ "saml.encrypt": "false",
+ "saml_force_name_id_format": "false",
+ "saml.client.signature": "false",
+ "saml.authnstatement": "false",
+ "saml.server.signature": "false",
+ "saml.server.signature.keyinfo.ext": "false",
+ "saml.onetimeuse.condition": "false"
+ },
+ "fullScopeAllowed": true,
+ "nodeReRegistrationTimeout": -1,
+ "protocolMappers": [
+ {
+ "id": "12134027-94cc-401c-bbf6-be565078ddfb",
+ "name": "role list",
+ "protocol": "saml",
+ "protocolMapper": "saml-role-list-mapper",
+ "consentRequired": false,
+ "config": {
+ "single": "false",
+ "attribute.nameformat": "Basic",
+ "attribute.name": "Role"
+ }
+ },
+ {
+ "id": "6a956bf1-6c40-4549-b335-9fe8c788b18f",
+ "name": "family name",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-usermodel-property-mapper",
+ "consentRequired": true,
+ "consentText": "${familyName}",
+ "config": {
+ "userinfo.token.claim": "true",
+ "user.attribute": "lastName",
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "claim.name": "family_name",
+ "jsonType.label": "String"
+ }
+ },
+ {
+ "id": "d32ba1d4-3fef-42ff-aa2b-98cb4bfef6f9",
+ "name": "full name",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-full-name-mapper",
+ "consentRequired": true,
+ "consentText": "${fullName}",
+ "config": {
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "userinfo.token.claim": "true"
+ }
+ },
+ {
+ "id": "9e899fc7-1ddd-447d-810c-d91333d6621c",
+ "name": "username",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-usermodel-property-mapper",
+ "consentRequired": true,
+ "consentText": "${username}",
+ "config": {
+ "userinfo.token.claim": "true",
+ "user.attribute": "username",
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "claim.name": "preferred_username",
+ "jsonType.label": "String"
+ }
+ },
+ {
+ "id": "74e4d13f-bd02-4f17-bbbc-d4b79bab1971",
+ "name": "email",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-usermodel-property-mapper",
+ "consentRequired": true,
+ "consentText": "${email}",
+ "config": {
+ "userinfo.token.claim": "true",
+ "user.attribute": "email",
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "claim.name": "email",
+ "jsonType.label": "String"
+ }
+ },
+ {
+ "id": "48fe23c2-a6fb-4c5e-8930-28ad1913829a",
+ "name": "given name",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-usermodel-property-mapper",
+ "consentRequired": true,
+ "consentText": "${givenName}",
+ "config": {
+ "userinfo.token.claim": "true",
+ "user.attribute": "firstName",
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "claim.name": "given_name",
+ "jsonType.label": "String"
+ }
+ }
+ ],
+ "useTemplateConfig": false,
+ "useTemplateScope": false,
+ "useTemplateMappers": false
+ },
+ {
+ "id": "da893beb-6ac7-420d-b51b-f05dadf56bbc",
+ "clientId": "android",
+ "rootUrl": "{{proto}}://{{proxy_server_name}}",
+ "baseUrl": "/",
+ "surrogateAuthRequired": false,
+ "enabled": true,
+ "clientAuthenticatorType": "client-secret",
+ "secret": "",
+ "redirectUris": ["{{proto}}://{{proxy_server_name}}/oauth2callback"],
+ "webOrigins": [],
+ "notBefore": 0,
+ "bearerOnly": false,
+ "consentRequired": false,
+ "standardFlowEnabled": true,
+ "implicitFlowEnabled": false,
+ "directAccessGrantsEnabled": true,
+ "serviceAccountsEnabled": false,
+ "publicClient": true,
+ "frontchannelLogout": false,
+ "protocol": "openid-connect",
+ "attributes": {
+ "saml.assertion.signature": "false",
+ "saml.force.post.binding": "false",
+ "saml.multivalued.roles": "false",
+ "saml.encrypt": "false",
+ "saml_force_name_id_format": "false",
+ "saml.client.signature": "false",
+ "saml.authnstatement": "false",
+ "saml.server.signature": "false",
+ "saml.server.signature.keyinfo.ext": "false",
+ "saml.onetimeuse.condition": "false"
+ },
+ "fullScopeAllowed": true,
+ "nodeReRegistrationTimeout": -1,
+ "protocolMappers": [
+ {
+ "id": "ff7dac46-16b4-4ab6-a054-dd03d5411fa9",
+ "name": "role list",
+ "protocol": "saml",
+ "protocolMapper": "saml-role-list-mapper",
+ "consentRequired": false,
+ "config": {
+ "single": "false",
+ "attribute.nameformat": "Basic",
+ "attribute.name": "Role"
+ }
+ },
+ {
+ "id": "32fad9c0-0dfe-45b2-94a1-3e2f74d756ec",
+ "name": "family name",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-usermodel-property-mapper",
+ "consentRequired": true,
+ "consentText": "${familyName}",
+ "config": {
+ "userinfo.token.claim": "true",
+ "user.attribute": "lastName",
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "claim.name": "family_name",
+ "jsonType.label": "String"
+ }
+ },
+ {
+ "id": "4fb4d644-c609-4a27-a407-d451bcd83e16",
+ "name": "given name",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-usermodel-property-mapper",
+ "consentRequired": true,
+ "consentText": "${givenName}",
+ "config": {
+ "userinfo.token.claim": "true",
+ "user.attribute": "firstName",
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "claim.name": "given_name",
+ "jsonType.label": "String"
+ }
+ },
+ {
+ "id": "84e7c6e5-1afb-44d8-b507-1ed31fa0f351",
+ "name": "email",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-usermodel-property-mapper",
+ "consentRequired": true,
+ "consentText": "${email}",
+ "config": {
+ "userinfo.token.claim": "true",
+ "user.attribute": "email",
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "claim.name": "email",
+ "jsonType.label": "String"
+ }
+ },
+ {
+ "id": "e7ca189f-94de-4996-a192-e93ba960bbba",
+ "name": "full name",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-full-name-mapper",
+ "consentRequired": true,
+ "consentText": "${fullName}",
+ "config": {
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "userinfo.token.claim": "true"
+ }
+ },
+ {
+ "id": "16bedb3b-7571-4106-9a47-66151915ac31",
+ "name": "username",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-usermodel-property-mapper",
+ "consentRequired": true,
+ "consentText": "${username}",
+ "config": {
+ "userinfo.token.claim": "true",
+ "user.attribute": "username",
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "claim.name": "preferred_username",
+ "jsonType.label": "String"
+ }
+ }
+ ],
+ "useTemplateConfig": false,
+ "useTemplateScope": false,
+ "useTemplateMappers": false
+ },
+ {
+ "id": "647aa742-d849-41d2-b174-c06b59e6d5b6",
+ "clientId": "google-auth",
+ "rootUrl": "{{proto}}://{{proxy_server_name}}",
+ "adminUrl": "",
+ "baseUrl": "/",
+ "surrogateAuthRequired": false,
+ "enabled": true,
+ "clientAuthenticatorType": "client-secret",
+ "secret": "",
+ "redirectUris": ["{{proto}}://{{proxy_server_name}}/private/*"],
+ "webOrigins": [],
+ "notBefore": 0,
+ "bearerOnly": false,
+ "consentRequired": false,
+ "standardFlowEnabled": false,
+ "implicitFlowEnabled": false,
+ "directAccessGrantsEnabled": true,
+ "serviceAccountsEnabled": false,
+ "publicClient": false,
+ "frontchannelLogout": false,
+ "protocol": "openid-connect",
+ "attributes": {
+ "saml.assertion.signature": "false",
+ "saml.force.post.binding": "false",
+ "saml.multivalued.roles": "false",
+ "saml.encrypt": "false",
+ "saml_force_name_id_format": "false",
+ "saml.client.signature": "false",
+ "saml.authnstatement": "false",
+ "saml.server.signature": "false",
+ "saml.server.signature.keyinfo.ext": "false",
+ "saml.onetimeuse.condition": "false"
+ },
+ "fullScopeAllowed": true,
+ "nodeReRegistrationTimeout": -1,
+ "protocolMappers": [
+ {
+ "id": "4b3632c9-8055-4f9f-9702-3c975d93bf8d",
+ "name": "full name",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-full-name-mapper",
+ "consentRequired": true,
+ "consentText": "${fullName}",
+ "config": {
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "userinfo.token.claim": "true"
+ }
+ },
+ {
+ "id": "bdb4cdf5-0ee5-475b-bb47-25a5f90f1305",
+ "name": "username",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-usermodel-property-mapper",
+ "consentRequired": true,
+ "consentText": "${username}",
+ "config": {
+ "userinfo.token.claim": "true",
+ "user.attribute": "username",
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "claim.name": "preferred_username",
+ "jsonType.label": "String"
+ }
+ },
+ {
+ "id": "702df96e-686f-4b68-bafd-1cb820fff7fb",
+ "name": "family name",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-usermodel-property-mapper",
+ "consentRequired": true,
+ "consentText": "${familyName}",
+ "config": {
+ "userinfo.token.claim": "true",
+ "user.attribute": "lastName",
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "claim.name": "family_name",
+ "jsonType.label": "String"
+ }
+ },
+ {
+ "id": "03617f2e-6b45-4844-a81c-0df09ea89988",
+ "name": "role list",
+ "protocol": "saml",
+ "protocolMapper": "saml-role-list-mapper",
+ "consentRequired": false,
+ "config": {
+ "single": "false",
+ "attribute.nameformat": "Basic",
+ "attribute.name": "Role"
+ }
+ },
+ {
+ "id": "b38527eb-dbed-4868-8075-69038ee3072a",
+ "name": "given name",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-usermodel-property-mapper",
+ "consentRequired": true,
+ "consentText": "${givenName}",
+ "config": {
+ "userinfo.token.claim": "true",
+ "user.attribute": "firstName",
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "claim.name": "given_name",
+ "jsonType.label": "String"
+ }
+ },
+ {
+ "id": "93b57ddf-9f32-4c0e-95eb-258ad19693db",
+ "name": "email",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-usermodel-property-mapper",
+ "consentRequired": true,
+ "consentText": "${email}",
+ "config": {
+ "userinfo.token.claim": "true",
+ "user.attribute": "email",
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "claim.name": "email",
+ "jsonType.label": "String"
+ }
+ }
+ ],
+ "useTemplateConfig": false,
+ "useTemplateScope": false,
+ "useTemplateMappers": false
+ },
+ {
+ "id": "8891d8e9-35e6-4a1c-b32b-027be03b0f24",
+ "clientId": "admin-cli",
+ "name": "${client_admin-cli}",
+ "rootUrl": "{{proto}}://{{proxy_server_name}}",
+ "adminUrl": "{{proto}}://{{proxy_server_name}}/*",
+ "baseUrl": "/",
+ "surrogateAuthRequired": false,
+ "enabled": true,
+ "clientAuthenticatorType": "client-secret",
+ "secret": "",
+ "redirectUris": [
+ "{{proto}}://{{proxy_server_name}}/*",
+ "{{proto}}://{{proxy_server_name}}/"
+ ],
+ "webOrigins": [],
+ "notBefore": 0,
+ "bearerOnly": false,
+ "consentRequired": false,
+ "standardFlowEnabled": false,
+ "implicitFlowEnabled": true,
+ "directAccessGrantsEnabled": true,
+ "serviceAccountsEnabled": false,
+ "publicClient": true,
+ "frontchannelLogout": false,
+ "protocol": "openid-connect",
+ "attributes": {
+ "saml.assertion.signature": "false",
+ "saml.force.post.binding": "false",
+ "saml.multivalued.roles": "false",
+ "saml.encrypt": "false",
+ "saml_force_name_id_format": "false",
+ "saml.client.signature": "false",
+ "saml.authnstatement": "false",
+ "saml.server.signature": "false",
+ "saml.server.signature.keyinfo.ext": "false",
+ "saml.onetimeuse.condition": "false"
+ },
+ "fullScopeAllowed": false,
+ "nodeReRegistrationTimeout": 0,
+ "protocolMappers": [
+ {
+ "id": "32d6a3a4-8635-4a36-bd14-8ac5b73a49cc",
+ "name": "full name",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-full-name-mapper",
+ "consentRequired": true,
+ "consentText": "${fullName}",
+ "config": {
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "userinfo.token.claim": "true"
+ }
+ },
+ {
+ "id": "900fa741-d1b2-467e-88a6-b454a9519568",
+ "name": "given name",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-usermodel-property-mapper",
+ "consentRequired": true,
+ "consentText": "${givenName}",
+ "config": {
+ "userinfo.token.claim": "true",
+ "user.attribute": "firstName",
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "claim.name": "given_name",
+ "jsonType.label": "String"
+ }
+ },
+ {
+ "id": "8ea14714-d160-49b8-b612-59102d50ef53",
+ "name": "family name",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-usermodel-property-mapper",
+ "consentRequired": true,
+ "consentText": "${familyName}",
+ "config": {
+ "userinfo.token.claim": "true",
+ "user.attribute": "lastName",
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "claim.name": "family_name",
+ "jsonType.label": "String"
+ }
+ },
+ {
+ "id": "bd167b99-5d23-49c1-90c7-85c2b088fed7",
+ "name": "role list",
+ "protocol": "saml",
+ "protocolMapper": "saml-role-list-mapper",
+ "consentRequired": false,
+ "config": {
+ "single": "false",
+ "attribute.nameformat": "Basic",
+ "attribute.name": "Role"
+ }
+ },
+ {
+ "id": "c4fe56a1-8d15-455a-b87b-cf051454b57c",
+ "name": "username",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-usermodel-property-mapper",
+ "consentRequired": true,
+ "consentText": "${username}",
+ "config": {
+ "userinfo.token.claim": "true",
+ "user.attribute": "username",
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "claim.name": "preferred_username",
+ "jsonType.label": "String"
+ }
+ },
+ {
+ "id": "26e3bf4c-8f9a-4548-b0db-5bbb7c398991",
+ "name": "email",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-usermodel-property-mapper",
+ "consentRequired": true,
+ "consentText": "${email}",
+ "config": {
+ "userinfo.token.claim": "true",
+ "user.attribute": "email",
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "claim.name": "email",
+ "jsonType.label": "String"
+ }
+ }
+ ],
+ "useTemplateConfig": false,
+ "useTemplateScope": false,
+ "useTemplateMappers": false
+ },
+ {
+ "id": "c3950efa-6684-44c2-b50a-c7b3d16df04b",
+ "clientId": "broker",
+ "name": "${client_broker}",
+ "surrogateAuthRequired": false,
+ "enabled": true,
+ "clientAuthenticatorType": "client-secret",
+ "secret": "",
+ "redirectUris": [],
+ "webOrigins": [],
+ "notBefore": 0,
+ "bearerOnly": false,
+ "consentRequired": false,
+ "standardFlowEnabled": true,
+ "implicitFlowEnabled": false,
+ "directAccessGrantsEnabled": false,
+ "serviceAccountsEnabled": false,
+ "publicClient": false,
+ "frontchannelLogout": false,
+ "protocol": "openid-connect",
+ "attributes": {},
+ "fullScopeAllowed": false,
+ "nodeReRegistrationTimeout": 0,
+ "protocolMappers": [
+ {
+ "id": "54c3bbc3-850b-4636-82d1-ed4f3a46a00a",
+ "name": "username",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-usermodel-property-mapper",
+ "consentRequired": true,
+ "consentText": "${username}",
+ "config": {
+ "userinfo.token.claim": "true",
+ "user.attribute": "username",
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "claim.name": "preferred_username",
+ "jsonType.label": "String"
+ }
+ },
+ {
+ "id": "0f0d9b74-c476-4981-a783-dd4bdbe041ec",
+ "name": "role list",
+ "protocol": "saml",
+ "protocolMapper": "saml-role-list-mapper",
+ "consentRequired": false,
+ "config": {
+ "single": "false",
+ "attribute.nameformat": "Basic",
+ "attribute.name": "Role"
+ }
+ },
+ {
+ "id": "d6f625cc-eac1-49d0-bea5-17e6f9d3860c",
+ "name": "given name",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-usermodel-property-mapper",
+ "consentRequired": true,
+ "consentText": "${givenName}",
+ "config": {
+ "userinfo.token.claim": "true",
+ "user.attribute": "firstName",
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "claim.name": "given_name",
+ "jsonType.label": "String"
+ }
+ },
+ {
+ "id": "bbf35056-9bbe-49a0-aefc-2bde2379ccdc",
+ "name": "family name",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-usermodel-property-mapper",
+ "consentRequired": true,
+ "consentText": "${familyName}",
+ "config": {
+ "userinfo.token.claim": "true",
+ "user.attribute": "lastName",
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "claim.name": "family_name",
+ "jsonType.label": "String"
+ }
+ },
+ {
+ "id": "38b04951-1043-4dc6-9504-7b0f31ed71a4",
+ "name": "email",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-usermodel-property-mapper",
+ "consentRequired": true,
+ "consentText": "${email}",
+ "config": {
+ "userinfo.token.claim": "true",
+ "user.attribute": "email",
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "claim.name": "email",
+ "jsonType.label": "String"
+ }
+ },
+ {
+ "id": "88bb836b-7feb-45eb-b004-fb3be8436908",
+ "name": "full name",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-full-name-mapper",
+ "consentRequired": true,
+ "consentText": "${fullName}",
+ "config": {
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "userinfo.token.claim": "true"
+ }
+ }
+ ],
+ "useTemplateConfig": false,
+ "useTemplateScope": false,
+ "useTemplateMappers": false
+ },
+ {
+ "id": "b2f45201-1362-4b10-83c3-207d470f44bf",
+ "clientId": "realm-management",
+ "name": "${client_realm-management}",
+ "surrogateAuthRequired": false,
+ "enabled": true,
+ "clientAuthenticatorType": "client-secret",
+ "secret": "",
+ "redirectUris": [],
+ "webOrigins": [],
+ "notBefore": 0,
+ "bearerOnly": true,
+ "consentRequired": false,
+ "standardFlowEnabled": true,
+ "implicitFlowEnabled": false,
+ "directAccessGrantsEnabled": false,
+ "serviceAccountsEnabled": false,
+ "authorizationServicesEnabled": true,
+ "publicClient": false,
+ "frontchannelLogout": false,
+ "protocol": "openid-connect",
+ "attributes": {},
+ "fullScopeAllowed": false,
+ "nodeReRegistrationTimeout": 0,
+ "protocolMappers": [
+ {
+ "id": "71605238-bf41-400e-8c03-a5d78f54b00b",
+ "name": "email",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-usermodel-property-mapper",
+ "consentRequired": true,
+ "consentText": "${email}",
+ "config": {
+ "userinfo.token.claim": "true",
+ "user.attribute": "email",
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "claim.name": "email",
+ "jsonType.label": "String"
+ }
+ },
+ {
+ "id": "a0cb6f3a-30ef-4475-b73f-ca6c2f1f3675",
+ "name": "given name",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-usermodel-property-mapper",
+ "consentRequired": true,
+ "consentText": "${givenName}",
+ "config": {
+ "userinfo.token.claim": "true",
+ "user.attribute": "firstName",
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "claim.name": "given_name",
+ "jsonType.label": "String"
+ }
+ },
+ {
+ "id": "3a7708b1-63b9-4116-af7f-969fc1bf61a4",
+ "name": "role list",
+ "protocol": "saml",
+ "protocolMapper": "saml-role-list-mapper",
+ "consentRequired": false,
+ "config": {
+ "single": "false",
+ "attribute.nameformat": "Basic",
+ "attribute.name": "Role"
+ }
+ },
+ {
+ "id": "c393d7b7-fa22-4e90-9ad7-07d520632c20",
+ "name": "username",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-usermodel-property-mapper",
+ "consentRequired": true,
+ "consentText": "${username}",
+ "config": {
+ "userinfo.token.claim": "true",
+ "user.attribute": "username",
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "claim.name": "preferred_username",
+ "jsonType.label": "String"
+ }
+ },
+ {
+ "id": "e77aae69-8ea4-4ee4-bcd6-ba7ef3958c02",
+ "name": "full name",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-full-name-mapper",
+ "consentRequired": true,
+ "consentText": "${fullName}",
+ "config": {
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "userinfo.token.claim": "true"
+ }
+ },
+ {
+ "id": "2d8cbac4-e4dd-4fa6-bf71-98adf826b9dd",
+ "name": "family name",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-usermodel-property-mapper",
+ "consentRequired": true,
+ "consentText": "${familyName}",
+ "config": {
+ "userinfo.token.claim": "true",
+ "user.attribute": "lastName",
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "claim.name": "family_name",
+ "jsonType.label": "String"
+ }
+ }
+ ],
+ "useTemplateConfig": false,
+ "useTemplateScope": false,
+ "useTemplateMappers": false,
+ "authorizationSettings": {
+ "allowRemoteResourceManagement": false,
+ "policyEnforcementMode": "ENFORCING",
+ "resources": [
+ {
+ "name": "role.resource.30ab6b4f-b17c-4fff-a5fa-1181686bb409",
+ "type": "Role",
+ "scopes": [
+ {
+ "name": "map-role-composite"
+ },
+ {
+ "name": "map-role-client-scope"
+ },
+ {
+ "name": "map-role"
+ }
+ ],
+ "typedScopes": []
+ },
+ {
+ "name": "role.resource.d6e505fe-c3c5-4689-946e-7f69d3f64c6c",
+ "type": "Role",
+ "scopes": [
+ {
+ "name": "map-role-composite"
+ },
+ {
+ "name": "map-role-client-scope"
+ },
+ {
+ "name": "map-role"
+ }
+ ],
+ "typedScopes": []
+ }
+ ],
+ "policies": [
+ {
+ "name": "map-role-composite.permission.30ab6b4f-b17c-4fff-a5fa-1181686bb409",
+ "type": "scope",
+ "logic": "POSITIVE",
+ "decisionStrategy": "AFFIRMATIVE",
+ "config": {
+ "resources": "[\"role.resource.30ab6b4f-b17c-4fff-a5fa-1181686bb409\"]",
+ "scopes": "[\"map-role-composite\"]"
+ }
+ },
+ {
+ "name": "map-role-client-scope.permission.30ab6b4f-b17c-4fff-a5fa-1181686bb409",
+ "type": "scope",
+ "logic": "POSITIVE",
+ "decisionStrategy": "AFFIRMATIVE",
+ "config": {
+ "resources": "[\"role.resource.30ab6b4f-b17c-4fff-a5fa-1181686bb409\"]",
+ "scopes": "[\"map-role-client-scope\"]"
+ }
+ },
+ {
+ "name": "map-role.permission.30ab6b4f-b17c-4fff-a5fa-1181686bb409",
+ "type": "scope",
+ "logic": "POSITIVE",
+ "decisionStrategy": "AFFIRMATIVE",
+ "config": {
+ "resources": "[\"role.resource.30ab6b4f-b17c-4fff-a5fa-1181686bb409\"]",
+ "scopes": "[\"map-role\"]"
+ }
+ },
+ {
+ "name": "map-role-composite.permission.d6e505fe-c3c5-4689-946e-7f69d3f64c6c",
+ "type": "scope",
+ "logic": "POSITIVE",
+ "decisionStrategy": "AFFIRMATIVE",
+ "config": {
+ "resources": "[\"role.resource.d6e505fe-c3c5-4689-946e-7f69d3f64c6c\"]",
+ "scopes": "[\"map-role-composite\"]"
+ }
+ },
+ {
+ "name": "map-role-client-scope.permission.d6e505fe-c3c5-4689-946e-7f69d3f64c6c",
+ "type": "scope",
+ "logic": "POSITIVE",
+ "decisionStrategy": "AFFIRMATIVE",
+ "config": {
+ "resources": "[\"role.resource.d6e505fe-c3c5-4689-946e-7f69d3f64c6c\"]",
+ "scopes": "[\"map-role-client-scope\"]"
+ }
+ },
+ {
+ "name": "map-role.permission.d6e505fe-c3c5-4689-946e-7f69d3f64c6c",
+ "type": "scope",
+ "logic": "POSITIVE",
+ "decisionStrategy": "AFFIRMATIVE",
+ "config": {
+ "resources": "[\"role.resource.d6e505fe-c3c5-4689-946e-7f69d3f64c6c\"]",
+ "scopes": "[\"map-role\"]"
+ }
+ }
+ ],
+ "scopes": [
+ {
+ "name": "map-role-composite"
+ },
+ {
+ "name": "map-role-client-scope"
+ },
+ {
+ "name": "map-role"
+ }
+ ]
+ }
+ },
+ {
+ "id": "8c12290d-d62f-48ce-913b-c93bf995ca59",
+ "clientId": "portal",
+ "rootUrl": "{{proto}}://{{proxy_server_name}}",
+ "adminUrl": "/callback",
+ "baseUrl": "/",
+ "surrogateAuthRequired": false,
+ "enabled": true,
+ "clientAuthenticatorType": "client-secret",
+ "secret": "",
+ "redirectUris": ["{{proto}}://{{proxy_server_name}}/private/*", "{{proto}}://{{proxy_server_name}}/","{{proto}}://{{proxy_server_name}}/*"],
+ "webOrigins": [
+ ""
+ ],
+ "notBefore": 0,
+ "bearerOnly": false,
+ "consentRequired": false,
+ "standardFlowEnabled": true,
+ "implicitFlowEnabled": false,
+ "directAccessGrantsEnabled": false,
+ "serviceAccountsEnabled": false,
+ "publicClient": true,
+ "frontchannelLogout": false,
+ "protocol": "openid-connect",
+ "attributes": {
+ "saml.assertion.signature": "false",
+ "saml.force.post.binding": "false",
+ "saml.multivalued.roles": "false",
+ "saml.encrypt": "false",
+ "saml_force_name_id_format": "false",
+ "saml.client.signature": "false",
+ "saml.authnstatement": "false",
+ "saml.server.signature": "false",
+ "saml.server.signature.keyinfo.ext": "false",
+ "saml.onetimeuse.condition": "false"
+ },
+ "fullScopeAllowed": true,
+ "nodeReRegistrationTimeout": -1,
+ "protocolMappers": [
+ {
+ "id": "63071ff2-a5e5-4d38-b534-a9f25a075403",
+ "name": "full name",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-full-name-mapper",
+ "consentRequired": true,
+ "consentText": "${fullName}",
+ "config": {
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "userinfo.token.claim": "true"
+ }
+ },
+ {
+ "id": "9bf9cad5-dbce-41e9-aa36-d84cc5a768a2",
+ "name": "username",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-usermodel-property-mapper",
+ "consentRequired": true,
+ "consentText": "${username}",
+ "config": {
+ "userinfo.token.claim": "true",
+ "user.attribute": "username",
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "claim.name": "preferred_username",
+ "jsonType.label": "String"
+ }
+ },
+ {
+ "id": "238e55b7-6545-467e-856b-f95477afe1ff",
+ "name": "role list",
+ "protocol": "saml",
+ "protocolMapper": "saml-role-list-mapper",
+ "consentRequired": false,
+ "config": {
+ "single": "false",
+ "attribute.nameformat": "Basic",
+ "attribute.name": "Role"
+ }
+ },
+ {
+ "id": "edb1ff4e-b452-46bc-8c3b-d6075f6ee579",
+ "name": "family name",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-usermodel-property-mapper",
+ "consentRequired": true,
+ "consentText": "${familyName}",
+ "config": {
+ "userinfo.token.claim": "true",
+ "user.attribute": "lastName",
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "claim.name": "family_name",
+ "jsonType.label": "String"
+ }
+ },
+ {
+ "id": "7a0118e2-57ff-4d23-bf74-cbfe1f545d1d",
+ "name": "given name",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-usermodel-property-mapper",
+ "consentRequired": true,
+ "consentText": "${givenName}",
+ "config": {
+ "userinfo.token.claim": "true",
+ "user.attribute": "firstName",
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "claim.name": "given_name",
+ "jsonType.label": "String"
+ }
+ },
+ {
+ "id": "b59a913e-118a-4dc4-a8d7-66c44ced5345",
+ "name": "email",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-usermodel-property-mapper",
+ "consentRequired": true,
+ "consentText": "${email}",
+ "config": {
+ "userinfo.token.claim": "true",
+ "user.attribute": "email",
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "claim.name": "email",
+ "jsonType.label": "String"
+ }
+ }
+ ],
+ "useTemplateConfig": false,
+ "useTemplateScope": false,
+ "useTemplateMappers": false
+ },
+ {
+ "id": "79c518d7-b41a-4e6f-be42-4ef365824100",
+ "clientId": "security-admin-console",
+ "name": "${client_security-admin-console}",
+ "baseUrl": "/auth/admin/sunbird/console/index.html",
+ "surrogateAuthRequired": false,
+ "enabled": true,
+ "clientAuthenticatorType": "client-secret",
+ "secret": "",
+ "redirectUris": [
+ "/auth/admin/sunbird/console/*"
+ ],
+ "webOrigins": [],
+ "notBefore": 0,
+ "bearerOnly": false,
+ "consentRequired": false,
+ "standardFlowEnabled": true,
+ "implicitFlowEnabled": false,
+ "directAccessGrantsEnabled": false,
+ "serviceAccountsEnabled": false,
+ "publicClient": true,
+ "frontchannelLogout": false,
+ "protocol": "openid-connect",
+ "attributes": {},
+ "fullScopeAllowed": false,
+ "nodeReRegistrationTimeout": 0,
+ "protocolMappers": [
+ {
+ "id": "c989a8c8-cb8b-40ff-b4b9-86122bad7aa9",
+ "name": "role list",
+ "protocol": "saml",
+ "protocolMapper": "saml-role-list-mapper",
+ "consentRequired": false,
+ "config": {
+ "single": "false",
+ "attribute.nameformat": "Basic",
+ "attribute.name": "Role"
+ }
+ },
+ {
+ "id": "b180fb8c-997c-4f6a-b774-af677f903139",
+ "name": "family name",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-usermodel-property-mapper",
+ "consentRequired": true,
+ "consentText": "${familyName}",
+ "config": {
+ "userinfo.token.claim": "true",
+ "user.attribute": "lastName",
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "claim.name": "family_name",
+ "jsonType.label": "String"
+ }
+ },
+ {
+ "id": "c373dc9a-49d7-4d28-9b94-06cf20fb1955",
+ "name": "full name",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-full-name-mapper",
+ "consentRequired": true,
+ "consentText": "${fullName}",
+ "config": {
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "userinfo.token.claim": "true"
+ }
+ },
+ {
+ "id": "24c7b1c4-62c2-4d92-ab19-49bfaedcc3d4",
+ "name": "email",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-usermodel-property-mapper",
+ "consentRequired": true,
+ "consentText": "${email}",
+ "config": {
+ "userinfo.token.claim": "true",
+ "user.attribute": "email",
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "claim.name": "email",
+ "jsonType.label": "String"
+ }
+ },
+ {
+ "id": "883a39a7-37b4-46ef-a761-3e51b95ccc35",
+ "name": "given name",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-usermodel-property-mapper",
+ "consentRequired": true,
+ "consentText": "${givenName}",
+ "config": {
+ "userinfo.token.claim": "true",
+ "user.attribute": "firstName",
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "claim.name": "given_name",
+ "jsonType.label": "String"
+ }
+ },
+ {
+ "id": "95ed8e44-38cc-4f09-8adc-19c12d5eada0",
+ "name": "locale",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-usermodel-attribute-mapper",
+ "consentRequired": false,
+ "consentText": "${locale}",
+ "config": {
+ "userinfo.token.claim": "true",
+ "user.attribute": "locale",
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "claim.name": "locale",
+ "jsonType.label": "String"
+ }
+ },
+ {
+ "id": "c66c6a41-eb22-443f-8a77-e68d404ad26f",
+ "name": "username",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-usermodel-property-mapper",
+ "consentRequired": true,
+ "consentText": "${username}",
+ "config": {
+ "userinfo.token.claim": "true",
+ "user.attribute": "username",
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "claim.name": "preferred_username",
+ "jsonType.label": "String"
+ }
+ }
+ ],
+ "useTemplateConfig": false,
+ "useTemplateScope": false,
+ "useTemplateMappers": false
+ },
+ {
+ "id": "c2d24d3f-65ca-46de-9cd8-3eeb71a7f83d",
+ "clientId": "account",
+ "name": "${client_account}",
+ "baseUrl": "/auth/realms/sunbird/account",
+ "surrogateAuthRequired": false,
+ "enabled": true,
+ "clientAuthenticatorType": "client-secret",
+ "secret": "",
+ "defaultRoles": [
+ "manage-account",
+ "view-profile"
+ ],
+ "redirectUris": [
+ "/auth/realms/sunbird/account/*"
+ ],
+ "webOrigins": [],
+ "notBefore": 0,
+ "bearerOnly": false,
+ "consentRequired": false,
+ "standardFlowEnabled": true,
+ "implicitFlowEnabled": false,
+ "directAccessGrantsEnabled": false,
+ "serviceAccountsEnabled": false,
+ "publicClient": false,
+ "frontchannelLogout": false,
+ "protocol": "openid-connect",
+ "attributes": {},
+ "fullScopeAllowed": false,
+ "nodeReRegistrationTimeout": 0,
+ "protocolMappers": [
+ {
+ "id": "a64118ab-33c8-4060-9f3e-3ed817ba8e0d",
+ "name": "role list",
+ "protocol": "saml",
+ "protocolMapper": "saml-role-list-mapper",
+ "consentRequired": false,
+ "config": {
+ "single": "false",
+ "attribute.nameformat": "Basic",
+ "attribute.name": "Role"
+ }
+ },
+ {
+ "id": "1f4a0c5e-7c8a-4693-8be5-14681b243868",
+ "name": "username",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-usermodel-property-mapper",
+ "consentRequired": true,
+ "consentText": "${username}",
+ "config": {
+ "userinfo.token.claim": "true",
+ "user.attribute": "username",
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "claim.name": "preferred_username",
+ "jsonType.label": "String"
+ }
+ },
+ {
+ "id": "8d88a133-a399-4e75-b051-5b0d4ae850ab",
+ "name": "full name",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-full-name-mapper",
+ "consentRequired": true,
+ "consentText": "${fullName}",
+ "config": {
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "userinfo.token.claim": "true"
+ }
+ },
+ {
+ "id": "45593258-916c-4158-8577-d9806c16415a",
+ "name": "email",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-usermodel-property-mapper",
+ "consentRequired": true,
+ "consentText": "${email}",
+ "config": {
+ "userinfo.token.claim": "true",
+ "user.attribute": "email",
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "claim.name": "email",
+ "jsonType.label": "String"
+ }
+ },
+ {
+ "id": "027be48e-b7dc-4c3a-a648-414a466b67dd",
+ "name": "family name",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-usermodel-property-mapper",
+ "consentRequired": true,
+ "consentText": "${familyName}",
+ "config": {
+ "userinfo.token.claim": "true",
+ "user.attribute": "lastName",
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "claim.name": "family_name",
+ "jsonType.label": "String"
+ }
+ },
+ {
+ "id": "c93937f9-0446-4be9-8b47-3c6de857497e",
+ "name": "given name",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-usermodel-property-mapper",
+ "consentRequired": true,
+ "consentText": "${givenName}",
+ "config": {
+ "userinfo.token.claim": "true",
+ "user.attribute": "firstName",
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "claim.name": "given_name",
+ "jsonType.label": "String"
+ }
+ }
+ ],
+ "useTemplateConfig": false,
+ "useTemplateScope": false,
+ "useTemplateMappers": false
+ },
+ {
+ "clientId": "google-auth-android",
+ "rootUrl": "{{proto}}://{{proxy_server_name}}",
+ "adminUrl": "",
+ "baseUrl": "/",
+ "surrogateAuthRequired": false,
+ "enabled": true,
+ "clientAuthenticatorType": "client-secret",
+ "redirectUris": [
+ "{{proto}}://{{proxy_server_name}}/*"
+ ],
+ "webOrigins": [],
+ "notBefore": 0,
+ "bearerOnly": false,
+ "consentRequired": false,
+ "standardFlowEnabled": false,
+ "implicitFlowEnabled": false,
+ "directAccessGrantsEnabled": true,
+ "serviceAccountsEnabled": false,
+ "publicClient": false,
+ "frontchannelLogout": false,
+ "protocol": "openid-connect",
+ "attributes": {
+ "saml.assertion.signature": "false",
+ "saml.force.post.binding": "false",
+ "saml.multivalued.roles": "false",
+ "saml.encrypt": "false",
+ "saml_force_name_id_format": "false",
+ "saml.client.signature": "false",
+ "saml.authnstatement": "false",
+ "saml.server.signature": "false",
+ "saml.server.signature.keyinfo.ext": "false",
+ "saml.onetimeuse.condition": "false"
+ },
+ "fullScopeAllowed": true,
+ "nodeReRegistrationTimeout": -1,
+ "protocolMappers": [
+ {
+ "name": "full name",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-full-name-mapper",
+ "consentRequired": true,
+ "consentText": "${fullName}",
+ "config": {
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "userinfo.token.claim": "true"
+ }
+ },
+ {
+ "name": "username",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-usermodel-property-mapper",
+ "consentRequired": true,
+ "consentText": "${username}",
+ "config": {
+ "userinfo.token.claim": "true",
+ "user.attribute": "username",
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "claim.name": "preferred_username",
+ "jsonType.label": "String"
+ }
+ },
+ {
+ "name": "family name",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-usermodel-property-mapper",
+ "consentRequired": true,
+ "consentText": "${familyName}",
+ "config": {
+ "userinfo.token.claim": "true",
+ "user.attribute": "lastName",
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "claim.name": "family_name",
+ "jsonType.label": "String"
+ }
+ },
+ {
+ "name": "role list",
+ "protocol": "saml",
+ "protocolMapper": "saml-role-list-mapper",
+ "consentRequired": false,
+ "config": {
+ "single": "false",
+ "attribute.nameformat": "Basic",
+ "attribute.name": "Role"
+ }
+ },
+ {
+ "name": "given name",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-usermodel-property-mapper",
+ "consentRequired": true,
+ "consentText": "${givenName}",
+ "config": {
+ "userinfo.token.claim": "true",
+ "user.attribute": "firstName",
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "claim.name": "given_name",
+ "jsonType.label": "String"
+ }
+ },
+ {
+ "name": "email",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-usermodel-property-mapper",
+ "consentRequired": true,
+ "consentText": "${email}",
+ "config": {
+ "userinfo.token.claim": "true",
+ "user.attribute": "email",
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "claim.name": "email",
+ "jsonType.label": "String"
+ }
+ }
+ ],
+ "useTemplateConfig": false,
+ "useTemplateScope": false,
+ "useTemplateMappers": false,
+ "access": {
+ "view": true,
+ "configure": true,
+ "manage": true
+ }
+ },
+ {
+ "clientId": "trampoline-android",
+ "rootUrl": "{{proto}}://{{proxy_server_name}}",
+ "adminUrl": "",
+ "baseUrl": "/",
+ "surrogateAuthRequired": false,
+ "enabled": true,
+ "clientAuthenticatorType": "client-secret",
+ "redirectUris": [],
+ "webOrigins": [],
+ "notBefore": 0,
+ "bearerOnly": false,
+ "consentRequired": false,
+ "standardFlowEnabled": false,
+ "implicitFlowEnabled": false,
+ "directAccessGrantsEnabled": true,
+ "serviceAccountsEnabled": false,
+ "publicClient": false,
+ "frontchannelLogout": false,
+ "protocol": "openid-connect",
+ "attributes": {
+ "saml.assertion.signature": "false",
+ "saml.force.post.binding": "false",
+ "saml.multivalued.roles": "false",
+ "saml.encrypt": "false",
+ "saml_force_name_id_format": "false",
+ "saml.client.signature": "false",
+ "saml.authnstatement": "false",
+ "saml.server.signature": "false",
+ "saml.server.signature.keyinfo.ext": "false",
+ "saml.onetimeuse.condition": "false"
+ },
+ "fullScopeAllowed": true,
+ "nodeReRegistrationTimeout": -1,
+ "protocolMappers": [
+ {
+ "name": "role list",
+ "protocol": "saml",
+ "protocolMapper": "saml-role-list-mapper",
+ "consentRequired": false,
+ "config": {
+ "single": "false",
+ "attribute.nameformat": "Basic",
+ "attribute.name": "Role"
+ }
+ },
+ {
+ "name": "family name",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-usermodel-property-mapper",
+ "consentRequired": true,
+ "consentText": "${familyName}",
+ "config": {
+ "userinfo.token.claim": "true",
+ "user.attribute": "lastName",
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "claim.name": "family_name",
+ "jsonType.label": "String"
+ }
+ },
+ {
+ "name": "full name",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-full-name-mapper",
+ "consentRequired": true,
+ "consentText": "${fullName}",
+ "config": {
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "userinfo.token.claim": "true"
+ }
+ },
+ {
+ "name": "username",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-usermodel-property-mapper",
+ "consentRequired": true,
+ "consentText": "${username}",
+ "config": {
+ "userinfo.token.claim": "true",
+ "user.attribute": "username",
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "claim.name": "preferred_username",
+ "jsonType.label": "String"
+ }
+ },
+ {
+ "name": "email",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-usermodel-property-mapper",
+ "consentRequired": true,
+ "consentText": "${email}",
+ "config": {
+ "userinfo.token.claim": "true",
+ "user.attribute": "email",
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "claim.name": "email",
+ "jsonType.label": "String"
+ }
+ },
+ {
+ "name": "given name",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-usermodel-property-mapper",
+ "consentRequired": true,
+ "consentText": "${givenName}",
+ "config": {
+ "userinfo.token.claim": "true",
+ "user.attribute": "firstName",
+ "id.token.claim": "true",
+ "access.token.claim": "true",
+ "claim.name": "given_name",
+ "jsonType.label": "String"
+ }
+ }
+ ],
+ "useTemplateConfig": false,
+ "useTemplateScope": false,
+ "useTemplateMappers": false,
+ "access": {
+ "view": true,
+ "configure": true,
+ "manage": true
+ }
+ }
+ ],
+ "clientTemplates": [],
+ "browserSecurityHeaders": {
+ "xContentTypeOptions": "nosniff",
+ "xRobotsTag": "none",
+ "xFrameOptions": "SAMEORIGIN",
+ "xXSSProtection": "1; mode=block",
+ "contentSecurityPolicy": "frame-src 'self'"
+ },
+ "smtpServer": {
+ "password": "",
+ "starttls": "",
+ "auth": "true",
+ "port": "587",
+ "host": "",
+ "from": "",
+ "ssl": "",
+ "user": ""
+ },
+ "loginTheme": "sunbird",
+ "accountTheme": "keycloak",
+ "adminTheme": "keycloak",
+ "emailTheme": "keycloak",
+ "eventsEnabled": false,
+ "eventsListeners": [
+ "jboss-logging"
+ ],
+ "enabledEventTypes": [],
+ "adminEventsEnabled": false,
+ "adminEventsDetailsEnabled": false,
+ "components": {
+ "org.keycloak.services.clientregistration.policy.ClientRegistrationPolicy": [
+ {
+ "id": "84078bbb-e005-44c8-9c7d-a1b4821558da",
+ "name": "Max Clients Limit",
+ "providerId": "max-clients",
+ "subType": "anonymous",
+ "subComponents": {},
+ "config": {
+ "max-clients": [
+ "200"
+ ]
+ }
+ },
+ {
+ "id": "346d857e-4385-4f8f-a2fc-072fd11a10ec",
+ "name": "Allowed Protocol Mapper Types",
+ "providerId": "allowed-protocol-mappers",
+ "subType": "authenticated",
+ "subComponents": {},
+ "config": {
+ "allowed-protocol-mapper-types": [
+ "oidc-full-name-mapper",
+ "oidc-address-mapper",
+ "saml-user-property-mapper",
+ "oidc-usermodel-property-mapper",
+ "saml-user-attribute-mapper",
+ "oidc-sha256-pairwise-sub-mapper",
+ "saml-role-list-mapper",
+ "oidc-usermodel-attribute-mapper"
+ ],
+ "consent-required-for-all-mappers": [
+ "true"
+ ]
+ }
+ },
+ {
+ "id": "eed64f9f-4b66-45ad-bdb4-4070e3802366",
+ "name": "Allowed Client Templates",
+ "providerId": "allowed-client-templates",
+ "subType": "authenticated",
+ "subComponents": {},
+ "config": {}
+ },
+ {
+ "id": "17ac4eaa-9139-4b3a-b1db-c82d44c1531d",
+ "name": "Allowed Client Templates",
+ "providerId": "allowed-client-templates",
+ "subType": "anonymous",
+ "subComponents": {},
+ "config": {}
+ },
+ {
+ "id": "38532936-be91-40e4-b65d-c0abfaf9547c",
+ "name": "Full Scope Disabled",
+ "providerId": "scope",
+ "subType": "anonymous",
+ "subComponents": {},
+ "config": {}
+ },
+ {
+ "id": "8c1690a2-6eea-4d61-ab66-7a015e3bea3c",
+ "name": "Allowed Protocol Mapper Types",
+ "providerId": "allowed-protocol-mappers",
+ "subType": "anonymous",
+ "subComponents": {},
+ "config": {
+ "allowed-protocol-mapper-types": [
+ "saml-role-list-mapper",
+ "oidc-usermodel-attribute-mapper",
+ "oidc-full-name-mapper",
+ "oidc-usermodel-property-mapper",
+ "oidc-address-mapper",
+ "saml-user-property-mapper",
+ "saml-user-attribute-mapper",
+ "oidc-sha256-pairwise-sub-mapper"
+ ],
+ "consent-required-for-all-mappers": [
+ "true"
+ ]
+ }
+ },
+ {
+ "id": "3dcc314c-07f8-484d-9535-29424dbaddfc",
+ "name": "Trusted Hosts",
+ "providerId": "trusted-hosts",
+ "subType": "anonymous",
+ "subComponents": {},
+ "config": {
+ "host-sending-registration-request-must-match": [
+ "true"
+ ],
+ "client-uris-must-match": [
+ "true"
+ ]
+ }
+ },
+ {
+ "id": "ab52b781-64b9-42a0-99f5-cbeba6710763",
+ "name": "Consent Required",
+ "providerId": "consent-required",
+ "subType": "anonymous",
+ "subComponents": {},
+ "config": {}
+ }
+ ],
+ "org.keycloak.keys.KeyProvider": [
+ {
+ "id": "bd30c46f-9ee3-443d-9faa-6ed8075aac87",
+ "name": "rsa-generated",
+ "providerId": "rsa-generated",
+ "subComponents": {},
+ "config": {
+ "priority": [
+ "100"
+ ]
+ }
+ },
+ {
+ "id": "a93cc73f-b070-48cd-bf08-9b290707c2f5",
+ "name": "hmac-generated",
+ "providerId": "hmac-generated",
+ "subComponents": {},
+ "config": {
+ "priority": [
+ "100"
+ ]
+ }
+ }
+ ]
+ },
+ "internationalizationEnabled": false,
+ "supportedLocales": [],
+ "defaultLocale": "en",
+ "authenticationFlows": [
+ {
+ "id": "976a6147-7a63-48cd-ab6d-ac3a2f0ffa42",
+ "alias": "Direct Grant 2",
+ "description": "OpenID Connect Resource Owner Grant",
+ "providerId": "basic-flow",
+ "topLevel": true,
+ "builtIn": false,
+ "authenticationExecutions": [
+ {
+ "authenticator": "direct-grant-validate-username",
+ "requirement": "REQUIRED",
+ "priority": 10,
+ "userSetupAllowed": false,
+ "autheticatorFlow": false
+ },
+ {
+ "authenticator": "direct-grant-validate-password",
+ "requirement": "DISABLED",
+ "priority": 20,
+ "userSetupAllowed": false,
+ "autheticatorFlow": false
+ },
+ {
+ "authenticator": "direct-grant-validate-otp",
+ "requirement": "OPTIONAL",
+ "priority": 30,
+ "userSetupAllowed": false,
+ "autheticatorFlow": false
+ }
+ ]
+ },
+ {
+ "id": "fe01a5ba-9b8b-4211-8a71-273800b0309d",
+ "alias": "Direct Grant w/o Password",
+ "description": "Grant user access using only the username and no password.",
+ "providerId": "basic-flow",
+ "topLevel": true,
+ "builtIn": false,
+ "authenticationExecutions": []
+ },
+ {
+ "id": "797d8e90-1fb5-48bc-b6f0-e44766721af0",
+ "alias": "Handle Existing Account",
+ "description": "Handle what to do if there is existing account with same email/username like authenticated identity provider",
+ "providerId": "basic-flow",
+ "topLevel": false,
+ "builtIn": true,
+ "authenticationExecutions": [
+ {
+ "authenticator": "idp-confirm-link",
+ "requirement": "REQUIRED",
+ "priority": 10,
+ "userSetupAllowed": false,
+ "autheticatorFlow": false
+ },
+ {
+ "authenticator": "idp-email-verification",
+ "requirement": "ALTERNATIVE",
+ "priority": 20,
+ "userSetupAllowed": false,
+ "autheticatorFlow": false
+ },
+ {
+ "requirement": "ALTERNATIVE",
+ "priority": 30,
+ "flowAlias": "Verify Existing Account by Re-authentication",
+ "userSetupAllowed": false,
+ "autheticatorFlow": true
+ }
+ ]
+ },
+ {
+ "id": "5f70fc7a-42b6-41cd-aaf9-a3837fc05f43",
+ "alias": "Phone number login",
+ "description": "browser based authentication",
+ "providerId": "basic-flow",
+ "topLevel": true,
+ "builtIn": false,
+ "authenticationExecutions": [
+ {
+ "authenticator": "auth-cookie",
+ "requirement": "ALTERNATIVE",
+ "priority": 10,
+ "userSetupAllowed": false,
+ "autheticatorFlow": false
+ },
+ {
+ "authenticator": "auth-spnego",
+ "requirement": "DISABLED",
+ "priority": 20,
+ "userSetupAllowed": false,
+ "autheticatorFlow": false
+ },
+ {
+ "authenticator": "identity-provider-redirector",
+ "requirement": "ALTERNATIVE",
+ "priority": 25,
+ "userSetupAllowed": false,
+ "autheticatorFlow": false
+ },
+ {
+ "requirement": "ALTERNATIVE",
+ "priority": 30,
+ "flowAlias": "Phone number login forms",
+ "userSetupAllowed": false,
+ "autheticatorFlow": true
+ }
+ ]
+ },
+ {
+ "id": "b886ae3f-e90a-4309-bb05-5367c3ec977b",
+ "alias": "Phone number login forms",
+ "description": "Username, password, otp and other auth forms.",
+ "providerId": "basic-flow",
+ "topLevel": false,
+ "builtIn": false,
+ "authenticationExecutions": [
+ {
+ "authenticator": "auth-phone-password-form",
+ "requirement": "REQUIRED",
+ "priority": 20,
+ "userSetupAllowed": false,
+ "autheticatorFlow": false
+ },
+ {
+ "authenticator": "auth-otp-form",
+ "requirement": "DISABLED",
+ "priority": 21,
+ "userSetupAllowed": false,
+ "autheticatorFlow": false
+ }
+ ]
+ },
+ {
+ "id": "8dc1276b-946b-4c49-97d2-ade016fd9df8",
+ "alias": "Reset Credentials Via SMS OTP",
+ "description": "Reset credentials for a user if they forgot their password or something",
+ "providerId": "basic-flow",
+ "topLevel": true,
+ "builtIn": false,
+ "authenticationExecutions": [
+ {
+ "authenticator": "reset-credentials-choose-user",
+ "requirement": "REQUIRED",
+ "priority": 10,
+ "userSetupAllowed": false,
+ "autheticatorFlow": false
+ },
+ {
+ "authenticatorConfig": "Reset Credentials Via SMS OTP",
+ "authenticator": "sms-authentication",
+ "requirement": "REQUIRED",
+ "priority": 20,
+ "userSetupAllowed": false,
+ "autheticatorFlow": false
+ },
+ {
+ "authenticator": "reset-password",
+ "requirement": "REQUIRED",
+ "priority": 40,
+ "userSetupAllowed": false,
+ "autheticatorFlow": false
+ },
+ {
+ "authenticator": "reset-otp",
+ "requirement": "OPTIONAL",
+ "priority": 41,
+ "userSetupAllowed": false,
+ "autheticatorFlow": false
+ }
+ ]
+ },
+ {
+ "id": "14838047-af17-4104-a714-bf51bd0aa699",
+ "alias": "Verify Existing Account by Re-authentication",
+ "description": "Reauthentication of existing account",
+ "providerId": "basic-flow",
+ "topLevel": false,
+ "builtIn": true,
+ "authenticationExecutions": [
+ {
+ "authenticator": "idp-username-password-form",
+ "requirement": "REQUIRED",
+ "priority": 10,
+ "userSetupAllowed": false,
+ "autheticatorFlow": false
+ },
+ {
+ "authenticator": "auth-otp-form",
+ "requirement": "OPTIONAL",
+ "priority": 20,
+ "userSetupAllowed": false,
+ "autheticatorFlow": false
+ }
+ ]
+ },
+ {
+ "id": "7ab0a65d-641e-4ba0-8793-35e363ba8362",
+ "alias": "browser",
+ "description": "browser based authentication",
+ "providerId": "basic-flow",
+ "topLevel": true,
+ "builtIn": true,
+ "authenticationExecutions": [
+ {
+ "authenticator": "auth-cookie",
+ "requirement": "ALTERNATIVE",
+ "priority": 10,
+ "userSetupAllowed": false,
+ "autheticatorFlow": false
+ },
+ {
+ "authenticator": "auth-spnego",
+ "requirement": "DISABLED",
+ "priority": 20,
+ "userSetupAllowed": false,
+ "autheticatorFlow": false
+ },
+ {
+ "authenticator": "identity-provider-redirector",
+ "requirement": "ALTERNATIVE",
+ "priority": 25,
+ "userSetupAllowed": false,
+ "autheticatorFlow": false
+ },
+ {
+ "requirement": "ALTERNATIVE",
+ "priority": 30,
+ "flowAlias": "forms",
+ "userSetupAllowed": false,
+ "autheticatorFlow": true
+ }
+ ]
+ },
+ {
+ "id": "b2aedbfb-9432-4f47-8114-c6031c884b5f",
+ "alias": "clients",
+ "description": "Base authentication for clients",
+ "providerId": "client-flow",
+ "topLevel": true,
+ "builtIn": true,
+ "authenticationExecutions": [
+ {
+ "authenticator": "client-secret",
+ "requirement": "ALTERNATIVE",
+ "priority": 10,
+ "userSetupAllowed": false,
+ "autheticatorFlow": false
+ },
+ {
+ "authenticator": "client-jwt",
+ "requirement": "ALTERNATIVE",
+ "priority": 20,
+ "userSetupAllowed": false,
+ "autheticatorFlow": false
+ }
+ ]
+ },
+ {
+ "id": "78809b88-19c3-4351-ac1a-e1c43dd71143",
+ "alias": "direct grant",
+ "description": "OpenID Connect Resource Owner Grant",
+ "providerId": "basic-flow",
+ "topLevel": true,
+ "builtIn": true,
+ "authenticationExecutions": [
+ {
+ "authenticator": "direct-grant-validate-username",
+ "requirement": "REQUIRED",
+ "priority": 10,
+ "userSetupAllowed": false,
+ "autheticatorFlow": false
+ },
+ {
+ "authenticator": "direct-grant-validate-password",
+ "requirement": "DISABLED",
+ "priority": 20,
+ "userSetupAllowed": false,
+ "autheticatorFlow": false
+ },
+ {
+ "authenticator": "direct-grant-validate-otp",
+ "requirement": "OPTIONAL",
+ "priority": 30,
+ "userSetupAllowed": false,
+ "autheticatorFlow": false
+ }
+ ]
+ },
+ {
+ "id": "025a77cf-895a-4622-95a0-fdd9912aeb9a",
+ "alias": "docker auth",
+ "description": "Used by Docker clients to authenticate against the IDP",
+ "providerId": "basic-flow",
+ "topLevel": true,
+ "builtIn": true,
+ "authenticationExecutions": [
+ {
+ "authenticator": "docker-http-basic-authenticator",
+ "requirement": "REQUIRED",
+ "priority": 10,
+ "userSetupAllowed": false,
+ "autheticatorFlow": false
+ }
+ ]
+ },
+ {
+ "id": "1ea8d8e5-7997-43d0-9ce4-0ec187d9c5be",
+ "alias": "first broker login",
+ "description": "Actions taken after first broker login with identity provider account, which is not yet linked to any Keycloak account",
+ "providerId": "basic-flow",
+ "topLevel": true,
+ "builtIn": true,
+ "authenticationExecutions": [
+ {
+ "authenticatorConfig": "review profile config",
+ "authenticator": "idp-review-profile",
+ "requirement": "REQUIRED",
+ "priority": 10,
+ "userSetupAllowed": false,
+ "autheticatorFlow": false
+ },
+ {
+ "authenticatorConfig": "create unique user config",
+ "authenticator": "idp-create-user-if-unique",
+ "requirement": "ALTERNATIVE",
+ "priority": 20,
+ "userSetupAllowed": false,
+ "autheticatorFlow": false
+ },
+ {
+ "requirement": "ALTERNATIVE",
+ "priority": 30,
+ "flowAlias": "Handle Existing Account",
+ "userSetupAllowed": false,
+ "autheticatorFlow": true
+ }
+ ]
+ },
+ {
+ "id": "5ae10869-08a5-489b-97c6-b6f65a40de21",
+ "alias": "forms",
+ "description": "Username, password, otp and other auth forms.",
+ "providerId": "basic-flow",
+ "topLevel": false,
+ "builtIn": true,
+ "authenticationExecutions": [
+ {
+ "authenticator": "auth-username-password-form",
+ "requirement": "REQUIRED",
+ "priority": 10,
+ "userSetupAllowed": false,
+ "autheticatorFlow": false
+ },
+ {
+ "authenticator": "auth-otp-form",
+ "requirement": "OPTIONAL",
+ "priority": 20,
+ "userSetupAllowed": false,
+ "autheticatorFlow": false
+ }
+ ]
+ },
+ {
+ "id": "1be582c9-b469-4092-82d4-365fb6d02963",
+ "alias": "registration",
+ "description": "registration flow",
+ "providerId": "basic-flow",
+ "topLevel": true,
+ "builtIn": true,
+ "authenticationExecutions": [
+ {
+ "authenticator": "registration-page-form",
+ "requirement": "REQUIRED",
+ "priority": 10,
+ "flowAlias": "registration form",
+ "userSetupAllowed": false,
+ "autheticatorFlow": true
+ }
+ ]
+ },
+ {
+ "id": "e71bd4ef-a33e-4a75-a8fc-8cfaf6a1119b",
+ "alias": "registration form",
+ "description": "registration form",
+ "providerId": "form-flow",
+ "topLevel": false,
+ "builtIn": true,
+ "authenticationExecutions": [
+ {
+ "authenticator": "registration-user-creation",
+ "requirement": "REQUIRED",
+ "priority": 20,
+ "userSetupAllowed": false,
+ "autheticatorFlow": false
+ },
+ {
+ "authenticator": "registration-profile-action",
+ "requirement": "REQUIRED",
+ "priority": 40,
+ "userSetupAllowed": false,
+ "autheticatorFlow": false
+ },
+ {
+ "authenticator": "registration-password-action",
+ "requirement": "REQUIRED",
+ "priority": 50,
+ "userSetupAllowed": false,
+ "autheticatorFlow": false
+ },
+ {
+ "authenticator": "registration-recaptcha-action",
+ "requirement": "DISABLED",
+ "priority": 60,
+ "userSetupAllowed": false,
+ "autheticatorFlow": false
+ }
+ ]
+ },
+ {
+ "id": "6c4e8128-0eb4-4303-bbec-3e5baec31022",
+ "alias": "reset credentials",
+ "description": "Reset credentials for a user if they forgot their password or something",
+ "providerId": "basic-flow",
+ "topLevel": true,
+ "builtIn": true,
+ "authenticationExecutions": [
+ {
+ "authenticator": "reset-credentials-choose-user",
+ "requirement": "REQUIRED",
+ "priority": 10,
+ "userSetupAllowed": false,
+ "autheticatorFlow": false
+ },
+ {
+ "authenticator": "reset-credential-email",
+ "requirement": "REQUIRED",
+ "priority": 20,
+ "userSetupAllowed": false,
+ "autheticatorFlow": false
+ },
+ {
+ "authenticator": "reset-password",
+ "requirement": "REQUIRED",
+ "priority": 30,
+ "userSetupAllowed": false,
+ "autheticatorFlow": false
+ },
+ {
+ "authenticator": "reset-otp",
+ "requirement": "OPTIONAL",
+ "priority": 40,
+ "userSetupAllowed": false,
+ "autheticatorFlow": false
+ }
+ ]
+ },
+ {
+ "id": "ec7bae86-99e4-403a-a041-1039bacba45e",
+ "alias": "saml ecp",
+ "description": "SAML ECP Profile Authentication Flow",
+ "providerId": "basic-flow",
+ "topLevel": true,
+ "builtIn": true,
+ "authenticationExecutions": [
+ {
+ "authenticator": "http-basic-authenticator",
+ "requirement": "REQUIRED",
+ "priority": 10,
+ "userSetupAllowed": false,
+ "autheticatorFlow": false
+ }
+ ]
+ }
+ ],
+ "authenticatorConfig": [
+ {
+ "id": "7d7aa155-54cd-4b62-bc7f-558ce934e0a5",
+ "alias": "Reset Credentials Via SMS OTP",
+ "config": {
+ "sms-auth.code.length": "6",
+ "sms-auth.msg.text": "Reset your password on PREPROD with the OTP %sms-code%. The OTP is valid for 5 minutes.",
+ "sms-auth.code.ttl": "300"
+ }
+ },
+ {
+ "id": "cc029554-f8bc-49c2-81cc-f0f7141bf178",
+ "alias": "create unique user config",
+ "config": {
+ "require.password.update.after.registration": "false"
+ }
+ },
+ {
+ "id": "6a2402e1-b718-43a0-9b65-2a7b62d3b935",
+ "alias": "review profile config",
+ "config": {
+ "update.profile.on.first.login": "missing"
+ }
+ }
+ ],
+ "requiredActions": [
+ {
+ "alias": "CONFIGURE_TOTP",
+ "name": "Configure OTP",
+ "providerId": "CONFIGURE_TOTP",
+ "enabled": true,
+ "defaultAction": false,
+ "config": {}
+ },
+ {
+ "alias": "UPDATE_PASSWORD",
+ "name": "Update Password",
+ "providerId": "UPDATE_PASSWORD",
+ "enabled": true,
+ "defaultAction": false,
+ "config": {}
+ },
+ {
+ "alias": "UPDATE_PROFILE",
+ "name": "Update Profile",
+ "providerId": "UPDATE_PROFILE",
+ "enabled": true,
+ "defaultAction": false,
+ "config": {}
+ },
+ {
+ "alias": "VERIFY_EMAIL",
+ "name": "Verify Email",
+ "providerId": "VERIFY_EMAIL",
+ "enabled": true,
+ "defaultAction": false,
+ "config": {}
+ },
+ {
+ "alias": "terms_and_conditions",
+ "name": "Terms and Conditions",
+ "providerId": "terms_and_conditions",
+ "enabled": true,
+ "defaultAction": false,
+ "config": {}
+ }
+ ],
+ "browserFlow": "Phone number login",
+ "registrationFlow": "registration",
+ "directGrantFlow": "Direct Grant 2",
+ "resetCredentialsFlow": "Reset Credentials Via SMS OTP",
+ "clientAuthenticationFlow": "clients",
+ "dockerAuthenticationFlow": "docker auth",
+ "attributes": {
+ "_browser_header.xXSSProtection": "1; mode=block",
+ "_browser_header.xFrameOptions": "SAMEORIGIN",
+ "quickLoginCheckMilliSeconds": "1000",
+ "permanentLockout": "false",
+ "_browser_header.xRobotsTag": "none",
+ "maxFailureWaitSeconds": "900",
+ "minimumQuickLoginWaitSeconds": "60",
+ "failureFactor": "30",
+ "actionTokenGeneratedByUserLifespan": "300",
+ "maxDeltaTimeSeconds": "43200",
+ "_browser_header.xContentTypeOptions": "nosniff",
+ "actionTokenGeneratedByAdminLifespan": "43200",
+ "bruteForceProtected": "true",
+ "_browser_header.contentSecurityPolicy": "frame-src 'self'",
+ "waitIncrementSeconds": "60"
+ },
+ "keycloakVersion": "3.2.0.Final"
+}
\ No newline at end of file
diff --git a/ansible/roles/keycloak-deploy-6.0/templates/module.xml.j2 b/ansible/roles/keycloak-deploy-6.0/templates/module.xml.j2
new file mode 100644
index 000000000..fc3c43c66
--- /dev/null
+++ b/ansible/roles/keycloak-deploy-6.0/templates/module.xml.j2
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/ansible/roles/keycloak-deploy/templates/standalone-ha-single.xml b/ansible/roles/keycloak-deploy-6.0/templates/standalone-ha-single.xml
similarity index 100%
rename from ansible/roles/keycloak-deploy/templates/standalone-ha-single.xml
rename to ansible/roles/keycloak-deploy-6.0/templates/standalone-ha-single.xml
diff --git a/ansible/roles/keycloak-deploy-6.0/templates/standalone-ha.xml b/ansible/roles/keycloak-deploy-6.0/templates/standalone-ha.xml
new file mode 100644
index 000000000..14ee65162
--- /dev/null
+++ b/ansible/roles/keycloak-deploy-6.0/templates/standalone-ha.xml
@@ -0,0 +1,673 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ jdbc:h2:mem:test;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE
+ h2
+
+ sa
+ sa
+
+
+
+ jdbc:postgresql://{{keycloak_postgres_host}}:5432/{{ keycloak_postgres_database }}?sslmode=require
+ postgresql
+
+ {{ keycloak_postgres_user }}
+ {{ keycloak_postgres_password }}
+
+
+
+ select 1
+ false
+ true
+ 120000
+
+
+ false
+
+
+
+
+
+ org.h2.jdbcx.JdbcDataSource
+
+
+ org.postgresql.xa.PGXADataSource
+ org.postgresql.ds.PGPoolingDataSource
+
+
+
+
+
+
+
+
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{groups['keycloak'] | difference(ansible_default_ipv4.address) | join('[7600],')}}[7600]
+ 10
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ auth
+
+ classpath:${jboss.home.dir}/providers/*
+
+ master
+ 900
+
+ 2592000
+ true
+ true
+ ${jboss.home.dir}/themes
+
+
+
+
+
+
+
+
+
+
+
+
+ jpa
+
+
+ basic
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ default
+
+
+
+
+
+
+
+ ${keycloak.jta.lookup.provider:jboss}
+
+
+
+
+
+
+
+
+
+
+ ${keycloak.x509cert.lookup.provider:default}
+
+
+
+ request
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ansible/roles/keycloak-deploy-6.0/templates/standalone.xml b/ansible/roles/keycloak-deploy-6.0/templates/standalone.xml
new file mode 100644
index 000000000..c1959c7f2
--- /dev/null
+++ b/ansible/roles/keycloak-deploy-6.0/templates/standalone.xml
@@ -0,0 +1,471 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ jdbc:h2:mem:test;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE
+ h2
+
+ sa
+ sa
+
+
+
+ jdbc:h2:${jboss.server.data.dir}/keycloak;AUTO_SERVER=TRUE
+ h2
+
+ sa
+ sa
+
+
+
+
+ org.h2.jdbcx.JdbcDataSource
+
+
+
+
+
+
+
+
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ auth
+
+ classpath:${jboss.home.dir}/providers/*
+
+ master
+ 900
+
+ 2592000
+ true
+ true
+ ${jboss.home.dir}/themes
+
+
+
+
+
+
+
+
+
+
+
+
+ jpa
+
+
+ basic
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ default
+
+
+
+
+
+
+
+ ${keycloak.jta.lookup.provider:jboss}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ansible/roles/keycloak-deploy/defaults/main.yml b/ansible/roles/keycloak-deploy/defaults/main.yml
index b68604449..5bb301b3a 100644
--- a/ansible/roles/keycloak-deploy/defaults/main.yml
+++ b/ansible/roles/keycloak-deploy/defaults/main.yml
@@ -77,6 +77,8 @@ keycloak_custom_ds: '
'
+keycloak_heap_size: 512m
+keycloak_metaspace_size: 256m
theme: "sunrise.tar.gz"
dest_theme: "/opt/keycloak/themes/"
theme_file: sunrise
diff --git a/ansible/roles/keycloak-deploy/tasks/deploy.yml b/ansible/roles/keycloak-deploy/tasks/deploy.yml
index a796e2ad1..96236c9df 100644
--- a/ansible/roles/keycloak-deploy/tasks/deploy.yml
+++ b/ansible/roles/keycloak-deploy/tasks/deploy.yml
@@ -1,12 +1,3 @@
-- name: Get the list of all the services running in our OS
- become: yes
- service_facts:
-
-- name: Stop the monit to ensure that it doesn't start keycloak
- service: name=monit state=stopped
- become: yes
- when: ansible_facts.services.monit is defined
-
- name: Status service
become: true
command: /etc/init.d/keycloak status
@@ -28,17 +19,26 @@
line: '{{item.var}}={{item.value}}'
regexp: "{{ item.var }}.*"
with_items:
- - {var: 'sunbird_lms_base_url', value: '{{ sunbird_lms_base_url }}'}
- - {var: 'sunbird_authorization', value: '{{ sunbird_authorization }}'}
- - {var: 'sunbird_encryption_key', value: '{{ sunbird_encryption_key }}'}
- - {var: 'sunbird_sso_username', value: '{{ sunbird_sso_username }}'}
- - {var: 'sunbird_sso_password', value: '{{ sunbird_sso_password }}'}
- - {var: 'sunbird_sso_url', value: '{{ keycloak_auth_server_url }}/'}
- - {var: 'sunbird_sso_realm', value: '{{ keycloak_realm }}'}
- - {var: 'sunbird_sso_client_id', value: '{{ sunbird_sso_client_id }}'}
- - {var: 'sunbird_cassandra_host', value: '{{ sunbird_cassandra_host }}'}
- {var: 'sunbird_user_service_base_url', value: '{{ sunbird_user_service_base_url }}'}
+- name: Remove old ENV Vars from environemt file
+ lineinfile:
+ path: '/etc/environment'
+ line: '{{item.var}}'
+ regexp: "{{ item.var }}.*"
+ state: absent
+ with_items:
+ - {var: 'sunbird_lms_base_url'}
+ - {var: 'sunbird_authorization'}
+ - {var: 'sunbird_encryption_key'}
+ - {var: 'sunbird_sso_username'}
+ - {var: 'sunbird_sso_password'}
+ - {var: 'sunbird_sso_url'}
+ - {var: 'sunbird_sso_realm'}
+ - {var: 'sunbird_sso_client_id'}
+ - {var: 'sunbird_cassandra_host'}
+ - {var: 'sunbird_cs_base_url'}
+
- name: Remove keycloak
become: true
file:
@@ -48,24 +48,33 @@
group: "{{ wildfly_group }}"
force: true
-- name: Creating keycloak directory
- become: true
- file:
- path: "{{ keycloak_home }}"
- state: directory
+- name: Paste keycloak package on server
+ copy:
+ src: "{{ artifact_path }}"
+ dest: "/opt/"
owner: "{{ wildfly_user }}"
group: "{{ wildfly_group }}"
+ force: true
- name: Extarct the folder
unarchive:
- src: "{{ artifact_path }}"
- dest: "{{ keycloak_home }}"
+ src: "/opt/{{ artifact }}"
+ dest: /opt/
+ copy: false
owner: "{{ wildfly_user }}"
group: "{{ wildfly_group }}"
-- name: Creating keycloak directory in proper structure
- become: yes
- shell: "cd {{ keycloak_home }} ; mv sunbird_auth_1.0v/* ./ ; rm -rf sunbird_auth_1.0v; chown -R keycloak:keycloak {{ keycloak_home }}"
+- name: Move the folder name
+ command: mv sunbird_auth_{{ sunbird_auth_version }} keycloak
+ args:
+ chdir: /opt
+
+- name: Remove the opt/{{ artifact }}
+ become: true
+ file:
+ path: "/opt/{{ artifact }}"
+ state: absent
+ force: true
- name: Create required directories
file:
@@ -109,19 +118,11 @@
mode: 0755
force: true
-- name: Keycloak configuration XML file - Multi-node keycloak
- template:
- src: "standalone-ha.xml"
- dest: "sunbird_auth_{{ sunbird_auth_version }}.config/standalone-ha.xml"
- mode: 0750
- when: groups['keycloak'] | length > 1
-
-- name: Keycloak configuration XML file - Single node keycloak
+- name: Keycloak configuration XML file
template:
- src: "standalone-ha-single.xml"
+ src: "roles/keycloak-deploy/templates/standalone-ha.xml"
dest: "sunbird_auth_{{ sunbird_auth_version }}.config/standalone-ha.xml"
mode: 0750
- when: groups['keycloak'] | length < 2
- name: Postgresql Configuration- module.xml
template:
@@ -137,7 +138,7 @@
when: "{{ msg_91_required|default(false) }}"
ignore_errors: true
-- name: Keycloak configuration XML file
+- name: Keycloak configuration XML file
copy:
src: "sunbird_auth_{{ sunbird_auth_version }}.config/standalone-ha.xml"
dest: "{{ keycloak_home }}/standalone/configuration/standalone-ha.xml"
@@ -146,6 +147,14 @@
group: "{{ wildfly_group }}"
remote_src: true
+- name: Keycloak standalone.conf file
+ template:
+ src: templates/standalone.conf.j2
+ dest: "{{ keycloak_home }}/bin/standalone.conf"
+ owner: "{{ wildfly_user }}"
+ group: "{{ wildfly_group }}"
+ mode: 0755
+
- name: Postgresql Configuration- module.xml
copy:
src: "sunbird_auth_{{ sunbird_auth_version }}.config/module.xml"
@@ -194,12 +203,3 @@
command: /etc/init.d/keycloak start
poll: 5
async: 5
-
-- name: get the list of all services in the system
- become: yes
- service_facts:
-
-- name: After succesful migration and staring of keycloak, start back monit if installed
- service: name=monit state=started
- become: yes
- when: ansible_facts.services.monit is defined
diff --git a/ansible/roles/keycloak-deploy/templates/module.xml.j2 b/ansible/roles/keycloak-deploy/templates/module.xml.j2
index fc3c43c66..bcfe36a40 100644
--- a/ansible/roles/keycloak-deploy/templates/module.xml.j2
+++ b/ansible/roles/keycloak-deploy/templates/module.xml.j2
@@ -1,5 +1,5 @@
-
+
diff --git a/ansible/roles/keycloak-deploy/templates/standalone-ha.xml b/ansible/roles/keycloak-deploy/templates/standalone-ha.xml
index 14ee65162..d1aac745d 100644
--- a/ansible/roles/keycloak-deploy/templates/standalone-ha.xml
+++ b/ansible/roles/keycloak-deploy/templates/standalone-ha.xml
@@ -1,6 +1,6 @@
-
+
@@ -9,8 +9,10 @@
+
+
@@ -20,12 +22,7 @@
-
-
-
-
-
@@ -42,11 +39,6 @@
-
-
-
-
-
@@ -61,7 +53,7 @@
-
+
@@ -70,8 +62,7 @@
-
-
+
@@ -86,7 +77,7 @@
-
+
@@ -101,12 +92,20 @@
+
+
+
+
+
+
+
+
+
+
+
-
-
-
@@ -118,6 +117,7 @@
+
@@ -128,10 +128,9 @@
-
-
+
-
+
jdbc:h2:mem:test;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE
h2
@@ -139,25 +138,41 @@
sa
-
+
+ jdbc:h2:${jboss.server.data.dir}/keycloak;AUTO_SERVER=TRUE
+ h2
+
+ sa
+ sa
+
+
+
+
+ jdbc:postgresql://thisnotwork:5432/keycloak
jdbc:postgresql://{{keycloak_postgres_host}}:5432/{{ keycloak_postgres_database }}?sslmode=require
postgresql
+
+ 50
+
{{ keycloak_postgres_user }}
{{ keycloak_postgres_password }}
-
-
- select 1
- false
- true
- 120000
-
-
- false
-
+
+ true
+ 10000
+
+
+
-
org.h2.jdbcx.JdbcDataSource
@@ -190,7 +205,7 @@
-
+
@@ -200,8 +215,9 @@
-
+
+
@@ -217,12 +233,7 @@
-
-
-
-
-
-
+
@@ -231,50 +242,47 @@
-
-
+
-
-
+
+
-
+
-
+
-
-
-
-
-
-
+
+
+
+
-
+
-
+
-
+
-
-
+
+
-
+
-
+
@@ -282,28 +290,28 @@
-
+
-
+
-
+
-
+
-
+
-
+
-
+
@@ -322,7 +330,8 @@
-
+
+
@@ -331,7 +340,7 @@
-
+
@@ -340,15 +349,18 @@
-
+
-
-
+
- {{groups['keycloak'] | difference(ansible_default_ipv4.address) | join('[7600],')}}[7600]
+ {{groups['keycloak']|join('[7600],')}}[7600]
+
10
+ 3000
+ 2
+
@@ -360,7 +372,6 @@
-
@@ -371,22 +382,24 @@
-
+
+
-
-
+
+
-
+
-
+
+
@@ -397,107 +410,7 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
@@ -514,6 +427,11 @@
+
+
+
+
+
@@ -522,35 +440,25 @@
-
-
-
-
-
-
-
+
+
-
-
-
-
-
-
+
-
-
+
-
+
+
@@ -560,6 +468,10 @@
+
+
+
+
auth
@@ -610,7 +522,7 @@
default
-
+
@@ -625,20 +537,6 @@
-
- ${keycloak.x509cert.lookup.provider:default}
-
-
-
- request
-
-
-
-
-
-
-
-
@@ -658,12 +556,12 @@
-
-
-
-
+
+
+
-
+
+
diff --git a/ansible/roles/keycloak-deploy/templates/standalone.conf.j2 b/ansible/roles/keycloak-deploy/templates/standalone.conf.j2
new file mode 100644
index 000000000..cb64ec9b5
--- /dev/null
+++ b/ansible/roles/keycloak-deploy/templates/standalone.conf.j2
@@ -0,0 +1,73 @@
+## -*- shell-script -*- ######################################################
+## ##
+## JBoss Bootstrap Script Configuration ##
+## ##
+##############################################################################
+
+#
+# This file is optional; it may be removed if not needed.
+#
+
+#
+# Specify the maximum file descriptor limit, use "max" or "maximum" to use
+# the default, as queried by the system.
+#
+# Defaults to "maximum"
+#
+#MAX_FD="maximum"
+
+#
+# Specify the profiler configuration file to load.
+#
+# Default is to not load profiler configuration file.
+#
+#PROFILER=""
+
+#
+# Specify the location of the Java home directory. If set then $JAVA will
+# be defined to $JAVA_HOME/bin/java, else $JAVA will be "java".
+#
+#JAVA_HOME="/opt/java/jdk"
+
+#
+# Specify the exact Java VM executable to use.
+#
+#JAVA=""
+
+if [ "x$JBOSS_MODULES_SYSTEM_PKGS" = "x" ]; then
+ JBOSS_MODULES_SYSTEM_PKGS="org.jboss.byteman"
+fi
+
+# Uncomment the following line to prevent manipulation of JVM options
+# by shell scripts.
+#
+#PRESERVE_JAVA_OPTS=true
+
+#
+# Specify options to pass to the Java VM.
+#
+if [ "x$JAVA_OPTS" = "x" ]; then
+ JAVA_OPTS="-Xms64m -Xmx{{ keycloak_heap_size }} -XX:MetaspaceSize=96M -XX:MaxMetaspaceSize={{ keycloak_metaspace_size }} -Djava.net.preferIPv4Stack=true"
+ JAVA_OPTS="$JAVA_OPTS -Djboss.modules.system.pkgs=$JBOSS_MODULES_SYSTEM_PKGS -Djava.awt.headless=true"
+else
+ echo "JAVA_OPTS already set in environment; overriding default settings with values: $JAVA_OPTS"
+fi
+
+# Sample JPDA settings for remote socket debugging
+#JAVA_OPTS="$JAVA_OPTS -agentlib:jdwp=transport=dt_socket,address=8787,server=y,suspend=n"
+
+# Sample JPDA settings for shared memory debugging
+#JAVA_OPTS="$JAVA_OPTS -agentlib:jdwp=transport=dt_shmem,server=y,suspend=n,address=jboss"
+
+# Uncomment to not use JBoss Modules lockless mode
+#JAVA_OPTS="$JAVA_OPTS -Djboss.modules.lockless=false"
+
+# Uncomment to gather JBoss Modules metrics
+#JAVA_OPTS="$JAVA_OPTS -Djboss.modules.metrics=true"
+
+# Uncomment this to run with a security manager enabled
+# SECMGR="true"
+
+# Uncomment this in order to be able to run WildFly on FreeBSD
+# when you get "epoll_create function not implemented" message in dmesg output
+#JAVA_OPTS="$JAVA_OPTS -Djava.nio.channels.spi.SelectorProvider=sun.nio.ch.PollSelectorProvider"
From 8887ef67bd962b235d8f67bf3e7fcf077f574ad7 Mon Sep 17 00:00:00 2001
From: Keshav Prasad
Date: Fri, 11 Dec 2020 20:24:45 +0530
Subject: [PATCH 069/184] feat: TG-713 KMW offline keys, updated few var names
(#2071)
---
.../roles/sunbird-deploy/tasks/main.yml | 4 ++--
.../core/groups/templates/deployment.yaml | 2 +-
kubernetes/helm_charts/core/groups/values.j2 | 2 +-
.../core/knowledgemw/templates/configmap.yaml | 22 +++++++++----------
.../knowledgemw/templates/deployment.yaml | 11 +++++++++-
.../helm_charts/core/knowledgemw/values.j2 | 2 ++
.../core/learner/templates/deployment.yaml | 2 +-
kubernetes/helm_charts/core/learner/values.j2 | 2 +-
.../core/lms/templates/deployment.yaml | 2 +-
kubernetes/helm_charts/core/lms/values.j2 | 2 +-
10 files changed, 31 insertions(+), 20 deletions(-)
diff --git a/kubernetes/ansible/roles/sunbird-deploy/tasks/main.yml b/kubernetes/ansible/roles/sunbird-deploy/tasks/main.yml
index 9a46ad013..6726d3b8d 100644
--- a/kubernetes/ansible/roles/sunbird-deploy/tasks/main.yml
+++ b/kubernetes/ansible/roles/sunbird-deploy/tasks/main.yml
@@ -27,7 +27,7 @@
private_key_prefix: "{{ outer_item.0.values_to_pass.keyprefix }}"
private_key_sign_start: "{{ outer_item.0.values_to_pass.keystart }}"
private_key_sign_end: "{{ outer_item.0.values_to_pass.keycount if outer_item.0.values_to_pass.keycount > '0' else '1' }}"
- when: release_name == "learner" or release_name == "lms" or release_name == "groups"
+ when: release_name == "learner" or release_name == "lms" or release_name == "groups" or release_name == "knowledgemw"
with_subelements:
- "{{adminutil_access_values}}"
- role_to_run
@@ -38,7 +38,7 @@
copy:
dest: "{{ chart_path }}/keys/{{ adminutil_refresh_token_public_key_kid }}"
content: "{{ core_vault_sunbird_sso_publickey }}"
- when: release_name == "learner" or release_name == "lms" or release_name == "groups"
+ when: release_name == "learner" or release_name == "lms" or release_name == "groups" or release_name == "knowledgemw"
- name: helm upgrade
shell: helm upgrade --install --atomic --timeout {{helm_install_timeout | d('10m')}} {{ release_name }} {{ chart_path }} -n {{namespace}}
diff --git a/kubernetes/helm_charts/core/groups/templates/deployment.yaml b/kubernetes/helm_charts/core/groups/templates/deployment.yaml
index 3f12a3346..8ece35318 100644
--- a/kubernetes/helm_charts/core/groups/templates/deployment.yaml
+++ b/kubernetes/helm_charts/core/groups/templates/deployment.yaml
@@ -47,7 +47,7 @@ spec:
{{- $keys := .Files.Glob "keys/*" }}
{{- if $keys }}
volumeMounts:
- - mountPath: {{ .Values.groups_device_basepath }}
+ - mountPath: {{ .Values.groups_access_basepath }}
name: access-keys
volumes:
- name: access-keys
diff --git a/kubernetes/helm_charts/core/groups/values.j2 b/kubernetes/helm_charts/core/groups/values.j2
index 43f1928a6..3a717743d 100644
--- a/kubernetes/helm_charts/core/groups/values.j2
+++ b/kubernetes/helm_charts/core/groups/values.j2
@@ -28,4 +28,4 @@ strategy:
{{ groups_liveness_readiness | to_nice_yaml }}
-groups_device_basepath: {{ groups_device_basepath | default('/keys/') }}
+groups_access_basepath: {{ groups_access_basepath | default('/keys/') }}
diff --git a/kubernetes/helm_charts/core/knowledgemw/templates/configmap.yaml b/kubernetes/helm_charts/core/knowledgemw/templates/configmap.yaml
index eb2c944f4..2575710a0 100644
--- a/kubernetes/helm_charts/core/knowledgemw/templates/configmap.yaml
+++ b/kubernetes/helm_charts/core/knowledgemw/templates/configmap.yaml
@@ -1,11 +1,11 @@
-#apiVersion: v1
-#data:
-# {{- range $key, $val := .Values.knowledgemwenv }}
-# {{ $key }}: {{ $val }}
-# {{- end }}
-# sunbird_cassandra_replication_strategy: {{ .Values.sunbird_cassandra_replication_strategy | toJson }}
-#kind: ConfigMap
-#metadata:
-# creationTimestamp: null
-# name: {{ .Chart.Name }}-config
-# namespace: {{ .Values.namespace }}
\ No newline at end of file
+---
+{{- $keys := .Files.Glob "keys/*" }}
+{{ if $keys }}
+apiVersion: v1
+kind: Secret
+metadata:
+ name: knowledgemw-access-keys
+type: Opaque
+data:
+{{ (.Files.Glob "keys/*").AsSecrets | indent 2 }}
+{{ end }}
diff --git a/kubernetes/helm_charts/core/knowledgemw/templates/deployment.yaml b/kubernetes/helm_charts/core/knowledgemw/templates/deployment.yaml
index 78442e62a..b6a5b5606 100644
--- a/kubernetes/helm_charts/core/knowledgemw/templates/deployment.yaml
+++ b/kubernetes/helm_charts/core/knowledgemw/templates/deployment.yaml
@@ -41,7 +41,16 @@ spec:
readinessProbe:
{{ toYaml .Values.readinessProbe | indent 10 }}
{{- end }}
-
+{{- $keys := .Files.Glob "keys/*" }}
+{{- if $keys }}
+ volumeMounts:
+ - mountPath: {{ .Values.knowledgemw_access_basepath }}
+ name: access-keys
+ volumes:
+ - name: access-keys
+ secret:
+ secretName: knowledgemw-access-keys
+{{- end }}
---
apiVersion: v1
kind: Service
diff --git a/kubernetes/helm_charts/core/knowledgemw/values.j2 b/kubernetes/helm_charts/core/knowledgemw/values.j2
index bf6ae52c1..3d33b267f 100644
--- a/kubernetes/helm_charts/core/knowledgemw/values.j2
+++ b/kubernetes/helm_charts/core/knowledgemw/values.j2
@@ -23,3 +23,5 @@ strategy:
maxunavailable: {{ knowledge_mw_maxunavailable|default('25%') }}
{{ knowledgemw_liveness_readiness | to_nice_yaml }}
+
+knowledgemw_access_basepath: {{ knowledgemw_access_basepath | default('/home/sunbird/mw/content/keys/') }}
diff --git a/kubernetes/helm_charts/core/learner/templates/deployment.yaml b/kubernetes/helm_charts/core/learner/templates/deployment.yaml
index 81117a28f..54fe996d6 100644
--- a/kubernetes/helm_charts/core/learner/templates/deployment.yaml
+++ b/kubernetes/helm_charts/core/learner/templates/deployment.yaml
@@ -50,7 +50,7 @@ spec:
subPath: learner-service_logback.xml
{{- $keys := .Files.Glob "keys/*" }}
{{- if $keys }}
- - mountPath: {{ .Values.learner_device_basepath }}
+ - mountPath: {{ .Values.learner_access_basepath }}
name: access-keys
{{- end }}
volumes:
diff --git a/kubernetes/helm_charts/core/learner/values.j2 b/kubernetes/helm_charts/core/learner/values.j2
index 0faa781ea..8b897f2a1 100644
--- a/kubernetes/helm_charts/core/learner/values.j2
+++ b/kubernetes/helm_charts/core/learner/values.j2
@@ -28,4 +28,4 @@ strategy:
{{ learner_liveness_readiness | to_nice_yaml }}
-learner_device_basepath: {{ learner_device_basepath | default('/keys/') }}
+learner_access_basepath: {{ learner_access_basepath | default('/keys/') }}
diff --git a/kubernetes/helm_charts/core/lms/templates/deployment.yaml b/kubernetes/helm_charts/core/lms/templates/deployment.yaml
index 1c797c37e..f90d2b642 100644
--- a/kubernetes/helm_charts/core/lms/templates/deployment.yaml
+++ b/kubernetes/helm_charts/core/lms/templates/deployment.yaml
@@ -54,7 +54,7 @@ spec:
subPath: lms-service_logback.xml
{{- $keys := .Files.Glob "keys/*" }}
{{- if $keys }}
- - mountPath: {{ .Values.lms_device_basepath }}
+ - mountPath: {{ .Values.lms_access_basepath }}
name: access-keys
{{- end }}
volumes:
diff --git a/kubernetes/helm_charts/core/lms/values.j2 b/kubernetes/helm_charts/core/lms/values.j2
index 0714daad9..dfbfd9a43 100644
--- a/kubernetes/helm_charts/core/lms/values.j2
+++ b/kubernetes/helm_charts/core/lms/values.j2
@@ -28,4 +28,4 @@ strategy:
{{ lms_liveness_readiness | to_nice_yaml }}
-lms_device_basepath: {{ lms_device_basepath | default('/keys/') }}
+lms_access_basepath: {{ lms_access_basepath | default('/keys/') }}
From 8582714d64885e90e3123dcaee6fc57352b5ea12 Mon Sep 17 00:00:00 2001
From: Pradyumna
Date: Tue, 15 Dec 2020 13:26:11 +0530
Subject: [PATCH 070/184] LMS config update to
sunbird_user_service_api_base_url (#2090)
* LMS config update to sunbird_user_service_api_base_url
---
ansible/roles/stack-sunbird/templates/sunbird_lms-service.env | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/ansible/roles/stack-sunbird/templates/sunbird_lms-service.env b/ansible/roles/stack-sunbird/templates/sunbird_lms-service.env
index 42859c390..700b8be36 100644
--- a/ansible/roles/stack-sunbird/templates/sunbird_lms-service.env
+++ b/ansible/roles/stack-sunbird/templates/sunbird_lms-service.env
@@ -100,7 +100,7 @@ sunbird_cache_enable={{sunbird_cache_enable | default(false)}}
# Set below variables if above true
sunbird_redis_host={{sunbird_redis_host}}
sunbird_redis_port={{sunbird_redis_port|default(6379)}}
-sunbird_user_org_api_base_url=http://learner-service:9000
+sunbird_user_org_api_base_url={{ lms_learner_api_base_url | default('http://learner-service:9000') }}
kafka_topics_instruction={{kafka_topics_instruction}}
kafka_urls={{kafka_urls}}
@@ -112,7 +112,7 @@ sunbird_cert_service_base_url=http://cert-service:9000
learning_service_base_url={{sunbird_content_repo_api_base_url}}
sunbird_user_search_cretordetails_fields=id,firstName,lastName
-sunbird_user_service_api_base_url={{sunbird_user_service_api_base_url}}
+sunbird_user_service_api_base_url={{ lms_learner_api_base_url | default('http://learner-service:9000') }}
limit_managed_user_creation={{limit_managed_user_creation | default(true)}}
managed_user_limit={{managed_user_limit | default(30)}}
From 9de55587ef7e6075593c9378ccc06cb8d73a0a2a Mon Sep 17 00:00:00 2001
From: RevathiKotla <45757421+RevathiKotla@users.noreply.github.com>
Date: Tue, 15 Dec 2020 16:53:55 +0530
Subject: [PATCH 071/184] TG-663 : Reliability of hd insight cluster- convert
cluster ambari metrics to promethus and set alerts (#2053)
* TG-663: Reliability hd cluster metrics
---
.../Dockerfile | 10 +
.../Jenkinsfile | 50 +++
.../azure-ambari-prometheus-exporter/build.sh | 8 +
.../collector.py | 294 ++++++++++++++++++
.../components.yaml | 27 ++
.../metadata.sh | 3 +
.../requirements.txt | 4 +
.../azure-ambari-prometheus-exporter.yaml | 19 ++
.../.helmignore | 23 ++
.../Chart.yaml | 21 ++
.../templates/_helpers.tpl | 63 ++++
.../templates/alerRules.yaml | 30 ++
.../templates/deployment.yaml | 46 +++
.../templates/service.yaml | 16 +
.../templates/serviceMonitor.yaml | 22 ++
.../values.yaml | 41 +++
16 files changed, 677 insertions(+)
create mode 100644 images/azure-ambari-prometheus-exporter/Dockerfile
create mode 100644 images/azure-ambari-prometheus-exporter/Jenkinsfile
create mode 100755 images/azure-ambari-prometheus-exporter/build.sh
create mode 100644 images/azure-ambari-prometheus-exporter/collector.py
create mode 100644 images/azure-ambari-prometheus-exporter/components.yaml
create mode 100755 images/azure-ambari-prometheus-exporter/metadata.sh
create mode 100644 images/azure-ambari-prometheus-exporter/requirements.txt
create mode 100644 kubernetes/ansible/roles/sunbird-monitoring/templates/azure-ambari-prometheus-exporter.yaml
create mode 100644 kubernetes/helm_charts/monitoring/azure-ambari-prometheus-exporter/.helmignore
create mode 100644 kubernetes/helm_charts/monitoring/azure-ambari-prometheus-exporter/Chart.yaml
create mode 100644 kubernetes/helm_charts/monitoring/azure-ambari-prometheus-exporter/templates/_helpers.tpl
create mode 100644 kubernetes/helm_charts/monitoring/azure-ambari-prometheus-exporter/templates/alerRules.yaml
create mode 100644 kubernetes/helm_charts/monitoring/azure-ambari-prometheus-exporter/templates/deployment.yaml
create mode 100644 kubernetes/helm_charts/monitoring/azure-ambari-prometheus-exporter/templates/service.yaml
create mode 100644 kubernetes/helm_charts/monitoring/azure-ambari-prometheus-exporter/templates/serviceMonitor.yaml
create mode 100644 kubernetes/helm_charts/monitoring/azure-ambari-prometheus-exporter/values.yaml
diff --git a/images/azure-ambari-prometheus-exporter/Dockerfile b/images/azure-ambari-prometheus-exporter/Dockerfile
new file mode 100644
index 000000000..17a504516
--- /dev/null
+++ b/images/azure-ambari-prometheus-exporter/Dockerfile
@@ -0,0 +1,10 @@
+FROM python:3.9.0-alpine
+MAINTAINER Revathi Kotla
+RUN mkdir /src
+WORKDIR /src
+COPY requirements.txt /src/requirements.txt
+RUN pip install -r requirements.txt
+COPY collector.py /src/collector.py
+COPY components.yaml /src/components.yaml
+EXPOSE 9999
+CMD ["python", "collector.py"]
diff --git a/images/azure-ambari-prometheus-exporter/Jenkinsfile b/images/azure-ambari-prometheus-exporter/Jenkinsfile
new file mode 100644
index 000000000..6c9df559b
--- /dev/null
+++ b/images/azure-ambari-prometheus-exporter/Jenkinsfile
@@ -0,0 +1,50 @@
+node('build-slave') {
+ 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"
+
+ ansiColor('xterm') {
+ stage('Checkout') {
+ if (!env.hub_org) {
+ println(ANSI_BOLD + ANSI_RED + "Uh Oh! Please set a Jenkins environment variable named hub_org with value as registery/sunbidrded" + ANSI_NORMAL)
+ error 'Please resolve the errors and rerun..'
+ } else
+ println(ANSI_BOLD + ANSI_GREEN + "Found environment variable named hub_org with value as: " + hub_org + ANSI_NORMAL)
+ }
+ sh'[[ -d .git ]] && git clean -ffxd'
+ checkout scm
+ if (params.github_release_tag == "") {
+ checkout scm
+ commit_hash = sh(script: 'git rev-parse --short HEAD', returnStdout: true).trim()
+ branch_name = sh(script: 'git name-rev --name-only HEAD | rev | cut -d "/" -f1| rev', returnStdout: true).trim()
+ build_tag = branch_name + "_" + commit_hash + "_" + env.BUILD_NUMBER
+ println(ANSI_BOLD + ANSI_YELLOW + "Tag not specified, using the latest commit hash: " + commit_hash + ANSI_NORMAL)
+ } else {
+ def scmVars = checkout scm
+ checkout scm: [$class: 'GitSCM', branches: [[name: "refs/tags/$params.github_release_tag"]], userRemoteConfigs: [[url: scmVars.GIT_URL]]]
+ build_tag = params.github_release_tag + "_" + env.BUILD_NUMBER
+ println(ANSI_BOLD + ANSI_YELLOW + "Tag specified, building from tag: " + params.github_release_tag + ANSI_NORMAL)
+ }
+ echo "build_tag: " + build_tag
+
+ stage('Build') {
+ env.NODE_ENV = "build"
+ print "Environment will be : ${env.NODE_ENV}"
+ sh("cd ./images/azure-ambari-prometheus-exporter && ./build.sh ${build_tag} ${env.NODE_NAME} ${hub_org}")
+ }
+ stage('ArchiveArtifacts') {
+ archiveArtifacts "images/azure-ambari-prometheus-exporter/metadata.json"
+ currentBuild.description = "${build_tag}"
+ }
+ }
+
+ }
+ catch (err) {
+ currentBuild.result = "FAILURE"
+ throw err
+ }
+
+}
diff --git a/images/azure-ambari-prometheus-exporter/build.sh b/images/azure-ambari-prometheus-exporter/build.sh
new file mode 100755
index 000000000..104557544
--- /dev/null
+++ b/images/azure-ambari-prometheus-exporter/build.sh
@@ -0,0 +1,8 @@
+#!/bin/bash
+
+build_tag=$1
+node=$2
+org=$3
+
+docker build -f Dockerfile -t ${org}/azure-ambari-prometheus-exporter:${build_tag} .
+echo {\"image_name\" : azure-ambari-prometheus-exporter, \"image_tag\" : \"${build_tag}\", \"node_name\" : \"$node\"} > metadata.json
diff --git a/images/azure-ambari-prometheus-exporter/collector.py b/images/azure-ambari-prometheus-exporter/collector.py
new file mode 100644
index 000000000..3abf3396c
--- /dev/null
+++ b/images/azure-ambari-prometheus-exporter/collector.py
@@ -0,0 +1,294 @@
+import os
+import json
+import yaml
+import re
+import time
+import logging
+import datetime
+from pytz import timezone
+from datetime import timedelta,date
+from prometheus_client import start_http_server
+from prometheus_client.core import GaugeMetricFamily, REGISTRY
+from expiringdict import ExpiringDict
+import requests
+
+LOGLEVEL = os.getenv('LOGLEVEL', 'INFO').upper()
+logging.basicConfig(
+ format='%(asctime)s - %(levelname)s - %(message)s'
+ , datefmt='%m/%d/%Y %I:%M:%S %p'
+ , level=LOGLEVEL
+)
+
+BATCH_DELAY = os.getenv('BATCH_DELAY', 60)
+CONF_FILE = os.getenv('CONF_FILE', 'conf/components.yaml')
+
+
+
+class AmbariMetricCollector(object):
+ def __init__(self, conf_file):
+ self.cache = ExpiringDict(max_len=10000, max_age_seconds=86400)
+ self.prom_metrics = {}
+ self.host = {}
+ self.ambari_info = {
+ 'AMBARI_USER': os.getenv('AMBARI_USER')
+ , 'AMBARI_PASS': os.getenv('AMBARI_PASS')
+ }
+
+ with open(conf_file, "r") as read_conf_file:
+ conf = yaml.load(read_conf_file)
+
+ self.conf_nn, self.conf_rm, self.conf_alert, self.conf_apphistory = self._parse_conf(conf)
+
+ def _parse_conf(self, conf):
+ conf_nn = conf.get('namenode', None)
+ conf_rm = conf.get('resourcemanager', None)
+ conf_alert = conf.get('ambari_alert', None)
+ conf_apphistory= conf.get('ambari_apphistory', None)
+
+ return conf_nn, conf_rm, conf_alert, conf_apphistory
+
+ def _parse_metrics(self, data, prefix, metrics):
+ for k, v in data.items():
+ if type(v) is dict:
+ prefix.append(k)
+ self._parse_metrics(v, prefix, metrics)
+ if len(prefix) > 0:
+ prefix.pop(len(prefix) - 1)
+ else:
+ metric_name = '{}_{}'.format('_'.join(prefix), k)
+
+ if type(v) is int or type(v) is float:
+ metrics[metric_name] = v
+
+ def _parse_cluster_metrics(self, data, prefix, metrics, host):
+ for k, v in data.items():
+ if k in ('HostRoles'):
+ host['component_name'] = str(v['component_name'])
+ host['host_name']= v['host_name'].replace(".", "_").replace("-", "_")
+ elif type(v) is dict:
+ prefix.append(k)
+ self._parse_cluster_metrics(v, prefix, metrics, host)
+ if len(prefix) > 0:
+ prefix.pop(len(prefix) - 1)
+ else:
+ metric_name = '{}_{}'.format('_'.join(prefix), k)
+ if type(v) is int or type(v) is float:
+ if bool(host) :
+ prom_metric = GaugeMetricFamily(metric_name, metric_name, labels=['component_name','host_name'])
+ prom_metric.add_metric([host['component_name'],host['host_name']],v)
+ metric_name +=(host['host_name'])
+ metrics[metric_name] = prom_metric
+
+ def _parse_with_filter(self, data, prefix, metrics, conf):
+ new_metrics = {}
+ self._parse_metrics(data, prefix, new_metrics)
+
+ if conf.get('white_list', None):
+ self._filter_metric_in_white_list(new_metrics, conf.get('white_list', None))
+ elif conf.get('black_list', None):
+ self._filter_metric_in_black_list(new_metrics, conf.get('black_list', None))
+
+ metrics.update(new_metrics)
+
+ def _parse_with_clusterfilter(self, data, prefix, metrics, conf):
+ new_metrics = {}
+ host = {}
+ self._parse_cluster_metrics(data, prefix, new_metrics, host)
+
+ if conf.get('white_list', None):
+ self._filter_metric_in_white_list(new_metrics, conf.get('white_list', None))
+ elif conf.get('black_list', None):
+ self._filter_metric_in_black_list(new_metrics, conf.get('black_list', None))
+
+ self.prom_metrics.update(new_metrics)
+ metrics.update(new_metrics)
+
+ def _parse_apphistory_metrics(self, data, prefix, app_id, metrics,group_metric):
+ for k, v in data.items():
+ if type(v) is dict:
+ prefix.append(k)
+ self._parse_metrics(v, prefix, metrics)
+ if len(prefix) > 0:
+ prefix.pop(len(prefix) - 1)
+ else:
+ if len(prefix) > 0:
+ metric_name = '{}_{}'.format('_'.join(prefix), k)
+ else:
+ metric_name = k
+
+ if type(v) is int or type(v) is float:
+ prom_metric = GaugeMetricFamily(metric_name, metric_name, labels=list(group_metric.keys()))
+ prom_metric.add_metric(list(group_metric.values()),v)
+ metric_name += app_id
+ metric_name += str(group_metric['stageId'])
+ metrics[metric_name] = prom_metric
+
+ def _parse_apphistory_with_filter(self, data, prefix, app_id, group_metric, metrics, conf):
+ new_metrics = {}
+ host = {}
+ self._parse_apphistory_metrics(data, prefix, app_id, new_metrics, group_metric)
+
+ if conf.get('white_list', None):
+ self._filter_metric_in_white_list(new_metrics, conf.get('white_list', None))
+ elif conf.get('black_list', None):
+ self._filter_metric_in_black_list(new_metrics, conf.get('black_list', None))
+ for k,v in new_metrics.items():
+ if(len(self.cache) == 0 or k not in self.cache.keys()):
+ self.cache[k] = v
+ self.prom_metrics[k] = v
+ metrics[k] = v
+ else:
+ #self.prom_metrics.pop(k,'No Key found')
+ metrics.pop(k,'No Key found')
+
+ def _filter_by_rule(self, metrics, rules, is_wl=True):
+ if rules is None:
+ return
+
+ remove_metrics = []
+ for k, v in metrics.items():
+ if is_wl:
+ remove = True
+ for bl in rules:
+ if re.search(bl, k):
+ remove = False
+ break
+
+ if remove:
+ remove_metrics.append(k)
+ else:
+ for bl in rules:
+ if re.search(bl, k):
+ remove_metrics.append(k)
+ break
+
+ for rm in remove_metrics:
+ if rm in metrics:
+ del metrics[rm]
+
+ def _filter_metric_in_black_list(self, metrics, metrics_bl=None):
+ self._filter_by_rule(metrics, metrics_bl, is_wl=False)
+
+ def _filter_metric_in_white_list(self, metrics, metrics_wl=None):
+ self._filter_by_rule(metrics, metrics_wl, is_wl=True)
+
+ def _collect_ambari_alerts(self, metrics):
+ try:
+ ambari_alert_url = os.getenv('AMBARI_ALERT_URL', '')
+ data = self._call_ambari_api(ambari_alert_url)
+ except Exception as e:
+ logging.error('Call Ambari API error.\n {}'.format(e))
+
+ return
+
+ self._parse_with_filter(data['alerts_summary'], ['ambari_alert'], metrics, self.conf_alert)
+
+ def _collect_namenode_metrics(self, metrics):
+ try:
+ ambari_metrics_url = os.getenv('AMBARI_METRICS_URL', '')
+ data = self._call_json_api(ambari_metrics_url)
+ except Exception as e:
+ logging.error('Call Namenode JMX error.\n {}'.format(e))
+
+ return
+
+ for item in data['items']:
+ self._parse_with_clusterfilter(item, ['cluster'], metrics, self.conf_nn)
+
+ def _collect_resourcemanager_metrics(self, metrics):
+ try:
+ data = self._call_json_api(os.getenv('AMBARI_RM_URL', ''), headers={'Accept': 'application/json'})
+ except Exception as e:
+ logging.error('Call Resource Manager metrics error.\n {}'.format(e))
+ return
+
+ if not data.get('clusterMetrics'):
+ return
+
+ self._parse_with_filter(data['clusterMetrics'], ['resourcemanager'], metrics, self.conf_rm)
+
+ def _collect_apphistory_metrics(self, metrics):
+ group_metric={}
+ date_today = (int(date.today().strftime('%s')) * 1000)
+ try:
+ url = self.conf_apphistory['url']+'?minDate='+(datetime.datetime.now(timezone('GMT'))-datetime.timedelta(minutes = 10)).strftime('%Y-%m-%dT%H:%M:%S.000GMT')+'&maxDate='+(datetime.datetime.now(timezone('GMT'))+datetime.timedelta(minutes = 10)).strftime('%Y-%m-%dT%H:%M:%S.000GMT')
+ data = self._call_json_api(url)
+ except Exception as e:
+ logging.error('Call Namenode JMX error.\n {}'.format(e))
+ return
+ for item in data:
+ latest_attempt = len(item['attempts'])
+ if item['attempts'][latest_attempt-1]['endTimeEpoch'] >= date_today:
+ app_data= self._call_json_api(os.getenv('AMBARI_APPHISTORY_URL', '')+r"/"+item['id']+r"/"+str(latest_attempt)+r"/"+"stages")
+ group_metric['appname'] = item['name'].replace(" ", "")
+ for data_item in app_data :
+ data_item['reportDate'] = item['attempts'][latest_attempt-1]['lastUpdated']
+ data_item['timeTaken']= item['attempts'][latest_attempt-1]['duration']
+ for label in self.conf_apphistory['labels']:
+ group_metric[label]= str(data_item[label])
+ self._parse_apphistory_with_filter(data_item,[] ,item['id'], group_metric , metrics, self.conf_apphistory)
+
+ def _collect(self):
+ metrics = {}
+ labels = {}
+ host = {}
+ self._collect_resourcemanager_metrics(metrics)
+ self._collect_ambari_alerts(metrics)
+ self._collect_namenode_metrics(metrics)
+ self._collect_apphistory_metrics(metrics)
+
+ for k, v in metrics.items():
+ prom_metric = self.prom_metrics.get(k, None)
+ if not prom_metric:
+ prom_metric = GaugeMetricFamily(k, k, labels=['cluster_name', 'component_name', 'host_name'])
+ self.prom_metrics[k] = prom_metric
+ prom_metric.add_metric(list(labels.values()), v)
+
+ def collect(self):
+ logging.info('Start fetching metrics')
+ self._collect()
+ logging.info('Finish fetching metrics')
+ for m in list(self.prom_metrics.values()):
+ yield m
+
+ def _call_ambari_api(self, url):
+ """
+ Call Ambari's API to return json data
+ Sample curl
+ curl -k \
+ -u username:password \
+ -H 'X-Requested-By: ambari' \
+ -X GET \
+ "https://localhost:8080/api/v1/clusters/trustingsocial/host_components?fields=metrics/*"
+ """
+
+ ambari_info = self.ambari_info
+
+ response = requests.get(
+ url
+ , auth=(ambari_info['AMBARI_USER'], ambari_info['AMBARI_PASS'])
+ , headers={'X-Requested-By': 'ambari'}
+ , verify=False
+ )
+
+ if response.status_code != requests.codes.ok:
+ return {}
+ return response.json()
+
+ def _call_json_api(self, url, headers={}):
+ ambari_info = self.ambari_info
+ response = requests.get(url, auth=(ambari_info['AMBARI_USER'], ambari_info['AMBARI_PASS']), headers=headers)
+
+ if response.status_code != requests.codes.ok:
+ return {}
+ return response.json()
+
+
+if __name__ == "__main__":
+ collector = AmbariMetricCollector(CONF_FILE)
+
+ REGISTRY.register(collector)
+ start_http_server(9999)
+ while True:
+ time.sleep(1)
+
diff --git a/images/azure-ambari-prometheus-exporter/components.yaml b/images/azure-ambari-prometheus-exporter/components.yaml
new file mode 100644
index 000000000..557505fa4
--- /dev/null
+++ b/images/azure-ambari-prometheus-exporter/components.yaml
@@ -0,0 +1,27 @@
+namenode:
+ white_list:
+ - 'cpu'
+ - 'memory'
+ - 'cluster_name'
+
+resourcemanager:
+ white_list:
+ - '.*'
+
+ambari_alert:
+ white_list:
+ - '.*\.count'
+
+ambari_apphistory:
+ labels:
+ - 'status'
+ - 'name'
+ - 'attemptId'
+ - 'stageId'
+ - 'reportDate'
+ white_list:
+ - 'numCompleteTasks'
+ - 'numFailedTasks'
+ - 'numTasks'
+ - 'shuffleWriteBytes'
+ - 'timeTaken'
diff --git a/images/azure-ambari-prometheus-exporter/metadata.sh b/images/azure-ambari-prometheus-exporter/metadata.sh
new file mode 100755
index 000000000..204c65f8f
--- /dev/null
+++ b/images/azure-ambari-prometheus-exporter/metadata.sh
@@ -0,0 +1,3 @@
+#!/bin/sh
+# return version
+echo '{"name":"azure-ambari-prometheus-exporter","version":"1.0","org":"sunbird","hubuser":"purplesunbird"}'
diff --git a/images/azure-ambari-prometheus-exporter/requirements.txt b/images/azure-ambari-prometheus-exporter/requirements.txt
new file mode 100644
index 000000000..acbda796d
--- /dev/null
+++ b/images/azure-ambari-prometheus-exporter/requirements.txt
@@ -0,0 +1,4 @@
+PyYAML
+prometheus_client
+requests
+expiring-dict
diff --git a/kubernetes/ansible/roles/sunbird-monitoring/templates/azure-ambari-prometheus-exporter.yaml b/kubernetes/ansible/roles/sunbird-monitoring/templates/azure-ambari-prometheus-exporter.yaml
new file mode 100644
index 000000000..a6ee4ed5b
--- /dev/null
+++ b/kubernetes/ansible/roles/sunbird-monitoring/templates/azure-ambari-prometheus-exporter.yaml
@@ -0,0 +1,19 @@
+env:
+ ambari:
+ # rm_url - get ambari metrics for resource manager in azure cluster(appsubmitted, appfailed etc)
+ rm_url: "http://{{env}}-spark-cluster.azurehdinsight.net/ws/v1/cluster/metrics"
+ # metrics_url - get metrics for all metrics for hdinsight cluster for each component
+ metrics_url: "http://{{env}}-spark-cluster.azurehdinsight.net/api/v1/clusters/{{env}}-spark-cluster/host_components?fields=metrics/*"
+ # alert_url - get alert count for the cluster (critical,ok etc)
+ alert_url: "http://{{env}}-spark-cluster.azurehdinsight.net/api/v1/clusters/{{env}}-spark-cluster/alerts?format=summary
+ # cluster_app_history_url - get the history of applications that run so far in cluster
+ app_history_url: "http://{{env}}-spark-cluster.azurehdinsight.net/api/v1/applications
+ # user name for azure hdcluster
+ user: admin
+ # password for azure hdcluster
+ pass: "{{ azure_spark_cluster_http_password }}"
+
+
+#Hd cluster alert values
+app_failed_critical: 1
+nodes_inactive_critical: 1
diff --git a/kubernetes/helm_charts/monitoring/azure-ambari-prometheus-exporter/.helmignore b/kubernetes/helm_charts/monitoring/azure-ambari-prometheus-exporter/.helmignore
new file mode 100644
index 000000000..0e8a0eb36
--- /dev/null
+++ b/kubernetes/helm_charts/monitoring/azure-ambari-prometheus-exporter/.helmignore
@@ -0,0 +1,23 @@
+# Patterns to ignore when building packages.
+# This supports shell glob matching, relative path matching, and
+# negation (prefixed with !). Only one pattern per line.
+.DS_Store
+# Common VCS dirs
+.git/
+.gitignore
+.bzr/
+.bzrignore
+.hg/
+.hgignore
+.svn/
+# Common backup files
+*.swp
+*.bak
+*.tmp
+*.orig
+*~
+# Various IDEs
+.project
+.idea/
+*.tmproj
+.vscode/
diff --git a/kubernetes/helm_charts/monitoring/azure-ambari-prometheus-exporter/Chart.yaml b/kubernetes/helm_charts/monitoring/azure-ambari-prometheus-exporter/Chart.yaml
new file mode 100644
index 000000000..d64ba6ad0
--- /dev/null
+++ b/kubernetes/helm_charts/monitoring/azure-ambari-prometheus-exporter/Chart.yaml
@@ -0,0 +1,21 @@
+apiVersion: v1
+name: azure-ambari-prometheus-exporter
+description: A Helm chart for Kubernetes
+
+# A chart can be either an 'application' or a 'library' chart.
+#
+# Application charts are a collection of templates that can be packaged into versioned archives
+# to be deployed.
+#
+# Library charts provide useful utilities or functions for the chart developer. They're included as
+# a dependency of application charts to inject those utilities and functions into the rendering
+# pipeline. Library charts do not define any templates and therefore cannot be deployed.
+type: application
+
+# This is the chart version. This version number should be incremented each time you make changes
+# to the chart and its templates, including the app version.
+version: 0.1.0
+
+# This is the version number of the application being deployed. This version number should be
+# incremented each time you make changes to the application.
+appVersion: 1.16.0
diff --git a/kubernetes/helm_charts/monitoring/azure-ambari-prometheus-exporter/templates/_helpers.tpl b/kubernetes/helm_charts/monitoring/azure-ambari-prometheus-exporter/templates/_helpers.tpl
new file mode 100644
index 000000000..08a3782a4
--- /dev/null
+++ b/kubernetes/helm_charts/monitoring/azure-ambari-prometheus-exporter/templates/_helpers.tpl
@@ -0,0 +1,63 @@
+{{/* vim: set filetype=mustache: */}}
+{{/*
+Expand the name of the chart.
+*/}}
+{{- define "azure-ambari-prometheus-exporter.name" -}}
+{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}}
+{{- end -}}
+
+{{/*
+Create a default fully qualified app name.
+We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).
+If release name contains chart name it will be used as a full name.
+*/}}
+{{- define "azure-ambari-prometheus-exporter.fullname" -}}
+{{- if .Values.fullnameOverride -}}
+{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}}
+{{- else -}}
+{{- $name := default .Chart.Name .Values.nameOverride -}}
+{{- if contains $name .Release.Name -}}
+{{- .Release.Name | trunc 63 | trimSuffix "-" -}}
+{{- else -}}
+{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}}
+{{- end -}}
+{{- end -}}
+{{- end -}}
+
+{{/*
+Create chart name and version as used by the chart label.
+*/}}
+{{- define "azure-ambari-prometheus-exporter.chart" -}}
+{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}}
+{{- end -}}
+
+{{/*
+Common labels
+*/}}
+{{- define "azure-ambari-prometheus-exporter.labels" -}}
+helm.sh/chart: {{ include "azure-ambari-prometheus-exporter.chart" . }}
+{{ include "azure-ambari-prometheus-exporter.selectorLabels" . }}
+{{- if .Chart.AppVersion }}
+app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
+{{- end }}
+app.kubernetes.io/managed-by: {{ .Release.Service }}
+{{- end -}}
+
+{{/*
+Selector labels
+*/}}
+{{- define "azure-ambari-prometheus-exporter.selectorLabels" -}}
+app.kubernetes.io/name: {{ include "azure-ambari-prometheus-exporter.name" . }}
+app.kubernetes.io/instance: {{ .Release.Name }}
+{{- end -}}
+
+{{/*
+Create the name of the service account to use
+*/}}
+{{- define "azure-ambari-prometheus-exporter.serviceAccountName" -}}
+{{- if .Values.serviceAccount.create -}}
+ {{ default (include "azure-ambari-prometheus-exporter.fullname" .) .Values.serviceAccount.name }}
+{{- else -}}
+ {{ default "default" .Values.serviceAccount.name }}
+{{- end -}}
+{{- end -}}
\ No newline at end of file
diff --git a/kubernetes/helm_charts/monitoring/azure-ambari-prometheus-exporter/templates/alerRules.yaml b/kubernetes/helm_charts/monitoring/azure-ambari-prometheus-exporter/templates/alerRules.yaml
new file mode 100644
index 000000000..afd846b99
--- /dev/null
+++ b/kubernetes/helm_charts/monitoring/azure-ambari-prometheus-exporter/templates/alerRules.yaml
@@ -0,0 +1,30 @@
+---
+apiVersion: monitoring.coreos.com/v1
+kind: PrometheusRule
+metadata:
+ labels:
+ {{- include "azure-ambari-prometheus-exporter.labels" . | nindent 4 }}
+ {{- toYaml .Values.serviceMonitor.labels | nindent 4 }}
+ name: {{ include "azure-ambari-prometheus-exporter.fullname" . }}-alertrule
+ namespace: {{ default .Values.namespace .Release.Namespace }}
+spec:
+ groups:
+ - name: HDClusterMetrics
+ rules:
+ - alert: No of Jobs Failed
+ expr: sum(resourcemanager_appsFailed) > {{ .Values.app_failed_critical }}
+ for: 1m
+ labels:
+ severity: critical
+ annotations:
+ message: {{`"No of jobs failed is {{$value}}"`}}
+ summary: Jobs Failed
+
+ - alert: No of Cluster Nodes InActive
+ expr: sum(resourcemanager_lostNodes) > {{ .Values.nodes_inactive_critical }}
+ for: 5m
+ labels:
+ severity: fatal
+ annotations:
+ message: {{`"Cluster Nodes InActive count is {{$value}}"`}}
+ summary: Node inactive in hdcluster
diff --git a/kubernetes/helm_charts/monitoring/azure-ambari-prometheus-exporter/templates/deployment.yaml b/kubernetes/helm_charts/monitoring/azure-ambari-prometheus-exporter/templates/deployment.yaml
new file mode 100644
index 000000000..b1a9d7927
--- /dev/null
+++ b/kubernetes/helm_charts/monitoring/azure-ambari-prometheus-exporter/templates/deployment.yaml
@@ -0,0 +1,46 @@
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: {{ include "azure-ambari-prometheus-exporter.fullname" . }}
+ namespace: {{ default .Values.namespace .Release.Namespace }}
+ labels:
+ {{- include "azure-ambari-prometheus-exporter.labels" . | nindent 4 }}
+spec:
+ replicas: {{ .Values.replicaCount }}
+ selector:
+ matchLabels:
+ {{- include "azure-ambari-prometheus-exporter.selectorLabels" . | nindent 6 }}
+ template:
+ metadata:
+ labels:
+ {{- include "azure-ambari-prometheus-exporter.selectorLabels" . | nindent 8 }}
+ spec:
+ {{- with .Values.imagePullSecrets }}
+ imagePullSecrets:
+ {{- toYaml . | nindent 8 }}
+ {{- end }}
+ containers:
+ - name: {{ .Chart.Name }}
+ image: "{{ .Values.image.repository }}"
+ imagePullPolicy: {{ .Values.image.pullPolicy }}
+ env:
+ - name: AMBARI_RM_URL
+ value: "{{ .Values.env.ambari.rm_url }}"
+ - name: AMBARI_METRICS_URL
+ value: "{{ .Values.env.ambari.metrics_url }}"
+ - name: AMBARI_ALERT_URL
+ value: "{{ .Values.env.ambari.alert_url }}"
+ - name: AMBARI_APPHISTORY_URL
+ - value: "{{ .Values.env.ambari.app_history_url }}"
+ - name: AMBARI_USER
+ value: "{{ .Values.env.ambari.user }}"
+ - name: AMBARI_PASS
+ value: "{{ .Values.env.ambari.pass }}"
+ - name: PYTHONWARNINGS
+ value: "ignore:Unverified HTTPS request"
+ ports:
+ - name: http
+ containerPort: 9999
+ protocol: TCP
+ resources:
+ {{- toYaml .Values.resources | nindent 12 }}
diff --git a/kubernetes/helm_charts/monitoring/azure-ambari-prometheus-exporter/templates/service.yaml b/kubernetes/helm_charts/monitoring/azure-ambari-prometheus-exporter/templates/service.yaml
new file mode 100644
index 000000000..0fbc7f780
--- /dev/null
+++ b/kubernetes/helm_charts/monitoring/azure-ambari-prometheus-exporter/templates/service.yaml
@@ -0,0 +1,16 @@
+apiVersion: v1
+kind: Service
+metadata:
+ name: {{ include "azure-ambari-prometheus-exporter.fullname" . }}
+ namespace: {{ default .Values.namespace .Release.Namespace }}
+ labels:
+ {{- include "azure-ambari-prometheus-exporter.labels" . | nindent 4 }}
+spec:
+ type: {{ .Values.service.type }}
+ ports:
+ - port: {{ .Values.service.port }}
+ targetPort: http
+ protocol: TCP
+ name: metrics
+ selector:
+ {{- include "azure-ambari-prometheus-exporter.selectorLabels" . | nindent 4 }}
\ No newline at end of file
diff --git a/kubernetes/helm_charts/monitoring/azure-ambari-prometheus-exporter/templates/serviceMonitor.yaml b/kubernetes/helm_charts/monitoring/azure-ambari-prometheus-exporter/templates/serviceMonitor.yaml
new file mode 100644
index 000000000..2dbb68b7c
--- /dev/null
+++ b/kubernetes/helm_charts/monitoring/azure-ambari-prometheus-exporter/templates/serviceMonitor.yaml
@@ -0,0 +1,22 @@
+apiVersion: monitoring.coreos.com/v1
+kind: ServiceMonitor
+metadata:
+ labels:
+ {{- include "azure-ambari-prometheus-exporter.labels" . | nindent 6 }}
+ {{ toYaml .Values.serviceMonitorLabels | nindent 6 }}
+ name: {{ include "azure-ambari-prometheus-exporter.fullname" . }}
+ namespace: {{ default .Values.namespace .Release.Namespace }}
+spec:
+ endpoints:
+ - honorLabels: true
+ port: metrics
+ relabelings:
+ - action: labeldrop
+ regex: ^pod$
+ namespaceSelector:
+ matchNames:
+ - monitoring
+ selector:
+ matchLabels:
+ {{- include "azure-ambari-prometheus-exporter.labels" . | nindent 6 }}
+
diff --git a/kubernetes/helm_charts/monitoring/azure-ambari-prometheus-exporter/values.yaml b/kubernetes/helm_charts/monitoring/azure-ambari-prometheus-exporter/values.yaml
new file mode 100644
index 000000000..5fde214fb
--- /dev/null
+++ b/kubernetes/helm_charts/monitoring/azure-ambari-prometheus-exporter/values.yaml
@@ -0,0 +1,41 @@
+# Default values for kafka-topic-exporter.
+# This is a YAML-formatted file.
+# Declare variables to be passed into your templates.
+
+replicaCount: 1
+
+image:
+ repository: sunbird/azure-ambari-prometheus-exporter:v1
+ pullPolicy: IfNotPresent
+
+imagePullSecrets: []
+nameOverride: ""
+fullnameOverride: ""
+
+service:
+ type: ClusterIP
+ port: 9999
+
+# This value should be overridden by user
+# env:
+# kafka:
+# host: 10.0.0.92:9092
+# topic: sunbird.metrics.topic
+
+resources: {}
+ # We usually recommend not to specify default resources and to leave this as a conscious
+ # choice for the user. This also increases chances charts run on environments with little
+ # resources, such as Minikube. If you do want to specify resources, uncomment the following
+ # lines, adjust them as necessary, and remove the curly braces after 'resources:'.
+ # limits:
+ # cpu: 100m
+ # memory: 128Mi
+ # requests:
+ # cpu: 100m
+ # memory: 128Mi
+serviceMonitorLabels:
+ release: prometheus-operator
+
+###samza_topic_lag warning/critical threshold
+app_failed_critical: 1
+nodes_inactive_critical: 1
From 8515dddb4c47d8bbd09c1e616c06d0455a772d97 Mon Sep 17 00:00:00 2001
From: Rajesh Rajendran
Date: Tue, 15 Dec 2020 12:44:10 +0000
Subject: [PATCH 072/184] fix: discussionsmw service name (#2091)
Signed-off-by: Rajesh Rajendran
---
.../helm_charts/core/discussionsmw/templates/deployment.yaml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/kubernetes/helm_charts/core/discussionsmw/templates/deployment.yaml b/kubernetes/helm_charts/core/discussionsmw/templates/deployment.yaml
index 7cfc8ef45..6a5219068 100644
--- a/kubernetes/helm_charts/core/discussionsmw/templates/deployment.yaml
+++ b/kubernetes/helm_charts/core/discussionsmw/templates/deployment.yaml
@@ -46,7 +46,7 @@ spec:
apiVersion: v1
kind: Service
metadata:
- name: disussionsmw-service
+ name: discussionsmw-service
namespace: {{ .Values.namespace }}
labels:
app: {{ .Chart.Name }}
From 1b3319168e3845e33b2f7b256f9d079c67bdbb89 Mon Sep 17 00:00:00 2001
From: Sowmya N Dixit
Date: Wed, 16 Dec 2020 15:40:09 +0530
Subject: [PATCH 073/184] Issue #TG-694 feat: Analytics API - redis config
changes (#2044)
---
ansible/roles/stack-sunbird/defaults/main.yml | 1 +
.../roles/stack-sunbird/templates/analytics_api_service.conf | 2 +-
2 files changed, 2 insertions(+), 1 deletion(-)
diff --git a/ansible/roles/stack-sunbird/defaults/main.yml b/ansible/roles/stack-sunbird/defaults/main.yml
index cd27fce92..d2cde9d90 100644
--- a/ansible/roles/stack-sunbird/defaults/main.yml
+++ b/ansible/roles/stack-sunbird/defaults/main.yml
@@ -764,6 +764,7 @@ default_channel_id: "in.ekstep"
default_channel: "{{default_org_hash_id}}"
channel_data_exhaust_bucket: dev-data-store
metadata_redis_host: "{{ groups['dp-redis'][0] }}"
+metadata_redis_port: 6379
lp_composite_search_host: "{{ groups['composite-search-cluster'][0] }}"
ingestion_kafka_brokers: "{{groups['ingestion-cluster-kafka']|join(':9092,')}}:9092"
geo_location_city: "{{ env_name }}_geo_location_city"
diff --git a/ansible/roles/stack-sunbird/templates/analytics_api_service.conf b/ansible/roles/stack-sunbird/templates/analytics_api_service.conf
index 5007c9b62..9a4aeb26c 100644
--- a/ansible/roles/stack-sunbird/templates/analytics_api_service.conf
+++ b/ansible/roles/stack-sunbird/templates/analytics_api_service.conf
@@ -196,7 +196,7 @@ metrics.time.interval.min=30
cache.refresh.time.interval.min=1440
redis.host="{{metadata_redis_host}}"
#redis.host="localhost"
-redis.port=6379
+redis.port={{ metadata_redis_port }}
#redis.port=__redis_port__
redis.connection.max=20
redis.connection.idle.max=20
From c00dcb369290aed3b9b5718333149c0bc5b2b471 Mon Sep 17 00:00:00 2001
From: VenkatKadiveti <60449077+VenkatKadiveti@users.noreply.github.com>
Date: Wed, 16 Dec 2020 16:11:51 +0530
Subject: [PATCH 074/184] Issue sh-21326 fix: discussion forum envs (#2092)
* Issue sh-21326 fix: discussion forum envs
---
.../stack-sunbird/templates/sunbird_discussions-mw-service.env | 1 +
1 file changed, 1 insertion(+)
diff --git a/ansible/roles/stack-sunbird/templates/sunbird_discussions-mw-service.env b/ansible/roles/stack-sunbird/templates/sunbird_discussions-mw-service.env
index e69de29bb..9deda226a 100644
--- a/ansible/roles/stack-sunbird/templates/sunbird_discussions-mw-service.env
+++ b/ansible/roles/stack-sunbird/templates/sunbird_discussions-mw-service.env
@@ -0,0 +1 @@
+discussion_forum_token= {{ discussion_forum_token }}
\ No newline at end of file
From c7e9679c8767bf1df17b7e6b955f6883f2c98640 Mon Sep 17 00:00:00 2001
From: kaliraja <34502260+Kaali09@users.noreply.github.com>
Date: Wed, 16 Dec 2020 17:42:53 +0530
Subject: [PATCH 075/184] Jenkins file fix (#2094)
* Issue: #0000: Added the missed quotes
* Issue: #0000: updated the jenkinsfile
---
images/azure-ambari-prometheus-exporter/Jenkinsfile | 1 -
images/azure-ambari-prometheus-exporter/build.sh | 2 +-
2 files changed, 1 insertion(+), 2 deletions(-)
diff --git a/images/azure-ambari-prometheus-exporter/Jenkinsfile b/images/azure-ambari-prometheus-exporter/Jenkinsfile
index 6c9df559b..f25310a25 100644
--- a/images/azure-ambari-prometheus-exporter/Jenkinsfile
+++ b/images/azure-ambari-prometheus-exporter/Jenkinsfile
@@ -14,7 +14,6 @@ node('build-slave') {
} else
println(ANSI_BOLD + ANSI_GREEN + "Found environment variable named hub_org with value as: " + hub_org + ANSI_NORMAL)
}
- sh'[[ -d .git ]] && git clean -ffxd'
checkout scm
if (params.github_release_tag == "") {
checkout scm
diff --git a/images/azure-ambari-prometheus-exporter/build.sh b/images/azure-ambari-prometheus-exporter/build.sh
index 104557544..4e98719cd 100755
--- a/images/azure-ambari-prometheus-exporter/build.sh
+++ b/images/azure-ambari-prometheus-exporter/build.sh
@@ -5,4 +5,4 @@ node=$2
org=$3
docker build -f Dockerfile -t ${org}/azure-ambari-prometheus-exporter:${build_tag} .
-echo {\"image_name\" : azure-ambari-prometheus-exporter, \"image_tag\" : \"${build_tag}\", \"node_name\" : \"$node\"} > metadata.json
+echo {\"image_name\" : \"azure-ambari-prometheus-exporter\", \"image_tag\" : \"${build_tag}\", \"node_name\" : \"$node\"} > metadata.json
From 7e68d750eeac6004890c677c45a50289a7364b63 Mon Sep 17 00:00:00 2001
From: Sowmya N Dixit
Date: Wed, 16 Dec 2020 19:32:35 +0530
Subject: [PATCH 076/184] Issue #TG-748 feat: Analytics API - redis config
changes (#2095)
---
ansible/roles/stack-sunbird/defaults/main.yml | 2 +-
.../roles/stack-sunbird/templates/analytics_api_service.conf | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/ansible/roles/stack-sunbird/defaults/main.yml b/ansible/roles/stack-sunbird/defaults/main.yml
index d2cde9d90..b2e7fde13 100644
--- a/ansible/roles/stack-sunbird/defaults/main.yml
+++ b/ansible/roles/stack-sunbird/defaults/main.yml
@@ -764,7 +764,7 @@ default_channel_id: "in.ekstep"
default_channel: "{{default_org_hash_id}}"
channel_data_exhaust_bucket: dev-data-store
metadata_redis_host: "{{ groups['dp-redis'][0] }}"
-metadata_redis_port: 6379
+device_db_redis_port: 6379
lp_composite_search_host: "{{ groups['composite-search-cluster'][0] }}"
ingestion_kafka_brokers: "{{groups['ingestion-cluster-kafka']|join(':9092,')}}:9092"
geo_location_city: "{{ env_name }}_geo_location_city"
diff --git a/ansible/roles/stack-sunbird/templates/analytics_api_service.conf b/ansible/roles/stack-sunbird/templates/analytics_api_service.conf
index 9a4aeb26c..9e7198171 100644
--- a/ansible/roles/stack-sunbird/templates/analytics_api_service.conf
+++ b/ansible/roles/stack-sunbird/templates/analytics_api_service.conf
@@ -196,7 +196,7 @@ metrics.time.interval.min=30
cache.refresh.time.interval.min=1440
redis.host="{{metadata_redis_host}}"
#redis.host="localhost"
-redis.port={{ metadata_redis_port }}
+redis.port={{ device_db_redis_port }}
#redis.port=__redis_port__
redis.connection.max=20
redis.connection.idle.max=20
From 2c0b6b319fa5d160e2cd656c81894313238b36bf Mon Sep 17 00:00:00 2001
From: G33tha
Date: Thu, 17 Dec 2020 10:45:54 +0530
Subject: [PATCH 077/184] Release 3.4.0 variables update (#2085)
* updated analytics and search service url
* Update all.yml
* Update common.yml
* Update secrets.yml
* Update hosts
* Update common.yml
* Update secrets.yml
* Update common.yml
* Update hosts
* Update common.yml
* Update secrets.yml
* Update hosts
* Update common.yml
* Update jenkins-server-setup.sh
* added jenkins jobs
* Update jenkins-plugins-setup.sh
Co-authored-by: G33tha
---
ansible/inventory/env/group_vars/all.yml | 22 +-
deploy/jenkins/jenkins-plugins-setup.sh | 12 +-
deploy/jenkins/jenkins-server-setup.sh | 18 +-
.../jobs/dev/jobs/Core/config.xml | 8 +-
.../dev/jobs/Core/jobs/APIManager/config.xml | 32 +--
.../jobs/Core/jobs/APIManagerEcho/config.xml | 34 +--
.../dev/jobs/Core/jobs/AdminUtils/config.xml | 81 +++---
.../dev/jobs/Core/jobs/Analytics/config.xml | 108 ++++++++
.../dev/jobs/Core/jobs/Assessment/config.xml | 24 +-
.../jobs/dev/jobs/Core/jobs/Badger/config.xml | 30 +--
.../jobs/dev/jobs/Core/jobs/Bot/config.xml | 108 ++++++++
.../dev/jobs/Core/jobs/Cassandra/config.xml | 22 +-
.../Core/jobs/CassandraDecrypt/config.xml | 22 +-
.../jobs/CassandraStateValidated/config.xml | 108 ++++++++
.../Core/jobs/CassandraTrigger/config.xml | 26 +-
.../jobs/dev/jobs/Core/jobs/Cert/config.xml | 26 +-
.../Core/jobs/CertRegistryService/config.xml | 24 +-
.../jobs/dev/jobs/Core/jobs/Config/config.xml | 108 ++++++++
.../dev/jobs/Core/jobs/Content/config.xml | 26 +-
.../dev/jobs/Core/jobs/EncService/config.xml | 26 +-
.../jobs/dev/jobs/Core/jobs/Groups/config.xml | 108 ++++++++
.../Core/jobs/Hawkeye-superset/config.xml | 108 ++++++++
.../dev/jobs/Core/jobs/Keycloak/config.xml | 28 +-
.../dev/jobs/Core/jobs/KnowledgeMW/config.xml | 24 +-
.../dev/jobs/Core/jobs/Learner/config.xml | 24 +-
.../jobs/dev/jobs/Core/jobs/Lms/config.xml | 24 +-
.../jobs/dev/jobs/Core/jobs/Nodebb/config.xml | 108 ++++++++
.../jobs/Core/jobs/Notification/config.xml | 24 +-
.../jobs/dev/jobs/Core/jobs/Player/config.xml | 26 +-
.../jobs/dev/jobs/Core/jobs/Print/config.xml | 24 +-
.../jobs/dev/jobs/Core/jobs/Proxy/config.xml | 30 +--
.../jobs/dev/jobs/Core/jobs/Report/config.xml | 108 ++++++++
.../jobs/dev/jobs/Core/jobs/Router/config.xml | 108 ++++++++
.../jobs/dev/jobs/Core/jobs/Search/config.xml | 108 ++++++++
.../dev/jobs/Core/jobs/Taxonomy/config.xml | 108 ++++++++
.../dev/jobs/Core/jobs/Telemetry/config.xml | 30 +--
.../dev/jobs/Core/jobs/UserOrg/config.xml | 26 +-
.../jobs/dev/jobs/Core/jobs/Yarn/config.xml | 24 +-
.../jobs/dev/jobs/DataPipeline/config.xml | 8 +-
.../DataPipeline/jobs/AdhocScripts/config.xml | 108 ++++++++
.../DataPipeline/jobs/Analytics/config.xml | 22 +-
.../jobs/AnalyticsCore/config.xml | 108 ++++++++
.../jobs/AnalyticsService/config.xml | 108 ++++++++
.../DataPipeline/jobs/ApiModule/config.xml | 28 +-
.../jobs/CoreDataProducts/config.xml | 108 ++++++++
.../DataPipeline/jobs/DataPipeline/config.xml | 22 +-
.../DataPipeline/jobs/DataReplay/config.xml | 108 ++++++++
.../jobs/DataPipeline/jobs/ETLJobs/config.xml | 22 +-
.../jobs/EdDataProducts/config.xml | 108 ++++++++
.../jobs/FlinkPipelineJobs/config.xml | 108 ++++++++
.../DataPipeline/jobs/MLWorkbench/config.xml | 108 ++++++++
.../jobs/DataPipeline/jobs/Secor/config.xml | 22 +-
.../jobs/CassandraTrigger/config.xml | 24 +-
.../KnowledgePlatform/jobs/Dial/config.xml | 108 ++++++++
.../jobs/FlinkJobs/config.xml | 108 ++++++++
.../jobs/KnowledgePlatform/config.xml | 24 +-
.../KnowledgePlatform/jobs/Neo4j/config.xml | 28 +-
.../jobs/SyncTool/config.xml | 22 +-
.../KnowledgePlatform/jobs/Yarn/config.xml | 24 +-
.../Plugins/jobs/CollectionEditor/config.xml | 25 +-
.../Plugins/jobs/ContentEditor/config.xml | 24 +-
.../Plugins/jobs/ContentPlayer/config.xml | 24 +-
.../Plugins/jobs/ContentPlugins/config.xml | 24 +-
.../Plugins/jobs/GenericEditor/config.xml | 26 +-
deploy/jenkins/jobs/Build/config.xml | 9 +-
.../jenkins/jobs/Build/jobs/Core/config.xml | 8 +-
.../jobs/Core/jobs/APIManager/config.xml | 47 ++--
.../jobs/APIManagerEcho_Backup/config.xml | 38 +++
.../jobs/Core/jobs/AdminUtils/config.xml | 61 +++--
.../Build/jobs/Core/jobs/Analytics/config.xml | 79 ++++++
.../jobs/Core/jobs/ApiManagerEcho/config.xml | 73 ++++++
.../jobs/Core/jobs/Assessment/config.xml | 22 +-
.../Build/jobs/Core/jobs/Badger/config.xml | 38 ++-
.../Build/jobs/Core/jobs/Cassandra/config.xml | 22 +-
.../Core/jobs/CassandraDecrypt/config.xml | 39 +--
.../jobs/CassandraStateValidated/config.xml | 80 ++++++
.../Core/jobs/CassandraTrigger/config.xml | 4 +-
.../jobs/Build/jobs/Core/jobs/Cert/config.xml | 29 +--
.../Core/jobs/CertRegistryService/config.xml | 31 +--
.../jobs/Core/jobs/CloudStorageSDK/config.xml | 84 ++++++
.../Build/jobs/Core/jobs/Config/config.xml | 85 ++++++
.../Build/jobs/Core/jobs/Content/config.xml | 29 +--
.../jobs/Core/jobs/EncService/config.xml | 31 +--
.../Build/jobs/Core/jobs/Groups/config.xml | 78 ++++++
.../Core/jobs/Hawkeye-superset/config.xml | 78 ++++++
.../Build/jobs/Core/jobs/Keycloak/config.xml | 20 +-
.../jobs/Core/jobs/KnowledgeMW/config.xml | 33 +--
.../Build/jobs/Core/jobs/Learner/config.xml | 29 +--
.../jobs/Build/jobs/Core/jobs/Lms/config.xml | 26 +-
.../Build/jobs/Core/jobs/Nodebb/config.xml | 79 ++++++
.../jobs/Core/jobs/Notification/config.xml | 31 +--
.../PlatformCoursesFunctionalTest/config.xml | 88 +++++++
.../Build/jobs/Core/jobs/Player/config.xml | 67 +++--
.../Core/jobs/PlayerCustomStage/config.xml | 60 +++++
.../Build/jobs/Core/jobs/Print/config.xml | 31 +--
.../Build/jobs/Core/jobs/Proxy/config.xml | 24 +-
.../Build/jobs/Core/jobs/Report/config.xml | 78 ++++++
.../Build/jobs/Core/jobs/Search/config.xml | 78 ++++++
.../Build/jobs/Core/jobs/Taxonomy/config.xml | 78 ++++++
.../Build/jobs/Core/jobs/Telemetry/config.xml | 34 +--
.../Build/jobs/Core/jobs/UserOrg/config.xml | 32 +--
.../jobs/Build/jobs/Core/jobs/Yarn/config.xml | 34 +--
.../jobs/Build/jobs/DataPipeline/config.xml | 10 +-
.../DataPipeline/jobs/AdhocScripts/config.xml | 68 +++++
.../DataPipeline/jobs/Analytics/config.xml | 32 +--
.../jobs/AnalyticsCore/config.xml | 80 ++++++
.../jobs/AnalyticsService/config.xml | 67 +++++
.../DataPipeline/jobs/ApiModule/config.xml | 30 +--
.../jobs/CoreDataProducts/config.xml | 80 ++++++
.../DataPipeline/jobs/DataPipeline/config.xml | 30 +--
.../DataPipeline/jobs/DataReplay/config.xml | 68 +++++
.../jobs/DataPipeline/jobs/ETLJobs/config.xml | 20 +-
.../jobs/EdDataProducts/config.xml | 80 ++++++
.../jobs/FlinkPipelineJobs/config.xml | 78 ++++++
.../jobs/DataPipeline/jobs/Secor/config.xml | 33 +--
.../jobs/Build/jobs/Experiments/config.xml | 29 +++
.../jobs/Experiments/jobs/dev/config.xml | 29 +++
.../jobs/dev/jobs/Experiments/config.xml | 29 +++
.../dev/jobs/Experiments/jobs/exp1/config.xml | 121 +++++++++
.../dev/jobs/Experiments/jobs/exp2/config.xml | 121 +++++++++
.../dev/jobs/Experiments/jobs/exp3/config.xml | 26 ++
.../jobs/Experiments_Job_Generator/config.xml | 85 ++++++
.../Build/jobs/FunctionalTests/config.xml | 28 ++
.../jobs/FunctionalTests/jobs/Core/config.xml | 28 ++
.../jobs/Core/jobs/Content/config.xml | 80 ++++++
.../Build/jobs/KnowledgePlatform/config.xml | 10 +-
.../jobs/CassandraTrigger/config.xml | 22 +-
.../KnowledgePlatform/jobs/Dial/config.xml | 78 ++++++
.../jobs/FlinkJobs/config.xml | 80 ++++++
.../jobs/KnowledgePlatform/config.xml | 24 +-
.../jobs/LPFuntionalTest/config.xml | 109 ++++++++
.../jobs/LP_Decoupling_Test/config.xml | 77 ++++++
.../KnowledgePlatform/jobs/Neo4j/config.xml | 29 +--
.../jobs/SyncTool/config.xml | 29 +--
.../KnowledgePlatform/jobs/Yarn/config.xml | 37 +--
.../Plugins/jobs/CollectionEditor/config.xml | 24 +-
.../Plugins/jobs/ContentEditor/config.xml | 22 +-
.../Plugins/jobs/ContentPlayer/config.xml | 24 +-
.../Plugins/jobs/ContentPlugins/config.xml | 22 +-
.../Plugins/jobs/GenericEditor/config.xml | 22 +-
deploy/jenkins/jobs/Deploy/config.xml | 9 +-
.../jenkins/jobs/Deploy/jobs/dev/config.xml | 8 +-
.../dev/jobs/Core/jobs/APIManager/config.xml | 63 ++---
.../dev/jobs/Core/jobs/AdminUtils/config.xml | 4 +-
.../dev/jobs/Core/jobs/Assessment/config.xml | 10 +-
.../jobs/dev/jobs/Core/jobs/Badger/config.xml | 6 +-
.../dev/jobs/Core/jobs/Bootstrap/config.xml | 4 +-
.../jobs/CF-QUML_Migration_Script/config.xml | 94 +++++++
.../jobs/CassandraStateValidated/config.xml | 214 ++++++++++++++++
.../Core/jobs/CassandraTrigger/config.xml | 4 +-
.../jobs/dev/jobs/Core/jobs/Cert/config.xml | 4 +-
.../Core/jobs/CertRegistryService/config.xml | 4 +-
.../jobs/dev/jobs/Core/jobs/Config/config.xml | 137 ++++++++++
.../dev/jobs/Core/jobs/Content/config.xml | 62 ++---
.../dev/jobs/Core/jobs/EncService/config.xml | 4 +-
.../dev/jobs/Core/jobs/KafkaSetup/config.xml | 60 ++---
.../jobs/Core/jobs/KeycloakCustom/config.xml | 115 +++++++++
.../Core/jobs/KeycloakMigration/config.xml | 173 +++++++++++++
.../jobs/Core/jobs/KeycloakRealm/config.xml | 60 ++---
.../dev/jobs/Core/jobs/KnowledgeMW/config.xml | 6 +-
.../dev/jobs/Core/jobs/Learner/config.xml | 62 ++---
.../jobs/dev/jobs/Core/jobs/Lms/config.xml | 62 ++---
.../dev/jobs/Core/jobs/Logging/config.xml | 6 +-
.../dev/jobs/Core/jobs/Logstash/config.xml | 4 +-
.../dev/jobs/Core/jobs/Monitoring/config.xml | 58 ++---
.../jobs/Core/jobs/Notification/config.xml | 4 +-
.../jobs/dev/jobs/Core/jobs/Oauth/config.xml | 6 +-
.../dev/jobs/Core/jobs/OnboardAPIs/config.xml | 8 +-
.../Core/jobs/OnboardConsumers/config.xml | 6 +-
.../jobs/dev/jobs/Core/jobs/Player/config.xml | 62 ++---
.../dev/jobs/Core/jobs/PlayerCDN/config.xml | 27 +-
.../jobs/dev/jobs/Core/jobs/Print/config.xml | 6 +-
.../jobs/dev/jobs/Core/jobs/Proxy/config.xml | 62 ++---
.../jobs/ReloadContainerServices/config.xml | 4 +-
.../dev/jobs/Core/jobs/Telemetry/config.xml | 4 +-
.../Core/jobs/TelemetryLogstash/config.xml | 4 +-
.../dev/jobs/Core/jobs/UserOrg/config.xml | 4 +-
.../dev/jobs/Core/jobs/YarnOld/config.xml | 234 +++++++++++++++++
.../Core/jobs/offlineInstaller/config.xml | 138 ++++++++++
.../Core/jobs/offlinewindowstest32/config.xml | 135 ++++++++++
.../Core/jobs/offlinewindowstest64/config.xml | 135 ++++++++++
.../jobs/Core/jobs/user-Keycloak/config.xml | 214 ++++++++++++++++
.../jobs/dev/jobs/DataPipeline/config.xml | 57 ++++-
.../DataPipeline/jobs/AdhocScripts/config.xml | 227 +++++++++++++++++
.../DataPipeline/jobs/AnalyticsAPI/config.xml | 122 +++++----
.../jobs/AnalyticsCore/config.xml | 239 +++++++++++++++++
.../jobs/AnalyticsFetchLogs/config.xml | 56 ++--
.../AnalyticsGeoLocationDBSetup/config.xml | 4 +-
.../config.xml | 58 ++---
.../jobs/AnalyticsReplayJobs/config.xml | 80 +++---
.../jobs/AnalyticsService/config.xml | 225 ++++++++++++++++
.../jobs/AnalyticsStartJobManager/config.xml | 8 +-
.../jobs/AnalyticsSubmitJobs/config.xml | 8 +-
.../DataPipeline/jobs/ApiModule/config.xml | 8 +-
.../jobs/CassandraDbUpdate/config.xml | 58 +++--
.../jobs/CoreDataProducts/config.xml | 238 +++++++++++++++++
.../DataPipeline/jobs/DataProducts/config.xml | 106 ++++----
.../jobs/DataReplayJob/config.xml | 153 +++++++++++
.../jobs/DataReplayScript/config.xml | 227 +++++++++++++++++
.../jobs/DataproductsConfigUpdate/config.xml | 68 ++---
.../jobs/DruidIngestion/config.xml | 58 +++--
.../jobs/DruidSummaryMonthlyRollup/config.xml | 74 ++++++
.../jobs/Druid_Health_Check/config.xml | 70 +++++
.../Druid_ingestion_health_check/config.xml | 70 +++++
.../Druid_segment_health_check/config.xml | 74 ++++++
.../jobs/ETLDruidContentIndexer/config.xml | 111 ++++----
.../jobs/DataPipeline/jobs/ETLJobs/config.xml | 111 ++++----
.../jobs/ETLUserCacheIndexer/config.xml | 128 ++++++----
.../jobs/EdDataProducts/config.xml | 238 +++++++++++++++++
.../jobs/FlinkPipelineJobs/config.xml | 172 +++++++++++++
.../GraphitePrometheusExporter/config.xml | 127 +++++++++
.../jobs/InfraMonitoring/config.xml | 129 ++++++++++
.../DataPipeline/jobs/InternalKong/config.xml | 180 +++++++++++++
.../DataPipeline/jobs/KafkaIndexer/config.xml | 60 ++---
.../DataPipeline/jobs/KafkaSetup/config.xml | 58 ++---
.../jobs/DataPipeline/jobs/Logging/config.xml | 145 +++++++++++
.../DataPipeline/jobs/MLWorkbench/config.xml | 97 +++++++
.../DataPipeline/jobs/Monitoring/config.xml | 108 ++++----
.../config.xml | 139 ++++++++++
.../PipelineFlinkSummaryDenormStop/config.xml | 139 ++++++++++
.../DataPipeline/jobs/RunReportJob/config.xml | 130 ++++++++++
.../jobs/SamzaTelemetrySchemas/config.xml | 66 ++---
.../DataPipeline/jobs/SecorFlink/config.xml | 226 ++++++++++++++++
.../jobs/SubmitReportJob/config.xml | 154 +++++++++++
.../jobs/DataPipeline/jobs/Yarn/config.xml | 71 +++---
.../dev/jobs/KnowledgePlatform/config.xml | 8 +-
.../jobs/AssetSizeMigration/config.xml | 4 +-
.../jobs/CassandraDbUpdate/config.xml | 60 ++---
.../jobs/CassandraTrigger/config.xml | 4 +-
.../jobs/ContentTool/config.xml | 4 +-
.../KnowledgePlatform/jobs/Dial/config.xml | 226 ++++++++++++++++
.../jobs/ESMapping/config.xml | 4 +-
.../jobs/FileSyncTool/config.xml | 4 +-
.../jobs/FlinkJobs/config.xml | 167 ++++++++++++
.../jobs/InsertQRCode/config.xml | 140 ++++++++++
.../jobs/KafkaSetup/config.xml | 60 ++---
.../jobs/Learning/config.xml | 108 ++++----
.../jobs/Monitoring/config.xml | 4 +-
.../KnowledgePlatform/jobs/Neo4j/config.xml | 109 ++++----
.../jobs/Neo4jDefinitionUpdate/config.xml | 58 ++---
.../Neo4jElasticSearchSyncTool/config.xml | 113 ++++----
.../KnowledgePlatform/jobs/Search/config.xml | 6 +-
.../jobs/StartNeo4jCluster/config.xml | 60 ++---
.../jobs/StopNeo4jCluster/config.xml | 4 +-
.../jobs/SyncQRCode/config.xml | 127 +++++++++
.../jobs/ValidateLearning/config.xml | 4 +-
.../KnowledgePlatform/jobs/Yarn/config.xml | 106 ++++----
.../jobs/dev/jobs/Kubernetes/config.xml | 34 +++
.../Kubernetes/jobs/APIManager/config.xml | 159 ++++++++++++
.../Kubernetes/jobs/APIManagerEcho/config.xml | 159 ++++++++++++
.../Kubernetes/jobs/AdminUtils/config.xml | 159 ++++++++++++
.../jobs/Kubernetes/jobs/Analytics/config.xml | 159 ++++++++++++
.../jobs/ApplicationElasticSearch/config.xml | 117 +++++++++
.../Kubernetes/jobs/Assessment/config.xml | 159 ++++++++++++
.../jobs/Kubernetes/jobs/Badger/config.xml | 156 ++++++++++++
.../jobs/BootstrapCluster/config.xml | 127 +++++++++
.../jobs/BootstrapMinimal/config.xml | 57 +++++
.../jobs/Kubernetes/jobs/Cassandra/config.xml | 219 ++++++++++++++++
.../jobs/CassandraDBUpdate/config.xml | 129 ++++++++++
.../jobs/CassandraDecrypt/config.xml | 229 +++++++++++++++++
.../dev/jobs/Kubernetes/jobs/Cert/config.xml | 159 ++++++++++++
.../Kubernetes/jobs/CertRegistry/config.xml | 159 ++++++++++++
.../jobs/Kubernetes/jobs/Content/config.xml | 159 ++++++++++++
.../dev/jobs/Kubernetes/jobs/Enc/config.xml | 159 ++++++++++++
.../jobs/FuntionalTestCases/config.xml | 69 +++++
.../jobs/Kubernetes/jobs/Groups/config.xml | 159 ++++++++++++
.../jobs/Hawkeye-superset/config.xml | 159 ++++++++++++
.../jobs/Kubernetes/jobs/Keycloak/config.xml | 206 +++++++++++++++
.../jobs/KeycloakMigration/config.xml | 173 +++++++++++++
.../Kubernetes/jobs/KnowledgeMW/config.xml | 159 ++++++++++++
.../jobs/KongJWTAdminUtil/config.xml | 136 ++++++++++
.../jobs/Kubernetes/jobs/Learner/config.xml | 159 ++++++++++++
.../dev/jobs/Kubernetes/jobs/Lms/config.xml | 159 ++++++++++++
.../jobs/Kubernetes/jobs/Logging/config.xml | 149 +++++++++++
.../Kubernetes/jobs/Monitoring/config.xml | 133 ++++++++++
.../Kubernetes/jobs/NetworkConfig/config.xml | 133 ++++++++++
.../jobs/Kubernetes/jobs/Nodebb/config.xml | 159 ++++++++++++
.../Kubernetes/jobs/Notification/config.xml | 159 ++++++++++++
.../Kubernetes/jobs/OnboardAPIs/config.xml | 136 ++++++++++
.../jobs/OnboardConsumers/config.xml | 117 +++++++++
.../jobs/Kubernetes/jobs/Player/config.xml | 159 ++++++++++++
.../dev/jobs/Kubernetes/jobs/Print/config.xml | 159 ++++++++++++
.../jobs/Kubernetes/jobs/Report/config.xml | 159 ++++++++++++
.../jobs/Kubernetes/jobs/Search/config.xml | 159 ++++++++++++
.../jobs/Kubernetes/jobs/Taxonomy/config.xml | 159 ++++++++++++
.../jobs/Kubernetes/jobs/Telemetry/config.xml | 159 ++++++++++++
.../Kubernetes/jobs/UploadSchema/config.xml | 133 ++++++++++
.../jobs/Kubernetes/jobs/UserOrg/config.xml | 159 ++++++++++++
.../dev/jobs/Kubernetes/jobs/Yarn/config.xml | 241 ++++++++++++++++++
.../Kubernetes/jobs/certTemplate/config.xml | 136 ++++++++++
.../jobs/nginx-private-ingress/config.xml | 149 +++++++++++
.../jobs/nginx-public-ingress/config.xml | 149 +++++++++++
.../Plugins/jobs/CollectionEditor/config.xml | 109 ++++----
.../Plugins/jobs/ContentEditor/config.xml | 107 ++++----
.../Plugins/jobs/ContentPlayer/config.xml | 100 ++++----
.../Plugins/jobs/ContentPlugins/config.xml | 107 ++++----
.../Plugins/jobs/GenericEditor/config.xml | 102 ++++----
.../org_sunbird_questionunit_quml/config.xml | 200 +++++++++++++++
.../Summary/jobs/DeployedVersions/config.xml | 4 +-
.../jenkins/jobs/OpsAdministration/config.xml | 8 +-
.../ApplicationElasticsearchBackup/config.xml | 6 +-
.../config.xml | 60 +++--
.../dev/jobs/Core/jobs/Bootstrap/config.xml | 4 +-
.../jobs/Core/jobs/CassandraBackup/config.xml | 28 +-
.../Core/jobs/ClearDockerImages/config.xml | 16 +-
.../jobs/Core/jobs/ClearWorkspace/config.xml | 43 +++-
.../dev/jobs/Core/jobs/CreateUser/config.xml | 68 ++---
.../dev/jobs/Core/jobs/ESMapping/config.xml | 60 ++---
.../jobs/Core/jobs/EsReindexing/config.xml | 91 +++++++
.../jobs/Core/jobs/GrafanaBackup/config.xml | 6 +-
.../jobs/dev/jobs/Core/jobs/Health/config.xml | 43 ++++
.../jobs/Core/jobs/JenkinsBackup/config.xml | 6 +-
.../dev/jobs/Core/jobs/KeyRotation/config.xml | 4 +-
.../jobs/Core/jobs/KongMigration/config.xml | 4 +-
.../jobs/LoggerElasticSearchBackup/config.xml | 6 +-
.../LoggerElasticSearchRestore/config.xml | 4 +-
.../jobs/ManagedPostgresBackup/config.xml | 68 ++---
.../dev/jobs/Core/jobs/MonitDeploy/config.xml | 4 +-
.../dev/jobs/Core/jobs/MonitStatus/config.xml | 4 +-
.../Core/jobs/PostgresqlBackup/config.xml | 6 +-
.../Core/jobs/PostgresqlRestore/config.xml | 6 +-
.../Core/jobs/PrometheusBackup/config.xml | 6 +-
.../Core/jobs/PrometheusSanpshot/config.xml | 6 +-
.../dev/jobs/Core/jobs/RedisBackup/config.xml | 124 +++++++++
.../jobs/Core/jobs/SwarmBootstrap/config.xml | 4 +-
.../DataPipeline/jobs/Bootstrap/config.xml | 4 +-
.../jobs/CassandraBackup/config.xml | 6 +-
.../jobs/CassandraRestore/config.xml | 6 +-
.../jobs/ConsumerLagAlert/config.xml | 4 +-
.../jobs/DataproductsAlert/config.xml | 4 +-
.../jobs/DruidPostgresBackup/config.xml | 6 +-
.../jobs/ElasticsearchBackup/config.xml | 6 +-
.../jobs/ElasticsearchRestore/config.xml | 6 +-
.../jobs/DataPipeline/jobs/Health/config.xml | 43 ++++
.../jobs/InfluxDBBackup/config.xml | 32 +--
.../jobs/Influxdb_restore/config.xml | 85 ++++++
.../DataPipeline/jobs/KeyRotation/config.xml | 4 +-
.../DataPipeline/jobs/MonitDeploy/config.xml | 60 ++---
.../jobs/PostgresqlBackup/config.xml | 6 +-
.../jobs/PostgresqlRestore/config.xml | 6 +-
.../DataPipeline/jobs/RedisBackup/config.xml | 120 +++++++++
.../jobs/RedisDumpMonitoring/config.xml | 4 +-
.../jobs/RestartSecorJobs/config.xml | 173 +++++++++++++
.../jobs/SamzaJobsAlert/config.xml | 35 ++-
.../jobs/SamzaJobsAlertProvision/config.xml | 4 +-
.../jobs/SamzaJobsKill/config.xml | 2 +-
.../jobs/SamzaLogsBackup/config.xml | 4 +-
.../jobs/SamzaMonitoringProvision/config.xml | 4 +-
.../jobs/SamzaOrphanprocessAlert/config.xml | 31 ++-
.../jobs/SamzaThroughputAlert/config.xml | 62 ++---
.../jobs/SamzaThroughputProvision/config.xml | 4 +-
.../jobs/DataPipeline/jobs/Test/config.xml | 39 +++
.../jobs/redis-restore/config.xml | 86 +++++++
.../jobs/Bootstrap/config.xml | 4 +-
.../jobs/CassandraBackup/config.xml | 33 +--
.../jobs/CassandraRestore/config.xml | 4 +-
.../jobs/ElasticsearchBackup/config.xml | 32 +--
.../jobs/ElasticsearchRestore/config.xml | 28 +-
.../KnowledgePlatform/jobs/Health/config.xml | 43 ++++
.../jobs/KeyRotation/config.xml | 4 +-
.../jobs/MonitDeploy/config.xml | 4 +-
.../jobs/MonitStatus/config.xml | 4 +-
.../jobs/Neo4jBackup/config.xml | 30 ++-
.../jobs/Neo4jRestore/config.xml | 4 +-
.../jobs/RedisBackup/config.xml | 32 +--
.../jobs/RedisRetore/config.xml | 123 +++++++++
deploy/jenkins/jobs/Provision/config.xml | 8 +-
.../dev/jobs/Core/jobs/Cassandra/config.xml | 60 ++---
.../Core/jobs/CassandraExporter/config.xml | 117 +++++++++
.../jobs/Core/jobs/JenkinsSlave/config.xml | 4 +-
.../jobs/dev/jobs/Core/jobs/Kafka/config.xml | 4 +-
.../dev/jobs/Core/jobs/Keycloak/config.xml | 56 ++--
.../jobs/Core/jobs/LogEsUpgrade6xx/config.xml | 60 ++---
.../dev/jobs/Core/jobs/Logstash/config.xml | 4 +-
.../dev/jobs/Core/jobs/Postgres/config.xml | 64 ++---
.../Core/jobs/PostgresDbUpdate/config.xml | 60 ++---
.../jobs/PostgresDbUpdateManaged/config.xml | 4 +-
.../jobs/dev/jobs/Core/jobs/Redis/config.xml | 127 +++++++++
.../dev/jobs/Core/jobs/Registry/config.xml | 4 +-
.../jobs/dev/jobs/Core/jobs/Secor/config.xml | 4 +-
.../jobs/Core/jobs/keycloak-test/config.xml | 4 +-
.../jobs/Core/jobs/user-keycloak/config.xml | 4 +-
.../DataPipeline/jobs/AnalyticsAPI/config.xml | 26 +-
.../jobs/AnalyticsSecor/config.xml | 64 ++---
.../jobs/AnalyticsSpark/config.xml | 56 ++--
.../DataPipeline/jobs/Cassandra/config.xml | 4 +-
.../jobs/DataPipeline/jobs/Druid/config.xml | 53 +++-
.../DataPipeline/jobs/InfluxDB/config.xml | 4 +-
.../jobs/DataPipeline/jobs/Kafka/config.xml | 62 ++---
.../jobs/DataPipeline/jobs/Kibana/config.xml | 4 +-
.../DataPipeline/jobs/MLWorkbench/config.xml | 4 +-
.../jobs/DataPipeline/jobs/NodeJs/config.xml | 4 +-
.../DataPipeline/jobs/Postgres/config.xml | 4 +-
.../DataPipeline/jobs/RedisCluster/config.xml | 4 +-
.../jobs/TelemetrySearch/config.xml | 4 +-
.../jobs/DataPipeline/jobs/Yarn/config.xml | 58 ++---
.../DataPipeline/jobs/Zookeeper/config.xml | 26 +-
.../jobs/postgres-managed/config.xml | 56 ++--
.../jobs/Cassandra/config.xml | 4 +-
.../jobs/CompositeSearch/config.xml | 58 +++--
.../KnowledgePlatform/jobs/Dial/config.xml | 127 +++++++++
.../KnowledgePlatform/jobs/Kafka/config.xml | 60 ++---
.../jobs/Learning/config.xml | 62 ++---
.../KnowledgePlatform/jobs/Neo4j/config.xml | 60 ++---
.../KnowledgePlatform/jobs/Redis/config.xml | 58 ++---
.../jobs/RedisCluster/config.xml | 4 +-
.../KnowledgePlatform/jobs/Search/config.xml | 4 +-
.../KnowledgePlatform/jobs/Yarn/config.xml | 4 +-
.../jobs/Zookeeper/config.xml | 64 ++---
.../ansible/inventory/dev/Core/common.yml | 110 ++++----
private_repo/ansible/inventory/dev/Core/hosts | 128 +++-------
.../ansible/inventory/dev/Core/secrets.yml | 25 +-
.../inventory/dev/DataPipeline/common.yml | 33 ++-
.../ansible/inventory/dev/DataPipeline/hosts | 126 +++++----
.../inventory/dev/DataPipeline/secrets.yml | 25 +-
.../dev/KnowledgePlatform/common.yml | 29 ++-
.../inventory/dev/KnowledgePlatform/hosts | 60 +++--
.../dev/KnowledgePlatform/secrets.yml | 5 +
.../inventory/dev/Kubernetes/common.yml | 1 +
.../ansible/inventory/dev/Kubernetes/hosts | 1 +
.../inventory/dev/Kubernetes/secrets.yml | 1 +
421 files changed, 22991 insertions(+), 4010 deletions(-)
create mode 100644 deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/Analytics/config.xml
create mode 100644 deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/Bot/config.xml
create mode 100644 deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/CassandraStateValidated/config.xml
create mode 100644 deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/Config/config.xml
create mode 100644 deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/Groups/config.xml
create mode 100644 deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/Hawkeye-superset/config.xml
create mode 100644 deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/Nodebb/config.xml
create mode 100644 deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/Report/config.xml
create mode 100644 deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/Router/config.xml
create mode 100644 deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/Search/config.xml
create mode 100644 deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/Taxonomy/config.xml
create mode 100644 deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/DataPipeline/jobs/AdhocScripts/config.xml
create mode 100644 deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/DataPipeline/jobs/AnalyticsCore/config.xml
create mode 100644 deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/DataPipeline/jobs/AnalyticsService/config.xml
create mode 100644 deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/DataPipeline/jobs/CoreDataProducts/config.xml
create mode 100644 deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/DataPipeline/jobs/DataReplay/config.xml
create mode 100644 deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/DataPipeline/jobs/EdDataProducts/config.xml
create mode 100644 deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/DataPipeline/jobs/FlinkPipelineJobs/config.xml
create mode 100644 deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/DataPipeline/jobs/MLWorkbench/config.xml
create mode 100644 deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/KnowledgePlatform/jobs/Dial/config.xml
create mode 100644 deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/KnowledgePlatform/jobs/FlinkJobs/config.xml
create mode 100644 deploy/jenkins/jobs/Build/jobs/Core/jobs/APIManagerEcho_Backup/config.xml
create mode 100644 deploy/jenkins/jobs/Build/jobs/Core/jobs/Analytics/config.xml
create mode 100644 deploy/jenkins/jobs/Build/jobs/Core/jobs/ApiManagerEcho/config.xml
create mode 100644 deploy/jenkins/jobs/Build/jobs/Core/jobs/CassandraStateValidated/config.xml
create mode 100644 deploy/jenkins/jobs/Build/jobs/Core/jobs/CloudStorageSDK/config.xml
create mode 100644 deploy/jenkins/jobs/Build/jobs/Core/jobs/Config/config.xml
create mode 100644 deploy/jenkins/jobs/Build/jobs/Core/jobs/Groups/config.xml
create mode 100644 deploy/jenkins/jobs/Build/jobs/Core/jobs/Hawkeye-superset/config.xml
create mode 100644 deploy/jenkins/jobs/Build/jobs/Core/jobs/Nodebb/config.xml
create mode 100644 deploy/jenkins/jobs/Build/jobs/Core/jobs/PlatformCoursesFunctionalTest/config.xml
create mode 100644 deploy/jenkins/jobs/Build/jobs/Core/jobs/PlayerCustomStage/config.xml
create mode 100644 deploy/jenkins/jobs/Build/jobs/Core/jobs/Report/config.xml
create mode 100644 deploy/jenkins/jobs/Build/jobs/Core/jobs/Search/config.xml
create mode 100644 deploy/jenkins/jobs/Build/jobs/Core/jobs/Taxonomy/config.xml
create mode 100644 deploy/jenkins/jobs/Build/jobs/DataPipeline/jobs/AdhocScripts/config.xml
create mode 100644 deploy/jenkins/jobs/Build/jobs/DataPipeline/jobs/AnalyticsCore/config.xml
create mode 100644 deploy/jenkins/jobs/Build/jobs/DataPipeline/jobs/AnalyticsService/config.xml
create mode 100644 deploy/jenkins/jobs/Build/jobs/DataPipeline/jobs/CoreDataProducts/config.xml
create mode 100644 deploy/jenkins/jobs/Build/jobs/DataPipeline/jobs/DataReplay/config.xml
create mode 100644 deploy/jenkins/jobs/Build/jobs/DataPipeline/jobs/EdDataProducts/config.xml
create mode 100644 deploy/jenkins/jobs/Build/jobs/DataPipeline/jobs/FlinkPipelineJobs/config.xml
create mode 100644 deploy/jenkins/jobs/Build/jobs/Experiments/config.xml
create mode 100644 deploy/jenkins/jobs/Build/jobs/Experiments/jobs/dev/config.xml
create mode 100644 deploy/jenkins/jobs/Build/jobs/Experiments/jobs/dev/jobs/Experiments/config.xml
create mode 100644 deploy/jenkins/jobs/Build/jobs/Experiments/jobs/dev/jobs/Experiments/jobs/exp1/config.xml
create mode 100644 deploy/jenkins/jobs/Build/jobs/Experiments/jobs/dev/jobs/Experiments/jobs/exp2/config.xml
create mode 100644 deploy/jenkins/jobs/Build/jobs/Experiments/jobs/dev/jobs/Experiments/jobs/exp3/config.xml
create mode 100644 deploy/jenkins/jobs/Build/jobs/Experiments/jobs/dev/jobs/Experiments_Job_Generator/config.xml
create mode 100644 deploy/jenkins/jobs/Build/jobs/FunctionalTests/config.xml
create mode 100644 deploy/jenkins/jobs/Build/jobs/FunctionalTests/jobs/Core/config.xml
create mode 100644 deploy/jenkins/jobs/Build/jobs/FunctionalTests/jobs/Core/jobs/Content/config.xml
create mode 100644 deploy/jenkins/jobs/Build/jobs/KnowledgePlatform/jobs/Dial/config.xml
create mode 100644 deploy/jenkins/jobs/Build/jobs/KnowledgePlatform/jobs/FlinkJobs/config.xml
create mode 100644 deploy/jenkins/jobs/Build/jobs/KnowledgePlatform/jobs/LPFuntionalTest/config.xml
create mode 100644 deploy/jenkins/jobs/Build/jobs/KnowledgePlatform/jobs/LP_Decoupling_Test/config.xml
create mode 100644 deploy/jenkins/jobs/Deploy/jobs/dev/jobs/Core/jobs/CF-QUML_Migration_Script/config.xml
create mode 100644 deploy/jenkins/jobs/Deploy/jobs/dev/jobs/Core/jobs/CassandraStateValidated/config.xml
create mode 100644 deploy/jenkins/jobs/Deploy/jobs/dev/jobs/Core/jobs/Config/config.xml
create mode 100644 deploy/jenkins/jobs/Deploy/jobs/dev/jobs/Core/jobs/KeycloakCustom/config.xml
create mode 100644 deploy/jenkins/jobs/Deploy/jobs/dev/jobs/Core/jobs/KeycloakMigration/config.xml
create mode 100644 deploy/jenkins/jobs/Deploy/jobs/dev/jobs/Core/jobs/YarnOld/config.xml
create mode 100644 deploy/jenkins/jobs/Deploy/jobs/dev/jobs/Core/jobs/offlineInstaller/config.xml
create mode 100644 deploy/jenkins/jobs/Deploy/jobs/dev/jobs/Core/jobs/offlinewindowstest32/config.xml
create mode 100644 deploy/jenkins/jobs/Deploy/jobs/dev/jobs/Core/jobs/offlinewindowstest64/config.xml
create mode 100644 deploy/jenkins/jobs/Deploy/jobs/dev/jobs/Core/jobs/user-Keycloak/config.xml
create mode 100644 deploy/jenkins/jobs/Deploy/jobs/dev/jobs/DataPipeline/jobs/AdhocScripts/config.xml
create mode 100644 deploy/jenkins/jobs/Deploy/jobs/dev/jobs/DataPipeline/jobs/AnalyticsCore/config.xml
create mode 100644 deploy/jenkins/jobs/Deploy/jobs/dev/jobs/DataPipeline/jobs/AnalyticsService/config.xml
create mode 100644 deploy/jenkins/jobs/Deploy/jobs/dev/jobs/DataPipeline/jobs/CoreDataProducts/config.xml
create mode 100644 deploy/jenkins/jobs/Deploy/jobs/dev/jobs/DataPipeline/jobs/DataReplayJob/config.xml
create mode 100644 deploy/jenkins/jobs/Deploy/jobs/dev/jobs/DataPipeline/jobs/DataReplayScript/config.xml
create mode 100644 deploy/jenkins/jobs/Deploy/jobs/dev/jobs/DataPipeline/jobs/DruidSummaryMonthlyRollup/config.xml
create mode 100644 deploy/jenkins/jobs/Deploy/jobs/dev/jobs/DataPipeline/jobs/Druid_Health_Check/config.xml
create mode 100644 deploy/jenkins/jobs/Deploy/jobs/dev/jobs/DataPipeline/jobs/Druid_ingestion_health_check/config.xml
create mode 100644 deploy/jenkins/jobs/Deploy/jobs/dev/jobs/DataPipeline/jobs/Druid_segment_health_check/config.xml
create mode 100644 deploy/jenkins/jobs/Deploy/jobs/dev/jobs/DataPipeline/jobs/EdDataProducts/config.xml
create mode 100644 deploy/jenkins/jobs/Deploy/jobs/dev/jobs/DataPipeline/jobs/FlinkPipelineJobs/config.xml
create mode 100644 deploy/jenkins/jobs/Deploy/jobs/dev/jobs/DataPipeline/jobs/GraphitePrometheusExporter/config.xml
create mode 100644 deploy/jenkins/jobs/Deploy/jobs/dev/jobs/DataPipeline/jobs/InfraMonitoring/config.xml
create mode 100644 deploy/jenkins/jobs/Deploy/jobs/dev/jobs/DataPipeline/jobs/InternalKong/config.xml
create mode 100644 deploy/jenkins/jobs/Deploy/jobs/dev/jobs/DataPipeline/jobs/Logging/config.xml
create mode 100644 deploy/jenkins/jobs/Deploy/jobs/dev/jobs/DataPipeline/jobs/MLWorkbench/config.xml
create mode 100644 deploy/jenkins/jobs/Deploy/jobs/dev/jobs/DataPipeline/jobs/PipelineFlinkSummaryDenormStart/config.xml
create mode 100644 deploy/jenkins/jobs/Deploy/jobs/dev/jobs/DataPipeline/jobs/PipelineFlinkSummaryDenormStop/config.xml
create mode 100644 deploy/jenkins/jobs/Deploy/jobs/dev/jobs/DataPipeline/jobs/RunReportJob/config.xml
create mode 100644 deploy/jenkins/jobs/Deploy/jobs/dev/jobs/DataPipeline/jobs/SecorFlink/config.xml
create mode 100644 deploy/jenkins/jobs/Deploy/jobs/dev/jobs/DataPipeline/jobs/SubmitReportJob/config.xml
create mode 100644 deploy/jenkins/jobs/Deploy/jobs/dev/jobs/KnowledgePlatform/jobs/Dial/config.xml
create mode 100644 deploy/jenkins/jobs/Deploy/jobs/dev/jobs/KnowledgePlatform/jobs/FlinkJobs/config.xml
create mode 100644 deploy/jenkins/jobs/Deploy/jobs/dev/jobs/KnowledgePlatform/jobs/InsertQRCode/config.xml
create mode 100644 deploy/jenkins/jobs/Deploy/jobs/dev/jobs/KnowledgePlatform/jobs/SyncQRCode/config.xml
create mode 100644 deploy/jenkins/jobs/Deploy/jobs/dev/jobs/Kubernetes/config.xml
create mode 100644 deploy/jenkins/jobs/Deploy/jobs/dev/jobs/Kubernetes/jobs/APIManager/config.xml
create mode 100644 deploy/jenkins/jobs/Deploy/jobs/dev/jobs/Kubernetes/jobs/APIManagerEcho/config.xml
create mode 100644 deploy/jenkins/jobs/Deploy/jobs/dev/jobs/Kubernetes/jobs/AdminUtils/config.xml
create mode 100644 deploy/jenkins/jobs/Deploy/jobs/dev/jobs/Kubernetes/jobs/Analytics/config.xml
create mode 100644 deploy/jenkins/jobs/Deploy/jobs/dev/jobs/Kubernetes/jobs/ApplicationElasticSearch/config.xml
create mode 100644 deploy/jenkins/jobs/Deploy/jobs/dev/jobs/Kubernetes/jobs/Assessment/config.xml
create mode 100644 deploy/jenkins/jobs/Deploy/jobs/dev/jobs/Kubernetes/jobs/Badger/config.xml
create mode 100644 deploy/jenkins/jobs/Deploy/jobs/dev/jobs/Kubernetes/jobs/BootstrapCluster/config.xml
create mode 100644 deploy/jenkins/jobs/Deploy/jobs/dev/jobs/Kubernetes/jobs/BootstrapMinimal/config.xml
create mode 100644 deploy/jenkins/jobs/Deploy/jobs/dev/jobs/Kubernetes/jobs/Cassandra/config.xml
create mode 100644 deploy/jenkins/jobs/Deploy/jobs/dev/jobs/Kubernetes/jobs/CassandraDBUpdate/config.xml
create mode 100644 deploy/jenkins/jobs/Deploy/jobs/dev/jobs/Kubernetes/jobs/CassandraDecrypt/config.xml
create mode 100644 deploy/jenkins/jobs/Deploy/jobs/dev/jobs/Kubernetes/jobs/Cert/config.xml
create mode 100644 deploy/jenkins/jobs/Deploy/jobs/dev/jobs/Kubernetes/jobs/CertRegistry/config.xml
create mode 100644 deploy/jenkins/jobs/Deploy/jobs/dev/jobs/Kubernetes/jobs/Content/config.xml
create mode 100644 deploy/jenkins/jobs/Deploy/jobs/dev/jobs/Kubernetes/jobs/Enc/config.xml
create mode 100644 deploy/jenkins/jobs/Deploy/jobs/dev/jobs/Kubernetes/jobs/FuntionalTestCases/config.xml
create mode 100644 deploy/jenkins/jobs/Deploy/jobs/dev/jobs/Kubernetes/jobs/Groups/config.xml
create mode 100644 deploy/jenkins/jobs/Deploy/jobs/dev/jobs/Kubernetes/jobs/Hawkeye-superset/config.xml
create mode 100644 deploy/jenkins/jobs/Deploy/jobs/dev/jobs/Kubernetes/jobs/Keycloak/config.xml
create mode 100644 deploy/jenkins/jobs/Deploy/jobs/dev/jobs/Kubernetes/jobs/KeycloakMigration/config.xml
create mode 100644 deploy/jenkins/jobs/Deploy/jobs/dev/jobs/Kubernetes/jobs/KnowledgeMW/config.xml
create mode 100644 deploy/jenkins/jobs/Deploy/jobs/dev/jobs/Kubernetes/jobs/KongJWTAdminUtil/config.xml
create mode 100644 deploy/jenkins/jobs/Deploy/jobs/dev/jobs/Kubernetes/jobs/Learner/config.xml
create mode 100644 deploy/jenkins/jobs/Deploy/jobs/dev/jobs/Kubernetes/jobs/Lms/config.xml
create mode 100644 deploy/jenkins/jobs/Deploy/jobs/dev/jobs/Kubernetes/jobs/Logging/config.xml
create mode 100644 deploy/jenkins/jobs/Deploy/jobs/dev/jobs/Kubernetes/jobs/Monitoring/config.xml
create mode 100644 deploy/jenkins/jobs/Deploy/jobs/dev/jobs/Kubernetes/jobs/NetworkConfig/config.xml
create mode 100644 deploy/jenkins/jobs/Deploy/jobs/dev/jobs/Kubernetes/jobs/Nodebb/config.xml
create mode 100644 deploy/jenkins/jobs/Deploy/jobs/dev/jobs/Kubernetes/jobs/Notification/config.xml
create mode 100644 deploy/jenkins/jobs/Deploy/jobs/dev/jobs/Kubernetes/jobs/OnboardAPIs/config.xml
create mode 100644 deploy/jenkins/jobs/Deploy/jobs/dev/jobs/Kubernetes/jobs/OnboardConsumers/config.xml
create mode 100644 deploy/jenkins/jobs/Deploy/jobs/dev/jobs/Kubernetes/jobs/Player/config.xml
create mode 100644 deploy/jenkins/jobs/Deploy/jobs/dev/jobs/Kubernetes/jobs/Print/config.xml
create mode 100644 deploy/jenkins/jobs/Deploy/jobs/dev/jobs/Kubernetes/jobs/Report/config.xml
create mode 100644 deploy/jenkins/jobs/Deploy/jobs/dev/jobs/Kubernetes/jobs/Search/config.xml
create mode 100644 deploy/jenkins/jobs/Deploy/jobs/dev/jobs/Kubernetes/jobs/Taxonomy/config.xml
create mode 100644 deploy/jenkins/jobs/Deploy/jobs/dev/jobs/Kubernetes/jobs/Telemetry/config.xml
create mode 100644 deploy/jenkins/jobs/Deploy/jobs/dev/jobs/Kubernetes/jobs/UploadSchema/config.xml
create mode 100644 deploy/jenkins/jobs/Deploy/jobs/dev/jobs/Kubernetes/jobs/UserOrg/config.xml
create mode 100644 deploy/jenkins/jobs/Deploy/jobs/dev/jobs/Kubernetes/jobs/Yarn/config.xml
create mode 100644 deploy/jenkins/jobs/Deploy/jobs/dev/jobs/Kubernetes/jobs/certTemplate/config.xml
create mode 100644 deploy/jenkins/jobs/Deploy/jobs/dev/jobs/Kubernetes/jobs/nginx-private-ingress/config.xml
create mode 100644 deploy/jenkins/jobs/Deploy/jobs/dev/jobs/Kubernetes/jobs/nginx-public-ingress/config.xml
create mode 100644 deploy/jenkins/jobs/Deploy/jobs/dev/jobs/Plugins/jobs/org_sunbird_questionunit_quml/config.xml
create mode 100644 deploy/jenkins/jobs/OpsAdministration/jobs/dev/jobs/Core/jobs/EsReindexing/config.xml
create mode 100644 deploy/jenkins/jobs/OpsAdministration/jobs/dev/jobs/Core/jobs/Health/config.xml
create mode 100644 deploy/jenkins/jobs/OpsAdministration/jobs/dev/jobs/Core/jobs/RedisBackup/config.xml
create mode 100644 deploy/jenkins/jobs/OpsAdministration/jobs/dev/jobs/DataPipeline/jobs/Health/config.xml
create mode 100644 deploy/jenkins/jobs/OpsAdministration/jobs/dev/jobs/DataPipeline/jobs/Influxdb_restore/config.xml
create mode 100644 deploy/jenkins/jobs/OpsAdministration/jobs/dev/jobs/DataPipeline/jobs/RedisBackup/config.xml
create mode 100644 deploy/jenkins/jobs/OpsAdministration/jobs/dev/jobs/DataPipeline/jobs/RestartSecorJobs/config.xml
create mode 100644 deploy/jenkins/jobs/OpsAdministration/jobs/dev/jobs/DataPipeline/jobs/Test/config.xml
create mode 100644 deploy/jenkins/jobs/OpsAdministration/jobs/dev/jobs/DataPipeline/jobs/redis-restore/config.xml
create mode 100644 deploy/jenkins/jobs/OpsAdministration/jobs/dev/jobs/KnowledgePlatform/jobs/Health/config.xml
create mode 100644 deploy/jenkins/jobs/OpsAdministration/jobs/dev/jobs/KnowledgePlatform/jobs/RedisRetore/config.xml
create mode 100644 deploy/jenkins/jobs/Provision/jobs/dev/jobs/Core/jobs/CassandraExporter/config.xml
create mode 100644 deploy/jenkins/jobs/Provision/jobs/dev/jobs/Core/jobs/Redis/config.xml
create mode 100644 deploy/jenkins/jobs/Provision/jobs/dev/jobs/KnowledgePlatform/jobs/Dial/config.xml
create mode 120000 private_repo/ansible/inventory/dev/Kubernetes/common.yml
create mode 120000 private_repo/ansible/inventory/dev/Kubernetes/hosts
create mode 120000 private_repo/ansible/inventory/dev/Kubernetes/secrets.yml
diff --git a/ansible/inventory/env/group_vars/all.yml b/ansible/inventory/env/group_vars/all.yml
index 65eb1db11..423ac116e 100644
--- a/ansible/inventory/env/group_vars/all.yml
+++ b/ansible/inventory/env/group_vars/all.yml
@@ -110,8 +110,8 @@ sunbird_cassandra_host: "{{groups['cassandra']|join(',')}}" #Private IP of Cass
sunbird_es_host: "{{groups['es']| join(',')}}"
## Application server configurations
-sunbird_analytics_api_base_url: "http://{{analyticsapi_ip}}:9000"
-sunbird_search_service_api_base_url: "http://{{sunbird_swarm_manager_lb_ip}}:9004"
+sunbird_analytics_api_base_url: "analytics-service.{{namespace}}.svc.cluster.local:9000"
+sunbird_search_service_api_base_url: "http://{{private_ingressgateway_ip}}/search"
sunbird_mail_server_host: "{{ mail_server_host }}" #SMTP server IP. Could be ignored if not mails are to be sent.
sunbird_mail_server_port: "{{ mail_server_port }}" #SMTP port. Could be ignored if not mails are to be sent.
sunbird_mail_server_username: "{{ mail_server_username }}" #SMTP username. Could be ignored if not mails are to be sent.
@@ -197,8 +197,8 @@ sunbird_dial_repo_api_key: "{{ core_vault_sunbird_ekstep_api_key }}"
sunbird_plugin_repo_api_base_url: "{{ sunbird_search_service_api_base_url }}"
sunbird_data_service_api_base_url: "{{sunbird_ekstep_api_base_url}}"
sunbird_data_service_api_key: "{{ core_vault_sunbird_ekstep_api_key }}"
-sunbird_content_service_api_base_url: "http://{{sunbird_swarm_manager_lb_ip}}:9002"
-sunbird_user_service_api_base_url: "http://{{sunbird_swarm_manager_lb_ip}}:9000"
+sunbird_content_service_api_base_url: "http://{{private_ingressgateway_ip}}/content"
+sunbird_user_service_api_base_url: "http://{{private_ingressgateway_ip}}/learner"
sunbird_group_service_api_base_url: "http://groups-service:9000"
#API Manager
@@ -262,7 +262,7 @@ enable_scraping_docker_metrics: false
postgres_exporter_postgres_port: 5432
postgres_exporter_user: postgres_exporter
sunbird_cs_base_url: "http://{{sunbird_swarm_manager_lb_ip}}:5000"
-sunbird_user_service_base_url: "http://{{sunbird_swarm_manager_lb_ip}}:9000"
+sunbird_user_service_base_url: "http://{{private_ingressgateway_ip}}/learner"
kong_admin_api_url: http://localhost:8001
@@ -342,7 +342,7 @@ sunbird_device_register_api: "{{proto}}://{{api_proxy_name}}/v3/device/register/
sunbird_course_batch_notification_signature: sunbird
sunbird_authorization: "{{core_vault_sunbird_api_auth_token}}"
-sunbird_lms_base_url: "http://{{sunbird_swarm_manager_lb_ip}}:8000"
+sunbird_lms_base_url: "http://{{private_ingressgateway_ip}}/api"
sunbird_content_service_local_base_url: "http://{{sunbird_swarm_manager_lb_ip}}:5000"
sunbird_kafka_host: "{{sunbird_processing_kafka_host}}"
sunbird_qrimage_topic: "{{env}}.qrimage.request"
@@ -543,7 +543,7 @@ sunbird_sso_kafka_topic: "{{env_name}}.lms.sso.events"
__yarn_host__: "{{ groups['yarn-master'][0] }}"
zookeepers: "{{groups['zookeeper']|join(':2181,')}}:2181"
kafka_brokers: "{{groups['processing-cluster-kafka']|join(':9092,')}}:9092"
-__lms_host__: "http://{{sunbird_swarm_manager_lb_ip}}:9000"
+__lms_host__: "http://{{private_ingressgateway_ip}}/learner"
sunbird_redis_host: "{{ groups['lp-redis'][0] }}"
@@ -649,3 +649,11 @@ group_activity_agg_cache_enable: false
# nodebb variables
sunbird_nodebb_storage_key: "{{ core_vault_sunbird_nodebb_storage_key }}"
+kibana_service: kibana.logging.svc.cluster.local:5601
+sunbird_dial_repo_api_base_url: "http://{{dialservice_ip}}:9001"
+
+#report service
+dp_postgres_host: "{{ groups['postgres'][0] }}"
+dp_postgres_db: analytics
+dp_postgres_password: "{{ core_vault_dp_pgdb_password }}"
+dp_postgres_username: analytics
diff --git a/deploy/jenkins/jenkins-plugins-setup.sh b/deploy/jenkins/jenkins-plugins-setup.sh
index 1bc665b7e..b6956c7df 100755
--- a/deploy/jenkins/jenkins-plugins-setup.sh
+++ b/deploy/jenkins/jenkins-plugins-setup.sh
@@ -4,21 +4,21 @@ normal=$(tput sgr0)
if [[ ! -d /var/lib/jenkins/.m2 ]]; then
echo -e "\n\e[0;32m${bold}Downloading and copying m2 directory to Jenkins ${normal}"
-wget https://sunbirdpublic.blob.core.windows.net/installation/m2_updated.zip
-unzip m2_updated.zip
+wget https://sunbirdpublic.blob.core.windows.net/installation/m2_new.zip
+unzip m2_new.zip
mv .m2 /var/lib/jenkins
chown -R jenkins:jenkins /var/lib/jenkins/.m2
fi
echo -e "\n\e[0;32m${bold}Downloading and copying jenkins plugin directory to Jenkins ${normal}"
if [[ ! -d /var/lib/jenkins/plugins ]]; then
-wget https://sunbirdpublic.blob.core.windows.net/installation/JenkinsPlugin.zip
-unzip JenkinsPlugin.zip
+wget https://sunbirdpublic.blob.core.windows.net/installation/jenkins-plugins-new.zip
+unzip jenkins-plugins-new.zip
mv plugins /var/lib/jenkins/
chown -R jenkins:jenkins /var/lib/jenkins/plugins
else
-wget https://sunbirdpublic.blob.core.windows.net/installation/JenkinsPlugin.zip
-unzip JenkinsPlugin.zip
+wget https://sunbirdpublic.blob.core.windows.net/installation/jenkins-plugins-new.zip
+unzip jenkins-plugins-new.zip
cp -rf plugins/* /var/lib/jenkins/plugins/
chown -R jenkins:jenkins /var/lib/jenkins/plugins
fi
diff --git a/deploy/jenkins/jenkins-server-setup.sh b/deploy/jenkins/jenkins-server-setup.sh
index c28e87690..61dc03d71 100755
--- a/deploy/jenkins/jenkins-server-setup.sh
+++ b/deploy/jenkins/jenkins-server-setup.sh
@@ -15,7 +15,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 -
apt-add-repository "deb https://pkg.jenkins.io/debian-stable binary/"
apt-get update
-apt-get install -y jenkins=2.190.2
+apt-get install -y jenkins=2.263.1
echo -e "\n\e[0;32m${bold}Installating PIP${normal}"
apt-get install -y python-pip
@@ -128,6 +128,22 @@ echo "deb http://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee -a /etc/a
apt-get update
apt-get install -y kubectl
+#Install yarn
+curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -
+echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list
+apt update && apt install yarn
+
+wget https://download.java.net/openjdk/jdk11/ri/openjdk-11+28_linux-x64_bin.tar.gz
+tar -xf openjdk-11+28_linux-x64_bin.tar.gz
+mv jdk-11 java-11-openjdk-amd64
+cp -r java-11-openjdk-amd64 /usr/lib/jvm/
+rm -rf java-11-openjdk-amd64 openjdk-11+28_linux-x64_bin.tar.gz
+
+wget https://downloads.apache.org/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz
+tar -xf apache-maven-3.6.3-bin.tar.gz
+mv apache-maven-3.6.3/bin/mvn /opt/apache-maven-3.6.3/bin/mvn.3.6
+rm -rf apache-maven-3.6.3-bin.tar.gz
+
echo -e "\n\e[0;32m${bold}Clean up${normal}"
sudo apt -y autoremove
diff --git a/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/config.xml b/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/config.xml
index ca27afff7..92618cba9 100644
--- a/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/config.xml
+++ b/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/config.xml
@@ -1,12 +1,12 @@
-
+
-
+
-
-
+
+
diff --git a/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/APIManager/config.xml b/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/APIManager/config.xml
index a3e8cbe68..99ae364da 100644
--- a/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/APIManager/config.xml
+++ b/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/APIManager/config.xml
@@ -1,26 +1,25 @@
-
-
+
-
+
hudson.model.ParametersDefinitionProperty
com.sonyericsson.rebuild.RebuildSettings
-
+
false
-1
- -1
+ 10
-1
- 5
+ 1
-
+
false
false
@@ -35,7 +34,7 @@
image_tag
<font color=darkgreen size=2><b>OPTIONAL: Specify the tag to upload a specific image version to the container registry.</b></font>
-
+
false
@@ -51,20 +50,21 @@ ArtifactRepo - Push the docker image to container registry.
-
+
0
0
false
project
false
-
+
+
-
- Build/Core/APIManager
+
+ /Build/Core/APIManager
SUCCESS
0
@@ -75,8 +75,8 @@ ArtifactRepo - Push the docker image to container registry.
-
-
+
+
2
@@ -94,7 +94,7 @@ ArtifactRepo - Push the docker image to container registry.
true
false
-
+
1
false
@@ -105,4 +105,4 @@ ArtifactRepo - Push the docker image to container registry.
false
-
+
\ No newline at end of file
diff --git a/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/APIManagerEcho/config.xml b/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/APIManagerEcho/config.xml
index cc051470f..cb84967fb 100644
--- a/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/APIManagerEcho/config.xml
+++ b/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/APIManagerEcho/config.xml
@@ -1,26 +1,25 @@
-
-
+
-
+
hudson.model.ParametersDefinitionProperty
com.sonyericsson.rebuild.RebuildSettings
-
+
false
-1
- -1
+ 10
-1
- 5
+ 1
-
+
false
false
@@ -29,13 +28,13 @@
absolute_job_path
<font color=dimgray size=2><b>Do not change this value! The metadata.json will be copied from this job.</b></font>
- Build/Core/APIManagerEcho
+ Build/Core/ApiManagerEcho
false
image_tag
<font color=darkgreen size=2><b>OPTIONAL: Specify the tag to upload a specific image version to the container registry.</b></font>
-
+
false
@@ -51,20 +50,21 @@ ArtifactRepo - Push the docker image to container registry.
-
+
0
0
false
project
false
-
+
+
-
- Build/Core/APIManagerEcho
+
+ /Build/Core/ApiManagerEcho
SUCCESS
0
@@ -75,8 +75,8 @@ ArtifactRepo - Push the docker image to container registry.
-
-
+
+
2
@@ -94,7 +94,7 @@ ArtifactRepo - Push the docker image to container registry.
true
false
-
+
1
false
@@ -105,4 +105,4 @@ ArtifactRepo - Push the docker image to container registry.
false
-
+
\ No newline at end of file
diff --git a/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/AdminUtils/config.xml b/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/AdminUtils/config.xml
index 397432f38..bad9bddc1 100644
--- a/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/AdminUtils/config.xml
+++ b/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/AdminUtils/config.xml
@@ -1,37 +1,35 @@
-
-
+
-
+
hudson.model.ParametersDefinitionProperty
com.sonyericsson.rebuild.RebuildSettings
-
-
+
+
-
+
false
-
-
-
-
- /Build/Core/AdminUtils
-
- SUCCESS
- 0
- BLUE
- true
-
-
-
-
+
+
+ -1
+ 10
+ -1
+ 1
+
+
+
+
+ false
+ false
+
@@ -43,7 +41,7 @@
image_tag
<font color=darkgreen size=2><b>OPTIONAL: Specify the tag to upload a specific image version to the container registry.</b></font>
-
+
false
@@ -59,32 +57,33 @@ ArtifactRepo - Push the docker image to container registry.
-
-
- -1
- -1
- -1
- 5
-
-
-
-
- false
- false
-
-
+
0
0
false
project
false
-
- 1
+
+
+
+
+
+
+ /Build/Core/AdminUtils
+
+ SUCCESS
+ 0
+ BLUE
+ true
+
+
+
+
-
-
+
+
2
@@ -102,7 +101,7 @@ ArtifactRepo - Push the docker image to container registry.
true
false
-
+
1
false
@@ -113,4 +112,4 @@ ArtifactRepo - Push the docker image to container registry.
false
-
+
\ No newline at end of file
diff --git a/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/Analytics/config.xml b/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/Analytics/config.xml
new file mode 100644
index 000000000..0e2f5b81b
--- /dev/null
+++ b/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/Analytics/config.xml
@@ -0,0 +1,108 @@
+
+
+
+
+ hudson.model.ParametersDefinitionProperty
+ com.sonyericsson.rebuild.RebuildSettings
+
+
+
+
+ false
+
+
+
+ -1
+ 10
+ -1
+ 1
+
+
+
+
+ false
+ false
+
+
+
+
+ absolute_job_path
+ <font color=dimgray size=2><b>Do not change this value! The metadata.json will be copied from this job.</b></font>
+ Build/Core/Analytics
+ false
+
+
+ image_tag
+ <font color=darkgreen size=2><b>OPTIONAL: Specify the tag to upload a specific image version to the container registry.</b></font>
+
+ false
+
+
+ artifact_source
+ <font color=dimgray size=2><b>
+ArtifactRepo - Push the docker image to container registry.
+</b></font>
+
+
+ ArtifactRepo
+
+
+
+
+
+
+ 0
+ 0
+
+ false
+ project
+ false
+
+
+
+
+
+
+
+ /Build/Core/Analytics
+
+ SUCCESS
+ 0
+ BLUE
+ true
+
+
+
+
+
+
+
+ 2
+
+
+ https://github.com/project-sunbird/sunbird-devops.git
+
+
+
+
+ ${public_repo_branch}
+
+
+ false
+
+
+
+ true
+ false
+
+ 0
+ false
+
+
+
+ pipelines/upload/docker/Jenkinsfile
+ false
+
+
+ false
+
\ No newline at end of file
diff --git a/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/Assessment/config.xml b/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/Assessment/config.xml
index 99461aa98..dc2b9069b 100644
--- a/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/Assessment/config.xml
+++ b/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/Assessment/config.xml
@@ -1,5 +1,4 @@
-
-
+
@@ -8,15 +7,15 @@
-
+
false
-1
- -1
+ 10
-1
- 5
+ 1
@@ -35,7 +34,7 @@
image_tag
<font color=darkgreen size=2><b>OPTIONAL: Specify the tag to upload a specific image version to the container registry.</b></font>
-
+
false
@@ -51,19 +50,20 @@ ArtifactRepo - Push the docker image to container registry.
-
+
0
0
false
project
false
-
+
+
-
+
/Build/Core/Assessment
SUCCESS
@@ -75,8 +75,8 @@ ArtifactRepo - Push the docker image to container registry.
-
-
+
+
2
@@ -94,7 +94,7 @@ ArtifactRepo - Push the docker image to container registry.
true
false
-
+
0
false
diff --git a/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/Badger/config.xml b/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/Badger/config.xml
index 7a4b219bb..6e2ea4303 100644
--- a/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/Badger/config.xml
+++ b/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/Badger/config.xml
@@ -1,26 +1,25 @@
-
-
+
-
+
hudson.model.ParametersDefinitionProperty
com.sonyericsson.rebuild.RebuildSettings
-
+
false
-1
- -1
+ 10
-1
- 5
+ 1
-
+
false
false
@@ -35,7 +34,7 @@
image_tag
<font color=darkgreen size=2><b>OPTIONAL: Specify the tag to upload a specific image version to the container registry.</b></font>
-
+
false
@@ -51,19 +50,20 @@ ArtifactRepo - Push the docker image to container registry.
-
+
0
0
false
project
false
-
+
+
-
+
/Build/Core/Badger
SUCCESS
@@ -75,8 +75,8 @@ ArtifactRepo - Push the docker image to container registry.
-
-
+
+
2
@@ -94,7 +94,7 @@ ArtifactRepo - Push the docker image to container registry.
true
false
-
+
1
false
@@ -105,4 +105,4 @@ ArtifactRepo - Push the docker image to container registry.
false
-
+
\ No newline at end of file
diff --git a/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/Bot/config.xml b/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/Bot/config.xml
new file mode 100644
index 000000000..9d3f277a1
--- /dev/null
+++ b/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/Bot/config.xml
@@ -0,0 +1,108 @@
+
+
+
+
+ hudson.model.ParametersDefinitionProperty
+ com.sonyericsson.rebuild.RebuildSettings
+
+
+
+
+ false
+
+
+
+ -1
+ 10
+ -1
+ 1
+
+
+
+
+ false
+ false
+
+
+
+
+ absolute_job_path
+ <font color=dimgray size=2><b>Do not change this value! The metadata.json will be copied from this job.</b></font>
+ Build/Core/Bot
+ false
+
+
+ image_tag
+ <font color=darkgreen size=2><b>OPTIONAL: Specify the tag to upload a specific image version to the container registry.</b></font>
+
+ false
+
+
+ artifact_source
+ <font color=dimgray size=2><b>
+ArtifactRepo - Push the docker image to container registry.
+</b></font>
+
+
+ ArtifactRepo
+
+
+
+
+
+
+ 0
+ 0
+
+ false
+ project
+ false
+
+
+
+
+
+
+
+ /Build/Core/Bot
+
+ SUCCESS
+ 0
+ BLUE
+ true
+
+
+
+
+
+
+
+ 2
+
+
+ https://github.com/project-sunbird/sunbird-devops.git
+
+
+
+
+ ${public_repo_branch}
+
+
+ false
+
+
+
+ true
+ false
+
+ 0
+ false
+
+
+
+ pipelines/upload/docker/Jenkinsfile
+ false
+
+
+ false
+
\ No newline at end of file
diff --git a/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/Cassandra/config.xml b/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/Cassandra/config.xml
index e26714086..06ff17040 100644
--- a/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/Cassandra/config.xml
+++ b/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/Cassandra/config.xml
@@ -1,5 +1,4 @@
-
-
+
@@ -8,15 +7,15 @@
-
+
false
-1
- -1
+ 10
-1
- 5
+ 1
@@ -51,19 +50,20 @@ ArtifactRepo - Upload and keep a copy of the artifact in Jenkins, JenkinsJob - J
-
+
0
0
false
project
false
-
+
+
-
+
/Build/Core/Cassandra
SUCCESS
@@ -75,8 +75,8 @@ ArtifactRepo - Upload and keep a copy of the artifact in Jenkins, JenkinsJob - J
-
-
+
+
2
@@ -94,7 +94,7 @@ ArtifactRepo - Upload and keep a copy of the artifact in Jenkins, JenkinsJob - J
true
false
-
+
0
false
diff --git a/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/CassandraDecrypt/config.xml b/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/CassandraDecrypt/config.xml
index 1dec9c818..72bb8bb86 100644
--- a/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/CassandraDecrypt/config.xml
+++ b/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/CassandraDecrypt/config.xml
@@ -1,5 +1,4 @@
-
-
+
@@ -8,15 +7,15 @@
-
+
false
-1
- -1
+ 10
-1
- 5
+ 1
@@ -51,19 +50,20 @@ ArtifactRepo - Upload and keep a copy of the artifact in Jenkins, JenkinsJob - J
-
+
0
0
false
project
false
-
+
+
-
+
/Build/Core/CassandraDecrypt
SUCCESS
@@ -75,8 +75,8 @@ ArtifactRepo - Upload and keep a copy of the artifact in Jenkins, JenkinsJob - J
-
-
+
+
2
@@ -94,7 +94,7 @@ ArtifactRepo - Upload and keep a copy of the artifact in Jenkins, JenkinsJob - J
true
false
-
+
0
false
diff --git a/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/CassandraStateValidated/config.xml b/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/CassandraStateValidated/config.xml
new file mode 100644
index 000000000..dec55c1df
--- /dev/null
+++ b/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/CassandraStateValidated/config.xml
@@ -0,0 +1,108 @@
+
+
+
+
+ hudson.model.ParametersDefinitionProperty
+ com.sonyericsson.rebuild.RebuildSettings
+
+
+
+
+ false
+
+
+
+ -1
+ 10
+ -1
+ 1
+
+
+
+
+ false
+ false
+
+
+
+
+ absolute_job_path
+ <font color=dimgray size=2><b>Do not change this value! The metadata.json will be copied from this job.</b></font>
+ Build/Core/CassandraStateValidated
+ false
+
+
+ build_number
+ <font color=darkgreen size=2><b>OPTIONAL: Specify the build job number to upload / copy the artifact built in that job.</b></font>
+ lastSuccessfulBuild
+ false
+
+
+ artifact_source
+ <font color=dimgray size=2><b>
+ArtifactRepo - Upload and keep a copy of the artifact in Jenkins, JenkinsJob - Just keep a copy of the artifact in Jenkins.</b></font>
+
+
+ ArtifactRepo
+ JenkinsJob
+
+
+
+
+
+
+ 0
+ 0
+
+ false
+ project
+ false
+
+
+
+
+
+
+
+ /Build/Core/CassandraStateValidated
+
+ SUCCESS
+ 0
+ BLUE
+ true
+
+
+
+
+
+
+
+ 2
+
+
+ https://github.com/project-sunbird/sunbird-devops.git
+
+
+
+
+ ${public_repo_branch}
+
+
+ false
+
+
+
+ true
+ false
+
+ 0
+ false
+
+
+
+ pipelines/upload/artifacts/Jenkinsfile
+ false
+
+
+ false
+
\ No newline at end of file
diff --git a/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/CassandraTrigger/config.xml b/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/CassandraTrigger/config.xml
index e99180b3a..19b638685 100644
--- a/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/CassandraTrigger/config.xml
+++ b/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/CassandraTrigger/config.xml
@@ -1,5 +1,4 @@
-
-
+
@@ -8,19 +7,19 @@
-
+
false
-1
- -1
+ 10
-1
- 5
+ 1
-
+
false
false
@@ -51,20 +50,21 @@ ArtifactRepo - Upload and keep a copy of the artifact in Jenkins, JenkinsJob - J
-
+
0
0
false
project
false
-
+
+
-
- Build/Core/CassandraTrigger
+
+ /Build/Core/CassandraTrigger
SUCCESS
0
@@ -75,8 +75,8 @@ ArtifactRepo - Upload and keep a copy of the artifact in Jenkins, JenkinsJob - J
-
-
+
+
2
@@ -94,7 +94,7 @@ ArtifactRepo - Upload and keep a copy of the artifact in Jenkins, JenkinsJob - J
true
false
-
+
0
false
diff --git a/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/Cert/config.xml b/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/Cert/config.xml
index fc0675046..fbf6fc242 100644
--- a/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/Cert/config.xml
+++ b/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/Cert/config.xml
@@ -1,5 +1,4 @@
-
-
+
@@ -8,19 +7,19 @@
-
+
false
-1
- -1
+ 10
-1
- 5
+ 1
-
+
false
false
@@ -35,7 +34,7 @@
image_tag
<font color=darkgreen size=2><b>OPTIONAL: Specify the tag to upload a specific image version to the container registry.</b></font>
-
+
false
@@ -51,19 +50,20 @@ ArtifactRepo - Push the docker image to container registry.
-
+
0
0
false
project
false
-
+
+
-
+
/Build/Core/Cert
SUCCESS
@@ -75,8 +75,8 @@ ArtifactRepo - Push the docker image to container registry.
-
-
+
+
2
@@ -94,7 +94,7 @@ ArtifactRepo - Push the docker image to container registry.
true
false
-
+
0
false
diff --git a/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/CertRegistryService/config.xml b/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/CertRegistryService/config.xml
index 418c706b3..4748b3d7b 100644
--- a/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/CertRegistryService/config.xml
+++ b/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/CertRegistryService/config.xml
@@ -1,5 +1,4 @@
-
-
+
@@ -8,15 +7,15 @@
-
+
false
-1
- -1
+ 10
-1
- 5
+ 1
@@ -35,7 +34,7 @@
image_tag
<font color=darkgreen size=2><b>OPTIONAL: Specify the tag to upload a specific image version to the container registry.</b></font>
-
+
false
@@ -51,19 +50,20 @@ ArtifactRepo - Push the docker image to container registry.
-
+
0
0
false
project
false
-
+
+
-
+
/Build/Core/CertRegistryService
SUCCESS
@@ -75,8 +75,8 @@ ArtifactRepo - Push the docker image to container registry.
-
-
+
+
2
@@ -94,7 +94,7 @@ ArtifactRepo - Push the docker image to container registry.
true
false
-
+
0
false
diff --git a/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/Config/config.xml b/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/Config/config.xml
new file mode 100644
index 000000000..874765187
--- /dev/null
+++ b/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/Config/config.xml
@@ -0,0 +1,108 @@
+
+
+
+
+ hudson.model.ParametersDefinitionProperty
+ com.sonyericsson.rebuild.RebuildSettings
+
+
+
+
+ false
+
+
+
+ -1
+ 10
+ -1
+ 1
+
+
+
+
+ false
+ false
+
+
+
+
+ absolute_job_path
+ <font color=dimgray size=2><b>Do not change this value! The metadata.json will be copied from this job.</b></font>
+ Build/Core/Config
+ false
+
+
+ image_tag
+ <font color=darkgreen size=2><b>OPTIONAL: Specify the tag to upload a specific image version to the container registry.</b></font>
+
+ false
+
+
+ artifact_source
+ <font color=dimgray size=2><b>
+ArtifactRepo - Push the docker image to container registry.
+</b></font>
+
+
+ ArtifactRepo
+
+
+
+
+
+
+ 0
+ 0
+
+ false
+ project
+ false
+
+
+
+
+
+
+
+ /Build/Core/Config
+
+ SUCCESS
+ 0
+ BLUE
+ true
+
+
+
+
+
+
+
+ 2
+
+
+ https://github.com/project-sunbird/sunbird-devops.git
+
+
+
+
+ ${public_repo_branch}
+
+
+ false
+
+
+
+ true
+ false
+
+ 1
+ false
+
+
+
+ pipelines/upload/docker/Jenkinsfile
+ false
+
+
+ false
+
\ No newline at end of file
diff --git a/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/Content/config.xml b/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/Content/config.xml
index ff83188c2..3cd813b45 100644
--- a/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/Content/config.xml
+++ b/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/Content/config.xml
@@ -1,22 +1,21 @@
-
-
+
-
+
hudson.model.ParametersDefinitionProperty
com.sonyericsson.rebuild.RebuildSettings
-
+
false
-1
- -1
+ 10
-1
- 5
+ 1
@@ -35,7 +34,7 @@
image_tag
<font color=darkgreen size=2><b>OPTIONAL: Specify the tag to upload a specific image version to the container registry.</b></font>
-
+
false
@@ -51,19 +50,20 @@ ArtifactRepo - Push the docker image to container registry.
-
+
0
0
false
project
false
-
+
+
-
+
/Build/Core/Content
SUCCESS
@@ -75,8 +75,8 @@ ArtifactRepo - Push the docker image to container registry.
-
-
+
+
2
@@ -94,7 +94,7 @@ ArtifactRepo - Push the docker image to container registry.
true
false
-
+
0
false
diff --git a/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/EncService/config.xml b/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/EncService/config.xml
index 77c780c03..b6ac09120 100644
--- a/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/EncService/config.xml
+++ b/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/EncService/config.xml
@@ -1,5 +1,4 @@
-
-
+
@@ -8,19 +7,19 @@
-
+
false
-1
- -1
+ 10
-1
- 5
+ 1
-
+
false
false
@@ -35,7 +34,7 @@
image_tag
<font color=darkgreen size=2><b>OPTIONAL: Specify the tag to upload a specific image version to the container registry.</b></font>
-
+
false
@@ -51,19 +50,20 @@ ArtifactRepo - Push the docker image to container registry.
-
+
0
0
false
project
false
-
+
+
-
+
/Build/Core/EncService
SUCCESS
@@ -75,8 +75,8 @@ ArtifactRepo - Push the docker image to container registry.
-
-
+
+
2
@@ -94,7 +94,7 @@ ArtifactRepo - Push the docker image to container registry.
true
false
-
+
0
false
diff --git a/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/Groups/config.xml b/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/Groups/config.xml
new file mode 100644
index 000000000..e16303586
--- /dev/null
+++ b/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/Groups/config.xml
@@ -0,0 +1,108 @@
+
+
+
+
+ hudson.model.ParametersDefinitionProperty
+ com.sonyericsson.rebuild.RebuildSettings
+
+
+
+
+ false
+
+
+
+ -1
+ 10
+ -1
+ 1
+
+
+
+
+ false
+ false
+
+
+
+
+ absolute_job_path
+ <font color=dimgray size=2><b>Do not change this value! The metadata.json will be copied from this job.</b></font>
+ Build/Core/Groups
+ false
+
+
+ image_tag
+ <font color=darkgreen size=2><b>OPTIONAL: Specify the tag to upload a specific image version to the container registry.</b></font>
+
+ false
+
+
+ artifact_source
+ <font color=dimgray size=2><b>
+ArtifactRepo - Push the docker image to container registry.
+</b></font>
+
+
+ ArtifactRepo
+
+
+
+
+
+
+ 0
+ 0
+
+ false
+ project
+ false
+
+
+
+
+
+
+
+ /Build/Core/Groups
+
+ SUCCESS
+ 0
+ BLUE
+ true
+
+
+
+
+
+
+
+ 2
+
+
+ https://github.com/project-sunbird/sunbird-devops.git
+
+
+
+
+ ${public_repo_branch}
+
+
+ false
+
+
+
+ true
+ false
+
+ 0
+ false
+
+
+
+ pipelines/upload/docker/Jenkinsfile
+ false
+
+
+ false
+
\ No newline at end of file
diff --git a/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/Hawkeye-superset/config.xml b/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/Hawkeye-superset/config.xml
new file mode 100644
index 000000000..ab8dbb6ef
--- /dev/null
+++ b/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/Hawkeye-superset/config.xml
@@ -0,0 +1,108 @@
+
+
+
+
+ hudson.model.ParametersDefinitionProperty
+ com.sonyericsson.rebuild.RebuildSettings
+
+
+
+
+ false
+
+
+
+ -1
+ 10
+ -1
+ 1
+
+
+
+
+ false
+ false
+
+
+
+
+ absolute_job_path
+ <font color=dimgray size=2><b>Do not change this value! The metadata.json will be copied from this job.</b></font>
+ Build/Core/Hawkeye-superset
+ false
+
+
+ image_tag
+ <font color=darkgreen size=2><b>OPTIONAL: Specify the tag to upload a specific image version to the container registry.</b></font>
+
+ false
+
+
+ artifact_source
+ <font color=dimgray size=2><b>
+ArtifactRepo - Push the docker image to container registry.
+</b></font>
+
+
+ ArtifactRepo
+
+
+
+
+
+
+ 0
+ 0
+
+ false
+ project
+ false
+
+
+
+
+
+
+
+ /Build/Core/Hawkeye-superset
+
+ SUCCESS
+ 0
+ BLUE
+ true
+
+
+
+
+
+
+
+ 2
+
+
+ https://github.com/project-sunbird/sunbird-devops.git
+
+
+
+
+ ${public_repo_branch}
+
+
+ false
+
+
+
+ true
+ false
+
+ 1
+ false
+
+
+
+ pipelines/upload/docker/Jenkinsfile
+ false
+
+
+ false
+
\ No newline at end of file
diff --git a/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/Keycloak/config.xml b/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/Keycloak/config.xml
index 56e5f8b78..825932b1b 100644
--- a/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/Keycloak/config.xml
+++ b/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/Keycloak/config.xml
@@ -1,26 +1,25 @@
-
-
+
-
+
hudson.model.ParametersDefinitionProperty
com.sonyericsson.rebuild.RebuildSettings
-
+
false
-1
- -1
+ 10
-1
- 5
+ 1
-
+
false
false
@@ -51,19 +50,20 @@ ArtifactRepo - Upload and keep a copy of the artifact in Jenkins, JenkinsJob - J
-
+
0
0
false
project
false
-
+
+
-
+
/Build/Core/Keycloak
SUCCESS
@@ -75,8 +75,8 @@ ArtifactRepo - Upload and keep a copy of the artifact in Jenkins, JenkinsJob - J
-
-
+
+
2
@@ -94,7 +94,7 @@ ArtifactRepo - Upload and keep a copy of the artifact in Jenkins, JenkinsJob - J
true
false
-
+
1
false
@@ -105,4 +105,4 @@ ArtifactRepo - Upload and keep a copy of the artifact in Jenkins, JenkinsJob - J
false
-
+
\ No newline at end of file
diff --git a/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/KnowledgeMW/config.xml b/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/KnowledgeMW/config.xml
index 1d398f884..b8352ba77 100644
--- a/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/KnowledgeMW/config.xml
+++ b/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/KnowledgeMW/config.xml
@@ -1,5 +1,4 @@
-
-
+
@@ -8,15 +7,15 @@
-
+
false
-1
- -1
+ 10
-1
- 5
+ 1
@@ -35,7 +34,7 @@
image_tag
<font color=darkgreen size=2><b>OPTIONAL: Specify the tag to upload a specific image version to the container registry.</b></font>
-
+
false
@@ -51,19 +50,20 @@ ArtifactRepo - Push the docker image to container registry.
-
+
0
0
false
project
false
-
+
+
-
+
/Build/Core/KnowledgeMW
SUCCESS
@@ -75,8 +75,8 @@ ArtifactRepo - Push the docker image to container registry.
-
-
+
+
2
@@ -94,7 +94,7 @@ ArtifactRepo - Push the docker image to container registry.
true
false
-
+
1
false
diff --git a/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/Learner/config.xml b/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/Learner/config.xml
index 28100d104..a0f41171e 100644
--- a/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/Learner/config.xml
+++ b/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/Learner/config.xml
@@ -1,5 +1,4 @@
-
-
+
@@ -8,15 +7,15 @@
-
+
false
-1
- -1
+ 10
-1
- 5
+ 1
@@ -35,7 +34,7 @@
image_tag
<font color=darkgreen size=2><b>OPTIONAL: Specify the tag to upload a specific image version to the container registry.</b></font>
-
+
false
@@ -51,19 +50,20 @@ ArtifactRepo - Push the docker image to container registry.
-
+
0
0
false
project
false
-
+
+
-
+
/Build/Core/Learner
SUCCESS
@@ -75,8 +75,8 @@ ArtifactRepo - Push the docker image to container registry.
-
-
+
+
2
@@ -94,7 +94,7 @@ ArtifactRepo - Push the docker image to container registry.
true
false
-
+
0
false
diff --git a/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/Lms/config.xml b/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/Lms/config.xml
index eecb2f318..353c7d776 100644
--- a/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/Lms/config.xml
+++ b/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/Lms/config.xml
@@ -1,5 +1,4 @@
-
-
+
@@ -8,15 +7,15 @@
-
+
false
-1
- -1
+ 10
-1
- 5
+ 1
@@ -35,7 +34,7 @@
image_tag
<font color=darkgreen size=2><b>OPTIONAL: Specify the tag to upload a specific image version to the container registry.</b></font>
-
+
false
@@ -51,19 +50,20 @@ ArtifactRepo - Push the docker image to container registry.
-
+
0
0
false
project
false
-
+
+
-
+
/Build/Core/Lms
SUCCESS
@@ -75,8 +75,8 @@ ArtifactRepo - Push the docker image to container registry.
-
-
+
+
2
@@ -94,7 +94,7 @@ ArtifactRepo - Push the docker image to container registry.
true
false
-
+
0
false
diff --git a/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/Nodebb/config.xml b/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/Nodebb/config.xml
new file mode 100644
index 000000000..e74f85cc5
--- /dev/null
+++ b/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/Nodebb/config.xml
@@ -0,0 +1,108 @@
+
+
+
+
+ hudson.model.ParametersDefinitionProperty
+ com.sonyericsson.rebuild.RebuildSettings
+
+
+
+
+ false
+
+
+
+ -1
+ 10
+ -1
+ 1
+
+
+
+
+ false
+ false
+
+
+
+
+ absolute_job_path
+ <font color=dimgray size=2><b>Do not change this value! The metadata.json will be copied from this job.</b></font>
+ Build/Core/Nodebb
+ false
+
+
+ image_tag
+ <font color=darkgreen size=2><b>OPTIONAL: Specify the tag to upload a specific image version to the container registry.</b></font>
+
+ false
+
+
+ artifact_source
+ <font color=dimgray size=2><b>
+ArtifactRepo - Push the docker image to container registry.
+</b></font>
+
+
+ ArtifactRepo
+
+
+
+
+
+
+ 0
+ 0
+
+ false
+ project
+ false
+
+
+
+
+
+
+
+ /Build/Core/Nodebb
+
+ SUCCESS
+ 0
+ BLUE
+ true
+
+
+
+
+
+
+
+ 2
+
+
+ https://github.com/project-sunbird/sunbird-devops.git
+
+
+
+
+ ${public_repo_branch}
+
+
+ false
+
+
+
+ true
+ false
+
+ 1
+ false
+
+
+
+ pipelines/upload/docker/Jenkinsfile
+ false
+
+
+ false
+
\ No newline at end of file
diff --git a/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/Notification/config.xml b/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/Notification/config.xml
index a6f84bf6e..8741ed787 100644
--- a/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/Notification/config.xml
+++ b/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/Notification/config.xml
@@ -1,5 +1,4 @@
-
-
+
@@ -8,15 +7,15 @@
-
+
false
-1
- -1
+ 10
-1
- 5
+ 1
@@ -35,7 +34,7 @@
image_tag
<font color=darkgreen size=2><b>OPTIONAL: Specify the tag to upload a specific image version to the container registry.</b></font>
-
+
false
@@ -51,19 +50,20 @@ ArtifactRepo - Push the docker image to container registry.
-
+
0
0
false
project
false
-
+
+
-
+
/Build/Core/Notification
SUCCESS
@@ -75,8 +75,8 @@ ArtifactRepo - Push the docker image to container registry.
-
-
+
+
2
@@ -94,7 +94,7 @@ ArtifactRepo - Push the docker image to container registry.
true
false
-
+
0
false
diff --git a/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/Player/config.xml b/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/Player/config.xml
index a0c8fd7a6..d14adf080 100644
--- a/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/Player/config.xml
+++ b/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/Player/config.xml
@@ -1,5 +1,4 @@
-
-
+
@@ -8,19 +7,19 @@
-
+
false
-1
- -1
+ 10
-1
- 5
+ 1
-
+
false
false
@@ -35,7 +34,7 @@
image_tag
<font color=darkgreen size=2><b>OPTIONAL: Specify the tag to upload a specific image version to the container registry.</b></font>
-
+
false
@@ -51,19 +50,20 @@ ArtifactRepo - Push the docker image to container registry.
-
+
0
0
false
project
false
-
+
+
-
+
/Build/Core/Player
SUCCESS
@@ -75,8 +75,8 @@ ArtifactRepo - Push the docker image to container registry.
-
-
+
+
2
@@ -94,7 +94,7 @@ ArtifactRepo - Push the docker image to container registry.
true
false
-
+
1
false
diff --git a/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/Print/config.xml b/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/Print/config.xml
index df8959b6a..ef761534e 100644
--- a/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/Print/config.xml
+++ b/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/Print/config.xml
@@ -1,5 +1,4 @@
-
-
+
@@ -8,15 +7,15 @@
-
+
false
-1
- -1
+ 10
-1
- 5
+ 1
@@ -35,7 +34,7 @@
image_tag
<font color=darkgreen size=2><b>OPTIONAL: Specify the tag to upload a specific image version to the container registry.</b></font>
-
+
false
@@ -51,19 +50,20 @@ ArtifactRepo - Push the docker image to container registry.
-
+
0
0
false
project
false
-
+
+
-
+
/Build/Core/Print
SUCCESS
@@ -75,8 +75,8 @@ ArtifactRepo - Push the docker image to container registry.
-
-
+
+
2
@@ -94,7 +94,7 @@ ArtifactRepo - Push the docker image to container registry.
true
false
-
+
1
false
diff --git a/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/Proxy/config.xml b/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/Proxy/config.xml
index 281955d43..eff80798a 100644
--- a/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/Proxy/config.xml
+++ b/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/Proxy/config.xml
@@ -1,26 +1,25 @@
-
-
+
-
+
hudson.model.ParametersDefinitionProperty
com.sonyericsson.rebuild.RebuildSettings
-
+
false
-1
- -1
+ 10
-1
- 5
+ 1
-
+
false
false
@@ -35,7 +34,7 @@
image_tag
<font color=darkgreen size=2><b>OPTIONAL: Specify the tag to upload a specific image version to the container registry.</b></font>
-
+
false
@@ -51,19 +50,20 @@ ArtifactRepo - Push the docker image to container registry.
-
+
0
0
false
project
false
-
+
+
-
+
/Build/Core/Proxy
SUCCESS
@@ -75,8 +75,8 @@ ArtifactRepo - Push the docker image to container registry.
-
-
+
+
2
@@ -94,7 +94,7 @@ ArtifactRepo - Push the docker image to container registry.
true
false
-
+
1
false
@@ -105,4 +105,4 @@ ArtifactRepo - Push the docker image to container registry.
false
-
+
\ No newline at end of file
diff --git a/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/Report/config.xml b/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/Report/config.xml
new file mode 100644
index 000000000..6e6022264
--- /dev/null
+++ b/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/Report/config.xml
@@ -0,0 +1,108 @@
+
+
+
+
+ hudson.model.ParametersDefinitionProperty
+ com.sonyericsson.rebuild.RebuildSettings
+
+
+
+
+ false
+
+
+
+ -1
+ 10
+ -1
+ 1
+
+
+
+
+ false
+ false
+
+
+
+
+ absolute_job_path
+ <font color=dimgray size=2><b>Do not change this value! The metadata.json will be copied from this job.</b></font>
+ Build/Core/Report
+ false
+
+
+ image_tag
+ <font color=darkgreen size=2><b>OPTIONAL: Specify the tag to upload a specific image version to the container registry.</b></font>
+
+ false
+
+
+ artifact_source
+ <font color=dimgray size=2><b>
+ArtifactRepo - Push the docker image to container registry.
+</b></font>
+
+
+ ArtifactRepo
+
+
+
+
+
+
+ 0
+ 0
+
+ false
+ project
+ false
+
+
+
+
+
+
+
+ /Build/Core/Report
+
+ SUCCESS
+ 0
+ BLUE
+ true
+
+
+
+
+
+
+
+ 2
+
+
+ https://github.com/project-sunbird/sunbird-devops.git
+
+
+
+
+ ${public_repo_branch}
+
+
+ false
+
+
+
+ true
+ false
+
+ 0
+ false
+
+
+
+ pipelines/upload/docker/Jenkinsfile
+ false
+
+
+ false
+
\ No newline at end of file
diff --git a/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/Router/config.xml b/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/Router/config.xml
new file mode 100644
index 000000000..2f6dbc4e1
--- /dev/null
+++ b/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/Router/config.xml
@@ -0,0 +1,108 @@
+
+
+
+
+ hudson.model.ParametersDefinitionProperty
+ com.sonyericsson.rebuild.RebuildSettings
+
+
+
+
+ false
+
+
+
+ -1
+ 10
+ -1
+ 1
+
+
+
+
+ false
+ false
+
+
+
+
+ absolute_job_path
+ <font color=dimgray size=2><b>Do not change this value! The metadata.json will be copied from this job.</b></font>
+ Build/Core/Router
+ false
+
+
+ image_tag
+ <font color=darkgreen size=2><b>OPTIONAL: Specify the tag to upload a specific image version to the container registry.</b></font>
+
+ false
+
+
+ artifact_source
+ <font color=dimgray size=2><b>
+ArtifactRepo - Push the docker image to container registry.
+</b></font>
+
+
+ ArtifactRepo
+
+
+
+
+
+
+ 0
+ 0
+
+ false
+ project
+ false
+
+
+
+
+
+
+
+ /Build/Core/Router
+
+ SUCCESS
+ 0
+ BLUE
+ true
+
+
+
+
+
+
+
+ 2
+
+
+ https://github.com/project-sunbird/sunbird-devops.git
+
+
+
+
+ ${public_repo_branch}
+
+
+ false
+
+
+
+ true
+ false
+
+ 0
+ false
+
+
+
+ pipelines/upload/docker/Jenkinsfile
+ false
+
+
+ false
+
\ No newline at end of file
diff --git a/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/Search/config.xml b/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/Search/config.xml
new file mode 100644
index 000000000..c5c50f262
--- /dev/null
+++ b/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/Search/config.xml
@@ -0,0 +1,108 @@
+
+
+
+
+ hudson.model.ParametersDefinitionProperty
+ com.sonyericsson.rebuild.RebuildSettings
+
+
+
+
+ false
+
+
+
+ -1
+ 10
+ -1
+ 1
+
+
+
+
+ false
+ false
+
+
+
+
+ absolute_job_path
+ <font color=dimgray size=2><b>Do not change this value! The metadata.json will be copied from this job.</b></font>
+ Build/Core/Search
+ false
+
+
+ image_tag
+ <font color=darkgreen size=2><b>OPTIONAL: Specify the tag to upload a specific image version to the container registry.</b></font>
+
+ false
+
+
+ artifact_source
+ <font color=dimgray size=2><b>
+ArtifactRepo - Push the docker image to container registry.
+</b></font>
+
+
+ ArtifactRepo
+
+
+
+
+
+
+ 0
+ 0
+
+ false
+ project
+ false
+
+
+
+
+
+
+
+ /Build/Core/Search
+
+ SUCCESS
+ 0
+ BLUE
+ true
+
+
+
+
+
+
+
+ 2
+
+
+ https://github.com/project-sunbird/sunbird-devops.git
+
+
+
+
+ ${public_repo_branch}
+
+
+ false
+
+
+
+ true
+ false
+
+ 0
+ false
+
+
+
+ pipelines/upload/docker/Jenkinsfile
+ false
+
+
+ false
+
\ No newline at end of file
diff --git a/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/Taxonomy/config.xml b/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/Taxonomy/config.xml
new file mode 100644
index 000000000..22173d79e
--- /dev/null
+++ b/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/Taxonomy/config.xml
@@ -0,0 +1,108 @@
+
+
+
+
+ hudson.model.ParametersDefinitionProperty
+ com.sonyericsson.rebuild.RebuildSettings
+
+
+
+
+ false
+
+
+
+ -1
+ 10
+ -1
+ 1
+
+
+
+
+ false
+ false
+
+
+
+
+ absolute_job_path
+ <font color=dimgray size=2><b>Do not change this value! The metadata.json will be copied from this job.</b></font>
+ Build/Core/Taxonomy
+ false
+
+
+ image_tag
+ <font color=darkgreen size=2><b>OPTIONAL: Specify the tag to upload a specific image version to the container registry.</b></font>
+
+ false
+
+
+ artifact_source
+ <font color=dimgray size=2><b>
+ArtifactRepo - Push the docker image to container registry.
+</b></font>
+
+
+ ArtifactRepo
+
+
+
+
+
+
+ 0
+ 0
+
+ false
+ project
+ false
+
+
+
+
+
+
+
+ /Build/Core/Taxonomy
+
+ SUCCESS
+ 0
+ BLUE
+ true
+
+
+
+
+
+
+
+ 2
+
+
+ https://github.com/project-sunbird/sunbird-devops.git
+
+
+
+
+ ${public_repo_branch}
+
+
+ false
+
+
+
+ true
+ false
+
+ 0
+ false
+
+
+
+ pipelines/upload/docker/Jenkinsfile
+ false
+
+
+ false
+
\ No newline at end of file
diff --git a/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/Telemetry/config.xml b/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/Telemetry/config.xml
index 9bb6a0028..836428207 100644
--- a/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/Telemetry/config.xml
+++ b/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/Telemetry/config.xml
@@ -1,26 +1,25 @@
-
-
+
-
+
hudson.model.ParametersDefinitionProperty
com.sonyericsson.rebuild.RebuildSettings
-
+
false
-1
- -1
+ 10
-1
- 5
+ 1
-
+
false
false
@@ -35,7 +34,7 @@
image_tag
<font color=darkgreen size=2><b>OPTIONAL: Specify the tag to upload a specific image version to the container registry.</b></font>
-
+
false
@@ -51,19 +50,20 @@ ArtifactRepo - Push the docker image to container registry.
-
+
0
0
false
project
false
-
+
+
-
+
/Build/Core/Telemetry
SUCCESS
@@ -75,8 +75,8 @@ ArtifactRepo - Push the docker image to container registry.
-
-
+
+
2
@@ -94,7 +94,7 @@ ArtifactRepo - Push the docker image to container registry.
true
false
-
+
1
false
@@ -105,4 +105,4 @@ ArtifactRepo - Push the docker image to container registry.
false
-
+
\ No newline at end of file
diff --git a/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/UserOrg/config.xml b/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/UserOrg/config.xml
index 26c03bc49..103b8d979 100644
--- a/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/UserOrg/config.xml
+++ b/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/UserOrg/config.xml
@@ -1,5 +1,4 @@
-
-
+
@@ -8,19 +7,19 @@
-
+
false
-1
- -1
+ 10
-1
- 5
+ 1
-
+
false
false
@@ -35,7 +34,7 @@
image_tag
<font color=darkgreen size=2><b>OPTIONAL: Specify the tag to upload a specific image version to the container registry.</b></font>
-
+
false
@@ -51,19 +50,20 @@ ArtifactRepo - Push the docker image to container registry.
-
+
0
0
false
project
false
-
+
+
-
+
/Build/Core/UserOrg
SUCCESS
@@ -75,8 +75,8 @@ ArtifactRepo - Push the docker image to container registry.
-
-
+
+
2
@@ -94,7 +94,7 @@ ArtifactRepo - Push the docker image to container registry.
true
false
-
+
0
false
diff --git a/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/Yarn/config.xml b/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/Yarn/config.xml
index 846956588..b235988e3 100644
--- a/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/Yarn/config.xml
+++ b/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Core/jobs/Yarn/config.xml
@@ -1,5 +1,4 @@
-
-
+
@@ -8,19 +7,19 @@
-
+
false
-1
- -1
+ 10
-1
- 5
+ 1
-
+
false
false
@@ -51,19 +50,20 @@ ArtifactRepo - Upload and keep a copy of the artifact in Jenkins, JenkinsJob - J
-
+
0
0
false
project
false
-
+
+
-
+
/Build/Core/Yarn
SUCCESS
@@ -75,8 +75,8 @@ ArtifactRepo - Upload and keep a copy of the artifact in Jenkins, JenkinsJob - J
-
-
+
+
2
@@ -94,7 +94,7 @@ ArtifactRepo - Upload and keep a copy of the artifact in Jenkins, JenkinsJob - J
true
false
-
+
0
false
diff --git a/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/DataPipeline/config.xml b/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/DataPipeline/config.xml
index ca27afff7..92618cba9 100644
--- a/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/DataPipeline/config.xml
+++ b/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/DataPipeline/config.xml
@@ -1,12 +1,12 @@
-
+
-
+
-
-
+
+
diff --git a/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/DataPipeline/jobs/AdhocScripts/config.xml b/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/DataPipeline/jobs/AdhocScripts/config.xml
new file mode 100644
index 000000000..9a042704a
--- /dev/null
+++ b/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/DataPipeline/jobs/AdhocScripts/config.xml
@@ -0,0 +1,108 @@
+
+
+
+
+ hudson.model.ParametersDefinitionProperty
+ com.sonyericsson.rebuild.RebuildSettings
+
+
+
+
+ false
+
+
+
+ -1
+ 10
+ -1
+ 1
+
+
+
+
+ false
+ false
+
+
+
+
+ absolute_job_path
+ <font color=dimgray size=2><b>Do not change this value! The metadata.json will be copied from this job.</b></font>
+ Build/DataPipeline/AdhocScripts
+ false
+
+
+ build_number
+ <font color=darkgreen size=2><b>OPTIONAL: Specify the build job number to upload / copy the artifact built in that job.</b></font>
+ lastSuccessfulBuild
+ false
+
+
+ artifact_source
+ <font color=dimgray size=2><b>
+ArtifactRepo - Upload and keep a copy of the artifact in Jenkins, JenkinsJob - Just keep a copy of the artifact in Jenkins.</b></font>
+
+
+ ArtifactRepo
+ JenkinsJob
+
+
+
+
+
+
+ 0
+ 0
+
+ false
+ project
+ false
+
+
+
+
+
+
+
+ /Build/DataPipeline/AdhocScripts
+
+ SUCCESS
+ 0
+ BLUE
+ true
+
+
+
+
+
+
+
+ 2
+
+
+ https://github.com/project-sunbird/sunbird-data-pipeline.git
+
+
+
+
+ ${public_repo_branch}
+
+
+ false
+
+
+
+ true
+ false
+
+ 1
+ false
+
+
+
+ pipelines/upload/Jenkinsfile
+ false
+
+
+ false
+
\ No newline at end of file
diff --git a/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/DataPipeline/jobs/Analytics/config.xml b/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/DataPipeline/jobs/Analytics/config.xml
index 7010abb55..b4458fb7c 100644
--- a/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/DataPipeline/jobs/Analytics/config.xml
+++ b/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/DataPipeline/jobs/Analytics/config.xml
@@ -1,5 +1,4 @@
-
-
+
@@ -8,15 +7,15 @@
-
+
false
-1
- -1
+ 10
-1
- 5
+ 1
@@ -51,19 +50,20 @@ ArtifactRepo - Upload and keep a copy of the artifact in Jenkins, JenkinsJob - J
-
+
0
0
false
project
false
-
+
+
-
+
/Build/DataPipeline/Analytics
SUCCESS
@@ -75,8 +75,8 @@ ArtifactRepo - Upload and keep a copy of the artifact in Jenkins, JenkinsJob - J
-
-
+
+
2
@@ -94,7 +94,7 @@ ArtifactRepo - Upload and keep a copy of the artifact in Jenkins, JenkinsJob - J
true
false
-
+
1
false
diff --git a/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/DataPipeline/jobs/AnalyticsCore/config.xml b/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/DataPipeline/jobs/AnalyticsCore/config.xml
new file mode 100644
index 000000000..6de1a9644
--- /dev/null
+++ b/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/DataPipeline/jobs/AnalyticsCore/config.xml
@@ -0,0 +1,108 @@
+
+
+
+
+ hudson.model.ParametersDefinitionProperty
+ com.sonyericsson.rebuild.RebuildSettings
+
+
+
+
+ false
+
+
+
+ -1
+ 10
+ -1
+ 1
+
+
+
+
+ false
+ false
+
+
+
+
+ absolute_job_path
+ <font color=dimgray size=2><b>Do not change this value! The metadata.json will be copied from this job.</b></font>
+ Build/DataPipeline/AnalyticsCore
+ false
+
+
+ build_number
+ <font color=darkgreen size=2><b>OPTIONAL: Specify the build job number to upload / copy the artifact built in that job.</b></font>
+ lastSuccessfulBuild
+ false
+
+
+ artifact_source
+ <font color=dimgray size=2><b>
+ArtifactRepo - Upload and keep a copy of the artifact in Jenkins, JenkinsJob - Just keep a copy of the artifact in Jenkins.</b></font>
+
+
+ ArtifactRepo
+ JenkinsJob
+
+
+
+
+
+
+ 0
+ 0
+
+ false
+ project
+ false
+
+
+
+
+
+
+
+ /Build/DataPipeline/AnalyticsCore
+
+ SUCCESS
+ 0
+ BLUE
+ true
+
+
+
+
+
+
+
+ 2
+
+
+ https://github.com/project-sunbird/sunbird-data-pipeline.git
+
+
+
+
+ ${public_repo_branch}
+
+
+ false
+
+
+
+ true
+ false
+
+ 1
+ false
+
+
+
+ pipelines/upload/Jenkinsfile
+ false
+
+
+ false
+
\ No newline at end of file
diff --git a/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/DataPipeline/jobs/AnalyticsService/config.xml b/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/DataPipeline/jobs/AnalyticsService/config.xml
new file mode 100644
index 000000000..7f16a721f
--- /dev/null
+++ b/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/DataPipeline/jobs/AnalyticsService/config.xml
@@ -0,0 +1,108 @@
+
+
+
+
+ hudson.model.ParametersDefinitionProperty
+ com.sonyericsson.rebuild.RebuildSettings
+
+
+
+
+ false
+
+
+
+ -1
+ 10
+ -1
+ 1
+
+
+
+
+ false
+ false
+
+
+
+
+ absolute_job_path
+ <font color=dimgray size=2><b>Do not change this value! The metadata.json will be copied from this job.</b></font>
+ Build/DataPipeline/AnalyticsService
+ false
+
+
+ build_number
+ <font color=darkgreen size=2><b>OPTIONAL: Specify the build job number to upload / copy the artifact built in that job.</b></font>
+ lastSuccessfulBuild
+ false
+
+
+ artifact_source
+ <font color=dimgray size=2><b>
+ArtifactRepo - Upload and keep a copy of the artifact in Jenkins, JenkinsJob - Just keep a copy of the artifact in Jenkins.</b></font>
+
+
+ ArtifactRepo
+ JenkinsJob
+
+
+
+
+
+
+ 0
+ 0
+
+ false
+ project
+ false
+
+
+
+
+
+
+
+ /Build/DataPipeline/AnalyticsService
+
+ SUCCESS
+ 0
+ BLUE
+ true
+
+
+
+
+
+
+
+ 2
+
+
+ https://github.com/project-sunbird/sunbird-data-pipeline.git
+
+
+
+
+ ${public_repo_branch}
+
+
+ false
+
+
+
+ true
+ false
+
+ 1
+ false
+
+
+
+ pipelines/upload/Jenkinsfile
+ false
+
+
+ false
+
\ No newline at end of file
diff --git a/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/DataPipeline/jobs/ApiModule/config.xml b/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/DataPipeline/jobs/ApiModule/config.xml
index 2f3f7f3cd..82bdc7efc 100644
--- a/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/DataPipeline/jobs/ApiModule/config.xml
+++ b/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/DataPipeline/jobs/ApiModule/config.xml
@@ -1,5 +1,4 @@
-
-
+
@@ -8,15 +7,15 @@
-
+
false
-1
- -1
+ 10
-1
- 5
+ 1
@@ -35,7 +34,7 @@
image_tag
<font color=darkgreen size=2><b>OPTIONAL: Specify the tag to upload a specific image version to the container registry.</b></font>
-
+
false
@@ -51,20 +50,21 @@ ArtifactRepo - Push the docker image to container registry.
-
+
0
0
false
project
false
-
+
+
-
- Build/DataPipeline/ApiModule
+
+ /Build/DataPipeline/ApiModule
SUCCESS
0
@@ -75,12 +75,12 @@ ArtifactRepo - Push the docker image to container registry.
-
-
+
+
2
- https://github.com/project-sunbird/sunbird-devops.git
+ https://github.com/project-sunbird/sunbird-data-pipeline.git
@@ -94,7 +94,7 @@ ArtifactRepo - Push the docker image to container registry.
true
false
-
+
1
false
diff --git a/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/DataPipeline/jobs/CoreDataProducts/config.xml b/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/DataPipeline/jobs/CoreDataProducts/config.xml
new file mode 100644
index 000000000..f93395f5e
--- /dev/null
+++ b/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/DataPipeline/jobs/CoreDataProducts/config.xml
@@ -0,0 +1,108 @@
+
+
+
+
+ hudson.model.ParametersDefinitionProperty
+ com.sonyericsson.rebuild.RebuildSettings
+
+
+
+
+ false
+
+
+
+ -1
+ 10
+ -1
+ 1
+
+
+
+
+ false
+ false
+
+
+
+
+ absolute_job_path
+ <font color=dimgray size=2><b>Do not change this value! The metadata.json will be copied from this job.</b></font>
+ Build/DataPipeline/CoreDataProducts
+ false
+
+
+ build_number
+ <font color=darkgreen size=2><b>OPTIONAL: Specify the build job number to upload / copy the artifact built in that job.</b></font>
+ lastSuccessfulBuild
+ false
+
+
+ artifact_source
+ <font color=dimgray size=2><b>
+ArtifactRepo - Upload and keep a copy of the artifact in Jenkins, JenkinsJob - Just keep a copy of the artifact in Jenkins.</b></font>
+
+
+ ArtifactRepo
+ JenkinsJob
+
+
+
+
+
+
+ 0
+ 0
+
+ false
+ project
+ false
+
+
+
+
+
+
+
+ /Build/DataPipeline/CoreDataProducts
+
+ SUCCESS
+ 0
+ BLUE
+ true
+
+
+
+
+
+
+
+ 2
+
+
+ https://github.com/project-sunbird/sunbird-data-pipeline.git
+
+
+
+
+ ${public_repo_branch}
+
+
+ false
+
+
+
+ true
+ false
+
+ 1
+ false
+
+
+
+ pipelines/upload/Jenkinsfile
+ false
+
+
+ false
+
\ No newline at end of file
diff --git a/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/DataPipeline/jobs/DataPipeline/config.xml b/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/DataPipeline/jobs/DataPipeline/config.xml
index d3a16f329..e23abe6fc 100644
--- a/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/DataPipeline/jobs/DataPipeline/config.xml
+++ b/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/DataPipeline/jobs/DataPipeline/config.xml
@@ -1,5 +1,4 @@
-
-
+
@@ -8,15 +7,15 @@
-
+
false
-1
- -1
+ 10
-1
- 5
+ 1
@@ -51,19 +50,20 @@ ArtifactRepo - Upload and keep a copy of the artifact in Jenkins, JenkinsJob - J
-
+
0
0
false
project
false
-
+
+
-
+
/Build/DataPipeline/DataPipeline
SUCCESS
@@ -75,8 +75,8 @@ ArtifactRepo - Upload and keep a copy of the artifact in Jenkins, JenkinsJob - J
-
-
+
+
2
@@ -94,7 +94,7 @@ ArtifactRepo - Upload and keep a copy of the artifact in Jenkins, JenkinsJob - J
true
false
-
+
1
false
diff --git a/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/DataPipeline/jobs/DataReplay/config.xml b/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/DataPipeline/jobs/DataReplay/config.xml
new file mode 100644
index 000000000..fa4592573
--- /dev/null
+++ b/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/DataPipeline/jobs/DataReplay/config.xml
@@ -0,0 +1,108 @@
+
+
+
+
+ hudson.model.ParametersDefinitionProperty
+ com.sonyericsson.rebuild.RebuildSettings
+
+
+
+
+ false
+
+
+
+ -1
+ 10
+ -1
+ 1
+
+
+
+
+ false
+ false
+
+
+
+
+ absolute_job_path
+ <font color=dimgray size=2><b>Do not change this value! The metadata.json will be copied from this job.</b></font>
+ Build/DataPipeline/DataReplay
+ false
+
+
+ build_number
+ <font color=darkgreen size=2><b>OPTIONAL: Specify the build job number to upload / copy the artifact built in that job.</b></font>
+ lastSuccessfulBuild
+ false
+
+
+ artifact_source
+ <font color=dimgray size=2><b>
+ArtifactRepo - Upload and keep a copy of the artifact in Jenkins, JenkinsJob - Just keep a copy of the artifact in Jenkins.</b></font>
+
+
+ ArtifactRepo
+ JenkinsJob
+
+
+
+
+
+
+ 0
+ 0
+
+ false
+ project
+ false
+
+
+
+
+
+
+
+ /Build/DataPipeline/DataReplay
+
+ SUCCESS
+ 0
+ BLUE
+ true
+
+
+
+
+
+
+
+ 2
+
+
+ https://github.com/project-sunbird/sunbird-data-pipeline.git
+
+
+
+
+ ${public_repo_branch}
+
+
+ false
+
+
+
+ true
+ false
+
+ 1
+ false
+
+
+
+ pipelines/upload/Jenkinsfile
+ false
+
+
+ false
+
\ No newline at end of file
diff --git a/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/DataPipeline/jobs/ETLJobs/config.xml b/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/DataPipeline/jobs/ETLJobs/config.xml
index 309207380..bd031ec62 100644
--- a/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/DataPipeline/jobs/ETLJobs/config.xml
+++ b/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/DataPipeline/jobs/ETLJobs/config.xml
@@ -1,5 +1,4 @@
-
-
+
@@ -8,15 +7,15 @@
-
+
false
-1
- -1
+ 10
-1
- 5
+ 1
@@ -51,19 +50,20 @@ ArtifactRepo - Upload and keep a copy of the artifact in Jenkins, JenkinsJob - J
-
+
0
0
false
project
false
-
+
+
-
+
/Build/DataPipeline/ETLJobs
SUCCESS
@@ -75,8 +75,8 @@ ArtifactRepo - Upload and keep a copy of the artifact in Jenkins, JenkinsJob - J
-
-
+
+
2
@@ -94,7 +94,7 @@ ArtifactRepo - Upload and keep a copy of the artifact in Jenkins, JenkinsJob - J
true
false
-
+
1
false
diff --git a/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/DataPipeline/jobs/EdDataProducts/config.xml b/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/DataPipeline/jobs/EdDataProducts/config.xml
new file mode 100644
index 000000000..6e67c6378
--- /dev/null
+++ b/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/DataPipeline/jobs/EdDataProducts/config.xml
@@ -0,0 +1,108 @@
+
+
+
+
+ hudson.model.ParametersDefinitionProperty
+ com.sonyericsson.rebuild.RebuildSettings
+
+
+
+
+ false
+
+
+
+ -1
+ 10
+ -1
+ 1
+
+
+
+
+ false
+ false
+
+
+
+
+ absolute_job_path
+ <font color=dimgray size=2><b>Do not change this value! The metadata.json will be copied from this job.</b></font>
+ Build/DataPipeline/EdDataProducts
+ false
+
+
+ build_number
+ <font color=darkgreen size=2><b>OPTIONAL: Specify the build job number to upload / copy the artifact built in that job.</b></font>
+ lastSuccessfulBuild
+ false
+
+
+ artifact_source
+ <font color=dimgray size=2><b>
+ArtifactRepo - Upload and keep a copy of the artifact in Jenkins, JenkinsJob - Just keep a copy of the artifact in Jenkins.</b></font>
+
+
+ ArtifactRepo
+ JenkinsJob
+
+
+
+
+
+
+ 0
+ 0
+
+ false
+ project
+ false
+
+
+
+
+
+
+
+ /Build/DataPipeline/EdDataProducts
+
+ SUCCESS
+ 0
+ BLUE
+ true
+
+
+
+
+
+
+
+ 2
+
+
+ https://github.com/project-sunbird/sunbird-data-pipeline.git
+
+
+
+
+ ${public_repo_branch}
+
+
+ false
+
+
+
+ true
+ false
+
+ 1
+ false
+
+
+
+ pipelines/upload/Jenkinsfile
+ false
+
+
+ false
+
\ No newline at end of file
diff --git a/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/DataPipeline/jobs/FlinkPipelineJobs/config.xml b/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/DataPipeline/jobs/FlinkPipelineJobs/config.xml
new file mode 100644
index 000000000..d05493d86
--- /dev/null
+++ b/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/DataPipeline/jobs/FlinkPipelineJobs/config.xml
@@ -0,0 +1,108 @@
+
+
+
+
+ hudson.model.ParametersDefinitionProperty
+ com.sonyericsson.rebuild.RebuildSettings
+
+
+
+
+ false
+
+
+
+ -1
+ 10
+ -1
+ 1
+
+
+
+
+ false
+ false
+
+
+
+
+ absolute_job_path
+ <font color=dimgray size=2><b>Do not change this value! The metadata.json will be copied from this job.</b></font>
+ Build/DataPipeline/FlinkPipelineJobs
+ false
+
+
+ image_tag
+ <font color=darkgreen size=2><b>OPTIONAL: Specify the tag to upload a specific image version to the container registry.</b></font>
+
+ false
+
+
+ artifact_source
+ <font color=dimgray size=2><b>
+ArtifactRepo - Push the docker image to container registry.
+</b></font>
+
+
+ ArtifactRepo
+
+
+
+
+
+
+ 0
+ 0
+
+ false
+ project
+ false
+
+
+
+
+
+
+
+ Build/DataPipeline/FlinkPipelineJobs
+
+ SUCCESS
+ 0
+ BLUE
+ true
+
+
+
+
+
+
+
+ 2
+
+
+ https://github.com/project-sunbird/sunbird-data-pipeline.git
+
+
+
+
+ ${public_repo_branch}
+
+
+ false
+
+
+
+ true
+ false
+
+ 0
+ false
+
+
+
+ kubernetes/pipelines/upload/Jenkinsfile
+ false
+
+
+ false
+
\ No newline at end of file
diff --git a/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/DataPipeline/jobs/MLWorkbench/config.xml b/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/DataPipeline/jobs/MLWorkbench/config.xml
new file mode 100644
index 000000000..953421f03
--- /dev/null
+++ b/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/DataPipeline/jobs/MLWorkbench/config.xml
@@ -0,0 +1,108 @@
+
+
+
+
+ hudson.model.ParametersDefinitionProperty
+ com.sonyericsson.rebuild.RebuildSettings
+
+
+
+
+ false
+
+
+
+ -1
+ 10
+ -1
+ 1
+
+
+
+
+ false
+ false
+
+
+
+
+ absolute_job_path
+ <font color=black size=2><b>Do not change this value! The metadata.json will be copied from this job.</b></font>
+ /Build/DataPipeline/ml-workbench
+ false
+
+
+ image_tag
+ <font color=darkgreen size=2><b>OPTIONAL: Specify the tag to upload a specific image version to the container registry.</b></font>
+
+ false
+
+
+ artifact_source
+ <font color=black size=2><b>
+ArtifactRepo - Push the docker image to container registry.
+</b></font>
+
+
+ ArtifactRepo
+
+
+
+
+
+
+ 0
+ 0
+
+ false
+ project
+ false
+
+
+
+
+
+
+
+ /Build/DataPipeline/MLWorkbench
+
+ SUCCESS
+ 0
+ BLUE
+ true
+
+
+
+
+
+
+
+ 2
+
+
+ https://github.com/project-sunbird/sunbird-data-pipeline.git
+
+
+
+
+ ${public_repo_branch}
+
+
+ false
+
+
+
+ true
+ false
+
+ 0
+ false
+
+
+
+ pipelines/upload/docker/Jenkinsfile
+ false
+
+
+ false
+
\ No newline at end of file
diff --git a/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/DataPipeline/jobs/Secor/config.xml b/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/DataPipeline/jobs/Secor/config.xml
index 7a140ec41..3a215e294 100644
--- a/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/DataPipeline/jobs/Secor/config.xml
+++ b/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/DataPipeline/jobs/Secor/config.xml
@@ -1,5 +1,4 @@
-
-
+
@@ -8,15 +7,15 @@
-
+
false
-1
- -1
+ 10
-1
- 5
+ 1
@@ -51,19 +50,20 @@ ArtifactRepo - Upload and keep a copy of the artifact in Jenkins, JenkinsJob - J
-
+
0
0
false
project
false
-
+
+
-
+
/Build/DataPipeline/Secor
SUCCESS
@@ -75,8 +75,8 @@ ArtifactRepo - Upload and keep a copy of the artifact in Jenkins, JenkinsJob - J
-
-
+
+
2
@@ -94,7 +94,7 @@ ArtifactRepo - Upload and keep a copy of the artifact in Jenkins, JenkinsJob - J
true
false
-
+
1
false
diff --git a/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/KnowledgePlatform/jobs/CassandraTrigger/config.xml b/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/KnowledgePlatform/jobs/CassandraTrigger/config.xml
index b2b55dbb5..f954ac1cb 100644
--- a/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/KnowledgePlatform/jobs/CassandraTrigger/config.xml
+++ b/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/KnowledgePlatform/jobs/CassandraTrigger/config.xml
@@ -1,5 +1,4 @@
-
-
+
@@ -8,19 +7,19 @@
-
+
false
-1
- -1
+ 10
-1
- 5
+ 1
-
+
false
false
@@ -51,19 +50,20 @@ ArtifactRepo - Upload and keep a copy of the artifact in Jenkins, JenkinsJob - J
-
+
0
0
false
project
false
-
+
+
-
+
/Build/KnowledgePlatform/CassandraTrigger
SUCCESS
@@ -75,8 +75,8 @@ ArtifactRepo - Upload and keep a copy of the artifact in Jenkins, JenkinsJob - J
-
-
+
+
2
@@ -94,7 +94,7 @@ ArtifactRepo - Upload and keep a copy of the artifact in Jenkins, JenkinsJob - J
true
false
-
+
1
false
diff --git a/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/KnowledgePlatform/jobs/Dial/config.xml b/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/KnowledgePlatform/jobs/Dial/config.xml
new file mode 100644
index 000000000..b3ae96700
--- /dev/null
+++ b/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/KnowledgePlatform/jobs/Dial/config.xml
@@ -0,0 +1,108 @@
+
+
+
+
+ hudson.model.ParametersDefinitionProperty
+ com.sonyericsson.rebuild.RebuildSettings
+
+
+
+
+ false
+
+
+
+ -1
+ 10
+ -1
+ 1
+
+
+
+
+ false
+ false
+
+
+
+
+ absolute_job_path
+ <font color=dimgray size=2><b>Do not change this value! The metadata.json will be copied from this job.</b></font>
+ Build/KnowledgePlatform/Dial
+ false
+
+
+ build_number
+ <font color=darkgreen size=2><b>OPTIONAL: Specify the build job number to upload / copy the artifact built in that job.</b></font>
+ lastSuccessfulBuild
+ false
+
+
+ artifact_source
+ <font color=dimgray size=2><b>
+ArtifactRepo - Upload and keep a copy of the artifact in Jenkins, JenkinsJob - Just keep a copy of the artifact in Jenkins.</b></font>
+
+
+ ArtifactRepo
+ JenkinsJob
+
+
+
+
+
+
+ 0
+ 0
+
+ false
+ project
+ false
+
+
+
+
+
+
+
+ /Build/KnowledgePlatform/Dial
+
+ SUCCESS
+ 0
+ BLUE
+ true
+
+
+
+
+
+
+
+ 2
+
+
+ https://github.com/project-sunbird/sunbird-learning-platform.git
+
+
+
+
+ ${public_repo_branch}
+
+
+ false
+
+
+
+ true
+ false
+
+ 1
+ false
+
+
+
+ pipelines/upload/Jenkinsfile
+ false
+
+
+ false
+
\ No newline at end of file
diff --git a/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/KnowledgePlatform/jobs/FlinkJobs/config.xml b/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/KnowledgePlatform/jobs/FlinkJobs/config.xml
new file mode 100644
index 000000000..4742bdeff
--- /dev/null
+++ b/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/KnowledgePlatform/jobs/FlinkJobs/config.xml
@@ -0,0 +1,108 @@
+
+
+
+
+ hudson.model.ParametersDefinitionProperty
+ com.sonyericsson.rebuild.RebuildSettings
+
+
+
+
+ false
+
+
+
+ -1
+ 10
+ -1
+ 1
+
+
+
+
+ false
+ false
+
+
+
+
+ absolute_job_path
+ <font color=dimgray size=2><b>Do not change this value! The metadata.json will be copied from this job.</b></font>
+ Build/KnowledgePlatform/FlinkJobs
+ false
+
+
+ image_tag
+ <font color=darkgreen size=2><b>OPTIONAL: Specify the tag to upload a specific image version to the container registry.</b></font>
+
+ false
+
+
+ artifact_source
+ <font color=dimgray size=2><b>
+ArtifactRepo - Push the docker image to container registry.
+</b></font>
+
+
+ ArtifactRepo
+
+
+
+
+
+
+ 0
+ 0
+
+ false
+ project
+ false
+
+
+
+
+
+
+
+ Build/KnowledgePlatform/FlinkJobs
+
+ SUCCESS
+ 0
+ BLUE
+ true
+
+
+
+
+
+
+
+ 2
+
+
+ https://github.com/project-sunbird/sunbird-learning-platform.git
+
+
+
+
+ ${public_repo_branch}
+
+
+ false
+
+
+
+ true
+ false
+
+ 0
+ false
+
+
+
+ kubernetes/pipelines/upload/Jenkinsfile
+ false
+
+
+ false
+
\ No newline at end of file
diff --git a/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/KnowledgePlatform/jobs/KnowledgePlatform/config.xml b/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/KnowledgePlatform/jobs/KnowledgePlatform/config.xml
index 5444de21f..8f9797800 100644
--- a/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/KnowledgePlatform/jobs/KnowledgePlatform/config.xml
+++ b/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/KnowledgePlatform/jobs/KnowledgePlatform/config.xml
@@ -1,22 +1,21 @@
-
-
+
-
+
hudson.model.ParametersDefinitionProperty
com.sonyericsson.rebuild.RebuildSettings
-
+
false
-1
- -1
+ 10
-1
- 5
+ 1
@@ -51,19 +50,20 @@ ArtifactRepo - Upload and keep a copy of the artifact in Jenkins, JenkinsJob - J
-
+
0
0
false
project
false
-
+
+
-
+
/Build/KnowledgePlatform/KnowledgePlatform
SUCCESS
@@ -75,8 +75,8 @@ ArtifactRepo - Upload and keep a copy of the artifact in Jenkins, JenkinsJob - J
-
-
+
+
2
@@ -94,7 +94,7 @@ ArtifactRepo - Upload and keep a copy of the artifact in Jenkins, JenkinsJob - J
true
false
-
+
1
false
diff --git a/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/KnowledgePlatform/jobs/Neo4j/config.xml b/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/KnowledgePlatform/jobs/Neo4j/config.xml
index e3162085b..fd7ef6097 100644
--- a/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/KnowledgePlatform/jobs/Neo4j/config.xml
+++ b/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/KnowledgePlatform/jobs/Neo4j/config.xml
@@ -1,26 +1,25 @@
-
-
+
-
+
hudson.model.ParametersDefinitionProperty
com.sonyericsson.rebuild.RebuildSettings
-
+
false
-1
- -1
+ 10
-1
- 5
+ 1
-
+
false
false
@@ -51,19 +50,20 @@ ArtifactRepo - Upload and keep a copy of the artifact in Jenkins, JenkinsJob - J
-
+
0
0
false
project
false
-
+
+
-
+
/Build/KnowledgePlatform/Neo4j
SUCCESS
@@ -75,8 +75,8 @@ ArtifactRepo - Upload and keep a copy of the artifact in Jenkins, JenkinsJob - J
-
-
+
+
2
@@ -94,7 +94,7 @@ ArtifactRepo - Upload and keep a copy of the artifact in Jenkins, JenkinsJob - J
true
false
-
+
1
false
@@ -105,4 +105,4 @@ ArtifactRepo - Upload and keep a copy of the artifact in Jenkins, JenkinsJob - J
false
-
+
\ No newline at end of file
diff --git a/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/KnowledgePlatform/jobs/SyncTool/config.xml b/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/KnowledgePlatform/jobs/SyncTool/config.xml
index 02ab22706..6a9af8f80 100644
--- a/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/KnowledgePlatform/jobs/SyncTool/config.xml
+++ b/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/KnowledgePlatform/jobs/SyncTool/config.xml
@@ -1,5 +1,4 @@
-
-
+
@@ -8,15 +7,15 @@
-
+
false
-1
- -1
+ 10
-1
- 5
+ 1
@@ -51,19 +50,20 @@ ArtifactRepo - Upload and keep a copy of the artifact in Jenkins, JenkinsJob - J
-
+
0
0
false
project
false
-
+
+
-
+
/Build/KnowledgePlatform/SyncTool
SUCCESS
@@ -75,8 +75,8 @@ ArtifactRepo - Upload and keep a copy of the artifact in Jenkins, JenkinsJob - J
-
-
+
+
2
@@ -94,7 +94,7 @@ ArtifactRepo - Upload and keep a copy of the artifact in Jenkins, JenkinsJob - J
true
false
-
+
1
false
diff --git a/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/KnowledgePlatform/jobs/Yarn/config.xml b/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/KnowledgePlatform/jobs/Yarn/config.xml
index 2d6034541..4d6a32c85 100644
--- a/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/KnowledgePlatform/jobs/Yarn/config.xml
+++ b/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/KnowledgePlatform/jobs/Yarn/config.xml
@@ -1,22 +1,21 @@
-
-
+
-
+
hudson.model.ParametersDefinitionProperty
com.sonyericsson.rebuild.RebuildSettings
-
+
false
-1
- -1
+ 10
-1
- 5
+ 1
@@ -51,19 +50,20 @@ ArtifactRepo - Upload and keep a copy of the artifact in Jenkins, JenkinsJob - J
-
+
0
0
false
project
false
-
+
+
-
+
/Build/KnowledgePlatform/Yarn
SUCCESS
@@ -75,8 +75,8 @@ ArtifactRepo - Upload and keep a copy of the artifact in Jenkins, JenkinsJob - J
-
-
+
+
2
@@ -94,7 +94,7 @@ ArtifactRepo - Upload and keep a copy of the artifact in Jenkins, JenkinsJob - J
true
false
-
+
1
false
diff --git a/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Plugins/jobs/CollectionEditor/config.xml b/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Plugins/jobs/CollectionEditor/config.xml
index 3fe005707..969a059c9 100644
--- a/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Plugins/jobs/CollectionEditor/config.xml
+++ b/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Plugins/jobs/CollectionEditor/config.xml
@@ -1,19 +1,18 @@
-
-
+
-
+
false
-1
- -1
+ 10
-1
- -1
+ 1
-
+
false
false
@@ -44,21 +43,21 @@ ArtifactRepo - Upload and keep a copy of the artifact in Jenkins, JenkinsJob - J
-
+
0
0
false
project
false
-
- 1
+
+
-
- Build/Plugins/CollectionEditor
+
+ /Build/Plugins/CollectionEditor
SUCCESS
0
@@ -69,8 +68,8 @@ ArtifactRepo - Upload and keep a copy of the artifact in Jenkins, JenkinsJob - J
-
-
+
+
2
diff --git a/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Plugins/jobs/ContentEditor/config.xml b/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Plugins/jobs/ContentEditor/config.xml
index 9b43d7d8f..9215d1024 100644
--- a/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Plugins/jobs/ContentEditor/config.xml
+++ b/deploy/jenkins/jobs/ArtifactUpload/jobs/dev/jobs/Plugins/jobs/ContentEditor/config.xml
@@ -1,19 +1,18 @@
-
-
+
-
+
false