From f7524d95d09935862fbc37d0f5c647cc2f5c6662 Mon Sep 17 00:00:00 2001 From: chirangaalwis Date: Fri, 15 Jun 2018 02:03:03 +0530 Subject: [PATCH 1/4] Introduce Kubernetes resources for Integrator with Analytics deployment --- .../integrator-analytics-1-deployment.yaml | 155 ++++ .../integrator-analytics-1-service.yaml | 106 +++ .../integrator-analytics-2-deployment.yaml | 155 ++++ .../integrator-analytics-2-service.yaml | 106 +++ .../integrator-analytics-service.yaml | 42 + .../integrator-analytics-volume-claims.yaml | 47 + .../conf/analytics/my-node-id.dat | 1 + .../conf/analytics/spark/spark-defaults.conf | 122 +++ .../confs/ei-analytics-1/conf/axis2/axis2.xml | 719 ++++++++++++++++ .../confs/ei-analytics-1/conf/carbon.xml | 695 +++++++++++++++ .../datasources/analytics-datasources.xml | 112 +++ .../conf/datasources/master-datasources.xml | 108 +++ .../ei-analytics-1/conf/event-processor.xml | 156 ++++ .../confs/ei-analytics-1/conf/registry.xml | 149 ++++ .../confs/ei-analytics-1/conf/user-mgt.xml | 260 ++++++ .../jaggeryapps/portal/configs/designer.json | 95 +++ .../conf/analytics/my-node-id.dat | 1 + .../conf/analytics/spark/spark-defaults.conf | 122 +++ .../confs/ei-analytics-2/conf/axis2/axis2.xml | 719 ++++++++++++++++ .../confs/ei-analytics-2/conf/carbon.xml | 695 +++++++++++++++ .../datasources/analytics-datasources.xml | 112 +++ .../conf/datasources/master-datasources.xml | 108 +++ .../ei-analytics-2/conf/event-processor.xml | 156 ++++ .../confs/ei-analytics-2/conf/registry.xml | 149 ++++ .../confs/ei-analytics-2/conf/user-mgt.xml | 260 ++++++ .../jaggeryapps/portal/configs/designer.json | 95 +++ .../confs/integrator/conf/axis2/axis2.xml | 800 ++++++++++++++++++ .../confs/integrator/conf/carbon.xml | 679 +++++++++++++++ .../conf/datasources/master-datasources.xml | 106 +++ .../confs/integrator/conf/registry.xml | 150 ++++ .../confs/integrator/conf/user-mgt.xml | 260 ++++++ .../MessageFlowConfigurationPublisher.xml | 13 + .../MessageFlowStatisticsPublisher.xml | 13 + .../integrator-analytics-ingress.yaml | 40 + .../ingresses/integrator-gateway-ingress.yaml | 33 + .../ingresses/integrator-ingress.yaml | 36 + .../integrator/integrator-deployment.yaml | 90 ++ .../integrator-gateway-service.yaml | 30 + .../integrator/integrator-service.yaml | 30 + .../integrator/integrator-volume-claims.yaml | 45 + .../test/confs/mysql/dbscripts/init.sql | 502 +++++++++++ integrator-analytics/test/deploy.sh | 96 +++ .../test/rdbms/mysql/mysql-deployment.yaml | 48 ++ .../test/rdbms/mysql/mysql-service.yaml | 27 + integrator-analytics/test/undeploy.sh | 34 + .../volumes/persistent-volumes.yaml | 85 ++ 46 files changed, 8562 insertions(+) create mode 100644 integrator-analytics/analytics/integrator-analytics-1-deployment.yaml create mode 100644 integrator-analytics/analytics/integrator-analytics-1-service.yaml create mode 100644 integrator-analytics/analytics/integrator-analytics-2-deployment.yaml create mode 100644 integrator-analytics/analytics/integrator-analytics-2-service.yaml create mode 100644 integrator-analytics/analytics/integrator-analytics-service.yaml create mode 100644 integrator-analytics/analytics/integrator-analytics-volume-claims.yaml create mode 100644 integrator-analytics/confs/ei-analytics-1/conf/analytics/my-node-id.dat create mode 100755 integrator-analytics/confs/ei-analytics-1/conf/analytics/spark/spark-defaults.conf create mode 100644 integrator-analytics/confs/ei-analytics-1/conf/axis2/axis2.xml create mode 100644 integrator-analytics/confs/ei-analytics-1/conf/carbon.xml create mode 100644 integrator-analytics/confs/ei-analytics-1/conf/datasources/analytics-datasources.xml create mode 100644 integrator-analytics/confs/ei-analytics-1/conf/datasources/master-datasources.xml create mode 100644 integrator-analytics/confs/ei-analytics-1/conf/event-processor.xml create mode 100644 integrator-analytics/confs/ei-analytics-1/conf/registry.xml create mode 100644 integrator-analytics/confs/ei-analytics-1/conf/user-mgt.xml create mode 100644 integrator-analytics/confs/ei-analytics-1/repository/deployment/server/jaggeryapps/portal/configs/designer.json create mode 100644 integrator-analytics/confs/ei-analytics-2/conf/analytics/my-node-id.dat create mode 100755 integrator-analytics/confs/ei-analytics-2/conf/analytics/spark/spark-defaults.conf create mode 100644 integrator-analytics/confs/ei-analytics-2/conf/axis2/axis2.xml create mode 100644 integrator-analytics/confs/ei-analytics-2/conf/carbon.xml create mode 100644 integrator-analytics/confs/ei-analytics-2/conf/datasources/analytics-datasources.xml create mode 100644 integrator-analytics/confs/ei-analytics-2/conf/datasources/master-datasources.xml create mode 100644 integrator-analytics/confs/ei-analytics-2/conf/event-processor.xml create mode 100644 integrator-analytics/confs/ei-analytics-2/conf/registry.xml create mode 100644 integrator-analytics/confs/ei-analytics-2/conf/user-mgt.xml create mode 100644 integrator-analytics/confs/ei-analytics-2/repository/deployment/server/jaggeryapps/portal/configs/designer.json create mode 100644 integrator-analytics/confs/integrator/conf/axis2/axis2.xml create mode 100644 integrator-analytics/confs/integrator/conf/carbon.xml create mode 100644 integrator-analytics/confs/integrator/conf/datasources/master-datasources.xml create mode 100644 integrator-analytics/confs/integrator/conf/registry.xml create mode 100644 integrator-analytics/confs/integrator/conf/user-mgt.xml create mode 100644 integrator-analytics/confs/integrator/repository/deployment/server/eventpublishers/MessageFlowConfigurationPublisher.xml create mode 100644 integrator-analytics/confs/integrator/repository/deployment/server/eventpublishers/MessageFlowStatisticsPublisher.xml create mode 100644 integrator-analytics/ingresses/integrator-analytics-ingress.yaml create mode 100644 integrator-analytics/ingresses/integrator-gateway-ingress.yaml create mode 100644 integrator-analytics/ingresses/integrator-ingress.yaml create mode 100644 integrator-analytics/integrator/integrator-deployment.yaml create mode 100644 integrator-analytics/integrator/integrator-gateway-service.yaml create mode 100644 integrator-analytics/integrator/integrator-service.yaml create mode 100644 integrator-analytics/integrator/integrator-volume-claims.yaml create mode 100644 integrator-analytics/test/confs/mysql/dbscripts/init.sql create mode 100755 integrator-analytics/test/deploy.sh create mode 100644 integrator-analytics/test/rdbms/mysql/mysql-deployment.yaml create mode 100644 integrator-analytics/test/rdbms/mysql/mysql-service.yaml create mode 100755 integrator-analytics/test/undeploy.sh create mode 100644 integrator-analytics/volumes/persistent-volumes.yaml diff --git a/integrator-analytics/analytics/integrator-analytics-1-deployment.yaml b/integrator-analytics/analytics/integrator-analytics-1-deployment.yaml new file mode 100644 index 00000000..7da52f92 --- /dev/null +++ b/integrator-analytics/analytics/integrator-analytics-1-deployment.yaml @@ -0,0 +1,155 @@ +# Copyright (c) 2018, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +apiVersion: apps/v1beta1 +kind: Deployment +metadata: + name: integrator-with-analytics-ei-analytics-1-deployment +spec: + replicas: 1 + minReadySeconds: 30 + strategy: + rollingUpdate: + maxSurge: 1 + maxUnavailable: 0 + type: RollingUpdate + template: + metadata: + labels: + deployment: integrator-with-analytics-ei-analytics + node: integrator-with-analytics-ei-analytics-1 + spec: + containers: + - name: integrator-with-analytics-ei-analytics-1 + image: docker.wso2.com/wso2ei-analytics:6.2.0 + resources: + limits: + memory: "4Gi" + requests: + memory: "4Gi" + livenessProbe: + exec: + command: + - /bin/bash + - -c + - nc -z localhost 7712 + initialDelaySeconds: 250 + periodSeconds: 10 + readinessProbe: + exec: + command: + - /bin/bash + - -c + - nc -z localhost 7712 + initialDelaySeconds: 250 + periodSeconds: 10 + imagePullPolicy: Always + ports: + - + containerPort: 9764 + protocol: "TCP" + - + containerPort: 9444 + protocol: "TCP" + - + containerPort: 7612 + protocol: "TCP" + - + containerPort: 7712 + protocol: "TCP" + - + containerPort: 11225 + protocol: "TCP" + - + containerPort: 10006 + protocol: "TCP" + - + containerPort: 11001 + protocol: "TCP" + - + containerPort: 11002 + protocol: "TCP" + - + containerPort: 11003 + protocol: "TCP" + - + containerPort: 11501 + protocol: "TCP" + - + containerPort: 8083 + protocol: "TCP" + - + containerPort: 4041 + protocol: "TCP" + - + containerPort: 10007 + protocol: TCP + - + containerPort: 12501 + protocol: TCP + - + containerPort: 13001 + protocol: TCP + - + containerPort: 13501 + protocol: TCP + - + containerPort: 14501 + protocol: TCP + - + containerPort: 7078 + protocol: TCP + - + containerPort: 6067 + protocol: TCP + volumeMounts: + - name: ei-analytics-1-conf + mountPath: /home/wso2carbon/kubernetes-volumes/analytics/conf + - name: ei-analytics-1-conf-analytics + mountPath: /home/wso2carbon/kubernetes-volumes/analytics/conf-analytics + - name: ei-analytics-1-conf-spark-analytics + mountPath: /home/wso2carbon/kubernetes-volumes/analytics/conf-spark-analytics + - name: ei-analytics-1-conf-axis2 + mountPath: /home/wso2carbon/kubernetes-volumes/analytics/conf-axis2 + - name: ei-analytics-1-conf-datasources + mountPath: /home/wso2carbon/kubernetes-volumes/analytics/conf-datasources + - name: ei-analytics-1-deployment-portal + mountPath: /home/wso2carbon/kubernetes-volumes/analytics/conf-portal + - name: data-persistent-disk + mountPath: /home/wso2carbon/wso2ei-6.2.0/wso2/analytics/repository/data + serviceAccountName: "wso2svc-account" + imagePullSecrets: + - name: wso2creds + volumes: + - name: ei-analytics-1-conf + configMap: + name: ei-analytics-1-conf + - name: ei-analytics-1-conf-analytics + configMap: + name: ei-analytics-1-conf-analytics + - name: ei-analytics-1-conf-spark-analytics + configMap: + name: ei-analytics-1-conf-spark-analytics + - name: ei-analytics-1-conf-axis2 + configMap: + name: ei-analytics-1-conf-axis2 + - name: ei-analytics-1-conf-datasources + configMap: + name: ei-analytics-1-conf-datasources + - name: ei-analytics-1-deployment-portal + configMap: + name: ei-analytics-1-deployment-portal + - name: data-persistent-disk + persistentVolumeClaim: + claimName: ei-analytics-1-data-volume-claim diff --git a/integrator-analytics/analytics/integrator-analytics-1-service.yaml b/integrator-analytics/analytics/integrator-analytics-1-service.yaml new file mode 100644 index 00000000..6dcb678b --- /dev/null +++ b/integrator-analytics/analytics/integrator-analytics-1-service.yaml @@ -0,0 +1,106 @@ +# Copyright (c) 2018, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +apiVersion: v1 +kind: Service +metadata: + name: integrator-with-analytics-ei-analytics-1-service +spec: + selector: + node: integrator-with-analytics-ei-analytics-1 + ports: + - + name: 'thrift' + port: 7612 + protocol: TCP + - + name: 'thrift-ssl' + port: 7712 + protocol: TCP + - + name: 'spark-1' + port: 11225 + protocol: TCP + - + name: 'spark-2' + port: 10006 + protocol: TCP + - + name: 'spark-3' + port: 11001 + protocol: TCP + - + name: 'spark-44' + protocol: TCP + port: 8082 + - + name: 'spark-5' + protocol: TCP + port: 4041 + - + name: 'spark6' + protocol: TCP + port: 12001 + - + name: 'spark7' + protocol: TCP + port: 12002 + - + name: 'spark8' + protocol: TCP + port: 12003 + - + name: 'spark9' + protocol: TCP + port: 12004 + - + name: 'spark10' + protocol: TCP + port: 12005 + - + name: 'analytics1' + protocol: TCP + port: 10007 + - + name: 'analytics2' + protocol: TCP + port: 11002 + - + name: 'analytics3' + protocol: TCP + port: 12501 + - + name: 'analytics5' + protocol: TCP + port: 13001 + - + name: 'analytics6' + protocol: TCP + port: 13501 + - + name: 'analytics7' + protocol: TCP + port: 14501 + - + name: 'analytics8' + protocol: TCP + port: 7078 + - + name: 'analytics9' + protocol: TCP + port: 6067 + - + name: 'analytics10' + protocol: TCP + port: 11003 diff --git a/integrator-analytics/analytics/integrator-analytics-2-deployment.yaml b/integrator-analytics/analytics/integrator-analytics-2-deployment.yaml new file mode 100644 index 00000000..aa9bfc30 --- /dev/null +++ b/integrator-analytics/analytics/integrator-analytics-2-deployment.yaml @@ -0,0 +1,155 @@ +# Copyright (c) 2018, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +apiVersion: apps/v1beta1 +kind: Deployment +metadata: + name: integrator-with-analytics-ei-analytics-2-deployment +spec: + replicas: 1 + minReadySeconds: 30 + strategy: + rollingUpdate: + maxSurge: 1 + maxUnavailable: 0 + type: RollingUpdate + template: + metadata: + labels: + deployment: integrator-with-analytics-ei-analytics + node: integrator-with-analytics-ei-analytics-2 + spec: + containers: + - name: integrator-with-analytics-ei-analytics-2 + image: docker.wso2.com/wso2ei-analytics:6.2.0 + resources: + limits: + memory: "4Gi" + requests: + memory: "4Gi" + livenessProbe: + exec: + command: + - /bin/bash + - -c + - nc -z localhost 7712 + initialDelaySeconds: 250 + periodSeconds: 10 + readinessProbe: + exec: + command: + - /bin/bash + - -c + - nc -z localhost 7712 + initialDelaySeconds: 250 + periodSeconds: 10 + imagePullPolicy: Always + ports: + - + containerPort: 9764 + protocol: "TCP" + - + containerPort: 9444 + protocol: "TCP" + - + containerPort: 7612 + protocol: "TCP" + - + containerPort: 7712 + protocol: "TCP" + - + containerPort: 11225 + protocol: "TCP" + - + containerPort: 10006 + protocol: "TCP" + - + containerPort: 11001 + protocol: "TCP" + - + containerPort: 11002 + protocol: "TCP" + - + containerPort: 11003 + protocol: "TCP" + - + containerPort: 11501 + protocol: "TCP" + - + containerPort: 8083 + protocol: "TCP" + - + containerPort: 4041 + protocol: "TCP" + - + containerPort: 10007 + protocol: TCP + - + containerPort: 12501 + protocol: TCP + - + containerPort: 13001 + protocol: TCP + - + containerPort: 13501 + protocol: TCP + - + containerPort: 14501 + protocol: TCP + - + containerPort: 7078 + protocol: TCP + - + containerPort: 6067 + protocol: TCP + volumeMounts: + - name: ei-analytics-2-conf + mountPath: /home/wso2carbon/kubernetes-volumes/analytics/conf + - name: ei-analytics-2-conf-analytics + mountPath: /home/wso2carbon/kubernetes-volumes/analytics/conf-analytics + - name: ei-analytics-2-conf-spark-analytics + mountPath: /home/wso2carbon/kubernetes-volumes/analytics/conf-spark-analytics + - name: ei-analytics-2-conf-axis2 + mountPath: /home/wso2carbon/kubernetes-volumes/analytics/conf-axis2 + - name: ei-analytics-2-conf-datasources + mountPath: /home/wso2carbon/kubernetes-volumes/analytics/conf-datasources + - name: ei-analytics-2-deployment-portal + mountPath: /home/wso2carbon/kubernetes-volumes/analytics/conf-portal + - name: data-persistent-disk + mountPath: /home/wso2carbon/wso2ei-6.2.0/wso2/analytics/repository/data + serviceAccountName: "wso2svc-account" + imagePullSecrets: + - name: wso2creds + volumes: + - name: ei-analytics-2-conf + configMap: + name: ei-analytics-2-conf + - name: ei-analytics-2-conf-analytics + configMap: + name: ei-analytics-2-conf-analytics + - name: ei-analytics-2-conf-spark-analytics + configMap: + name: ei-analytics-2-conf-spark-analytics + - name: ei-analytics-2-conf-axis2 + configMap: + name: ei-analytics-2-conf-axis2 + - name: ei-analytics-2-conf-datasources + configMap: + name: ei-analytics-2-conf-datasources + - name: ei-analytics-2-deployment-portal + configMap: + name: ei-analytics-2-deployment-portal + - name: data-persistent-disk + persistentVolumeClaim: + claimName: ei-analytics-2-data-volume-claim diff --git a/integrator-analytics/analytics/integrator-analytics-2-service.yaml b/integrator-analytics/analytics/integrator-analytics-2-service.yaml new file mode 100644 index 00000000..a8d60bed --- /dev/null +++ b/integrator-analytics/analytics/integrator-analytics-2-service.yaml @@ -0,0 +1,106 @@ +# Copyright (c) 2018, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +apiVersion: v1 +kind: Service +metadata: + name: integrator-with-analytics-ei-analytics-2-service +spec: + selector: + node: integrator-with-analytics-ei-analytics-2 + ports: + - + name: 'thrift' + port: 7612 + protocol: TCP + - + name: 'thrift-ssl' + port: 7712 + protocol: TCP + - + name: 'spark-1' + port: 11225 + protocol: TCP + - + name: 'spark-2' + port: 10006 + protocol: TCP + - + name: 'spark-3' + port: 11001 + protocol: TCP + - + name: 'spark-44' + protocol: TCP + port: 8082 + - + name: 'spark-5' + protocol: TCP + port: 4041 + - + name: 'spark6' + protocol: TCP + port: 12001 + - + name: 'spark7' + protocol: TCP + port: 12002 + - + name: 'spark8' + protocol: TCP + port: 12003 + - + name: 'spark9' + protocol: TCP + port: 12004 + - + name: 'spark10' + protocol: TCP + port: 12005 + - + name: 'analytics1' + protocol: TCP + port: 10007 + - + name: 'analytics2' + protocol: TCP + port: 11002 + - + name: 'analytics3' + protocol: TCP + port: 12501 + - + name: 'analytics5' + protocol: TCP + port: 13001 + - + name: 'analytics6' + protocol: TCP + port: 13501 + - + name: 'analytics7' + protocol: TCP + port: 14501 + - + name: 'analytics8' + protocol: TCP + port: 7078 + - + name: 'analytics9' + protocol: TCP + port: 6067 + - + name: 'analytics10' + protocol: TCP + port: 11003 diff --git a/integrator-analytics/analytics/integrator-analytics-service.yaml b/integrator-analytics/analytics/integrator-analytics-service.yaml new file mode 100644 index 00000000..9a07f4e7 --- /dev/null +++ b/integrator-analytics/analytics/integrator-analytics-service.yaml @@ -0,0 +1,42 @@ +# Copyright (c) 2018, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +apiVersion: v1 +kind: Service +metadata: + name: integrator-with-analytics-ei-analytics-service +spec: + selector: + deployment: integrator-with-analytics-ei-analytics + ports: + - name: servlet-http + port: 9764 + targetPort: 9764 + protocol: TCP + - name: servlet-https + port: 9444 + targetPort: 9444 + protocol: TCP + - name: spark-ui + port: 4041 + targetPort: 4041 + protocol: TCP + - name: spark-master-webui + port: 8082 + targetPort: 8082 + protocol: TCP + - name: spark-worker-webui + port: 11501 + targetPort: 11501 + protocol: TCP diff --git a/integrator-analytics/analytics/integrator-analytics-volume-claims.yaml b/integrator-analytics/analytics/integrator-analytics-volume-claims.yaml new file mode 100644 index 00000000..0ed42b8a --- /dev/null +++ b/integrator-analytics/analytics/integrator-analytics-volume-claims.yaml @@ -0,0 +1,47 @@ +# Copyright (c) 2018, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: ei-analytics-1-data-volume-claim +spec: + accessModes: + - ReadWriteMany + resources: + requests: + storage: 1Gi + storageClassName: "" + selector: + matchLabels: + purpose: analytics-data + node: wso2ei-analytics-1 + +--- + +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: ei-analytics-2-data-volume-claim +spec: + accessModes: + - ReadWriteMany + resources: + requests: + storage: 1Gi + storageClassName: "" + selector: + matchLabels: + purpose: analytics-data + node: wso2ei-analytics-2 diff --git a/integrator-analytics/confs/ei-analytics-1/conf/analytics/my-node-id.dat b/integrator-analytics/confs/ei-analytics-1/conf/analytics/my-node-id.dat new file mode 100644 index 00000000..a947e205 --- /dev/null +++ b/integrator-analytics/confs/ei-analytics-1/conf/analytics/my-node-id.dat @@ -0,0 +1 @@ +wso2ei-analytics-1 diff --git a/integrator-analytics/confs/ei-analytics-1/conf/analytics/spark/spark-defaults.conf b/integrator-analytics/confs/ei-analytics-1/conf/analytics/spark/spark-defaults.conf new file mode 100755 index 00000000..92fbc882 --- /dev/null +++ b/integrator-analytics/confs/ei-analytics-1/conf/analytics/spark/spark-defaults.conf @@ -0,0 +1,122 @@ +# ------------------------------------------------------ +# CARBON RELATED SPARK PROPERTIES +# ------------------------------------------------------ +# Carbon specific properties when running Spark in the Carbon environment. +# Should start with the prefix "carbon." + +# carbon.spark.master config has 3 states +# 1. (default) local mode - spark starts in the local mode (NOTE: carbon.spark.master.count property +# will not be considered here) +# ex: "carbon.spark.master local" or "carbon.spark.master local[2]" +# 2. client mode - DAS acts as a client for an external Spark cluster (NOTE: carbon.spark.master.count property +# will not be considered here) +# ex: "carbon.spark.master spark://:" +# 3. cluster mode - DAS creates its own Spark cluster usign Carbon Clustering +# ex: "carbon.spark.master local" AND "carbon.spark.master.count " + +carbon.spark.master local +carbon.spark.master.count 2 + +#This configuration is used to limit the number of results returned from spark query execution +#To return all the results, set this to -1 +carbon.spark.results.limit 1000 + +# Below configuratoin can be used to point to a symbolic link to WSO2 DAS HOME +# carbon.das.symbolic.link /home/ubuntu/das/das_symlink/ + +# Below configuration can be used with the spark fair scheduler, when fair schedule pools are used. the +# defualt pool name for carbon is 'carbon-pool' +# carbon.scheduler.pool carbon-pool + + + +# ------------------------------------------------------ +# SPARK PROPERTIES +# ------------------------------------------------------ +# Default system properties included when running spark. +# This is useful for setting default environmental settings. +# Check http://spark.apache.org/docs/latest/configuration.html for further information + +# Application (Spark Driver) Properties +# ------------------------------------------------------ +spark.app.name CarbonAnalytics +# Spark Driver will be running inside the carbon JVM. Hence the below properties are obsolete +# spark.driver.cores 1 +# spark.driver.memory 512m + +# Runtime Environment +# ------------------------------------------------------ + +# Spark UI +spark.ui.port 4040 +spark.history.ui.port 18080 + +# Compression and Serialization +spark.serializer org.apache.spark.serializer.KryoSerializer +spark.kryoserializer.buffer 256k +spark.kryoserializer.buffer.max 256m + +# Execution Behavior + +# Networking +spark.blockManager.port 12000 +spark.broadcast.port 12500 +spark.driver.port 13000 +spark.executor.port 13500 +spark.fileserver.port 14000 +spark.replClassServer.port 14500 +spark.akka.timeout 1000s + +# Scheduling +spark.scheduler.mode FAIR +# this property can be set to specify where hte fairscheduler.xml file is. the carbon specific +# fairscheduler.xml is in the /repository/conf/analytics/spark directory +# spark.scheduler.allocation.file /repository/conf/analytics/spark/fairscheduler.xml + +# Dynamic Allocation + +# Security + +# Encryption + +# Standalone Cluster Configs +spark.deploy.recoveryMode CUSTOM +spark.deploy.recoveryMode.factory org.wso2.carbon.analytics.spark.core.deploy.AnalyticsRecoveryModeFactory + +# Master +spark.master.port 7077 +spark.master.rest.port 6066 +spark.master.webui.port 8081 + +# Worker +spark.worker.cores 1 +spark.worker.memory 1g +spark.worker.dir work +spark.worker.port 11000 +spark.worker.webui.port 11500 + +# Executors +# spark.executor.cores 1 ; Default: Takes all the available cores in the worker +spark.executor.memory 1g +spark.executor.logs.rolling.strategy size +spark.executor.logs.rolling.maxSize 10000000 +spark.executor.logs.rolling.maxRetainedFiles 10 + +# spark.cores.max ; Default: Int.MAX_VALUE; The maximum amount of CPU cores to request for the application from across +# the cluster (not from each machine) + + +# Spark Logging +# ------------------------------------------------------ +# To allow event logging for spark you need to uncomment +# the line spark.eventlog.log true and set the directory in which the +# logs will be stored. + +# spark.eventLog.enabled true +# spark.eventLog.dir + +# YARN related configs +# ------------------------------------------------------ +# spark.yarn.jar + + diff --git a/integrator-analytics/confs/ei-analytics-1/conf/axis2/axis2.xml b/integrator-analytics/confs/ei-analytics-1/conf/axis2/axis2.xml new file mode 100644 index 00000000..6422ebd7 --- /dev/null +++ b/integrator-analytics/confs/ei-analytics-1/conf/axis2/axis2.xml @@ -0,0 +1,719 @@ + + + + + + + + + + + + + ${hotdeployment} + ${hotupdate} + optional + true + work/mtom + 4000 + + ${childfirstCL} + + + true + + + true + + + + false + + inmemory + + + + + + + services + + + axis2services + + + axis2modules + + + WSO2 Enterprise Integrator-6.2.0 + + + WSO2 Enterprise Integrator-6.2.0 + + + + + + + false + + + + + + false + + + true + + + + ./repository/deployment/server/synapse-configs + + + + . + + + . + + + WSO2 Carbon Server + + + + + + + ${jaxwsparam} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 9763 + + + + + + + + + + + + 9443 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + HTTP/1.1 + chunked + + true + + + HTTP/1.1 + chunked + + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + + + kubernetes + + + + + wso2.ei.analytics.domain + + + + + + 45564 + + 100 + + 60 + + + + + + ei-analytics-1 + + + + + + 4000 + + + + + + + + + + + org.wso2.carbon.membership.scheme.kubernetes.KubernetesMembershipScheme + wso2 + integrator-with-analytics-ei-analytics-1-service,integrator-with-analytics-ei-analytics-2-service + true + false + + + + + + + + + + diff --git a/integrator-analytics/confs/ei-analytics-1/conf/carbon.xml b/integrator-analytics/confs/ei-analytics-1/conf/carbon.xml new file mode 100644 index 00000000..0a155002 --- /dev/null +++ b/integrator-analytics/confs/ei-analytics-1/conf/carbon.xml @@ -0,0 +1,695 @@ + + + + + + + + WSO2 Enterprise Integrator Analytics + + + EI + + + 6.0.0 + + + wso2ei-analytics + + + wso2ei-analytics + + + local:/${carbon.context}/services/ + + + + + + + DataAnalyticsServer + ComplexEventProcessor + + + + + + + org.wso2.carbon + + + / + + + + + + + + + 15 + + + + + + + + + 1 + + + + + 9999 + + 11111 + + + + + + 10389 + + 8000 + + + + + + 10500 + + + + + + + + + org.wso2.carbon.tomcat.jndi.CarbonJavaURLContextFactory + + + + + + + + + java + + + + + + + + + + false + + + false + + + 600 + + + + false + + + + + + + + 153722867280912 + + + + + + + + + 15 + + + + + + ${carbon.home}/repository/deployment/server/ + + + 15 + + + ${carbon.home}/conf/axis2/axis2.xml + + + 30000 + + + ${carbon.home}/repository/deployment/client/ + + ${carbon.home}/conf/axis2/axis2_client.xml + + true + + + + + + + + + + admin + Default Administrator Role + + + user + Default User Role + + + + + + + + + + + + ${carbon.home}/repository/resources/security/wso2carbon.jks + + JKS + + wso2carbon + + wso2carbon + + wso2carbon + + + + + + ${carbon.home}/repository/resources/security/client-truststore.jks + + JKS + + wso2carbon + + + + + + + + + + + + + + + + + + + UserManager + + + false + + + + + + true + allow + + + + + + + + + + + false + + (.*)(/images|/css|/js|/docs)(.*) + + + + + + + true + + + + + ${carbon.home}/tmp/work + + + + + + true + + + 10 + + + 30 + + + + + + 100 + + + + keystore + certificate + * + + org.wso2.carbon.ui.transports.fileupload.AnyFileUploadExecutor + + + + + jarZip + + org.wso2.carbon.ui.transports.fileupload.JarZipUploadExecutor + + + + dbs + + org.wso2.carbon.ui.transports.fileupload.DBSFileUploadExecutor + + + + tools + + org.wso2.carbon.ui.transports.fileupload.ToolsFileUploadExecutor + + + + toolsAny + + org.wso2.carbon.ui.transports.fileupload.ToolsAnyFileUploadExecutor + + + + + + + + + + info + org.wso2.carbon.core.transports.util.InfoProcessor + + + wsdl + org.wso2.carbon.core.transports.util.Wsdl11Processor + + + wsdl2 + org.wso2.carbon.core.transports.util.Wsdl20Processor + + + xsd + org.wso2.carbon.core.transports.util.XsdProcessor + + + + + + false + false + true + svn + http://svnrepo.example.com/repos/ + username + password + true + + + + + + + + + + + + + + + ${require.carbon.servlet} + + + + + true + + + + + + + default repository + http://product-dist.wso2.com/p2/carbon/releases/wilkes/ + + + + + + + + true + + + + + + true + + diff --git a/integrator-analytics/confs/ei-analytics-1/conf/datasources/analytics-datasources.xml b/integrator-analytics/confs/ei-analytics-1/conf/datasources/analytics-datasources.xml new file mode 100644 index 00000000..6c47ad1f --- /dev/null +++ b/integrator-analytics/confs/ei-analytics-1/conf/datasources/analytics-datasources.xml @@ -0,0 +1,112 @@ + + + + org.wso2.carbon.ndatasource.rdbms.RDBMSDataSourceReader + + + + + + + + WSO2_ANALYTICS_EVENT_STORE_DB + The datasource used for analytics record store + + + jdbc:mysql://wso2ei-integrator-rdbms-service:3306/WSO2_ANALYTICS_EVENT_STORE_DB?autoReconnect=true&useSSL=false + wso2carbon + wso2carbon + com.mysql.jdbc.Driver + 50 + 60000 + SELECT 1 + false + 0 + true + 4000 + READ_COMMITTED + + + + + + WSO2_ANALYTICS_PROCESSED_DATA_STORE_DB + The datasource used for analytics record store + + + jdbc:mysql://wso2ei-integrator-rdbms-service:3306/WSO2_ANALYTICS_PROCESSED_DATA_STORE_DB?autoReconnect=true&useSSL=false + wso2carbon + wso2carbon + com.mysql.jdbc.Driver + 50 + 60000 + SELECT 1 + false + 0 + true + 4000 + READ_COMMITTED + + + + + + + + + + + + + + diff --git a/integrator-analytics/confs/ei-analytics-1/conf/datasources/master-datasources.xml b/integrator-analytics/confs/ei-analytics-1/conf/datasources/master-datasources.xml new file mode 100644 index 00000000..9c7f2c65 --- /dev/null +++ b/integrator-analytics/confs/ei-analytics-1/conf/datasources/master-datasources.xml @@ -0,0 +1,108 @@ + + + + org.wso2.carbon.ndatasource.rdbms.RDBMSDataSourceReader + + + + + + WSO2_CARBON_DB + The datasource used for registry and user manager + + jdbc/WSO2CarbonDB + + + + jdbc:h2:./repository/database/WSO2CARBON_DB;DB_CLOSE_ON_EXIT=FALSE;LOCK_TIMEOUT=60000 + wso2carbon + wso2carbon + org.h2.Driver + 50 + 60000 + true + SELECT 1 + 30000 + false + + + + + WSO2_CONFIG_DB + The datasource used for config registry + + jdbc/WSO2ConfigDB + + + + jdbc:mysql://wso2ei-integrator-rdbms-service:3306/WSO2EI_INTEGRATOR_CONFIG_GOV_DB?autoReconnect=true&useSSL=false + wso2carbon + wso2carbon + com.mysql.jdbc.Driver + 80 + 60000 + true + SELECT 1 + 30000 + + + + + WSO2_USER_DB + The datasource is used for user mangement and userstore + + jdbc/WSO2UserDB + + + + jdbc:mysql://wso2ei-integrator-rdbms-service:3306/WSO2EI_USER_DB?autoReconnect=true&useSSL=false + wso2carbon + wso2carbon + com.mysql.jdbc.Driver + 50 + 60000 + true + SELECT 1 + 30000 + + + + + + + + + + diff --git a/integrator-analytics/confs/ei-analytics-1/conf/event-processor.xml b/integrator-analytics/confs/ei-analytics-1/conf/event-processor.xml new file mode 100644 index 00000000..1d13b213 --- /dev/null +++ b/integrator-analytics/confs/ei-analytics-1/conf/event-processor.xml @@ -0,0 +1,156 @@ + + + + + + + + + + 10000 + + integrator-with-analytics-ei-analytics + 11224 + 20000 + 20000 + + 5242880 + + UTF-8 + 1024 + 30000 + + 1000000 + + 10 + + 1000000 + + 10 + + + integrator-with-analytics-ei-analytics + 10005 + 15000 + 10000 + + + integrator-with-analytics-ei-analytics + 11000 + + 5242880 + + UTF-8 + 1024 + 30000 + + + 15 + 10 + + cep_persistence + + + + + + + + + + + 0.0.0.0 + 8904 + + + 0.0.0.0 + 11000 + + + + + + + localhost + 8904 + + + localhost + 8905 + + + + 20000 + + 5000 + + 10000 + + + + + + 15000 + 15100 + + + 20000 + + 8192 + + 8192 + + 5242880 + + UTF-8 + + 10000 + + 20000 + + + + 1024 + + 5242880 + + UTF-8 + + 20000 + + + + 60000 + 60000 + + + org.wso2.cep.storm.dependencies.jar + + + + 20000 + + + + + diff --git a/integrator-analytics/confs/ei-analytics-1/conf/registry.xml b/integrator-analytics/confs/ei-analytics-1/conf/registry.xml new file mode 100644 index 00000000..61068d93 --- /dev/null +++ b/integrator-analytics/confs/ei-analytics-1/conf/registry.xml @@ -0,0 +1,149 @@ + + + + + + + + wso2registry + false + true + / + + + jdbc/WSO2CarbonDB + + + + + jdbc/WSO2ConfigDB + + + wso2config + wso2config + false + / + + + wso2config + /_system/config/ei_analytics + + + wso2config + /_system/governance/ei_analytics + + + + + + + + + + + + + 35 + 3 + + 50 + + 50 + + /_system/local/repository/components/org.wso2.carbon.registry/indexing/lastaccesstime + + + + + + + + + + + + + + + + + + + + + + false + + + + true + true + true + true + + diff --git a/integrator-analytics/confs/ei-analytics-1/conf/user-mgt.xml b/integrator-analytics/confs/ei-analytics-1/conf/user-mgt.xml new file mode 100644 index 00000000..801f8cac --- /dev/null +++ b/integrator-analytics/confs/ei-analytics-1/conf/user-mgt.xml @@ -0,0 +1,260 @@ + + + + + + true + admin + + admin + admin + + everyone + true + jdbc/WSO2UserDB + + + + + org.wso2.carbon.user.core.tenant.JDBCTenantManager + false + true + true + ^[\S]{3,30}$ + ^[\S]{3,30}$ + Username pattern policy violated + ^[\S]{5,30}$ + ^[\S]{5,30}$ + Password length should be within 5 to 30 characters + ^[\S]{3,30}$ + ^[\S]{3,30}$ + true + false + true + SHA-256 + true + , + 100 + 100 + true + false + + + + + + + + + + + + + /permission + true + false + + + + + diff --git a/integrator-analytics/confs/ei-analytics-1/repository/deployment/server/jaggeryapps/portal/configs/designer.json b/integrator-analytics/confs/ei-analytics-1/repository/deployment/server/jaggeryapps/portal/configs/designer.json new file mode 100644 index 00000000..bae5c064 --- /dev/null +++ b/integrator-analytics/confs/ei-analytics-1/repository/deployment/server/jaggeryapps/portal/configs/designer.json @@ -0,0 +1,95 @@ +{ + "store": { + "types": ["fs"] + }, + "gadgetGeneration" :{ + "isCreateGadgetEnable": false, + "ignoreProviders": ["rt"] + }, + "authentication": { + "activeMethod": "basic", + "methods": { + "sso": { + "attributes": { + "issuer": "portal", + "identityProviderURL": "https://localhost:9443/samlsso", + "responseSigningEnabled": true, + "validateAssertionValidityPeriod": true, + "validateAudienceRestriction": true, + "assertionSigningEnabled": true, + "acs": "https://localhost:9444/portal/acs", + "identityAlias": "wso2carbon", + "defaultNameIDPolicy": "urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified", + "grantType": "urn:ietf:params:oauth:grant-type:saml2-bearer", + "useTenantKey": false, + "isPassive": false + } + }, + "basic": { + "attributes": {} + } + } + }, + "authorization": { + "activeMethod": "", + "methods": { + "oauth": { + "attributes": { + "apimgt-gateway": false, + "oauthProvider": { + "appRegistration": { + "appType": "webapp", + "clientName": "portal", + "owner": "admin", + "password":"admin", + "dynamicClientAppRegistrationServiceURL": "%https.host%/client-registration/v0.10/register", + "apiManagerClientAppRegistrationServiceURL": "%https.host%/api-application-registration/register/tenants", + "grantType": "password refresh_token urn:ietf:params:oauth:grant-type:saml2-bearer urn:ietf:params:oauth:grant-type:jwt-bearer", + "tokenScope": "admin", + "callbackUrl": "%https.host%/portal", + "saasApp":true + }, + "tokenServiceURL": "%https.host%/oauth2/token" + }, + "adminUser":"admin@carbon.super", + "adminUserTenantId":"-1234", + "adminRole":"admin", + "scopes" : [ + "device:view" + ] + } + } + } + }, + "designers": [ + "Internal/everyone" + ], + "tenantPrefix": "/t", + "shareStore": false, + "theme": "basic", + "cacheTimeoutSeconds": "5", + "cacheSizeBytes": "1073741824", + "defaultDashboardRedirect": false, + "isCreateGadgetEnable": true, + "isSecureVaultEnabled" : false, + "assets": { + "gadget": { + "fileSizeLimit": 5 + }, + "layout": { + "fileSizeLimit": 1 + } + }, + "oauth": { + "username": "admin", + "password": "admin" + }, + "host": { + "hostname": "localhost", + "port": "9444", + "protocol": "" + }, + "queryParameters" : { + "passBetweenPages" : ["shared"] + } +} diff --git a/integrator-analytics/confs/ei-analytics-2/conf/analytics/my-node-id.dat b/integrator-analytics/confs/ei-analytics-2/conf/analytics/my-node-id.dat new file mode 100644 index 00000000..6e2734db --- /dev/null +++ b/integrator-analytics/confs/ei-analytics-2/conf/analytics/my-node-id.dat @@ -0,0 +1 @@ +wso2ei-analytics-2 diff --git a/integrator-analytics/confs/ei-analytics-2/conf/analytics/spark/spark-defaults.conf b/integrator-analytics/confs/ei-analytics-2/conf/analytics/spark/spark-defaults.conf new file mode 100755 index 00000000..92fbc882 --- /dev/null +++ b/integrator-analytics/confs/ei-analytics-2/conf/analytics/spark/spark-defaults.conf @@ -0,0 +1,122 @@ +# ------------------------------------------------------ +# CARBON RELATED SPARK PROPERTIES +# ------------------------------------------------------ +# Carbon specific properties when running Spark in the Carbon environment. +# Should start with the prefix "carbon." + +# carbon.spark.master config has 3 states +# 1. (default) local mode - spark starts in the local mode (NOTE: carbon.spark.master.count property +# will not be considered here) +# ex: "carbon.spark.master local" or "carbon.spark.master local[2]" +# 2. client mode - DAS acts as a client for an external Spark cluster (NOTE: carbon.spark.master.count property +# will not be considered here) +# ex: "carbon.spark.master spark://:" +# 3. cluster mode - DAS creates its own Spark cluster usign Carbon Clustering +# ex: "carbon.spark.master local" AND "carbon.spark.master.count " + +carbon.spark.master local +carbon.spark.master.count 2 + +#This configuration is used to limit the number of results returned from spark query execution +#To return all the results, set this to -1 +carbon.spark.results.limit 1000 + +# Below configuratoin can be used to point to a symbolic link to WSO2 DAS HOME +# carbon.das.symbolic.link /home/ubuntu/das/das_symlink/ + +# Below configuration can be used with the spark fair scheduler, when fair schedule pools are used. the +# defualt pool name for carbon is 'carbon-pool' +# carbon.scheduler.pool carbon-pool + + + +# ------------------------------------------------------ +# SPARK PROPERTIES +# ------------------------------------------------------ +# Default system properties included when running spark. +# This is useful for setting default environmental settings. +# Check http://spark.apache.org/docs/latest/configuration.html for further information + +# Application (Spark Driver) Properties +# ------------------------------------------------------ +spark.app.name CarbonAnalytics +# Spark Driver will be running inside the carbon JVM. Hence the below properties are obsolete +# spark.driver.cores 1 +# spark.driver.memory 512m + +# Runtime Environment +# ------------------------------------------------------ + +# Spark UI +spark.ui.port 4040 +spark.history.ui.port 18080 + +# Compression and Serialization +spark.serializer org.apache.spark.serializer.KryoSerializer +spark.kryoserializer.buffer 256k +spark.kryoserializer.buffer.max 256m + +# Execution Behavior + +# Networking +spark.blockManager.port 12000 +spark.broadcast.port 12500 +spark.driver.port 13000 +spark.executor.port 13500 +spark.fileserver.port 14000 +spark.replClassServer.port 14500 +spark.akka.timeout 1000s + +# Scheduling +spark.scheduler.mode FAIR +# this property can be set to specify where hte fairscheduler.xml file is. the carbon specific +# fairscheduler.xml is in the /repository/conf/analytics/spark directory +# spark.scheduler.allocation.file /repository/conf/analytics/spark/fairscheduler.xml + +# Dynamic Allocation + +# Security + +# Encryption + +# Standalone Cluster Configs +spark.deploy.recoveryMode CUSTOM +spark.deploy.recoveryMode.factory org.wso2.carbon.analytics.spark.core.deploy.AnalyticsRecoveryModeFactory + +# Master +spark.master.port 7077 +spark.master.rest.port 6066 +spark.master.webui.port 8081 + +# Worker +spark.worker.cores 1 +spark.worker.memory 1g +spark.worker.dir work +spark.worker.port 11000 +spark.worker.webui.port 11500 + +# Executors +# spark.executor.cores 1 ; Default: Takes all the available cores in the worker +spark.executor.memory 1g +spark.executor.logs.rolling.strategy size +spark.executor.logs.rolling.maxSize 10000000 +spark.executor.logs.rolling.maxRetainedFiles 10 + +# spark.cores.max ; Default: Int.MAX_VALUE; The maximum amount of CPU cores to request for the application from across +# the cluster (not from each machine) + + +# Spark Logging +# ------------------------------------------------------ +# To allow event logging for spark you need to uncomment +# the line spark.eventlog.log true and set the directory in which the +# logs will be stored. + +# spark.eventLog.enabled true +# spark.eventLog.dir + +# YARN related configs +# ------------------------------------------------------ +# spark.yarn.jar + + diff --git a/integrator-analytics/confs/ei-analytics-2/conf/axis2/axis2.xml b/integrator-analytics/confs/ei-analytics-2/conf/axis2/axis2.xml new file mode 100644 index 00000000..06b172dc --- /dev/null +++ b/integrator-analytics/confs/ei-analytics-2/conf/axis2/axis2.xml @@ -0,0 +1,719 @@ + + + + + + + + + + + + + ${hotdeployment} + ${hotupdate} + optional + true + work/mtom + 4000 + + ${childfirstCL} + + + true + + + true + + + + false + + inmemory + + + + + + + services + + + axis2services + + + axis2modules + + + WSO2 Enterprise Integrator-6.2.0 + + + WSO2 Enterprise Integrator-6.2.0 + + + + + + + false + + + + + + false + + + true + + + + ./repository/deployment/server/synapse-configs + + + + . + + + . + + + WSO2 Carbon Server + + + + + + + ${jaxwsparam} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 9763 + + + + + + + + + + + + 9443 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + HTTP/1.1 + chunked + + true + + + HTTP/1.1 + chunked + + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + + + kubernetes + + + + + wso2.ei.analytics.domain + + + + + + 45564 + + 100 + + 60 + + + + + + ei-analytics-2 + + + + + + 4000 + + + + + + + + + + + org.wso2.carbon.membership.scheme.kubernetes.KubernetesMembershipScheme + wso2 + integrator-with-analytics-ei-analytics-1-service,integrator-with-analytics-ei-analytics-2-service + true + false + + + + + + + + + + diff --git a/integrator-analytics/confs/ei-analytics-2/conf/carbon.xml b/integrator-analytics/confs/ei-analytics-2/conf/carbon.xml new file mode 100644 index 00000000..0a155002 --- /dev/null +++ b/integrator-analytics/confs/ei-analytics-2/conf/carbon.xml @@ -0,0 +1,695 @@ + + + + + + + + WSO2 Enterprise Integrator Analytics + + + EI + + + 6.0.0 + + + wso2ei-analytics + + + wso2ei-analytics + + + local:/${carbon.context}/services/ + + + + + + + DataAnalyticsServer + ComplexEventProcessor + + + + + + + org.wso2.carbon + + + / + + + + + + + + + 15 + + + + + + + + + 1 + + + + + 9999 + + 11111 + + + + + + 10389 + + 8000 + + + + + + 10500 + + + + + + + + + org.wso2.carbon.tomcat.jndi.CarbonJavaURLContextFactory + + + + + + + + + java + + + + + + + + + + false + + + false + + + 600 + + + + false + + + + + + + + 153722867280912 + + + + + + + + + 15 + + + + + + ${carbon.home}/repository/deployment/server/ + + + 15 + + + ${carbon.home}/conf/axis2/axis2.xml + + + 30000 + + + ${carbon.home}/repository/deployment/client/ + + ${carbon.home}/conf/axis2/axis2_client.xml + + true + + + + + + + + + + admin + Default Administrator Role + + + user + Default User Role + + + + + + + + + + + + ${carbon.home}/repository/resources/security/wso2carbon.jks + + JKS + + wso2carbon + + wso2carbon + + wso2carbon + + + + + + ${carbon.home}/repository/resources/security/client-truststore.jks + + JKS + + wso2carbon + + + + + + + + + + + + + + + + + + + UserManager + + + false + + + + + + true + allow + + + + + + + + + + + false + + (.*)(/images|/css|/js|/docs)(.*) + + + + + + + true + + + + + ${carbon.home}/tmp/work + + + + + + true + + + 10 + + + 30 + + + + + + 100 + + + + keystore + certificate + * + + org.wso2.carbon.ui.transports.fileupload.AnyFileUploadExecutor + + + + + jarZip + + org.wso2.carbon.ui.transports.fileupload.JarZipUploadExecutor + + + + dbs + + org.wso2.carbon.ui.transports.fileupload.DBSFileUploadExecutor + + + + tools + + org.wso2.carbon.ui.transports.fileupload.ToolsFileUploadExecutor + + + + toolsAny + + org.wso2.carbon.ui.transports.fileupload.ToolsAnyFileUploadExecutor + + + + + + + + + + info + org.wso2.carbon.core.transports.util.InfoProcessor + + + wsdl + org.wso2.carbon.core.transports.util.Wsdl11Processor + + + wsdl2 + org.wso2.carbon.core.transports.util.Wsdl20Processor + + + xsd + org.wso2.carbon.core.transports.util.XsdProcessor + + + + + + false + false + true + svn + http://svnrepo.example.com/repos/ + username + password + true + + + + + + + + + + + + + + + ${require.carbon.servlet} + + + + + true + + + + + + + default repository + http://product-dist.wso2.com/p2/carbon/releases/wilkes/ + + + + + + + + true + + + + + + true + + diff --git a/integrator-analytics/confs/ei-analytics-2/conf/datasources/analytics-datasources.xml b/integrator-analytics/confs/ei-analytics-2/conf/datasources/analytics-datasources.xml new file mode 100644 index 00000000..6c47ad1f --- /dev/null +++ b/integrator-analytics/confs/ei-analytics-2/conf/datasources/analytics-datasources.xml @@ -0,0 +1,112 @@ + + + + org.wso2.carbon.ndatasource.rdbms.RDBMSDataSourceReader + + + + + + + + WSO2_ANALYTICS_EVENT_STORE_DB + The datasource used for analytics record store + + + jdbc:mysql://wso2ei-integrator-rdbms-service:3306/WSO2_ANALYTICS_EVENT_STORE_DB?autoReconnect=true&useSSL=false + wso2carbon + wso2carbon + com.mysql.jdbc.Driver + 50 + 60000 + SELECT 1 + false + 0 + true + 4000 + READ_COMMITTED + + + + + + WSO2_ANALYTICS_PROCESSED_DATA_STORE_DB + The datasource used for analytics record store + + + jdbc:mysql://wso2ei-integrator-rdbms-service:3306/WSO2_ANALYTICS_PROCESSED_DATA_STORE_DB?autoReconnect=true&useSSL=false + wso2carbon + wso2carbon + com.mysql.jdbc.Driver + 50 + 60000 + SELECT 1 + false + 0 + true + 4000 + READ_COMMITTED + + + + + + + + + + + + + + diff --git a/integrator-analytics/confs/ei-analytics-2/conf/datasources/master-datasources.xml b/integrator-analytics/confs/ei-analytics-2/conf/datasources/master-datasources.xml new file mode 100644 index 00000000..9c7f2c65 --- /dev/null +++ b/integrator-analytics/confs/ei-analytics-2/conf/datasources/master-datasources.xml @@ -0,0 +1,108 @@ + + + + org.wso2.carbon.ndatasource.rdbms.RDBMSDataSourceReader + + + + + + WSO2_CARBON_DB + The datasource used for registry and user manager + + jdbc/WSO2CarbonDB + + + + jdbc:h2:./repository/database/WSO2CARBON_DB;DB_CLOSE_ON_EXIT=FALSE;LOCK_TIMEOUT=60000 + wso2carbon + wso2carbon + org.h2.Driver + 50 + 60000 + true + SELECT 1 + 30000 + false + + + + + WSO2_CONFIG_DB + The datasource used for config registry + + jdbc/WSO2ConfigDB + + + + jdbc:mysql://wso2ei-integrator-rdbms-service:3306/WSO2EI_INTEGRATOR_CONFIG_GOV_DB?autoReconnect=true&useSSL=false + wso2carbon + wso2carbon + com.mysql.jdbc.Driver + 80 + 60000 + true + SELECT 1 + 30000 + + + + + WSO2_USER_DB + The datasource is used for user mangement and userstore + + jdbc/WSO2UserDB + + + + jdbc:mysql://wso2ei-integrator-rdbms-service:3306/WSO2EI_USER_DB?autoReconnect=true&useSSL=false + wso2carbon + wso2carbon + com.mysql.jdbc.Driver + 50 + 60000 + true + SELECT 1 + 30000 + + + + + + + + + + diff --git a/integrator-analytics/confs/ei-analytics-2/conf/event-processor.xml b/integrator-analytics/confs/ei-analytics-2/conf/event-processor.xml new file mode 100644 index 00000000..1d13b213 --- /dev/null +++ b/integrator-analytics/confs/ei-analytics-2/conf/event-processor.xml @@ -0,0 +1,156 @@ + + + + + + + + + + 10000 + + integrator-with-analytics-ei-analytics + 11224 + 20000 + 20000 + + 5242880 + + UTF-8 + 1024 + 30000 + + 1000000 + + 10 + + 1000000 + + 10 + + + integrator-with-analytics-ei-analytics + 10005 + 15000 + 10000 + + + integrator-with-analytics-ei-analytics + 11000 + + 5242880 + + UTF-8 + 1024 + 30000 + + + 15 + 10 + + cep_persistence + + + + + + + + + + + 0.0.0.0 + 8904 + + + 0.0.0.0 + 11000 + + + + + + + localhost + 8904 + + + localhost + 8905 + + + + 20000 + + 5000 + + 10000 + + + + + + 15000 + 15100 + + + 20000 + + 8192 + + 8192 + + 5242880 + + UTF-8 + + 10000 + + 20000 + + + + 1024 + + 5242880 + + UTF-8 + + 20000 + + + + 60000 + 60000 + + + org.wso2.cep.storm.dependencies.jar + + + + 20000 + + + + + diff --git a/integrator-analytics/confs/ei-analytics-2/conf/registry.xml b/integrator-analytics/confs/ei-analytics-2/conf/registry.xml new file mode 100644 index 00000000..61068d93 --- /dev/null +++ b/integrator-analytics/confs/ei-analytics-2/conf/registry.xml @@ -0,0 +1,149 @@ + + + + + + + + wso2registry + false + true + / + + + jdbc/WSO2CarbonDB + + + + + jdbc/WSO2ConfigDB + + + wso2config + wso2config + false + / + + + wso2config + /_system/config/ei_analytics + + + wso2config + /_system/governance/ei_analytics + + + + + + + + + + + + + 35 + 3 + + 50 + + 50 + + /_system/local/repository/components/org.wso2.carbon.registry/indexing/lastaccesstime + + + + + + + + + + + + + + + + + + + + + + false + + + + true + true + true + true + + diff --git a/integrator-analytics/confs/ei-analytics-2/conf/user-mgt.xml b/integrator-analytics/confs/ei-analytics-2/conf/user-mgt.xml new file mode 100644 index 00000000..801f8cac --- /dev/null +++ b/integrator-analytics/confs/ei-analytics-2/conf/user-mgt.xml @@ -0,0 +1,260 @@ + + + + + + true + admin + + admin + admin + + everyone + true + jdbc/WSO2UserDB + + + + + org.wso2.carbon.user.core.tenant.JDBCTenantManager + false + true + true + ^[\S]{3,30}$ + ^[\S]{3,30}$ + Username pattern policy violated + ^[\S]{5,30}$ + ^[\S]{5,30}$ + Password length should be within 5 to 30 characters + ^[\S]{3,30}$ + ^[\S]{3,30}$ + true + false + true + SHA-256 + true + , + 100 + 100 + true + false + + + + + + + + + + + + + /permission + true + false + + + + + diff --git a/integrator-analytics/confs/ei-analytics-2/repository/deployment/server/jaggeryapps/portal/configs/designer.json b/integrator-analytics/confs/ei-analytics-2/repository/deployment/server/jaggeryapps/portal/configs/designer.json new file mode 100644 index 00000000..bae5c064 --- /dev/null +++ b/integrator-analytics/confs/ei-analytics-2/repository/deployment/server/jaggeryapps/portal/configs/designer.json @@ -0,0 +1,95 @@ +{ + "store": { + "types": ["fs"] + }, + "gadgetGeneration" :{ + "isCreateGadgetEnable": false, + "ignoreProviders": ["rt"] + }, + "authentication": { + "activeMethod": "basic", + "methods": { + "sso": { + "attributes": { + "issuer": "portal", + "identityProviderURL": "https://localhost:9443/samlsso", + "responseSigningEnabled": true, + "validateAssertionValidityPeriod": true, + "validateAudienceRestriction": true, + "assertionSigningEnabled": true, + "acs": "https://localhost:9444/portal/acs", + "identityAlias": "wso2carbon", + "defaultNameIDPolicy": "urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified", + "grantType": "urn:ietf:params:oauth:grant-type:saml2-bearer", + "useTenantKey": false, + "isPassive": false + } + }, + "basic": { + "attributes": {} + } + } + }, + "authorization": { + "activeMethod": "", + "methods": { + "oauth": { + "attributes": { + "apimgt-gateway": false, + "oauthProvider": { + "appRegistration": { + "appType": "webapp", + "clientName": "portal", + "owner": "admin", + "password":"admin", + "dynamicClientAppRegistrationServiceURL": "%https.host%/client-registration/v0.10/register", + "apiManagerClientAppRegistrationServiceURL": "%https.host%/api-application-registration/register/tenants", + "grantType": "password refresh_token urn:ietf:params:oauth:grant-type:saml2-bearer urn:ietf:params:oauth:grant-type:jwt-bearer", + "tokenScope": "admin", + "callbackUrl": "%https.host%/portal", + "saasApp":true + }, + "tokenServiceURL": "%https.host%/oauth2/token" + }, + "adminUser":"admin@carbon.super", + "adminUserTenantId":"-1234", + "adminRole":"admin", + "scopes" : [ + "device:view" + ] + } + } + } + }, + "designers": [ + "Internal/everyone" + ], + "tenantPrefix": "/t", + "shareStore": false, + "theme": "basic", + "cacheTimeoutSeconds": "5", + "cacheSizeBytes": "1073741824", + "defaultDashboardRedirect": false, + "isCreateGadgetEnable": true, + "isSecureVaultEnabled" : false, + "assets": { + "gadget": { + "fileSizeLimit": 5 + }, + "layout": { + "fileSizeLimit": 1 + } + }, + "oauth": { + "username": "admin", + "password": "admin" + }, + "host": { + "hostname": "localhost", + "port": "9444", + "protocol": "" + }, + "queryParameters" : { + "passBetweenPages" : ["shared"] + } +} diff --git a/integrator-analytics/confs/integrator/conf/axis2/axis2.xml b/integrator-analytics/confs/integrator/conf/axis2/axis2.xml new file mode 100644 index 00000000..39881db1 --- /dev/null +++ b/integrator-analytics/confs/integrator/conf/axis2/axis2.xml @@ -0,0 +1,800 @@ + + + + + + + + + + + true + + true + + + false + + false + + + false + + work/mtom + + 4000 + + + false + + + inmemory + + + + + services + + + axis2services + + + true + + + axis2modules + + + WSO2 EI 6.2.0 + WSO2 EI 6.2.0 + + + + false + + + + + + + false + + + true + + + 30000 + + + repository/deployment/server/synapse-configs + + . + + . + + localhost + + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 8280 + true + + http://wso2ei-integrator-gateway + org.wso2.carbon.mediation.transport.handlers.PassThroughNHttpGetProcessor + + + + + 8243 + true + TLSv1,TLSv1.1,TLSv1.2 + + https://wso2ei-integrator-gateway + org.wso2.carbon.mediation.transport.handlers.PassThroughNHttpGetProcessor + + + repository/resources/security/wso2carbon.jks + JKS + wso2carbon + wso2carbon + + + + + repository/resources/security/client-truststore.jks + JKS + wso2carbon + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + + + + + + + + true + + + repository/resources/security/wso2carbon.jks + JKS + wso2carbon + wso2carbon + + + + + repository/resources/security/client-truststore.jks + JKS + wso2carbon + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + nonWorkerManager + + + true + + + kubernetes + + + + + wso2.ei.domain + + + + + + 45564 + + 100 + + 60 + + + + + + integrator + + + + + + 4100 + + + + + + + + + + + + + + + + org.wso2.carbon.membership.scheme.kubernetes.KubernetesMembershipScheme + wso2 + wso2ei-integrator-service + true + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/integrator-analytics/confs/integrator/conf/carbon.xml b/integrator-analytics/confs/integrator/conf/carbon.xml new file mode 100644 index 00000000..51b639fb --- /dev/null +++ b/integrator-analytics/confs/integrator/conf/carbon.xml @@ -0,0 +1,679 @@ + + + + + + + + WSO2 Enterprise Integrator + + + EI + + + 6.2.0 + + + wso2ei-integrator-gateway + + + wso2ei-integrator + + + local:/${carbon.context}/services/ + + + + + + + EnterpriseIntegrator + EnterpriseServiceBus + DataServicesServer + + + + + + + org.wso2.carbon + + + / + + + + + + + + + 15 + + + + + + + + + 0 + + + + + 9999 + + 11111 + + + + + + 10389 + + 8000 + + + + + + 10500 + + + + + + + + + org.wso2.carbon.tomcat.jndi.CarbonJavaURLContextFactory + + + + + + + + + java + + + + + + + + + + false + + + false + + + 600 + + + + false + + + + + + + + 30 + + + + + + + + + 15 + + + + + + ${carbon.home}/repository/deployment/server/ + + + 15 + + + ${carbon.home}/conf/axis2/axis2.xml + + + 30000 + + + ${carbon.home}/repository/deployment/client/ + + ${carbon.home}/conf/axis2/axis2_client.xml + + true + + + + + + + + + + admin + Default Administrator Role + + + user + Default User Role + + + + + + + + + + + + ${carbon.home}/repository/resources/security/wso2carbon.jks + + JKS + + wso2carbon + + wso2carbon + + wso2carbon + + + + + + ${carbon.home}/repository/resources/security/client-truststore.jks + + JKS + + wso2carbon + + + + + + + + + + + + + + + + + + + UserManager + + + false + + + + + + true + allow + + + + + + + + ${carbon.home}/tmp/work + + + + + + true + + + 10 + + + 30 + + + + + + 100 + + + + keystore + certificate + * + + org.wso2.carbon.ui.transports.fileupload.AnyFileUploadExecutor + + + + + jarZip + + org.wso2.carbon.ui.transports.fileupload.JarZipUploadExecutor + + + + dbs + + org.wso2.carbon.ui.transports.fileupload.DBSFileUploadExecutor + + + + tools + + org.wso2.carbon.ui.transports.fileupload.ToolsFileUploadExecutor + + + + toolsAny + + org.wso2.carbon.ui.transports.fileupload.ToolsAnyFileUploadExecutor + + + + + + + + + + info + org.wso2.carbon.core.transports.util.InfoProcessor + + + wsdl + org.wso2.carbon.core.transports.util.Wsdl11Processor + + + wsdl2 + org.wso2.carbon.core.transports.util.Wsdl20Processor + + + xsd + org.wso2.carbon.core.transports.util.XsdProcessor + + + + + + false + false + true + svn + http://svnrepo.example.com/repos/ + username + password + true + + + + + + + + + + + + + + + ${require.carbon.servlet} + + + + + true + + + + + + + default repository + http://product-dist.wso2.com/p2/carbon/releases/wilkes/ + + + + + + + + true + + + + + + true + + diff --git a/integrator-analytics/confs/integrator/conf/datasources/master-datasources.xml b/integrator-analytics/confs/integrator/conf/datasources/master-datasources.xml new file mode 100644 index 00000000..f91bcc77 --- /dev/null +++ b/integrator-analytics/confs/integrator/conf/datasources/master-datasources.xml @@ -0,0 +1,106 @@ + + + + org.wso2.carbon.ndatasource.rdbms.RDBMSDataSourceReader + + + + + WSO2_CARBON_DB + The datasource used for local registry of wso2 ei-integrator + + jdbc/WSO2CarbonDB + + + + jdbc:h2:./repository/database/WSO2CARBON_DB;DB_CLOSE_ON_EXIT=FALSE;LOCK_TIMEOUT=60000 + wso2carbon + wso2carbon + org.h2.Driver + 50 + 60000 + true + SELECT 1 + 30000 + false + + + + + WSO2_CONFIG_DB + The datasource used for config registry + + jdbc/WSO2ConfigDB + + + + jdbc:mysql://wso2ei-integrator-rdbms-service:3306/WSO2EI_INTEGRATOR_CONFIG_GOV_DB?autoReconnect=true&useSSL=false + wso2carbon + wso2carbon + com.mysql.jdbc.Driver + 80 + 60000 + true + SELECT 1 + 30000 + + + + + WSO2_USER_DB + The datasource is used for user mangement and userstore + + jdbc/WSO2UserDB + + + + jdbc:mysql://wso2ei-integrator-rdbms-service:3306/WSO2EI_USER_DB?autoReconnect=true&useSSL=false + wso2carbon + wso2carbon + com.mysql.jdbc.Driver + 50 + 60000 + true + SELECT 1 + 30000 + + + + + + + diff --git a/integrator-analytics/confs/integrator/conf/registry.xml b/integrator-analytics/confs/integrator/conf/registry.xml new file mode 100644 index 00000000..9d552e6d --- /dev/null +++ b/integrator-analytics/confs/integrator/conf/registry.xml @@ -0,0 +1,150 @@ + + + + + + + + wso2registry + false + true + / + + + jdbc/WSO2CarbonDB + + + + + jdbc/WSO2ConfigDB + + + wso2config + wso2config + false + / + + + wso2config + /_system/config/integrator + + + wso2config + /_system/governance/integrator + + + + + true + true + 35 + 5 + + 10 + + 10 + + /_system/local/repository/components/org.wso2.carbon.registry/indexing/lastaccesstime + + + + + + + + + + + + + + + + + + + + + + + + + + + + false + + + + true + true + true + true + + diff --git a/integrator-analytics/confs/integrator/conf/user-mgt.xml b/integrator-analytics/confs/integrator/conf/user-mgt.xml new file mode 100644 index 00000000..801f8cac --- /dev/null +++ b/integrator-analytics/confs/integrator/conf/user-mgt.xml @@ -0,0 +1,260 @@ + + + + + + true + admin + + admin + admin + + everyone + true + jdbc/WSO2UserDB + + + + + org.wso2.carbon.user.core.tenant.JDBCTenantManager + false + true + true + ^[\S]{3,30}$ + ^[\S]{3,30}$ + Username pattern policy violated + ^[\S]{5,30}$ + ^[\S]{5,30}$ + Password length should be within 5 to 30 characters + ^[\S]{3,30}$ + ^[\S]{3,30}$ + true + false + true + SHA-256 + true + , + 100 + 100 + true + false + + + + + + + + + + + + + /permission + true + false + + + + + diff --git a/integrator-analytics/confs/integrator/repository/deployment/server/eventpublishers/MessageFlowConfigurationPublisher.xml b/integrator-analytics/confs/integrator/repository/deployment/server/eventpublishers/MessageFlowConfigurationPublisher.xml new file mode 100644 index 00000000..8b7a5235 --- /dev/null +++ b/integrator-analytics/confs/integrator/repository/deployment/server/eventpublishers/MessageFlowConfigurationPublisher.xml @@ -0,0 +1,13 @@ + + + + + + admin + thrift + blocking + 0 + tcp://integrator-with-analytics-ei-analytics-1-service:7612,tcp://integrator-with-analytics-ei-analytics-2-service:7612 + admin + + \ No newline at end of file diff --git a/integrator-analytics/confs/integrator/repository/deployment/server/eventpublishers/MessageFlowStatisticsPublisher.xml b/integrator-analytics/confs/integrator/repository/deployment/server/eventpublishers/MessageFlowStatisticsPublisher.xml new file mode 100644 index 00000000..5128cccc --- /dev/null +++ b/integrator-analytics/confs/integrator/repository/deployment/server/eventpublishers/MessageFlowStatisticsPublisher.xml @@ -0,0 +1,13 @@ + + + + + + admin + thrift + non-blocking + 0 + tcp://integrator-with-analytics-ei-analytics-1-service:7612,tcp://integrator-with-analytics-ei-analytics-2-service:7612 + admin + + \ No newline at end of file diff --git a/integrator-analytics/ingresses/integrator-analytics-ingress.yaml b/integrator-analytics/ingresses/integrator-analytics-ingress.yaml new file mode 100644 index 00000000..e25d4e54 --- /dev/null +++ b/integrator-analytics/ingresses/integrator-analytics-ingress.yaml @@ -0,0 +1,40 @@ +# Copyright (c) 2018, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +apiVersion: extensions/v1beta1 +kind: Ingress +metadata: + name: integrator-with-analytics-ei-analytics-ingress + annotations: + kubernetes.io/ingress.class: "nginx" + nginx.ingress.kubernetes.io/ssl-passthrough: "true" + nginx.ingress.kubernetes.io/affinity: "cookie" + nginx.ingress.kubernetes.io/session-cookie-name: "route" + nginx.ingress.kubernetes.io/session-cookie-hash: "sha1" +spec: + tls: + - hosts: + - wso2ei-analytics + rules: + - host: wso2ei-analytics + http: + paths: + - path: / + backend: + serviceName: integrator-with-analytics-ei-analytics-service + servicePort: 9444 + - path: /spark + backend: + serviceName: integrator-with-analytics-ei-analytics-service + servicePort: 8082 \ No newline at end of file diff --git a/integrator-analytics/ingresses/integrator-gateway-ingress.yaml b/integrator-analytics/ingresses/integrator-gateway-ingress.yaml new file mode 100644 index 00000000..6de6d87e --- /dev/null +++ b/integrator-analytics/ingresses/integrator-gateway-ingress.yaml @@ -0,0 +1,33 @@ +# Copyright (c) 2018, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +apiVersion: extensions/v1beta1 +kind: Ingress +metadata: + name: wso2ei-integrator-gateway-tls-ingress + annotations: + kubernetes.io/ingress.class: "nginx" + nginx.ingress.kubernetes.io/ssl-passthrough: "true" +spec: + tls: + - hosts: + - wso2ei-integrator-gateway + rules: + - host: wso2ei-integrator-gateway + http: + paths: + - path: / + backend: + serviceName: wso2ei-integrator-gateway-service + servicePort: 8243 diff --git a/integrator-analytics/ingresses/integrator-ingress.yaml b/integrator-analytics/ingresses/integrator-ingress.yaml new file mode 100644 index 00000000..cc3c0a06 --- /dev/null +++ b/integrator-analytics/ingresses/integrator-ingress.yaml @@ -0,0 +1,36 @@ +# Copyright (c) 2018, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +apiVersion: extensions/v1beta1 +kind: Ingress +metadata: + name: wso2ei-integrator-ingress + annotations: + kubernetes.io/ingress.class: "nginx" + nginx.ingress.kubernetes.io/ssl-passthrough: "true" + nginx.ingress.kubernetes.io/affinity: "cookie" + nginx.ingress.kubernetes.io/session-cookie-name: "route" + nginx.ingress.kubernetes.io/session-cookie-hash: "sha1" +spec: + tls: + - hosts: + - wso2ei-integrator + rules: + - host: wso2ei-integrator + http: + paths: + - path: / + backend: + serviceName: wso2ei-integrator-service + servicePort: 9443 diff --git a/integrator-analytics/integrator/integrator-deployment.yaml b/integrator-analytics/integrator/integrator-deployment.yaml new file mode 100644 index 00000000..08596c38 --- /dev/null +++ b/integrator-analytics/integrator/integrator-deployment.yaml @@ -0,0 +1,90 @@ +# Copyright (c) 2017, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +apiVersion: apps/v1beta1 +kind: Deployment +metadata: + name: wso2ei-integrator-deployment +spec: + replicas: 1 + minReadySeconds: 30 + strategy: + rollingUpdate: + maxSurge: 1 + maxUnavailable: 0 + type: RollingUpdate + template: + metadata: + labels: + deployment: wso2ei-integrator + spec: + containers: + - name: wso2ei-integrator + image: docker.wso2.com/wso2ei-integrator:6.2.0 + livenessProbe: + exec: + command: + - /bin/bash + - -c + - nc -z localhost 9443 + initialDelaySeconds: 100 + periodSeconds: 10 + readinessProbe: + exec: + command: + - /bin/bash + - -c + - nc -z localhost 9443 + initialDelaySeconds: 100 + periodSeconds: 10 + imagePullPolicy: Always + ports: + - containerPort: 8280 + protocol: TCP + - containerPort: 8243 + protocol: TCP + - containerPort: 9763 + protocol: TCP + - containerPort: 9443 + protocol: TCP + volumeMounts: + - name: integrator-conf + mountPath: /home/wso2carbon/kubernetes-volumes/integrator/conf + - name: integrator-conf-axis2 + mountPath: /home/wso2carbon/kubernetes-volumes/integrator/conf-axis2 + - name: integrator-conf-datasources + mountPath: /home/wso2carbon/kubernetes-volumes/integrator/conf-datasources + - name: integrator-conf-event-publishers + mountPath: /home/wso2carbon/kubernetes-volumes/integrator/conf-event-publishers + - name: shared-pd + mountPath: /home/wso2carbon/wso2ei-6.2.0/repository/deployment/server + serviceAccountName: "wso2svc-account" + imagePullSecrets: + - name: wso2creds + volumes: + - name: integrator-conf + configMap: + name: integrator-conf + - name: integrator-conf-axis2 + configMap: + name: integrator-conf-axis2 + - name: integrator-conf-datasources + configMap: + name: integrator-conf-datasources + - name: integrator-conf-event-publishers + configMap: + name: integrator-conf-event-publishers + - name: shared-pd + persistentVolumeClaim: + claimName: integrator-shared-deployment-volume-claim diff --git a/integrator-analytics/integrator/integrator-gateway-service.yaml b/integrator-analytics/integrator/integrator-gateway-service.yaml new file mode 100644 index 00000000..44c8895d --- /dev/null +++ b/integrator-analytics/integrator/integrator-gateway-service.yaml @@ -0,0 +1,30 @@ +# Copyright (c) 2017, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +apiVersion: v1 +kind: Service +metadata: + name: wso2ei-integrator-gateway-service +spec: + selector: + deployment: wso2ei-integrator + ports: + - name: pass-through-http + port: 8280 + targetPort: 8280 + protocol: TCP + - name: pass-through-https + port: 8243 + targetPort: 8243 + protocol: TCP diff --git a/integrator-analytics/integrator/integrator-service.yaml b/integrator-analytics/integrator/integrator-service.yaml new file mode 100644 index 00000000..df7311fe --- /dev/null +++ b/integrator-analytics/integrator/integrator-service.yaml @@ -0,0 +1,30 @@ +# Copyright (c) 2017, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +apiVersion: v1 +kind: Service +metadata: + name: wso2ei-integrator-service +spec: + selector: + deployment: wso2ei-integrator + ports: + - name: servlet-http + port: 9763 + targetPort: 9763 + protocol: TCP + - name: servlet-https + port: 9443 + targetPort: 9443 + protocol: TCP diff --git a/integrator-analytics/integrator/integrator-volume-claims.yaml b/integrator-analytics/integrator/integrator-volume-claims.yaml new file mode 100644 index 00000000..39dcab57 --- /dev/null +++ b/integrator-analytics/integrator/integrator-volume-claims.yaml @@ -0,0 +1,45 @@ +# Copyright (c) 2018, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: integrator-shared-deployment-volume-claim +spec: + accessModes: + - ReadWriteMany + resources: + requests: + storage: 1Gi + storageClassName: "" + selector: + matchLabels: + purpose: integrator-shared-deployment + +--- + +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: integrator-shared-tenants-volume-claim +spec: + accessModes: + - ReadWriteMany + resources: + requests: + storage: 1Gi + storageClassName: "" + selector: + matchLabels: + purpose: integrator-shared-tenants diff --git a/integrator-analytics/test/confs/mysql/dbscripts/init.sql b/integrator-analytics/test/confs/mysql/dbscripts/init.sql new file mode 100644 index 00000000..9f546b3d --- /dev/null +++ b/integrator-analytics/test/confs/mysql/dbscripts/init.sql @@ -0,0 +1,502 @@ +-- +-- Copyright 2017 WSO2 Inc. (http://wso2.org) +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- + +DROP DATABASE IF EXISTS WSO2EI_USER_DB; +DROP DATABASE IF EXISTS WSO2EI_INTEGRATOR_CONFIG_GOV_DB; +DROP DATABASE IF EXISTS WSO2_ANALYTICS_EVENT_STORE_DB; +DROP DATABASE IF EXISTS WSO2_ANALYTICS_PROCESSED_DATA_STORE_DB; + +CREATE DATABASE WSO2EI_USER_DB; +CREATE DATABASE WSO2EI_INTEGRATOR_CONFIG_GOV_DB; +CREATE DATABASE WSO2_ANALYTICS_EVENT_STORE_DB; +CREATE DATABASE WSO2_ANALYTICS_PROCESSED_DATA_STORE_DB; + +CREATE USER IF NOT EXISTS 'wso2carbon'@'%' IDENTIFIED BY 'wso2carbon'; +GRANT ALL ON WSO2EI_USER_DB.* TO 'wso2carbon'@'%' IDENTIFIED BY 'wso2carbon'; +GRANT ALL ON WSO2EI_INTEGRATOR_CONFIG_GOV_DB.* TO 'wso2carbon'@'%' IDENTIFIED BY 'wso2carbon'; +GRANT ALL ON WSO2_ANALYTICS_EVENT_STORE_DB.* TO 'wso2carbon'@'%' IDENTIFIED BY 'wso2carbon'; +GRANT ALL ON WSO2_ANALYTICS_PROCESSED_DATA_STORE_DB.* TO 'wso2carbon'@'%' IDENTIFIED BY 'wso2carbon'; + +USE WSO2EI_USER_DB; + +-- ################################ +-- USER MANAGER TABLES +-- ################################ + +CREATE TABLE UM_TENANT ( + UM_ID INTEGER NOT NULL AUTO_INCREMENT, + UM_DOMAIN_NAME VARCHAR(255) NOT NULL, + UM_EMAIL VARCHAR(255), + UM_ACTIVE BOOLEAN DEFAULT FALSE, + UM_CREATED_DATE TIMESTAMP NOT NULL, + UM_USER_CONFIG LONGBLOB, + PRIMARY KEY (UM_ID), + UNIQUE(UM_DOMAIN_NAME) +)ENGINE INNODB; + +CREATE TABLE UM_DOMAIN( + UM_DOMAIN_ID INTEGER NOT NULL AUTO_INCREMENT, + UM_DOMAIN_NAME VARCHAR(255), + UM_TENANT_ID INTEGER DEFAULT 0, + PRIMARY KEY (UM_DOMAIN_ID, UM_TENANT_ID) +)ENGINE INNODB; + +CREATE UNIQUE INDEX INDEX_UM_TENANT_UM_DOMAIN_NAME + ON UM_TENANT (UM_DOMAIN_NAME); + +CREATE TABLE UM_USER ( + UM_ID INTEGER NOT NULL AUTO_INCREMENT, + UM_USER_NAME VARCHAR(255) NOT NULL, + UM_USER_PASSWORD VARCHAR(255) NOT NULL, + UM_SALT_VALUE VARCHAR(31), + UM_REQUIRE_CHANGE BOOLEAN DEFAULT FALSE, + UM_CHANGED_TIME TIMESTAMP NOT NULL, + UM_TENANT_ID INTEGER DEFAULT 0, + PRIMARY KEY (UM_ID, UM_TENANT_ID), + UNIQUE(UM_USER_NAME, UM_TENANT_ID) +)ENGINE INNODB; + +CREATE TABLE UM_SYSTEM_USER ( + UM_ID INTEGER NOT NULL AUTO_INCREMENT, + UM_USER_NAME VARCHAR(255) NOT NULL, + UM_USER_PASSWORD VARCHAR(255) NOT NULL, + UM_SALT_VALUE VARCHAR(31), + UM_REQUIRE_CHANGE BOOLEAN DEFAULT FALSE, + UM_CHANGED_TIME TIMESTAMP NOT NULL, + UM_TENANT_ID INTEGER DEFAULT 0, + PRIMARY KEY (UM_ID, UM_TENANT_ID), + UNIQUE(UM_USER_NAME, UM_TENANT_ID) +)ENGINE INNODB; + +CREATE TABLE UM_ROLE ( + UM_ID INTEGER NOT NULL AUTO_INCREMENT, + UM_ROLE_NAME VARCHAR(255) NOT NULL, + UM_TENANT_ID INTEGER DEFAULT 0, + UM_SHARED_ROLE BOOLEAN DEFAULT FALSE, + PRIMARY KEY (UM_ID, UM_TENANT_ID), + UNIQUE(UM_ROLE_NAME, UM_TENANT_ID) +)ENGINE INNODB; + + +CREATE TABLE UM_MODULE( + UM_ID INTEGER NOT NULL AUTO_INCREMENT, + UM_MODULE_NAME VARCHAR(100), + UNIQUE(UM_MODULE_NAME), + PRIMARY KEY(UM_ID) +)ENGINE INNODB; + +CREATE TABLE UM_MODULE_ACTIONS( + UM_ACTION VARCHAR(255) NOT NULL, + UM_MODULE_ID INTEGER NOT NULL, + PRIMARY KEY(UM_ACTION, UM_MODULE_ID), + FOREIGN KEY (UM_MODULE_ID) REFERENCES UM_MODULE(UM_ID) ON DELETE CASCADE +)ENGINE INNODB; + +CREATE TABLE UM_PERMISSION ( + UM_ID INTEGER NOT NULL AUTO_INCREMENT, + UM_RESOURCE_ID VARCHAR(255) NOT NULL, + UM_ACTION VARCHAR(255) NOT NULL, + UM_TENANT_ID INTEGER DEFAULT 0, + UM_MODULE_ID INTEGER DEFAULT 0, + UNIQUE(UM_RESOURCE_ID,UM_ACTION, UM_TENANT_ID), + PRIMARY KEY (UM_ID, UM_TENANT_ID) +)ENGINE INNODB; + +CREATE INDEX INDEX_UM_PERMISSION_UM_RESOURCE_ID_UM_ACTION ON UM_PERMISSION (UM_RESOURCE_ID, UM_ACTION, UM_TENANT_ID); + +CREATE TABLE UM_ROLE_PERMISSION ( + UM_ID INTEGER NOT NULL AUTO_INCREMENT, + UM_PERMISSION_ID INTEGER NOT NULL, + UM_ROLE_NAME VARCHAR(255) NOT NULL, + UM_IS_ALLOWED SMALLINT NOT NULL, + UM_TENANT_ID INTEGER DEFAULT 0, + UM_DOMAIN_ID INTEGER, + UNIQUE (UM_PERMISSION_ID, UM_ROLE_NAME, UM_TENANT_ID, UM_DOMAIN_ID), + FOREIGN KEY (UM_PERMISSION_ID, UM_TENANT_ID) REFERENCES UM_PERMISSION(UM_ID, UM_TENANT_ID) ON DELETE CASCADE, + FOREIGN KEY (UM_DOMAIN_ID, UM_TENANT_ID) REFERENCES UM_DOMAIN(UM_DOMAIN_ID, UM_TENANT_ID) ON DELETE CASCADE, + PRIMARY KEY (UM_ID, UM_TENANT_ID) +)ENGINE INNODB; + +-- REMOVED UNIQUE (UM_PERMISSION_ID, UM_ROLE_ID) +CREATE TABLE UM_USER_PERMISSION ( + UM_ID INTEGER NOT NULL AUTO_INCREMENT, + UM_PERMISSION_ID INTEGER NOT NULL, + UM_USER_NAME VARCHAR(255) NOT NULL, + UM_IS_ALLOWED SMALLINT NOT NULL, + UM_TENANT_ID INTEGER DEFAULT 0, + FOREIGN KEY (UM_PERMISSION_ID, UM_TENANT_ID) REFERENCES UM_PERMISSION(UM_ID, UM_TENANT_ID) ON DELETE CASCADE, + PRIMARY KEY (UM_ID, UM_TENANT_ID) +)ENGINE INNODB; + +-- REMOVED UNIQUE (UM_PERMISSION_ID, UM_USER_ID) +CREATE TABLE UM_USER_ROLE ( + UM_ID INTEGER NOT NULL AUTO_INCREMENT, + UM_ROLE_ID INTEGER NOT NULL, + UM_USER_ID INTEGER NOT NULL, + UM_TENANT_ID INTEGER DEFAULT 0, + UNIQUE (UM_USER_ID, UM_ROLE_ID, UM_TENANT_ID), + FOREIGN KEY (UM_ROLE_ID, UM_TENANT_ID) REFERENCES UM_ROLE(UM_ID, UM_TENANT_ID), + FOREIGN KEY (UM_USER_ID, UM_TENANT_ID) REFERENCES UM_USER(UM_ID, UM_TENANT_ID), + PRIMARY KEY (UM_ID, UM_TENANT_ID) +)ENGINE INNODB; + +CREATE TABLE UM_SHARED_USER_ROLE( + UM_ROLE_ID INTEGER NOT NULL, + UM_USER_ID INTEGER NOT NULL, + UM_USER_TENANT_ID INTEGER NOT NULL, + UM_ROLE_TENANT_ID INTEGER NOT NULL, + UNIQUE(UM_USER_ID,UM_ROLE_ID,UM_USER_TENANT_ID, UM_ROLE_TENANT_ID), + FOREIGN KEY(UM_ROLE_ID,UM_ROLE_TENANT_ID) REFERENCES UM_ROLE(UM_ID,UM_TENANT_ID) ON DELETE CASCADE, + FOREIGN KEY(UM_USER_ID,UM_USER_TENANT_ID) REFERENCES UM_USER(UM_ID,UM_TENANT_ID) ON DELETE CASCADE +)ENGINE INNODB; + +CREATE TABLE UM_ACCOUNT_MAPPING( + UM_ID INTEGER NOT NULL AUTO_INCREMENT, + UM_USER_NAME VARCHAR(255) NOT NULL, + UM_TENANT_ID INTEGER NOT NULL, + UM_USER_STORE_DOMAIN VARCHAR(100), + UM_ACC_LINK_ID INTEGER NOT NULL, + UNIQUE(UM_USER_NAME, UM_TENANT_ID, UM_USER_STORE_DOMAIN, UM_ACC_LINK_ID), + FOREIGN KEY (UM_TENANT_ID) REFERENCES UM_TENANT(UM_ID) ON DELETE CASCADE, + PRIMARY KEY (UM_ID) +)ENGINE INNODB; + + +CREATE TABLE UM_USER_ATTRIBUTE ( + UM_ID INTEGER NOT NULL AUTO_INCREMENT, + UM_ATTR_NAME VARCHAR(255) NOT NULL, + UM_ATTR_VALUE VARCHAR(1024), + UM_PROFILE_ID VARCHAR(255), + UM_USER_ID INTEGER, + UM_TENANT_ID INTEGER DEFAULT 0, + FOREIGN KEY (UM_USER_ID, UM_TENANT_ID) REFERENCES UM_USER(UM_ID, UM_TENANT_ID), + PRIMARY KEY (UM_ID, UM_TENANT_ID) +)ENGINE INNODB; + +CREATE INDEX UM_USER_ID_INDEX ON UM_USER_ATTRIBUTE(UM_USER_ID); + +CREATE TABLE UM_DIALECT( + UM_ID INTEGER NOT NULL AUTO_INCREMENT, + UM_DIALECT_URI VARCHAR(255) NOT NULL, + UM_TENANT_ID INTEGER DEFAULT 0, + UNIQUE(UM_DIALECT_URI, UM_TENANT_ID), + PRIMARY KEY (UM_ID, UM_TENANT_ID) +)ENGINE INNODB; + +CREATE TABLE UM_CLAIM( + UM_ID INTEGER NOT NULL AUTO_INCREMENT, + UM_DIALECT_ID INTEGER NOT NULL, + UM_CLAIM_URI VARCHAR(255) NOT NULL, + UM_DISPLAY_TAG VARCHAR(255), + UM_DESCRIPTION VARCHAR(255), + UM_MAPPED_ATTRIBUTE_DOMAIN VARCHAR(255), + UM_MAPPED_ATTRIBUTE VARCHAR(255), + UM_REG_EX VARCHAR(255), + UM_SUPPORTED SMALLINT, + UM_REQUIRED SMALLINT, + UM_DISPLAY_ORDER INTEGER, + UM_CHECKED_ATTRIBUTE SMALLINT, + UM_READ_ONLY SMALLINT, + UM_TENANT_ID INTEGER DEFAULT 0, + UNIQUE(UM_DIALECT_ID, UM_CLAIM_URI, UM_TENANT_ID,UM_MAPPED_ATTRIBUTE_DOMAIN), + FOREIGN KEY(UM_DIALECT_ID, UM_TENANT_ID) REFERENCES UM_DIALECT(UM_ID, UM_TENANT_ID), + PRIMARY KEY (UM_ID, UM_TENANT_ID) +)ENGINE INNODB; + + +CREATE TABLE UM_PROFILE_CONFIG( + UM_ID INTEGER NOT NULL AUTO_INCREMENT, + UM_DIALECT_ID INTEGER NOT NULL, + UM_PROFILE_NAME VARCHAR(255), + UM_TENANT_ID INTEGER DEFAULT 0, + FOREIGN KEY(UM_DIALECT_ID, UM_TENANT_ID) REFERENCES UM_DIALECT(UM_ID, UM_TENANT_ID), + PRIMARY KEY (UM_ID, UM_TENANT_ID) +)ENGINE INNODB; + + +CREATE TABLE UM_HYBRID_ROLE( + UM_ID INTEGER NOT NULL AUTO_INCREMENT, + UM_ROLE_NAME VARCHAR(255), + UM_TENANT_ID INTEGER DEFAULT 0, + PRIMARY KEY (UM_ID, UM_TENANT_ID) +)ENGINE INNODB; + +CREATE TABLE UM_HYBRID_USER_ROLE( + UM_ID INTEGER NOT NULL AUTO_INCREMENT, + UM_USER_NAME VARCHAR(255), + UM_ROLE_ID INTEGER NOT NULL, + UM_TENANT_ID INTEGER DEFAULT 0, + UM_DOMAIN_ID INTEGER, + UNIQUE (UM_USER_NAME, UM_ROLE_ID, UM_TENANT_ID, UM_DOMAIN_ID), + FOREIGN KEY (UM_ROLE_ID, UM_TENANT_ID) REFERENCES UM_HYBRID_ROLE(UM_ID, UM_TENANT_ID) ON DELETE CASCADE, + FOREIGN KEY (UM_DOMAIN_ID, UM_TENANT_ID) REFERENCES UM_DOMAIN(UM_DOMAIN_ID, UM_TENANT_ID) ON DELETE CASCADE, + PRIMARY KEY (UM_ID, UM_TENANT_ID) +)ENGINE INNODB; + +CREATE TABLE UM_SYSTEM_ROLE( + UM_ID INTEGER NOT NULL AUTO_INCREMENT, + UM_ROLE_NAME VARCHAR(255), + UM_TENANT_ID INTEGER DEFAULT 0, + PRIMARY KEY (UM_ID, UM_TENANT_ID) +)ENGINE INNODB; + +CREATE TABLE UM_SYSTEM_USER_ROLE( + UM_ID INTEGER NOT NULL AUTO_INCREMENT, + UM_USER_NAME VARCHAR(255), + UM_ROLE_ID INTEGER NOT NULL, + UM_TENANT_ID INTEGER DEFAULT 0, + UNIQUE (UM_USER_NAME, UM_ROLE_ID, UM_TENANT_ID), + FOREIGN KEY (UM_ROLE_ID, UM_TENANT_ID) REFERENCES UM_SYSTEM_ROLE(UM_ID, UM_TENANT_ID), + PRIMARY KEY (UM_ID, UM_TENANT_ID) +)ENGINE INNODB; + + +CREATE TABLE UM_HYBRID_REMEMBER_ME( + UM_ID INTEGER NOT NULL AUTO_INCREMENT, + UM_USER_NAME VARCHAR(255) NOT NULL, + UM_COOKIE_VALUE VARCHAR(1024), + UM_CREATED_TIME TIMESTAMP, + UM_TENANT_ID INTEGER DEFAULT 0, + PRIMARY KEY (UM_ID, UM_TENANT_ID) +)ENGINE INNODB; + +USE WSO2EI_INTEGRATOR_CONFIG_GOV_DB; + +CREATE TABLE IF NOT EXISTS REG_CLUSTER_LOCK ( + REG_LOCK_NAME VARCHAR (20), + REG_LOCK_STATUS VARCHAR (20), + REG_LOCKED_TIME TIMESTAMP, + REG_TENANT_ID INTEGER DEFAULT 0, + PRIMARY KEY (REG_LOCK_NAME) +)ENGINE INNODB; + +CREATE TABLE IF NOT EXISTS REG_LOG ( + REG_LOG_ID INTEGER AUTO_INCREMENT, + REG_PATH VARCHAR (750), + REG_USER_ID VARCHAR (31) NOT NULL, + REG_LOGGED_TIME TIMESTAMP NOT NULL, + REG_ACTION INTEGER NOT NULL, + REG_ACTION_DATA VARCHAR (500), + REG_TENANT_ID INTEGER DEFAULT 0, + PRIMARY KEY (REG_LOG_ID, REG_TENANT_ID) +)ENGINE INNODB; + +CREATE INDEX REG_LOG_IND_BY_REGLOG USING HASH ON REG_LOG(REG_LOGGED_TIME, REG_TENANT_ID); + +-- The REG_PATH_VALUE should be less than 767 bytes, and hence was fixed at 750. +-- See CARBON-5917. + +CREATE TABLE IF NOT EXISTS REG_PATH( + REG_PATH_ID INTEGER NOT NULL AUTO_INCREMENT, + REG_PATH_VALUE VARCHAR(750) NOT NULL, + REG_PATH_PARENT_ID INTEGER, + REG_TENANT_ID INTEGER DEFAULT 0, + CONSTRAINT PK_REG_PATH PRIMARY KEY(REG_PATH_ID, REG_TENANT_ID) +)ENGINE INNODB; + +CREATE INDEX REG_PATH_IND_BY_PATH_VALUE USING HASH ON REG_PATH(REG_PATH_VALUE, REG_TENANT_ID); +CREATE INDEX REG_PATH_IND_BY_PATH_PARENT_ID USING HASH ON REG_PATH(REG_PATH_PARENT_ID, REG_TENANT_ID); + +CREATE TABLE IF NOT EXISTS REG_CONTENT ( + REG_CONTENT_ID INTEGER NOT NULL AUTO_INCREMENT, + REG_CONTENT_DATA LONGBLOB, + REG_TENANT_ID INTEGER DEFAULT 0, + CONSTRAINT PK_REG_CONTENT PRIMARY KEY(REG_CONTENT_ID, REG_TENANT_ID) +)ENGINE INNODB; + +CREATE TABLE IF NOT EXISTS REG_CONTENT_HISTORY ( + REG_CONTENT_ID INTEGER NOT NULL, + REG_CONTENT_DATA LONGBLOB, + REG_DELETED SMALLINT, + REG_TENANT_ID INTEGER DEFAULT 0, + CONSTRAINT PK_REG_CONTENT_HISTORY PRIMARY KEY(REG_CONTENT_ID, REG_TENANT_ID) +)ENGINE INNODB; + +CREATE TABLE IF NOT EXISTS REG_RESOURCE ( + REG_PATH_ID INTEGER NOT NULL, + REG_NAME VARCHAR(256), + REG_VERSION INTEGER NOT NULL AUTO_INCREMENT, + REG_MEDIA_TYPE VARCHAR(500), + REG_CREATOR VARCHAR(31) NOT NULL, + REG_CREATED_TIME TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + REG_LAST_UPDATOR VARCHAR(31), + REG_LAST_UPDATED_TIME TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + REG_DESCRIPTION VARCHAR(1000), + REG_CONTENT_ID INTEGER, + REG_TENANT_ID INTEGER DEFAULT 0, + REG_UUID VARCHAR(100) NOT NULL, + CONSTRAINT PK_REG_RESOURCE PRIMARY KEY(REG_VERSION, REG_TENANT_ID) +)ENGINE INNODB; + +ALTER TABLE REG_RESOURCE ADD CONSTRAINT REG_RESOURCE_FK_BY_PATH_ID FOREIGN KEY (REG_PATH_ID, REG_TENANT_ID) REFERENCES REG_PATH (REG_PATH_ID, REG_TENANT_ID); +ALTER TABLE REG_RESOURCE ADD CONSTRAINT REG_RESOURCE_FK_BY_CONTENT_ID FOREIGN KEY (REG_CONTENT_ID, REG_TENANT_ID) REFERENCES REG_CONTENT (REG_CONTENT_ID, REG_TENANT_ID); +CREATE INDEX REG_RESOURCE_IND_BY_NAME USING HASH ON REG_RESOURCE(REG_NAME, REG_TENANT_ID); +CREATE INDEX REG_RESOURCE_IND_BY_PATH_ID_NAME USING HASH ON REG_RESOURCE(REG_PATH_ID, REG_NAME, REG_TENANT_ID); +CREATE INDEX REG_RESOURCE_IND_BY_UUID USING HASH ON REG_RESOURCE(REG_UUID); +CREATE INDEX REG_RESOURCE_IND_BY_TENAN USING HASH ON REG_RESOURCE(REG_TENANT_ID, REG_UUID); +CREATE INDEX REG_RESOURCE_IND_BY_TYPE USING HASH ON REG_RESOURCE(REG_TENANT_ID, REG_MEDIA_TYPE); + +CREATE TABLE IF NOT EXISTS REG_RESOURCE_HISTORY ( + REG_PATH_ID INTEGER NOT NULL, + REG_NAME VARCHAR(256), + REG_VERSION INTEGER NOT NULL, + REG_MEDIA_TYPE VARCHAR(500), + REG_CREATOR VARCHAR(31) NOT NULL, + REG_CREATED_TIME TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + REG_LAST_UPDATOR VARCHAR(31), + REG_LAST_UPDATED_TIME TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + REG_DESCRIPTION VARCHAR(1000), + REG_CONTENT_ID INTEGER, + REG_DELETED SMALLINT, + REG_TENANT_ID INTEGER DEFAULT 0, + REG_UUID VARCHAR(100) NOT NULL, + CONSTRAINT PK_REG_RESOURCE_HISTORY PRIMARY KEY(REG_VERSION, REG_TENANT_ID) +)ENGINE INNODB; + +ALTER TABLE REG_RESOURCE_HISTORY ADD CONSTRAINT REG_RESOURCE_HIST_FK_BY_PATHID FOREIGN KEY (REG_PATH_ID, REG_TENANT_ID) REFERENCES REG_PATH (REG_PATH_ID, REG_TENANT_ID); +ALTER TABLE REG_RESOURCE_HISTORY ADD CONSTRAINT REG_RESOURCE_HIST_FK_BY_CONTENT_ID FOREIGN KEY (REG_CONTENT_ID, REG_TENANT_ID) REFERENCES REG_CONTENT_HISTORY (REG_CONTENT_ID, REG_TENANT_ID); +CREATE INDEX REG_RESOURCE_HISTORY_IND_BY_NAME USING HASH ON REG_RESOURCE_HISTORY(REG_NAME, REG_TENANT_ID); +CREATE INDEX REG_RESOURCE_HISTORY_IND_BY_PATH_ID_NAME USING HASH ON REG_RESOURCE(REG_PATH_ID, REG_NAME, REG_TENANT_ID); + +CREATE TABLE IF NOT EXISTS REG_COMMENT ( + REG_ID INTEGER NOT NULL AUTO_INCREMENT, + REG_COMMENT_TEXT VARCHAR(500) NOT NULL, + REG_USER_ID VARCHAR(31) NOT NULL, + REG_COMMENTED_TIME TIMESTAMP NOT NULL, + REG_TENANT_ID INTEGER DEFAULT 0, + CONSTRAINT PK_REG_COMMENT PRIMARY KEY(REG_ID, REG_TENANT_ID) +)ENGINE INNODB; + +CREATE TABLE IF NOT EXISTS REG_RESOURCE_COMMENT ( + REG_COMMENT_ID INTEGER NOT NULL, + REG_VERSION INTEGER, + REG_PATH_ID INTEGER, + REG_RESOURCE_NAME VARCHAR(256), + REG_TENANT_ID INTEGER DEFAULT 0 +)ENGINE INNODB; + +ALTER TABLE REG_RESOURCE_COMMENT ADD CONSTRAINT REG_RESOURCE_COMMENT_FK_BY_PATH_ID FOREIGN KEY (REG_PATH_ID, REG_TENANT_ID) REFERENCES REG_PATH (REG_PATH_ID, REG_TENANT_ID); +ALTER TABLE REG_RESOURCE_COMMENT ADD CONSTRAINT REG_RESOURCE_COMMENT_FK_BY_COMMENT_ID FOREIGN KEY (REG_COMMENT_ID, REG_TENANT_ID) REFERENCES REG_COMMENT (REG_ID, REG_TENANT_ID); +CREATE INDEX REG_RESOURCE_COMMENT_IND_BY_PATH_ID_AND_RESOURCE_NAME USING HASH ON REG_RESOURCE_COMMENT(REG_PATH_ID, REG_RESOURCE_NAME, REG_TENANT_ID); +CREATE INDEX REG_RESOURCE_COMMENT_IND_BY_VERSION USING HASH ON REG_RESOURCE_COMMENT(REG_VERSION, REG_TENANT_ID); + +CREATE TABLE IF NOT EXISTS REG_RATING ( + REG_ID INTEGER NOT NULL AUTO_INCREMENT, + REG_RATING INTEGER NOT NULL, + REG_USER_ID VARCHAR(31) NOT NULL, + REG_RATED_TIME TIMESTAMP NOT NULL, + REG_TENANT_ID INTEGER DEFAULT 0, + CONSTRAINT PK_REG_RATING PRIMARY KEY(REG_ID, REG_TENANT_ID) +)ENGINE INNODB; + +CREATE TABLE IF NOT EXISTS REG_RESOURCE_RATING ( + REG_RATING_ID INTEGER NOT NULL, + REG_VERSION INTEGER, + REG_PATH_ID INTEGER, + REG_RESOURCE_NAME VARCHAR(256), + REG_TENANT_ID INTEGER DEFAULT 0 +)ENGINE INNODB; + +ALTER TABLE REG_RESOURCE_RATING ADD CONSTRAINT REG_RESOURCE_RATING_FK_BY_PATH_ID FOREIGN KEY (REG_PATH_ID, REG_TENANT_ID) REFERENCES REG_PATH (REG_PATH_ID, REG_TENANT_ID); +ALTER TABLE REG_RESOURCE_RATING ADD CONSTRAINT REG_RESOURCE_RATING_FK_BY_RATING_ID FOREIGN KEY (REG_RATING_ID, REG_TENANT_ID) REFERENCES REG_RATING (REG_ID, REG_TENANT_ID); +CREATE INDEX REG_RESOURCE_RATING_IND_BY_PATH_ID_AND_RESOURCE_NAME USING HASH ON REG_RESOURCE_RATING(REG_PATH_ID, REG_RESOURCE_NAME, REG_TENANT_ID); +CREATE INDEX REG_RESOURCE_RATING_IND_BY_VERSION USING HASH ON REG_RESOURCE_RATING(REG_VERSION, REG_TENANT_ID); + + +CREATE TABLE IF NOT EXISTS REG_TAG ( + REG_ID INTEGER NOT NULL AUTO_INCREMENT, + REG_TAG_NAME VARCHAR(500) NOT NULL, + REG_USER_ID VARCHAR(31) NOT NULL, + REG_TAGGED_TIME TIMESTAMP NOT NULL, + REG_TENANT_ID INTEGER DEFAULT 0, + CONSTRAINT PK_REG_TAG PRIMARY KEY(REG_ID, REG_TENANT_ID) +)ENGINE INNODB; + +CREATE TABLE IF NOT EXISTS REG_RESOURCE_TAG ( + REG_TAG_ID INTEGER NOT NULL, + REG_VERSION INTEGER, + REG_PATH_ID INTEGER, + REG_RESOURCE_NAME VARCHAR(256), + REG_TENANT_ID INTEGER DEFAULT 0 +)ENGINE INNODB; + +ALTER TABLE REG_RESOURCE_TAG ADD CONSTRAINT REG_RESOURCE_TAG_FK_BY_PATH_ID FOREIGN KEY (REG_PATH_ID, REG_TENANT_ID) REFERENCES REG_PATH (REG_PATH_ID, REG_TENANT_ID); +ALTER TABLE REG_RESOURCE_TAG ADD CONSTRAINT REG_RESOURCE_TAG_FK_BY_TAG_ID FOREIGN KEY (REG_TAG_ID, REG_TENANT_ID) REFERENCES REG_TAG (REG_ID, REG_TENANT_ID); +CREATE INDEX REG_RESOURCE_TAG_IND_BY_PATH_ID_AND_RESOURCE_NAME USING HASH ON REG_RESOURCE_TAG(REG_PATH_ID, REG_RESOURCE_NAME, REG_TENANT_ID); +CREATE INDEX REG_RESOURCE_TAG_IND_BY_VERSION USING HASH ON REG_RESOURCE_TAG(REG_VERSION, REG_TENANT_ID); + +CREATE TABLE IF NOT EXISTS REG_PROPERTY ( + REG_ID INTEGER NOT NULL AUTO_INCREMENT, + REG_NAME VARCHAR(100) NOT NULL, + REG_VALUE VARCHAR(1000), + REG_TENANT_ID INTEGER DEFAULT 0, + CONSTRAINT PK_REG_PROPERTY PRIMARY KEY(REG_ID, REG_TENANT_ID) +)ENGINE INNODB; + +CREATE TABLE IF NOT EXISTS REG_RESOURCE_PROPERTY ( + REG_PROPERTY_ID INTEGER NOT NULL, + REG_VERSION INTEGER, + REG_PATH_ID INTEGER, + REG_RESOURCE_NAME VARCHAR(256), + REG_TENANT_ID INTEGER DEFAULT 0 +)ENGINE INNODB; + +ALTER TABLE REG_RESOURCE_PROPERTY ADD CONSTRAINT REG_RESOURCE_PROPERTY_FK_BY_PATH_ID FOREIGN KEY (REG_PATH_ID, REG_TENANT_ID) REFERENCES REG_PATH (REG_PATH_ID, REG_TENANT_ID); +ALTER TABLE REG_RESOURCE_PROPERTY ADD CONSTRAINT REG_RESOURCE_PROPERTY_FK_BY_TAG_ID FOREIGN KEY (REG_PROPERTY_ID, REG_TENANT_ID) REFERENCES REG_PROPERTY (REG_ID, REG_TENANT_ID); +CREATE INDEX REG_RESOURCE_PROPERTY_IND_BY_PATH_ID_AND_RESOURCE_NAME USING HASH ON REG_RESOURCE_PROPERTY(REG_PATH_ID, REG_RESOURCE_NAME, REG_TENANT_ID); +CREATE INDEX REG_RESOURCE_PROPERTY_IND_BY_VERSION USING HASH ON REG_RESOURCE_PROPERTY(REG_VERSION, REG_TENANT_ID); + +-- CREATE TABLE IF NOT EXISTS REG_ASSOCIATIONS ( +-- SRC_PATH_ID INTEGER, +-- SRC_RESOURCE_NAME VARCHAR(256), +-- SRC_VERSION INTEGER, +-- TGT_PATH_ID INTEGER, +-- TGT_RESOURCE_NAME VARCHAR(256), +-- TGT_VERSION INTEGER +-- )ENGINE INNODB; +-- +-- ALTER TABLE REG_ASSOCIATIONS ADD CONSTRAINT REG_ASSOCIATIONS_FK_BY_SRC_PATH_ID FOREIGN KEY (SRC_PATH_ID) REFERENCES REG_PATH (PATH_ID); +-- ALTER TABLE REG_ASSOCIATIONS ADD CONSTRAINT REG_ASSOCIATIONS_FK_BY_TGT_PATH_ID FOREIGN KEY (TGT_PATH_ID) REFERENCES REG_PATH (PATH_ID); +-- CREATE INDEX REG_ASSOCIATIONS_IND_BY_SRC_VERSION ON REG_ASSOCIATIONS(SRC_VERSION); +-- CREATE INDEX REG_ASSOCIATIONS_IND_BY_TGT_VERSION ON REG_ASSOCIATIONS(TGT_VERSION); +-- CREATE INDEX REG_ASSOCIATIONS_IND_BY_SRC_RESOURCE_NAME ON REG_ASSOCIATIONS(SRC_RESOURCE_NAME); +-- CREATE INDEX REG_ASSOCIATIONS_IND_BY_TGT_RESOURCE_NAME ON REG_ASSOCIATIONS(TGT_RESOURCE_NAME); + + + +CREATE TABLE IF NOT EXISTS REG_ASSOCIATION ( + REG_ASSOCIATION_ID INTEGER AUTO_INCREMENT, + REG_SOURCEPATH VARCHAR (750) NOT NULL, + REG_TARGETPATH VARCHAR (750) NOT NULL, + REG_ASSOCIATION_TYPE VARCHAR (2000) NOT NULL, + REG_TENANT_ID INTEGER DEFAULT 0, + PRIMARY KEY (REG_ASSOCIATION_ID, REG_TENANT_ID) +)ENGINE INNODB; + +CREATE TABLE IF NOT EXISTS REG_SNAPSHOT ( + REG_SNAPSHOT_ID INTEGER NOT NULL AUTO_INCREMENT, + REG_PATH_ID INTEGER NOT NULL, + REG_RESOURCE_NAME VARCHAR(255), + REG_RESOURCE_VIDS LONGBLOB NOT NULL, + REG_TENANT_ID INTEGER DEFAULT 0, + CONSTRAINT PK_REG_SNAPSHOT PRIMARY KEY(REG_SNAPSHOT_ID, REG_TENANT_ID) +)ENGINE INNODB; + +CREATE INDEX REG_SNAPSHOT_IND_BY_PATH_ID_AND_RESOURCE_NAME USING HASH ON REG_SNAPSHOT(REG_PATH_ID, REG_RESOURCE_NAME, REG_TENANT_ID); + +ALTER TABLE REG_SNAPSHOT ADD CONSTRAINT REG_SNAPSHOT_FK_BY_PATH_ID FOREIGN KEY (REG_PATH_ID, REG_TENANT_ID) REFERENCES REG_PATH (REG_PATH_ID, REG_TENANT_ID); + + diff --git a/integrator-analytics/test/deploy.sh b/integrator-analytics/test/deploy.sh new file mode 100755 index 00000000..0cb319ea --- /dev/null +++ b/integrator-analytics/test/deploy.sh @@ -0,0 +1,96 @@ +#!/usr/bin/env bash + +# ------------------------------------------------------------------------ +# Copyright 2017 WSO2, Inc. (http://wso2.com) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License +# ------------------------------------------------------------------------ + +# methods +set -e + +function echoBold () { + echo $'\e[1m'"${1}"$'\e[0m' +} + +# create a new Kubernetes Namespace +kubectl create namespace wso2 + +# create a new service account in 'wso2' Kubernetes Namespace +kubectl create serviceaccount wso2svc-account -n wso2 + +# switch the context to new 'wso2' namespace +kubectl config set-context $(kubectl config current-context) --namespace=wso2 + +kubectl create secret docker-registry wso2creds --docker-server=docker.wso2.com --docker-username= --docker-password= --docker-email= + +# create Kubernetes role and role binding necessary for the Kubernetes API requests made from Kubernetes membership scheme +kubectl create --username=admin --password= -f ../../rbac/rbac.yaml + +# ConfigMaps +echoBold 'Creating ConfigMaps...' +kubectl create configmap integrator-conf --from-file=../confs/integrator/conf +kubectl create configmap integrator-conf-axis2 --from-file=../confs/integrator/conf/axis2/ +kubectl create configmap integrator-conf-datasources --from-file=../confs/integrator/conf/datasources/ +kubectl create configmap integrator-conf-event-publishers --from-file=../confs/integrator/repository/deployment/server/eventpublishers/ + +kubectl create configmap ei-analytics-1-conf --from-file=../confs/ei-analytics-1/conf +kubectl create configmap ei-analytics-1-conf-analytics --from-file=../confs/ei-analytics-1/conf/analytics +kubectl create configmap ei-analytics-1-conf-spark-analytics --from-file=../confs/ei-analytics-1/conf/analytics/spark +kubectl create configmap ei-analytics-1-conf-axis2 --from-file=../confs/ei-analytics-1/conf/axis2 +kubectl create configmap ei-analytics-1-conf-datasources --from-file=../confs/ei-analytics-1/conf/datasources +kubectl create configmap ei-analytics-1-deployment-portal --from-file=../confs/ei-analytics-1/repository/deployment/server/jaggeryapps/portal/configs + +kubectl create configmap ei-analytics-2-conf --from-file=../confs/ei-analytics-2/conf +kubectl create configmap ei-analytics-2-conf-analytics --from-file=../confs/ei-analytics-2/conf/analytics +kubectl create configmap ei-analytics-2-conf-spark-analytics --from-file=../confs/ei-analytics-2/conf/analytics/spark +kubectl create configmap ei-analytics-2-conf-axis2 --from-file=../confs/ei-analytics-2/conf/axis2 +kubectl create configmap ei-analytics-2-conf-datasources --from-file=../confs/ei-analytics-2/conf/datasources +kubectl create configmap ei-analytics-2-deployment-portal --from-file=../confs/ei-analytics-2/repository/deployment/server/jaggeryapps/portal/configs + +kubectl create configmap mysql-dbscripts --from-file=confs/mysql/dbscripts/ + +# MySQL +echoBold 'Deploying WSO2 Integrator Databases...' +kubectl create -f rdbms/mysql/mysql-service.yaml +kubectl create -f rdbms/mysql/mysql-deployment.yaml +sleep 10s + +# Persistent storage +echoBold 'Creating persistent volume and volume claim...' +kubectl create -f ../integrator/integrator-volume-claims.yaml +kubectl create -f ../analytics/integrator-analytics-volume-claims.yaml +kubectl create -f ../volumes/persistent-volumes.yaml +sleep 30s + +# Integrator +echoBold 'Deploying WSO2 Integrator and Analytics...' +kubectl create -f ../analytics/integrator-analytics-1-deployment.yaml +kubectl create -f ../analytics/integrator-analytics-1-service.yaml +kubectl create -f ../analytics/integrator-analytics-2-deployment.yaml +kubectl create -f ../analytics/integrator-analytics-2-service.yaml +kubectl create -f ../analytics/integrator-analytics-service.yaml + +kubectl create -f ../integrator/integrator-service.yaml +kubectl create -f ../integrator/integrator-gateway-service.yaml +kubectl create -f ../integrator/integrator-deployment.yaml +sleep 30s + +echoBold 'Deploying Ingresses...' +kubectl create -f ../ingresses/integrator-ingress.yaml +kubectl create -f ../ingresses/integrator-gateway-ingress.yaml +kubectl create -f ../ingresses/integrator-analytics-ingress.yaml +sleep 30s + +echoBold 'Finished' +echo 'To access the console, try https://wso2ei-integrator/carbon in your browser.' diff --git a/integrator-analytics/test/rdbms/mysql/mysql-deployment.yaml b/integrator-analytics/test/rdbms/mysql/mysql-deployment.yaml new file mode 100644 index 00000000..964ddd2c --- /dev/null +++ b/integrator-analytics/test/rdbms/mysql/mysql-deployment.yaml @@ -0,0 +1,48 @@ +# Copyright (c) 2017, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +apiVersion: apps/v1beta1 +kind: Deployment +metadata: + name: wso2ei-integrator-mysql-deployment +spec: + replicas: 1 + template: + metadata: + labels: + deployment: wso2ei-integrator-mysql + spec: + containers: + - name: wso2ei-integrator-mysql + image: mysql:5.7 + imagePullPolicy: IfNotPresent + env: + - name: MYSQL_ROOT_PASSWORD + value: root + - name: MYSQL_USER + value: wso2carbon + - name: MYSQL_PASSWORD + value: wso2carbon + ports: + - containerPort: 3306 + protocol: TCP + volumeMounts: + - name: mysql-dbscripts + mountPath: /docker-entrypoint-initdb.d + args: ["--max-connections", "10000"] + volumes: + - name: mysql-dbscripts + configMap: + name: mysql-dbscripts + \ No newline at end of file diff --git a/integrator-analytics/test/rdbms/mysql/mysql-service.yaml b/integrator-analytics/test/rdbms/mysql/mysql-service.yaml new file mode 100644 index 00000000..86794d37 --- /dev/null +++ b/integrator-analytics/test/rdbms/mysql/mysql-service.yaml @@ -0,0 +1,27 @@ +# Copyright (c) 2017, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +apiVersion: v1 +kind: Service +metadata: + name: wso2ei-integrator-rdbms-service +spec: + type: ClusterIP + selector: + deployment: wso2ei-integrator-mysql + ports: + - name: mysql-port + port: 3306 + targetPort: 3306 + protocol: TCP diff --git a/integrator-analytics/test/undeploy.sh b/integrator-analytics/test/undeploy.sh new file mode 100755 index 00000000..3b16acff --- /dev/null +++ b/integrator-analytics/test/undeploy.sh @@ -0,0 +1,34 @@ +#!/usr/bin/env bash + +# ------------------------------------------------------------------------ +# Copyright 2017 WSO2, Inc. (http://wso2.com) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License +# ------------------------------------------------------------------------ + +# methods +function echoBold () { + echo $'\e[1m'"${1}"$'\e[0m' +} + +# delete the created Kubernetes Namespace +kubectl delete namespace wso2 + +kubectl delete -f ../volumes/persistent-volumes.yaml + +sleep 50s + +# switch the context to default namespace +kubectl config set-context $(kubectl config current-context) --namespace=default + +echoBold 'Finished' diff --git a/integrator-analytics/volumes/persistent-volumes.yaml b/integrator-analytics/volumes/persistent-volumes.yaml new file mode 100644 index 00000000..df2712f0 --- /dev/null +++ b/integrator-analytics/volumes/persistent-volumes.yaml @@ -0,0 +1,85 @@ +# Copyright (c) 2018, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +apiVersion: v1 +kind: PersistentVolume +metadata: + name: integrator-with-analytics-shared-deployment-pv + labels: + purpose: integrator-shared-deployment +spec: + capacity: + storage: 1Gi + accessModes: + - ReadWriteMany + persistentVolumeReclaimPolicy: Retain + nfs: + server: + path: "" + +--- + +apiVersion: v1 +kind: PersistentVolume +metadata: + name: integrator-with-analytics-shared-tenants-pv + labels: + purpose: integrator-shared-tenants +spec: + capacity: + storage: 1Gi + accessModes: + - ReadWriteMany + persistentVolumeReclaimPolicy: Retain + nfs: + server: + path: "" + +--- + +apiVersion: v1 +kind: PersistentVolume +metadata: + name: integrator-with-analytics-ei-analytics-data-pv-1 + labels: + purpose: analytics-data + node: wso2ei-analytics-1 +spec: + capacity: + storage: 1Gi + accessModes: + - ReadWriteMany + persistentVolumeReclaimPolicy: Retain + nfs: + server: + path: "" + +--- + +apiVersion: v1 +kind: PersistentVolume +metadata: + name: integrator-with-analytics-ei-analytics-data-pv-2 + labels: + purpose: analytics-data + node: wso2ei-analytics-2 +spec: + capacity: + storage: 1Gi + accessModes: + - ReadWriteMany + persistentVolumeReclaimPolicy: Retain + nfs: + server: + path: "" From b44dd2ce67a0e6489d942ae4699e4de48723cfc2 Mon Sep 17 00:00:00 2001 From: chirangaalwis Date: Tue, 19 Jun 2018 00:56:13 +0530 Subject: [PATCH 2/4] Add README documentation and missing configuration file --- integrator-analytics/README.md | 215 ++++++++++++++++++ .../confs/integrator/conf/synapse.properties | 73 ++++++ integrator-analytics/integrator-analytics.png | Bin 0 -> 136253 bytes integrator-analytics/test/README.md | 118 ++++++++++ integrator-analytics/test/deploy.sh | 1 + 5 files changed, 407 insertions(+) create mode 100644 integrator-analytics/README.md create mode 100644 integrator-analytics/confs/integrator/conf/synapse.properties create mode 100644 integrator-analytics/integrator-analytics.png create mode 100644 integrator-analytics/test/README.md diff --git a/integrator-analytics/README.md b/integrator-analytics/README.md new file mode 100644 index 00000000..28434faf --- /dev/null +++ b/integrator-analytics/README.md @@ -0,0 +1,215 @@ +# Kubernetes Resources for deployment of Integrator profile of WSO2 Enterprise Integrator with Analytics + +Core Kubernetes resources for a clustered deployment of Integrator profile of WSO2 Enterprise Integrator with Integrator Analytics support. + +![A clustered deployment WSO2 Enterprise Integator's Integrator profile with Integrator Analytics support](integrator-analytics.png) + +## Prerequisites + +* In order to use these Kubernetes resources, you will need an active [Free Trial Subscription](https://wso2.com/free-trial-subscription) +from WSO2 since the referring Docker images hosted at docker.wso2.com contains the latest updates and fixes for WSO2 Enterprise Integrator. +You can sign up for a Free Trial Subscription [here](https://wso2.com/free-trial-subscription).

+ +* Install [Git](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git), [Docker](https://www.docker.com/get-docker) +(version 17.09.0 or above) and [Kubernetes client](https://kubernetes.io/docs/tasks/tools/install-kubectl/) +in order to run the steps provided
in the following quick start guide.

+ +* An already setup [Kubernetes cluster](https://kubernetes.io/docs/setup/pick-right-solution/)

+ +## Quick Start Guide + +>In the context of this document, `KUBERNETES_HOME` will refer to a local copy of the [`wso2/kubernetes-ei`](https://github.com/wso2/kubernetes-ei/) +Git repository.
+ +##### 1. Checkout Kubernetes Resources for WSO2 Enterprise Integrator Git repository: + +``` +git clone https://github.com/wso2/kubernetes-ei.git +``` + +##### 2. Create a namespace named `wso2` and a service account named `wso2svc-account`, within the namespace `wso2`. + +``` +kubectl create namespace wso2 +kubectl create serviceaccount wso2svc-account -n wso2 +``` + +Then, switch the context to new `wso2` namespace from `default` namespace. + +``` +kubectl config set-context $(kubectl config current-context) --namespace=wso2 +``` + +##### 3. Create a Kubernetes Secret for pulling the required Docker images from [`WSO2 Docker Registry`](https://docker.wso2.com): + +Create a Kubernetes Secret named `wso2creds` in the cluster to authenticate with the WSO2 Docker Registry, to pull the required images. + +``` +kubectl create secret docker-registry wso2creds --docker-server=docker.wso2.com --docker-username= --docker-password= --docker-email= +``` + +`username`: Username of your Free Trial Subscription
+`password`: Password of your Free Trial Subscription
+`email`: Docker email + +Please see [Kubernetes official documentation](https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/#create-a-secret-in-the-cluster-that-holds-your-authorization-token) +for further details. + +##### 4. Setup and configure external product database(s): + +Setup the external product databases. Please refer to WSO2 API Manager's [official documentation](https://docs.wso2.com/display/EI620/Prerequisites+to+Publish+Statistics) +on creating the required databases for the deployment. + +Provide appropriate connection URLs, corresponding to the created external databases and the relevant driver class names for the data sources defined in +the following files: + +* `KUBERNETES_HOME/integrator-analytics/confs/ei-analytics-1/datasources/master-datasources.xml` +* `KUBERNETES_HOME/integrator-analytics/confs/ei-analytics-1/datasources/analytics-datasources.xml` +* `KUBERNETES_HOME/integrator-analytics/confs/ei-analytics-2/datasources/master-datasources.xml` +* `KUBERNETES_HOME/integrator-analytics/confs/ei-analytics-2/datasources/analytics-datasources.xml` +* `KUBERNETES_HOME/integrator-analytics/confs/integrator/datasources/master-datasources.xml` + +Please refer WSO2's [official documentation](https://docs.wso2.com/display/ADMIN44x/Configuring+master-datasources.xml) on configuring data sources. + +**Note**: + +* For **evaluation purposes**, you can use Kubernetes resources provided in the directory
+`KUBERNETES_HOME/integrator-analytics/test/rdbms/mysql` for deploying the product databases, using MySQL in Kubernetes. However, this approach of product database deployment is +**not recommended** for a production setup. + +* For using these Kubernetes resources, + + first create a Kubernetes ConfigMap for passing database script(s) to the deployment. + + ``` + kubectl create configmap mysql-dbscripts --from-file=/integrator-analytics/test/confs/rdbms/mysql/dbscripts/ + ``` + + Then, create a Kubernetes service (accessible only within the Kubernetes cluster) and followed by the MySQL Kubernetes deployment, as follows: + + ``` + kubectl create -f /integrator-analytics/test/rdbms/mysql/mysql-service.yaml + kubectl create -f /integrator-analytics/test/rdbms/mysql/mysql-deployment.yaml + + ``` + +##### 5. Create a Kubernetes role and a role binding necessary for the Kubernetes API requests made from Kubernetes membership scheme. + +``` +kubectl create --username=admin --password= -f /rbac/rbac.yaml +``` + +##### 6. Setup a Network File System (NFS) to be used as the persistent volume for artifact sharing across Integrator and Analytics instances. + +Update the NFS server IP (`NFS_SERVER_IP`) and export path (`NFS_LOCATION_PATH`) of persistent volume resources, + +* `integrator-with-analytics-shared-deployment-pv` +* `integrator-with-analytics-shared-tenants-pv` +* `integrator-with-analytics-ei-analytics-data-pv-1` +* `integrator-with-analytics-ei-analytics-data-pv-2` + +in `/integrator-analytics/volumes/persistent-volumes.yaml` file. + +Create a user named `wso2carbon` with user id `802` and a group named `wso2` with group id `802` in the NFS node. +Add `wso2carbon` user to the group `wso2`. + +Then, provide ownership of the exported folder `NFS_LOCATION_PATH` (used for artifact sharing) to `wso2carbon` user and `wso2` group. +And provide read-write-executable permissions to owning `wso2carbon` user, for the folder `NFS_LOCATION_PATH`. + +Then, deploy the persistent volume resource and volume claim as follows: + +``` +kubectl create -f /integrator-analytics/integrator/integrator-volume-claims.yaml +kubectl create -f /integrator-analytics/analytics/integrator-analytics-volume-claims.yaml +kubectl create -f /integrator-analytics/volumes/persistent-volumes.yaml +``` + +##### 7. Create Kubernetes ConfigMaps for passing WSO2 product configurations into the Kubernetes cluster: + +``` +kubectl create configmap integrator-conf --from-file=/integrator-analytics/confs/integrator/conf +kubectl create configmap integrator-conf-axis2 --from-file=/integrator-analytics/confs/integrator/conf/axis2/ +kubectl create configmap integrator-conf-datasources --from-file=/integrator-analytics/confs/integrator/conf/datasources/ +kubectl create configmap integrator-conf-event-publishers --from-file=/integrator-analytics/confs/integrator/repository/deployment/server/eventpublishers/ + +kubectl create configmap ei-analytics-1-conf --from-file=/integrator-analytics/confs/ei-analytics-1/conf +kubectl create configmap ei-analytics-1-conf-analytics --from-file=/integrator-analytics/confs/ei-analytics-1/conf/analytics +kubectl create configmap ei-analytics-1-conf-spark-analytics --from-file=/integrator-analytics/confs/ei-analytics-1/conf/analytics/spark +kubectl create configmap ei-analytics-1-conf-axis2 --from-file=/integrator-analytics/confs/ei-analytics-1/conf/axis2 +kubectl create configmap ei-analytics-1-conf-datasources --from-file=/integrator-analytics/confs/ei-analytics-1/conf/datasources +kubectl create configmap ei-analytics-1-deployment-portal --from-file=/integrator-analytics/confs/ei-analytics-1/repository/deployment/server/jaggeryapps/portal/configs + +kubectl create configmap ei-analytics-2-conf --from-file=/integrator-analytics/confs/ei-analytics-2/conf +kubectl create configmap ei-analytics-2-conf-analytics --from-file=/integrator-analytics/confs/ei-analytics-2/conf/analytics +kubectl create configmap ei-analytics-2-conf-spark-analytics --from-file=/integrator-analytics/confs/ei-analytics-2/conf/analytics/spark +kubectl create configmap ei-analytics-2-conf-axis2 --from-file=/integrator-analytics/confs/ei-analytics-2/conf/axis2 +kubectl create configmap ei-analytics-2-conf-datasources --from-file=/integrator-analytics/confs/ei-analytics-2/conf/datasources +kubectl create configmap ei-analytics-2-deployment-portal --from-file=/integrator-analytics/confs/ei-analytics-2/repository/deployment/server/jaggeryapps/portal/configs +``` + +##### 8. Create Kubernetes Services and Deployments for WSO2 Enterprise Integrator and Analytics: + +``` +kubectl create -f /integrator-analytics/analytics/integrator-analytics-1-deployment.yaml +kubectl create -f /integrator-analytics/analytics/integrator-analytics-1-service.yaml +kubectl create -f /integrator-analytics/analytics/integrator-analytics-2-deployment.yaml +kubectl create -f /integrator-analytics/analytics/integrator-analytics-2-service.yaml +kubectl create -f /integrator-analytics/analytics/integrator-analytics-service.yaml + +kubectl create -f /integrator-analytics/integrator/integrator-service.yaml +kubectl create -f /integrator-analytics/integrator/integrator-gateway-service.yaml +kubectl create -f /integrator-analytics/integrator/integrator-deployment.yaml +``` + +##### 9. Deploy Kubernetes Ingress resource: + +The WSO2 Enterprise Integrator Kubernetes Ingress resource uses the NGINX Ingress Controller. + +In order to enable the NGINX Ingress controller in the desired cloud or on-premise environment, +please refer the official documentation, [NGINX Ingress Controller Installation Guide](https://kubernetes.github.io/ingress-nginx/deploy/). + +Finally, deploy the WSO2 Enterprise Integrator Kubernetes Ingress resources as follows: + +``` +kubectl create -f /integrator-analytics/ingresses/integrator-analytics-ingress.yaml +kubectl create -f /integrator-analytics/ingresses/integrator-gateway-ingress.yaml +kubectl create -f /integrator-analytics/ingresses/integrator-ingress.yaml +``` + +##### 10. Access Management Consoles: + +Default deployment will expose `wso2ei-integrator`, `wso2ei-integrator-gateway` and `wso2ei-analytics` hosts. + +To access the console in the environment, + +1. Obtain the external IP (`EXTERNAL-IP`) of the Ingress resources by listing down the Kubernetes Ingresses (using `kubectl get ing`). + +e.g. + +``` +NAME HOSTS ADDRESS PORTS AGE +integrator-with-analytics-ei-analytics-ingress wso2ei-analytics 80, 443 2m +wso2ei-integrator-gateway-tls-ingress wso2ei-integrator-gateway 80, 443 2m +wso2ei-integrator-ingress wso2ei-integrator 80, 443 2m +``` + +2. Add the above host as an entry in /etc/hosts file as follows: + +``` + wso2ei-analytics + wso2ei-integrator-gateway + wso2ei-integrator +``` + +3. Try navigating to `https://wso2ei-integrator/carbon` and `https://wso2ei-analytics/carbon` from your favorite browser. + +##### 11. Scale up using `kubectl scale`: + +Default deployment runs a single replica (or pod) of WSO2 Enterprise Integrator. To scale this deployment into any `` number of +container replicas, upon your requirement, simply run following Kubernetes client command on the terminal. + +``` +kubectl scale --replicas= -f /integrator-analytics/integrator/integrator-deployment.yaml +``` + +For example, If `` is 2, you are here scaling up this deployment from 1 to 2 container replicas. diff --git a/integrator-analytics/confs/integrator/conf/synapse.properties b/integrator-analytics/confs/integrator/conf/synapse.properties new file mode 100644 index 00000000..6706aa3b --- /dev/null +++ b/integrator-analytics/confs/integrator/conf/synapse.properties @@ -0,0 +1,73 @@ +# +# Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. +# +# WSO2 Inc. licenses this file to you under the Apache License, +# Version 2.0 (the "License"); you may not use this file except +# in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +#synapse.threads.core = 20 +#synapse.threads.max = 100 +#synapse.threads.keepalive = 5 +#synapse.threads.qlen = 10 +#synapse.threads.group = synapse-thread-group +#synapse.threads.idprefix = SynapseWorker + +#inbound.threads.core = 20 +#inbound.threads.max = 100 + +synapse.sal.endpoints.sesssion.timeout.default=600000 +synapse.global_timeout_interval=120000 +#In memory statistics cleaning state +statistics.clean.enable=true +statistics.clean.interval=1000 + +# Dependency tracking Synapse observer +# Comment out to disable dependency management +synapse.observers=org.wso2.carbon.mediation.dependency.mgt.DependencyTracker + +#preserve namespace when converting XML to JSON +synapse.commons.json.preserve.namespace=false + +# User defined wsdlLocator/Schema Resolver Implementations. +# synapse.wsdl.resolver=org.wso2.carbon.mediation.initializer.RegistryWSDLLocator +# synapse.schema.resolver=org.wso2.carbon.mediation.initializer.RegistryXmlSchemaURIResolver + +# Uncomment following to support fallback XPATH 2.0 support with DOM and Saxon +#synapse.xpath.dom.failover.enabled=true +synapse.temp_data.chunk.size=3072 + +# A configurator to add tenant information to the out thread local carbon context +synapse.carbon.ext.tenant.info=org.wso2.carbon.mediation.initializer.handler.CarbonTenantInfoConfigurator +# An initiator to initialize thread local carbon context with tenant information +synapse.carbon.ext.tenant.info.initiator=org.wso2.carbon.mediation.initializer.handler.CarbonTenantInfoInitiator + +#external componenent registration for secure vault xpath funtion lookup +synapse.xpath.func.extensions=org.wso2.carbon.mediation.security.vault.xpath.SecureVaultLookupXPathFunctionProvider + +#configuration for the external debugger channels if server is started in debug mode +synapse.debugger.port.command=9005 +synapse.debugger.port.event=9006 + +# Configuration to enable mediation flow analytics +mediation.flow.statistics.enable=true +mediation.flow.statistics.tracer.collect.payloads=true +mediation.flow.statistics.tracer.collect.properties=true +mediation.flow.statistics.event.consume.interval=1000 +mediation.flow.statistics.event.clean.interval=15000 + +# Configuration to enable statistics globally irrespective of the individual artifact level setting +mediation.flow.statistics.collect.all=true + +# Script Mediator Pool (impatcts only external scripts) +#synapse.script.mediator.pool.size=15 diff --git a/integrator-analytics/integrator-analytics.png b/integrator-analytics/integrator-analytics.png new file mode 100644 index 0000000000000000000000000000000000000000..b801c3140252f46ee3a113d92c720c70f1443ea9 GIT binary patch literal 136253 zcmeEucT|&Uw=XKApr}YJh$7fP2N4u0Ar!@eg)%mJ9fYW~NC*&mi6|qAihz&+V!=jH zfj~kpQbZCIAwYnDlmIcI1PBlU_j!XepU(O2`R+OQ{BhU1A8Xc{yfJy-r|kXPzx~_$ zNz`v9hO1Y~tP~LuS$*o{v2!9KD{vwr%g>7~2k)$Z5ECUL5-M`)*pUl)2OZ zLgglpfI<8}@P`_6<0pj7Bvi&bTmHxY-0c`M6knpzdwHAhV{PB>enApiK=5~Y`w{8I zSC5{FIxfBnjhDhLS$t`A`mYb}{r3m|y*$Dd_8bYX1{n5Y3_#poa4-=nBYT2CH&5j_z-@6h*F{N$hHy=HFzq=s}n;@ zZVnmTZ~5*i(|HEV41xJ9V2h|+K4T$R&_>3vmQVRUpv8Bu2G1xIuK-JDM7E#%x~ZS3 zzkpp`RGf~(H@5302TYIlc=gAb$EVIuJg?Me-H`7P=%~pOn1?>Iwmb-tly=va0VwAq zDIDbm{uEm&!N%)U=lslgy^4yO%g5;!%!!qmW7EAcw0fxbfmP9he zb)kz_VxAv2-{2X1{?0aC|7!Q~`MK^D`Y&j8yD&@r?3{Kk5%5YE1e;^x&<_yVF!4`q zb_nWrx&@U0=SJ5jC|jG&Puef!*#!?hOK9PLMAr$JCF9)Gxjw~7{(#^Ex-LjzkO?1{ ziSgd11{Npc2n00_pLb~~;56N9{R(J*rwS}~rrQsEWsg0d)TN*$iz$dAs7>0o3 zJE;doCv6k13jPey)V^WlH$Z1)84&Ya|B&tn!!o=$O%r>KFVv!w5GPc z+VYQmJ``0RRgs)j*CbkV0%ip}3UkKCStLc#OaziR{HgW~QI6eFhg~{+kj@< zMAeWyh<=nHjA8r0$G&R6a8wC3_ZqXe&nJ;`2RB$XsgtV1Fp}i?r)o!_x_F|q_4^Am zy6pFFQQosmL_}3u2>uGkVLFCZ3-cojdV!svC+vSj>&605Dac-Lv) z$f2m^Jyk76y*?&K7pC${l@siPXKwPE39P~({*+p9aPMu+l(DT|9-cfw-!<**SohcH z!m$reJ;PBUj>IdhG90PJ z6xXDxU(4shFWuMTHQ{=77#!B6&+wRJcKXh8&5={v5G@&&=buN!Y}3`An?=hdFF{xz zWfr>;uT#)2@j)j(u@i>Gzb`Y^36wy0(L*{iLopdSW(dx@&WI z4LK+aPe0W39{RS%_irml8?GWmxIBgSTO?NK=ApMJm zC)nG~kKWKHjOC03^9uU|82qly`gj1Qqg>LrclE>Ey4gC@;BzGlf{}zXD#f{Oon*{3 z_8X(LbZ+9gekL!rrWO-2T`AWRr?qv)GE1%fry+>8va$+2rm096u5fqN9cJlf*wqjL z%RXj0FzFG!_R9$LP?<Cr#X~pmDH*syr*jqZ+uTmrM2NQ8PBm}8t?vmlC zU2_8^_`N-WrPq3^56GQ?u(jLf`*e?pS0qYMf|xqpwPv3{1d-;x6}ms=y3i#LZ`muB zZSnSTHH{OOY9B2hIN5BT`qp{kW1?F9?gX22!IQ7;<7(tW0;idsfB&An|Io9^ci?-e zBl3Z5&I!$|L#!J8`D?e!JFSoDgJ9FYsdV~y@ebBKkwC%y#h@3#7@XxR2!G~OZ1F=_<~BQ zoEPwGCVyIo-y%lKBUS{=2Lh6?h~FoK4|=rvcS#co3aK311w{h=dg7<3a(Kw}2c_(- zyq~t^NV25KT=CaGls@>D@;e9gDXf`t5cEcMVQ|Ob9os zjZ!$Zi+BhBx#=;pVq#JHfRUrnEuw_+T>3J=GwkgOOF%wcn_XS)%v(;vs=(}2W&TTk z0lp#f|22Uhbi91|gJwBTQWUmp>!{o%Dy<>t1SivlQpj1Xorq1%Ke)_xe;yZ?cU z$jHd65)^ZAf9VUtT?elYpAnKh@Jd8kI1cDl?gJtEfme;^{`SGf%Erdu+TJ)G{b`(1 z5!vM7SF;+2H=FFNBK%Uj0`yzehLH($d~JR!06b z&RxsxG0hhzmB0-peifRrztGq(FZ&<5kd~2obwJA=Ah^SC|FyLSL;Aichu0oGdepfx za`jK+JSkB!{Oa}a4;wlm55Y|1a^a@^-(RR6I&{GaRk9Q?pGW`QEIV`?FuM&vT!rlYMh(-%v;1$_6B z`r@om-&)^}r!LH-F21{A@!fY`{io^2p?zB^e6IHl$d2km=4wJ(g%1f+gob{2Et*Nm zvpocj!*mf4d`7z53ok?SNDkwDI6V5VSzd0tCL{1X zNIEYU& zQB44Rx0x=dg?hAA$L~$o2s1Ur4vL{(<9&5rvlCZ5p)_SvGBoVNO1tJ1s)EPfZ|ZL{ z)z3`RNb?2T;aqb^wjZ#V{UNhWsgU`6cy;mhhtJQ>)K^?zRo_8E*JoJfe1L*{gC@f! z-89wCgFKXe(7ip^3y|!VxDjs7W;K@w)}Fkp6lbYtn38eF6{H_-ebL@gF6lHJb)>hh(Wy2<~QM+|&gd;1RP{1BwvBFqSADasDlUUDZonTSw)8azt{KG^vg zW_^;n>xa1+E=$zY;M=9Dj(aVau77RIK_;w_3w&d;zI3d53+Dbbn90kg2JudCD^*LO zSL=ZCCS(W&#%*HYS`F>wWHbkb`~u2O0niBSz92Yl?geS6Hj9FtTf!)FKi3=_EtNS|K+@C-1F36GV_D8CCQE$LSeUL z+uLu$_TBSWxTX-y)j{tc1Ab1?O3+%OO;tMUpYa>v5h04%fY(gO@A7|L-Q%Xr{^kfq zrLZ_El}j=j=ij#J%{)u6dj-pRa=d#^Crlmer+QN%@U2Yb3Kjd3q72(Y;t9HFhiIq1 zV90cncmDxc5-ro(+$_t+(&?Ik=TeNqE&NHH_L*vIkS`<1cl9TrvSiVnLjdp8+XtQ& zjTdg^aSSkZ8SR{lIotQmh-S?EGa6>RA;Q}xOgeDQ0j#yNOg8z z`-&l!n#h~9Zo3k$rGMsdFl44vYTKi|AFg1dSgwTEW+oDR??O3 zPwAmK0x#n4lz3{}Fx)YZ(L3U&7^PN6aL<4hs0|T#JFE?Pe^g@i-ziUmq-5CVa|NUj zJQ3no!J~KT6FrqT>M6+xRtqJnxbu@5eGgJf3n_xc_Zw9Y6m=0g>89I#b8{jMt;E}Q zW*Wg2*C^gaz8*AM!wjmud|pZpbYQIpo(SOOdOFpv}4=7hKR0vLNUWTe0m$Q@MEMCUn4{3!PbX2c##1>Jo}`F8FT*c!#b!!J^1-?5p+_ zK^ro)nYS5CQ${!(rfqsSn!^TGXYSIFG?^($VBb?)UFc9AE)xO^RNIR$NMhe(eoQ>C zQXl_eM(>&ybGd!ADxv1gQ=-ExSXn2myltcZr^m-DV@nfPQVzNQe%at^NeBS55BGK&4!6`seK6i-B42FbSP)ey zo|njJxPVT_!-#5~g&0=LEE#qgZRVBk%azevnB$Tm$SwhHPd*4202FPBrx;x`ITgo(fZw$k0KE%~=4V-x^W1r0Vybz;bDNHv>017nAIi9Q>+So+*iNqY|0`rO!Wo1I^fCbyA-Pwl3cW>e)rg&T+;xr zNwhP0U_3}+)lYqf0AU8`iIyecVLAS5x$Tfz_GNDmha1af;=bybC}bcQK=)DHs(9=c zl*-gmCN3{~QkG7|30iTHZ%EraiY{b z2m(4=;|%>N;@?OnOk#(46+A(UZnik*SRsBqJ>@;u7i&5UFH3ej=%{6lP@KNA;WFa6 zD@+UK<2%x2ORbW1ukTloCs|lNiMDIosMRbs$+_CvO ztPPz?i~(@|&|e5S3deu%1t8&i!CfH&ulyLcSM6E=F_xGpWn$BiSP_*8WQ>>e{W0q7 zB)_?K*X(9)Ae!z*A{5Y-B#;N;ROJLkc|`-o7Ycir@MtF1MMnFr#yZ59ddxlL>>6&$ zZc(H)bCaE4nhDn=Rj=6OWVT%~8PY+PPXUGSQ#uY|PmNfsXOVxG!e<=onOn1Fo6cYa zV0NnSg_(xYAAtS6JJEovRakC{*U0o>=$KV)b?+yF!22Rh!&;R|4d8JyV>HdAO>|5y zG*o%|N>c>8`m$_D?;=|}LQ+_O5M2Gz@N~qYM?F6Tf?hx}TqP)iZCWUYkEc2mM44nP z^`Ic2UOE4Zd~yvnXkgx>WM;shA>IOs@zx&9VreRoCjJ2qz`dgF9pck$>su$i49JXc z3bzzqZ$@bw)+#5qz0x|MWvv;5{NSUb6kC%RXxwVN&v;@EXb)#Ahb@+9jQIhop*}t^ zCH@BMK}ywO8tq`tFbRxggl`Kg`p_qWWD($|GA=MzwQ_>$9N=TO5u(T)(HM zzNbmu&1;jzpi3JbpbY}LngaDxc)4(MEm%#mwXZ(^Th0@YVxiP8Ts%UK5n17tM$ZB3 z{VGLLxiI5(C23u>wcqgg^Yo3oq!KTZ@vU`V)(N%wfExp5NeA&86`c3leod? zNK{Hdwj|*sftFa)aO@gIlftfng~OiVB?)&4QQf%iF}G*QH54c33iuH%Mhvs~s>1ag zcVBK{-Ir?=7_cyhtHP8^OHt7@WnXsD_~~RjccOv^5uWl*x?{68df`m`zPE`o*Rwl!RD~c#K`h1vb0{&+g#7Qn!kBJj22H39s2``TyVSt!&AU}g6QJ(lw zmoBMuZmS-iJ}}#M5Wy7FEKN1i#7jZeEhDsU$|>S$iW#MWRIY}kWLR%V&6e(vMW}tk zM|B#NE991NDF~;?b|Do`!44$KxWmHG3vEg8>}TR6I2~fFPSsy@f??t4)HXA1>!V0M zv#Nj9SeJKdWd|wQmzX*aDlME!AnmIDvS_dt70fN3MQ2?;K0FY3f(;M^vGoF#i9_u` z{*FRddxRq?Jq;TvSi3}uESn9|!<0`oUqSz#<@vWptj2eJIM+P1=&El2$YV5iq~IouW(a{fXSeFMuJndl$a|uS%6H!on&?VP=3z%Asc;b6UBYZd4!zGJ$P)5cqJ*YxB523 z`1^0El+2JAi@|T zhYl4|he5eTBT$1K{>!Ri4GL3fIr0?-1U}4;naC|3FO;m0Bf~Xci&t4TJvYr(qBW2~ zq@-H3E!9@)(XfXFq7}wY#-zT%XTBW)jN2c7@wHhq`(?~l_&LRJm<=o%FWIp$_B^dKorS(vP;I<}?5oASh?6Qhl9vT4%o*eO(nX9b5uzz|Li;)dSe+C-D=qHZs+ z#NKK9l?*r38UX_oVJ`+BN6(_M>d~qp_xw(?WmoiXbQ3%Y%Flr<-sKNIiD^lVQIue6 z<260AkYdPww;oDdJ=r|mmH7e3u~4Ei1KkUg#q@kR9X-k=Tt3L%A1&&hAhwDr7ED=- znTQ%s8;elTHU%ih)de$2?kS+;Q&f{AZ6Zq1_|(ZD#unzzm8*m?da*QuV|S2pmVXYWA0&&HvuN2WysiMx+qvSI zAS1GZgKB3G2Vj~~cImwT>Iy7}6!=t?pwGzRW zOTjBY;p%|ZysWus_h%%H-HaVTitdjExhh{llmQ4M#=y5c{1A(Oil zQ7(yq)ai<&U28JdT)m=4N8yLP6t9TNGIsc=@p01*w<#;}f_!Q z5JiRxW7)`UunJ4KqA$>ikQ=V4wEQ`T-^{=o=9oneoR&I z)}jUwUUbf7L0}pBaz~ zDB|V5ofvarHj7LR(iq^HywJrAUx53KIuxgN=p8_uFYk;=tvM;d*=sY_ygc;|(t=YCk{po&dV#bMKqa~@p{I&v7 z1ypPDx(pQ_=QMcl@Z+d7eHtm^niO|kcGNoS&nOAP>>#zJ`?K5gcAgkT>srH`YH4-> z?0iu4h2*0@Q6}nj;v2Ta?S__5AiTaj;8k?KLc9zLrEu@T-++fQKR`0tz6P327p}XC zhHJM`X(Bt-VWciYkyXYA<^fBsLAPAX$^j{qKjoUjAKWCbHK-Kx9X>>o#}1G5$LQc| z9DS;Kc7I=8>=V5jBbkx5oac7>JUkug@24|D_fvd>-Zq|lrKw~RA=DSY*Z;*?Ybt2K zx<`59PZG0asa3A%c$7jYKF2R-Hy27$gLcKccxfdtI~Ze^i9VELo(i||%1LTbh^~i8 z;$65VH)Qe)?U4Docm9*Z>+%y!Y8wR1YvZ$OiTKQPu1@vJN|1_hP$-i(9_df0yO%3o zW@3CJy9a!QRZXMS!gLYVvKfcJOed*dQ&UEmwHg%}=`=h*DYzhZ$Gcb$0#ainYDjdY zxI=V6`yzoE$JfWRALhh)FLfuPDY$XJ{4$RU6tR>-Y{9NQILQYjt+`dV-L;nZ1=4mp z?`SX4K3^L}Mi$=o&Psg*u>=ED${B8sXipIYAnkvKOB`POOQISw9tt|{F$l%$Fb$ZQ zVbUu$L5h-Cg4b}DnVjqVw2LT|(3;KdGq-D6Bbe}H8sB+MdmK%q;KjFA*#QF2wd9j(oa)Xn`z&SgDC_Y z?+HxJ#KRN}lf2z2QWTm?K>wHrESV*%>z`|~LdD|EBa&r+y zyU4!n^DLLDKQbc&yM=B8{R%AHwZ|S^csJ)xrF3MtUsn+pS;RD!pgi#6PA^Utg3yVV zZk1$^TcsrQGXc^3e6yb2k##ErCmT>c&G(}-lMh7WcI7qS+5Q}OPJG1 zh{^4su(h3cpmXW{Uis+4s4fo>iYt-LJ}Y`MjxnkjRW%%o#LQSVWxDK@oCY+7(ttT( z4Isna76^W}#S0m3afG-*Lfi-4F4%YjryJ-Yy`CwBD|8wJ?GKPlZ@4;*wD0^|@mlf6ASh=y zy^YY&B{1^Dd~Zh!s`ZwD^~il9 zNq716-i9>(l=G6D=%;PJVjGgw)u%Lg2&=6gORrI6O$I;0$x#{N$%2E&3Cw%S?|?{c zonK0EE$olC9_DUS7V-616;vbZ`(-+r$F%vHFCSf65Au>>NDF*>i+W@bN%EsFDikBISQgXeCwUh;8(-t&)O$CHB(M@;JzwsRE!)TbQx_#T50z9O?_*FY8tPW zz+(Wbo0Gxhj0Xj$aD&jrMJ;YzLgs7kEGz@0|4szsId?P8PM!d;S);3>8*!U=L7Q)+ z_a`|vvCy?YQeeK7(pHEi;F?4`j&+K*jz!WwJsxYzLSsJ`c>*pv;iZtkB~uJV!Mn|DsQZ?5am!oju-{vz5fwPzwsgWrPqkACORKPuYJ9m?xuE}5Y-vAoL*-WRhqbi z!iT5=8H1r%QHagrxlF{;n2osOnzOf|%{wmM~LxuxtGsc65TAJnha~bM~W$OuK2el z7LqQF5Fb;W0pvAQuWz4)!*3JkCAYcW*E*1EDW03yXq?f2HqoLG8(y1bzKX4msuh}O z(M(cYY9`Q!GJq5Xl?A%?=bQRbe5l3~?iC}~33JIOB~5C(6TS;U8lp(a;{ zqRAF(sA`0x>8-5*EI6w)8#i}*i{|WKN${T@3JJ0#(8+Vv!ARP!B#<=PUc-t~Oxcs) z;Z={43X2{c3&a(~zX&<$icN&V`&koi2t|CI?!v-CCIgZvWI3mb1p z3mv~6(xDrr=GP_P>Ve8{P$o$N^)6SyVRoO1e<;OiVn4=nBeF>YNl@BBW5`Vx0z(oq zr_gv+OUnEE?oVK0_{Php3l_|l3c#X7=HHs{m0PeNy0v|+Ji~x|-eG)E?~Vl;*8@m` zvJDA25(E{4L+ga;KFS12V%5@d zIgldw?)UdALA9mM>=Pu#HPL4}cXjBG*X|_VN>_oNB(y`&OlFym%Xg=nffPxj2r~gC z`}un}I;(W~kJl+e6-7kRMekr0xZyM?i%zCJ`^R?|ZMgB$>FLI_qy2za%BCCxWk=U~ zS>KMc&(FSZTUGkbnFn$m*2XT-D;h2UMI_e9s=0;3;Nim51VU5Qn?Pu_?E+L@`(C?f ztx>wdO60lLsZX1H@PmZjj?EF=p#6MM=?=7jG$hGI>#H!rz5I2yye?L;9`r4L0Nby- zb%)yCKu8q5((LBAuQi1++3FP2tQLVbLvazcJbD5=ePR;}*pL4qV8&DN%C@D{m_8ZmjRWRuCLnEGMEzejpF{8 zTPhCN*i@P*7|P?tp?vE>AKh~4+%#BkB|xtlH^W|w$7^1zm%ymbs zjRzDwujHg&k~68?WBt`DKtU8;NgCywVEBO{(qzuK&Pr8}?~lY-OS-VDe~a zzX1si7(O%#;=%_E&6dV3t_v8S<5Fpob3olmTA42FwRji^p|8lM<4avABmtBj0$*IX4f>44%p6kK%e;mExV z?Khfrq0DHa4t0y-QPo@NZ`BY!^TBDw@sF$!7`E-o7a3R)?~#DhotoS4#J zS=DxM1`q=!fPpWWFrJe<1?~SeN^#h-tZlhAa|tyWk>3F-@#&%z1_!}?tMiuCq{w!ur%tU>L4Wg zGzpZ@j5Mu#aOC*FzOUTP(fCn(W-1KDod(XSBAc}#OVf~vWsfVLi$BUP-ndhS~e zH6F_Cw(148ZZ6Li_L&Id^x#oS_%G>Xm#YvuDTgfZ8LarvkguZ$KE9+Y#H>GyKTKfl zA}f?AtY>chD%xh5Z z2<%WH^y*96%exm`DKZqC8>Jx#n5C<#E!q2uF4|Y;ZJrw0<)G$04f-L)R!~6hs%p)^ zbz~gt!*#m!Q!N|%Ngir!JilHrK#JCwqzi1uw;t3b6cmA$&T&Ap6CzfujaMm|ejF&6 zqy^6aVifQ;#X;695s0sY|_VW`Jw)aA5hn$Oc5Kb3*2=^;6BlON)gSS_EiT_Jor z<7yve*Th(Fjqy?_$sYO(7?<@n8LbTgZ4>=vVawDdOCeP>k7lQ2O>}#STmgz?xK<+= z^1g2otO#Zq^(j$<(((yjsbzgeAHXNnH3LcWP*aBbJU9oDt2Y8vbpCDtQz$zq_ynD7 ztz<4&Pzck4RYhec?l9Ry*)?V;7j%KTBN&9xdJt#rQh-c24kZuVF!cUWpc2~TyHl_g zkd6q^U7@RCE89N9k((5MWg_7rTFkitGKqcORQIA?;Mn_jpxiC<1Qx76H(Dw40%)5d zEoz~r$=c4dn*e^_g1RvVk3#s33cj?12fSbXb1)Dl)uowkUvYHM*3j%XH&!D@dx*bD zU=v`z5Vei3_e!?W%x}mY0X?XeBeW_Nu=WC|L3Z(0B1XsmDNhj@^#vUOs++&tMP$@y z%%F%6YX%|mbok7)p|^+-&Ag$LHIH^1#V=DG{K1Pwf*`T;d!QF--1NWsr-|*z@}(k+ zMtBfnn^1@aL;Um6yTsJirN4sS5Iz@hKj~C(f&y?V2=W#Q8Fcwj;;&!=!mfzJ;=P2M z7W(oskjdwD<3ZP4Sszp}TTCZK=J!Jx_2PYuYE;+Fuagyl2$YCW_`fW^aC1#46a^OB zGIDWsULwndtyhbTTjY_-U-TF}ayI-QWcucuiChN{kY+Lt(?L2 z#8{T-OZ{`92=_sSYNlVBh2|jh2*g6$1~0t(&i0gKKpTJ`d-^0 zzSTaI*u3UaU`ar5D~p5Hhci23S&EZrPLNLb`#N1FT2H?#)zs@g_ajRHjaEARu(XH+ zPBfsv0~+d&m#w#3T3XtvZ*_pTR7wKth`#HvmbO|%4_dqJVqn2fob;8T_nh$-35*B# z3R>zYBGS4&FltRG6{K*FOreEC;3!@q8^x z2X_Nc{{?ze0{Wt=0q2)hBGU*-@KI6lZkgE7;_601Uy$A&rbIwf<9Cr=s z_WJX~;!~)9b@^sXW@ctysuLD$VB~h;P0P1sZCRYl(Z%_4q=}UYz(Mwbjhlsr{pRSj zl&naqGe}BOp*i`8CHIT$)BbDNV0-sKE92k?Ee2?GKLRa6B@C<{7~4wdP3aWjig&Eq z2%J$KtcMtQH+0=+S?D7o63`b^4VF3*kD3dO2U^w8by8xzWN3xHe^}~U&%e5K(6q9) zcGa&L7XvpvD!gg9u8rp6T)r=2=K;4HDxa2&T7rF%3GfM9LUpKRN<5oA0J7j%!Hq09Z*Kgn%h1lt?(Ug_t@S&>O(hmB95QL)T)sQ0cg-8wl4C2%kO0veA>Rs>t@xX< z4(?mw@JYC_|H2-B-q@Xec5g&NOP2wQ`^yoa+5BmJVmY$pMev4JHTv#hX#fl0@B4>^ zDDj_P7Jh1Px8lR&4Z%&N7cCqzY2jS{@^?qX-?8Lx#@cAPrtGnBWB-Lcg2DU%G$(3{ z9hQiMtXK+6cM(lG4?x5JZmPQ^T@c=6v+2cU_*8vw=LH2~NCas+7j ze_EgXN1wr0VD5_u4Pgy{1@QO%!$Oq!emSb|LF$iJ8U_lk8^}&uY{=e2fAp{2s?}IB zU#FOAWXnuDdZT?3YI@!>l9-$P3J`0=y0YazF41(Uz64&t=V?Oip*et)4}e6$GnJl$ zH06H1rQ%_wx5UE^ff@c%HL0wk;+eq(xueIUdf4ybi=jQSUL4EkgJHdrX>R z$VG1HaffQq4WK$eUtaMtpAj6;o3|1N)xigV4oChyXlPqXE~TXM#@hUPo!P-BCQIK$ z{T#`XTwMI{SDtX&1w2OSn9VO0FF_{lX*Ca$r7k~rGx<4?JLP99>X=MRG(JN_vVTO$ z!)gdg6C}!x4jNyp(Vct=w2{pGu68p6#+9&9(9_tW7c$tmec4)I%20$8#@VE{uu;&e(pnO~ z_t6K zOuLJwCYnq=br`F0y`w#q?1QA|sG$`VmgeEzI{8IKZjHcw{Qtz&vIT)-D?uCcialy9 zs~;TrgvA47o_(nCnVgv7M8i0fn#%CYk`t4Idp#A*fb-z)&rzj%bE8KUm$r8QghbGG zn_u9p4xAYLG|(HP-<2DvFPZXGP7FD7g+64WzFLy(1evnX)aMN`zxc91rfDu(-VgLD z_lEmCq;B4wefn1r7Zdi|dhG~Z{qH#YFT(EsNt|V|SPdUOoaT#h$N$D2{uZ7LkZ_S( zCjXof{TzXQq88F=&CSg&SFXGa5*2AxZlTfeadB}|{|NlvHPD{_8GQ~vWP`W>u7wN@ zP}_?CNNvHt{>XIycG-H{%-kIR?Afy)p79^Z#lI*06Hom2PKV0=Q}cev0XXF`&t}ZK zZ)X7!x}m+jy`mX(ywMj>q??l<7UqY<@BdxUY%jQ&lbf4+cQQ70?kOC^LxUE%g)upm zOU0mop(pRK24dkNtzq*5#zN5cqY)tjT8M3Jqx_`l!i4FnEnDY08G_C|2BFYt8_#7u zIuw2iQ12ZbBO;EkUJXt@k=~S-gTn{yu10&GeWARVlU?4L1b{tspmc#>x`{~dwx92} z->9KgyKu?wOLw>D!j$JGVz0y5qY16{Nq;6* z-?Fv4Out%qp9klT(sst^ynC~7VzxbC#L!)_c?&{!drT$#y_0? zM=WLsRD*wHZQ!2&gr0#!QOMT5op}BFHQOEepX7RJlarG!&d$$*aM+o@Ww8H4tg~@= z_$n~qFM3NwzHR&q9sf!`e+bM#H-I?kKIkO4P$l?JIq090{M!-;=iKo5^Ev+iKEeI> zq<_{be%R^ClYog81xI*%f$9U0y50b|a(f_98l7gAUD{r)#(VUkL~pcgS?bW%30Azd z$F;Xpm!kQ--azTqgg7=D9OxPVYPb4H5!%fkMV`oeuT-JtK=)T#i&`TE3mT<*!*kmn^ zf3?FN)Glp&HR{#1~LG;KxrWCZETCV{5>59u_ZEYo!+8jrGBplZ~5qLtv$ z2-I44??9JQsVdC8$d&!}B^^4T90ki4fZzMcAE`qFt^D`Gm^?;m;P@#nIPvH1eJ=$N zW8L`sLA3!ncka`;Hl=6sT9POGXab&3Wu<19pHr^|=$C3EJy%WHAchQiSG@Ina5Bc8 z?ETV~H$FaI-HI&id^@tubZJwxeSE#2i%p@|K1?)Lmzf(-{FKbx!92kF_F=wgv|<&$ zg$vft?ydgjY(h@PPJRmW^Sb0-s?$P|5m`_1mzu>pF9}ps-l**0gP5r1u5ZbzIE=>&%=+6H81Pe8p&JAzGyqKl(cf_bHA12H8*u)~M)zU2~^U!Gx$D|)?O50E-MecFBaVW>NWOPggPyx+G3Pb}-%$^?bLHoXLs z&fo%_dYv$oLC4krjP`SwdXI~&Q#fs3LU(b1&dXRuQzF$l`d6D$zp>x>Ho+#f)~veO z!Zer6oykN?g*baA$wu>@$KXm6^qrlZ70u3cMryQebuJN`cm9O$$aX@2GH+zNO>gR> z{H*u0)Kw(At8%U(z9w(UvMWT(D)m!eCJnU!DpRGned&WA|xsONM{T z6pZ+YnQANMWe%sC)Z#-)`pMq1hP;k`S|>*Fw+5xjQ^$n5zm_U`f>nHefI zcN+^^@D2rhxlN}r(=8T0&lMQMz6kaO(rbt3qy6%^U^)< zc>9{Y(RDAhEZJhwGKLK5ywfrqDJWXjgZn1F>or<4xq~i_D`f7WKBFVDX~jM)EwU_4 zeAboB8C;Qh@4)MYJ$Ki1V3+oI6Q~ElbCbV`PZs|AG1JxQ_2GgL+xTdVb{Be1ypbg*^DOjFe`%`QJjDVo5di0Rm#X5C2?2O zrVA1^B`LwC?b+TXJ`vT!IJTTMn93VVs`(zPFfLP8O!2~q90Qty3OH;P@ZRE?5?PL7 zz6s@f0%;V1W<;N2JzLIx zK9b09bMf!;_V+njQKWywGW{k+`&||}1Z7Uv$}uv?uhp0>w<4x8hv%yVsfw~lgK}?G zQ|%UQqG(Z@$I`|O71@R$@i$6US%-_$cV-C*TT2`gxId^MZ+2c<`OQd{ zFcj)~b*OV!@~2piyF?l1@qbI&eS!gfEmK`(*3cmsqKyJ?J!N*FZ2JKVJpBBSW&0yp$^jq@XLHOC|NpQShi&eil( z9~2Lh3z-`;rnLhC*+$S02_7KZWBcQL+B_Ol1;L8OrDGYjIpt zb7EQMuca!WPbqJRB#P@y<@y^GaL~=NNr(MF*8tuw0Q5`HnV>&?b^v7WXxXC`-8iE7 zFHPb}s$5X|cRkvUBi<8`!EZ;jzZnAqxRQG2Fu{Qfnx#4|Xu!SbyncbDslogH{(j|z zdTp4G0xE^pELzc4t<#%?%H!L_pF+`tvMRbV`0qE_cTBW{#;SIaNzlr+g@2EGFI1<- zMz&&e>{ga8uS1RY)}_?T1XgA)V&eq*LQ8Jd$mVq8pt`f zOGNvznduBlHjHTcnaxSwo#tlH8JvJ2N9N4Wnl6o{oDJ{T7kk(5K7l#Bl(W17%XoT+ zZKINtg|)c!W2{2dT7XFN4y$VyJky`Ze~9uqCr=o*c$~?9FXC^U0%^Fu(hq>;yNrf=%;S*b`9wO)=W+ECmRfjHaAr}etz(& zX;*6qs22zZkcL0jQCp8xON%L@8rGL>Xm2i#d|sDZlX#H4#Y!Rcz;QVfqYS}VIr#m)Ym85ro*_e9sC7fk)_VpU*g~H9~#RLn02a-2l<}Az-|T z*rhthV0<~xvI0;qo?~=T`x;DdV1|rz>rC*A?@-JyWsvN@?Gq1&t(hu34_p3xSwUe| zM-B1gN;$NV`4%zHi{^+d0T;oV+x>`rCq(-xY&o;!zAQf= z%9l#4efW@32w{J>xBTdu_$3W` zz#h|KnLC77BStc7H>+X#87yEMJcaN?l(M;Wj_?*bhS|Qilz;w|VfY|OIZX&t2&N+6 zZUhgqrc!Po1sTrC)UI*7Cya1^)lq%!zU?~dXE$VI%p88|a4@assXMam%1GTrZK7F$ zN|+P*Oj91=kym>V2KGo%HMz#(d31_lcq^`EXc~A4_PO!elu%-b{y;RET!q$W23ruy z^qDGY!BhHxQ2R+eHZ6>~#v`9eQ2Tc5pGS~y^0&5$J?EmWwD9hVRqR&|zE(^W&#v5d zXg$a0kqb$bVk`a}=ArO_P_tu2#Wm3A?$V{d1)ZgcnLVL>qmXvi;H&rQ=L(oV6lYc(CFuH2t9&(RIuY5Oekj@HG47q2a) zd&iof!LQkB+%zhn$4MSIe~QN49P6gpS+SeC`(cK&)HY-(pY`i4NipX1XJh=~BBh!K zoKEj!hT8r)SsXua=T`&Xun>@6<5RMKBa!_9uUhk2Hc-7O(lqIyc6l&Iw}Y)p33izs zA@fv4pdwb_pV_0&-Q!}ooQ@1e1WC>I4c+pLv@9DtyzNzPW@)bNkqWxal*0SkX_;9!Iu`P))ty>Kq$wpP2*aHJ#oc>`HI;U4!;YeY z4HOGaK~Yda5s=>10Yr)oLPxsNdoLnbMk&$+q^TgNgwT6aRH`J>LJf$N2!RB_5Ge`o z+RQk&&OOif{P>Rd&+88k3CYghS6Ss;>pD+Nd_N;|K5p_|RS$Fz=NJ8eE^f*k=Fzf6 z+9`S>f0XJHuhd=O{A7si(yEbp=5_f-=)62BAt9lezhb(7?Wif@fs6eA>8QbABrjaJ z@Y8qvy4#@B=^30=3myt6?)zyP*FTk2&s)yamRIlM3{wL0^fi#sM-vd8( zF$<-Ruc7bAtIB-BP-$L!wdXHT9zM#(ycPKqn#sS#GviOh|HoC?n1$Y?xe<=8-Q|(B z&#qne@-2n&%1au@O5{jDJ<oxp|`xtcheJr;6vk-`dr-H|RH61Lp3R3n}w$Gfstmh_YZ8dBB5F z)LMXlt12K{NVaT@j36gs0S6@yz#)jdK1ovmT)hShQ_t@jo1h9yQKX3_!m%`)nwLli z2$CKw2jB~ij`FiDu=*V7y@KI}!9DIt9;}#v-t3u-uNQv|@|}%a!pgRsQ_`8tB49-$ zjm^!jlP+t3wMLde_$fB+#Q4{k7rpW;55K>#qXa&y;2Qy zPAo&yy~7H4n?WZL+GB&!$V+b1M>;Rr_VG|MT`}`9md!rd$^ISRyS|U}8m~dZ##2D$&?`+e z@P5?x{UDp(Kn@%tDh^H?Z}&NB_6$}avc_Ruu5F|dca|`A=?R1{rJ%3M+nN5f1CQiq zCu7-)mjkrijaA6or3ODj=RBfX9zrW@}tSRyvU~wvP8vrGYU`vc7Cl)C{Wfv1|}Zn_vgu(zNsu7zoVb2 zeDYZ?9~Ii(9m}q7EUIX99Ev?TtPZC@#AqCmkIBeUo*CSvRqm4lSwr?Fyd zYny~q{Uq7)0|Ujp zyu2l>2rHbfk?nMQ9GbRQRlk@n>#O*uMlrpnvSxF2req+r8VU_pg9F5}I3LJ+&whFn zL2q`S+=aO)+t@)lqsoVl>oCB;=4A4_7U;5S@ zR}u`5V2U)DKw5{28B-QBo9mOf{9;x%99(`p&c4Zel_$|7YH*7t`zB!#39EUsyjf#g?`=#_MdWlehi);w^{DwuI$umAt~2P}%bp{aT#H zn$~^LIJIehQ~ly*jay$dRS1;VxuPHJySwGAAYAj;yX%5|3)P^Q$qMlZZ|wQVgN^rL z{j7aeNdDhjd-|EOG;J!^=~HEtV;9|t{iwh;ts~*N{_S2>_ljmTbyEBXwX5#B080Gw zxey!HZ}|-oNx{>LME2NBh|;!dzc!$>d0_jZ0Foa%&K4Qg>KQc@mT#bjH)wQ+o}!nd zD+cRF$O>WXLle9joQ<**427`eDV{O9gd$4`dt{IFSheo!6!)0};18*Nzc{AL8ZQZ# z;o$pq1QYz(Q*GVNtme6__nJFNqk=p+kn3dYlqG`^#?C2snUM9Ws(g%h z#~z!kLbCd)RORw2GnUXIrJ_jp$6*s_M82@>V!wuuYmKg}w(XM-{`~Hbh2T(~Eo~jT$>h!#*x|=y>E&2YkE*B(XNYLz zgwo7%Q6Bw?*nZ690jwLLr*O5eM?U>n!ZIn{BgLrs>$o&~hql}hLt5u@V~RCV!J9Lb z=fas8MiTCSM7f_B_(zQ^q z;69~CbEpiYKj&QwE!H9fcr>txNWgJtW4!+mnNUT$KN%@LGmj=4zy*=0f`gU1h_}zH z!6WJy*PRujmw=6RxEi=~+Mv5l>d_(yW%S^C7wFMy2X4?vaDcDoa|zE`Q~!x1+pOAP z=)pCafMY^DR>{an{=M4_85Zd`((N@yHRT93!zY=;;;-p|@8v=%e0|5xy&6psGF#Lz zqPo|Q7-G`62N=U(mS%$J6H;{*pGy!nPNc(b{<%ot%S8euNa`!SLPC8gT{+;MBhrEJ z!;yhE0~ZMalj@~Ci9w64W=?BA2F@2s)<|8^^L~pPB$ll%p+IirM3pC{l7#U} z3dK-*y&Xm!St?k{mA*J9{bJCjIXS~5zZ1NM4hA!81Uam zcoGvk%@=Qr1elLjKwRT2yDte_sgy;aPo{5Pi#2})*AS$x`M~}q7{{7p*H`dmwcRV< z8GsUuUzizMCawoK)cBa=2-4@c8ydwIPg|@Bh!m$v~M>*urXgSNzetL?ne+L%k=jNXGLP=kN zN(FS)p*qdl8PMURc#+Oh!#|;5aP~-9JQ;!=lWtd}sN9D1xH5k81g<9uIBsQswrCDE z%!k2jXa#mQ9EPUcs)Aai1z`CbQb(^&)Ba;R_=Nl0?NY_9W4wFjTO^BSd`)rtT<62> zu|0aN)+VBk`(+jwO5tp|=2gOK3K6r}RHQI@N<>kn*sImnVA{9`7%-GNUb;db9M*BotB@I}B8uZ}%Xg zG6U)C@4OnHR{B&?@-SbxqHw#IkrRKz`U2+OX%{xn7SnWlJiG~eigl9pjE?=}zQUEy z6hk1b6R2Qzrklial)YMaoc4R|#VJK^I1{U-M5Hnm6NtwH0s(w~4E+Y~o%RU*A2*l4 zwV6%%MG&2rgbV|b%W$nA>HKU$U|!uP!SZRR?5bcELF9B<1oipWjJn!s(pv4jmgx-~ zVKbAfF@JO(3P)`@4S+ls1rz94h9*}J(!$Z{ZXnR=m7ZhSR>@xMW#$hgNBy+JgD0VV z*=5u-aU(Jha7q{=3135yQq} z;u3|VeT0zbbS*Cq_SlcqXsxF+ssH`rx2@t`zDS(K7W`Ih=%&8hvw&r14j$zmz8;J{-NqEn<1?}}NpjQ$ z8l&asz*L2=+M17NQofC}XB)O3TYOD?plx?c=izTN-kSxFYObr;zbEsg9|T<`_1#NU zz5OMeZ&NaETnQu^Ys>DN{M@$0KD4j_H|>vy$^9Vn0qO{r&|@tS;_z1dR8tW@1%n^va|QDM(m5MEjOiYAfB6HGI0 zBy*yF3O4!Jh9FoRx?+-I;Do2V(WDFxM``X%C3gNMf4(&Ola$$YYUmfHghe-zD{8g_ zNn*Zf%BRgNys`~VyOgC(x>;IC2R?9S2Q%`m*sF0pCzKYUZHLd4td>rZ5 zFOevUJ3Ykm*?!q*V|~RwH_QV@&7F<)cG+DO?!H#)C+(-a8xzB;#?(k0lifeoZ`aYwJ2E2X+23z-<3=Rv&j zB=-m$#yF*t3v76*XoBPmPtrtNeDF$@2n>+68gwev(;K%6+ni>v ztv|fK6_8cgTT`+)s{EwzkbeNk%inIhWx?^|g86$aOS48DgpA z@nLt1FD6Svn`p;SjP*RshNa(|_scR)D@l8W9Q+SFLDA`P#OtP3?om9_)J9@S?<`36 zBr0?_SL<4*8Yqs;7F(Nwl8qO=Pka636xi^CgkhVkW~?HSa#2TtdUfDUvbCG0Z%q){ zYeC!ZOg9<4kWM5jXY^=Nt_K@LO0y zFqmPo%p~vG1%682$qA&U|GYYFoovtVrFFWEWdMVP#be#p!hA@|{%mKBWC?5ZVI7%y z@hMOCLT6v{%_0%=&za;;emd(%YMJiI3>jS6-b437!qOaoS>~5YQpEfYOzyx!_SjtJ zXV#FtzK^M;FKUT(-Q-f6ABpk)rKVbShJq4P9wVQt;c(f0oJS6 zsBl_K3z66zLDP0Ji(KRzWIfP%niW2Nhb29gd)bx6ufyA z965PG9>N_We46|=6Zl#)cd8++oqb_2E(Q`*#0p3&+?>ccKF{^n`1XSqVycoFoqi9K;jTQM%qOUmWsyv4ZL~^o0Q_ zvVt(1-YtdaKfpIYoR9>VIZTPDEZy3+q>$($(kX9SIkK{ZoN$TzNM9ZhICp^~mu6@$98T{AQ)f+uWxwU zQue8nH&Q?JRcI9q*Gf#gsbKDcFNvSoRFCL;`0pPJYA+e)jG8{HC3NyX_qMkV*b#aV z9S*=ie=-y+=qK(mP=D7BR2VU<6E73Vv*nIGoZq%o7BgPDC5@d);ER?^;*Dp5p08|@ z(6)w+PD;$V)aRj|m(^S&PYkq(0l}>u(4VJj<=GDIQq?9sZksQPw8xVSXvMCnv=tkI zkyeO_n}fuGm*_IN$dbGw%w6I1NJ8~0@U5em76vLdEf45i>>svSC|Qs@2p-n#KcMiU z@Rc9v-=@T4grZ5z#*qA_z;2){>0kCI{u>k)V(-vjb6*AGJ4g)ro2hSk8TpH?bt|ne z^MWb)sEh+Rg#3Hv`DzOgE#abU>yG&d!}CEzMOUTJCbJ31ABUa9bd||qSb&i zePKmNm0V(LSn$^eX2xIp*>&XG10Z!gFz$m$e>ql#F5_&&Z9L6|kc<96a9|b31Ad_b zR4PMuRR-*}h_1;MxeG{tDWM?39h#(d@4D|$_j87*m8d5SR(LH#4R-|qvhA7kEVPzW}yikOvXA=9t_I7=sIklj!>ww|r^%|t;>|1*dzMLh0CoSJcO$?*m}a}o_?O}0 zdpv?tXGICMv1FXw324&n-EIRQ;rb?#psx?wpyRVYU#3obb_L?auvnHtA#|Htw?xVg zLZz8=X}o320>YN;)ju)Sp{4$Kc{$7O)wJKqR$Id4<1`PYA?JWm?ly$?*|n~2p(L-w zQudfSdDvFE)y8C)u~0S;=nrT*^vZnedm*n5Gl+tEIYXw&s}>|I z%PeDQ6JLRste?4FJl8WjM^-G$o^ivUOTN9`=$>9%FhDD|_Qg zpD8~2rj%v0n3*B^f>9SBJ#E~i#c zqI1c_pv}%@7i1b!E}mXaZ6wFFbW0Gnw{^B9W2X$3(*iFjCwtoX_tkk2^&T2sF{Nea zV14uwTp*99o!1t0+1T5CI}lDgIy03M+#f!X8kp2kBh0W-HZ2kO>KYCbWtKnFkn+}F zs3v$)Jpen4j8CW^k=N8ub`d8$BWQf;Pp$O9$Fh!qU%Lb4@UXc(M|l#u`%Pp z9PInQFg+zqf}PhA%uMaNB&XBufs?^-ts1oIYz-6ofcuJ%!x1KPs)&3euB9?FK@BWE zSLRnX-*OOoZfU4E5;$1(yk?&{_z_lW|b;cGzP(mZ!mqA%x~kFHy-Bw z&WA8CIy?ptG&p&k1Z^M2QtQiOG9fH$&wZNQHTFY-Pqf&KD5-jY&h9Vf#5u?fGzT5F z!uot`tgRn_=KTFeSo2$bLDB;Xn-QkAs#HdAmv6J;c)&Nx-9ZIs`Y9QcAx>0X)K4RX z)FF{t7MD3f2%mLwl!h7#2zG|pF5dAQmpL6FC+HiG2#&h zZbY+N2&_QcQxJLRtkkl;$(!yIgA`$HHRlFlQgR8e%!C8KWrA{9)`<4?WSaNc1 zj8h=;1n&5T`zA4Kc9y^}O5a?A=6y;(@iJ$g>)@e7YlOqh2w~7VK4yM%*62E^-gS2G zI+;1iVqB^c$CujmgKL04__(uC#U9fHE8WA27!e_RQEo|q0=xlhNnfZ?1G9RM( z%+h^Z{TsbD)n}EtbAYrpllG2DpsVZu<#Rie&Z#+E&AH}jKjC6~lK+q;=Ra=eP+=j@ z&YjVG;rEcyUw7*iu*s}ruD^%;V=_N?ZjGf&B@t;xL4JjQw@&?h3HZbzdmI6WpbdxU}9jS88fe(e&Klt_QS21t0aRmUYR-lPdc)k75jUG&@ z=Ht_U5Ra}$Vkg4I;G<=(Fd2xdn2#dzXmIPwY-@D>Y+>-AXyL{QD=)9o6tDgpn*(`p zwIk4WvhMsjm8-#kStI0y^E?vKe1j$SD5-_{fVF3XckpTcc~AT*9E<*;ZR+&Z7gKlY z0bE4X&;~EAz+uYGH6K6>V`^xqzr>y}?A%xQyCR(UFC;nl7dO+neD>FbZ~F3@GU@4& zGq(AFk1{}#HCuwS>Uxxhi)^E+>U}|koIG=>vX#_$SAjoq$CCJ};uNl9po>^I=RTsuyOj8?c9QyvJB(_p$LL$)_(rs` zvT6bhlgRLcbYzcdCnz{=uEDKM?cb9P101F>M%gauws{B7(Z$6@>vqXFuABbUsd3Cv z#if5z}MGT z%pNa%{``5@I^t?YLpzZ8L!vGy*hn`J6%}<--m&fJQu)eqMnd=Uw3-h6RkQ~ndt|S^ zC26XeH<_`raqHf&?e$zu)WRkCC0xZ2s>UR6=o`&18OEZALCP92pyUOa zIh#=u6m>%0aQxTe$iKT%^F|eYX9(!J%3Uv8eg=GbuSW@*S6~Bb)=s%g7ai2p#mrUi zrazj^tCE8ZwEa7(b5GPuzX8T^3#F{3oQJxE1;f#-RsV=IzbY<;4Y&(Cd z!gp6K1%z#_=Srimn{M>o-sb1zQhp*s;*h-u4W&(@eiM76cY^;H6AD{$*TO?Eq3Yf1 zUR=5ynulTQUM=g`^D2m^d-m0EPPJ!|Dr$AbJmNt-?hyXti;+?R6@ApCUBHgLnRJ&| zu2)ArKc(BFy9XA6^OR7dUipnVWf{>Wb9+1dl7kN8n`CcvWQLx+GT`n{=i`|!SQd&E zsr>S6%cTL7rSl6uw7DsN;ZV>g8nwWFdi$O*&#ewMN+Fl_7byNOHqnQp`})hBm&QCG`OYixQIjUNt@?%i^Aby)iH=O4k5n zi`$t;bUa=EijlOb_qA?UNK}rjiau|Z6V-T8%umw&1@T?5w�iPn6K+AztiO)dsP1 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%0A5VKgT^t_RWt}ulz6Rhw$?S+tj%JGH+Vp#mZKeL8 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 V&K_FM`X24gXKo%l?zjYg^E-7>5AXm0 literal 0 HcmV?d00001 diff --git a/integrator-analytics/test/README.md b/integrator-analytics/test/README.md new file mode 100644 index 00000000..0d4431f1 --- /dev/null +++ b/integrator-analytics/test/README.md @@ -0,0 +1,118 @@ +# Kubernetes Test Resources for deployment of Integrator profile of WSO2 Enterprise Integrator with Analytics + +Kubernetes Test Resources for deployment of Integrator profile of WSO2 Enterprise Integrator with Analytics +contain artifacts, which can be used to test the core Kubernetes resources provided for a clustered deployment +of WSO2 Enterprise Integrator's Integrator profile with Analytics support. + +## Prerequisites + +* In order to use these Kubernetes resources, you will need an active [Free Trial Subscription](https://wso2.com/free-trial-subscription) +from WSO2 since the referring Docker images hosted at docker.wso2.com contains the latest updates and fixes for WSO2 Enterprise Integrator. +You can sign up for a Free Trial Subscription [here](https://wso2.com/free-trial-subscription).

+ +* Install [Git](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git), [Docker](https://www.docker.com/get-docker) +(version 17.09.0 or above) and [Kubernetes client](https://kubernetes.io/docs/tasks/tools/install-kubectl/) +in order to run the steps provided
in the following quick start guide.

+ +* An already setup [Kubernetes cluster](https://kubernetes.io/docs/setup/pick-right-solution/)

+ +## Quick Start Guide + +>In the context of this document, `KUBERNETES_HOME` will refer to a local copy of the [`wso2/kubernetes-ei`](https://github.com/wso2/kubernetes-ei/) +Git repository.
+ +##### 1. Checkout Kubernetes Resources for WSO2 Enterprise Integrator Git repository: + +``` +git clone https://github.com/wso2/kubernetes-ei.git +``` + +##### 2. Deploy Kubernetes Ingress resource: + +The WSO2 Enterprise Integrator Kubernetes Ingress resource uses the NGINX Ingress Controller. + +In order to enable the NGINX Ingress controller in the desired cloud or on-premise environment, +please refer the official documentation, [NGINX Ingress Controller Installation Guide](https://kubernetes.github.io/ingress-nginx/deploy/). + +##### 3. Update the deploy.sh file with the [`WSO2 Docker Registry`](https://docker.wso2.com) credentials and Kubernetes cluster admin password. + +Replace the relevant placeholders in `KUBERNETES_HOME/scalable-integrator/test/deploy.sh` file with appropriate details, as described below. + +* A Kubernetes Secret named `wso2creds` in the cluster to authenticate with the WSO2 Docker Registry, to pull the required images. +The following details need to be replaced in the relevant command. + +``` +kubectl create secret docker-registry wso2creds --docker-server=docker.wso2.com --docker-username= --docker-password= --docker-email= +``` + +`username`: Username of your Free Trial Subscription
+`password`: Password of your Free Trial Subscription
+`email`: Docker email + +* A Kubernetes role and a role binding necessary for the Kubernetes API requests made from Kubernetes membership scheme. + +`cluster-admin-password`: Kubernetes cluster admin password + +##### 4. Setup a Network File System (NFS) to be used as the persistent volume for artifact sharing across Enterprise Integrator server instances. + +Update the NFS server IP (`NFS_SERVER_IP`) and export path (`NFS_LOCATION_PATH`) of persistent volume resources, + +* `integrator-with-analytics-shared-deployment-pv` +* `integrator-with-analytics-shared-tenants-pv` +* `integrator-with-analytics-ei-analytics-data-pv-1` +* `integrator-with-analytics-ei-analytics-data-pv-2` + +in `/integrator-analytics/volumes/persistent-volumes.yaml` file. + +Create a user named `wso2carbon` with user id `802` and a group named `wso2` with group id `802` in the NFS node. +Add `wso2carbon` user to the group `wso2`. + +Then, provide ownership of the exported folder `NFS_LOCATION_PATH` (used for artifact sharing) to `wso2carbon` user and `wso2` group. +And provide read-write-executable permissions to owning `wso2carbon` user, for the folder `NFS_LOCATION_PATH`. + +##### 5. Deploy Kubernetes test resources: + +Change directory to `KUBERNETES_HOME/integrator-analytics/test` and execute the `deploy.sh` shell script on the terminal. + +``` +./deploy.sh +``` +>To un-deploy, be on the same directory and execute the `undeploy.sh` shell script on the terminal. + +##### 6. Access Management Consoles: + +Default deployment will expose `wso2ei-integrator`, `wso2ei-integrator-gateway` and `wso2ei-analytics` hosts. + +To access the console in the environment, + +1. Obtain the external IP (`EXTERNAL-IP`) of the Ingress resources by listing down the Kubernetes Ingresses (using `kubectl get ing`). + +e.g. + +``` +NAME HOSTS ADDRESS PORTS AGE +integrator-with-analytics-ei-analytics-ingress wso2ei-analytics 80, 443 2m +wso2ei-integrator-gateway-tls-ingress wso2ei-integrator-gateway 80, 443 2m +wso2ei-integrator-ingress wso2ei-integrator 80, 443 2m +``` + +2. Add the above host as an entry in /etc/hosts file as follows: + +``` + wso2ei-analytics + wso2ei-integrator-gateway + wso2ei-integrator +``` + +3. Try navigating to `https://wso2ei-integrator/carbon` and `https://wso2ei-analytics/carbon` from your favorite browser. + +##### 7. Scale up using `kubectl scale`: + +Default deployment runs a single replica (or pod) of WSO2 Enterprise Integrator. To scale this deployment into any `` number of +container replicas, upon your requirement, simply run following Kubernetes client command on the terminal. + +``` +kubectl scale --replicas= -f /integrator-analytics/integrator/integrator-deployment.yaml +``` + +For example, If `` is 2, you are here scaling up this deployment from 1 to 2 container replicas. diff --git a/integrator-analytics/test/deploy.sh b/integrator-analytics/test/deploy.sh index 0cb319ea..d39e0b5e 100755 --- a/integrator-analytics/test/deploy.sh +++ b/integrator-analytics/test/deploy.sh @@ -80,6 +80,7 @@ kubectl create -f ../analytics/integrator-analytics-1-service.yaml kubectl create -f ../analytics/integrator-analytics-2-deployment.yaml kubectl create -f ../analytics/integrator-analytics-2-service.yaml kubectl create -f ../analytics/integrator-analytics-service.yaml +sleep 4m kubectl create -f ../integrator/integrator-service.yaml kubectl create -f ../integrator/integrator-gateway-service.yaml From 47561514a07688f4528475311f6a91c913075d97 Mon Sep 17 00:00:00 2001 From: chirangaalwis Date: Tue, 19 Jun 2018 11:22:53 +0530 Subject: [PATCH 3/4] Update README.md documentation --- README.md | 4 ++++ integrator-analytics/README.md | 6 +++--- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index d9ec74da..4a38553e 100644 --- a/README.md +++ b/README.md @@ -7,4 +7,8 @@ This repository contains Kubernetes resources required for, * [A clustered deployment of WSO2 Enterprise Integrator's Business Process Server (BPS) profile](scalable-bps) * [A clustered deployment of WSO2 Enterprise Integrator's Message Broker profile](scalable-mb) + +* [A clustered deployment of WSO2 Enterprise Integrator's Integrator profile with Integrator Analytics support](integrator-analytics) + +* [Clustered deployments of WSO2 Enterprise Integrator's Integrator and Broker profile with Integrator Analytics support](integrator-broker-analytics) \ No newline at end of file diff --git a/integrator-analytics/README.md b/integrator-analytics/README.md index 28434faf..28c03174 100644 --- a/integrator-analytics/README.md +++ b/integrator-analytics/README.md @@ -57,8 +57,8 @@ for further details. ##### 4. Setup and configure external product database(s): -Setup the external product databases. Please refer to WSO2 API Manager's [official documentation](https://docs.wso2.com/display/EI620/Prerequisites+to+Publish+Statistics) -on creating the required databases for the deployment. +Setup the external product databases. Please refer to WSO2's official documentation [1](https://docs.wso2.com/display/EI620/Clustering+the+ESB+Profile#ClusteringtheESBProfile-Creatingthedatabases) +and [2](https://docs.wso2.com/display/EI620/Minimum+High+Availability+Deployment) on creating the required databases for the deployment. Provide appropriate connection URLs, corresponding to the created external databases and the relevant driver class names for the data sources defined in the following files: @@ -205,7 +205,7 @@ wso2ei-integrator-ingress wso2ei-integrator ` number of +Default deployment runs a single replica (or pod) of WSO2 Enterprise Integrator's Integrator profile. To scale this deployment into any `` number of container replicas, upon your requirement, simply run following Kubernetes client command on the terminal. ``` From 5f9b9c1faec3ac2f6d2ba5cbfd982a869f2d01c4 Mon Sep 17 00:00:00 2001 From: chirangaalwis Date: Tue, 19 Jun 2018 19:36:24 +0530 Subject: [PATCH 4/4] Update the Docker email with a meaningful name --- integrator-analytics/README.md | 2 +- integrator-analytics/test/README.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/integrator-analytics/README.md b/integrator-analytics/README.md index 28c03174..6c924415 100644 --- a/integrator-analytics/README.md +++ b/integrator-analytics/README.md @@ -50,7 +50,7 @@ kubectl create secret docker-registry wso2creds --docker-server=docker.wso2.com `username`: Username of your Free Trial Subscription
`password`: Password of your Free Trial Subscription
-`email`: Docker email +`email`: Username of your Free Trial Subscription Please see [Kubernetes official documentation](https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/#create-a-secret-in-the-cluster-that-holds-your-authorization-token) for further details. diff --git a/integrator-analytics/test/README.md b/integrator-analytics/test/README.md index 0d4431f1..c948a58a 100644 --- a/integrator-analytics/test/README.md +++ b/integrator-analytics/test/README.md @@ -47,7 +47,7 @@ kubectl create secret docker-registry wso2creds --docker-server=docker.wso2.com `username`: Username of your Free Trial Subscription
`password`: Password of your Free Trial Subscription
-`email`: Docker email +`email`: Username of your Free Trial Subscription * A Kubernetes role and a role binding necessary for the Kubernetes API requests made from Kubernetes membership scheme.