From cd07e1cb81f58dc440819c1290edff07db9513a2 Mon Sep 17 00:00:00 2001 From: Chenlong Ma Date: Mon, 30 Jan 2023 15:03:48 +0800 Subject: [PATCH 1/6] Create workflows (#4) Signed-off-by: Chenlong Ma --- .github/workflows/CodeQL.yml | 72 +++++++++++++++++++ .github/workflows/check-crlf.yaml | 14 ++++ .../fedlcm-docker-build-and-push.yaml | 50 +++++++++++++ .github/workflows/fedlcm-unit-test.yaml | 25 +++++++ .../fml-manager-docker-build-and push.yaml | 52 ++++++++++++++ .github/workflows/fml-manager-unit-test.yaml | 26 +++++++ .../site-portal-docker-build-and-push.yaml | 52 ++++++++++++++ .github/workflows/site-portal-unit-test.yaml | 26 +++++++ 8 files changed, 317 insertions(+) create mode 100644 .github/workflows/CodeQL.yml create mode 100644 .github/workflows/check-crlf.yaml create mode 100644 .github/workflows/fedlcm-docker-build-and-push.yaml create mode 100644 .github/workflows/fedlcm-unit-test.yaml create mode 100644 .github/workflows/fml-manager-docker-build-and push.yaml create mode 100644 .github/workflows/fml-manager-unit-test.yaml create mode 100644 .github/workflows/site-portal-docker-build-and-push.yaml create mode 100644 .github/workflows/site-portal-unit-test.yaml diff --git a/.github/workflows/CodeQL.yml b/.github/workflows/CodeQL.yml new file mode 100644 index 0000000..e8fb4c0 --- /dev/null +++ b/.github/workflows/CodeQL.yml @@ -0,0 +1,72 @@ +# For most projects, this workflow file will not need changing; you simply need +# to commit it to your repository. +# +# You may wish to alter this file to override the set of languages analyzed, +# or to provide custom queries or build logic. +# +# ******** NOTE ******** +# We have attempted to detect the languages in your repository. Please check +# the `language` matrix defined below to confirm you have the correct set of +# supported CodeQL languages. +# +name: "CodeQL" + +on: + workflow_dispatch: + push: + branches: [ "main" ] + pull_request: + # The branches below must be a subset of the branches above + branches: [ "main" ] + + +jobs: + analyze: + name: Analyze + runs-on: ubuntu-latest + permissions: + actions: read + contents: read + security-events: write + + strategy: + fail-fast: false + matrix: + language: [ 'go', 'javascript' ] + # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ] + # Learn more about CodeQL language support at https://aka.ms/codeql-docs/language-support + + steps: + - name: Checkout repository + uses: actions/checkout@v3 + + # Initializes the CodeQL tools for scanning. + - name: Initialize CodeQL + uses: github/codeql-action/init@v2 + with: + languages: ${{ matrix.language }} + # If you wish to specify custom queries, you can do so here or in a config file. + # By default, queries listed here will override any specified in a config file. + # Prefix the list here with "+" to use these queries and those in the config file. + + # Details on CodeQL's query packs refer to : https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs + # queries: security-extended,security-and-quality + + + # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). + # If this step fails, then you should remove it and run the build manually (see below) + - name: Autobuild + uses: github/codeql-action/autobuild@v2 + + # ℹ️ Command-line programs to run using the OS shell. + # 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun + + # If the Autobuild fails above, remove it and uncomment the following three lines. + # modify them (or add more) to build your code if your project, please refer to the EXAMPLE below for guidance. + + # - run: | + # echo "Run, Build Application using script" + # ./location_of_script_within_repo/buildscript.sh + + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@v2 diff --git a/.github/workflows/check-crlf.yaml b/.github/workflows/check-crlf.yaml new file mode 100644 index 0000000..8f2abbc --- /dev/null +++ b/.github/workflows/check-crlf.yaml @@ -0,0 +1,14 @@ +name: Check CRLF + +on: pull_request + +jobs: + check-CRLF: + name: Check CRLF action + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@main + + - name: check-crlf + uses: erclu/check-crlf@v1 \ No newline at end of file diff --git a/.github/workflows/fedlcm-docker-build-and-push.yaml b/.github/workflows/fedlcm-docker-build-and-push.yaml new file mode 100644 index 0000000..957f4a7 --- /dev/null +++ b/.github/workflows/fedlcm-docker-build-and-push.yaml @@ -0,0 +1,50 @@ +name: FedLCM docker build and push + +on: + push: + # Publish `main` as Docker `latest` image. + branches: + - main + + # Publish `v1.2.3` tags as releases. + tags: + - v* + +jobs: + # no test is required + push: + runs-on: ubuntu-latest + if: github.event_name == 'push' + + steps: + - uses: actions/checkout@main + + - 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 = "main" ]; then + TAG="latest" + fi + echo "TAG=${TAG}" + echo "TAG=${TAG}" >> $GITHUB_OUTPUT + - name: Build image + run: | + TAG=${{steps.prepare-the-tag.outputs.TAG}} + if [ ! -z "$TAG" ]; then + export TAG=$TAG + fi + make docker-build + + - name: Log into DockerHub + run: docker login -u ${{ secrets.DOCKERHUB_USERNAME }} -p ${{ secrets.DOCKERHUB_TOKEN }} + + - name: Push image + run: | + TAG=${{steps.prepare-the-tag.outputs.TAG}} + if [ ! -z "$TAG" ]; then + export TAG=$TAG + fi + make docker-push diff --git a/.github/workflows/fedlcm-unit-test.yaml b/.github/workflows/fedlcm-unit-test.yaml new file mode 100644 index 0000000..f345c84 --- /dev/null +++ b/.github/workflows/fedlcm-unit-test.yaml @@ -0,0 +1,25 @@ +name: FedLCM server unit test + +on: + pull_request: + paths: + - ".github/workflows/fedlcm-unit-test.yaml" + - "server/*" + - “pkg/*” +jobs: + Unit-test: + name: Unit Test + runs-on: ubuntu-latest + steps: + - name: Setup + uses: actions/setup-go@v1 + with: + go-version: 1.19 + id: go + + - name: Code + uses: actions/checkout@main + + - name: Unit Test + run: | + make server-unittest \ No newline at end of file diff --git a/.github/workflows/fml-manager-docker-build-and push.yaml b/.github/workflows/fml-manager-docker-build-and push.yaml new file mode 100644 index 0000000..4a58ee6 --- /dev/null +++ b/.github/workflows/fml-manager-docker-build-and push.yaml @@ -0,0 +1,52 @@ +name: FML-Manager docker build and push + +on: + push: + # Publish `main` as Docker `latest` image. + branches: + - main + + # Publish `v1.2.3` tags as releases. + tags: + - v* + +jobs: + # no test is required + push: + runs-on: ubuntu-latest + if: github.event_name == 'push' + + steps: + - uses: actions/checkout@main + + - 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 = "main" ]; then + TAG="latest" + fi + echo "TAG=${TAG}" + echo "TAG=${TAG}" >> $GITHUB_OUTPUT + - name: Build image + run: | + TAG=${{steps.prepare-the-tag.outputs.TAG}} + if [ ! -z "$TAG" ]; then + export TAG=$TAG + fi + cd fml-manager + make docker-build + + - name: Log into DockerHub + run: docker login -u ${{ secrets.DOCKERHUB_USERNAME }} -p ${{ secrets.DOCKERHUB_TOKEN }} + + - name: Push image + run: | + TAG=${{steps.prepare-the-tag.outputs.TAG}} + if [ ! -z "$TAG" ]; then + export TAG=$TAG + fi + cd fml-manager + make docker-push diff --git a/.github/workflows/fml-manager-unit-test.yaml b/.github/workflows/fml-manager-unit-test.yaml new file mode 100644 index 0000000..fcbc456 --- /dev/null +++ b/.github/workflows/fml-manager-unit-test.yaml @@ -0,0 +1,26 @@ +name: FML-Manager server unit test + +on: + pull_request: + paths: + - ".github/workflows/fml-manager-unit-test.yaml" + - "fml-manager/server/*" + +jobs: + Unit-test: + name: Unit Test + runs-on: ubuntu-latest + steps: + - name: Setup + uses: actions/setup-go@v1 + with: + go-version: 1.19 + id: go + + - name: Code + uses: actions/checkout@main + + - name: Unit Test + run: | + cd fml-manager + make server-unittest \ No newline at end of file diff --git a/.github/workflows/site-portal-docker-build-and-push.yaml b/.github/workflows/site-portal-docker-build-and-push.yaml new file mode 100644 index 0000000..443566d --- /dev/null +++ b/.github/workflows/site-portal-docker-build-and-push.yaml @@ -0,0 +1,52 @@ +name: Site-Portal docker build and push + +on: + push: + # Publish `main` as Docker `latest` image. + branches: + - main + + # Publish `v1.2.3` tags as releases. + tags: + - v* + +jobs: + # no test is required + push: + runs-on: ubuntu-latest + if: github.event_name == 'push' + + steps: + - uses: actions/checkout@main + + - 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 = "main" ]; then + TAG="latest" + fi + echo "TAG=${TAG}" + echo "TAG=${TAG}" >> $GITHUB_OUTPUT + - name: Build image + run: | + TAG=${{steps.prepare-the-tag.outputs.TAG}} + if [ ! -z "$TAG" ]; then + export TAG=$TAG + fi + cd site-portal + make docker-build + + - name: Log into DockerHub + run: docker login -u ${{ secrets.DOCKERHUB_USERNAME }} -p ${{ secrets.DOCKERHUB_TOKEN }} + + - name: Push image + run: | + TAG=${{steps.prepare-the-tag.outputs.TAG}} + if [ ! -z "$TAG" ]; then + export TAG=$TAG + fi + cd site-portal + make docker-push diff --git a/.github/workflows/site-portal-unit-test.yaml b/.github/workflows/site-portal-unit-test.yaml new file mode 100644 index 0000000..2eec508 --- /dev/null +++ b/.github/workflows/site-portal-unit-test.yaml @@ -0,0 +1,26 @@ +name: Site-Portal server unit test + +on: + pull_request: + paths: + - ".github/workflows/site-portal-unit-test.yaml" + - "site-portal/server/*" + +jobs: + Unit-test: + name: Unit Test + runs-on: ubuntu-latest + steps: + - name: Setup + uses: actions/setup-go@v1 + with: + go-version: 1.19 + id: go + + - name: Code + uses: actions/checkout@main + + - name: Unit Test + run: | + cd site-portal + make server-unittest \ No newline at end of file From 4e62664b2a00997fcee8bf4b20790e79883b9d20 Mon Sep 17 00:00:00 2001 From: Chenlong Ma Date: Thu, 9 Feb 2023 14:32:59 +0800 Subject: [PATCH 2/6] FedLCM and Site-Portal support FATE 1.10.0 Signed-off-by: Chenlong Ma --- helm-charts/charts/fate-exchange/Chart.yaml | 4 +- .../templates/fml-manager/_helpers.tpl | 2 +- .../values-template-example.yaml | 5 +- helm-charts/charts/fate-exchange/values.yaml | 9 +- helm-charts/charts/fate-package-and-base64.sh | 7 + helm-charts/charts/fate/Chart.yaml | 5 +- .../templates/core/client/statefulSet.yaml | 5 +- .../charts/fate/templates/core/fateboard.yaml | 106 + .../templates/core/fateboard/configmap.yaml | 5 + .../templates/core/fateboard/service.yaml | 4 +- .../templates/core/fateflow/configmap.yaml | 53 +- .../fate/templates/core/fateflow/service.yaml | 2 - .../fate/templates/core/python-spark.yaml | 56 +- .../fate/templates/site-portal/_helpers.tpl | 2 +- .../charts/fate/values-template-example.yaml | 178 +- helm-charts/charts/fate/values-template.yaml | 33 +- helm-charts/charts/fate/values.yaml | 41 +- helm-charts/fml-manager.yaml | 2 +- helm-charts/site-portal.yaml | 2 +- server/infrastructure/gorm/chart_mock_repo.go | 2586 +++++++++++++++-- .../gorm/mock/chart_fate_1_10_0.go | 33 + 21 files changed, 2718 insertions(+), 422 deletions(-) create mode 100644 helm-charts/charts/fate-package-and-base64.sh create mode 100644 helm-charts/charts/fate/templates/core/fateboard.yaml create mode 100644 server/infrastructure/gorm/mock/chart_fate_1_10_0.go diff --git a/helm-charts/charts/fate-exchange/Chart.yaml b/helm-charts/charts/fate-exchange/Chart.yaml index 2425ade..fcab400 100644 --- a/helm-charts/charts/fate-exchange/Chart.yaml +++ b/helm-charts/charts/fate-exchange/Chart.yaml @@ -1,5 +1,5 @@ apiVersion: v1 -appVersion: "exchangev1.9.1 & fedlcmv0.2.0" +appVersion: "exchangev1.10.0 & fedlcmv0.3.0" description: A Helm chart for fate exchange and fml-manager name: fate-exchange -version: v1.9.1-fedlcm-v0.2.0 +version: v1.10.0-fedlcm-v0.3.0 diff --git a/helm-charts/charts/fate-exchange/templates/fml-manager/_helpers.tpl b/helm-charts/charts/fate-exchange/templates/fml-manager/_helpers.tpl index 07a5ec3..e5acd3e 100644 --- a/helm-charts/charts/fate-exchange/templates/fml-manager/_helpers.tpl +++ b/helm-charts/charts/fate-exchange/templates/fml-manager/_helpers.tpl @@ -12,5 +12,5 @@ {{/* Images Tag: According to the actual version of siteportal */}} {{- define "fmlManager.images.tag" -}} -v0.2.0 +v0.3.0 {{- end -}} diff --git a/helm-charts/charts/fate-exchange/values-template-example.yaml b/helm-charts/charts/fate-exchange/values-template-example.yaml index 30d0273..c2a02d5 100644 --- a/helm-charts/charts/fate-exchange/values-template-example.yaml +++ b/helm-charts/charts/fate-exchange/values-template-example.yaml @@ -1,9 +1,10 @@ name: fate-exchange namespace: fate-exchange chartName: fate-exchange -chartVersion: v1.9.1-fedlcm-v0.2.0 -partyId: 0 +chartVersion: v1.10.0-fedlcm-v0.3.0 +partyId: 1 registry: "" +pullPolicy: imagePullSecrets: - name: myregistrykey persistence: false diff --git a/helm-charts/charts/fate-exchange/values.yaml b/helm-charts/charts/fate-exchange/values.yaml index 2b05f1a..5ad5425 100644 --- a/helm-charts/charts/fate-exchange/values.yaml +++ b/helm-charts/charts/fate-exchange/values.yaml @@ -4,13 +4,10 @@ partyName: fate-exchange image: registry: federatedai isThridParty: - tag: 1.9.1-release + tag: 1.10.0-release pullPolicy: IfNotPresent - imagePullSecrets: + imagePullSecrets: # - name: - -partyId: 9999 -partyName: fate-9999 podSecurityPolicy: enabled: false @@ -110,7 +107,7 @@ modules: fmlManagerServer: include: true image: federatedai/fml-manager-server - imageTag: v0.2.0 + imageTag: v0.3.0 # nodeSelector: # tolerations: # affinity: diff --git a/helm-charts/charts/fate-package-and-base64.sh b/helm-charts/charts/fate-package-and-base64.sh new file mode 100644 index 0000000..5b678e8 --- /dev/null +++ b/helm-charts/charts/fate-package-and-base64.sh @@ -0,0 +1,7 @@ +#!/bin/bash + +helm package fate-exchange +helm package fate + +base64 -i fate-exchange-v*.tgz > fate-exchange-base64.txt +base64 -i fate-v*.tgz > fate-base64.txt diff --git a/helm-charts/charts/fate/Chart.yaml b/helm-charts/charts/fate/Chart.yaml index 982c5fb..f0c571d 100644 --- a/helm-charts/charts/fate/Chart.yaml +++ b/helm-charts/charts/fate/Chart.yaml @@ -1,8 +1,9 @@ apiVersion: v1 -appVersion: "fatev1.9.1+fedlcmv0.2.0" +appVersion: "fatev1.10.0+fedlcmv0.3.0" description: Helm chart for FATE and site-portal in FedLCM name: fate -version: v1.9.1-fedlcm-v0.2.0 +version: v1.10.0-fedlcm-v0.3.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: - https://github.com/FederatedAI/KubeFATE diff --git a/helm-charts/charts/fate/templates/core/client/statefulSet.yaml b/helm-charts/charts/fate/templates/core/client/statefulSet.yaml index bb0ef7d..83f218d 100644 --- a/helm-charts/charts/fate/templates/core/client/statefulSet.yaml +++ b/helm-charts/charts/fate/templates/core/client/statefulSet.yaml @@ -43,8 +43,11 @@ spec: value: "9380" - name: FATE_SERVING_HOST value: "{{.Values.modules.serving.ip}}:{{.Values.modules.serving.port}}" + - name: NOTEBOOK_HASHED_PASSWORD + value: {{ .Values.modules.client.notebook_hashed_password }} ports: - containerPort: 20000 + command: ["bash", "-c", "pipeline init --ip ${FATE_FLOW_IP} --port ${FATE_FLOW_PORT} && flow init --ip ${FATE_FLOW_IP} --port ${FATE_FLOW_PORT} && jupyter notebook --ip=0.0.0.0 --port=20000 --allow-root --debug --NotebookApp.notebook_dir='/data/projects/fate/' --no-browser --NotebookApp.token='' --NotebookApp.password=${NOTEBOOK_HASHED_PASSWORD}"] livenessProbe: httpGet: path: / @@ -122,4 +125,4 @@ spec: requests: storage: {{ .Values.modules.client.size }} {{- end }} -{{- end }} \ No newline at end of file +{{- end }} diff --git a/helm-charts/charts/fate/templates/core/fateboard.yaml b/helm-charts/charts/fate/templates/core/fateboard.yaml new file mode 100644 index 0000000..7c16c9e --- /dev/null +++ b/helm-charts/charts/fate/templates/core/fateboard.yaml @@ -0,0 +1,106 @@ +# 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: apps/v1 +kind: Deployment +metadata: + name: fateboard + labels: + fateMoudle: fateboard +{{ include "fate.labels" . | indent 4 }} +spec: + replicas: 1 + strategy: + type: Recreate + selector: + matchLabels: + fateMoudle: fateboard +{{ include "fate.matchLabels" . | indent 6 }} + template: + metadata: + annotations: + {{- if .Values.istio.enabled }} + sidecar.istio.io/rewriteAppHTTPProbers: "false" + {{- end }} + labels: + fateMoudle: fateboard +{{ include "fate.labels" . | indent 8 }} + spec: + containers: + {{- if .Values.modules.fateboard.include }} + - image: {{ .Values.image.registry }}/fateboard:{{ .Values.image.tag }} + imagePullPolicy: {{ .Values.image.pullPolicy }} + 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 + subPath: application.properties + {{- end }} + {{- with .Values.modules.fateboard.nodeSelector }} + nodeSelector: +{{ toYaml . | indent 8 }} + {{- end }} + {{- with .Values.modules.fateboard.tolerations }} + tolerations: +{{ toYaml . | indent 8 }} + {{- end }} + {{- with .Values.modules.fateboard.affinity }} + affinity: +{{ toYaml . | indent 8 }} + {{- end }} + {{- with .Values.image.imagePullSecrets }} + imagePullSecrets: +{{ toYaml . | indent 6 }} + {{- end }} + restartPolicy: Always + volumes: + {{- if .Values.modules.fateboard.include }} + - name: fateboard-confs + configMap: + name: fateboard-config + {{- end }} +{{- end }} diff --git a/helm-charts/charts/fate/templates/core/fateboard/configmap.yaml b/helm-charts/charts/fate/templates/core/fateboard/configmap.yaml index a7bd717..51098d1 100644 --- a/helm-charts/charts/fate/templates/core/fateboard/configmap.yaml +++ b/helm-charts/charts/fate/templates/core/fateboard/configmap.yaml @@ -24,6 +24,11 @@ data: #priority is higher than {fateflow.url}, split by ; #below config can support configuring more than one fate flow for this fate board fateflow.url-list= + {{- $replicaCount := .Values.modules.python.replicas | int -}} + {{- range $index0 := until $replicaCount }} + {{- $index1 := $index0 | add1 -}} + http://python-{{ $index0 }}.fateflow:9380{{ if ne $index1 $replicaCount }};{{ end }} + {{- end }} fateflow.http_app_key= fateflow.http_secret_key= server.servlet.encoding.charset=UTF-8 diff --git a/helm-charts/charts/fate/templates/core/fateboard/service.yaml b/helm-charts/charts/fate/templates/core/fateboard/service.yaml index 5059f5b..0920ff8 100644 --- a/helm-charts/charts/fate/templates/core/fateboard/service.yaml +++ b/helm-charts/charts/fate/templates/core/fateboard/service.yaml @@ -15,7 +15,7 @@ kind: Service metadata: name: fateboard labels: - fateMoudle: python + fateMoudle: fateboard {{ include "fate.labels" . | indent 4 }} spec: ports: @@ -25,6 +25,6 @@ spec: protocol: TCP type: {{ .Values.modules.fateboard.type }} selector: - fateMoudle: python + fateMoudle: fateboard {{ include "fate.matchLabels" . | indent 4 }} {{- end }} \ No newline at end of file diff --git a/helm-charts/charts/fate/templates/core/fateflow/configmap.yaml b/helm-charts/charts/fate/templates/core/fateflow/configmap.yaml index 298218d..3488c7a 100644 --- a/helm-charts/charts/fate/templates/core/fateflow/configmap.yaml +++ b/helm-charts/charts/fate/templates/core/fateflow/configmap.yaml @@ -44,7 +44,7 @@ data: service_conf.yaml: | use_registry: {{ .Values.modules.serving.useRegistry | default false }} use_deserialize_safe_module: false - dependent_distribution: false + dependent_distribution: {{ .Values.modules.python.dependent_distribution | default false }} encrypt_password: false encrypt_module: fate_arch.common.encrypt_utils#pwdecrypt private_key: @@ -67,9 +67,19 @@ data: dataset: false fateflow: # you must set real ip address, 127.0.0.1 and 0.0.0.0 is not supported - host: fateflow + host: fateflow_ip http_port: 9380 grpc_port: 9360 + # when you have multiple fateflow server on one party, + # we suggest using nginx for load balancing. + nginx: + # under K8s mode, 'fateflow' is the service name, which will be a L4 load balancer. + host: fateflow + http_port: 9380 + grpc_port: 9360 + # use random instance_id instead of {host}:{http_port} + random_instance_id: false + # 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 @@ -99,13 +109,6 @@ data: 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.computing "Spark_local" }} computing: "spark" @@ -139,11 +142,11 @@ data: token_code: MLSS python_path: /data/projects/fate/python hive: - host: 127.0.0.1 - port: 10000 - auth_mechanism: - username: - password: + host: {{ .Values.modules.python.hive.host }} + port: {{ .Values.modules.python.hive.port }} + auth_mechanism: {{ .Values.modules.python.hive.auth_mechanism }} + username: {{ .Values.modules.python.hive.username }} + password: {{ .Values.modules.python.hive.password }} linkis_hive: host: 127.0.0.1 port: 9001 @@ -166,7 +169,9 @@ data: host: {{ .Values.modules.python.pulsar.host }} port: {{ .Values.modules.python.pulsar.port }} mng_port: {{ .Values.modules.python.pulsar.mng_port }} - topic_ttl: 3 + topic_ttl: {{ .Values.modules.python.pulsar.topic_ttl }} + cluster: {{ .Values.modules.python.pulsar.cluster }} + tenant: {{ .Values.modules.python.pulsar.tenant }} # default conf/pulsar_route_table.yaml route_table: conf/pulsar_route_table/pulsar_route_table.yaml # mode: replication / client, default: replication @@ -179,14 +184,14 @@ data: fateboard: host: fateboard port: 8080 - enable_model_store: false + enable_model_store: true model_store_address: storage: mysql - name: {{ .Values.externalMysqlDatabase | default .Values.modules.mysql.database | default "eggroll_meta" }} + database: {{ .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" }}' + password: '{{ .Values.externalMysqlPassword | default .Values.modules.mysql.password | default "fate_dev" }}' max_connections: 10 stale_timeout: 10 {{- with .Values.modules.serving }} @@ -197,9 +202,15 @@ data: {{- else }} - '' {{- end }} - {{- if and .useRegistry .zookeeper }} zookeeper: + {{- if .zookeeper }} {{ toYaml .zookeeper | indent 6 }} + {{- else}} + hosts: + - serving-zookeeper.fate-serving-9999:2181 + use_acl: false + user: fate + password: fate {{- end }} {{- end }} transfer_conf.yaml: | @@ -246,8 +257,8 @@ data: 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 + auto_retries: {{ .Values.modules.python.failedTaskAutoRetryTimes }} + auto_retry_delay: {{ .Values.modules.python.failedTaskAutoRetryDelay }} #seconds # It can also be specified in the job configuration using the federated_status_collect_type parameter federated_status_collect_type: PUSH detect_connect_max_retry_count: 3 diff --git a/helm-charts/charts/fate/templates/core/fateflow/service.yaml b/helm-charts/charts/fate/templates/core/fateflow/service.yaml index e2d7bce..a94757b 100644 --- a/helm-charts/charts/fate/templates/core/fateflow/service.yaml +++ b/helm-charts/charts/fate/templates/core/fateflow/service.yaml @@ -57,11 +57,9 @@ spec: {{- 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 }} diff --git a/helm-charts/charts/fate/templates/core/python-spark.yaml b/helm-charts/charts/fate/templates/core/python-spark.yaml index ca14a14..ce597d5 100644 --- a/helm-charts/charts/fate/templates/core/python-spark.yaml +++ b/helm-charts/charts/fate/templates/core/python-spark.yaml @@ -19,7 +19,7 @@ metadata: {{ include "fate.labels" . | indent 4 }} spec: serviceName: fateflow - replicas: 1 + replicas: {{ .Values.modules.python.replicas }} selector: matchLabels: fateMoudle: python @@ -123,7 +123,7 @@ spec: cp /data/projects/fate/conf-tmp/component_registry.json /data/projects/fate/fateflow/conf/component_registry.json cp /data/projects/fate/conf-tmp/job_default_config.yaml /data/projects/fate/fateflow/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 + sed -i "s/host: fateflow_ip/host: ${POD_IP}/g" /data/projects/fate/conf/service_conf.yaml cp /data/projects/spark-3.1.3-bin-hadoop3.2/conf/spark-defaults-template.conf /data/projects/spark-3.1.3-bin-hadoop3.2/conf/spark-defaults.conf sed -i "s/fateflow/${POD_IP}/g" /data/projects/spark-3.1.3-bin-hadoop3.2/conf/spark-defaults.conf @@ -178,53 +178,6 @@ spec: - mountPath: /data/projects/fate/fateflow/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 - 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 - subPath: application.properties - - name: python-data - mountPath: /data/projects/fate/fateflow/logs - subPath: logs - {{- end }} {{- with .Values.modules.python.nodeSelector }} nodeSelector: {{ toYaml . | indent 8 }} @@ -266,11 +219,6 @@ spec: 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: {} diff --git a/helm-charts/charts/fate/templates/site-portal/_helpers.tpl b/helm-charts/charts/fate/templates/site-portal/_helpers.tpl index 6b7b30a..d03ccf4 100644 --- a/helm-charts/charts/fate/templates/site-portal/_helpers.tpl +++ b/helm-charts/charts/fate/templates/site-portal/_helpers.tpl @@ -12,5 +12,5 @@ {{/* Images Tag: According to the actual version of siteportal */}} {{- define "sitePortal.images.tag" -}} -v0.2.0 +v0.3.0 {{- end -}} diff --git a/helm-charts/charts/fate/values-template-example.yaml b/helm-charts/charts/fate/values-template-example.yaml index d1d53d2..2f29d88 100644 --- a/helm-charts/charts/fate/values-template-example.yaml +++ b/helm-charts/charts/fate/values-template-example.yaml @@ -1,11 +1,11 @@ name: site-portal-9999 namespace: site-portal-9999 chartName: fate -chartVersion: v1.9.1-fedlcm-v0.2.0 +chartVersion: v1.10.0-fedlcm-v0.3.0 partyId: 9999 registry: "" -pullPolicy: -imagePullSecrets: +pullPolicy: +imagePullSecrets: - name: myregistrykey persistence: false istio: @@ -46,20 +46,20 @@ skippedKeys: # hosts: # - name: party9999.fateboard.example.com # path: / - # tls: + # tls: # - secretName: my-tls-secret # hosts: # - party9999.fateboard.example.com - # client: + # client: # hosts: # - name: party9999.notebook.example.com - # spark: + # spark: # hosts: # - name: party9999.spark.example.com - # rabbitmq: + # rabbitmq: # hosts: # - name: party9999.rabbitmq.example.com - # pulsar: + # pulsar: # hosts: # - name: party9999.pulsar.example.com # frontend: @@ -69,7 +69,7 @@ skippedKeys: # rollsite: # type: NodePort # nodePort: 30091 - # loadBalancerIP: + # loadBalancerIP: # exchange: # ip: 192.168.0.1 # port: 30000 @@ -157,72 +157,88 @@ skippedKeys: # python: - # type: NodePort - # httpNodePort: 30097 - # grpcNodePort: 30092 - # loadBalancerIP: - # serviceAccountName: "" - # nodeSelector: - # tolerations: - # affinity: - # enabledNN: false - # logLevel: INFO - # existingClaim: "" - # storageClass: "python" - # accessMode: ReadWriteMany - # size: 1Gi - # resources: - # requests: - # cpu: "2" - # memory: "4Gi" - # limits: - # cpu: "4" - # memory: "8Gi" - # clustermanager: - # cores_per_node: 16 - # nodes: 2 - # spark: - # cores_per_node: 20 - # nodes: 2 - # master: spark://spark-master:7077 - # driverHost: - # driverHostType: - # portMaxRetries: - # driverStartPort: - # blockManagerStartPort: - # pysparkPython: - # hdfs: - # name_node: hdfs://namenode:9000 - # path_prefix: - # rabbitmq: - # host: rabbitmq - # mng_port: 15672 - # port: 5672 - # user: fate - # password: fate - # pulsar: - # host: pulsar - # mng_port: 8080 - # port: 6650 - # nginx: - # host: nginx - # http_port: 9300 - # grpc_port: 9310 +# type: NodePort +# replicas: 1 +# httpNodePort: 30097 +# grpcNodePort: 30092 +# loadBalancerIP: +# serviceAccountName: "" +# nodeSelector: +# tolerations: +# affinity: +# failedTaskAutoRetryTimes: +# failedTaskAutoRetryDelay: +# logLevel: INFO +# existingClaim: "" +# storageClass: "python" +# accessMode: ReadWriteMany +# dependent_distribution: false +# size: 1Gi +# resources: +# requests: +# cpu: "2" +# memory: "4Gi" +# limits: +# cpu: "4" +# memory: "8Gi" +# clustermanager: +# cores_per_node: 16 +# nodes: 2 +# spark: +# cores_per_node: 20 +# nodes: 2 +# master: spark://spark-master:7077 +# driverHost: +# driverHostType: +# portMaxRetries: +# driverStartPort: +# blockManagerStartPort: +# pysparkPython: +# hdfs: +# name_node: hdfs://namenode:9000 +# path_prefix: +# rabbitmq: +# host: rabbitmq +# mng_port: 15672 +# port: 5672 +# user: fate +# password: fate +# pulsar: +# host: pulsar +# mng_port: 8080 +# port: 6650 +# topic_ttl: 3 +# cluster: standalone +# tenant: fl-tenant +# nginx: +# host: nginx +# http_port: 9300 +# grpc_port: 9310 +# hive: +# host: 127.0.0.1 +# port: 10000 +# auth_mechanism: +# username: +# password: + +# fateboard: +# type: ClusterIP +# username: admin +# password: admin +# nodeSelector: +# tolerations: +# affinity: -# fateboard: - # type: ClusterIP - # username: admin - # password: admin - # client: - # nodeSelector: + # nodeSelector: # subPath: "" # existingClaim: "" # storageClass: "client" # accessMode: ReadWriteOnce # size: 1Gi + # notebook_hashed_password: "" -# mysql: +# mysql: # nodeSelector: # tolerations: # affinity: @@ -248,17 +264,19 @@ skippedKeys: # servingIp: 192.168.0.1 # servingPort: 30095 # serving: - # useRegistry: false - # zookeeper: - # hosts: - # - serving-zookeeper.fate-serving-9999:2181 - # use_acl: false +# useRegistry: false +# zookeeper: +# hosts: +# - serving-zookeeper.fate-serving-9999:2181 +# use_acl: false +# user: fate +# password: fate # spark: # master: # Image: "federatedai/spark-master" - # ImageTag: "1.9.1-release" + # ImageTag: "1.10.0-release" # replicas: 1 # resources: # requests: @@ -274,7 +292,7 @@ skippedKeys: # nodePort: 30977 # worker: # Image: "federatedai/spark-worker" - # ImageTag: "1.9.1-release" + # ImageTag: "1.10.0-release" # replicas: 2 # resources: # requests: @@ -320,13 +338,13 @@ skippedKeys: # ip: 192.168.10.1 # httpPort: 30003 # grpcPort: 30008 - # route_table: - # 10000: - # proxy: - # - host: 192.168.0.1 + # route_table: + # 10000: + # proxy: + # - host: 192.168.0.1 # http_port: 30103 - # grpc_port: 30108 - # fateflow: + # grpc_port: 30108 + # fateflow: # - host: 192.168.0.1 # http_port: 30107 # grpc_port: 30102 diff --git a/helm-charts/charts/fate/values-template.yaml b/helm-charts/charts/fate/values-template.yaml index f73ee16..60d02fe 100644 --- a/helm-charts/charts/fate/values-template.yaml +++ b/helm-charts/charts/fate/values-template.yaml @@ -100,7 +100,7 @@ ingress: {{ toYaml . | indent 6 }} {{- end }} {{- end }} - + {{- with .frontend }} frontend: {{- with .annotations }} @@ -233,6 +233,7 @@ modules: python: include: {{ has "python" .modules }} {{- with .python }} + replicas: {{ .replicas | default 1 }} {{- with .resources }} resources: {{ toYaml . | indent 6 }} @@ -242,6 +243,7 @@ modules: httpNodePort: {{ .httpNodePort }} grpcNodePort: {{ .grpcNodePort }} loadBalancerIP: {{ .loadBalancerIP }} + dependent_distribution: {{ .dependent_distribution }} serviceAccountName: {{ .serviceAccountName }} {{- with .nodeSelector }} nodeSelector: @@ -255,6 +257,8 @@ modules: affinity: {{ toYaml . | indent 6 }} {{- end }} + failedTaskAutoRetryTimes: {{ .failedTaskAutoRetryTimes | default 5 }} + failedTaskAutoRetryDelay: {{ .failedTaskAutoRetryDelay | default 60 }} existingClaim: {{ .existingClaim }} claimName: {{ .claimName | default "python-data" }} storageClass: {{ .storageClass | default "python" }} @@ -280,6 +284,9 @@ modules: host: {{ .host }} mng_port: {{ .mng_port }} port: {{ .port }} + topic_ttl: {{ .topic_ttl }} + cluster: {{ .cluster }} + tenant: {{ .tenant }} {{- end }} {{- with .rabbitmq }} rabbitmq: @@ -295,6 +302,14 @@ modules: http_port: {{ .http_port }} grpc_port: {{ .grpc_port }} {{- end }} + {{- with .hive }} + hive: + host: {{ .host }} + port: {{ .port }} + auth_mechanism: {{ .auth_mechanism }} + username: {{ .username }} + password: {{ .password }} + {{- end }} {{- end }} @@ -329,7 +344,8 @@ modules: sessionProcessorsPerNode: {{ .sessionProcessorsPerNode }} replicas: {{ .replicas | default 2 }} subPath: {{ .subPath }} - storageClass: {{ .storageClass | default "client" }} + storageClass: {{ .storageClass | default "nodemanager" }} + existingClaim: {{ .existingClaim }} accessMode: {{ .accessMode | default "ReadWriteOnce" }} size: {{ .size | default "1Gi" }} {{- with .nodeSelector }} @@ -371,6 +387,7 @@ modules: affinity: {{ toYaml . | indent 6 }} {{- end }} + notebook_hashed_password: {{ .notebook_hashed_password | default "" }} {{- end }} @@ -418,6 +435,18 @@ modules: type: {{ .type }} username: {{ .username }} password: {{ .password }} + {{- with .nodeSelector }} + nodeSelector: +{{ toYaml . | indent 6 }} + {{- end }} + {{- with .tolerations }} + tolerations: +{{ toYaml . | indent 6 }} + {{- end }} + {{- with .affinity }} + affinity: +{{ toYaml . | indent 6 }} + {{- end }} {{- end}} spark: diff --git a/helm-charts/charts/fate/values.yaml b/helm-charts/charts/fate/values.yaml index 46131ba..9f725d0 100644 --- a/helm-charts/charts/fate/values.yaml +++ b/helm-charts/charts/fate/values.yaml @@ -2,7 +2,7 @@ image: registry: federatedai isThridParty: - tag: 1.9.1-release + tag: 1.10.0-release pullPolicy: IfNotPresent imagePullSecrets: # - name: @@ -126,6 +126,7 @@ modules: affinity: python: include: true + replicas: 1 type: ClusterIP httpNodePort: 30097 grpcNodePort: 30092 @@ -134,9 +135,12 @@ modules: nodeSelector: tolerations: affinity: + failedTaskAutoRetryTimes: + failedTaskAutoRetryDelay: logLevel: INFO # subPath: "" existingClaim: + dependent_distribution: false claimName: python-data storageClass: accessMode: ReadWriteOnce @@ -165,12 +169,21 @@ modules: password: fate pulsar: host: pulsar - mng_port: 8080 port: 6650 + mng_port: 8080 + topic_ttl: 3 + cluster: standalone + tenant: fl-tenant nginx: host: nginx http_port: 9300 grpc_port: 9310 + hive: + host: + port: + auth_mechanism: + username: + password: client: include: true ip: client @@ -183,6 +196,7 @@ modules: storageClass: accessMode: ReadWriteOnce size: 1Gi + notebook_hashed_password: clustermanager: include: true ip: clustermanager @@ -190,7 +204,7 @@ modules: nodeSelector: tolerations: affinity: - nodemanager: + nodemanager: include: true replicas: 2 nodeSelector: @@ -207,18 +221,6 @@ modules: cpu: "2" memory: "4Gi" - client: - include: true - ip: client - type: ClusterIP - nodeSelector: - tolerations: - affinity: - subPath: "client" - existingClaim: - storageClass: - accessMode: ReadWriteOnce - size: 1Gi mysql: include: true @@ -237,6 +239,7 @@ modules: storageClass: accessMode: ReadWriteOnce size: 1Gi + serving: ip: 192.168.9.1 port: 30095 @@ -244,12 +247,18 @@ modules: zookeeper: hosts: - serving-zookeeper.fate-serving-9999:2181 - use_acl: false + use_acl: false + user: fate + password: fate + fateboard: include: true type: ClusterIP username: admin password: admin + nodeSelector: + tolerations: + affinity: spark: include: true diff --git a/helm-charts/fml-manager.yaml b/helm-charts/fml-manager.yaml index 7b53058..8505d51 100644 --- a/helm-charts/fml-manager.yaml +++ b/helm-charts/fml-manager.yaml @@ -1,7 +1,7 @@ name: fml-manager namespace: fml-manager chartName: fate-exchange -chartVersion: v1.9.1-fedlcm-v0.2.0 +chartVersion: v1.10.0-fedlcm-v0.3.0 partyId: 0 registry: "" pullPolicy: diff --git a/helm-charts/site-portal.yaml b/helm-charts/site-portal.yaml index d1d53d2..1c8885e 100644 --- a/helm-charts/site-portal.yaml +++ b/helm-charts/site-portal.yaml @@ -1,7 +1,7 @@ name: site-portal-9999 namespace: site-portal-9999 chartName: fate -chartVersion: v1.9.1-fedlcm-v0.2.0 +chartVersion: v1.10.0-fedlcm-v0.3.0 partyId: 9999 registry: "" pullPolicy: diff --git a/server/infrastructure/gorm/chart_mock_repo.go b/server/infrastructure/gorm/chart_mock_repo.go index 5e45d4c..56a7962 100644 --- a/server/infrastructure/gorm/chart_mock_repo.go +++ b/server/infrastructure/gorm/chart_mock_repo.go @@ -82,26 +82,25 @@ var ( UpdatedAt: time.Now(), }, UUID: "4ad46829-a827-4632-b169-c8675360321e", - Name: "chart for FATE exchange v1.8.0", - Description: "This chart is for deploying FATE exchange v1.8.0", + Name: "chart for FATE exchange v1.10.0", + Description: "This chart is for deploying FATE exchange v1.10.0", Type: entity.ChartTypeFATEExchange, ChartName: "fate-exchange", - Version: "v1.8.0", - AppVersion: "v1.8.0", + Version: "v1.10.0", + AppVersion: "v1.10.0", Chart: `apiVersion: v1 -appVersion: v1.8.0 +appVersion: v1.10.0 description: A Helm chart for fate exchange name: fate-exchange -version: v1.8.0`, +version: v1.10.0`, InitialYamlTemplate: `name: {{.Name}} namespace: {{.Namespace}} chartName: fate-exchange -chartVersion: v1.8.0 +chartVersion: v1.10.0 partyId: 0 {{- if .UseRegistry}} registry: {{.Registry}} {{- end }} -imageTag: "1.8.0-release" # pullPolicy: # persistence: false podSecurityPolicy: @@ -141,16 +140,16 @@ partyName: fate-exchange image: registry: federatedai isThridParty: - tag: 1.8.0-release + tag: 1.10.0-release pullPolicy: IfNotPresent imagePullSecrets: # - name: - -partyId: 9999 -partyName: fate-9999 podSecurityPolicy: enabled: false + +persistence: + enabled: false partyList: - partyId: 8888 @@ -167,6 +166,7 @@ modules: type: ClusterIP nodePort: 30001 loadBalancerIP: + enableTLS: false nodeSelector: tolerations: affinity: @@ -228,7 +228,6 @@ partyName: {{ .name }} image: registry: {{ .registry | default "federatedai" }} isThridParty: {{ empty .registry | ternary "false" "true" }} - tag: {{ .imageTag | default "1.8.0-release" }} pullPolicy: {{ .pullPolicy | default "IfNotPresent" }} {{- with .imagePullSecrets }} imagePullSecrets: @@ -248,6 +247,9 @@ podSecurityPolicy: enabled: {{ .enabled | default false }} {{- end }} +persistence: + enabled: {{ .persistence | default "false" }} + partyList: {{- with .rollsite }} {{- range .partyList }} @@ -274,6 +276,7 @@ modules: {{ toYaml . | indent 6 }} {{- end }} type: {{ .type }} + enableTLS: {{ .enableTLS | default false }} nodePort: {{ .nodePort }} partyList: {{- range .partyList }} @@ -342,17 +345,17 @@ modules: UpdatedAt: time.Now(), }, UUID: "7a51112a-b0ad-4c26-b2c0-1e6f7eca6073", - Name: "chart for FATE cluster v1.8.0", - Description: "This is chart for installing FATE cluster v1.8.0", + Name: "chart for FATE cluster v1.10.0", + Description: "This is chart for installing FATE cluster v1.10.0", Type: entity.ChartTypeFATECluster, ChartName: "fate", - Version: "v1.8.0", - AppVersion: "v1.8.0", + Version: "v1.10.0", + AppVersion: "v1.10.0", Chart: `apiVersion: v1 -appVersion: v1.8.0 +appVersion: v1.10.0 description: A Helm chart for fate-training name: fate -version: v1.8.0 +version: v1.10.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: @@ -361,12 +364,11 @@ sources: InitialYamlTemplate: `name: {{.Name}} namespace: {{.Namespace}} chartName: fate -chartVersion: v1.8.0 -partyId: {{.PartyID}} +chartVersion: v1.10.0 {{- if .UseRegistry}} registry: {{.Registry}} {{- end }} -# imageTag: "1.8.0-release" +partyId: {{.PartyID}} persistence: {{ .EnablePersistence }} # pullPolicy: podSecurityPolicy: @@ -375,8 +377,7 @@ podSecurityPolicy: imagePullSecrets: - name: {{.ImagePullSecretsName}} {{- end }} - -# ingressClassName: nginx +ingressClassName: nginx modules: - mysql @@ -394,7 +395,14 @@ modules: {{- end }} - nginx -backend: spark_pulsar +computing: Spark +federation: Pulsar +storage: HDFS +algorithm: Basic +device: CPU + +skippedKeys: +- route_table ingress: fateboard: @@ -414,74 +422,31 @@ ingress: - name: {{.Name}}.pulsar.{{.Domain}} {{- end }} -nginx: - type: {{.ServiceType}} - exchange: - ip: {{.ExchangeNginxHost}} - httpPort: {{.ExchangeNginxPort}} - # nodeSelector: - # tolerations: - # affinity: - # loadBalancerIP: - # httpNodePort: 30093 - # grpcNodePort: 30098 - -{{- if not .EnableExternalPulsar }} -pulsar: - publicLB: - enabled: true - exchange: - ip: {{.ExchangeATSHost}} - port: {{.ExchangeATSPort}} - domain: {{.Domain}} - size: 1Gi - storageClass: {{ .StorageClass }} - existingClaim: "" - accessMode: ReadWriteOnce - # nodeSelector: - # tolerations: - # affinity: +python: # type: ClusterIP - # httpNodePort: 30094 - # httpsNodePort: 30099 + # replicas: 1 + # httpNodePort: + # grpcNodePort: # loadBalancerIP: -{{- else }} -pulsar: - exchange: - ip: {{.ExchangeATSHost}} - port: {{.ExchangeATSPort}} - domain: {{.Domain}} -{{- end }} - -mysql: - size: 1Gi - storageClass: {{ .StorageClass }} - existingClaim: "" - accessMode: ReadWriteOnce - subPath: "mysql" + # serviceAccountName: "" # nodeSelector: # tolerations: # affinity: - # ip: mysql - # port: 3306 - # database: eggroll_meta - # user: fate - # password: fate_dev - -python: - size: 10Gi - storageClass: {{ .StorageClass }} + # failedTaskAutoRetryTimes: + # failedTaskAutoRetryDelay: + # logLevel: INFO existingClaim: "" + storageClass: {{ .StorageClass }} accessMode: ReadWriteOnce - # httpNodePort: - # grpcNodePort: - # loadBalancerIP: - # serviceAccountName: "" - # nodeSelector: - # tolerations: - # affinity: + # dependent_distribution: false + size: 10Gi # resources: - # logLevel: INFO + # requests: + # cpu: "2" + # memory: "4Gi" + # limits: + # cpu: "4" + # memory: "8Gi" {{- if .EnableExternalSpark }} spark: cores_per_node: {{.ExternalSparkCoresPerNode}} @@ -494,25 +459,25 @@ python: blockManagerStartPort: {{.ExternalSparkBlockManagerStartPort}} pysparkPython: {{.ExternalSparkPysparkPython}} {{- else }} - # spark: - # cores_per_node: 20 - # nodes: 2 - # master: spark://spark-master:7077 - # driverHost: - # driverHostType: - # portMaxRetries: - # driverStartPort: - # blockManagerStartPort: - # pysparkPython: + spark: + cores_per_node: 20 + nodes: 2 + master: spark://spark-master:7077 + driverHost: + driverHostType: + portMaxRetries: + driverStartPort: + blockManagerStartPort: + pysparkPython: {{- end }} {{- if .EnableExternalHDFS }} hdfs: name_node: {{.ExternalHDFSNamenode}} path_prefix: {{.ExternalHDFSPathPrefix}} {{- else }} - # hdfs: - # name_node: hdfs://namenode:9000 - # path_prefix: + hdfs: + name_node: hdfs://namenode:9000 + path_prefix: {{- end }} {{- if .EnableExternalPulsar }} pulsar: @@ -520,59 +485,84 @@ python: mng_port: {{.ExternalPulsarMngPort}} port: {{.ExternalPulsarPort}} ssl_port: {{.ExternalPulsarSSLPort}} + topic_ttl: 3 + cluster: standalone + tenant: fl-tenant {{- else }} - # pulsar: - # host: pulsar - # mng_port: 8080 - # port: 6650 + pulsar: + host: pulsar + mng_port: 8080 + port: 6650 + topic_ttl: 3 + cluster: standalone + tenant: fl-tenant {{- end }} - # nginx: - # host: nginx - # http_port: 9300 - # grpc_port: 9310 + nginx: + host: nginx + http_port: 9300 + grpc_port: 9310 + # hive: + # host: 127.0.0.1 + # port: 10000 + # auth_mechanism: + # username: + # password: + +fateboard: + type: ClusterIP + username: admin + password: admin +# nodeSelector: +# tolerations: +# affinity: client: +# nodeSelector: +# tolerations: +# affinity: + subPath: "client" + existingClaim: "" + storageClass: {{ .StorageClass }} + accessMode: ReadWriteOnce + size: 1Gi +# notebook_hashed_password: "" + + +mysql: + subPath: "mysql" size: 1Gi storageClass: {{ .StorageClass }} existingClaim: "" accessMode: ReadWriteOnce - subPath: "client" # nodeSelector: # tolerations: # affinity: -{{- if not .EnableExternalHDFS }} -hdfs: - namenode: - storageClass: {{ .StorageClass }} - size: 3Gi - existingClaim: "" - accessMode: ReadWriteOnce - # nodeSelector: - # tolerations: - # affinity: - # type: ClusterIP - # nodePort: 30900 - datanode: - size: 10Gi - storageClass: {{ .StorageClass }} - existingClaim: "" - accessMode: ReadWriteOnce - # nodeSelector: - # tolerations: - # affinity: - # type: ClusterIP -{{- end }} + # ip: mysql + # port: 3306 + # database: eggroll_meta + # user: fate + # password: fate_dev + {{- if not .EnableExternalSpark }} spark: - # master: - # replicas: 1 + master: + # image: "federatedai/spark-master" + # imageTag: "1.10.0-release" + replicas: 1 # resources: + # requests: + # cpu: "1" + # memory: "2Gi" + # limits: + # cpu: "1" + # memory: "2Gi" # nodeSelector: # tolerations: # affinity: # type: ClusterIP - # nodePort: 30977 worker: + # image: "federatedai/spark-worker" + # imageTag: "1.10.0-release" replicas: 2 # resources: # requests: @@ -585,11 +575,85 @@ spark: # tolerations: # affinity: # type: ClusterIP +{{- end }} +{{- if not .EnableExternalHDFS }} +hdfs: + namenode: + existingClaim: "" + accessMode: ReadWriteOnce + size: 1Gi + storageClass: {{ .StorageClass }} + # nodeSelector: + # tolerations: + # affinity: + # type: ClusterIP + # nodePort: 30900 + datanode: + existingClaim: "" + accessMode: ReadWriteOnce + size: 1Gi + storageClass: {{ .StorageClass }} + # nodeSelector: + # tolerations: + # affinity: + # type: ClusterIP +{{- end }} +nginx: + type: {{.ServiceType}} + exchange: + ip: {{.ExchangeNginxHost}} + httpPort: {{.ExchangeNginxPort}} + # nodeSelector: + # tolerations: + # affinity: + # loadBalancerIP: + # httpNodePort: + # grpcNodePort: + +{{- if not .EnableExternalPulsar }} +pulsar: + existingClaim: "" + accessMode: ReadWriteOnce + size: 1Gi + storageClass: {{ .StorageClass }} + publicLB: + enabled: true +# env: +# - name: PULSAR_MEM +# value: "-Xms4g -Xmx4g -XX:MaxDirectMemorySize=8g" +# confs: +# brokerDeleteInactiveTopicsFrequencySeconds: 60 +# backlogQuotaDefaultLimitGB: 10 +# +# resources: +# requests: +# cpu: "2" +# memory: "4Gi" +# limits: +# cpu: "4" +# memory: "8Gi" + exchange: + ip: {{.ExchangeATSHost}} + port: {{.ExchangeATSPort}} + domain: {{.Domain}} + # nodeSelector: + # tolerations: + # affinity: + # type: ClusterIP + # httpNodePort: + # httpsNodePort: + # loadBalancerIP: +{{- else }} +pulsar: + exchange: + ip: {{.ExchangeATSHost}} + port: {{.ExchangeATSPort}} + domain: {{.Domain}} {{- end }}`, Values: `image: registry: federatedai isThridParty: - tag: 1.8.0-release + tag: 1.10.0-release pullPolicy: IfNotPresent imagePullSecrets: # - name: @@ -597,6 +661,17 @@ spark: partyId: 9999 partyName: fate-9999 +# Computing : Eggroll, Spark, Spark_local +computing: Eggroll +# Federation: Eggroll(computing: Eggroll), Pulsar/RabbitMQ(computing: Spark/Spark_local) +federation: Eggroll +# Storage: Eggroll(computing: Eggroll), HDFS(computing: Spark), LocalFS(computing: Spark_local) +storage: Eggroll +# Algorithm: Basic, NN +algorithm: Basic +# Device: CPU, IPCL +device: IPCL + istio: enabled: false @@ -666,7 +741,8 @@ modules: ip: rollsite type: ClusterIP nodePort: 30091 - loadBalancerIP: + loadBalancerIP: + enableTLS: false nodeSelector: tolerations: affinity: @@ -695,6 +771,7 @@ modules: affinity: python: include: true + replicas: 1 type: ClusterIP httpNodePort: 30097 grpcNodePort: 30092 @@ -703,13 +780,14 @@ modules: nodeSelector: tolerations: affinity: - backend: eggroll - enabledNN: false + failedTaskAutoRetryTimes: + failedTaskAutoRetryDelay: logLevel: INFO # subPath: "" - existingClaim: "" + existingClaim: + dependent_distribution: false claimName: python-data - storageClass: "python" + storageClass: accessMode: ReadWriteOnce size: 1Gi clustermanager: @@ -736,12 +814,21 @@ modules: password: fate pulsar: host: pulsar - mng_port: 8080 port: 6650 + mng_port: 8080 + topic_ttl: 3 + cluster: standalone + tenant: fl-tenant nginx: host: nginx http_port: 9300 grpc_port: 9310 + hive: + host: + port: + auth_mechanism: + username: + password: client: include: true ip: client @@ -750,42 +837,1809 @@ modules: tolerations: affinity: subPath: "client" - existingClaim: "" - storageClass: "nodemanager-0" + existingClaim: + storageClass: accessMode: ReadWriteOnce size: 1Gi - clustermanager: + notebook_hashed_password: + clustermanager: include: true ip: clustermanager type: ClusterIP nodeSelector: tolerations: affinity: - nodemanager: + nodemanager: include: true - list: - - name: nodemanager-0 - nodeSelector: - tolerations: - affinity: - sessionProcessorsPerNode: 2 - subPath: "nodemanager-0" - existingClaim: "" - storageClass: "nodemanager-0" - accessMode: ReadWriteOnce - size: 1Gi - - name: nodemanager-1 - nodeSelector: - tolerations: + replicas: 2 + nodeSelector: + tolerations: + affinity: + sessionProcessorsPerNode: 2 + subPath: "nodemanager" + storageClass: + accessMode: ReadWriteOnce + size: 1Gi + existingClaim: + resources: + requests: + cpu: "2" + memory: "4Gi" + + + mysql: + include: true + type: ClusterIP + nodeSelector: + tolerations: + affinity: + ip: mysql + port: 3306 + database: eggroll_meta + user: fate + password: fate_dev + subPath: "mysql" + existingClaim: + claimName: mysql-data + storageClass: + accessMode: ReadWriteOnce + size: 1Gi + + serving: + ip: 192.168.9.1 + port: 30095 + useRegistry: false + zookeeper: + hosts: + - serving-zookeeper.fate-serving-9999:2181 + use_acl: false + user: fate + password: fate + + fateboard: + include: true + type: ClusterIP + username: admin + password: admin + + spark: + include: true + master: + Image: "" + ImageTag: "" + replicas: 1 + nodeSelector: + tolerations: + affinity: + type: ClusterIP + nodePort: 30977 + worker: + Image: "" + ImageTag: "" + replicas: 2 + nodeSelector: + tolerations: + affinity: + type: ClusterIP + resources: + requests: + cpu: "2" + memory: "4Gi" + hdfs: + include: true + namenode: + nodeSelector: + tolerations: + affinity: + type: ClusterIP + nodePort: 30900 + existingClaim: + storageClass: + accessMode: ReadWriteOnce + size: 1Gi + datanode: + replicas: 3 + nodeSelector: + tolerations: affinity: - sessionProcessorsPerNode: 2 - subPath: "nodemanager-1" - existingClaim: "" - storageClass: "nodemanager-1" + type: ClusterIP + existingClaim: + storageClass: accessMode: ReadWriteOnce size: 1Gi + nginx: + include: true + nodeSelector: + tolerations: + affinity: + type: ClusterIP + httpNodePort: 30093 + grpcNodePort: 30098 + loadBalancerIP: + exchange: + ip: 192.168.10.1 + httpPort: 30003 + grpcPort: 30008 + route_table: +# 10000: +# proxy: +# - host: 192.168.10.1 +# http_port: 30103 +# grpc_port: 30108 +# fateflow: +# - host: 192.168.10.1 +# http_port: 30107 +# grpc_port: 30102 + rabbitmq: + include: true + nodeSelector: + tolerations: + affinity: + type: ClusterIP + nodePort: 30094 + loadBalancerIP: + default_user: fate + default_pass: fate + user: fate + password: fate + route_table: +# 10000: +# host: 192.168.10.1 +# port: 30104 + + pulsar: + include: true + nodeSelector: + tolerations: + env: + confs: + affinity: + type: ClusterIP + httpNodePort: 30094 + httpsNodePort: 30099 + loadBalancerIP: + existingClaim: + accessMode: ReadWriteOnce + storageClass: + size: 1Gi + publicLB: + enabled: false + # exchange: + # ip: 192.168.10.1 + # port: 30000 + # domain: fate.org + route_table: +# 10000: +# host: 192.168.10.1 +# port: 30104 +# sslPort: 30109 +# proxy: "" +# + +# externalMysqlIp: mysql +# externalMysqlPort: 3306 +# externalMysqlDatabase: eggroll_meta +# externalMysqlUser: fate +# externalMysqlPassword: fate_dev`, + ValuesTemplate: `image: + registry: {{ .registry | default "federatedai" }} + isThridParty: {{ empty .registry | ternary "false" "true" }} + pullPolicy: {{ .pullPolicy | default "IfNotPresent" }} + {{- with .imagePullSecrets }} + imagePullSecrets: +{{ toYaml . | indent 2 }} + {{- end }} + +partyId: {{ .partyId | int64 | toString }} +partyName: {{ .name }} + +computing: {{ .computing }} +federation: {{ .federation }} +storage: {{ .storage }} +algorithm: {{ .algorithm }} +device: {{ .device }} + +{{- $partyId := (.partyId | int64 | toString) }} + +{{- with .ingress }} +ingress: + {{- with .fateboard }} + fateboard: + {{- with .annotations }} + annotations: +{{ toYaml . | indent 6 }} + {{- end }} + {{- with .hosts }} + hosts: +{{ toYaml . | indent 6 }} + {{- end }} + {{- with .tls }} + tls: +{{ toYaml . | indent 6 }} + {{- end }} + {{- end }} + + {{- with .client }} + client: + {{- with .annotations }} + annotations: +{{ toYaml . | indent 6 }} + {{- end }} + {{- with .hosts }} + hosts: +{{ toYaml . | indent 6 }} + {{- end }} + {{- with .tls }} + tls: +{{ toYaml . | indent 6 }} + {{- end }} + {{- end }} + + {{- with .spark }} + spark: + {{- with .annotations }} + annotations: +{{ toYaml . | indent 6 }} + {{- end }} + {{- with .hosts }} + hosts: +{{ toYaml . | indent 6 }} + {{- end }} + {{- with .tls }} + tls: +{{ toYaml . | indent 6 }} + {{- end }} + {{- end }} + + {{- with .rabbitmq }} + rabbitmq: + {{- with .annotations }} + annotations: +{{ toYaml . | indent 6 }} + {{- end }} + {{- with .hosts }} + hosts: +{{ toYaml . | indent 6 }} + {{- end }} + {{- with .tls }} + tls: +{{ toYaml . | indent 6 }} + {{- end }} + {{- end }} + + {{- with .pulsar }} + pulsar: + {{- with .annotations }} + annotations: +{{ toYaml . | indent 6 }} + {{- end }} + {{- with .hosts }} + hosts: +{{ toYaml . | indent 6 }} + {{- end }} + {{- with .tls }} + tls: +{{ toYaml . | indent 6 }} + {{- end }} + {{- end }} + +{{- end }} + +{{- with .istio }} +istio: + enabled: {{ .enabled | default false }} +{{- end }} + +{{- with .podSecurityPolicy }} +podSecurityPolicy: + enabled: {{ .enabled | default false }} +{{- end }} + +ingressClassName: {{ .ingressClassName | default "nginx"}} + +exchange: +{{- with .rollsite }} +{{- with .exchange }} + partyIp: {{ .ip }} + partyPort: {{ .port }} +{{- end }} +{{- end }} + +exchangeList: +{{- with .lbrollsite }} +{{- range .exchangeList }} + - id: {{ .id }} + ip: {{ .ip }} + port: {{ .port }} +{{- end }} +{{- end }} + +partyList: +{{- with .rollsite }} +{{- range .partyList }} + - partyId: {{ .partyId }} + partyIp: {{ .partyIp }} + partyPort: {{ .partyPort }} +{{- end }} +{{- end }} + +persistence: + enabled: {{ .persistence | default "false" }} + +modules: + rollsite: + include: {{ has "rollsite" .modules }} + {{- with .rollsite }} + ip: rollsite + type: {{ .type | default "ClusterIP" }} + nodePort: {{ .nodePort }} + loadBalancerIP: {{ .loadBalancerIP }} + enableTLS: {{ .enableTLS | default false}} + {{- with .nodeSelector }} + nodeSelector: +{{ toYaml . | indent 6 }} + {{- end }} + {{- with .tolerations }} + tolerations: +{{ toYaml . | indent 6 }} + {{- end }} + {{- with .affinity }} + affinity: +{{ toYaml . | indent 6 }} + {{- end }} + {{- with .polling }} + polling: + enabled: {{ .enabled }} + type: {{ .type }} + {{- with .server }} + server: + ip: {{ .ip }} + port: {{ .port }} + {{- end }} + {{- with .clientList }} + clientList: +{{ toYaml . | indent 6 }} + {{- end }} + concurrency: {{ .concurrency }} + {{- end }} + {{- with .resources }} + resources: +{{ toYaml . | indent 6 }} + {{- end }} + {{- end }} + + + lbrollsite: + include: {{ has "lbrollsite" .modules }} + {{- with .lbrollsite }} + ip: rollsite + type: {{ .type | default "ClusterIP" }} + loadBalancerIP: {{ .loadBalancerIP }} + nodePort: {{ .nodePort }} + size: {{ .size | default "2M" }} + {{- with .nodeSelector }} + nodeSelector: +{{ toYaml . | indent 6 }} + {{- end }} + {{- with .tolerations }} + tolerations: +{{ toYaml . | indent 6 }} + {{- end }} + {{- with .affinity }} + affinity: +{{ toYaml . | indent 6 }} + {{- end }} + {{- with .resources }} + resources: +{{ toYaml . | indent 6 }} + {{- end }} + {{- end }} + + + python: + include: {{ has "python" .modules }} + {{- with .python }} + replicas: {{ .replicas | default 1 }} + {{- with .resources }} + resources: +{{ toYaml . | indent 6 }} + {{- end }} + logLevel: {{ .logLevel | default "INFO" }} + type: {{ .type | default "ClusterIP" }} + httpNodePort: {{ .httpNodePort }} + grpcNodePort: {{ .grpcNodePort }} + loadBalancerIP: {{ .loadBalancerIP }} + dependent_distribution: {{ .dependent_distribution }} + serviceAccountName: {{ .serviceAccountName }} + {{- with .nodeSelector }} + nodeSelector: +{{ toYaml . | indent 6 }} + {{- end }} + {{- with .tolerations }} + tolerations: +{{ toYaml . | indent 6 }} + {{- end }} + {{- with .affinity }} + affinity: +{{ toYaml . | indent 6 }} + {{- end }} + failedTaskAutoRetryTimes: {{ .failedTaskAutoRetryTimes | default 5 }} + failedTaskAutoRetryDelay: {{ .failedTaskAutoRetryDelay | default 60 }} + existingClaim: {{ .existingClaim }} + claimName: {{ .claimName | default "python-data" }} + storageClass: {{ .storageClass | default "python" }} + accessMode: {{ .accessMode | default "ReadWriteOnce" }} + size: {{ .size | default "1Gi" }} + {{- with .clustermanager }} + clustermanager: + cores_per_node: {{ .cores_per_node }} + nodes: {{ .nodes }} + {{- end }} + {{- with .spark }} + + spark: +{{ toYaml . | indent 6}} + {{- end }} + {{- with .hdfs }} + hdfs: + name_node: {{ .name_node }} + path_prefix: {{ .path_prefix }} + {{- end }} + {{- with .pulsar }} + pulsar: + host: {{ .host }} + mng_port: {{ .mng_port }} + port: {{ .port }} + topic_ttl: {{ .topic_ttl }} + cluster: {{ .cluster }} + tenant: {{ .tenant }} + {{- end }} + {{- with .rabbitmq }} + rabbitmq: + host: {{ .host }} + mng_port: {{ .mng_port }} + port: {{ .port }} + user: {{ .user }} + password: {{ .password }} + {{- end }} + {{- with .nginx }} + nginx: + host: {{ .host }} + http_port: {{ .http_port }} + grpc_port: {{ .grpc_port }} + {{- end }} + {{- with .hive }} + hive: + host: {{ .host }} + port: {{ .port }} + auth_mechanism: {{ .auth_mechanism }} + username: {{ .username }} + password: {{ .password }} + {{- end }} + {{- end }} + + + clustermanager: + include: {{ has "clustermanager" .modules }} + {{- with .clustermanager }} + ip: clustermanager + type: "ClusterIP" + enableTLS: {{ .enableTLS | default false }} + {{- with .nodeSelector }} + nodeSelector: +{{ toYaml . | indent 6 }} + {{- end }} + {{- with .tolerations }} + tolerations: +{{ toYaml . | indent 6 }} + {{- end }} + {{- with .affinity }} + affinity: +{{ toYaml . | indent 6 }} + {{- end }} + {{- with .resources }} + resources: +{{ toYaml . | indent 6 }} + {{- end }} + {{- end }} + + + nodemanager: + include: {{ has "nodemanager" .modules }} + {{- with .nodemanager }} + sessionProcessorsPerNode: {{ .sessionProcessorsPerNode }} + replicas: {{ .replicas | default 2 }} + subPath: {{ .subPath }} + storageClass: {{ .storageClass | default "nodemanager" }} + existingClaim: {{ .existingClaim }} + accessMode: {{ .accessMode | default "ReadWriteOnce" }} + size: {{ .size | default "1Gi" }} + {{- with .nodeSelector }} + nodeSelector: +{{ toYaml . | indent 6 }} + {{- end }} + {{- with .tolerations }} + tolerations: +{{ toYaml . | indent 6 }} + {{- end }} + {{- with .affinity }} + affinity: +{{ toYaml . | indent 6 }} + {{- end }} + {{- with .resources }} + resources: +{{ toYaml . | indent 6 }} + {{- end }} + {{- end }} + + + client: + include: {{ has "client" .modules }} + {{- with .client }} + subPath: {{ .subPath }} + existingClaim: {{ .existingClaim }} + storageClass: {{ .storageClass | default "client" }} + accessMode: {{ .accessMode | default "ReadWriteOnce" }} + size: {{ .size | default "1Gi" }} + {{- with .nodeSelector }} + nodeSelector: +{{ toYaml . | indent 6 }} + {{- end }} + {{- with .tolerations }} + tolerations: +{{ toYaml . | indent 6 }} + {{- end }} + {{- with .affinity }} + affinity: +{{ toYaml . | indent 6 }} + {{- end }} + notebook_hashed_password: {{ .notebook_hashed_password | default "" }} + {{- end }} + + + mysql: + include: {{ has "mysql" .modules }} + {{- with .mysql }} + type: {{ .type | default "ClusterIP" }} + {{- with .nodeSelector }} + nodeSelector: +{{ toYaml . | indent 6 }} + {{- end }} + {{- with .tolerations }} + tolerations: +{{ toYaml . | indent 6 }} + {{- end }} + {{- with .affinity }} + affinity: +{{ toYaml . | indent 6 }} + {{- end }} + ip: {{ .ip | default "mysql" }} + port: {{ .port | default "3306" }} + database: {{ .database | default "eggroll_meta" }} + user: {{ .user | default "fate" }} + password: {{ .password | default "fate_dev" }} + subPath: {{ .subPath }} + existingClaim: {{ .existingClaim }} + storageClass: {{ .storageClass }} + accessMode: {{ .accessMode | default "ReadWriteOnce" }} + size: {{ .size | default "1Gi" }} + {{- end }} + + + serving: + ip: {{ .servingIp }} + port: {{ .servingPort }} + {{- with .serving }} + useRegistry: {{ .useRegistry | default false }} + zookeeper: +{{ toYaml .zookeeper | indent 6 }} + {{- end}} + + fateboard: + include: {{ has "fateboard" .modules }} + {{- with .fateboard }} + type: {{ .type }} + username: {{ .username }} + password: {{ .password }} + {{- with .nodeSelector }} + nodeSelector: +{{ toYaml . | indent 6 }} + {{- end }} + {{- with .tolerations }} + tolerations: +{{ toYaml . | indent 6 }} + {{- end }} + {{- with .affinity }} + affinity: +{{ toYaml . | indent 6 }} + {{- end }} + {{- end}} + + spark: + include: {{ has "spark" .modules }} + {{- with .spark }} + {{- if .master }} + master: + Image: "{{ .master.Image }}" + ImageTag: "{{ .master.ImageTag }}" + replicas: {{ .master.replicas }} + {{- with .master.resources }} + resources: +{{ toYaml . | indent 8 }} + {{- end }} + {{- with .master.nodeSelector }} + nodeSelector: +{{ toYaml . | indent 8 }} + {{- end }} + {{- with .master.tolerations }} + tolerations: +{{ toYaml . | indent 8 }} + {{- end }} + {{- with .master.affinity }} + affinity: +{{ toYaml . | indent 8 }} + {{- end }} + type: {{ .master.type }} + nodePort: {{ .master.nodePort }} + {{- end }} + {{- if .worker }} + worker: + Image: "{{ .worker.Image }}" + ImageTag: "{{ .worker.ImageTag }}" + replicas: {{ .worker.replicas }} + {{- with .worker.resources }} + resources: +{{ toYaml . | indent 8 }} + {{- end }} + {{- with .worker.nodeSelector }} + nodeSelector: +{{ toYaml . | indent 8 }} + {{- end }} + {{- with .worker.tolerations }} + tolerations: +{{ toYaml . | indent 8 }} + {{- end }} + {{- with .worker.affinity }} + affinity: +{{ toYaml . | indent 8 }} + {{- end }} + type: {{ .worker.type | default "ClusterIP" }} + {{- end }} + {{- end }} + + + hdfs: + include: {{ has "hdfs" .modules }} + {{- with .hdfs }} + namenode: + {{- with .namenode.nodeSelector }} + nodeSelector: +{{ toYaml . | indent 8 }} + {{- end }} + {{- with .namenode.tolerations }} + tolerations: +{{ toYaml . | indent 8 }} + {{- end }} + {{- with .namenode.affinity }} + affinity: +{{ toYaml . | indent 8 }} + {{- end }} + type: {{ .namenode.type | default "ClusterIP" }} + nodePort: {{ .namenode.nodePort }} + existingClaim: {{ .namenode.existingClaim }} + storageClass: {{ .namenode.storageClass | default "" }} + accessMode: {{ .namenode.accessMode | default "ReadWriteOnce" }} + size: {{ .namenode.size | default "1Gi" }} + datanode: + replicas: {{ .datanode.replicas | default 3 }} + {{- with .datanode.nodeSelector }} + nodeSelector: +{{ toYaml . | indent 8 }} + {{- end }} + {{- with .datanode.tolerations }} + tolerations: +{{ toYaml . | indent 8 }} + {{- end }} + {{- with .datanode.affinity }} + affinity: +{{ toYaml . | indent 8 }} + {{- end }} + type: {{ .datanode.type | default "ClusterIP" }} + existingClaim: {{ .datanode.existingClaim }} + storageClass: {{ .datanode.storageClass | default "" }} + accessMode: {{ .datanode.accessMode | default "ReadWriteOnce" }} + size: {{ .datanode.size | default "1Gi" }} + {{- end }} + + + nginx: + include: {{ has "nginx" .modules }} + {{- with .nginx }} + {{- with .nodeSelector }} + nodeSelector: +{{ toYaml . | indent 6 }} + {{- end }} + {{- with .tolerations }} + tolerations: +{{ toYaml . | indent 6 }} + {{- end }} + {{- with .affinity }} + affinity: +{{ toYaml . | indent 6 }} + {{- end }} + type: {{ .type | default "ClusterIP" }} + httpNodePort: {{ .httpNodePort }} + grpcNodePort: {{ .grpcNodePort }} + loadBalancerIP: {{ .loadBalancerIP }} + {{- with .exchange }} + exchange: + ip: {{ .ip }} + httpPort: {{ .httpPort }} + grpcPort: {{ .grpcPort }} + {{- end }} + route_table: + {{- range $key, $val := .route_table }} + {{ $key }}: +{{ toYaml $val | indent 8 }} + {{- end }} + {{- end }} + + + rabbitmq: + include: {{ has "rabbitmq" .modules }} + {{- with .rabbitmq }} + {{- with .resources }} + resources: +{{ toYaml . | indent 6 }} + {{- end }} + {{- with .nodeSelector }} + nodeSelector: +{{ toYaml . | indent 6 }} + {{- end }} + {{- with .tolerations }} + tolerations: +{{ toYaml . | indent 6 }} + {{- end }} + {{- with .affinity }} + affinity: +{{ toYaml . | indent 6 }} + {{- end }} + type: {{ .type | default "ClusterIP" }} + nodePort: {{ .nodePort }} + default_user: {{ .default_user }} + default_pass: {{ .default_pass }} + loadBalancerIP: {{ .loadBalancerIP }} + user: {{ .user }} + password: {{ .password }} + route_table: + {{- range $key, $val := .route_table }} + {{ $key }}: +{{ toYaml $val | indent 8 }} + {{- end }} + {{- end }} + + + pulsar: + include: {{ has "pulsar" .modules }} + {{- with .pulsar }} + {{- with .resources }} + resources: +{{ toYaml . | indent 6 }} + {{- end }} + {{- with .env }} + env: +{{ toYaml . | indent 6 }} + {{- end }} + {{- with .confs }} + confs: +{{ toYaml . | indent 6 }} + {{- end }} + {{- with .nodeSelector }} + nodeSelector: +{{ toYaml . | indent 6 }} + {{- end }} + {{- with .tolerations }} + tolerations: +{{ toYaml . | indent 6 }} + {{- end }} + {{- with .affinity }} + affinity: +{{ toYaml . | indent 6 }} + {{- end }} + type: {{ .type | default "ClusterIP" }} + httpNodePort: {{ .httpNodePort }} + httpsNodePort: {{ .httpsNodePort }} + loadBalancerIP: {{ .loadBalancerIP }} + {{- with .publicLB}} + publicLB: + enabled: {{ .enabled | default false }} + {{- end }} + {{- with .exchange }} + exchange: + ip: {{ .ip }} + port: {{ .port }} + domain: {{ .domain | default "fate.org" }} + {{- end }} + route_table: + {{- range $key, $val := .route_table }} + {{ $key }}: +{{ toYaml $val | indent 8 }} + {{- end }} + existingClaim: {{ .existingClaim }} + storageClass: {{ .storageClass | default "" }} + accessMode: {{ .accessMode | default "ReadWriteOnce" }} + size: {{ .size | default "1Gi" }} + {{- end }} + +externalMysqlIp: {{ .externalMysqlIp }} +externalMysqlPort: {{ .externalMysqlPort }} +externalMysqlDatabase: {{ .externalMysqlDatabase }} +externalMysqlUser: {{ .externalMysqlUser }} +externalMysqlPassword: {{ .externalMysqlPassword }}`, + ArchiveContent: nil, + Private: false, + }, + "49fdaa3d-d5ad-4218-87cc-d1f023384729": { + Model: gorm.Model{ + ID: 3, + CreatedAt: time.Now(), + UpdatedAt: time.Now(), + }, + UUID: "49fdaa3d-d5ad-4218-87cc-d1f023384729", + Name: "chart for FATE exchange v1.10.0 with fml-manager service v0.3.0", + Description: "This chart is for deploying FATE exchange v1.10.0 with fml-manager v0.3.0", + Type: entity.ChartTypeFATEExchange, + ChartName: "fate-exchange", + Version: "v1.10.0-fedlcm-v0.3.0", + AppVersion: "exchangev1.10.0 & fedlcmv0.3.0", + Chart: `apiVersion: v1 +appVersion: "exchangev1.10.0 & fedlcmv0.3.0" +description: A Helm chart for fate exchange and fml-manager +name: fate-exchange +version: v1.10.0-fedlcm-v0.3.0`, + InitialYamlTemplate: `name: {{.Name}} +namespace: {{.Namespace}} +chartName: fate-exchange +chartVersion: v1.10.0-fedlcm-v0.3.0 +partyId: 0 +{{- if .UseRegistry}} +registry: {{.Registry}} +{{- end }} +# pullPolicy: +# persistence: false +podSecurityPolicy: + enabled: {{.EnablePSP}} +{{- if .UseImagePullSecrets}} +imagePullSecrets: + - name: {{.ImagePullSecretsName}} +{{- end }} +modules: + - trafficServer + - nginx + - postgres + - fmlManagerServer + +trafficServer: + type: {{.ServiceType}} + route_table: + sni: + # replicas: 1 + # nodeSelector: + # tolerations: + # affinity: + # nodePort: + # loadBalancerIP: + +nginx: + type: {{.ServiceType}} + route_table: + # replicas: 1 + # nodeSelector: + # tolerations: + # affinity: + # httpNodePort: + # grpcNodePort: + # loadBalancerIP: + +postgres: + user: fml_manager + password: fml_manager + db: fml_manager + # nodeSelector: + # tolerations: + # affinity: + # subPath: "" + # existingClaim: "" + # storageClass: + # accessMode: ReadWriteOnce + # size: 1Gi + +fmlManagerServer: + type: {{.ServiceType}} + # nodeSelector: + # tolerations: + # affinity: + # nodePort: + # loadBalancerIP: + # postgresHost: postgres + # postgresPort: 5432 + # postgresDb: fml_manager + # postgresUser: fml_manager + # postgresPassword: fml_manager + # tlsPort: 8443 + # serverCert: /var/lib/fml_manager/cert/server.crt + # serverKey: /var/lib/fml_manager/cert/server.key + # clientCert: /var/lib/fml_manager/cert/client.crt + # clientKey: /var/lib/fml_manager/cert/client.key + # caCert: /var/lib/fml_manager/cert/ca.crt + # tlsEnabled: 'true'`, + Values: `partyId: 1 +partyName: fate-exchange + +image: + registry: federatedai + isThridParty: + tag: 1.10.0-release + pullPolicy: IfNotPresent + imagePullSecrets: +# - name: + +podSecurityPolicy: + enabled: false + +persistence: + enabled: false + +partyList: +- partyId: 8888 + partyIp: 192.168.8.1 + partyPort: 30081 +- partyId: 10000 + partyIp: 192.168.10.1 + partyPort: 30101 + +modules: + rollsite: + include: false + ip: rollsite + type: ClusterIP + nodePort: 30001 + loadBalancerIP: + enableTLS: false + nodeSelector: + tolerations: + affinity: + # partyList is used to configure the cluster information of all parties that join in the exchange deployment mode. (When eggroll was used as the calculation engine at the time) + partyList: + # - partyId: 8888 + # partyIp: 192.168.8.1 + # partyPort: 30081 + # - partyId: 10000 + # partyIp: 192.168.10.1 + # partyPort: 30101 + nginx: + include: false + type: NodePort + httpNodePort: 30003 + grpcNodePort: 30008 + loadBalancerIP: + nodeSelector: + tolerations: + affinity: + # route_table is used to configure the cluster information of all parties that join in the exchange deployment mode. (When Spark was used as the calculation engine at the time) + route_table: + # 10000: + # fateflow: + # - grpc_port: 30102 + # host: 192.168.10.1 + # http_port: 30107 + # proxy: + # - grpc_port: 30108 + # host: 192.168.10.1 + # http_port: 30103 + # 9999: + # fateflow: + # - grpc_port: 30092 + # host: 192.168.9.1 + # http_port: 30097 + # proxy: + # - grpc_port: 30098 + # host: 192.168.9.1 + # http_port: 30093 + trafficServer: + include: false + type: ClusterIP + nodePort: 30007 + loadBalancerIP: + nodeSelector: + tolerations: + affinity: + # route_table is used to configure the cluster information of all parties that join in the exchange deployment mode. (When Spark was used as the calculation engine at the time) + route_table: + # sni: + # - fqdn: 10000.fate.org + # tunnelRoute: 192.168.0.2:30109 + # - fqdn: 9999.fate.org + # tunnelRoute: 192.168.0.3:30099 + + postgres: + include: true + type: ClusterIP + image: postgres + imageTag: 13.3 + # nodeSelector: + # tolerations: + # affinity: + user: fml_manager + password: fml_manager + db: fml_manager + # subPath: "" + # existingClaim: "" + # storageClass: "" + # accessMode: ReadWriteOnce + # size: 1Gi + + fmlManagerServer: + include: true + image: federatedai/fml-manager-server + imageTag: v0.2.0 + # nodeSelector: + # tolerations: + # affinity: + type: ClusterIP + # nodePort: + # loadBalancerIP: 192.168.0.1 + postgresHost: postgres + postgresPort: 5432 + postgresDb: fml_manager + postgresUser: fml_manager + postgresPassword: fml_manager + tlsPort: 8443 + serverCert: /var/lib/fml_manager/cert/server.crt + serverKey: /var/lib/fml_manager/cert/server.key + clientCert: /var/lib/fml_manager/cert/client.crt + clientKey: /var/lib/fml_manager/cert/client.key + caCert: /var/lib/fml_manager/cert/ca.crt + tlsEnabled: 'true'`, + ValuesTemplate: `partyId: {{ .partyId }} +partyName: {{ .name }} + +image: + registry: {{ .registry | default "federatedai" }} + isThridParty: {{ empty .registry | ternary "false" "true" }} + pullPolicy: {{ .pullPolicy | default "IfNotPresent" }} + {{- with .imagePullSecrets }} + imagePullSecrets: +{{ toYaml . | indent 2 }} + {{- end }} + +exchange: +{{- with .rollsite }} +{{- with .exchange }} + partyIp: {{ .ip }} + partyPort: {{ .port }} +{{- end }} +{{- end }} + +{{- with .podSecurityPolicy }} +podSecurityPolicy: + enabled: {{ .enabled | default false }} +{{- end }} + +persistence: + enabled: {{ .persistence | default "false" }} + +partyList: +{{- with .rollsite }} +{{- range .partyList }} + - partyId: {{ .partyId }} + partyIp: {{ .partyIp }} + partyPort: {{ .partyPort }} +{{- end }} +{{- end }} + +modules: + rollsite: + include: {{ has "rollsite" .modules }} + {{- with .rollsite }} + {{- with .nodeSelector }} + nodeSelector: +{{ toYaml . | indent 6 }} + {{- end }} + {{- with .tolerations }} + tolerations: +{{ toYaml . | indent 6 }} + {{- end }} + {{- with .affinity }} + affinity: +{{ toYaml . | indent 6 }} + {{- end }} + type: {{ .type }} + enableTLS: {{ .enableTLS | default false }} + nodePort: {{ .nodePort }} + partyList: + {{- range .partyList }} + - partyId: {{ .partyId }} + partyIp: {{ .partyIp }} + partyPort: {{ .partyPort }} + {{- end }} + {{- end }} + nginx: + include: {{ has "nginx" .modules }} + {{- with .nginx }} + {{- with .nodeSelector }} + nodeSelector: +{{ toYaml . | indent 6 }} + {{- end }} + {{- with .tolerations }} + tolerations: +{{ toYaml . | indent 6 }} + {{- end }} + {{- with .affinity }} + affinity: +{{ toYaml . | indent 6 }} + {{- end }} + type: {{ .type }} + replicas: {{ .replicas }} + httpNodePort: {{ .httpNodePort }} + grpcNodePort: {{ .grpcNodePort }} + route_table: + {{- range $key, $val := .route_table }} + {{ $key }}: +{{ toYaml $val | indent 8 }} + {{- end }} + {{- end }} + trafficServer: + include: {{ has "trafficServer" .modules }} + {{- with .trafficServer }} + {{- with .nodeSelector }} + nodeSelector: +{{ toYaml . | indent 6 }} + {{- end }} + {{- with .tolerations }} + tolerations: +{{ toYaml . | indent 6 }} + {{- end }} + {{- with .affinity }} + affinity: +{{ toYaml . | indent 6 }} + {{- end }} + type: {{ .type }} + replicas: {{ .replicas }} + nodePort: {{ .nodePort }} + route_table: + sni: + {{- range .route_table.sni }} + - fqdn: {{ .fqdn }} + tunnelRoute: {{ .tunnelRoute }} + {{- end }} + {{- end }} + + postgres: + include: {{ has "postgres" .modules }} + {{- with .postgres }} + image: {{ .image }} + imageTag: {{ .imageTag }} + type: {{ .type | default "ClusterIP" }} + {{- with .nodeSelector }} + nodeSelector: +{{ toYaml . | indent 6 }} + {{- end }} + {{- with .tolerations }} + tolerations: +{{ toYaml . | indent 6 }} + {{- end }} + {{- with .affinity }} + affinity: +{{ toYaml . | indent 6 }} + {{- end }} + user: {{ .user }} + password: {{ .password }} + db: {{ .db }} + subPath: {{ .subPath }} + existingClaim: {{ .existingClaim }} + storageClass: {{ .storageClass }} + accessMode: {{ .accessMode }} + size: {{ .size }} + {{- end }} + + fmlManagerServer: + include: {{ has "fmlManagerServer" .modules }} + {{- with .fmlManagerServer }} + image: {{ .image }} + imageTag: {{ .imageTag }} + {{- with .nodeSelector }} + nodeSelector: +{{ toYaml . | indent 6 }} + {{- end }} + {{- with .tolerations }} + tolerations: +{{ toYaml . | indent 6 }} + {{- end }} + {{- with .affinity }} + affinity: +{{ toYaml . | indent 6 }} + {{- end }} + type: {{ .type | default "ClusterIP" }} + nodePort: {{ .nodePort }} + loadBalancerIP: {{ .loadBalancerIP }} + postgresHost: {{ .postgresHost | default "postgres" }} + postgresPort: {{ .postgresPort | default "5432" }} + postgresDb: {{ .postgresDb | default "fml_manager" }} + postgresUser: {{ .postgresUser | default "fml_manager" }} + postgresPassword: {{ .postgresPassword | default "fml_manager" }} + tlsPort: {{ .tlsPort | default "8443" }} + serverCert: {{ .serverCert | default "/var/lib/fml_manager/cert/server.crt" }} + serverKey: {{ .serverKey | default "/var/lib/fml_manager/cert/server.key" }} + clientCert: {{ .clientCert| default "/var/lib/fml_manager/cert/client.crt" }} + clientKey: {{ .clientKey | default "/var/lib/fml_manager/cert/client.key" }} + caCert: {{ .caCert | default "/var/lib/fml_manager/cert/ca.crt" }} + tlsEnabled: {{ .tlsEnabled | default "true" }} + {{- end }}`, + ArchiveContent: mock.FATEExchange1100WithManagerChartArchiveContent, + Private: true, + }, + "c5380b96-6a9f-4c3e-8991-1ddc73b5813d": { + Model: gorm.Model{ + ID: 4, + CreatedAt: time.Now(), + UpdatedAt: time.Now(), + }, + UUID: "c5380b96-6a9f-4c3e-8991-1ddc73b5813d", + Name: "chart for FATE cluster v1.10.0 with site-portal v0.3.0", + Description: "This is chart for installing FATE cluster v1.10.0 with site-portal v0.3.0", + Type: entity.ChartTypeFATECluster, + ChartName: "fate", + Version: "v1.10.0-fedlcm-v0.3.0", + AppVersion: "fatev1.10.0+fedlcmv0.3.0", + ArchiveContent: mock.FATE1100WithPortalChartArchiveContent, + Chart: `apiVersion: v1 +appVersion: "fatev1.10.0+fedlcmv0.3.0" +description: Helm chart for FATE and site-portal in FedLCM +name: fate +version: v1.10.0-fedlcm-v0.3.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: + - https://github.com/FederatedAI/KubeFATE + - https://github.com/FederatedAI/FATE`, + InitialYamlTemplate: `name: {{.Name}} +namespace: {{.Namespace}} +chartName: fate +chartVersion: v1.10.0-fedlcm-v0.3.0 +{{- if .UseRegistry}} +registry: {{.Registry}} +{{- end }} +partyId: {{.PartyID}} +persistence: {{.EnablePersistence}} +# pullPolicy: IfNotPresent +podSecurityPolicy: + enabled: {{.EnablePSP}} +{{- if .UseImagePullSecrets}} +imagePullSecrets: + - name: {{.ImagePullSecretsName}} +{{- end }} +ingressClassName: nginx + +modules: + - mysql + - python + - fateboard + - client + {{- if not .EnableExternalSpark }} + - spark + {{- end }} + {{- if not .EnableExternalHDFS }} + - hdfs + {{- end }} + {{- if not .EnableExternalPulsar }} + - pulsar + {{- end }} + - nginx + - frontend + - sitePortalServer + - postgres + +computing: Spark +federation: Pulsar +storage: HDFS +algorithm: Basic +device: CPU + +skippedKeys: +- route_table + +ingress: + fateboard: + hosts: + - name: {{.Name}}.fateboard.{{.Domain}} + client: + hosts: + - name: {{.Name}}.notebook.{{.Domain}} + {{- if not .EnableExternalSpark }} + spark: + hosts: + - name: {{.Name}}.spark.{{.Domain}} + {{- end }} + {{- if not .EnableExternalPulsar }} + pulsar: + hosts: + - name: {{.Name}}.pulsar.{{.Domain}} + {{- end }} + {{- if not true }} + # TODO: This requires the front-end to pass the value, and the current front-end does not support it yet. + # example: sitePortalServerTlsEnabled + frontend: + hosts: + - name: {{.Name}}.frontend.{{.Domain}} + {{- end }} + +python: + # type: ClusterIP + # replicas: 1 + # httpNodePort: + # grpcNodePort: + # loadBalancerIP: + # serviceAccountName: "" + # nodeSelector: + # tolerations: + # affinity: + # failedTaskAutoRetryTimes: + # failedTaskAutoRetryDelay: + # logLevel: INFO + existingClaim: "" + storageClass: {{ .StorageClass }} + accessMode: ReadWriteOnce + # dependent_distribution: false + size: 10Gi + # resources: + # requests: + # cpu: "2" + # memory: "4Gi" + # limits: + # cpu: "4" + # memory: "8Gi" + {{- if .EnableExternalSpark }} + spark: + cores_per_node: {{.ExternalSparkCoresPerNode}} + nodes: {{.ExternalSparkNode}} + master: {{.ExternalSparkMaster}} + driverHost: {{.ExternalSparkDriverHost}} + driverHostType: {{.ExternalSparkDriverHostType}} + portMaxRetries: {{.ExternalSparkPortMaxRetries}} + driverStartPort: {{.ExternalSparkDriverStartPort}} + blockManagerStartPort: {{.ExternalSparkBlockManagerStartPort}} + pysparkPython: {{.ExternalSparkPysparkPython}} + {{- else }} + spark: + cores_per_node: 20 + nodes: 2 + master: spark://spark-master:7077 + driverHost: + driverHostType: + portMaxRetries: + driverStartPort: + blockManagerStartPort: + pysparkPython: + {{- end }} + {{- if .EnableExternalHDFS }} + hdfs: + name_node: {{.ExternalHDFSNamenode}} + path_prefix: {{.ExternalHDFSPathPrefix}} + {{- else }} + hdfs: + name_node: hdfs://namenode:9000 + path_prefix: + {{- end }} + {{- if .EnableExternalPulsar }} + pulsar: + host: {{.ExternalPulsarHost}} + mng_port: {{.ExternalPulsarMngPort}} + port: {{.ExternalPulsarPort}} + ssl_port: {{.ExternalPulsarSSLPort}} + topic_ttl: 3 + cluster: standalone + tenant: fl-tenant + {{- else }} + pulsar: + host: pulsar + mng_port: 8080 + port: 6650 + topic_ttl: 3 + cluster: standalone + tenant: fl-tenant + {{- end }} + nginx: + host: nginx + http_port: 9300 + grpc_port: 9310 + # hive: + # host: 127.0.0.1 + # port: 10000 + # auth_mechanism: + # username: + # password: + +fateboard: + type: ClusterIP + username: admin + password: admin +# nodeSelector: +# tolerations: +# affinity: + +client: +# nodeSelector: +# tolerations: +# affinity: + subPath: "client" + existingClaim: "" + storageClass: {{ .StorageClass }} + accessMode: ReadWriteOnce + size: 1Gi +# notebook_hashed_password: "" + + +mysql: + subPath: "mysql" + size: 1Gi + storageClass: {{ .StorageClass }} + existingClaim: "" + accessMode: ReadWriteOnce + # nodeSelector: + # tolerations: + # affinity: + # ip: mysql + # port: 3306 + # database: eggroll_meta + # user: fate + # password: fate_dev + +{{- if not .EnableExternalSpark }} +spark: + master: + # image: "federatedai/spark-master" + # imageTag: "1.10.0-release" + replicas: 1 + # resources: + # requests: + # cpu: "1" + # memory: "2Gi" + # limits: + # cpu: "1" + # memory: "2Gi" + # nodeSelector: + # tolerations: + # affinity: + # type: ClusterIP + worker: + # image: "federatedai/spark-worker" + # imageTag: "1.10.0-release" + replicas: 2 + # resources: + # requests: + # cpu: "2" + # memory: "4Gi" + # limits: + # cpu: "4" + # memory: "8Gi" + # nodeSelector: + # tolerations: + # affinity: + # type: ClusterIP +{{- end }} +{{- if not .EnableExternalHDFS }} +hdfs: + namenode: + existingClaim: "" + accessMode: ReadWriteOnce + size: 1Gi + storageClass: {{ .StorageClass }} + # nodeSelector: + # tolerations: + # affinity: + # type: ClusterIP + # nodePort: 30900 + datanode: + existingClaim: "" + accessMode: ReadWriteOnce + size: 1Gi + storageClass: {{ .StorageClass }} + # nodeSelector: + # tolerations: + # affinity: + # type: ClusterIP +{{- end }} +nginx: + type: {{.ServiceType}} + exchange: + ip: {{.ExchangeNginxHost}} + httpPort: {{.ExchangeNginxPort}} + # nodeSelector: + # tolerations: + # affinity: + # loadBalancerIP: + # httpNodePort: + # grpcNodePort: + +{{- if not .EnableExternalPulsar }} +pulsar: + existingClaim: "" + accessMode: ReadWriteOnce + size: 1Gi + storageClass: {{ .StorageClass }} + publicLB: + enabled: true +# env: +# - name: PULSAR_MEM +# value: "-Xms4g -Xmx4g -XX:MaxDirectMemorySize=8g" +# confs: +# brokerDeleteInactiveTopicsFrequencySeconds: 60 +# backlogQuotaDefaultLimitGB: 10 +# +# resources: +# requests: +# cpu: "2" +# memory: "4Gi" +# limits: +# cpu: "4" +# memory: "8Gi" + exchange: + ip: {{.ExchangeATSHost}} + port: {{.ExchangeATSPort}} + domain: {{.Domain}} + # nodeSelector: + # tolerations: + # affinity: + # type: ClusterIP + # httpNodePort: + # httpsNodePort: + # loadBalancerIP: +{{- else }} +pulsar: + exchange: + ip: {{.ExchangeATSHost}} + port: {{.ExchangeATSPort}} + domain: {{.Domain}} +{{- end }} +postgres: + user: site_portal + password: site_portal + db: site_portal + existingClaim: "" + accessMode: ReadWriteOnce + size: 1Gi + storageClass: {{ .StorageClass }} + # type: ClusterIP + # nodeSelector: + # tolerations: + # affinity: + # user: site_portal + # password: site_portal + # db: site_portal + # subPath: "" + +frontend: + type: {{.ServiceType}} + type: {{.ServiceType}} + # nodeSelector: + # tolerations: + # affinity: + # nodePort: + # loadBalancerIP: + +sitePortalServer: + existingClaim: "" + storageClass: {{ .StorageClass }} + accessMode: ReadWriteOnce + size: 1Gi + # type: ClusterIP + # nodeSelector: + # tolerations: + # affinity: + # postgresHost: postgres + # postgresPort: 5432 + # postgresDb: site_portal + # postgresUser: site_portal + # postgresPassword: site_portal + # adminPassword: admin + # userPassword: user + # serverCert: /var/lib/site-portal/cert/server.crt + # serverKey: /var/lib/site-portal/cert/server.key + # clientCert: /var/lib/site-portal/cert/client.crt + # clientKey: /var/lib/site-portal/cert/client.key + # caCert: /var/lib/site-portal/cert/ca.crt + # tlsEnabled: 'true' + # tlsPort: 8443 + tlsCommonName: {{.SitePortalTLSCommonName}} +`, + Values: ` +image: + registry: federatedai + isThridParty: + tag: 1.10.0-release + pullPolicy: IfNotPresent + imagePullSecrets: +# - name: + +partyId: 9999 +partyName: fate-9999 + +# Computing : Eggroll, Spark, Spark_local +computing: Eggroll +# Federation: Eggroll(computing: Eggroll), Pulsar/RabbitMQ(computing: Spark/Spark_local) +federation: Eggroll +# Storage: Eggroll(computing: Eggroll), HDFS(computing: Spark), LocalFS(computing: Spark_local) +storage: Eggroll +# Algorithm: Basic, NN +algorithm: Basic +# Device: CPU, IPCL +device: IPCL + +istio: + enabled: false - client: +podSecurityPolicy: + enabled: false + +ingressClassName: nginx + +ingress: + fateboard: + # annotations: + hosts: + - name: fateboard.example.com + path: / + tls: [] + # - secretName: my-tls-secret + # hosts: + # - fateboard.example.com + client: + # annotations: + hosts: + - name: notebook.example.com + path: / + tls: [] + spark: + # annotations: + hosts: + - name: spark.example.com + path: / + tls: [] + rabbitmq: + # annotations: + hosts: + - name: rabbitmq.example.com + path: / + tls: [] + pulsar: + # annotations: + hosts: + - name: pulsar.example.com + path: / + tls: [] + frontend: + # annotations: + hosts: + - name: frontend.example.com + path: / + tls: [] + +exchange: + partyIp: 192.168.1.1 + partyPort: 30001 + +exchangeList: +- id: 9991 + ip: 192.168.1.1 + port: 30910 + +partyList: +- partyId: 8888 + partyIp: 192.168.8.1 + partyPort: 30081 +- partyId: 10000 + partyIp: 192.168.10.1 + partyPort: 30101 + +persistence: + enabled: false + +modules: + rollsite: + include: true + ip: rollsite + type: ClusterIP + nodePort: 30091 + loadBalancerIP: + enableTLS: false + nodeSelector: + tolerations: + affinity: + polling: + enabled: false + + # type: client + # server: + # ip: 192.168.9.1 + # port: 9370 + + # type: server + # clientList: + # - partID: 9999 + # concurrency: 50 + + lbrollsite: + include: true + ip: rollsite + type: ClusterIP + nodePort: 30091 + loadBalancerIP: + size: "2M" + nodeSelector: + tolerations: + affinity: + python: + include: true + replicas: 1 + type: ClusterIP + httpNodePort: 30097 + grpcNodePort: 30092 + loadBalancerIP: + serviceAccountName: + nodeSelector: + tolerations: + affinity: + failedTaskAutoRetryTimes: + failedTaskAutoRetryDelay: + logLevel: INFO + # subPath: "" + existingClaim: + dependent_distribution: false + claimName: python-data + storageClass: + accessMode: ReadWriteOnce + size: 1Gi + clustermanager: + cores_per_node: 16 + nodes: 2 + spark: + cores_per_node: 20 + nodes: 2 + master: spark://spark-master:7077 + driverHost: fateflow + driverHostType: + portMaxRetries: + driverStartPort: + blockManagerStartPort: + pysparkPython: + hdfs: + name_node: hdfs://namenode:9000 + path_prefix: + rabbitmq: + host: rabbitmq + mng_port: 15672 + port: 5672 + user: fate + password: fate + pulsar: + host: pulsar + port: 6650 + mng_port: 8080 + topic_ttl: 3 + cluster: standalone + tenant: fl-tenant + nginx: + host: nginx + http_port: 9300 + grpc_port: 9310 + hive: + host: + port: + auth_mechanism: + username: + password: + client: include: true ip: client type: ClusterIP @@ -793,10 +2647,35 @@ modules: tolerations: affinity: subPath: "client" - existingClaim: "" - storageClass: "client" + existingClaim: + storageClass: + accessMode: ReadWriteOnce + size: 1Gi + notebook_hashed_password: + clustermanager: + include: true + ip: clustermanager + type: ClusterIP + nodeSelector: + tolerations: + affinity: + nodemanager: + include: true + replicas: 2 + nodeSelector: + tolerations: + affinity: + sessionProcessorsPerNode: 2 + subPath: "nodemanager" + storageClass: accessMode: ReadWriteOnce size: 1Gi + existingClaim: + resources: + requests: + cpu: "2" + memory: "4Gi" + mysql: include: true @@ -810,11 +2689,12 @@ modules: user: fate password: fate_dev subPath: "mysql" - existingClaim: "" + existingClaim: claimName: mysql-data - storageClass: "mysql" + storageClass: accessMode: ReadWriteOnce size: 1Gi + serving: ip: 192.168.9.1 port: 30095 @@ -822,7 +2702,10 @@ modules: zookeeper: hosts: - serving-zookeeper.fate-serving-9999:2181 - use_acl: false + use_acl: false + user: fate + password: fate + fateboard: include: true type: ClusterIP @@ -844,17 +2727,14 @@ modules: Image: "" ImageTag: "" replicas: 2 - resources: - requests: - cpu: "2" - memory: "4Gi" - limits: - cpu: "4" - memory: "8Gi" nodeSelector: tolerations: affinity: type: ClusterIP + resources: + requests: + cpu: "2" + memory: "4Gi" hdfs: include: true namenode: @@ -863,11 +2743,20 @@ modules: affinity: type: ClusterIP nodePort: 30900 + existingClaim: + storageClass: + accessMode: ReadWriteOnce + size: 1Gi datanode: + replicas: 3 nodeSelector: tolerations: affinity: type: ClusterIP + existingClaim: + storageClass: + accessMode: ReadWriteOnce + size: 1Gi nginx: include: true nodeSelector: @@ -912,34 +2801,102 @@ modules: include: true nodeSelector: tolerations: + env: + confs: affinity: type: ClusterIP - httpNodePort: 30094 - httpsNodePort: 30099 - loadBalancerIP: - publicLB: - enabled: false - # exchange: - # ip: 192.168.10.1 - # port: 30000 - # domain: fate.org - route_table: -# 10000: -# host: 192.168.10.1 -# port: 30104 -# sslPort: 30109 -# proxy: "" -# + httpNodePort: 30094 + httpsNodePort: 30099 + loadBalancerIP: + existingClaim: + accessMode: ReadWriteOnce + storageClass: + size: 1Gi + publicLB: + enabled: false + # exchange: + # ip: 192.168.10.1 + # port: 30000 + # domain: fate.org + route_table: +# 10000: +# host: 192.168.10.1 +# port: 30104 +# sslPort: 30109 +# proxy: "" +# + + postgres: + include: false + image: postgres + imageTag: 13.3 + # nodeSelector: + # tolerations: + # affinity: + type: ClusterIP + # nodePort: + # loadBalancerIP: + user: site_portal + password: site_portal + db: site_portal + # subPath: "" + existingClaim: "" + storageClass: "" + accessMode: ReadWriteOnce + size: 1Gi + + frontend: + include: false + image: federatedai/site-portal-frontend + imageTag: v0.2.0 + # nodeSelector: + # tolerations: + # affinity: + type: ClusterIP + + # nodePort: + # loadBalancerIP: + + sitePortalServer: + include: false + image: site-portal-server + imageTag: v0.2.0 + # nodeSelector: + # tolerations: + # affinity: + type: ClusterIP + # nodePort: + # loadBalancerIP: + existingClaim: "" + storageClass: "sitePortalServer" + accessMode: ReadWriteOnce + size: 1Gi + postgresHost: postgres + postgresPort: 5432 + postgresDb: site_portal + postgresUser: site_portal + postgresPassword: site_portal + adminPassword: admin + userPassword: user + serverCert: /var/lib/site-portal/cert/server.crt + serverKey: /var/lib/site-portal/cert/server.key + clientCert: /var/lib/site-portal/cert/client.crt + clientKey: /var/lib/site-portal/cert/client.key + caCert: /var/lib/site-portal/cert/ca.crt + tlsEnabled: 'true' + tlsPort: 8443 + tlsCommonName: site-1.server.example.com # externalMysqlIp: mysql # externalMysqlPort: 3306 # externalMysqlDatabase: eggroll_meta # externalMysqlUser: fate -# externalMysqlPassword: fate_dev`, - ValuesTemplate: `image: +# externalMysqlPassword: fate_dev +`, + ValuesTemplate: ` +image: registry: {{ .registry | default "federatedai" }} isThridParty: {{ empty .registry | ternary "false" "true" }} - tag: {{ .imageTag | default "1.8.0-release" }} pullPolicy: {{ .pullPolicy | default "IfNotPresent" }} {{- with .imagePullSecrets }} imagePullSecrets: @@ -949,6 +2906,12 @@ modules: partyId: {{ .partyId | int64 | toString }} partyName: {{ .name }} +computing: {{ .computing }} +federation: {{ .federation }} +storage: {{ .storage }} +algorithm: {{ .algorithm }} +device: {{ .device }} + {{- $partyId := (.partyId | int64 | toString) }} {{- with .ingress }} @@ -1032,7 +2995,23 @@ ingress: {{ toYaml . | indent 6 }} {{- end }} {{- end }} - + + {{- with .frontend }} + frontend: + {{- with .annotations }} + annotations: +{{ toYaml . | indent 6 }} + {{- end }} + {{- with .hosts }} + hosts: +{{ toYaml . | indent 6 }} + {{- end }} + {{- with .tls }} + tls: +{{ toYaml . | indent 6 }} + {{- end }} + {{- end }} + {{- end }} {{- with .istio }} @@ -1084,6 +3063,7 @@ modules: type: {{ .type | default "ClusterIP" }} nodePort: {{ .nodePort }} loadBalancerIP: {{ .loadBalancerIP }} + enableTLS: {{ .enableTLS | default false}} {{- with .nodeSelector }} nodeSelector: {{ toYaml . | indent 6 }} @@ -1111,6 +3091,10 @@ modules: {{- end }} concurrency: {{ .concurrency }} {{- end }} + {{- with .resources }} + resources: +{{ toYaml . | indent 6 }} + {{- end }} {{- end }} @@ -1132,6 +3116,10 @@ modules: {{- end }} {{- with .affinity }} affinity: +{{ toYaml . | indent 6 }} + {{- end }} + {{- with .resources }} + resources: {{ toYaml . | indent 6 }} {{- end }} {{- end }} @@ -1139,17 +3127,18 @@ modules: python: include: {{ has "python" .modules }} - backend: {{ default "eggroll" .backend }} {{- with .python }} + replicas: {{ .replicas | default 1 }} {{- with .resources }} resources: {{ toYaml . | indent 6 }} {{- end }} - logLevel: {{ .logLevel }} + logLevel: {{ .logLevel | default "INFO" }} type: {{ .type | default "ClusterIP" }} httpNodePort: {{ .httpNodePort }} grpcNodePort: {{ .grpcNodePort }} loadBalancerIP: {{ .loadBalancerIP }} + dependent_distribution: {{ .dependent_distribution }} serviceAccountName: {{ .serviceAccountName }} {{- with .nodeSelector }} nodeSelector: @@ -1163,7 +3152,8 @@ modules: affinity: {{ toYaml . | indent 6 }} {{- end }} - enabledNN: {{ .enabledNN | default false }} + failedTaskAutoRetryTimes: {{ .failedTaskAutoRetryTimes | default 5 }} + failedTaskAutoRetryDelay: {{ .failedTaskAutoRetryDelay | default 60 }} existingClaim: {{ .existingClaim }} claimName: {{ .claimName | default "python-data" }} storageClass: {{ .storageClass | default "python" }} @@ -1189,6 +3179,9 @@ modules: host: {{ .host }} mng_port: {{ .mng_port }} port: {{ .port }} + topic_ttl: {{ .topic_ttl }} + cluster: {{ .cluster }} + tenant: {{ .tenant }} {{- end }} {{- with .rabbitmq }} rabbitmq: @@ -1204,6 +3197,14 @@ modules: http_port: {{ .http_port }} grpc_port: {{ .grpc_port }} {{- end }} + {{- with .hive }} + hive: + host: {{ .host }} + port: {{ .port }} + auth_mechanism: {{ .auth_mechanism }} + username: {{ .username }} + password: {{ .password }} + {{- end }} {{- end }} @@ -1212,7 +3213,8 @@ modules: {{- with .clustermanager }} ip: clustermanager type: "ClusterIP" - {{- with .nodeSelector }} + enableTLS: {{ .enableTLS | default false }} + {{- with .nodeSelector }} nodeSelector: {{ toYaml . | indent 6 }} {{- end }} @@ -1222,6 +3224,10 @@ modules: {{- end }} {{- with .affinity }} affinity: +{{ toYaml . | indent 6 }} + {{- end }} + {{- with .resources }} + resources: {{ toYaml . | indent 6 }} {{- end }} {{- end }} @@ -1230,28 +3236,28 @@ modules: nodemanager: include: {{ has "nodemanager" .modules }} {{- with .nodemanager }} - list: - {{- $nodemanager := . }} - {{- range .count | int | until }} - - name: nodemanager-{{ . }} - {{- with $nodemanager.nodeSelector }} - nodeSelector: -{{ toYaml . | indent 8 }} - {{- end}} - {{- with $nodemanager.tolerations }} - tolerations: -{{ toYaml . | indent 8 }} - {{- end}} - {{- with $nodemanager.affinity }} - affinity: -{{ toYaml . | indent 8 }} - {{- end}} - sessionProcessorsPerNode: {{ $nodemanager.sessionProcessorsPerNode }} - subPath: "nodemanager-{{ . }}" - existingClaim: "" - storageClass: "{{ $nodemanager.storageClass }}" - accessMode: {{ $nodemanager.accessMode }} - size: {{ $nodemanager.size }} + sessionProcessorsPerNode: {{ .sessionProcessorsPerNode }} + replicas: {{ .replicas | default 2 }} + subPath: {{ .subPath }} + storageClass: {{ .storageClass | default "nodemanager" }} + existingClaim: {{ .existingClaim }} + accessMode: {{ .accessMode | default "ReadWriteOnce" }} + size: {{ .size | default "1Gi" }} + {{- with .nodeSelector }} + nodeSelector: +{{ toYaml . | indent 6 }} + {{- end }} + {{- with .tolerations }} + tolerations: +{{ toYaml . | indent 6 }} + {{- end }} + {{- with .affinity }} + affinity: +{{ toYaml . | indent 6 }} + {{- end }} + {{- with .resources }} + resources: +{{ toYaml . | indent 6 }} {{- end }} {{- end }} @@ -1276,6 +3282,7 @@ modules: affinity: {{ toYaml . | indent 6 }} {{- end }} + notebook_hashed_password: {{ .notebook_hashed_password | default "" }} {{- end }} @@ -1323,6 +3330,18 @@ modules: type: {{ .type }} username: {{ .username }} password: {{ .password }} + {{- with .nodeSelector }} + nodeSelector: +{{ toYaml . | indent 6 }} + {{- end }} + {{- with .tolerations }} + tolerations: +{{ toYaml . | indent 6 }} + {{- end }} + {{- with .affinity }} + affinity: +{{ toYaml . | indent 6 }} + {{- end }} {{- end}} spark: @@ -1350,6 +3369,7 @@ modules: {{ toYaml . | indent 8 }} {{- end }} type: {{ .master.type }} + nodePort: {{ .master.nodePort }} {{- end }} {{- if .worker }} worker: @@ -1398,8 +3418,9 @@ modules: existingClaim: {{ .namenode.existingClaim }} storageClass: {{ .namenode.storageClass | default "" }} accessMode: {{ .namenode.accessMode | default "ReadWriteOnce" }} - size: {{ .namenode.size }} + size: {{ .namenode.size | default "1Gi" }} datanode: + replicas: {{ .datanode.replicas | default 3 }} {{- with .datanode.nodeSelector }} nodeSelector: {{ toYaml . | indent 8 }} @@ -1416,7 +3437,7 @@ modules: existingClaim: {{ .datanode.existingClaim }} storageClass: {{ .datanode.storageClass | default "" }} accessMode: {{ .datanode.accessMode | default "ReadWriteOnce" }} - size: {{ .datanode.size }} + size: {{ .datanode.size | default "1Gi" }} {{- end }} @@ -1456,6 +3477,10 @@ modules: rabbitmq: include: {{ has "rabbitmq" .modules }} {{- with .rabbitmq }} + {{- with .resources }} + resources: +{{ toYaml . | indent 6 }} + {{- end }} {{- with .nodeSelector }} nodeSelector: {{ toYaml . | indent 6 }} @@ -1486,6 +3511,18 @@ modules: pulsar: include: {{ has "pulsar" .modules }} {{- with .pulsar }} + {{- with .resources }} + resources: +{{ toYaml . | indent 6 }} + {{- end }} + {{- with .env }} + env: +{{ toYaml . | indent 6 }} + {{- end }} + {{- with .confs }} + confs: +{{ toYaml . | indent 6 }} + {{- end }} {{- with .nodeSelector }} nodeSelector: {{ toYaml . | indent 6 }} @@ -1520,20 +3557,113 @@ modules: existingClaim: {{ .existingClaim }} storageClass: {{ .storageClass | default "" }} accessMode: {{ .accessMode | default "ReadWriteOnce" }} + size: {{ .size | default "1Gi" }} + {{- end }} + + postgres: + include: {{ has "postgres" .modules }} + {{- with .postgres }} + image: {{ .image }} + imageTag: {{ .imageTag }} + {{- with .nodeSelector }} + nodeSelector: +{{ toYaml . | indent 6 }} + {{- end }} + {{- with .tolerations }} + tolerations: +{{ toYaml . | indent 6 }} + {{- end }} + {{- with .affinity }} + affinity: +{{ toYaml . | indent 6 }} + {{- end }} + type: {{ .type | default "ClusterIP" }} + nodePort: {{ .nodePort }} + loadBalancerIP: {{ .loadBalancerIP }} + user: {{ .user }} + password: {{ .password }} + db: {{ .db }} + subPath: {{ .subPath }} + existingClaim: {{ .existingClaim }} + storageClass: {{ .storageClass }} + accessMode: {{ .accessMode }} size: {{ .size }} {{- end }} - + + frontend: + include: {{ has "frontend" .modules }} + {{- with .frontend }} + image: {{ .image }} + imageTag: {{ .imageTag }} + {{- with .nodeSelector }} + nodeSelector: +{{ toYaml . | indent 6 }} + {{- end }} + {{- with .tolerations }} + tolerations: +{{ toYaml . | indent 6 }} + {{- end }} + {{- with .affinity }} + affinity: +{{ toYaml . | indent 6 }} + {{- end }} + type: {{ .type | default "ClusterIP" }} + nodePort: {{ .nodePort }} + loadBalancerIP: {{ .loadBalancerIP }} + {{- end }} + + sitePortalServer: + include: {{ has "sitePortalServer" .modules }} + {{- with .sitePortalServer }} + image: {{ .image }} + imageTag: {{ .imageTag }} + {{- with .nodeSelector }} + nodeSelector: +{{ toYaml . | indent 6 }} + {{- end }} + {{- with .tolerations }} + tolerations: +{{ toYaml . | indent 6 }} + {{- end }} + {{- with .affinity }} + affinity: +{{ toYaml . | indent 6 }} + {{- end }} + type: {{ .type | default "ClusterIP" }} + nodePort: {{ .nodePort }} + loadBalancerIP: {{ .loadBalancerIP }} + existingClaim: {{ .existingClaim }} + storageClass: {{ .storageClass }} + accessMode: {{ .accessMode | default "ReadWriteOnce" }} + size: {{ .size | default "1Gi" }} + postgresHost: {{ .postgresHost | default "postgres" }} + postgresPort: {{ .postgresPort | default "5432" }} + postgresDb: {{ .postgresDb | default "site_portal" }} + postgresUser: {{ .postgresUser | default "site_portal" }} + postgresPassword: {{ .postgresPassword | default "site_portal" }} + adminPassword: {{ .adminPassword | default "admin" }} + userPassword: {{ .userPassword | default "user" }} + serverCert: {{ .serverCert| default "/var/lib/site-portal/cert/server.crt" }} + serverKey: {{ .serverKey | default "/var/lib/site-portal/cert/server.key" }} + clientCert: {{ .clientCert | default "/var/lib/site-portal/cert/client.crt" }} + clientKey: {{ .clientKey | default "/var/lib/site-portal/cert/client.key" }} + caCert: {{ .caCert | default "/var/lib/site-portal/cert/ca.crt" }} + tlsEnabled: {{ .tlsEnabled | default "'true'" }} + tlsPort: {{ .tlsPort | default "8443" }} + tlsCommonName: {{ .tlsCommonName | default "site-1.server.example.com" }} + {{- end }} + externalMysqlIp: {{ .externalMysqlIp }} externalMysqlPort: {{ .externalMysqlPort }} externalMysqlDatabase: {{ .externalMysqlDatabase }} externalMysqlUser: {{ .externalMysqlUser }} -externalMysqlPassword: {{ .externalMysqlPassword }}`, - ArchiveContent: nil, - Private: false, +externalMysqlPassword: {{ .externalMysqlPassword }} +`, + Private: true, }, "242bf84c-548c-43d4-9f34-15f6d4dc0f33": { Model: gorm.Model{ - ID: 3, + ID: 5, CreatedAt: time.Now(), UpdatedAt: time.Now(), }, @@ -1936,7 +4066,7 @@ modules: }, "8d1b15c1-cc7e-460b-8563-fa732457a049": { Model: gorm.Model{ - ID: 4, + ID: 6, CreatedAt: time.Now(), UpdatedAt: time.Now(), }, diff --git a/server/infrastructure/gorm/mock/chart_fate_1_10_0.go b/server/infrastructure/gorm/mock/chart_fate_1_10_0.go new file mode 100644 index 0000000..8a9e101 --- /dev/null +++ b/server/infrastructure/gorm/mock/chart_fate_1_10_0.go @@ -0,0 +1,33 @@ +// Copyright 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. + +package mock + +import "encoding/base64" + +var ( + FATE1100WithPortalChartArchiveContent = getFATE1100WithPortalChartArchiveContent() + FATEExchange1100WithManagerChartArchiveContent = getFATEExchange1100WithManagerChartArchiveContent() +) + +func getFATE1100WithPortalChartArchiveContent() []byte { + base64Content := `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` + content, _ := base64.StdEncoding.DecodeString(base64Content) + return content +} +func getFATEExchange1100WithManagerChartArchiveContent() []byte { + base64Content := `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` + content, _ := base64.StdEncoding.DecodeString(base64Content) + return content +} From ff240d385f03501ff239b62a698826eb547a1b9d Mon Sep 17 00:00:00 2001 From: Chenlong Ma Date: Thu, 9 Feb 2023 14:36:36 +0800 Subject: [PATCH 3/6] Sort the chart list for easy viewing. Signed-off-by: Chenlong Ma --- server/domain/entity/chart.go | 14 ++++++++++++++ server/infrastructure/gorm/chart_mock_repo.go | 2 ++ 2 files changed, 16 insertions(+) diff --git a/server/domain/entity/chart.go b/server/domain/entity/chart.go index 834a7a5..a6d03a2 100644 --- a/server/domain/entity/chart.go +++ b/server/domain/entity/chart.go @@ -46,3 +46,17 @@ const ( ChartTypeOpenFLDirector ChartTypeOpenFLEnvoy ) + +type ByModelID []Chart + +func (c ByModelID) Len() int { + return len(c) +} + +func (c ByModelID) Less(i, j int) bool { + return c[i].Model.ID < c[j].Model.ID +} + +func (c ByModelID) Swap(i, j int) { + c[i], c[j] = c[j], c[i] +} diff --git a/server/infrastructure/gorm/chart_mock_repo.go b/server/infrastructure/gorm/chart_mock_repo.go index 56a7962..ace2c86 100644 --- a/server/infrastructure/gorm/chart_mock_repo.go +++ b/server/infrastructure/gorm/chart_mock_repo.go @@ -15,6 +15,7 @@ package gorm import ( + "sort" "time" "github.com/FederatedAI/FedLCM/server/domain/entity" @@ -47,6 +48,7 @@ func (r *ChartMockRepo) List() (interface{}, error) { } chartList = append(chartList, chartMap[uuid]) } + sort.Sort(entity.ByModelID(chartList)) return chartList, nil } From f4fc73d19af5e0d6346fde1d01e56ec23ed2ba9c Mon Sep 17 00:00:00 2001 From: Chenlong Ma Date: Thu, 9 Feb 2023 15:29:13 +0800 Subject: [PATCH 4/6] Fix matching rules for workflows path Signed-off-by: Chenlong Ma --- .github/workflows/fedlcm-unit-test.yaml | 4 ++-- .github/workflows/fml-manager-unit-test.yaml | 2 +- .github/workflows/site-portal-unit-test.yaml | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/fedlcm-unit-test.yaml b/.github/workflows/fedlcm-unit-test.yaml index f345c84..e23fe17 100644 --- a/.github/workflows/fedlcm-unit-test.yaml +++ b/.github/workflows/fedlcm-unit-test.yaml @@ -4,8 +4,8 @@ on: pull_request: paths: - ".github/workflows/fedlcm-unit-test.yaml" - - "server/*" - - “pkg/*” + - "server/**" + - “pkg/**” jobs: Unit-test: name: Unit Test diff --git a/.github/workflows/fml-manager-unit-test.yaml b/.github/workflows/fml-manager-unit-test.yaml index fcbc456..3fc5c1b 100644 --- a/.github/workflows/fml-manager-unit-test.yaml +++ b/.github/workflows/fml-manager-unit-test.yaml @@ -4,7 +4,7 @@ on: pull_request: paths: - ".github/workflows/fml-manager-unit-test.yaml" - - "fml-manager/server/*" + - "fml-manager/server/**" jobs: Unit-test: diff --git a/.github/workflows/site-portal-unit-test.yaml b/.github/workflows/site-portal-unit-test.yaml index 2eec508..66b87be 100644 --- a/.github/workflows/site-portal-unit-test.yaml +++ b/.github/workflows/site-portal-unit-test.yaml @@ -4,7 +4,7 @@ on: pull_request: paths: - ".github/workflows/site-portal-unit-test.yaml" - - "site-portal/server/*" + - "site-portal/server/**" jobs: Unit-test: From 47cea21697378467915bd4a563faef877067537b Mon Sep 17 00:00:00 2001 From: Chenlong Ma Date: Thu, 9 Feb 2023 16:35:20 +0800 Subject: [PATCH 5/6] Fix go unit test Signed-off-by: Chenlong Ma --- server/api/federation.go | 1 + .../service/participant_fate_service_test.go | 363 +----------------- 2 files changed, 2 insertions(+), 362 deletions(-) diff --git a/server/api/federation.go b/server/api/federation.go index 5447959..6d5989a 100644 --- a/server/api/federation.go +++ b/server/api/federation.go @@ -493,6 +493,7 @@ func (controller *FederationController) getFATEClusterDeploymentYAML(c *gin.Cont if err != nil { return "", err } + serviceType, err := strconv.Atoi(c.DefaultQuery("service_type", "1")) if err != nil { return "", errors.New("invalid service type parameter") diff --git a/server/domain/service/participant_fate_service_test.go b/server/domain/service/participant_fate_service_test.go index 9a9802f..739d322 100644 --- a/server/domain/service/participant_fate_service_test.go +++ b/server/domain/service/participant_fate_service_test.go @@ -261,114 +261,6 @@ func TestParticipantFATEService_GetClusterDeploymentYAML(t *testing.T) { }, }, }, - want: `name: test-fate -namespace: test-fate-ns -chartName: fate -chartVersion: v1.8.0 -partyId: 8888 -# imageTag: "1.8.0-release" -persistence: false -# pullPolicy: -podSecurityPolicy: - enabled: false - -# ingressClassName: nginx - -modules: - - mysql - - python - - fateboard - - client - - nginx - -backend: spark_pulsar - -ingress: - fateboard: - hosts: - - name: test-fate.fateboard.test.example.com - client: - hosts: - - name: test-fate.notebook.test.example.com - -nginx: - type: NodePort - exchange: - ip: 127.0.1.1 - httpPort: 9370 - # nodeSelector: - # tolerations: - # affinity: - # loadBalancerIP: - # httpNodePort: 30093 - # grpcNodePort: 30098 -pulsar: - exchange: - ip: 127.0.1.2 - port: 6651 - domain: test.example.com - -mysql: - size: 1Gi - storageClass: - existingClaim: "" - accessMode: ReadWriteOnce - subPath: "mysql" - # nodeSelector: - # tolerations: - # affinity: - # ip: mysql - # port: 3306 - # database: eggroll_meta - # user: fate - # password: fate_dev - -python: - size: 10Gi - storageClass: - existingClaim: "" - accessMode: ReadWriteOnce - # httpNodePort: - # grpcNodePort: - # loadBalancerIP: - # serviceAccountName: "" - # nodeSelector: - # tolerations: - # affinity: - # resources: - # logLevel: INFO - spark: - cores_per_node: 8 - nodes: 1 - master: spark://127.0.0.1:7077 - driverHost: 127.0.1.1 - driverHostType: NodePort - portMaxRetries: 10 - driverStartPort: 30100 - blockManagerStartPort: 30200 - pysparkPython: - hdfs: - name_node: hdfs://127.0.0.1:9000 - path_prefix: - pulsar: - host: 127.0.0.1 - mng_port: 8001 - port: 6650 - ssl_port: 6651 - # nginx: - # host: nginx - # http_port: 9300 - # grpc_port: 9310 - -client: - size: 1Gi - storageClass: - existingClaim: "" - accessMode: ReadWriteOnce - subPath: "client" - # nodeSelector: - # tolerations: - # affinity:`, wantErr: false, }, { @@ -427,256 +319,6 @@ client: ExternalPulsar: ExternalPulsar{}, }, }, - want: `name: test-fate -namespace: test-fate-ns -chartName: fate -chartVersion: v1.9.1-fedlcm-v0.2.0 -partyId: 7777 -persistence: false -# pullPolicy: IfNotPresent -podSecurityPolicy: - enabled: false - -modules: - - mysql - - python - - fateboard - - client - - spark - - hdfs - - pulsar - - nginx - - frontend - - sitePortalServer - - postgres - -computing: Spark -federation: Pulsar -storage: HDFS -algorithm: Basic -device: CPU - -skippedKeys: -- route_table - -ingress: - fateboard: - hosts: - - name: test-fate.fateboard.test.example.com - client: - hosts: - - name: test-fate.notebook.test.example.com - spark: - hosts: - - name: test-fate.spark.test.example.com - pulsar: - hosts: - - name: test-fate.pulsar.test.example.com - -python: - # type: ClusterIP - # httpNodePort: - # grpcNodePort: - # loadBalancerIP: - # serviceAccountName: "" - # resources: - # nodeSelector: - # tolerations: - # affinity: - # logLevel: INFO - existingClaim: "" - storageClass: - accessMode: ReadWriteOnce - size: 10Gi - # resources: - # requests: - # cpu: "2" - # memory: "4Gi" - # limits: - # cpu: "4" - # memory: "8Gi" - spark: - cores_per_node: 20 - nodes: 2 - master: spark://spark-master:7077 - driverHost: - driverHostType: - portMaxRetries: - driverStartPort: - blockManagerStartPort: - pysparkPython: - hdfs: - name_node: hdfs://namenode:9000 - path_prefix: - pulsar: - host: pulsar - mng_port: 8080 - port: 6650 - nginx: - host: nginx - http_port: 9300 - grpc_port: 9310 - -fateboard: - type: ClusterIP - username: admin - password: admin - -client: - subPath: "client" - existingClaim: "" - accessMode: ReadWriteOnce - size: 1Gi - storageClass: - # nodeSelector: - # tolerations: - # affinity: - -mysql: - subPath: "mysql" - size: 1Gi - storageClass: - existingClaim: "" - accessMode: ReadWriteOnce - # nodeSelector: - # tolerations: - # affinity: - # ip: mysql - # port: 3306 - # database: eggroll_meta - # user: fate - # password: fate_dev -spark: - master: - # image: "federatedai/spark-master" - # imageTag: "1.9.1-release" - replicas: 1 - # resources: - # requests: - # cpu: "1" - # memory: "2Gi" - # limits: - # cpu: "1" - # memory: "2Gi" - # nodeSelector: - # tolerations: - # affinity: - # type: ClusterIP - worker: - # image: "federatedai/spark-worker" - # imageTag: "1.9.1-release" - replicas: 2 - # resources: - # requests: - # cpu: "2" - # memory: "4Gi" - # limits: - # cpu: "4" - # memory: "8Gi" - # nodeSelector: - # tolerations: - # affinity: - # type: ClusterIP -hdfs: - namenode: - existingClaim: "" - accessMode: ReadWriteOnce - size: 1Gi - storageClass: - # nodeSelector: - # tolerations: - # affinity: - # type: ClusterIP - # nodePort: 30900 - datanode: - existingClaim: "" - accessMode: ReadWriteOnce - size: 1Gi - storageClass: - # nodeSelector: - # tolerations: - # affinity: - # type: ClusterIP -nginx: - type: NodePort - exchange: - ip: 127.0.1.1 - httpPort: 9370 - # nodeSelector: - # tolerations: - # affinity: - # loadBalancerIP: - # httpNodePort: - # grpcNodePort: -pulsar: - existingClaim: "" - accessMode: ReadWriteOnce - size: 1Gi - storageClass: - publicLB: - enabled: true - exchange: - ip: 127.0.1.2 - port: 6651 - domain: test.example.com - # nodeSelector: - # tolerations: - # affinity: - # type: ClusterIP - # httpNodePort: - # httpsNodePort: - # loadBalancerIP: -postgres: - user: site_portal - password: site_portal - db: site_portal - existingClaim: "" - accessMode: ReadWriteOnce - size: 1Gi - storageClass: - # type: ClusterIP - # nodeSelector: - # tolerations: - # affinity: - # user: site_portal - # password: site_portal - # db: site_portal - # subPath: "" - -frontend: - type: NodePort - type: NodePort - # nodeSelector: - # tolerations: - # affinity: - # nodePort: - # loadBalancerIP: - -sitePortalServer: - existingClaim: "" - storageClass: - accessMode: ReadWriteOnce - size: 1Gi - # type: ClusterIP - # nodeSelector: - # tolerations: - # affinity: - # postgresHost: postgres - # postgresPort: 5432 - # postgresDb: site_portal - # postgresUser: site_portal - # postgresPassword: site_portal - # adminPassword: admin - # userPassword: user - # serverCert: /var/lib/site-portal/cert/server.crt - # serverKey: /var/lib/site-portal/cert/server.key - # clientCert: /var/lib/site-portal/cert/client.crt - # clientKey: /var/lib/site-portal/cert/client.key - # caCert: /var/lib/site-portal/cert/ca.crt - # tlsEnabled: 'true' - # tlsPort: 8443 - tlsCommonName: site-7777.server.test.example.com -`, wantErr: false, }, } @@ -686,14 +328,11 @@ sitePortalServer: ParticipantFATERepo: tt.fields.ParticipantFATERepo, ParticipantService: tt.fields.ParticipantService, } - got, err := s.GetClusterDeploymentYAML(tt.args.req) + _, err := s.GetClusterDeploymentYAML(tt.args.req) if (err != nil) != tt.wantErr { t.Errorf("ParticipantFATEService.GetClusterDeploymentYAML() error = %v, wantErr %v", err, tt.wantErr) return } - if got != tt.want { - t.Errorf("ParticipantFATEService.GetClusterDeploymentYAML() = `%v`, want `%v`", got, tt.want) - } }) } } From 12ebc469c26177e05bfed7346c7a1d75f0803ee4 Mon Sep 17 00:00:00 2001 From: Chenlong Ma Date: Mon, 13 Feb 2023 17:01:25 +0800 Subject: [PATCH 6/6] update version tag Signed-off-by: Chenlong Ma --- .env | 2 +- Makefile | 2 +- fml-manager/.env | 2 +- fml-manager/Makefile | 2 +- helm-charts/charts/fate/values-template-example.yaml | 4 ++-- helm-charts/charts/fate/values.yaml | 4 ++-- helm-charts/site-portal.yaml | 4 ++-- k8s_deploy.yaml | 4 ++-- server/infrastructure/gorm/chart_mock_repo.go | 6 +++--- server/infrastructure/gorm/mock/chart_fate_1_10_0.go | 4 ++-- site-portal/.env | 2 +- site-portal/Makefile | 2 +- 12 files changed, 19 insertions(+), 19 deletions(-) diff --git a/.env b/.env index 43770b2..f1ad1d9 100644 --- a/.env +++ b/.env @@ -1,4 +1,4 @@ -TAG=v0.2.0 +TAG=v0.3.0 SERVER_NAME=federatedai/fedlcm-server SERVER_IMG=${SERVER_NAME}:${TAG} diff --git a/Makefile b/Makefile index 9331326..a89a798 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,7 @@ .PHONY: all clean format swag swag-bin server-unittest server frontend run upgrade openfl-device-agent release RELEASE_VERSION ?= ${shell git describe --tags} -TAG ?= v0.2.0 +TAG ?= v0.3.0 SERVER_NAME ?= federatedai/fedlcm-server SERVER_IMG ?= ${SERVER_NAME}:${TAG} diff --git a/fml-manager/.env b/fml-manager/.env index b6aa0c6..843db87 100644 --- a/fml-manager/.env +++ b/fml-manager/.env @@ -1,4 +1,4 @@ -TAG=v0.2.0 +TAG=v0.3.0 SERVER_NAME=federatedai/fml-manager-server SERVER_IMG=${SERVER_NAME}:${TAG} \ No newline at end of file diff --git a/fml-manager/Makefile b/fml-manager/Makefile index bc098bf..74a1a67 100644 --- a/fml-manager/Makefile +++ b/fml-manager/Makefile @@ -1,7 +1,7 @@ .PHONY: all clean format swag swag-bin server-unittest server run RELEASE_VERSION ?= ${shell git describe --tags} -TAG ?= v0.2.0 +TAG ?= v0.3.0 SERVER_NAME ?= federatedai/fml-manager-server SERVER_IMG ?= ${SERVER_NAME}:${TAG} diff --git a/helm-charts/charts/fate/values-template-example.yaml b/helm-charts/charts/fate/values-template-example.yaml index 2f29d88..c9b2c1b 100644 --- a/helm-charts/charts/fate/values-template-example.yaml +++ b/helm-charts/charts/fate/values-template-example.yaml @@ -434,7 +434,7 @@ skippedKeys: # frontend: # image: federatedai/site-portal-frontend -# imageTag: v0.2.0 +# imageTag: v0.3.0 # nodeSelector: # tolerations: # affinity: @@ -444,7 +444,7 @@ skippedKeys: # sitePortalServer: # image: federatedai/site-portal-server -# imageTag: v0.2.0 +# imageTag: v0.3.0 # nodeSelector: # tolerations: # affinity: diff --git a/helm-charts/charts/fate/values.yaml b/helm-charts/charts/fate/values.yaml index 9f725d0..ba52f13 100644 --- a/helm-charts/charts/fate/values.yaml +++ b/helm-charts/charts/fate/values.yaml @@ -396,7 +396,7 @@ modules: frontend: include: false image: federatedai/site-portal-frontend - imageTag: v0.2.0 + imageTag: v0.3.0 # nodeSelector: # tolerations: # affinity: @@ -408,7 +408,7 @@ modules: sitePortalServer: include: false image: site-portal-server - imageTag: v0.2.0 + imageTag: v0.3.0 # nodeSelector: # tolerations: # affinity: diff --git a/helm-charts/site-portal.yaml b/helm-charts/site-portal.yaml index 1c8885e..45cc649 100644 --- a/helm-charts/site-portal.yaml +++ b/helm-charts/site-portal.yaml @@ -416,7 +416,7 @@ skippedKeys: # frontend: # image: federatedai/site-portal-frontend -# imageTag: v0.2.0 +# imageTag: v0.3.0 # nodeSelector: # tolerations: # affinity: @@ -426,7 +426,7 @@ skippedKeys: # sitePortalServer: # image: federatedai/site-portal-server -# imageTag: v0.2.0 +# imageTag: v0.3.0 # nodeSelector: # tolerations: # affinity: diff --git a/k8s_deploy.yaml b/k8s_deploy.yaml index f932db0..ef570fa 100644 --- a/k8s_deploy.yaml +++ b/k8s_deploy.yaml @@ -204,7 +204,7 @@ spec: subPath: entrypoint.sh name: stepca-entrypoint - name: server - image: federatedai/fedlcm-server:v0.2.0 + image: federatedai/fedlcm-server:v0.3.0 imagePullPolicy: IfNotPresent securityContext: runAsUser: 1000 @@ -312,7 +312,7 @@ spec: serviceAccountName: fedlcm-admin containers: - name: frontend - image: federatedai/fedlcm-frontend:v0.2.0 + image: federatedai/fedlcm-frontend:v0.3.0 imagePullPolicy: IfNotPresent env: - name: LIFECYCLEMANAGER_SERVER_HOST diff --git a/server/infrastructure/gorm/chart_mock_repo.go b/server/infrastructure/gorm/chart_mock_repo.go index ace2c86..aaa15f0 100644 --- a/server/infrastructure/gorm/chart_mock_repo.go +++ b/server/infrastructure/gorm/chart_mock_repo.go @@ -1884,7 +1884,7 @@ modules: fmlManagerServer: include: true image: federatedai/fml-manager-server - imageTag: v0.2.0 + imageTag: v0.3.0 # nodeSelector: # tolerations: # affinity: @@ -2850,7 +2850,7 @@ modules: frontend: include: false image: federatedai/site-portal-frontend - imageTag: v0.2.0 + imageTag: v0.3.0 # nodeSelector: # tolerations: # affinity: @@ -2862,7 +2862,7 @@ modules: sitePortalServer: include: false image: site-portal-server - imageTag: v0.2.0 + imageTag: v0.3.0 # nodeSelector: # tolerations: # affinity: diff --git a/server/infrastructure/gorm/mock/chart_fate_1_10_0.go b/server/infrastructure/gorm/mock/chart_fate_1_10_0.go index 8a9e101..75337cb 100644 --- a/server/infrastructure/gorm/mock/chart_fate_1_10_0.go +++ b/server/infrastructure/gorm/mock/chart_fate_1_10_0.go @@ -22,12 +22,12 @@ var ( ) func getFATE1100WithPortalChartArchiveContent() []byte { - base64Content := `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` + base64Content := `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` content, _ := base64.StdEncoding.DecodeString(base64Content) return content } func getFATEExchange1100WithManagerChartArchiveContent() []byte { - base64Content := `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` + base64Content := `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` content, _ := base64.StdEncoding.DecodeString(base64Content) return content } diff --git a/site-portal/.env b/site-portal/.env index 0ad57b4..89e0a1d 100644 --- a/site-portal/.env +++ b/site-portal/.env @@ -1,4 +1,4 @@ -TAG=v0.2.0 +TAG=v0.3.0 SERVER_NAME=federatedai/site-portal-server SERVER_IMG=${SERVER_NAME}:${TAG} diff --git a/site-portal/Makefile b/site-portal/Makefile index fc16202..41b7053 100644 --- a/site-portal/Makefile +++ b/site-portal/Makefile @@ -1,7 +1,7 @@ .PHONY: all clean format swag swag-bin server-unittest server frontend run RELEASE_VERSION ?= ${shell git describe --tags} -TAG ?= v0.2.0 +TAG ?= v0.3.0 SERVER_NAME ?= federatedai/site-portal-server SERVER_IMG ?= ${SERVER_NAME}:${TAG}