From 0a37a4bb2793829172e64587440e45d07ed2e23f Mon Sep 17 00:00:00 2001 From: ChenLong Ma Date: Tue, 15 Mar 2022 10:53:39 +0800 Subject: [PATCH 01/14] Feat: refactored file structure of FATE chart (#550) * Refactored file structure of FATE chart Signed-off-by: ChenLong Ma * In order to distinguish it from the existing version, the version number has been added Signed-off-by: ChenLong Ma * The images used are recorded for the convenience of development. Signed-off-by: ChenLong Ma * The release folder contains the release package files, no code Signed-off-by: ChenLong Ma * update Copyright and delete useless files Signed-off-by: ChenLong Ma --- .gitignore | 1 + helm-charts/FATE/Chart.yaml | 2 +- helm-charts/FATE/templates/NOTES.txt | 11 + helm-charts/FATE/templates/_helpers.tpl | 11 + .../eggroll/clustermanager/configmap.yaml} | 4 +- .../eggroll/clustermanager/deployment.yaml} | 22 +- .../eggroll/clustermanager/service.yaml | 31 + .../eggroll/lb-rollsite/configmap.yaml | 109 +++ .../eggroll/lb-rollsite/deployment.yaml} | 147 +--- .../backends/eggroll/lb-rollsite/service.yaml | 58 ++ .../eggroll/nodemanager/configmap.yaml | 105 +++ .../eggroll/nodemanager/deployment.yaml | 120 ++++ .../nodemanager/persistentvolumeclaim.yaml | 40 ++ .../backends/eggroll/nodemanager/service.yaml | 35 + .../backends/eggroll/rollsite/configmap.yaml | 94 +++ .../eggroll/rollsite/deployment.yaml} | 111 +-- .../backends/eggroll/rollsite/service.yaml | 36 + .../spark/hdfs/configmap.yaml} | 175 ++--- .../backends/spark/hdfs/deployment.yaml | 157 ++++ .../spark/hdfs/persistentvolumeclaim.yaml | 59 ++ .../backends/spark/hdfs/service.yaml | 68 ++ .../spark/nginx/configmap.yaml} | 102 +-- .../backends/spark/nginx/deployment.yaml | 76 ++ .../backends/spark/nginx/service.yaml | 45 ++ .../spark/pulsar/configmap.yaml} | 474 ++++--------- .../backends/spark/pulsar/deployment.yaml | 92 +++ .../backends/spark/pulsar/ingress.yaml | 42 ++ .../spark/pulsar/persistentvolumeclaim.yaml | 35 + .../backends/spark/pulsar/service.yaml | 76 ++ .../backends/spark/rabbitmq/configmap.yaml | 23 + .../spark/rabbitmq/deployment.yaml} | 44 +- .../backends/spark/rabbitmq/ingress.yaml | 43 ++ .../backends/spark/rabbitmq/service.yaml | 41 ++ .../spark/spark/configmap.yaml} | 85 +-- .../spark/spark/deployment.yaml} | 109 +-- .../backends/spark/spark/ingress.yaml | 43 ++ .../backends/spark/spark/service.yaml | 89 +++ .../client/deployment.yaml} | 45 +- .../FATE/templates/core/client/ingress.yaml | 43 ++ .../FATE/templates/core/client/istio.yaml | 34 + .../core/client/persistentvolumeclaim.yaml | 35 + .../FATE/templates/core/client/service.yaml | 30 + .../templates/core/fateboard/configmap.yaml | 50 ++ .../templates/core/fateboard/ingress.yaml | 43 ++ .../FATE/templates/core/fateboard/istio.yaml | 34 + .../templates/core/fateboard/service.yaml | 30 + .../templates/core/fateflow/configmap.yaml | 300 ++++++++ .../core/fateflow/persistentvolumeclaim.yaml | 34 + .../FATE/templates/core/fateflow/service.yaml | 102 +++ .../FATE/templates/{ => core}/istio.yaml | 43 +- .../mysql/configmap.yaml} | 124 +--- .../FATE/templates/core/mysql/deployment.yaml | 91 +++ .../core/mysql/persistentvolumeclaim.yaml | 35 + .../FATE/templates/core/mysql/service.yaml | 30 + .../FATE/templates/core/python-spark.yaml | 232 ++++++ helm-charts/FATE/templates/hdfs-nn.yaml | 209 ------ helm-charts/FATE/templates/ingress.yaml | 177 ----- .../FATE/templates/nodemanager-module.yaml | 250 ------- helm-charts/FATE/templates/psp.yaml | 11 + helm-charts/FATE/templates/python-spark.yaml | 670 ------------------ helm-charts/FATE/templates/role.yaml | 11 + helm-charts/FATE/templates/rolebinding.yaml | 11 + .../FATE/templates/serviceaccount.yaml | 11 + helm-charts/FATE/values-template-example.yaml | 2 +- helm-charts/Images_list.md | 38 + 65 files changed, 3042 insertions(+), 2498 deletions(-) rename helm-charts/FATE/templates/{eggroll-config.yaml => backends/eggroll/clustermanager/configmap.yaml} (98%) rename helm-charts/FATE/templates/{clustermanager-module.yaml => backends/eggroll/clustermanager/deployment.yaml} (87%) create mode 100644 helm-charts/FATE/templates/backends/eggroll/clustermanager/service.yaml create mode 100644 helm-charts/FATE/templates/backends/eggroll/lb-rollsite/configmap.yaml rename helm-charts/FATE/templates/{lb-rollsite-module.yaml => backends/eggroll/lb-rollsite/deployment.yaml} (51%) create mode 100644 helm-charts/FATE/templates/backends/eggroll/lb-rollsite/service.yaml create mode 100644 helm-charts/FATE/templates/backends/eggroll/nodemanager/configmap.yaml create mode 100644 helm-charts/FATE/templates/backends/eggroll/nodemanager/deployment.yaml create mode 100644 helm-charts/FATE/templates/backends/eggroll/nodemanager/persistentvolumeclaim.yaml create mode 100644 helm-charts/FATE/templates/backends/eggroll/nodemanager/service.yaml create mode 100644 helm-charts/FATE/templates/backends/eggroll/rollsite/configmap.yaml rename helm-charts/FATE/templates/{rollsite-module.yaml => backends/eggroll/rollsite/deployment.yaml} (50%) create mode 100644 helm-charts/FATE/templates/backends/eggroll/rollsite/service.yaml rename helm-charts/FATE/templates/{hdfs-dn.yaml => backends/spark/hdfs/configmap.yaml} (53%) create mode 100644 helm-charts/FATE/templates/backends/spark/hdfs/deployment.yaml create mode 100644 helm-charts/FATE/templates/backends/spark/hdfs/persistentvolumeclaim.yaml create mode 100644 helm-charts/FATE/templates/backends/spark/hdfs/service.yaml rename helm-charts/FATE/templates/{nginx.yaml => backends/spark/nginx/configmap.yaml} (54%) create mode 100644 helm-charts/FATE/templates/backends/spark/nginx/deployment.yaml create mode 100644 helm-charts/FATE/templates/backends/spark/nginx/service.yaml rename helm-charts/FATE/templates/{pulsar.yaml => backends/spark/pulsar/configmap.yaml} (90%) create mode 100644 helm-charts/FATE/templates/backends/spark/pulsar/deployment.yaml create mode 100644 helm-charts/FATE/templates/backends/spark/pulsar/ingress.yaml create mode 100644 helm-charts/FATE/templates/backends/spark/pulsar/persistentvolumeclaim.yaml create mode 100644 helm-charts/FATE/templates/backends/spark/pulsar/service.yaml create mode 100644 helm-charts/FATE/templates/backends/spark/rabbitmq/configmap.yaml rename helm-charts/FATE/templates/{rabbitmq.yaml => backends/spark/rabbitmq/deployment.yaml} (71%) create mode 100644 helm-charts/FATE/templates/backends/spark/rabbitmq/ingress.yaml create mode 100644 helm-charts/FATE/templates/backends/spark/rabbitmq/service.yaml rename helm-charts/FATE/templates/{spark-worker.yaml => backends/spark/spark/configmap.yaml} (67%) rename helm-charts/FATE/templates/{spark-master.yaml => backends/spark/spark/deployment.yaml} (56%) create mode 100644 helm-charts/FATE/templates/backends/spark/spark/ingress.yaml create mode 100644 helm-charts/FATE/templates/backends/spark/spark/service.yaml rename helm-charts/FATE/templates/{client.yaml => core/client/deployment.yaml} (71%) create mode 100644 helm-charts/FATE/templates/core/client/ingress.yaml create mode 100644 helm-charts/FATE/templates/core/client/istio.yaml create mode 100644 helm-charts/FATE/templates/core/client/persistentvolumeclaim.yaml create mode 100644 helm-charts/FATE/templates/core/client/service.yaml create mode 100644 helm-charts/FATE/templates/core/fateboard/configmap.yaml create mode 100644 helm-charts/FATE/templates/core/fateboard/ingress.yaml create mode 100644 helm-charts/FATE/templates/core/fateboard/istio.yaml create mode 100644 helm-charts/FATE/templates/core/fateboard/service.yaml create mode 100644 helm-charts/FATE/templates/core/fateflow/configmap.yaml create mode 100644 helm-charts/FATE/templates/core/fateflow/persistentvolumeclaim.yaml create mode 100644 helm-charts/FATE/templates/core/fateflow/service.yaml rename helm-charts/FATE/templates/{ => core}/istio.yaml (52%) rename helm-charts/FATE/templates/{mysql-module.yaml => core/mysql/configmap.yaml} (67%) create mode 100644 helm-charts/FATE/templates/core/mysql/deployment.yaml create mode 100644 helm-charts/FATE/templates/core/mysql/persistentvolumeclaim.yaml create mode 100644 helm-charts/FATE/templates/core/mysql/service.yaml create mode 100644 helm-charts/FATE/templates/core/python-spark.yaml delete mode 100644 helm-charts/FATE/templates/hdfs-nn.yaml delete mode 100644 helm-charts/FATE/templates/ingress.yaml delete mode 100644 helm-charts/FATE/templates/nodemanager-module.yaml delete mode 100644 helm-charts/FATE/templates/python-spark.yaml create mode 100644 helm-charts/Images_list.md diff --git a/.gitignore b/.gitignore index 20fe8ce74..cd37e5c00 100644 --- a/.gitignore +++ b/.gitignore @@ -11,3 +11,4 @@ dist/ *.out *.tgz *.tar +release/ diff --git a/helm-charts/FATE/Chart.yaml b/helm-charts/FATE/Chart.yaml index bc06a9ea2..e0ee72e85 100644 --- a/helm-charts/FATE/Chart.yaml +++ b/helm-charts/FATE/Chart.yaml @@ -2,7 +2,7 @@ apiVersion: v1 appVersion: v1.7.2 description: A Helm chart for fate-training name: fate -version: v1.7.2 +version: v1.7.2-a home: https://fate.fedai.org icon: https://aisp-1251170195.cos.ap-hongkong.myqcloud.com/wp-content/uploads/sites/12/2019/09/logo.png sources: diff --git a/helm-charts/FATE/templates/NOTES.txt b/helm-charts/FATE/templates/NOTES.txt index bb7370ceb..bd9a06454 100644 --- a/helm-charts/FATE/templates/NOTES.txt +++ b/helm-charts/FATE/templates/NOTES.txt @@ -1,3 +1,14 @@ +# Copyright 2019-2022 VMware, Inc. +# 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. + Please wait for several minutes for FATE deployment to complete. For more details, please visit https://github.com/FederatedAI/KubeFATE. diff --git a/helm-charts/FATE/templates/_helpers.tpl b/helm-charts/FATE/templates/_helpers.tpl index 88972b68b..8b6bae344 100644 --- a/helm-charts/FATE/templates/_helpers.tpl +++ b/helm-charts/FATE/templates/_helpers.tpl @@ -1,3 +1,14 @@ +# Copyright 2019-2022 VMware, Inc. +# 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. + {{/* Helm required labels */}} {{- define "fate.labels" -}} name: {{ .Values.partyName | quote }} diff --git a/helm-charts/FATE/templates/eggroll-config.yaml b/helm-charts/FATE/templates/backends/eggroll/clustermanager/configmap.yaml similarity index 98% rename from helm-charts/FATE/templates/eggroll-config.yaml rename to helm-charts/FATE/templates/backends/eggroll/clustermanager/configmap.yaml index 39a9cb005..f3ab2929b 100644 --- a/helm-charts/FATE/templates/eggroll-config.yaml +++ b/helm-charts/FATE/templates/backends/eggroll/clustermanager/configmap.yaml @@ -1,4 +1,4 @@ -# Copyright 2019-2020 VMware, Inc. +# Copyright 2019-2022 VMware, Inc. # 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 @@ -9,6 +9,7 @@ # See the License for the specific language governing permissions and # limitations under the License. +{{ if .Values.modules.clustermanager.include }} kind: ConfigMap apiVersion: v1 metadata: @@ -95,3 +96,4 @@ data: eggroll.rollsite.polling.server.enabled=true eggroll.rollsite.polling.concurrency= {{ .Values.modules.rollsite.polling.concurrency | default 50 }} {{- end }} +{{ end }} \ No newline at end of file diff --git a/helm-charts/FATE/templates/clustermanager-module.yaml b/helm-charts/FATE/templates/backends/eggroll/clustermanager/deployment.yaml similarity index 87% rename from helm-charts/FATE/templates/clustermanager-module.yaml rename to helm-charts/FATE/templates/backends/eggroll/clustermanager/deployment.yaml index 601f614e6..30071ee2c 100644 --- a/helm-charts/FATE/templates/clustermanager-module.yaml +++ b/helm-charts/FATE/templates/backends/eggroll/clustermanager/deployment.yaml @@ -1,4 +1,4 @@ -# Copyright 2019-2020 VMware, Inc. +# Copyright 2019-2022 VMware, Inc. # 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 @@ -79,24 +79,4 @@ spec: - name: eggroll-confs configMap: name: eggroll-config ---- -apiVersion: v1 -kind: Service -metadata: - name: clustermanager - labels: - fateMoudle: clustermanager -{{ include "fate.labels" . | indent 4 }} -spec: - ports: - - name: "tcp-clustermanager" - port: 4670 - targetPort: 4670 - protocol: TCP - type: {{ .Values.modules.clustermanager.type }} - clusterIP: None - selector: - fateMoudle: clustermanager -{{ include "fate.matchLabels" . | indent 4 }} ---- {{ end }} \ No newline at end of file diff --git a/helm-charts/FATE/templates/backends/eggroll/clustermanager/service.yaml b/helm-charts/FATE/templates/backends/eggroll/clustermanager/service.yaml new file mode 100644 index 000000000..971a7887f --- /dev/null +++ b/helm-charts/FATE/templates/backends/eggroll/clustermanager/service.yaml @@ -0,0 +1,31 @@ +# Copyright 2019-2022 VMware, Inc. +# 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. + +{{ if .Values.modules.clustermanager.include }} +apiVersion: v1 +kind: Service +metadata: + name: clustermanager + labels: + fateMoudle: clustermanager +{{ include "fate.labels" . | indent 4 }} +spec: + ports: + - name: "tcp-clustermanager" + port: 4670 + targetPort: 4670 + protocol: TCP + type: {{ .Values.modules.clustermanager.type }} + clusterIP: None + selector: + fateMoudle: clustermanager +{{ include "fate.matchLabels" . | indent 4 }} +{{ end }} \ No newline at end of file diff --git a/helm-charts/FATE/templates/backends/eggroll/lb-rollsite/configmap.yaml b/helm-charts/FATE/templates/backends/eggroll/lb-rollsite/configmap.yaml new file mode 100644 index 000000000..afbd7c97d --- /dev/null +++ b/helm-charts/FATE/templates/backends/eggroll/lb-rollsite/configmap.yaml @@ -0,0 +1,109 @@ +# Copyright 2019-2022 VMware, Inc. +# 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. + +{{ if .Values.modules.lbrollsite.include }} +kind: ConfigMap +apiVersion: v1 +metadata: + name: rollsite-config + labels: + fateMoudle: rollsite +{{ include "fate.labels" . | indent 4 }} +data: + route_table.json: | + { + "route_table": { + "default": { + "default": [ + { + "ip": "exchange", + "port": 9390 + } + ] + }, + {{- range .Values.partyList }} + "{{ .partyId }}": { + "default": [ + { + "ip": "{{ .partyIp }}", + "port": {{ .partyPort }} + } + ] + }, + {{- end }} + "{{ .Values.partyId }}": { + "fateflow": [ + { + "ip": "fateflow", + "port": 9360 + } + ], + "default": [ + { + "ip": "rollsite", + "port": 9370 + } + ] + } + }, + "permission": { + "default_allow": true + } + } + nginx.conf: | + + #user nobody; + worker_processes 10; + + #error_log logs/error.log; + #error_log logs/error.log notice; + error_log /dev/stdout info; + + #pid logs/nginx.pid; + + + events { + worker_connections 1024; + } + + + http { + include mime.types; + default_type application/octet-stream; + + log_format main '$remote_addr - $remote_user [$time_local] "$request" ' + '$status $body_bytes_sent "$http_referer" ' + '"$http_user_agent" "$http_x_forwarded_for"'; + + access_log /dev/stdout main; + + sendfile on; + client_max_body_size {{ .Values.modules.lbrollsite.size }}; + #tcp_nopush on; + + #keepalive_timeout 0; + keepalive_timeout 65; + + #gzip on; + upstream exchange_services { + least_conn; + {{- range .Values.exchangeList }} + server {{ .ip }}:{{ .port }}; + {{- end }} + } + server { + listen 9390 http2; + location / { + grpc_pass grpc://exchange_services; + } + } + } +{{ end }} \ No newline at end of file diff --git a/helm-charts/FATE/templates/lb-rollsite-module.yaml b/helm-charts/FATE/templates/backends/eggroll/lb-rollsite/deployment.yaml similarity index 51% rename from helm-charts/FATE/templates/lb-rollsite-module.yaml rename to helm-charts/FATE/templates/backends/eggroll/lb-rollsite/deployment.yaml index e49132c84..7f15293c0 100644 --- a/helm-charts/FATE/templates/lb-rollsite-module.yaml +++ b/helm-charts/FATE/templates/backends/eggroll/lb-rollsite/deployment.yaml @@ -1,4 +1,4 @@ -# Copyright 2019-2020 VMware, Inc. +# Copyright 2019-2022 VMware, Inc. # 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 @@ -10,103 +10,6 @@ # limitations under the License. {{ if .Values.modules.lbrollsite.include }} -kind: ConfigMap -apiVersion: v1 -metadata: - name: rollsite-config - labels: - fateMoudle: rollsite -{{ include "fate.labels" . | indent 4 }} -data: - route_table.json: | - { - "route_table": { - "default": { - "default": [ - { - "ip": "exchange", - "port": 9390 - } - ] - }, - {{- range .Values.partyList }} - "{{ .partyId }}": { - "default": [ - { - "ip": "{{ .partyIp }}", - "port": {{ .partyPort }} - } - ] - }, - {{- end }} - "{{ .Values.partyId }}": { - "fateflow": [ - { - "ip": "fateflow", - "port": 9360 - } - ], - "default": [ - { - "ip": "rollsite", - "port": 9370 - } - ] - } - }, - "permission": { - "default_allow": true - } - } - nginx.conf: | - - #user nobody; - worker_processes 10; - - #error_log logs/error.log; - #error_log logs/error.log notice; - error_log /dev/stdout info; - - #pid logs/nginx.pid; - - - events { - worker_connections 1024; - } - - - http { - include mime.types; - default_type application/octet-stream; - - log_format main '$remote_addr - $remote_user [$time_local] "$request" ' - '$status $body_bytes_sent "$http_referer" ' - '"$http_user_agent" "$http_x_forwarded_for"'; - - access_log /dev/stdout main; - - sendfile on; - client_max_body_size {{ .Values.modules.lbrollsite.size }}; - #tcp_nopush on; - - #keepalive_timeout 0; - keepalive_timeout 65; - - #gzip on; - upstream exchange_services { - least_conn; - {{- range .Values.exchangeList }} - server {{ .ip }}:{{ .port }}; - {{- end }} - } - server { - listen 9390 http2; - location / { - grpc_pass grpc://exchange_services; - } - } - } ---- apiVersion: apps/v1 kind: Deployment metadata: @@ -197,50 +100,4 @@ spec: - name: eggroll-confs configMap: name: eggroll-config ---- -apiVersion: v1 -kind: Service -metadata: - name: rollsite - labels: - fateMoudle: rollsite -{{ include "fate.labels" . | indent 4 }} -spec: - ports: - - name: "tcp-rollsite" - port: 9370 - targetPort: 9370 - {{- if eq .Values.modules.lbrollsite.type "NodePort" "LoadBalancer" }} - nodePort: {{ .Values.modules.lbrollsite.nodePort }} - {{- end }} - protocol: TCP - type: {{ .Values.modules.lbrollsite.type }} -{{- if .Values.modules.lbrollsite.loadBalancerIP }} - loadBalancerIP: "{{ .Values.modules.lbrollsite.loadBalancerIP }}" -{{- end }} - selector: - fateMoudle: rollsite -{{ include "fate.matchLabels" . | indent 4 }} ---- -apiVersion: v1 -kind: Service -metadata: - name: exchange - labels: - fateMoudle: rollsite -{{ include "fate.labels" . | indent 4 }} -spec: - ports: - - name: "9390" - port: 9390 - targetPort: 9390 - # {{- if eq .Values.modules.lbrollsite.type "NodePort" "LoadBalancer" }} - # nodePort: {{ .Values.modules.lbrollsite.nodePort }} - # {{- end }} - protocol: TCP - type: {{ .Values.modules.lbrollsite.type }} - selector: - fateMoudle: rollsite -{{ include "fate.matchLabels" . | indent 4 }} ---- -{{ end }} +{{ end }} \ No newline at end of file diff --git a/helm-charts/FATE/templates/backends/eggroll/lb-rollsite/service.yaml b/helm-charts/FATE/templates/backends/eggroll/lb-rollsite/service.yaml new file mode 100644 index 000000000..d732667c5 --- /dev/null +++ b/helm-charts/FATE/templates/backends/eggroll/lb-rollsite/service.yaml @@ -0,0 +1,58 @@ +# Copyright 2019-2022 VMware, Inc. +# 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. + +{{ if .Values.modules.lbrollsite.include }} +apiVersion: v1 +kind: Service +metadata: + name: rollsite + labels: + fateMoudle: rollsite +{{ include "fate.labels" . | indent 4 }} +spec: + ports: + - name: "tcp-rollsite" + port: 9370 + targetPort: 9370 + {{- if eq .Values.modules.lbrollsite.type "NodePort" "LoadBalancer" }} + nodePort: {{ .Values.modules.lbrollsite.nodePort }} + {{- end }} + protocol: TCP + type: {{ .Values.modules.lbrollsite.type }} +{{- if .Values.modules.lbrollsite.loadBalancerIP }} + loadBalancerIP: "{{ .Values.modules.lbrollsite.loadBalancerIP }}" +{{- end }} + selector: + fateMoudle: rollsite +{{ include "fate.matchLabels" . | indent 4 }} +--- +apiVersion: v1 +kind: Service +metadata: + name: exchange + labels: + fateMoudle: rollsite +{{ include "fate.labels" . | indent 4 }} +spec: + ports: + - name: "9390" + port: 9390 + targetPort: 9390 + # {{- if eq .Values.modules.lbrollsite.type "NodePort" "LoadBalancer" }} + # nodePort: {{ .Values.modules.lbrollsite.nodePort }} + # {{- end }} + protocol: TCP + type: {{ .Values.modules.lbrollsite.type }} + selector: + fateMoudle: rollsite +{{ include "fate.matchLabels" . | indent 4 }} +--- +{{ end }} \ No newline at end of file diff --git a/helm-charts/FATE/templates/backends/eggroll/nodemanager/configmap.yaml b/helm-charts/FATE/templates/backends/eggroll/nodemanager/configmap.yaml new file mode 100644 index 000000000..b1d479f0b --- /dev/null +++ b/helm-charts/FATE/templates/backends/eggroll/nodemanager/configmap.yaml @@ -0,0 +1,105 @@ +# Copyright 2019-2022 VMware, Inc. +# 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. + +{{- if .Values.modules.nodemanager.include }} +{{- $root := . -}} +{{- range $nodemanager := .Values.modules.nodemanager.list }} +--- +kind: ConfigMap +apiVersion: v1 +metadata: + name: {{ $nodemanager.name }}-config + labels: + fateMoudle: {{ $nodemanager.name }} +{{ include "fate.labels" $root | indent 4 }} +data: + eggroll.properties: | + [eggroll] + eggroll.resourcemanager.clustermanager.jdbc.driver.class.name=com.mysql.cj.jdbc.Driver + eggroll.resourcemanager.clustermanager.jdbc.url=jdbc:mysql://{{ $root.Values.modules.mysql.ip }}:{{ $root.Values.modules.mysql.port }}/{{ $root.Values.modules.mysql.mysql_database }}?useSSL=false&serverTimezone=UTC&characterEncoding=utf8&allowPublicKeyRetrieval=true + eggroll.resourcemanager.clustermanager.jdbc.username={{ $root.Values.modules.mysql.mysql_user }} + eggroll.resourcemanager.clustermanager.jdbc.password={{ $root.Values.modules.mysql.mysql_password }} + + eggroll.data.dir=data/ + eggroll.logs.dir=logs/ + eggroll.resourcemanager.clustermanager.host=clustermanager + eggroll.resourcemanager.clustermanager.port=4670 + eggroll.resourcemanager.nodemanager.port=4671 + eggroll.resourcemanager.process.tag={{ $root.Values.partyId }} + + eggroll.bootstrap.root.script=bin/eggroll_boot.sh + + eggroll.resourcemanager.bootstrap.egg_pair.exepath=bin/roll_pair/egg_pair_bootstrap.sh + eggroll.resourcemanager.bootstrap.egg_pair.venv= + eggroll.resourcemanager.bootstrap.egg_pair.pythonpath=/data/projects/fate/python:/data/projects/fate/eggroll/python + eggroll.resourcemanager.bootstrap.egg_pair.filepath=python/eggroll/roll_pair/egg_pair.py + eggroll.resourcemanager.bootstrap.egg_pair.ld_library_path= + + eggroll.resourcemanager.bootstrap.egg_frame.exepath=bin/roll_pair/roll_pair_master_bootstrap.sh + eggroll.resourcemanager.bootstrap.egg_frame.javahome=/usr/lib/jvm/java-1.8.0-openjdk + eggroll.resourcemanager.bootstrap.egg_frame.classpath=conf/:lib/* + eggroll.resourcemanager.bootstrap.egg_frame.mainclass=com.webank.eggroll.rollframe.EggFrameBootstrap + eggroll.resourcemanager.bootstrap.egg_frame.jvm.options= + + eggroll.core.grpc.channel.keepalive.timeout.sec=20 + + # roll_frame + arrow.enable_unsafe_memory_access=true + + # hadoop + hadoop.fs.defaultFS=file:/// + + # hadoop HA mode + hadoop.dfs.nameservices= + hadoop.dfs.namenode.rpc-address.nn1= + hadoop.dfs.namenode.rpc-address.nn2= + + # session + eggroll.session.processors.per.node={{ $nodemanager.sessionProcessorsPerNode }} + eggroll.session.start.timeout.ms=180000 + + # rollpair + eggroll.rollpair.transferpair.sendbuf.size=250000 + + # rollsite + eggroll.rollsite.coordinator={{ $root.Values.partyName }} + eggroll.rollsite.host=rollsite + eggroll.rollsite.port=9370 + eggroll.rollsite.party.id={{ $root.Values.partyId }} + eggroll.rollsite.route.table.path=conf/route_table/route_table.json + eggroll.rollsite.route.table.key= + eggroll.rollsite.route.table.whitelist=127.0.0.1 + eggroll.rollsite.jvm.options=-XX:+UseG1GC -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:logs/eggroll/rollsite.gc.log + + eggroll.rollsite.push.max.retry=3 + eggroll.rollsite.push.long.retry=2 + eggroll.rollsite.push.batches.per.stream=10 + eggroll.rollsite.adapter.sendbuf.size=100000 + fluent.conf: | + + @type tail + path /data/projects/fate/eggroll/logs/*/*.* + exclude_path ["/data/projects/fate/eggroll/logs/eggroll/*", "/data/projects/fate/eggroll/logs/log.pos"] + pos_file /data/projects/fate/eggroll/logs/log.pos + tag eggroll + multiline_flush_interval 2s + refresh_interval 5s + + @type none + + + + + @type stdout + + +{{- end }} +{{ end }} \ No newline at end of file diff --git a/helm-charts/FATE/templates/backends/eggroll/nodemanager/deployment.yaml b/helm-charts/FATE/templates/backends/eggroll/nodemanager/deployment.yaml new file mode 100644 index 000000000..cd5268a21 --- /dev/null +++ b/helm-charts/FATE/templates/backends/eggroll/nodemanager/deployment.yaml @@ -0,0 +1,120 @@ +# Copyright 2019-2022 VMware, Inc. +# 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. + +{{- if .Values.modules.nodemanager.include }} +{{- $root := . -}} +{{- range $nodemanager := .Values.modules.nodemanager.list }} +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ $nodemanager.name }} + labels: + fateMoudle: {{ $nodemanager.name }} + app: nodemanager +{{ include "fate.labels" $root | indent 4 }} +spec: + replicas: 1 + strategy: + type: Recreate + selector: + matchLabels: + fateMoudle: {{ $nodemanager.name }} +{{ include "fate.matchLabels" $root | indent 6 }} + template: + metadata: + labels: + fateMoudle: {{ $nodemanager.name }} + app: nodemanager +{{ include "fate.labels" $root | indent 8 }} + spec: + containers: + - name: {{ $nodemanager.name }}-eggrollpair + {{- if $root.Values.image.isThridParty }} + image: {{ $root.Values.image.registry }}/fluentd:v1.12 + {{- else }} + image: fluent/fluentd:v1.12 + {{- end }} + volumeMounts: + - name: eggroll-log + mountPath: /data/projects/fate/eggroll/logs/ + - name: fluentd-conf + subPath: fluent.conf + mountPath: /fluentd/etc/fluent.conf + - image: {{ $root.Values.image.registry }}/eggroll:{{ $root.Values.image.tag }} + imagePullPolicy: {{ $root.Values.image.pullPolicy }} + name: {{ $nodemanager.name }} + command: + - bash + - -c + - | + set -x + mkdir -p /data/projects/fate/eggroll/logs/eggroll/ + touch /data/projects/fate/eggroll/logs/eggroll/eggroll-audit.log + ln -sf /dev/stdout /data/projects/fate/eggroll/logs/eggroll/eggroll-audit.log + touch /data/projects/fate/eggroll/logs/eggroll/eggroll.jvm.log + ln -sf /dev/stdout /data/projects/fate/eggroll/logs/eggroll/eggroll.jvm.log + touch /data/projects/fate/eggroll/logs/eggroll/eggroll.jvm.err.log + ln -sf /dev/stderr /data/projects/fate/eggroll/logs/eggroll/eggroll.jvm.err.log + /tini -- java -Dlog4j.configurationFile=$${EGGROLL_HOME}/conf/log4j2.properties -cp $${EGGROLL_HOME}/lib/*: com.webank.eggroll.core.Bootstrap --bootstraps com.webank.eggroll.core.resourcemanager.NodeManagerBootstrap -c $${EGGROLL_HOME}/conf/eggroll.properties -p 4671 -s 'EGGROLL_DEAMON' + ports: + - containerPort: 4671 + volumeMounts: + - name: eggroll-log + mountPath: /data/projects/fate/eggroll/logs/ + - mountPath: /data/projects/fate/eggroll/conf/eggroll.properties + name: nodemanager-confs + subPath: eggroll.properties + - mountPath: /data/projects/fate/fate/conf/ + name: python-confs + - name: data-dir + mountPath: /data/projects/fate/eggroll/data + subPath: {{ $nodemanager.subPath }} + {{- with $nodemanager.nodeSelector }} + nodeSelector: +{{ toYaml . | indent 8 }} + {{- end }} + {{- with $nodemanager.tolerations }} + tolerations: +{{ toYaml . | indent 8 }} + {{- end }} + {{- with $nodemanager.affinity }} + affinity: +{{ toYaml . | indent 8 }} + {{- end }} + {{- with $root.Values.image.imagePullSecrets }} + imagePullSecrets: +{{ toYaml . | indent 6 }} + {{- end }} + serviceAccountName: {{ template "serviceAccountName" $root }} + restartPolicy: Always + volumes: + - name: eggroll-log + emptyDir: {} + - name: fluentd-conf + configMap: + name: {{ $nodemanager.name }}-config + - name: nodemanager-confs + configMap: + name: {{ $nodemanager.name }}-config + - name: python-confs + configMap: + name: python-config + {{- if not $root.Values.persistence.enabled }} + - name: data-dir + emptyDir: {} + {{- else }} + - name: data-dir + persistentVolumeClaim: + claimName: {{ $nodemanager.existingClaim | default (printf "%s-data" $nodemanager.name) }} + {{- end }} +{{- end }} +{{- end }} \ No newline at end of file diff --git a/helm-charts/FATE/templates/backends/eggroll/nodemanager/persistentvolumeclaim.yaml b/helm-charts/FATE/templates/backends/eggroll/nodemanager/persistentvolumeclaim.yaml new file mode 100644 index 000000000..82838f51e --- /dev/null +++ b/helm-charts/FATE/templates/backends/eggroll/nodemanager/persistentvolumeclaim.yaml @@ -0,0 +1,40 @@ +# Copyright 2019-2022 VMware, Inc. +# 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. + +{{- if .Values.modules.nodemanager.include }} +{{- $root := . -}} +{{- range $nodemanager := .Values.modules.nodemanager.list }} +--- +{{- if and $root.Values.persistence.enabled (not $nodemanager.existingClaim) }} +kind: PersistentVolumeClaim +apiVersion: v1 +metadata: + name: {{ $nodemanager.name }}-data + labels: + fateMoudle: {{ $nodemanager.name }} +{{ include "fate.labels" $root | indent 4 }} +spec: + accessModes: + - {{ $nodemanager.accessMode }} + resources: + requests: + storage: {{ $nodemanager.size }} + {{- if $nodemanager.storageClass }} + {{- if eq "-" $nodemanager.storageClass }} + storageClassName: "" + {{- else }} + storageClassName: {{ $nodemanager.storageClass }} + {{- end }} + {{- end }} +{{- end }} + +{{- end }} +{{- end }} \ No newline at end of file diff --git a/helm-charts/FATE/templates/backends/eggroll/nodemanager/service.yaml b/helm-charts/FATE/templates/backends/eggroll/nodemanager/service.yaml new file mode 100644 index 000000000..a49d3d83d --- /dev/null +++ b/helm-charts/FATE/templates/backends/eggroll/nodemanager/service.yaml @@ -0,0 +1,35 @@ +# Copyright 2019-2022 VMware, Inc. +# 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. + +{{- if .Values.modules.nodemanager.include }} +{{- $root := . -}} +{{- range $nodemanager := .Values.modules.nodemanager.list }} +--- +apiVersion: v1 +kind: Service +metadata: + labels: + fateMoudle: {{ $nodemanager.name }} +{{ include "fate.labels" $root | indent 4 }} + name: {{ $nodemanager.name }} +spec: + ports: + - name: "tcp-nodemanager" + port: 4671 + targetPort: 4671 + protocol: TCP + clusterIP: None + selector: + fateMoudle: {{ $nodemanager.name }} +{{ include "fate.matchLabels" $root | indent 4 }} + +{{- end }} +{{- end }} \ No newline at end of file diff --git a/helm-charts/FATE/templates/backends/eggroll/rollsite/configmap.yaml b/helm-charts/FATE/templates/backends/eggroll/rollsite/configmap.yaml new file mode 100644 index 000000000..f25ba0bec --- /dev/null +++ b/helm-charts/FATE/templates/backends/eggroll/rollsite/configmap.yaml @@ -0,0 +1,94 @@ +# Copyright 2019-2022 VMware, Inc. +# 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. + +{{ if .Values.modules.rollsite.include }} +kind: ConfigMap +apiVersion: v1 +metadata: + name: rollsite-config + labels: + fateMoudle: rollsite +{{ include "fate.labels" . | indent 4 }} +data: + route_table.json: | + { + "route_table": { + "default": { + "default": [ + { + {{- if .Values.exchange }} + "ip": "{{ .Values.exchange.partyIp }}", + "port": {{ .Values.exchange.partyPort }} + {{- else }} + + {{- if and .Values.modules.rollsite.polling.enabled ( eq (print .Values.modules.rollsite.polling.type) "client" ) }} + + {{- with .Values.modules.rollsite.polling.server }} + "ip": "{{ .ip }}", + "port": {{ .port }} + {{- end }} + + {{- else }} + "ip": "rollsite", + "port": 9370 + {{- end }} + + {{- end }} + } + ] + }, + {{- range .Values.partyList }} + "{{ .partyId }}": { + "default": [ + { + "ip": "{{ .partyIp }}", + "port": {{ .partyPort }} + } + ] + }, + {{- end }} + + {{- if and .Values.modules.rollsite.polling.enabled ( eq (print .Values.modules.rollsite.polling.type) "server" ) }} + + {{- range .Values.modules.rollsite.polling.clientList}} + "{{ .partID }}": + { + "default": [ + { + "port": -1, + "ip": "", + "is_polling": true + } + ] + }, + {{- end }} + + {{- end }} + "{{ .Values.partyId }}": { + "fateflow": [ + { + "ip": "fateflow", + "port": 9360 + } + ], + "default": [ + { + "ip": "rollsite", + "port": 9370 + } + ] + } + }, + "permission": { + "default_allow": true + } + } +{{ end }} \ No newline at end of file diff --git a/helm-charts/FATE/templates/rollsite-module.yaml b/helm-charts/FATE/templates/backends/eggroll/rollsite/deployment.yaml similarity index 50% rename from helm-charts/FATE/templates/rollsite-module.yaml rename to helm-charts/FATE/templates/backends/eggroll/rollsite/deployment.yaml index d429a85e3..89531dad0 100644 --- a/helm-charts/FATE/templates/rollsite-module.yaml +++ b/helm-charts/FATE/templates/backends/eggroll/rollsite/deployment.yaml @@ -1,4 +1,4 @@ -# Copyright 2019-2020 VMware, Inc. +# Copyright 2019-2022 VMware, Inc. # 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 @@ -10,88 +10,6 @@ # limitations under the License. {{ if .Values.modules.rollsite.include }} -kind: ConfigMap -apiVersion: v1 -metadata: - name: rollsite-config - labels: - fateMoudle: rollsite -{{ include "fate.labels" . | indent 4 }} -data: - route_table.json: | - { - "route_table": { - "default": { - "default": [ - { - {{- if .Values.exchange }} - "ip": "{{ .Values.exchange.partyIp }}", - "port": {{ .Values.exchange.partyPort }} - {{- else }} - - {{- if and .Values.modules.rollsite.polling.enabled ( eq (print .Values.modules.rollsite.polling.type) "client" ) }} - - {{- with .Values.modules.rollsite.polling.server }} - "ip": "{{ .ip }}", - "port": {{ .port }} - {{- end }} - - {{- else }} - "ip": "rollsite", - "port": 9370 - {{- end }} - - {{- end }} - } - ] - }, - {{- range .Values.partyList }} - "{{ .partyId }}": { - "default": [ - { - "ip": "{{ .partyIp }}", - "port": {{ .partyPort }} - } - ] - }, - {{- end }} - - {{- if and .Values.modules.rollsite.polling.enabled ( eq (print .Values.modules.rollsite.polling.type) "server" ) }} - - {{- range .Values.modules.rollsite.polling.clientList}} - "{{ .partID }}": - { - "default": [ - { - "port": -1, - "ip": "", - "is_polling": true - } - ] - }, - {{- end }} - - {{- end }} - "{{ .Values.partyId }}": { - "fateflow": [ - { - "ip": "fateflow", - "port": 9360 - } - ], - "default": [ - { - "ip": "rollsite", - "port": 9370 - } - ] - } - }, - "permission": { - "default_allow": true - } - } ---- apiVersion: apps/v1 kind: Deployment metadata: @@ -170,29 +88,4 @@ spec: - name: eggroll-confs configMap: name: eggroll-config ---- -apiVersion: v1 -kind: Service -metadata: - name: rollsite - labels: - fateMoudle: rollsite -{{ include "fate.labels" . | indent 4 }} -spec: - ports: - - name: "tcp-rollsite" - port: 9370 - targetPort: 9370 - {{- if eq .Values.modules.rollsite.type "NodePort" "LoadBalancer" }} - nodePort: {{ .Values.modules.rollsite.nodePort }} - {{- end }} - protocol: TCP - type: {{ .Values.modules.rollsite.type }} - {{- if .Values.modules.rollsite.loadBalancerIP }} - loadBalancerIP: "{{ .Values.modules.rollsite.loadBalancerIP }}" - {{- end }} - selector: - fateMoudle: rollsite -{{ include "fate.matchLabels" . | indent 4 }} ---- -{{ end }} +{{ end }} \ No newline at end of file diff --git a/helm-charts/FATE/templates/backends/eggroll/rollsite/service.yaml b/helm-charts/FATE/templates/backends/eggroll/rollsite/service.yaml new file mode 100644 index 000000000..0216d4dd2 --- /dev/null +++ b/helm-charts/FATE/templates/backends/eggroll/rollsite/service.yaml @@ -0,0 +1,36 @@ +# Copyright 2019-2022 VMware, Inc. +# 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. + +{{ if .Values.modules.rollsite.include }} +apiVersion: v1 +kind: Service +metadata: + name: rollsite + labels: + fateMoudle: rollsite +{{ include "fate.labels" . | indent 4 }} +spec: + ports: + - name: "tcp-rollsite" + port: 9370 + targetPort: 9370 + {{- if eq .Values.modules.rollsite.type "NodePort" "LoadBalancer" }} + nodePort: {{ .Values.modules.rollsite.nodePort }} + {{- end }} + protocol: TCP + type: {{ .Values.modules.rollsite.type }} + {{- if .Values.modules.rollsite.loadBalancerIP }} + loadBalancerIP: "{{ .Values.modules.rollsite.loadBalancerIP }}" + {{- end }} + selector: + fateMoudle: rollsite +{{ include "fate.matchLabels" . | indent 4 }} +{{ end }} \ No newline at end of file diff --git a/helm-charts/FATE/templates/hdfs-dn.yaml b/helm-charts/FATE/templates/backends/spark/hdfs/configmap.yaml similarity index 53% rename from helm-charts/FATE/templates/hdfs-dn.yaml rename to helm-charts/FATE/templates/backends/spark/hdfs/configmap.yaml index 4a3c9c584..2468b224d 100644 --- a/helm-charts/FATE/templates/hdfs-dn.yaml +++ b/helm-charts/FATE/templates/backends/spark/hdfs/configmap.yaml @@ -1,4 +1,4 @@ -# Copyright 2019-2020 VMware, Inc. +# Copyright 2019-2022 VMware, Inc. # 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 @@ -13,9 +13,25 @@ kind: ConfigMap apiVersion: v1 metadata: - name: datanode-env + name: namenode-config labels: - fateMoudle: datanode + fateMoudle: namenode +{{ include "fate.labels" . | indent 4 }} +data: + core-site.xml: | + + + fs.default.name + hdfs://0.0.0.0:9000 + + +--- +kind: ConfigMap +apiVersion: v1 +metadata: + name: namenode-env + labels: + fateMoudle: namenode {{ include "fate.labels" . | indent 4 }} data: CORE_CONF_fs_defaultFS: "hdfs://namenode:9000" @@ -59,117 +75,52 @@ data: MAPRED_CONF_mapreduce_map_env: HADOOP_MAPRED_HOME=/opt/hadoop-3.2.1/ MAPRED_CONF_mapreduce_reduce_env: HADOOP_MAPRED_HOME=/opt/hadoop-3.2.1/ --- -apiVersion: apps/v1 -kind: Deployment -metadata: - name: datanode - labels: - fateMoudle: datanode -{{ include "fate.labels" . | indent 4 }} -spec: - replicas: 1 - strategy: - type: Recreate - selector: - matchLabels: - fateMoudle: datanode -{{ include "fate.matchLabels" . | indent 6 }} - template: - metadata: - labels: - fateMoudle: datanode -{{ include "fate.labels" . | indent 8 }} - spec: - containers: - - name: datanode - image: {{ .Values.image.registry }}/hadoop-datanode:2.0.0-hadoop2.7.4-java8 - imagePullPolicy: {{ .Values.image.pullPolicy }} - env: - - name: SERVICE_PRECONDITION - value: "namenode:9000" - envFrom: - - configMapRef: - name: datanode-env - ports: - - containerPort: 9000 - - containerPort: 9870 - - containerPort: 50070 - volumeMounts: - - name: dfs - mountPath: /hadoop/dfs/data - {{- with .Values.modules.hdfs.datanode.nodeSelector }} - nodeSelector: -{{ toYaml . | indent 8 }} - {{- end }} - {{- with .Values.modules.hdfs.datanode.tolerations }} - tolerations: -{{ toYaml . | indent 8 }} - {{- end }} - {{- with .Values.modules.hdfs.datanode.affinity }} - affinity: -{{ toYaml . | indent 8 }} - {{- end }} - {{- with .Values.image.imagePullSecrets }} - imagePullSecrets: -{{ toYaml . | indent 6 }} - {{- end }} - serviceAccountName: {{ template "serviceAccountName" . }} - restartPolicy: Always - volumes: - - name: dfs - {{ if .Values.persistence.enabled }} - persistentVolumeClaim: - claimName: {{ .Values.modules.hdfs.datanode.existingClaim | default "datanode-data" }} - {{ else }} - emptyDir: {} - {{ end }} ---- -apiVersion: v1 -kind: Service -metadata: - name: datanode - labels: - fateMoudle: datanode -{{ include "fate.labels" . | indent 4 }} -spec: - ports: - - name: "tcp-9000" - port: 9000 - targetPort: 9000 - protocol: TCP - - name: "tcp-9870" - port: 9870 - targetPort: 9870 - protocol: TCP - - name: "tcp-50070" - port: 50070 - targetPort: 50070 - protocol: TCP - type: {{ .Values.modules.hdfs.datanode.type }} - selector: - fateMoudle: datanode -{{ include "fate.matchLabels" . | indent 4 }} ---- -{{ if and .Values.persistence.enabled (not .Values.modules.hdfs.datanode.existingClaim) }} -kind: PersistentVolumeClaim +kind: ConfigMap apiVersion: v1 metadata: - name: datanode-data + name: datanode-env labels: fateMoudle: datanode {{ include "fate.labels" . | indent 4 }} -spec: - accessModes: - - {{ .Values.modules.hdfs.datanode.accessMode }} - resources: - requests: - storage: {{ .Values.modules.hdfs.datanode.size }} - {{ if .Values.modules.hdfs.datanode.storageClass }} - {{ if eq "-" .Values.modules.hdfs.datanode.storageClass }} - storageClassName: "" - {{ else }} - storageClassName: {{ .Values.modules.hdfs.datanode.storageClass }} - {{ end }} - {{ end }} -{{ end }} -{{ end }} +data: + CORE_CONF_fs_defaultFS: "hdfs://namenode:9000" + CORE_CONF_hadoop_http_staticuser_user: "root" + CORE_CONF_hadoop_proxyuser_hue_hosts: "*" + CORE_CONF_hadoop_proxyuser_hue_groups: "*" + CORE_CONF_io_compression_codecs: org.apache.hadoop.io.compress.SnappyCodec + HDFS_CONF_dfs_webhdfs_enabled: 'true' + HDFS_CONF_dfs_permissions_enabled: 'false' + HDFS_CONF_dfs_namenode_datanode_registration_ip___hostname___check: 'false' + YARN_CONF_yarn_log___aggregation___enable: 'true' + YARN_CONF_yarn_log_server_url: "http://historyserver:8188/applicationhistory/logs/" + YARN_CONF_yarn_resourcemanager_recovery_enabled: 'true' + YARN_CONF_yarn_resourcemanager_store_class: org.apache.hadoop.yarn.server.resourcemanager.recovery.FileSystemRMStateStore + YARN_CONF_yarn_resourcemanager_scheduler_class: org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler + YARN_CONF_yarn_scheduler_capacity_root_default_maximum___allocation___mb: '8192' + YARN_CONF_yarn_scheduler_capacity_root_default_maximum___allocation___vcores: '4' + YARN_CONF_yarn_resourcemanager_fs_state___store_uri: /rmstate + YARN_CONF_yarn_resourcemanager_system___metrics___publisher_enabled: 'true' + YARN_CONF_yarn_resourcemanager_hostname: resourcemanager + YARN_CONF_yarn_resourcemanager_address: resourcemanager:8032 + YARN_CONF_yarn_resourcemanager_scheduler_address: resourcemanager:8030 + YARN_CONF_yarn_resourcemanager_resource__tracker_address: resourcemanager:8031 + YARN_CONF_yarn_timeline___service_enabled: 'true' + YARN_CONF_yarn_timeline___service_generic___application___history_enabled: 'true' + YARN_CONF_yarn_timeline___service_hostname: historyserver + YARN_CONF_mapreduce_map_output_compress: 'true' + YARN_CONF_mapred_map_output_compress_codec: org.apache.hadoopac.io.compress.SnappyCodec + YARN_CONF_yarn_nodemanager_resource_memory___mb: '16384' + YARN_CONF_yarn_nodemanager_resource_cpu___vcores: '8' + YARN_CONF_yarn_nodemanager_disk___health___checker_max___disk___utilization___per___disk___percentage: '98.5' + YARN_CONF_yarn_nodemanager_remote___app___log___dir: /app-logs + YARN_CONF_yarn_nodemanager_aux___services: mapreduce_shuffle + MAPRED_CONF_mapreduce_framework_name: yarn + MAPRED_CONF_mapred_child_java_opts: '-Xmx4096m' + MAPRED_CONF_mapreduce_map_memory_mb: '4096' + MAPRED_CONF_mapreduce_reduce_memory_mb: '8192' + MAPRED_CONF_mapreduce_map_java_opts: '-Xmx3072m' + MAPRED_CONF_mapreduce_reduce_java_opts: '-Xmx6144m' + MAPRED_CONF_yarn_app_mapreduce_am_env: HADOOP_MAPRED_HOME=/opt/hadoop-3.2.1/ + MAPRED_CONF_mapreduce_map_env: HADOOP_MAPRED_HOME=/opt/hadoop-3.2.1/ + MAPRED_CONF_mapreduce_reduce_env: HADOOP_MAPRED_HOME=/opt/hadoop-3.2.1/ +{{ end }} \ No newline at end of file diff --git a/helm-charts/FATE/templates/backends/spark/hdfs/deployment.yaml b/helm-charts/FATE/templates/backends/spark/hdfs/deployment.yaml new file mode 100644 index 000000000..9c52b2507 --- /dev/null +++ b/helm-charts/FATE/templates/backends/spark/hdfs/deployment.yaml @@ -0,0 +1,157 @@ +# Copyright 2019-2022 VMware, Inc. +# 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. + +{{ if .Values.modules.hdfs.include }} +apiVersion: apps/v1 +kind: Deployment +metadata: + name: namenode + labels: + fateMoudle: namenode +{{ include "fate.labels" . | indent 4 }} +spec: + replicas: 1 + strategy: + type: Recreate + selector: + matchLabels: + fateMoudle: namenode +{{ include "fate.matchLabels" . | indent 6 }} + template: + metadata: + labels: + fateMoudle: namenode +{{ include "fate.labels" . | indent 8 }} + spec: + {{ if .Values.persistence.enabled }} + initContainers: + - name: delete-lost-found + image: busybox + command: ["sh", "-c", "rm -rf /hadoop/dfs/name/lost+found"] + volumeMounts: + - name: dfs + mountPath: /hadoop/dfs/name + {{ end }} + containers: + - name: namenode + image: {{ .Values.image.registry }}/hadoop-namenode:2.0.0-hadoop2.7.4-java8 + imagePullPolicy: {{ .Values.image.pullPolicy }} + env: + - name: CLUSTER_NAME + value: fate + envFrom: + - configMapRef: + name: namenode-env + ports: + - containerPort: 9000 + - containerPort: 9870 + - containerPort: 50070 + volumeMounts: + - mountPath: /etc/hadoop/core-site.xml + subPath: core-site.xml + name: namenode-confs + - name: dfs + mountPath: /hadoop/dfs/name + {{- with .Values.modules.hdfs.namenode.nodeSelector }} + nodeSelector: +{{ toYaml . | indent 8 }} + {{- end }} + {{- with .Values.modules.hdfs.namenode.tolerations }} + tolerations: +{{ toYaml . | indent 8 }} + {{- end }} + {{- with .Values.modules.hdfs.namenode.affinity }} + affinity: +{{ toYaml . | indent 8 }} + {{- end }} + {{- with .Values.image.imagePullSecrets }} + imagePullSecrets: +{{ toYaml . | indent 6 }} + {{- end }} + serviceAccountName: {{ template "serviceAccountName" . }} + restartPolicy: Always + volumes: + - name: namenode-confs + configMap: + name: namenode-config + - name: dfs + {{ if .Values.persistence.enabled }} + persistentVolumeClaim: + claimName: {{ .Values.modules.hdfs.namenode.existingClaim | default "namenode-data" }} + {{ else }} + emptyDir: {} + {{ end }} +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: datanode + labels: + fateMoudle: datanode +{{ include "fate.labels" . | indent 4 }} +spec: + replicas: 1 + strategy: + type: Recreate + selector: + matchLabels: + fateMoudle: datanode +{{ include "fate.matchLabels" . | indent 6 }} + template: + metadata: + labels: + fateMoudle: datanode +{{ include "fate.labels" . | indent 8 }} + spec: + containers: + - name: datanode + image: {{ .Values.image.registry }}/hadoop-datanode:2.0.0-hadoop2.7.4-java8 + imagePullPolicy: {{ .Values.image.pullPolicy }} + env: + - name: SERVICE_PRECONDITION + value: "namenode:9000" + envFrom: + - configMapRef: + name: datanode-env + ports: + - containerPort: 9000 + - containerPort: 9870 + - containerPort: 50070 + volumeMounts: + - name: dfs + mountPath: /hadoop/dfs/data + {{- with .Values.modules.hdfs.datanode.nodeSelector }} + nodeSelector: +{{ toYaml . | indent 8 }} + {{- end }} + {{- with .Values.modules.hdfs.datanode.tolerations }} + tolerations: +{{ toYaml . | indent 8 }} + {{- end }} + {{- with .Values.modules.hdfs.datanode.affinity }} + affinity: +{{ toYaml . | indent 8 }} + {{- end }} + {{- with .Values.image.imagePullSecrets }} + imagePullSecrets: +{{ toYaml . | indent 6 }} + {{- end }} + serviceAccountName: {{ template "serviceAccountName" . }} + restartPolicy: Always + volumes: + - name: dfs + {{ if .Values.persistence.enabled }} + persistentVolumeClaim: + claimName: {{ .Values.modules.hdfs.datanode.existingClaim | default "datanode-data" }} + {{ else }} + emptyDir: {} + {{ end }} +{{ end }} \ No newline at end of file diff --git a/helm-charts/FATE/templates/backends/spark/hdfs/persistentvolumeclaim.yaml b/helm-charts/FATE/templates/backends/spark/hdfs/persistentvolumeclaim.yaml new file mode 100644 index 000000000..5284bf503 --- /dev/null +++ b/helm-charts/FATE/templates/backends/spark/hdfs/persistentvolumeclaim.yaml @@ -0,0 +1,59 @@ +# Copyright 2019-2022 VMware, Inc. +# 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. + +{{ if .Values.modules.hdfs.include }} +{{ if and .Values.persistence.enabled (not .Values.modules.hdfs.namenode.existingClaim) }} +kind: PersistentVolumeClaim +apiVersion: v1 +metadata: + name: namenode-data + labels: + fateMoudle: namenode +{{ include "fate.labels" . | indent 4 }} +spec: + accessModes: + - {{ .Values.modules.hdfs.namenode.accessMode }} + resources: + requests: + storage: {{ .Values.modules.hdfs.namenode.size }} + {{ if .Values.modules.hdfs.namenode.storageClass }} + {{ if eq "-" .Values.modules.hdfs.namenode.storageClass }} + storageClassName: "" + {{ else }} + storageClassName: {{ .Values.modules.hdfs.namenode.storageClass }} + {{ end }} + {{ end }} +{{ end }} +--- +{{ if and .Values.persistence.enabled (not .Values.modules.hdfs.datanode.existingClaim) }} +kind: PersistentVolumeClaim +apiVersion: v1 +metadata: + name: datanode-data + labels: + fateMoudle: datanode +{{ include "fate.labels" . | indent 4 }} +spec: + accessModes: + - {{ .Values.modules.hdfs.datanode.accessMode }} + resources: + requests: + storage: {{ .Values.modules.hdfs.datanode.size }} + {{ if .Values.modules.hdfs.datanode.storageClass }} + {{ if eq "-" .Values.modules.hdfs.datanode.storageClass }} + storageClassName: "" + {{ else }} + storageClassName: {{ .Values.modules.hdfs.datanode.storageClass }} + {{ end }} + {{ end }} +{{ end }} + +{{ end }} \ No newline at end of file diff --git a/helm-charts/FATE/templates/backends/spark/hdfs/service.yaml b/helm-charts/FATE/templates/backends/spark/hdfs/service.yaml new file mode 100644 index 000000000..d3c8ec8ec --- /dev/null +++ b/helm-charts/FATE/templates/backends/spark/hdfs/service.yaml @@ -0,0 +1,68 @@ +# Copyright 2019-2022 VMware, Inc. +# 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. + +{{ if .Values.modules.hdfs.include }} +apiVersion: v1 +kind: Service +metadata: + name: datanode + labels: + fateMoudle: datanode +{{ include "fate.labels" . | indent 4 }} +spec: + ports: + - name: "tcp-9000" + port: 9000 + targetPort: 9000 + protocol: TCP + - name: "tcp-9870" + port: 9870 + targetPort: 9870 + protocol: TCP + - name: "tcp-50070" + port: 50070 + targetPort: 50070 + protocol: TCP + type: {{ .Values.modules.hdfs.datanode.type }} + selector: + fateMoudle: datanode +{{ include "fate.matchLabels" . | indent 4 }} +--- +apiVersion: v1 +kind: Service +metadata: + name: namenode + labels: + fateMoudle: namenode +{{ include "fate.labels" . | indent 4 }} +spec: + ports: + - name: "tcp-9000" + port: 9000 + targetPort: 9000 + protocol: TCP + {{- if eq .Values.modules.hdfs.namenode.type "NodePort" "LoadBalancer" }} + nodePort: {{ .Values.modules.hdfs.namenode.nodePort }} + {{- end }} + - name: "tcp-9870" + port: 9870 + targetPort: 9870 + protocol: TCP + - name: "tcp-50070" + port: 50070 + targetPort: 50070 + protocol: TCP + type: {{ .Values.modules.hdfs.namenode.type }} + selector: + fateMoudle: namenode +{{ include "fate.matchLabels" . | indent 4 }} + +{{ end }} \ No newline at end of file diff --git a/helm-charts/FATE/templates/nginx.yaml b/helm-charts/FATE/templates/backends/spark/nginx/configmap.yaml similarity index 54% rename from helm-charts/FATE/templates/nginx.yaml rename to helm-charts/FATE/templates/backends/spark/nginx/configmap.yaml index c5d69e5ef..eeb4716df 100644 --- a/helm-charts/FATE/templates/nginx.yaml +++ b/helm-charts/FATE/templates/backends/spark/nginx/configmap.yaml @@ -1,4 +1,4 @@ -# Copyright 2019-2020 VMware, Inc. +# Copyright 2019-2022 VMware, Inc. # 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 @@ -107,102 +107,4 @@ data: } } ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - name: nginx - labels: - fateMoudle: nginx -{{ include "fate.labels" . | indent 4 }} -spec: - replicas: 1 - strategy: - type: Recreate - selector: - matchLabels: - fateMoudle: nginx -{{ include "fate.matchLabels" . | indent 6 }} - template: - metadata: - labels: - fateMoudle: nginx -{{ include "fate.labels" . | indent 8 }} - spec: - containers: - - name: nginx - image: {{ .Values.image.registry }}/nginx:{{ .Values.image.tag }} - imagePullPolicy: {{ .Values.image.pullPolicy }} - command: - - /bin/bash - - -c - - | - sed -i "s#conf/route_table.yaml#conf/modifiable/route_table.yaml#g" nginx/lua/route_table.lua; - echo "change path of route_table.yaml success!" - openresty -g 'daemon off;' - ports: - - containerPort: 9300 - - containerPort: 9310 - volumeMounts: - - mountPath: /data/projects/fate/proxy/nginx/conf/nginx.conf - name: nginx-confs - subPath: nginx.conf - - mountPath: /data/projects/fate/proxy/nginx/conf/modifiable/ - name: nginx-confs - {{- with .Values.modules.nginx.nodeSelector }} - nodeSelector: -{{ toYaml . | indent 8 }} - {{- end }} - {{- with .Values.modules.nginx.tolerations }} - tolerations: -{{ toYaml . | indent 8 }} - {{- end }} - {{- with .Values.modules.nginx.affinity }} - affinity: -{{ toYaml . | indent 8 }} - {{- end }} - {{- with .Values.image.imagePullSecrets }} - imagePullSecrets: -{{ toYaml . | indent 6 }} - {{- end }} - serviceAccountName: {{ template "serviceAccountName" . }} - restartPolicy: Always - volumes: - - name: nginx-confs - configMap: - name: nginx-config ---- -apiVersion: v1 -kind: Service -metadata: - name: nginx - labels: - fateMoudle: nginx -{{ include "fate.labels" . | indent 4 }} -spec: - ports: - - name: "http" - port: 9300 - targetPort: 9300 - {{- if eq .Values.modules.nginx.type "NodePort" "LoadBalancer" }} - nodePort: {{ .Values.modules.nginx.httpNodePort }} - {{- end }} - protocol: TCP - - name: "grpc" - port: 9310 - targetPort: 9310 - {{- if eq .Values.modules.nginx.type "NodePort" "LoadBalancer" }} - nodePort: {{ .Values.modules.nginx.grpcNodePort }} - {{- end }} - protocol: TCP - type: {{ .Values.modules.nginx.type }} - - {{- if .Values.modules.nginx.loadBalancerIP }} - loadBalancerIP: "{{ .Values.modules.nginx.loadBalancerIP }}" - {{- end }} - - selector: - fateMoudle: nginx -{{ include "fate.matchLabels" . | indent 4 }} ---- -{{ end }} +{{ end }} \ No newline at end of file diff --git a/helm-charts/FATE/templates/backends/spark/nginx/deployment.yaml b/helm-charts/FATE/templates/backends/spark/nginx/deployment.yaml new file mode 100644 index 000000000..230c5e3a4 --- /dev/null +++ b/helm-charts/FATE/templates/backends/spark/nginx/deployment.yaml @@ -0,0 +1,76 @@ +# Copyright 2019-2022 VMware, Inc. +# 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. + +{{ if .Values.modules.nginx.include }} +apiVersion: apps/v1 +kind: Deployment +metadata: + name: nginx + labels: + fateMoudle: nginx +{{ include "fate.labels" . | indent 4 }} +spec: + replicas: 1 + strategy: + type: Recreate + selector: + matchLabels: + fateMoudle: nginx +{{ include "fate.matchLabels" . | indent 6 }} + template: + metadata: + labels: + fateMoudle: nginx +{{ include "fate.labels" . | indent 8 }} + spec: + containers: + - name: nginx + image: {{ .Values.image.registry }}/nginx:{{ .Values.image.tag }} + imagePullPolicy: {{ .Values.image.pullPolicy }} + command: + - /bin/bash + - -c + - | + sed -i "s#conf/route_table.yaml#conf/modifiable/route_table.yaml#g" nginx/lua/route_table.lua; + echo "change path of route_table.yaml success!" + openresty -g 'daemon off;' + ports: + - containerPort: 9300 + - containerPort: 9310 + volumeMounts: + - mountPath: /data/projects/fate/proxy/nginx/conf/nginx.conf + name: nginx-confs + subPath: nginx.conf + - mountPath: /data/projects/fate/proxy/nginx/conf/modifiable/ + name: nginx-confs + {{- with .Values.modules.nginx.nodeSelector }} + nodeSelector: +{{ toYaml . | indent 8 }} + {{- end }} + {{- with .Values.modules.nginx.tolerations }} + tolerations: +{{ toYaml . | indent 8 }} + {{- end }} + {{- with .Values.modules.nginx.affinity }} + affinity: +{{ toYaml . | indent 8 }} + {{- end }} + {{- with .Values.image.imagePullSecrets }} + imagePullSecrets: +{{ toYaml . | indent 6 }} + {{- end }} + serviceAccountName: {{ template "serviceAccountName" . }} + restartPolicy: Always + volumes: + - name: nginx-confs + configMap: + name: nginx-config +{{ end }} \ No newline at end of file diff --git a/helm-charts/FATE/templates/backends/spark/nginx/service.yaml b/helm-charts/FATE/templates/backends/spark/nginx/service.yaml new file mode 100644 index 000000000..a931405b4 --- /dev/null +++ b/helm-charts/FATE/templates/backends/spark/nginx/service.yaml @@ -0,0 +1,45 @@ +# Copyright 2019-2022 VMware, Inc. +# 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. + +{{ if .Values.modules.nginx.include }} +apiVersion: v1 +kind: Service +metadata: + name: nginx + labels: + fateMoudle: nginx +{{ include "fate.labels" . | indent 4 }} +spec: + ports: + - name: "http" + port: 9300 + targetPort: 9300 + {{- if eq .Values.modules.nginx.type "NodePort" "LoadBalancer" }} + nodePort: {{ .Values.modules.nginx.httpNodePort }} + {{- end }} + protocol: TCP + - name: "grpc" + port: 9310 + targetPort: 9310 + {{- if eq .Values.modules.nginx.type "NodePort" "LoadBalancer" }} + nodePort: {{ .Values.modules.nginx.grpcNodePort }} + {{- end }} + protocol: TCP + type: {{ .Values.modules.nginx.type }} + + {{- if .Values.modules.nginx.loadBalancerIP }} + loadBalancerIP: "{{ .Values.modules.nginx.loadBalancerIP }}" + {{- end }} + + selector: + fateMoudle: nginx +{{ include "fate.matchLabels" . | indent 4 }} +{{ end }} \ No newline at end of file diff --git a/helm-charts/FATE/templates/pulsar.yaml b/helm-charts/FATE/templates/backends/spark/pulsar/configmap.yaml similarity index 90% rename from helm-charts/FATE/templates/pulsar.yaml rename to helm-charts/FATE/templates/backends/spark/pulsar/configmap.yaml index 293d5fc68..62541c95d 100644 --- a/helm-charts/FATE/templates/pulsar.yaml +++ b/helm-charts/FATE/templates/backends/spark/pulsar/configmap.yaml @@ -1,4 +1,4 @@ -# Copyright 2019-2020 VMware, Inc. +# Copyright 2019-2022 VMware, Inc. # 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 @@ -375,115 +375,115 @@ data: # Whether internal client use KeyStore type to authenticate with Pulsar brokers brokerClientTlsEnabledWithKeyStore=false - + # The TLS Provider used by internal client to authenticate with other Pulsar brokers brokerClientSslProvider= - + # TLS TrustStore type configuration for internal client: JKS, PKCS12 # used by the internal client to authenticate with Pulsar brokers brokerClientTlsTrustStoreType=JKS - + # TLS TrustStore path for internal client # used by the internal client to authenticate with Pulsar brokers brokerClientTlsTrustStore= - + # TLS TrustStore password for internal client, # used by the internal client to authenticate with Pulsar brokers brokerClientTlsTrustStorePassword= - + # Specify the tls cipher the internal client will use to negotiate during TLS Handshake # (a comma-separated list of ciphers) # e.g. [TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256]. # used by the internal client to authenticate with Pulsar brokers brokerClientTlsCiphers= - + # Specify the tls protocols the broker will use to negotiate during TLS handshake # (a comma-separated list of protocol names). # e.g. [TLSv1.2, TLSv1.1, TLSv1] # used by the internal client to authenticate with Pulsar brokers brokerClientTlsProtocols= - + # Enable or disable system topic systemTopicEnabled=false - + # Enable or disable topic level policies, topic level policies depends on the system topic # Please enable the system topic first. topicLevelPoliciesEnabled=false - + # If a topic remains fenced for this number of seconds, it will be closed forcefully. # If it is set to 0 or a negative number, the fenced topic will not be closed. topicFencingTimeoutSeconds=0 - + ### --- Authentication --- ### # Role names that are treated as "proxy roles". If the broker sees a request with #role as proxyRoles - it will demand to see a valid original principal. proxyRoles= - + # If this flag is set then the broker authenticates the original Auth data # else it just accepts the originalPrincipal and authorizes it (if required). authenticateOriginalAuthData=false - + # Enable authentication authenticationEnabled=false - + # Autentication provider name list, which is comma separated list of class names authenticationProviders= - + # Enforce authorization authorizationEnabled=false - + # Authorization provider fully qualified class-name authorizationProvider=org.apache.pulsar.broker.authorization.PulsarAuthorizationProvider - + # Allow wildcard matching in authorization # (wildcard matching only applicable if wildcard-char: # * presents at first or last position eg: *.pulsar.service, pulsar.service.*) authorizationAllowWildcardsMatching=false - + # Role names that are treated as "super-user", meaning they will be able to do all admin # operations and publish/consume from all topics superUserRoles= - + # Authentication settings of the broker itself. Used when the broker connects to other brokers, # either in same or other clusters brokerClientAuthenticationPlugin= brokerClientAuthenticationParameters= - + # Supported Athenz provider domain names(comma separated) for authentication athenzDomainNames= - + # When this parameter is not empty, unauthenticated users perform as anonymousUserRole anonymousUserRole= - + # The token "claim" that will be interpreted as the authentication "role" or "principal" by AuthenticationProviderToken (defaults to "sub" if blank) tokenAuthClaim= - + # The token audience "claim" name, e.g. "aud", that will be used to get the audience from token. # If not set, audience will not be verified. tokenAudienceClaim= - + # The token audience stands for this broker. The field `tokenAudienceClaim` of a valid token, need contains this. tokenAudience= - + ### --- BookKeeper Client --- ### - + # Authentication plugin to use when connecting to bookies bookkeeperClientAuthenticationPlugin= - + # BookKeeper auth plugin implementatation specifics parameters name and values bookkeeperClientAuthenticationParametersName= bookkeeperClientAuthenticationParameters= - + # Timeout for BK add / read operations bookkeeperClientTimeoutInSeconds=30 - + # Speculative reads are initiated if a read request doesn't complete within a certain time # Using a value of 0, is disabling the speculative reads bookkeeperClientSpeculativeReadTimeoutInMillis=0 - + # Number of channels per bookie bookkeeperNumberOfChannelsPerBookie=16 - + # Enable bookies health check. Bookies that have more than the configured number of failure within # the interval will be quarantined for some time. During this period, new ledgers won't be created # on these bookies @@ -491,159 +491,159 @@ data: bookkeeperClientHealthCheckIntervalSeconds=60 bookkeeperClientHealthCheckErrorThresholdPerInterval=5 bookkeeperClientHealthCheckQuarantineTimeInSeconds=1800 - + #bookie quarantine ratio to avoid all clients quarantine the high pressure bookie servers at the same time bookkeeperClientQuarantineRatio=1.0 - + # Enable rack-aware bookie selection policy. BK will chose bookies from different racks when # forming a new bookie ensemble # This parameter related to ensemblePlacementPolicy in conf/bookkeeper.conf, if enabled, ensemblePlacementPolicy # should be set to org.apache.bookkeeper.client.RackawareEnsemblePlacementPolicy bookkeeperClientRackawarePolicyEnabled=true - + # Enable region-aware bookie selection policy. BK will chose bookies from # different regions and racks when forming a new bookie ensemble. # If enabled, the value of bookkeeperClientRackawarePolicyEnabled is ignored # This parameter related to ensemblePlacementPolicy in conf/bookkeeper.conf, if enabled, ensemblePlacementPolicy # should be set to org.apache.bookkeeper.client.RegionAwareEnsemblePlacementPolicy bookkeeperClientRegionawarePolicyEnabled=false - + # Minimum number of racks per write quorum. BK rack-aware bookie selection policy will try to # get bookies from at least 'bookkeeperClientMinNumRacksPerWriteQuorum' racks for a write quorum. bookkeeperClientMinNumRacksPerWriteQuorum=1 - + # Enforces rack-aware bookie selection policy to pick bookies from 'bookkeeperClientMinNumRacksPerWriteQuorum' # racks for a writeQuorum. # If BK can't find bookie then it would throw BKNotEnoughBookiesException instead of picking random one. bookkeeperClientEnforceMinNumRacksPerWriteQuorum=false - + # Enable/disable reordering read sequence on reading entries. bookkeeperClientReorderReadSequenceEnabled=false - + # Enable bookie isolation by specifying a list of bookie groups to choose from. Any bookie # outside the specified groups will not be used by the broker bookkeeperClientIsolationGroups= - + # Enable bookie secondary-isolation group if bookkeeperClientIsolationGroups doesn't # have enough bookie available. bookkeeperClientSecondaryIsolationGroups= - + # Minimum bookies that should be available as part of bookkeeperClientIsolationGroups # else broker will include bookkeeperClientSecondaryIsolationGroups bookies in isolated list. bookkeeperClientMinAvailableBookiesInIsolationGroups= - + # Set the client security provider factory class name. # Default: org.apache.bookkeeper.tls.TLSContextFactory bookkeeperTLSProviderFactoryClass=org.apache.bookkeeper.tls.TLSContextFactory - + # Enable tls authentication with bookie bookkeeperTLSClientAuthentication=false - + # Supported type: PEM, JKS, PKCS12. Default value: PEM bookkeeperTLSKeyFileType=PEM - + #Supported type: PEM, JKS, PKCS12. Default value: PEM bookkeeperTLSTrustCertTypes=PEM - + # Path to file containing keystore password, if the client keystore is password protected. bookkeeperTLSKeyStorePasswordPath= - + # Path to file containing truststore password, if the client truststore is password protected. bookkeeperTLSTrustStorePasswordPath= - + # Path for the TLS private key file bookkeeperTLSKeyFilePath= - + # Path for the TLS certificate file bookkeeperTLSCertificateFilePath= - + # Path for the trusted TLS certificate file bookkeeperTLSTrustCertsFilePath=/opt/pulsar/certs/ca.cert.pem - + # Enable/disable disk weight based placement. Default is false bookkeeperDiskWeightBasedPlacementEnabled=false - + # Set the interval to check the need for sending an explicit LAC # A value of '0' disables sending any explicit LACs. Default is 0. bookkeeperExplicitLacIntervalInMills=0 - + # Use older Bookkeeper wire protocol with bookie bookkeeperUseV2WireProtocol=true - + # Expose bookkeeper client managed ledger stats to prometheus. default is false # bookkeeperClientExposeStatsToPrometheus=false - + ### --- Managed Ledger --- ### - + # Number of bookies to use when creating a ledger managedLedgerDefaultEnsembleSize=1 - + # Number of copies to store for each message managedLedgerDefaultWriteQuorum=1 - + # Number of guaranteed copies (acks to wait before write is complete) managedLedgerDefaultAckQuorum=1 - + # How frequently to flush the cursor positions that were accumulated due to rate limiting. (seconds). # Default is 60 seconds managedLedgerCursorPositionFlushSeconds = 60 - + # Default type of checksum to use when writing to BookKeeper. Default is "CRC32C" # Other possible options are "CRC32", "MAC" or "DUMMY" (no checksum). managedLedgerDigestType=CRC32C - + # Number of threads to be used for managed ledger tasks dispatching managedLedgerNumWorkerThreads=4 - + # Number of threads to be used for managed ledger scheduled tasks managedLedgerNumSchedulerThreads=4 - + # Amount of memory to use for caching data payload in managed ledger. This memory # is allocated from JVM direct memory and it's shared across all the topics # running in the same broker. By default, uses 1/5th of available direct memory managedLedgerCacheSizeMB= - + # Whether we should make a copy of the entry payloads when inserting in cache managedLedgerCacheCopyEntries=false - + # Threshold to which bring down the cache level when eviction is triggered managedLedgerCacheEvictionWatermark=0.9 - + # Configure the cache eviction frequency for the managed ledger cache (evictions/sec) managedLedgerCacheEvictionFrequency=100.0 - + # All entries that have stayed in cache for more than the configured time, will be evicted managedLedgerCacheEvictionTimeThresholdMillis=1000 - + # Configure the threshold (in number of entries) from where a cursor should be considered 'backlogged' # and thus should be set as inactive. managedLedgerCursorBackloggedThreshold=1000 - + # Rate limit the amount of writes generated by consumer acking the messages managedLedgerDefaultMarkDeleteRateLimit=0.1 - + # Max number of entries to append to a ledger before triggering a rollover # A ledger rollover is triggered on these conditions # * Either the max rollover time has been reached # * or max entries have been written to the ledged and at least min-time # has passed managedLedgerMaxEntriesPerLedger=50000 - + # Minimum time between ledger rollover for a topic managedLedgerMinLedgerRolloverTimeMinutes=10 - + # Maximum time before forcing a ledger rollover for a topic managedLedgerMaxLedgerRolloverTimeMinutes=240 - + # Max number of entries to append to a cursor ledger managedLedgerCursorMaxEntriesPerLedger=50000 - + # Max time before triggering a rollover on a cursor ledger managedLedgerCursorRolloverTimeInSeconds=14400 - + # Maximum ledger size before triggering a rollover for a topic (MB) managedLedgerMaxSizePerLedgerMbytes=2048 - + # Max number of "acknowledgment holes" that are going to be persistently stored. # When acknowledging out of order, a consumer will leave holes that are supposed # to be quickly filled by acking all the messages. The information of which @@ -652,227 +652,227 @@ data: # will only be tracked in memory and messages will be redelivered in case of # crashes. managedLedgerMaxUnackedRangesToPersist=10000 - + # Max number of "acknowledgment holes" that can be stored in Zookeeper. If number of unack message range is higher # than this limit then broker will persist unacked ranges into bookkeeper to avoid additional data overhead into # zookeeper. managedLedgerMaxUnackedRangesToPersistInZooKeeper=1000 - + # Skip reading non-recoverable/unreadable data-ledger under managed-ledger's list. It helps when data-ledgers gets # corrupted at bookkeeper and managed-cursor is stuck at that ledger. autoSkipNonRecoverableData=false - + # operation timeout while updating managed-ledger metadata. managedLedgerMetadataOperationsTimeoutSeconds=60 - + # Read entries timeout when broker tries to read messages from bookkeeper. managedLedgerReadEntryTimeoutSeconds=0 - + # Add entry timeout when broker tries to publish message to bookkeeper (0 to disable it). managedLedgerAddEntryTimeoutSeconds=0 - + # New entries check delay for the cursor under the managed ledger. # If no new messages in the topic, the cursor will try to check again after the delay time. # For consumption latency sensitive scenario, can set to a smaller value or set to 0. # Of course, use a smaller value may degrade consumption throughput. Default is 10ms. managedLedgerNewEntriesCheckDelayInMillis=10 - + # Use Open Range-Set to cache unacked messages managedLedgerUnackedRangesOpenCacheSetEnabled=true - + # Managed ledger prometheus stats latency rollover seconds (default: 60s) managedLedgerPrometheusStatsLatencyRolloverSeconds=60 - + # Whether trace managed ledger task execution time managedLedgerTraceTaskExecution=true - + ### --- Load balancer --- ### - + loadManagerClassName=org.apache.pulsar.broker.loadbalance.NoopLoadManager - + # Enable load balancer loadBalancerEnabled=false - + # Percentage of change to trigger load report update loadBalancerReportUpdateThresholdPercentage=10 - + # maximum interval to update load report loadBalancerReportUpdateMaxIntervalMinutes=15 - + # Frequency of report to collect loadBalancerHostUsageCheckIntervalMinutes=1 - + # Load shedding interval. Broker periodically checks whether some traffic should be offload from # some over-loaded broker to other under-loaded brokers loadBalancerSheddingIntervalMinutes=1 - + # Prevent the same topics to be shed and moved to other broker more that once within this timeframe loadBalancerSheddingGracePeriodMinutes=30 - + # Usage threshold to allocate max number of topics to broker loadBalancerBrokerMaxTopics=50000 - + # Interval to flush dynamic resource quota to ZooKeeper loadBalancerResourceQuotaUpdateIntervalMinutes=15 - + # enable/disable namespace bundle auto split loadBalancerAutoBundleSplitEnabled=true - + # enable/disable automatic unloading of split bundles loadBalancerAutoUnloadSplitBundlesEnabled=true - + # maximum topics in a bundle, otherwise bundle split will be triggered loadBalancerNamespaceBundleMaxTopics=1000 - + # maximum sessions (producers + consumers) in a bundle, otherwise bundle split will be triggered loadBalancerNamespaceBundleMaxSessions=1000 - + # maximum msgRate (in + out) in a bundle, otherwise bundle split will be triggered loadBalancerNamespaceBundleMaxMsgRate=30000 - + # maximum bandwidth (in + out) in a bundle, otherwise bundle split will be triggered loadBalancerNamespaceBundleMaxBandwidthMbytes=100 - + # maximum number of bundles in a namespace loadBalancerNamespaceMaximumBundles=128 - + # The broker resource usage threshold. # When the broker resource usage is gratter than the pulsar cluster average resource usge, # the threshold shedder will be triggered to offload bundles from the broker. # It only take effect in ThresholdSheddler strategy. loadBalancerBrokerThresholdShedderPercentage=10 - + # When calculating new resource usage, the history usage accounts for. # It only take effect in ThresholdSheddler strategy. loadBalancerHistoryResourcePercentage=0.9 - + # The BandWithIn usage weight when calculating new resourde usage. # It only take effect in ThresholdShedder strategy. loadBalancerBandwithInResourceWeight=1.0 - + # The BandWithOut usage weight when calculating new resourde usage. # It only take effect in ThresholdShedder strategy. loadBalancerBandwithOutResourceWeight=1.0 - + # The CPU usage weight when calculating new resourde usage. # It only take effect in ThresholdShedder strategy. loadBalancerCPUResourceWeight=1.0 - + # The heap memory usage weight when calculating new resourde usage. # It only take effect in ThresholdShedder strategy. loadBalancerMemoryResourceWeight=1.0 - + # The direct memory usage weight when calculating new resourde usage. # It only take effect in ThresholdShedder strategy. loadBalancerDirectMemoryResourceWeight=1.0 - + # Bundle unload minimum throughput threshold (MB), avoding bundle unload frequently. # It only take effect in ThresholdShedder strategy. loadBalancerBundleUnloadMinThroughputThreshold=10 - + ### --- Replication --- ### - + # Enable replication metrics replicationMetricsEnabled=true - + # Max number of connections to open for each broker in a remote cluster # More connections host-to-host lead to better throughput over high-latency # links. replicationConnectionsPerBroker=16 - + # Replicator producer queue size replicationProducerQueueSize=1000 - + # Duration to check replication policy to avoid replicator inconsistency # due to missing ZooKeeper watch (disable with value 0) replicationPolicyCheckDurationSeconds=600 - + # Default message retention time defaultRetentionTimeInMinutes=0 - + # Default retention size defaultRetentionSizeInMB=0 - + # How often to check whether the connections are still alive keepAliveIntervalSeconds=30 - + ### --- WebSocket --- ### - + # Enable the WebSocket API service in broker webSocketServiceEnabled=true - + # Number of IO threads in Pulsar Client used in WebSocket proxy webSocketNumIoThreads=8 - + # Number of connections per Broker in Pulsar Client used in WebSocket proxy webSocketConnectionsPerBroker=8 - + # Time in milliseconds that idle WebSocket session times out webSocketSessionIdleTimeoutMillis=300000 - + # The maximum size of a text message during parsing in WebSocket proxy webSocketMaxTextFrameSize=1048576 - + ### --- Metrics --- ### - + # Enable topic level metrics exposeTopicLevelMetricsInPrometheus=true - + # Classname of Pluggable JVM GC metrics logger that can log GC specific metrics # jvmGCMetricsLoggerClassName= - + ### --- Broker Web Stats --- ### - + # Enable topic level metrics exposePublisherStats=true - + # Enable expose the precise backlog stats. # Set false to use published counter and consumed counter to calculate, this would be more efficient but may be inaccurate. # Default is false. exposePreciseBacklogInPrometheus=false - + ### --- Deprecated config variables --- ### - + # Deprecated. Use configurationStoreServers globalZookeeperServers= - + # Deprecated. Use brokerDeleteInactiveTopicsFrequencySeconds brokerServicePurgeInactiveFrequencyInSeconds=60 - + ### --- BookKeeper Configuration --- ##### - + ledgerStorageClass=org.apache.bookkeeper.bookie.storage.ldb.DbLedgerStorage - + # The maximum netty frame size in bytes. Any message received larger than this will be rejected. The default value is 5MB. nettyMaxFrameSizeBytes=134217728 - + # Size of Write Cache. Memory is allocated from JVM direct memory. # Write cache is used to buffer entries before flushing into the entry log # For good performance, it should be big enough to hold a substantial amount # of entries in the flush interval # By default it will be allocated to 1/4th of the available direct memory dbStorage_writeCacheMaxSizeMb= - + # Size of Read cache. Memory is allocated from JVM direct memory. # This read cache is pre-filled doing read-ahead whenever a cache miss happens # By default it will be allocated to 1/4th of the available direct memory dbStorage_readAheadCacheMaxSizeMb= - + # How many entries to pre-fill in cache after a read cache miss dbStorage_readAheadCacheBatchSize=1000 - + flushInterval=60000 - + ## RocksDB specific configurations ## DbLedgerStorage uses RocksDB to store the indexes from ## (ledgerId, entryId) -> (entryLog, offset) - + # Size of RocksDB block-cache. For best performance, this cache # should be big enough to hold a significant portion of the index # database which can reach ~2GB in some cases # Default is to use 10% of the direct memory size dbStorage_rocksDB_blockCacheSize= - + # Other RocksDB specific tunables dbStorage_rocksDB_writeBufferSizeMB=4 dbStorage_rocksDB_sstSizeInMB=4 @@ -881,14 +881,14 @@ data: dbStorage_rocksDB_numLevels=-1 dbStorage_rocksDB_numFilesInLevel0=4 dbStorage_rocksDB_maxSizeInLevel1MB=256 - + # Maximum latency to impose on a journal write to achieve grouping journalMaxGroupWaitMSec=1 - + # Should the data be fsynced on journal before acknowledgment. journalSyncData=false - - + + # For each ledger dir, maximum disk space which can be used. # Default is 0.95f. i.e. 95% of disk can be used at most after which nothing will # be written to that partition. If all ledger dir partions are full, then bookie @@ -896,7 +896,7 @@ data: # shutdown. # Valid values should be in between 0 and 1 (exclusive). diskUsageThreshold=0.99 - + # The disk free space low water mark threshold. # Disk is considered full when usage threshold is exceeded. # Disk returns back to non-full state when usage is below low water mark threshold. @@ -904,7 +904,7 @@ data: # when concurrent writes and compaction are happening. This also prevent bookie from # switching frequently between read-only and read-writes states in the same cases. diskUsageWarnThreshold=0.99 - + # Whether the bookie allowed to use a loopback interface as its primary # interface(i.e. the interface it uses to establish its identity)? # By default, loopback interfaces are not allowed as the primary @@ -917,190 +917,26 @@ data: # to join the cluster. For VPSs configured like this, you should explicitly # set the listening interface. allowLoopback=true - + # How long the interval to trigger next garbage collection, in milliseconds # Since garbage collection is running in background, too frequent gc # will heart performance. It is better to give a higher number of gc # interval if there is enough disk capacity. gcWaitTime=300000 - + # Enable topic auto creation if new producer or consumer connected (disable auto creation with value false) allowAutoTopicCreation=true - + # The type of topic that is allowed to be automatically created.(partitioned/non-partitioned) allowAutoTopicCreationType=non-partitioned - + # Enable subscription auto creation if new consumer connected (disable auto creation with value false) allowAutoSubscriptionCreation=true - + # The number of partitioned topics that is allowed to be automatically created if allowAutoTopicCreationType is partitioned. defaultNumPartitions=1 - + ### --- Transaction config variables --- ### transactionMetadataStoreProviderClassName=org.apache.pulsar.transaction.coordinator.impl.InMemTransactionMetadataStoreProvider ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - name: pulsar - labels: - fateMoudle: pulsar -{{ include "fate.labels" . | indent 4 }} -spec: - replicas: 1 - strategy: - type: Recreate - selector: - matchLabels: - fateMoudle: pulsar -{{ include "fate.matchLabels" . | indent 6 }} - template: - metadata: - labels: - fateMoudle: pulsar -{{ include "fate.labels" . | indent 8 }} - spec: - containers: - - name: pulsar - image: {{ .Values.image.registry }}/pulsar:2.7.0 - imagePullPolicy: {{ .Values.image.pullPolicy }} - command: - - /bin/bash - - -c - - "bin/pulsar standalone -nss" - env: - ports: - - containerPort: 6650 - - containerPort: 6651 - - containerPort: 8080 - - containerPort: 8081 - volumeMounts: - - mountPath: /pulsar/conf/standalone.conf - name: pulsar-confs - subPath: standalone.conf - - mountPath: /pulsar/data - name: pulsar-data - {{- with .Values.modules.pulsar.exchange }} - - mountPath: /opt/pulsar/certs/ - name: pulsar-cert - {{- end }} - {{- with .Values.modules.pulsar.nodeSelector }} - nodeSelector: -{{ toYaml . | indent 8 }} - {{- end }} - {{- with .Values.modules.pulsar.tolerations }} - tolerations: -{{ toYaml . | indent 8 }} - {{- end }} - {{- with .Values.modules.pulsar.affinity }} - affinity: -{{ toYaml . | indent 8 }} - {{- end }} - {{- with .Values.image.imagePullSecrets }} - imagePullSecrets: -{{ toYaml . | indent 6 }} - {{- end }} - serviceAccountName: {{ template "serviceAccountName" . }} - restartPolicy: Always - volumes: - - name: pulsar-confs - configMap: - name: pulsar-config - {{- with .Values.modules.pulsar.exchange }} - - name: pulsar-cert - secret: - secretName: pulsar-cert - {{- end }} - - name: pulsar-data - {{ if .Values.persistence.enabled }} - persistentVolumeClaim: - claimName: {{ .Values.modules.pulsar.existingClaim | default "pulsar-data" }} - {{ else }} - emptyDir: {} - {{ end }} ---- -apiVersion: v1 -kind: Service -metadata: - name: pulsar - labels: - fateMoudle: pulsar -{{ include "fate.labels" . | indent 4 }} -spec: - ports: - - name: "http-port" - port: 6650 - targetPort: 6650 - {{- if eq .Values.modules.pulsar.type "NodePort" "LoadBalancer" }} - nodePort: {{ .Values.modules.pulsar.httpNodePort }} - {{- end }} - protocol: TCP - - name: "https-port" - port: 6651 - targetPort: 6651 - {{- if eq .Values.modules.pulsar.type "NodePort" "LoadBalancer" }} - nodePort: {{ .Values.modules.pulsar.httpsNodePort }} - {{- end }} - protocol: TCP - - name: "mng-port" - port: 8080 - targetPort: 8080 - protocol: TCP - - name: "mngs-port" - port: 8081 - targetPort: 8081 - protocol: TCP - type: {{ .Values.modules.pulsar.type }} - - {{- if .Values.modules.pulsar.loadBalancerIP }} - loadBalancerIP: "{{ .Values.modules.pulsar.loadBalancerIP }}" - {{- end }} - - selector: - fateMoudle: pulsar -{{ include "fate.matchLabels" . | indent 4 }} ---- -{{ if .Values.modules.pulsar.publicLB.enabled }} -apiVersion: v1 -kind: Service -metadata: - name: pulsar-public-tls - labels: - fateMoudle: pulsar -{{ include "fate.labels" . | indent 4 }} -spec: - ports: - - name: "tls-port" - port: 6651 - targetPort: 6651 - protocol: TCP - type: LoadBalancer - selector: - fateMoudle: pulsar -{{ include "fate.matchLabels" . | indent 4 }} ---- -{{ end }} -{{ if and .Values.persistence.enabled (not .Values.modules.pulsar.existingClaim) }} -kind: PersistentVolumeClaim -apiVersion: v1 -metadata: - name: pulsar-data - labels: - fateMoudle: pulsar -{{ include "fate.labels" . | indent 4 }} -spec: - accessModes: - - {{ .Values.modules.pulsar.accessMode }} - resources: - requests: - storage: {{ .Values.modules.pulsar.size }} - {{ if .Values.modules.pulsar.storageClass }} - {{ if eq "-" .Values.modules.pulsar.storageClass }} - storageClassName: "" - {{ else }} - storageClassName: {{ .Values.modules.pulsar.storageClass }} - {{ end }} - {{ end }} -{{ end }} -{{ end }} +{{ end }} \ No newline at end of file diff --git a/helm-charts/FATE/templates/backends/spark/pulsar/deployment.yaml b/helm-charts/FATE/templates/backends/spark/pulsar/deployment.yaml new file mode 100644 index 000000000..6e2da0c24 --- /dev/null +++ b/helm-charts/FATE/templates/backends/spark/pulsar/deployment.yaml @@ -0,0 +1,92 @@ +# Copyright 2019-2022 VMware, Inc. +# 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. + +{{ if .Values.modules.pulsar.include }} +apiVersion: apps/v1 +kind: Deployment +metadata: + name: pulsar + labels: + fateMoudle: pulsar +{{ include "fate.labels" . | indent 4 }} +spec: + replicas: 1 + strategy: + type: Recreate + selector: + matchLabels: + fateMoudle: pulsar +{{ include "fate.matchLabels" . | indent 6 }} + template: + metadata: + labels: + fateMoudle: pulsar +{{ include "fate.labels" . | indent 8 }} + spec: + containers: + - name: pulsar + image: {{ .Values.image.registry }}/pulsar:2.7.0 + imagePullPolicy: {{ .Values.image.pullPolicy }} + command: + - /bin/bash + - -c + - "bin/pulsar standalone -nss" + env: + ports: + - containerPort: 6650 + - containerPort: 6651 + - containerPort: 8080 + - containerPort: 8081 + volumeMounts: + - mountPath: /pulsar/conf/standalone.conf + name: pulsar-confs + subPath: standalone.conf + - mountPath: /pulsar/data + name: pulsar-data + {{- with .Values.modules.pulsar.exchange }} + - mountPath: /opt/pulsar/certs/ + name: pulsar-cert + {{- end }} + {{- with .Values.modules.pulsar.nodeSelector }} + nodeSelector: +{{ toYaml . | indent 8 }} + {{- end }} + {{- with .Values.modules.pulsar.tolerations }} + tolerations: +{{ toYaml . | indent 8 }} + {{- end }} + {{- with .Values.modules.pulsar.affinity }} + affinity: +{{ toYaml . | indent 8 }} + {{- end }} + {{- with .Values.image.imagePullSecrets }} + imagePullSecrets: +{{ toYaml . | indent 6 }} + {{- end }} + serviceAccountName: {{ template "serviceAccountName" . }} + restartPolicy: Always + volumes: + - name: pulsar-confs + configMap: + name: pulsar-config + {{- with .Values.modules.pulsar.exchange }} + - name: pulsar-cert + secret: + secretName: pulsar-cert + {{- end }} + - name: pulsar-data + {{ if .Values.persistence.enabled }} + persistentVolumeClaim: + claimName: {{ .Values.modules.pulsar.existingClaim | default "pulsar-data" }} + {{ else }} + emptyDir: {} + {{ end }} +{{ end }} \ No newline at end of file diff --git a/helm-charts/FATE/templates/backends/spark/pulsar/ingress.yaml b/helm-charts/FATE/templates/backends/spark/pulsar/ingress.yaml new file mode 100644 index 000000000..6f513d694 --- /dev/null +++ b/helm-charts/FATE/templates/backends/spark/pulsar/ingress.yaml @@ -0,0 +1,42 @@ +# Copyright 2019-2022 VMware, Inc. +# 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. + +{{ if .Values.modules.pulsar.include }} +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: pulsar + labels: + fateMoudle: pulsar +{{ include "fate.labels" . | indent 4 }} +{{- if .Values.ingress.pulsar.annotations }} + annotations: +{{ toYaml .Values.ingress.pulsar.annotations | indent 4 }} +{{- end }} +spec: + rules: + {{- range .Values.ingress.pulsar.hosts }} + - host: {{ .name }} + http: + paths: + - path: {{ default "/" .path }} + pathType: Prefix + backend: + service: + name: pulsar + port: + number: 8080 + {{- end }} + {{- if .Values.ingress.pulsar.tls }} + tls: +{{ toYaml .Values.ingress.pulsar.tls | indent 4 }} + {{- end }} +{{ end }} \ No newline at end of file diff --git a/helm-charts/FATE/templates/backends/spark/pulsar/persistentvolumeclaim.yaml b/helm-charts/FATE/templates/backends/spark/pulsar/persistentvolumeclaim.yaml new file mode 100644 index 000000000..5ac735ef8 --- /dev/null +++ b/helm-charts/FATE/templates/backends/spark/pulsar/persistentvolumeclaim.yaml @@ -0,0 +1,35 @@ +# Copyright 2019-2022 VMware, Inc. +# 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. + +{{ if .Values.modules.pulsar.include }} +{{- if and .Values.persistence.enabled (not .Values.modules.pulsar.existingClaim) }} +kind: PersistentVolumeClaim +apiVersion: v1 +metadata: + name: pulsar-data + labels: + fateMoudle: pulsar +{{ include "fate.labels" . | indent 4 }} +spec: + accessModes: + - {{ .Values.modules.pulsar.accessMode }} + resources: + requests: + storage: {{ .Values.modules.pulsar.size }} + {{ if .Values.modules.pulsar.storageClass }} + {{ if eq "-" .Values.modules.pulsar.storageClass }} + storageClassName: "" + {{ else }} + storageClassName: {{ .Values.modules.pulsar.storageClass }} + {{ end }} + {{ end }} +{{- end }} +{{ end }} \ No newline at end of file diff --git a/helm-charts/FATE/templates/backends/spark/pulsar/service.yaml b/helm-charts/FATE/templates/backends/spark/pulsar/service.yaml new file mode 100644 index 000000000..52064b836 --- /dev/null +++ b/helm-charts/FATE/templates/backends/spark/pulsar/service.yaml @@ -0,0 +1,76 @@ +# Copyright 2019-2022 VMware, Inc. +# 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. + +{{ if .Values.modules.pulsar.include }} +apiVersion: v1 +kind: Service +metadata: + name: pulsar + labels: + fateMoudle: pulsar +{{ include "fate.labels" . | indent 4 }} +spec: + ports: + - name: "http-port" + port: 6650 + targetPort: 6650 + {{- if eq .Values.modules.pulsar.type "NodePort" "LoadBalancer" }} + nodePort: {{ .Values.modules.pulsar.httpNodePort }} + {{- end }} + protocol: TCP + - name: "https-port" + port: 6651 + targetPort: 6651 + {{- if eq .Values.modules.pulsar.type "NodePort" "LoadBalancer" }} + nodePort: {{ .Values.modules.pulsar.httpsNodePort }} + {{- end }} + protocol: TCP + - name: "mng-port" + port: 8080 + targetPort: 8080 + protocol: TCP + - name: "mngs-port" + port: 8081 + targetPort: 8081 + protocol: TCP + type: {{ .Values.modules.pulsar.type }} + + {{- if .Values.modules.pulsar.loadBalancerIP }} + loadBalancerIP: "{{ .Values.modules.pulsar.loadBalancerIP }}" + {{- end }} + + selector: + fateMoudle: pulsar +{{ include "fate.matchLabels" . | indent 4 }} + +--- + +{{- if .Values.modules.pulsar.publicLB.enabled }} +apiVersion: v1 +kind: Service +metadata: + name: pulsar-public-tls + labels: + fateMoudle: pulsar +{{ include "fate.labels" . | indent 4 }} +spec: + ports: + - name: "tls-port" + port: 6651 + targetPort: 6651 + protocol: TCP + type: LoadBalancer + selector: + fateMoudle: pulsar +{{ include "fate.matchLabels" . | indent 4 }} +{{- end }} + +{{ end }} \ No newline at end of file diff --git a/helm-charts/FATE/templates/backends/spark/rabbitmq/configmap.yaml b/helm-charts/FATE/templates/backends/spark/rabbitmq/configmap.yaml new file mode 100644 index 000000000..ab63ac95c --- /dev/null +++ b/helm-charts/FATE/templates/backends/spark/rabbitmq/configmap.yaml @@ -0,0 +1,23 @@ +# Copyright 2019-2022 VMware, Inc. +# 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. + +{{ if .Values.modules.rabbitmq.include }} +kind: ConfigMap +apiVersion: v1 +metadata: + name: rabbitmq-config + labels: + fateMoudle: rabbitmq +{{ include "fate.labels" . | indent 4 }} +data: + enabled_plugins: | + [rabbitmq_federation_management,rabbitmq_federation]. +{{ end }} \ No newline at end of file diff --git a/helm-charts/FATE/templates/rabbitmq.yaml b/helm-charts/FATE/templates/backends/spark/rabbitmq/deployment.yaml similarity index 71% rename from helm-charts/FATE/templates/rabbitmq.yaml rename to helm-charts/FATE/templates/backends/spark/rabbitmq/deployment.yaml index ca00ea3b4..76c875cf3 100644 --- a/helm-charts/FATE/templates/rabbitmq.yaml +++ b/helm-charts/FATE/templates/backends/spark/rabbitmq/deployment.yaml @@ -1,4 +1,4 @@ -# Copyright 2019-2020 VMware, Inc. +# Copyright 2019-2022 VMware, Inc. # 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 @@ -10,17 +10,6 @@ # limitations under the License. {{ if .Values.modules.rabbitmq.include }} -kind: ConfigMap -apiVersion: v1 -metadata: - name: rabbitmq-config - labels: - fateMoudle: rabbitmq -{{ include "fate.labels" . | indent 4 }} -data: - enabled_plugins: | - [rabbitmq_federation_management,rabbitmq_federation]. ---- apiVersion: apps/v1 kind: Deployment metadata: @@ -90,33 +79,4 @@ spec: name: rabbitmq-config - name: rabbitmq-data emptyDir: {} ---- -apiVersion: v1 -kind: Service -metadata: - name: rabbitmq - labels: - fateMoudle: rabbitmq -{{ include "fate.labels" . | indent 4 }} -spec: - ports: - - name: "tcp-rabbitmq" - port: 5672 - targetPort: 5672 - {{- if eq .Values.modules.rabbitmq.type "NodePort" "LoadBalancer" }} - nodePort: {{ .Values.modules.rabbitmq.nodePort }} - {{- end }} - protocol: TCP - - name: "tcp-rabbitmq1" - port: 15672 - targetPort: 15672 - protocol: TCP - type: {{ .Values.modules.rabbitmq.type }} - {{- if .Values.modules.rabbitmq.loadBalancerIP }} - loadBalancerIP: "{{ .Values.modules.rabbitmq.loadBalancerIP }}" - {{- end }} - selector: - fateMoudle: rabbitmq -{{ include "fate.matchLabels" . | indent 4 }} ---- -{{ end }} +{{ end }} \ No newline at end of file diff --git a/helm-charts/FATE/templates/backends/spark/rabbitmq/ingress.yaml b/helm-charts/FATE/templates/backends/spark/rabbitmq/ingress.yaml new file mode 100644 index 000000000..12edd9c71 --- /dev/null +++ b/helm-charts/FATE/templates/backends/spark/rabbitmq/ingress.yaml @@ -0,0 +1,43 @@ +# Copyright 2019-2022 VMware, Inc. +# 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. + +{{ if .Values.modules.rabbitmq.include }} +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: rabbitmq + labels: + fateMoudle: rabbitmq +{{ include "fate.labels" . | indent 4 }} +{{- if .Values.ingress.rabbitmq.annotations }} + annotations: +{{ toYaml .Values.ingress.rabbitmq.annotations | indent 4 }} +{{- end }} +spec: + rules: + {{- range .Values.ingress.rabbitmq.hosts }} + - host: {{ .name }} + http: + paths: + - path: {{ default "/" .path }} + pathType: Prefix + backend: + service: + name: rabbitmq + port: + number: 15672 + {{- end }} +{{- if .Values.ingress.rabbitmq.tls }} + tls: +{{ toYaml .Values.ingress.rabbitmq.tls | indent 4 }} +{{- end }} +--- +{{ end }} \ No newline at end of file diff --git a/helm-charts/FATE/templates/backends/spark/rabbitmq/service.yaml b/helm-charts/FATE/templates/backends/spark/rabbitmq/service.yaml new file mode 100644 index 000000000..d161a168f --- /dev/null +++ b/helm-charts/FATE/templates/backends/spark/rabbitmq/service.yaml @@ -0,0 +1,41 @@ +# Copyright 2019-2022 VMware, Inc. +# 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. + +{{ if .Values.modules.rabbitmq.include }} +apiVersion: v1 +kind: Service +metadata: + name: rabbitmq + labels: + fateMoudle: rabbitmq +{{ include "fate.labels" . | indent 4 }} +spec: + ports: + - name: "tcp-rabbitmq" + port: 5672 + targetPort: 5672 + {{- if eq .Values.modules.rabbitmq.type "NodePort" "LoadBalancer" }} + nodePort: {{ .Values.modules.rabbitmq.nodePort }} + {{- end }} + protocol: TCP + - name: "tcp-rabbitmq1" + port: 15672 + targetPort: 15672 + protocol: TCP + type: {{ .Values.modules.rabbitmq.type }} + {{- if .Values.modules.rabbitmq.loadBalancerIP }} + loadBalancerIP: "{{ .Values.modules.rabbitmq.loadBalancerIP }}" + {{- end }} + selector: + fateMoudle: rabbitmq +{{ include "fate.matchLabels" . | indent 4 }} +--- +{{ end }} \ No newline at end of file diff --git a/helm-charts/FATE/templates/spark-worker.yaml b/helm-charts/FATE/templates/backends/spark/spark/configmap.yaml similarity index 67% rename from helm-charts/FATE/templates/spark-worker.yaml rename to helm-charts/FATE/templates/backends/spark/spark/configmap.yaml index 3d804e3a8..8ec16b28f 100644 --- a/helm-charts/FATE/templates/spark-worker.yaml +++ b/helm-charts/FATE/templates/backends/spark/spark/configmap.yaml @@ -1,4 +1,4 @@ -# Copyright 2019-2020 VMware, Inc. +# Copyright 2019-2022 VMware, Inc. # 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 @@ -166,85 +166,4 @@ data: host: 127.0.0.1 port: 8001 federatedId: 0 - ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - name: spark-worker - labels: - fateMoudle: spark-worker -{{ include "fate.labels" . | indent 4 }} -spec: - replicas: {{ default 2 .Values.modules.spark.worker.replicas }} - strategy: - type: Recreate - selector: - matchLabels: - fateMoudle: spark-worker -{{ include "fate.matchLabels" . | indent 6 }} - template: - metadata: - labels: - fateMoudle: spark-worker -{{ include "fate.labels" . | indent 8 }} - spec: - containers: - - name: spark-worker - image: {{ if .Values.modules.spark.worker.Image }}{{ .Values.modules.spark.worker.Image }}{{ else }}{{ .Values.image.registry }}/spark-worker{{ end }}:{{ default .Values.image.tag .Values.modules.spark.worker.ImageTag }} - imagePullPolicy: {{ .Values.image.pullPolicy }} - {{- if .Values.modules.spark.worker.resources }} - resources: - {{- range $key, $val := .Values.modules.spark.worker.resources }} - {{ $key }}: -{{ toYaml $val | indent 14 }} - {{- end }} - {{- end }} - volumeMounts: - - mountPath: /data/projects/fate/conf/ - name: spark-worker-confs - ports: - - containerPort: 8081 - {{- with .Values.modules.spark.worker.nodeSelector }} - nodeSelector: -{{ toYaml . | indent 8 }} - {{- end }} - {{- with .Values.modules.spark.worker.tolerations }} - tolerations: -{{ toYaml . | indent 8 }} - {{- end }} - {{- with .Values.modules.spark.worker.affinity }} - affinity: -{{ toYaml . | indent 8 }} - {{- end }} - {{- with .Values.image.imagePullSecrets }} - imagePullSecrets: -{{ toYaml . | indent 6 }} - {{- end }} - serviceAccountName: {{ template "serviceAccountName" . }} - restartPolicy: Always - volumes: - - name: spark-worker-confs - configMap: - name: spark-worker-config ---- -apiVersion: v1 -kind: Service -metadata: - name: spark-worker-1 - labels: - fateMoudle: spark-worker -{{ include "fate.labels" . | indent 4 }} -spec: - ports: - - name: "tcp-spark" - port: 8081 - targetPort: 8081 - protocol: TCP - type: {{ .Values.modules.spark.worker.type }} - clusterIP: None - selector: - fateMoudle: spark-worker -{{ include "fate.matchLabels" . | indent 4 }} ---- -{{ end }} +{{ end }} \ No newline at end of file diff --git a/helm-charts/FATE/templates/spark-master.yaml b/helm-charts/FATE/templates/backends/spark/spark/deployment.yaml similarity index 56% rename from helm-charts/FATE/templates/spark-master.yaml rename to helm-charts/FATE/templates/backends/spark/spark/deployment.yaml index 881704bb2..49af20d70 100644 --- a/helm-charts/FATE/templates/spark-master.yaml +++ b/helm-charts/FATE/templates/backends/spark/spark/deployment.yaml @@ -1,4 +1,4 @@ -# Copyright 2019-2020 VMware, Inc. +# Copyright 2019-2022 VMware, Inc. # 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 @@ -65,60 +65,63 @@ spec: serviceAccountName: {{ template "serviceAccountName" . }} restartPolicy: Always --- -apiVersion: v1 -kind: Service -metadata: - name: spark-master - labels: - fateMoudle: spark-master -{{ include "fate.labels" . | indent 4 }} -spec: - ports: - - name: web-ui - protocol: TCP - port: 8080 - targetPort: 8080 - - name: master - protocol: TCP - port: 7077 - targetPort: 7077 - - name: master-rest - protocol: TCP - port: 6066 - targetPort: 6066 - type: ClusterIP - clusterIP: None - selector: - fateMoudle: spark-master -{{ include "fate.matchLabels" . | indent 4 }} ---- -apiVersion: v1 -kind: Service +apiVersion: apps/v1 +kind: Deployment metadata: - name: spark-client + name: spark-worker labels: - fateMoudle: spark-master + fateMoudle: spark-worker {{ include "fate.labels" . | indent 4 }} spec: - ports: - - name: web-ui - protocol: TCP - port: 8080 - targetPort: 8080 - - name: master - protocol: TCP - port: 7077 - targetPort: 7077 - {{- if eq .Values.modules.spark.master.type "NodePort" "LoadBalancer" }} - nodePort: {{ .Values.modules.spark.master.nodePort }} - {{- end }} - - name: master-rest - protocol: TCP - port: 6066 - targetPort: 6066 - type: {{ .Values.modules.spark.master.type }} - # clusterIP: None + replicas: {{ default 2 .Values.modules.spark.worker.replicas }} + strategy: + type: Recreate selector: - fateMoudle: spark-master -{{ include "fate.matchLabels" . | indent 4 }} -{{ end }} + matchLabels: + fateMoudle: spark-worker +{{ include "fate.matchLabels" . | indent 6 }} + template: + metadata: + labels: + fateMoudle: spark-worker +{{ include "fate.labels" . | indent 8 }} + spec: + containers: + - name: spark-worker + image: {{ if .Values.modules.spark.worker.Image }}{{ .Values.modules.spark.worker.Image }}{{ else }}{{ .Values.image.registry }}/spark-worker{{ end }}:{{ default .Values.image.tag .Values.modules.spark.worker.ImageTag }} + imagePullPolicy: {{ .Values.image.pullPolicy }} + {{- if .Values.modules.spark.worker.resources }} + resources: + {{- range $key, $val := .Values.modules.spark.worker.resources }} + {{ $key }}: +{{ toYaml $val | indent 14 }} + {{- end }} + {{- end }} + volumeMounts: + - mountPath: /data/projects/fate/conf/ + name: spark-worker-confs + ports: + - containerPort: 8081 + {{- with .Values.modules.spark.worker.nodeSelector }} + nodeSelector: +{{ toYaml . | indent 8 }} + {{- end }} + {{- with .Values.modules.spark.worker.tolerations }} + tolerations: +{{ toYaml . | indent 8 }} + {{- end }} + {{- with .Values.modules.spark.worker.affinity }} + affinity: +{{ toYaml . | indent 8 }} + {{- end }} + {{- with .Values.image.imagePullSecrets }} + imagePullSecrets: +{{ toYaml . | indent 6 }} + {{- end }} + serviceAccountName: {{ template "serviceAccountName" . }} + restartPolicy: Always + volumes: + - name: spark-worker-confs + configMap: + name: spark-worker-config +{{ end }} \ No newline at end of file diff --git a/helm-charts/FATE/templates/backends/spark/spark/ingress.yaml b/helm-charts/FATE/templates/backends/spark/spark/ingress.yaml new file mode 100644 index 000000000..49545dd2f --- /dev/null +++ b/helm-charts/FATE/templates/backends/spark/spark/ingress.yaml @@ -0,0 +1,43 @@ +# Copyright 2019-2022 VMware, Inc. +# 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. + +{{ if .Values.modules.spark.include }} +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: spark + labels: + fateMoudle: spark +{{ include "fate.labels" . | indent 4 }} +{{- if .Values.ingress.spark.annotations }} + annotations: +{{ toYaml .Values.ingress.spark.annotations | indent 4 }} +{{- end }} +spec: + rules: + {{- range .Values.ingress.spark.hosts }} + - host: {{ .name }} + http: + paths: + - path: {{ default "/" .path }} + pathType: Prefix + backend: + service: + name: spark-master + port: + number: 8080 + {{- end }} +{{- if .Values.ingress.spark.tls }} + tls: +{{ toYaml .Values.ingress.spark.tls | indent 4 }} +{{- end }} +--- +{{ end }} \ No newline at end of file diff --git a/helm-charts/FATE/templates/backends/spark/spark/service.yaml b/helm-charts/FATE/templates/backends/spark/spark/service.yaml new file mode 100644 index 000000000..8430c771b --- /dev/null +++ b/helm-charts/FATE/templates/backends/spark/spark/service.yaml @@ -0,0 +1,89 @@ +# Copyright 2019-2022 VMware, Inc. +# 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. + +{{ if .Values.modules.spark.include }} +apiVersion: v1 +kind: Service +metadata: + name: spark-master + labels: + fateMoudle: spark-master +{{ include "fate.labels" . | indent 4 }} +spec: + ports: + - name: web-ui + protocol: TCP + port: 8080 + targetPort: 8080 + - name: master + protocol: TCP + port: 7077 + targetPort: 7077 + - name: master-rest + protocol: TCP + port: 6066 + targetPort: 6066 + type: ClusterIP + clusterIP: None + selector: + fateMoudle: spark-master +{{ include "fate.matchLabels" . | indent 4 }} +--- +apiVersion: v1 +kind: Service +metadata: + name: spark-client + labels: + fateMoudle: spark-master +{{ include "fate.labels" . | indent 4 }} +spec: + ports: + - name: web-ui + protocol: TCP + port: 8080 + targetPort: 8080 + - name: master + protocol: TCP + port: 7077 + targetPort: 7077 + {{- if eq .Values.modules.spark.master.type "NodePort" "LoadBalancer" }} + nodePort: {{ .Values.modules.spark.master.nodePort }} + {{- end }} + - name: master-rest + protocol: TCP + port: 6066 + targetPort: 6066 + type: {{ .Values.modules.spark.master.type }} + # clusterIP: None + selector: + fateMoudle: spark-master +{{ include "fate.matchLabels" . | indent 4 }} +--- +apiVersion: v1 +kind: Service +metadata: + name: spark-worker-1 + labels: + fateMoudle: spark-worker +{{ include "fate.labels" . | indent 4 }} +spec: + ports: + - name: "tcp-spark" + port: 8081 + targetPort: 8081 + protocol: TCP + type: {{ .Values.modules.spark.worker.type }} + clusterIP: None + selector: + fateMoudle: spark-worker +{{ include "fate.matchLabels" . | indent 4 }} +--- +{{ end }} \ No newline at end of file diff --git a/helm-charts/FATE/templates/client.yaml b/helm-charts/FATE/templates/core/client/deployment.yaml similarity index 71% rename from helm-charts/FATE/templates/client.yaml rename to helm-charts/FATE/templates/core/client/deployment.yaml index 761218e74..dba52f897 100644 --- a/helm-charts/FATE/templates/client.yaml +++ b/helm-charts/FATE/templates/core/client/deployment.yaml @@ -1,4 +1,4 @@ -# Copyright 2019-2021 VMware, Inc. +# Copyright 2019-2022 VMware, Inc. # 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 @@ -77,45 +77,4 @@ spec: persistentVolumeClaim: claimName: {{ .Values.modules.client.existingClaim | default "client-data" }} {{- end }} ---- -apiVersion: v1 -kind: Service -metadata: - name: notebook - labels: - fateMoudle: client -{{ include "fate.labels" . | indent 4 }} -spec: - ports: - - name: "tcp-notebook" - port: 20000 - targetPort: 20000 - protocol: TCP - type: {{ .Values.modules.client.type }} - selector: - fateMoudle: client -{{ include "fate.matchLabels" . | indent 4 }} ---- -{{- if and .Values.persistence.enabled (not .Values.modules.client.existingClaim) }} -kind: PersistentVolumeClaim -apiVersion: v1 -metadata: - name: client-data - labels: - fateMoudle: client -{{ include "fate.labels" . | indent 4 }} -spec: - accessModes: - - {{ .Values.modules.client.accessMode }} - resources: - requests: - storage: {{ .Values.modules.client.size }} - {{- if .Values.modules.client.storageClass }} - {{- if eq "-" .Values.modules.client.storageClass }} - storageClassName: "" - {{- else }} - storageClassName: {{ .Values.modules.client.storageClass }} - {{- end }} - {{- end }} -{{- end }} -{{ end }} +{{ end }} \ No newline at end of file diff --git a/helm-charts/FATE/templates/core/client/ingress.yaml b/helm-charts/FATE/templates/core/client/ingress.yaml new file mode 100644 index 000000000..be920243e --- /dev/null +++ b/helm-charts/FATE/templates/core/client/ingress.yaml @@ -0,0 +1,43 @@ +# Copyright 2019-2022 VMware, Inc. +# 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. + +{{ if .Values.modules.client.include }} +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: client + labels: + fateMoudle: client +{{ include "fate.labels" . | indent 4 }} + {{- if .Values.ingress.client.annotations }} + annotations: +{{ toYaml .Values.ingress.client.annotations | indent 4 }} + {{- end }} +spec: + rules: + {{- range .Values.ingress.client.hosts }} + - host: {{ .name }} + http: + paths: + - path: {{ default "/" .path }} + pathType: Prefix + backend: + service: + name: notebook + port: + number: 20000 + {{- end }} + {{- if .Values.ingress.client.tls }} + tls: +{{ toYaml .Values.ingress.client.tls | indent 4 }} + {{- end }} + +{{ end }} \ No newline at end of file diff --git a/helm-charts/FATE/templates/core/client/istio.yaml b/helm-charts/FATE/templates/core/client/istio.yaml new file mode 100644 index 000000000..a678d61fe --- /dev/null +++ b/helm-charts/FATE/templates/core/client/istio.yaml @@ -0,0 +1,34 @@ +# Copyright 2019-2022 VMware, Inc. +# 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. + +{{ if .Values.istio.enabled }} +{{ if .Values.modules.client.include }} +apiVersion: networking.istio.io/v1alpha3 +kind: VirtualService +metadata: + name: notebook + labels: +{{ include "fate.labels" . | indent 4 }} +spec: + hosts: + {{- range .Values.ingress.client.hosts }} + - {{ .name }} + {{- end }} + gateways: + - {{ .Values.partyName }}-gateway + http: + - route: + - destination: + host: notebook + port: + number: 20000 +{{ end }} +{{ end }} \ No newline at end of file diff --git a/helm-charts/FATE/templates/core/client/persistentvolumeclaim.yaml b/helm-charts/FATE/templates/core/client/persistentvolumeclaim.yaml new file mode 100644 index 000000000..d13d640d7 --- /dev/null +++ b/helm-charts/FATE/templates/core/client/persistentvolumeclaim.yaml @@ -0,0 +1,35 @@ +# Copyright 2019-2022 VMware, Inc. +# 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. + +{{ if .Values.modules.client.include }} +{{- if and .Values.persistence.enabled (not .Values.modules.client.existingClaim) }} +kind: PersistentVolumeClaim +apiVersion: v1 +metadata: + name: client-data + labels: + fateMoudle: client +{{ include "fate.labels" . | indent 4 }} +spec: + accessModes: + - {{ .Values.modules.client.accessMode }} + resources: + requests: + storage: {{ .Values.modules.client.size }} + {{- if .Values.modules.client.storageClass }} + {{- if eq "-" .Values.modules.client.storageClass }} + storageClassName: "" + {{- else }} + storageClassName: {{ .Values.modules.client.storageClass }} + {{- end }} + {{- end }} +{{- end }} +{{- end }} \ No newline at end of file diff --git a/helm-charts/FATE/templates/core/client/service.yaml b/helm-charts/FATE/templates/core/client/service.yaml new file mode 100644 index 000000000..072c9b1fd --- /dev/null +++ b/helm-charts/FATE/templates/core/client/service.yaml @@ -0,0 +1,30 @@ +# Copyright 2019-2022 VMware, Inc. +# 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. + +{{ if .Values.modules.client.include }} +apiVersion: v1 +kind: Service +metadata: + name: notebook + labels: + fateMoudle: client +{{ include "fate.labels" . | indent 4 }} +spec: + ports: + - name: "tcp-notebook" + port: 20000 + targetPort: 20000 + protocol: TCP + type: {{ .Values.modules.client.type }} + selector: + fateMoudle: client +{{ include "fate.matchLabels" . | indent 4 }} +{{- end }} \ No newline at end of file diff --git a/helm-charts/FATE/templates/core/fateboard/configmap.yaml b/helm-charts/FATE/templates/core/fateboard/configmap.yaml new file mode 100644 index 000000000..63cea12f2 --- /dev/null +++ b/helm-charts/FATE/templates/core/fateboard/configmap.yaml @@ -0,0 +1,50 @@ +# Copyright 2019-2022 VMware, Inc. +# 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. + +{{- if .Values.modules.fateboard.include }} +kind: ConfigMap +apiVersion: v1 +metadata: + name: fateboard-config + labels: + fateMoudle: fateboard +{{ include "fate.labels" . | indent 4 }} +data: + application.properties: | + server.port=8080 + fateflow.url=http://{{ if .Values.istio.enabled }}127.0.0.1{{ else }}fateflow{{ end }}:9380 + spring.datasource.driver-Class-Name=com.mysql.cj.jdbc.Driver + spring.http.encoding.charset=UTF-8 + spring.http.encoding.enabled=true + server.tomcat.uri-encoding=UTF-8 + fateboard.datasource.jdbc-url=jdbc:mysql://{{ .Values.externalMysqlIp | default .Values.modules.mysql.ip | default "mysql" }}:{{ .Values.externalMysqlPort | default .Values.modules.mysql.port | default "3306" }}/{{ .Values.externalMysqlDatabase | default .Values.modules.mysql.database | default "eggroll_meta" }}?characterEncoding=utf8&characterSetResults=utf8&autoReconnect=true&failOverReadOnly=false&serverTimezone=GMT%2B8 + fateboard.datasource.username={{ .Values.externalMysqlUser | default .Values.modules.mysql.user | default "fate" }} + fateboard.datasource.password={{ .Values.externalMysqlPassword | default .Values.modules.mysql.password | default "fate_dev" }} + server.tomcat.max-threads=1000 + server.tomcat.max-connections=20000 + spring.servlet.multipart.max-file-size=10MB + spring.servlet.multipart.max-request-size=100MB + spring.datasource.druid.filter.config.enabled=false + spring.datasource.druid.web-stat-filter.enabled=false + spring.datasource.druid.stat-view-servlet.enabled=false + server.compression.enabled=true + server.compression.mime-types=application/json,application/xml,text/html,text/xml,text/plain + server.board.login.username={{ .Values.modules.fateboard.username }} + server.board.login.password={{ .Values.modules.fateboard.password }} + #server.ssl.key-store=classpath: + #server.ssl.key-store-password= + #server.ssl.key-password= + #server.ssl.key-alias= + spring.session.store-type=jdbc + spring.session.jdbc.initialize-schema=always + #HTTP_APP_KEY= + #HTTP_SECRET_KEY= +{{- end }} \ No newline at end of file diff --git a/helm-charts/FATE/templates/core/fateboard/ingress.yaml b/helm-charts/FATE/templates/core/fateboard/ingress.yaml new file mode 100644 index 000000000..cf82bff5d --- /dev/null +++ b/helm-charts/FATE/templates/core/fateboard/ingress.yaml @@ -0,0 +1,43 @@ +# Copyright 2019-2022 VMware, Inc. +# 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. + +{{ if .Values.modules.fateboard.include }} +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: fateboard + labels: + fateMoudle: fateboard +{{ include "fate.labels" . | indent 4 }} +{{- if .Values.ingress.fateboard.annotations }} + annotations: +{{ toYaml .Values.ingress.fateboard.annotations | indent 4 }} +{{- end }} +spec: + rules: + {{- range .Values.ingress.fateboard.hosts }} + - host: {{ .name }} + http: + paths: + - path: {{ default "/" .path }} + pathType: Prefix + backend: + service: + name: fateboard + port: + number: 8080 + {{- end }} + {{- if .Values.ingress.fateboard.tls }} + tls: +{{ toYaml .Values.ingress.fateboard.tls | indent 4 }} + {{- end }} + +{{ end }} \ No newline at end of file diff --git a/helm-charts/FATE/templates/core/fateboard/istio.yaml b/helm-charts/FATE/templates/core/fateboard/istio.yaml new file mode 100644 index 000000000..5158000dd --- /dev/null +++ b/helm-charts/FATE/templates/core/fateboard/istio.yaml @@ -0,0 +1,34 @@ +# Copyright 2019-2022 VMware, Inc. +# 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. + +{{ if .Values.istio.enabled }} +{{ if .Values.modules.fateboard.include }} +apiVersion: networking.istio.io/v1alpha3 +kind: VirtualService +metadata: + name: fateboard + labels: +{{ include "fate.labels" . | indent 4 }} +spec: + hosts: + {{- range .Values.ingress.fateboard.hosts }} + - {{ .name }} + {{- end }} + gateways: + - fate-9999-gateway + http: + - route: + - destination: + host: fateboard + port: + number: 8080 +{{ end }} +{{ end }} \ No newline at end of file diff --git a/helm-charts/FATE/templates/core/fateboard/service.yaml b/helm-charts/FATE/templates/core/fateboard/service.yaml new file mode 100644 index 000000000..5059f5bc0 --- /dev/null +++ b/helm-charts/FATE/templates/core/fateboard/service.yaml @@ -0,0 +1,30 @@ +# Copyright 2019-2022 VMware, Inc. +# 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. + +{{- if .Values.modules.fateboard.include }} +apiVersion: v1 +kind: Service +metadata: + name: fateboard + labels: + fateMoudle: python +{{ include "fate.labels" . | indent 4 }} +spec: + ports: + - name: "tcp-fateboard" + port: 8080 + targetPort: 8080 + protocol: TCP + type: {{ .Values.modules.fateboard.type }} + selector: + fateMoudle: python +{{ include "fate.matchLabels" . | indent 4 }} +{{- end }} \ No newline at end of file diff --git a/helm-charts/FATE/templates/core/fateflow/configmap.yaml b/helm-charts/FATE/templates/core/fateflow/configmap.yaml new file mode 100644 index 000000000..41aec9ecc --- /dev/null +++ b/helm-charts/FATE/templates/core/fateflow/configmap.yaml @@ -0,0 +1,300 @@ +# Copyright 2019-2022 VMware, Inc. +# 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. + +{{ if .Values.modules.python.include }} +kind: ConfigMap +apiVersion: v1 +metadata: + name: python-config + labels: + fateMoudle: python +{{ include "fate.labels" . | indent 4 }} +data: + spark-defaults.conf: | + spark.master {{ if eq .Values.modules.python.backend "spark_local_pulsar" }}local[*]{{ else }}{{ .Values.modules.python.spark.master | default "spark://spark-master:7077"}}{{ end }} + spark.driver.host {{ .Values.modules.python.spark.driverHost | default "fateflow" }} + {{- if .Values.modules.python.spark.driverStartPort }} + spark.driver.port {{ .Values.modules.python.spark.driverStartPort }} + {{- end }} + + {{- if .Values.modules.python.spark.portMaxRetries }} + spark.port.maxRetries {{ .Values.modules.python.spark.portMaxRetries }} + {{- end }} + + {{- if .Values.modules.python.spark.blockManagerStartPort }} + spark.blockManager.port {{ .Values.modules.python.spark.blockManagerStartPort }} + {{- end }} + + {{- if .Values.modules.python.spark.blockManagerStartPort }} + spark.driver.bindAddress 0.0.0.0 + {{- end }} + + {{- if .Values.modules.python.spark.pysparkPython }} + spark.pyspark.python {{ .Values.modules.python.spark.pysparkPython }} + spark.pyspark.driver.python python + {{- end }} + service_conf.yaml: | + use_registry: {{ .Values.modules.serving.useRegistry | default false }} + use_deserialize_safe_module: false + dependent_distribution: false + encrypt_password: false + encrypt_module: fate_arch.common.encrypt_utils#pwdecrypt + private_key: + fateflow: + # you must set real ip address, 127.0.0.1 and 0.0.0.0 is not supported + host: {{ if .Values.istio.enabled }}127.0.0.1{{ else }}fateflow{{ end }} + http_port: 9380 + grpc_port: 9360 + # http_app_key: + # http_secret_key: + # support rollsite/nginx/fateflow as a coordination proxy + # rollsite support fate on eggroll, use grpc protocol + # nginx support fate on eggroll and fate on spark, use http or grpc protocol, default is http + # fateflow support fate on eggroll and fate on spark, use http protocol, but not support exchange network mode + + # format(proxy: rollsite) means rollsite use the rollsite configuration of fate_one_eggroll and nginx use the nginx configuration of fate_one_spark + # you also can customize the config like this(set fateflow of the opposite party as proxy): + # proxy: + # name: fateflow + # host: xx + # http_port: xx + # grpc_port: xx + {{- if eq .Values.modules.python.backend "spark_pulsar" "spark_rabbitmq" "spark_local_pulsar" }} + proxy: nginx + {{- else }} + proxy: rollsite + {{- end }} + # support default/http/grpc + protocol: default + # It can also be specified in the job configuration using the federated_status_collect_type parameter + default_federated_status_collect_type: PULL + database: + name: '{{ .Values.externalMysqlDatabase | default .Values.modules.mysql.database | default "eggroll_meta" }}' + user: '{{ .Values.externalMysqlUser | default .Values.modules.mysql.user | default "fate" }}' + passwd: '{{ .Values.externalMysqlPassword | default .Values.modules.mysql.password | default "fate_dev" }}' + host: '{{ .Values.externalMysqlIp | default .Values.modules.mysql.ip | default "mysql" }}' + port: {{ .Values.externalMysqlPort | default .Values.modules.mysql.port | default "3306" }} + max_connections: 100 + stale_timeout: 30 + zookeeper: + hosts: + - "serving-zookeeper:2181" + # use_acl: false + # user: fate + # password: fate + # engine services + default_engines: + {{- if eq .Values.modules.python.backend "spark_pulsar" }} + computing: spark + federation: pulsar + storage: hdfs + {{- else if eq .Values.modules.python.backend "spark_rabbitmq" }} + computing: spark + federation: rabbitmq + storage: hdfs + {{- else if eq .Values.modules.python.backend "spark_local_pulsar" }} + computing: spark + federation: pulsar + storage: localfs + {{- else }} + computing: eggroll + federation: eggroll + storage: eggroll + {{- end }} + fate_on_standalone: + standalone: + cores_per_node: 20 + nodes: 1 + fate_on_eggroll: + clustermanager: + cores_per_node: {{ .Values.modules.python.clustermanager.cores_per_node | default 16 }} + nodes: {{ .Values.modules.python.clustermanager.nodes | default 2 }} + rollsite: + host: {{ .Values.modules.rollsite.ip }} + port: 9370 + fate_on_spark: + spark: + # default use SPARK_HOME environment variable + home: /data/projects/spark-2.4.1-bin-hadoop2.7/ + cores_per_node: {{ .Values.modules.python.spark.cores_per_node }} + nodes: {{ .Values.modules.python.spark.nodes }} + linkis_spark: + cores_per_node: 20 + nodes: 2 + host: 127.0.0.1 + port: 9001 + token_code: MLSS + python_path: /data/projects/fate/python + hive: + host: 127.0.0.1 + port: 10000 + auth_mechanism: + username: + password: + linkis_hive: + host: 127.0.0.1 + port: 9001 + hdfs: + name_node: {{ .Values.modules.python.hdfs.name_node | default "hdfs://namenode:9000" }} + # default / + path_prefix: {{ .Values.modules.python.hdfs.path_prefix }} + rabbitmq: + host: {{ .Values.modules.python.rabbitmq.host }} + mng_port: {{ .Values.modules.python.rabbitmq.mng_port }} + port: {{ .Values.modules.python.rabbitmq.port }} + user: {{ .Values.modules.python.rabbitmq.user }} + password: {{ .Values.modules.python.rabbitmq.password }} + # default conf/rabbitmq_route_table.yaml + route_table: conf/rabbitmq_route_table/rabbitmq_route_table.yaml + pulsar: + host: {{ .Values.modules.python.pulsar.host }} + port: {{ .Values.modules.python.pulsar.port }} + mng_port: {{ .Values.modules.python.pulsar.mng_port }} + topic_ttl: 3 + # default conf/pulsar_route_table.yaml + route_table: conf/pulsar_route_table/pulsar_route_table.yaml + nginx: + host: {{ .Values.modules.python.nginx.host }} + http_port: {{ .Values.modules.python.nginx.http_port }} + grpc_port: {{ .Values.modules.python.nginx.grpc_port }} + fateboard: + host: fateboard + port: 8080 + # on API `/model/load` and `/model/load/do` + # automatic upload models to the model store if it exists locally but does not exist in the model storage + # or download models from the model store if it does not exist locally but exists in the model storage + # this config will not affect API `/model/store` or `/model/restore` + enable_model_store: false + model_store_address: + storage: mysql + name: {{ .Values.externalMysqlDatabase | default .Values.modules.mysql.database | default "eggroll_meta" }} + host: '{{ .Values.externalMysqlIp | default .Values.modules.mysql.ip | default "mysql" }}' + port: {{ .Values.externalMysqlPort | default .Values.modules.mysql.port | default "3306" }} + user: '{{ .Values.externalMysqlUser | default .Values.modules.mysql.user | default "fate" }}' + passwd: '{{ .Values.externalMysqlPassword | default .Values.modules.mysql.password | default "fate_dev" }}' + max_connections: 10 + stale_timeout: 10 + {{- with .Values.modules.serving }} + servings: + hosts: + {{- if and .ip .port}} + - '{{ .ip }}:{{ .port }}' + {{- else }} + - '' + {{- end }} + {{- if and .useRegistry .zookeeper }} + zookeeper: +{{ toYaml .zookeeper | indent 6 }} + {{- end }} + {{- end }} + transfer_conf.yaml: | + paths: # dir or path + - "python/federatedml/transfer_variable/auth_conf" + component_registry.json: | + { + "components": { + }, + "providers": { + }, + "default_settings": { + "fate_flow":{ + "default_version_key": "FATEFlow" + }, + "fate": { + "default_version_key": "FATE" + }, + "class_path": { + "interface": "components.components.Components", + "feature_instance": "feature.instance.Instance", + "feature_vector": "feature.sparse_vector.SparseVector", + "model": "protobuf.generated", + "model_migrate": "protobuf.model_migrate.model_migrate", + "homo_model_convert": "protobuf.homo_model_convert.homo_model_convert" + } + } + } + job_default_config.yaml: | + # component provider, relative path to get_fate_python_directory + default_component_provider_path: federatedml + + # resource + total_cores_overweight_percent: 1 # 1 means no overweight + total_memory_overweight_percent: 1 # 1 means no overweight + task_parallelism: 1 + task_cores: 4 + task_memory: 0 # mb + max_cores_percent_per_job: 1 # 1 means total + + # scheduling + job_timeout: 259200 # s + remote_request_timeout: 30000 # ms + federated_command_trys: 3 + end_status_job_scheduling_time_limit: 300000 # ms + end_status_job_scheduling_updates: 1 + auto_retries: 0 + auto_retry_delay: 1 #seconds + # It can also be specified in the job configuration using the federated_status_collect_type parameter + federated_status_collect_type: PUSH + + # upload + upload_max_bytes: 4194304000 # bytes + + #component output + output_data_summary_count_limit: 100 +--- +kind: ConfigMap +apiVersion: v1 +metadata: + name: pulsar-route-table + labels: + fateMoudle: python +{{ include "fate.labels" . | indent 4 }} +data: + pulsar_route_table.yaml: | + {{- with .Values.modules.pulsar.exchange }} + default: + proxy: "{{ .ip }}:{{ .port }}" + domain: "{{ .domain }}" + {{- end }} + {{- if .Values.modules.pulsar.route_table }} + {{- range $key, $val := .Values.modules.pulsar.route_table }} + {{ $key }}: +{{ toYaml . | indent 6 }} + {{- end }} + {{- else }} + {{ .Values.partyId }}: + host: pulsar + port: 6650 + sslPort: 6651 + proxy: "" + {{- end}} +--- +kind: ConfigMap +apiVersion: v1 +metadata: + name: rabbitmq-route-table + labels: + fateMoudle: python +{{ include "fate.labels" . | indent 4 }} +data: + rabbitmq_route_table.yaml: | + {{- if .Values.modules.rabbitmq.route_table }} + {{- range $key, $val := .Values.modules.rabbitmq.route_table }} + {{ $key }}: +{{ toYaml . | indent 6 }} + {{- end }} + {{- else }} + {{ .Values.partyId }}: + host: rabbitmq + port: 5672 + {{- end}} + +{{ end }} \ No newline at end of file diff --git a/helm-charts/FATE/templates/core/fateflow/persistentvolumeclaim.yaml b/helm-charts/FATE/templates/core/fateflow/persistentvolumeclaim.yaml new file mode 100644 index 000000000..3b8d39b86 --- /dev/null +++ b/helm-charts/FATE/templates/core/fateflow/persistentvolumeclaim.yaml @@ -0,0 +1,34 @@ +# Copyright 2019-2022 VMware, Inc. +# 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. + + +{{- if and .Values.persistence.enabled (not .Values.modules.python.existingClaim) }} +kind: PersistentVolumeClaim +apiVersion: v1 +metadata: + name: python-data + labels: + fateMoudle: python +{{ include "fate.labels" . | indent 4 }} +spec: + accessModes: + - {{ .Values.modules.python.accessMode }} + resources: + requests: + storage: {{ .Values.modules.python.size }} + {{- if .Values.modules.python.storageClass }} + {{- if eq "-" .Values.modules.python.storageClass }} + storageClassName: "" + {{- else }} + storageClassName: {{ .Values.modules.python.storageClass }} + {{- end }} + {{- end }} +{{- end }} \ No newline at end of file diff --git a/helm-charts/FATE/templates/core/fateflow/service.yaml b/helm-charts/FATE/templates/core/fateflow/service.yaml new file mode 100644 index 000000000..e2d7bce37 --- /dev/null +++ b/helm-charts/FATE/templates/core/fateflow/service.yaml @@ -0,0 +1,102 @@ +# Copyright 2019-2022 VMware, Inc. +# 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. + +{{ if .Values.modules.python.include }} +apiVersion: v1 +kind: Service +metadata: + name: fateflow + labels: + fateMoudle: fateflow +{{ include "fate.labels" . | indent 4 }} +spec: + ports: + - name: "tcp-grpc" + port: 9360 + targetPort: 9360 + protocol: TCP + - name: "tcp-http" + port: 9380 + targetPort: 9380 + protocol: TCP + type: ClusterIP + clusterIP: None + selector: + fateMoudle: python +{{ include "fate.matchLabels" . | indent 4 }} +--- +apiVersion: v1 +kind: Service +metadata: + name: fateflow-client + labels: + fateMoudle: fateflow +{{ include "fate.labels" . | indent 4 }} +spec: + ports: + - name: "tcp-grpc" + port: 9360 + targetPort: 9360 + {{- if eq .Values.modules.python.type "NodePort" "LoadBalancer" }} + nodePort: {{ .Values.modules.python.grpcNodePort }} + {{- end }} + protocol: TCP + - name: "tcp-http" + port: 9380 + targetPort: 9380 + {{- if eq .Values.modules.python.type "NodePort" "LoadBalancer" }} + nodePort: {{ .Values.modules.python.httpNodePort }} + {{- end }} + protocol: TCP + type: {{ .Values.modules.python.type }} + + {{- if .Values.modules.python.loadBalancerIP }} + loadBalancerIP: "{{ .Values.modules.python.loadBalancerIP }}" + {{- end }} + + selector: + fateMoudle: python +{{ include "fate.matchLabels" . | indent 4 }} +--- +{{- if and .Values.modules.python.spark.portMaxRetries (ne (print .Values.modules.python.spark.driverHost) "fateflow") }} +apiVersion: v1 +kind: Service +metadata: + name: fateflow-sparkdriver + labels: + fateMoudle: python +{{ include "fate.labels" . | indent 4 }} +spec: + ports: + {{ $spark := .Values.modules.python.spark }} + {{- range .Values.modules.python.spark.portMaxRetries | int | until }} + - name: "spark-driver-port-{{ . }}" + port: {{ $spark.driverStartPort | int | add . }} + targetPort: {{ $spark.driverStartPort | int | add . }} + {{- if eq $spark.driverHostType "NodePort" "LoadBalancer" }} + nodePort: {{ $spark.driverStartPort | int | add . }} + {{- end }} + protocol: TCP + - name: "spark-block-manager-port-{{ . }}" + port: {{ $spark.blockManagerStartPort | int | add . }} + targetPort: {{ $spark.blockManagerStartPort | int | add . }} + {{- if eq $spark.driverHostType "NodePort" "LoadBalancer" }} + nodePort: {{ $spark.blockManagerStartPort | int | add . }} + {{- end }} + protocol: TCP + {{- end }} + type: {{ .Values.modules.python.spark.driverHostType }} + selector: + fateMoudle: python +{{ include "fate.matchLabels" . | indent 4 }} +--- +{{- end }} +{{ end }} \ No newline at end of file diff --git a/helm-charts/FATE/templates/istio.yaml b/helm-charts/FATE/templates/core/istio.yaml similarity index 52% rename from helm-charts/FATE/templates/istio.yaml rename to helm-charts/FATE/templates/core/istio.yaml index 1d6d388c9..8aa0f853c 100644 --- a/helm-charts/FATE/templates/istio.yaml +++ b/helm-charts/FATE/templates/core/istio.yaml @@ -1,4 +1,4 @@ -# Copyright 2019-2020 VMware, Inc. +# Copyright 2019-2022 VMware, Inc. # 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 @@ -8,6 +8,7 @@ # 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 + {{ if .Values.istio.enabled }} apiVersion: networking.istio.io/v1alpha3 kind: Gateway @@ -25,44 +26,4 @@ spec: protocol: HTTP hosts: - "*" -{{ if .Values.modules.fateboard.include }} ---- -apiVersion: networking.istio.io/v1alpha3 -kind: VirtualService -metadata: - name: fateboard - labels: -{{ include "fate.labels" . | indent 4 }} -spec: - hosts: - - {{ .Values.host.fateboard }} - gateways: - - fate-9999-gateway - http: - - route: - - destination: - host: fateboard - port: - number: 8080 -{{ end }} -{{ if .Values.modules.client.include }} ---- -apiVersion: networking.istio.io/v1alpha3 -kind: VirtualService -metadata: - name: notebook - labels: -{{ include "fate.labels" . | indent 4 }} -spec: - hosts: - - {{ .Values.host.client }} - gateways: - - {{ .Values.partyName }}-gateway - http: - - route: - - destination: - host: notebook - port: - number: 20000 -{{ end }} {{ end }} \ No newline at end of file diff --git a/helm-charts/FATE/templates/mysql-module.yaml b/helm-charts/FATE/templates/core/mysql/configmap.yaml similarity index 67% rename from helm-charts/FATE/templates/mysql-module.yaml rename to helm-charts/FATE/templates/core/mysql/configmap.yaml index 8188e7707..db11b54bb 100644 --- a/helm-charts/FATE/templates/mysql-module.yaml +++ b/helm-charts/FATE/templates/core/mysql/configmap.yaml @@ -1,4 +1,4 @@ -# Copyright 2019-2020 VMware, Inc. +# Copyright 2019-2022 VMware, Inc. # 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 @@ -43,7 +43,7 @@ data: `updated_at` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ) DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci; - CREATE UNIQUE INDEX `idx_u_store_loinsert-node.sqlcator_ns_n` ON `store_locator` (`namespace`(120), `name`(640)); + CREATE UNIQUE INDEX `idx_u_store_locator_ns_n` ON `store_locator` (`namespace`(120), `name`(640)); CREATE INDEX `idx_store_locator_st` ON `store_locator` (`store_type`(255)); CREATE INDEX `idx_store_locator_ns` ON `store_locator` (`namespace`(767)); CREATE INDEX `idx_store_locator_n` ON `store_locator` (`name`(767)); @@ -155,122 +155,4 @@ data: select * from server_node; {{- end }} --- -apiVersion: apps/v1 -kind: Deployment -metadata: - name: mysql - labels: - fateMoudle: mysql -{{ include "fate.labels" . | indent 4 }} -spec: - replicas: 1 - strategy: - type: Recreate - selector: - matchLabels: - fateMoudle: mysql -{{ include "fate.matchLabels" . | indent 6 }} - template: - metadata: - labels: - fateMoudle: mysql -{{ include "fate.labels" . | indent 8 }} - spec: - containers: - {{- if .Values.image.isThridParty }} - - image: {{ .Values.image.registry }}/mysql:8.0.28 - {{- else }} - - image: mysql:8.0.28 - {{- end }} - imagePullPolicy: {{ .Values.image.pullPolicy }} - name: mysql - env: - - name: MYSQL_ALLOW_EMPTY_PASSWORD - value: "1" - - name: MYSQL_DATABASE - value: {{ .Values.modules.mysql.database | quote }} - - name: MYSQL_USER - value: {{ .Values.modules.mysql.user | quote }} - - name: MYSQL_PASSWORD - value: {{ .Values.modules.mysql.password | quote }} - - name: user - value: root - ports: - - containerPort: 3306 - volumeMounts: - - name: mysql-confs - mountPath: /docker-entrypoint-initdb.d/ - - name: data - mountPath: /var/lib/mysql - subPath: {{ .Values.modules.mysql.subPath }} - {{- with .Values.modules.mysql.nodeSelector }} - nodeSelector: -{{ toYaml . | indent 8 }} - {{- end }} - {{- with .Values.modules.mysql.tolerations }} - tolerations: -{{ toYaml . | indent 8 }} - {{- end }} - {{- with .Values.modules.mysql.affinity }} - affinity: -{{ toYaml . | indent 8 }} - {{- end }} - {{- with .Values.image.imagePullSecrets }} - imagePullSecrets: -{{ toYaml . | indent 6 }} - {{- end }} - serviceAccountName: {{ template "serviceAccountName" . }} - volumes: - - name: mysql-confs - configMap: - name: mysql-config - {{- if not .Values.persistence.enabled }} - - name: data - emptyDir: {} - {{- else }} - - name: data - persistentVolumeClaim: - claimName: {{ .Values.modules.mysql.existingClaim | default "mysql-data" }} - {{- end }} ---- -apiVersion: v1 -kind: Service -metadata: - name: mysql - labels: - fateMoudle: mysql -{{ include "fate.labels" . | indent 4 }} -spec: - ports: - - name: "tcp-mysql" - port: 3306 - targetPort: 3306 - protocol: TCP - type: {{ .Values.modules.mysql.type }} - selector: - fateMoudle: mysql -{{ include "fate.matchLabels" . | indent 4 }} ---- -{{- if and .Values.persistence.enabled (not .Values.modules.mysql.existingClaim) }} -kind: PersistentVolumeClaim -apiVersion: v1 -metadata: - name: mysql-data - labels: - fateMoudle: mysql -{{ include "fate.labels" . | indent 4 }} -spec: - accessModes: - - {{ .Values.modules.mysql.accessMode }} - resources: - requests: - storage: {{ .Values.modules.mysql.size }} - {{- if .Values.modules.mysql.storageClass }} - {{- if eq "-" .Values.modules.mysql.storageClass }} - storageClassName: "" - {{- else }} - storageClassName: {{ .Values.modules.mysql.storageClass }} - {{- end }} - {{- end }} -{{- end }} -{{ end }} \ No newline at end of file +{{- end }} \ No newline at end of file diff --git a/helm-charts/FATE/templates/core/mysql/deployment.yaml b/helm-charts/FATE/templates/core/mysql/deployment.yaml new file mode 100644 index 000000000..3be1a0829 --- /dev/null +++ b/helm-charts/FATE/templates/core/mysql/deployment.yaml @@ -0,0 +1,91 @@ +# Copyright 2019-2022 VMware, Inc. +# 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. + +{{ if .Values.modules.mysql.include }} +apiVersion: apps/v1 +kind: Deployment +metadata: + name: mysql + labels: + fateMoudle: mysql +{{ include "fate.labels" . | indent 4 }} +spec: + replicas: 1 + strategy: + type: Recreate + selector: + matchLabels: + fateMoudle: mysql +{{ include "fate.matchLabels" . | indent 6 }} + template: + metadata: + labels: + fateMoudle: mysql +{{ include "fate.labels" . | indent 8 }} + spec: + containers: + {{- if .Values.image.isThridParty }} + - image: {{ .Values.image.registry }}/mysql:8.0.28 + {{- else }} + - image: mysql:8.0.28 + {{- end }} + imagePullPolicy: {{ .Values.image.pullPolicy }} + name: mysql + env: + - name: MYSQL_ALLOW_EMPTY_PASSWORD + value: "1" + - name: MYSQL_DATABASE + value: {{ .Values.modules.mysql.database | quote }} + - name: MYSQL_USER + value: {{ .Values.modules.mysql.user | quote }} + - name: MYSQL_PASSWORD + value: {{ .Values.modules.mysql.password | quote }} + - name: user + value: root + ports: + - containerPort: 3306 + volumeMounts: + - name: mysql-confs + mountPath: /docker-entrypoint-initdb.d/ + - name: data + mountPath: /var/lib/mysql + subPath: {{ .Values.modules.mysql.subPath }} + {{- with .Values.modules.mysql.nodeSelector }} + nodeSelector: +{{ toYaml . | indent 8 }} + {{- end }} + {{- with .Values.modules.mysql.tolerations }} + tolerations: +{{ toYaml . | indent 8 }} + {{- end }} + {{- with .Values.modules.mysql.affinity }} + affinity: +{{ toYaml . | indent 8 }} + {{- end }} + {{- with .Values.image.imagePullSecrets }} + imagePullSecrets: +{{ toYaml . | indent 6 }} + {{- end }} + serviceAccountName: {{ template "serviceAccountName" . }} + volumes: + - name: mysql-confs + configMap: + name: mysql-config + {{- if not .Values.persistence.enabled }} + - name: data + emptyDir: {} + {{- else }} + - name: data + persistentVolumeClaim: + claimName: {{ .Values.modules.mysql.existingClaim | default "mysql-data" }} + {{- end }} +--- +{{ end }} \ No newline at end of file diff --git a/helm-charts/FATE/templates/core/mysql/persistentvolumeclaim.yaml b/helm-charts/FATE/templates/core/mysql/persistentvolumeclaim.yaml new file mode 100644 index 000000000..7299ff18d --- /dev/null +++ b/helm-charts/FATE/templates/core/mysql/persistentvolumeclaim.yaml @@ -0,0 +1,35 @@ +# Copyright 2019-2022 VMware, Inc. +# 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. + +{{ if .Values.modules.mysql.include }} +{{- if and .Values.persistence.enabled (not .Values.modules.mysql.existingClaim) }} +kind: PersistentVolumeClaim +apiVersion: v1 +metadata: + name: mysql-data + labels: + fateMoudle: mysql +{{ include "fate.labels" . | indent 4 }} +spec: + accessModes: + - {{ .Values.modules.mysql.accessMode }} + resources: + requests: + storage: {{ .Values.modules.mysql.size }} + {{- if .Values.modules.mysql.storageClass }} + {{- if eq "-" .Values.modules.mysql.storageClass }} + storageClassName: "" + {{- else }} + storageClassName: {{ .Values.modules.mysql.storageClass }} + {{- end }} + {{- end }} +{{- end }} +{{ end }} \ No newline at end of file diff --git a/helm-charts/FATE/templates/core/mysql/service.yaml b/helm-charts/FATE/templates/core/mysql/service.yaml new file mode 100644 index 000000000..22da1527c --- /dev/null +++ b/helm-charts/FATE/templates/core/mysql/service.yaml @@ -0,0 +1,30 @@ +# Copyright 2019-2022 VMware, Inc. +# 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. + +{{ if .Values.modules.mysql.include }} +apiVersion: v1 +kind: Service +metadata: + name: mysql + labels: + fateMoudle: mysql +{{ include "fate.labels" . | indent 4 }} +spec: + ports: + - name: "tcp-mysql" + port: 3306 + targetPort: 3306 + protocol: TCP + type: {{ .Values.modules.mysql.type }} + selector: + fateMoudle: mysql +{{ include "fate.matchLabels" . | indent 4 }} +{{ end }} \ No newline at end of file diff --git a/helm-charts/FATE/templates/core/python-spark.yaml b/helm-charts/FATE/templates/core/python-spark.yaml new file mode 100644 index 000000000..bda83fb47 --- /dev/null +++ b/helm-charts/FATE/templates/core/python-spark.yaml @@ -0,0 +1,232 @@ +# Copyright 2019-2022 VMware, Inc. +# 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. + +{{ if .Values.modules.python.include }} +apiVersion: apps/v1 +kind: Deployment +metadata: + name: python + labels: + fateMoudle: python +{{ include "fate.labels" . | indent 4 }} +spec: + replicas: 1 + strategy: + type: Recreate + selector: + matchLabels: + fateMoudle: python +{{ include "fate.matchLabels" . | indent 6 }} + template: + metadata: + labels: + fateMoudle: python +{{ include "fate.labels" . | indent 8 }} + spec: + {{- if .Values.istio.enabled }} + {{- else }} + initContainers: + {{- if .Values.image.isThridParty }} + - image: {{ .Values.image.registry }}/mysql:8 + {{- else }} + - image: mysql:8 + {{- end }} + imagePullPolicy: {{ .Values.image.pullPolicy }} + name: ping-mysql + env: + - name: MYSQL_DATABASE + value: "{{ .Values.externalMysqlDatabase | default .Values.modules.mysql.database | default "eggroll_meta" }}" + - name: MYSQL_USER + value: "{{ .Values.externalMysqlUser | default .Values.modules.mysql.user | default "fate" }}" + - name: MYSQL_PASSWORD + value: "{{ .Values.externalMysqlPassword | default .Values.modules.mysql.password | default "fate_dev" }}" + - name: MYSQL_HOST + value: "{{ .Values.externalMysqlIp | default .Values.modules.mysql.ip | default "mysql" }}" + - name: MYSQL_PORT + value: "{{ .Values.externalMysqlPort | default .Values.modules.mysql.port | default "3306" | }}" + command: + - /bin/bash + - -c + - | + set -x + function checkMySQL(){ + checkMySQLCount=0 + while true ; do + checkMySQLCount=$[checkMySQLCount+1] + echo "Waiting for mysql started. check count: $checkMySQLCount" + sleep 2 + + state=`mysqladmin ping -h ${MYSQL_HOST} --port=${MYSQL_PORT} -u${MYSQL_USER} -p${MYSQL_PASSWORD}| awk '{print $3}'` + if [ "$state" == "alive" ]; then + echo "mysql server has been already started." + break + fi + done + } + echo "Waiting for mysql started..." + checkMySQL + {{- end }} + containers: + - name: python + {{- if eq .Values.modules.python.backend "spark_pulsar" "spark_rabbitmq" "spark_local_pulsar" }} + image: {{ .Values.image.registry }}/python-spark:{{ .Values.image.tag }} + {{- else }} + image: {{ .Values.image.registry }}/{{ if .Values.modules.python.enabledNN }}python-nn{{ else }}python{{ end }}:{{ .Values.image.tag }} + {{- end }} + imagePullPolicy: {{ .Values.image.pullPolicy }} + {{- if .Values.modules.python.resources}} + resources: + {{- range $key, $val := .Values.modules.python.resources }} + {{ $key }}: +{{ toYaml $val | indent 14 }} + {{- end }} + {{- end }} + env: + - name: POD_IP + valueFrom: + fieldRef: + fieldPath: status.podIP + - name: FATE_LOG_LEVEL + value: {{ .Values.modules.python.logLevel }} + - name: PYTHONPATH + value: "$PYTHONPATH:/data/projects/fate/fate/python:/data/projects/fate/eggroll/python:/data/projects/fate/fateflow/python:/data/projects/fate/fate/python/fate_client" + - name: FATE_PROJECT_BASE + value: "/data/projects/fate" + {{- if eq .Values.modules.python.backend "spark_pulsar" "spark_rabbitmq" }} + - name: FATE_FLOW_UPLOAD_MAX_NUM + value: "1000000" + - name: FATE_FLOW_UPLOAD_MAX_BYTES + value: "104868093952" + {{- end }} + ports: + - containerPort: 9360 + - containerPort: 9380 + command: + - /bin/bash + - -c + - | + set -x + mkdir -p /data/projects/fate/conf/ + cp /data/projects/fate/conf-tmp/transfer_conf.yaml /data/projects/fate/conf/transfer_conf.yaml + cp /data/projects/fate/conf-tmp/service_conf.yaml /data/projects/fate/conf/service_conf.yaml + cp /data/projects/fate/conf-tmp/component_registry.json /data/projects/fate/conf/component_registry.json + cp /data/projects/fate/conf-tmp/job_default_config.yaml /data/projects/fate/conf/job_default_config.yaml + # fix fateflow conf must use IP + sed -i "s/host: fateflow/host: ${POD_IP}/g" /data/projects/fate/conf/service_conf.yaml + + cp /data/projects/spark-2.4.1-bin-hadoop2.7/conf/spark-defaults-template.conf /data/projects/spark-2.4.1-bin-hadoop2.7/conf/spark-defaults.conf + sed -i "s/fateflow/${POD_IP}/g" /data/projects/spark-2.4.1-bin-hadoop2.7/conf/spark-defaults.conf + + # logs + mkdir -p /data/projects/fate/fateflow/logs/fate_flow/ + touch /data/projects/fate/fateflow/logs/fate_flow/INFO.log + ln -sf /dev/stdout /data/projects/fate/fateflow/logs/fate_flow/INFO.log + + sleep 5 && python fateflow/python/fate_flow/fate_flow_server.py + volumeMounts: + {{- if eq .Values.modules.python.backend "eggroll" }} + - mountPath: /data/projects/fate/eggroll/conf/eggroll.properties + name: eggroll-confs + subPath: eggroll.properties + {{- end }} + - name: python-data + mountPath: /data/projects/fate/fateflow/logs + subPath: logs + - mountPath: /data/projects/fate/conf-tmp/ + name: python-confs + - mountPath: /data/projects/spark-2.4.1-bin-hadoop2.7/conf/spark-defaults-template.conf + name: python-confs + subPath: spark-defaults.conf + {{- if eq .Values.modules.python.backend "spark_rabbitmq" }} + - mountPath: /data/projects/fate/conf/rabbitmq_route_table + name: rabbitmq-route-table + {{- end }} + {{- if eq .Values.modules.python.backend "spark_pulsar" "spark_local_pulsar" }} + - mountPath: /data/projects/fate/conf/pulsar_route_table + name: pulsar-route-table + {{- end }} + # TODO add mountPath of job and model-cache + - mountPath: /data/projects/fate/jobs + name: python-data + subPath: jobs + - mountPath: /data/projects/fate/model_local_cache + name: python-data + subPath: model-local-cache + {{- if .Values.modules.fateboard.include }} + - image: {{ .Values.image.registry }}/fateboard:{{ .Values.image.tag }} + imagePullPolicy: {{ .Values.image.pullPolicy }} + name: fateboard + ports: + - containerPort: 8080 + volumeMounts: + - mountPath: /data/projects/fate/fateboard/conf/application.properties + name: fateboard-confs + subPath: application.properties + - name: python-data + mountPath: /data/projects/fate/fateflow/logs + subPath: logs + {{- end }} + {{- with .Values.modules.python.nodeSelector }} + nodeSelector: +{{ toYaml . | indent 8 }} + {{- end }} + {{- with .Values.modules.python.tolerations }} + tolerations: +{{ toYaml . | indent 8 }} + {{- end }} + {{- with .Values.modules.python.affinity }} + affinity: +{{ toYaml . | indent 8 }} + {{- end }} + {{- with .Values.image.imagePullSecrets }} + imagePullSecrets: +{{ toYaml . | indent 6 }} + {{- end }} + {{- if .Values.modules.python.serviceAccountName }} + serviceAccountName: {{ .Values.modules.python.serviceAccountName }} + {{- else }} + serviceAccountName: {{ template "serviceAccountName" . }} + {{- end }} + restartPolicy: Always + volumes: + {{- if eq .Values.modules.python.backend "eggroll" }} + - name: eggroll-confs + configMap: + name: eggroll-config + {{- end }} + - name: python-confs + configMap: + name: python-config + {{- if eq .Values.modules.python.backend "spark_rabbitmq" }} + - name: rabbitmq-route-table + configMap: + name: rabbitmq-route-table + {{- end }} + {{- if eq .Values.modules.python.backend "spark_pulsar" "spark_local_pulsar" }} + - name: pulsar-route-table + configMap: + name: pulsar-route-table + {{- end }} + {{- if .Values.modules.fateboard.include }} + - name: fateboard-confs + configMap: + name: fateboard-config + {{- end }} + {{- if not .Values.persistence.enabled }} + - name: python-data + emptyDir: {} + {{- else }} + - name: python-data + persistentVolumeClaim: + claimName: {{ .Values.modules.python.existingClaim | default "python-data" }} + {{- end }} + +{{ end }} diff --git a/helm-charts/FATE/templates/hdfs-nn.yaml b/helm-charts/FATE/templates/hdfs-nn.yaml deleted file mode 100644 index b446c75c6..000000000 --- a/helm-charts/FATE/templates/hdfs-nn.yaml +++ /dev/null @@ -1,209 +0,0 @@ -# Copyright 2019-2020 VMware, Inc. -# 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. - -{{ if .Values.modules.hdfs.include }} -kind: ConfigMap -apiVersion: v1 -metadata: - name: namenode-config - labels: - fateMoudle: namenode -{{ include "fate.labels" . | indent 4 }} -data: - core-site.xml: | - - - fs.default.name - hdfs://0.0.0.0:9000 - - ---- -kind: ConfigMap -apiVersion: v1 -metadata: - name: namenode-env - labels: - fateMoudle: namenode -{{ include "fate.labels" . | indent 4 }} -data: - CORE_CONF_fs_defaultFS: "hdfs://namenode:9000" - CORE_CONF_hadoop_http_staticuser_user: "root" - CORE_CONF_hadoop_proxyuser_hue_hosts: "*" - CORE_CONF_hadoop_proxyuser_hue_groups: "*" - CORE_CONF_io_compression_codecs: org.apache.hadoop.io.compress.SnappyCodec - HDFS_CONF_dfs_webhdfs_enabled: 'true' - HDFS_CONF_dfs_permissions_enabled: 'false' - HDFS_CONF_dfs_namenode_datanode_registration_ip___hostname___check: 'false' - YARN_CONF_yarn_log___aggregation___enable: 'true' - YARN_CONF_yarn_log_server_url: "http://historyserver:8188/applicationhistory/logs/" - YARN_CONF_yarn_resourcemanager_recovery_enabled: 'true' - YARN_CONF_yarn_resourcemanager_store_class: org.apache.hadoop.yarn.server.resourcemanager.recovery.FileSystemRMStateStore - YARN_CONF_yarn_resourcemanager_scheduler_class: org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler - YARN_CONF_yarn_scheduler_capacity_root_default_maximum___allocation___mb: '8192' - YARN_CONF_yarn_scheduler_capacity_root_default_maximum___allocation___vcores: '4' - YARN_CONF_yarn_resourcemanager_fs_state___store_uri: /rmstate - YARN_CONF_yarn_resourcemanager_system___metrics___publisher_enabled: 'true' - YARN_CONF_yarn_resourcemanager_hostname: resourcemanager - YARN_CONF_yarn_resourcemanager_address: resourcemanager:8032 - YARN_CONF_yarn_resourcemanager_scheduler_address: resourcemanager:8030 - YARN_CONF_yarn_resourcemanager_resource__tracker_address: resourcemanager:8031 - YARN_CONF_yarn_timeline___service_enabled: 'true' - YARN_CONF_yarn_timeline___service_generic___application___history_enabled: 'true' - YARN_CONF_yarn_timeline___service_hostname: historyserver - YARN_CONF_mapreduce_map_output_compress: 'true' - YARN_CONF_mapred_map_output_compress_codec: org.apache.hadoopac.io.compress.SnappyCodec - YARN_CONF_yarn_nodemanager_resource_memory___mb: '16384' - YARN_CONF_yarn_nodemanager_resource_cpu___vcores: '8' - YARN_CONF_yarn_nodemanager_disk___health___checker_max___disk___utilization___per___disk___percentage: '98.5' - YARN_CONF_yarn_nodemanager_remote___app___log___dir: /app-logs - YARN_CONF_yarn_nodemanager_aux___services: mapreduce_shuffle - MAPRED_CONF_mapreduce_framework_name: yarn - MAPRED_CONF_mapred_child_java_opts: '-Xmx4096m' - MAPRED_CONF_mapreduce_map_memory_mb: '4096' - MAPRED_CONF_mapreduce_reduce_memory_mb: '8192' - MAPRED_CONF_mapreduce_map_java_opts: '-Xmx3072m' - MAPRED_CONF_mapreduce_reduce_java_opts: '-Xmx6144m' - MAPRED_CONF_yarn_app_mapreduce_am_env: HADOOP_MAPRED_HOME=/opt/hadoop-3.2.1/ - MAPRED_CONF_mapreduce_map_env: HADOOP_MAPRED_HOME=/opt/hadoop-3.2.1/ - MAPRED_CONF_mapreduce_reduce_env: HADOOP_MAPRED_HOME=/opt/hadoop-3.2.1/ ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - name: namenode - labels: - fateMoudle: namenode -{{ include "fate.labels" . | indent 4 }} -spec: - replicas: 1 - strategy: - type: Recreate - selector: - matchLabels: - fateMoudle: namenode -{{ include "fate.matchLabels" . | indent 6 }} - template: - metadata: - labels: - fateMoudle: namenode -{{ include "fate.labels" . | indent 8 }} - spec: - {{ if .Values.persistence.enabled }} - initContainers: - - name: delete-lost-found - image: busybox - command: ["sh", "-c", "rm -rf /hadoop/dfs/name/lost+found"] - volumeMounts: - - name: dfs - mountPath: /hadoop/dfs/name - {{ end }} - containers: - - name: namenode - image: {{ .Values.image.registry }}/hadoop-namenode:2.0.0-hadoop2.7.4-java8 - imagePullPolicy: {{ .Values.image.pullPolicy }} - env: - - name: CLUSTER_NAME - value: fate - envFrom: - - configMapRef: - name: namenode-env - ports: - - containerPort: 9000 - - containerPort: 9870 - - containerPort: 50070 - volumeMounts: - - mountPath: /etc/hadoop/core-site.xml - subPath: core-site.xml - name: namenode-confs - - name: dfs - mountPath: /hadoop/dfs/name - {{- with .Values.modules.hdfs.namenode.nodeSelector }} - nodeSelector: -{{ toYaml . | indent 8 }} - {{- end }} - {{- with .Values.modules.hdfs.namenode.tolerations }} - tolerations: -{{ toYaml . | indent 8 }} - {{- end }} - {{- with .Values.modules.hdfs.namenode.affinity }} - affinity: -{{ toYaml . | indent 8 }} - {{- end }} - {{- with .Values.image.imagePullSecrets }} - imagePullSecrets: -{{ toYaml . | indent 6 }} - {{- end }} - serviceAccountName: {{ template "serviceAccountName" . }} - restartPolicy: Always - volumes: - - name: namenode-confs - configMap: - name: namenode-config - - name: dfs - {{ if .Values.persistence.enabled }} - persistentVolumeClaim: - claimName: {{ .Values.modules.hdfs.namenode.existingClaim | default "namenode-data" }} - {{ else }} - emptyDir: {} - {{ end }} ---- -apiVersion: v1 -kind: Service -metadata: - name: namenode - labels: - fateMoudle: namenode -{{ include "fate.labels" . | indent 4 }} -spec: - ports: - - name: "tcp-9000" - port: 9000 - targetPort: 9000 - protocol: TCP - {{- if eq .Values.modules.hdfs.namenode.type "NodePort" "LoadBalancer" }} - nodePort: {{ .Values.modules.hdfs.namenode.nodePort }} - {{- end }} - - name: "tcp-9870" - port: 9870 - targetPort: 9870 - protocol: TCP - - name: "tcp-50070" - port: 50070 - targetPort: 50070 - protocol: TCP - type: {{ .Values.modules.hdfs.namenode.type }} - selector: - fateMoudle: namenode -{{ include "fate.matchLabels" . | indent 4 }} ---- -{{ if and .Values.persistence.enabled (not .Values.modules.hdfs.namenode.existingClaim) }} -kind: PersistentVolumeClaim -apiVersion: v1 -metadata: - name: namenode-data - labels: - fateMoudle: namenode -{{ include "fate.labels" . | indent 4 }} -spec: - accessModes: - - {{ .Values.modules.hdfs.namenode.accessMode }} - resources: - requests: - storage: {{ .Values.modules.hdfs.namenode.size }} - {{ if .Values.modules.hdfs.namenode.storageClass }} - {{ if eq "-" .Values.modules.hdfs.namenode.storageClass }} - storageClassName: "" - {{ else }} - storageClassName: {{ .Values.modules.hdfs.namenode.storageClass }} - {{ end }} - {{ end }} -{{ end }} -{{ end }} diff --git a/helm-charts/FATE/templates/ingress.yaml b/helm-charts/FATE/templates/ingress.yaml deleted file mode 100644 index 12ca27e22..000000000 --- a/helm-charts/FATE/templates/ingress.yaml +++ /dev/null @@ -1,177 +0,0 @@ -# Copyright 2019-2020 VMware, Inc. -# 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. -{{ if .Values.istio.enabled }} -{{ else }} -{{ if .Values.modules.fateboard.include }} -apiVersion: networking.k8s.io/v1 -kind: Ingress -metadata: - name: fateboard - labels: - fateMoudle: fateboard -{{ include "fate.labels" . | indent 4 }} -{{- if .Values.ingress.fateboard.annotations }} - annotations: -{{ toYaml .Values.ingress.fateboard.annotations | indent 4 }} -{{- end }} -spec: - rules: - {{- range .Values.ingress.fateboard.hosts }} - - host: {{ .name }} - http: - paths: - - path: {{ default "/" .path }} - pathType: Prefix - backend: - service: - name: fateboard - port: - number: 8080 - {{- end }} -{{- if .Values.ingress.fateboard.tls }} - tls: -{{ toYaml .Values.ingress.fateboard.tls | indent 4 }} -{{- end }} ---- -{{ end }} - -{{ if .Values.modules.client.include }} -apiVersion: networking.k8s.io/v1 -kind: Ingress -metadata: - name: client - labels: - fateMoudle: client -{{ include "fate.labels" . | indent 4 }} -{{- if .Values.ingress.client.annotations }} - annotations: -{{ toYaml .Values.ingress.client.annotations | indent 4 }} -{{- end }} -spec: - rules: - {{- range .Values.ingress.client.hosts }} - - host: {{ .name }} - http: - paths: - - path: {{ default "/" .path }} - pathType: Prefix - backend: - service: - name: notebook - port: - number: 20000 - {{- end }} -{{- if .Values.ingress.client.tls }} - tls: -{{ toYaml .Values.ingress.client.tls | indent 4 }} -{{- end }} ---- -{{ end }} - -{{ if .Values.modules.spark.include }} -apiVersion: networking.k8s.io/v1 -kind: Ingress -metadata: - name: spark - labels: - fateMoudle: spark -{{ include "fate.labels" . | indent 4 }} -{{- if .Values.ingress.spark.annotations }} - annotations: -{{ toYaml .Values.ingress.spark.annotations | indent 4 }} -{{- end }} -spec: - rules: - {{- range .Values.ingress.spark.hosts }} - - host: {{ .name }} - http: - paths: - - path: {{ default "/" .path }} - pathType: Prefix - backend: - service: - name: spark-master - port: - number: 8080 - {{- end }} -{{- if .Values.ingress.spark.tls }} - tls: -{{ toYaml .Values.ingress.spark.tls | indent 4 }} -{{- end }} ---- -{{ end }} - -{{ if .Values.modules.rabbitmq.include }} -apiVersion: networking.k8s.io/v1 -kind: Ingress -metadata: - name: rabbitmq - labels: - fateMoudle: rabbitmq -{{ include "fate.labels" . | indent 4 }} -{{- if .Values.ingress.rabbitmq.annotations }} - annotations: -{{ toYaml .Values.ingress.rabbitmq.annotations | indent 4 }} -{{- end }} -spec: - rules: - {{- range .Values.ingress.rabbitmq.hosts }} - - host: {{ .name }} - http: - paths: - - path: {{ default "/" .path }} - pathType: Prefix - backend: - service: - name: rabbitmq - port: - number: 15672 - {{- end }} -{{- if .Values.ingress.rabbitmq.tls }} - tls: -{{ toYaml .Values.ingress.rabbitmq.tls | indent 4 }} -{{- end }} ---- -{{ end }} - -{{ if .Values.modules.pulsar.include }} -apiVersion: networking.k8s.io/v1 -kind: Ingress -metadata: - name: pulsar - labels: - fateMoudle: pulsar -{{ include "fate.labels" . | indent 4 }} -{{- if .Values.ingress.pulsar.annotations }} - annotations: -{{ toYaml .Values.ingress.pulsar.annotations | indent 4 }} -{{- end }} -spec: - rules: - {{- range .Values.ingress.pulsar.hosts }} - - host: {{ .name }} - http: - paths: - - path: {{ default "/" .path }} - pathType: Prefix - backend: - service: - name: pulsar - port: - number: 8080 - {{- end }} -{{- if .Values.ingress.pulsar.tls }} - tls: -{{ toYaml .Values.ingress.pulsar.tls | indent 4 }} -{{- end }} ---- -{{ end }} -{{ end }} \ No newline at end of file diff --git a/helm-charts/FATE/templates/nodemanager-module.yaml b/helm-charts/FATE/templates/nodemanager-module.yaml deleted file mode 100644 index a8536821e..000000000 --- a/helm-charts/FATE/templates/nodemanager-module.yaml +++ /dev/null @@ -1,250 +0,0 @@ -# Copyright 2019-2020 VMware, Inc. -# 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. - -{{- if .Values.modules.nodemanager.include }} -{{- $root := . -}} -{{- range $nodemanager := .Values.modules.nodemanager.list }} -kind: ConfigMap -apiVersion: v1 -metadata: - name: {{ $nodemanager.name }}-config - labels: - fateMoudle: {{ $nodemanager.name }} -{{ include "fate.labels" $root | indent 4 }} -data: - eggroll.properties: | - [eggroll] - eggroll.resourcemanager.clustermanager.jdbc.driver.class.name=com.mysql.cj.jdbc.Driver - eggroll.resourcemanager.clustermanager.jdbc.url=jdbc:mysql://{{ $root.Values.modules.mysql.ip }}:{{ $root.Values.modules.mysql.port }}/{{ $root.Values.modules.mysql.mysql_database }}?useSSL=false&serverTimezone=UTC&characterEncoding=utf8&allowPublicKeyRetrieval=true - eggroll.resourcemanager.clustermanager.jdbc.username={{ $root.Values.modules.mysql.mysql_user }} - eggroll.resourcemanager.clustermanager.jdbc.password={{ $root.Values.modules.mysql.mysql_password }} - - eggroll.data.dir=data/ - eggroll.logs.dir=logs/ - eggroll.resourcemanager.clustermanager.host=clustermanager - eggroll.resourcemanager.clustermanager.port=4670 - eggroll.resourcemanager.nodemanager.port=4671 - eggroll.resourcemanager.process.tag={{ $root.Values.partyId }} - - eggroll.bootstrap.root.script=bin/eggroll_boot.sh - - eggroll.resourcemanager.bootstrap.egg_pair.exepath=bin/roll_pair/egg_pair_bootstrap.sh - eggroll.resourcemanager.bootstrap.egg_pair.venv= - eggroll.resourcemanager.bootstrap.egg_pair.pythonpath=/data/projects/fate/python:/data/projects/fate/eggroll/python - eggroll.resourcemanager.bootstrap.egg_pair.filepath=python/eggroll/roll_pair/egg_pair.py - eggroll.resourcemanager.bootstrap.egg_pair.ld_library_path= - - eggroll.resourcemanager.bootstrap.egg_frame.exepath=bin/roll_pair/roll_pair_master_bootstrap.sh - eggroll.resourcemanager.bootstrap.egg_frame.javahome=/usr/lib/jvm/java-1.8.0-openjdk - eggroll.resourcemanager.bootstrap.egg_frame.classpath=conf/:lib/* - eggroll.resourcemanager.bootstrap.egg_frame.mainclass=com.webank.eggroll.rollframe.EggFrameBootstrap - eggroll.resourcemanager.bootstrap.egg_frame.jvm.options= - - eggroll.core.grpc.channel.keepalive.timeout.sec=20 - - # roll_frame - arrow.enable_unsafe_memory_access=true - - # hadoop - hadoop.fs.defaultFS=file:/// - - # hadoop HA mode - hadoop.dfs.nameservices= - hadoop.dfs.namenode.rpc-address.nn1= - hadoop.dfs.namenode.rpc-address.nn2= - - # session - eggroll.session.processors.per.node={{ $nodemanager.sessionProcessorsPerNode }} - eggroll.session.start.timeout.ms=180000 - - # rollpair - eggroll.rollpair.transferpair.sendbuf.size=250000 - - # rollsite - eggroll.rollsite.coordinator={{ $root.Values.partyName }} - eggroll.rollsite.host=rollsite - eggroll.rollsite.port=9370 - eggroll.rollsite.party.id={{ $root.Values.partyId }} - eggroll.rollsite.route.table.path=conf/route_table/route_table.json - eggroll.rollsite.route.table.key= - eggroll.rollsite.route.table.whitelist=127.0.0.1 - eggroll.rollsite.jvm.options=-XX:+UseG1GC -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:logs/eggroll/rollsite.gc.log - - eggroll.rollsite.push.max.retry=3 - eggroll.rollsite.push.long.retry=2 - eggroll.rollsite.push.batches.per.stream=10 - eggroll.rollsite.adapter.sendbuf.size=100000 - fluent.conf: | - - @type tail - path /data/projects/fate/eggroll/logs/*/*.* - exclude_path ["/data/projects/fate/eggroll/logs/eggroll/*", "/data/projects/fate/eggroll/logs/log.pos"] - pos_file /data/projects/fate/eggroll/logs/log.pos - tag eggroll - multiline_flush_interval 2s - refresh_interval 5s - - @type none - - - - - @type stdout - ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - name: {{ $nodemanager.name }} - labels: - fateMoudle: {{ $nodemanager.name }} - app: nodemanager -{{ include "fate.labels" $root | indent 4 }} -spec: - replicas: 1 - strategy: - type: Recreate - selector: - matchLabels: - fateMoudle: {{ $nodemanager.name }} -{{ include "fate.matchLabels" $root | indent 6 }} - template: - metadata: - labels: - fateMoudle: {{ $nodemanager.name }} - app: nodemanager -{{ include "fate.labels" $root | indent 8 }} - spec: - containers: - - name: {{ $nodemanager.name }}-eggrollpair - {{- if $root.Values.image.isThridParty }} - image: {{ $root.Values.image.registry }}/fluentd:v1.12 - {{- else }} - image: fluent/fluentd:v1.12 - {{- end }} - volumeMounts: - - name: eggroll-log - mountPath: /data/projects/fate/eggroll/logs/ - - name: fluentd-conf - subPath: fluent.conf - mountPath: /fluentd/etc/fluent.conf - - image: {{ $root.Values.image.registry }}/eggroll:{{ $root.Values.image.tag }} - imagePullPolicy: {{ $root.Values.image.pullPolicy }} - name: {{ $nodemanager.name }} - command: - - bash - - -c - - | - set -x - mkdir -p /data/projects/fate/eggroll/logs/eggroll/ - touch /data/projects/fate/eggroll/logs/eggroll/eggroll-audit.log - ln -sf /dev/stdout /data/projects/fate/eggroll/logs/eggroll/eggroll-audit.log - touch /data/projects/fate/eggroll/logs/eggroll/eggroll.jvm.log - ln -sf /dev/stdout /data/projects/fate/eggroll/logs/eggroll/eggroll.jvm.log - touch /data/projects/fate/eggroll/logs/eggroll/eggroll.jvm.err.log - ln -sf /dev/stderr /data/projects/fate/eggroll/logs/eggroll/eggroll.jvm.err.log - /tini -- java -Dlog4j.configurationFile=$${EGGROLL_HOME}/conf/log4j2.properties -cp $${EGGROLL_HOME}/lib/*: com.webank.eggroll.core.Bootstrap --bootstraps com.webank.eggroll.core.resourcemanager.NodeManagerBootstrap -c $${EGGROLL_HOME}/conf/eggroll.properties -p 4671 -s 'EGGROLL_DEAMON' - ports: - - containerPort: 4671 - volumeMounts: - - name: eggroll-log - mountPath: /data/projects/fate/eggroll/logs/ - - mountPath: /data/projects/fate/eggroll/conf/eggroll.properties - name: nodemanager-confs - subPath: eggroll.properties - - mountPath: /data/projects/fate/fate/conf/ - name: python-confs - - name: data-dir - mountPath: /data/projects/fate/eggroll/data - subPath: {{ $nodemanager.subPath }} - {{- with $nodemanager.nodeSelector }} - nodeSelector: -{{ toYaml . | indent 8 }} - {{- end }} - {{- with $nodemanager.tolerations }} - tolerations: -{{ toYaml . | indent 8 }} - {{- end }} - {{- with $nodemanager.affinity }} - affinity: -{{ toYaml . | indent 8 }} - {{- end }} - {{- with $root.Values.image.imagePullSecrets }} - imagePullSecrets: -{{ toYaml . | indent 6 }} - {{- end }} - serviceAccountName: {{ template "serviceAccountName" $root }} - restartPolicy: Always - volumes: - - name: eggroll-log - emptyDir: {} - - name: fluentd-conf - configMap: - name: {{ $nodemanager.name }}-config - - name: nodemanager-confs - configMap: - name: {{ $nodemanager.name }}-config - - name: python-confs - configMap: - name: python-config - {{- if not $root.Values.persistence.enabled }} - - name: data-dir - emptyDir: {} - {{- else }} - - name: data-dir - persistentVolumeClaim: - claimName: {{ $nodemanager.existingClaim | default (printf "%s-data" $nodemanager.name) }} - {{- end }} ---- -apiVersion: v1 -kind: Service -metadata: - labels: - fateMoudle: {{ $nodemanager.name }} -{{ include "fate.labels" $root | indent 4 }} - name: {{ $nodemanager.name }} -spec: - ports: - - name: "tcp-nodemanager" - port: 4671 - targetPort: 4671 - protocol: TCP - clusterIP: None - selector: - fateMoudle: {{ $nodemanager.name }} -{{ include "fate.matchLabels" $root | indent 4 }} ---- -{{- if and $root.Values.persistence.enabled (not $nodemanager.existingClaim) }} -kind: PersistentVolumeClaim -apiVersion: v1 -metadata: - name: {{ $nodemanager.name }}-data - labels: - fateMoudle: {{ $nodemanager.name }} -{{ include "fate.labels" $root | indent 4 }} -spec: - accessModes: - - {{ $nodemanager.accessMode }} - resources: - requests: - storage: {{ $nodemanager.size }} - {{- if $nodemanager.storageClass }} - {{- if eq "-" $nodemanager.storageClass }} - storageClassName: "" - {{- else }} - storageClassName: {{ $nodemanager.storageClass }} - {{- end }} - {{- end }} -{{- end }} - ---- -{{- end }} -{{- end }} \ No newline at end of file diff --git a/helm-charts/FATE/templates/psp.yaml b/helm-charts/FATE/templates/psp.yaml index fbd76dc5a..30c3dfb3c 100644 --- a/helm-charts/FATE/templates/psp.yaml +++ b/helm-charts/FATE/templates/psp.yaml @@ -1,3 +1,14 @@ +# Copyright 2019-2022 VMware, Inc. +# 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. + {{- if .Values.podSecurityPolicy.enabled -}} apiVersion: policy/v1beta1 kind: PodSecurityPolicy diff --git a/helm-charts/FATE/templates/python-spark.yaml b/helm-charts/FATE/templates/python-spark.yaml deleted file mode 100644 index 12e0125dd..000000000 --- a/helm-charts/FATE/templates/python-spark.yaml +++ /dev/null @@ -1,670 +0,0 @@ -# Copyright 2019-2020 VMware, Inc. -# 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. - -{{ if .Values.modules.python.include }} -kind: ConfigMap -apiVersion: v1 -metadata: - name: python-config - labels: - fateMoudle: python -{{ include "fate.labels" . | indent 4 }} -data: - spark-defaults.conf: | - spark.master {{ if eq .Values.modules.python.backend "spark_local_pulsar" }}local[*]{{ else }}{{ .Values.modules.python.spark.master | default "spark://spark-master:7077"}}{{ end }} - spark.driver.host {{ .Values.modules.python.spark.driverHost | default "fateflow" }} - {{- if .Values.modules.python.spark.driverStartPort }} - spark.driver.port {{ .Values.modules.python.spark.driverStartPort }} - {{- end }} - - {{- if .Values.modules.python.spark.portMaxRetries }} - spark.port.maxRetries {{ .Values.modules.python.spark.portMaxRetries }} - {{- end }} - - {{- if .Values.modules.python.spark.blockManagerStartPort }} - spark.blockManager.port {{ .Values.modules.python.spark.blockManagerStartPort }} - {{- end }} - - {{- if .Values.modules.python.spark.blockManagerStartPort }} - spark.driver.bindAddress 0.0.0.0 - {{- end }} - - {{- if .Values.modules.python.spark.pysparkPython }} - spark.pyspark.python {{ .Values.modules.python.spark.pysparkPython }} - spark.pyspark.driver.python python - {{- end }} - service_conf.yaml: | - use_registry: {{ .Values.modules.serving.useRegistry | default false }} - use_deserialize_safe_module: false - dependent_distribution: false - encrypt_password: false - encrypt_module: fate_arch.common.encrypt_utils#pwdecrypt - private_key: - fateflow: - # you must set real ip address, 127.0.0.1 and 0.0.0.0 is not supported - host: {{ if .Values.istio.enabled }}127.0.0.1{{ else }}fateflow{{ end }} - http_port: 9380 - grpc_port: 9360 - # http_app_key: - # http_secret_key: - # support rollsite/nginx/fateflow as a coordination proxy - # rollsite support fate on eggroll, use grpc protocol - # nginx support fate on eggroll and fate on spark, use http or grpc protocol, default is http - # fateflow support fate on eggroll and fate on spark, use http protocol, but not support exchange network mode - - # format(proxy: rollsite) means rollsite use the rollsite configuration of fate_one_eggroll and nginx use the nginx configuration of fate_one_spark - # you also can customize the config like this(set fateflow of the opposite party as proxy): - # proxy: - # name: fateflow - # host: xx - # http_port: xx - # grpc_port: xx - {{- if eq .Values.modules.python.backend "spark_pulsar" "spark_rabbitmq" "spark_local_pulsar" }} - proxy: nginx - {{- else }} - proxy: rollsite - {{- end }} - # support default/http/grpc - protocol: default - # It can also be specified in the job configuration using the federated_status_collect_type parameter - default_federated_status_collect_type: PULL - database: - name: '{{ .Values.externalMysqlDatabase | default .Values.modules.mysql.database | default "eggroll_meta" }}' - user: '{{ .Values.externalMysqlUser | default .Values.modules.mysql.user | default "fate" }}' - passwd: '{{ .Values.externalMysqlPassword | default .Values.modules.mysql.password | default "fate_dev" }}' - host: '{{ .Values.externalMysqlIp | default .Values.modules.mysql.ip | default "mysql" }}' - port: {{ .Values.externalMysqlPort | default .Values.modules.mysql.port | default "3306" }} - max_connections: 100 - stale_timeout: 30 - zookeeper: - hosts: - - "serving-zookeeper:2181" - # use_acl: false - # user: fate - # password: fate - # engine services - default_engines: - {{- if eq .Values.modules.python.backend "spark_pulsar" }} - computing: spark - federation: pulsar - storage: hdfs - {{- else if eq .Values.modules.python.backend "spark_rabbitmq" }} - computing: spark - federation: rabbitmq - storage: hdfs - {{- else if eq .Values.modules.python.backend "spark_local_pulsar" }} - computing: spark - federation: pulsar - storage: localfs - {{- else }} - computing: eggroll - federation: eggroll - storage: eggroll - {{- end }} - fate_on_standalone: - standalone: - cores_per_node: 20 - nodes: 1 - fate_on_eggroll: - clustermanager: - cores_per_node: {{ .Values.modules.python.clustermanager.cores_per_node | default 16 }} - nodes: {{ .Values.modules.python.clustermanager.nodes | default 2 }} - rollsite: - host: {{ .Values.modules.rollsite.ip }} - port: 9370 - fate_on_spark: - spark: - # default use SPARK_HOME environment variable - home: /data/projects/spark-2.4.1-bin-hadoop2.7/ - cores_per_node: {{ .Values.modules.python.spark.cores_per_node }} - nodes: {{ .Values.modules.python.spark.nodes }} - linkis_spark: - cores_per_node: 20 - nodes: 2 - host: 127.0.0.1 - port: 9001 - token_code: MLSS - python_path: /data/projects/fate/python - hive: - host: 127.0.0.1 - port: 10000 - auth_mechanism: - username: - password: - linkis_hive: - host: 127.0.0.1 - port: 9001 - hdfs: - name_node: {{ .Values.modules.python.hdfs.name_node | default "hdfs://namenode:9000" }} - # default / - path_prefix: {{ .Values.modules.python.hdfs.path_prefix }} - rabbitmq: - host: {{ .Values.modules.python.rabbitmq.host }} - mng_port: {{ .Values.modules.python.rabbitmq.mng_port }} - port: {{ .Values.modules.python.rabbitmq.port }} - user: {{ .Values.modules.python.rabbitmq.user }} - password: {{ .Values.modules.python.rabbitmq.password }} - # default conf/rabbitmq_route_table.yaml - route_table: conf/rabbitmq_route_table/rabbitmq_route_table.yaml - pulsar: - host: {{ .Values.modules.python.pulsar.host }} - port: {{ .Values.modules.python.pulsar.port }} - mng_port: {{ .Values.modules.python.pulsar.mng_port }} - topic_ttl: 3 - # default conf/pulsar_route_table.yaml - route_table: conf/pulsar_route_table/pulsar_route_table.yaml - nginx: - host: {{ .Values.modules.python.nginx.host }} - http_port: {{ .Values.modules.python.nginx.http_port }} - grpc_port: {{ .Values.modules.python.nginx.grpc_port }} - fateboard: - host: fateboard - port: 8080 - # on API `/model/load` and `/model/load/do` - # automatic upload models to the model store if it exists locally but does not exist in the model storage - # or download models from the model store if it does not exist locally but exists in the model storage - # this config will not affect API `/model/store` or `/model/restore` - enable_model_store: false - model_store_address: - storage: mysql - name: {{ .Values.externalMysqlDatabase | default .Values.modules.mysql.database | default "eggroll_meta" }} - host: '{{ .Values.externalMysqlIp | default .Values.modules.mysql.ip | default "mysql" }}' - port: {{ .Values.externalMysqlPort | default .Values.modules.mysql.port | default "3306" }} - user: '{{ .Values.externalMysqlUser | default .Values.modules.mysql.user | default "fate" }}' - passwd: '{{ .Values.externalMysqlPassword | default .Values.modules.mysql.password | default "fate_dev" }}' - max_connections: 10 - stale_timeout: 10 - {{- with .Values.modules.serving }} - servings: - hosts: - {{- if and .ip .port}} - - '{{ .ip }}:{{ .port }}' - {{- else }} - - '' - {{- end }} - {{- if and .useRegistry .zookeeper }} - zookeeper: -{{ toYaml .zookeeper | indent 6 }} - {{- end }} - {{- end }} - transfer_conf.yaml: | - paths: # dir or path - - "python/federatedml/transfer_variable/auth_conf" - component_registry.json: | - { - "components": { - }, - "providers": { - }, - "default_settings": { - "fate_flow":{ - "default_version_key": "FATEFlow" - }, - "fate": { - "default_version_key": "FATE" - }, - "class_path": { - "interface": "components.components.Components", - "feature_instance": "feature.instance.Instance", - "feature_vector": "feature.sparse_vector.SparseVector", - "model": "protobuf.generated", - "model_migrate": "protobuf.model_migrate.model_migrate", - "homo_model_convert": "protobuf.homo_model_convert.homo_model_convert" - } - } - } - job_default_config.yaml: | - # component provider, relative path to get_fate_python_directory - default_component_provider_path: federatedml - - # resource - total_cores_overweight_percent: 1 # 1 means no overweight - total_memory_overweight_percent: 1 # 1 means no overweight - task_parallelism: 1 - task_cores: 4 - task_memory: 0 # mb - max_cores_percent_per_job: 1 # 1 means total - - # scheduling - job_timeout: 259200 # s - remote_request_timeout: 30000 # ms - federated_command_trys: 3 - end_status_job_scheduling_time_limit: 300000 # ms - end_status_job_scheduling_updates: 1 - auto_retries: 0 - auto_retry_delay: 1 #seconds - # It can also be specified in the job configuration using the federated_status_collect_type parameter - federated_status_collect_type: PUSH - - # upload - upload_max_bytes: 4194304000 # bytes - - #component output - output_data_summary_count_limit: 100 ---- -kind: ConfigMap -apiVersion: v1 -metadata: - name: fateboard-config - labels: - fateMoudle: fateboard -{{ include "fate.labels" . | indent 4 }} -data: - application.properties: | - server.port=8080 - fateflow.url=http://{{ if .Values.istio.enabled }}127.0.0.1{{ else }}fateflow{{ end }}:9380 - spring.datasource.driver-Class-Name=com.mysql.cj.jdbc.Driver - spring.http.encoding.charset=UTF-8 - spring.http.encoding.enabled=true - server.tomcat.uri-encoding=UTF-8 - fateboard.datasource.jdbc-url=jdbc:mysql://{{ .Values.externalMysqlIp | default .Values.modules.mysql.ip | default "mysql" }}:{{ .Values.externalMysqlPort | default .Values.modules.mysql.port | default "3306" }}/{{ .Values.externalMysqlDatabase | default .Values.modules.mysql.database | default "eggroll_meta" }}?characterEncoding=utf8&characterSetResults=utf8&autoReconnect=true&failOverReadOnly=false&serverTimezone=GMT%2B8 - fateboard.datasource.username={{ .Values.externalMysqlUser | default .Values.modules.mysql.user | default "fate" }} - fateboard.datasource.password={{ .Values.externalMysqlPassword | default .Values.modules.mysql.password | default "fate_dev" }} - server.tomcat.max-threads=1000 - server.tomcat.max-connections=20000 - spring.servlet.multipart.max-file-size=10MB - spring.servlet.multipart.max-request-size=100MB - spring.datasource.druid.filter.config.enabled=false - spring.datasource.druid.web-stat-filter.enabled=false - spring.datasource.druid.stat-view-servlet.enabled=false - server.compression.enabled=true - server.compression.mime-types=application/json,application/xml,text/html,text/xml,text/plain - server.board.login.username={{ .Values.modules.fateboard.username }} - server.board.login.password={{ .Values.modules.fateboard.password }} - #server.ssl.key-store=classpath: - #server.ssl.key-store-password= - #server.ssl.key-password= - #server.ssl.key-alias= - spring.session.store-type=jdbc - spring.session.jdbc.initialize-schema=always - #HTTP_APP_KEY= - #HTTP_SECRET_KEY= ---- -kind: ConfigMap -apiVersion: v1 -metadata: - name: pulsar-route-table - labels: - fateMoudle: python -{{ include "fate.labels" . | indent 4 }} -data: - pulsar_route_table.yaml: | - {{- with .Values.modules.pulsar.exchange }} - default: - proxy: "{{ .ip }}:{{ .port }}" - domain: "{{ .domain }}" - {{- end }} -{{- if .Values.modules.pulsar.route_table }} -{{- range $key, $val := .Values.modules.pulsar.route_table }} - {{ $key }}: -{{ toYaml . | indent 6 }} -{{- end }} -{{- else }} - {{ .Values.partyId }}: - host: pulsar - port: 6650 - sslPort: 6651 - proxy: "" -{{- end}} ---- -kind: ConfigMap -apiVersion: v1 -metadata: - name: rabbitmq-route-table - labels: - fateMoudle: python -{{ include "fate.labels" . | indent 4 }} -data: - rabbitmq_route_table.yaml: | -{{- if .Values.modules.rabbitmq.route_table }} -{{- range $key, $val := .Values.modules.rabbitmq.route_table }} - {{ $key }}: -{{ toYaml . | indent 6 }} -{{- end }} -{{- else }} - {{ .Values.partyId }}: - host: rabbitmq - port: 5672 -{{- end}} ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - name: python - labels: - fateMoudle: python -{{ include "fate.labels" . | indent 4 }} -spec: - replicas: 1 - strategy: - type: Recreate - selector: - matchLabels: - fateMoudle: python -{{ include "fate.matchLabels" . | indent 6 }} - template: - metadata: - labels: - fateMoudle: python -{{ include "fate.labels" . | indent 8 }} - spec: - {{- if .Values.istio.enabled }} - {{- else }} - initContainers: - {{- if .Values.image.isThridParty }} - - image: {{ .Values.image.registry }}/mysql:8 - {{- else }} - - image: mysql:8 - {{- end }} - imagePullPolicy: {{ .Values.image.pullPolicy }} - name: ping-mysql - env: - - name: MYSQL_DATABASE - value: "{{ .Values.externalMysqlDatabase | default .Values.modules.mysql.database | default "eggroll_meta" }}" - - name: MYSQL_USER - value: "{{ .Values.externalMysqlUser | default .Values.modules.mysql.user | default "fate" }}" - - name: MYSQL_PASSWORD - value: "{{ .Values.externalMysqlPassword | default .Values.modules.mysql.password | default "fate_dev" }}" - - name: MYSQL_HOST - value: "{{ .Values.externalMysqlIp | default .Values.modules.mysql.ip | default "mysql" }}" - - name: MYSQL_PORT - value: "{{ .Values.externalMysqlPort | default .Values.modules.mysql.port | default "3306" | }}" - command: - - /bin/bash - - -c - - | - set -x - function checkMySQL(){ - checkMySQLCount=0 - while true ; do - checkMySQLCount=$[checkMySQLCount+1] - echo "Waiting for mysql started. check count: $checkMySQLCount" - sleep 2 - - state=`mysqladmin ping -h ${MYSQL_HOST} --port=${MYSQL_PORT} -u${MYSQL_USER} -p${MYSQL_PASSWORD}| awk '{print $3}'` - if [ "$state" == "alive" ]; then - echo "mysql server has been already started." - break - fi - done - } - echo "Waiting for mysql started..." - checkMySQL - {{- end }} - containers: - - name: python - {{- if eq .Values.modules.python.backend "spark_pulsar" "spark_rabbitmq" "spark_local_pulsar" }} - image: {{ .Values.image.registry }}/python-spark:{{ .Values.image.tag }} - {{- else }} - image: {{ .Values.image.registry }}/{{ if .Values.modules.python.enabledNN }}python-nn{{ else }}python{{ end }}:{{ .Values.image.tag }} - {{- end }} - imagePullPolicy: {{ .Values.image.pullPolicy }} - {{- if .Values.modules.python.resources}} - resources: - {{- range $key, $val := .Values.modules.python.resources }} - {{ $key }}: -{{ toYaml $val | indent 14 }} - {{- end }} - {{- end }} - env: - - name: POD_IP - valueFrom: - fieldRef: - fieldPath: status.podIP - - name: FATE_LOG_LEVEL - value: {{ .Values.modules.python.logLevel }} - - name: PYTHONPATH - value: "$PYTHONPATH:/data/projects/fate/fate/python:/data/projects/fate/eggroll/python:/data/projects/fate/fateflow/python:/data/projects/fate/fate/python/fate_client" - - name: FATE_PROJECT_BASE - value: "/data/projects/fate" - {{- if eq .Values.modules.python.backend "spark_pulsar" "spark_rabbitmq" }} - - name: FATE_FLOW_UPLOAD_MAX_NUM - value: "1000000" - - name: FATE_FLOW_UPLOAD_MAX_BYTES - value: "104868093952" - {{- end }} - ports: - - containerPort: 9360 - - containerPort: 9380 - command: - - /bin/bash - - -c - - | - set -x - mkdir -p /data/projects/fate/conf/ - cp /data/projects/fate/conf-tmp/transfer_conf.yaml /data/projects/fate/conf/transfer_conf.yaml - cp /data/projects/fate/conf-tmp/service_conf.yaml /data/projects/fate/conf/service_conf.yaml - cp /data/projects/fate/conf-tmp/component_registry.json /data/projects/fate/conf/component_registry.json - cp /data/projects/fate/conf-tmp/job_default_config.yaml /data/projects/fate/conf/job_default_config.yaml - # fix fateflow conf must use IP - sed -i "s/host: fateflow/host: ${POD_IP}/g" /data/projects/fate/conf/service_conf.yaml - - cp /data/projects/spark-2.4.1-bin-hadoop2.7/conf/spark-defaults-template.conf /data/projects/spark-2.4.1-bin-hadoop2.7/conf/spark-defaults.conf - sed -i "s/fateflow/${POD_IP}/g" /data/projects/spark-2.4.1-bin-hadoop2.7/conf/spark-defaults.conf - - sleep 5 && python fateflow/python/fate_flow/fate_flow_server.py - volumeMounts: - - mountPath: /data/projects/fate/eggroll/conf/eggroll.properties - name: eggroll-confs - subPath: eggroll.properties - - name: python-data - mountPath: /data/projects/fate/fateflow/logs - subPath: logs - - mountPath: /data/projects/fate/conf-tmp/ - name: python-confs - - mountPath: /data/projects/spark-2.4.1-bin-hadoop2.7/conf/spark-defaults-template.conf - name: python-confs - subPath: spark-defaults.conf - - mountPath: /data/projects/fate/conf/rabbitmq_route_table - name: rabbitmq-route-table - - mountPath: /data/projects/fate/conf/pulsar_route_table - name: pulsar-route-table - # TODO add mountPath of job and model-cache - - mountPath: /data/projects/fate/jobs - name: python-data - subPath: jobs - - mountPath: /data/projects/fate/model_local_cache - name: python-data - subPath: model-local-cache - {{- if .Values.modules.fateboard.include }} - - image: {{ .Values.image.registry }}/fateboard:{{ .Values.image.tag }} - imagePullPolicy: {{ .Values.image.pullPolicy }} - name: fateboard - ports: - - containerPort: 8080 - volumeMounts: - - mountPath: /data/projects/fate/fateboard/conf/application.properties - name: fateboard-confs - subPath: application.properties - - name: python-data - mountPath: /data/projects/fate/fateflow/logs - subPath: logs - {{- end }} - {{- with .Values.modules.python.nodeSelector }} - nodeSelector: -{{ toYaml . | indent 8 }} - {{- end }} - {{- with .Values.modules.python.tolerations }} - tolerations: -{{ toYaml . | indent 8 }} - {{- end }} - {{- with .Values.modules.python.affinity }} - affinity: -{{ toYaml . | indent 8 }} - {{- end }} - {{- with .Values.image.imagePullSecrets }} - imagePullSecrets: -{{ toYaml . | indent 6 }} - {{- end }} -{{- if .Values.modules.python.serviceAccountName }} - serviceAccountName: {{ .Values.modules.python.serviceAccountName }} -{{- else }} - serviceAccountName: {{ template "serviceAccountName" . }} -{{- end }} - restartPolicy: Always - volumes: - - name: eggroll-confs - configMap: - name: eggroll-config - - name: python-confs - configMap: - name: python-config - - name: rabbitmq-route-table - configMap: - name: rabbitmq-route-table - - name: pulsar-route-table - configMap: - name: pulsar-route-table - - name: fateboard-confs - configMap: - name: fateboard-config - {{- if not .Values.persistence.enabled }} - - name: python-data - emptyDir: {} - {{- else }} - - name: python-data - persistentVolumeClaim: - claimName: {{ .Values.modules.python.existingClaim | default "python-data" }} - {{- end }} ---- -apiVersion: v1 -kind: Service -metadata: - name: fateflow - labels: - fateMoudle: fateflow -{{ include "fate.labels" . | indent 4 }} -spec: - ports: - - name: "tcp-grpc" - port: 9360 - targetPort: 9360 - protocol: TCP - - name: "tcp-http" - port: 9380 - targetPort: 9380 - protocol: TCP - type: ClusterIP - clusterIP: None - selector: - fateMoudle: python -{{ include "fate.matchLabels" . | indent 4 }} ---- -apiVersion: v1 -kind: Service -metadata: - name: fateflow-client - labels: - fateMoudle: fateflow -{{ include "fate.labels" . | indent 4 }} -spec: - ports: - - name: "tcp-grpc" - port: 9360 - targetPort: 9360 - {{- if eq .Values.modules.python.type "NodePort" "LoadBalancer" }} - nodePort: {{ .Values.modules.python.grpcNodePort }} - {{- end }} - protocol: TCP - - name: "tcp-http" - port: 9380 - targetPort: 9380 - {{- if eq .Values.modules.python.type "NodePort" "LoadBalancer" }} - nodePort: {{ .Values.modules.python.httpNodePort }} - {{- end }} - protocol: TCP - type: {{ .Values.modules.python.type }} - - {{- if .Values.modules.python.loadBalancerIP }} - loadBalancerIP: "{{ .Values.modules.python.loadBalancerIP }}" - {{- end }} - - selector: - fateMoudle: python -{{ include "fate.matchLabels" . | indent 4 }} ---- -{{- if and .Values.modules.python.spark.portMaxRetries (ne (print .Values.modules.python.spark.driverHost) "fateflow") }} -apiVersion: v1 -kind: Service -metadata: - name: fateflow-sparkdriver - labels: - fateMoudle: python -{{ include "fate.labels" . | indent 4 }} -spec: - ports: - {{ $spark := .Values.modules.python.spark }} - {{- range .Values.modules.python.spark.portMaxRetries | int | until }} - - name: "spark-driver-port-{{ . }}" - port: {{ $spark.driverStartPort | int | add . }} - targetPort: {{ $spark.driverStartPort | int | add . }} - {{- if eq $spark.driverHostType "NodePort" "LoadBalancer" }} - nodePort: {{ $spark.driverStartPort | int | add . }} - {{- end }} - protocol: TCP - - name: "spark-block-manager-port-{{ . }}" - port: {{ $spark.blockManagerStartPort | int | add . }} - targetPort: {{ $spark.blockManagerStartPort | int | add . }} - {{- if eq $spark.driverHostType "NodePort" "LoadBalancer" }} - nodePort: {{ $spark.blockManagerStartPort | int | add . }} - {{- end }} - protocol: TCP - {{- end }} - type: {{ .Values.modules.python.spark.driverHostType }} - selector: - fateMoudle: python -{{ include "fate.matchLabels" . | indent 4 }} ---- -{{- end }} - -{{- if .Values.modules.fateboard.include }} -apiVersion: v1 -kind: Service -metadata: - name: fateboard - labels: - fateMoudle: python -{{ include "fate.labels" . | indent 4 }} -spec: - ports: - - name: "tcp-fateboard" - port: 8080 - targetPort: 8080 - protocol: TCP - type: {{ .Values.modules.fateboard.type }} - selector: - fateMoudle: python -{{ include "fate.matchLabels" . | indent 4 }} ---- -{{- end }} -{{- if and .Values.persistence.enabled (not .Values.modules.python.existingClaim) }} -kind: PersistentVolumeClaim -apiVersion: v1 -metadata: - name: python-data - labels: - fateMoudle: python -{{ include "fate.labels" . | indent 4 }} -spec: - accessModes: - - {{ .Values.modules.python.accessMode }} - resources: - requests: - storage: {{ .Values.modules.python.size }} - {{- if .Values.modules.python.storageClass }} - {{- if eq "-" .Values.modules.python.storageClass }} - storageClassName: "" - {{- else }} - storageClassName: {{ .Values.modules.python.storageClass }} - {{- end }} - {{- end }} -{{- end }} -{{ end }} diff --git a/helm-charts/FATE/templates/role.yaml b/helm-charts/FATE/templates/role.yaml index bc32aac6f..aa038761e 100644 --- a/helm-charts/FATE/templates/role.yaml +++ b/helm-charts/FATE/templates/role.yaml @@ -1,3 +1,14 @@ +# Copyright 2019-2022 VMware, Inc. +# 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. + {{- if .Values.podSecurityPolicy.enabled -}} apiVersion: rbac.authorization.k8s.io/v1 kind: Role diff --git a/helm-charts/FATE/templates/rolebinding.yaml b/helm-charts/FATE/templates/rolebinding.yaml index 04cd276aa..217dec72c 100644 --- a/helm-charts/FATE/templates/rolebinding.yaml +++ b/helm-charts/FATE/templates/rolebinding.yaml @@ -1,3 +1,14 @@ +# Copyright 2019-2022 VMware, Inc. +# 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. + {{- if .Values.podSecurityPolicy.enabled -}} apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding diff --git a/helm-charts/FATE/templates/serviceaccount.yaml b/helm-charts/FATE/templates/serviceaccount.yaml index da81ad95a..d03e186c2 100644 --- a/helm-charts/FATE/templates/serviceaccount.yaml +++ b/helm-charts/FATE/templates/serviceaccount.yaml @@ -1,3 +1,14 @@ +# Copyright 2019-2022 VMware, Inc. +# 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. + {{- if .Values.podSecurityPolicy.enabled -}} apiVersion: v1 kind: ServiceAccount diff --git a/helm-charts/FATE/values-template-example.yaml b/helm-charts/FATE/values-template-example.yaml index d385e2b7a..4a7778de4 100644 --- a/helm-charts/FATE/values-template-example.yaml +++ b/helm-charts/FATE/values-template-example.yaml @@ -1,7 +1,7 @@ name: fate-9999 namespace: fate-9999 chartName: fate -chartVersion: v1.7.2 +chartVersion: v1.7.2-a partyId: 9999 registry: "" imageTag: "1.7.2-release" diff --git a/helm-charts/Images_list.md b/helm-charts/Images_list.md new file mode 100644 index 000000000..971d357fd --- /dev/null +++ b/helm-charts/Images_list.md @@ -0,0 +1,38 @@ +All images required to deploy the chart are recorded here. + + + +FATE: + +- federatedai/python-spark:${version-tag} +- mysql:8 +- federatedai/fateboard:${version-tag} +- federatedai/client:${version-tag} +- federatedai/eggroll:${version-tag} +- fluent/fluentd:v1.12 +- federatedai/spark-master:${version-tag} +- federatedai/spark-worker:${version-tag} +- hadoop-datanode:2.0.0-hadoop2.7.4-java8 +- hadoop-namenode:2.0.0-hadoop2.7.4-java8 +- nginx:1.17 +- federatedai/nginx:${version-tag} +- rabbitmq:3.8.3-management +- pulsar:2.7.0 + + + +FATE-Serving + +- federatedai/serving-server:${version-tag} +- federatedai/serving-proxy:${version-tag} +- redis:5 +- federatedai/serving-admin:${version-tag} +- bitnami/zookeeper:3.7.0 + + + +FATE-Exchange + +- federatedai/eggroll:${version-tag} +- federatedai/trafficserver +- federatedai/nginx \ No newline at end of file From 6dc140be9e18f2f3ac95129ce968a4dafd6cb9a4 Mon Sep 17 00:00:00 2001 From: ChenLong Ma Date: Sun, 20 Mar 2022 01:11:20 +0800 Subject: [PATCH 02/14] Fix the FATE task failure caused by not setting fateflow loglevel (#559) Signed-off-by: owlet42 --- .../FATE/templates/core/python-spark.yaml | 2 + k8s-deploy/examples/config.sh | 100 +++++++++--------- .../cluster-spark-local-pulsar.yaml | 1 + .../party-10000/cluster-spark-pulsar.yaml | 1 + .../party-10000/cluster-spark-rabbitmq.yaml | 1 + k8s-deploy/examples/party-10000/cluster.yaml | 1 + .../cluster-spark-local-pulsar.yaml | 1 + .../party-9999/cluster-spark-pulsar.yaml | 1 + .../party-9999/cluster-spark-rabbitmq.yaml | 1 + k8s-deploy/examples/party-9999/cluster.yaml | 1 + k8s-deploy/examples/party-9999/toy-test.sh | 39 ------- 11 files changed, 60 insertions(+), 89 deletions(-) delete mode 100644 k8s-deploy/examples/party-9999/toy-test.sh diff --git a/helm-charts/FATE/templates/core/python-spark.yaml b/helm-charts/FATE/templates/core/python-spark.yaml index bda83fb47..7347b821d 100644 --- a/helm-charts/FATE/templates/core/python-spark.yaml +++ b/helm-charts/FATE/templates/core/python-spark.yaml @@ -94,8 +94,10 @@ spec: valueFrom: fieldRef: fieldPath: status.podIP + {{- if .Values.modules.python.logLevel }} - name: FATE_LOG_LEVEL value: {{ .Values.modules.python.logLevel }} + {{- end }} - name: PYTHONPATH value: "$PYTHONPATH:/data/projects/fate/fate/python:/data/projects/fate/eggroll/python:/data/projects/fate/fateflow/python:/data/projects/fate/fate/python/fate_client" - name: FATE_PROJECT_BASE diff --git a/k8s-deploy/examples/config.sh b/k8s-deploy/examples/config.sh index 25a1b45cd..9603a4693 100644 --- a/k8s-deploy/examples/config.sh +++ b/k8s-deploy/examples/config.sh @@ -11,73 +11,73 @@ echo ${party_10000_IP} echo ${party_exchange_IP} # 9999 config -sed -i "s/chartVersion: .*/chartVersion: ${fate_chartVersion}/g" ./party-9999/cluster.yaml -sed -i "s/chartVersion: .*/chartVersion: ${fate_serving_chartVersion}/g" ./party-9999/cluster-serving.yaml -sed -i "s/chartVersion: .*/chartVersion: ${fate_chartVersion}/g" ./party-9999/cluster-spark-rabbitmq.yaml -sed -i "s/chartVersion: .*/chartVersion: ${fate_chartVersion}/g" ./party-9999/cluster-spark-pulsar.yaml +sed -i "" "s/chartVersion: .*/chartVersion: ${fate_chartVersion}/g" party-9999/cluster.yaml +sed -i "" "s/chartVersion: .*/chartVersion: ${fate_serving_chartVersion}/g" ./party-9999/cluster-serving.yaml +sed -i "" "s/chartVersion: .*/chartVersion: ${fate_chartVersion}/g" ./party-9999/cluster-spark-rabbitmq.yaml +sed -i "" "s/chartVersion: .*/chartVersion: ${fate_chartVersion}/g" ./party-9999/cluster-spark-pulsar.yaml -sed -i "s/imageTag: .*/imageTag: ${fate_imageTAG}/g" ./party-9999/cluster.yaml -sed -i "s/imageTag: .*/imageTag: ${fate_serving_imageTAG}/g" ./party-9999/cluster-serving.yaml -sed -i "s/imageTag: .*/imageTag: ${fate_imageTAG}/g" ./party-9999/cluster-spark-rabbitmq.yaml -sed -i "s/imageTag: .*/imageTag: ${fate_imageTAG}/g" ./party-9999/cluster-spark-pulsar.yaml +sed -i "" "s/imageTag: .*/imageTag: ${fate_imageTAG}/g" ./party-9999/cluster.yaml +sed -i "" "s/imageTag: .*/imageTag: ${fate_serving_imageTAG}/g" ./party-9999/cluster-serving.yaml +sed -i "" "s/imageTag: .*/imageTag: ${fate_imageTAG}/g" ./party-9999/cluster-spark-rabbitmq.yaml +sed -i "" "s/imageTag: .*/imageTag: ${fate_imageTAG}/g" ./party-9999/cluster-spark-pulsar.yaml -sed -i "s/192.168.9.1/${party_9999_IP}/g" ./party-9999/cluster.yaml -sed -i "s/192.168.9.1/${party_9999_IP}/g" ./party-9999/cluster-serving.yaml -sed -i "s/192.168.9.1/${party_9999_IP}/g" ./party-9999/cluster-spark-rabbitmq.yaml -sed -i "s/192.168.9.1/${party_9999_IP}/g" ./party-9999/cluster-spark-pulsar.yaml +sed -i "" "s/192.168.9.1/${party_9999_IP}/g" ./party-9999/cluster.yaml +sed -i "" "s/192.168.9.1/${party_9999_IP}/g" ./party-9999/cluster-serving.yaml +sed -i "" "s/192.168.9.1/${party_9999_IP}/g" ./party-9999/cluster-spark-rabbitmq.yaml +sed -i "" "s/192.168.9.1/${party_9999_IP}/g" ./party-9999/cluster-spark-pulsar.yaml -sed -i "s/192.168.10.1/${party_10000_IP}/g" ./party-9999/cluster.yaml -sed -i "s/192.168.10.1/${party_10000_IP}/g" ./party-9999/cluster-serving.yaml -sed -i "s/192.168.10.1/${party_10000_IP}/g" ./party-9999/cluster-spark-rabbitmq.yaml -sed -i "s/192.168.10.1/${party_10000_IP}/g" ./party-9999/cluster-spark-pulsar.yaml +sed -i "" "s/192.168.10.1/${party_10000_IP}/g" ./party-9999/cluster.yaml +sed -i "" "s/192.168.10.1/${party_10000_IP}/g" ./party-9999/cluster-serving.yaml +sed -i "" "s/192.168.10.1/${party_10000_IP}/g" ./party-9999/cluster-spark-rabbitmq.yaml +sed -i "" "s/192.168.10.1/${party_10000_IP}/g" ./party-9999/cluster-spark-pulsar.yaml -sed -i "s/192.168.0.1/${party_exchange_IP}/g" ./party-9999/cluster.yaml -sed -i "s/192.168.0.1/${party_exchange_IP}/g" ./party-9999/cluster-serving.yaml -sed -i "s/192.168.0.1/${party_exchange_IP}/g" ./party-9999/cluster-spark-rabbitmq.yaml -sed -i "s/192.168.0.1/${party_exchange_IP}/g" ./party-9999/cluster-spark-pulsar.yaml +sed -i "" "s/192.168.0.1/${party_exchange_IP}/g" ./party-9999/cluster.yaml +sed -i "" "s/192.168.0.1/${party_exchange_IP}/g" ./party-9999/cluster-serving.yaml +sed -i "" "s/192.168.0.1/${party_exchange_IP}/g" ./party-9999/cluster-spark-rabbitmq.yaml +sed -i "" "s/192.168.0.1/${party_exchange_IP}/g" ./party-9999/cluster-spark-pulsar.yaml # 10000 config -sed -i "s/chartVersion: .*/chartVersion: ${fate_chartVersion}/g" ./party-10000/cluster.yaml -sed -i "s/chartVersion: .*/chartVersion: ${fate_serving_chartVersion}/g" ./party-10000/cluster-serving.yaml -sed -i "s/chartVersion: .*/chartVersion: ${fate_chartVersion}/g" ./party-10000/cluster-spark-rabbitmq.yaml -sed -i "s/chartVersion: .*/chartVersion: ${fate_chartVersion}/g" ./party-10000/cluster-spark-pulsar.yaml +sed -i "" "s/chartVersion: .*/chartVersion: ${fate_chartVersion}/g" ./party-10000/cluster.yaml +sed -i "" "s/chartVersion: .*/chartVersion: ${fate_serving_chartVersion}/g" ./party-10000/cluster-serving.yaml +sed -i "" "s/chartVersion: .*/chartVersion: ${fate_chartVersion}/g" ./party-10000/cluster-spark-rabbitmq.yaml +sed -i "" "s/chartVersion: .*/chartVersion: ${fate_chartVersion}/g" ./party-10000/cluster-spark-pulsar.yaml -sed -i "s/imageTag: .*/imageTag: ${fate_imageTAG}/g" ./party-10000/cluster.yaml -sed -i "s/imageTag: .*/imageTag: ${fate_serving_imageTAG}/g" ./party-10000/cluster-serving.yaml -sed -i "s/imageTag: .*/imageTag: ${fate_imageTAG}/g" ./party-10000/cluster-spark-rabbitmq.yaml -sed -i "s/imageTag: .*/imageTag: ${fate_imageTAG}/g" ./party-10000/cluster-spark-pulsar.yaml +sed -i "" "s/imageTag: .*/imageTag: ${fate_imageTAG}/g" ./party-10000/cluster.yaml +sed -i "" "s/imageTag: .*/imageTag: ${fate_serving_imageTAG}/g" ./party-10000/cluster-serving.yaml +sed -i "" "s/imageTag: .*/imageTag: ${fate_imageTAG}/g" ./party-10000/cluster-spark-rabbitmq.yaml +sed -i "" "s/imageTag: .*/imageTag: ${fate_imageTAG}/g" ./party-10000/cluster-spark-pulsar.yaml -sed -i "s/192.168.9.1/${party_9999_IP}/g" ./party-10000/cluster.yaml -sed -i "s/192.168.9.1/${party_9999_IP}/g" ./party-10000/cluster-serving.yaml -sed -i "s/192.168.9.1/${party_9999_IP}/g" ./party-10000/cluster-spark-rabbitmq.yaml -sed -i "s/192.168.9.1/${party_9999_IP}/g" ./party-10000/cluster-spark-pulsar.yaml +sed -i "" "s/192.168.9.1/${party_9999_IP}/g" ./party-10000/cluster.yaml +sed -i "" "s/192.168.9.1/${party_9999_IP}/g" ./party-10000/cluster-serving.yaml +sed -i "" "s/192.168.9.1/${party_9999_IP}/g" ./party-10000/cluster-spark-rabbitmq.yaml +sed -i "" "s/192.168.9.1/${party_9999_IP}/g" ./party-10000/cluster-spark-pulsar.yaml -sed -i "s/192.168.10.1/${party_10000_IP}/g" ./party-10000/cluster.yaml -sed -i "s/192.168.10.1/${party_10000_IP}/g" ./party-10000/cluster-serving.yaml -sed -i "s/192.168.10.1/${party_10000_IP}/g" ./party-10000/cluster-spark-rabbitmq.yaml -sed -i "s/192.168.10.1/${party_10000_IP}/g" ./party-10000/cluster-spark-pulsar.yaml +sed -i "" "s/192.168.10.1/${party_10000_IP}/g" ./party-10000/cluster.yaml +sed -i "" "s/192.168.10.1/${party_10000_IP}/g" ./party-10000/cluster-serving.yaml +sed -i "" "s/192.168.10.1/${party_10000_IP}/g" ./party-10000/cluster-spark-rabbitmq.yaml +sed -i "" "s/192.168.10.1/${party_10000_IP}/g" ./party-10000/cluster-spark-pulsar.yaml -sed -i "s/192.168.0.1/${party_exchange_IP}/g" ./party-10000/cluster.yaml -sed -i "s/192.168.0.1/${party_exchange_IP}/g" ./party-10000/cluster-serving.yaml -sed -i "s/192.168.0.1/${party_exchange_IP}/g" ./party-10000/cluster-spark-rabbitmq.yaml -sed -i "s/192.168.0.1/${party_exchange_IP}/g" ./party-10000/cluster-spark-pulsar.yaml +sed -i "" "s/192.168.0.1/${party_exchange_IP}/g" ./party-10000/cluster.yaml +sed -i "" "s/192.168.0.1/${party_exchange_IP}/g" ./party-10000/cluster-serving.yaml +sed -i "" "s/192.168.0.1/${party_exchange_IP}/g" ./party-10000/cluster-spark-rabbitmq.yaml +sed -i "" "s/192.168.0.1/${party_exchange_IP}/g" ./party-10000/cluster-spark-pulsar.yaml # exchange config -sed -i "s/chartVersion: .*/chartVersion: ${chartVersion}/g" ./party-exchange/rollsite.yaml -sed -i "s/chartVersion: .*/chartVersion: ${chartVersion}/g" ./party-exchange/trafficServer.yaml +sed -i "" "s/chartVersion: .*/chartVersion: ${chartVersion}/g" ./party-exchange/rollsite.yaml +sed -i "" "s/chartVersion: .*/chartVersion: ${chartVersion}/g" ./party-exchange/trafficServer.yaml -sed -i "s/imageTag: .*/imageTag: ${fate_imageTAG}/g" ./party-exchange/rollsite.yaml -sed -i "s/imageTag: .*/imageTag: ${fate_imageTAG}/g" ./party-exchange/trafficServer.yaml +sed -i "" "s/imageTag: .*/imageTag: ${fate_imageTAG}/g" ./party-exchange/rollsite.yaml +sed -i "" "s/imageTag: .*/imageTag: ${fate_imageTAG}/g" ./party-exchange/trafficServer.yaml -sed -i "s/192.168.9.1/${party_9999_IP}/g" ./party-exchange/rollsite.yaml -sed -i "s/192.168.9.1/${party_9999_IP}/g" ./party-exchange/trafficServer.yaml +sed -i "" "s/192.168.9.1/${party_9999_IP}/g" ./party-exchange/rollsite.yaml +sed -i "" "s/192.168.9.1/${party_9999_IP}/g" ./party-exchange/trafficServer.yaml -sed -i "s/192.168.10.1/${party_10000_IP}/g" ./party-exchange/rollsite.yaml -sed -i "s/192.168.10.1/${party_10000_IP}/g" ./party-exchange/trafficServer.yaml +sed -i "" "s/192.168.10.1/${party_10000_IP}/g" ./party-exchange/rollsite.yaml +sed -i "" "s/192.168.10.1/${party_10000_IP}/g" ./party-exchange/trafficServer.yaml -sed -i "s/192.168.0.1/${party_exchange_IP}/g" ./party-exchange/rollsite.yaml -sed -i "s/192.168.0.1/${party_exchange_IP}/g" ./party-exchange/trafficServer.yaml +sed -i "" "s/192.168.0.1/${party_exchange_IP}/g" ./party-exchange/rollsite.yaml +sed -i "" "s/192.168.0.1/${party_exchange_IP}/g" ./party-exchange/trafficServer.yaml diff --git a/k8s-deploy/examples/party-10000/cluster-spark-local-pulsar.yaml b/k8s-deploy/examples/party-10000/cluster-spark-local-pulsar.yaml index b95b196a5..7b1416338 100644 --- a/k8s-deploy/examples/party-10000/cluster-spark-local-pulsar.yaml +++ b/k8s-deploy/examples/party-10000/cluster-spark-local-pulsar.yaml @@ -49,6 +49,7 @@ python: type: NodePort httpNodePort: 30107 grpcNodePort: 30102 + logLevel: INFO servingIp: 192.168.10.1 servingPort: 30105 diff --git a/k8s-deploy/examples/party-10000/cluster-spark-pulsar.yaml b/k8s-deploy/examples/party-10000/cluster-spark-pulsar.yaml index 8bb3aa910..ec962fc62 100644 --- a/k8s-deploy/examples/party-10000/cluster-spark-pulsar.yaml +++ b/k8s-deploy/examples/party-10000/cluster-spark-pulsar.yaml @@ -51,6 +51,7 @@ python: type: NodePort httpNodePort: 30107 grpcNodePort: 30102 + logLevel: INFO servingIp: 192.168.10.1 servingPort: 30105 diff --git a/k8s-deploy/examples/party-10000/cluster-spark-rabbitmq.yaml b/k8s-deploy/examples/party-10000/cluster-spark-rabbitmq.yaml index e6c65e904..2697ccf35 100644 --- a/k8s-deploy/examples/party-10000/cluster-spark-rabbitmq.yaml +++ b/k8s-deploy/examples/party-10000/cluster-spark-rabbitmq.yaml @@ -51,6 +51,7 @@ python: type: NodePort httpNodePort: 30107 grpcNodePort: 30102 + logLevel: INFO servingIp: 192.168.10.1 servingPort: 30105 diff --git a/k8s-deploy/examples/party-10000/cluster.yaml b/k8s-deploy/examples/party-10000/cluster.yaml index 11af5322d..2c6705a71 100644 --- a/k8s-deploy/examples/party-10000/cluster.yaml +++ b/k8s-deploy/examples/party-10000/cluster.yaml @@ -48,6 +48,7 @@ python: type: NodePort httpNodePort: 30107 grpcNodePort: 30102 + logLevel: INFO servingIp: 192.168.10.1 servingPort: 30105 diff --git a/k8s-deploy/examples/party-9999/cluster-spark-local-pulsar.yaml b/k8s-deploy/examples/party-9999/cluster-spark-local-pulsar.yaml index 017525484..a435735f1 100644 --- a/k8s-deploy/examples/party-9999/cluster-spark-local-pulsar.yaml +++ b/k8s-deploy/examples/party-9999/cluster-spark-local-pulsar.yaml @@ -49,6 +49,7 @@ python: type: NodePort httpNodePort: 30097 grpcNodePort: 30092 + logLevel: INFO servingIp: 192.168.9.1 servingPort: 30095 diff --git a/k8s-deploy/examples/party-9999/cluster-spark-pulsar.yaml b/k8s-deploy/examples/party-9999/cluster-spark-pulsar.yaml index cdfe28827..d2ae589a0 100644 --- a/k8s-deploy/examples/party-9999/cluster-spark-pulsar.yaml +++ b/k8s-deploy/examples/party-9999/cluster-spark-pulsar.yaml @@ -51,6 +51,7 @@ python: type: NodePort httpNodePort: 30097 grpcNodePort: 30092 + logLevel: INFO servingIp: 192.168.9.1 servingPort: 30095 diff --git a/k8s-deploy/examples/party-9999/cluster-spark-rabbitmq.yaml b/k8s-deploy/examples/party-9999/cluster-spark-rabbitmq.yaml index ff62bb225..f094a5415 100644 --- a/k8s-deploy/examples/party-9999/cluster-spark-rabbitmq.yaml +++ b/k8s-deploy/examples/party-9999/cluster-spark-rabbitmq.yaml @@ -51,6 +51,7 @@ python: type: NodePort httpNodePort: 30097 grpcNodePort: 30092 + logLevel: INFO servingIp: 192.168.9.1 servingPort: 30095 diff --git a/k8s-deploy/examples/party-9999/cluster.yaml b/k8s-deploy/examples/party-9999/cluster.yaml index 8d6e21828..cf4d21b75 100644 --- a/k8s-deploy/examples/party-9999/cluster.yaml +++ b/k8s-deploy/examples/party-9999/cluster.yaml @@ -48,6 +48,7 @@ python: type: NodePort httpNodePort: 30097 grpcNodePort: 30092 + logLevel: INFO servingIp: 192.168.9.1 servingPort: 30095 diff --git a/k8s-deploy/examples/party-9999/toy-test.sh b/k8s-deploy/examples/party-9999/toy-test.sh deleted file mode 100644 index 74899562d..000000000 --- a/k8s-deploy/examples/party-9999/toy-test.sh +++ /dev/null @@ -1,39 +0,0 @@ -#!/bin/bash - - - -kubectl exec -n fate-9999 -it svc/fateflow -c python -- bash -cd ../examples/toy_example/ -python run_toy_example.py 9999 10000 1 - - -# party Id 9999 - -kubectl -n fate-9999 exec -it svc/fateboard -c python -- bash - - -cd ../examples/toy_example/ -sed -i 's/ "backend": 0,/ "backend": 0,"spark_run": { "total-executor-cores": 12 },/g' toy_example_conf.json -sed -i 's/"partition": 48,/"partition": 4,/g' toy_example_conf.json -python run_toy_example.py 9999 10000 1 -b 1 - - - - -# serving - -kubectl -n fate-10000 exec -it svc/fateboard -c python -- bash - -cd fate_flow; -sed -i "s/\"work_mode\": .*/\"work_mode\": 1,/g" examples/upload_host.json; -sed -i "s/\"backend\": .*/\"backend\": 1,/g" examples/upload_host.json; -python fate_flow_client.py -f upload -c examples/upload_host.json - - -kubectl exec -it svc/fateflow -n fate-9999 -c python -- bash - - -cd fate_flow; -sed -i "s/\"work_mode\": .*/\"work_mode\": 1,/g" examples/upload_guest.json; -sed -i "s/\"backend\": .*/\"backend\": 1,/g" examples/upload_guest.json; -python fate_flow_client.py -f upload -c examples/upload_guest.json From 7475eedcfb23f118378452172eacb87b01b1344f Mon Sep 17 00:00:00 2001 From: ChenLong Ma Date: Sun, 20 Mar 2022 01:12:54 +0800 Subject: [PATCH 03/14] Fix getting "the server could not find the requested resource" when using `kubefate describe` (#553) * fix kubefate bug in k8s v1.22+ kubefate cluster describe got "the server could not find the requested resource" because k8s API 'networkingv1beta1' is deprecated Signed-off-by: ChenLong Ma Signed-off-by: owlet42 * Add version for bug Signed-off-by: ChenLong Ma Signed-off-by: owlet42 * fix Deployment resources in special states are not recognized. When the pod is in ImagePullBackOff Signed-off-by: ChenLong Ma Signed-off-by: owlet42 * fix swag api error Signed-off-by: owlet42 * update go.mod Signed-off-by: owlet42 Co-authored-by: Layne Peng --- k8s-deploy/Makefile | 6 +- k8s-deploy/docs/docs.go | 78 +++++++- k8s-deploy/docs/swagger.json | 68 +++++++ k8s-deploy/docs/swagger.yaml | 43 ++++- k8s-deploy/go.mod | 67 ++++--- k8s-deploy/go.sum | 248 ++++++++++++++++--------- k8s-deploy/kubefate.yaml | 2 +- k8s-deploy/pkg/api/user.go | 2 +- k8s-deploy/pkg/api/version.go | 2 +- k8s-deploy/pkg/service/info.go | 5 + k8s-deploy/pkg/service/kube/ingress.go | 14 +- k8s-deploy/pkg/service/kube_deploy.go | 20 +- k8s-deploy/pkg/service/kube_ingress.go | 5 - 13 files changed, 403 insertions(+), 157 deletions(-) diff --git a/k8s-deploy/Makefile b/k8s-deploy/Makefile index 17db76bc2..8b166d04c 100644 --- a/k8s-deploy/Makefile +++ b/k8s-deploy/Makefile @@ -1,5 +1,5 @@ NAME ?= federatedai/kubefate -VERSION ?= v1.4.3 +VERSION ?= v1.4.4 IMG ?= ${NAME}:${VERSION} ifeq (,$(shell go env GOBIN)) @@ -63,7 +63,7 @@ vet: go vet ./... # Generate swag API file swag: swag-bin - $(SWAG_BIN) init --parseDependency --parseInternal -g pkg/api/service.go + $(SWAG_BIN) init --parseDependency --parseInternal --parseDepth 1 -g pkg/api/service.go package: kubefate-without-swag mkdir -p tmp/kubefate; @@ -85,7 +85,7 @@ ifeq (, $(shell which swag)) SWAG_BIN_TMP_DIR=$$(mktemp -d) ;\ cd $$SWAG_BIN_TMP_DIR ;\ go mod init tmp ;\ - go install github.com/swaggo/swag/cmd/swag@latest ;\ + go install github.com/swaggo/swag/cmd/swag@v1.8.0 ;\ rm -rf $$SWAG_BIN_TMP_DIR ;\ } SWAG_BIN=$(GOBIN)/swag diff --git a/k8s-deploy/docs/docs.go b/k8s-deploy/docs/docs.go index a476886be..73fe8c218 100644 --- a/k8s-deploy/docs/docs.go +++ b/k8s-deploy/docs/docs.go @@ -4,7 +4,7 @@ package docs import "github.com/swaggo/swag" -const docTemplate_swagger = `{ +const docTemplate = `{ "schemes": {{ marshal .Schemes }}, "swagger": "2.0", "info": { @@ -1502,6 +1502,74 @@ const docTemplate_swagger = `{ }, "/user/{userId}": { "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "User" + ], + "summary": "Get user by userId", + "parameters": [ + { + "type": "string", + "description": "User", + "name": "userId", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "Authentication header", + "name": "Authorization", + "in": "header", + "required": true + } + ], + "responses": { + "200": { + "description": "Success", + "schema": { + "allOf": [ + { + "$ref": "#/definitions/api.JSONResult" + }, + { + "type": "object", + "properties": { + "data": { + "$ref": "#/definitions/modules.User" + } + } + } + ] + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/api.JSONERRORResult" + } + }, + "401": { + "description": "Unauthorized operation", + "schema": { + "$ref": "#/definitions/api.JSONERRORResult" + } + }, + "500": { + "description": "Internal server error", + "schema": { + "$ref": "#/definitions/api.JSONERRORResult" + } + } + } + }, + "delete": { "security": [ { "ApiKeyAuth": [] @@ -1975,8 +2043,8 @@ const docTemplate_swagger = `{ } }` -// SwaggerInfo_swagger holds exported Swagger Info so clients can modify it -var SwaggerInfo_swagger = &swag.Spec{ +// SwaggerInfo holds exported Swagger Info so clients can modify it +var SwaggerInfo = &swag.Spec{ Version: "v1", Host: "", BasePath: "/v1", @@ -1984,9 +2052,9 @@ var SwaggerInfo_swagger = &swag.Spec{ Title: "KubeFATE service API", Description: "This is a KubeFATE.", InfoInstanceName: "swagger", - SwaggerTemplate: docTemplate_swagger, + SwaggerTemplate: docTemplate, } func init() { - swag.Register(SwaggerInfo_swagger.InstanceName(), SwaggerInfo_swagger) + swag.Register(SwaggerInfo.InstanceName(), SwaggerInfo) } diff --git a/k8s-deploy/docs/swagger.json b/k8s-deploy/docs/swagger.json index 63d8d9df6..d059357ce 100644 --- a/k8s-deploy/docs/swagger.json +++ b/k8s-deploy/docs/swagger.json @@ -1494,6 +1494,74 @@ }, "/user/{userId}": { "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "User" + ], + "summary": "Get user by userId", + "parameters": [ + { + "type": "string", + "description": "User", + "name": "userId", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "Authentication header", + "name": "Authorization", + "in": "header", + "required": true + } + ], + "responses": { + "200": { + "description": "Success", + "schema": { + "allOf": [ + { + "$ref": "#/definitions/api.JSONResult" + }, + { + "type": "object", + "properties": { + "data": { + "$ref": "#/definitions/modules.User" + } + } + } + ] + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/api.JSONERRORResult" + } + }, + "401": { + "description": "Unauthorized operation", + "schema": { + "$ref": "#/definitions/api.JSONERRORResult" + } + }, + "500": { + "description": "Internal server error", + "schema": { + "$ref": "#/definitions/api.JSONERRORResult" + } + } + } + }, + "delete": { "security": [ { "ApiKeyAuth": [] diff --git a/k8s-deploy/docs/swagger.yaml b/k8s-deploy/docs/swagger.yaml index 0af899f4f..81ab4a968 100644 --- a/k8s-deploy/docs/swagger.yaml +++ b/k8s-deploy/docs/swagger.yaml @@ -1116,7 +1116,7 @@ paths: tags: - User /user/{userId}: - get: + delete: parameters: - description: User in: path @@ -1152,6 +1152,47 @@ paths: summary: Delete user by userId tags: - User + get: + parameters: + - description: User + in: path + name: userId + required: true + type: string + - description: Authentication header + in: header + name: Authorization + required: true + type: string + produces: + - application/json + responses: + "200": + description: Success + schema: + allOf: + - $ref: '#/definitions/api.JSONResult' + - properties: + data: + $ref: '#/definitions/modules.User' + type: object + "400": + description: Bad Request + schema: + $ref: '#/definitions/api.JSONERRORResult' + "401": + description: Unauthorized operation + schema: + $ref: '#/definitions/api.JSONERRORResult' + "500": + description: Internal server error + schema: + $ref: '#/definitions/api.JSONERRORResult' + security: + - ApiKeyAuth: [] + summary: Get user by userId + tags: + - User /user/login: post: consumes: diff --git a/k8s-deploy/go.mod b/k8s-deploy/go.mod index cfa483859..49124c888 100644 --- a/k8s-deploy/go.mod +++ b/k8s-deploy/go.mod @@ -5,7 +5,7 @@ go 1.17 require ( github.com/Masterminds/sprig/v3 v3.2.2 github.com/appleboy/gin-jwt/v2 v2.8.0 - github.com/gin-contrib/logger v0.2.1 + github.com/gin-contrib/logger v0.2.2 github.com/gin-gonic/gin v1.7.7 github.com/gofrs/flock v0.8.1 github.com/gosuri/uitable v0.0.4 @@ -17,19 +17,19 @@ require ( github.com/spf13/viper v1.10.1 github.com/swaggo/files v0.0.0-20210815190702-a29dd2bc99b2 github.com/swaggo/gin-swagger v1.4.1 - github.com/swaggo/swag v1.7.9 + github.com/swaggo/swag v1.8.0 github.com/urfave/cli/v2 v2.3.0 - golang.org/x/crypto v0.0.0-20220208050332-20e1d8d225ab - golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd + golang.org/x/crypto v0.0.0-20220307211146-efcb8507fb70 + golang.org/x/net v0.0.0-20220225172249-27dd8689420f gopkg.in/yaml.v2 v2.4.0 - gorm.io/driver/mysql v1.2.3 - gorm.io/driver/sqlite v1.2.6 - gorm.io/gorm v1.22.5 + gorm.io/driver/mysql v1.3.2 + gorm.io/driver/sqlite v1.3.1 + gorm.io/gorm v1.23.2 helm.sh/helm/v3 v3.8.0 - k8s.io/api v0.23.3 - k8s.io/apimachinery v0.23.3 - k8s.io/cli-runtime v0.23.3 - k8s.io/client-go v0.23.3 + k8s.io/api v0.23.4 + k8s.io/apimachinery v0.23.4 + k8s.io/cli-runtime v0.23.4 + k8s.io/client-go v0.23.4 sigs.k8s.io/yaml v1.3.0 ) @@ -41,19 +41,18 @@ require ( github.com/Masterminds/goutils v1.1.1 // indirect github.com/Masterminds/semver/v3 v3.1.1 // indirect github.com/Masterminds/squirrel v1.5.2 // indirect - github.com/Microsoft/hcsshim v0.9.2 // indirect github.com/PuerkitoBio/purell v1.1.1 // indirect github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 // indirect github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/cespare/xxhash/v2 v2.1.2 // indirect github.com/chai2010/gettext-go v0.0.0-20160711120539-c6fed771bfd5 // indirect - github.com/containerd/containerd v1.5.9 // indirect + github.com/containerd/containerd v1.6.1 // indirect github.com/cpuguy83/go-md2man/v2 v2.0.1 // indirect github.com/cyphar/filepath-securejoin v0.2.3 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/docker/cli v20.10.12+incompatible // indirect - github.com/docker/distribution v2.8.0+incompatible // indirect + github.com/docker/distribution v2.8.1+incompatible // indirect github.com/docker/docker v20.10.12+incompatible // indirect github.com/docker/docker-credential-helpers v0.6.4 // indirect github.com/docker/go-connections v0.4.0 // indirect @@ -73,11 +72,11 @@ require ( github.com/go-openapi/swag v0.21.1 // indirect github.com/go-playground/locales v0.14.0 // indirect github.com/go-playground/universal-translator v0.18.0 // indirect - github.com/go-playground/validator/v10 v10.10.0 // indirect + github.com/go-playground/validator/v10 v10.10.1 // indirect github.com/go-sql-driver/mysql v1.6.0 // indirect github.com/gobwas/glob v0.2.3 // indirect github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang-jwt/jwt/v4 v4.2.0 // indirect + github.com/golang-jwt/jwt/v4 v4.3.0 // indirect github.com/golang/protobuf v1.5.2 // indirect github.com/google/btree v1.0.1 // indirect github.com/google/go-cmp v0.5.7 // indirect @@ -95,19 +94,19 @@ require ( github.com/jinzhu/now v1.1.4 // indirect github.com/jmoiron/sqlx v1.3.4 // indirect github.com/josharian/intern v1.0.0 // indirect - github.com/klauspost/compress v1.14.2 // indirect + github.com/klauspost/compress v1.15.0 // indirect github.com/kylelemons/godebug v1.1.0 // indirect github.com/lann/builder v0.0.0-20180802200727-47ae307949d0 // indirect github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0 // indirect github.com/leodido/go-urn v1.2.1 // indirect github.com/lib/pq v1.10.4 // indirect github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de // indirect - github.com/magiconair/properties v1.8.5 // indirect + github.com/magiconair/properties v1.8.6 // indirect github.com/mailru/easyjson v0.7.7 // indirect github.com/mattn/go-colorable v0.1.12 // indirect github.com/mattn/go-isatty v0.0.14 // indirect github.com/mattn/go-runewidth v0.0.13 // indirect - github.com/mattn/go-sqlite3 v1.14.11 // indirect + github.com/mattn/go-sqlite3 v1.14.12 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/go-wordwrap v1.0.1 // indirect @@ -131,7 +130,7 @@ require ( github.com/prometheus/common v0.32.1 // indirect github.com/prometheus/procfs v0.7.3 // indirect github.com/rivo/uniseg v0.2.0 // indirect - github.com/rubenv/sql-migrate v1.1.0 // indirect + github.com/rubenv/sql-migrate v1.1.1 // indirect github.com/russross/blackfriday v1.6.0 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect github.com/shopspring/decimal v1.3.1 // indirect @@ -143,36 +142,36 @@ require ( github.com/spf13/pflag v1.0.5 // indirect github.com/stretchr/testify v1.7.0 // indirect github.com/subosito/gotenv v1.2.0 // indirect - github.com/ugorji/go/codec v1.2.6 // indirect + github.com/ugorji/go/codec v1.2.7 // indirect github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect github.com/xeipuuv/gojsonschema v1.2.0 // indirect github.com/xlab/treeprint v1.1.0 // indirect - go.starlark.net v0.0.0-20220203230714-bb14e151c28f // indirect - golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8 // indirect + go.starlark.net v0.0.0-20220302181546-5411bad688d1 // indirect + golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a // indirect golang.org/x/sync v0.0.0-20210220032951-036812b2e83c // indirect - golang.org/x/sys v0.0.0-20220207234003-57398862261d // indirect + golang.org/x/sys v0.0.0-20220310020820-b874c991c1a5 // indirect golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 // indirect golang.org/x/text v0.3.7 // indirect - golang.org/x/time v0.0.0-20211116232009-f0f3c7e86c11 // indirect + golang.org/x/time v0.0.0-20220224211638-0e9765cccd65 // indirect golang.org/x/tools v0.1.9 // indirect google.golang.org/appengine v1.6.7 // indirect - google.golang.org/genproto v0.0.0-20220207185906-7721543eae58 // indirect - google.golang.org/grpc v1.44.0 // indirect + google.golang.org/genproto v0.0.0-20220308174144-ae0e22291548 // indirect + google.golang.org/grpc v1.45.0 // indirect google.golang.org/protobuf v1.27.1 // indirect gopkg.in/inf.v0 v0.9.1 // indirect - gopkg.in/ini.v1 v1.66.3 // indirect + gopkg.in/ini.v1 v1.66.4 // indirect gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b // indirect - k8s.io/apiextensions-apiserver v0.23.3 // indirect - k8s.io/apiserver v0.23.3 // indirect - k8s.io/component-base v0.23.3 // indirect + k8s.io/apiextensions-apiserver v0.23.4 // indirect + k8s.io/apiserver v0.23.4 // indirect + k8s.io/component-base v0.23.4 // indirect k8s.io/klog/v2 v2.40.1 // indirect k8s.io/kube-openapi v0.0.0-20220124234850-424119656bbf // indirect - k8s.io/kubectl v0.23.3 // indirect - k8s.io/utils v0.0.0-20220127004650-9b3446523e65 // indirect + k8s.io/kubectl v0.23.4 // indirect + k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9 // indirect oras.land/oras-go v1.1.0 // indirect sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2 // indirect - sigs.k8s.io/kustomize/api v0.11.1 // indirect + sigs.k8s.io/kustomize/api v0.11.2 // indirect sigs.k8s.io/kustomize/kyaml v0.13.3 // indirect sigs.k8s.io/structured-merge-diff/v4 v4.2.1 // indirect ) diff --git a/k8s-deploy/go.sum b/k8s-deploy/go.sum index 3b89018ac..7d50fbc35 100644 --- a/k8s-deploy/go.sum +++ b/k8s-deploy/go.sum @@ -1,4 +1,5 @@ bazil.org/fuse v0.0.0-20160811212531-371fbbdaa898/go.mod h1:Xbm+BRKSBEpa4q4hTSxohYNQpsxXPbPry4JJWOB3LB8= +bazil.org/fuse v0.0.0-20200407214033-5883e5a4b512/go.mod h1:FbcW6z/2VytnFDhZfumh8Ss8zxHE6qpMP5sHTRe0EaM= cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= @@ -51,6 +52,7 @@ cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RX cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +github.com/AdaLogics/go-fuzz-headers v0.0.0-20210715213245-6c3934b029d8/go.mod h1:CzsSbkDixRphAF5hS6wbMKq0eI6ccJRb7/A0M6JBnwg= github.com/Azure/azure-sdk-for-go v16.2.1+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= github.com/Azure/azure-sdk-for-go v56.3.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= @@ -117,6 +119,7 @@ github.com/Microsoft/hcsshim v0.8.9/go.mod h1:5692vkUqntj1idxauYlpoINNKeqCiG6Sg3 github.com/Microsoft/hcsshim v0.8.14/go.mod h1:NtVKoYxQuTLx6gEq0L96c9Ju4JbRJ4nY2ow3VK6a9Lg= github.com/Microsoft/hcsshim v0.8.15/go.mod h1:x38A4YbHbdxJtc0sF6oIz+RG0npwSCAvn69iY6URG00= github.com/Microsoft/hcsshim v0.8.16/go.mod h1:o5/SZqmR7x9JNKsW3pu+nqHm0MF8vbA+VxGOoXdC600= +github.com/Microsoft/hcsshim v0.8.20/go.mod h1:+w2gRZ5ReXQhFOrvSQeNfhrYB/dg3oDwTOcER2fw4I4= github.com/Microsoft/hcsshim v0.8.21/go.mod h1:+w2gRZ5ReXQhFOrvSQeNfhrYB/dg3oDwTOcER2fw4I4= github.com/Microsoft/hcsshim v0.8.23/go.mod h1:4zegtUJth7lAvFyc6cH2gGQ5B3OFQim01nnU2M8jKDg= github.com/Microsoft/hcsshim v0.9.1/go.mod h1:Y/0uV2jUab5kBI7SQgl62at0AVX7uaruzADAVmxm3eM= @@ -143,6 +146,7 @@ github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRF github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= github.com/alexflint/go-filemutex v0.0.0-20171022225611-72bdc8eae2ae/go.mod h1:CgnQgUtFrFz9mxFNtED3jI5tLDjKlOM+oUF/sTk6ps0= +github.com/alexflint/go-filemutex v1.1.0/go.mod h1:7P4iRhttt/nUvUOrYIhcpMzv2G6CY9UnI16Z+UJqRyk= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20210826220005-b48c857c3a0e/go.mod h1:F7bn7fEU90QkQ3tnmaTx3LTKLEDqnwWODIYppRQ5hnY= github.com/appleboy/gin-jwt/v2 v2.8.0 h1:Glo7cb9eBR+hj8Y7WzgfkOlqCaNLjP+RV4dNO3fpdps= @@ -170,7 +174,6 @@ github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/bitly/go-simplejson v0.5.0/go.mod h1:cXHtHw4XUPsvGaxgjIAn8PhEWG9NfngEKAMDJEczWVA= -github.com/bits-and-blooms/bitset v1.2.0 h1:Kn4yilvwNtMACtf1eYDlG8H77R07mZSPbMjLyS07ChA= github.com/bits-and-blooms/bitset v1.2.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= github.com/bketelsen/crypt v0.0.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqOes/6LfM= @@ -181,6 +184,7 @@ github.com/bshuster-repo/logrus-logstash-hook v0.4.1/go.mod h1:zsTqEiSzDgAa/8GZR github.com/bshuster-repo/logrus-logstash-hook v1.0.0 h1:e+C0SB5R1pu//O4MQ3f9cFuPGoOVeF2fE4Og9otCc70= github.com/bshuster-repo/logrus-logstash-hook v1.0.0/go.mod h1:zsTqEiSzDgAa/8GZR7E1qaXrhYNDKBYy5/dWPTIflbk= github.com/buger/jsonparser v0.0.0-20180808090653-f4dd9f5a6b44/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s= +github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0= github.com/bugsnag/bugsnag-go v0.0.0-20141110184014-b1d153021fcd h1:rFt+Y/IK1aEZkEHchZRSq9OQbsSzIT/OrI8YFFmRIng= github.com/bugsnag/bugsnag-go v0.0.0-20141110184014-b1d153021fcd/go.mod h1:2oa8nejYd4cQ/b0hMIopN0lCRxU0bueqREvZLWFrtK8= github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b h1:otBG+dV+YK+Soembjv71DPz3uX/V/6MMlSyD9JBQ6kQ= @@ -188,6 +192,7 @@ github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b/go.mod h1:obH5gd0Bsq github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0 h1:nvj0OLI3YqYXer/kZD8Ri1aaunCxIEsOst1BVJswV0o= github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0/go.mod h1:D/8v3kj0zr8ZAKg1AQ6crr+5VwKN5eIywRkfhyM/+dE= github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= +github.com/cenkalti/backoff/v4 v4.1.2/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/certifi/gocertifi v0.0.0-20191021191039-0944d244cd40/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= @@ -201,6 +206,7 @@ github.com/chai2010/gettext-go v0.0.0-20160711120539-c6fed771bfd5 h1:7aWHqerlJ41 github.com/chai2010/gettext-go v0.0.0-20160711120539-c6fed771bfd5/go.mod h1:/iP1qXHoty45bqomnu2LM+VVyAEdWN+vtSHGlQgyxbw= github.com/checkpoint-restore/go-criu/v4 v4.1.0/go.mod h1:xUQBLp4RLc5zJtWY++yjOoMoB5lihDt7fai+75m+rGw= github.com/checkpoint-restore/go-criu/v5 v5.0.0/go.mod h1:cfwC0EG7HMUenopBsUf9d89JlCLQIfgVcNsNN0t6T2M= +github.com/checkpoint-restore/go-criu/v5 v5.3.0/go.mod h1:E/eQpaFtUKGOOSEBZgmKAcn+zUUwWxqcaKZlF54wK8E= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= @@ -209,6 +215,7 @@ github.com/cilium/ebpf v0.0.0-20200702112145-1c8d4c9ef775/go.mod h1:7cR51M8ViRLI github.com/cilium/ebpf v0.2.0/go.mod h1:To2CFviqOWL/M0gIMsvSMlqe7em/l1ALkX1PyjrX2Qs= github.com/cilium/ebpf v0.4.0/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs= github.com/cilium/ebpf v0.6.2/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs= +github.com/cilium/ebpf v0.7.0/go.mod h1:/oI2+1shJiTGAMgl6/RgJr36Eo1jzrRcAWbcXO2usCA= github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= @@ -240,13 +247,15 @@ github.com/containerd/cgroups v0.0.0-20200710171044-318312a37340/go.mod h1:s5q4S github.com/containerd/cgroups v0.0.0-20200824123100-0b889c03f102/go.mod h1:s5q4SojHctfxANBDvMeIaIovkq29IP48TKAxnhYRxvo= github.com/containerd/cgroups v0.0.0-20210114181951-8a68de567b68/go.mod h1:ZJeTFisyysqgcCdecO57Dj79RfL0LNeGiFUqLYQRYLE= github.com/containerd/cgroups v1.0.1/go.mod h1:0SJrPIenamHDcZhEcJMNBB85rHcUsw4f25ZfBiPYRkU= -github.com/containerd/cgroups v1.0.2 h1:mZBclaSgNDfPWtfhj2xJY28LZ9nYIgzB0pwSURPl6JM= github.com/containerd/cgroups v1.0.2/go.mod h1:qpbpJ1jmlqsR9f2IyaLPsdkCdnt0rbDVqIDlhuu5tRY= +github.com/containerd/cgroups v1.0.3 h1:ADZftAkglvCiD44c77s5YmMqaP2pzVCFZvBmAlBdAP4= +github.com/containerd/cgroups v1.0.3/go.mod h1:/ofk34relqNjSGyqPrmEULrO4Sc8LJhvJmWbUCUKqj8= github.com/containerd/console v0.0.0-20180822173158-c12b1e7919c1/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw= github.com/containerd/console v0.0.0-20181022165439-0650fd9eeb50/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw= github.com/containerd/console v0.0.0-20191206165004-02ecf6a7291e/go.mod h1:8Pf4gM6VEbTNRIT26AyyU7hxdQU3MvAvxVI0sc00XBE= github.com/containerd/console v1.0.1/go.mod h1:XUsP6YE/mKtz6bxc+I8UiKKTP04qjQL4qcS3XoQ5xkw= github.com/containerd/console v1.0.2/go.mod h1:ytZPjGgY2oeTkAONYafi2kSj0aYggsf8acV1PGKCbzQ= +github.com/containerd/console v1.0.3/go.mod h1:7LqA/THxQ86k76b8c/EMSiaJ3h1eZkMkXar0TQ1gf3U= github.com/containerd/containerd v1.2.10/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= github.com/containerd/containerd v1.3.0-beta.2.0.20190828155532-0293cbd26c69/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= github.com/containerd/containerd v1.3.0/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= @@ -262,25 +271,28 @@ github.com/containerd/containerd v1.5.0-beta.4/go.mod h1:GmdgZd2zA2GYIBZ0w09Zvgq github.com/containerd/containerd v1.5.0-rc.0/go.mod h1:V/IXoMqNGgBlabz3tHD2TWDoTJseu1FGOKuoA4nNb2s= github.com/containerd/containerd v1.5.1/go.mod h1:0DOxVqwDy2iZvrZp2JUx/E+hS0UNTVn7dJnIOwtYR4g= github.com/containerd/containerd v1.5.7/go.mod h1:gyvv6+ugqY25TiXxcZC3L5yOeYgEw0QMhscqVp1AR9c= -github.com/containerd/containerd v1.5.9 h1:rs6Xg1gtIxaeyG+Smsb/0xaSDu1VgFhOCKBXxMxbsF4= +github.com/containerd/containerd v1.5.8/go.mod h1:YdFSv5bTFLpG2HIYmfqDpSYYTDX+mc5qtSuYx1YUb/s= github.com/containerd/containerd v1.5.9/go.mod h1:fvQqCfadDGga5HZyn3j4+dx56qj2I9YwBrlSdalvJYQ= +github.com/containerd/containerd v1.6.1 h1:oa2uY0/0G+JX4X7hpGCYvkp9FjUancz56kSNnb1sG3o= +github.com/containerd/containerd v1.6.1/go.mod h1:1nJz5xCZPusx6jJU8Frfct988y0NpumIq9ODB0kLtoE= github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= github.com/containerd/continuity v0.0.0-20190815185530-f2a389ac0a02/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= github.com/containerd/continuity v0.0.0-20191127005431-f65d91d395eb/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= github.com/containerd/continuity v0.0.0-20200710164510-efbc4488d8fe/go.mod h1:cECdGN1O8G9bgKTlLhuPJimka6Xb/Gg7vYzCTNVxhvo= github.com/containerd/continuity v0.0.0-20201208142359-180525291bb7/go.mod h1:kR3BEg7bDFaEddKm54WSmrol1fKWDU1nKYkgrcgZT7Y= github.com/containerd/continuity v0.0.0-20210208174643-50096c924a4e/go.mod h1:EXlVlkqNba9rJe3j7w3Xa924itAMLgZH4UD/Q4PExuQ= -github.com/containerd/continuity v0.1.0 h1:UFRRY5JemiAhPZrr/uE0n8fMTLcZsUvySPr1+D7pgr8= github.com/containerd/continuity v0.1.0/go.mod h1:ICJu0PwR54nI0yPEnJ6jcS+J7CZAUXrLh8lPo2knzsM= +github.com/containerd/continuity v0.2.2/go.mod h1:pWygW9u7LtS1o4N/Tn0FoCFDIXZ7rxcMX7HX1Dmibvk= github.com/containerd/fifo v0.0.0-20180307165137-3d5202aec260/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI= github.com/containerd/fifo v0.0.0-20190226154929-a9fb20d87448/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI= github.com/containerd/fifo v0.0.0-20200410184934-f15a3290365b/go.mod h1:jPQ2IAeZRCYxpS/Cm1495vGFww6ecHmMk1YJH2Q5ln0= github.com/containerd/fifo v0.0.0-20201026212402-0724c46b320c/go.mod h1:jPQ2IAeZRCYxpS/Cm1495vGFww6ecHmMk1YJH2Q5ln0= github.com/containerd/fifo v0.0.0-20210316144830-115abcc95a1d/go.mod h1:ocF/ME1SX5b1AOlWi9r677YJmCPSwwWnQ9O123vzpE4= -github.com/containerd/fifo v1.0.0 h1:6PirWBr9/L7GDamKr+XM0IeUFXu5mf3M/BPpH9gaLBU= github.com/containerd/fifo v1.0.0/go.mod h1:ocF/ME1SX5b1AOlWi9r677YJmCPSwwWnQ9O123vzpE4= github.com/containerd/go-cni v1.0.1/go.mod h1:+vUpYxKvAF72G9i1WoDOiPGRtQpqsNW/ZHtSlv++smU= github.com/containerd/go-cni v1.0.2/go.mod h1:nrNABBHzu0ZwCug9Ije8hL2xBCYh/pjfMb1aZGrrohk= +github.com/containerd/go-cni v1.1.0/go.mod h1:Rflh2EJ/++BA2/vY5ao3K6WJRR/bZKsX123aPk+kUtA= +github.com/containerd/go-cni v1.1.3/go.mod h1:Rflh2EJ/++BA2/vY5ao3K6WJRR/bZKsX123aPk+kUtA= github.com/containerd/go-runc v0.0.0-20180907222934-5a6d9f37cfa3/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0= github.com/containerd/go-runc v0.0.0-20190911050354-e029b79d8cda/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0= github.com/containerd/go-runc v0.0.0-20200220073739-7016d3ce2328/go.mod h1:PpyHrqVs8FTi9vpyHwPwiNEGaACDxT/N/pLcvMSRA9g= @@ -290,6 +302,7 @@ github.com/containerd/imgcrypt v1.0.1/go.mod h1:mdd8cEPW7TPgNG4FpuP3sGBiQ7Yi/zak github.com/containerd/imgcrypt v1.0.4-0.20210301171431-0ae5c75f59ba/go.mod h1:6TNsg0ctmizkrOgXRNQjAPFWpMYRWuiB6dSF4Pfa5SA= github.com/containerd/imgcrypt v1.1.1-0.20210312161619-7ed62a527887/go.mod h1:5AZJNI6sLHJljKuI9IHnw1pWqo/F0nGDOuR9zgTs7ow= github.com/containerd/imgcrypt v1.1.1/go.mod h1:xpLnwiQmEUJPvQoAapeb2SNCxz7Xr6PJrXQb0Dpc4ms= +github.com/containerd/imgcrypt v1.1.3/go.mod h1:/TPA1GIDXMzbj01yd8pIbQiLdQxed5ue1wb8bP7PQu4= github.com/containerd/nri v0.0.0-20201007170849-eb1350a75164/go.mod h1:+2wGSDGFYfE5+So4M5syatU0N0f0LbWpuqyMi4/BE8c= github.com/containerd/nri v0.0.0-20210316161719-dbaa18c31c14/go.mod h1:lmxnXF6oMkbqs39FiCt1s0R2HSMhcLel9vNL3m4AaeY= github.com/containerd/nri v0.1.0/go.mod h1:lmxnXF6oMkbqs39FiCt1s0R2HSMhcLel9vNL3m4AaeY= @@ -299,12 +312,10 @@ github.com/containerd/ttrpc v0.0.0-20190828172938-92c8520ef9f8/go.mod h1:PvCDdDG github.com/containerd/ttrpc v0.0.0-20191028202541-4f1b8fe65a5c/go.mod h1:LPm1u0xBw8r8NOKoOdNMeVHSawSsltak+Ihv+etqsE8= github.com/containerd/ttrpc v1.0.1/go.mod h1:UAxOpgT9ziI0gJrmKvgcZivgxOp8iFPSk8httJEt98Y= github.com/containerd/ttrpc v1.0.2/go.mod h1:UAxOpgT9ziI0gJrmKvgcZivgxOp8iFPSk8httJEt98Y= -github.com/containerd/ttrpc v1.1.0 h1:GbtyLRxb0gOLR0TYQWt3O6B0NvT8tMdorEHqIQo/lWI= github.com/containerd/ttrpc v1.1.0/go.mod h1:XX4ZTnoOId4HklF4edwc4DcqskFZuvXB1Evzy5KFQpQ= github.com/containerd/typeurl v0.0.0-20180627222232-a93fcdb778cd/go.mod h1:Cm3kwCdlkCfMSHURc+r6fwoGH6/F1hH3S4sg0rLFWPc= github.com/containerd/typeurl v0.0.0-20190911142611-5eb25027c9fd/go.mod h1:GeKYzf2pQcqv7tJ0AoCuuhtnqhva5LNU3U+OyKxxJpk= github.com/containerd/typeurl v1.0.1/go.mod h1:TB1hUtrpaiO88KEK56ijojHS1+NeF0izUACaJW2mdXg= -github.com/containerd/typeurl v1.0.2 h1:Chlt8zIieDbzQFzXzAeBEF92KhExuE4p9p92/QmY7aY= github.com/containerd/typeurl v1.0.2/go.mod h1:9trJWW2sRlGub4wZJRTW83VtbOLS6hwcDZXTn6oPz9s= github.com/containerd/zfs v0.0.0-20200918131355-0a33824f23a2/go.mod h1:8IgZOBdv8fAgXddBT4dBXJPtxyRsejFIpXoklgxgEjw= github.com/containerd/zfs v0.0.0-20210301145711-11e8f1707f62/go.mod h1:A9zfAbMlQwE+/is6hi0Xw8ktpL+6glmqZYtevJgaB8Y= @@ -314,16 +325,20 @@ github.com/containerd/zfs v1.0.0/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNR github.com/containernetworking/cni v0.7.1/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= github.com/containernetworking/cni v0.8.0/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= github.com/containernetworking/cni v0.8.1/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= +github.com/containernetworking/cni v1.0.1/go.mod h1:AKuhXbN5EzmD4yTNtfSsX3tPcmtrBI6QcRV0NiNt15Y= github.com/containernetworking/plugins v0.8.6/go.mod h1:qnw5mN19D8fIwkqW7oHHYDHVlzhJpcY6TQxn/fUyDDM= github.com/containernetworking/plugins v0.9.1/go.mod h1:xP/idU2ldlzN6m4p5LmGiwRDjeJr6FLK6vuiUwoH7P8= +github.com/containernetworking/plugins v1.0.1/go.mod h1:QHCfGpaTwYTbbH+nZXKVTxNBDZcxSOplJT5ico8/FLE= github.com/containers/ocicrypt v1.0.1/go.mod h1:MeJDzk1RJHv89LjsH0Sp5KTY3ZYkjXO/C+bKAeWFIrc= github.com/containers/ocicrypt v1.1.0/go.mod h1:b8AOe0YR67uU8OqfVNcznfFpAzu3rdgUV4GP9qXPfu4= github.com/containers/ocicrypt v1.1.1/go.mod h1:Dm55fwWm1YZAjYRaJ94z2mfZikIyIN4B0oB3dj3jFxY= +github.com/containers/ocicrypt v1.1.2/go.mod h1:Dm55fwWm1YZAjYRaJ94z2mfZikIyIN4B0oB3dj3jFxY= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-iptables v0.4.5/go.mod h1:/mVI274lEDI2ns62jHCDnCyBF9Iwsmekav8Dbxlm1MU= github.com/coreos/go-iptables v0.5.0/go.mod h1:/mVI274lEDI2ns62jHCDnCyBF9Iwsmekav8Dbxlm1MU= +github.com/coreos/go-iptables v0.6.0/go.mod h1:Qe8Bv2Xik5FyTXwgIbLAnv2sWSBmvWdFETJConOQ//Q= github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= @@ -370,8 +385,8 @@ github.com/docker/cli v20.10.12+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hH github.com/docker/distribution v0.0.0-20190905152932-14b96e55d84c/go.mod h1:0+TTO4EOBfRPhZXAeF1Vu+W3hHZ8eLp8PgKVZlcvtFY= github.com/docker/distribution v2.7.1-0.20190205005809-0d3efadf0154+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/distribution v2.8.0+incompatible h1:l9EaZDICImO1ngI+uTifW+ZYvvz7fKISBAKpg+MbWbY= -github.com/docker/distribution v2.8.0+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= +github.com/docker/distribution v2.8.1+incompatible h1:Q50tZOPR6T/hjNsyc9g8/syEs6bk8XXApsHjKukMl68= +github.com/docker/distribution v2.8.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= github.com/docker/docker v1.4.2-0.20190924003213-a8608b5b67c7/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/docker v20.10.11+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/docker v20.10.12+incompatible h1:CEeNmFM0QZIsJCZKMkZx0ZcahTiewkrgiwfYD+dfl1U= @@ -441,8 +456,8 @@ github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2H github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/gin-contrib/gzip v0.0.3 h1:etUaeesHhEORpZMp18zoOhepboiWnFtXrBZxszWUn4k= github.com/gin-contrib/gzip v0.0.3/go.mod h1:YxxswVZIqOvcHEQpsSn+QF5guQtO1dCfy0shBPy4jFc= -github.com/gin-contrib/logger v0.2.1 h1:Wu9JyQRuv4a7ZgqNlcbTC+RpElIwAueyv/wrFUIm6pE= -github.com/gin-contrib/logger v0.2.1/go.mod h1:6uKBteCGZF6VtxSfO1MKWl7aEu1sPSOhwCEAFPFxnnI= +github.com/gin-contrib/logger v0.2.2 h1:xIoUvRdmfID02X09wfq7wuWmevBTdMK1T6TQjbv5r+4= +github.com/gin-contrib/logger v0.2.2/go.mod h1:6uKBteCGZF6VtxSfO1MKWl7aEu1sPSOhwCEAFPFxnnI= github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M= @@ -466,9 +481,13 @@ github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= +github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.2.1/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.2.2 h1:ahHml/yUpnlb96Rp8HCvtYVPY8ZYpxq3g7UYchIYwbs= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/stdr v1.2.0/go.mod h1:YkVgnZu1ZjjL7xTxrfm/LLZBfkhTqSR1ydtm6jTKKwI= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-logr/zapr v1.2.0/go.mod h1:Qa4Bsj2Vb+FAVeAKsLD8RLQ+YRJB8YDmOAKxaBQf7Ro= github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0= github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= @@ -502,19 +521,23 @@ github.com/go-playground/universal-translator v0.18.0 h1:82dyy6p4OuJq4/CByFNOn/j github.com/go-playground/universal-translator v0.18.0/go.mod h1:UvRDBj+xPUEGrFYl+lu/H90nyDXpg0fqeB/AQUGNTVA= github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI= github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4= -github.com/go-playground/validator/v10 v10.10.0 h1:I7mrTYv78z8k8VXa/qJlOlEXn/nBh+BF8dHX5nt/dr0= -github.com/go-playground/validator/v10 v10.10.0/go.mod h1:74x4gJWsvQexRdW8Pn3dXSGrTK4nAUsbPlLADvpJkos= +github.com/go-playground/validator/v10 v10.10.1 h1:uA0+amWMiglNZKZ9FJRKUAe9U3RX91eVn1JYXMWt7ig= +github.com/go-playground/validator/v10 v10.10.1/go.mod h1:i+3WkQ1FvaUjjxh1kSvIA4dMGDBiPU55YFDl0WbKdWU= github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE= github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/gobuffalo/logger v1.0.3 h1:YaXOTHNPCvkqqA7w05A4v0k2tCdpr+sgFlgINbQ6gqc= +github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= github.com/gobuffalo/logger v1.0.3/go.mod h1:SoeejUwldiS7ZsyCBphOGURmWdwUFXs0J7TCjEhjKxM= -github.com/gobuffalo/packd v1.0.0 h1:6ERZvJHfe24rfFmA9OaoKBdC7+c9sydrytMg8SdFGBM= +github.com/gobuffalo/logger v1.0.6 h1:nnZNpxYo0zx+Aj9RfMPBm+x9zAU2OayFh/xrAWi34HU= +github.com/gobuffalo/logger v1.0.6/go.mod h1:J31TBEHR1QLV2683OXTAItYIg8pv2JMHnF/quuAbMjs= github.com/gobuffalo/packd v1.0.0/go.mod h1:6VTc4htmJRFB7u1m/4LeMTWjFoYrUiBkU9Fdec9hrhI= -github.com/gobuffalo/packr/v2 v2.8.1 h1:tkQpju6i3EtMXJ9uoF5GT6kB+LMTimDWD8Xvbz6zDVA= +github.com/gobuffalo/packd v1.0.1 h1:U2wXfRr4E9DH8IdsDLlRFwTZTK7hLfq9qT/QHXGVe/0= +github.com/gobuffalo/packd v1.0.1/go.mod h1:PP2POP3p3RXGz7Jh6eYEf93S7vA2za6xM7QT85L4+VY= github.com/gobuffalo/packr/v2 v2.8.1/go.mod h1:c/PLlOuTU+p3SybaJATW3H6lX/iK7xEz5OeMf+NnJpg= +github.com/gobuffalo/packr/v2 v2.8.3 h1:xE1yzvnO56cUC0sTpKR3DIbxZgB54AftTFMhB2XEWlY= +github.com/gobuffalo/packr/v2 v2.8.3/go.mod h1:0SahksCVcx4IMnigTjiFuyldmTrdTctXsOdiU5KwbKc= github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= github.com/godbus/dbus v0.0.0-20151105175453-c7fdd8b5cd55/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= @@ -522,12 +545,12 @@ github.com/godbus/dbus v0.0.0-20180201030542-885f9cc04c9c/go.mod h1:/YcGZj5zSblf github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/godbus/dbus/v5 v5.0.6/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/godror/godror v0.24.2/go.mod h1:wZv/9vPiUib6tkoDl+AZ/QLf5YZgMravZ7jxH2eQWAE= github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gogo/googleapis v1.2.0/go.mod h1:Njal3psf3qN6dwBtQfUmBZh2ybovJ0tlu3o/AC7HYjU= -github.com/gogo/googleapis v1.4.0 h1:zgVt4UpGxcqVOw97aRGxT4svlcmdK35fynLNctY32zI= github.com/gogo/googleapis v1.4.0/go.mod h1:5YRNX2z1oM5gXdAkurHa942MDgEJyk02w4OecKY87+c= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= @@ -537,8 +560,9 @@ github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXP github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= -github.com/golang-jwt/jwt/v4 v4.2.0 h1:besgBTC8w8HjP6NzQdxwKH9Z5oQMZ24ThTrHp3cZ8eU= github.com/golang-jwt/jwt/v4 v4.2.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= +github.com/golang-jwt/jwt/v4 v4.3.0 h1:kHL1vqdqWNfATmA0FNMdmZNMyZI1U6O31X4rlIPoBog= +github.com/golang-jwt/jwt/v4 v4.3.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= @@ -672,6 +696,7 @@ github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyN github.com/hashicorp/consul/sdk v0.8.0/go.mod h1:GBvyrGALthsZObzUGsfgHZQDXjg4lOjagTIwIR1vPms= github.com/hashicorp/errwrap v0.0.0-20141028054710-7554cd9344ce/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= @@ -683,6 +708,7 @@ github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iP github.com/hashicorp/go-multierror v0.0.0-20161216184304-ed905158d874/go.mod h1:JMRHfdO9jKNzS/+BTlxCjKNQHg/jZAft8U7LloJvN7I= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= +github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= @@ -721,11 +747,11 @@ github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU= github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/intel/goresctrl v0.2.0/go.mod h1:+CZdzouYFn5EsxgqAQTEzMfwKwuc0fVdMrT9FCCAVRQ= github.com/j-keck/arping v0.0.0-20160618110441-2cf9dc699c56/go.mod h1:ymszkNOg6tORTn+6F6j+Jc8TOr5osrynvN6ivFWZ2GA= +github.com/j-keck/arping v1.0.2/go.mod h1:aJbELhR92bSk7tp79AWM/ftfc90EfEi2bQJrbBFOsPw= github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= -github.com/jinzhu/now v1.1.2/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= -github.com/jinzhu/now v1.1.3/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= github.com/jinzhu/now v1.1.4 h1:tHnRBy1i5F2Dh8BAFxqFzxKqqvezXrL2OW1TnX+Mlas= github.com/jinzhu/now v1.1.4/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= @@ -751,8 +777,9 @@ github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/X github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= -github.com/karrick/godirwalk v1.15.8 h1:7+rWAZPn9zuRxaIqqT8Ohs2Q2Ac0msBqwRdxNCr2VVs= github.com/karrick/godirwalk v1.15.8/go.mod h1:j4mkqPuvaLI8mp1DroR3P6ad7cyYd4c1qeJ3RV7ULlk= +github.com/karrick/godirwalk v1.16.1 h1:DynhcF+bztK8gooS0+NDJFrdNZjJ3gzVzC545UNA9iw= +github.com/karrick/godirwalk v1.16.1/go.mod h1:j4mkqPuvaLI8mp1DroR3P6ad7cyYd4c1qeJ3RV7ULlk= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= @@ -760,8 +787,8 @@ github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+o github.com/klauspost/compress v1.11.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.11.13/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= -github.com/klauspost/compress v1.14.2 h1:S0OHlFk/Gbon/yauFJ4FfJJF5V0fc5HbBTJazi28pRw= -github.com/klauspost/compress v1.14.2/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= +github.com/klauspost/compress v1.15.0 h1:xqfchp4whNFxn5A4XFyyYtitiWI8Hy5EW59jEwcyL6U= +github.com/klauspost/compress v1.15.0/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= @@ -798,8 +825,9 @@ github.com/lithammer/dedent v1.1.0/go.mod h1:jrXYCQtgg0nJiN+StA2KgR7w6CiQNv9Fd/Z github.com/lyft/protoc-gen-star v0.5.3/go.mod h1:V0xaHgaf5oCCqmcxYcWiDfTiKsZsRc87/1qhoTACD8w= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/magiconair/properties v1.8.5 h1:b6kJs+EmPFMYGkow9GiUyCyOvIwYetYJ3fSaWak/Gls= github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= +github.com/magiconair/properties v1.8.6 h1:5ibWZ6iY0NctNGWo87LalDlEZ6R41TqbbDamhfG/Qzo= +github.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= @@ -840,8 +868,8 @@ github.com/mattn/go-shellwords v1.0.12/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lL github.com/mattn/go-sqlite3 v1.11.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= github.com/mattn/go-sqlite3 v1.14.6/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= github.com/mattn/go-sqlite3 v1.14.9/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= -github.com/mattn/go-sqlite3 v1.14.11 h1:gt+cp9c0XGqe9S/wAHTL3n/7MqY+siPWgWJgqdsFrzQ= -github.com/mattn/go-sqlite3 v1.14.11/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= +github.com/mattn/go-sqlite3 v1.14.12 h1:TJ1bhYJPV44phC+IMu1u2K/i5RriLTPe+yc68XDJ1Z0= +github.com/mattn/go-sqlite3 v1.14.12/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI= github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= @@ -882,7 +910,9 @@ github.com/moby/sys/mountinfo v0.4.0/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2J github.com/moby/sys/mountinfo v0.4.1/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2JI+6q0qou+A= github.com/moby/sys/mountinfo v0.5.0 h1:2Ks8/r6lopsxWi9m58nlwjaeSzUX9iiL1vj5qB/9ObI= github.com/moby/sys/mountinfo v0.5.0/go.mod h1:3bMD3Rg+zkqx8MRYPi7Pyb0Ie97QEBmdxbhnCLlSvSU= +github.com/moby/sys/signal v0.6.0/go.mod h1:GQ6ObYZfqacOwTtlXvcmh9A26dVRul/hbOZn88Kg8Tg= github.com/moby/sys/symlink v0.1.0/go.mod h1:GGDODQmbFOjFsXvfLVn3+ZRxkch54RkSiGqsZeMYowQ= +github.com/moby/sys/symlink v0.2.0/go.mod h1:7uZVF2dqJjG/NsClqul95CqKOBRQyYSNnJ6BMgR/gFs= github.com/moby/term v0.0.0-20200312100748-672ec06f55cd/go.mod h1:DdlQx2hp0Ss5/fLikoLlEeIYiATotOjgB//nb973jeo= github.com/moby/term v0.0.0-20210610120745-9d4ed1856297/go.mod h1:vgPCkQMyxTZ7IDy8SXRufE172gr8+K/JE/7hHFxHW3A= github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6 h1:dcztxKSvZ4Id8iPpHERQBbIJfabdt4wUm5qy3wOL2Zc= @@ -910,8 +940,9 @@ github.com/naoina/toml v0.1.1 h1:PT/lllxVVN0gzzSqSlHEmP8MJB4MY2U7STGxiouV4X8= github.com/naoina/toml v0.1.1/go.mod h1:NBIhNtsFMo3G2szEBne+bO4gS192HuIYRqfvOWb4i1E= github.com/ncw/swift v1.0.47/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= -github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= +github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= +github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= github.com/olekukonko/tablewriter v0.0.4/go.mod h1:zq6QwlOf5SlnkVbMSr5EoBv3636FWnp+qbPhuoO21uA= @@ -925,8 +956,10 @@ github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+ github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -github.com/onsi/ginkgo v1.14.0 h1:2mOpI4JVVPBN+WQRa0WKH2eXR+Ey+uK4n7Zj0aYpIQA= +github.com/onsi/ginkgo v1.13.0/go.mod h1:+REjRxOmWfHCjfv9TTWB1jD1Frx4XydAD3zm1lskyM0= github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= +github.com/onsi/ginkgo v1.16.4 h1:29JGrr5oVBm5ulCWet69zQkzWipVXIol6ygQUe/EzNc= +github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= github.com/onsi/gomega v0.0.0-20151007035656-2152b45fa28a/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= @@ -934,8 +967,9 @@ github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1Cpa github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.10.3 h1:gph6h/qe9GSUw1NhH1gp+qb+h8rXD8Cy60Z32Qw3ELA= github.com/onsi/gomega v1.10.3/go.mod h1:V9xEwhxec5O8UDM77eCW8vLymOMltsqPVYWrpDsH8xc= +github.com/onsi/gomega v1.15.0 h1:WjP/FQ/sk43MRmnEcT+MlDw2TFvkrXlprrPST/IudjU= +github.com/onsi/gomega v1.15.0/go.mod h1:cIuvLEne0aoVhAgh/O6ac0Op8WWw9H6eYCriF+tEHG0= github.com/opencontainers/go-digest v0.0.0-20170106003457-a6d0ee40d420/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= github.com/opencontainers/go-digest v0.0.0-20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= @@ -944,6 +978,7 @@ github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8 github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/image-spec v1.0.0/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= +github.com/opencontainers/image-spec v1.0.2-0.20211117181255-693428a734f5/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= github.com/opencontainers/image-spec v1.0.2 h1:9yCKha/T5XdGtO0q9Q9a6T5NUCsTn/DrBg0D7ufOcFM= github.com/opencontainers/image-spec v1.0.2/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= github.com/opencontainers/runc v0.0.0-20190115041553-12f6a991201f/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= @@ -951,20 +986,19 @@ github.com/opencontainers/runc v0.1.1/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59P github.com/opencontainers/runc v1.0.0-rc8.0.20190926000215-3e425f80a8c9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= github.com/opencontainers/runc v1.0.0-rc9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= github.com/opencontainers/runc v1.0.0-rc93/go.mod h1:3NOsor4w32B2tC0Zbl8Knk4Wg84SM2ImC1fxBuqJ/H0= -github.com/opencontainers/runc v1.0.2 h1:opHZMaswlyxz1OuGpBE53Dwe4/xF7EZTY0A2L/FpCOg= github.com/opencontainers/runc v1.0.2/go.mod h1:aTaHFFwQXuA71CiyxOdFFIorAoemI04suvGRQFzWTD0= +github.com/opencontainers/runc v1.1.0/go.mod h1:Tj1hFw6eFWp/o33uxGf5yF2BX5yz2Z6iptFpuvbbKqc= github.com/opencontainers/runtime-spec v0.1.2-0.20190507144316-5b71a03e2700/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opencontainers/runtime-spec v1.0.1/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opencontainers/runtime-spec v1.0.2-0.20190207185410-29686dbc5559/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opencontainers/runtime-spec v1.0.3-0.20200929063507-e6143ca7d51d/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417 h1:3snG66yBm59tKhhSPQrQ/0bCrv1LQbKt40LnUPiUxdc= github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opencontainers/runtime-tools v0.0.0-20181011054405-1d69bd0f9c39/go.mod h1:r3f7wjNzSs2extwzU3Y+6pKfobzPh+kKFJ3ofN+3nfs= github.com/opencontainers/selinux v1.6.0/go.mod h1:VVGKuOLlE7v4PJyT6h7mNWvq1rzqiriPsEqVhc+svHE= github.com/opencontainers/selinux v1.8.0/go.mod h1:RScLhm78qiWa2gbVCcGkC7tCGdgk3ogry1nUQF8Evvo= -github.com/opencontainers/selinux v1.8.2 h1:c4ca10UMgRcvZ6h0K4HtS15UaVSBEaE+iln2LVpAuGc= github.com/opencontainers/selinux v1.8.2/go.mod h1:MUIHuUEvKB1wtJjQdOyYRgOnLD2xAPP8dBsCoU0KuF8= +github.com/opencontainers/selinux v1.10.0/go.mod h1:2i0OySw99QjzBBQByd1Gr9gSjvuho1lHsJxIJ3gGbJI= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/otiai10/copy v1.7.0 h1:hVoPiN+t+7d2nzzwMiDHPSOogsWAStewq3TwU05+clE= github.com/otiai10/copy v1.7.0/go.mod h1:rmRl6QPdJj6EiUqXQ/4Nn2lLXoNQjFCQbbNrxgc/t3U= @@ -1023,6 +1057,7 @@ github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8b github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= github.com/prometheus/common v0.28.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= +github.com/prometheus/common v0.30.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= github.com/prometheus/common v0.32.1 h1:hWIdL3N2HoUx3B8j3YN9mWor0qhY/NlEKZEaXxuIRh4= github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= github.com/prometheus/procfs v0.0.0-20180125133057-cb4147076ac7/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= @@ -1054,8 +1089,8 @@ github.com/rs/zerolog v1.23.0/go.mod h1:6c7hFfxPOy7TacJc4Fcdi24/J0NKYGzjG8FWRI91 github.com/rs/zerolog v1.26.1 h1:/ihwxqH+4z8UxyI70wM1z9yCvkWcfz/a3mj48k/Zngc= github.com/rs/zerolog v1.26.1/go.mod h1:/wSSJWX7lVrsOwlbyTRSOJvqRlc+WjWlfes+CiJ+tmc= github.com/rubenv/sql-migrate v0.0.0-20210614095031-55d5740dbbcc/go.mod h1:HFLT6i9iR4QBOF5rdCyjddC9t59ArqWJV2xx+jwcCMo= -github.com/rubenv/sql-migrate v1.1.0 h1:Ib7Q31lUTsryEGKQGpzjq6hL/imvmMof7kDV4b7gVlc= -github.com/rubenv/sql-migrate v1.1.0/go.mod h1:XsKV+aiWNJpTDKtG1hh0C5hP+S6VQNcWwhLhqCLKJFk= +github.com/rubenv/sql-migrate v1.1.1 h1:haR5Hn8hbW9/SpAICrXoZqXnywS7Q5WijwkQENPeNWY= +github.com/rubenv/sql-migrate v1.1.1/go.mod h1:/7TZymwxN8VWumcIxw1jjHEcR1djpdkMHQPT4FWdnbQ= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/russross/blackfriday v1.6.0 h1:KqfZb0pUVN2lYqZUYRddxF4OR8ZMURnJIG5Y3VRLtww= github.com/russross/blackfriday v1.6.0/go.mod h1:ti0ldHuxg49ri4ksnFxlkCfN+hvslNlmVHqNRXXJNAY= @@ -1064,13 +1099,16 @@ github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/safchain/ethtool v0.0.0-20190326074333-42ed695e3de8/go.mod h1:Z0q5wiBQGYcxhMZ6gUqHn6pYNLypFAvaL3UvgZLR0U4= +github.com/safchain/ethtool v0.0.0-20210803160452-9aa261dae9b1/go.mod h1:Z0q5wiBQGYcxhMZ6gUqHn6pYNLypFAvaL3UvgZLR0U4= github.com/sagikazarmark/crypt v0.3.0/go.mod h1:uD/D+6UF4SrIR1uGEv7bBNkNqLGqUr43MRiaGWX1Nig= github.com/sagikazarmark/crypt v0.4.0/go.mod h1:ALv2SRj7GxYV4HO9elxH9nS6M9gW+xDNxqmyJ6RfDFM= github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= +github.com/sclevine/agouti v3.0.0+incompatible/go.mod h1:b4WX9W9L1sfQKXeJf1mUTLZKJ48R1S7H23Ji7oFO5Bw= github.com/sclevine/spec v1.2.0/go.mod h1:W4J29eT/Kzv7/b9IWLB055Z+qvVC9vt0Arko24q7p+U= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/seccomp/libseccomp-golang v0.9.1/go.mod h1:GbW5+tmTXfcxTToHLXlScSlAvWlF4P2Ca7zGrPiEpWo= +github.com/seccomp/libseccomp-golang v0.9.2-0.20210429002308-3879420cc921/go.mod h1:JA8cRccbGaA1s33RQf7Y1+q9gHmZX1yB/z9WDN1C6fg= github.com/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0= github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= @@ -1146,8 +1184,9 @@ github.com/swaggo/files v0.0.0-20210815190702-a29dd2bc99b2 h1:+iNTcqQJy0OZ5jk6a5 github.com/swaggo/files v0.0.0-20210815190702-a29dd2bc99b2/go.mod h1:lKJPbtWzJ9JhsTN1k1gZgleJWY/cqq0psdoMmaThG3w= github.com/swaggo/gin-swagger v1.4.1 h1:F2vJndw+Q+ZBOlsC6CaodqXJV3ZOf6hpg/4Y6MEx5BM= github.com/swaggo/gin-swagger v1.4.1/go.mod h1:hmJ1vPn+XjUvnbzjCdUAxVqgraxELxk8x5zAsjCE5mg= -github.com/swaggo/swag v1.7.9 h1:6vCG5mm43ebDzGlZPMGYrYI4zKFfOr5kicQX8qjeDwc= github.com/swaggo/swag v1.7.9/go.mod h1:gZ+TJ2w/Ve1RwQsA2IRoSOTidHz6DX+PIG8GWvbnoLU= +github.com/swaggo/swag v1.8.0 h1:80NNhvpJcuItNpBDqgJwDuKlMmaZ/OATOzhG3bhcM3w= +github.com/swaggo/swag v1.8.0/go.mod h1:gZ+TJ2w/Ve1RwQsA2IRoSOTidHz6DX+PIG8GWvbnoLU= github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= github.com/syndtr/gocapability v0.0.0-20180916011248-d98352740cb2/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= @@ -1162,13 +1201,14 @@ github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1 github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= +github.com/tv42/httpunix v0.0.0-20191220191345-2ba4b9c3382c/go.mod h1:hzIxponao9Kjc7aWznkXaL4U4TWaDSs8zcsY4Ka08nM= github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= -github.com/ugorji/go v1.2.6 h1:tGiWC9HENWE2tqYycIqFTNorMmFRVhNwCpDOpWqnk8E= -github.com/ugorji/go v1.2.6/go.mod h1:anCg0y61KIhDlPZmnH+so+RQbysYVyDko0IMgJv0Nn0= +github.com/ugorji/go v1.2.7 h1:qYhyWUUd6WbiM+C6JZAUkIJt/1WrjzNHY9+KCIjVqTo= +github.com/ugorji/go v1.2.7/go.mod h1:nF9osbDWLy6bDVv/Rtoh6QgnvNDpmCalQV5urGCCS6M= github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= -github.com/ugorji/go/codec v1.2.6 h1:7kbGefxLoDBuYXOms4yD7223OpNMMPNPZxXk5TvFcyQ= -github.com/ugorji/go/codec v1.2.6/go.mod h1:V6TCNZ4PHqoHGFZuSG1W8nrCzzdgA2DozYxWFFpvxTw= +github.com/ugorji/go/codec v1.2.7 h1:YPXUKf7fYbp/y8xloBqZOw2qaVggbfwMlI8WM3wZUJ0= +github.com/ugorji/go/codec v1.2.7/go.mod h1:WGN1fab3R1fzQlVQTkfxVtIBhWDRqOviHU95kRgeqEY= github.com/urfave/cli v0.0.0-20171014202726-7bc6a0acffa5/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= @@ -1179,9 +1219,11 @@ github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/X github.com/vishvananda/netlink v0.0.0-20181108222139-023a6dafdcdf/go.mod h1:+SR5DhBJrl6ZM7CoCKvpw5BKroDKQ+PJqOg65H/2ktk= github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE= github.com/vishvananda/netlink v1.1.1-0.20201029203352-d40f9887b852/go.mod h1:twkDnbuQxJYemMlGd4JFIcuhgX83tXhKS2B/PRMpOho= +github.com/vishvananda/netlink v1.1.1-0.20210330154013-f5de75959ad5/go.mod h1:twkDnbuQxJYemMlGd4JFIcuhgX83tXhKS2B/PRMpOho= github.com/vishvananda/netns v0.0.0-20180720170159-13995c7128cc/go.mod h1:ZjcWmFBXmLKZu9Nxj3WKYEafiSqer2rnvPr0en9UNpI= github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU= github.com/vishvananda/netns v0.0.0-20200728191858-db3c7e526aae/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= +github.com/vishvananda/netns v0.0.0-20210104183010-2eb08e3e575f/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= github.com/willf/bitset v1.1.11-0.20200630133818-d5bec3311243/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4= github.com/willf/bitset v1.1.11/go.mod h1:83CECat5yLh5zVOf4P1ErAgKA5UDvKtgyUABdr3+MjI= github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= @@ -1238,23 +1280,33 @@ go.opencensus.io v0.23.0 h1:gqCw0LfLxScz8irSi8exQc7fyQ0fKQU/qnC/X8+V/1M= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.opentelemetry.io/contrib v0.20.0/go.mod h1:G/EtFaa6qaN7+LxqfIAT3GiZa7Wv5DTBUzl5H4LY0Kc= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.20.0/go.mod h1:oVGt1LRbBOBq1A5BQLlUg9UaU/54aiHw8cgjV3aWZ/E= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.28.0/go.mod h1:vEhqr0m4eTc+DWxfsXoXue2GBgV2uUwVznkGIHW/e5w= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.20.0/go.mod h1:2AboqHi0CiIZU0qwhtUfCYD1GeUzvvIXWNkhDt7ZMG4= go.opentelemetry.io/otel v0.20.0/go.mod h1:Y3ugLH2oa81t5QO+Lty+zXf8zC9L26ax4Nzoxm/dooo= +go.opentelemetry.io/otel v1.3.0/go.mod h1:PWIKzi6JCp7sM0k9yZ43VX+T345uNbAkDKwHVjb2PTs= go.opentelemetry.io/otel/exporters/otlp v0.20.0/go.mod h1:YIieizyaN77rtLJra0buKiNBOm9XQfkPEKBeuhoMwAM= +go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.3.0/go.mod h1:VpP4/RMn8bv8gNo9uK7/IMY4mtWLELsS+JIP0inH0h4= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.3.0/go.mod h1:hO1KLR7jcKaDDKDkvI9dP/FIhpmna5lkqPUQdEjFAM8= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.3.0/go.mod h1:keUU7UfnwWTWpJ+FWnyqmogPa82nuU5VUANFq49hlMY= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.3.0/go.mod h1:QNX1aly8ehqqX1LEa6YniTU7VY9I6R3X/oPxhGdTceE= go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU= go.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw= go.opentelemetry.io/otel/sdk v0.20.0/go.mod h1:g/IcepuwNsoiX5Byy2nNV0ySUF1em498m7hBWC279Yc= +go.opentelemetry.io/otel/sdk v1.3.0/go.mod h1:rIo4suHNhQwBIPg9axF8V9CA72Wz2mKF1teNrup8yzs= go.opentelemetry.io/otel/sdk/export/metric v0.20.0/go.mod h1:h7RBNMsDJ5pmI1zExLi+bJK+Dr8NQCh0qGhm1KDnNlE= go.opentelemetry.io/otel/sdk/metric v0.20.0/go.mod h1:knxiS8Xd4E/N+ZqKmUPf3gTTZ4/0TjTXukfxjzSTpHE= go.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16gUEi0Nf1iBdgw= +go.opentelemetry.io/otel/trace v1.3.0/go.mod h1:c/VDhno8888bvQYmbYLqe41/Ldmr/KKunbvWM4/fEjk= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= +go.opentelemetry.io/proto/otlp v0.11.0/go.mod h1:QpEjXPrNQzrFDZgoTo49dgHR9RYRSrg3NAKnUGl9YpQ= go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5/go.mod h1:nmDLcffg48OtT/PSW0Hg7FvpRQsQh5OSqIylirxKC7o= -go.starlark.net v0.0.0-20220203230714-bb14e151c28f h1:aW4TkS39/naJa9wPSbIXtZUQOlvuUh8gxCsLRrJoByU= -go.starlark.net v0.0.0-20220203230714-bb14e151c28f/go.mod h1:t3mmBBPzAVvK0L0n1drDmrQsJ8FoIx4INCqVMTr/Zo0= +go.starlark.net v0.0.0-20220302181546-5411bad688d1 h1:i0Sz4b+qJi5xwOaFZqZ+RNHkIpaKLDofei/Glt+PMNc= +go.starlark.net v0.0.0-20220302181546-5411bad688d1/go.mod h1:t3mmBBPzAVvK0L0n1drDmrQsJ8FoIx4INCqVMTr/Zo0= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= +go.uber.org/goleak v1.1.12/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= @@ -1279,15 +1331,16 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211117183948-ae814b36b871/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20211215165025-cf75a172585e/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= -golang.org/x/crypto v0.0.0-20220208050332-20e1d8d225ab h1:lnZ4LoV0UMdibeCUfIB2a4uFwRu491WX/VB2reB8xNc= -golang.org/x/crypto v0.0.0-20220208050332-20e1d8d225ab/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220307211146-efcb8507fb70 h1:syTAU9FwmvzEoIYMqcPHOcVm4H3U5u90WsvuYgwpETU= +golang.org/x/crypto v0.0.0-20220307211146-efcb8507fb70/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -1379,7 +1432,9 @@ golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLd golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8= golang.org/x/net v0.0.0-20210421230115-4e50805a0758/go.mod h1:72T/g9IO56b78aLF+1Kcs5dz7/ng1VjMUvfKvpfy+jM= +golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210520170846-37e1c6afe023/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= @@ -1387,9 +1442,11 @@ golang.org/x/net v0.0.0-20210825183410-e898025ed96a/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211209124913-491a49abca63/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220107192237-5cfca573fb4d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd h1:O7DYs+zxREGLKzKoMQrtrEacpb0ZVXA5rIwylE2Xchk= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220225172249-27dd8689420f h1:oA4XRj0qtSt8Yo1Zms0CUlsT3KG69V2UGQWPBxujDmc= +golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1407,8 +1464,9 @@ golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20211005180243-6b3c2da341f1/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8 h1:RerP+noqYHUQ8CMRcPlC2nvTa4dcBIjegkuWdcUDuqg= golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a h1:qfl7ob3DIEs3Ml9oLuPwY2N04gymzAW04WsUQHIClgM= +golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1499,6 +1557,7 @@ golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201202213521-69691e467435/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1526,19 +1585,24 @@ golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210831042530-f4d43177bf5e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210903071746-97244b99971b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210906170528-6f6e22806c34/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211116061358-0a5406a5449c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211205182925-97ca703d548d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220207234003-57398862261d h1:Bm7BNOQt2Qv7ZqysjeLjgCBanX+88Z/OtdvsrEv1Djc= -golang.org/x/sys v0.0.0-20220207234003-57398862261d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220310020820-b874c991c1a5 h1:y/woIyUBFbpQGKS0u1aHF/40WUDnek3fPOyD08H5Vng= +golang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 h1:JGgROgKl9N8DuW20oFS5gxc+lE67/N3FcwmBPMe7ArY= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= @@ -1560,8 +1624,8 @@ golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1/go.mod h1:tRJNPiyCQ0inRvYxb golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20211116232009-f0f3c7e86c11 h1:GZokNIeuVkl3aZHJchRrr13WCsols02MLUcz1U9is6M= -golang.org/x/time v0.0.0-20211116232009-f0f3c7e86c11/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20220224211638-0e9765cccd65 h1:M73Iuj3xbbb9Uk1DYhzydthsj6oOd6l9bpuFcNoUvTs= +golang.org/x/time v0.0.0-20220224211638-0e9765cccd65/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181011042414-1f849cf54d09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -1621,6 +1685,7 @@ golang.org/x/tools v0.0.0-20200916195026-c9a70fc28ce3/go.mod h1:z6u4i615ZeAfBE4X golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= @@ -1756,8 +1821,8 @@ google.golang.org/genproto v0.0.0-20211203200212-54befc351ae9/go.mod h1:5CzLGKJ6 google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20220107163113-42d7afdf6368/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220207185906-7721543eae58 h1:i67FGOy2/zGfhE3YgHdrOrcFbOBhqdcRoBrsDqSQrOI= -google.golang.org/genproto v0.0.0-20220207185906-7721543eae58/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220308174144-ae0e22291548 h1:J5ZNG1QIdstOl8aaUoFoQJfp04FKTsFV+jwkBHEchqs= +google.golang.org/genproto v0.0.0-20220308174144-ae0e22291548/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= google.golang.org/grpc v0.0.0-20160317175043-d3ddb4469d5a/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= @@ -1790,8 +1855,9 @@ google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9K google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= google.golang.org/grpc v1.43.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= -google.golang.org/grpc v1.44.0 h1:weqSxi/TMs1SqFRMHCtBgXRs8k3X39QIDEZ0pRcttUg= google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= +google.golang.org/grpc v1.45.0 h1:NEpgUqV3Z+ZjkqMsxMg11IaDrXY4RY6CQukSGK0uI1M= +google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= @@ -1826,8 +1892,8 @@ gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.66.2/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/ini.v1 v1.66.3 h1:jRskFVxYaMGAMUbN0UZ7niA9gzL9B49DOqE78vg0k3w= -gopkg.in/ini.v1 v1.66.3/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ini.v1 v1.66.4 h1:SsAcf+mM7mRZo2nJNGt8mZCjG8ZRaNGMURJw7BsIST4= +gopkg.in/ini.v1 v1.66.4/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= @@ -1849,14 +1915,13 @@ gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gorm.io/driver/mysql v1.2.3 h1:cZqzlOfg5Kf1VIdLC1D9hT6Cy9BgxhExLj/2tIgUe7Y= -gorm.io/driver/mysql v1.2.3/go.mod h1:qsiz+XcAyMrS6QY+X3M9R6b/lKM1imKmcuK9kac5LTo= -gorm.io/driver/sqlite v1.2.6 h1:SStaH/b+280M7C8vXeZLz/zo9cLQmIGwwj3cSj7p6l4= -gorm.io/driver/sqlite v1.2.6/go.mod h1:gyoX0vHiiwi0g49tv+x2E7l8ksauLK0U/gShcdUsjWY= -gorm.io/gorm v1.22.3/go.mod h1:F+OptMscr0P2F2qU97WT1WimdH9GaQPoDW7AYd5i2Y0= -gorm.io/gorm v1.22.4/go.mod h1:1aeVC+pe9ZmvKZban/gW4QPra7PRoTEssyc922qCAkk= -gorm.io/gorm v1.22.5 h1:lYREBgc02Be/5lSCTuysZZDb6ffL2qrat6fg9CFbvXU= -gorm.io/gorm v1.22.5/go.mod h1:l2lP/RyAtc1ynaTjFksBde/O8v9oOGIApu2/xRitmZk= +gorm.io/driver/mysql v1.3.2 h1:QJryWiqQ91EvZ0jZL48NOpdlPdMjdip1hQ8bTgo4H7I= +gorm.io/driver/mysql v1.3.2/go.mod h1:ChK6AHbHgDCFZyJp0F+BmVGb06PSIoh9uVYKAlRbb2U= +gorm.io/driver/sqlite v1.3.1 h1:bwfE+zTEWklBYoEodIOIBwuWHpnx52Z9zJFW5F33WLk= +gorm.io/driver/sqlite v1.3.1/go.mod h1:wJx0hJspfycZ6myN38x1O/AqLtNS6c5o9TndewFbELg= +gorm.io/gorm v1.23.1/go.mod h1:l2lP/RyAtc1ynaTjFksBde/O8v9oOGIApu2/xRitmZk= +gorm.io/gorm v1.23.2 h1:xmq9QRMWL8HTJyhAUBXy8FqIIQCYESeKfJL4DoGKiWQ= +gorm.io/gorm v1.23.2/go.mod h1:l2lP/RyAtc1ynaTjFksBde/O8v9oOGIApu2/xRitmZk= gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= @@ -1874,48 +1939,55 @@ honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9 k8s.io/api v0.20.1/go.mod h1:KqwcCVogGxQY3nBlRpwt+wpAMF/KjaCc7RpywacvqUo= k8s.io/api v0.20.4/go.mod h1:++lNL1AJMkDymriNniQsWRkMDzRaX2Y/POTUi8yvqYQ= k8s.io/api v0.20.6/go.mod h1:X9e8Qag6JV/bL5G6bU8sdVRltWKmdHsFUGS3eVndqE8= +k8s.io/api v0.22.5/go.mod h1:mEhXyLaSD1qTOf40rRiKXkc+2iCem09rWLlFwhCEiAs= k8s.io/api v0.23.1/go.mod h1:WfXnOnwSqNtG62Y1CdjoMxh7r7u9QXGCkA1u0na2jgo= -k8s.io/api v0.23.3 h1:KNrME8KHGr12Ozjf8ytOewKzZh6hl/hHUZeHddT3a38= -k8s.io/api v0.23.3/go.mod h1:w258XdGyvCmnBj/vGzQMj6kzdufJZVUwEM1U2fRJwSQ= +k8s.io/api v0.23.4 h1:85gnfXQOWbJa1SiWGpE9EEtHs0UVvDyIsSMpEtl2D4E= +k8s.io/api v0.23.4/go.mod h1:i77F4JfyNNrhOjZF7OwwNJS5Y1S9dpwvb9iYRYRczfI= k8s.io/apiextensions-apiserver v0.23.1/go.mod h1:0qz4fPaHHsVhRApbtk3MGXNn2Q9M/cVWWhfHdY2SxiM= -k8s.io/apiextensions-apiserver v0.23.3 h1:JvPJA7hSEAqMRteveq4aj9semilAZYcJv+9HHFWfUdM= -k8s.io/apiextensions-apiserver v0.23.3/go.mod h1:/ZpRXdgKZA6DvIVPEmXDCZJN53YIQEUDF+hrpIQJL38= +k8s.io/apiextensions-apiserver v0.23.4 h1:AFDUEu/yEf0YnuZhqhIFhPLPhhcQQVuR1u3WCh0rveU= +k8s.io/apiextensions-apiserver v0.23.4/go.mod h1:TWYAKymJx7nLMxWCgWm2RYGXHrGlVZnxIlGnvtfYu+g= k8s.io/apimachinery v0.20.1/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= k8s.io/apimachinery v0.20.4/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= k8s.io/apimachinery v0.20.6/go.mod h1:ejZXtW1Ra6V1O5H8xPBGz+T3+4gfkTCeExAHKU57MAc= +k8s.io/apimachinery v0.22.1/go.mod h1:O3oNtNadZdeOMxHFVxOreoznohCpy0z6mocxbZr7oJ0= +k8s.io/apimachinery v0.22.5/go.mod h1:xziclGKwuuJ2RM5/rSFQSYAj0zdbci3DH8kj+WvyN0U= k8s.io/apimachinery v0.23.1/go.mod h1:SADt2Kl8/sttJ62RRsi9MIV4o8f5S3coArm0Iu3fBno= -k8s.io/apimachinery v0.23.3 h1:7IW6jxNzrXTsP0c8yXz2E5Yx/WTzVPTsHIx/2Vm0cIk= -k8s.io/apimachinery v0.23.3/go.mod h1:BEuFMMBaIbcOqVIJqNZJXGFTP4W6AycEpb5+m/97hrM= +k8s.io/apimachinery v0.23.4 h1:fhnuMd/xUL3Cjfl64j5ULKZ1/J9n8NuQEgNL+WXWfdM= +k8s.io/apimachinery v0.23.4/go.mod h1:BEuFMMBaIbcOqVIJqNZJXGFTP4W6AycEpb5+m/97hrM= k8s.io/apiserver v0.20.1/go.mod h1:ro5QHeQkgMS7ZGpvf4tSMx6bBOgPfE+f52KwvXfScaU= k8s.io/apiserver v0.20.4/go.mod h1:Mc80thBKOyy7tbvFtB4kJv1kbdD0eIH8k8vianJcbFM= k8s.io/apiserver v0.20.6/go.mod h1:QIJXNt6i6JB+0YQRNcS0hdRHJlMhflFmsBDeSgT1r8Q= +k8s.io/apiserver v0.22.5/go.mod h1:s2WbtgZAkTKt679sYtSudEQrTGWUSQAPe6MupLnlmaQ= k8s.io/apiserver v0.23.1/go.mod h1:Bqt0gWbeM2NefS8CjWswwd2VNAKN6lUKR85Ft4gippY= -k8s.io/apiserver v0.23.3 h1:gWY1DmA0AdAGR/H+Q/1FtyGkFq8xqSaZOw7oLopmO8k= -k8s.io/apiserver v0.23.3/go.mod h1:3HhsTmC+Pn+Jctw+Ow0LHA4dQ4oXrQ4XJDzrVDG64T4= +k8s.io/apiserver v0.23.4 h1:zNvQlG+C/ERjuUz4p7eY/0IWHaMixRSBoxgmyIdwo9Y= +k8s.io/apiserver v0.23.4/go.mod h1:A6l/ZcNtxGfPSqbFDoxxOjEjSKBaQmE+UTveOmMkpNc= k8s.io/cli-runtime v0.23.1/go.mod h1:r9r8H/qfXo9w+69vwUL7LokKlLRKW5D6A8vUKCx+YL0= -k8s.io/cli-runtime v0.23.3 h1:aJiediw+uUbxkfO6BNulcAMTUoU9Om43g3R7rIkYqcw= -k8s.io/cli-runtime v0.23.3/go.mod h1:yA00O5pDqnjkBh8fkuugBbfIfjB1nOpz+aYLotbnOfc= +k8s.io/cli-runtime v0.23.4 h1:C3AFQmo4TK4dlVPLOI62gtHEHu0OfA2Cp4UVRZ1JXns= +k8s.io/cli-runtime v0.23.4/go.mod h1:7KywUNTUibmHPqmpDFuRO1kc9RhsufHv2lkjCm2YZyM= k8s.io/client-go v0.20.1/go.mod h1:/zcHdt1TeWSd5HoUe6elJmHSQ6uLLgp4bIJHVEuy+/Y= k8s.io/client-go v0.20.4/go.mod h1:LiMv25ND1gLUdBeYxBIwKpkSC5IsozMMmOOeSJboP+k= k8s.io/client-go v0.20.6/go.mod h1:nNQMnOvEUEsOzRRFIIkdmYOjAZrC8bgq0ExboWSU1I0= +k8s.io/client-go v0.22.5/go.mod h1:cs6yf/61q2T1SdQL5Rdcjg9J1ElXSwbjSrW2vFImM4Y= k8s.io/client-go v0.23.1/go.mod h1:6QSI8fEuqD4zgFK0xbdwfB/PthBsIxCJMa3s17WlcO0= -k8s.io/client-go v0.23.3 h1:23QYUmCQ/W6hW78xIwm3XqZrrKZM+LWDqW2zfo+szJs= -k8s.io/client-go v0.23.3/go.mod h1:47oMd+YvAOqZM7pcQ6neJtBiFH7alOyfunYN48VsmwE= +k8s.io/client-go v0.23.4 h1:YVWvPeerA2gpUudLelvsolzH7c2sFoXXR5wM/sWqNFU= +k8s.io/client-go v0.23.4/go.mod h1:PKnIL4pqLuvYUK1WU7RLTMYKPiIh7MYShLshtRY9cj0= k8s.io/code-generator v0.19.7/go.mod h1:lwEq3YnLYb/7uVXLorOJfxg+cUu2oihFhHZ0n9NIla0= k8s.io/code-generator v0.23.1/go.mod h1:V7yn6VNTCWW8GqodYCESVo95fuiEg713S8B7WacWZDA= -k8s.io/code-generator v0.23.3/go.mod h1:S0Q1JVA+kSzTI1oUvbKAxZY/DYbA/ZUb4Uknog12ETk= +k8s.io/code-generator v0.23.4/go.mod h1:S0Q1JVA+kSzTI1oUvbKAxZY/DYbA/ZUb4Uknog12ETk= k8s.io/component-base v0.20.1/go.mod h1:guxkoJnNoh8LNrbtiQOlyp2Y2XFCZQmrcg2n/DeYNLk= k8s.io/component-base v0.20.4/go.mod h1:t4p9EdiagbVCJKrQ1RsA5/V4rFQNDfRlevJajlGwgjI= k8s.io/component-base v0.20.6/go.mod h1:6f1MPBAeI+mvuts3sIdtpjljHWBQ2cIy38oBIWMYnrM= +k8s.io/component-base v0.22.5/go.mod h1:VK3I+TjuF9eaa+Ln67dKxhGar5ynVbwnGrUiNF4MqCI= k8s.io/component-base v0.23.1/go.mod h1:6llmap8QtJIXGDd4uIWJhAq0Op8AtQo6bDW2RrNMTeo= -k8s.io/component-base v0.23.3 h1:q+epprVdylgecijVGVdf4MbizEL2feW4ssd7cdo6LVY= -k8s.io/component-base v0.23.3/go.mod h1:1Smc4C60rWG7d3HjSYpIwEbySQ3YWg0uzH5a2AtaTLg= +k8s.io/component-base v0.23.4 h1:SziYh48+QKxK+ykJ3Ejqd98XdZIseVBG7sBaNLPqy6M= +k8s.io/component-base v0.23.4/go.mod h1:8o3Gg8i2vnUXGPOwciiYlkSaZT+p+7gA9Scoz8y4W4E= k8s.io/component-helpers v0.23.1/go.mod h1:ZK24U+2oXnBPcas2KolLigVVN9g5zOzaHLkHiQMFGr0= -k8s.io/component-helpers v0.23.3/go.mod h1:SH+W/WPTaTenbWyDEeY7iytAQiMh45aqKxkvlqQ57cg= +k8s.io/component-helpers v0.23.4/go.mod h1:1Pl7L4zukZ054ElzRbvmZ1FJIU8roBXFOeRFu8zipa4= k8s.io/cri-api v0.17.3/go.mod h1:X1sbHmuXhwaHs9xxYffLqJogVsnI+f6cPRcgPel7ywM= k8s.io/cri-api v0.20.1/go.mod h1:2JRbKt+BFLTjtrILYVqQK5jqhI+XNdF6UiGMgczeBCI= k8s.io/cri-api v0.20.4/go.mod h1:2JRbKt+BFLTjtrILYVqQK5jqhI+XNdF6UiGMgczeBCI= k8s.io/cri-api v0.20.6/go.mod h1:ew44AjNXwyn1s0U4xCKGodU7J1HzBeZ1MpGrpa5r8Yc= +k8s.io/cri-api v0.23.1/go.mod h1:REJE3PSU0h/LOV1APBrupxrEJqnoxZC8KWzkBUHwrK4= k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/gengo v0.0.0-20200428234225-8167cfdcfc14/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/gengo v0.0.0-20201113003025-83324d819ded/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= @@ -1923,27 +1995,30 @@ k8s.io/gengo v0.0.0-20210813121822-485abfe95c7c/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAE k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= k8s.io/klog/v2 v2.4.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= +k8s.io/klog/v2 v2.9.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec= k8s.io/klog/v2 v2.30.0/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= k8s.io/klog/v2 v2.40.1 h1:P4RRucWk/lFOlDdkAr3mc7iWFkgKrZY9qZMAgek06S4= k8s.io/klog/v2 v2.40.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= k8s.io/kube-openapi v0.0.0-20200805222855-6aeccd4b50c6/go.mod h1:UuqjUnNftUyPE5H64/qeyjQoUZhGpeFDVdxjTeEVN2o= k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd/go.mod h1:WOJ3KddDSol4tAGcJo0Tvi+dK12EcqSLqcWsryKMpfM= k8s.io/kube-openapi v0.0.0-20210421082810-95288971da7e/go.mod h1:vHXdDvt9+2spS2Rx9ql3I8tycm3H9FDfdUoIuKCefvw= +k8s.io/kube-openapi v0.0.0-20211109043538-20434351676c/go.mod h1:vHXdDvt9+2spS2Rx9ql3I8tycm3H9FDfdUoIuKCefvw= k8s.io/kube-openapi v0.0.0-20211115234752-e816edb12b65/go.mod h1:sX9MT8g7NVZM5lVL/j8QyCCJe8YSMW30QvGZWaCIDIk= k8s.io/kube-openapi v0.0.0-20220124234850-424119656bbf h1:M9XBsiMslw2lb2ZzglC0TOkBPK5NQi0/noUrdnoFwUg= k8s.io/kube-openapi v0.0.0-20220124234850-424119656bbf/go.mod h1:sX9MT8g7NVZM5lVL/j8QyCCJe8YSMW30QvGZWaCIDIk= k8s.io/kubectl v0.23.1/go.mod h1:Ui7dJKdUludF8yWAOSN7JZEkOuYixX5yF6E6NjoukKE= -k8s.io/kubectl v0.23.3 h1:gJsF7cahkWDPYlNvYKK+OrBZLAJUBzCym+Zsi+dfi1E= -k8s.io/kubectl v0.23.3/go.mod h1:VBeeXNgLhSabu4/k0O7Q0YujgnA3+CLTUE0RcmF73yY= +k8s.io/kubectl v0.23.4 h1:mAa+zEOlyZieecEy+xSrhjkpMcukYyHWzcNdX28dzMY= +k8s.io/kubectl v0.23.4/go.mod h1:Dgb0Rvx/8JKS/C2EuvsNiQc6RZnX0SbHJVG3XUzH6ok= k8s.io/kubernetes v1.13.0/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk= k8s.io/metrics v0.23.1/go.mod h1:qXvsM1KANrc+ZZeFwj6Phvf0NLiC+d3RwcsLcdGc+xs= -k8s.io/metrics v0.23.3/go.mod h1:Ut8TvkbsO4oMVeUzaTArvPrcw9QRFLs2XNzUlORjdYE= +k8s.io/metrics v0.23.4/go.mod h1:cl6sY9BdVT3DubbpqnkPIKi6mn/F2ltkU4yH1tEJ3Bo= k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= k8s.io/utils v0.0.0-20210802155522-efc7438f0176/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +k8s.io/utils v0.0.0-20210819203725-bdf08cb9a70a/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= k8s.io/utils v0.0.0-20210930125809-cb0fa318a74b/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= k8s.io/utils v0.0.0-20211116205334-6203023598ed/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20220127004650-9b3446523e65 h1:ONWS0Wgdg5wRiQIAui7L/023aC9+IxrIrydY7l8llsE= -k8s.io/utils v0.0.0-20220127004650-9b3446523e65/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9 h1:HNSDgDCrr/6Ly3WEGKZftiE7IY19Vz2GdbOCyI4qqhc= +k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= oras.land/oras-go v1.1.0 h1:tfWM1RT7PzUwWphqHU6ptPU3ZhwVnSw/9nEGf519rYg= oras.land/oras-go v1.1.0/go.mod h1:1A7vR/0KknT2UkJVWh+xMi95I/AhK8ZrxrnUSmXN0bQ= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= @@ -1951,14 +2026,15 @@ rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.14/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.15/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= +sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.22/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.25/go.mod h1:Mlj9PNLmG9bZ6BHFwFKDo5afkpWyUISkb9Me0GnK66I= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.27/go.mod h1:tq2nT0Kx7W+/f2JVE+zxYtUhdjuELJkVpNz+x/QN5R4= sigs.k8s.io/json v0.0.0-20211020170558-c049b76a60c6/go.mod h1:p4QtZmO4uMYipTQNzagwnNoseA6OxSUutVw05NhYDRs= sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2 h1:kDi4JBNAsJWfz1aEXhO8Jg87JJaPNLh5tIzYHgStQ9Y= sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2/go.mod h1:B+TnT182UBxE84DiCz4CVE26eOSDAeYCpfDnC2kdKMY= sigs.k8s.io/kustomize/api v0.10.1/go.mod h1:2FigT1QN6xKdcnGS2Ppp1uIWrtWN28Ms8A3OZUZhwr8= -sigs.k8s.io/kustomize/api v0.11.1 h1:/Vutu+gAqVo8skw1xCZrsZD39SN4Adg+z7FrSTw9pds= -sigs.k8s.io/kustomize/api v0.11.1/go.mod h1:GZuhith5YcqxIDe0GnRJNx5xxPTjlwaLTt/e+ChUtJA= +sigs.k8s.io/kustomize/api v0.11.2 h1:6YvCJHFDwsLwAX7zNHBxMZi3k7dGIXI8G9l0saYQI0E= +sigs.k8s.io/kustomize/api v0.11.2/go.mod h1:GZuhith5YcqxIDe0GnRJNx5xxPTjlwaLTt/e+ChUtJA= sigs.k8s.io/kustomize/cmd/config v0.10.2/go.mod h1:K2aW7nXJ0AaT+VA/eO0/dzFLxmpFcTzudmAgDwPY1HQ= sigs.k8s.io/kustomize/kustomize/v4 v4.4.1/go.mod h1:qOKJMMz2mBP+vcS7vK+mNz4HBLjaQSWRY22EF6Tb7Io= sigs.k8s.io/kustomize/kyaml v0.13.0/go.mod h1:FTJxEZ86ScK184NpGSAQcfEqee0nul8oLCK30D47m4E= diff --git a/k8s-deploy/kubefate.yaml b/k8s-deploy/kubefate.yaml index 83d173bb2..1ae22fc50 100644 --- a/k8s-deploy/kubefate.yaml +++ b/k8s-deploy/kubefate.yaml @@ -19,7 +19,7 @@ spec: spec: serviceAccountName: kubefate-admin containers: - - image: federatedai/kubefate:v1.4.3 + - image: federatedai/kubefate:v1.4.4 imagePullPolicy: IfNotPresent name: kubefate env: diff --git a/k8s-deploy/pkg/api/user.go b/k8s-deploy/pkg/api/user.go index 2757b95cb..1da16ccfc 100644 --- a/k8s-deploy/pkg/api/user.go +++ b/k8s-deploy/pkg/api/user.go @@ -240,7 +240,7 @@ func getUserFindByUUID(uuid string) (modules.User, error) { // @Failure 400 {object} JSONERRORResult "Bad Request" // @Failure 401 {object} JSONERRORResult "Unauthorized operation" // @Failure 500 {object} JSONERRORResult "Internal server error" -// @Router /user/{userId} [get] +// @Router /user/{userId} [delete] // @Param Authorization header string true "Authentication header" // @Security ApiKeyAuth func (*User) deleteUser(c *gin.Context) { diff --git a/k8s-deploy/pkg/api/version.go b/k8s-deploy/pkg/api/version.go index 0cde7c42b..2aff0369c 100644 --- a/k8s-deploy/pkg/api/version.go +++ b/k8s-deploy/pkg/api/version.go @@ -20,7 +20,7 @@ import ( ) // ServiceVersion code release version -const ServiceVersion = "v1.4.3" +const ServiceVersion = "v1.4.4" // Version API struct type Version struct { diff --git a/k8s-deploy/pkg/service/info.go b/k8s-deploy/pkg/service/info.go index 71f35f467..a8151140e 100644 --- a/k8s-deploy/pkg/service/info.go +++ b/k8s-deploy/pkg/service/info.go @@ -21,20 +21,24 @@ import "github.com/rs/zerolog/log" func GetClusterInfo(name, namespace string) (map[string]interface{}, error) { ip, err := GetNodeIP() if err != nil { + log.Error().Str("func", "GetNodeIP()").Err(err).Msg("GetNodeIP error") return nil, err } port, err := GetProxySvcNodePorts(name, getDefaultNamespace(namespace)) if err != nil { + log.Error().Str("func", "GetProxySvcNodePorts()").Err(err).Msg("GetProxySvcNodePorts error") return nil, err } containerList, err := GetPodContainersStatus(name, getDefaultNamespace(namespace)) if err != nil { + log.Error().Str("func", "GetPodContainersStatus()").Err(err).Msg("GetPodContainersStatus error") return nil, err } deploymentList, err := GetClusterDeployStatus(name, getDefaultNamespace(namespace)) if err != nil { + log.Error().Str("func", "GetClusterDeployStatus()").Err(err).Msg("GetClusterDeployStatus error") return nil, err } @@ -45,6 +49,7 @@ func GetClusterInfo(name, namespace string) (map[string]interface{}, error) { ingressURLList, err := GetIngressURLList(name, getDefaultNamespace(namespace)) if err != nil { + log.Error().Str("func", "GetIngressURLList()").Err(err).Msg("GetIngressURLList error") return nil, err } diff --git a/k8s-deploy/pkg/service/kube/ingress.go b/k8s-deploy/pkg/service/kube/ingress.go index c2392b95f..33aa2b1e8 100644 --- a/k8s-deploy/pkg/service/kube/ingress.go +++ b/k8s-deploy/pkg/service/kube/ingress.go @@ -18,23 +18,23 @@ package kube import ( "context" - networkingv1beta1 "k8s.io/api/networking/v1beta1" + networkingv1 "k8s.io/api/networking/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) // Ingress interface type Ingress interface { - GetIngress(ingressName, namespace string) (*networkingv1beta1.Ingress, error) - GetIngresses(namespace, labelSelector string) (*networkingv1beta1.IngressList, error) + GetIngress(ingressName, namespace string) (*networkingv1.Ingress, error) + GetIngresses(namespace, labelSelector string) (*networkingv1.IngressList, error) } // GetIngress is get a Ingress -func (e *Kube) GetIngress(ingressName, namespace string) (*networkingv1beta1.Ingress, error) { - ingress, err := e.client.NetworkingV1beta1().Ingresses(namespace).Get(context.Background(), ingressName, metav1.GetOptions{}) +func (e *Kube) GetIngress(ingressName, namespace string) (*networkingv1.Ingress, error) { + ingress, err := e.client.NetworkingV1().Ingresses(namespace).Get(context.Background(), ingressName, metav1.GetOptions{}) return ingress, err } // GetIngresses is get list of Ingress -func (e *Kube) GetIngresses(namespace, labelSelector string) (*networkingv1beta1.IngressList, error) { - return e.client.NetworkingV1beta1().Ingresses(namespace).List(e.ctx, metav1.ListOptions{LabelSelector: labelSelector}) +func (e *Kube) GetIngresses(namespace, labelSelector string) (*networkingv1.IngressList, error) { + return e.client.NetworkingV1().Ingresses(namespace).List(e.ctx, metav1.ListOptions{LabelSelector: labelSelector}) } diff --git a/k8s-deploy/pkg/service/kube_deploy.go b/k8s-deploy/pkg/service/kube_deploy.go index e66443196..321836fc1 100644 --- a/k8s-deploy/pkg/service/kube_deploy.go +++ b/k8s-deploy/pkg/service/kube_deploy.go @@ -72,34 +72,31 @@ func CheckDeploys(deploys *v1.DeploymentList) bool { } // GetDeployStatus GetDeployStatus -func GetDeployStatus(deploy *v1.Deployment) (string, string, error) { +func GetDeployStatus(deploy *v1.Deployment) (string, string) { for _, v := range deploy.Status.Conditions { if v.Type == v1.DeploymentAvailable && v.Status == corev1.ConditionTrue { - return fmt.Sprint(v1.DeploymentAvailable), v.Message, nil + return fmt.Sprint(v1.DeploymentAvailable), v.Message } } for _, v := range deploy.Status.Conditions { if v.Type == v1.DeploymentProgressing && v.Status == corev1.ConditionTrue { - return fmt.Sprint(v1.DeploymentProgressing), v.Message, nil + return fmt.Sprint(v1.DeploymentProgressing), v.Message } } for _, v := range deploy.Status.Conditions { if v.Type == v1.DeploymentReplicaFailure && v.Status == corev1.ConditionTrue { - return fmt.Sprint(v1.DeploymentReplicaFailure), v.Message, nil + return fmt.Sprint(v1.DeploymentReplicaFailure), v.Message } } - return "", "", fmt.Errorf("Deployment of '%s' not type, please try again", deploy.Name) + return "Undefined", fmt.Sprintf("please use kubectl cli check deploy status of %s", deploy.Name) } //GetDeploymentStatus GetDeploymentStatus func GetDeploymentStatusInfo(deploys *v1.DeploymentList) (map[string]string, error) { status := make(map[string]string) for _, v := range deploys.Items { - Type, message, err := GetDeployStatus(&v) - if err != nil { - return nil, err - } + Type, message := GetDeployStatus(&v) status[v.Name] = fmt.Sprintf("%s, %s", Type, message) } return status, nil @@ -108,10 +105,7 @@ func GetDeploymentStatusInfo(deploys *v1.DeploymentList) (map[string]string, err func GetDeploymentStatus(deploys *v1.DeploymentList) (map[string]string, error) { status := make(map[string]string) for _, v := range deploys.Items { - Type, _, err := GetDeployStatus(&v) - if err != nil { - return nil, err - } + Type, _ := GetDeployStatus(&v) status[v.Name] = fmt.Sprintf("%s", Type) } return status, nil diff --git a/k8s-deploy/pkg/service/kube_ingress.go b/k8s-deploy/pkg/service/kube_ingress.go index 95c87db41..c4646d2af 100644 --- a/k8s-deploy/pkg/service/kube_ingress.go +++ b/k8s-deploy/pkg/service/kube_ingress.go @@ -15,17 +15,12 @@ package service -import ( - "fmt" -) - // GetIngressURLList is Get Ingress Url list func GetIngressURLList(name, namespace string) ([]string, error) { var urls []string labelSelector := getLabelSelector(namespace, name) ingressList, err := KubeClient.GetIngresses(namespace, labelSelector) if err != nil { - fmt.Println(err) return nil, err } for _, ingress := range ingressList.Items { From 2dfe5a674f6664adbbbbacf0febe8c3874091a5c Mon Sep 17 00:00:00 2001 From: owlet42 Date: Wed, 16 Mar 2022 11:42:01 +0800 Subject: [PATCH 04/14] add liveness and readiness of kubefate service Signed-off-by: owlet42 --- k8s-deploy/kubefate.yaml | 53 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/k8s-deploy/kubefate.yaml b/k8s-deploy/kubefate.yaml index 1ae22fc50..cf4d61d98 100644 --- a/k8s-deploy/kubefate.yaml +++ b/k8s-deploy/kubefate.yaml @@ -72,6 +72,39 @@ spec: requests: memory: 512Mi cpu: "0.5" + livenessProbe: + httpGet: + path: / + port: 8080 + httpHeaders: + - name: X-Custom-Header + value: livenessProbe + initialDelaySeconds: 30 + periodSeconds: 10 + timeoutSeconds: 5 + successThreshold: 1 + failureThreshold: 3 + readinessProbe: + httpGet: + path: / + port: 8080 + httpHeaders: + - name: X-Custom-Header + value: readinessProbe + initialDelaySeconds: 5 + periodSeconds: 10 + timeoutSeconds: 1 + successThreshold: 1 + failureThreshold: 3 + startupProbe: + httpGet: + path: / + port: 8080 + httpHeaders: + - name: X-Custom-Header + value: startupProbe + failureThreshold: 30 + periodSeconds: 10 restartPolicy: Always --- apiVersion: apps/v1 @@ -125,6 +158,26 @@ spec: volumeMounts: - name: mariadb-data mountPath: /var/lib/mysql + livenessProbe: + exec: + command: + - mysqladmin + - ping + initialDelaySeconds: 30 + periodSeconds: 10 + timeoutSeconds: 5 + successThreshold: 1 + failureThreshold: 3 + readinessProbe: + exec: + command: + - mysqladmin + - ping + initialDelaySeconds: 5 + periodSeconds: 10 + timeoutSeconds: 1 + successThreshold: 1 + failureThreshold: 3 restartPolicy: Always volumes: - name: mariadb-data From 65b7fb93a931e42a1bf961df67c3fdc1a61f21f5 Mon Sep 17 00:00:00 2001 From: owlet42 Date: Fri, 25 Mar 2022 13:52:46 +0800 Subject: [PATCH 05/14] add 'liveness' 'readiness' and 'startup' for FATE chart Signed-off-by: owlet42 --- .../eggroll/clustermanager/deployment.yaml | 21 ++++++ .../eggroll/nodemanager/deployment.yaml | 21 ++++++ .../backends/eggroll/rollsite/deployment.yaml | 21 ++++++ .../backends/spark/hdfs/deployment.yaml | 62 ++++++++++++++++- .../backends/spark/hdfs/service.yaml | 6 +- .../backends/spark/nginx/deployment.yaml | 39 ++++++++++- .../backends/spark/pulsar/deployment.yaml | 33 ++++++++++ .../backends/spark/rabbitmq/deployment.yaml | 33 ++++++++++ .../backends/spark/spark/deployment.yaml | 66 +++++++++++++++++++ .../templates/core/client/deployment.yaml | 33 ++++++++++ .../FATE/templates/core/mysql/deployment.yaml | 27 ++++++++ .../FATE/templates/core/python-spark.yaml | 60 ++++++++++++++++- helm-charts/Images_list.md | 8 +-- 13 files changed, 418 insertions(+), 12 deletions(-) diff --git a/helm-charts/FATE/templates/backends/eggroll/clustermanager/deployment.yaml b/helm-charts/FATE/templates/backends/eggroll/clustermanager/deployment.yaml index 30071ee2c..e708c4942 100644 --- a/helm-charts/FATE/templates/backends/eggroll/clustermanager/deployment.yaml +++ b/helm-charts/FATE/templates/backends/eggroll/clustermanager/deployment.yaml @@ -53,6 +53,27 @@ spec: java -Dlog4j.configurationFile=$${EGGROLL_HOME}/conf/log4j2.properties -cp $${EGGROLL_HOME}/lib/*: com.webank.eggroll.core.Bootstrap --bootstraps com.webank.eggroll.core.resourcemanager.ClusterManagerBootstrap -c $${EGGROLL_HOME}/conf/eggroll.properties -p 4670 -s 'EGGROLL_DEAMON' ports: - containerPort: 4670 + livenessProbe: + tcpSocket: + port: 4670 + initialDelaySeconds: 1 + periodSeconds: 10 + timeoutSeconds: 3 + successThreshold: 1 + failureThreshold: 3 + readinessProbe: + tcpSocket: + port: 4670 + initialDelaySeconds: 1 + periodSeconds: 10 + timeoutSeconds: 3 + successThreshold: 1 + failureThreshold: 3 + startupProbe: + tcpSocket: + port: 4670 + failureThreshold: 12 + periodSeconds: 10 volumeMounts: - mountPath: /data/projects/fate/eggroll/conf/eggroll.properties name: eggroll-confs diff --git a/helm-charts/FATE/templates/backends/eggroll/nodemanager/deployment.yaml b/helm-charts/FATE/templates/backends/eggroll/nodemanager/deployment.yaml index cd5268a21..f0a274b4d 100644 --- a/helm-charts/FATE/templates/backends/eggroll/nodemanager/deployment.yaml +++ b/helm-charts/FATE/templates/backends/eggroll/nodemanager/deployment.yaml @@ -67,6 +67,27 @@ spec: /tini -- java -Dlog4j.configurationFile=$${EGGROLL_HOME}/conf/log4j2.properties -cp $${EGGROLL_HOME}/lib/*: com.webank.eggroll.core.Bootstrap --bootstraps com.webank.eggroll.core.resourcemanager.NodeManagerBootstrap -c $${EGGROLL_HOME}/conf/eggroll.properties -p 4671 -s 'EGGROLL_DEAMON' ports: - containerPort: 4671 + livenessProbe: + tcpSocket: + port: 4671 + initialDelaySeconds: 1 + periodSeconds: 10 + timeoutSeconds: 3 + successThreshold: 1 + failureThreshold: 3 + readinessProbe: + tcpSocket: + port: 4671 + initialDelaySeconds: 1 + periodSeconds: 10 + timeoutSeconds: 3 + successThreshold: 1 + failureThreshold: 3 + startupProbe: + tcpSocket: + port: 4671 + failureThreshold: 12 + periodSeconds: 10 volumeMounts: - name: eggroll-log mountPath: /data/projects/fate/eggroll/logs/ diff --git a/helm-charts/FATE/templates/backends/eggroll/rollsite/deployment.yaml b/helm-charts/FATE/templates/backends/eggroll/rollsite/deployment.yaml index 89531dad0..0dc2210b8 100644 --- a/helm-charts/FATE/templates/backends/eggroll/rollsite/deployment.yaml +++ b/helm-charts/FATE/templates/backends/eggroll/rollsite/deployment.yaml @@ -57,6 +57,27 @@ spec: java -Dlog4j.configurationFile=$${EGGROLL_HOME}/conf/log4j2.properties -cp $${EGGROLL_HOME}/lib/*:$${EGGROLL_HOME}/conf/ com.webank.eggroll.rollsite.EggSiteBootstrap -c $${EGGROLL_HOME}/conf/eggroll.properties ports: - containerPort: 9370 + livenessProbe: + tcpSocket: + port: 9370 + initialDelaySeconds: 1 + periodSeconds: 10 + timeoutSeconds: 3 + successThreshold: 1 + failureThreshold: 3 + readinessProbe: + tcpSocket: + port: 9370 + initialDelaySeconds: 1 + periodSeconds: 10 + timeoutSeconds: 3 + successThreshold: 1 + failureThreshold: 3 + startupProbe: + tcpSocket: + port: 9370 + failureThreshold: 12 + periodSeconds: 10 volumeMounts: - mountPath: /data/projects/fate/eggroll/conf/route_table/ name: rollsite-confs diff --git a/helm-charts/FATE/templates/backends/spark/hdfs/deployment.yaml b/helm-charts/FATE/templates/backends/spark/hdfs/deployment.yaml index 9c52b2507..938bed3c7 100644 --- a/helm-charts/FATE/templates/backends/spark/hdfs/deployment.yaml +++ b/helm-charts/FATE/templates/backends/spark/hdfs/deployment.yaml @@ -54,6 +54,36 @@ spec: - containerPort: 9000 - containerPort: 9870 - containerPort: 50070 + livenessProbe: + exec: + command: + - /bin/bash + - -c + - curl -f localhost:50070 + initialDelaySeconds: 30 + periodSeconds: 10 + timeoutSeconds: 5 + successThreshold: 1 + failureThreshold: 3 + readinessProbe: + exec: + command: + - /bin/bash + - -c + - curl -f localhost:50070 + initialDelaySeconds: 5 + periodSeconds: 10 + timeoutSeconds: 1 + successThreshold: 1 + failureThreshold: 3 + startupProbe: + exec: + command: + - /bin/bash + - -c + - curl -f localhost:50070 + failureThreshold: 12 + periodSeconds: 10 volumeMounts: - mountPath: /etc/hadoop/core-site.xml subPath: core-site.xml @@ -124,7 +154,37 @@ spec: ports: - containerPort: 9000 - containerPort: 9870 - - containerPort: 50070 + - containerPort: 50075 + livenessProbe: + exec: + command: + - /bin/bash + - -c + - curl -f localhost:50075 + initialDelaySeconds: 1 + periodSeconds: 10 + timeoutSeconds: 3 + successThreshold: 1 + failureThreshold: 3 + readinessProbe: + exec: + command: + - /bin/bash + - -c + - curl -f localhost:50075 + initialDelaySeconds: 1 + periodSeconds: 10 + timeoutSeconds: 3 + successThreshold: 1 + failureThreshold: 3 + startupProbe: + exec: + command: + - /bin/bash + - -c + - curl -f localhost:50075 + failureThreshold: 12 + periodSeconds: 10 volumeMounts: - name: dfs mountPath: /hadoop/dfs/data diff --git a/helm-charts/FATE/templates/backends/spark/hdfs/service.yaml b/helm-charts/FATE/templates/backends/spark/hdfs/service.yaml index d3c8ec8ec..9922b02e6 100644 --- a/helm-charts/FATE/templates/backends/spark/hdfs/service.yaml +++ b/helm-charts/FATE/templates/backends/spark/hdfs/service.yaml @@ -27,9 +27,9 @@ spec: port: 9870 targetPort: 9870 protocol: TCP - - name: "tcp-50070" - port: 50070 - targetPort: 50070 + - name: "tcp-50075" + port: 50075 + targetPort: 50075 protocol: TCP type: {{ .Values.modules.hdfs.datanode.type }} selector: diff --git a/helm-charts/FATE/templates/backends/spark/nginx/deployment.yaml b/helm-charts/FATE/templates/backends/spark/nginx/deployment.yaml index 230c5e3a4..1f97865e8 100644 --- a/helm-charts/FATE/templates/backends/spark/nginx/deployment.yaml +++ b/helm-charts/FATE/templates/backends/spark/nginx/deployment.yaml @@ -43,8 +43,43 @@ spec: echo "change path of route_table.yaml success!" openresty -g 'daemon off;' ports: - - containerPort: 9300 - - containerPort: 9310 + - name: http-port + containerPort: 9300 + - name: grpc-port + containerPort: 9310 + livenessProbe: + httpGet: + path: /test + port: 9302 + httpHeaders: + - name: X-Custom-Header + value: livenessProbe + initialDelaySeconds: 1 + periodSeconds: 10 + timeoutSeconds: 3 + successThreshold: 1 + failureThreshold: 3 + readinessProbe: + httpGet: + path: /test + port: 9302 + httpHeaders: + - name: X-Custom-Header + value: readinessProbe + initialDelaySeconds: 1 + periodSeconds: 10 + timeoutSeconds: 3 + successThreshold: 1 + failureThreshold: 3 + startupProbe: + httpGet: + path: /test + port: 9302 + httpHeaders: + - name: X-Custom-Header + value: readinessProbe + failureThreshold: 12 + periodSeconds: 10 volumeMounts: - mountPath: /data/projects/fate/proxy/nginx/conf/nginx.conf name: nginx-confs diff --git a/helm-charts/FATE/templates/backends/spark/pulsar/deployment.yaml b/helm-charts/FATE/templates/backends/spark/pulsar/deployment.yaml index 6e2da0c24..9f3a0a06c 100644 --- a/helm-charts/FATE/templates/backends/spark/pulsar/deployment.yaml +++ b/helm-charts/FATE/templates/backends/spark/pulsar/deployment.yaml @@ -45,6 +45,39 @@ spec: - containerPort: 6651 - containerPort: 8080 - containerPort: 8081 + livenessProbe: + tcpSocket: + {{- if .Values.modules.pulsar.exchange }} + port: 8081 + {{- else }} + port: 8080 + {{- end }} + initialDelaySeconds: 1 + periodSeconds: 10 + timeoutSeconds: 3 + successThreshold: 1 + failureThreshold: 3 + readinessProbe: + tcpSocket: + {{- if .Values.modules.pulsar.exchange }} + port: 8081 + {{- else }} + port: 8080 + {{- end }} + initialDelaySeconds: 1 + periodSeconds: 10 + timeoutSeconds: 3 + successThreshold: 1 + failureThreshold: 3 + startupProbe: + tcpSocket: + {{- if .Values.modules.pulsar.exchange }} + port: 8081 + {{- else }} + port: 8080 + {{- end }} + failureThreshold: 12 + periodSeconds: 10 volumeMounts: - mountPath: /pulsar/conf/standalone.conf name: pulsar-confs diff --git a/helm-charts/FATE/templates/backends/spark/rabbitmq/deployment.yaml b/helm-charts/FATE/templates/backends/spark/rabbitmq/deployment.yaml index 76c875cf3..cfed8b0d9 100644 --- a/helm-charts/FATE/templates/backends/spark/rabbitmq/deployment.yaml +++ b/helm-charts/FATE/templates/backends/spark/rabbitmq/deployment.yaml @@ -49,6 +49,39 @@ spec: ports: - containerPort: 5672 - containerPort: 15672 + livenessProbe: + httpGet: + path: / + port: 15672 + httpHeaders: + - name: X-Custom-Header + value: livenessProbe + initialDelaySeconds: 1 + periodSeconds: 10 + timeoutSeconds: 3 + successThreshold: 1 + failureThreshold: 3 + readinessProbe: + httpGet: + path: / + port: 15672 + httpHeaders: + - name: X-Custom-Header + value: readinessProbe + initialDelaySeconds: 1 + periodSeconds: 10 + timeoutSeconds: 3 + successThreshold: 1 + failureThreshold: 3 + startupProbe: + httpGet: + path: / + port: 15672 + httpHeaders: + - name: X-Custom-Header + value: startupProbe + failureThreshold: 12 + periodSeconds: 10 volumeMounts: - mountPath: /etc/rabbitmq/enabled_plugins name: rabbitmq-confs diff --git a/helm-charts/FATE/templates/backends/spark/spark/deployment.yaml b/helm-charts/FATE/templates/backends/spark/spark/deployment.yaml index 49af20d70..c0e314e27 100644 --- a/helm-charts/FATE/templates/backends/spark/spark/deployment.yaml +++ b/helm-charts/FATE/templates/backends/spark/spark/deployment.yaml @@ -46,6 +46,39 @@ spec: - containerPort: 8080 - containerPort: 7077 - containerPort: 6066 + livenessProbe: + httpGet: + path: / + port: 8080 + httpHeaders: + - name: X-Custom-Header + value: livenessProbe + initialDelaySeconds: 1 + periodSeconds: 10 + timeoutSeconds: 3 + successThreshold: 1 + failureThreshold: 3 + readinessProbe: + httpGet: + path: / + port: 8080 + httpHeaders: + - name: X-Custom-Header + value: readinessProbe + initialDelaySeconds: 1 + periodSeconds: 10 + timeoutSeconds: 3 + successThreshold: 1 + failureThreshold: 3 + startupProbe: + httpGet: + path: / + port: 8080 + httpHeaders: + - name: X-Custom-Header + value: startupProbe + failureThreshold: 12 + periodSeconds: 10 {{- with .Values.modules.spark.master.nodeSelector }} nodeSelector: {{ toYaml . | indent 8 }} @@ -102,6 +135,39 @@ spec: name: spark-worker-confs ports: - containerPort: 8081 + livenessProbe: + httpGet: + path: / + port: 8081 + httpHeaders: + - name: X-Custom-Header + value: livenessProbe + initialDelaySeconds: 1 + periodSeconds: 10 + timeoutSeconds: 3 + successThreshold: 1 + failureThreshold: 3 + readinessProbe: + httpGet: + path: / + port: 8081 + httpHeaders: + - name: X-Custom-Header + value: readinessProbe + initialDelaySeconds: 1 + periodSeconds: 10 + timeoutSeconds: 3 + successThreshold: 1 + failureThreshold: 3 + startupProbe: + httpGet: + path: / + port: 8081 + httpHeaders: + - name: X-Custom-Header + value: startupProbe + failureThreshold: 12 + periodSeconds: 10 {{- with .Values.modules.spark.worker.nodeSelector }} nodeSelector: {{ toYaml . | indent 8 }} diff --git a/helm-charts/FATE/templates/core/client/deployment.yaml b/helm-charts/FATE/templates/core/client/deployment.yaml index dba52f897..fcc546d4c 100644 --- a/helm-charts/FATE/templates/core/client/deployment.yaml +++ b/helm-charts/FATE/templates/core/client/deployment.yaml @@ -46,6 +46,39 @@ spec: value: "{{.Values.modules.serving.ip}}:{{.Values.modules.serving.port}}" ports: - containerPort: 20000 + livenessProbe: + httpGet: + path: / + port: 20000 + httpHeaders: + - name: X-Custom-Header + value: livenessProbe + initialDelaySeconds: 1 + periodSeconds: 10 + timeoutSeconds: 3 + successThreshold: 1 + failureThreshold: 3 + readinessProbe: + httpGet: + path: / + port: 20000 + httpHeaders: + - name: X-Custom-Header + value: readinessProbe + initialDelaySeconds: 1 + periodSeconds: 10 + timeoutSeconds: 3 + successThreshold: 1 + failureThreshold: 3 + startupProbe: + httpGet: + path: / + port: 20000 + httpHeaders: + - name: X-Custom-Header + value: startupProbe + failureThreshold: 12 + periodSeconds: 10 volumeMounts: - mountPath: /data/projects/fate/persistence/ name: persistence diff --git a/helm-charts/FATE/templates/core/mysql/deployment.yaml b/helm-charts/FATE/templates/core/mysql/deployment.yaml index 3be1a0829..a0b1c98fe 100644 --- a/helm-charts/FATE/templates/core/mysql/deployment.yaml +++ b/helm-charts/FATE/templates/core/mysql/deployment.yaml @@ -52,6 +52,33 @@ spec: value: root ports: - containerPort: 3306 + livenessProbe: + exec: + command: + - mysqladmin + - ping + initialDelaySeconds: 60 + periodSeconds: 10 + timeoutSeconds: 3 + successThreshold: 1 + failureThreshold: 3 + readinessProbe: + exec: + command: + - mysqladmin + - ping + initialDelaySeconds: 10 + periodSeconds: 10 + timeoutSeconds: 3 + successThreshold: 1 + failureThreshold: 3 + startupProbe: + exec: + command: + - mysqladmin + - ping + failureThreshold: 12 + periodSeconds: 10 volumeMounts: - name: mysql-confs mountPath: /docker-entrypoint-initdb.d/ diff --git a/helm-charts/FATE/templates/core/python-spark.yaml b/helm-charts/FATE/templates/core/python-spark.yaml index 7347b821d..5ac999ef3 100644 --- a/helm-charts/FATE/templates/core/python-spark.yaml +++ b/helm-charts/FATE/templates/core/python-spark.yaml @@ -109,8 +109,10 @@ spec: value: "104868093952" {{- end }} ports: - - containerPort: 9360 - - containerPort: 9380 + - name: grpc-port + containerPort: 9360 + - name: http-port + containerPort: 9380 command: - /bin/bash - -c @@ -133,6 +135,27 @@ spec: ln -sf /dev/stdout /data/projects/fate/fateflow/logs/fate_flow/INFO.log sleep 5 && python fateflow/python/fate_flow/fate_flow_server.py + livenessProbe: + tcpSocket: + port: 9380 + initialDelaySeconds: 30 + periodSeconds: 10 + timeoutSeconds: 5 + successThreshold: 1 + failureThreshold: 3 + readinessProbe: + tcpSocket: + port: 9380 + initialDelaySeconds: 5 + periodSeconds: 10 + timeoutSeconds: 3 + successThreshold: 1 + failureThreshold: 3 + startupProbe: + tcpSocket: + port: 9380 + failureThreshold: 12 + periodSeconds: 10 volumeMounts: {{- if eq .Values.modules.python.backend "eggroll" }} - mountPath: /data/projects/fate/eggroll/conf/eggroll.properties @@ -168,6 +191,39 @@ spec: name: fateboard ports: - containerPort: 8080 + livenessProbe: + httpGet: + path: / + port: 8080 + httpHeaders: + - name: X-Custom-Header + value: livenessProbe + initialDelaySeconds: 1 + periodSeconds: 10 + timeoutSeconds: 3 + successThreshold: 1 + failureThreshold: 3 + readinessProbe: + httpGet: + path: / + port: 8080 + httpHeaders: + - name: X-Custom-Header + value: readinessProbe + initialDelaySeconds: 1 + periodSeconds: 10 + timeoutSeconds: 3 + successThreshold: 1 + failureThreshold: 3 + startupProbe: + httpGet: + path: / + port: 8080 + httpHeaders: + - name: X-Custom-Header + value: startupProbe + failureThreshold: 12 + periodSeconds: 10 volumeMounts: - mountPath: /data/projects/fate/fateboard/conf/application.properties name: fateboard-confs diff --git a/helm-charts/Images_list.md b/helm-charts/Images_list.md index 971d357fd..3f378e0a7 100644 --- a/helm-charts/Images_list.md +++ b/helm-charts/Images_list.md @@ -12,12 +12,12 @@ FATE: - fluent/fluentd:v1.12 - federatedai/spark-master:${version-tag} - federatedai/spark-worker:${version-tag} -- hadoop-datanode:2.0.0-hadoop2.7.4-java8 -- hadoop-namenode:2.0.0-hadoop2.7.4-java8 +- federatedai/hadoop-datanode:2.0.0-hadoop2.7.4-java8 +- federatedai/hadoop-namenode:2.0.0-hadoop2.7.4-java8 - nginx:1.17 - federatedai/nginx:${version-tag} -- rabbitmq:3.8.3-management -- pulsar:2.7.0 +- federatedai/rabbitmq:3.8.3-management +- federatedai/pulsar:2.7.0 From ddcc39434c00212f7665b2b63c74d27c41615889 Mon Sep 17 00:00:00 2001 From: owlet42 Date: Fri, 25 Mar 2022 15:44:30 +0800 Subject: [PATCH 06/14] add healthcheck for docker-compose python Signed-off-by: owlet42 --- docker-deploy/training_template/docker-compose-eggroll.yml | 6 ++++++ .../training_template/docker-compose-spark-slim.yml | 6 ++++++ docker-deploy/training_template/docker-compose-spark.yml | 6 ++++++ 3 files changed, 18 insertions(+) diff --git a/docker-deploy/training_template/docker-compose-eggroll.yml b/docker-deploy/training_template/docker-compose-eggroll.yml index 3f3c47612..03c18429a 100644 --- a/docker-deploy/training_template/docker-compose-eggroll.yml +++ b/docker-deploy/training_template/docker-compose-eggroll.yml @@ -117,6 +117,12 @@ services: networks: fate-network: ipv4_address: 192.167.0.100 + healthcheck: + test: ["CMD", "curl", "-f", "-X POST", "http://192.167.0.100:9380/v1/version/get"] + interval: 1m30s + timeout: 10s + retries: 3 + start_period: 40s command: - "/bin/bash" - "-c" diff --git a/docker-deploy/training_template/docker-compose-spark-slim.yml b/docker-deploy/training_template/docker-compose-spark-slim.yml index 70d0402f4..734a922f0 100644 --- a/docker-deploy/training_template/docker-compose-spark-slim.yml +++ b/docker-deploy/training_template/docker-compose-spark-slim.yml @@ -71,6 +71,12 @@ services: networks: fate-network: ipv4_address: 192.167.0.100 + healthcheck: + test: ["CMD", "curl", "-f", "-X POST", "http://192.167.0.100:9380/v1/version/get"] + interval: 1m30s + timeout: 10s + retries: 3 + start_period: 40s command: - "/bin/bash" - "-c" diff --git a/docker-deploy/training_template/docker-compose-spark.yml b/docker-deploy/training_template/docker-compose-spark.yml index 66e2a2577..1eec33416 100644 --- a/docker-deploy/training_template/docker-compose-spark.yml +++ b/docker-deploy/training_template/docker-compose-spark.yml @@ -70,6 +70,12 @@ services: networks: fate-network: ipv4_address: 192.167.0.100 + healthcheck: + test: ["CMD", "curl", "-f", "-X POST", "http://192.167.0.100:9380/v1/version/get"] + interval: 1m30s + timeout: 10s + retries: 3 + start_period: 40s command: - "/bin/bash" - "-c" From 1d43fd957918d4a218c8c9f9c303d8b447b1e53d Mon Sep 17 00:00:00 2001 From: Chen Date: Tue, 29 Mar 2022 15:04:29 +0800 Subject: [PATCH 07/14] Use the ingress class to map an ingress to an ingress controller (#571) * Remove the annotation for the ingress, and introduce the ingress class resource Signed-off-by: Chen Jing * Fix the FATE task failure caused by not setting fateflow loglevel (#559) Signed-off-by: owlet42 Signed-off-by: Chen Jing * Fix getting "the server could not find the requested resource" when using `kubefate describe` (#553) * fix kubefate bug in k8s v1.22+ kubefate cluster describe got "the server could not find the requested resource" because k8s API 'networkingv1beta1' is deprecated Signed-off-by: ChenLong Ma Signed-off-by: owlet42 * Add version for bug Signed-off-by: ChenLong Ma Signed-off-by: owlet42 * fix Deployment resources in special states are not recognized. When the pod is in ImagePullBackOff Signed-off-by: ChenLong Ma Signed-off-by: owlet42 * fix swag api error Signed-off-by: owlet42 * update go.mod Signed-off-by: owlet42 Co-authored-by: Layne Peng Signed-off-by: Chen Jing * Support customize the ingress controller for fate services Signed-off-by: Chen Jing * add liveness and readiness of kubefate service Signed-off-by: owlet42 Signed-off-by: Chen Jing * add 'liveness' 'readiness' and 'startup' for FATE chart Signed-off-by: owlet42 Signed-off-by: Chen Jing * add healthcheck for docker-compose python Signed-off-by: owlet42 Signed-off-by: Chen Jing * Do not define the ingressclass for the customers Signed-off-by: Chen Jing * Set the default ingress class to nginx Signed-off-by: Chen Jing * Fix a little issue about the ingress class name Signed-off-by: Chen Jing Co-authored-by: ChenLong Ma Co-authored-by: Layne Peng --- .../backends/spark/pulsar/ingress.yaml | 1 + .../backends/spark/rabbitmq/ingress.yaml | 1 + .../backends/spark/spark/ingress.yaml | 1 + .../FATE/templates/core/client/ingress.yaml | 1 + .../templates/core/fateboard/ingress.yaml | 1 + helm-charts/FATE/values-template-example.yaml | 4 ++-- helm-charts/FATE/values-template.yaml | 22 ++++++++++--------- helm-charts/FATE/values.yaml | 20 +++++++++-------- k8s-deploy/.gitignore | 1 + k8s-deploy/cluster-spark-pulsar.yaml | 19 +++++----------- k8s-deploy/cluster-spark-rabbitmq.yaml | 11 +--------- k8s-deploy/cluster-spark-slim.yaml | 11 +--------- k8s-deploy/cluster.yaml | 13 ++--------- .../cluster-spark-local-pulsar.yaml | 9 +------- .../party-10000/cluster-spark-pulsar.yaml | 9 +------- .../party-10000/cluster-spark-rabbitmq.yaml | 9 +------- k8s-deploy/examples/party-10000/cluster.yaml | 5 +---- .../cluster-spark-local-pulsar.yaml | 9 +------- .../party-9999/cluster-spark-pulsar.yaml | 9 +------- .../party-9999/cluster-spark-rabbitmq.yaml | 9 +------- k8s-deploy/examples/party-9999/cluster.yaml | 7 ++---- k8s-deploy/kubefate.yaml | 7 +++--- 22 files changed, 52 insertions(+), 127 deletions(-) create mode 100644 k8s-deploy/.gitignore diff --git a/helm-charts/FATE/templates/backends/spark/pulsar/ingress.yaml b/helm-charts/FATE/templates/backends/spark/pulsar/ingress.yaml index 6f513d694..6b10d44fb 100644 --- a/helm-charts/FATE/templates/backends/spark/pulsar/ingress.yaml +++ b/helm-charts/FATE/templates/backends/spark/pulsar/ingress.yaml @@ -22,6 +22,7 @@ metadata: {{ toYaml .Values.ingress.pulsar.annotations | indent 4 }} {{- end }} spec: + ingressClassName: {{ .Values.ingressClassName }} rules: {{- range .Values.ingress.pulsar.hosts }} - host: {{ .name }} diff --git a/helm-charts/FATE/templates/backends/spark/rabbitmq/ingress.yaml b/helm-charts/FATE/templates/backends/spark/rabbitmq/ingress.yaml index 12edd9c71..91d2988cd 100644 --- a/helm-charts/FATE/templates/backends/spark/rabbitmq/ingress.yaml +++ b/helm-charts/FATE/templates/backends/spark/rabbitmq/ingress.yaml @@ -22,6 +22,7 @@ metadata: {{ toYaml .Values.ingress.rabbitmq.annotations | indent 4 }} {{- end }} spec: + ingressClassName: {{ .Values.ingressClassName }} rules: {{- range .Values.ingress.rabbitmq.hosts }} - host: {{ .name }} diff --git a/helm-charts/FATE/templates/backends/spark/spark/ingress.yaml b/helm-charts/FATE/templates/backends/spark/spark/ingress.yaml index 49545dd2f..947bd466e 100644 --- a/helm-charts/FATE/templates/backends/spark/spark/ingress.yaml +++ b/helm-charts/FATE/templates/backends/spark/spark/ingress.yaml @@ -22,6 +22,7 @@ metadata: {{ toYaml .Values.ingress.spark.annotations | indent 4 }} {{- end }} spec: + ingressClassName: {{ .Values.ingressClassName }} rules: {{- range .Values.ingress.spark.hosts }} - host: {{ .name }} diff --git a/helm-charts/FATE/templates/core/client/ingress.yaml b/helm-charts/FATE/templates/core/client/ingress.yaml index be920243e..d15ca015c 100644 --- a/helm-charts/FATE/templates/core/client/ingress.yaml +++ b/helm-charts/FATE/templates/core/client/ingress.yaml @@ -22,6 +22,7 @@ metadata: {{ toYaml .Values.ingress.client.annotations | indent 4 }} {{- end }} spec: + ingressClassName: {{ .Values.ingressClassName }} rules: {{- range .Values.ingress.client.hosts }} - host: {{ .name }} diff --git a/helm-charts/FATE/templates/core/fateboard/ingress.yaml b/helm-charts/FATE/templates/core/fateboard/ingress.yaml index cf82bff5d..a24e57787 100644 --- a/helm-charts/FATE/templates/core/fateboard/ingress.yaml +++ b/helm-charts/FATE/templates/core/fateboard/ingress.yaml @@ -22,6 +22,7 @@ metadata: {{ toYaml .Values.ingress.fateboard.annotations | indent 4 }} {{- end }} spec: + ingressClassName: {{ .Values.ingressClassName }} rules: {{- range .Values.ingress.fateboard.hosts }} - host: {{ .name }} diff --git a/helm-charts/FATE/values-template-example.yaml b/helm-charts/FATE/values-template-example.yaml index 4a7778de4..85cd3ac7f 100644 --- a/helm-charts/FATE/values-template-example.yaml +++ b/helm-charts/FATE/values-template-example.yaml @@ -13,6 +13,7 @@ istio: enabled: false podSecurityPolicy: enabled: false +ingressClassName: nginx modules: - rollsite - clustermanager @@ -31,7 +32,7 @@ modules: backend: eggroll # ingress: - # fateboard: + # fateboard: # annotations: # hosts: # - name: party9999.fateboard.example.com @@ -337,4 +338,3 @@ backend: eggroll # port: 30105 # sslPort: 30109 # proxy: "" - \ No newline at end of file diff --git a/helm-charts/FATE/values-template.yaml b/helm-charts/FATE/values-template.yaml index daf546e67..24361ccbd 100644 --- a/helm-charts/FATE/values-template.yaml +++ b/helm-charts/FATE/values-template.yaml @@ -17,9 +17,9 @@ partyName: {{ .name }} {{- with .ingress }} ingress: {{- with .fateboard }} - fateboard: + fateboard: {{- with .annotations }} - annotations: + annotations: {{ toYaml . | indent 6 }} {{- end }} {{- with .hosts }} @@ -33,9 +33,9 @@ ingress: {{- end }} {{- with .client }} - client: + client: {{- with .annotations }} - annotations: + annotations: {{ toYaml . | indent 6 }} {{- end }} {{- with .hosts }} @@ -49,9 +49,9 @@ ingress: {{- end }} {{- with .spark }} - spark: + spark: {{- with .annotations }} - annotations: + annotations: {{ toYaml . | indent 6 }} {{- end }} {{- with .hosts }} @@ -65,9 +65,9 @@ ingress: {{- end }} {{- with .rabbitmq }} - rabbitmq: + rabbitmq: {{- with .annotations }} - annotations: + annotations: {{ toYaml . | indent 6 }} {{- end }} {{- with .hosts }} @@ -81,9 +81,9 @@ ingress: {{- end }} {{- with .pulsar }} - pulsar: + pulsar: {{- with .annotations }} - annotations: + annotations: {{ toYaml . | indent 6 }} {{- end }} {{- with .hosts }} @@ -108,6 +108,8 @@ podSecurityPolicy: enabled: {{ .enabled | default false }} {{- end }} +ingressClassName: {{ .ingressClassName | default "nginx"}} + exchange: {{- with .rollsite }} {{- with .exchange }} diff --git a/helm-charts/FATE/values.yaml b/helm-charts/FATE/values.yaml index de2aa5a42..e6349f7b9 100644 --- a/helm-charts/FATE/values.yaml +++ b/helm-charts/FATE/values.yaml @@ -16,9 +16,11 @@ istio: podSecurityPolicy: enabled: false +ingressClassName: nginx + ingress: - fateboard: - # annotations: + fateboard: + # annotations: hosts: - name: fateboard.example.com path: / @@ -26,25 +28,25 @@ ingress: # - secretName: my-tls-secret # hosts: # - fateboard.example.com - client: - # annotations: + client: + # annotations: hosts: - name: notebook.example.com path: / tls: [] - spark: - # annotations: + spark: + # annotations: hosts: - name: spark.example.com path: / tls: [] - rabbitmq: - # annotations: + rabbitmq: + # annotations: hosts: - name: rabbitmq.example.com path: / tls: [] - pulsar: + pulsar: # annotations: hosts: - name: pulsar.example.com diff --git a/k8s-deploy/.gitignore b/k8s-deploy/.gitignore new file mode 100644 index 000000000..5657f6ea7 --- /dev/null +++ b/k8s-deploy/.gitignore @@ -0,0 +1 @@ +vendor \ No newline at end of file diff --git a/k8s-deploy/cluster-spark-pulsar.yaml b/k8s-deploy/cluster-spark-pulsar.yaml index a01c916b3..5a4ce8661 100644 --- a/k8s-deploy/cluster-spark-pulsar.yaml +++ b/k8s-deploy/cluster-spark-pulsar.yaml @@ -13,6 +13,7 @@ istio: enabled: false podSecurityPolicy: enabled: false +ingressClassName: nginx modules: - mysql - python @@ -29,28 +30,18 @@ backend: spark_pulsar # Specify domain name for service # ingress: # fateboard: - # annotations: - # kubernetes.io/ingress.class: "nginx" # hosts: # - name: party9999.fateboard.example.com - # client: - # annotations: - # kubernetes.io/ingress.class: "nginx" + # client: # hosts: # - name: party9999.notebook.example.com - # spark: - # annotations: - # kubernetes.io/ingress.class: "nginx" + # spark: # hosts: # - name: party9999.spark.example.com - # rabbitmq: - # annotations: - # kubernetes.io/ingress.class: "nginx" + # rabbitmq: # hosts: # - name: party9999.rabbitmq.example.com - # pulsar: - # annotations: - # kubernetes.io/ingress.class: "nginx" + # pulsar: # hosts: # - name: party9999.pulsar.example.com diff --git a/k8s-deploy/cluster-spark-rabbitmq.yaml b/k8s-deploy/cluster-spark-rabbitmq.yaml index 54479e49c..e51ebd743 100644 --- a/k8s-deploy/cluster-spark-rabbitmq.yaml +++ b/k8s-deploy/cluster-spark-rabbitmq.yaml @@ -13,6 +13,7 @@ istio: enabled: false podSecurityPolicy: enabled: false +ingressClassName: nginx modules: - mysql - python @@ -29,28 +30,18 @@ backend: spark_rabbitmq # Specify domain name for service # ingress: # fateboard: - # annotations: - # kubernetes.io/ingress.class: "nginx" # hosts: # - name: party9999.fateboard.example.com # client: - # annotations: - # kubernetes.io/ingress.class: "nginx" # hosts: # - name: party9999.notebook.example.com # spark: - # annotations: - # kubernetes.io/ingress.class: "nginx" # hosts: # - name: party9999.spark.example.com # rabbitmq: - # annotations: - # kubernetes.io/ingress.class: "nginx" # hosts: # - name: party9999.rabbitmq.example.com # pulsar: - # annotations: - # kubernetes.io/ingress.class: "nginx" # hosts: # - name: party9999.pulsar.example.com diff --git a/k8s-deploy/cluster-spark-slim.yaml b/k8s-deploy/cluster-spark-slim.yaml index d56f274be..fcd37eb87 100644 --- a/k8s-deploy/cluster-spark-slim.yaml +++ b/k8s-deploy/cluster-spark-slim.yaml @@ -13,6 +13,7 @@ istio: enabled: false podSecurityPolicy: enabled: false +ingressClassName: nginx modules: - mysql - python @@ -27,28 +28,18 @@ backend: spark_local_pulsar # Specify domain name for service # ingress: # fateboard: - # annotations: - # kubernetes.io/ingress.class: "nginx" # hosts: # - name: party9999.fateboard.example.com # client: - # annotations: - # kubernetes.io/ingress.class: "nginx" # hosts: # - name: party9999.notebook.example.com # spark: - # annotations: - # kubernetes.io/ingress.class: "nginx" # hosts: # - name: party9999.spark.example.com # rabbitmq: - # annotations: - # kubernetes.io/ingress.class: "nginx" # hosts: # - name: party9999.rabbitmq.example.com # pulsar: - # annotations: - # kubernetes.io/ingress.class: "nginx" # hosts: # - name: party9999.pulsar.example.com diff --git a/k8s-deploy/cluster.yaml b/k8s-deploy/cluster.yaml index f96a6123f..8f019ca46 100644 --- a/k8s-deploy/cluster.yaml +++ b/k8s-deploy/cluster.yaml @@ -13,6 +13,7 @@ istio: enabled: false podSecurityPolicy: enabled: false +ingressClassName: nginx modules: - rollsite - clustermanager @@ -29,28 +30,18 @@ backend: eggroll # Specify domain name for service # ingress: # fateboard: - # annotations: - # kubernetes.io/ingress.class: "nginx" # hosts: # - name: party9999.fateboard.example.com # client: - # annotations: - # kubernetes.io/ingress.class: "nginx" # hosts: # - name: party9999.notebook.example.com # spark: - # annotations: - # kubernetes.io/ingress.class: "nginx" # hosts: # - name: party9999.spark.example.com # rabbitmq: - # annotations: - # kubernetes.io/ingress.class: "nginx" # hosts: # - name: party9999.rabbitmq.example.com # pulsar: - # annotations: - # kubernetes.io/ingress.class: "nginx" # hosts: # - name: party9999.pulsar.example.com @@ -168,4 +159,4 @@ backend: eggroll # Specify serving configuration # servingIp: 192.168.0.1 -# servingPort: 30095 \ No newline at end of file +# servingPort: 30095 diff --git a/k8s-deploy/examples/party-10000/cluster-spark-local-pulsar.yaml b/k8s-deploy/examples/party-10000/cluster-spark-local-pulsar.yaml index 7b1416338..ac9b9f3aa 100644 --- a/k8s-deploy/examples/party-10000/cluster-spark-local-pulsar.yaml +++ b/k8s-deploy/examples/party-10000/cluster-spark-local-pulsar.yaml @@ -11,6 +11,7 @@ imagePullSecrets: persistence: false istio: enabled: false +ingressClassName: nginx podSecurityPolicy: enabled: false modules: @@ -25,23 +26,15 @@ backend: spark_local_pulsar ingress: fateboard: - annotations: - kubernetes.io/ingress.class: "nginx" hosts: - name: party10000.fateboard.example.com client: - annotations: - kubernetes.io/ingress.class: "nginx" hosts: - name: party10000.notebook.example.com spark: - annotations: - kubernetes.io/ingress.class: "nginx" hosts: - name: party10000.spark.example.com pulsar: - annotations: - kubernetes.io/ingress.class: "nginx" hosts: - name: party10000.pulsar.example.com diff --git a/k8s-deploy/examples/party-10000/cluster-spark-pulsar.yaml b/k8s-deploy/examples/party-10000/cluster-spark-pulsar.yaml index ec962fc62..64b03237b 100644 --- a/k8s-deploy/examples/party-10000/cluster-spark-pulsar.yaml +++ b/k8s-deploy/examples/party-10000/cluster-spark-pulsar.yaml @@ -11,6 +11,7 @@ imagePullSecrets: persistence: false istio: enabled: false +ingressClassName: nginx podSecurityPolicy: enabled: false modules: @@ -27,23 +28,15 @@ backend: spark_pulsar ingress: fateboard: - annotations: - kubernetes.io/ingress.class: "nginx" hosts: - name: party10000.fateboard.example.com client: - annotations: - kubernetes.io/ingress.class: "nginx" hosts: - name: party10000.notebook.example.com spark: - annotations: - kubernetes.io/ingress.class: "nginx" hosts: - name: party10000.spark.example.com pulsar: - annotations: - kubernetes.io/ingress.class: "nginx" hosts: - name: party10000.pulsar.example.com diff --git a/k8s-deploy/examples/party-10000/cluster-spark-rabbitmq.yaml b/k8s-deploy/examples/party-10000/cluster-spark-rabbitmq.yaml index 2697ccf35..4acb5d82b 100644 --- a/k8s-deploy/examples/party-10000/cluster-spark-rabbitmq.yaml +++ b/k8s-deploy/examples/party-10000/cluster-spark-rabbitmq.yaml @@ -11,6 +11,7 @@ imagePullSecrets: persistence: false istio: enabled: false +ingressClassName: nginx podSecurityPolicy: enabled: false modules: @@ -27,23 +28,15 @@ backend: spark_rabbitmq ingress: fateboard: - annotations: - kubernetes.io/ingress.class: "nginx" hosts: - name: party10000.fateboard.example.com client: - annotations: - kubernetes.io/ingress.class: "nginx" hosts: - name: party10000.notebook.example.com spark: - annotations: - kubernetes.io/ingress.class: "nginx" hosts: - name: party10000.spark.example.com rabbitmq: - annotations: - kubernetes.io/ingress.class: "nginx" hosts: - name: party10000.rabbitmq.example.com diff --git a/k8s-deploy/examples/party-10000/cluster.yaml b/k8s-deploy/examples/party-10000/cluster.yaml index 2c6705a71..c0baddd7e 100644 --- a/k8s-deploy/examples/party-10000/cluster.yaml +++ b/k8s-deploy/examples/party-10000/cluster.yaml @@ -13,6 +13,7 @@ istio: enabled: false podSecurityPolicy: enabled: false +ingressClassName: nginx modules: - rollsite - clustermanager @@ -26,13 +27,9 @@ backend: eggroll ingress: fateboard: - annotations: - kubernetes.io/ingress.class: "nginx" hosts: - name: party10000.fateboard.example.com client: - annotations: - kubernetes.io/ingress.class: "nginx" hosts: - name: party10000.notebook.example.com diff --git a/k8s-deploy/examples/party-9999/cluster-spark-local-pulsar.yaml b/k8s-deploy/examples/party-9999/cluster-spark-local-pulsar.yaml index a435735f1..ca7aa6f67 100644 --- a/k8s-deploy/examples/party-9999/cluster-spark-local-pulsar.yaml +++ b/k8s-deploy/examples/party-9999/cluster-spark-local-pulsar.yaml @@ -13,6 +13,7 @@ istio: enabled: false podSecurityPolicy: enabled: false +ingressClassName: nginx modules: - python - mysql @@ -25,23 +26,15 @@ backend: spark_local_pulsar ingress: fateboard: - annotations: - kubernetes.io/ingress.class: "nginx" hosts: - name: party9999.fateboard.example.com client: - annotations: - kubernetes.io/ingress.class: "nginx" hosts: - name: party9999.notebook.example.com spark: - annotations: - kubernetes.io/ingress.class: "nginx" hosts: - name: party9999.spark.example.com pulsar: - annotations: - kubernetes.io/ingress.class: "nginx" hosts: - name: party9999.pulsar.example.com diff --git a/k8s-deploy/examples/party-9999/cluster-spark-pulsar.yaml b/k8s-deploy/examples/party-9999/cluster-spark-pulsar.yaml index d2ae589a0..953679b2d 100644 --- a/k8s-deploy/examples/party-9999/cluster-spark-pulsar.yaml +++ b/k8s-deploy/examples/party-9999/cluster-spark-pulsar.yaml @@ -13,6 +13,7 @@ istio: enabled: false podSecurityPolicy: enabled: false +ingressClassName: nginx modules: - python - mysql @@ -27,23 +28,15 @@ backend: spark_pulsar ingress: fateboard: - annotations: - kubernetes.io/ingress.class: "nginx" hosts: - name: party9999.fateboard.example.com client: - annotations: - kubernetes.io/ingress.class: "nginx" hosts: - name: party9999.notebook.example.com spark: - annotations: - kubernetes.io/ingress.class: "nginx" hosts: - name: party9999.spark.example.com pulsar: - annotations: - kubernetes.io/ingress.class: "nginx" hosts: - name: party9999.pulsar.example.com diff --git a/k8s-deploy/examples/party-9999/cluster-spark-rabbitmq.yaml b/k8s-deploy/examples/party-9999/cluster-spark-rabbitmq.yaml index f094a5415..a27477e79 100644 --- a/k8s-deploy/examples/party-9999/cluster-spark-rabbitmq.yaml +++ b/k8s-deploy/examples/party-9999/cluster-spark-rabbitmq.yaml @@ -13,6 +13,7 @@ istio: enabled: false podSecurityPolicy: enabled: false +ingressClassName: nginx modules: - python - mysql @@ -27,23 +28,15 @@ backend: spark_rabbitmq ingress: fateboard: - annotations: - kubernetes.io/ingress.class: "nginx" hosts: - name: party9999.fateboard.example.com client: - annotations: - kubernetes.io/ingress.class: "nginx" hosts: - name: party9999.notebook.example.com spark: - annotations: - kubernetes.io/ingress.class: "nginx" hosts: - name: party9999.spark.example.com rabbitmq: - annotations: - kubernetes.io/ingress.class: "nginx" hosts: - name: party9999.rabbitmq.example.com diff --git a/k8s-deploy/examples/party-9999/cluster.yaml b/k8s-deploy/examples/party-9999/cluster.yaml index cf4d21b75..9cd94fc84 100644 --- a/k8s-deploy/examples/party-9999/cluster.yaml +++ b/k8s-deploy/examples/party-9999/cluster.yaml @@ -13,6 +13,7 @@ istio: enabled: false podSecurityPolicy: enabled: false +ingressClassName: nginx modules: - rollsite - clustermanager @@ -25,14 +26,10 @@ modules: backend: eggroll ingress: - fateboard: - annotations: - kubernetes.io/ingress.class: "nginx" + fateboard: hosts: - name: party9999.fateboard.example.com client: - annotations: - kubernetes.io/ingress.class: "nginx" hosts: - name: party9999.notebook.example.com diff --git a/k8s-deploy/kubefate.yaml b/k8s-deploy/kubefate.yaml index cf4d61d98..d7221f682 100644 --- a/k8s-deploy/kubefate.yaml +++ b/k8s-deploy/kubefate.yaml @@ -241,9 +241,8 @@ kind: Ingress metadata: name: kubefate namespace: kube-fate - annotations: - kubernetes.io/ingress.class: "nginx" spec: + ingressClassName: nginx rules: - host: example.com http: @@ -253,5 +252,5 @@ spec: backend: service: name: kubefate - port: - number: 8080 + port: + number: 8080 \ No newline at end of file From af985da7b322a3bb310d2abc246625d95e831a4e Mon Sep 17 00:00:00 2001 From: Chen Jing Date: Tue, 29 Mar 2022 16:36:14 +0800 Subject: [PATCH 08/14] Optimize the docs Signed-off-by: Chen Jing --- .../FATE_cluster_configuration.md | 233 +++++++++--------- k8s-deploy/README.md | 14 +- 2 files changed, 124 insertions(+), 123 deletions(-) diff --git a/docs/configurations/FATE_cluster_configuration.md b/docs/configurations/FATE_cluster_configuration.md index 0ec8b3011..2b8ec3a20 100644 --- a/docs/configurations/FATE_cluster_configuration.md +++ b/docs/configurations/FATE_cluster_configuration.md @@ -2,39 +2,40 @@ `cluster.yaml` declares information about the FATE cluster to be deployed, which KubeFATE CLI uses to deploy the FATE cluster. ## cluster.yaml -| Name | Type | Description | -| ------------------------- | ------------------ | ------------------------------------------------------------ | -| * name | scalars | FATE cluster name. | -| * namespace | scalars | Kubernetes namespace for FATE cluster. | -| * chartName | scalars | FATE chart name. (fate/fate-serving) | -| * chartVersion | scalars | FATE chart corresponding version. | -| * partyId | scalars | FATE cluster party id. | -| registry | scalars | Other fate images sources. | -| pullPolicy | scalars | kubernetes images pull policy | -| imagePullSecrets | sequences | The imagePullSecrets names for all deployments | -| * persistence | bool | mysql and nodemanager data persistence. | -| istio.enable | bool | enable istio | -| podSecurityPolicy.enabled | bool | if `true`, create & use Pod Security Policy resources | -| * modules | sequences | Modules to be deployed in the FATE cluster. | -| backend | set(eggroll,spark) | Configure cluster computing engine( eggroll or spark) | -| ingress | mappings | Custom domain of FATE UI component | -| rollsite | mappings | Configuration of FATE cluster `rollsite` module. | -| nodemanager | mappings | Configuration of FATE cluster `nodemanager` module. | -| python | mappings | Configuration of FATE cluster `python` module. | -| fateboard | mappings | Configuration of FATE cluster `fateboard` module. | -| client | mappings | Configuration of FATE cluster `client` module. | +| Name | Type | Description | +|---------------------------|--------------------|--------------------------------------------------------------------------------------------------------| +| * name | scalars | FATE cluster name. | +| * namespace | scalars | Kubernetes namespace for FATE cluster. | +| * chartName | scalars | FATE chart name. (fate/fate-serving) | +| * chartVersion | scalars | FATE chart corresponding version. | +| * partyId | scalars | FATE cluster party id. | +| registry | scalars | Other fate images sources. | +| pullPolicy | scalars | kubernetes images pull policy | +| imagePullSecrets | sequences | The imagePullSecrets names for all deployments | +| * persistence | bool | mysql and nodemanager data persistence. | +| istio.enable | bool | enable istio | +| podSecurityPolicy.enabled | bool | if `true`, create & use Pod Security Policy resources | +| ingressClassName | mappings | The Ingress class name, such as "nginx". | +| * modules | sequences | Modules to be deployed in the FATE cluster. | +| backend | set(eggroll,spark) | Configure cluster computing engine( eggroll or spark) | +| ingress | mappings | Custom domain of FATE UI component | +| rollsite | mappings | Configuration of FATE cluster `rollsite` module. | +| nodemanager | mappings | Configuration of FATE cluster `nodemanager` module. | +| python | mappings | Configuration of FATE cluster `python` module. | +| fateboard | mappings | Configuration of FATE cluster `fateboard` module. | +| client | mappings | Configuration of FATE cluster `client` module. | | mysql | mappings | Configuration of FATE cluster `mysql` module.
If you use your own redis, please delete this item. | -| externalMysqlIp | scalars | Access your own MySQL. | -| externalMysqlPort | scalars | Access your own MySQL. | -| externalMysqlDatabase | scalars | Access your own MySQL. | -| externalMysqlUser | scalars | Access your own MySQL. | -| externalMysqlPassword | scalars | Access your own MySQL. | -| servingIp | scalars | Serving cluster connected to fate. | -| servingPort | scalars | Serving cluster connected to fate. | -| spark | mappings | Configuration of FATE cluster `spark` module. | -| hdfs | mappings | Configuration of FATE cluster `hdfs` module. | -| nginx | mappings | Configuration of FATE cluster `nginx` module. | -| rabbitmq | mappings | Configuration of FATE cluster `rabbitmq` module. | +| externalMysqlIp | scalars | Access your own MySQL. | +| externalMysqlPort | scalars | Access your own MySQL. | +| externalMysqlDatabase | scalars | Access your own MySQL. | +| externalMysqlUser | scalars | Access your own MySQL. | +| externalMysqlPassword | scalars | Access your own MySQL. | +| servingIp | scalars | Serving cluster connected to fate. | +| servingPort | scalars | Serving cluster connected to fate. | +| spark | mappings | Configuration of FATE cluster `spark` module. | +| hdfs | mappings | Configuration of FATE cluster `hdfs` module. | +| nginx | mappings | Configuration of FATE cluster `nginx` module. | +| rabbitmq | mappings | Configuration of FATE cluster `rabbitmq` module. | @@ -57,42 +58,42 @@ ### ingress mappings -| Name | Type | Description | -| ----------------------- | ----------------- | ------------------------------------------------------------ | -| `fateboard` | mappings | Configuration of Fateboard UI domain | -| `fateboard.annotations` | mappings | The annotations used commonly for ingresses | -| `fateboard.hosts` | sequences | Set hosts list of ingress record | -| `fateboard.tls` | sequences | Set this to enable TLS on the ingress record | -| `client` | mappings | Configuration of Notebook UI domain | -| `client.annotations` | mappings | The annotations used commonly for ingresses | +| Name | Type | Description | +|-------------------------|-------------------|------------------------------------------------------------------| +| `fateboard` | mappings | Configuration of Fateboard UI domain | +| `fateboard.annotations` | mappings | The annotations used commonly for ingresses | +| `fateboard.hosts` | sequences | Set hosts list of ingress record | +| `fateboard.tls` | sequences | Set this to enable TLS on the ingress record | +| `client` | mappings | Configuration of Notebook UI domain | +| `client.annotations` | mappings | The annotations used commonly for ingresses | | `client.hosts` | sequencesmappings | Set hosts list of ingress recordConfiguration of Spark UI domain | -| `client.tls` | sequences | Set this to enable TLS on the ingress record | -| `spark` | mappings | Configuration of spark UI domain | -| `rabbitmq` | mappings | Configuration of Rabbitmq UI domain | +| `client.tls` | sequences | Set this to enable TLS on the ingress record | +| `spark` | mappings | Configuration of spark UI domain | +| `rabbitmq` | mappings | Configuration of Rabbitmq UI domain | ### rollsite mappings It is used to declare the `rollsite ` module in the FATE cluster to be deployed. -| Name | subitem | Type | Description | -| ------------ | ----------- | --------- | ------------------------------------------------------------ | -| type | | scalars | Kubernetes ServiceTypes, default is NodePort. | -| nodePort | | scalars | The port used by `proxy` module's kubernetes service, default range: 30000-32767. | +| Name | subitem | Type | Description | +|--------------|-------------|-----------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| type | | scalars | Kubernetes ServiceTypes, default is NodePort. | +| nodePort | | scalars | The port used by `proxy` module's kubernetes service, default range: 30000-32767. | | partyList | | sequences | If this FATE cluster is exchange cluster, partyList is all party's sequences of all parties proxy address. If this FATE cluster is one of participants, delete this configuration item. | -| partyList | partyId | scalars | Participant FATE cluster party ID. | -| partyList | partyIp | scalars | Participant FATE cluster IP. | -| partyList | partyPort | scalars | Participant FATE cluster port. | -| exchange | | mappings | FATE cluster `exchange` module's ip and port. | -| exchange | ip | mappings | FATE cluster `exchange` module's ip. . | -| exchange | port | mappings | FATE cluster `exchange` module's port. | -| nodeSelector | | mappings | kubernetes nodeSelector. | -| polling | | | rollsite support polling | -| polling | enabled | | enable polling | -| polling | type | | polling type (server/client) | -| polling | server | | if type choose client, you need a polling server. | -| polling | clientList | | if type choose server, this rollsite serve for clientList. | -| polling | concurrency | | if type choose server, polling client concurrency. | +| partyList | partyId | scalars | Participant FATE cluster party ID. | +| partyList | partyIp | scalars | Participant FATE cluster IP. | +| partyList | partyPort | scalars | Participant FATE cluster port. | +| exchange | | mappings | FATE cluster `exchange` module's ip and port. | +| exchange | ip | mappings | FATE cluster `exchange` module's ip. . | +| exchange | port | mappings | FATE cluster `exchange` module's port. | +| nodeSelector | | mappings | kubernetes nodeSelector. | +| polling | | | rollsite support polling | +| polling | enabled | | enable polling | +| polling | type | | polling type (server/client) | +| polling | server | | if type choose client, you need a polling server. | +| polling | clientList | | if type choose server, this rollsite serve for clientList. | +| polling | concurrency | | if type choose server, polling client concurrency. | FATE cluster has two deployment modes: with exchange and without exchange. #### Exchange mode: @@ -107,48 +108,48 @@ The parties are directly connected. ### nodemanager mappings -| Name | SubItem | Type | Description | -| -------------------------- | -------------------------- | --------- | ------------------------------------------------------------ | -| count | | scalars | Number of nodes deployed nodemanager. | -| session-Processors-PerNode | | scalars | Configuration of FATE cluster `nodemanager` module. | -| list | | sequences | List of nodemanager nodes. | -| list | name | scalars | nodemanager node name. | -| list | nodeSelector | mappings | kubernetes nodeSelector. | -| list | session-Processors-PerNode | scalars | Configuration of FATE cluster `nodemanager` module. | -| list | subPath | scalars | Path of data persistence, specify the "subPath" if the PVC is shared with other components. | -| list | existingClaim | scalars | Use the existing PVC which must be created manually before bound. | +| Name | SubItem | Type | Description | +|----------------------------|----------------------------|-----------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------| +| count | | scalars | Number of nodes deployed nodemanager. | +| session-Processors-PerNode | | scalars | Configuration of FATE cluster `nodemanager` module. | +| list | | sequences | List of nodemanager nodes. | +| list | name | scalars | nodemanager node name. | +| list | nodeSelector | mappings | kubernetes nodeSelector. | +| list | session-Processors-PerNode | scalars | Configuration of FATE cluster `nodemanager` module. | +| list | subPath | scalars | Path of data persistence, specify the "subPath" if the PVC is shared with other components. | +| list | existingClaim | scalars | Use the existing PVC which must be created manually before bound. | | list | storageClass | scalars | Specify the "storageClass" used to provision the volume. Or the default. StorageClass will be used(the default). Set it to "-" to disable dynamic provisioning. | -| list | accessMode | scalars | Kubernetes Persistent Volume Access Modes:
ReadWriteOnce
ReadOnlyMany
ReadWriteMany. | -| list | size | scalars | Match the volume size of PVC. | +| list | accessMode | scalars | Kubernetes Persistent Volume Access Modes:
ReadWriteOnce
ReadOnlyMany
ReadWriteMany. | +| list | size | scalars | Match the volume size of PVC. | ### python mappings -| Name | Type | Description | -| --------------------- | -------- | ------------------------------------------------------------ | -| type | scalars | Kubernetes ServiceTypes, default is NodePort.
Other modules can connect to the fateflow | -| nodePort | scalars | The port used by `proxy` module's kubernetes service, default range: 30000-32767. | -| nodeSelector | mappings | kubernetes nodeSelector. | -| enabledNN | bool | If or not neural network workflow is required | -| spark | mappings | If you use your own spark, modify the configuration | -| spark.cores_per_node | scalars | configuration of FATE fateflow module | -| spark.nodes | scalars | configuration of FATE fateflow module | -| spark.existingSpark | scalars | If you need to use the existing spark , you can set this configuration | -| spark.driverHost | scalars | call back IP of spark executor | -| spark.driverHostType | scalars | service type of spark driver | -| spark.portMaxRetries | scalars | spark driver's configuration | -| spark.driverStartPort | scalars | spark driver start port | -| spark.blockManagerStartPort | scalars | spark driver blockManager start port | -| spark.pysparkPython | scalars | spark worker node python PATH | -| hdfs | mappings | If you use the existing hdfs, you can set this configuration | -| rabbitmq | mappings | If you use the existing rabbitmq, you can set this configuration | -| nginx | mappings | If you use the existing nginx, you can set this configuration | +| Name | Type | Description | +|-----------------------------|----------|----------------------------------------------------------------------------------------------| +| type | scalars | Kubernetes ServiceTypes, default is NodePort.
Other modules can connect to the fateflow | +| nodePort | scalars | The port used by `proxy` module's kubernetes service, default range: 30000-32767. | +| nodeSelector | mappings | kubernetes nodeSelector. | +| enabledNN | bool | If or not neural network workflow is required | +| spark | mappings | If you use your own spark, modify the configuration | +| spark.cores_per_node | scalars | configuration of FATE fateflow module | +| spark.nodes | scalars | configuration of FATE fateflow module | +| spark.existingSpark | scalars | If you need to use the existing spark , you can set this configuration | +| spark.driverHost | scalars | call back IP of spark executor | +| spark.driverHostType | scalars | service type of spark driver | +| spark.portMaxRetries | scalars | spark driver's configuration | +| spark.driverStartPort | scalars | spark driver start port | +| spark.blockManagerStartPort | scalars | spark driver blockManager start port | +| spark.pysparkPython | scalars | spark worker node python PATH | +| hdfs | mappings | If you use the existing hdfs, you can set this configuration | +| rabbitmq | mappings | If you use the existing rabbitmq, you can set this configuration | +| nginx | mappings | If you use the existing nginx, you can set this configuration | ### fateboard mappings Configuration of kubernetes deployment fateboard. | Name | Type | Description | -| -------- | -------- | --------------------------- | +|----------|----------|-----------------------------| | type | mappings | Kubernetes nodeSelector. | | username | scalars | Login username of fateboard | | password | scalars | Login password of fateboard | @@ -157,32 +158,32 @@ Configuration of kubernetes deployment fateboard. Configuration of kubernetes deployment client. -| Name | Type | Description | -| ------------- | -------- | ------------------------------------------------------------ | -| nodeSelector | mappings | kubernetes nodeSelector. | -| subPath | scalars | Path of data persistence, specify the "subPath" if the PVC is shared with other components. | -| existingClaim | scalars | Use the existing PVC which must be created manually before bound. | +| Name | Type | Description | +|---------------|----------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------| +| nodeSelector | mappings | kubernetes nodeSelector. | +| subPath | scalars | Path of data persistence, specify the "subPath" if the PVC is shared with other components. | +| existingClaim | scalars | Use the existing PVC which must be created manually before bound. | | storageClass | scalars | Specify the "storageClass" used to provision the volume. Or the default. StorageClass will be used(the default). Set it to "-" to disable dynamic provisioning. | -| accessMode | scalars | Kubernetes Persistent Volume Access Modes:
ReadWriteOnce
ReadOnlyMany
ReadWriteMany. | -| size | scalars | Match the volume size of PVC. | +| accessMode | scalars | Kubernetes Persistent Volume Access Modes:
ReadWriteOnce
ReadOnlyMany
ReadWriteMany. | +| size | scalars | Match the volume size of PVC. | ### Mysql mappings Configuration of kubernetes deployment mysql. -| Name | Type | Description | -| ------------- | -------- | ------------------------------------------------------------ | -| nodeSelector | mappings | kubernetes nodeSelector. | -| ip | scalars | Allow other modules to connect to MySQL. | -| port | scalars | Mysql port. | -| database | scalars | Database name of MySQL. | -| user | scalars | User of MySQL. | -| password | scalars | Password of MySQL. | -| subPath | scalars | Path of data persistence, specify the "subPath" if the PVC is shared with other components. | -| existingClaim | scalars | Use the existing PVC which must be created manually before bound. | +| Name | Type | Description | +|---------------|----------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------| +| nodeSelector | mappings | kubernetes nodeSelector. | +| ip | scalars | Allow other modules to connect to MySQL. | +| port | scalars | Mysql port. | +| database | scalars | Database name of MySQL. | +| user | scalars | User of MySQL. | +| password | scalars | Password of MySQL. | +| subPath | scalars | Path of data persistence, specify the "subPath" if the PVC is shared with other components. | +| existingClaim | scalars | Use the existing PVC which must be created manually before bound. | | storageClass | scalars | Specify the "storageClass" used to provision the volume. Or the default. StorageClass will be used(the default). Set it to "-" to disable dynamic provisioning. | -| accessMode | scalars | Kubernetes Persistent Volume Access Modes:
ReadWriteOnce
ReadOnlyMany
ReadWriteMany. | -| size | scalars | Match the volume size of PVC. | +| accessMode | scalars | Kubernetes Persistent Volume Access Modes:
ReadWriteOnce
ReadOnlyMany
ReadWriteMany. | +| size | scalars | Match the volume size of PVC. | @@ -191,11 +192,11 @@ Configuration of kubernetes deployment mysql. Configuration of kubernetes deployment spark. | Name | SubItem | Type | Description | -| ----------------- | ------------ | -------- | ---------------------------- | +|-------------------|--------------|----------|------------------------------| | master/
worker | Image | scalars | Image of spark components | | | ImageTag | scalars | ImageTag of spark components | | | replicas | scalars | Number of copies of pod | -| | resources | mappings | resources of Pod | +| | resources | mappings | resources of Pod | | | nodeSelector | mappings | kubernetes nodeSelector. | | | type | scalars | Kubernetes ServiceTypes. | @@ -204,7 +205,7 @@ Configuration of kubernetes deployment spark. Configuration of kubernetes deployment hdfs. | Name | SubItem | Type | Description | -| --------------------- | ------------ | -------- | ------------------------------------------------ | +|-----------------------|--------------|----------|--------------------------------------------------| | namenode/
datanode | nodeSelector | mappings | kubernetes nodeSelector. | | | type | scalars | Kubernetes ServiceTypes, default is `ClusterIp`. | @@ -215,7 +216,7 @@ Configuration of kubernetes deployment hdfs. Configuration of kubernetes deployment hdfs. | Name | Type | Description | -| ------------ | -------- | ---------------------------- | +|--------------|----------|------------------------------| | nodeSelector | mappings | kubernetes nodeSelector. | | type | scalars | Kubernetes ServiceTypes. | | nodePort | scalars | Kubernetes Service NodePort. | @@ -254,7 +255,7 @@ Configuration of kubernetes deployment hdfs. Configuration of kubernetes deployment rabbitmq . | Name | Type | Description | -| ------------ | -------- | ------------------------------------------------ | +|--------------|----------|--------------------------------------------------| | nodeSelector | mappings | kubernetes nodeSelector. | | type | scalars | Kubernetes ServiceTypes, default is `ClusterIp`. | | nodePort | scalars | Kubernetes Service NodePort. | diff --git a/k8s-deploy/README.md b/k8s-deploy/README.md index be2c91a7e..622aef2cb 100644 --- a/k8s-deploy/README.md +++ b/k8s-deploy/README.md @@ -1,10 +1,10 @@ # Kubernetes Deployment -We recommend using [Kubernetes](https://kubernetes.io/) as a underlying infrastructure to create and manage the FATE clusters in a production environment. KubeFATE supports deploying multiple FATE clusters in an instance of Kubernetes with different namespaces for the purposes of development, testing and production. Considering the different IT designs and standards in each company, the actual deployment should be customized. KubeFATE is flexibile for the FATE configuration. +We recommend using [Kubernetes](https://kubernetes.io/) as an underlying infrastructure to create and manage the FATE clusters in a production environment. KubeFATE supports deploying multiple FATE clusters in an instance of Kubernetes with different namespaces for the purposes of development, testing and production. Considering the different IT designs and standards in each company, the actual deployment should be customized. KubeFATE is flexibile for the FATE configuration. If you focus on how to quickly use KubeFATE, please jump to [Use Scenarios](#use-scenarios). ## High-level architecture of multiple federated learning parties -The hig-hlevel architecture of a multi-party federated learning deployment (e.g. two parties) is shown as follows: +The high-level architecture of a multi-party federated learning deployment (e.g. two parties) is shown as follows:
@@ -37,7 +37,7 @@ KubeFATE is designed to handle different versions FATE. Normally, KubeFATE CLI a ## User scenarios Suppose in an organization, there are two roles: -* System Admin: who is responisble for the infrastructure management as well as Kubernetes administration +* System Admin: who is responsible for the infrastructure management as well as Kubernetes administration * ML Infrastructure Operators: who is responsible for managing the machine learning cluster like FATE
@@ -52,7 +52,7 @@ Kubernetes: [v1.21.7](https://github.com/kubernetes/kubernetes/releases/tag/v1.2 Ingress-nginx: [v1.0.5](https://github.com/kubernetes/ingress-nginx/releases/tag/controller-v1.0.5) #### Creating role, namespace and other resource in Kubernetes -The sample yaml can be found in [rbac-config.yaml](./rbac-config.yaml). In this sample, we create a kube-fate namespace for KubeFATE service. Resource constraints can be applied to kube-fate namespace, refer to [Kubernetes Namespace](https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/), [Configure Memory and CPU Quotas for Namespace](https://kubernetes.io/docs/tasks/administer-cluster/manage-resources/quota-memory-cpu-namespace/). +The example yaml can be found in [rbac-config.yaml](./rbac-config.yaml). In this example, we create a kube-fate namespace for KubeFATE service. Resource constraints can be applied to kube-fate namespace, refer to [Kubernetes Namespace](https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/), [Configure Memory and CPU Quotas for Namespace](https://kubernetes.io/docs/tasks/administer-cluster/manage-resources/quota-memory-cpu-namespace/). Run the following command to create the namespace: ``` @@ -67,7 +67,7 @@ stringData: ``` #### Preparing domain name and deploying KubeFATE in Kubernetes -Because KubeFATE service exposes RESTful APIs for external access, system admin needs to prepare a domain name for KubeFATE service. In our sample, the domain name is `example.com` . Moreover, system admin should create a namespace (e.g. fate-9999) for FATE deployment. +Because KubeFATE service exposes RESTful APIs for external access, system admin needs to prepare a domain name for KubeFATE service. In our example, the domain name is `example.com` . Moreover, system admin should create a namespace (e.g. fate-9999) for FATE deployment. ``` $ kubectl apply -f ./kubefate.yaml $ kubectl create namespace fate-9999 @@ -95,7 +95,7 @@ serviceurl: example.com Create a `cluster.yaml` for FATE cluster configuration. The details of configuration can be found here: [FATE Cluster Configuration Guide](../docs/configurations/FATE_cluster_configuration.md). -**NOTE:** For Chinese user, specifying a local image registry in `cluster.yaml` can accelerate the download of images. The details is as follows: +**NOTE:** For Chinese user, specifying a local image registry in `cluster.yaml` can accelerate the download of images. The details are as follows: ``` registry: "hub.c.163.com/federatedai" ``` @@ -109,7 +109,7 @@ create job success, job id=fe846176-0787-4879-9d27-622692ce181c *NOTE: If you want to deploy **FATE on Spark**, you can use `cluster-spark.yaml`.* #### Checking the status of "Installing Cluster" job -After the above command has finished, a job is created for installing a FATE cluster. Run the command `kubefate job describe` to check the status of the job, util the "Status" turns to `Success`. +After the above command has finished, a job is created for installing a FATE cluster. Run the command `kubefate job describe` to check the status of the job, until the "Status" turns to `Success`. ``` $ kubefate job describe fe846176-0787-4879-9d27-622692ce181c From 565ff724285dfed1081d41ea49c84eed84085658 Mon Sep 17 00:00:00 2001 From: Chen Jing Date: Wed, 30 Mar 2022 10:30:48 +0800 Subject: [PATCH 09/14] Change the type to scalars Signed-off-by: Chen Jing --- docs/configurations/FATE_cluster_configuration.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/configurations/FATE_cluster_configuration.md b/docs/configurations/FATE_cluster_configuration.md index 2b8ec3a20..ee8b01dfa 100644 --- a/docs/configurations/FATE_cluster_configuration.md +++ b/docs/configurations/FATE_cluster_configuration.md @@ -15,7 +15,7 @@ | * persistence | bool | mysql and nodemanager data persistence. | | istio.enable | bool | enable istio | | podSecurityPolicy.enabled | bool | if `true`, create & use Pod Security Policy resources | -| ingressClassName | mappings | The Ingress class name, such as "nginx". | +| ingressClassName | scalars | The Ingress class name, such as "nginx". | | * modules | sequences | Modules to be deployed in the FATE cluster. | | backend | set(eggroll,spark) | Configure cluster computing engine( eggroll or spark) | | ingress | mappings | Custom domain of FATE UI component | From 51fa6777ed2bc137dbbfa18cfaca6e24fc8f5345 Mon Sep 17 00:00:00 2001 From: Sun Xia Date: Thu, 14 Apr 2022 11:26:26 +0800 Subject: [PATCH 10/14] add cacheType for fate serving (#584) * Make the tutorial up to date with 1.7.2 on master branch (#570) * optimize the tutorial and make sure the example python scripts on notebook can run Signed-off-by: Chen Jing * Change the wrong version in tutorial and remove a useless file Signed-off-by: Chen Jing Co-authored-by: Chen Jing Signed-off-by: Sun Xia * Update contributing document (#575) * Update the contributing.md document for license and how to build, test. Signed-off-by: Layne Peng * Add no-code way contributing part. Signed-off-by: Layne Peng * Update the license up to 2022. Signed-off-by: Layne Peng Signed-off-by: Sun Xia * export variable cacheType Signed-off-by: Sun Xia * fix bug Signed-off-by: Sun Xia Co-authored-by: Chen Co-authored-by: Chen Jing Co-authored-by: Layne Peng --- CONTRIBUTING.md | 88 ++- docker-build/client/pipeline/index.md | 8 - .../pipeline_tutorial_hetero_sbt.ipynb | 499 ++++++++++++++++-- .../pipeline/pipeline_tutorial_homo_nn.ipynb | 440 --------------- .../pipeline/pipeline_tutorial_match_id.ipynb | 447 ---------------- .../pipeline/pipeline_tutorial_upload.ipynb | 151 ++++-- ...ster_in_One_Linux_Machine_with_MiniKube.md | 475 ++++++++++------- .../images/fate-9999-data-output.png | Bin 0 -> 233957 bytes .../tutorials/images/fate-9999-evaluation.png | Bin 0 -> 127747 bytes .../images/fate-9999-model-output.png | Bin 0 -> 156744 bytes docs/tutorials/images/fate-9999-run.png | Bin 97752 -> 208622 bytes .../images/fate-9999-track-final.png | Bin 219195 -> 0 bytes docs/tutorials/images/fate-9999-workflow.png | Bin 0 -> 121574 bytes .../templates/serving-server-module.yaml | 4 +- .../FATE-Serving/values-template-example.yaml | 1 + helm-charts/FATE-Serving/values-template.yaml | 2 +- helm-charts/FATE-Serving/values.yaml | 1 + 17 files changed, 932 insertions(+), 1184 deletions(-) delete mode 100644 docker-build/client/pipeline/index.md delete mode 100644 docker-build/client/pipeline/pipeline_tutorial_homo_nn.ipynb delete mode 100644 docker-build/client/pipeline/pipeline_tutorial_match_id.ipynb create mode 100644 docs/tutorials/images/fate-9999-data-output.png create mode 100644 docs/tutorials/images/fate-9999-evaluation.png create mode 100644 docs/tutorials/images/fate-9999-model-output.png delete mode 100644 docs/tutorials/images/fate-9999-track-final.png create mode 100644 docs/tutorials/images/fate-9999-workflow.png diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 184f980b2..8ab72f434 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -54,11 +54,72 @@ git rebase kubfate/master Please use fetch / rebase (as shown above) instead of git pull. git pull does a merge, which leaves merge commits. These make the commit history messy and violate the principle that commits ought to be individually understandable and useful (see below). You can also consider changing your .git/config file via git config branch.autoSetupRebase always to change the behavior of git pull. ``` +### Develop, Build and Test +Write code on the new branch in your fork. The coding style used in KubeFATE is suggested by the Golang community. See the [style doc](https://github.com/golang/go/wiki/CodeReviewComments) for details. + +Try to limit column width to 120 characters for both code and markdown documents such as this one. + +As we are enforcing standards set by [golint](https://github.com/golang/lint), please always run golint on source code before committing your changes. If it reports an issue, in general, the preferred action is to fix the code to comply with the linter's recommendation +because golint gives suggestions according to the stylistic conventions listed in [Effective Go](https://golang.org/doc/effective_go.html) and the [CodeReviewComments](https://github.com/golang/go/wiki/CodeReviewComments). +``` +#Install fgt and golint + +go get -u golang.org/x/lint/golint +go get github.com/GeertJohan/fgt + +#In the #working_dir/harbor, run + +go list ./... | grep -v -E 'vendor|tests' | xargs -L1 fgt golint + +``` + +Unit test cases should be added to cover the new code. Unit test framework for backend services is using [go testing](https://golang.org/doc/code.html#Testing). + +Run go test cases: +``` +#cd #working_dir/src/[package] +go test -v ./... +``` + +In both the root folder of the `KubeFATE` project and the `k8s-deploy` project, there is a Makefile. The Makefile in the `KubeFATE` folder includes all commands to create a KubeFATE release that you found in a KubeFATE release, including: +* The docker-compose package; +* The charts; +* The KubeFATE CLI; +* The KubeFATE server image. + +The Makefile in `k8s-deploy` includes: +* `go test` command to verify your contributions; +* Quick testing toolkit to deploy KubeFATE to a given Kubernetes; +* Generating new Swag documents if APIs changes +* and other subcommands. + +Strongly suggest you use this Makefile as a toolkit for build and testing. + ### Update the APIs and related documents Our RESTful APIs are documented with [Swagger](https://swagger.io/) If your commit that changes the RESTful APIs, make sure to run `make swag` in `./k8s-deploy/Makefile` to update the Swagger documents. If your commit that exposes a user-faced function, make sure to add related introductions to documents. +### License +KubeFATE is applying Apache license, please include a short license header at the top of original source documents (code and documentation, but not the LICENSE and NOTICE files). An Apache license header example has list below. +``` +/* + * Copyright 2019-2022 VMware, Inc. + * + * 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. + * + */ +``` +_Note: "VMware, Inc." in the above example can be changed to the name of your organization or simplily "The KubeFATE Authors"._ + ### Commit As KubeFATE has integrated the [DCO (Developer Certificate of Origin)](https://probot.github.io/apps/dco/) check tool, contributors are required to sign-off that they adhere to those requirements by adding a Signed-off-by line to the commit messages. Git has even provided a -s command line option to append that automatically to your commit messages, please use it when you commit your changes. ``` @@ -91,4 +152,29 @@ Once your pull request has been opened, KubeFATE will run two CI pipelines again 1. In the Github action, your source code will be checked via golint, go vet and go race that makes sure the code is readable, safe and correct. Also all of unit tests will be triggered via go test against the pull request. * If any failure in `github action checks`, you need to figure out whether it is introduced by your commits. * If the coverage dramatic decline, you need to commit unit test to coverage your code. -2. In the Jenkins CI, the E2E test will be triggered. The pipeline is about to build and install a FATE cluster and run the federated learning workload. \ No newline at end of file +2. In the Jenkins CI, the E2E test will be triggered. The pipeline is about to build and install a FATE cluster and run the federated learning workload. + +## No-code way contributing +To contribute to the KubeFATE project, there are many ways beyond coding. + +### Submitting an issue +It is a great way to contribute to KubeFATE by reporting an issue. Well-written and complete bug reports are always welcome! Please open an issue on GitHub and follow the template to fill in the required information. + +Before opening any issue, please look up the existing issues to avoid submitting a duplication. If you find a match, you can "subscribe" to it to get notified of updates. If you have additional helpful information about the issue, please leave a comment. + +When reporting an issue of bugs, always include: +* What deployment mode using? (docker-compose or Kubernetes) This is very important because it is a total difference we implemented between docker-compose and Kubernetes +* Versions. Includes the KubeFATE CLI version, KubeFATE server version, FATE version, etc. And also we need to know the version and type of OS and Kubernetes. + +Because the issues are open to the public, when submitting the log and configuration files, be sure to remove any sensitive information, e.g. user name, password, IP address, and company name. You can replace those parts with "REDACTED" or other strings like "****". + +Be sure to include the steps to reproduce the problem if applicable. It can help us understand and fix your issue faster. + +Another very appreciated way of contribution is submitting an issue of `feature request`. Make sure you are selecting the right template to draft it. Make sure you describing the problem to solve clearly. And it is also very important to stress the value of the feature requested, it is the important basis of our decision and work arrangement. + +### Documenting (includes Wikis) +Help us update, correct, add documents is greatly appreciated! It will help others better use KubeFATE and build a better community. Some documents to guide a beginner on how to use KubeFATE are also welcome and can be added to Wikis. Contact us if there are some documents or articles you can contribute. + +### Advocate and educate + +We are welcome any articles or blog posts to advocate the KubeFATE project or educate others on how to use KubeFATE for federated learning lifecycle management. If you can let us know the links to the articles or blog posts, we can gather them to the Wiki and help promote them to the community. \ No newline at end of file diff --git a/docker-build/client/pipeline/index.md b/docker-build/client/pipeline/index.md deleted file mode 100644 index 106fb46f4..000000000 --- a/docker-build/client/pipeline/index.md +++ /dev/null @@ -1,8 +0,0 @@ -# Pipeline Tutorials - -to submit job with Pipeline: - -- [Upload Data with FATE-Pipeline](pipeline_tutorial_upload.ipynb) -- [Train & Predict Hetero SecureBoost with FATE-Pipeline](pipeline_tutorial_hetero_sbt.ipynb) -- [Build Homo NN model with FATE-Pipeline](pipeline_tutorial_homo_nn.ipynb) -- [Upload & Train Hetero SecureBoost on Data with Match ID](pipeline_tutorial_match_id.ipynb) \ No newline at end of file diff --git a/docker-build/client/pipeline/pipeline_tutorial_hetero_sbt.ipynb b/docker-build/client/pipeline/pipeline_tutorial_hetero_sbt.ipynb index f6f09d3fe..dd42feac8 100644 --- a/docker-build/client/pipeline/pipeline_tutorial_hetero_sbt.ipynb +++ b/docker-build/client/pipeline/pipeline_tutorial_hetero_sbt.ipynb @@ -29,21 +29,21 @@ }, { "cell_type": "code", - "execution_count": 73, + "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Usage: pipeline [OPTIONS] COMMAND [ARGS]...\n", - "\n", - "Options:\n", - " --help Show this message and exit.\n", - "\n", - "Commands:\n", - " config pipeline config tool\n", - " init - DESCRIPTION: Pipeline Config Command.\n" + "Usage: pipeline [OPTIONS] COMMAND [ARGS]...\r\n", + "\r\n", + "Options:\r\n", + " --help Show this message and exit.\r\n", + "\r\n", + "Commands:\r\n", + " config pipeline config tool\r\n", + " init \b - DESCRIPTION: Pipeline Config Command.\r\n" ] } ], @@ -60,19 +60,19 @@ }, { "cell_type": "code", - "execution_count": 74, + "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Pipeline configuration succeeded.\n" + "Pipeline configuration succeeded.\r\n" ] } ], "source": [ - "!pipeline init --ip 127.0.0.1 --port 9380" + "!pipeline init --ip fateflow --port 9380" ] }, { @@ -98,9 +98,18 @@ }, { "cell_type": "code", - "execution_count": 75, + "execution_count": 3, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2022-03-24 13:39:50.653168: W tensorflow/stream_executor/platform/default/dso_loader.cc:59] Could not load dynamic library 'libcudart.so.10.1'; dlerror: libcudart.so.10.1: cannot open shared object file: No such file or directory\n", + "2022-03-24 13:39:50.653332: I tensorflow/stream_executor/cuda/cudart_stub.cc:29] Ignore above cudart dlerror if you do not have a GPU set up on your machine.\n" + ] + } + ], "source": [ "from pipeline.backend.pipeline import PipeLine\n", "from pipeline.component import Reader, DataTransform, Intersection, HeteroSecureBoost, Evaluation\n", @@ -124,7 +133,7 @@ }, { "cell_type": "code", - "execution_count": 76, + "execution_count": 4, "metadata": {}, "outputs": [], "source": [ @@ -142,7 +151,7 @@ }, { "cell_type": "code", - "execution_count": 77, + "execution_count": 5, "metadata": {}, "outputs": [], "source": [ @@ -164,7 +173,7 @@ }, { "cell_type": "code", - "execution_count": 78, + "execution_count": 6, "metadata": {}, "outputs": [], "source": [ @@ -185,7 +194,7 @@ }, { "cell_type": "code", - "execution_count": 79, + "execution_count": 7, "metadata": {}, "outputs": [], "source": [ @@ -201,7 +210,7 @@ }, { "cell_type": "code", - "execution_count": 80, + "execution_count": 8, "metadata": {}, "outputs": [], "source": [ @@ -223,7 +232,7 @@ }, { "cell_type": "code", - "execution_count": 81, + "execution_count": 9, "metadata": {}, "outputs": [], "source": [ @@ -246,7 +255,7 @@ }, { "cell_type": "code", - "execution_count": 82, + "execution_count": 10, "metadata": {}, "outputs": [], "source": [ @@ -267,28 +276,283 @@ }, { "cell_type": "code", - "execution_count": 83, + "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ - "\u001b[32m2021-11-16 03:09:48.339\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m123\u001b[0m - \u001b[1mJob id is 202111160309427650180\n", - "\u001b[0m\n", - "\u001b[32m2021-11-16 03:09:49.373\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m144\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KJob is still waiting, time elapse: 0:00:01\u001b[0m\n", + "\u001b[32m2022-03-24 13:39:56.241\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m123\u001b[0m - \u001b[1mJob id is 202203241339527023860\n", "\u001b[0m\n", - "\u001b[32m2021-11-16 03:09:54.359\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component reader_0, time elapse: 0:00:06\u001b[0m\n", - "\u001b[0m\n", - "\u001b[32m2021-11-16 03:10:06.253\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component data_transform_0, time elapse: 0:00:17\u001b[0m\n", - "\u001b[0m\n", - "\u001b[32m2021-11-16 03:10:18.112\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component intersect_0, time elapse: 0:00:29\u001b[0m\n", - "\u001b[0m\n", - "\u001b[32m2021-11-16 03:12:10.125\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:02:21\u001b[0m\n", - "\u001b[0m\n", - "\u001b[32m2021-11-16 03:12:22.960\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component evaluation_0, time elapse: 0:02:34\u001b[0m\n", - "\u001b[32m2021-11-16 03:12:27.324\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m131\u001b[0m - \u001b[1mJob is success!!! Job id is 202111160309427650180\u001b[0m\n", - "\u001b[32m2021-11-16 03:12:27.326\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m132\u001b[0m - \u001b[1mTotal time: 0:02:38\u001b[0m\n" + "\u001b[32m2022-03-24 13:39:56.269\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m144\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KJob is still waiting, time elapse: 0:00:00\u001b[0m\n", + "\u001b[32m2022-03-24 13:39:56.788\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m144\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KJob is still waiting, time elapse: 0:00:00\u001b[0m\n", + "\u001b[32m2022-03-24 13:39:57.306\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m144\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KJob is still waiting, time elapse: 0:00:01\u001b[0m\n", + "\u001b[0mm2022-03-24 13:39:58.404\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m173\u001b[0m - \u001b[1m\n", + "\u001b[32m2022-03-24 13:39:58.406\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component reader_0, time elapse: 0:00:02\u001b[0m\n", + "\u001b[32m2022-03-24 13:39:58.956\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component reader_0, time elapse: 0:00:02\u001b[0m\n", + "\u001b[32m2022-03-24 13:39:59.488\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component reader_0, time elapse: 0:00:03\u001b[0m\n", + "\u001b[32m2022-03-24 13:40:00.027\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component reader_0, time elapse: 0:00:03\u001b[0m\n", + "\u001b[32m2022-03-24 13:40:00.562\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component reader_0, time elapse: 0:00:04\u001b[0m\n", + "\u001b[32m2022-03-24 13:40:01.094\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component reader_0, time elapse: 0:00:04\u001b[0m\n", + "\u001b[32m2022-03-24 13:40:01.643\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component reader_0, time elapse: 0:00:05\u001b[0m\n", + "\u001b[32m2022-03-24 13:40:02.204\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component reader_0, time elapse: 0:00:05\u001b[0m\n", + "\u001b[32m2022-03-24 13:40:02.760\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component reader_0, time elapse: 0:00:06\u001b[0m\n", + "\u001b[32m2022-03-24 13:40:03.297\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component reader_0, time elapse: 0:00:07\u001b[0m\n", + "\u001b[32m2022-03-24 13:40:03.883\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component reader_0, time elapse: 0:00:07\u001b[0m\n", + "\u001b[32m2022-03-24 13:40:04.467\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component reader_0, time elapse: 0:00:08\u001b[0m\n", + "\u001b[32m2022-03-24 13:40:05.069\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component reader_0, time elapse: 0:00:08\u001b[0m\n", + "\u001b[32m2022-03-24 13:40:05.613\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component reader_0, time elapse: 0:00:09\u001b[0m\n", + "\u001b[32m2022-03-24 13:40:06.175\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component reader_0, time elapse: 0:00:09\u001b[0m\n", + "\u001b[32m2022-03-24 13:40:06.742\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component reader_0, time elapse: 0:00:10\u001b[0m\n", + "\u001b[32m2022-03-24 13:40:07.343\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component reader_0, time elapse: 0:00:11\u001b[0m\n", + "\u001b[32m2022-03-24 13:40:07.920\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component reader_0, time elapse: 0:00:11\u001b[0m\n", + "\u001b[32m2022-03-24 13:40:08.580\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component reader_0, time elapse: 0:00:12\u001b[0m\n", + "\u001b[32m2022-03-24 13:40:09.160\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component reader_0, time elapse: 0:00:12\u001b[0m\n", + "\u001b[32m2022-03-24 13:40:09.729\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component reader_0, time elapse: 0:00:13\u001b[0m\n", + "\u001b[32m2022-03-24 13:40:10.350\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component reader_0, time elapse: 0:00:14\u001b[0m\n", + "\u001b[32m2022-03-24 13:40:10.899\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component reader_0, time elapse: 0:00:14\u001b[0m\n", + "\u001b[32m2022-03-24 13:40:11.430\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component reader_0, time elapse: 0:00:15\u001b[0m\n", + "\u001b[32m2022-03-24 13:40:11.979\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component reader_0, time elapse: 0:00:15\u001b[0m\n", + "\u001b[32m2022-03-24 13:40:12.513\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component reader_0, time elapse: 0:00:16\u001b[0m\n", + "\u001b[32m2022-03-24 13:40:13.051\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component reader_0, time elapse: 0:00:16\u001b[0m\n", + "\u001b[0mm2022-03-24 13:40:29.604\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m173\u001b[0m - \u001b[1m\n", + "\u001b[32m2022-03-24 13:40:29.607\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component data_transform_0, time elapse: 0:00:33\u001b[0m\n", + "\u001b[32m2022-03-24 13:40:30.138\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component data_transform_0, time elapse: 0:00:33\u001b[0m\n", + "\u001b[32m2022-03-24 13:40:30.665\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component data_transform_0, time elapse: 0:00:34\u001b[0m\n", + "\u001b[32m2022-03-24 13:40:31.208\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component data_transform_0, time elapse: 0:00:34\u001b[0m\n", + "\u001b[32m2022-03-24 13:40:31.770\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component data_transform_0, time elapse: 0:00:35\u001b[0m\n", + "\u001b[32m2022-03-24 13:40:32.389\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component data_transform_0, time elapse: 0:00:36\u001b[0m\n", + "\u001b[32m2022-03-24 13:40:32.931\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component data_transform_0, time elapse: 0:00:36\u001b[0m\n", + "\u001b[32m2022-03-24 13:40:33.528\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component data_transform_0, time elapse: 0:00:37\u001b[0m\n", + "\u001b[32m2022-03-24 13:40:34.071\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component data_transform_0, time elapse: 0:00:37\u001b[0m\n", + "\u001b[32m2022-03-24 13:40:34.634\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component data_transform_0, time elapse: 0:00:38\u001b[0m\n", + "\u001b[32m2022-03-24 13:40:35.209\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component data_transform_0, time elapse: 0:00:38\u001b[0m\n", + "\u001b[32m2022-03-24 13:40:35.770\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component data_transform_0, time elapse: 0:00:39\u001b[0m\n", + "\u001b[32m2022-03-24 13:40:36.319\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component data_transform_0, time elapse: 0:00:40\u001b[0m\n", + "\u001b[32m2022-03-24 13:40:36.850\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component data_transform_0, time elapse: 0:00:40\u001b[0m\n", + "\u001b[32m2022-03-24 13:40:37.403\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component data_transform_0, time elapse: 0:00:41\u001b[0m\n", + "\u001b[32m2022-03-24 13:40:37.943\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component data_transform_0, time elapse: 0:00:41\u001b[0m\n", + "\u001b[32m2022-03-24 13:40:38.504\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component data_transform_0, time elapse: 0:00:42\u001b[0m\n", + "\u001b[32m2022-03-24 13:40:39.077\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component data_transform_0, time elapse: 0:00:42\u001b[0m\n", + "\u001b[32m2022-03-24 13:40:39.622\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component data_transform_0, time elapse: 0:00:43\u001b[0m\n", + "\u001b[32m2022-03-24 13:40:40.273\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component data_transform_0, time elapse: 0:00:44\u001b[0m\n", + "\u001b[32m2022-03-24 13:40:40.816\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component data_transform_0, time elapse: 0:00:44\u001b[0m\n", + "\u001b[32m2022-03-24 13:40:41.372\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component data_transform_0, time elapse: 0:00:45\u001b[0m\n", + "\u001b[32m2022-03-24 13:40:41.913\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component data_transform_0, time elapse: 0:00:45\u001b[0m\n", + "\u001b[32m2022-03-24 13:40:42.449\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component data_transform_0, time elapse: 0:00:46\u001b[0m\n", + "\u001b[0mm2022-03-24 13:40:55.864\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m173\u001b[0m - \u001b[1m\n", + "\u001b[32m2022-03-24 13:40:55.868\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component intersect_0, time elapse: 0:00:59\u001b[0m\n", + "\u001b[32m2022-03-24 13:40:56.408\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component intersect_0, time elapse: 0:01:00\u001b[0m\n", + "\u001b[32m2022-03-24 13:40:56.949\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component intersect_0, time elapse: 0:01:00\u001b[0m\n", + "\u001b[32m2022-03-24 13:40:57.489\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component intersect_0, time elapse: 0:01:01\u001b[0m\n", + "\u001b[32m2022-03-24 13:40:58.037\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component intersect_0, time elapse: 0:01:01\u001b[0m\n", + "\u001b[32m2022-03-24 13:40:58.573\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component intersect_0, time elapse: 0:01:02\u001b[0m\n", + "\u001b[32m2022-03-24 13:40:59.115\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component intersect_0, time elapse: 0:01:02\u001b[0m\n", + "\u001b[32m2022-03-24 13:40:59.650\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component intersect_0, time elapse: 0:01:03\u001b[0m\n", + "\u001b[32m2022-03-24 13:41:00.185\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component intersect_0, time elapse: 0:01:03\u001b[0m\n", + "\u001b[32m2022-03-24 13:41:00.720\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component intersect_0, time elapse: 0:01:04\u001b[0m\n", + "\u001b[32m2022-03-24 13:41:01.259\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component intersect_0, time elapse: 0:01:05\u001b[0m\n", + "\u001b[32m2022-03-24 13:41:01.799\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component intersect_0, time elapse: 0:01:05\u001b[0m\n", + "\u001b[32m2022-03-24 13:41:02.377\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component intersect_0, time elapse: 0:01:06\u001b[0m\n", + "\u001b[32m2022-03-24 13:41:02.976\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component intersect_0, time elapse: 0:01:06\u001b[0m\n", + "\u001b[32m2022-03-24 13:41:03.527\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component intersect_0, time elapse: 0:01:07\u001b[0m\n", + "\u001b[32m2022-03-24 13:41:04.089\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component intersect_0, time elapse: 0:01:07\u001b[0m\n", + "\u001b[32m2022-03-24 13:41:04.636\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component intersect_0, time elapse: 0:01:08\u001b[0m\n", + "\u001b[32m2022-03-24 13:41:05.191\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component intersect_0, time elapse: 0:01:08\u001b[0m\n", + "\u001b[32m2022-03-24 13:41:05.749\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component intersect_0, time elapse: 0:01:09\u001b[0m\n", + "\u001b[32m2022-03-24 13:41:06.860\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component intersect_0, time elapse: 0:01:10\u001b[0m\n", + "\u001b[32m2022-03-24 13:41:07.420\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component intersect_0, time elapse: 0:01:11\u001b[0m\n", + "\u001b[32m2022-03-24 13:41:07.987\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component intersect_0, time elapse: 0:01:11\u001b[0m\n", + "\u001b[32m2022-03-24 13:41:08.541\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component intersect_0, time elapse: 0:01:12\u001b[0m\n", + "\u001b[32m2022-03-24 13:41:09.075\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component intersect_0, time elapse: 0:01:12\u001b[0m\n", + "\u001b[32m2022-03-24 13:41:09.607\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component intersect_0, time elapse: 0:01:13\u001b[0m\n", + "\u001b[32m2022-03-24 13:41:10.135\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component intersect_0, time elapse: 0:01:13\u001b[0m\n", + "\u001b[32m2022-03-24 13:41:10.663\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component intersect_0, time elapse: 0:01:14\u001b[0m\n", + "\u001b[32m2022-03-24 13:41:11.207\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component intersect_0, time elapse: 0:01:14\u001b[0m\n", + "\u001b[32m2022-03-24 13:41:11.742\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component intersect_0, time elapse: 0:01:15\u001b[0m\n", + "\u001b[32m2022-03-24 13:41:12.277\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component intersect_0, time elapse: 0:01:16\u001b[0m\n", + "\u001b[32m2022-03-24 13:41:12.806\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component intersect_0, time elapse: 0:01:16\u001b[0m\n", + "\u001b[32m2022-03-24 13:41:13.367\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component intersect_0, time elapse: 0:01:17\u001b[0m\n", + "\u001b[0mm2022-03-24 13:41:26.106\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m173\u001b[0m - \u001b[1m\n", + "\u001b[32m2022-03-24 13:41:26.109\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:01:29\u001b[0m\n", + "\u001b[32m2022-03-24 13:41:26.650\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:01:30\u001b[0m\n", + "\u001b[32m2022-03-24 13:41:27.179\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:01:30\u001b[0m\n", + "\u001b[32m2022-03-24 13:41:27.711\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:01:31\u001b[0m\n", + "\u001b[32m2022-03-24 13:41:28.250\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:01:32\u001b[0m\n", + "\u001b[32m2022-03-24 13:41:28.786\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:01:32\u001b[0m\n", + "\u001b[32m2022-03-24 13:41:29.315\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:01:33\u001b[0m\n", + "\u001b[32m2022-03-24 13:41:29.862\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:01:33\u001b[0m\n", + "\u001b[32m2022-03-24 13:41:30.401\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:01:34\u001b[0m\n", + "\u001b[32m2022-03-24 13:41:30.935\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:01:34\u001b[0m\n", + "\u001b[32m2022-03-24 13:41:31.466\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:01:35\u001b[0m\n", + "\u001b[32m2022-03-24 13:41:32.003\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:01:35\u001b[0m\n", + "\u001b[32m2022-03-24 13:41:32.551\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:01:36\u001b[0m\n", + "\u001b[32m2022-03-24 13:41:33.111\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:01:36\u001b[0m\n", + "\u001b[32m2022-03-24 13:41:33.666\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:01:37\u001b[0m\n", + "\u001b[32m2022-03-24 13:41:34.207\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:01:37\u001b[0m\n", + "\u001b[32m2022-03-24 13:41:34.770\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:01:38\u001b[0m\n", + "\u001b[32m2022-03-24 13:41:35.329\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:01:39\u001b[0m\n", + "\u001b[32m2022-03-24 13:41:35.872\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:01:39\u001b[0m\n", + "\u001b[32m2022-03-24 13:41:36.427\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:01:40\u001b[0m\n", + "\u001b[32m2022-03-24 13:41:36.977\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:01:40\u001b[0m\n", + "\u001b[32m2022-03-24 13:41:37.555\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:01:41\u001b[0m\n", + "\u001b[32m2022-03-24 13:41:38.110\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:01:41\u001b[0m\n", + "\u001b[32m2022-03-24 13:41:38.668\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:01:42\u001b[0m\n", + "\u001b[32m2022-03-24 13:41:39.215\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:01:42\u001b[0m\n", + "\u001b[32m2022-03-24 13:41:39.750\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:01:43\u001b[0m\n", + "\u001b[32m2022-03-24 13:41:40.290\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:01:44\u001b[0m\n", + "\u001b[32m2022-03-24 13:41:40.830\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:01:44\u001b[0m\n", + "\u001b[32m2022-03-24 13:41:41.375\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:01:45\u001b[0m\n", + "\u001b[32m2022-03-24 13:41:41.925\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:01:45\u001b[0m\n", + "\u001b[32m2022-03-24 13:41:42.459\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:01:46\u001b[0m\n", + "\u001b[32m2022-03-24 13:41:43.005\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:01:46\u001b[0m\n", + "\u001b[32m2022-03-24 13:41:43.579\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:01:47\u001b[0m\n", + "\u001b[32m2022-03-24 13:41:44.119\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:01:47\u001b[0m\n", + "\u001b[32m2022-03-24 13:41:44.658\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:01:48\u001b[0m\n", + "\u001b[32m2022-03-24 13:41:45.209\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:01:48\u001b[0m\n", + "\u001b[32m2022-03-24 13:41:45.779\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:01:49\u001b[0m\n", + "\u001b[32m2022-03-24 13:41:46.604\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:01:50\u001b[0m\n", + "\u001b[32m2022-03-24 13:41:47.161\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:01:50\u001b[0m\n", + "\u001b[32m2022-03-24 13:41:47.707\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:01:51\u001b[0m\n", + "\u001b[32m2022-03-24 13:41:48.249\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:01:52\u001b[0m\n", + "\u001b[32m2022-03-24 13:41:48.799\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:01:52\u001b[0m\n", + "\u001b[32m2022-03-24 13:41:49.338\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:01:53\u001b[0m\n", + "\u001b[32m2022-03-24 13:41:49.903\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:01:53\u001b[0m\n", + "\u001b[32m2022-03-24 13:41:50.449\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:01:54\u001b[0m\n", + "\u001b[32m2022-03-24 13:41:50.985\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:01:54\u001b[0m\n", + "\u001b[32m2022-03-24 13:41:51.538\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:01:55\u001b[0m\n", + "\u001b[32m2022-03-24 13:41:52.079\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:01:55\u001b[0m\n", + "\u001b[32m2022-03-24 13:41:52.626\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:01:56\u001b[0m\n", + "\u001b[32m2022-03-24 13:41:53.163\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:01:56\u001b[0m\n", + "\u001b[32m2022-03-24 13:41:53.710\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:01:57\u001b[0m\n", + "\u001b[32m2022-03-24 13:41:54.253\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:01:58\u001b[0m\n", + "\u001b[32m2022-03-24 13:41:54.798\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:01:58\u001b[0m\n", + "\u001b[32m2022-03-24 13:41:55.373\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:01:59\u001b[0m\n", + "\u001b[32m2022-03-24 13:41:55.927\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:01:59\u001b[0m\n", + "\u001b[32m2022-03-24 13:41:56.464\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:02:00\u001b[0m\n", + "\u001b[32m2022-03-24 13:41:56.995\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:02:00\u001b[0m\n", + "\u001b[32m2022-03-24 13:41:57.531\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:02:01\u001b[0m\n", + "\u001b[32m2022-03-24 13:41:58.078\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:02:01\u001b[0m\n", + "\u001b[32m2022-03-24 13:41:58.655\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:02:02\u001b[0m\n", + "\u001b[32m2022-03-24 13:41:59.331\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:02:03\u001b[0m\n", + "\u001b[32m2022-03-24 13:41:59.888\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:02:03\u001b[0m\n", + "\u001b[32m2022-03-24 13:42:00.435\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:02:04\u001b[0m\n", + "\u001b[32m2022-03-24 13:42:00.990\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:02:04\u001b[0m\n", + "\u001b[32m2022-03-24 13:42:01.562\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:02:05\u001b[0m\n", + "\u001b[32m2022-03-24 13:42:02.107\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:02:05\u001b[0m\n", + "\u001b[32m2022-03-24 13:42:02.726\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:02:06\u001b[0m\n", + "\u001b[32m2022-03-24 13:42:03.295\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:02:07\u001b[0m\n", + "\u001b[32m2022-03-24 13:42:03.860\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:02:07\u001b[0m\n", + "\u001b[32m2022-03-24 13:42:04.393\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:02:08\u001b[0m\n", + "\u001b[32m2022-03-24 13:42:04.959\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:02:08\u001b[0m\n", + "\u001b[32m2022-03-24 13:42:05.501\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:02:09\u001b[0m\n", + "\u001b[32m2022-03-24 13:42:06.031\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:02:09\u001b[0m\n", + "\u001b[32m2022-03-24 13:42:06.579\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:02:10\u001b[0m\n", + "\u001b[32m2022-03-24 13:42:07.125\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:02:10\u001b[0m\n", + "\u001b[32m2022-03-24 13:42:07.670\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:02:11\u001b[0m\n", + "\u001b[32m2022-03-24 13:42:08.220\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:02:11\u001b[0m\n", + "\u001b[32m2022-03-24 13:42:08.766\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:02:12\u001b[0m\n", + "\u001b[32m2022-03-24 13:42:09.813\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:02:13\u001b[0m\n", + "\u001b[32m2022-03-24 13:42:10.656\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:02:14\u001b[0m\n", + "\u001b[32m2022-03-24 13:42:11.202\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:02:14\u001b[0m\n", + "\u001b[32m2022-03-24 13:42:11.744\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:02:15\u001b[0m\n", + "\u001b[32m2022-03-24 13:42:12.281\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:02:16\u001b[0m\n", + "\u001b[32m2022-03-24 13:42:12.849\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:02:16\u001b[0m\n", + "\u001b[32m2022-03-24 13:42:13.404\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:02:17\u001b[0m\n", + "\u001b[32m2022-03-24 13:42:13.964\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:02:17\u001b[0m\n", + "\u001b[32m2022-03-24 13:42:14.510\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:02:18\u001b[0m\n", + "\u001b[32m2022-03-24 13:42:15.046\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:02:18\u001b[0m\n", + "\u001b[32m2022-03-24 13:42:15.740\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:02:19\u001b[0m\n", + "\u001b[32m2022-03-24 13:42:16.710\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:02:20\u001b[0m\n", + "\u001b[32m2022-03-24 13:42:17.260\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:02:21\u001b[0m\n", + "\u001b[32m2022-03-24 13:42:17.807\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:02:21\u001b[0m\n", + "\u001b[32m2022-03-24 13:42:18.588\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:02:22\u001b[0m\n", + "\u001b[32m2022-03-24 13:42:19.126\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:02:22\u001b[0m\n", + "\u001b[32m2022-03-24 13:42:19.658\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:02:23\u001b[0m\n", + "\u001b[32m2022-03-24 13:42:20.203\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:02:23\u001b[0m\n", + "\u001b[32m2022-03-24 13:42:20.746\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:02:24\u001b[0m\n", + "\u001b[32m2022-03-24 13:42:21.294\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:02:25\u001b[0m\n", + "\u001b[32m2022-03-24 13:42:21.836\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:02:25\u001b[0m\n", + "\u001b[32m2022-03-24 13:42:22.374\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:02:26\u001b[0m\n", + "\u001b[32m2022-03-24 13:42:22.919\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:02:26\u001b[0m\n", + "\u001b[32m2022-03-24 13:42:23.464\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:02:27\u001b[0m\n", + "\u001b[32m2022-03-24 13:42:24.051\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:02:27\u001b[0m\n", + "\u001b[32m2022-03-24 13:42:24.638\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:02:28\u001b[0m\n", + "\u001b[32m2022-03-24 13:42:25.195\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:02:28\u001b[0m\n", + "\u001b[32m2022-03-24 13:42:25.748\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:02:29\u001b[0m\n", + "\u001b[32m2022-03-24 13:42:26.563\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:02:30\u001b[0m\n", + "\u001b[32m2022-03-24 13:42:27.109\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:02:30\u001b[0m\n", + "\u001b[32m2022-03-24 13:42:27.646\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:02:31\u001b[0m\n", + "\u001b[32m2022-03-24 13:42:28.220\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:02:31\u001b[0m\n", + "\u001b[32m2022-03-24 13:42:28.759\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:02:32\u001b[0m\n", + "\u001b[32m2022-03-24 13:42:29.292\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:02:33\u001b[0m\n", + "\u001b[32m2022-03-24 13:42:29.822\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:02:33\u001b[0m\n", + "\u001b[32m2022-03-24 13:42:30.379\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:02:34\u001b[0m\n", + "\u001b[32m2022-03-24 13:42:30.916\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:02:34\u001b[0m\n", + "\u001b[32m2022-03-24 13:42:31.473\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:02:35\u001b[0m\n", + "\u001b[32m2022-03-24 13:42:32.019\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:02:35\u001b[0m\n", + "\u001b[32m2022-03-24 13:42:32.656\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:02:36\u001b[0m\n", + "\u001b[32m2022-03-24 13:42:33.201\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:02:36\u001b[0m\n", + "\u001b[32m2022-03-24 13:42:33.761\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:02:37\u001b[0m\n", + "\u001b[32m2022-03-24 13:42:34.478\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:02:38\u001b[0m\n", + "\u001b[32m2022-03-24 13:42:35.023\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:02:38\u001b[0m\n", + "\u001b[32m2022-03-24 13:42:35.566\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:02:39\u001b[0m\n", + "\u001b[32m2022-03-24 13:42:36.101\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:02:39\u001b[0m\n", + "\u001b[32m2022-03-24 13:42:36.646\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:02:40\u001b[0m\n", + "\u001b[32m2022-03-24 13:42:37.195\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:02:40\u001b[0m\n", + "\u001b[32m2022-03-24 13:42:37.759\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:02:41\u001b[0m\n", + "\u001b[32m2022-03-24 13:42:38.301\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:02:42\u001b[0m\n", + "\u001b[32m2022-03-24 13:42:38.846\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:02:42\u001b[0m\n", + "\u001b[32m2022-03-24 13:42:39.661\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:02:43\u001b[0m\n", + "\u001b[32m2022-03-24 13:42:40.215\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:02:43\u001b[0m\n", + "\u001b[32m2022-03-24 13:42:40.775\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:02:44\u001b[0m\n", + "\u001b[32m2022-03-24 13:42:41.378\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:02:45\u001b[0m\n", + "\u001b[32m2022-03-24 13:42:41.947\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:02:45\u001b[0m\n", + "\u001b[32m2022-03-24 13:42:42.495\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:02:46\u001b[0m\n", + "\u001b[32m2022-03-24 13:42:43.034\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:02:46\u001b[0m\n", + "\u001b[32m2022-03-24 13:42:43.590\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:02:47\u001b[0m\n", + "\u001b[32m2022-03-24 13:42:44.127\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:02:47\u001b[0m\n", + "\u001b[32m2022-03-24 13:42:44.663\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:02:48\u001b[0m\n", + "\u001b[32m2022-03-24 13:42:45.214\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:02:48\u001b[0m\n", + "\u001b[32m2022-03-24 13:42:45.753\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:02:49\u001b[0m\n", + "\u001b[32m2022-03-24 13:42:46.288\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:02:50\u001b[0m\n", + "\u001b[32m2022-03-24 13:42:46.826\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:02:50\u001b[0m\n", + "\u001b[32m2022-03-24 13:42:47.397\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:02:51\u001b[0m\n", + "\u001b[32m2022-03-24 13:42:47.945\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:02:51\u001b[0m\n", + "\u001b[32m2022-03-24 13:42:48.486\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:02:52\u001b[0m\n", + "\u001b[32m2022-03-24 13:42:49.025\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:02:52\u001b[0m\n", + "\u001b[32m2022-03-24 13:42:49.597\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:02:53\u001b[0m\n", + "\u001b[32m2022-03-24 13:42:50.158\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:02:53\u001b[0m\n", + "\u001b[32m2022-03-24 13:42:50.703\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:02:54\u001b[0m\n", + "\u001b[32m2022-03-24 13:42:51.232\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:02:54\u001b[0m\n", + "\u001b[32m2022-03-24 13:42:51.772\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:02:55\u001b[0m\n", + "\u001b[32m2022-03-24 13:42:52.312\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:02:56\u001b[0m\n", + "\u001b[32m2022-03-24 13:42:52.844\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:02:56\u001b[0m\n", + "\u001b[32m2022-03-24 13:42:53.400\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:02:57\u001b[0m\n", + "\u001b[0mm2022-03-24 13:43:08.015\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m173\u001b[0m - \u001b[1m\n", + "\u001b[32m2022-03-24 13:43:08.018\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component evaluation_0, time elapse: 0:03:11\u001b[0m\n", + "\u001b[32m2022-03-24 13:43:08.557\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component evaluation_0, time elapse: 0:03:12\u001b[0m\n", + "\u001b[32m2022-03-24 13:43:09.100\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component evaluation_0, time elapse: 0:03:12\u001b[0m\n", + "\u001b[32m2022-03-24 13:43:09.629\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component evaluation_0, time elapse: 0:03:13\u001b[0m\n", + "\u001b[32m2022-03-24 13:43:10.159\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component evaluation_0, time elapse: 0:03:13\u001b[0m\n", + "\u001b[32m2022-03-24 13:43:10.701\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component evaluation_0, time elapse: 0:03:14\u001b[0m\n", + "\u001b[32m2022-03-24 13:43:11.260\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component evaluation_0, time elapse: 0:03:15\u001b[0m\n", + "\u001b[32m2022-03-24 13:43:11.804\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component evaluation_0, time elapse: 0:03:15\u001b[0m\n", + "\u001b[32m2022-03-24 13:43:12.366\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component evaluation_0, time elapse: 0:03:16\u001b[0m\n", + "\u001b[32m2022-03-24 13:43:12.904\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component evaluation_0, time elapse: 0:03:16\u001b[0m\n", + "\u001b[32m2022-03-24 13:43:13.442\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component evaluation_0, time elapse: 0:03:17\u001b[0m\n", + "\u001b[32m2022-03-24 13:43:13.992\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component evaluation_0, time elapse: 0:03:17\u001b[0m\n", + "\u001b[32m2022-03-24 13:43:14.597\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component evaluation_0, time elapse: 0:03:18\u001b[0m\n", + "\u001b[32m2022-03-24 13:43:15.160\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component evaluation_0, time elapse: 0:03:18\u001b[0m\n", + "\u001b[32m2022-03-24 13:43:15.695\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component evaluation_0, time elapse: 0:03:19\u001b[0m\n", + "\u001b[32m2022-03-24 13:43:16.229\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component evaluation_0, time elapse: 0:03:19\u001b[0m\n", + "\u001b[32m2022-03-24 13:43:16.786\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component evaluation_0, time elapse: 0:03:20\u001b[0m\n", + "\u001b[32m2022-03-24 13:43:17.320\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component evaluation_0, time elapse: 0:03:21\u001b[0m\n", + "\u001b[32m2022-03-24 13:43:17.858\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component evaluation_0, time elapse: 0:03:21\u001b[0m\n", + "\u001b[32m2022-03-24 13:43:18.399\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component evaluation_0, time elapse: 0:03:22\u001b[0m\n", + "\u001b[32m2022-03-24 13:43:32.831\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m131\u001b[0m - \u001b[1mJob is success!!! Job id is 202203241339527023860\u001b[0m\n", + "\u001b[32m2022-03-24 13:43:32.834\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m132\u001b[0m - \u001b[1mTotal time: 0:03:36\u001b[0m\n" ] } ], @@ -305,7 +569,7 @@ }, { "cell_type": "code", - "execution_count": 84, + "execution_count": 12, "metadata": {}, "outputs": [], "source": [ @@ -321,7 +585,7 @@ }, { "cell_type": "code", - "execution_count": 85, + "execution_count": 13, "metadata": {}, "outputs": [], "source": [ @@ -338,7 +602,7 @@ }, { "cell_type": "code", - "execution_count": 86, + "execution_count": 14, "metadata": {}, "outputs": [], "source": [ @@ -356,7 +620,7 @@ }, { "cell_type": "code", - "execution_count": 87, + "execution_count": 15, "metadata": {}, "outputs": [], "source": [ @@ -372,7 +636,7 @@ }, { "cell_type": "code", - "execution_count": 88, + "execution_count": 16, "metadata": {}, "outputs": [], "source": [ @@ -392,28 +656,146 @@ }, { "cell_type": "code", - "execution_count": 89, + "execution_count": 17, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ - "\u001b[32m2021-11-16 03:16:20.448\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m123\u001b[0m - \u001b[1mJob id is 202111160316163695630\n", - "\u001b[0m\n", - "\u001b[32m2021-11-16 03:16:20.457\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m144\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KJob is still waiting, time elapse: 0:00:00\u001b[0m\n", - "\u001b[0m\n", - "\u001b[32m2021-11-16 03:16:25.372\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component reader_1, time elapse: 0:00:04\u001b[0m\n", - "\u001b[0m\n", - "\u001b[32m2021-11-16 03:16:35.385\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component data_transform_0, time elapse: 0:00:14\u001b[0m\n", - "\u001b[0m\n", - "\u001b[32m2021-11-16 03:16:47.215\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component intersect_0, time elapse: 0:00:26\u001b[0m\n", - "\u001b[0m\n", - "\u001b[32m2021-11-16 03:17:03.030\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:00:42\u001b[0m\n", + "\u001b[32m2022-03-24 13:43:34.211\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m123\u001b[0m - \u001b[1mJob id is 202203241343334274690\n", "\u001b[0m\n", - "\u001b[32m2021-11-16 03:17:12.763\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component evaluation_0, time elapse: 0:00:52\u001b[0m\n", - "\u001b[32m2021-11-16 03:17:16.022\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m131\u001b[0m - \u001b[1mJob is success!!! Job id is 202111160316163695630\u001b[0m\n", - "\u001b[32m2021-11-16 03:17:16.023\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m132\u001b[0m - \u001b[1mTotal time: 0:00:55\u001b[0m\n" + "\u001b[32m2022-03-24 13:43:34.227\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m144\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KJob is still waiting, time elapse: 0:00:00\u001b[0m\n", + "\u001b[32m2022-03-24 13:43:34.748\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m144\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KJob is still waiting, time elapse: 0:00:00\u001b[0m\n", + "\u001b[0mm2022-03-24 13:43:35.300\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m173\u001b[0m - \u001b[1m\n", + "\u001b[32m2022-03-24 13:43:35.301\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component reader_1, time elapse: 0:00:01\u001b[0m\n", + "\u001b[32m2022-03-24 13:43:35.886\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component reader_1, time elapse: 0:00:01\u001b[0m\n", + "\u001b[32m2022-03-24 13:43:36.426\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component reader_1, time elapse: 0:00:02\u001b[0m\n", + "\u001b[32m2022-03-24 13:43:36.962\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component reader_1, time elapse: 0:00:02\u001b[0m\n", + "\u001b[32m2022-03-24 13:43:37.499\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component reader_1, time elapse: 0:00:03\u001b[0m\n", + "\u001b[32m2022-03-24 13:43:38.036\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component reader_1, time elapse: 0:00:03\u001b[0m\n", + "\u001b[32m2022-03-24 13:43:38.583\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component reader_1, time elapse: 0:00:04\u001b[0m\n", + "\u001b[32m2022-03-24 13:43:39.122\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component reader_1, time elapse: 0:00:04\u001b[0m\n", + "\u001b[32m2022-03-24 13:43:39.657\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component reader_1, time elapse: 0:00:05\u001b[0m\n", + "\u001b[32m2022-03-24 13:43:40.213\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component reader_1, time elapse: 0:00:06\u001b[0m\n", + "\u001b[32m2022-03-24 13:43:40.799\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component reader_1, time elapse: 0:00:06\u001b[0m\n", + "\u001b[32m2022-03-24 13:43:41.377\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component reader_1, time elapse: 0:00:07\u001b[0m\n", + "\u001b[32m2022-03-24 13:43:41.919\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component reader_1, time elapse: 0:00:07\u001b[0m\n", + "\u001b[32m2022-03-24 13:43:42.464\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component reader_1, time elapse: 0:00:08\u001b[0m\n", + "\u001b[32m2022-03-24 13:43:43.053\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component reader_1, time elapse: 0:00:08\u001b[0m\n", + "\u001b[32m2022-03-24 13:43:43.615\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component reader_1, time elapse: 0:00:09\u001b[0m\n", + "\u001b[32m2022-03-24 13:43:44.268\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component reader_1, time elapse: 0:00:10\u001b[0m\n", + "\u001b[32m2022-03-24 13:43:44.843\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component reader_1, time elapse: 0:00:10\u001b[0m\n", + "\u001b[32m2022-03-24 13:43:45.400\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component reader_1, time elapse: 0:00:11\u001b[0m\n", + "\u001b[32m2022-03-24 13:43:45.959\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component reader_1, time elapse: 0:00:11\u001b[0m\n", + "\u001b[32m2022-03-24 13:43:46.503\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component reader_1, time elapse: 0:00:12\u001b[0m\n", + "\u001b[32m2022-03-24 13:43:47.044\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component reader_1, time elapse: 0:00:12\u001b[0m\n", + "\u001b[32m2022-03-24 13:43:47.583\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component reader_1, time elapse: 0:00:13\u001b[0m\n", + "\u001b[32m2022-03-24 13:43:48.121\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component reader_1, time elapse: 0:00:13\u001b[0m\n", + "\u001b[0mm2022-03-24 13:44:04.793\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m173\u001b[0m - \u001b[1m\n", + "\u001b[32m2022-03-24 13:44:04.799\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component data_transform_0, time elapse: 0:00:30\u001b[0m\n", + "\u001b[32m2022-03-24 13:44:05.344\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component data_transform_0, time elapse: 0:00:31\u001b[0m\n", + "\u001b[32m2022-03-24 13:44:05.886\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component data_transform_0, time elapse: 0:00:31\u001b[0m\n", + "\u001b[32m2022-03-24 13:44:06.422\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component data_transform_0, time elapse: 0:00:32\u001b[0m\n", + "\u001b[32m2022-03-24 13:44:06.951\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component data_transform_0, time elapse: 0:00:32\u001b[0m\n", + "\u001b[32m2022-03-24 13:44:07.491\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component data_transform_0, time elapse: 0:00:33\u001b[0m\n", + "\u001b[32m2022-03-24 13:44:08.049\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component data_transform_0, time elapse: 0:00:33\u001b[0m\n", + "\u001b[32m2022-03-24 13:44:08.593\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component data_transform_0, time elapse: 0:00:34\u001b[0m\n", + "\u001b[32m2022-03-24 13:44:09.183\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component data_transform_0, time elapse: 0:00:34\u001b[0m\n", + "\u001b[32m2022-03-24 13:44:09.754\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component data_transform_0, time elapse: 0:00:35\u001b[0m\n", + "\u001b[32m2022-03-24 13:44:10.298\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component data_transform_0, time elapse: 0:00:36\u001b[0m\n", + "\u001b[32m2022-03-24 13:44:10.851\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component data_transform_0, time elapse: 0:00:36\u001b[0m\n", + "\u001b[32m2022-03-24 13:44:11.417\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component data_transform_0, time elapse: 0:00:37\u001b[0m\n", + "\u001b[32m2022-03-24 13:44:11.963\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component data_transform_0, time elapse: 0:00:37\u001b[0m\n", + "\u001b[32m2022-03-24 13:44:12.498\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component data_transform_0, time elapse: 0:00:38\u001b[0m\n", + "\u001b[32m2022-03-24 13:44:13.070\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component data_transform_0, time elapse: 0:00:38\u001b[0m\n", + "\u001b[32m2022-03-24 13:44:13.634\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component data_transform_0, time elapse: 0:00:39\u001b[0m\n", + "\u001b[32m2022-03-24 13:44:14.187\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component data_transform_0, time elapse: 0:00:39\u001b[0m\n", + "\u001b[32m2022-03-24 13:44:14.727\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component data_transform_0, time elapse: 0:00:40\u001b[0m\n", + "\u001b[32m2022-03-24 13:44:15.267\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component data_transform_0, time elapse: 0:00:41\u001b[0m\n", + "\u001b[0mm2022-03-24 13:44:28.085\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m173\u001b[0m - \u001b[1m\n", + "\u001b[32m2022-03-24 13:44:28.088\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component intersect_0, time elapse: 0:00:53\u001b[0m\n", + "\u001b[32m2022-03-24 13:44:28.640\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component intersect_0, time elapse: 0:00:54\u001b[0m\n", + "\u001b[32m2022-03-24 13:44:29.171\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component intersect_0, time elapse: 0:00:54\u001b[0m\n", + "\u001b[32m2022-03-24 13:44:29.706\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component intersect_0, time elapse: 0:00:55\u001b[0m\n", + "\u001b[32m2022-03-24 13:44:30.237\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component intersect_0, time elapse: 0:00:56\u001b[0m\n", + "\u001b[32m2022-03-24 13:44:30.772\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component intersect_0, time elapse: 0:00:56\u001b[0m\n", + "\u001b[32m2022-03-24 13:44:31.307\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component intersect_0, time elapse: 0:00:57\u001b[0m\n", + "\u001b[32m2022-03-24 13:44:31.856\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component intersect_0, time elapse: 0:00:57\u001b[0m\n", + "\u001b[32m2022-03-24 13:44:32.394\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component intersect_0, time elapse: 0:00:58\u001b[0m\n", + "\u001b[32m2022-03-24 13:44:32.948\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component intersect_0, time elapse: 0:00:58\u001b[0m\n", + "\u001b[32m2022-03-24 13:44:33.527\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component intersect_0, time elapse: 0:00:59\u001b[0m\n", + "\u001b[32m2022-03-24 13:44:34.088\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component intersect_0, time elapse: 0:00:59\u001b[0m\n", + "\u001b[32m2022-03-24 13:44:34.620\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component intersect_0, time elapse: 0:01:00\u001b[0m\n", + "\u001b[32m2022-03-24 13:44:35.165\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component intersect_0, time elapse: 0:01:00\u001b[0m\n", + "\u001b[32m2022-03-24 13:44:35.731\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component intersect_0, time elapse: 0:01:01\u001b[0m\n", + "\u001b[32m2022-03-24 13:44:36.275\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component intersect_0, time elapse: 0:01:02\u001b[0m\n", + "\u001b[32m2022-03-24 13:44:36.872\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component intersect_0, time elapse: 0:01:02\u001b[0m\n", + "\u001b[32m2022-03-24 13:44:37.405\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component intersect_0, time elapse: 0:01:03\u001b[0m\n", + "\u001b[32m2022-03-24 13:44:37.936\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component intersect_0, time elapse: 0:01:03\u001b[0m\n", + "\u001b[32m2022-03-24 13:44:38.468\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component intersect_0, time elapse: 0:01:04\u001b[0m\n", + "\u001b[32m2022-03-24 13:44:39.002\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component intersect_0, time elapse: 0:01:04\u001b[0m\n", + "\u001b[32m2022-03-24 13:44:39.531\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component intersect_0, time elapse: 0:01:05\u001b[0m\n", + "\u001b[32m2022-03-24 13:44:40.061\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component intersect_0, time elapse: 0:01:05\u001b[0m\n", + "\u001b[32m2022-03-24 13:44:40.593\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component intersect_0, time elapse: 0:01:06\u001b[0m\n", + "\u001b[32m2022-03-24 13:44:41.124\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component intersect_0, time elapse: 0:01:06\u001b[0m\n", + "\u001b[0mm2022-03-24 13:44:53.264\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m173\u001b[0m - \u001b[1m\n", + "\u001b[32m2022-03-24 13:44:53.267\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:01:19\u001b[0m\n", + "\u001b[32m2022-03-24 13:44:53.800\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:01:19\u001b[0m\n", + "\u001b[32m2022-03-24 13:44:54.327\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:01:20\u001b[0m\n", + "\u001b[32m2022-03-24 13:44:54.855\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:01:20\u001b[0m\n", + "\u001b[32m2022-03-24 13:44:55.388\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:01:21\u001b[0m\n", + "\u001b[32m2022-03-24 13:44:55.922\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:01:21\u001b[0m\n", + "\u001b[32m2022-03-24 13:44:56.451\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:01:22\u001b[0m\n", + "\u001b[32m2022-03-24 13:44:56.980\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:01:22\u001b[0m\n", + "\u001b[32m2022-03-24 13:44:57.522\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:01:23\u001b[0m\n", + "\u001b[32m2022-03-24 13:44:58.058\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:01:23\u001b[0m\n", + "\u001b[32m2022-03-24 13:44:58.589\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:01:24\u001b[0m\n", + "\u001b[32m2022-03-24 13:44:59.145\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:01:24\u001b[0m\n", + "\u001b[32m2022-03-24 13:44:59.705\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:01:25\u001b[0m\n", + "\u001b[32m2022-03-24 13:45:00.268\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:01:26\u001b[0m\n", + "\u001b[32m2022-03-24 13:45:00.813\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:01:26\u001b[0m\n", + "\u001b[32m2022-03-24 13:45:01.344\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:01:27\u001b[0m\n", + "\u001b[32m2022-03-24 13:45:01.951\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:01:27\u001b[0m\n", + "\u001b[32m2022-03-24 13:45:02.525\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:01:28\u001b[0m\n", + "\u001b[32m2022-03-24 13:45:03.083\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:01:28\u001b[0m\n", + "\u001b[32m2022-03-24 13:45:03.684\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:01:29\u001b[0m\n", + "\u001b[32m2022-03-24 13:45:04.261\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:01:30\u001b[0m\n", + "\u001b[32m2022-03-24 13:45:04.799\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:01:30\u001b[0m\n", + "\u001b[32m2022-03-24 13:45:05.383\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:01:31\u001b[0m\n", + "\u001b[32m2022-03-24 13:45:05.968\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:01:31\u001b[0m\n", + "\u001b[32m2022-03-24 13:45:06.537\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:01:32\u001b[0m\n", + "\u001b[32m2022-03-24 13:45:07.096\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:01:32\u001b[0m\n", + "\u001b[32m2022-03-24 13:45:07.659\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:01:33\u001b[0m\n", + "\u001b[32m2022-03-24 13:45:08.219\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:01:34\u001b[0m\n", + "\u001b[32m2022-03-24 13:45:08.787\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:01:34\u001b[0m\n", + "\u001b[32m2022-03-24 13:45:09.378\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:01:35\u001b[0m\n", + "\u001b[32m2022-03-24 13:45:09.932\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:01:35\u001b[0m\n", + "\u001b[32m2022-03-24 13:45:10.467\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:01:36\u001b[0m\n", + "\u001b[32m2022-03-24 13:45:10.996\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:01:36\u001b[0m\n", + "\u001b[32m2022-03-24 13:45:11.525\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:01:37\u001b[0m\n", + "\u001b[32m2022-03-24 13:45:12.054\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:01:37\u001b[0m\n", + "\u001b[32m2022-03-24 13:45:12.591\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:01:38\u001b[0m\n", + "\u001b[0mm2022-03-24 13:45:24.750\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m173\u001b[0m - \u001b[1m\n", + "\u001b[32m2022-03-24 13:45:24.752\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component evaluation_0, time elapse: 0:01:50\u001b[0m\n", + "\u001b[32m2022-03-24 13:45:25.292\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component evaluation_0, time elapse: 0:01:51\u001b[0m\n", + "\u001b[32m2022-03-24 13:45:25.827\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component evaluation_0, time elapse: 0:01:51\u001b[0m\n", + "\u001b[32m2022-03-24 13:45:26.358\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component evaluation_0, time elapse: 0:01:52\u001b[0m\n", + "\u001b[32m2022-03-24 13:45:26.886\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component evaluation_0, time elapse: 0:01:52\u001b[0m\n", + "\u001b[32m2022-03-24 13:45:27.412\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component evaluation_0, time elapse: 0:01:53\u001b[0m\n", + "\u001b[32m2022-03-24 13:45:27.949\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component evaluation_0, time elapse: 0:01:53\u001b[0m\n", + "\u001b[32m2022-03-24 13:45:28.483\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component evaluation_0, time elapse: 0:01:54\u001b[0m\n", + "\u001b[32m2022-03-24 13:45:29.012\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component evaluation_0, time elapse: 0:01:54\u001b[0m\n", + "\u001b[32m2022-03-24 13:45:29.652\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component evaluation_0, time elapse: 0:01:55\u001b[0m\n", + "\u001b[32m2022-03-24 13:45:30.208\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component evaluation_0, time elapse: 0:01:55\u001b[0m\n", + "\u001b[32m2022-03-24 13:45:30.773\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component evaluation_0, time elapse: 0:01:56\u001b[0m\n", + "\u001b[32m2022-03-24 13:45:31.350\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component evaluation_0, time elapse: 0:01:57\u001b[0m\n", + "\u001b[32m2022-03-24 13:45:31.889\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component evaluation_0, time elapse: 0:01:57\u001b[0m\n", + "\u001b[32m2022-03-24 13:45:32.466\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component evaluation_0, time elapse: 0:01:58\u001b[0m\n", + "\u001b[32m2022-03-24 13:45:33.006\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component evaluation_0, time elapse: 0:01:58\u001b[0m\n", + "\u001b[32m2022-03-24 13:45:33.535\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component evaluation_0, time elapse: 0:01:59\u001b[0m\n", + "\u001b[32m2022-03-24 13:45:45.660\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m131\u001b[0m - \u001b[1mJob is success!!! Job id is 202203241343334274690\u001b[0m\n", + "\u001b[32m2022-03-24 13:45:45.662\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m132\u001b[0m - \u001b[1mTotal time: 0:02:11\u001b[0m\n" ] } ], @@ -434,7 +816,8 @@ "hash": "ad4309918fa4cd1705b305e369b2f64d901b1851e9144aef7b9b07ea3efcb1bb" }, "kernelspec": { - "display_name": "Python 3.6.15 64-bit ('py36': venv)", + "display_name": "Python 3 (ipykernel)", + "language": "python", "name": "python3" }, "language_info": { @@ -447,7 +830,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.15" + "version": "3.7.12" } }, "nbformat": 4, diff --git a/docker-build/client/pipeline/pipeline_tutorial_homo_nn.ipynb b/docker-build/client/pipeline/pipeline_tutorial_homo_nn.ipynb deleted file mode 100644 index ecbbe8627..000000000 --- a/docker-build/client/pipeline/pipeline_tutorial_homo_nn.ipynb +++ /dev/null @@ -1,440 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Pipeline Tutorial" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### install" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`Pipeline` is distributed along with [fate_client](https://pypi.org/project/fate-client/).\n", - "\n", - "```bash\n", - "pip install fate_client\n", - "```\n", - "\n", - "To use Pipeline, we need to first specify which `FATE Flow Service` to connect to. Once `fate_client` installed, one can find an cmd enterpoint name `pipeline`:" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Usage: pipeline [OPTIONS] COMMAND [ARGS]...\r\n", - "\r\n", - "Options:\r\n", - " --help Show this message and exit.\r\n", - "\r\n", - "Commands:\r\n", - " init \b - DESCRIPTION: Pipeline Config Command.\r\n" - ] - } - ], - "source": [ - "!pipeline --help" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Assume we have a `FATE Flow Service` in 127.0.0.1:9380(defaults in standalone), then exec" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Pipeline configuration succeeded.\r\n" - ] - } - ], - "source": [ - "!pipeline init --ip 127.0.0.1 --port 9380" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### homo nn" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The `pipeline` package provides components to compose a `FATE pipeline`." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "from pipeline.backend.pipeline import PipeLine\n", - "from pipeline.component import DataTransform\n", - "from pipeline.component import Reader\n", - "from pipeline.component import HomoNN\n", - "from pipeline.interface import Data" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Make a `pipeline` instance:\n", - "\n", - " - initiator: \n", - " * role: guest\n", - " * party: 9999\n", - " - roles:\n", - " * guest: 9999\n", - " * host: [10000, 9999]\n", - " * arbiter: 9999\n", - " " - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "pipeline = PipeLine() \\\n", - " .set_initiator(role='guest', party_id=9999) \\\n", - " .set_roles(guest=9999, host=[10000], arbiter=10000)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Define a `Reader` to load data" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "reader_0 = Reader(name=\"reader_0\")\n", - "# set guest parameter\n", - "reader_0.get_party_instance(role='guest', party_id=9999).component_param(\n", - " table={\"name\": \"breast_homo_guest\", \"namespace\": \"experiment\"})\n", - "# set host parameter\n", - "reader_0.get_party_instance(role='host', party_id=10000).component_param(\n", - " table={\"name\": \"breast_homo_host\", \"namespace\": \"experiment\"})" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Add a `DataTransform` component to parse raw data into Data Instance" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "data_transform_0 = DataTransform(name=\"data_transform_0\", with_label=True)\n", - "# set guest parameter\n", - "data_transform_0.get_party_instance(role='guest', party_id=9999).component_param(\n", - " with_label=True)\n", - "data_transform_0.get_party_instance(role='host', party_id=[10000]).component_param(\n", - " with_label=True)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now, we define the `HomoNN` component." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "homo_nn_0 = HomoNN(\n", - " name=\"homo_nn_0\", \n", - " max_iter=10, \n", - " batch_size=-1, \n", - " early_stop={\"early_stop\": \"diff\", \"eps\": 0.0001})" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Add single `Dense` layer:" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from tensorflow.keras.layers import Dense\n", - "homo_nn_0.add(\n", - " Dense(units=1, input_shape=(10,), activation=\"sigmoid\"))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Compile:" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from tensorflow.keras import optimizers\n", - "homo_nn_0.compile(\n", - " optimizer=optimizers.Adam(learning_rate=0.05), \n", - " metrics=[\"accuracy\", \"AUC\"],\n", - " loss=\"binary_crossentropy\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Add components to pipeline:\n", - "\n", - " - data_transform_0 comsume reader_0's output data\n", - " - homo_nn_0 comsume data_transform_0's output data" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "pipeline.add_component(reader_0)\n", - "pipeline.add_component(data_transform_0, data=Data(data=reader_0.output.data))\n", - "pipeline.add_component(homo_nn_0, data=Data(train_data=data_transform_0.output.data))\n", - "pipeline.compile();" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now, submit(fit) our pipeline:" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2020-11-02 17:39:31.756 | INFO | pipeline.utils.invoker.job_submitter:monitor_job_status:121 - Job id is 2020110217393142628946\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Job is still waiting, time elapse: 0:00:00\n", - "Running component reader_0, time elapse: 0:00:02\n", - "Running component data_transform_0, time elapse: 0:00:04\n", - "Running component homo_nn_0, time elapse: 0:00:17\r" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2020-11-02 17:39:50.461 | INFO | pipeline.utils.invoker.job_submitter:monitor_job_status:129 - Job is success!!! Job id is 2020110217393142628946\n", - "2020-11-02 17:39:50.462 | INFO | pipeline.utils.invoker.job_submitter:monitor_job_status:130 - Total time: 0:00:18\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "\r" - ] - } - ], - "source": [ - "pipeline.fit()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Success! Now we can get model summary from homo_nn_0:" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'is_converged': False,\n", - " 'loss_history': [0.45709115266799927,\n", - " 0.3215165436267853,\n", - " 0.24622784554958344,\n", - " 0.19835461676120758,\n", - " 0.16508619487285614,\n", - " 0.14108890295028687,\n", - " 0.12376809120178223,\n", - " 0.11123336106538773,\n", - " 0.10193527489900589,\n", - " 0.09480327367782593]}" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "summary = pipeline.get_component(\"homo_nn_0\").get_summary()\n", - "summary" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And we can use the summary data to draw the loss curve:" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Populating the interactive namespace from numpy and matplotlib\n" - ] - }, - { - "data": { - "text/plain": [ - "[]" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "%pylab inline\n", - "pylab.plot(summary['loss_history'])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "For more examples about using pipeline to submit `HomoNN` jobs, please refer to [HomoNN Examples](https://github.com/FederatedAI/FATE/tree/master/examples/pipeline/homo_nn)" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.15" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/docker-build/client/pipeline/pipeline_tutorial_match_id.ipynb b/docker-build/client/pipeline/pipeline_tutorial_match_id.ipynb deleted file mode 100644 index 898c6ec5a..000000000 --- a/docker-build/client/pipeline/pipeline_tutorial_match_id.ipynb +++ /dev/null @@ -1,447 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Pipeline Match ID Tutorial " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Starting at version 1.7, FATE distinguishes sample id(sid) and match id. Sid are unique to each sample entry, while match id corresponds to individual sample source identity. This adaption allows FATE to perform private set intersection on samples with repeated match id. User may choose to create sid by appending uuid to original sample entries at uploading; then module `DataTransform` will extract true match id for later use. This tutorial walks through a full uploading-training process to demonstrate how to add and train with sid." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### install" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`Pipeline` is distributed along with [fate_client](https://pypi.org/project/fate-client/).\n", - "\n", - "```bash\n", - "pip install fate_client\n", - "```\n", - "\n", - "To use Pipeline, we need to first specify which `FATE Flow Service` to connect to. Once `fate_client` installed, one can find an cmd enterpoint name `pipeline`:" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Usage: pipeline [OPTIONS] COMMAND [ARGS]...\n", - "\n", - "Options:\n", - " --help Show this message and exit.\n", - "\n", - "Commands:\n", - " config pipeline config tool\n", - " init - DESCRIPTION: Pipeline Config Command.\n" - ] - } - ], - "source": [ - "!pipeline --help" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Assume we have a `FATE Flow Service` in 127.0.0.1:9380(defaults in standalone), then exec" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Pipeline configuration succeeded.\n" - ] - } - ], - "source": [ - "!pipeline init --ip 127.0.0.1 --port 9380" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### upload data" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - " Before start a modeling task, the data to be used should be uploaded. \n", - " Typically, a party is usually a cluster which include multiple nodes. Thus, when we upload these data, the data will be allocated to those nodes." - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": {}, - "outputs": [], - "source": [ - "from pipeline.backend.pipeline import PipeLine" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Make a `pipeline` instance:\n", - "\n", - " - initiator: \n", - " * role: guest\n", - " * party: 9999\n", - " - roles:\n", - " * guest: 9999\n", - "\n", - "note that only local party id is needed.\n", - " " - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": {}, - "outputs": [], - "source": [ - "pipeline_upload = PipeLine().set_initiator(role='guest', party_id=9999).set_roles(guest=9999)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Define partitions for data storage" - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "metadata": {}, - "outputs": [], - "source": [ - "partition = 4" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Define table name and namespace, which will be used in FATE job configuration" - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "metadata": {}, - "outputs": [], - "source": [ - "dense_data_guest = {\"name\": \"breast_hetero_guest\", \"namespace\": f\"experiment\"}\n", - "dense_data_host = {\"name\": \"breast_hetero_host\", \"namespace\": f\"experiment\"}\n", - "tag_data = {\"name\": \"breast_hetero_host\", \"namespace\": f\"experiment\"}" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now, we add data to be uploaded. To create uuid as sid, turn on `extend_sid` option. Alternatively, set `auto_increasing_sid` to make extended sid starting at 0." - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "metadata": {}, - "outputs": [], - "source": [ - "data_base = \"/workspace/FATE/\"\n", - "pipeline_upload.add_upload_data(file=os.path.join(data_base, \"examples/data/breast_hetero_guest.csv\"),\n", - " table_name=dense_data_guest[\"name\"], # table name\n", - " namespace=dense_data_guest[\"namespace\"], # namespace\n", - " head=1, partition=partition, # data info\n", - " extend_sid=True, # extend sid \n", - " auto_increasing_sid=False)\n", - "\n", - "pipeline_upload.add_upload_data(file=os.path.join(data_base, \"examples/data/breast_hetero_host.csv\"),\n", - " table_name=dense_data_host[\"name\"],\n", - " namespace=dense_data_host[\"namespace\"],\n", - " head=1, partition=partition,\n", - " extend_sid=True,\n", - " auto_increasing_sid=False) " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can then upload data" - ] - }, - { - "cell_type": "code", - "execution_count": 35, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - " UPLOADING:||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||100.00%\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "\u001b[32m2021-11-19 07:35:47.878\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m123\u001b[0m - \u001b[1mJob id is 202111190735467376700\n", - "\u001b[0m\n", - "\u001b[32m2021-11-19 07:35:48.433\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m144\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KJob is still waiting, time elapse: 0:00:00\u001b[0m\n", - "\u001b[0m\n", - "\u001b[32m2021-11-19 07:35:52.720\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component upload_0, time elapse: 0:00:04\u001b[0m\n", - "\u001b[32m2021-11-19 07:35:54.265\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m131\u001b[0m - \u001b[1mJob is success!!! Job id is 202111190735467376700\u001b[0m\n", - "\u001b[32m2021-11-19 07:35:54.266\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m132\u001b[0m - \u001b[1mTotal time: 0:00:06\u001b[0m\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - " UPLOADING:||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||100.00%\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "\u001b[32m2021-11-19 07:35:55.397\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m123\u001b[0m - \u001b[1mJob id is 202111190735542712400\n", - "\u001b[0m\n", - "\u001b[32m2021-11-19 07:35:57.966\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m144\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KJob is still waiting, time elapse: 0:00:02\u001b[0m\n", - "\u001b[0m\n", - "\u001b[32m2021-11-19 07:36:02.191\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component upload_0, time elapse: 0:00:06\u001b[0m\n", - "\u001b[32m2021-11-19 07:36:03.750\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m131\u001b[0m - \u001b[1mJob is success!!! Job id is 202111190735542712400\u001b[0m\n", - "\u001b[32m2021-11-19 07:36:03.752\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m132\u001b[0m - \u001b[1mTotal time: 0:00:08\u001b[0m\n" - ] - } - ], - "source": [ - "pipeline_upload.upload(drop=1)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "After uploading, we can then start modeling. Here we build a Hetero SecureBoost model the same way as in [this demo](https://github.com/FederatedAI/FATE/blob/master/doc/tutorial/pipeline/pipeline_tutorial_hetero_sbt.ipynb), but note how specificaiton of `DataTransform` module needs to be adjusted to crrectly load in match id." - ] - }, - { - "cell_type": "code", - "execution_count": 36, - "metadata": {}, - "outputs": [], - "source": [ - "from pipeline.backend.pipeline import PipeLine\n", - "from pipeline.component import Reader, DataTransform, Intersection, HeteroSecureBoost, Evaluation\n", - "from pipeline.interface import Data\n", - "\n", - "pipeline = PipeLine() \\\n", - " .set_initiator(role='guest', party_id=9999) \\\n", - " .set_roles(guest=9999, host=10000)\n", - "\n", - "reader_0 = Reader(name=\"reader_0\")\n", - "# set guest parameter\n", - "reader_0.get_party_instance(role='guest', party_id=9999).component_param(\n", - " table={\"name\": \"breast_hetero_guest\", \"namespace\": \"experiment\"})\n", - "# set host parameter\n", - "reader_0.get_party_instance(role='host', party_id=10000).component_param(\n", - " table={\"name\": \"breast_hetero_host\", \"namespace\": \"experiment\"})\n", - "\n", - "# set with match id\n", - "data_transform_0 = DataTransform(name=\"data_transform_0\", with_match_id=True)\n", - "# set guest parameter\n", - "data_transform_0.get_party_instance(role='guest', party_id=9999).component_param(\n", - " with_label=True)\n", - "data_transform_0.get_party_instance(role='host', party_id=[10000]).component_param(\n", - " with_label=False)\n", - "\n", - "intersect_0 = Intersection(name=\"intersect_0\")\n", - "\n", - "hetero_secureboost_0 = HeteroSecureBoost(name=\"hetero_secureboost_0\",\n", - " num_trees=5,\n", - " bin_num=16,\n", - " task_type=\"classification\",\n", - " objective_param={\"objective\": \"cross_entropy\"},\n", - " encrypt_param={\"method\": \"iterativeAffine\"},\n", - " tree_param={\"max_depth\": 3})\n", - "\n", - "evaluation_0 = Evaluation(name=\"evaluation_0\", eval_type=\"binary\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Add components to pipeline, in order of execution:\n", - "\n", - " - data_transform_0 comsume reader_0's output data\n", - " - intersect_0 comsume data_transform_0's output data\n", - " - hetero_secureboost_0 consume intersect_0's output data\n", - " - evaluation_0 consume hetero_secureboost_0's prediciton result on training data\n", - "\n", - "Then compile our pipeline to make it ready for submission." - ] - }, - { - "cell_type": "code", - "execution_count": 37, - "metadata": {}, - "outputs": [], - "source": [ - "pipeline.add_component(reader_0)\n", - "pipeline.add_component(data_transform_0, data=Data(data=reader_0.output.data))\n", - "pipeline.add_component(intersect_0, data=Data(data=data_transform_0.output.data))\n", - "pipeline.add_component(hetero_secureboost_0, data=Data(train_data=intersect_0.output.data))\n", - "pipeline.add_component(evaluation_0, data=Data(data=hetero_secureboost_0.output.data))\n", - "pipeline.compile();" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now, submit(fit) our pipeline:" - ] - }, - { - "cell_type": "code", - "execution_count": 38, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "\u001b[32m2021-11-19 07:36:24.134\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m123\u001b[0m - \u001b[1mJob id is 202111190736201489160\n", - "\u001b[0m\n", - "\u001b[32m2021-11-19 07:36:25.678\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m144\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KJob is still waiting, time elapse: 0:00:01\u001b[0m\n", - "\u001b[0m\n", - "\u001b[32m2021-11-19 07:36:30.871\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component reader_0, time elapse: 0:00:06\u001b[0m\n", - "\u001b[0m\n", - "\u001b[32m2021-11-19 07:36:40.054\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component data_transform_0, time elapse: 0:00:15\u001b[0m\n", - "\u001b[0m\n", - "\u001b[32m2021-11-19 07:36:53.562\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component intersect_0, time elapse: 0:00:29\u001b[0m\n", - "\u001b[0m\n", - "\u001b[32m2021-11-19 07:38:53.382\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component hetero_secureboost_0, time elapse: 0:02:29\u001b[0m\n", - "\u001b[0m\n", - "\u001b[32m2021-11-19 07:39:02.926\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component evaluation_0, time elapse: 0:02:38\u001b[0m\n", - "\u001b[32m2021-11-19 07:39:05.506\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m131\u001b[0m - \u001b[1mJob is success!!! Job id is 202111190736201489160\u001b[0m\n", - "\u001b[32m2021-11-19 07:39:05.508\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m132\u001b[0m - \u001b[1mTotal time: 0:02:41\u001b[0m\n" - ] - } - ], - "source": [ - "pipeline.fit()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Check data output on FATEBoard or download component output data to see now each data instance has a uuid as sid." - ] - }, - { - "cell_type": "code", - "execution_count": 39, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{\n", - " \"data\": [\n", - " \"sid,inst_id,label,x0,x1,x2,x3,x4,x5,x6,x7,x8,x9\",\n", - " \"522b662a490b11ecbbc51a530a4c64040,133,1,0.254879,-1.046633,0.209656,0.074214,-0.441366,-0.377645,-0.485934,0.347072,-0.28757,-0.733474\",\n", - " \"522b662a490b11ecbbc51a530a4c64041,273,1,-1.142928,-0.781198,-1.166747,-0.923578,0.62823,-1.021418,-1.111867,-0.959523,-0.096672,-0.121683\"\n", - " ],\n", - " \"meta\": [\n", - " \"sid\",\n", - " \"inst_id\",\n", - " \"label\",\n", - " \"x0\",\n", - " \"x1\",\n", - " \"x2\",\n", - " \"x3\",\n", - " \"x4\",\n", - " \"x5\",\n", - " \"x6\",\n", - " \"x7\",\n", - " \"x8\",\n", - " \"x9\"\n", - " ]\n", - "}\n" - ] - } - ], - "source": [ - "import json\n", - "print(json.dumps(pipeline.get_component(\"data_transform_0\").get_output_data(limits=3), indent=4))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "For more demo on using pipeline to submit jobs, please refer to [pipeline demos](https://github.com/FederatedAI/FATE/tree/master/examples/pipeline/demo). [Here](https://github.com/FederatedAI/FATE/tree/master/examples/pipeline/match_id_test) we include other pipeline examples using data with match id." - ] - } - ], - "metadata": { - "interpreter": { - "hash": "ad4309918fa4cd1705b305e369b2f64d901b1851e9144aef7b9b07ea3efcb1bb" - }, - "kernelspec": { - "display_name": "Python 3.6.15 64-bit ('py36': venv)", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.15" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/docker-build/client/pipeline/pipeline_tutorial_upload.ipynb b/docker-build/client/pipeline/pipeline_tutorial_upload.ipynb index 85cfd6b75..d9504f247 100644 --- a/docker-build/client/pipeline/pipeline_tutorial_upload.ipynb +++ b/docker-build/client/pipeline/pipeline_tutorial_upload.ipynb @@ -29,21 +29,30 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "import os" + ] + }, + { + "cell_type": "code", + "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Usage: pipeline [OPTIONS] COMMAND [ARGS]...\n", - "\n", - "Options:\n", - " --help Show this message and exit.\n", - "\n", - "Commands:\n", - " config pipeline config tool\n", - " init - DESCRIPTION: Pipeline Config Command.\n" + "Usage: pipeline [OPTIONS] COMMAND [ARGS]...\r\n", + "\r\n", + "Options:\r\n", + " --help Show this message and exit.\r\n", + "\r\n", + "Commands:\r\n", + " config pipeline config tool\r\n", + " init \b - DESCRIPTION: Pipeline Config Command.\r\n" ] } ], @@ -55,24 +64,24 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Assume we have a `FATE Flow Service` in 127.0.0.1:9380(defaults in standalone), then exec" + "Assume we have a `FATE Flow Service` which name is `fateflow` and the port is `9380`, then exec" ] }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Pipeline configuration succeeded.\n" + "Pipeline configuration succeeded.\r\n" ] } ], "source": [ - "!pipeline init --ip 127.0.0.1 --port 9380" + "!pipeline init --ip fateflow --port 9380" ] }, { @@ -92,7 +101,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 11, "metadata": {}, "outputs": [], "source": [ @@ -117,7 +126,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 12, "metadata": {}, "outputs": [], "source": [ @@ -133,7 +142,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 13, "metadata": {}, "outputs": [], "source": [ @@ -149,7 +158,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 14, "metadata": {}, "outputs": [], "source": [ @@ -167,11 +176,11 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 15, "metadata": {}, "outputs": [], "source": [ - "data_base = \"/workspace/FATE/\"\n", + "data_base = \"/data/projects/fate/\"\n", "pipeline_upload.add_upload_data(file=os.path.join(data_base, \"examples/data/breast_hetero_guest.csv\"),\n", " table_name=dense_data_guest[\"name\"], # table name\n", " namespace=dense_data_guest[\"namespace\"], # namespace\n", @@ -197,7 +206,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 16, "metadata": {}, "outputs": [ { @@ -211,13 +220,32 @@ "name": "stderr", "output_type": "stream", "text": [ - "\u001b[32m2021-11-15 11:26:40.541\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m123\u001b[0m - \u001b[1mJob id is 202111151126388669570\n", + "\u001b[32m2022-03-24 13:18:11.025\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m123\u001b[0m - \u001b[1mJob id is 202203241318106644180\n", "\u001b[0m\n", - "\u001b[32m2021-11-15 11:26:42.601\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m144\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KJob is still waiting, time elapse: 0:00:02\u001b[0m\n", - "\u001b[0m\n", - "\u001b[32m2021-11-15 11:26:49.260\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component upload_0, time elapse: 0:00:08\u001b[0m\n", - "\u001b[32m2021-11-15 11:26:52.644\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m131\u001b[0m - \u001b[1mJob is success!!! Job id is 202111151126388669570\u001b[0m\n", - "\u001b[32m2021-11-15 11:26:52.649\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m132\u001b[0m - \u001b[1mTotal time: 0:00:12\u001b[0m\n" + "\u001b[32m2022-03-24 13:18:11.041\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m144\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KJob is still waiting, time elapse: 0:00:00\u001b[0m\n", + "\u001b[0mm2022-03-24 13:18:11.597\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m173\u001b[0m - \u001b[1m\n", + "\u001b[32m2022-03-24 13:18:11.599\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component upload_0, time elapse: 0:00:00\u001b[0m\n", + "\u001b[32m2022-03-24 13:18:12.134\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component upload_0, time elapse: 0:00:01\u001b[0m\n", + "\u001b[32m2022-03-24 13:18:12.667\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component upload_0, time elapse: 0:00:01\u001b[0m\n", + "\u001b[32m2022-03-24 13:18:13.201\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component upload_0, time elapse: 0:00:02\u001b[0m\n", + "\u001b[32m2022-03-24 13:18:13.747\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component upload_0, time elapse: 0:00:02\u001b[0m\n", + "\u001b[32m2022-03-24 13:18:14.282\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component upload_0, time elapse: 0:00:03\u001b[0m\n", + "\u001b[32m2022-03-24 13:18:14.826\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component upload_0, time elapse: 0:00:03\u001b[0m\n", + "\u001b[32m2022-03-24 13:18:15.361\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component upload_0, time elapse: 0:00:04\u001b[0m\n", + "\u001b[32m2022-03-24 13:18:15.895\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component upload_0, time elapse: 0:00:04\u001b[0m\n", + "\u001b[32m2022-03-24 13:18:16.432\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component upload_0, time elapse: 0:00:05\u001b[0m\n", + "\u001b[32m2022-03-24 13:18:16.967\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component upload_0, time elapse: 0:00:05\u001b[0m\n", + "\u001b[32m2022-03-24 13:18:17.506\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component upload_0, time elapse: 0:00:06\u001b[0m\n", + "\u001b[32m2022-03-24 13:18:18.041\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component upload_0, time elapse: 0:00:07\u001b[0m\n", + "\u001b[32m2022-03-24 13:18:18.575\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component upload_0, time elapse: 0:00:07\u001b[0m\n", + "\u001b[32m2022-03-24 13:18:19.146\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component upload_0, time elapse: 0:00:08\u001b[0m\n", + "\u001b[32m2022-03-24 13:18:19.719\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component upload_0, time elapse: 0:00:08\u001b[0m\n", + "\u001b[32m2022-03-24 13:18:20.285\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component upload_0, time elapse: 0:00:09\u001b[0m\n", + "\u001b[32m2022-03-24 13:18:20.824\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component upload_0, time elapse: 0:00:09\u001b[0m\n", + "\u001b[32m2022-03-24 13:18:21.361\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component upload_0, time elapse: 0:00:10\u001b[0m\n", + "\u001b[32m2022-03-24 13:18:21.900\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component upload_0, time elapse: 0:00:10\u001b[0m\n", + "\u001b[32m2022-03-24 13:18:29.293\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m131\u001b[0m - \u001b[1mJob is success!!! Job id is 202203241318106644180\u001b[0m\n", + "\u001b[32m2022-03-24 13:18:29.295\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m132\u001b[0m - \u001b[1mTotal time: 0:00:18\u001b[0m\n" ] }, { @@ -231,13 +259,35 @@ "name": "stderr", "output_type": "stream", "text": [ - "\u001b[32m2021-11-15 11:26:53.998\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m123\u001b[0m - \u001b[1mJob id is 202111151126526555290\n", - "\u001b[0m\n", - "\u001b[32m2021-11-15 11:26:54.006\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m144\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KJob is still waiting, time elapse: 0:00:00\u001b[0m\n", + "\u001b[32m2022-03-24 13:18:29.575\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m123\u001b[0m - \u001b[1mJob id is 202203241318293060140\n", "\u001b[0m\n", - "\u001b[32m2021-11-15 11:27:00.984\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component upload_0, time elapse: 0:00:06\u001b[0m\n", - "\u001b[32m2021-11-15 11:27:02.770\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m131\u001b[0m - \u001b[1mJob is success!!! Job id is 202111151126526555290\u001b[0m\n", - "\u001b[32m2021-11-15 11:27:02.771\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m132\u001b[0m - \u001b[1mTotal time: 0:00:08\u001b[0m\n" + "\u001b[32m2022-03-24 13:18:29.593\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m144\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KJob is still waiting, time elapse: 0:00:00\u001b[0m\n", + "\u001b[32m2022-03-24 13:18:30.111\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m144\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KJob is still waiting, time elapse: 0:00:00\u001b[0m\n", + "\u001b[32m2022-03-24 13:18:30.629\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m144\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KJob is still waiting, time elapse: 0:00:01\u001b[0m\n", + "\u001b[32m2022-03-24 13:18:31.146\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m144\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KJob is still waiting, time elapse: 0:00:01\u001b[0m\n", + "\u001b[0mm2022-03-24 13:18:31.676\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m173\u001b[0m - \u001b[1m\n", + "\u001b[32m2022-03-24 13:18:31.679\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component upload_0, time elapse: 0:00:02\u001b[0m\n", + "\u001b[32m2022-03-24 13:18:32.208\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component upload_0, time elapse: 0:00:02\u001b[0m\n", + "\u001b[32m2022-03-24 13:18:32.739\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component upload_0, time elapse: 0:00:03\u001b[0m\n", + "\u001b[32m2022-03-24 13:18:33.270\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component upload_0, time elapse: 0:00:03\u001b[0m\n", + "\u001b[32m2022-03-24 13:18:33.804\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component upload_0, time elapse: 0:00:04\u001b[0m\n", + "\u001b[32m2022-03-24 13:18:34.328\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component upload_0, time elapse: 0:00:04\u001b[0m\n", + "\u001b[32m2022-03-24 13:18:34.861\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component upload_0, time elapse: 0:00:05\u001b[0m\n", + "\u001b[32m2022-03-24 13:18:35.391\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component upload_0, time elapse: 0:00:05\u001b[0m\n", + "\u001b[32m2022-03-24 13:18:35.921\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component upload_0, time elapse: 0:00:06\u001b[0m\n", + "\u001b[32m2022-03-24 13:18:36.456\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component upload_0, time elapse: 0:00:06\u001b[0m\n", + "\u001b[32m2022-03-24 13:18:36.983\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component upload_0, time elapse: 0:00:07\u001b[0m\n", + "\u001b[32m2022-03-24 13:18:37.543\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component upload_0, time elapse: 0:00:07\u001b[0m\n", + "\u001b[32m2022-03-24 13:18:38.107\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component upload_0, time elapse: 0:00:08\u001b[0m\n", + "\u001b[32m2022-03-24 13:18:38.671\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component upload_0, time elapse: 0:00:09\u001b[0m\n", + "\u001b[32m2022-03-24 13:18:39.226\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component upload_0, time elapse: 0:00:09\u001b[0m\n", + "\u001b[32m2022-03-24 13:18:39.765\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component upload_0, time elapse: 0:00:10\u001b[0m\n", + "\u001b[32m2022-03-24 13:18:40.295\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component upload_0, time elapse: 0:00:10\u001b[0m\n", + "\u001b[32m2022-03-24 13:18:40.824\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component upload_0, time elapse: 0:00:11\u001b[0m\n", + "\u001b[32m2022-03-24 13:18:41.357\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component upload_0, time elapse: 0:00:11\u001b[0m\n", + "\u001b[32m2022-03-24 13:18:41.919\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component upload_0, time elapse: 0:00:12\u001b[0m\n", + "\u001b[32m2022-03-24 13:18:48.837\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m131\u001b[0m - \u001b[1mJob is success!!! Job id is 202203241318293060140\u001b[0m\n", + "\u001b[32m2022-03-24 13:18:48.840\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m132\u001b[0m - \u001b[1mTotal time: 0:00:19\u001b[0m\n" ] }, { @@ -251,13 +301,34 @@ "name": "stderr", "output_type": "stream", "text": [ - "\u001b[32m2021-11-15 11:27:03.959\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m123\u001b[0m - \u001b[1mJob id is 202111151127027776050\n", - "\u001b[0m\n", - "\u001b[32m2021-11-15 11:27:03.969\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m144\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KJob is still waiting, time elapse: 0:00:00\u001b[0m\n", + "\u001b[32m2022-03-24 13:18:49.206\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m123\u001b[0m - \u001b[1mJob id is 202203241318488510330\n", "\u001b[0m\n", - "\u001b[32m2021-11-15 11:27:11.018\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component upload_0, time elapse: 0:00:07\u001b[0m\n", - "\u001b[32m2021-11-15 11:27:12.669\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m131\u001b[0m - \u001b[1mJob is success!!! Job id is 202111151127027776050\u001b[0m\n", - "\u001b[32m2021-11-15 11:27:12.671\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m132\u001b[0m - \u001b[1mTotal time: 0:00:08\u001b[0m\n" + "\u001b[32m2022-03-24 13:18:49.227\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m144\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KJob is still waiting, time elapse: 0:00:00\u001b[0m\n", + "\u001b[32m2022-03-24 13:18:49.746\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m144\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KJob is still waiting, time elapse: 0:00:00\u001b[0m\n", + "\u001b[32m2022-03-24 13:18:50.263\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m144\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KJob is still waiting, time elapse: 0:00:01\u001b[0m\n", + "\u001b[32m2022-03-24 13:18:50.790\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m144\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KJob is still waiting, time elapse: 0:00:01\u001b[0m\n", + "\u001b[0mm2022-03-24 13:18:51.319\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m173\u001b[0m - \u001b[1m\n", + "\u001b[32m2022-03-24 13:18:51.321\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component upload_0, time elapse: 0:00:02\u001b[0m\n", + "\u001b[32m2022-03-24 13:18:51.852\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component upload_0, time elapse: 0:00:02\u001b[0m\n", + "\u001b[32m2022-03-24 13:18:52.384\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component upload_0, time elapse: 0:00:03\u001b[0m\n", + "\u001b[32m2022-03-24 13:18:52.915\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component upload_0, time elapse: 0:00:03\u001b[0m\n", + "\u001b[32m2022-03-24 13:18:53.451\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component upload_0, time elapse: 0:00:04\u001b[0m\n", + "\u001b[32m2022-03-24 13:18:53.979\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component upload_0, time elapse: 0:00:04\u001b[0m\n", + "\u001b[32m2022-03-24 13:18:54.507\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component upload_0, time elapse: 0:00:05\u001b[0m\n", + "\u001b[32m2022-03-24 13:18:55.036\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component upload_0, time elapse: 0:00:05\u001b[0m\n", + "\u001b[32m2022-03-24 13:18:55.570\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component upload_0, time elapse: 0:00:06\u001b[0m\n", + "\u001b[32m2022-03-24 13:18:56.099\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component upload_0, time elapse: 0:00:06\u001b[0m\n", + "\u001b[32m2022-03-24 13:18:56.637\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component upload_0, time elapse: 0:00:07\u001b[0m\n", + "\u001b[32m2022-03-24 13:18:57.215\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component upload_0, time elapse: 0:00:08\u001b[0m\n", + "\u001b[32m2022-03-24 13:18:57.795\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component upload_0, time elapse: 0:00:08\u001b[0m\n", + "\u001b[32m2022-03-24 13:18:58.336\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component upload_0, time elapse: 0:00:09\u001b[0m\n", + "\u001b[32m2022-03-24 13:18:58.869\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component upload_0, time elapse: 0:00:09\u001b[0m\n", + "\u001b[32m2022-03-24 13:18:59.400\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component upload_0, time elapse: 0:00:10\u001b[0m\n", + "\u001b[32m2022-03-24 13:18:59.928\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component upload_0, time elapse: 0:00:10\u001b[0m\n", + "\u001b[32m2022-03-24 13:19:00.459\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component upload_0, time elapse: 0:00:11\u001b[0m\n", + "\u001b[32m2022-03-24 13:19:00.986\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m177\u001b[0m - \u001b[1m\u001b[80D\u001b[1A\u001b[KRunning component upload_0, time elapse: 0:00:11\u001b[0m\n", + "\u001b[32m2022-03-24 13:19:09.035\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m131\u001b[0m - \u001b[1mJob is success!!! Job id is 202203241318488510330\u001b[0m\n", + "\u001b[32m2022-03-24 13:19:09.037\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpipeline.utils.invoker.job_submitter\u001b[0m:\u001b[36mmonitor_job_status\u001b[0m:\u001b[36m132\u001b[0m - \u001b[1mTotal time: 0:00:19\u001b[0m\n" ] } ], @@ -275,7 +346,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -289,7 +360,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.15" + "version": "3.7.12" } }, "nbformat": 4, diff --git a/docs/tutorials/Build_Two_Parties_FATE_Cluster_in_One_Linux_Machine_with_MiniKube.md b/docs/tutorials/Build_Two_Parties_FATE_Cluster_in_One_Linux_Machine_with_MiniKube.md index 5617dac11..d3083c283 100644 --- a/docs/tutorials/Build_Two_Parties_FATE_Cluster_in_One_Linux_Machine_with_MiniKube.md +++ b/docs/tutorials/Build_Two_Parties_FATE_Cluster_in_One_Linux_Machine_with_MiniKube.md @@ -1,5 +1,7 @@ # Tutorial Goal -In this tutorial, we will from scratch to install a MiniKube for Kubernetes and deploy KubeFATE service on it. Then, we will install a two-parties FATE cluster. Each of them is deployed in a given namespace. We are able to run federated learning with these two parties, and check FATE-Dashboard for the status of the learning job. +In this tutorial, we will from scratch to install a MiniKube for Kubernetes and deploy KubeFATE service on it. Then, we +will install a two-parties FATE cluster. Each of them is deployed in a given namespace. We are able to run federated +learning with these two parties, and check FATE-Dashboard for the status of the learning job. After the tutorial, the deployment architecture looks like the following diagram. @@ -8,60 +10,58 @@ After the tutorial, the deployment architecture looks like the following diagram
# Prerequisites -1. A Linux machine. The verified OS is Ubuntu 18.04 LTS. * The demo machine is 8 core, 32G memory. -2. A domain name for ingress of KubeFATE service, Jupyter Notebook, and FATE-Dashboard. An alternative is to set host both to deploying machine and client to access these endpoints. In this tutorial, we suppose to the latter case. -3. Docker has been installed in the Linux machine. To install a Docker, please refer to [Install Docker in Ubuntu](https://docs.docker.com/install/linux/docker-ce/ubuntu/) -4. Configure username and password for a images repository/registry after the docker has been installed, please refer to [use image pull secrets](https://github.com/federatedai/KubeFATE/blob/master/docs/Use_image_pull_secrets.md). -5. Network connectivity to dockerhub or 163 Docker Image Registry, and google storage -6. Setup the global KubeFATE version using in the tutorial and create a folder for the whole tutorial. We use KubeFATE v1.6.0 in this tutorial, other versions should be similar. +1. A Linux machine. The verified OS is CentOS Linux release 7.9.2009 (Core). * The demo machine is + 8 core, 16G memory. +2. A domain name for ingress of KubeFATE service, Jupyter Notebook, and FATE-Dashboard. An alternative is to set host + both to deploying machine and client to access these endpoints. In this tutorial, we suppose to the latter case. +3. Docker has been installed in the Linux machine. To install a Docker, please refer to [Install Docker in Ubuntu] + (https://www.digitalocean.com/community/tutorials/how-to-install-and-use-docker-on-centos-7) +4. Configure username and password for a images repository/registry after the docker has been installed, please refer to + [use image pull secrets](https://github.com/federatedai/KubeFATE/blob/master/docs/Use_image_pull_secrets.md). +5. Network connectivity to dockerhub or 163 Docker Image Registry, and google gcr. +6. Setup the global KubeFATE version using in the tutorial and create a folder for the whole tutorial. We use + KubeFATE v1.7.2 in this tutorial, other versions should be similar. ``` -export release_version=v1.6.0 && export kubefate_version=v1.4.1 && cd ~ && mkdir demo && cd demo +export release_version=v1.7.2 && export kubefate_version=v1.4.3 && cd ~ && mkdir demo && cd demo ``` **!!!Note: in this tutorial, the IP of the machine we used is 192.168.100.123. Please change it to your machine's IP in all the following commands and config files.** # Start Tutorial -## Install related tools -The following tools and versions have been verified, which are the latest version by the date of drafting this tutorial. -1. MiniKube: v1.7.3 -2. kubectl: v1.17.3 -3. kubefate: - * Release: v1.6.0 - * Service version: v1.4.1 - * Commandline version: v1.4.1 +## Install the dependencies +The following tools and versions have been verified, we assume any versions larger than below versions can also work, +if these dependencies can align the forward compatible principle. +1. MiniKube: v1.19.0 +2. kubectl: v1.19.0 ### Install kubectl ``` -curl -LO https://storage.googleapis.com/kubernetes-release/release/v1.17.3/bin/linux/amd64/kubectl && chmod +x ./kubectl && sudo mv ./kubectl /usr/bin +curl -LO https://storage.googleapis.com/kubernetes-release/release/v1.19.0/bin/linux/amd64/kubectl && chmod +x ./kubectl && sudo mv ./kubectl /usr/bin ``` Try to verify if kubectl installed, ``` kubefate@machine:~/demo$ kubectl version -Client Version: version.Info{Major:"1", Minor:"17", GitVersion:"v1.17.3", GitCommit:"06ad960bfd03b39c8310aaf92d1e7c12ce618213", GitTreeState:"clean", BuildDate:"2020-02-11T18:14:22Z", GoVersion:"go1.13.6", Compiler:"gc", Platform:"linux/amd64"} -The connection to the server localhost:8080 was refused - did you specify the right host or port? +Client Version: version.Info{Major:"1", Minor:"19", GitVersion:"v1.19.0", GitCommit:"e19964183377d0ec2052d1f1fa930c4d7575bd50", GitTreeState:"clean", BuildDate:"2020-08-26T14:30:33Z", GoVersion:"go1.15", Compiler:"gc", Platform:"linux/amd64"} ``` ### Install MiniKube ``` -curl -LO https://github.com/kubernetes/minikube/releases/download/v1.7.3/minikube-linux-amd64 && mv minikube-linux-amd64 minikube && chmod +x minikube && sudo mv ./minikube /usr/bin +curl -LO https://github.com/kubernetes/minikube/releases/download/v1.19.0/minikube-linux-amd64 && mv minikube-linux-amd64 minikube && chmod +x minikube && sudo mv ./minikube /usr/bin ``` Try to verify if MiniKube installed, ``` kubefate@machine:~/demo$ minikube version -minikube version: v1.7.3 -commit: 436667c819c324e35d7e839f8116b968a2d0a3ff +minikube version: v1.21.0 +commit: 76d74191d82c47883dc7e1319ef7cebd3e00ee11 ``` ### Install Kubernetes with MiniKube -In a Linux machine, we suggest using Docker as the hypervisor, which is easy. The details related to [Install MiniKube - Install a Hypervisor](https://kubernetes.io/docs/tasks/tools/install-minikube/#install-a-hypervisor). It is only one command, +In a Linux machine, we suggest using Docker as the hypervisor, which is easy. The details related to +[Install MiniKube - Install a Hypervisor](https://kubernetes.io/docs/tasks/tools/install-minikube/#install-a-hypervisor). +It is only one command, ``` -sudo minikube start --vm-driver=none +sudo minikube start --vm-driver=none --kubernetes-version v1.19.0 ``` -Wait a few seconds for the command finish. Then run the code below to relocate kubectl or minikube. -``` -sudo mv /home/vmware/.kube /home/vmware/.minikube $HOME -sudo chown -R $USER $HOME/.kube $HOME/.minikube -``` -Try to verify if Kubernetes installed, +Wait a few seconds until the command finishes, then try to verify if Kubernetes installed, ``` kubefate@machine:~/demo$ sudo minikube status host: Running @@ -71,21 +71,26 @@ kubeconfig: Configured ``` It means Kubernetes has been installed on your machine! -However, by default MiniKube will not enable the Ingress addon, which KubeFATE required, we need to enable it manually, +However, by default MiniKube will not enable the Ingress addon, which KubeFATE required, we need to enable it by +another command. ``` sudo minikube addons enable ingress ``` Till now, Kubernetes have been ready. -### Download KubeFATE Release Pack, KubeFATE Server Image v1.4.1 and Install KubeFATE Command Lines -Go to [KubeFATE Release](https://github.com/FederatedAI/KubeFATE/releases), and find the latest kubefate-k8s release pack, which is `v1.6.0` as set to ENVs before. (replace ${release_version} with the newest version avaliable) +## Setup Kubefate +### Install KubeFATE CLI +Go to [KubeFATE Release](https://github.com/FederatedAI/KubeFATE/releases), and find the latest kubefate-k8s release +pack, which is `v1.7.2` as set to ENVs before. (replace ${release_version} with the newest version avaliable) ``` curl -LO https://github.com/FederatedAI/KubeFATE/releases/download/${release_version}/kubefate-k8s-${release_version}.tar.gz && tar -xzf ./kubefate-k8s-${release_version}.tar.gz ``` Then we will get the release pack of KubeFATE, verify it, ``` -kubefate@machine:~/demo$ ls -cluster-serving.yaml cluster.yaml config.yaml examples kubefate kubefate-k8s-v1.6.0.tar.gz kubefate.yaml rbac-config.yaml +kubefate@machine:~/demo cd kubefate +kubefate@machine:~/kubefate ls +cluster-serving.yaml cluster-spark-rabbitmq.yaml cluster.yaml examples rbac-config.yaml +cluster-spark-pulsar.yaml cluster-spark-slim.yaml config.yaml kubefate.yaml ``` Move the kubefate executable binary to path, ``` @@ -93,54 +98,64 @@ chmod +x ./kubefate && sudo mv ./kubefate /usr/bin ``` Try to verify if kubefate works, ``` -kubefate@machine:~/demo$ kubefate version -* kubefate service connection error, Post http://example.com/v1/user/login: dial tcp: lookup example.com: no such host -* kubefate commandLine version=v1.4.1 -``` -It is fine only the command line version shows and get an error on KubeFATE service's version because we have not deployed KubeFATE service yet. - -Then, we download the KubeFATE Server Image v1.4.1 as set to ENVs before, - -${release_version} -- The release version of the KubeFATE. - -${kubefate_version} -- The actual version of the KubeFATE. - -You can find the newest version of the KubeFATE here: https://github.com/FederatedAI/KubeFATE/releases. - -For this tutorials we are going to use ```release_version = v1.6.0 & kubefate_version = v.1.4.1``` +kubefate@machine:~/kubefate$ kubefate version +* kubefate commandLine version=v1.4.3 +* kubefate service connection error, resp.StatusCode=404, error: + + + + 404 - Not Found + + +

404 - Not Found

+ + + +``` +It is fine only the command line version shows and get an error on KubeFATE service's version because we have not +deployed the KubeFATE service yet. + +### Deploy KubeFATE service +#### 1. Load the docker image of the KubeFATE service +Download the KubeFATE Server v1.4.3's docker image, ``` curl -LO https://github.com/FederatedAI/KubeFATE/releases/download/${release_version}/kubefate-${kubefate_version}.docker ``` -and load into local Docker. Please note that, because we are using MiniKube, which is an all-in-one deployment of Kubernetes, loading image to local is work for this tutorial. If you are running a cluster-installed Kubernetes, the image needs to be loaded into [Docker Registry](https://docs.docker.com/registry/introduction/) or [Harbor](https://goharbor.io/). For the details of using Harbor as a local image registry, please refer to: https://github.com/FederatedAI/KubeFATE/blob/master/registry/README.md. +and load into local Docker. Please note that, because we are using MiniKube, which is an all-in-one deployment of +Kubernetes, loading image to local is work for this tutorial. If you are running a cluster-installed Kubernetes, +the image needs to be loaded into [Docker Registry](https://docs.docker.com/registry/introduction/) or +[Harbor](https://goharbor.io/). For the details of using Harbor as a local image registry, please refer to: +https://github.com/FederatedAI/KubeFATE/blob/master/registry/README.md. ``` -kubefate@machine:~/demo$ docker load < ./kubefate-v1.4.1.docker -7a5b9c0b4b14: Loading layer [==================================================>] 3.031MB/3.031MB -8edfcca02080: Loading layer [==================================================>] 44.02MB/44.02MB -b7ffb386319e: Loading layer [==================================================>] 2.048kB/2.048kB -Loaded image: federatedai/kubefate:v1.4.1 +docker load < kubefate-v1.4.3.docker ``` - -## Deploy KubeFATE service -### Create kube-fate namespace and account for KubeFATE service +#### 2. Create kube-fate namespace and account for KubeFATE service We have prepared the yaml for creating kube-fate namespace, as well as creating a service account in rbac-config.yaml in your working folder. Just apply it, ``` -kubectl apply -f ./rbac-config.yaml +kubefate@machine:~/kubefate kubectl apply -f ./rbac-config.yaml ``` -### (Optional) Use 163 Image Registory instead of Dockerhub -**Because the [Dockerhub latest limitation](https://docs.docker.com/docker-hub/download-rate-limit/), I suggest using 163 Image Repository instead.** +#### 3. (Optional) Use 163 Image Registory instead of Dockerhub +**Because the [Dockerhub latest limitation](https://docs.docker.com/docker-hub/download-rate-limit/), we suggest +using the 163 Image Repository instead.** ``` sed 's/mariadb:10/hub.c.163.com\/federatedai\/mariadb:10/g' kubefate.yaml > kubefate_163.yaml sed 's/registry: ""/registry: "hub.c.163.com\/federatedai"/g' cluster.yaml > cluster_163.yaml ``` +#### 4. Deploy KubeFATE serving to kube-fate Namespace -### Deploy KubeFATE serving to kube-fate Namespace - -Apply the kubefate deployment YAML, +Apply the KubeFATE deployment YAML. ``` kubectl apply -f ./kubefate_163.yaml ``` +or +``` +kubectl apply -f ./kubefate.yaml +``` +if not using the 163 image hub (**same for all the below commands**). + We can verify it with `kubectl get all,ingress -n kube-fate`, if everything looks like, ``` @@ -168,8 +183,9 @@ ingress.extensions/kubefate example.com 192.168.100.123 80 50s It means KubeFATE service has been deployed. -### (Optional) Add example.com to host file -Note: if we have the domain name setup, this step can be skipped. +#### 5. (Optional) Add example.com to host file +Note: if we have a dns service (such as AWS Route53) setup, which can help to mapping +`example.com` to`192.168.100.123`, then this step can be skipped. Map the machine IP `192.168.100.123` (which is also the 'ADDRESS' field of 'ingress.extensions/kubefate') above to `example.com` @@ -189,44 +205,43 @@ PING example.com (192.168.100.123) 56(84) bytes of data. rtt min/avg/max/mdev = 0.054/0.067/0.080/0.013 ms ``` -### Verify KubeFATE service When `example.com` well set, KubeFATE service version can be shown, ``` -kubefate@machine:~/demo$ kubefate version -* kubefate service version=v1.4.1 -* kubefate commandLine version=v1.4.1 +kubefate@machine:~/kubefate$ kubefate version +* kubefate service version=v1.4.3 +* kubefate commandLine version=v1.4.3 ``` +Note: The `kubefate` CLI can only work in the same directory of config.yaml + Okay. The preparation has been done. Let's install FATE. -## Install two FATE parties: fate-9999 and fate-10000 +## Install the Fate clusters +### Preparation Firstly, we need to prepare two namespaces: fate-9999 for party 9999, while fate-10000 for party 10000. ``` kubectl create namespace fate-9999 kubectl create namespace fate-10000 ``` -Then copy the cluster.yaml sample in the working folder. One for party 9999, the other one for party 10000, -``` -cp ./cluster_163.yaml fate-9999.yaml && cp ./cluster_163.yaml fate-10000.yaml -``` -They are how FATE cluster will be deployed. - -**NOTE: strongly recommend read following document** -For more what each field means, please refer to: https://github.com/FederatedAI/KubeFATE/blob/master/docs/configurations/FATE_cluster_configuration.md. -For the two files, pay extra attention of modify the partyId to the correct number otherwise you are not able to access the notebook or the fateboard. +We have 2 preset examples in `/kubefate/examples/party-9999/` and `/kubefate/examples/party-10000`. -For fate-9999.yaml, modify it as following, +For `/kubefate/examples/party-9999/cluster.yaml`, modify it as following: ``` name: fate-9999 namespace: fate-9999 chartName: fate -chartVersion: v1.6.0 +chartVersion: v1.7.2 partyId: 9999 registry: "hub.c.163.com/federatedai" -pullPolicy: +imageTag: "1.7.2-release" +pullPolicy: +imagePullSecrets: +- name: myregistrykey persistence: false istio: enabled: false +podSecurityPolicy: + enabled: false modules: - rollsite - clustermanager @@ -238,7 +253,19 @@ modules: backend: eggroll -rollsite: +ingress: + fateboard: + annotations: + kubernetes.io/ingress.class: "nginx" + hosts: + - name: party9999.fateboard.example.com + client: + annotations: + kubernetes.io/ingress.class: "nginx" + hosts: + - name: party9999.notebook.example.com + +rollsite: type: NodePort nodePort: 30091 partyList: @@ -250,20 +277,28 @@ python: type: NodePort httpNodePort: 30097 grpcNodePort: 30092 -``` + logLevel: INFO +servingIp: 192.168.100.123 +servingPort: 30095 +``` and for fate-10000: ``` name: fate-10000 namespace: fate-10000 chartName: fate -chartVersion: v1.6.0 +chartVersion: v1.7.2 partyId: 10000 registry: "hub.c.163.com/federatedai" -pullPolicy: +imageTag: "1.7.2-release" +pullPolicy: +imagePullSecrets: +- name: myregistrykey persistence: false istio: enabled: false +podSecurityPolicy: + enabled: false modules: - rollsite - clustermanager @@ -275,7 +310,19 @@ modules: backend: eggroll -rollsite: +ingress: + fateboard: + annotations: + kubernetes.io/ingress.class: "nginx" + hosts: + - name: party10000.fateboard.example.com + client: + annotations: + kubernetes.io/ingress.class: "nginx" + hosts: + - name: party10000.notebook.example.com + +rollsite: type: NodePort nodePort: 30101 partyList: @@ -287,25 +334,39 @@ python: type: NodePort httpNodePort: 30107 grpcNodePort: 30102 + logLevel: INFO + +servingIp: 192.168.100.123 +servingPort: 30105 ``` +For the two files, pay extra attention of modify the partyId to the correct number otherwise you are not able to access +the notebook or the fateboard. + +**NOTE: strongly recommend read following document** +For more what each field means, please refer to: +https://githubcom/FederatedAI/KubeFATE/blob/master/docs/configurations/FATE_cluster_configuration.md. -Okay, we can start to install these two FATE cluster via KubeFATE with the following command, +### Install the FATE clusters +Okay, we can start to install these two FATE cluster via KubeFATE with the following command: ``` -kubefate@machine:~/demo$ kubefate cluster install -f ./fate-9999.yaml +kubefate@machine:~/kubefate$ kubefate cluster install -f examples/party-9999/cluster.yaml create job success, job id=2c1d926c-bb57-43d3-9127-8cf3fc6deb4b -kubefate@machine:~/demo$ kubefate cluster install -f ./fate-10000.yaml +kubefate@machine:~/kubefate$ kubefate cluster install -f examples/party-10000/cluster.yaml create job success, job id=7752db70-e368-41fa-8827-d39411728d1b ``` -There are two jobs created for deploying the FATE clusters. we can check the status of them with `kubefate job ls`. Or watch the clusters till their STATUS changing to `Running`. +There are two jobs created for deploying the FATE clusters. we can check the status of them with `kubefate job ls`, +or watch the clusters till their STATUS changing to `Running`: ``` - -kubefate@machine:~/demo$ watch kubefate cluster ls +kubefate@machine:~/kubefate$ watch kubefate cluster ls UUID NAME NAMESPACE REVISION STATUS CHART ChartVERSION AGE -51476469-b473-4d41-b2d5-ea7241d5eac7 fate-9999 fate-9999 1 Running fate v1.6.0 88s -dacc0549-b9fc-463f-837a-4e7316db2537 fate-10000 fate-10000 1 Running fate v1.6.0 69s +51476469-b473-4d41-b2d5-ea7241d5eac7 fate-9999 fate-9999 1 Running fate v1.7.2 + 88s +dacc0549-b9fc-463f-837a-4e7316db2537 fate-10000 fate-10000 1 Running fate v1.7.2 + 69s ``` -We have about 10G Docker images that need to be pulled, this step will take a while for the first time. An alternative way is offline loading the images to the local environment. +We have about 10G Docker images that need to be pulled, this step will take a while for the first time. +An alternative way is offline loading the images to the local environment. To check the status of the loading, use the command, ``` @@ -324,80 +385,105 @@ python-57b66d96bd-vj8kq 3/3 Running 0 12m rollsite-7846898d6d-j2gb9 1/1 Running 0 12m ``` -## Verify the deployment -### Access the cluster -From above `kubefate cluster ls` command, we know the cluster UUID of `fate-9999` is `51476469-b473-4d41-b2d5-ea7241d5eac7`, while cluster UUID of `fate-10000` is `dacc0549-b9fc-463f-837a-4e7316db2537`. Then, we can query there access information by, +### Verify the deployment +From above `kubefate cluster ls` command, we know the cluster UUID of `fate-9999` is +`51476469-b473-4d41-b2d5-ea7241d5eac7`, while cluster UUID of `fate-10000` is `dacc0549-b9fc-463f-837a-4e7316db2537`. +Thus, we can query there access information by: ``` kubefate@machine:~/demo$ kubefate cluster describe 51476469-b473-4d41-b2d5-ea7241d5eac7 UUID 51476469-b473-4d41-b2d5-ea7241d5eac7 -Name fate-9999 -NameSpace fate-9999 -ChartName fate -ChartVersion v1.6.0 -Revision 1 -Age 2m22s -Status Running -Spec backend: eggroll - chartName: fate - chartVersion: v1.6.0 - istio: - enabled: false - modules: - - rollsite - - clustermanager - - nodemanager - - mysql - - python - - fateboard - - client - name: fate-9999 - namespace: fate-9999 - partyId: 9999 - persistence: false - pullPolicy: null - python: - grpcNodePort: 30092 - httpNodePort: 30097 - type: NodePort - registry: hub.c.163.com/federatedai - rollsite: - nodePort: 30091 - partyList: - - partyId: 10000 - partyIp: 10.184.103.163 - partyPort: 30101 - type: NodePort - -Info dashboard: - - party9999.notebook.example.com - - party9999.fateboard.example.com - ip: 10.184.103.163 - pod: - - clustermanager-5fcbd4ccc6-fj6tq - - mysql-7cf4d4dcb8-wvl4j - - nodemanager-0-6cbbc86769-fk77x - - nodemanager-1-5c6dd78f99-bgt2w - - python-57668d4497-qwnbb - - rollsite-f7476746-5cxh8 - status: - modules: - client: Running - clustermanager: Running - fateboard: Running - mysql: Running - nodemanager-0: Running - nodemanager-1: Running - python: Running - rollsite: Running -``` -In `Info->dashboard` field, we can find there are two dashboards in current deployment: -* Notebook in `party9999.notebook.example.com`, which is Jupyter Notebook integrated, where data scientists can write python or access shell in. We have pre-install FATE-clients to the Notebook. -* FATEBoard in `party9999.fateboard.example.com`, which we can inspect the status, job flows in FATE. - -With similar command, we find Notebook for `fate-10000` is `party10000.notebook.example.com`, and FATEBoard for `fate-10000` is `party10000.fateboard.example.com`. - -### Config dashboard's URLs in hosts -#### Note: if we have the domain name setup, this step can be skipped. +Name fate-9999 +NameSpace fate-9999 +ChartName fate +ChartVersion v1.7.2 +Revision 1 +Age 15h +Status Running +Spec backend: eggroll + chartName: fate + chartVersion: v1.7.2 + imagePullSecrets: + - name: myregistrykey + imageTag: 1.7.2-release + ingress: + client: + annotations: + kubernetes.io/ingress.class: nginx + hosts: + - name: party9999.notebook.example.com + fateboard: + annotations: + kubernetes.io/ingress.class: nginx + hosts: + - name: party9999.fateboard.example.com + istio: + enabled: false + modules: + - rollsite + - clustermanager + - nodemanager + - mysql + - python + - fateboard + - client + name: fate-9999 + namespace: fate-9999 + partyId: 9999 + persistence: false + podSecurityPolicy: + enabled: false + pullPolicy: null + python: + grpcNodePort: 30092 + httpNodePort: 30097 + type: NodePort + registry: "" + rollsite: + nodePort: 30091 + partyList: + - partyId: 10000 + partyIp: 10.192.173.64 + partyPort: 30101 + type: NodePort + servingIp: 10.192.173.64 + servingPort: 30095 + +Info dashboard: + - party9999.notebook.example.com + - party9999.fateboard.example.com + ip: 10.192.173.64 + port: 30091 + status: + containers: + client: Running + clustermanager: Running + fateboard: Running + mysql: Running + nodemanager-0: Running + nodemanager-0-eggrollpair: Running + nodemanager-1: Running + nodemanager-1-eggrollpair: Running + python: Running + rollsite: Running + deployments: + client: Available + clustermanager: Available + mysql: Available + nodemanager-0: Available + nodemanager-1: Available + python: Available + rollsite: Available +``` +In `Info->dashboard` field, we can see there are two dashboards in the current deployment: +* Notebook in `party9999.notebook.example.com`, which is the Jupyter Notebook integrated, +where data scientists can write python or access shell. We have pre-installed FATE-clients to the Notebook. +* FATEBoard in `party9999.fateboard.example.com`, which we can use to check the status, job flows in FATE. + +With similar command, we can see that the Notebook for `fate-10000` is `party10000.notebook.example.com`, +and the FATEBoard for `fate-10000` is `party10000.fateboard.example.com`. + +### (Optional) Configure the dashboards' URLs in hosts +#### Note: if we have the dns service setup, this step can be skipped. If no DNS service configured, we have to add these two url to our hosts file. In a Linux or macOS machine, @@ -408,41 +494,56 @@ sudo -- sh -c "echo \"192.168.100.123 party10000.notebook.example.com\" >> /etc sudo -- sh -c "echo \"192.168.100.123 party10000.fateboard.example.com\" >> /etc/hosts" ``` -In a Windows machine, you have to add them to `C:\WINDOWS\system32\drivers\etc\hosts`, please refer to [add host for Windows](https://github.com/ChrisChenSQ/KubeFATE/blob/master/docs/tutorials/Windows_add_host_tutorial.md). +In a Windows machine, you have to add them to `C:\WINDOWS\system32\drivers\etc\hosts`, please refer to +[add host for Windows](https://github.com/ChrisChenSQ/KubeFATE/blob/master/docs/tutorials/Windows_add_host_tutorial.md). -### Run FATE example +### Run a FATE example If everything go well, you can access 4 dashboards now via the browser,
-Click ```Pipeline/notebooks/usage_of_fate_client.ipynb```, `ipynb` is the format of Jupyter Notebook. For more info, please refer to: https://jupyter-notebook.readthedocs.io/en/stable/ +Click `pipeline/pipeline_tutorial_upload.ipynb` to run the upload data job first, we need to do this for both the +client party (9999) and the host party (10000). + +Then click +`pipeline/pipeline_tutorial_hetero_sbt.ipynb` on the client (9999)'s fateboard to run the training and predicting job. +For more details, check the words in the notebook script. +More notebook examples can be found here: https://github.com/FederatedAI/FATE/tree/master/doc/tutorial/pipeline -Then, click on the button that showed in the image below to run the entire notebook automatically. +A screenshot of the notebook is like:
- +
-When the notebook is running, you are able to track the process through FateBoard, +When the training job is done, we can check the workflow on fateboard.
- + +
+ +The output of the evaluation component of the training job. +
+ +
+ +When the predicting job is done, we can check the model outputs on fateboard. +
+ +
+ +Also the data output. +
+
-After the notebook finish running, if the last two lines of result shows message similar to this, -``` -2021-07-07 05:31:50.784 | INFO | pipeline.utils.invoker.job_submitter:monitor_job_status:129 - Job is success!!! Job id is 202107070529230126236 -2021-07-07 05:31:50.788 | INFO | pipeline.utils.invoker.job_submitter:monitor_job_status:130 - Total time: 0:02:24 -``` This means that the job is successfully processed and KubeFate is running properly. ## Next Steps -1. The example showed above is the simplest of FATE's example. Please explore other Job examples in Notebook. But note that, the example is written in one party. You should modify it, and make sure the host party has run the `load_data` to upload data to the host party; -2. The FML_Manager will be merged to FATE-Clients soon, please check the FATE-Clients document: https://fate.readthedocs.io/en/latest/_build_temp/python/fate_client/flow_sdk/README.html. FATE-Clients has been installed and also can run in Jupyter Notebook; -3. Now you have deployed your first FATE cluster. We prepared example YAML files (https://github.com/FederatedAI/KubeFATE/tree/master/k8s-deploy/examples) for: +1. The example showed above is the simplest of FATE's example. Please explore other Job examples in Notebook. +2. Now you have deployed your first FATE cluster based on eggroll. We also have prepared example YAML files + (https://github.com/FederatedAI/KubeFATE/tree/master/k8s-deploy/examples) for: * Deploy FATE-Serving - * Deploy Spark-based FATE cluster - -Check them, and we will publish more documents for above contents soon. + * Deploy Spark-based FATE cluster, and try different message queues: rabbitmq and pulsar. \ No newline at end of file diff --git a/docs/tutorials/images/fate-9999-data-output.png b/docs/tutorials/images/fate-9999-data-output.png new file mode 100644 index 0000000000000000000000000000000000000000..dcbdcc391964a5b7085f7f29370c454131b2ac34 GIT binary patch literal 233957 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

-BiBz-@qPQ3LaTn-2G_U<-&GV=Pth2#P144 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 literal 0 HcmV?d00001 diff --git a/docs/tutorials/images/fate-9999-evaluation.png b/docs/tutorials/images/fate-9999-evaluation.png new file mode 100644 index 0000000000000000000000000000000000000000..981fe34ac8f31caf07fddbfbdd025d56dc000b13 GIT binary patch literal 127747 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

GnE9m|jQU3?{|4r!s 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 literal 0 HcmV?d00001 diff --git a/docs/tutorials/images/fate-9999-model-output.png b/docs/tutorials/images/fate-9999-model-output.png new file mode 100644 index 0000000000000000000000000000000000000000..709b942c3a4265b34cc63070bddefd184197b8df GIT binary patch literal 156744 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 literal 0 HcmV?d00001 diff --git a/docs/tutorials/images/fate-9999-run.png b/docs/tutorials/images/fate-9999-run.png index 592c6ccf4ad518622f6f56ee5fc229464d43a105..2b70ff2b78679088f33c2bd964387f25e5576467 100644 GIT binary patch literal 208622 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�+*<9<-j-10TzLrU7mqCuH$&zr#@n! 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 Iwn@PM12FAs)c^nh literal 97752 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

a*L(GL*h1}| zWp1@Vu>~-hyGwtKT{(+xKhtmT8HY5YwUg7bXt7mE_QAc3MAdQW^7p4d)t0}n@?eut z&~tbaR0@P-xERSHJZ;AB)Bhp*lp`Y_T4FL`ufVa^PmeodSR*88&9z4bz^qV5>$57y z8)bPNX3%*+)*}%nA1`GDwT+~v^fpDb4X0dISK~cn9X!CvI1Xz-P!ckDOdJb^nCK-7`j_*8!%81tp2{vHr_%ar6j zvRoB5&5qx(eEJA{o*yKXyIo;_S_I^UAT|j;-4i#9dZ|(J;dC8@JnG5W-yZ3?;dfq*G@i+d>xJhN24n~YNQ}#-cxdpQb8xS#+uxtyXz^_=V{9AJMZaz~ z-7-zU{{B$;pAZ87#(F##0T<{M8MGr`VdzKB36_rsGNNQ1ycb0w={`qxSwxX~LsxXQ z`9zy=UOq+J?H!>J5t$?xIrg3VxC9f`o){xi z6Vz*gamm2^%zw^nuJh=`s<`Cy8(onTlVNNp+lHvV9l{->CZi##!9K8}kAC89{HqrWvIL_In;XhrvHCA3RU<@+Uw1QvH`Gu~-WY{aapg%qjazo*1+h zJg9nGNkPiQjM{Nm=d5&zzns2kgSGX2q@(Ca<|> zWVb-h77Nx5W`))bo#`CU`%XEFoEDpF8c)hayt`Gd{XeX|by!qgyFZR7V1NiHrGy|L zEiJ8rgp_oLbcaa80D_28A`QaO4MX?P(p^IiAUy+;LktZ3Hu^sA9`Tc7BbfQb}?5$@~8nTCC75VOW0ph&gq33tYm}5_!mCH>Z&$ahqeT zB+bArKSsUMb1{Zc$ZiLJ(RJZ%ZK3s@bJqs;9yM^lM+BPHn4pb!DTT=M*cY<^QGekortP!<7yykuh!|ETwd}>M?N3 zpF547%b(AMylEUf7lKoSw#ybhH;aeL`YVrN44$x*DF4o%MS=p`dAsy|3H{^o4uLSj zznBIqIIE5kC6-Ha@)qSPaBQ%wXY-mvzrR88aK6D#Uvro0r*Xw9h7y*)aO%S&vy_bREdHn zVWcxw^Yw(jY0~p~hwqyOYlY4VTM}KjEdlWpR}ig^3yLRAq|%LzLk!HwUF|H9^!4t< zjfly5*m-+wY^MKh25Pe3Ya=~skMBt*TeUjP6qbFpfd}P!Shi7lwup{3EHVvF|I4Fz zSLK|Vt#5>^u6%_&!Cd?If{lS(_1hpy;TRBW<7~Et!C4;_Tz^(giUnxr4dMB_F(6Pm z{OYV)l?jWGtq0bq?b@1KFjQvDsWuf2TaEpI_qiN^gkHX}ldY!VBVb`=hc#GeZ0yna zrZu%U!1GaO7e0l(zWV7NU|2qz`xb1>suw}!dA_LR(o$r&p)Wjh^s}v(?_{?Kom-(e z?&6xg$W{$H;TJtYMkKFjShWPLhhpE>bF@tjAYNwG z0S)4Ru%nrfLxEhVDO%ik^n z_u#%&=fAfH=!J@SygRQrclB3mzu*6l*0lY3r{&+81`BI_Q%D6sPL2LPEm=oca`$~R?`57HR%<%U_hw?Tb z>q2_+?S8);^!K4d1}@8&5!&A;3K5W;u|praGo$0@no*Z6?^3CrpI5NcA$vT23HASK!uk6?6*TR>8D?r48c}~x2n(wuY4b5_ zwaH&|$uvB&KXJu>=Joaew6p5}X)Z@b%FN8=&!qzmRXM6M3TMOlG;1~b&f}04@3Ix5U+Ims<9Xt6WfW@S1NU%BSnW>R>J8 zt$|zJqsymC8p>%rh?Hs<9V2saRg(ew+|lCEVI_&DxK?L#UFZV($C&6amm91=Yi9R> zlanPFDARu}usuEbBTTrp_#_@>bAH}Y6hNx;o1BjxpoTivz*2_W8@t9HZA+*q`0h?gkyH!{*r}ru%yg!@VW44K*p0y!Or^_Fu}#ixd*d4YRSPKUfHN`Qkmm?i6u^4| zD%aaNe#u56(qyl43~<7uThhgU8QP(Tk^hj5A!<9rw9aCKT&wLMZVydpy-u6~hLe4o zTD)H1sF|Mc#3n0|-}yuSRs-X`@bOBrwT%sN_OJ8e`Lb#vTMcBJ3rx&HV#k_BAj$VX zreD@gHLfv#_u~ z5r`aG>VLsRX5WjO^k5FwRWfnOEe`uslzmPFG}v68c})oQaakVr(0SreSwFyT)0;JV z6AE{_^>IBOlYemNHBkBhg(@*Hm3{!%^~@Wi_KgxjpuQj(_i)?w4Zk>_tu~D5HtoR- z>r@NIbUSNAM}uITmQ(x4%#cq0LzUC~8SNi-QQoJ|^O7bJNAHk~ zGN>gsGMpex^`W8R}LbMnwpyESavxLhD~zT=Z@0*FZko?|V)1bvO7M zd{oT`GfiPo;k97-t+7Qf==}(=wp82A2D6*Dc-7Q(R#r2;PM4X;Y{t$L8^A?0|58e+ z5_G@23IFvuInMwpqY6Pw`i4e|=&07cgc+i;KWlbwu#ZOyBan%El`3;*r^``(UNjS$ z(%w30kUmK*&irh*NtS+h_@k;s)4sPe<#{kw#J6YZ+oSuLHgj+}FPjz`Qk<`b)s`J~ z&`s`<&{JFNBH3BY2iZwpQo6+eJ7_?U^faUMc@MnIDWZlpP;eIA zLvn|HCsV5htIiE$_VF>buYOAtqvZ>PNxWmCjHk%WxHD=Ch1QMkup`WsW?z z_sq?J1l@L?XyWh$&psN()L9d{^~k*oi>XNLLpQWfU?jRrk*pP|PICj5r526LhWEvi zc)g#S(3Qhjw}(VA8*s`xaE0|2V|B4K{xpTm`fa5L0-|(-3%Up7kS&?JC-7)p0*7NJsY*baX zjyRWdy8zzCbvL#YHUc&wDGSKyv%#XO@iyK~Cqu3@qp7Aw)>=$8kTk zcqGN2HZ%`dy-!lx;1S(HL(>{loi7%S_(k-@YnmYNaD>M=34(x6r7@^u{e}R`@H->e z>%C%CU*FT57mzF1fDM<-`O<2#&eY$>_yUC>M zC3?W9RwpBHVVN9s&XxfGkYq3)d&FO1>rX~164q`(w&$Wk4^KC@PkQlTTsh2i4`=jdwk~&p~ld)zr0d$(~A}YZ3xAiTw16*G_&_KTR4`dZ~P7!e^oigvEn`O=sH? z73Wz3D7>(-==5{fltDSq@Sp7b%A%sTCO(X$HtDP}$uU)B9p6hnytSbjCfe*N@6elu z@(?}dXCzMwT%@rZ;W`4R(bPbR1lSkR-!|M<)i*ZV=soB8IuAx~`j{~Vz=DtgDxy$B zLn?|`zfFew5S{vNMK96i#A_Ny$3CSzY}&IX#5P$uzKaY!b)Qzj#iO;1rL$XC1fnIq zDpeI31^MBq)d|kB+mYXphz7TV!{GtZd+Sb5L72k3M=cJ3p~Zhz#|(W^^F0eUKg)S7p!iDc1a`n8j3HF_Pf-of zSRVutHfJAA?VsOUr{J4{I}`vm!yr9#W~mS?zrmPTJPMx6oKavoA0=f@7tk@0+wBRa z_PcuX(!5kzDwbBCn+-xjM(G`sCz|+_oUI8*!j!w4q}*TRBy}Mf?SvBZEleCrBX6WQ z0fL%*`q3McUrIJ}M}T775S(<)#w&%d6TZd%6nNlS;z#kI*;fsdM+u~)mbv@z8CPG0 zuRBE2gjNmwvw=nzlh4QfBLp@~tszSPZj`+OI1XNtbm4eEaMCC~8jl{x5Y#@Fz_JbNnH|Izzo7<}}! z4w@z;PuL7GN%i`s^#U_(|KX{LpReMpiVJ9$FU|S;ZfI(P{jQb)G zjOHw_KX#ZZ2zcxQj%Z5L?eeo%1bp53I+;nnYH21M958%0K?|RjcFicZlUtnX+!c*o zK68eheW&fZ7tb7g$gaWOd^Pc1W;myI+NCAH1e8O&mZu45)=P1qyo*T^#E+z;H{FO) zdWWZEycS=kR)ySZhdgdP2nc?pSROi)VfXr*&(WZqqk)Vh6_tTcD0H~%{zD6m z-8rVzfcici#986svDn?yg2FlE>nd7nXylrAh84UPZ4G}TiD`vU=?*R&UZsqXevjs} z@C`uSYSM&ynRVp2a%&xx2uXo;f3qiT%4Inrx!>VGi`e|;as~gkGmk>98KwI4R6zd4 z(*N;m8tczc>5nggqPahV-9Nth|0|9Ary~0Mr0F~V54Y(C9t5y2S^E1bfBxmlc3Wa*) z$=_hW<$9kmLknKNi55t_|815@ z32orrWV-u!4jkRLu)bW|FXSDRZ}SbJEcNo0CjjPTDF!SMIA?YLuR@dGv-BJIY{-3; z>b2J1d!Fgn^QoJgY{Gb0U)c6Hc?XA#;4kEUPs{Vyw3z4q%j$T5)rA9X7 z1FSdjvAzghp8a~C&4q+)B(lC4xTVf-;uP(9|BbI)P9QZ3aI@EqW@#o_+AvKNeBup7 zkTtSutRcNs3Irq9WM{!i#8IKbB6i^sfcS-Iw&`eF!Oba29>n-?LiM_r-i5B@6-l*&?3H}=` zW(_UL%K(qCU(R7V`yFtxKktr(b))$i-m**45(aiY6bpC7NT5B_i^{@lRjIM0El;EM?x3NvT?#Y2;dLD)g|D3JCecIfA7=<7{-*cms?eXw8*2Alfb2)(1+c1^+%iafJaV8 zchi(34nDoTJ0j5@CiN*e*90Gn1SgX=0}}ZhLPtb|QmOYmaA#46n9V>rfRC^K%g5*# z7NY+cC*mGY8b_ywAcS2s!LUc^&8=8Zl>L@CuSiOEI?y6iCI*2&B2YX;kq*ZCuO$Ct z_?y$}BF*HQCC4am{XPZ%b38VRhI$Gs3S;QL9WISO=IKDm6TCI>A&0TotFikIES-k# z0+(yFgSAaNDTVtGZa?X`LqrsL!P=@TJ`u57-Kb+4N>7)b#!Y@jKgjP>F8y;9ii5xV z`CZz~4^-umR1uw5t7if_I;4uWrBqbDiKWFYFYmZO?&GkvEYWaC$0}pHF6@qOcgRUu zwJ4=D({RZ1ze;>RUV{>5EopgNl~ha);c^i)@Up$}BdqiVM~}fyuE+Dr6{v2+5&w3N;EQ2&EiL&d;J#X*Vh^P*_NdiNW_M9%X4Q@p90ic_SIp;sc6@ zATO;5{Cm5D=<7w>$tfRGB@bSI-jRt@vygc4@s{~_$|Y=xDFmKVuk%O0K8HnrL+}(r zL`PE(N!=mnRumw2YX3vJv2!#eJBSDwL&V*rUy+!o|#Wz>v{I8Yl$$o##_-=&T0EYqdy^Z}z=h(+MV#TE(3yllU5>4FMxS9cbjF7hGC#K%Rp}}^D@)rv zw0l5xTr=(lmr6=HtH;u($k13z@dF=MIm@^4~yE`#4nV$b%|Bh z@-y$H-$Q2 zQV0&db`_AU8~ak8R#}L9-e-$*HIkp}VQ+l=C*~WJn@$W;D49oT^ynBG4nBb*D>uts z5auo(KceM*x0s^Fj#oDz@Z$MkaTj9JTrT+Ml5?M0We~Bw$8-4UjahDWR?2NE-$e)1 z5w8%YvU1Q$3|iJZ$WI0HV7EEfy9IiiK?GVyLsz6uEgG8Q$YKiyn-($b{Q`TeNtzWm zh%1Jt4&I9_%gmo`O6629s|Qw}XU#8j7I{^k+Rhc1Uu;~tY9%P2eYAEo@)K&q!s$&BzS<3d6vtvHtz;ryKG&m^UR9Q=*}F3p;42=W?JE9vy3&=j9%wxkmdujV4V}!3m*DeRb<)DKs>?#xeuHqHGE;;2bRAq^Y9;qB z&QFeQ^L-od zr*wi))51G7{7{t5e0cR(+bk~}EUWvo2P_^|w8~3Im)W?kxO3#S5vL}lMEE=(yF^?>X84O^f*n0wt(lH*8J>VtY+$B z>--PGeu2*FH}K$j|8KJsOj&NwTujR>LhAIVxGv9DguPW*pYYkxoLACAztGu>Jn=eR zeO`?UFiH%=BMMr2VDhcHI423Ry_J;|c58LjqF3ZIS^v>tV^H{G8zh8`Bo`>N<%tfMV`C*zR(Ba-(`S?;~@cUvH2!WL!KhvDm5} zU_mvb6<@>?RQ{tr?hYeQMlp9W)ffwXA8fH2H(NPJGtWn{6aoFDohI5}#p1bzAE++A z2(R#~${>$;aJ}tlFqUcklNMY3(X})69&Q5VnhcM`22JAFB4(R$Pn~B*nAzLNweV6< z_Jo!=;nRu1trE~ra-@ZI7~tUiR@aqx^*kJ?|-gR9v{fe2eL5oX-{m^-0)x+nff;vsE57ODD zOJEjnzpsmH4pdz%T4>IN^Wk41AsRMX?=Q7Pjn?e*;HgxYRLX^yH`OcX7PrL90D4kX zH2`7lV|kd#>(k7;L3egC#Z>YmFXW3==*R}4fSaXnuj2irSX>LELcC2j?HqmH+}o- zLquE0U|mDo;Mm+d9&e}a0Aj4+I=r~tJvp#D4nf5csGB^Rw3YfeTr;?3Y(r=!$Hx`o z_fe#_P9ZqWVLqfH`%togbc#dJ@M1Iju!R^h(Vxl3w`8H7&C$YO0C{d^$k3)yew2jFA9#zdFT*s|r8nJ=!?|Dri?CO-P{>KA# zM64;$LbtU#7ABLEUifwq^iW#3lqSmY)1h+(Xe-Id`s=+Y{1I& zd^h)CXVTQoCxDCTT<--V-mY`et>5&_sNPnP^bfgWM2AQ`3fqa;C{p+o{SL!Cv?Z@# zXO)nv?!I_WFNfpjVRIL+DS3dMS!VUDn&IJ;kPNFPd`WUpZ05E%8@p{KWzNPbv_H1W z@qEs+d7-V|=~J{Dqz(O^%6(TE!{}q>vRN^T0_zh}$grBuDG2C-_R+;7D!_v>+k+C? z`xd(IJIB46-ggeh?THm)`U=dd?I)(*gGJJO56NPY5DZ#sQ$S! z%Ep0P|5QHzWjX)+jGO?((!=2f7kMw}Y|?v6c)X($^I-X?Z=uxRL^< zRS4i-&U}Y!6Ih1zQ%{>7u9@wX?DJq&SFCmkrgt=KF=ar>4cE)A?v03vTT5SP1zy?M zE_G}a@wp@fTc60UvFZ8A)b7p@`{NjDR@=2zI?=ox146dpXB#V}kDb|6)Lt`Vmn*4i z^859R7yvV+s2kCLH8x578gv(O>kxV}BSh~KC}t$v_MYJ@7Otz^V2}jC z2C?yS3pJ(OgCDA>=N}KN1uhvdJG)qSQNO~n3gKD6)a!Btm*n++f+a7Rj9iv-e*^ED zpDmkM4f8C}NwDhh_QB_TO#kI!k!Id&zvz%lcX!v9n0q9Xt^YCgIq2bh!nON4I*)iHDA5)U7Y19cl%iS|{X#bx4p3fJM^m~=oW0|1 z_*+!1ZxRf}jy9(E%x$cxig@-&-pGKlyj|o|;BXBbeh{LgZ03>Hmm4m=(wv#0WmoVh z-)vGBz2jr2Ed@=KfF=N=lL9zCkF~^Yw8W8G;;Kree+3&f@7_^SHzHKNxmJ0o?zg%3 z$B!|%5lx)0<^Zpr%jy@9oJSXPDST?qtDXx(W=qpv%-z!hjmI3LM_8Ta95m>q=f?HI zy)*7*7F~Fdi`OrKio70hQY`KD_MrUFiAn8ez2{5PsVf62?2fFEJh z>BRP9_j7RY`f);YRDyehZ8ptR}N{XdI9_sNd%tWPf z5-GcpV=<;HZZ5v%30M@_FoEgM|$pYLTdV)NV&Z9NV{Iv>8OqwqgJ$qmmJ688L-=A1YG8~E$_Dpa}syw@_Z9&=Gp z0%Xn_{Z7xKsyVBU$uZ>S1Nl~VPMP40`VG7JQ#!p=9g)#&Ll&?o#hSOnrwPL_Wa#$j zHxQzG&-q>Tz<}y@_2RHi*sdG$q5u9Gy&O7G%$GA+LHt7asdN&x?;c%7CGWl$4}3GFC3vMl+eJ{rBZ=CP6?oAXm zRifb)E{CasJo0uR`#sK4p50k>j>0u-%!=aT|I_4oRIGJFu;>Z~ajDhsZ%RdCv`-~r)@jD3t9@uo&vWIWOm zzcn#92IyTpz~KM!@i*#Xd0mjd(XSKM{hDn+`_USAPb36ehA2KZhVkk%dsnixSUpF| zH<@MFnC$iFLRp!}`!RDK$JR}hS*!+Oy5nsF)SVi-+}!5LpH>8tKjPbcwOJC|676_s z(+DqHoOY{D72?K@$633q2hh)CnNiE>d5z-Dk=h z1PC*xnKh%iG!H56Sh|?Xuij(o1ge=HvB}V+VVdGP)5~s}P#eKKeW?3>NqepvUCF|? zmk0{VQ?S-2t853^w%*=}5XOfao6+OM%A>XkJ#`94DL=OtZ#Tg#U2yOX_HUr^Z z?!~31+f%?O|I2_8NW0ckds96X-Z|cIE5J*C*}+85Ab&rXwey_&#&D2PixPDU4M#Mo zE8r)Oi+^u>n^DG&ov`~%F+uKw9YgfH?f}R-VK}Q+m~K-!_I=Z;crCpXq_6RABlyP% z6T`I!?~fy$o@om{7>bR;8E+euGTGwv4HOpOZ{~l?&+$|cTX5T@Fgpzfp5@6 zOwDfp<~P@UYr7s|k@Lm3KIg08G_%>_kDRS85Sy!TLYsZGd{w-u>9bRK#UTF7quG-K zhthaLGkQ8o6~(n?u{*}85yQoHKs2#dpiV18l`+@h#3(B)CYnVBrmMUm`jj-G^GTAz zX~P?*u9Eo9lj~c@7^SUa(V-?Az~WZ!94(a>O9?l^Q>hGDE8bwXXRpP1c#ntIj>at| zh;u&wEVB6uW4D1>_?dEMryp1i@&>R-_WkM;(bN<2dF}|2F8zyoXoeGj*S+@ilGm-a zFF^kguEY5)t560T%b4gIE4(&*zeh+=-Yg6jA0&b@Lbf z$e=}DJ;(X58YA0lw#AgoV_AzmUfa!Ks;E4{+L!3&E{2-js+V0iuj<9{J=J^dA04vY z>|>Gr5I*5oRz@i=azQH6pr> z$v0#0m=hQA!HXUI{L)na!=YfW|M5o6a%@2ftrV2_$6%8(ROwO0QC_cvRjC-L+1-ax zH|r3pZaqI!xW8i&&kFXXp-O{d?*9d&3JN zw}HxshOM%1rkyac^W0~0fRr&2b=B<>i8%KrJXNQbQcu00q7qj*m%`8+MD0Mn$5$p( zpWE5R`z)&0@Tw<4%C1CC&o{#`ySLAwvXaa6Xmp9!jWbU-08hWfLUHa?8A(ZwT}-w< zy2RE2;A%N(68p(7iBq1(S46%9w%niTi4OTA03c)&5j(o3yT?GchetqQ@8a;rV!CQ` zMt`z;%Ui$lI@{4~VBkA+#V4^hx0)r-KLMBjb)EnA2gUN@5%i%yytod&zU4)tykKkx zNbvtOOt0U*{qI;VHWlru8O0?p2`bLZlSLl9`A-PmKRDPktET1wX$X!+fx4(H^HVKf z(5o+p0_tDRAb6J!EK2+`qtKWqjUr*N%Stwe{IC07f&wm+-uUKLfaG~ve)g4>+hmAuVU~^pX=%eiE3$z4+Rc$5{Skp| zz8bSSI4pPQWT{QY~YKO~$)ko_0>Fm;`UJ1N{OP7A$=|}NzegOQeU#mjghc^Hs zI3|EkPDCJj1F7+p^0mR%7@EUmGOO-0Ws%`Zpd>?|O}WCfc&#}t%qDBwYVVzP?8*3B z9VOO8hVgCd+5y8(HY8+iS4P`cU(WH%P3+E>(|0)a)pEIP9ezG~A}^`GvC zxuCcQGJ9V6{pNhHFcCl$cF_*xgs>tF8T;m$$c<>}5H$GlL_{ZyzbN?$IN)-mH!k+~ z0$k+N=0`N#>^#Po|Jvch&Eu*-FV?Uj2L)(FhfRl#ZpD3)Ov8+Od%l=De^9^1Dj$SC z7g=Ln#|577sBqGcNgBIY7U!8QxVdKt>&;UyAHAUc*%6fRK&z)p8_&oJbjSWhB-jj`e%`#ouX1_&1U6MDet6ask?@5}A|HGJBV z;s6Vd4!T00ey*-RC)=`x9T=fv#AsgmG1 zR-0l&t+8-8MV7g;iQ^)}tw_te!Ww=`hB^Uz6md(l-5t69Dtk8!w6p`Xdk3ZJtEW$I zpP#=BL^m)LfWKEwem@?Nr4RcAKs!rbSIW~0!KbyL?flzJbO>DJT3TsblO~C>z<Mo2<|0XIpi~^C5cD>J5s>0w*2q>}!10!80lv`?m9FJIH1c%YM-mjvi+XHIU0p)`8YHPX|kvsP7G)NgcCdf<*n-6^893$&YwF$0Ot zBB2ciu`B&$eVi-d21>Ep3n){mam@^M!|4r*>burFS~0{603(xeXcZCK{RWd)4RdGB6<;haY`pmVQCDyqmbu_wri)6w5{;t;@<5=BD(lPjVX={oiR{V*1Rrc~5!bc9@(FD^r z3RP)F4p(glICl<(bt^rNGQ@mXM%pUlz6>6Mt{CSFEM^3RIo_jb)f_ODr=gnaUW<)| zY5W+~Kdl7b0&wQI4NeXYDwv-39Jfw@<4`aitXyjXeQl~fs|WGNR%^cL6-K}9N9C_? zqC(NAEdp-1-s%&$H;D6zH0ePSXMK60(90p!ckCw<;&n5qThEVe5T-4!l7Zs6461nn{Imm7tljLvcRvp^~BEg`Tx%J&daty=UFL z?h!YBpWL~JZ#lfTbv@~&sKOgvu(yL&Uzr7u4F8CI&rhR_s2oxb7hDtq`4Lqhj6%wJ53WVqP~u=QiNa3o-^Z=erV1y9&A!Sy`Im8Ik?bFxWIw&cL6l8g)-?QXH)ux@KH z2jaUk;fTWTp1oGR9khsbG4Fg*;%STchY$-6-BA5|QDY5c=2zGJS!SzBqzD3S6zE9}rfam*BxgXGt^}vo~uzV z`P`t;CuntdPq^yp%mf*2>DKo6A5twTxlHoNVMkq&53UmzAufJ&kNWILOr%MO%%+-j zX-FB5a(3^TX@V+Y(<^s%LS`9lBwl48Y3Nkw2_Vi8Tp?{Zn-}M{K7Smnmn9Hc=`E+7 zEvId0P*#RMQ_<7jrIkv2o!+S@^wGk)@}@cofmg&2@~=-?WSHes1aOtd`HHaXwyYp7-7DW51dNq9dI ztxXnVUqL4*crRm&TtOBmzY>;Y=8cO%3FSxREb8HcK0Wp$P{1^h;DuM6Bx@146xGj% zC=j2SEyVp<`q5P#t@gC^JVZqV)A43@f0^U#wCI8Dr1IyoSDMaMYPl(a>ZmKC-uXS; zt!&7aYj64{7WY^r3sxO;C*tD1xN2x8egAXtnWomgAacMXHPN)s==`ZhfRzj9IA00ZT!(Is~Qy99$SN+}4J^ z+-i4>i>Z_kM>#-+4qH!cv3OZ?H8T@M^;n`+Y;)~(Gt|CK#@sY+346}9i=%FXS@a(6 zEDFKcPNWm7-BKcMJ!yU5mVPYCn{<*T|T34e_6ueWnb!#c*wS zRzFa+4uA7!dlL9=bs$sh;AS=s59FDoQX63&4^%AToo(3H;IpyRi9vnK`^Gk^G)e}> zjh*rfQJOoZqpyW2%kc=PS57KI`rcWf`Pg*weo+&NW%-v9L~mV zWLfTSTsS}%V+JBkEM(wqHVI`bQJoJe459fwU+=|~r7(>5Qu65&xW|}v=^3nQsy6iG zuk$rg?y&TJscq2yY3o5NHXXj3ryQS16hPAP-59d~%Q z8ri5p{n$93D$A=mPf{&8+mt_R`kqj;X|v?G+gke6;oOofAu5PRQKlumF!HIBF`ao> zNN02fxoP-kDeq`~A4MM9nFp_88~I<*%qwflXrn^QvNOsMHdj~4(#^k=g{~K}y@Wy{ z;z~VFWD>4A*blY@6jU!U4T9b``PAH^*%A$U-=o7vb15!>D~o%X*Xtx!62j3|{ytgN z*i263pNnXlOeH43IX(z6rsb=2`QrMPMT&3mYILD5j<4Y`@%!~pUs0#i6EHSt(1nQFVc-CC3XrnvK)V=?GTz<>WZI##!Mpn5(5R`w!u{ zT9h^%fDyb6_>b3>&e!fxd+pL{`04~hr*4l4&rLs&T32h$kwR1m7UuVOYN(k>qS9e! z)~Qh|W+1+-h+e#h93$D-jm}J+OGszwA74j#b~5&vejN7ZEVkHKEFEr}FHY}s?_#n@ z99OiL9P{`w=`S~)ZfEj-6Lq*d5YI<^D~G}4d|9$D@lHe`S811gSVufjBzer8pv?H! z?UI4CW9I%0Pi0)VACOR|XJ;`67I-jO_sY|dd=w-hE-_LeR!ru{4zUPt9jUddS;)lK zE3;%Pe(HnWc!BygC)Aez+_PV{MhSVb*v%sp5Z0a~D_}genl;<_`iaL{~S}h6r^8LRvDA zLe(?>x}hCA)`(Jb`>Gd)KGMFw6U~mN3>Le$@o6KTIwc}PY|4*amoRNo43~@}Da7%q zqbcm+SVT0S$hn|5b>aFUDBY&^lpl9Y*-shGKiY6IwY*8$k5Vf|ihlcb`{*V53VwOBG*x{>^ZY0qnTc=z?cfL<8T zi#pc`0N$&;u2PQ$^UF!oEzvd0mn;(j?r31g=)196+}gpsp)7qPEAORx2;&cYvX zfO7)oLn?Qf2RO&JVcZ}kAIbqthuW62b%QU2dM^8=2_2n+FYI68PTPlZ>wkeLvsWM3 zE^#H|_BOVSADhZCYZS3I$Ih)hRe60&+Aia!TmC3gL8?ow#}i%dqD`~&(?dZ3ZT;*; z0XJ z#YvV=%kHOL0d9n#$|-Llrz97V8hysX;buJ8V!bJ*^`TXTDY3%$Er))w{wu>`vz|N` z%-3v?oobjsrzL&g+k%zQG7!5OSeH|vNyS;49cJ2SDCc47O+NCqO+7C0LC~-cxX!I+ z(!cHHco(zN!fWMwH+yWxj~sB_Q0nOz!_$<0mnHpJP*fE)wAUJn+Z$vg4~w%l=zC0I z=HqFBbdfjaT{V4V438(02@82GM@(>y`m#LKd-OL#24qa{K3kRy`_@i$3EZFvar=NT zNstx}fTqskn^d>EOB7USMz(mDzerJ1!tcL9bWZM9*Wd8Et?@>wO5%fW|3db`c=tOB zZcby*WDU)w=@_%XzJjB$EFH^?Bty9hR%GvYsi`lqg?J#w`OXl9IWI z(U7S0^t{JsU`N=(-dj0ee83Qu z(WZ9&xV@DA2?v)>7`>3ee_cqQ&3?g>&B5N zs?>7GZJMI*aEaTSVy{0X3RTxJGUs&lC%LQ$Wl`7h>X@VA*^jE2t92Bcs;mZbI^OLF zaVhhMDupy>hFZ$^1xp62i!03=>J>}5oEz4qEwf%Rs_kG)?w@EXdR$K_IvJxGL^VRi z{L(5+RikE_R%gO@ZRX=Nb)B8|v^Q1JYsg z23#OQG+B#O*&IXbJ7@~=EU+$(f8mcfFe_K~*#b+SGWjH=e|#SX+e>u#5v=v?sZ?t- z{g*qm>>Q)bzhK)g0l=AF1_NulN&EK4_oqj#SXYUZ#osiC26qYk&b|RK<1c1H5jYqC zs50U{Zm4B06>DMVp=ivcODZL5K+1(fuUG={<`u>`Q!gr7bvgeL>~Uqvk@sBnSUyj$ z)9^#`C`$j*j8-lu`Ma%~q$c71n)>=V0~a4Z&V+GEv}s~DS5_*zBnz@w8wJ4N2)(e$ zBtw7E&YsdGO9}wq7HXSxbUaWcT|fRlsxxQ7hD4R? zA+r>_+!)1g4R(p#o&zkGjz!0$S8;I{mmENE@vfR*GUD%t60m-IAh{0i``kbpd;W=$ zq{K^|lbD5VGMyao#RNn&@y)9!>H8Z#o(*=jfUJ}?2rz5E_vgx>Q(JfI%XQ4m2}F{7 zY<_*sz$bz8S~_8znu!Cb_U5&15gpuWCn7z4LKu4Wa6)CGS~JZdf*5xq_oU(>rYZLA z{sqDG@yjJuM>LR}rEWnY#<>1-(!a=XVe-F_p@eFn;QQfR%%o3h9fOF~fw0{hb!0d5 z+ociHf(>iIh|+JGf*jL9yBm?@NtFJf%8S7_t10CO+2ab7D;w{Vky(XOz;+nq<|nLLwCoJ14v1CmvrY4=iz;S^^bMVxj(Rm#p1&}&wcNE z?`vPzwewu_qLkaLzU3#2F};P*asAKpP;Q*2C%FGeQcfqA69Ct>@m5WuGSiQ${YiH$ zXwd=Y8vv<~s*L?J_rU%4hAN}z&u=>y)tGWGBO5^~Xy~^zw6$d;zsLAmmP1xtBDc+& zzpa}zP66-x)Ayc?JmU3gRxGa=nP%Z+pqNBSzWgHrA+JBWH0Sgh8r4jXSSF=>-Uro` z@BvqoOYv-q9t(L!i-C1&0uXIQX2iGp2t?OxY_kndzL{0mlihAONiYxfy@QkDk8*Ic z_L9hTQ2zIj6&uI2;hC_C1w`7|XjVnM|63CStE#lZMm-XS>P)eHokjXJzD3^zsB?W{ zbRSKiZyay>Q`UX`*8%cpYL zoa~}HG9w)Dht2`eA$*kFBMzK$;3h|jJkR)hXBquJcGizw!6lWp#a%ky?VB2XJ%VHK z$*03D`NKNz+i6cU9~{UiW~rqvP|RQ8DdfPQwMt2Hv*=#^d7mbBRRe^aM?Q zlJq4oHy&)W$z@n6(Ml+F9vzQ5jPEVw>?dspLJu`J8nS`sjfyI>`7_~qNvZb^zu~Ef zppmzp*HDyk+Cw=LwWwI0xx@b+cKSHD(>2% zSHdX|!a1p_ikgWd@|UF#Gd`Yrr$|W+xztWgS-^J|9bLDUva}pZLVIbh05e`lvz&A5 z({8H#Nnn-lHjd}$+lG1*un z(RbUoWVxRpVM&XdDm*Mb^hjB96o8EUj@5Jr`yRX{tRuwhH}JaS)A#Da9!EcT^W~zT z*mboOM;Tr)Y4P!V*OKtgPGRFUGj;Ntpc~s`?q5SfQ{rIdo*J6jcMefe*xmdVQEk4P zL*4H|84;tee$w)EX1$O7Qfj+-?Pi;piWpcO-(bs5;)VO~QgbbQ`jLaK>{Eg4-cn7qQ+Wa@{~J~q!+$6_O2x~=dop^_hy}kf zicsOq+2fFrlLL`iPR{8X1$aaWD=W_0EJWJHn#I&nOGdX>ublydo1*>458bNUzr}Ui z|50nqBE+FUOP+^9;5+i@OkPCypVkD>pHBGR`jq!?8e(h>O;sh6!j|*We7V3hFQ`_C zF9aiU!^gVLQ;;+hZft^(qN~}{?D4DS~ok4Z1+m&#wNw^54YJ_S-4=om#E^6G?L9VRSn)Ffh4?k zx1sX-;5|!1rNl=iK5S^17Yv?uXpe}A8_TQ|2sZ{I;C8i9lvNopVdQFq-9h$_P|1)> zk9$=fkEXzZii~998EI6r%mYf+l)jnMI5+@@6#*c~=kadU*5#vbKEn+K5brtwgA zr6|SDs&IjqVVHLZv{GZ@|Im;%vFuMH3(E0m)NO(B@-?XH=tKqwGn(`-aZ1)YmD3EoovnGS zjrI(@(~dj9dUnoWWp^>yh*PkfyZBB$6GW4t&|VLO_lLvRREy#dzBl6Y^E}Z$yDo+4 z*eVX|(NRTZz?gG$$HODgx{mzT7OHjEK^aDVyMT=lJ#t z5fL1oTY5WMO3J&O3SdY|6C|Bs-0z4ifqoF^WYeV4$$j6gmR9_7}!*Bt=G*8N=gA`o|ik{sb%<78LFPY^2XiMpqm`lDbRHXVJF;U-N2t zm|q49dwqf`SNRM7e);HTc*a@Zcbripk)xtYWEVpm);$`WlHw&Ljpg&F4%$FO?dz(z zbF5;x$pg1G1#_@BVVI1LT@(=6^=&xI#V#|U_zaGf!%@&tM8x7szcrolt~G9R(7q%H z!D8*^-mcd!#H#sW#A6AgqfAGzny}zrkw4Ukaek;&f2F+t?T4!W)wT*&y7wOA0!S;+ zI!v$YxyFrLNK|k_5-7V&cR_~S zf6R(OyU?zC-xgGu?is1r5bN(efI`EKb{}08!g=FO!9-?Iu)vn&$4@3=-}GrsVXoN* zYk%>CMsxju`zP>bR6!4H>HlRt&i&C7!N0)T`KuP=OA@Fw47>V>sgf~Mnl2lf1o={W zt}M~Y6@-pV?)y#kS`N)Et(pT(3zQbEw(;@>mq?jz;~tjPl_rZQnA{$=^QgsjIou!f zQQy!@@zk5B<4PjpM#uA&;EyLKwS@TQ9ar4&{1=A_3`#OyJ~=Zn1SYMRef-?#>?X1w zd^I#r@*nRqGj#`1+qQL3J9M;tMgIm+v_R8=EbuQ54LnXPe1ih0c``8^@KXrOeOJ+m zWA`8YD9+owo?LOvZ03x33OFfsX{&Guh^Ch+;8`Koy}+p;o8di$vyBeyp$e5&@og@= zI$)zcc5oh%8Vq~(e`hW2pwbCwi>tD4rjL&@dHVxZhUz`Q-~~#?>+F9pw#lM*&)cjx z2i-9D8|8(imIw*o)iPqS``|SfsMZHYIvXsxOUP9y5_uWp#yi_FG+E z_p0HpCzL`5Zcz@3g#+7#_@CRp^%${CYw(~M>4=&v;xo5pK+9tjCy#^RowY8wA6_Vb z=Cod37f1q8;9_y+sbOOyTU=6RBTE*aBU*p%5$bB8#WcKP{3uD+Uw9_^o+`U21D5F7 zl&A1a+apO$Huxhv-m*ASwGT67a*+idci*GdF?sU>YcnG?_}UA{@8S&~pIv_YpDLA` zL;dg)9}Hr`OPGXZ(6 z2Gl4Mo!I(bS0a?-mlvNZdn%2T=+{4@U>R$YK~P#?AsZRwn_3v#jh^aoIGybF(Y6Bj z;mzo1xvNbA*~MVWhyHX*$U|7cNy=N9CO(GHGpamXyVZWVjR*Tj)}oR3&8kH;Po`g; z?-jOX?(XZEQ9NsFdn@2FVtKQX%COv>H}GZxdYMS6fb~ww!H`K-42?6u~BV39dMDKv|TPL0{EC(bu2!n}9*MQW`rL`t-<8a>#k9pai>y&zhd zlIms*S5tv_I)_;ehG?azZq zDaEGus_NeDUtBjnq;Z+NGXGvhKs*@nc-#4CJ(D9UnFC*EreXwwoO-DdhiX;Sg?rG>RZ2TL#g^L6h``#GPyj*luLd z*@VThbnwIOYM)q*YX$zu%q(_5u(H~*mGxtUbaFbwG$i>;ZGG*C7Z3S>V9NmlV-+VZtP!Zcm}g#-haE{-7P6p zH`_YauNI&eBIVCD{|GinAgldJOFf+U+=t&vzj2*joyBb|p3Z7D@_Ws$_t~BDxQOI> z

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

$m$1qA&|koNs}!=Zc+2sw@AnHj9t$@ zU6mpwlld1`F?|Y~0MvE@c$nFq=mHSTw3J3U^S$PK{<#}w*{IxikN+htL!-Upyam6 z?W_}xZ;@HzQ@f63r5AoIlRl*)51K<2+4t9jNKe8Zy#}#AOY%)a9@nnNmE4>l-s`!(qa-(1hP4tq zyKjvn>MTa;XF*tbI0-)VH*5Tj3!2|IEAZp>Cs{X+dNlH%Az1QpAMJPf;ftp?LB?yk z^z$PE1Iyf3hlEoR2(c82!;xy})9g$W=avUUFi85A-{UfoQ=37FeTJ)aPuW(u0%Gy> z3-qmaJO@Mz$-OBrJ3Cn8Fo7G?9Iwp;0Q)sG189d+&2IhL$6K92>7a<+uNwqqjrW#| zIVY)2@6+<57f){nBT0*uj07FtKvdJe)*P?|#A@cal4Z#@SQBKpKwuwv6O{ZEw5Qle%K!!pP}THpe|*FKqzd)6 zZi)4#)pz+xi>J3hqU-=HY)dFxs&-{VuMA)T5iSh)k$IN$1MsF^(C?rucQDToto3>R z5lCw+Ks5npjf0hAVp0VrU{oo0(-K~PSSJk<-Y5mKQ^YvjxDq?Xd7 zlA7q@6H@|D2Nve;B+s0KOR!1%0DrClkWj$3v!HA6EcwLrCButs^e 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⁣=fRj=c7eyB*mye9Z|I(D`VX}J$ulGLrK;7} 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 I&MBb@0L^G$E&u=k diff --git a/docs/tutorials/images/fate-9999-workflow.png b/docs/tutorials/images/fate-9999-workflow.png new file mode 100644 index 0000000000000000000000000000000000000000..6ef8e9eec294c50d4df4bee6fcf75b7f28d64985 GIT binary patch literal 121574 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 VtQh@mE8D=&`l#JEMV6 Date: Mon, 18 Apr 2022 14:21:50 +0800 Subject: [PATCH 11/14] Update the tutorials Signed-off-by: Chen Jing --- ...ster_in_One_Linux_Machine_with_MiniKube.md | 26 +- ...r_in_One_Linux_Machine_with_MiniKube_zh.md | 396 +++++++++++------- 2 files changed, 245 insertions(+), 177 deletions(-) diff --git a/docs/tutorials/Build_Two_Parties_FATE_Cluster_in_One_Linux_Machine_with_MiniKube.md b/docs/tutorials/Build_Two_Parties_FATE_Cluster_in_One_Linux_Machine_with_MiniKube.md index d3083c283..55ab37466 100644 --- a/docs/tutorials/Build_Two_Parties_FATE_Cluster_in_One_Linux_Machine_with_MiniKube.md +++ b/docs/tutorials/Build_Two_Parties_FATE_Cluster_in_One_Linux_Machine_with_MiniKube.md @@ -20,9 +20,9 @@ After the tutorial, the deployment architecture looks like the following diagram [use image pull secrets](https://github.com/federatedai/KubeFATE/blob/master/docs/Use_image_pull_secrets.md). 5. Network connectivity to dockerhub or 163 Docker Image Registry, and google gcr. 6. Setup the global KubeFATE version using in the tutorial and create a folder for the whole tutorial. We use - KubeFATE v1.7.2 in this tutorial, other versions should be similar. + KubeFATE v1.8.0 in this tutorial, other versions should be similar. ``` -export release_version=v1.7.2 && export kubefate_version=v1.4.3 && cd ~ && mkdir demo && cd demo +export release_version=v1.8.0 && export kubefate_version=v1.4.3 && cd ~ && mkdir demo && cd demo ``` **!!!Note: in this tutorial, the IP of the machine we used is 192.168.100.123. Please change it to your machine's IP in all the following commands and config files.** @@ -81,7 +81,7 @@ Till now, Kubernetes have been ready. ## Setup Kubefate ### Install KubeFATE CLI Go to [KubeFATE Release](https://github.com/FederatedAI/KubeFATE/releases), and find the latest kubefate-k8s release -pack, which is `v1.7.2` as set to ENVs before. (replace ${release_version} with the newest version avaliable) +pack, which is `v1.8.0` as set to ENVs before. (replace ${release_version} with the newest version available) ``` curl -LO https://github.com/FederatedAI/KubeFATE/releases/download/${release_version}/kubefate-k8s-${release_version}.tar.gz && tar -xzf ./kubefate-k8s-${release_version}.tar.gz ``` @@ -230,10 +230,10 @@ For `/kubefate/examples/party-9999/cluster.yaml`, modify it as following: name: fate-9999 namespace: fate-9999 chartName: fate -chartVersion: v1.7.2 +chartVersion: v1.8.0 partyId: 9999 registry: "hub.c.163.com/federatedai" -imageTag: "1.7.2-release" +imageTag: "1.8.0-release" pullPolicy: imagePullSecrets: - name: myregistrykey @@ -287,10 +287,10 @@ and for fate-10000: name: fate-10000 namespace: fate-10000 chartName: fate -chartVersion: v1.7.2 +chartVersion: v1.8.0 partyId: 10000 registry: "hub.c.163.com/federatedai" -imageTag: "1.7.2-release" +imageTag: "1.8.0-release" pullPolicy: imagePullSecrets: - name: myregistrykey @@ -360,10 +360,8 @@ or watch the clusters till their STATUS changing to `Running`: ``` kubefate@machine:~/kubefate$ watch kubefate cluster ls UUID NAME NAMESPACE REVISION STATUS CHART ChartVERSION AGE -51476469-b473-4d41-b2d5-ea7241d5eac7 fate-9999 fate-9999 1 Running fate v1.7.2 - 88s -dacc0549-b9fc-463f-837a-4e7316db2537 fate-10000 fate-10000 1 Running fate v1.7.2 - 69s +51476469-b473-4d41-b2d5-ea7241d5eac7 fate-9999 fate-9999 1 Running fate v1.8.0 88s +dacc0549-b9fc-463f-837a-4e7316db2537 fate-10000 fate-10000 1 Running fate v1.8.0 69s ``` We have about 10G Docker images that need to be pulled, this step will take a while for the first time. An alternative way is offline loading the images to the local environment. @@ -395,16 +393,16 @@ UUID 51476469-b473-4d41-b2d5-ea7241d5eac7 Name fate-9999 NameSpace fate-9999 ChartName fate -ChartVersion v1.7.2 +ChartVersion v1.8.0 Revision 1 Age 15h Status Running Spec backend: eggroll chartName: fate - chartVersion: v1.7.2 + chartVersion: v1.8.0 imagePullSecrets: - name: myregistrykey - imageTag: 1.7.2-release + imageTag: 1.8.0-release ingress: client: annotations: diff --git a/docs/tutorials/Build_Two_Parties_FATE_Cluster_in_One_Linux_Machine_with_MiniKube_zh.md b/docs/tutorials/Build_Two_Parties_FATE_Cluster_in_One_Linux_Machine_with_MiniKube_zh.md index b2db6ee7c..ee5e13e41 100644 --- a/docs/tutorials/Build_Two_Parties_FATE_Cluster_in_One_Linux_Machine_with_MiniKube_zh.md +++ b/docs/tutorials/Build_Two_Parties_FATE_Cluster_in_One_Linux_Machine_with_MiniKube_zh.md @@ -10,60 +10,50 @@ 2. 使用浏览器访问Jupyter Notebook, FATE-Board的机器,要求可以访问用来执行Demo的机器。可以是任何客户端。 # 前置条件 -1. 一台Linux的服务器,我们测试好的OS版本是Ubuntu 18.04 LTS,由于需要跑多方计算,服务器的推荐配置为:8核,16G内存以上; +1. 一台Linux的服务器,我们测试好的OS版本是CentOS Linux release 7.9.2009 (Core). 由于需要跑多方计算,服务器的推荐配置为:8核,16G内存以上; 2. 三个域名分别给KubeFATE服务,Jupyter Notebook和FATE-board使用。如果没有DNS解析条件,可以通过设置hosts方式,后面的介绍基于这种情况; 3. Linux服务器需要预先安装好Docker环境,具体参考[Install Docker in Ubuntu](https://docs.docker.com/install/linux/docker-ce/ubuntu/); 4. 预先给image pull secrets设置好用户名和密码,具体参考[use image pull secrets](https://github.com/FederatedAI/KubeFATE/blob/master/docs/Use_image_pull_secrets.md); -5. 要保证安装机器可以正常访问Docker Hub或者网易云镜像仓库,以及Google存储; +5. 要保证安装机器可以正常访问Docker Hub或者网易云镜像仓库,以及Google gcr; 6. 预先创建一个目录,以便整个过程使用该目录作为工作目录,命令如下: ``` -export version=v1.6.0 && export kubefate_version=v1.4.1 && cd ~ && mkdir demo && cd demo +export release_version=v1.8.0 && export kubefate_version=v1.4.3 && cd ~ && mkdir demo && cd demo ``` **注意:下文介绍的MiniKube机器IP地址是192.168.100.123。请修改为你准备的实验机器IP地址!!!** # 开始安装 ## 安装需要的工具 -为了使用KubeFATE部署FATE,我们需要以下工具: -1. MiniKube: v1.7.3 -2. kubectl: v1.17.3 -3. kubefate: - * 发布版本: v1.6.0 - * 服务版本: v1.4.1 - * 命令行版本: v1.4.1 +为了使用KubeFATE部署FATE,我们需要以下工具。以下版本是经过验证的版本。基于向前兼容原则,我们假设高于以下版本的Minikube和kubectl也能够正常工作。 +1. MiniKube: v1.19.0 +2. kubectl: v1.19.0 ### 安装kubectl ``` -curl -LO https://storage.googleapis.com/kubernetes-release/release/v1.17.3/bin/linux/amd64/kubectl && chmod +x ./kubectl && sudo mv ./kubectl /usr/bin +curl -LO https://storage.googleapis.com/kubernetes-release/release/v1.19.0/bin/linux/amd64/kubectl && chmod +x ./kubectl && sudo mv ./kubectl /usr/bin ``` 执行完后可以验证是否成功, ``` kubefate@machine:~/demo$ kubectl version -Client Version: version.Info{Major:"1", Minor:"17", GitVersion:"v1.17.3", GitCommit:"06ad960bfd03b39c8310aaf92d1e7c12ce618213", GitTreeState:"clean", BuildDate:"2020-02-11T18:14:22Z", GoVersion:"go1.13.6", Compiler:"gc", Platform:"linux/amd64"} -The connection to the server localhost:8080 was refused - did you specify the right host or port? +Client Version: version.Info{Major:"1", Minor:"19", GitVersion:"v1.19.0", GitCommit:"e19964183377d0ec2052d1f1fa930c4d7575bd50", GitTreeState:"clean", BuildDate:"2020-08-26T14:30:33Z", GoVersion:"go1.15", Compiler:"gc", Platform:"linux/amd64"} ``` ### 安装MiniKube ``` -curl -LO https://github.com/kubernetes/minikube/releases/download/v1.7.3/minikube-linux-amd64 && mv minikube-linux-amd64 minikube && chmod +x minikube && sudo mv ./minikube /usr/bin +curl -LO https://github.com/kubernetes/minikube/releases/download/v1.19.0/minikube-linux-amd64 && mv minikube-linux-amd64 minikube && chmod +x minikube && sudo mv ./minikube /usr/bin ``` 验证安装结果: ``` kubefate@machine:~/demo$ minikube version -minikube version: v1.7.3 -commit: 436667c819c324e35d7e839f8116b968a2d0a3ff +minikube version: v1.21.0 +commit: 76d74191d82c47883dc7e1319ef7cebd3e00ee11 ``` ### 使用MiniKube安装Kubernetes -MiniKube支持使用不同的虚拟机来部署Kubernetes,但是在Linux环境下,我们建议直接使用Docker方式。这个方式非常简单,只需要设置--vm-driver=none即可。更多的说明参考:[Install MiniKube - Install a Hypervisor](https://kubernetes.io/docs/tasks/tools/install-minikube/#install-a-hypervisor). +MiniKube支持使用不同的虚拟机来部署Kubernetes,但是在Linux环境下,我们建议直接使用Docker方式。更多的说明参考:[Install MiniKube - Install a Hypervisor](https://kubernetes.io/docs/tasks/tools/install-minikube/#install-a-hypervisor). ``` -sudo minikube start --vm-driver=none +sudo minikube start --vm-driver=none --kubernetes-version v1.19.0 ``` -根据屏幕指引,稍等一小会。接着我们要重新定位安装好的kubectl或者minikube。 -``` -sudo mv /home/vmware/.kube /home/vmware/.minikube $HOME -sudo chown -R $USER $HOME/.kube $HOME/.minikube -``` -待到命令没有错误返回,我们可以验证下, +待到命令执行完成,我们可以验证下, ``` kubefate@machine:~/demo$ sudo minikube status host: Running @@ -78,15 +68,18 @@ sudo minikube addons enable ingress ``` 到此,我们的Kubernetes也准备好了。 -### 下载KubeFATE的发布包, KubeFATE服务镜像v1.4.1,并安装KubeFATE的命令行 -我们从Github上 [KubeFATE Release](https://github.com/FederatedAI/KubeFATE/releases)页面找到Kuberetes部署的下载包,并下载对应版本,如前面环境变量设置`v1.6.0`, +## 安装Kubefate +### 下载KubeFATE命令行工具 +我们从Github上 [KubeFATE Release](https://github.com/FederatedAI/KubeFATE/releases)页面找到Kuberetes部署的下载包,并下载对应版本,如前面环境变量设置`v1.8.0`, ``` -curl -LO https://github.com/FederatedAI/KubeFATE/releases/download/${version}/kubefate-k8s-${version}.tar.gz && tar -xzf ./kubefate-k8s-${version}.tar.gz +curl -LO https://github.com/FederatedAI/KubeFATE/releases/download/${release_version}/kubefate-k8s-${release_version}.tar.gz && tar -xzf ./kubefate-k8s-${release_version}.tar.gz ``` 然后我们可以查看下下载解压的安装包内容, ``` -kubefate@machine:~/demo$ ls -cluster-serving.yaml cluster.yaml config.yaml examples kubefate kubefate-k8s-v1.6.0.tar.gz kubefate.yaml rbac-config.yaml +kubefate@machine:~/demo cd kubefate +kubefate@machine:~/kubefate ls +cluster-serving.yaml cluster-spark-rabbitmq.yaml cluster.yaml examples rbac-config.yaml +cluster-spark-pulsar.yaml cluster-spark-slim.yaml config.yaml kubefate.yaml ``` 由于KubeFATE命令行是可执行二进制文件,可以直接移动到path目录方便使用, ``` @@ -94,33 +87,41 @@ chmod +x ./kubefate && sudo mv ./kubefate /usr/bin ``` 然后我们测试下kubefate命令是否可用, ``` -kubefate@machine:~/demo$ kubefate version -* kubefate service connection error, Post http://example.com/v1/user/login: dial tcp: lookup example.com: no such host -* kubefate commandLine version=v1.4.1 -``` -我们发现获取KubeFATE服务版本报了个错,这是因为我们还没部署KubeFATE的服务;而命令行的版本已经正常显示出来了。 - -接着,我们下载KubeFATE服务镜像v1.4.1, 其中release_version在本片教程的里是```v1.6.0```,kubefate_version是```v1.4.1``` +kubefate@machine:~/kubefate$ kubefate version +* kubefate commandLine version=v1.4.3 +* kubefate service connection error, resp.StatusCode=404, error: + + + + 404 - Not Found + + +

404 - Not Found

+ + + +``` +我们发现获取KubeFATE服务版本报了个错,这是因为我们还没部署KubeFATE的服务;而命令行工具的版本已经正常显示出来了。 + +### 部署Kubefate服务 +#### 1.载入Kubefate服务镜像 +接着,我们下载KubeFATE服务镜像v1.4.3: ``` curl -LO https://github.com/FederatedAI/KubeFATE/releases/download/${release_version}/kubefate-${kubefate_version}.docker ``` 然后读入本地Docker环境。请注意,因为本文使用的MiniKube,是all-in-one的Kubernetes环境,所以只需要导入本地Docker环境即可给kubelet拉取。如果你运行的是集群形式的Kubernetes,容器镜像需要读入[Docker Registry](https://docs.docker.com/registry/introduction/)或者[Harbor](https://goharbor.io/)。关于如何集成使用Harbor,可以参考:https://github.com/FederatedAI/KubeFATE/blob/master/registry/README.md ``` -kubefate@machine:~/demo$ docker load < ./kubefate-v1.4.1.docker -7a5b9c0b4b14: Loading layer [==================================================>] 3.031MB/3.031MB -8edfcca02080: Loading layer [==================================================>] 44.02MB/44.02MB -b7ffb386319e: Loading layer [==================================================>] 2.048kB/2.048kB -Loaded image: federatedai/kubefate:v1.4.1 +docker load < kubefate-v1.4.3.docker ``` -## 部署KubeFATE服务 -### 创建kube-fate的命名空间以及账号 +#### 2.创建kube-fate的命名空间以及账号 在我们的安装包里已经包含了相关的yaml文件`rbac-config.yaml`,并且前面的准备工作已解压这个文件到你的工作目录。我们只需要直接执行, ``` -kubectl apply -f ./rbac-config.yaml +kubefate@machine:~/kubefate kubectl apply -f ./rbac-config.yaml ``` -### (可选)使用网易云镜像仓库 +#### 3.(可选)使用网易云镜像仓库 **因为近期Dockerhub调整了下载限制服务条例 [Dockerhub latest limitation](https://docs.docker.com/docker-hub/download-rate-limit/), 我建议使用国内网易云的镜像仓库代替官方Dockerhub** ``` sed 's/mariadb:10/hub.c.163.com\/federatedai\/mariadb:10/g' kubefate.yaml > kubefate_163.yaml @@ -128,12 +129,16 @@ sed 's/registry: ""/registry: "hub.c.163.com\/federatedai"/g' cluster.yaml > clu ``` -### 在kube-fate命名空间里部署KubeFATE服务 +#### 4.在kube-fate命名空间里部署KubeFATE服务 相关的yaml文件也已经准备在工作目录,直接使用`kubectl apply`, ``` kubectl apply -f ./kubefate_163.yaml ``` +或(如果可以使用Dockerhub) +``` +kubectl apply -f ./kubefate.yaml +``` 稍等一会,大概10几秒后用下面命令看下KubeFATE服务是否部署好`kubectl get all,ingress -n kube-fate`。如果返回类似下面的信息(特别是pod的STATUS显示的是Running状态),则KubeFATE的服务就已经部署好并正常运行: ``` @@ -159,8 +164,10 @@ NAME HOSTS ADDRESS PORTS AGE ingress.extensions/kubefate example.com 192.168.100.123 80 50s ``` -### 添加example.com到hosts文件 -因为我们要用 example.com 域名来访问KubeFATE服务(该域名在ingress中定义,有需要可自行修改),需要在运行kubefate命令行所在的机器配置hosts文件(注意不一定是Kubernetes所在的机器)。另外下文中部署的FATE集群默认也是使用`example.com`作为默认域名,在部署的时候可以参考:[FATE cluster configuration](https://github.com/FederatedAI/KubeFATE/blob/master/docs/configurations/FATE_cluster_configuration.md#host-mappings)部分进行修改。如果网络环境有域名解析服务,可配置example.com域名指向MiniKube机器的IP地址,这样就不用配置hosts文件。注意:下面地址192.168.100.123 要替换为你的MiniKube机器地址。 +#### 5.添加example.com到hosts文件 +因为我们要用 example.com 域名来访问KubeFATE服务(该域名在ingress中定义,有需要可自行修改),需要在运行kubefate命令行所在的机器配置hosts文件(注意不一定是Kubernetes所在的机器)。 +另外下文中部署的FATE集群默认也是使用`example.com`作为默认域名,在部署的时候可以参考:[FATE cluster configuration](https://github.com/FederatedAI/KubeFATE/blob/master/docs/configurations/FATE_cluster_configuration.md#host-mappings)部分进行修改。 +如果网络环境有域名解析服务,可配置example.com域名指向MiniKube机器的IP地址,这样就不用配置hosts文件。注意:下面地址192.168.100.123 要替换为你的MiniKube机器地址。 ``` sudo -- sh -c "echo \"192.168.100.123 example.com\" >> /etc/hosts" @@ -181,41 +188,39 @@ rtt min/avg/max/mdev = 0.054/0.067/0.080/0.013 ms ### 验证KubeFATE服务 当 `example.com` 顺利设置, KubeFATE服务的版本号应该就可以正常显示, ``` -kubefate@machine:~/demo$ kubefate version -* kubefate service version=v1.4.1 -* kubefate commandLine version=v1.4.1 +kubefate@machine:~/kubefate$ kubefate version +* kubefate service version=v1.4.3 +* kubefate commandLine version=v1.4.3 ``` 到此,所有准备工作完毕,下面我们可以开始安装FATE了。需要注意的是,上面的工作只需要做一次,后面如果添加、删除、更新FATE集群,上面的不需要重新执行。 ## 使用KubeFATE安装FATE +### 准备步骤 按照前面的计划,我们需要安装两联盟方,ID分别9999与10000。现实情况,这两方应该是完全独立、隔绝的组织,为了模拟现实情况,所以我们需要先为他们在Kubernetes上创建各自独立的命名空间(namespace)。 -### 创建命名空间 我们创建命名空间fate-9999用来部署9999,fate-10000部署10000 ``` kubectl create namespace fate-9999 kubectl create namespace fate-10000 ``` -### 准备各自的集群配置文件 -KubeFATE安装包包含了集群配置的简要配置参考文件cluster.yaml,我们可以给每个参与方复制一份来修改配置。如果前面的步骤正确,这个文件已经在工作目录里。运行下面命令复制文件: -``` -cp ./cluster_163.yaml fate-9999.yaml && cp ./cluster_163.yaml fate-10000.yaml -``` -**注意: 我们强烈建议阅读以下文档** -`cluster.yaml`中具体配置的含义,请参考: https://github.com/FederatedAI/KubeFATE/blob/master/docs/configurations/FATE_cluster_configuration.md - -我们把fate-9999.yaml按以下内容修改。再次强调这里的`192.168.100.123`需要替换成你的MiniKube机器地址,同时注意更换相应的partyid。 +在exmaple目录下,我们已经预先设置了两个例子:`/kubefate/examples/party-9999/` 和 `/kubefate/examples/party-10000` +对于`/kubefate/examples/party-9999/cluster.yaml`,我们可以将其修改如下: ``` name: fate-9999 namespace: fate-9999 chartName: fate -chartVersion: v1.6.0 +chartVersion: v1.8.0 partyId: 9999 registry: "hub.c.163.com/federatedai" -pullPolicy: +imageTag: "1.8.0-release" +pullPolicy: +imagePullSecrets: +- name: myregistrykey persistence: false istio: enabled: false +podSecurityPolicy: + enabled: false modules: - rollsite - clustermanager @@ -227,7 +232,19 @@ modules: backend: eggroll -rollsite: +ingress: + fateboard: + annotations: + kubernetes.io/ingress.class: "nginx" + hosts: + - name: party9999.fateboard.example.com + client: + annotations: + kubernetes.io/ingress.class: "nginx" + hosts: + - name: party9999.notebook.example.com + +rollsite: type: NodePort nodePort: 30091 partyList: @@ -239,20 +256,29 @@ python: type: NodePort httpNodePort: 30097 grpcNodePort: 30092 + logLevel: INFO + +servingIp: 192.168.100.123 +servingPort: 30095 ``` -fate-10000按以下内容修改: +对于`/kubefate/examples/party-10000/cluster.yaml`,我们可以将其修改如下: ``` name: fate-10000 namespace: fate-10000 chartName: fate -chartVersion: v1.6.0 +chartVersion: v1.8.0 partyId: 10000 registry: "hub.c.163.com/federatedai" -pullPolicy: +imageTag: "1.8.0-release" +pullPolicy: +imagePullSecrets: +- name: myregistrykey persistence: false istio: enabled: false +podSecurityPolicy: + enabled: false modules: - rollsite - clustermanager @@ -264,7 +290,19 @@ modules: backend: eggroll -rollsite: +ingress: + fateboard: + annotations: + kubernetes.io/ingress.class: "nginx" + hosts: + - name: party10000.fateboard.example.com + client: + annotations: + kubernetes.io/ingress.class: "nginx" + hosts: + - name: party10000.notebook.example.com + +rollsite: type: NodePort nodePort: 30101 partyList: @@ -276,23 +314,30 @@ python: type: NodePort httpNodePort: 30107 grpcNodePort: 30102 + logLevel: INFO + +servingIp: 192.168.100.123 +servingPort: 30105 ``` +**注意: 我们强烈建议阅读以下文档** +`cluster.yaml`中具体配置的含义,请参考: https://github.com/FederatedAI/KubeFATE/blob/master/docs/configurations/FATE_cluster_configuration.md + +### 安装FATE集群 如果一切没有问题,那就可以使用`kubefate cluster install`来部署两个fate集群了, ``` -kubefate@machine:~/demo$ kubefate cluster install -f ./fate-9999.yaml +kubefate@machine:~/kubefate$ kubefate cluster install -f examples/party-9999/cluster.yaml create job success, job id=2c1d926c-bb57-43d3-9127-8cf3fc6deb4b -kubefate@machine:~/demo$ kubefate cluster install -f ./fate-10000.yaml +kubefate@machine:~/kubefate$ kubefate cluster install -f examples/party-10000/cluster.yaml create job success, job id=7752db70-e368-41fa-8827-d39411728d1b ``` 这时候,KubeFATE会创建两个任务去分别部署两个FATE集群。我们可以通过`kubefate job ls`来查看任务,或者直接`watch` KubeFATE中集群的状态,直至变成`Running` ``` - -kubefate@machine:~/demo$ watch kubefate cluster ls +kubefate@machine:~/kubefate$ watch kubefate cluster ls UUID NAME NAMESPACE REVISION STATUS CHART ChartVERSION AGE -51476469-b473-4d41-b2d5-ea7241d5eac7 fate-9999 fate-9999 1 Running fate v1.6.0 88s -dacc0549-b9fc-463f-837a-4e7316db2537 fate-10000 fate-10000 1 Running fate v1.6.0 69s +51476469-b473-4d41-b2d5-ea7241d5eac7 fate-9999 fate-9999 1 Running fate v1.8.0 88s +dacc0549-b9fc-463f-837a-4e7316db2537 fate-10000 fate-10000 1 Running fate v1.8.0 69s ``` 因为这个步骤需要到网易云镜像仓库去下载约10G的镜像,所以第一次执行视乎你的网络情况需要一定时间。 检查下载的进度可以用 @@ -310,73 +355,93 @@ nodemanager-1-7c986f9454-qcscd 2/2 Running 0 12m python-57b66d96bd-vj8kq 3/3 Running 0 12m rollsite-7846898d6d-j2gb9 1/1 Running 0 12m ``` -另外一个方案是我们可以通过下载离线的容器镜像,导入本地环境,具体做法本文就不做赘述了。 -## 验证FATE的部署 -### 访问集群 +### 验证FATE的部署 通过以上的 `kubefate cluster ls` 命令, 我们得到 `fate-9999` 的集群ID是 `51476469-b473-4d41-b2d5-ea7241d5eac7`, 而 `fate-10000` 的集群ID是 `dacc0549-b9fc-463f-837a-4e7316db2537`. 我们可以通过`kubefate cluster describe`查询集群的具体访问信息, ``` kubefate@machine:~/demo$ kubefate cluster describe 51476469-b473-4d41-b2d5-ea7241d5eac7 UUID 51476469-b473-4d41-b2d5-ea7241d5eac7 -Name fate-9999 -NameSpace fate-9999 -ChartName fate -ChartVersion v1.6.0 -Revision 1 -Age 2m22s -Status Running -Spec backend: eggroll - chartName: fate - chartVersion: v1.6.0 - istio: - enabled: false - modules: - - rollsite - - clustermanager - - nodemanager - - mysql - - python - - fateboard - - client - name: fate-9999 - namespace: fate-9999 - partyId: 9999 - persistence: false - pullPolicy: null - python: - grpcNodePort: 30092 - httpNodePort: 30097 - type: NodePort - registry: hub.c.163.com/federatedai - rollsite: - nodePort: 30091 - partyList: - - partyId: 10000 - partyIp: 192.168.100.123 - partyPort: 30101 - type: NodePort - -Info dashboard: - - party9999.notebook.example.com - - party9999.fateboard.example.com - ip: 192.168.100.123 - pod: - - clustermanager-5fcbd4ccc6-fj6tq - - mysql-7cf4d4dcb8-wvl4j - - nodemanager-0-6cbbc86769-fk77x - - nodemanager-1-5c6dd78f99-bgt2w - - python-57668d4497-qwnbb - - rollsite-f7476746-5cxh8 - status: - modules: - client: Running - clustermanager: Running - fateboard: Running - mysql: Running - nodemanager-0: Running - nodemanager-1: Running - python: Running - rollsite: Running +Name fate-9999 +NameSpace fate-9999 +ChartName fate +ChartVersion v1.8.0 +Revision 1 +Age 15h +Status Running +Spec backend: eggroll + chartName: fate + chartVersion: v1.8.0 + imagePullSecrets: + - name: myregistrykey + imageTag: 1.8.0-release + ingress: + client: + annotations: + kubernetes.io/ingress.class: nginx + hosts: + - name: party9999.notebook.example.com + fateboard: + annotations: + kubernetes.io/ingress.class: nginx + hosts: + - name: party9999.fateboard.example.com + istio: + enabled: false + modules: + - rollsite + - clustermanager + - nodemanager + - mysql + - python + - fateboard + - client + name: fate-9999 + namespace: fate-9999 + partyId: 9999 + persistence: false + podSecurityPolicy: + enabled: false + pullPolicy: null + python: + grpcNodePort: 30092 + httpNodePort: 30097 + type: NodePort + registry: "" + rollsite: + nodePort: 30091 + partyList: + - partyId: 10000 + partyIp: 10.192.173.64 + partyPort: 30101 + type: NodePort + servingIp: 10.192.173.64 + servingPort: 30095 + +Info dashboard: + - party9999.notebook.example.com + - party9999.fateboard.example.com + ip: 10.192.173.64 + port: 30091 + status: + containers: + client: Running + clustermanager: Running + fateboard: Running + mysql: Running + nodemanager-0: Running + nodemanager-0-eggrollpair: Running + nodemanager-1: Running + nodemanager-1-eggrollpair: Running + python: Running + rollsite: Running + deployments: + client: Available + clustermanager: Available + mysql: Available + nodemanager-0: Available + nodemanager-1: Available + python: Available + rollsite: Available ``` 从返回的内容中,我们看到`Info->dashboard`里包含了: * Jupyter Notebook的访问地址: `party9999.notebook.example.com`。这个是我们准备让数据科学家进行建模分析的平台。已经集成了FATE-Clients; @@ -387,8 +452,7 @@ Info dashboard: ### 在浏览器访问FATE集群的机器上配置相关的Host信息 **注意: 如果DNS已经配置了相关的解析,这步可以跳过** - -在Linux或者MacOS机器可以通过以下命令配置, +在准备打开浏览器的Linux或MacOS机器通过以下命令配置, ``` sudo -- sh -c "echo \"192.168.100.123 party9999.notebook.example.com\" >> /etc/hosts" sudo -- sh -c "echo \"192.168.100.123 party9999.fateboard.example.com\" >> /etc/hosts" @@ -405,38 +469,44 @@ sudo -- sh -c "echo \"192.168.100.123 party10000.fateboard.example.com\" >> /et -打开 -```Pipeline/notebooks/usage_of_fate_client.ipynb``` -, `ipynb` 是Jupyter Notebook的格式。如果想更多的了解这个格式,请参考: https://jupyter-notebook.readthedocs.io/en/stable/ +打开`pipeline/pipeline_tutorial_upload.ipynb`并执行这个脚本来上传数据。我们需要在`9999`和`10000`两方的 + +然后打开 +`pipeline/pipeline_tutorial_hetero_sbt.ipynb` 并执行训练和预测任务。具体信息可以参考脚本上的注释。 +这里收录了更多的Jupyter notebook脚本:https://github.com/FederatedAI/FATE/tree/master/doc/tutorial/pipeline -接着摁下图中所高亮的摁扭,整个notebook会自动运行。 +notebook截图:
- +
-
-
-当notebook在运行的时候,你可以随时的查阅任务的状态通过FateBoard, + +当训练任务结束是,我们可以在fateboard上查看训练任务的流程图:
- + +
+ +我们也可以在fateboard上查看训练任务的结果: +
+ +
+ +当预测任务结束时,我们可以在fateboard上查看训练好的模型,以及特征重要的度等信息: +
+ +
+ +当然还包括模型对每一条测试数据的预测结果: +
+
-
-当整个notebook结束运行后,如果最后两行结果跟如下代码相似,
-**注意:执行过程中,代码块前的变成`\*`。需等到变成数字才表明该步骤执行完毕。全部的代码块前面都变成数字后代表整个notebook执行完成。更多请参考Jupyter Notebook相关说明。** -``` -2021-07-07 05:31:50.784 | INFO | pipeline.utils.invoker.job_submitter:monitor_job_status:129 - Job is success!!! Job id is 202107070529230126236 -2021-07-07 05:31:50.788 | INFO | pipeline.utils.invoker.job_submitter:monitor_job_status:130 - Total time: 0:02:24 -``` -那就说明你正确的安装和部署了KubeFATE。 +这表示FATE已经完全安装好,并且KubeFate的功能一切正常。 -## 下一步 -1. Pipeline_example是非常简单的FATE联邦学习例子。我们可以在Notebook的目录上找到更多其他的联邦学习算法。但需要注意,这些例子都是按单边写的,所以,需要修改他们在已经部署的`fate-9999`与`fate-10000`共同训练。大多数情况下,需要保证host方已经把数据导入; -2. FML_Manager将会在下个版本与FATE-Clients合并,请参考FATE-Clients的文档:https://fate.readthedocs.io/en/latest/_build_temp/python/fate_client/flow_sdk/README.html. FATE-Clients已经默认安装在Jupyter Notebook中,可以直接使用; -3. 现在你已经部署了一个基本版本的FATE集群,我们在Github上准备了不同FATE的集群部署例子(https://github.com/FederatedAI/KubeFATE/tree/master/k8s-deploy/examples ),包括: - * FATE-Serving的部署; - * Spark作为计算引擎的部署。 - - 我们也会推出系列文章介绍以上内容。 +## 后续 +1. 上面的联邦学习例子是最简单的一个例子,请自行探索其他的例子。 +2. 本文只介绍了基于eggroll的FATE集群架构,在`https://github.com/FederatedAI/KubeFATE/tree/master/k8s-deploy/examples`目录中,我们还准备了其他的YAML文件,用来: +* 部署FATE-Serving。 +* 部署基于Spark的FATE集群,以及基于两种消息队列的FATE集群:rabbitmq和pulsar。 \ No newline at end of file From c905afdae42806bb03d75e2c09c479d5561293f4 Mon Sep 17 00:00:00 2001 From: Chen Jing Date: Tue, 19 Apr 2022 13:51:25 +0800 Subject: [PATCH 12/14] Change the Kubefate CLI version to 1.4.4 Signed-off-by: Chen Jing --- ...ATE_Cluster_in_One_Linux_Machine_with_MiniKube.md | 12 ++++++------ ..._Cluster_in_One_Linux_Machine_with_MiniKube_zh.md | 12 ++++++------ 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/docs/tutorials/Build_Two_Parties_FATE_Cluster_in_One_Linux_Machine_with_MiniKube.md b/docs/tutorials/Build_Two_Parties_FATE_Cluster_in_One_Linux_Machine_with_MiniKube.md index 55ab37466..4282996cb 100644 --- a/docs/tutorials/Build_Two_Parties_FATE_Cluster_in_One_Linux_Machine_with_MiniKube.md +++ b/docs/tutorials/Build_Two_Parties_FATE_Cluster_in_One_Linux_Machine_with_MiniKube.md @@ -22,7 +22,7 @@ After the tutorial, the deployment architecture looks like the following diagram 6. Setup the global KubeFATE version using in the tutorial and create a folder for the whole tutorial. We use KubeFATE v1.8.0 in this tutorial, other versions should be similar. ``` -export release_version=v1.8.0 && export kubefate_version=v1.4.3 && cd ~ && mkdir demo && cd demo +export release_version=v1.8.0 && export kubefate_version=v1.4.4 && cd ~ && mkdir demo && cd demo ``` **!!!Note: in this tutorial, the IP of the machine we used is 192.168.100.123. Please change it to your machine's IP in all the following commands and config files.** @@ -99,7 +99,7 @@ chmod +x ./kubefate && sudo mv ./kubefate /usr/bin Try to verify if kubefate works, ``` kubefate@machine:~/kubefate$ kubefate version -* kubefate commandLine version=v1.4.3 +* kubefate commandLine version=v1.4.4 * kubefate service connection error, resp.StatusCode=404, error: @@ -118,7 +118,7 @@ deployed the KubeFATE service yet. ### Deploy KubeFATE service #### 1. Load the docker image of the KubeFATE service -Download the KubeFATE Server v1.4.3's docker image, +Download the KubeFATE Server v1.4.4's docker image, ``` curl -LO https://github.com/FederatedAI/KubeFATE/releases/download/${release_version}/kubefate-${kubefate_version}.docker ``` @@ -128,7 +128,7 @@ the image needs to be loaded into [Docker Registry](https://docs.docker.com/regi [Harbor](https://goharbor.io/). For the details of using Harbor as a local image registry, please refer to: https://github.com/FederatedAI/KubeFATE/blob/master/registry/README.md. ``` -docker load < kubefate-v1.4.3.docker +docker load < kubefate-v1.4.4.docker ``` #### 2. Create kube-fate namespace and account for KubeFATE service We have prepared the yaml for creating kube-fate namespace, as well as creating a service account in rbac-config.yaml in your working folder. Just apply it, @@ -208,8 +208,8 @@ rtt min/avg/max/mdev = 0.054/0.067/0.080/0.013 ms When `example.com` well set, KubeFATE service version can be shown, ``` kubefate@machine:~/kubefate$ kubefate version -* kubefate service version=v1.4.3 -* kubefate commandLine version=v1.4.3 +* kubefate service version=v1.4.4 +* kubefate commandLine version=v1.4.4 ``` Note: The `kubefate` CLI can only work in the same directory of config.yaml diff --git a/docs/tutorials/Build_Two_Parties_FATE_Cluster_in_One_Linux_Machine_with_MiniKube_zh.md b/docs/tutorials/Build_Two_Parties_FATE_Cluster_in_One_Linux_Machine_with_MiniKube_zh.md index ee5e13e41..ee366fdc7 100644 --- a/docs/tutorials/Build_Two_Parties_FATE_Cluster_in_One_Linux_Machine_with_MiniKube_zh.md +++ b/docs/tutorials/Build_Two_Parties_FATE_Cluster_in_One_Linux_Machine_with_MiniKube_zh.md @@ -17,7 +17,7 @@ 5. 要保证安装机器可以正常访问Docker Hub或者网易云镜像仓库,以及Google gcr; 6. 预先创建一个目录,以便整个过程使用该目录作为工作目录,命令如下: ``` -export release_version=v1.8.0 && export kubefate_version=v1.4.3 && cd ~ && mkdir demo && cd demo +export release_version=v1.8.0 && export kubefate_version=v1.4.4 && cd ~ && mkdir demo && cd demo ``` **注意:下文介绍的MiniKube机器IP地址是192.168.100.123。请修改为你准备的实验机器IP地址!!!** @@ -88,7 +88,7 @@ chmod +x ./kubefate && sudo mv ./kubefate /usr/bin 然后我们测试下kubefate命令是否可用, ``` kubefate@machine:~/kubefate$ kubefate version -* kubefate commandLine version=v1.4.3 +* kubefate commandLine version=v1.4.4 * kubefate service connection error, resp.StatusCode=404, error: @@ -106,13 +106,13 @@ kubefate@machine:~/kubefate$ kubefate version ### 部署Kubefate服务 #### 1.载入Kubefate服务镜像 -接着,我们下载KubeFATE服务镜像v1.4.3: +接着,我们下载KubeFATE服务镜像v1.4.4: ``` curl -LO https://github.com/FederatedAI/KubeFATE/releases/download/${release_version}/kubefate-${kubefate_version}.docker ``` 然后读入本地Docker环境。请注意,因为本文使用的MiniKube,是all-in-one的Kubernetes环境,所以只需要导入本地Docker环境即可给kubelet拉取。如果你运行的是集群形式的Kubernetes,容器镜像需要读入[Docker Registry](https://docs.docker.com/registry/introduction/)或者[Harbor](https://goharbor.io/)。关于如何集成使用Harbor,可以参考:https://github.com/FederatedAI/KubeFATE/blob/master/registry/README.md ``` -docker load < kubefate-v1.4.3.docker +docker load < kubefate-v1.4.4.docker ``` #### 2.创建kube-fate的命名空间以及账号 @@ -189,8 +189,8 @@ rtt min/avg/max/mdev = 0.054/0.067/0.080/0.013 ms 当 `example.com` 顺利设置, KubeFATE服务的版本号应该就可以正常显示, ``` kubefate@machine:~/kubefate$ kubefate version -* kubefate service version=v1.4.3 -* kubefate commandLine version=v1.4.3 +* kubefate service version=v1.4.4 +* kubefate commandLine version=v1.4.4 ``` 到此,所有准备工作完毕,下面我们可以开始安装FATE了。需要注意的是,上面的工作只需要做一次,后面如果添加、删除、更新FATE集群,上面的不需要重新执行。 From 25a82e5827252e397850a69c4c3a072cb8cba847 Mon Sep 17 00:00:00 2001 From: ChenLong Ma Date: Wed, 20 Apr 2022 10:57:39 +0800 Subject: [PATCH 13/14] Feat support FATE v1.8.0 (#585) * update images tag of docker build Signed-off-by: owlet42 * update docker compose for fate v1.8 Signed-off-by: owlet42 * update dockerfile of client Signed-off-by: owlet42 * add fate images push of git actions Signed-off-by: owlet42 * update helm chart to support FATE v1.8.0 Signed-off-by: owlet42 * fix docker deploy action failed Signed-off-by: owlet42 * fix when python is not started, the curl command will cause an exit, resulting in an overall failure Signed-off-by: owlet42 * Remove useless information Signed-off-by: owlet42 * update docs for new version Signed-off-by: owlet42 * fix docker compose generate yaml for FATE on Spark Signed-off-by: owlet42 * fix "No such file or directory: '/data/projects/fate/conf/service_conf.yaml'" Signed-off-by: owlet42 Co-authored-by: Layne Peng --- .env | 7 - .github/workflows/fate-push.yml | 49 +++++ .../workflows/{push.yml => kubefate-push.yml} | 3 +- build/ci/docker-deploy/docker_deploy.sh | 2 +- build/ci/docker-deploy/generate_config.sh | 2 +- docker-build/.env | 2 +- docker-build/README.md | 29 +++ docker-build/client/Dockerfile | 2 +- docker-build/docker-build.sh | 8 +- docker-deploy/.env | 2 +- docker-deploy/README.md | 1 + docker-deploy/README_zh.md | 2 + docker-deploy/generate_config.sh | 9 +- .../docker-compose-eggroll.yml | 8 +- .../docker-compose-spark-slim.yml | 6 +- .../docker-compose-spark.yml | 6 +- .../fateboard/conf/application.properties | 25 +-- docs/FATE_On_Spark.md | 2 - docs/FATE_On_Spark_With_Pulsar.md | 2 - docs/Manage_FATE_and_FATE-Serving_Version.md | 8 +- helm-charts/FATE-Exchange/Chart.yaml | 4 +- .../values-template-example.yaml | 4 +- .../FATE-Exchange/values-template.yaml | 2 +- helm-charts/FATE-Exchange/values.yaml | 2 +- helm-charts/FATE/Chart.yaml | 4 +- .../eggroll/nodemanager/deployment.yaml | 2 +- .../templates/core/fateboard/configmap.yaml | 22 +-- .../FATE/templates/core/python-spark.yaml | 4 +- helm-charts/FATE/values-template-example.yaml | 4 +- helm-charts/FATE/values-template.yaml | 2 +- helm-charts/FATE/values.yaml | 2 +- helm-charts/Images_list.md | 19 +- k8s-deploy/README.md | 173 ++++++++++++------ k8s-deploy/README_zh.md | 173 ++++++++++++------ k8s-deploy/cluster-spark-pulsar.yaml | 4 +- k8s-deploy/cluster-spark-rabbitmq.yaml | 4 +- k8s-deploy/cluster-spark-slim.yaml | 4 +- k8s-deploy/cluster.yaml | 4 +- k8s-deploy/docs/docs.go | 1 - k8s-deploy/docs/swagger.json | 1 - k8s-deploy/docs/swagger.yaml | 1 - k8s-deploy/examples/config.sh | 154 +++++++++------- .../examples/party-10000/cluster-serving.yaml | 2 +- .../cluster-spark-local-pulsar.yaml | 4 +- .../party-10000/cluster-spark-pulsar.yaml | 4 +- .../party-10000/cluster-spark-rabbitmq.yaml | 4 +- k8s-deploy/examples/party-10000/cluster.yaml | 4 +- .../examples/party-9999/cluster-serving.yaml | 2 +- .../cluster-spark-local-pulsar.yaml | 4 +- .../party-9999/cluster-spark-pulsar.yaml | 4 +- .../party-9999/cluster-spark-rabbitmq.yaml | 4 +- k8s-deploy/examples/party-9999/cluster.yaml | 4 +- .../examples/party-exchange/rollsite.yaml | 4 +- .../party-exchange/trafficServer.yaml | 4 +- k8s-deploy/examples/party.config | 7 + k8s-deploy/pkg/api/service.go | 1 - 56 files changed, 498 insertions(+), 319 deletions(-) delete mode 100644 .env create mode 100644 .github/workflows/fate-push.yml rename .github/workflows/{push.yml => kubefate-push.yml} (96%) create mode 100644 docker-build/README.md create mode 100644 k8s-deploy/examples/party.config diff --git a/.env b/.env deleted file mode 100644 index 22d5741a2..000000000 --- a/.env +++ /dev/null @@ -1,7 +0,0 @@ -PREFIX=federatedai -RegistryURI= -TAG=1.3.0-release - -# PREFIX: the namespace on the registry's server to store the container images. -# RegistryURI: the address of the registry server. Refer to docker-deploy/README.md for more details. -# TAG: the tag of images of components. diff --git a/.github/workflows/fate-push.yml b/.github/workflows/fate-push.yml new file mode 100644 index 000000000..ae666455b --- /dev/null +++ b/.github/workflows/fate-push.yml @@ -0,0 +1,49 @@ +name: Push fate images to DockerHub + +on: + push: + # Publish `master` as Docker `latest` image. + branches: + - master + - jenkins-integration + + # Publish `v1.2.3` tags as releases. + tags: + - v* + +jobs: + # no test is required + push: + runs-on: ubuntu-18.04 + if: github.event_name == 'push' + + steps: + - uses: actions/checkout@v2 + + - name: Prepare the TAG + id: prepare-the-tag + run: | + # strip git ref prefix from version + TAG="" + VERSION=$(echo "${{ github.ref }}" | sed -e 's,.*/\(.*\),\1,') + if [ $VERSION = "master" ]; then + TAG=latest + else + TAG=${VERSION##*v}-release + fi + echo "::notice col=5 title=print tag::TAG=$TAG" + echo "::set-output name=tag::$TAG" + - name: Build image + run: | + IMG_TAG=${{steps.prepare-the-tag.outputs.tag}} + cd docker-build + bash docker-build.sh all + + - name: Log into DockerHub + run: docker login -u ${{ secrets.DOCKERHUB_USERNAME }} -p ${{ secrets.DOCKERHUB_TOKEN }} + + - name: Push image + run: | + IMG_TAG=${{steps.prepare-the-tag.outputs.tag}} + cd docker-build + bash docker-build.sh push diff --git a/.github/workflows/push.yml b/.github/workflows/kubefate-push.yml similarity index 96% rename from .github/workflows/push.yml rename to .github/workflows/kubefate-push.yml index 81cd7df1d..517e81331 100644 --- a/.github/workflows/push.yml +++ b/.github/workflows/kubefate-push.yml @@ -1,11 +1,10 @@ -name: Publish +name: Push kubefate service image to DockerHub on: push: # Publish `master` as Docker `latest` image. branches: - master - - jenkins-integration # Publish `v1.2.3` tags as releases. tags: diff --git a/build/ci/docker-deploy/docker_deploy.sh b/build/ci/docker-deploy/docker_deploy.sh index 341f3cfbd..14b3f840c 100644 --- a/build/ci/docker-deploy/docker_deploy.sh +++ b/build/ci/docker-deploy/docker_deploy.sh @@ -1,5 +1,5 @@ #!/bin/bash -set -e +set -x dir=$(dirname $0) CONTAINER_NUM=13 diff --git a/build/ci/docker-deploy/generate_config.sh b/build/ci/docker-deploy/generate_config.sh index 1ab1535f3..f4100f62f 100644 --- a/build/ci/docker-deploy/generate_config.sh +++ b/build/ci/docker-deploy/generate_config.sh @@ -13,7 +13,7 @@ sed -i "s/serving_ip_list=(192.168.1.1 192.168.1.2)/serving_ip_list=(${host_ip}) # Replace tag to latest # TODO should replace the serving as well -# sed -i "s/^TAG=.*/TAG=latest/g" .env +sed -i "s/^TAG=.*/TAG=latest/g" .env echo "# config prepare is ok" echo "# generate config" diff --git a/docker-build/.env b/docker-build/.env index 473130c9e..8fe30b1e3 100644 --- a/docker-build/.env +++ b/docker-build/.env @@ -1,2 +1,2 @@ #PREFIX=federatedai -#IMG_TAG=1.7.2-release +#IMG_TAG=1.8.0-release diff --git a/docker-build/README.md b/docker-build/README.md new file mode 100644 index 000000000..5a151f65a --- /dev/null +++ b/docker-build/README.md @@ -0,0 +1,29 @@ +# KubeFATE docker build + +This contains the builds of some images for KubeFATE to deploy FATE. + +- client +- nginx +- spark +- python-spark + +## Prerequisites + +1. A Linux host +2. Docker: 18+ + +## Build + +All images build. + +```bash +IMG_TAG=latest bash docker-build.sh all +``` + +## push + +Push images to DockerHub + +```bash +IMG_TAG=latest bash docker-build.sh all +``` diff --git a/docker-build/client/Dockerfile b/docker-build/client/Dockerfile index b5108be91..4a32cddd5 100644 --- a/docker-build/client/Dockerfile +++ b/docker-build/client/Dockerfile @@ -2,7 +2,7 @@ ARG SOURCE_PREFIX=federatedai ARG SOURCE_TAG=1.5.0-release FROM ${SOURCE_PREFIX}/python:${SOURCE_TAG} as data -FROM python:3.7 +FROM python:3.6 COPY pipeline /data/projects/fate/pipeline RUN pip install notebook fate-client pandas sklearn diff --git a/docker-build/docker-build.sh b/docker-build/docker-build.sh index 640a2f78f..458322abc 100644 --- a/docker-build/docker-build.sh +++ b/docker-build/docker-build.sh @@ -14,8 +14,12 @@ set -e -PREFIX=federatedai -IMG_TAG=latest +if [ -z "$IMG_TAG" ]; then + IMG_TAG=latest +fi +if [ -z "$PREFIX" ]; then + PREFIX=federatedai +fi source .env diff --git a/docker-deploy/.env b/docker-deploy/.env index 153105485..784cb39b9 100644 --- a/docker-deploy/.env +++ b/docker-deploy/.env @@ -1,5 +1,5 @@ RegistryURI= -TAG=1.7.2-release +TAG=1.8.0-release SERVING_TAG=2.0.4-release # PREFIX: namespace on the registry's server. diff --git a/docker-deploy/README.md b/docker-deploy/README.md index dacf3e6f7..f291ebb80 100644 --- a/docker-deploy/README.md +++ b/docker-deploy/README.md @@ -17,6 +17,7 @@ First, on a Linux host, download KubeFATE from [releases pages](https://github.c By default, the installation script pulls the images from Docker Hub during the deployment. If the target node is not connected to Internet, refer to the below section to set up a local registry such as Harbor and use the offline images. +***If you have deployed other versions of FATE before, please delete and clean up before deploying the new version, [Deleting the cluster](#deleting-the-cluster).*** ### Setting up a local registry Harbor (Optional) Please refer to [this guide](../registry/README.md) to install Harbor as a local registry. diff --git a/docker-deploy/README_zh.md b/docker-deploy/README_zh.md index f4468effa..027c53c71 100644 --- a/docker-deploy/README_zh.md +++ b/docker-deploy/README_zh.md @@ -83,6 +83,8 @@ RegistryURI=192.168.10.1/federatedai ### 用Docker Compose部署FATE + ***如果在之前你已经部署过其他版本的FATE,请删除清理之后再部署新的版本,[删除部署](#删除部署).*** + #### 配置需要部署的实例数目 部署脚本提供了部署多个FATE实例的功能,下面的例子我们部署在两个机器上,每个机器运行一个FATE实例,这里两台机器的IP分别为*192.168.7.1*和*192.168.7.2* diff --git a/docker-deploy/generate_config.sh b/docker-deploy/generate_config.sh index 242c9a905..be6f6be61 100755 --- a/docker-deploy/generate_config.sh +++ b/docker-deploy/generate_config.sh @@ -88,7 +88,7 @@ GenerateConfig() { cp -r training_template/backends/spark/rabbitmq confs-$party_id/confs/ cp training_template/docker-compose-spark.yml confs-$party_id/docker-compose.yml - sed -i '157,173d' confs-$party_id/docker-compose.yml + sed -i '163,179d' confs-$party_id/docker-compose.yml fi if [ "$backend" == "spark_pulsar" ]; then @@ -98,7 +98,7 @@ GenerateConfig() { cp -r training_template/backends/spark/pulsar confs-$party_id/confs/ cp training_template/docker-compose-spark.yml confs-$party_id/docker-compose.yml - sed -i '139,155d' confs-$party_id/docker-compose.yml + sed -i '145,161d' confs-$party_id/docker-compose.yml fi if [ "$backend" == "spark_local_pulsar" ]; then @@ -165,15 +165,12 @@ GenerateConfig() { mkdir -p ${shared_dir}/${value} done - sed -i "s|{/path/to/host/dir}|${dir}/${shared_dir}|g" ./confs-$party_id/docker-compose.yml + sed -i "s||${dir}/${shared_dir}|g" ./confs-$party_id/docker-compose.yml # Start the general config rendering # fateboard sed -i "s#^server.port=.*#server.port=${fateboard_port}#g" ./confs-$party_id/confs/fateboard/conf/application.properties sed -i "s#^fateflow.url=.*#fateflow.url=http://${fate_flow_ip}:${fate_flow_http_port}#g" ./confs-$party_id/confs/fateboard/conf/application.properties - sed -i "s##${db_user}#g" ./confs-$party_id/confs/fateboard/conf/application.properties - sed -i "s##${db_password}#g" ./confs-$party_id/confs/fateboard/conf/application.properties - sed -i "s##jdbc:mysql://${db_ip}:3306/${db_name}?characterEncoding=utf8\&characterSetResults=utf8\&autoReconnect=true\&failOverReadOnly=false\&serverTimezone=GMT%2B8#g" ./confs-$party_id/confs/fateboard/conf/application.properties sed -i "s##${fateboard_username}#g" ./confs-$party_id/confs/fateboard/conf/application.properties sed -i "s##${fateboard_password}#g" ./confs-$party_id/confs/fateboard/conf/application.properties echo fateboard module of $party_id done! diff --git a/docker-deploy/training_template/docker-compose-eggroll.yml b/docker-deploy/training_template/docker-compose-eggroll.yml index 03c18429a..9107bc536 100644 --- a/docker-deploy/training_template/docker-compose-eggroll.yml +++ b/docker-deploy/training_template/docker-compose-eggroll.yml @@ -25,19 +25,19 @@ volumes: driver_opts: type: none o: bind - device: {/path/to/host/dir}/examples + device: /examples shared_dir_federatedml: driver: local driver_opts: type: none o: bind - device: {/path/to/host/dir}/federatedml + device: /federatedml shared_dir_data: driver: local driver_opts: type: none o: bind - device: {/path/to/host/dir}/data + device: /data services: rollsite: @@ -86,7 +86,7 @@ services: - 4671 volumes: - ./confs/eggroll/conf:/data/projects/fate/eggroll/conf - - ./confs/fate_flow/conf/service_conf.yaml:/data/projects/fate/fate/conf/service_conf.yaml + - ./confs/fate_flow/conf/service_conf.yaml:/data/projects/fate/conf/service_conf.yaml - ./shared_dir/data/nodemanager:/data/projects/fate/eggroll/data networks: - fate-network diff --git a/docker-deploy/training_template/docker-compose-spark-slim.yml b/docker-deploy/training_template/docker-compose-spark-slim.yml index 734a922f0..195201693 100644 --- a/docker-deploy/training_template/docker-compose-spark-slim.yml +++ b/docker-deploy/training_template/docker-compose-spark-slim.yml @@ -26,19 +26,19 @@ volumes: driver_opts: type: none o: bind - device: {/path/to/host/dir}/examples + device: /examples shared_dir_federatedml: driver: local driver_opts: type: none o: bind - device: {/path/to/host/dir}/federatedml + device: /federatedml shared_dir_data: driver: local driver_opts: type: none o: bind - device: {/path/to/host/dir}/data + device: /data services: fateboard: diff --git a/docker-deploy/training_template/docker-compose-spark.yml b/docker-deploy/training_template/docker-compose-spark.yml index 1eec33416..0945858ed 100644 --- a/docker-deploy/training_template/docker-compose-spark.yml +++ b/docker-deploy/training_template/docker-compose-spark.yml @@ -25,19 +25,19 @@ volumes: driver_opts: type: none o: bind - device: {/path/to/host/dir}/examples + device: /examples shared_dir_federatedml: driver: local driver_opts: type: none o: bind - device: {/path/to/host/dir}/federatedml + device: /federatedml shared_dir_data: driver: local driver_opts: type: none o: bind - device: {/path/to/host/dir}/data + device: /data services: fateboard: diff --git a/docker-deploy/training_template/public/fateboard/conf/application.properties b/docker-deploy/training_template/public/fateboard/conf/application.properties index fa5f035d1..9ff1f0591 100644 --- a/docker-deploy/training_template/public/fateboard/conf/application.properties +++ b/docker-deploy/training_template/public/fateboard/conf/application.properties @@ -1,29 +1,20 @@ server.port=8080 -fateflow.url= -spring.datasource.driver-Class-Name=com.mysql.cj.jdbc.Driver +fateflow.url=http://localhost:9380 +fateflow.http_app_key= +fateflow.http_secret_key= spring.http.encoding.charset=UTF-8 spring.http.encoding.enabled=true server.tomcat.uri-encoding=UTF-8 -fateboard.datasource.jdbc-url= -fateboard.datasource.username= -fateboard.datasource.password= +fateboard.front_end.cors=false +fateboard.front_end.url=http://localhost:8028 server.tomcat.max-threads=1000 server.tomcat.max-connections=20000 spring.servlet.multipart.max-file-size=10MB spring.servlet.multipart.max-request-size=100MB -spring.datasource.druid.filter.config.enabled=false -spring.datasource.druid.web-stat-filter.enabled=false -spring.datasource.druid.stat-view-servlet.enabled=false server.compression.enabled=true server.compression.mime-types=application/json,application/xml,text/html,text/xml,text/plain server.board.login.username= server.board.login.password= -management.endpoints.web.exposure.exclude=* -#server.ssl.key-store=classpath: -#server.ssl.key-store-password= -#server.ssl.key-password= -#server.ssl.key-alias= -spring.session.store-type=jdbc -spring.session.jdbc.initialize-schema=always -#HTTP_APP_KEY= -#HTTP_SECRET_KEY= \ No newline at end of file +server.servlet.session.timeout=4h +server.servlet.session.cookie.max-age=4h +management.endpoints.web.exposure.exclude=* \ No newline at end of file diff --git a/docs/FATE_On_Spark.md b/docs/FATE_On_Spark.md index 46c3eb290..6ded953e4 100644 --- a/docs/FATE_On_Spark.md +++ b/docs/FATE_On_Spark.md @@ -27,8 +27,6 @@ In current implementation, the `fate_flow` service uses the `spark-submit` binar "party_id": 10000 }, "job_parameters": { - "work_mode": 1, - "backend": 1, "spark_run": { "executor-memory": "4G", "total-executor-cores": 4 diff --git a/docs/FATE_On_Spark_With_Pulsar.md b/docs/FATE_On_Spark_With_Pulsar.md index aeb47cd38..a4ce9b0d6 100644 --- a/docs/FATE_On_Spark_With_Pulsar.md +++ b/docs/FATE_On_Spark_With_Pulsar.md @@ -70,8 +70,6 @@ When submitting a task, the user can declare in the config file to use Pulsar as "job_parameters": { "common": { "job_type": "train", - "work_mode": 1, - "backend": 2, "spark_run": { "num-executors": 1, "executor-cores": 2 diff --git a/docs/Manage_FATE_and_FATE-Serving_Version.md b/docs/Manage_FATE_and_FATE-Serving_Version.md index 4712028fe..fdff26324 100644 --- a/docs/Manage_FATE_and_FATE-Serving_Version.md +++ b/docs/Manage_FATE_and_FATE-Serving_Version.md @@ -30,18 +30,18 @@ The chart can be downloaded in each KubeFATE release, with name `fate-{release_v Download it and copy it to the folder to upload. ``` -$ kubefate chart upload -f ./fate-v1.3.0-a.tgz +$ kubefate chart upload -f ./fate-v1.8.0.tgz Upload file success $ kubefate chart ls UUID NAME VERSION APPVERSION -ca3f7843-749a-4f69-9f6b-4c544a7623ac fate v1.3.0-a v1.3.0 +ca3f7843-749a-4f69-9f6b-4c544a7623ac fate v1.8.0 v1.8.0 ``` -Then, we can deploy the fate cluster of v1.3.0-a version. The detail of cluster.yaml please refer to: [FATE Cluster Configuration](./configurations/FATE_cluster_configuration.md) +Then, we can deploy the fate cluster of v1.8.0 version. The detail of cluster.yaml please refer to: [FATE Cluster Configuration](./configurations/FATE_cluster_configuration.md) ``` chartName: fate -chartVersion: v1.3.0-a +chartVersion: v1.8.0 ``` We can delete the chart with: diff --git a/helm-charts/FATE-Exchange/Chart.yaml b/helm-charts/FATE-Exchange/Chart.yaml index a6ddaa5d8..26ce21b4e 100644 --- a/helm-charts/FATE-Exchange/Chart.yaml +++ b/helm-charts/FATE-Exchange/Chart.yaml @@ -1,5 +1,5 @@ apiVersion: v1 -appVersion: v1.7.2 +appVersion: v1.8.0 description: A Helm chart for fate exchange name: fate-exchange -version: v1.7.2 +version: v1.8.0 diff --git a/helm-charts/FATE-Exchange/values-template-example.yaml b/helm-charts/FATE-Exchange/values-template-example.yaml index 232e84e06..7e4d068c3 100644 --- a/helm-charts/FATE-Exchange/values-template-example.yaml +++ b/helm-charts/FATE-Exchange/values-template-example.yaml @@ -1,10 +1,10 @@ name: fate-exchange namespace: fate-exchange chartName: fate-exchange -chartVersion: v1.7.2 +chartVersion: v1.8.0 partyId: 1 registry: "" -imageTag: "1.7.2-release" +imageTag: "1.8.0-release" pullPolicy: imagePullSecrets: - name: myregistrykey diff --git a/helm-charts/FATE-Exchange/values-template.yaml b/helm-charts/FATE-Exchange/values-template.yaml index c8e8a78e7..e89ae3c3d 100644 --- a/helm-charts/FATE-Exchange/values-template.yaml +++ b/helm-charts/FATE-Exchange/values-template.yaml @@ -4,7 +4,7 @@ partyName: {{ .name }} image: registry: {{ .registry | default "federatedai" }} isThridParty: {{ empty .registry | ternary "false" "true" }} - tag: {{ .imageTag | default "1.7.2-release" }} + tag: {{ .imageTag | default "1.8.0-release" }} pullPolicy: {{ .pullPolicy | default "IfNotPresent" }} {{- with .imagePullSecrets }} imagePullSecrets: diff --git a/helm-charts/FATE-Exchange/values.yaml b/helm-charts/FATE-Exchange/values.yaml index bfeb6cca0..0ba13c2d4 100644 --- a/helm-charts/FATE-Exchange/values.yaml +++ b/helm-charts/FATE-Exchange/values.yaml @@ -4,7 +4,7 @@ partyName: fate-exchange image: registry: federatedai isThridParty: - tag: 1.7.2-release + tag: 1.8.0-release pullPolicy: IfNotPresent imagePullSecrets: # - name: diff --git a/helm-charts/FATE/Chart.yaml b/helm-charts/FATE/Chart.yaml index e0ee72e85..6f323acda 100644 --- a/helm-charts/FATE/Chart.yaml +++ b/helm-charts/FATE/Chart.yaml @@ -1,8 +1,8 @@ apiVersion: v1 -appVersion: v1.7.2 +appVersion: v1.8.0 description: A Helm chart for fate-training name: fate -version: v1.7.2-a +version: v1.8.0 home: https://fate.fedai.org icon: https://aisp-1251170195.cos.ap-hongkong.myqcloud.com/wp-content/uploads/sites/12/2019/09/logo.png sources: diff --git a/helm-charts/FATE/templates/backends/eggroll/nodemanager/deployment.yaml b/helm-charts/FATE/templates/backends/eggroll/nodemanager/deployment.yaml index f0a274b4d..6fe7b84a2 100644 --- a/helm-charts/FATE/templates/backends/eggroll/nodemanager/deployment.yaml +++ b/helm-charts/FATE/templates/backends/eggroll/nodemanager/deployment.yaml @@ -94,7 +94,7 @@ spec: - mountPath: /data/projects/fate/eggroll/conf/eggroll.properties name: nodemanager-confs subPath: eggroll.properties - - mountPath: /data/projects/fate/fate/conf/ + - mountPath: /data/projects/fate/conf/ name: python-confs - name: data-dir mountPath: /data/projects/fate/eggroll/data diff --git a/helm-charts/FATE/templates/core/fateboard/configmap.yaml b/helm-charts/FATE/templates/core/fateboard/configmap.yaml index 63cea12f2..023372cd8 100644 --- a/helm-charts/FATE/templates/core/fateboard/configmap.yaml +++ b/helm-charts/FATE/templates/core/fateboard/configmap.yaml @@ -21,30 +21,22 @@ data: application.properties: | server.port=8080 fateflow.url=http://{{ if .Values.istio.enabled }}127.0.0.1{{ else }}fateflow{{ end }}:9380 - spring.datasource.driver-Class-Name=com.mysql.cj.jdbc.Driver + fateflow.http_app_key= + fateflow.http_secret_key= spring.http.encoding.charset=UTF-8 spring.http.encoding.enabled=true server.tomcat.uri-encoding=UTF-8 - fateboard.datasource.jdbc-url=jdbc:mysql://{{ .Values.externalMysqlIp | default .Values.modules.mysql.ip | default "mysql" }}:{{ .Values.externalMysqlPort | default .Values.modules.mysql.port | default "3306" }}/{{ .Values.externalMysqlDatabase | default .Values.modules.mysql.database | default "eggroll_meta" }}?characterEncoding=utf8&characterSetResults=utf8&autoReconnect=true&failOverReadOnly=false&serverTimezone=GMT%2B8 - fateboard.datasource.username={{ .Values.externalMysqlUser | default .Values.modules.mysql.user | default "fate" }} - fateboard.datasource.password={{ .Values.externalMysqlPassword | default .Values.modules.mysql.password | default "fate_dev" }} + fateboard.front_end.cors=false + fateboard.front_end.url=http://localhost:8028 server.tomcat.max-threads=1000 server.tomcat.max-connections=20000 spring.servlet.multipart.max-file-size=10MB spring.servlet.multipart.max-request-size=100MB - spring.datasource.druid.filter.config.enabled=false - spring.datasource.druid.web-stat-filter.enabled=false - spring.datasource.druid.stat-view-servlet.enabled=false server.compression.enabled=true server.compression.mime-types=application/json,application/xml,text/html,text/xml,text/plain server.board.login.username={{ .Values.modules.fateboard.username }} server.board.login.password={{ .Values.modules.fateboard.password }} - #server.ssl.key-store=classpath: - #server.ssl.key-store-password= - #server.ssl.key-password= - #server.ssl.key-alias= - spring.session.store-type=jdbc - spring.session.jdbc.initialize-schema=always - #HTTP_APP_KEY= - #HTTP_SECRET_KEY= + server.servlet.session.timeout=4h + server.servlet.session.cookie.max-age=4h + management.endpoints.web.exposure.exclude=* {{- end }} \ No newline at end of file diff --git a/helm-charts/FATE/templates/core/python-spark.yaml b/helm-charts/FATE/templates/core/python-spark.yaml index 5ac999ef3..4bb5ec9e5 100644 --- a/helm-charts/FATE/templates/core/python-spark.yaml +++ b/helm-charts/FATE/templates/core/python-spark.yaml @@ -35,9 +35,9 @@ spec: {{- else }} initContainers: {{- if .Values.image.isThridParty }} - - image: {{ .Values.image.registry }}/mysql:8 + - image: {{ .Values.image.registry }}/mysql:8.0.28 {{- else }} - - image: mysql:8 + - image: mysql:8.0.28 {{- end }} imagePullPolicy: {{ .Values.image.pullPolicy }} name: ping-mysql diff --git a/helm-charts/FATE/values-template-example.yaml b/helm-charts/FATE/values-template-example.yaml index 85cd3ac7f..4362a48d9 100644 --- a/helm-charts/FATE/values-template-example.yaml +++ b/helm-charts/FATE/values-template-example.yaml @@ -1,10 +1,10 @@ name: fate-9999 namespace: fate-9999 chartName: fate -chartVersion: v1.7.2-a +chartVersion: v1.8.0 partyId: 9999 registry: "" -imageTag: "1.7.2-release" +imageTag: "1.8.0-release" pullPolicy: imagePullSecrets: - name: myregistrykey diff --git a/helm-charts/FATE/values-template.yaml b/helm-charts/FATE/values-template.yaml index 24361ccbd..aba25def6 100644 --- a/helm-charts/FATE/values-template.yaml +++ b/helm-charts/FATE/values-template.yaml @@ -2,7 +2,7 @@ image: registry: {{ .registry | default "federatedai" }} isThridParty: {{ empty .registry | ternary "false" "true" }} - tag: {{ .imageTag | default "1.7.2-release" }} + tag: {{ .imageTag | default "1.8.0-release" }} pullPolicy: {{ .pullPolicy | default "IfNotPresent" }} {{- with .imagePullSecrets }} imagePullSecrets: diff --git a/helm-charts/FATE/values.yaml b/helm-charts/FATE/values.yaml index e6349f7b9..519711c70 100644 --- a/helm-charts/FATE/values.yaml +++ b/helm-charts/FATE/values.yaml @@ -2,7 +2,7 @@ image: registry: federatedai isThridParty: - tag: 1.7.2-release + tag: 1.8.0-release pullPolicy: IfNotPresent imagePullSecrets: # - name: diff --git a/helm-charts/Images_list.md b/helm-charts/Images_list.md index 3f378e0a7..d27510697 100644 --- a/helm-charts/Images_list.md +++ b/helm-charts/Images_list.md @@ -1,15 +1,14 @@ -All images required to deploy the chart are recorded here. +# All images required to deploy the chart are recorded here. +## FATE - -FATE: - -- federatedai/python-spark:${version-tag} +- federatedai/python:${version-tag} - mysql:8 - federatedai/fateboard:${version-tag} - federatedai/client:${version-tag} - federatedai/eggroll:${version-tag} - fluent/fluentd:v1.12 +- federatedai/python-spark:${version-tag} - federatedai/spark-master:${version-tag} - federatedai/spark-worker:${version-tag} - federatedai/hadoop-datanode:2.0.0-hadoop2.7.4-java8 @@ -19,9 +18,7 @@ FATE: - federatedai/rabbitmq:3.8.3-management - federatedai/pulsar:2.7.0 - - -FATE-Serving +## FATE-Serving - federatedai/serving-server:${version-tag} - federatedai/serving-proxy:${version-tag} @@ -29,10 +26,8 @@ FATE-Serving - federatedai/serving-admin:${version-tag} - bitnami/zookeeper:3.7.0 - - -FATE-Exchange +## FATE-Exchange - federatedai/eggroll:${version-tag} - federatedai/trafficserver -- federatedai/nginx \ No newline at end of file +- federatedai/nginx:${version-tag} diff --git a/k8s-deploy/README.md b/k8s-deploy/README.md index 622aef2cb..5e95b694c 100644 --- a/k8s-deploy/README.md +++ b/k8s-deploy/README.md @@ -47,9 +47,9 @@ Suppose in an organization, there are two roles: Recommended version of dependent software: -Kubernetes: [v1.21.7](https://github.com/kubernetes/kubernetes/releases/tag/v1.21.7) +Kubernetes: [v1.23.5](https://github.com/kubernetes/kubernetes/releases/tag/v1.23.5) -Ingress-nginx: [v1.0.5](https://github.com/kubernetes/ingress-nginx/releases/tag/controller-v1.0.5) +Ingress-nginx: [v1.1.3](https://github.com/kubernetes/ingress-nginx/releases/tag/controller-v1.1.3) #### Creating role, namespace and other resource in Kubernetes The example yaml can be found in [rbac-config.yaml](./rbac-config.yaml). In this example, we create a kube-fate namespace for KubeFATE service. Resource constraints can be applied to kube-fate namespace, refer to [Kubernetes Namespace](https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/), [Configure Memory and CPU Quotas for Namespace](https://kubernetes.io/docs/tasks/administer-cluster/manage-resources/quota-memory-cpu-namespace/). @@ -104,72 +104,127 @@ Next, install the FATE cluster, ``` $ kubefate cluster install -f ./cluster.yaml -create job success, job id=fe846176-0787-4879-9d27-622692ce181c +create job success, job id=d92d7a56-7002-46a4-9363-da9c7346e05a ``` *NOTE: If you want to deploy **FATE on Spark**, you can use `cluster-spark.yaml`.* #### Checking the status of "Installing Cluster" job After the above command has finished, a job is created for installing a FATE cluster. Run the command `kubefate job describe` to check the status of the job, until the "Status" turns to `Success`. -``` -$ kubefate job describe fe846176-0787-4879-9d27-622692ce181c -StartTime 2020-11-13 07:22:53 -EndTime 2020-11-13 07:23:35 -Duration 42s -Status Success -Creator admin -ClusterId 27e37a60-fffb-4031-a76f-990b2ff43cf2 -States - update job status to Running - - create cluster in DB Success - - overwrite current installation - - helm install success - - checkout cluster status [28] - - job run Success -SubJobs clustermanager PodStatus: Running, SubJobStatus: Success, Duration: 6s, StartTime: 2020-11-13 07:22:53, EndTime: 2020-11-13 07:22:59 - fateboard PodStatus: Running, SubJobStatus: Success, Duration: 1s, StartTime: 2020-11-13 07:22:53, EndTime: 2020-11-13 07:22:55 - mysql PodStatus: Running, SubJobStatus: Success, Duration: 8s, StartTime: 2020-11-13 07:22:53, EndTime: 2020-11-13 07:23:01 - nodemanager-0 PodStatus: Running, SubJobStatus: Success, Duration: 8s, StartTime: 2020-11-13 07:22:53, EndTime: 2020-11-13 07:23:01 - nodemanager-1 PodStatus: Running, SubJobStatus: Success, Duration: 8s, StartTime: 2020-11-13 07:22:53, EndTime: 2020-11-13 07:23:01 - python PodStatus: Running, SubJobStatus: Success, Duration: 1s, StartTime: 2020-11-13 07:22:53, EndTime: 2020-11-13 07:22:55 - rollsite PodStatus: Running, SubJobStatus: Success, Duration: 8s, StartTime: 2020-11-13 07:22:53, EndTime: 2020-11-13 07:23:01 - client PodStatus: Running, SubJobStatus: Success, Duration: 42s, StartTime: 2020-11-13 07:22:53, EndTime: 2020-11-13 07:23:35 +```bash +$ kubefate job describe d92d7a56-7002-46a4-9363-da9c7346e05a +UUID d92d7a56-7002-46a4-9363-da9c7346e05a +StartTime 2022-04-12 07:34:09 +EndTime 2022-04-12 07:48:14 +Duration 14m +Status Success +Creator admin +ClusterId 24bb75ff-f636-4c64-8c04-1b9073f89a2f +States - update job status to Running + - create Cluster in DB Success + - helm install Success + - checkout Cluster status [794] + - job run Success + +SubJobs nodemanager-0 ModuleStatus: Available, SubJobStatus: Success, Duration: 13m, StartTime: + 2022-04-12 07:34:09, EndTime: 2022-04-12 07:47:26 + nodemanager-1 ModuleStatus: Available, SubJobStatus: Success, Duration: 13m, StartTime: + 2022-04-12 07:34:09, EndTime: 2022-04-12 07:47:18 + python ModuleStatus: Available, SubJobStatus: Success, Duration: 14m, StartTime: + 2022-04-12 07:34:09, EndTime: 2022-04-12 07:48:14 + rollsite ModuleStatus: Available, SubJobStatus: Success, Duration: 13m, StartTime: + 2022-04-12 07:34:09, EndTime: 2022-04-12 07:47:24 + client ModuleStatus: Available, SubJobStatus: Success, Duration: 11m, StartTime: + 2022-04-12 07:34:09, EndTime: 2022-04-12 07:45:22 + clustermanager ModuleStatus: Available, SubJobStatus: Success, Duration: 13m, StartTime: + 2022-04-12 07:34:09, EndTime: 2022-04-12 07:47:11 + mysql ModuleStatus: Available, SubJobStatus: Success, Duration: 13m, StartTime: + 2022-04-12 07:34:09, EndTime: 2022-04-12 07:47:11 ``` #### Describing the cluster and finding FATE access information After the `installing cluster` job succeeded, use `kubefate cluster describe` to check the FATE access information: -``` -$ kubefate cluster describe 27e37a60-fffb-4031-a76f-990b2ff43cf2 -UUID 27e37a60-fffb-4031-a76f-990b2ff43cf2 -Name fate-9999 -NameSpace fate-9999 -ChartName fate -ChartVersion v1.5.0 -REVISION 1 -Age 92s -Status Running -Spec name: fate-9999 - namespace: fate-9999 - chartName: fate - chartVersion: v1.5.0 - partyId: 9999 - ...... - -Info dashboard: - - party9999.notebook.example.com - - party9999.fateboard.example.com - ip: 192.168.0.1 - pod: - - clustermanager-78f98b85bf-ph2hv - ...... - status: - modules: - client: Running - clustermanager: Running - fateboard: Running - mysql: Running - nodemanager-0: Running - nodemanager-1: Running - python: Running - rollsite: Running +```bash +$ kubefate cluster describe 24bb75ff-f636-4c64-8c04-1b9073f89a2f +UUID 24bb75ff-f636-4c64-8c04-1b9073f89a2f +Name fate-9999 +NameSpace fate-9999 +ChartName fate +ChartVersion v1.8.0 +Revision 1 +Age 44h +Status Running +Spec backend: eggroll + chartName: fate + chartVersion: v1.8.0 + imagePullSecrets: + - name: myregistrykey + imageTag: 1.8.0-release + ingress: + client: + hosts: + - name: party9999.notebook.example.com + fateboard: + hosts: + - name: party9999.fateboard.example.com + ingressClassName: nginx + istio: + enabled: false + modules: + - rollsite + - clustermanager + - nodemanager + - mysql + - python + - fateboard + - client + name: fate-9999 + namespace: fate-9999 + partyId: 9999 + persistence: false + podSecurityPolicy: + enabled: false + pullPolicy: null + python: + grpcNodePort: 30092 + httpNodePort: 30097 + logLevel: INFO + type: NodePort + registry: "" + rollsite: + nodePort: 30091 + partyList: + - partyId: 10000 + partyIp: 192.168.10.1 + partyPort: 30101 + type: NodePort + servingIp: 192.168.9.2 + servingPort: 30095 + +Info dashboard: + - party9999.notebook.example.com + - party9999.fateboard.example.com + ip: 192.168.9.1 + port: 30091 + status: + containers: + client: Running + clustermanager: Running + fateboard: Running + mysql: Running + nodemanager-0: Running + nodemanager-0-eggrollpair: Running + nodemanager-1: Running + nodemanager-1-eggrollpair: Running + python: Running + rollsite: Running + deployments: + client: Available + clustermanager: Available + mysql: Available + nodemanager-0: Available + nodemanager-1: Available + python: Available + rollsite: Available ``` #### Access the UI of FATEBoard and Notebook diff --git a/k8s-deploy/README_zh.md b/k8s-deploy/README_zh.md index b221199e3..9ae44c30f 100644 --- a/k8s-deploy/README_zh.md +++ b/k8s-deploy/README_zh.md @@ -46,9 +46,9 @@ KubeFATE在设计上分离了服务与FATE集群的配置(基于Helm Chart), 依赖软件的建议版本: -Kubernetes: [v1.21.7](https://github.com/kubernetes/kubernetes/releases/tag/v1.21.7) +Kubernetes: [v1.23.5](https://github.com/kubernetes/kubernetes/releases/tag/v1.23.5) -Ingress-nginx: [v1.0.5](https://github.com/kubernetes/ingress-nginx/releases/tag/controller-v1.0.5) +Ingress-nginx: [v1.1.3](https://github.com/kubernetes/ingress-nginx/releases/tag/controller-v1.1.3) #### 创建Kubernetes服务账号、namespace等 我们的发布包提供了[rbac-config.yaml](./rbac-config.yaml)作为样例。但是现实使用请与系统管理员确认权限问题,以及商量资源配额。更多请参考[Kubernetes Namespace](https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/)和[Configure Memory and CPU Quotas for Namespace](https://kubernetes.io/docs/tasks/administer-cluster/manage-resources/quota-memory-cpu-namespace/)。 @@ -106,7 +106,7 @@ registry: "hub.c.163.com/federatedai" ``` $ kubefate cluster install -f ./cluster.yaml -create job success, job id=fe846176-0787-4879-9d27-622692ce181c +create job success, job id=d92d7a56-7002-46a4-9363-da9c7346e05a ``` *如果想要部署使用 **Spark** 计算引擎的FATE集群,可以使用`cluster-spark.yaml`。* @@ -114,66 +114,121 @@ create job success, job id=fe846176-0787-4879-9d27-622692ce181c #### 检查安装集群任务的状态 上面的命令会创建一个安装FATE集群的任务,用于异步部署。使用```kubefate job describe```命令可以检查任务的状态,直到看到结果为`install success` -``` -$ kubefate job describe fe846176-0787-4879-9d27-622692ce181c -StartTime 2020-11-13 07:22:53 -EndTime 2020-11-13 07:23:35 -Duration 42s -Status Success -Creator admin -ClusterId 27e37a60-fffb-4031-a76f-990b2ff43cf2 -States - update job status to Running - - create cluster in DB Success - - overwrite current installation - - helm install success - - checkout cluster status [28] - - job run Success -SubJobs clustermanager PodStatus: Running, SubJobStatus: Success, Duration: 6s, StartTime: 2020-11-13 07:22:53, EndTime: 2020-11-13 07:22:59 - fateboard PodStatus: Running, SubJobStatus: Success, Duration: 1s, StartTime: 2020-11-13 07:22:53, EndTime: 2020-11-13 07:22:55 - mysql PodStatus: Running, SubJobStatus: Success, Duration: 8s, StartTime: 2020-11-13 07:22:53, EndTime: 2020-11-13 07:23:01 - nodemanager-0 PodStatus: Running, SubJobStatus: Success, Duration: 8s, StartTime: 2020-11-13 07:22:53, EndTime: 2020-11-13 07:23:01 - nodemanager-1 PodStatus: Running, SubJobStatus: Success, Duration: 8s, StartTime: 2020-11-13 07:22:53, EndTime: 2020-11-13 07:23:01 - python PodStatus: Running, SubJobStatus: Success, Duration: 1s, StartTime: 2020-11-13 07:22:53, EndTime: 2020-11-13 07:22:55 - rollsite PodStatus: Running, SubJobStatus: Success, Duration: 8s, StartTime: 2020-11-13 07:22:53, EndTime: 2020-11-13 07:23:01 - client PodStatus: Running, SubJobStatus: Success, Duration: 42s, StartTime: 2020-11-13 07:22:53, EndTime: 2020-11-13 07:23:35 +```bash +$ kubefate job describe d92d7a56-7002-46a4-9363-da9c7346e05a +UUID d92d7a56-7002-46a4-9363-da9c7346e05a +StartTime 2022-04-12 07:34:09 +EndTime 2022-04-12 07:48:14 +Duration 14m +Status Success +Creator admin +ClusterId 24bb75ff-f636-4c64-8c04-1b9073f89a2f +States - update job status to Running + - create Cluster in DB Success + - helm install Success + - checkout Cluster status [794] + - job run Success + +SubJobs nodemanager-0 ModuleStatus: Available, SubJobStatus: Success, Duration: 13m, StartTime: + 2022-04-12 07:34:09, EndTime: 2022-04-12 07:47:26 + nodemanager-1 ModuleStatus: Available, SubJobStatus: Success, Duration: 13m, StartTime: + 2022-04-12 07:34:09, EndTime: 2022-04-12 07:47:18 + python ModuleStatus: Available, SubJobStatus: Success, Duration: 14m, StartTime: + 2022-04-12 07:34:09, EndTime: 2022-04-12 07:48:14 + rollsite ModuleStatus: Available, SubJobStatus: Success, Duration: 13m, StartTime: + 2022-04-12 07:34:09, EndTime: 2022-04-12 07:47:24 + client ModuleStatus: Available, SubJobStatus: Success, Duration: 11m, StartTime: + 2022-04-12 07:34:09, EndTime: 2022-04-12 07:45:22 + clustermanager ModuleStatus: Available, SubJobStatus: Success, Duration: 13m, StartTime: + 2022-04-12 07:34:09, EndTime: 2022-04-12 07:47:11 + mysql ModuleStatus: Available, SubJobStatus: Success, Duration: 13m, StartTime: + 2022-04-12 07:34:09, EndTime: 2022-04-12 07:47:11 ``` #### 描述集群的情况,以及FATE集群访问信息 当我们看到上面命令的返回结果出现`install success`,就可以使用```kubefate cluster describe```查看FATE集群的访问信息 -``` -$ kubefate cluster describe 27e37a60-fffb-4031-a76f-990b2ff43cf2 -UUID 27e37a60-fffb-4031-a76f-990b2ff43cf2 -Name fate-9999 -NameSpace fate-9999 -ChartName fate -ChartVersion v1.5.0 -REVISION 1 -Age 92s -Status Running -Spec name: fate-9999 - namespace: fate-9999 - chartName: fate - chartVersion: v1.5.0 - partyId: 9999 - ...... - -Info dashboard: - - party9999.notebook.example.com - - party9999.fateboard.example.com - ip: 192.168.0.1 - pod: - - clustermanager-78f98b85bf-ph2hv - ...... - status: - modules: - client: Running - clustermanager: Running - fateboard: Running - mysql: Running - nodemanager-0: Running - nodemanager-1: Running - python: Running - rollsite: Running +```bash +$ kubefate cluster describe 24bb75ff-f636-4c64-8c04-1b9073f89a2f +UUID 24bb75ff-f636-4c64-8c04-1b9073f89a2f +Name fate-9999 +NameSpace fate-9999 +ChartName fate +ChartVersion v1.8.0 +Revision 1 +Age 44h +Status Running +Spec backend: eggroll + chartName: fate + chartVersion: v1.8.0 + imagePullSecrets: + - name: myregistrykey + imageTag: 1.8.0-release + ingress: + client: + hosts: + - name: party9999.notebook.example.com + fateboard: + hosts: + - name: party9999.fateboard.example.com + ingressClassName: nginx + istio: + enabled: false + modules: + - rollsite + - clustermanager + - nodemanager + - mysql + - python + - fateboard + - client + name: fate-9999 + namespace: fate-9999 + partyId: 9999 + persistence: false + podSecurityPolicy: + enabled: false + pullPolicy: null + python: + grpcNodePort: 30092 + httpNodePort: 30097 + logLevel: INFO + type: NodePort + registry: "" + rollsite: + nodePort: 30091 + partyList: + - partyId: 10000 + partyIp: 192.168.10.1 + partyPort: 30101 + type: NodePort + servingIp: 192.168.9.2 + servingPort: 30095 + +Info dashboard: + - party9999.notebook.example.com + - party9999.fateboard.example.com + ip: 192.168.9.1 + port: 30091 + status: + containers: + client: Running + clustermanager: Running + fateboard: Running + mysql: Running + nodemanager-0: Running + nodemanager-0-eggrollpair: Running + nodemanager-1: Running + nodemanager-1-eggrollpair: Running + python: Running + rollsite: Running + deployments: + client: Available + clustermanager: Available + mysql: Available + nodemanager-0: Available + nodemanager-1: Available + python: Available + rollsite: Available ``` #### 访问 FATEBoard 和 Notebook UI diff --git a/k8s-deploy/cluster-spark-pulsar.yaml b/k8s-deploy/cluster-spark-pulsar.yaml index 5a4ce8661..2df64d707 100644 --- a/k8s-deploy/cluster-spark-pulsar.yaml +++ b/k8s-deploy/cluster-spark-pulsar.yaml @@ -1,10 +1,10 @@ name: fate-9999 namespace: fate-9999 chartName: fate -chartVersion: v1.7.2 +chartVersion: v1.8.0 partyId: 9999 registry: "" -imageTag: "1.7.2-release" +imageTag: "1.8.0-release" pullPolicy: imagePullSecrets: - name: myregistrykey diff --git a/k8s-deploy/cluster-spark-rabbitmq.yaml b/k8s-deploy/cluster-spark-rabbitmq.yaml index e51ebd743..9b42eac54 100644 --- a/k8s-deploy/cluster-spark-rabbitmq.yaml +++ b/k8s-deploy/cluster-spark-rabbitmq.yaml @@ -1,10 +1,10 @@ name: fate-9999 namespace: fate-9999 chartName: fate -chartVersion: v1.7.2 +chartVersion: v1.8.0 partyId: 9999 registry: "" -imageTag: "1.7.2-release" +imageTag: "1.8.0-release" pullPolicy: imagePullSecrets: - name: myregistrykey diff --git a/k8s-deploy/cluster-spark-slim.yaml b/k8s-deploy/cluster-spark-slim.yaml index fcd37eb87..57cd4a953 100644 --- a/k8s-deploy/cluster-spark-slim.yaml +++ b/k8s-deploy/cluster-spark-slim.yaml @@ -1,10 +1,10 @@ name: fate-9999 namespace: fate-9999 chartName: fate -chartVersion: v1.7.2 +chartVersion: v1.8.0 partyId: 9999 registry: "" -imageTag: "1.7.2-release" +imageTag: "1.8.0-release" pullPolicy: imagePullSecrets: - name: myregistrykey diff --git a/k8s-deploy/cluster.yaml b/k8s-deploy/cluster.yaml index 8f019ca46..f19220a52 100644 --- a/k8s-deploy/cluster.yaml +++ b/k8s-deploy/cluster.yaml @@ -1,10 +1,10 @@ name: fate-9999 namespace: fate-9999 chartName: fate -chartVersion: v1.7.2 +chartVersion: v1.8.0 partyId: 9999 registry: "" -imageTag: "1.7.2-release" +imageTag: "1.8.0-release" pullPolicy: imagePullSecrets: - name: myregistrykey diff --git a/k8s-deploy/docs/docs.go b/k8s-deploy/docs/docs.go index 73fe8c218..71c406446 100644 --- a/k8s-deploy/docs/docs.go +++ b/k8s-deploy/docs/docs.go @@ -10,7 +10,6 @@ const docTemplate = `{ "info": { "description": "{{escape .Description}}", "title": "{{.Title}}", - "termsOfService": "http://swagger.io/terms/", "contact": { "name": "API Support", "url": "https://github.com/FederatedAI/KubeFATE" diff --git a/k8s-deploy/docs/swagger.json b/k8s-deploy/docs/swagger.json index d059357ce..d08ef1b26 100644 --- a/k8s-deploy/docs/swagger.json +++ b/k8s-deploy/docs/swagger.json @@ -3,7 +3,6 @@ "info": { "description": "This is a KubeFATE.", "title": "KubeFATE service API", - "termsOfService": "http://swagger.io/terms/", "contact": { "name": "API Support", "url": "https://github.com/FederatedAI/KubeFATE" diff --git a/k8s-deploy/docs/swagger.yaml b/k8s-deploy/docs/swagger.yaml index 81ab4a968..407da5adb 100644 --- a/k8s-deploy/docs/swagger.yaml +++ b/k8s-deploy/docs/swagger.yaml @@ -256,7 +256,6 @@ info: license: name: Apache 2.0 url: http://www.apache.org/licenses/LICENSE-2.0.html - termsOfService: http://swagger.io/terms/ title: KubeFATE service API version: v1 paths: diff --git a/k8s-deploy/examples/config.sh b/k8s-deploy/examples/config.sh index 9603a4693..6598d50c3 100644 --- a/k8s-deploy/examples/config.sh +++ b/k8s-deploy/examples/config.sh @@ -2,82 +2,100 @@ source party.config -echo ${fate_chartVersion} -echo ${fate_imageTAG} -echo ${fate_serving_chartVersion} -echo ${fate_serving_imageTAG} -echo ${party_9999_IP} -echo ${party_10000_IP} -echo ${party_exchange_IP} - +echo "FATE chartVersion: "${fate_chartVersion} +echo "FATE imageTAG: "${fate_imageTAG} +echo "FATE-Serving chartVersion: "${fate_serving_chartVersion} +echo "FATE-Serving_imageTAG: "${fate_serving_imageTAG} +echo "Party 9999 IP: "${party_9999_IP} +echo "Party 10000 IP: "${party_10000_IP} +echo "Party exchange IP: "${party_exchange_IP} + +# Compatible with Mac +SED=sed +unamestr=`uname` +if [[ "$unamestr" == "Darwin" ]] ; then + SED=gsed + type $SED >/dev/null 2>&1 || { + echo >&2 "$SED it's not installed. Try: brew install gnu-sed" ; + exit 1; + } +fi # 9999 config -sed -i "" "s/chartVersion: .*/chartVersion: ${fate_chartVersion}/g" party-9999/cluster.yaml -sed -i "" "s/chartVersion: .*/chartVersion: ${fate_serving_chartVersion}/g" ./party-9999/cluster-serving.yaml -sed -i "" "s/chartVersion: .*/chartVersion: ${fate_chartVersion}/g" ./party-9999/cluster-spark-rabbitmq.yaml -sed -i "" "s/chartVersion: .*/chartVersion: ${fate_chartVersion}/g" ./party-9999/cluster-spark-pulsar.yaml - -sed -i "" "s/imageTag: .*/imageTag: ${fate_imageTAG}/g" ./party-9999/cluster.yaml -sed -i "" "s/imageTag: .*/imageTag: ${fate_serving_imageTAG}/g" ./party-9999/cluster-serving.yaml -sed -i "" "s/imageTag: .*/imageTag: ${fate_imageTAG}/g" ./party-9999/cluster-spark-rabbitmq.yaml -sed -i "" "s/imageTag: .*/imageTag: ${fate_imageTAG}/g" ./party-9999/cluster-spark-pulsar.yaml - - -sed -i "" "s/192.168.9.1/${party_9999_IP}/g" ./party-9999/cluster.yaml -sed -i "" "s/192.168.9.1/${party_9999_IP}/g" ./party-9999/cluster-serving.yaml -sed -i "" "s/192.168.9.1/${party_9999_IP}/g" ./party-9999/cluster-spark-rabbitmq.yaml -sed -i "" "s/192.168.9.1/${party_9999_IP}/g" ./party-9999/cluster-spark-pulsar.yaml - -sed -i "" "s/192.168.10.1/${party_10000_IP}/g" ./party-9999/cluster.yaml -sed -i "" "s/192.168.10.1/${party_10000_IP}/g" ./party-9999/cluster-serving.yaml -sed -i "" "s/192.168.10.1/${party_10000_IP}/g" ./party-9999/cluster-spark-rabbitmq.yaml -sed -i "" "s/192.168.10.1/${party_10000_IP}/g" ./party-9999/cluster-spark-pulsar.yaml - -sed -i "" "s/192.168.0.1/${party_exchange_IP}/g" ./party-9999/cluster.yaml -sed -i "" "s/192.168.0.1/${party_exchange_IP}/g" ./party-9999/cluster-serving.yaml -sed -i "" "s/192.168.0.1/${party_exchange_IP}/g" ./party-9999/cluster-spark-rabbitmq.yaml -sed -i "" "s/192.168.0.1/${party_exchange_IP}/g" ./party-9999/cluster-spark-pulsar.yaml +$SED -i "s/chartVersion: .*/chartVersion: ${fate_chartVersion}/g" party-9999/cluster.yaml +$SED -i "s/chartVersion: .*/chartVersion: ${fate_serving_chartVersion}/g" ./party-9999/cluster-serving.yaml +$SED -i "s/chartVersion: .*/chartVersion: ${fate_chartVersion}/g" ./party-9999/cluster-spark-rabbitmq.yaml +$SED -i "s/chartVersion: .*/chartVersion: ${fate_chartVersion}/g" ./party-9999/cluster-spark-pulsar.yaml +$SED -i "s/chartVersion: .*/chartVersion: ${fate_chartVersion}/g" ./party-9999/cluster-spark-local-pulsar.yaml + +$SED -i "s/imageTag: .*/imageTag: ${fate_imageTAG}/g" ./party-9999/cluster.yaml +$SED -i "s/imageTag: .*/imageTag: ${fate_serving_imageTAG}/g" ./party-9999/cluster-serving.yaml +$SED -i "s/imageTag: .*/imageTag: ${fate_imageTAG}/g" ./party-9999/cluster-spark-rabbitmq.yaml +$SED -i "s/imageTag: .*/imageTag: ${fate_imageTAG}/g" ./party-9999/cluster-spark-pulsar.yaml +$SED -i "s/imageTag: .*/imageTag: ${fate_imageTAG}/g" ./party-9999/cluster-spark-local-pulsar.yaml + +$SED -i "s/192.168.9.1/${party_9999_IP}/g" ./party-9999/cluster.yaml +$SED -i "s/192.168.9.1/${party_9999_IP}/g" ./party-9999/cluster-serving.yaml +$SED -i "s/192.168.9.1/${party_9999_IP}/g" ./party-9999/cluster-spark-rabbitmq.yaml +$SED -i "s/192.168.9.1/${party_9999_IP}/g" ./party-9999/cluster-spark-pulsar.yaml +$SED -i "s/192.168.9.1/${party_9999_IP}/g" ./party-9999/cluster-spark-local-pulsar.yaml + +$SED -i "s/192.168.10.1/${party_10000_IP}/g" ./party-9999/cluster.yaml +$SED -i "s/192.168.10.1/${party_10000_IP}/g" ./party-9999/cluster-serving.yaml +$SED -i "s/192.168.10.1/${party_10000_IP}/g" ./party-9999/cluster-spark-rabbitmq.yaml +$SED -i "s/192.168.10.1/${party_10000_IP}/g" ./party-9999/cluster-spark-pulsar.yaml +$SED -i "s/192.168.10.1/${party_10000_IP}/g" ./party-9999/cluster-spark-local-pulsar.yaml + +$SED -i "s/192.168.0.1/${party_exchange_IP}/g" ./party-9999/cluster.yaml +$SED -i "s/192.168.0.1/${party_exchange_IP}/g" ./party-9999/cluster-serving.yaml +$SED -i "s/192.168.0.1/${party_exchange_IP}/g" ./party-9999/cluster-spark-rabbitmq.yaml +$SED -i "s/192.168.0.1/${party_exchange_IP}/g" ./party-9999/cluster-spark-pulsar.yaml +$SED -i "s/192.168.0.1/${party_exchange_IP}/g" ./party-9999/cluster-spark-local-pulsar.yaml # 10000 config -sed -i "" "s/chartVersion: .*/chartVersion: ${fate_chartVersion}/g" ./party-10000/cluster.yaml -sed -i "" "s/chartVersion: .*/chartVersion: ${fate_serving_chartVersion}/g" ./party-10000/cluster-serving.yaml -sed -i "" "s/chartVersion: .*/chartVersion: ${fate_chartVersion}/g" ./party-10000/cluster-spark-rabbitmq.yaml -sed -i "" "s/chartVersion: .*/chartVersion: ${fate_chartVersion}/g" ./party-10000/cluster-spark-pulsar.yaml - -sed -i "" "s/imageTag: .*/imageTag: ${fate_imageTAG}/g" ./party-10000/cluster.yaml -sed -i "" "s/imageTag: .*/imageTag: ${fate_serving_imageTAG}/g" ./party-10000/cluster-serving.yaml -sed -i "" "s/imageTag: .*/imageTag: ${fate_imageTAG}/g" ./party-10000/cluster-spark-rabbitmq.yaml -sed -i "" "s/imageTag: .*/imageTag: ${fate_imageTAG}/g" ./party-10000/cluster-spark-pulsar.yaml - -sed -i "" "s/192.168.9.1/${party_9999_IP}/g" ./party-10000/cluster.yaml -sed -i "" "s/192.168.9.1/${party_9999_IP}/g" ./party-10000/cluster-serving.yaml -sed -i "" "s/192.168.9.1/${party_9999_IP}/g" ./party-10000/cluster-spark-rabbitmq.yaml -sed -i "" "s/192.168.9.1/${party_9999_IP}/g" ./party-10000/cluster-spark-pulsar.yaml - -sed -i "" "s/192.168.10.1/${party_10000_IP}/g" ./party-10000/cluster.yaml -sed -i "" "s/192.168.10.1/${party_10000_IP}/g" ./party-10000/cluster-serving.yaml -sed -i "" "s/192.168.10.1/${party_10000_IP}/g" ./party-10000/cluster-spark-rabbitmq.yaml -sed -i "" "s/192.168.10.1/${party_10000_IP}/g" ./party-10000/cluster-spark-pulsar.yaml - -sed -i "" "s/192.168.0.1/${party_exchange_IP}/g" ./party-10000/cluster.yaml -sed -i "" "s/192.168.0.1/${party_exchange_IP}/g" ./party-10000/cluster-serving.yaml -sed -i "" "s/192.168.0.1/${party_exchange_IP}/g" ./party-10000/cluster-spark-rabbitmq.yaml -sed -i "" "s/192.168.0.1/${party_exchange_IP}/g" ./party-10000/cluster-spark-pulsar.yaml - +$SED -i "s/chartVersion: .*/chartVersion: ${fate_chartVersion}/g" ./party-10000/cluster.yaml +$SED -i "s/chartVersion: .*/chartVersion: ${fate_serving_chartVersion}/g" ./party-10000/cluster-serving.yaml +$SED -i "s/chartVersion: .*/chartVersion: ${fate_chartVersion}/g" ./party-10000/cluster-spark-rabbitmq.yaml +$SED -i "s/chartVersion: .*/chartVersion: ${fate_chartVersion}/g" ./party-10000/cluster-spark-pulsar.yaml +$SED -i "s/chartVersion: .*/chartVersion: ${fate_chartVersion}/g" ./party-10000/cluster-spark-local-pulsar.yaml + +$SED -i "s/imageTag: .*/imageTag: ${fate_imageTAG}/g" ./party-10000/cluster.yaml +$SED -i "s/imageTag: .*/imageTag: ${fate_serving_imageTAG}/g" ./party-10000/cluster-serving.yaml +$SED -i "s/imageTag: .*/imageTag: ${fate_imageTAG}/g" ./party-10000/cluster-spark-rabbitmq.yaml +$SED -i "s/imageTag: .*/imageTag: ${fate_imageTAG}/g" ./party-10000/cluster-spark-pulsar.yaml +$SED -i "s/imageTag: .*/imageTag: ${fate_imageTAG}/g" ./party-10000/cluster-spark-local-pulsar.yaml + +$SED -i "s/192.168.9.1/${party_9999_IP}/g" ./party-10000/cluster.yaml +$SED -i "s/192.168.9.1/${party_9999_IP}/g" ./party-10000/cluster-serving.yaml +$SED -i "s/192.168.9.1/${party_9999_IP}/g" ./party-10000/cluster-spark-rabbitmq.yaml +$SED -i "s/192.168.9.1/${party_9999_IP}/g" ./party-10000/cluster-spark-pulsar.yaml +$SED -i "s/192.168.9.1/${party_9999_IP}/g" ./party-10000/cluster-spark-local-pulsar.yaml + +$SED -i "s/192.168.10.1/${party_10000_IP}/g" ./party-10000/cluster.yaml +$SED -i "s/192.168.10.1/${party_10000_IP}/g" ./party-10000/cluster-serving.yaml +$SED -i "s/192.168.10.1/${party_10000_IP}/g" ./party-10000/cluster-spark-rabbitmq.yaml +$SED -i "s/192.168.10.1/${party_10000_IP}/g" ./party-10000/cluster-spark-pulsar.yaml +$SED -i "s/192.168.10.1/${party_10000_IP}/g" ./party-10000/cluster-spark-local-pulsar.yaml + +$SED -i "s/192.168.0.1/${party_exchange_IP}/g" ./party-10000/cluster.yaml +$SED -i "s/192.168.0.1/${party_exchange_IP}/g" ./party-10000/cluster-serving.yaml +$SED -i "s/192.168.0.1/${party_exchange_IP}/g" ./party-10000/cluster-spark-rabbitmq.yaml +$SED -i "s/192.168.0.1/${party_exchange_IP}/g" ./party-10000/cluster-spark-pulsar.yaml +$SED -i "s/192.168.0.1/${party_exchange_IP}/g" ./party-10000/cluster-spark-local-pulsar.yaml # exchange config -sed -i "" "s/chartVersion: .*/chartVersion: ${chartVersion}/g" ./party-exchange/rollsite.yaml -sed -i "" "s/chartVersion: .*/chartVersion: ${chartVersion}/g" ./party-exchange/trafficServer.yaml +$SED -i "s/chartVersion: .*/chartVersion: ${chartVersion}/g" ./party-exchange/rollsite.yaml +$SED -i "s/chartVersion: .*/chartVersion: ${chartVersion}/g" ./party-exchange/trafficServer.yaml -sed -i "" "s/imageTag: .*/imageTag: ${fate_imageTAG}/g" ./party-exchange/rollsite.yaml -sed -i "" "s/imageTag: .*/imageTag: ${fate_imageTAG}/g" ./party-exchange/trafficServer.yaml +$SED -i "s/imageTag: .*/imageTag: ${fate_imageTAG}/g" ./party-exchange/rollsite.yaml +$SED -i "s/imageTag: .*/imageTag: ${fate_imageTAG}/g" ./party-exchange/trafficServer.yaml -sed -i "" "s/192.168.9.1/${party_9999_IP}/g" ./party-exchange/rollsite.yaml -sed -i "" "s/192.168.9.1/${party_9999_IP}/g" ./party-exchange/trafficServer.yaml +$SED -i "s/192.168.9.1/${party_9999_IP}/g" ./party-exchange/rollsite.yaml +$SED -i "s/192.168.9.1/${party_9999_IP}/g" ./party-exchange/trafficServer.yaml -sed -i "" "s/192.168.10.1/${party_10000_IP}/g" ./party-exchange/rollsite.yaml -sed -i "" "s/192.168.10.1/${party_10000_IP}/g" ./party-exchange/trafficServer.yaml +$SED -i "s/192.168.10.1/${party_10000_IP}/g" ./party-exchange/rollsite.yaml +$SED -i "s/192.168.10.1/${party_10000_IP}/g" ./party-exchange/trafficServer.yaml -sed -i "" "s/192.168.0.1/${party_exchange_IP}/g" ./party-exchange/rollsite.yaml -sed -i "" "s/192.168.0.1/${party_exchange_IP}/g" ./party-exchange/trafficServer.yaml +$SED -i "s/192.168.0.1/${party_exchange_IP}/g" ./party-exchange/rollsite.yaml +$SED -i "s/192.168.0.1/${party_exchange_IP}/g" ./party-exchange/trafficServer.yaml diff --git a/k8s-deploy/examples/party-10000/cluster-serving.yaml b/k8s-deploy/examples/party-10000/cluster-serving.yaml index d4d870bd5..67643c6cf 100644 --- a/k8s-deploy/examples/party-10000/cluster-serving.yaml +++ b/k8s-deploy/examples/party-10000/cluster-serving.yaml @@ -4,7 +4,7 @@ chartName: fate-serving chartVersion: v2.0.4 partyId: 10000 registry: "" -imageTag: "2.0.4-release" +imageTag: 2.0.4-release pullPolicy: imagePullSecrets: - name: myregistrykey diff --git a/k8s-deploy/examples/party-10000/cluster-spark-local-pulsar.yaml b/k8s-deploy/examples/party-10000/cluster-spark-local-pulsar.yaml index ac9b9f3aa..af6aac46a 100644 --- a/k8s-deploy/examples/party-10000/cluster-spark-local-pulsar.yaml +++ b/k8s-deploy/examples/party-10000/cluster-spark-local-pulsar.yaml @@ -1,10 +1,10 @@ name: fate-10000 namespace: fate-10000 chartName: fate -chartVersion: v1.7.2 +chartVersion: v1.8.0 partyId: 10000 registry: "" -imageTag: "1.7.2-release" +imageTag: 1.8.0-release pullPolicy: imagePullSecrets: - name: myregistrykey diff --git a/k8s-deploy/examples/party-10000/cluster-spark-pulsar.yaml b/k8s-deploy/examples/party-10000/cluster-spark-pulsar.yaml index 64b03237b..2c5104327 100644 --- a/k8s-deploy/examples/party-10000/cluster-spark-pulsar.yaml +++ b/k8s-deploy/examples/party-10000/cluster-spark-pulsar.yaml @@ -1,10 +1,10 @@ name: fate-10000 namespace: fate-10000 chartName: fate -chartVersion: v1.7.2 +chartVersion: v1.8.0 partyId: 10000 registry: "" -imageTag: "1.7.2-release" +imageTag: 1.8.0-release pullPolicy: imagePullSecrets: - name: myregistrykey diff --git a/k8s-deploy/examples/party-10000/cluster-spark-rabbitmq.yaml b/k8s-deploy/examples/party-10000/cluster-spark-rabbitmq.yaml index 4acb5d82b..59db94247 100644 --- a/k8s-deploy/examples/party-10000/cluster-spark-rabbitmq.yaml +++ b/k8s-deploy/examples/party-10000/cluster-spark-rabbitmq.yaml @@ -1,10 +1,10 @@ name: fate-10000 namespace: fate-10000 chartName: fate -chartVersion: v1.7.2 +chartVersion: v1.8.0 partyId: 10000 registry: "" -imageTag: "1.7.2-release" +imageTag: 1.8.0-release pullPolicy: imagePullSecrets: - name: myregistrykey diff --git a/k8s-deploy/examples/party-10000/cluster.yaml b/k8s-deploy/examples/party-10000/cluster.yaml index c0baddd7e..29d14a795 100644 --- a/k8s-deploy/examples/party-10000/cluster.yaml +++ b/k8s-deploy/examples/party-10000/cluster.yaml @@ -1,10 +1,10 @@ name: fate-10000 namespace: fate-10000 chartName: fate -chartVersion: v1.7.2 +chartVersion: v1.8.0 partyId: 10000 registry: "" -imageTag: "1.7.2-release" +imageTag: 1.8.0-release pullPolicy: imagePullSecrets: - name: myregistrykey diff --git a/k8s-deploy/examples/party-9999/cluster-serving.yaml b/k8s-deploy/examples/party-9999/cluster-serving.yaml index 2c2ff7367..778b1ff57 100644 --- a/k8s-deploy/examples/party-9999/cluster-serving.yaml +++ b/k8s-deploy/examples/party-9999/cluster-serving.yaml @@ -4,7 +4,7 @@ chartName: fate-serving chartVersion: v2.0.4 partyId: 9999 registry: "" -imageTag: "2.0.4-release" +imageTag: 2.0.4-release pullPolicy: imagePullSecrets: - name: myregistrykey diff --git a/k8s-deploy/examples/party-9999/cluster-spark-local-pulsar.yaml b/k8s-deploy/examples/party-9999/cluster-spark-local-pulsar.yaml index ca7aa6f67..3f03d6584 100644 --- a/k8s-deploy/examples/party-9999/cluster-spark-local-pulsar.yaml +++ b/k8s-deploy/examples/party-9999/cluster-spark-local-pulsar.yaml @@ -1,10 +1,10 @@ name: fate-9999 namespace: fate-9999 chartName: fate -chartVersion: v1.7.2 +chartVersion: v1.8.0 partyId: 9999 registry: "" -imageTag: "1.7.2-release" +imageTag: 1.8.0-release pullPolicy: imagePullSecrets: - name: myregistrykey diff --git a/k8s-deploy/examples/party-9999/cluster-spark-pulsar.yaml b/k8s-deploy/examples/party-9999/cluster-spark-pulsar.yaml index 953679b2d..71c3c7cb5 100644 --- a/k8s-deploy/examples/party-9999/cluster-spark-pulsar.yaml +++ b/k8s-deploy/examples/party-9999/cluster-spark-pulsar.yaml @@ -1,10 +1,10 @@ name: fate-9999 namespace: fate-9999 chartName: fate -chartVersion: v1.7.2 +chartVersion: v1.8.0 partyId: 9999 registry: "" -imageTag: "1.7.2-release" +imageTag: 1.8.0-release pullPolicy: imagePullSecrets: - name: myregistrykey diff --git a/k8s-deploy/examples/party-9999/cluster-spark-rabbitmq.yaml b/k8s-deploy/examples/party-9999/cluster-spark-rabbitmq.yaml index a27477e79..a08f4f1a9 100644 --- a/k8s-deploy/examples/party-9999/cluster-spark-rabbitmq.yaml +++ b/k8s-deploy/examples/party-9999/cluster-spark-rabbitmq.yaml @@ -1,10 +1,10 @@ name: fate-9999 namespace: fate-9999 chartName: fate -chartVersion: v1.7.2 +chartVersion: v1.8.0 partyId: 9999 registry: "" -imageTag: 1.7.2-release +imageTag: 1.8.0-release pullPolicy: imagePullSecrets: - name: myregistrykey diff --git a/k8s-deploy/examples/party-9999/cluster.yaml b/k8s-deploy/examples/party-9999/cluster.yaml index 9cd94fc84..3ba8312f1 100644 --- a/k8s-deploy/examples/party-9999/cluster.yaml +++ b/k8s-deploy/examples/party-9999/cluster.yaml @@ -1,10 +1,10 @@ name: fate-9999 namespace: fate-9999 chartName: fate -chartVersion: v1.7.2 +chartVersion: v1.8.0 partyId: 9999 registry: "" -imageTag: "1.7.2-release" +imageTag: 1.8.0-release pullPolicy: imagePullSecrets: - name: myregistrykey diff --git a/k8s-deploy/examples/party-exchange/rollsite.yaml b/k8s-deploy/examples/party-exchange/rollsite.yaml index c01b4fd47..0c045ac32 100644 --- a/k8s-deploy/examples/party-exchange/rollsite.yaml +++ b/k8s-deploy/examples/party-exchange/rollsite.yaml @@ -1,10 +1,10 @@ name: fate-exchange namespace: fate-exchange chartName: fate-exchange -chartVersion: v1.7.2 +chartVersion: partyId: 1 registry: "" -imageTag: "1.7.2-release" +imageTag: 1.8.0-release pullPolicy: imagePullSecrets: - name: myregistrykey diff --git a/k8s-deploy/examples/party-exchange/trafficServer.yaml b/k8s-deploy/examples/party-exchange/trafficServer.yaml index 1b287bdad..136f5ec66 100644 --- a/k8s-deploy/examples/party-exchange/trafficServer.yaml +++ b/k8s-deploy/examples/party-exchange/trafficServer.yaml @@ -1,10 +1,10 @@ name: fate-exchange namespace: fate-exchange chartName: fate-exchange -chartVersion: v1.7.2 +chartVersion: partyId: 1 registry: "" -imageTag: "1.7.2-release" +imageTag: 1.8.0-release pullPolicy: imagePullSecrets: - name: myregistrykey diff --git a/k8s-deploy/examples/party.config b/k8s-deploy/examples/party.config new file mode 100644 index 000000000..9ea87a215 --- /dev/null +++ b/k8s-deploy/examples/party.config @@ -0,0 +1,7 @@ +fate_chartVersion=v1.8.0 +fate_imageTAG=1.8.0-release +fate_serving_chartVersion=v2.0.4 +fate_serving_imageTAG=2.0.4-release +party_9999_IP=192.168.9.1 +party_10000_IP=192.168.10.1 +party_exchange_IP=192.168.0.1 \ No newline at end of file diff --git a/k8s-deploy/pkg/api/service.go b/k8s-deploy/pkg/api/service.go index 476465e23..a2ec2c94e 100644 --- a/k8s-deploy/pkg/api/service.go +++ b/k8s-deploy/pkg/api/service.go @@ -77,7 +77,6 @@ func initTables() error { // @title KubeFATE service API // @version v1 // @description This is a KubeFATE. -// @termsOfService http://swagger.io/terms/ // @contact.name API Support // @contact.url https://github.com/FederatedAI/KubeFATE // @license.name Apache 2.0 From 4cc1a3c9f301c59e1d5fb75a52074426695f7607 Mon Sep 17 00:00:00 2001 From: Chen Jing Date: Wed, 20 Apr 2022 14:09:50 +0800 Subject: [PATCH 14/14] fix ingress issue in the tutorials Signed-off-by: Chen Jing --- ...E_Cluster_in_One_Linux_Machine_with_MiniKube.md | 14 ++++---------- ...luster_in_One_Linux_Machine_with_MiniKube_zh.md | 14 ++++---------- 2 files changed, 8 insertions(+), 20 deletions(-) diff --git a/docs/tutorials/Build_Two_Parties_FATE_Cluster_in_One_Linux_Machine_with_MiniKube.md b/docs/tutorials/Build_Two_Parties_FATE_Cluster_in_One_Linux_Machine_with_MiniKube.md index 4282996cb..bd97b7984 100644 --- a/docs/tutorials/Build_Two_Parties_FATE_Cluster_in_One_Linux_Machine_with_MiniKube.md +++ b/docs/tutorials/Build_Two_Parties_FATE_Cluster_in_One_Linux_Machine_with_MiniKube.md @@ -242,6 +242,7 @@ istio: enabled: false podSecurityPolicy: enabled: false +ingressClassName: nginx modules: - rollsite - clustermanager @@ -255,13 +256,9 @@ backend: eggroll ingress: fateboard: - annotations: - kubernetes.io/ingress.class: "nginx" hosts: - name: party9999.fateboard.example.com - client: - annotations: - kubernetes.io/ingress.class: "nginx" + client: hosts: - name: party9999.notebook.example.com @@ -299,6 +296,7 @@ istio: enabled: false podSecurityPolicy: enabled: false +ingressClassName: nginx modules: - rollsite - clustermanager @@ -312,13 +310,9 @@ backend: eggroll ingress: fateboard: - annotations: - kubernetes.io/ingress.class: "nginx" hosts: - name: party10000.fateboard.example.com - client: - annotations: - kubernetes.io/ingress.class: "nginx" + client: hosts: - name: party10000.notebook.example.com diff --git a/docs/tutorials/Build_Two_Parties_FATE_Cluster_in_One_Linux_Machine_with_MiniKube_zh.md b/docs/tutorials/Build_Two_Parties_FATE_Cluster_in_One_Linux_Machine_with_MiniKube_zh.md index ee366fdc7..f47b5af3a 100644 --- a/docs/tutorials/Build_Two_Parties_FATE_Cluster_in_One_Linux_Machine_with_MiniKube_zh.md +++ b/docs/tutorials/Build_Two_Parties_FATE_Cluster_in_One_Linux_Machine_with_MiniKube_zh.md @@ -221,6 +221,7 @@ istio: enabled: false podSecurityPolicy: enabled: false +ingressClassName: nginx modules: - rollsite - clustermanager @@ -234,13 +235,9 @@ backend: eggroll ingress: fateboard: - annotations: - kubernetes.io/ingress.class: "nginx" hosts: - name: party9999.fateboard.example.com - client: - annotations: - kubernetes.io/ingress.class: "nginx" + client: hosts: - name: party9999.notebook.example.com @@ -279,6 +276,7 @@ istio: enabled: false podSecurityPolicy: enabled: false +ingressClassName: nginx modules: - rollsite - clustermanager @@ -292,13 +290,9 @@ backend: eggroll ingress: fateboard: - annotations: - kubernetes.io/ingress.class: "nginx" hosts: - name: party10000.fateboard.example.com - client: - annotations: - kubernetes.io/ingress.class: "nginx" + client: hosts: - name: party10000.notebook.example.com