From 559007b7240de66886fd568c932c15d82f4dd344 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 13 Dec 2020 06:17:56 +0000 Subject: [PATCH 001/321] chore(deps): bump ini from 1.3.5 to 1.3.8 in /applications/osb-portal Bumps [ini](https://github.com/isaacs/ini) from 1.3.5 to 1.3.8. - [Release notes](https://github.com/isaacs/ini/releases) - [Commits](https://github.com/isaacs/ini/compare/v1.3.5...v1.3.8) Signed-off-by: dependabot[bot] --- applications/osb-portal/package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/applications/osb-portal/package-lock.json b/applications/osb-portal/package-lock.json index 3ad82afa..6df878bf 100644 --- a/applications/osb-portal/package-lock.json +++ b/applications/osb-portal/package-lock.json @@ -3493,9 +3493,9 @@ "dev": true }, "ini": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", "dev": true }, "internal-ip": { From a53904fe47c1cc955deac354d84015ec8950b3c8 Mon Sep 17 00:00:00 2001 From: Filippo Ledda Date: Tue, 9 Feb 2021 20:14:36 +0100 Subject: [PATCH 002/321] #91 new deployment configuration --- .../codefresh-template-dev.yaml | 9 +++ .../codefresh-template-prod.yaml | 9 +++ .../codefresh-template.yaml | 75 ------------------- deployment-configuration/values-template.yaml | 1 + 4 files changed, 19 insertions(+), 75 deletions(-) create mode 100644 deployment-configuration/codefresh-template-dev.yaml create mode 100644 deployment-configuration/codefresh-template-prod.yaml delete mode 100644 deployment-configuration/codefresh-template.yaml diff --git a/deployment-configuration/codefresh-template-dev.yaml b/deployment-configuration/codefresh-template-dev.yaml new file mode 100644 index 00000000..df63eca3 --- /dev/null +++ b/deployment-configuration/codefresh-template-dev.yaml @@ -0,0 +1,9 @@ +steps: + prepare_deployment: + title: "Prepare helm chart" + image: python:3.7 + stage: prepare + working_directory: . + commands: + - pip install cloud-harness/utilities + - harness-deployment . cloud-harness -m build -t ${{DEPLOYMENT_TAG}} -d ${{DOMAIN}} -r ${{REGISTRY}} -rs ${{REGISTRY_SECRET}} -e prod -i osb-portal \ No newline at end of file diff --git a/deployment-configuration/codefresh-template-prod.yaml b/deployment-configuration/codefresh-template-prod.yaml new file mode 100644 index 00000000..df63eca3 --- /dev/null +++ b/deployment-configuration/codefresh-template-prod.yaml @@ -0,0 +1,9 @@ +steps: + prepare_deployment: + title: "Prepare helm chart" + image: python:3.7 + stage: prepare + working_directory: . + commands: + - pip install cloud-harness/utilities + - harness-deployment . cloud-harness -m build -t ${{DEPLOYMENT_TAG}} -d ${{DOMAIN}} -r ${{REGISTRY}} -rs ${{REGISTRY_SECRET}} -e prod -i osb-portal \ No newline at end of file diff --git a/deployment-configuration/codefresh-template.yaml b/deployment-configuration/codefresh-template.yaml deleted file mode 100644 index 37f991cd..00000000 --- a/deployment-configuration/codefresh-template.yaml +++ /dev/null @@ -1,75 +0,0 @@ -version: '1.0' -stages: - - prepare - - build - - deploy -steps: - main_clone: - title: Clone main repository - type: git-clone - stage: prepare - repo: '${{CF_REPO_OWNER}}/${{CF_REPO_NAME}}' - revision: '${{CF_BRANCH}}' - git: github - post_main_clone: - title: Post main clone - type: parallel - stage: prepare - steps: - - title: Cloning cloud-harness repository... - type: git-clone - stage: prepare - repo: 'https://github.com/MetaCell/cloud-harness.git' - revision: '${{CLOUDHARNESS_BRANCH}}' - working_directory: . - git: github - build_base_images: - title: Build base images - type: parallel - stage: build - steps: - REPLACE_ME - build_static_images: - title: Build static images - type: parallel - stage: build - steps: - REPLACE_ME - build_application_images: - type: parallel - stage: build - steps: - REPLACE_ME - - prepare_deployment: - title: "Prepare helm chart" - image: python:3.7 - stage: prepare - working_directory: . - commands: - - pip install cloud-harness/utilities - - harness-deployment cloud-harness . -m build -t ${{CF_BUILD_ID}} -d ${{DOMAIN}} -r ${{REGISTRY}} -rs ${{REGISTRY_SECRET}} - prepare_deployment_view: - commands: - - 'helm template ./deployment/helm --debug -n ${{NAME}}' - environment: - - ACTION=auth - - KUBE_CONTEXT=${{CLUSTER_NAME}} - image: codefresh/cfstep-helm:2.16.1 - stage: prepare - title: 'View helm chart' - - deployment: - stage: deploy - image: codefresh/cfstep-helm:3.0.3 - title: Installing chart - environment: - - CHART_REF=./deployment/helm - - RELEASE_NAME=${{NAMESPACE}} - - KUBE_CONTEXT=${{CLUSTER_NAME}} - - NAMESPACE=${{NAMESPACE}} - - CHART_VERSION=0.0.1 - - HELM_REPO_USE_HTTP=false - - HELM_REPO_CONTEXT_PATH= - - TIMEOUT=600s - - VALUESFILE_values=./deployment/helm/values.yaml diff --git a/deployment-configuration/values-template.yaml b/deployment-configuration/values-template.yaml index 44d3de3a..c71e734e 100644 --- a/deployment-configuration/values-template.yaml +++ b/deployment-configuration/values-template.yaml @@ -1,2 +1,3 @@ domain: v2.opensourcebrain.org namespace: osb2 +mainapp: osb-portal \ No newline at end of file From 895812e4c72f7fbd407d4342f6a8e50de0297a37 Mon Sep 17 00:00:00 2001 From: Filippo Ledda Date: Tue, 9 Feb 2021 20:16:27 +0100 Subject: [PATCH 003/321] #91 deployments definition updated --- deployment/codefresh-dev.yaml | 490 +++++++++++++++++++++++++++++++++ deployment/codefresh-prod.yaml | 253 +++++++++++++++++ 2 files changed, 743 insertions(+) create mode 100644 deployment/codefresh-dev.yaml create mode 100644 deployment/codefresh-prod.yaml diff --git a/deployment/codefresh-dev.yaml b/deployment/codefresh-dev.yaml new file mode 100644 index 00000000..be83967f --- /dev/null +++ b/deployment/codefresh-dev.yaml @@ -0,0 +1,490 @@ +version: '1.0' +stages: +- prepare +- build +- deploy +- publish +steps: + main_clone: + title: Clone main repository + type: git-clone + stage: prepare + repo: '${{CF_REPO_OWNER}}/${{CF_REPO_NAME}}' + revision: '${{CF_BRANCH}}' + git: github + post_main_clone: + title: Post main clone + type: parallel + stage: prepare + steps: + - title: Cloning cloud-harness repository... + type: git-clone + stage: prepare + repo: https://github.com/MetaCell/cloud-harness.git + revision: '${{CLOUDHARNESS_BRANCH}}' + working_directory: . + git: github + prepare_deployment: + title: Prepare helm chart + image: python:3.7 + stage: prepare + working_directory: . + commands: + - pip install cloud-harness/utilities + - harness-deployment . cloud-harness -m build -t ${{DEPLOYMENT_TAG}} -d ${{DOMAIN}} + -r ${{REGISTRY}} -rs ${{REGISTRY_SECRET}} -e prod -i osb-portal + prepare_deployment_view: + commands: + - helm template ./deployment/helm --debug -n ${{NAMESPACE}} + environment: + - ACTION=auth + - KUBE_CONTEXT=${{NAMESPACE}} + image: codefresh/cfstep-helm:3.4.1 + stage: prepare + title: View helm chart + build_base_images: + title: Build base images + type: parallel + stage: build + steps: + cloudharness-base: + type: build + stage: build + tag: '${{CF_BUILD_ID}}' + dockerfile: infrastructure/base-images/cloudharness-base/Dockerfile + build_arguments: + - REGISTRY=${{REGISTRY}} + - TAG=${{CF_BUILD_ID}} + - NAMESPACE=${{NAMESPACE}} + - DOMAIN=${{DOMAIN}} + registry: '${{CODEFRESH_REGISTRY}}' + no_cf_cache: false + image_name: cloudharness-base + title: Cloudharness base + working_directory: ./build + cloudharness-base-debian: + type: build + stage: build + tag: '${{CF_BUILD_ID}}' + dockerfile: infrastructure/base-images/cloudharness-base-debian/Dockerfile + build_arguments: + - REGISTRY=${{REGISTRY}} + - TAG=${{CF_BUILD_ID}} + - NAMESPACE=${{NAMESPACE}} + - DOMAIN=${{DOMAIN}} + registry: '${{CODEFRESH_REGISTRY}}' + no_cf_cache: false + image_name: cloudharness-base-debian + title: Cloudharness base debian + working_directory: ./build + cloudharness-frontend-build: + type: build + stage: build + tag: '${{CF_BUILD_ID}}' + dockerfile: infrastructure/base-images/cloudharness-frontend-build/Dockerfile + build_arguments: + - REGISTRY=${{REGISTRY}} + - TAG=${{CF_BUILD_ID}} + - NAMESPACE=${{NAMESPACE}} + - DOMAIN=${{DOMAIN}} + registry: '${{CODEFRESH_REGISTRY}}' + no_cf_cache: false + image_name: cloudharness-frontend-build + title: Cloudharness frontend build + working_directory: ./build + build_static_images: + title: Build static images + type: parallel + stage: build + steps: + cloudharness-flask: + type: build + stage: build + tag: '${{CF_BUILD_ID}}' + dockerfile: Dockerfile + build_arguments: + - REGISTRY=${{REGISTRY}} + - TAG=${{CF_BUILD_ID}} + - NAMESPACE=${{NAMESPACE}} + - DOMAIN=${{DOMAIN}} + registry: '${{CODEFRESH_REGISTRY}}' + no_cf_cache: false + image_name: cloudharness-flask + title: Cloudharness flask + working_directory: ./build/infrastructure/common-images/cloudharness-flask + build_application_images: + type: parallel + stage: build + steps: + volumemanager: + type: build + stage: build + tag: '${{CF_BUILD_ID}}' + dockerfile: Dockerfile + build_arguments: + - REGISTRY=${{REGISTRY}} + - TAG=${{CF_BUILD_ID}} + - NAMESPACE=${{NAMESPACE}} + - DOMAIN=${{DOMAIN}} + registry: '${{CODEFRESH_REGISTRY}}' + no_cf_cache: false + image_name: volumemanager + title: Volumemanager + working_directory: ./build/applications/volumemanager/server + accounts: + type: build + stage: build + tag: '${{CF_BUILD_ID}}' + dockerfile: Dockerfile + build_arguments: + - REGISTRY=${{REGISTRY}} + - TAG=${{CF_BUILD_ID}} + - NAMESPACE=${{NAMESPACE}} + - DOMAIN=${{DOMAIN}} + registry: '${{CODEFRESH_REGISTRY}}' + no_cf_cache: false + image_name: accounts + title: Accounts + working_directory: ./build/applications/accounts + osb-portal: + type: build + stage: build + tag: '${{CF_BUILD_ID}}' + dockerfile: Dockerfile + build_arguments: + - REGISTRY=${{REGISTRY}} + - TAG=${{CF_BUILD_ID}} + - NAMESPACE=${{NAMESPACE}} + - DOMAIN=${{DOMAIN}} + registry: '${{CODEFRESH_REGISTRY}}' + no_cf_cache: false + image_name: osb-portal + title: Osb portal + working_directory: ./build/applications/osb-portal + common: + type: build + stage: build + tag: '${{CF_BUILD_ID}}' + dockerfile: Dockerfile + build_arguments: + - REGISTRY=${{REGISTRY}} + - TAG=${{CF_BUILD_ID}} + - NAMESPACE=${{NAMESPACE}} + - DOMAIN=${{DOMAIN}} + registry: '${{CODEFRESH_REGISTRY}}' + no_cf_cache: false + image_name: common + title: Common + working_directory: ./build/applications/common/server + netpyne: + type: build + stage: build + tag: '${{CF_BUILD_ID}}' + dockerfile: Dockerfile + build_arguments: + - REGISTRY=${{REGISTRY}} + - TAG=${{CF_BUILD_ID}} + - NAMESPACE=${{NAMESPACE}} + - DOMAIN=${{DOMAIN}} + registry: '${{CODEFRESH_REGISTRY}}' + no_cf_cache: false + image_name: netpyne + title: Netpyne + working_directory: ./build/applications/netpyne + jupyterhub: + type: build + stage: build + tag: '${{CF_BUILD_ID}}' + dockerfile: Dockerfile + build_arguments: + - REGISTRY=${{REGISTRY}} + - TAG=${{CF_BUILD_ID}} + - NAMESPACE=${{NAMESPACE}} + - DOMAIN=${{DOMAIN}} + registry: '${{CODEFRESH_REGISTRY}}' + no_cf_cache: false + image_name: jupyterhub + title: Jupyterhub + working_directory: ./build/applications/jupyterhub + workspaces: + type: build + stage: build + tag: '${{CF_BUILD_ID}}' + dockerfile: Dockerfile + build_arguments: + - REGISTRY=${{REGISTRY}} + - TAG=${{CF_BUILD_ID}} + - NAMESPACE=${{NAMESPACE}} + - DOMAIN=${{DOMAIN}} + registry: '${{CODEFRESH_REGISTRY}}' + no_cf_cache: false + image_name: workspaces + title: Workspaces + working_directory: ./build/applications/workspaces/server + workflows-print-file: + type: build + stage: build + tag: '${{CF_BUILD_ID}}' + dockerfile: Dockerfile + build_arguments: + - REGISTRY=${{REGISTRY}} + - TAG=${{CF_BUILD_ID}} + - NAMESPACE=${{NAMESPACE}} + - DOMAIN=${{DOMAIN}} + registry: '${{CODEFRESH_REGISTRY}}' + no_cf_cache: false + image_name: workflows-print-file + title: Workflows print file + working_directory: ./build/applications/workflows/tasks/print-file + workflows-extract-download: + type: build + stage: build + tag: '${{CF_BUILD_ID}}' + dockerfile: Dockerfile + build_arguments: + - REGISTRY=${{REGISTRY}} + - TAG=${{CF_BUILD_ID}} + - NAMESPACE=${{NAMESPACE}} + - DOMAIN=${{DOMAIN}} + registry: '${{CODEFRESH_REGISTRY}}' + no_cf_cache: false + image_name: workflows-extract-download + title: Workflows extract download + working_directory: ./build/applications/workflows/tasks/extract-download + workflows-send-result-event: + type: build + stage: build + tag: '${{CF_BUILD_ID}}' + dockerfile: Dockerfile + build_arguments: + - REGISTRY=${{REGISTRY}} + - TAG=${{CF_BUILD_ID}} + - NAMESPACE=${{NAMESPACE}} + - DOMAIN=${{DOMAIN}} + registry: '${{CODEFRESH_REGISTRY}}' + no_cf_cache: false + image_name: workflows-send-result-event + title: Workflows send result event + working_directory: ./build/applications/workflows/tasks/send-result-event + workflows-notify-queue: + type: build + stage: build + tag: '${{CF_BUILD_ID}}' + dockerfile: Dockerfile + build_arguments: + - REGISTRY=${{REGISTRY}} + - TAG=${{CF_BUILD_ID}} + - NAMESPACE=${{NAMESPACE}} + - DOMAIN=${{DOMAIN}} + registry: '${{CODEFRESH_REGISTRY}}' + no_cf_cache: false + image_name: workflows-notify-queue + title: Workflows notify queue + working_directory: ./build/applications/workflows/tasks/notify-queue + workflows-extract-s3: + type: build + stage: build + tag: '${{CF_BUILD_ID}}' + dockerfile: Dockerfile + build_arguments: + - REGISTRY=${{REGISTRY}} + - TAG=${{CF_BUILD_ID}} + - NAMESPACE=${{NAMESPACE}} + - DOMAIN=${{DOMAIN}} + registry: '${{CODEFRESH_REGISTRY}}' + no_cf_cache: false + image_name: workflows-extract-s3 + title: Workflows extract s3 + working_directory: ./build/applications/workflows/tasks/extract-s3 + workflows: + type: build + stage: build + tag: '${{CF_BUILD_ID}}' + dockerfile: Dockerfile + build_arguments: + - REGISTRY=${{REGISTRY}} + - TAG=${{CF_BUILD_ID}} + - NAMESPACE=${{NAMESPACE}} + - DOMAIN=${{DOMAIN}} + registry: '${{CODEFRESH_REGISTRY}}' + no_cf_cache: false + image_name: workflows + title: Workflows + working_directory: ./build/applications/workflows/server + sentry: + type: build + stage: build + tag: '${{CF_BUILD_ID}}' + dockerfile: Dockerfile + build_arguments: + - REGISTRY=${{REGISTRY}} + - TAG=${{CF_BUILD_ID}} + - NAMESPACE=${{NAMESPACE}} + - DOMAIN=${{DOMAIN}} + registry: '${{CODEFRESH_REGISTRY}}' + no_cf_cache: false + image_name: sentry + title: Sentry + working_directory: ./build/applications/sentry + deployment: + stage: deploy + image: codefresh/cfstep-helm:3.4.1 + title: Installing chart + environment: + - CHART_REF=./deployment/helm + - RELEASE_NAME=${{NAMESPACE}} + - KUBE_CONTEXT=${{CLUSTER_NAME}} + - NAMESPACE=${{NAMESPACE}} + - CHART_VERSION=${{DEPLOYMENT_PUBLISH_TAG}} + - HELM_REPO_USE_HTTP=false + - HELM_REPO_CONTEXT_PATH= + - TIMEOUT=600s + - VALUESFILE_values=./deployment/helm/values.yaml + publish: + type: parallel + stage: publish + steps: + publish_cloudharness-base: + stage: publish + type: push + title: Cloudharness base + candidate: '${{REGISTRY}}/cloudharness-base:${{CF_BUILD_ID}}' + tags: + - '${{DEPLOYMENT_PUBLISH_TAG}}' + registry: '${{REGISTRY_PUBLISH_URL}}' + publish_cloudharness-base-debian: + stage: publish + type: push + title: Cloudharness base debian + candidate: '${{REGISTRY}}/cloudharness-base-debian:${{CF_BUILD_ID}}' + tags: + - '${{DEPLOYMENT_PUBLISH_TAG}}' + registry: '${{REGISTRY_PUBLISH_URL}}' + publish_cloudharness-frontend-build: + stage: publish + type: push + title: Cloudharness frontend build + candidate: '${{REGISTRY}}/cloudharness-frontend-build:${{CF_BUILD_ID}}' + tags: + - '${{DEPLOYMENT_PUBLISH_TAG}}' + registry: '${{REGISTRY_PUBLISH_URL}}' + publish_cloudharness-flask: + stage: publish + type: push + title: Cloudharness flask + candidate: '${{REGISTRY}}/cloudharness-flask:${{CF_BUILD_ID}}' + tags: + - '${{DEPLOYMENT_PUBLISH_TAG}}' + registry: '${{REGISTRY_PUBLISH_URL}}' + publish_volumemanager: + stage: publish + type: push + title: Volumemanager + candidate: '${{REGISTRY}}/volumemanager:${{CF_BUILD_ID}}' + tags: + - '${{DEPLOYMENT_PUBLISH_TAG}}' + registry: '${{REGISTRY_PUBLISH_URL}}' + publish_accounts: + stage: publish + type: push + title: Accounts + candidate: '${{REGISTRY}}/accounts:${{CF_BUILD_ID}}' + tags: + - '${{DEPLOYMENT_PUBLISH_TAG}}' + registry: '${{REGISTRY_PUBLISH_URL}}' + publish_osb-portal: + stage: publish + type: push + title: Osb portal + candidate: '${{REGISTRY}}/osb-portal:${{CF_BUILD_ID}}' + tags: + - '${{DEPLOYMENT_PUBLISH_TAG}}' + registry: '${{REGISTRY_PUBLISH_URL}}' + publish_common: + stage: publish + type: push + title: Common + candidate: '${{REGISTRY}}/common:${{CF_BUILD_ID}}' + tags: + - '${{DEPLOYMENT_PUBLISH_TAG}}' + registry: '${{REGISTRY_PUBLISH_URL}}' + publish_netpyne: + stage: publish + type: push + title: Netpyne + candidate: '${{REGISTRY}}/netpyne:${{CF_BUILD_ID}}' + tags: + - '${{DEPLOYMENT_PUBLISH_TAG}}' + registry: '${{REGISTRY_PUBLISH_URL}}' + publish_jupyterhub: + stage: publish + type: push + title: Jupyterhub + candidate: '${{REGISTRY}}/jupyterhub:${{CF_BUILD_ID}}' + tags: + - '${{DEPLOYMENT_PUBLISH_TAG}}' + registry: '${{REGISTRY_PUBLISH_URL}}' + publish_workspaces: + stage: publish + type: push + title: Workspaces + candidate: '${{REGISTRY}}/workspaces:${{CF_BUILD_ID}}' + tags: + - '${{DEPLOYMENT_PUBLISH_TAG}}' + registry: '${{REGISTRY_PUBLISH_URL}}' + publish_workflows-print-file: + stage: publish + type: push + title: Workflows print file + candidate: '${{REGISTRY}}/workflows-print-file:${{CF_BUILD_ID}}' + tags: + - '${{DEPLOYMENT_PUBLISH_TAG}}' + registry: '${{REGISTRY_PUBLISH_URL}}' + publish_workflows-extract-download: + stage: publish + type: push + title: Workflows extract download + candidate: '${{REGISTRY}}/workflows-extract-download:${{CF_BUILD_ID}}' + tags: + - '${{DEPLOYMENT_PUBLISH_TAG}}' + registry: '${{REGISTRY_PUBLISH_URL}}' + publish_workflows-send-result-event: + stage: publish + type: push + title: Workflows send result event + candidate: '${{REGISTRY}}/workflows-send-result-event:${{CF_BUILD_ID}}' + tags: + - '${{DEPLOYMENT_PUBLISH_TAG}}' + registry: '${{REGISTRY_PUBLISH_URL}}' + publish_workflows-notify-queue: + stage: publish + type: push + title: Workflows notify queue + candidate: '${{REGISTRY}}/workflows-notify-queue:${{CF_BUILD_ID}}' + tags: + - '${{DEPLOYMENT_PUBLISH_TAG}}' + registry: '${{REGISTRY_PUBLISH_URL}}' + publish_workflows-extract-s3: + stage: publish + type: push + title: Workflows extract s3 + candidate: '${{REGISTRY}}/workflows-extract-s3:${{CF_BUILD_ID}}' + tags: + - '${{DEPLOYMENT_PUBLISH_TAG}}' + registry: '${{REGISTRY_PUBLISH_URL}}' + publish_workflows: + stage: publish + type: push + title: Workflows + candidate: '${{REGISTRY}}/workflows:${{CF_BUILD_ID}}' + tags: + - '${{DEPLOYMENT_PUBLISH_TAG}}' + registry: '${{REGISTRY_PUBLISH_URL}}' + publish_sentry: + stage: publish + type: push + title: Sentry + candidate: '${{REGISTRY}}/sentry:${{CF_BUILD_ID}}' + tags: + - '${{DEPLOYMENT_PUBLISH_TAG}}' + registry: '${{REGISTRY_PUBLISH_URL}}' diff --git a/deployment/codefresh-prod.yaml b/deployment/codefresh-prod.yaml new file mode 100644 index 00000000..2933d3b4 --- /dev/null +++ b/deployment/codefresh-prod.yaml @@ -0,0 +1,253 @@ +version: '1.0' +stages: +- prepare +- deploy +- publish +steps: + main_clone: + title: Clone main repository + type: git-clone + stage: prepare + repo: '${{CF_REPO_OWNER}}/${{CF_REPO_NAME}}' + revision: '${{CF_BRANCH}}' + git: github + post_main_clone: + title: Post main clone + type: parallel + stage: prepare + steps: + - title: Cloning cloud-harness repository... + type: git-clone + stage: prepare + repo: https://github.com/MetaCell/cloud-harness.git + revision: '${{CLOUDHARNESS_BRANCH}}' + working_directory: . + git: github + prepare_deployment: + title: Prepare helm chart + image: python:3.7 + stage: prepare + working_directory: . + commands: + - pip install cloud-harness/utilities + - harness-deployment . cloud-harness -m build -t ${{DEPLOYMENT_TAG}} -d ${{DOMAIN}} + -r ${{REGISTRY}} -rs ${{REGISTRY_SECRET}} -e prod -i osb-portal + prepare_deployment_view: + commands: + - helm template ./deployment/helm --debug -n ${{NAMESPACE}} + environment: + - ACTION=auth + - KUBE_CONTEXT=${{NAMESPACE}} + image: codefresh/cfstep-helm:3.4.1 + stage: prepare + title: View helm chart + deployment: + stage: deploy + image: codefresh/cfstep-helm:3.4.1 + title: Installing chart + environment: + - CHART_REF=./deployment/helm + - RELEASE_NAME=${{NAMESPACE}} + - KUBE_CONTEXT=${{CLUSTER_NAME}} + - NAMESPACE=${{NAMESPACE}} + - CHART_VERSION=${{DEPLOYMENT_TAG}} + - HELM_REPO_USE_HTTP=false + - HELM_REPO_CONTEXT_PATH= + - TIMEOUT=600s + - VALUESFILE_values=./deployment/helm/values.yaml + approval: + type: pending-approval + stage: publish + title: Approve + description: Approve publication + timeout: + duration: 168 + finalState: approved + publish: + type: parallel + stage: publish + steps: + publish_cloudharness-base: + stage: publish + type: push + title: Cloudharness base + candidate: '${{REGISTRY}}/cloudharness-base:${{DEPLOYMENT_TAG}}' + tags: + - '${{DEPLOYMENT_PUBLISH_TAG}}' + - latest + registry: '${{REGISTRY_PUBLISH_URL}}' + publish_cloudharness-base-debian: + stage: publish + type: push + title: Cloudharness base debian + candidate: '${{REGISTRY}}/cloudharness-base-debian:${{DEPLOYMENT_TAG}}' + tags: + - '${{DEPLOYMENT_PUBLISH_TAG}}' + - latest + registry: '${{REGISTRY_PUBLISH_URL}}' + publish_cloudharness-frontend-build: + stage: publish + type: push + title: Cloudharness frontend build + candidate: '${{REGISTRY}}/cloudharness-frontend-build:${{DEPLOYMENT_TAG}}' + tags: + - '${{DEPLOYMENT_PUBLISH_TAG}}' + - latest + registry: '${{REGISTRY_PUBLISH_URL}}' + publish_cloudharness-flask: + stage: publish + type: push + title: Cloudharness flask + candidate: '${{REGISTRY}}/cloudharness-flask:${{DEPLOYMENT_TAG}}' + tags: + - '${{DEPLOYMENT_PUBLISH_TAG}}' + - latest + registry: '${{REGISTRY_PUBLISH_URL}}' + publish_volumemanager: + stage: publish + type: push + title: Volumemanager + candidate: '${{REGISTRY}}/volumemanager:${{DEPLOYMENT_TAG}}' + tags: + - '${{DEPLOYMENT_PUBLISH_TAG}}' + - latest + registry: '${{REGISTRY_PUBLISH_URL}}' + publish_accounts: + stage: publish + type: push + title: Accounts + candidate: '${{REGISTRY}}/accounts:${{DEPLOYMENT_TAG}}' + tags: + - '${{DEPLOYMENT_PUBLISH_TAG}}' + - latest + registry: '${{REGISTRY_PUBLISH_URL}}' + publish_osb-portal: + stage: publish + type: push + title: Osb portal + candidate: '${{REGISTRY}}/osb-portal:${{DEPLOYMENT_TAG}}' + tags: + - '${{DEPLOYMENT_PUBLISH_TAG}}' + - latest + registry: '${{REGISTRY_PUBLISH_URL}}' + publish_common: + stage: publish + type: push + title: Common + candidate: '${{REGISTRY}}/common:${{DEPLOYMENT_TAG}}' + tags: + - '${{DEPLOYMENT_PUBLISH_TAG}}' + - latest + registry: '${{REGISTRY_PUBLISH_URL}}' + publish_netpyne: + stage: publish + type: push + title: Netpyne + candidate: '${{REGISTRY}}/netpyne:${{DEPLOYMENT_TAG}}' + tags: + - '${{DEPLOYMENT_PUBLISH_TAG}}' + - latest + registry: '${{REGISTRY_PUBLISH_URL}}' + publish_jupyterhub: + stage: publish + type: push + title: Jupyterhub + candidate: '${{REGISTRY}}/jupyterhub:${{DEPLOYMENT_TAG}}' + tags: + - '${{DEPLOYMENT_PUBLISH_TAG}}' + - latest + registry: '${{REGISTRY_PUBLISH_URL}}' + publish_workspaces: + stage: publish + type: push + title: Workspaces + candidate: '${{REGISTRY}}/workspaces:${{DEPLOYMENT_TAG}}' + tags: + - '${{DEPLOYMENT_PUBLISH_TAG}}' + - latest + registry: '${{REGISTRY_PUBLISH_URL}}' + publish_workflows-print-file: + stage: publish + type: push + title: Workflows print file + candidate: '${{REGISTRY}}/workflows-print-file:${{DEPLOYMENT_TAG}}' + tags: + - '${{DEPLOYMENT_PUBLISH_TAG}}' + - latest + registry: '${{REGISTRY_PUBLISH_URL}}' + publish_workflows-extract-download: + stage: publish + type: push + title: Workflows extract download + candidate: '${{REGISTRY}}/workflows-extract-download:${{DEPLOYMENT_TAG}}' + tags: + - '${{DEPLOYMENT_PUBLISH_TAG}}' + - latest + registry: '${{REGISTRY_PUBLISH_URL}}' + publish_workflows-send-result-event: + stage: publish + type: push + title: Workflows send result event + candidate: '${{REGISTRY}}/workflows-send-result-event:${{DEPLOYMENT_TAG}}' + tags: + - '${{DEPLOYMENT_PUBLISH_TAG}}' + - latest + registry: '${{REGISTRY_PUBLISH_URL}}' + publish_workflows-notify-queue: + stage: publish + type: push + title: Workflows notify queue + candidate: '${{REGISTRY}}/workflows-notify-queue:${{DEPLOYMENT_TAG}}' + tags: + - '${{DEPLOYMENT_PUBLISH_TAG}}' + - latest + registry: '${{REGISTRY_PUBLISH_URL}}' + publish_workflows-extract-s3: + stage: publish + type: push + title: Workflows extract s3 + candidate: '${{REGISTRY}}/workflows-extract-s3:${{DEPLOYMENT_TAG}}' + tags: + - '${{DEPLOYMENT_PUBLISH_TAG}}' + - latest + registry: '${{REGISTRY_PUBLISH_URL}}' + publish_workflows: + stage: publish + type: push + title: Workflows + candidate: '${{REGISTRY}}/workflows:${{DEPLOYMENT_TAG}}' + tags: + - '${{DEPLOYMENT_PUBLISH_TAG}}' + - latest + registry: '${{REGISTRY_PUBLISH_URL}}' + publish_sentry: + stage: publish + type: push + title: Sentry + candidate: '${{REGISTRY}}/sentry:${{DEPLOYMENT_TAG}}' + tags: + - '${{DEPLOYMENT_PUBLISH_TAG}}' + - latest + registry: '${{REGISTRY_PUBLISH_URL}}' + when: + condition: + all: + whenVarExists: includes("${{DEPLOYMENT_PUBLISH_TAG}}", "{{DEPLOYMENT_PUBLISH_TAG}}") + == false + git-tag: + title: Performing git tagging + stage: publish + image: alpine/git:latest + commands: + - git tag ${{DEPLOYMENT_PUBLISH_TAG}} + - ORIGIN=$(git remote get-url origin) + - PROTOCOL=https:// + - REPLACEMENT=${PROTOCOL}${{REPO_TOKEN}}@ + - git remote set-url origin ${ORIGIN/$PROTOCOL/$REPLACEMENT} + - git push origin --tags + when: + condition: + all: + whenVarExists: includes("${{DEPLOYMENT_PUBLISH_TAG}}", "{{DEPLOYMENT_PUBLISH_TAG}}") + == false + whenVarExists2: includes("${{REPO_TOKEN}}", "{{REPO_TOKEN}}") == false From 05d8e54f839c261aa6de3b3d5249b817dcdca6ec Mon Sep 17 00:00:00 2001 From: Filippo Ledda Date: Tue, 9 Feb 2021 20:17:19 +0100 Subject: [PATCH 004/321] #90 Jupyterhub application starts --- .gitignore | 3 +- README.md | 2 +- applications/jupyterhub/Dockerfile | 14 ++-- applications/jupyterhub/deploy/values.yaml | 13 +++- .../jupyterhub/hub/jupyter_notebook_config.py | 65 +++++++++++++++++++ .../osb-portal/deploy/values-dev.yaml | 19 ++++++ applications/osb-portal/deploy/values.yaml | 12 ++++ .../osb-portal/src/types/workspace.ts | 8 +-- applications/workspaces/deploy/values.yaml | 6 ++ 9 files changed, 128 insertions(+), 14 deletions(-) create mode 100755 applications/jupyterhub/hub/jupyter_notebook_config.py create mode 100644 applications/osb-portal/deploy/values-dev.yaml diff --git a/.gitignore b/.gitignore index 1321f577..d78e2c02 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ cloud-harness .idea -**/helm \ No newline at end of file +**/helm +/build \ No newline at end of file diff --git a/README.md b/README.md index 0e08fc21..ad7bc1a6 100644 --- a/README.md +++ b/README.md @@ -95,7 +95,7 @@ At least 6GB of ram and 4 processors are needed to run MNP To create a new cluster, run ``` -minikube start --memory="6000mb" --cpus=4 --disk-size=80mb +minikube start --memory="6000mb" --cpus=4 --disk-size=60000mb ``` Enable the ingress addon: diff --git a/applications/jupyterhub/Dockerfile b/applications/jupyterhub/Dockerfile index db9349f4..6e5c6dac 100644 --- a/applications/jupyterhub/Dockerfile +++ b/applications/jupyterhub/Dockerfile @@ -1,14 +1,16 @@ -FROM jupyterhub/k8s-hub:0.9.0 +FROM jupyter/base-notebook:hub-1.1.0 USER root COPY src src RUN pip install ./src/harness_jupyter RUN pip install ./src/chauthenticator RUN pip install ./src/osb_jupyter -RUN chmod 777 /usr/local/lib/python3.6/dist-packages/ -R -COPY --chown=1000:1000 theming/page.html /usr/local/share/jupyterhub/templates/page.html -COPY --chown=1000:1000 theming/spawn_pending.html /usr/local/share/jupyterhub/templates/spawn_pending.html -COPY --chown=1000:1000 theming/hot_fix_for_eventsource.js /usr/local/share/jupyterhub/static/hot_fix_for_eventsource.js -USER jovyan +COPY --chown=1000:1000 theming/page.html /opt/conda/share/jupyterhub/templates/page.html +COPY --chown=1000:1000 theming/spawn_pending.html /opt/conda/share/jupyterhub/templates/spawn_pending.html +COPY --chown=1000:1000 theming/hot_fix_for_eventsource.js /opt/conda/share/jupyterhub/static/hot_fix_for_eventsource.js + +COPY hub/jupyter_notebook_config.py /etc/jupyter/jupyter_notebook_config.py + +USER jovyan \ No newline at end of file diff --git a/applications/jupyterhub/deploy/values.yaml b/applications/jupyterhub/deploy/values.yaml index ce84463f..2805d82a 100755 --- a/applications/jupyterhub/deploy/values.yaml +++ b/applications/jupyterhub/deploy/values.yaml @@ -1,11 +1,20 @@ harness: - subdomain: jupyter + subdomain: notebooks service: auto: false port: 80 name: proxy-public deployment: auto: false + jupyterhub: + args: ["--debug", "--NotebookApp.default_url=/lab"] + applicationHook: "osb_jupyter.change_pod_manifest" + extraConfig: + timing: | + c.Spawner.port = 8000 + c.Spawner.http_timeout = 300 + c.Spawner.start_timeout = 300 + c.JupyterHub.tornado_settings = { "headers": { "Content-Security-Policy": "frame-ancestors 'self' *.osb.local localhost *.opensourcebrain.org"}} custom: {} hub: allowNamedServers: true @@ -61,7 +70,7 @@ hub: c.Spawner.start_timeout = 300 c.JupyterHub.tornado_settings = { "headers": { "Content-Security-Policy": "frame-ancestors 'self' *.osb.local *.opensourcebrain.org *.v2.opensourcebrain.org"}} spawner: >- - c.Spawner.args = ["--port=8000"] + c.Spawner.args = [] extraConfigMap: {} extraEnv: {} extraContainers: [] diff --git a/applications/jupyterhub/hub/jupyter_notebook_config.py b/applications/jupyterhub/hub/jupyter_notebook_config.py new file mode 100755 index 00000000..17d24439 --- /dev/null +++ b/applications/jupyterhub/hub/jupyter_notebook_config.py @@ -0,0 +1,65 @@ +# Copyright (c) Jupyter Development Team. +# Distributed under the terms of the Modified BSD License. + +from jupyter_core.paths import jupyter_data_dir +import subprocess +import os +import errno +import stat + +c = get_config() +c.NotebookApp.ip = '0.0.0.0' +c.NotebookApp.port = 8888 +c.NotebookApp.open_browser = False + +# https://github.com/jupyter/notebook/issues/3130 +c.FileContentsManager.delete_to_trash = False + +print('*'*80) +print(c.NotebookApp.tornado_settings) +c.NotebookApp.tornado_settings = { + 'headers': { + 'Content-Security-Policy': "frame-ancestors 'self' localhost *.osb.local *.opensourcebrain.org", + } +} +print(c.NotebookApp.tornado_settings) +print('*'*80) + +# Generate a self-signed certificate +if 'GEN_CERT' in os.environ: + dir_name = jupyter_data_dir() + pem_file = os.path.join(dir_name, 'notebook.pem') + try: + os.makedirs(dir_name) + except OSError as exc: # Python >2.5 + if exc.errno == errno.EEXIST and os.path.isdir(dir_name): + pass + else: + raise + + # Generate an openssl.cnf file to set the distinguished name + cnf_file = os.path.join(os.getenv('CONDA_DIR', '/usr/lib'), 'ssl', 'openssl.cnf') + if not os.path.isfile(cnf_file): + with open(cnf_file, 'w') as fh: + fh.write('''\ +[req] +distinguished_name = req_distinguished_name +[req_distinguished_name] +''') + + # Generate a certificate if one doesn't exist on disk + subprocess.check_call(['openssl', 'req', '-new', + '-newkey', 'rsa:2048', + '-days', '365', + '-nodes', '-x509', + '-subj', '/C=XX/ST=XX/L=XX/O=generated/CN=generated', + '-keyout', pem_file, + '-out', pem_file]) + # Restrict access to the file + os.chmod(pem_file, stat.S_IRUSR | stat.S_IWUSR) + c.NotebookApp.certfile = pem_file + +# Change default umask for all subprocesses of the notebook server if set in +# the environment +if 'NB_UMASK' in os.environ: + os.umask(int(os.environ['NB_UMASK'], 8)) diff --git a/applications/osb-portal/deploy/values-dev.yaml b/applications/osb-portal/deploy/values-dev.yaml new file mode 100644 index 00000000..6647571d --- /dev/null +++ b/applications/osb-portal/deploy/values-dev.yaml @@ -0,0 +1,19 @@ +harness: + subdomain: www + secured: false + deployment: + auto: true + port: 3000 + service: + auto: true + port: 80 + name: portal + sentry: true + dependencies: + soft: + - accounts + - common + - volumemanager + - workspaces + - workflows + - jupyterhub \ No newline at end of file diff --git a/applications/osb-portal/deploy/values.yaml b/applications/osb-portal/deploy/values.yaml index df04d7f1..ec268896 100644 --- a/applications/osb-portal/deploy/values.yaml +++ b/applications/osb-portal/deploy/values.yaml @@ -3,8 +3,20 @@ harness: secured: false deployment: auto: true + port: 80 service: auto: true port: 80 name: portal sentry: true + dependencies: + soft: + - accounts + - common + - volumemanager + - workspaces + - workflows + - netpyne + - nwbexplorer + - jupyterhub + - sentry diff --git a/applications/osb-portal/src/types/workspace.ts b/applications/osb-portal/src/types/workspace.ts index bed46f24..d0b8e062 100644 --- a/applications/osb-portal/src/types/workspace.ts +++ b/applications/osb-portal/src/types/workspace.ts @@ -9,9 +9,9 @@ export interface OSBApplication { } export enum ResourceStatus { - pending= "PENDING", - available= "AVAILABLE", - error= "ERROR" + pending = "PENDING", + available = "AVAILABLE", + error = "ERROR" } export interface WorkspaceResource { workspaceId: number, @@ -32,7 +32,7 @@ export interface ResourceType { export const OSBApplications: { [id: string]: OSBApplication } = { nwbexplorer: { name: "NWB Explorer", subdomain: "nwbexplorer" }, netpyne: { name: "NetPyNE", subdomain: "netpyne" }, - jupyter: { name: "Jupyter", subdomain: "jupyter" }, + jupyter: { name: "Jupyter", subdomain: "notebooks" }, } diff --git a/applications/workspaces/deploy/values.yaml b/applications/workspaces/deploy/values.yaml index 9702be39..d43c3fee 100644 --- a/applications/workspaces/deploy/values.yaml +++ b/applications/workspaces/deploy/values.yaml @@ -14,6 +14,12 @@ harness: name: workspaces-images size: 4G mountpath: /usr/src/app/workspaces/static/workspaces + dependencies: + soft: + - events + - common + hard: + - argo postgres: name: workspaces-postgres-host port: 5432 From 251488d63afef028e4eb79f767926155d2b955bb Mon Sep 17 00:00:00 2001 From: Filippo Ledda Date: Wed, 10 Feb 2021 09:40:52 +0100 Subject: [PATCH 005/321] #90 Default notebook path set --- applications/jupyterhub/deploy/values.yaml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/applications/jupyterhub/deploy/values.yaml b/applications/jupyterhub/deploy/values.yaml index 2805d82a..bb965301 100755 --- a/applications/jupyterhub/deploy/values.yaml +++ b/applications/jupyterhub/deploy/values.yaml @@ -7,13 +7,14 @@ harness: deployment: auto: false jupyterhub: - args: ["--debug", "--NotebookApp.default_url=/lab"] + args: ["--debug", "--NotebookApp.default_url=/lab", "--NotebookApp.notebook_dir=/opt/workspace"] applicationHook: "osb_jupyter.change_pod_manifest" extraConfig: timing: | c.Spawner.port = 8000 c.Spawner.http_timeout = 300 c.Spawner.start_timeout = 300 + c.JupyterHub.tornado_settings = { "headers": { "Content-Security-Policy": "frame-ancestors 'self' *.osb.local localhost *.opensourcebrain.org"}} custom: {} hub: @@ -214,7 +215,7 @@ singleuser: dynamic: pvcNameTemplate: osb-jupyter-{userid} volumeNameTemplate: osb-jupyter-{userid} - homeMountPath: /opt/home + homeMountPath: /opt/workspace extraLabels: {} image: name: jupyter/base-notebook From c7523d43baeea538f68dc69776245d48aedb061b Mon Sep 17 00:00:00 2001 From: Filippo Ledda Date: Wed, 10 Feb 2021 10:17:25 +0100 Subject: [PATCH 006/321] #91 Fix dev deployment script --- deployment-configuration/codefresh-template-dev.yaml | 2 +- deployment/codefresh-dev.yaml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/deployment-configuration/codefresh-template-dev.yaml b/deployment-configuration/codefresh-template-dev.yaml index df63eca3..e78739e5 100644 --- a/deployment-configuration/codefresh-template-dev.yaml +++ b/deployment-configuration/codefresh-template-dev.yaml @@ -6,4 +6,4 @@ steps: working_directory: . commands: - pip install cloud-harness/utilities - - harness-deployment . cloud-harness -m build -t ${{DEPLOYMENT_TAG}} -d ${{DOMAIN}} -r ${{REGISTRY}} -rs ${{REGISTRY_SECRET}} -e prod -i osb-portal \ No newline at end of file + - harness-deployment . cloud-harness -m build -t ${{CF_BUILD_ID}} -d ${{DOMAIN}} -r ${{REGISTRY}} -rs ${{REGISTRY_SECRET}} -e dev -i osb-portal \ No newline at end of file diff --git a/deployment/codefresh-dev.yaml b/deployment/codefresh-dev.yaml index be83967f..77096557 100644 --- a/deployment/codefresh-dev.yaml +++ b/deployment/codefresh-dev.yaml @@ -31,8 +31,8 @@ steps: working_directory: . commands: - pip install cloud-harness/utilities - - harness-deployment . cloud-harness -m build -t ${{DEPLOYMENT_TAG}} -d ${{DOMAIN}} - -r ${{REGISTRY}} -rs ${{REGISTRY_SECRET}} -e prod -i osb-portal + - harness-deployment . cloud-harness -m build -t ${{CF_BUILD_ID}} -d ${{DOMAIN}} + -r ${{REGISTRY}} -rs ${{REGISTRY_SECRET}} -e dev -i osb-portal prepare_deployment_view: commands: - helm template ./deployment/helm --debug -n ${{NAMESPACE}} From 7285884f56a8d4c9bb30471ab202431ed9451aaa Mon Sep 17 00:00:00 2001 From: Filippo Ledda Date: Wed, 10 Feb 2021 12:56:35 +0100 Subject: [PATCH 007/321] #90 workspace defaults --- applications/jupyterhub/Dockerfile | 10 +++++++++- applications/jupyterhub/deploy/values.yaml | 2 +- .../src/components/workspace/NewWorkspaceItem.tsx | 4 ++-- deployment-configuration/values-template-dev.yaml | 2 ++ 4 files changed, 14 insertions(+), 4 deletions(-) create mode 100644 deployment-configuration/values-template-dev.yaml diff --git a/applications/jupyterhub/Dockerfile b/applications/jupyterhub/Dockerfile index 6e5c6dac..4595457a 100644 --- a/applications/jupyterhub/Dockerfile +++ b/applications/jupyterhub/Dockerfile @@ -13,4 +13,12 @@ COPY --chown=1000:1000 theming/hot_fix_for_eventsource.js /opt/conda/share/jupyt COPY hub/jupyter_notebook_config.py /etc/jupyter/jupyter_notebook_config.py -USER jovyan \ No newline at end of file +# Link jupyter lab workspace to osb workspace +RUN mkdir /opt/workspace +RUN chown jovyan /opt/workspace +USER jovyan +RUN mkdir -p .jupyter/lab +RUN ln -s /opt/workspace .jupyter/lab/workspaces + + +WORKDIR /opt/workspace \ No newline at end of file diff --git a/applications/jupyterhub/deploy/values.yaml b/applications/jupyterhub/deploy/values.yaml index bb965301..bef6a904 100755 --- a/applications/jupyterhub/deploy/values.yaml +++ b/applications/jupyterhub/deploy/values.yaml @@ -215,7 +215,7 @@ singleuser: dynamic: pvcNameTemplate: osb-jupyter-{userid} volumeNameTemplate: osb-jupyter-{userid} - homeMountPath: /opt/workspace + homeMountPath: /opt/home extraLabels: {} image: name: jupyter/base-notebook diff --git a/applications/osb-portal/src/components/workspace/NewWorkspaceItem.tsx b/applications/osb-portal/src/components/workspace/NewWorkspaceItem.tsx index 0b06bf6c..de402928 100644 --- a/applications/osb-portal/src/components/workspace/NewWorkspaceItem.tsx +++ b/applications/osb-portal/src/components/workspace/NewWorkspaceItem.tsx @@ -60,7 +60,7 @@ const WORKSPACE_TEMPLATES: { [id: string]: Workspace } = { resources: [{ name: "notebook.ipynb", type: SampleResourceTypes.g, - location: "notebook.ipynb.location", + location: window.location + "/workspace-data/notebook.ipynb", workspaceId: -1 }], volume: null, @@ -93,7 +93,7 @@ export default (props: ItemProps) => { const closeAskLogin = () => setAskLoginOpen(false); - const closeNewWorkspace = (refresh= false) => { + const closeNewWorkspace = (refresh = false) => { setNewWorkspaceOpen(false); if (refresh) { props.refreshWorkspaces(); diff --git a/deployment-configuration/values-template-dev.yaml b/deployment-configuration/values-template-dev.yaml new file mode 100644 index 00000000..6b178e82 --- /dev/null +++ b/deployment-configuration/values-template-dev.yaml @@ -0,0 +1,2 @@ +backup: + active: false \ No newline at end of file From 8cd93e648132e2fb7b90d688e4e235526b4ae740 Mon Sep 17 00:00:00 2001 From: Filippo Ledda Date: Wed, 10 Feb 2021 14:24:05 +0100 Subject: [PATCH 008/321] #91 Namespace assignment fix --- .../osb-portal/src/components/workspace/NewWorkspaceItem.tsx | 2 +- deployment-configuration/values-template.yaml | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/applications/osb-portal/src/components/workspace/NewWorkspaceItem.tsx b/applications/osb-portal/src/components/workspace/NewWorkspaceItem.tsx index de402928..eca6cc19 100644 --- a/applications/osb-portal/src/components/workspace/NewWorkspaceItem.tsx +++ b/applications/osb-portal/src/components/workspace/NewWorkspaceItem.tsx @@ -60,7 +60,7 @@ const WORKSPACE_TEMPLATES: { [id: string]: Workspace } = { resources: [{ name: "notebook.ipynb", type: SampleResourceTypes.g, - location: window.location + "/workspace-data/notebook.ipynb", + location: window.location.origin + "/workspace-data/notebook.ipynb", workspaceId: -1 }], volume: null, diff --git a/deployment-configuration/values-template.yaml b/deployment-configuration/values-template.yaml index c71e734e..9246057e 100644 --- a/deployment-configuration/values-template.yaml +++ b/deployment-configuration/values-template.yaml @@ -1,3 +1,2 @@ domain: v2.opensourcebrain.org -namespace: osb2 mainapp: osb-portal \ No newline at end of file From c5bc2699aa2f89f5a349d71bcdff13cb3306d9fe Mon Sep 17 00:00:00 2001 From: Filippo Ledda Date: Wed, 10 Feb 2021 15:17:04 +0100 Subject: [PATCH 009/321] #91 Update deployment --- deployment-configuration/codefresh-template-dev.yaml | 2 +- deployment-configuration/codefresh-template-prod.yaml | 2 +- deployment/codefresh-dev.yaml | 2 +- deployment/codefresh-prod.yaml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/deployment-configuration/codefresh-template-dev.yaml b/deployment-configuration/codefresh-template-dev.yaml index e78739e5..57469663 100644 --- a/deployment-configuration/codefresh-template-dev.yaml +++ b/deployment-configuration/codefresh-template-dev.yaml @@ -6,4 +6,4 @@ steps: working_directory: . commands: - pip install cloud-harness/utilities - - harness-deployment . cloud-harness -m build -t ${{CF_BUILD_ID}} -d ${{DOMAIN}} -r ${{REGISTRY}} -rs ${{REGISTRY_SECRET}} -e dev -i osb-portal \ No newline at end of file + - harness-deployment . cloud-harness -m build -t ${{CF_BUILD_ID}} -d ${{DOMAIN}} -r ${{REGISTRY}} -n ${{NAMESPACE}} -rs ${{REGISTRY_SECRET}} -e dev -i osb-portal \ No newline at end of file diff --git a/deployment-configuration/codefresh-template-prod.yaml b/deployment-configuration/codefresh-template-prod.yaml index df63eca3..e538747e 100644 --- a/deployment-configuration/codefresh-template-prod.yaml +++ b/deployment-configuration/codefresh-template-prod.yaml @@ -6,4 +6,4 @@ steps: working_directory: . commands: - pip install cloud-harness/utilities - - harness-deployment . cloud-harness -m build -t ${{DEPLOYMENT_TAG}} -d ${{DOMAIN}} -r ${{REGISTRY}} -rs ${{REGISTRY_SECRET}} -e prod -i osb-portal \ No newline at end of file + - harness-deployment . cloud-harness -m build -t ${{DEPLOYMENT_TAG}} -d ${{DOMAIN}} -r ${{REGISTRY}} -n ${{NAMESPACE}} -rs ${{REGISTRY_SECRET}} -e prod -i osb-portal \ No newline at end of file diff --git a/deployment/codefresh-dev.yaml b/deployment/codefresh-dev.yaml index 77096557..7c1832ee 100644 --- a/deployment/codefresh-dev.yaml +++ b/deployment/codefresh-dev.yaml @@ -32,7 +32,7 @@ steps: commands: - pip install cloud-harness/utilities - harness-deployment . cloud-harness -m build -t ${{CF_BUILD_ID}} -d ${{DOMAIN}} - -r ${{REGISTRY}} -rs ${{REGISTRY_SECRET}} -e dev -i osb-portal + -r ${{REGISTRY}} -n ${{NAMESPACE}} -rs ${{REGISTRY_SECRET}} -e dev -i osb-portal prepare_deployment_view: commands: - helm template ./deployment/helm --debug -n ${{NAMESPACE}} diff --git a/deployment/codefresh-prod.yaml b/deployment/codefresh-prod.yaml index 2933d3b4..98551180 100644 --- a/deployment/codefresh-prod.yaml +++ b/deployment/codefresh-prod.yaml @@ -31,7 +31,7 @@ steps: commands: - pip install cloud-harness/utilities - harness-deployment . cloud-harness -m build -t ${{DEPLOYMENT_TAG}} -d ${{DOMAIN}} - -r ${{REGISTRY}} -rs ${{REGISTRY_SECRET}} -e prod -i osb-portal + -r ${{REGISTRY}} -n ${{NAMESPACE}} -rs ${{REGISTRY_SECRET}} -e prod -i osb-portal prepare_deployment_view: commands: - helm template ./deployment/helm --debug -n ${{NAMESPACE}} From 593e4f467c2672cf65ae23b90af30845ce906193 Mon Sep 17 00:00:00 2001 From: Filippo Ledda Date: Wed, 10 Feb 2021 15:54:19 +0100 Subject: [PATCH 010/321] #91 Update deployment --- applications/osb-portal/deploy/values.yaml | 2 +- deployment/codefresh-dev.yaml | 23 ++++++++++++++++++++++ deployment/codefresh-prod.yaml | 9 +++++++++ 3 files changed, 33 insertions(+), 1 deletion(-) diff --git a/applications/osb-portal/deploy/values.yaml b/applications/osb-portal/deploy/values.yaml index ec268896..127513d1 100644 --- a/applications/osb-portal/deploy/values.yaml +++ b/applications/osb-portal/deploy/values.yaml @@ -17,6 +17,6 @@ harness: - workspaces - workflows - netpyne - - nwbexplorer + - nwb-explorer - jupyterhub - sentry diff --git a/deployment/codefresh-dev.yaml b/deployment/codefresh-dev.yaml index 7c1832ee..a22ac4c2 100644 --- a/deployment/codefresh-dev.yaml +++ b/deployment/codefresh-dev.yaml @@ -191,6 +191,21 @@ steps: image_name: netpyne title: Netpyne working_directory: ./build/applications/netpyne + nwb-explorer: + type: build + stage: build + tag: '${{CF_BUILD_ID}}' + dockerfile: Dockerfile + build_arguments: + - REGISTRY=${{REGISTRY}} + - TAG=${{CF_BUILD_ID}} + - NAMESPACE=${{NAMESPACE}} + - DOMAIN=${{DOMAIN}} + registry: '${{CODEFRESH_REGISTRY}}' + no_cf_cache: false + image_name: nwb-explorer + title: Nwb explorer + working_directory: ./build/applications/nwb-explorer jupyterhub: type: build stage: build @@ -416,6 +431,14 @@ steps: tags: - '${{DEPLOYMENT_PUBLISH_TAG}}' registry: '${{REGISTRY_PUBLISH_URL}}' + publish_nwb-explorer: + stage: publish + type: push + title: Nwb explorer + candidate: '${{REGISTRY}}/nwb-explorer:${{CF_BUILD_ID}}' + tags: + - '${{DEPLOYMENT_PUBLISH_TAG}}' + registry: '${{REGISTRY_PUBLISH_URL}}' publish_jupyterhub: stage: publish type: push diff --git a/deployment/codefresh-prod.yaml b/deployment/codefresh-prod.yaml index 98551180..27b130a2 100644 --- a/deployment/codefresh-prod.yaml +++ b/deployment/codefresh-prod.yaml @@ -148,6 +148,15 @@ steps: - '${{DEPLOYMENT_PUBLISH_TAG}}' - latest registry: '${{REGISTRY_PUBLISH_URL}}' + publish_nwb-explorer: + stage: publish + type: push + title: Nwb explorer + candidate: '${{REGISTRY}}/nwb-explorer:${{DEPLOYMENT_TAG}}' + tags: + - '${{DEPLOYMENT_PUBLISH_TAG}}' + - latest + registry: '${{REGISTRY_PUBLISH_URL}}' publish_jupyterhub: stage: publish type: push From 780cc19d71fc68063c3ada7fa9bbc751d5b35997 Mon Sep 17 00:00:00 2001 From: Filippo Ledda Date: Wed, 10 Feb 2021 15:55:48 +0100 Subject: [PATCH 011/321] #91 Update deployment --- .../osb-portal/deploy/values-dev.yaml | 19 ------------------- 1 file changed, 19 deletions(-) diff --git a/applications/osb-portal/deploy/values-dev.yaml b/applications/osb-portal/deploy/values-dev.yaml index 6647571d..e69de29b 100644 --- a/applications/osb-portal/deploy/values-dev.yaml +++ b/applications/osb-portal/deploy/values-dev.yaml @@ -1,19 +0,0 @@ -harness: - subdomain: www - secured: false - deployment: - auto: true - port: 3000 - service: - auto: true - port: 80 - name: portal - sentry: true - dependencies: - soft: - - accounts - - common - - volumemanager - - workspaces - - workflows - - jupyterhub \ No newline at end of file From 9ae328b8f69c6524ff062d67f55ee695a60f524b Mon Sep 17 00:00:00 2001 From: Filippo Ledda Date: Wed, 10 Feb 2021 15:57:59 +0100 Subject: [PATCH 012/321] #91 Update deployment --- applications/osb-portal/deploy/values-dev.yaml | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 applications/osb-portal/deploy/values-dev.yaml diff --git a/applications/osb-portal/deploy/values-dev.yaml b/applications/osb-portal/deploy/values-dev.yaml deleted file mode 100644 index e69de29b..00000000 From 4e6e99a3761a3736fe66f5b7f9e46920dbdc592b Mon Sep 17 00:00:00 2001 From: Filippo Ledda Date: Wed, 10 Feb 2021 17:33:03 +0100 Subject: [PATCH 013/321] #91 Update deployment --- deployment-configuration/codefresh-template-dev.yaml | 2 +- deployment-configuration/codefresh-template-prod.yaml | 2 +- deployment/codefresh-dev.yaml | 2 +- deployment/codefresh-prod.yaml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/deployment-configuration/codefresh-template-dev.yaml b/deployment-configuration/codefresh-template-dev.yaml index 57469663..be068742 100644 --- a/deployment-configuration/codefresh-template-dev.yaml +++ b/deployment-configuration/codefresh-template-dev.yaml @@ -6,4 +6,4 @@ steps: working_directory: . commands: - pip install cloud-harness/utilities - - harness-deployment . cloud-harness -m build -t ${{CF_BUILD_ID}} -d ${{DOMAIN}} -r ${{REGISTRY}} -n ${{NAMESPACE}} -rs ${{REGISTRY_SECRET}} -e dev -i osb-portal \ No newline at end of file + - harness-deployment cloud-harness . -m build -t ${{CF_BUILD_ID}} -d ${{DOMAIN}} -r ${{REGISTRY}} -n ${{NAMESPACE}} -rs ${{REGISTRY_SECRET}} -e dev -i osb-portal \ No newline at end of file diff --git a/deployment-configuration/codefresh-template-prod.yaml b/deployment-configuration/codefresh-template-prod.yaml index e538747e..a25b2cc5 100644 --- a/deployment-configuration/codefresh-template-prod.yaml +++ b/deployment-configuration/codefresh-template-prod.yaml @@ -6,4 +6,4 @@ steps: working_directory: . commands: - pip install cloud-harness/utilities - - harness-deployment . cloud-harness -m build -t ${{DEPLOYMENT_TAG}} -d ${{DOMAIN}} -r ${{REGISTRY}} -n ${{NAMESPACE}} -rs ${{REGISTRY_SECRET}} -e prod -i osb-portal \ No newline at end of file + - harness-deployment cloud-harness . -m build -t ${{DEPLOYMENT_TAG}} -d ${{DOMAIN}} -r ${{REGISTRY}} -n ${{NAMESPACE}} -rs ${{REGISTRY_SECRET}} -e prod -i osb-portal \ No newline at end of file diff --git a/deployment/codefresh-dev.yaml b/deployment/codefresh-dev.yaml index a22ac4c2..6bcc2509 100644 --- a/deployment/codefresh-dev.yaml +++ b/deployment/codefresh-dev.yaml @@ -31,7 +31,7 @@ steps: working_directory: . commands: - pip install cloud-harness/utilities - - harness-deployment . cloud-harness -m build -t ${{CF_BUILD_ID}} -d ${{DOMAIN}} + - harness-deployment cloud-harness . -m build -t ${{CF_BUILD_ID}} -d ${{DOMAIN}} -r ${{REGISTRY}} -n ${{NAMESPACE}} -rs ${{REGISTRY_SECRET}} -e dev -i osb-portal prepare_deployment_view: commands: diff --git a/deployment/codefresh-prod.yaml b/deployment/codefresh-prod.yaml index 27b130a2..bff53637 100644 --- a/deployment/codefresh-prod.yaml +++ b/deployment/codefresh-prod.yaml @@ -30,7 +30,7 @@ steps: working_directory: . commands: - pip install cloud-harness/utilities - - harness-deployment . cloud-harness -m build -t ${{DEPLOYMENT_TAG}} -d ${{DOMAIN}} + - harness-deployment cloud-harness . -m build -t ${{DEPLOYMENT_TAG}} -d ${{DOMAIN}} -r ${{REGISTRY}} -n ${{NAMESPACE}} -rs ${{REGISTRY_SECRET}} -e prod -i osb-portal prepare_deployment_view: commands: From 25b6cbc2e5c5ec42b429f171f03500895d68ba95 Mon Sep 17 00:00:00 2001 From: Filippo Ledda Date: Wed, 10 Feb 2021 18:26:37 +0100 Subject: [PATCH 014/321] #91 fix deployment --- .../codefresh-build-template.yaml | 8 -- deployment/codefresh-dev.yaml | 76 +++++-------------- 2 files changed, 19 insertions(+), 65 deletions(-) delete mode 100644 deployment-configuration/codefresh-build-template.yaml diff --git a/deployment-configuration/codefresh-build-template.yaml b/deployment-configuration/codefresh-build-template.yaml deleted file mode 100644 index 45abae73..00000000 --- a/deployment-configuration/codefresh-build-template.yaml +++ /dev/null @@ -1,8 +0,0 @@ -registry: ${{CODEFRESH_REGISTRY}} -no_cf_cache: false -tag: ${{CF_BUILD_ID}} -build_arguments: - - REGISTRY=${{REGISTRY}} - - TAG=${{CF_BUILD_ID}} - - NAMESPACE=${{NAMESPACE}} - - DOMAIN=${{DOMAIN}} diff --git a/deployment/codefresh-dev.yaml b/deployment/codefresh-dev.yaml index 6bcc2509..fdaf9a6a 100644 --- a/deployment/codefresh-dev.yaml +++ b/deployment/codefresh-dev.yaml @@ -53,12 +53,10 @@ steps: tag: '${{CF_BUILD_ID}}' dockerfile: infrastructure/base-images/cloudharness-base/Dockerfile build_arguments: - - REGISTRY=${{REGISTRY}} + - REGISTRY=${{REGISTRY}}/ - TAG=${{CF_BUILD_ID}} - NAMESPACE=${{NAMESPACE}} - DOMAIN=${{DOMAIN}} - registry: '${{CODEFRESH_REGISTRY}}' - no_cf_cache: false image_name: cloudharness-base title: Cloudharness base working_directory: ./build @@ -68,12 +66,10 @@ steps: tag: '${{CF_BUILD_ID}}' dockerfile: infrastructure/base-images/cloudharness-base-debian/Dockerfile build_arguments: - - REGISTRY=${{REGISTRY}} + - REGISTRY=${{REGISTRY}}/ - TAG=${{CF_BUILD_ID}} - NAMESPACE=${{NAMESPACE}} - DOMAIN=${{DOMAIN}} - registry: '${{CODEFRESH_REGISTRY}}' - no_cf_cache: false image_name: cloudharness-base-debian title: Cloudharness base debian working_directory: ./build @@ -83,12 +79,10 @@ steps: tag: '${{CF_BUILD_ID}}' dockerfile: infrastructure/base-images/cloudharness-frontend-build/Dockerfile build_arguments: - - REGISTRY=${{REGISTRY}} + - REGISTRY=${{REGISTRY}}/ - TAG=${{CF_BUILD_ID}} - NAMESPACE=${{NAMESPACE}} - DOMAIN=${{DOMAIN}} - registry: '${{CODEFRESH_REGISTRY}}' - no_cf_cache: false image_name: cloudharness-frontend-build title: Cloudharness frontend build working_directory: ./build @@ -103,12 +97,10 @@ steps: tag: '${{CF_BUILD_ID}}' dockerfile: Dockerfile build_arguments: - - REGISTRY=${{REGISTRY}} + - REGISTRY=${{REGISTRY}}/ - TAG=${{CF_BUILD_ID}} - NAMESPACE=${{NAMESPACE}} - DOMAIN=${{DOMAIN}} - registry: '${{CODEFRESH_REGISTRY}}' - no_cf_cache: false image_name: cloudharness-flask title: Cloudharness flask working_directory: ./build/infrastructure/common-images/cloudharness-flask @@ -122,12 +114,10 @@ steps: tag: '${{CF_BUILD_ID}}' dockerfile: Dockerfile build_arguments: - - REGISTRY=${{REGISTRY}} + - REGISTRY=${{REGISTRY}}/ - TAG=${{CF_BUILD_ID}} - NAMESPACE=${{NAMESPACE}} - DOMAIN=${{DOMAIN}} - registry: '${{CODEFRESH_REGISTRY}}' - no_cf_cache: false image_name: volumemanager title: Volumemanager working_directory: ./build/applications/volumemanager/server @@ -137,12 +127,10 @@ steps: tag: '${{CF_BUILD_ID}}' dockerfile: Dockerfile build_arguments: - - REGISTRY=${{REGISTRY}} + - REGISTRY=${{REGISTRY}}/ - TAG=${{CF_BUILD_ID}} - NAMESPACE=${{NAMESPACE}} - DOMAIN=${{DOMAIN}} - registry: '${{CODEFRESH_REGISTRY}}' - no_cf_cache: false image_name: accounts title: Accounts working_directory: ./build/applications/accounts @@ -152,12 +140,10 @@ steps: tag: '${{CF_BUILD_ID}}' dockerfile: Dockerfile build_arguments: - - REGISTRY=${{REGISTRY}} + - REGISTRY=${{REGISTRY}}/ - TAG=${{CF_BUILD_ID}} - NAMESPACE=${{NAMESPACE}} - DOMAIN=${{DOMAIN}} - registry: '${{CODEFRESH_REGISTRY}}' - no_cf_cache: false image_name: osb-portal title: Osb portal working_directory: ./build/applications/osb-portal @@ -167,12 +153,10 @@ steps: tag: '${{CF_BUILD_ID}}' dockerfile: Dockerfile build_arguments: - - REGISTRY=${{REGISTRY}} + - REGISTRY=${{REGISTRY}}/ - TAG=${{CF_BUILD_ID}} - NAMESPACE=${{NAMESPACE}} - DOMAIN=${{DOMAIN}} - registry: '${{CODEFRESH_REGISTRY}}' - no_cf_cache: false image_name: common title: Common working_directory: ./build/applications/common/server @@ -182,12 +166,10 @@ steps: tag: '${{CF_BUILD_ID}}' dockerfile: Dockerfile build_arguments: - - REGISTRY=${{REGISTRY}} + - REGISTRY=${{REGISTRY}}/ - TAG=${{CF_BUILD_ID}} - NAMESPACE=${{NAMESPACE}} - DOMAIN=${{DOMAIN}} - registry: '${{CODEFRESH_REGISTRY}}' - no_cf_cache: false image_name: netpyne title: Netpyne working_directory: ./build/applications/netpyne @@ -197,12 +179,10 @@ steps: tag: '${{CF_BUILD_ID}}' dockerfile: Dockerfile build_arguments: - - REGISTRY=${{REGISTRY}} + - REGISTRY=${{REGISTRY}}/ - TAG=${{CF_BUILD_ID}} - NAMESPACE=${{NAMESPACE}} - DOMAIN=${{DOMAIN}} - registry: '${{CODEFRESH_REGISTRY}}' - no_cf_cache: false image_name: nwb-explorer title: Nwb explorer working_directory: ./build/applications/nwb-explorer @@ -212,12 +192,10 @@ steps: tag: '${{CF_BUILD_ID}}' dockerfile: Dockerfile build_arguments: - - REGISTRY=${{REGISTRY}} + - REGISTRY=${{REGISTRY}}/ - TAG=${{CF_BUILD_ID}} - NAMESPACE=${{NAMESPACE}} - DOMAIN=${{DOMAIN}} - registry: '${{CODEFRESH_REGISTRY}}' - no_cf_cache: false image_name: jupyterhub title: Jupyterhub working_directory: ./build/applications/jupyterhub @@ -227,12 +205,10 @@ steps: tag: '${{CF_BUILD_ID}}' dockerfile: Dockerfile build_arguments: - - REGISTRY=${{REGISTRY}} + - REGISTRY=${{REGISTRY}}/ - TAG=${{CF_BUILD_ID}} - NAMESPACE=${{NAMESPACE}} - DOMAIN=${{DOMAIN}} - registry: '${{CODEFRESH_REGISTRY}}' - no_cf_cache: false image_name: workspaces title: Workspaces working_directory: ./build/applications/workspaces/server @@ -242,12 +218,10 @@ steps: tag: '${{CF_BUILD_ID}}' dockerfile: Dockerfile build_arguments: - - REGISTRY=${{REGISTRY}} + - REGISTRY=${{REGISTRY}}/ - TAG=${{CF_BUILD_ID}} - NAMESPACE=${{NAMESPACE}} - DOMAIN=${{DOMAIN}} - registry: '${{CODEFRESH_REGISTRY}}' - no_cf_cache: false image_name: workflows-print-file title: Workflows print file working_directory: ./build/applications/workflows/tasks/print-file @@ -257,12 +231,10 @@ steps: tag: '${{CF_BUILD_ID}}' dockerfile: Dockerfile build_arguments: - - REGISTRY=${{REGISTRY}} + - REGISTRY=${{REGISTRY}}/ - TAG=${{CF_BUILD_ID}} - NAMESPACE=${{NAMESPACE}} - DOMAIN=${{DOMAIN}} - registry: '${{CODEFRESH_REGISTRY}}' - no_cf_cache: false image_name: workflows-extract-download title: Workflows extract download working_directory: ./build/applications/workflows/tasks/extract-download @@ -272,12 +244,10 @@ steps: tag: '${{CF_BUILD_ID}}' dockerfile: Dockerfile build_arguments: - - REGISTRY=${{REGISTRY}} + - REGISTRY=${{REGISTRY}}/ - TAG=${{CF_BUILD_ID}} - NAMESPACE=${{NAMESPACE}} - DOMAIN=${{DOMAIN}} - registry: '${{CODEFRESH_REGISTRY}}' - no_cf_cache: false image_name: workflows-send-result-event title: Workflows send result event working_directory: ./build/applications/workflows/tasks/send-result-event @@ -287,12 +257,10 @@ steps: tag: '${{CF_BUILD_ID}}' dockerfile: Dockerfile build_arguments: - - REGISTRY=${{REGISTRY}} + - REGISTRY=${{REGISTRY}}/ - TAG=${{CF_BUILD_ID}} - NAMESPACE=${{NAMESPACE}} - DOMAIN=${{DOMAIN}} - registry: '${{CODEFRESH_REGISTRY}}' - no_cf_cache: false image_name: workflows-notify-queue title: Workflows notify queue working_directory: ./build/applications/workflows/tasks/notify-queue @@ -302,12 +270,10 @@ steps: tag: '${{CF_BUILD_ID}}' dockerfile: Dockerfile build_arguments: - - REGISTRY=${{REGISTRY}} + - REGISTRY=${{REGISTRY}}/ - TAG=${{CF_BUILD_ID}} - NAMESPACE=${{NAMESPACE}} - DOMAIN=${{DOMAIN}} - registry: '${{CODEFRESH_REGISTRY}}' - no_cf_cache: false image_name: workflows-extract-s3 title: Workflows extract s3 working_directory: ./build/applications/workflows/tasks/extract-s3 @@ -317,12 +283,10 @@ steps: tag: '${{CF_BUILD_ID}}' dockerfile: Dockerfile build_arguments: - - REGISTRY=${{REGISTRY}} + - REGISTRY=${{REGISTRY}}/ - TAG=${{CF_BUILD_ID}} - NAMESPACE=${{NAMESPACE}} - DOMAIN=${{DOMAIN}} - registry: '${{CODEFRESH_REGISTRY}}' - no_cf_cache: false image_name: workflows title: Workflows working_directory: ./build/applications/workflows/server @@ -332,12 +296,10 @@ steps: tag: '${{CF_BUILD_ID}}' dockerfile: Dockerfile build_arguments: - - REGISTRY=${{REGISTRY}} + - REGISTRY=${{REGISTRY}}/ - TAG=${{CF_BUILD_ID}} - NAMESPACE=${{NAMESPACE}} - DOMAIN=${{DOMAIN}} - registry: '${{CODEFRESH_REGISTRY}}' - no_cf_cache: false image_name: sentry title: Sentry working_directory: ./build/applications/sentry From 475cbeb688233c375e8eac7d678c4007dd5f0612 Mon Sep 17 00:00:00 2001 From: Filippo Ledda Date: Wed, 10 Feb 2021 18:53:05 +0100 Subject: [PATCH 015/321] #91 fix codefresh build --- .../codefresh-build-template.yaml | 1 + deployment/codefresh-dev.yaml | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+) create mode 100644 deployment-configuration/codefresh-build-template.yaml diff --git a/deployment-configuration/codefresh-build-template.yaml b/deployment-configuration/codefresh-build-template.yaml new file mode 100644 index 00000000..b5f3d241 --- /dev/null +++ b/deployment-configuration/codefresh-build-template.yaml @@ -0,0 +1 @@ +registry: '${{CODEFRESH_REGISTRY}}' diff --git a/deployment/codefresh-dev.yaml b/deployment/codefresh-dev.yaml index fdaf9a6a..2769cf6d 100644 --- a/deployment/codefresh-dev.yaml +++ b/deployment/codefresh-dev.yaml @@ -52,6 +52,7 @@ steps: stage: build tag: '${{CF_BUILD_ID}}' dockerfile: infrastructure/base-images/cloudharness-base/Dockerfile + registry: '${{CODEFRESH_REGISTRY}}' build_arguments: - REGISTRY=${{REGISTRY}}/ - TAG=${{CF_BUILD_ID}} @@ -65,6 +66,7 @@ steps: stage: build tag: '${{CF_BUILD_ID}}' dockerfile: infrastructure/base-images/cloudharness-base-debian/Dockerfile + registry: '${{CODEFRESH_REGISTRY}}' build_arguments: - REGISTRY=${{REGISTRY}}/ - TAG=${{CF_BUILD_ID}} @@ -78,6 +80,7 @@ steps: stage: build tag: '${{CF_BUILD_ID}}' dockerfile: infrastructure/base-images/cloudharness-frontend-build/Dockerfile + registry: '${{CODEFRESH_REGISTRY}}' build_arguments: - REGISTRY=${{REGISTRY}}/ - TAG=${{CF_BUILD_ID}} @@ -96,6 +99,7 @@ steps: stage: build tag: '${{CF_BUILD_ID}}' dockerfile: Dockerfile + registry: '${{CODEFRESH_REGISTRY}}' build_arguments: - REGISTRY=${{REGISTRY}}/ - TAG=${{CF_BUILD_ID}} @@ -113,6 +117,7 @@ steps: stage: build tag: '${{CF_BUILD_ID}}' dockerfile: Dockerfile + registry: '${{CODEFRESH_REGISTRY}}' build_arguments: - REGISTRY=${{REGISTRY}}/ - TAG=${{CF_BUILD_ID}} @@ -126,6 +131,7 @@ steps: stage: build tag: '${{CF_BUILD_ID}}' dockerfile: Dockerfile + registry: '${{CODEFRESH_REGISTRY}}' build_arguments: - REGISTRY=${{REGISTRY}}/ - TAG=${{CF_BUILD_ID}} @@ -139,6 +145,7 @@ steps: stage: build tag: '${{CF_BUILD_ID}}' dockerfile: Dockerfile + registry: '${{CODEFRESH_REGISTRY}}' build_arguments: - REGISTRY=${{REGISTRY}}/ - TAG=${{CF_BUILD_ID}} @@ -152,6 +159,7 @@ steps: stage: build tag: '${{CF_BUILD_ID}}' dockerfile: Dockerfile + registry: '${{CODEFRESH_REGISTRY}}' build_arguments: - REGISTRY=${{REGISTRY}}/ - TAG=${{CF_BUILD_ID}} @@ -165,6 +173,7 @@ steps: stage: build tag: '${{CF_BUILD_ID}}' dockerfile: Dockerfile + registry: '${{CODEFRESH_REGISTRY}}' build_arguments: - REGISTRY=${{REGISTRY}}/ - TAG=${{CF_BUILD_ID}} @@ -178,6 +187,7 @@ steps: stage: build tag: '${{CF_BUILD_ID}}' dockerfile: Dockerfile + registry: '${{CODEFRESH_REGISTRY}}' build_arguments: - REGISTRY=${{REGISTRY}}/ - TAG=${{CF_BUILD_ID}} @@ -191,6 +201,7 @@ steps: stage: build tag: '${{CF_BUILD_ID}}' dockerfile: Dockerfile + registry: '${{CODEFRESH_REGISTRY}}' build_arguments: - REGISTRY=${{REGISTRY}}/ - TAG=${{CF_BUILD_ID}} @@ -204,6 +215,7 @@ steps: stage: build tag: '${{CF_BUILD_ID}}' dockerfile: Dockerfile + registry: '${{CODEFRESH_REGISTRY}}' build_arguments: - REGISTRY=${{REGISTRY}}/ - TAG=${{CF_BUILD_ID}} @@ -217,6 +229,7 @@ steps: stage: build tag: '${{CF_BUILD_ID}}' dockerfile: Dockerfile + registry: '${{CODEFRESH_REGISTRY}}' build_arguments: - REGISTRY=${{REGISTRY}}/ - TAG=${{CF_BUILD_ID}} @@ -230,6 +243,7 @@ steps: stage: build tag: '${{CF_BUILD_ID}}' dockerfile: Dockerfile + registry: '${{CODEFRESH_REGISTRY}}' build_arguments: - REGISTRY=${{REGISTRY}}/ - TAG=${{CF_BUILD_ID}} @@ -243,6 +257,7 @@ steps: stage: build tag: '${{CF_BUILD_ID}}' dockerfile: Dockerfile + registry: '${{CODEFRESH_REGISTRY}}' build_arguments: - REGISTRY=${{REGISTRY}}/ - TAG=${{CF_BUILD_ID}} @@ -256,6 +271,7 @@ steps: stage: build tag: '${{CF_BUILD_ID}}' dockerfile: Dockerfile + registry: '${{CODEFRESH_REGISTRY}}' build_arguments: - REGISTRY=${{REGISTRY}}/ - TAG=${{CF_BUILD_ID}} @@ -269,6 +285,7 @@ steps: stage: build tag: '${{CF_BUILD_ID}}' dockerfile: Dockerfile + registry: '${{CODEFRESH_REGISTRY}}' build_arguments: - REGISTRY=${{REGISTRY}}/ - TAG=${{CF_BUILD_ID}} @@ -282,6 +299,7 @@ steps: stage: build tag: '${{CF_BUILD_ID}}' dockerfile: Dockerfile + registry: '${{CODEFRESH_REGISTRY}}' build_arguments: - REGISTRY=${{REGISTRY}}/ - TAG=${{CF_BUILD_ID}} @@ -295,6 +313,7 @@ steps: stage: build tag: '${{CF_BUILD_ID}}' dockerfile: Dockerfile + registry: '${{CODEFRESH_REGISTRY}}' build_arguments: - REGISTRY=${{REGISTRY}}/ - TAG=${{CF_BUILD_ID}} From d3e7213965d0a1bba6530bce6cd67501aa2c038c Mon Sep 17 00:00:00 2001 From: Filippo Ledda Date: Wed, 10 Feb 2021 19:54:39 +0100 Subject: [PATCH 016/321] #91 fix osb portal image to work on different workspaces --- applications/osb-portal/Dockerfile | 2 - .../osb-portal/deploy/values-local.yaml | 10 +++ applications/osb-portal/webpack.common.js | 5 +- applications/osb-portal/webpack.dev.js | 68 +++++++++++-------- 4 files changed, 52 insertions(+), 33 deletions(-) create mode 100644 applications/osb-portal/deploy/values-local.yaml diff --git a/applications/osb-portal/Dockerfile b/applications/osb-portal/Dockerfile index 5c7aad6f..668be4b6 100644 --- a/applications/osb-portal/Dockerfile +++ b/applications/osb-portal/Dockerfile @@ -1,6 +1,4 @@ FROM node:13.14 as base -ARG DOMAIN=v2.opensourcebrain.org -ARG NAMESPACE=osb2 ENV BUILDDIR=/builddir COPY package.json ${BUILDDIR}/package.json diff --git a/applications/osb-portal/deploy/values-local.yaml b/applications/osb-portal/deploy/values-local.yaml new file mode 100644 index 00000000..b2728792 --- /dev/null +++ b/applications/osb-portal/deploy/values-local.yaml @@ -0,0 +1,10 @@ +harness: + dependencies: + soft: + - accounts + - common + - volumemanager + - workspaces + - workflows + - jupyterhub + - sentry diff --git a/applications/osb-portal/webpack.common.js b/applications/osb-portal/webpack.common.js index 5d394ce5..b2f95b95 100644 --- a/applications/osb-portal/webpack.common.js +++ b/applications/osb-portal/webpack.common.js @@ -79,11 +79,8 @@ module.exports = env => { plugins: [ new CleanWebpackPlugin(), new CopyPlugin([ - { + { from: './src/assets-parametrized', contentbase, - transform(content, path) { - return setEnv(content); - } }, { from: './src/assets', contentbase, diff --git a/applications/osb-portal/webpack.dev.js b/applications/osb-portal/webpack.dev.js index 9f818336..b616768f 100644 --- a/applications/osb-portal/webpack.dev.js +++ b/applications/osb-portal/webpack.dev.js @@ -8,7 +8,7 @@ const contentbase = path.join(__dirname, 'public') PORT = 3000; var proxyTarget = 'https://__APP_NAME__/' -if (process.env.USE_MOCKS){ +if (process.env.USE_MOCKS) { console.log('Using mocks') proxyTarget = `http://localhost:${PORT}/api-mocks` } @@ -19,34 +19,48 @@ module.exports = env => { const osbDomain = env && env.DOMAIN ? env.DOMAIN : 'osb.local'; const replaceHost = (uri, appName) => uri.replace("__APP_NAME__", appName + '.' + osbDomain); return merge( - { - mode: 'development', - devtool: 'eval-source-map', - devServer: { - contentBase: path.resolve(__dirname, 'public'), - publicPath: '/', - filename: path.join('js', 'bundle.js'), - compress: true, - https: true, - disableHostCheck: true, - historyApiFallback: true, - proxy : { - '/api/workspaces': { - target : replaceHost( proxyTarget, 'workspaces'), - secure : false, - changeOrigin: true, - pathRewrite: {'^/api/workspaces' : ''} + { + mode: 'development', + devtool: 'eval-source-map', + devServer: { + contentBase: path.resolve(__dirname, 'public'), + publicPath: '/', + filename: path.join('js', 'bundle.js'), + compress: true, + https: true, + disableHostCheck: true, + historyApiFallback: true, + proxy: { + '/api/workspaces': { + target: replaceHost(proxyTarget, 'workspaces'), + secure: false, + changeOrigin: true, + pathRewrite: { '^/api/workspaces': '' } + }, + '/workspaces/': { + target: replaceHost(proxyTarget, 'workspaces'), + secure: false, + changeOrigin: true, + } + }, + port: PORT, + }, - '/workspaces/': { - target : replaceHost( proxyTarget, 'workspaces'), - secure : false, - changeOrigin: true, - } - }, - port: PORT - }, + plugins: [ + new CopyPlugin([ + { + from: './src/assets-parametrized', contentbase, + transform(content, path) { + return setEnv(content); + } + }, + { + from: './src/assets', contentbase, + }, + ]), + ], -}, common(env)) + }, common(env)) }; From cc703bea3cd20ab0b6950666afb6b38c3387e40f Mon Sep 17 00:00:00 2001 From: Filippo Ledda Date: Tue, 23 Feb 2021 18:28:57 +0100 Subject: [PATCH 017/321] #97 Database backups set --- .gitignore | 4 +- applications/accounts/deploy/values.yaml | 20 - applications/osb-portal/.dockerignore | 3 +- applications/osb-portal/Dockerfile | 2 +- applications/osb-portal/README.md | 11 + applications/osb-portal/deploy/nginx.conf | 88 - .../osb-portal/deploy/resources/keycloak.json | 9 + applications/osb-portal/deploy/values.yaml | 8 +- applications/osb-portal/package-lock.json | 8 +- applications/osb-portal/package.json | 4 +- .../src/assets/thirdparties/keycloak.js | 1677 ----------------- applications/osb-portal/webpack.common.js | 38 +- applications/osb-portal/webpack.dev.js | 9 + applications/workspaces/deploy/values.yaml | 3 + applications/workspaces/server/.dockerignore | 1 - applications/workspaces/server/Dockerfile | 10 +- .../workspaces/server/workspaces/__main__.py | 53 +- .../server/workspaces/repository/database.py | 4 +- .../server/workspaces/repository/models.py | 18 +- .../values-template-dev.yaml | 4 +- deployment/codefresh-dev.yaml | 50 +- deployment/codefresh-prod.yaml | 21 +- 22 files changed, 136 insertions(+), 1909 deletions(-) delete mode 100644 applications/accounts/deploy/values.yaml delete mode 100644 applications/osb-portal/deploy/nginx.conf create mode 100644 applications/osb-portal/deploy/resources/keycloak.json delete mode 100644 applications/osb-portal/src/assets/thirdparties/keycloak.js diff --git a/.gitignore b/.gitignore index d78e2c02..16b2995a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,6 @@ cloud-harness .idea **/helm -/build \ No newline at end of file +/build +.vscode +skaffold.yaml diff --git a/applications/accounts/deploy/values.yaml b/applications/accounts/deploy/values.yaml deleted file mode 100644 index 8247034e..00000000 --- a/applications/accounts/deploy/values.yaml +++ /dev/null @@ -1,20 +0,0 @@ -harness: - name: accounts - subdomain: accounts - secured: false - deployment: - auto: false - replicas: 1 - name: accounts - port: 8080 - resources: - requests: - memory: "32Mi" - cpu: "25m" - limits: - memory: "500Mi" - cpu: "500m" - service: - auto: true - name: accounts - port: 8080 diff --git a/applications/osb-portal/.dockerignore b/applications/osb-portal/.dockerignore index 2ee4b584..a4416c4f 100644 --- a/applications/osb-portal/.dockerignore +++ b/applications/osb-portal/.dockerignore @@ -3,4 +3,5 @@ *docker-compose* node_modules **/node_modules -public \ No newline at end of file +public +/deploy \ No newline at end of file diff --git a/applications/osb-portal/Dockerfile b/applications/osb-portal/Dockerfile index 668be4b6..2a7a8538 100644 --- a/applications/osb-portal/Dockerfile +++ b/applications/osb-portal/Dockerfile @@ -15,7 +15,7 @@ COPY --from=base $BUILDDIR/public /usr/share/nginx/html EXPOSE 80 RUN mv /etc/nginx/nginx.conf /etc/nginx/nginx.conf.orig -COPY deploy/nginx.conf /etc/nginx/nginx.conf +COPY nginx.conf /etc/nginx/nginx.conf ADD entrypoint.sh /entrypoint.sh RUN chmod +x /entrypoint.sh diff --git a/applications/osb-portal/README.md b/applications/osb-portal/README.md index 57bd2da2..bd88e42b 100644 --- a/applications/osb-portal/README.md +++ b/applications/osb-portal/README.md @@ -79,6 +79,17 @@ replace `export type FetchAPI = GlobalFetch['fetch'];` with export type FetchAPI = WindowOrWorkerGlobalScope['fetch']; ``` +# Trubleshooting + +## 502 error on registration + +The error is related to ingress nginx proxy size. +Edit the configmap nginx-load-balancer-conf (or nginx-ingress-controller) and set value: + +```yaml +data: + "proxy-buffer-size": "16k" +``` diff --git a/applications/osb-portal/deploy/nginx.conf b/applications/osb-portal/deploy/nginx.conf deleted file mode 100644 index 05f515cd..00000000 --- a/applications/osb-portal/deploy/nginx.conf +++ /dev/null @@ -1,88 +0,0 @@ - -user nginx; -worker_processes auto; - -error_log /var/log/nginx/error.log warn; -pid /var/run/nginx.pid; - - -events { - worker_connections 1024; -} - - -http { - include /etc/nginx/mime.types; - default_type application/octet-stream; - - log_format main '$remote_addr - $remote_user [$time_local] "$request" ' - '$status $body_bytes_sent "$http_referer" ' - '"$http_user_agent" "$http_x_forwarded_for"'; - - access_log /var/log/nginx/access.log main; - - sendfile on; - #tcp_nopush on; - - keepalive_timeout 65; - - gzip on; - - server { - listen 80; - server_name localhost; - - #charset koi8-r; - #access_log /var/log/nginx/host.access.log main; - - location / { - root /usr/share/nginx/html; - try_files $uri /index.html; - } - - # - location ~ ^/api/(?.*?)/(?.*$) { - resolver kube-dns.kube-system.svc.cluster.local; - set $bcknd http://$subdomain.__REALM__.svc.cluster.local:8080/$path$is_args$args; - proxy_pass $bcknd; - } - - location ~ ^/workspaces/(?.*$) { - resolver kube-dns.kube-system.svc.cluster.local; - set $bcknd http://workspaces.__REALM__.svc.cluster.local:8080/workspaces/$path$is_args$args; - proxy_pass $bcknd; - } - - #error_page 404 /404.html; - - # redirect server error pages to the static page /50x.html - # - error_page 500 502 503 504 /50x.html; - location = /50x.html { - root /usr/share/nginx/html; - } - - # proxy the PHP scripts to Apache listening on 127.0.0.1:80 - # - #location ~ \.php$ { - # proxy_pass http://127.0.0.1; - #} - - # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 - # - #location ~ \.php$ { - # root html; - # fastcgi_pass 127.0.0.1:9000; - # fastcgi_index index.php; - # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; - # include fastcgi_params; - #} - - # deny access to .htaccess files, if Apache's document root - # concurs with nginx's one - # - #location ~ /\.ht { - # deny all; - #} - } -} \ No newline at end of file diff --git a/applications/osb-portal/deploy/resources/keycloak.json b/applications/osb-portal/deploy/resources/keycloak.json new file mode 100644 index 00000000..c33cae58 --- /dev/null +++ b/applications/osb-portal/deploy/resources/keycloak.json @@ -0,0 +1,9 @@ +{ + "realm": {{ .Values.namespace | quote }}, + "auth-server-url": {{ (printf "https://%s.%s/auth" .Values.apps.accounts.harness.subdomain .Values.domain) | quote }}, + "ssl-required": "external", + "resource": "web-client", + "public-client": true, + "verify-token-audience": true, + "confidential-port": 0 +} \ No newline at end of file diff --git a/applications/osb-portal/deploy/values.yaml b/applications/osb-portal/deploy/values.yaml index 127513d1..c6875754 100644 --- a/applications/osb-portal/deploy/values.yaml +++ b/applications/osb-portal/deploy/values.yaml @@ -7,8 +7,14 @@ harness: service: auto: true port: 80 - name: portal + resources: + - name: "keycloak" + src: "keycloak.json" + dst: "/usr/share/nginx/html/keycloak.json" sentry: true + use_services: + - name: workspaces + - name: common dependencies: soft: - accounts diff --git a/applications/osb-portal/package-lock.json b/applications/osb-portal/package-lock.json index 86f19f47..4ca0c0e6 100644 --- a/applications/osb-portal/package-lock.json +++ b/applications/osb-portal/package-lock.json @@ -1,6 +1,6 @@ { "name": "frontend", - "version": "1.0.0", + "version": "0.2.0", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -4018,9 +4018,9 @@ } }, "keycloak-js": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/keycloak-js/-/keycloak-js-10.0.2.tgz", - "integrity": "sha512-7nkg4Ob1khHGcNbuK36AMndKUEuIQFpNlWU9ygWs7nSBPCI9VZ8dJjjXfKJHm0ewgcqLFGPIJ6bxxRlfcQ6sLg==", + "version": "12.0.2", + "resolved": "https://registry.npmjs.org/keycloak-js/-/keycloak-js-12.0.2.tgz", + "integrity": "sha512-wiONyeVlKFMqYvfKsGwjBJbB1AQJfTnDcJzxEKuPkk6dA7AEnl1IdT2sytxr4Fatwm7kNgmgmK8qKjRI1pBwkQ==", "requires": { "base64-js": "1.3.1", "js-sha256": "0.9.0" diff --git a/applications/osb-portal/package.json b/applications/osb-portal/package.json index a1b02597..9aa7e962 100644 --- a/applications/osb-portal/package.json +++ b/applications/osb-portal/package.json @@ -1,6 +1,6 @@ { "name": "frontend", - "version": "1.0.0", + "version": "0.2.0", "description": "", "main": "index.js", "scripts": { @@ -59,7 +59,7 @@ "@sentry/react": "^5.19.1", "@types/markdown-it": "^10.0.1", "axios": "^0.19.2", - "keycloak-js": "^10.0.2", + "keycloak-js": "^12.0.0", "less-vars-to-js": "^1.3.0", "markdown-it": "^10.0.0", "react": "^16.13.1", diff --git a/applications/osb-portal/src/assets/thirdparties/keycloak.js b/applications/osb-portal/src/assets/thirdparties/keycloak.js deleted file mode 100644 index 0f179cb1..00000000 --- a/applications/osb-portal/src/assets/thirdparties/keycloak.js +++ /dev/null @@ -1,1677 +0,0 @@ -/* - * Copyright 2016 Red Hat, Inc. and/or its affiliates - * and other contributors as indicated by the @author tags. - * - * 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. - */ - -(function(root, factory) { - if ( typeof exports === 'object' ) { - if ( typeof module === 'object' ) { - module.exports = factory( require("js-sha256"), require("base64-js") ); - } else { - exports["keycloak"] = factory( require("js-sha256"), require("base64-js") ); - } - } else { - /** - * [js-sha256]{@link https://github.com/emn178/js-sha256} - * - * @version 0.9.0 - * @author Chen, Yi-Cyuan [emn178@gmail.com] - * @copyright Chen, Yi-Cyuan 2014-2017 - * @license MIT - */ - !function () { "use strict"; function t(t, i) { i ? (d[0] = d[16] = d[1] = d[2] = d[3] = d[4] = d[5] = d[6] = d[7] = d[8] = d[9] = d[10] = d[11] = d[12] = d[13] = d[14] = d[15] = 0, this.blocks = d) : this.blocks = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], t ? (this.h0 = 3238371032, this.h1 = 914150663, this.h2 = 812702999, this.h3 = 4144912697, this.h4 = 4290775857, this.h5 = 1750603025, this.h6 = 1694076839, this.h7 = 3204075428) : (this.h0 = 1779033703, this.h1 = 3144134277, this.h2 = 1013904242, this.h3 = 2773480762, this.h4 = 1359893119, this.h5 = 2600822924, this.h6 = 528734635, this.h7 = 1541459225), this.block = this.start = this.bytes = this.hBytes = 0, this.finalized = this.hashed = !1, this.first = !0, this.is224 = t } function i(i, r, s) { var e, n = typeof i; if ("string" === n) { var o, a = [], u = i.length, c = 0; for (e = 0; e < u; ++e)(o = i.charCodeAt(e)) < 128 ? a[c++] = o : o < 2048 ? (a[c++] = 192 | o >> 6, a[c++] = 128 | 63 & o) : o < 55296 || o >= 57344 ? (a[c++] = 224 | o >> 12, a[c++] = 128 | o >> 6 & 63, a[c++] = 128 | 63 & o) : (o = 65536 + ((1023 & o) << 10 | 1023 & i.charCodeAt(++e)), a[c++] = 240 | o >> 18, a[c++] = 128 | o >> 12 & 63, a[c++] = 128 | o >> 6 & 63, a[c++] = 128 | 63 & o); i = a } else { if ("object" !== n) throw new Error(h); if (null === i) throw new Error(h); if (f && i.constructor === ArrayBuffer) i = new Uint8Array(i); else if (!(Array.isArray(i) || f && ArrayBuffer.isView(i))) throw new Error(h) } i.length > 64 && (i = new t(r, !0).update(i).array()); var y = [], p = []; for (e = 0; e < 64; ++e) { var l = i[e] || 0; y[e] = 92 ^ l, p[e] = 54 ^ l } t.call(this, r, s), this.update(p), this.oKeyPad = y, this.inner = !0, this.sharedMemory = s } var h = "input is invalid type", r = "object" == typeof window, s = r ? window : {}; s.JS_SHA256_NO_WINDOW && (r = !1); var e = !r && "object" == typeof self, n = !s.JS_SHA256_NO_NODE_JS && "object" == typeof process && process.versions && process.versions.node; n ? s = global : e && (s = self); var o = !s.JS_SHA256_NO_COMMON_JS && "object" == typeof module && module.exports, a = "function" == typeof define && define.amd, f = !s.JS_SHA256_NO_ARRAY_BUFFER && "undefined" != typeof ArrayBuffer, u = "0123456789abcdef".split(""), c = [-2147483648, 8388608, 32768, 128], y = [24, 16, 8, 0], p = [1116352408, 1899447441, 3049323471, 3921009573, 961987163, 1508970993, 2453635748, 2870763221, 3624381080, 310598401, 607225278, 1426881987, 1925078388, 2162078206, 2614888103, 3248222580, 3835390401, 4022224774, 264347078, 604807628, 770255983, 1249150122, 1555081692, 1996064986, 2554220882, 2821834349, 2952996808, 3210313671, 3336571891, 3584528711, 113926993, 338241895, 666307205, 773529912, 1294757372, 1396182291, 1695183700, 1986661051, 2177026350, 2456956037, 2730485921, 2820302411, 3259730800, 3345764771, 3516065817, 3600352804, 4094571909, 275423344, 430227734, 506948616, 659060556, 883997877, 958139571, 1322822218, 1537002063, 1747873779, 1955562222, 2024104815, 2227730452, 2361852424, 2428436474, 2756734187, 3204031479, 3329325298], l = ["hex", "array", "digest", "arrayBuffer"], d = []; !s.JS_SHA256_NO_NODE_JS && Array.isArray || (Array.isArray = function (t) { return "[object Array]" === Object.prototype.toString.call(t) }), !f || !s.JS_SHA256_NO_ARRAY_BUFFER_IS_VIEW && ArrayBuffer.isView || (ArrayBuffer.isView = function (t) { return "object" == typeof t && t.buffer && t.buffer.constructor === ArrayBuffer }); var A = function (i, h) { return function (r) { return new t(h, !0).update(r)[i]() } }, w = function (i) { var h = A("hex", i); n && (h = b(h, i)), h.create = function () { return new t(i) }, h.update = function (t) { return h.create().update(t) }; for (var r = 0; r < l.length; ++r) { var s = l[r]; h[s] = A(s, i) } return h }, b = function (t, i) { var r = eval("require('crypto')"), s = eval("require('buffer').Buffer"), e = i ? "sha224" : "sha256", n = function (i) { if ("string" == typeof i) return r.createHash(e).update(i, "utf8").digest("hex"); if (null === i || void 0 === i) throw new Error(h); return i.constructor === ArrayBuffer && (i = new Uint8Array(i)), Array.isArray(i) || ArrayBuffer.isView(i) || i.constructor === s ? r.createHash(e).update(new s(i)).digest("hex") : t(i) }; return n }, v = function (t, h) { return function (r, s) { return new i(r, h, !0).update(s)[t]() } }, _ = function (t) { var h = v("hex", t); h.create = function (h) { return new i(h, t) }, h.update = function (t, i) { return h.create(t).update(i) }; for (var r = 0; r < l.length; ++r) { var s = l[r]; h[s] = v(s, t) } return h }; t.prototype.update = function (t) { if (!this.finalized) { var i, r = typeof t; if ("string" !== r) { if ("object" !== r) throw new Error(h); if (null === t) throw new Error(h); if (f && t.constructor === ArrayBuffer) t = new Uint8Array(t); else if (!(Array.isArray(t) || f && ArrayBuffer.isView(t))) throw new Error(h); i = !0 } for (var s, e, n = 0, o = t.length, a = this.blocks; n < o;) { if (this.hashed && (this.hashed = !1, a[0] = this.block, a[16] = a[1] = a[2] = a[3] = a[4] = a[5] = a[6] = a[7] = a[8] = a[9] = a[10] = a[11] = a[12] = a[13] = a[14] = a[15] = 0), i) for (e = this.start; n < o && e < 64; ++n)a[e >> 2] |= t[n] << y[3 & e++]; else for (e = this.start; n < o && e < 64; ++n)(s = t.charCodeAt(n)) < 128 ? a[e >> 2] |= s << y[3 & e++] : s < 2048 ? (a[e >> 2] |= (192 | s >> 6) << y[3 & e++], a[e >> 2] |= (128 | 63 & s) << y[3 & e++]) : s < 55296 || s >= 57344 ? (a[e >> 2] |= (224 | s >> 12) << y[3 & e++], a[e >> 2] |= (128 | s >> 6 & 63) << y[3 & e++], a[e >> 2] |= (128 | 63 & s) << y[3 & e++]) : (s = 65536 + ((1023 & s) << 10 | 1023 & t.charCodeAt(++n)), a[e >> 2] |= (240 | s >> 18) << y[3 & e++], a[e >> 2] |= (128 | s >> 12 & 63) << y[3 & e++], a[e >> 2] |= (128 | s >> 6 & 63) << y[3 & e++], a[e >> 2] |= (128 | 63 & s) << y[3 & e++]); this.lastByteIndex = e, this.bytes += e - this.start, e >= 64 ? (this.block = a[16], this.start = e - 64, this.hash(), this.hashed = !0) : this.start = e } return this.bytes > 4294967295 && (this.hBytes += this.bytes / 4294967296 << 0, this.bytes = this.bytes % 4294967296), this } }, t.prototype.finalize = function () { if (!this.finalized) { this.finalized = !0; var t = this.blocks, i = this.lastByteIndex; t[16] = this.block, t[i >> 2] |= c[3 & i], this.block = t[16], i >= 56 && (this.hashed || this.hash(), t[0] = this.block, t[16] = t[1] = t[2] = t[3] = t[4] = t[5] = t[6] = t[7] = t[8] = t[9] = t[10] = t[11] = t[12] = t[13] = t[14] = t[15] = 0), t[14] = this.hBytes << 3 | this.bytes >>> 29, t[15] = this.bytes << 3, this.hash() } }, t.prototype.hash = function () { var t, i, h, r, s, e, n, o, a, f = this.h0, u = this.h1, c = this.h2, y = this.h3, l = this.h4, d = this.h5, A = this.h6, w = this.h7, b = this.blocks; for (t = 16; t < 64; ++t)i = ((s = b[t - 15]) >>> 7 | s << 25) ^ (s >>> 18 | s << 14) ^ s >>> 3, h = ((s = b[t - 2]) >>> 17 | s << 15) ^ (s >>> 19 | s << 13) ^ s >>> 10, b[t] = b[t - 16] + i + b[t - 7] + h << 0; for (a = u & c, t = 0; t < 64; t += 4)this.first ? (this.is224 ? (e = 300032, w = (s = b[0] - 1413257819) - 150054599 << 0, y = s + 24177077 << 0) : (e = 704751109, w = (s = b[0] - 210244248) - 1521486534 << 0, y = s + 143694565 << 0), this.first = !1) : (i = (f >>> 2 | f << 30) ^ (f >>> 13 | f << 19) ^ (f >>> 22 | f << 10), r = (e = f & u) ^ f & c ^ a, w = y + (s = w + (h = (l >>> 6 | l << 26) ^ (l >>> 11 | l << 21) ^ (l >>> 25 | l << 7)) + (l & d ^ ~l & A) + p[t] + b[t]) << 0, y = s + (i + r) << 0), i = (y >>> 2 | y << 30) ^ (y >>> 13 | y << 19) ^ (y >>> 22 | y << 10), r = (n = y & f) ^ y & u ^ e, A = c + (s = A + (h = (w >>> 6 | w << 26) ^ (w >>> 11 | w << 21) ^ (w >>> 25 | w << 7)) + (w & l ^ ~w & d) + p[t + 1] + b[t + 1]) << 0, i = ((c = s + (i + r) << 0) >>> 2 | c << 30) ^ (c >>> 13 | c << 19) ^ (c >>> 22 | c << 10), r = (o = c & y) ^ c & f ^ n, d = u + (s = d + (h = (A >>> 6 | A << 26) ^ (A >>> 11 | A << 21) ^ (A >>> 25 | A << 7)) + (A & w ^ ~A & l) + p[t + 2] + b[t + 2]) << 0, i = ((u = s + (i + r) << 0) >>> 2 | u << 30) ^ (u >>> 13 | u << 19) ^ (u >>> 22 | u << 10), r = (a = u & c) ^ u & y ^ o, l = f + (s = l + (h = (d >>> 6 | d << 26) ^ (d >>> 11 | d << 21) ^ (d >>> 25 | d << 7)) + (d & A ^ ~d & w) + p[t + 3] + b[t + 3]) << 0, f = s + (i + r) << 0; this.h0 = this.h0 + f << 0, this.h1 = this.h1 + u << 0, this.h2 = this.h2 + c << 0, this.h3 = this.h3 + y << 0, this.h4 = this.h4 + l << 0, this.h5 = this.h5 + d << 0, this.h6 = this.h6 + A << 0, this.h7 = this.h7 + w << 0 }, t.prototype.hex = function () { this.finalize(); var t = this.h0, i = this.h1, h = this.h2, r = this.h3, s = this.h4, e = this.h5, n = this.h6, o = this.h7, a = u[t >> 28 & 15] + u[t >> 24 & 15] + u[t >> 20 & 15] + u[t >> 16 & 15] + u[t >> 12 & 15] + u[t >> 8 & 15] + u[t >> 4 & 15] + u[15 & t] + u[i >> 28 & 15] + u[i >> 24 & 15] + u[i >> 20 & 15] + u[i >> 16 & 15] + u[i >> 12 & 15] + u[i >> 8 & 15] + u[i >> 4 & 15] + u[15 & i] + u[h >> 28 & 15] + u[h >> 24 & 15] + u[h >> 20 & 15] + u[h >> 16 & 15] + u[h >> 12 & 15] + u[h >> 8 & 15] + u[h >> 4 & 15] + u[15 & h] + u[r >> 28 & 15] + u[r >> 24 & 15] + u[r >> 20 & 15] + u[r >> 16 & 15] + u[r >> 12 & 15] + u[r >> 8 & 15] + u[r >> 4 & 15] + u[15 & r] + u[s >> 28 & 15] + u[s >> 24 & 15] + u[s >> 20 & 15] + u[s >> 16 & 15] + u[s >> 12 & 15] + u[s >> 8 & 15] + u[s >> 4 & 15] + u[15 & s] + u[e >> 28 & 15] + u[e >> 24 & 15] + u[e >> 20 & 15] + u[e >> 16 & 15] + u[e >> 12 & 15] + u[e >> 8 & 15] + u[e >> 4 & 15] + u[15 & e] + u[n >> 28 & 15] + u[n >> 24 & 15] + u[n >> 20 & 15] + u[n >> 16 & 15] + u[n >> 12 & 15] + u[n >> 8 & 15] + u[n >> 4 & 15] + u[15 & n]; return this.is224 || (a += u[o >> 28 & 15] + u[o >> 24 & 15] + u[o >> 20 & 15] + u[o >> 16 & 15] + u[o >> 12 & 15] + u[o >> 8 & 15] + u[o >> 4 & 15] + u[15 & o]), a }, t.prototype.toString = t.prototype.hex, t.prototype.digest = function () { this.finalize(); var t = this.h0, i = this.h1, h = this.h2, r = this.h3, s = this.h4, e = this.h5, n = this.h6, o = this.h7, a = [t >> 24 & 255, t >> 16 & 255, t >> 8 & 255, 255 & t, i >> 24 & 255, i >> 16 & 255, i >> 8 & 255, 255 & i, h >> 24 & 255, h >> 16 & 255, h >> 8 & 255, 255 & h, r >> 24 & 255, r >> 16 & 255, r >> 8 & 255, 255 & r, s >> 24 & 255, s >> 16 & 255, s >> 8 & 255, 255 & s, e >> 24 & 255, e >> 16 & 255, e >> 8 & 255, 255 & e, n >> 24 & 255, n >> 16 & 255, n >> 8 & 255, 255 & n]; return this.is224 || a.push(o >> 24 & 255, o >> 16 & 255, o >> 8 & 255, 255 & o), a }, t.prototype.array = t.prototype.digest, t.prototype.arrayBuffer = function () { this.finalize(); var t = new ArrayBuffer(this.is224 ? 28 : 32), i = new DataView(t); return i.setUint32(0, this.h0), i.setUint32(4, this.h1), i.setUint32(8, this.h2), i.setUint32(12, this.h3), i.setUint32(16, this.h4), i.setUint32(20, this.h5), i.setUint32(24, this.h6), this.is224 || i.setUint32(28, this.h7), t }, i.prototype = new t, i.prototype.finalize = function () { if (t.prototype.finalize.call(this), this.inner) { this.inner = !1; var i = this.array(); t.call(this, this.is224, this.sharedMemory), this.update(this.oKeyPad), this.update(i), t.prototype.finalize.call(this) } }; var B = w(); B.sha256 = B, B.sha224 = w(!0), B.sha256.hmac = _(), B.sha224.hmac = _(!0), o ? module.exports = B : (s.sha256 = B.sha256, s.sha224 = B.sha224, a && define(function () { return B })) }(); - - /** - * [base64-js]{@link https://github.com/beatgammit/base64-js} - * - * @version v1.3.0 - * @author Kirill, Fomichev - * @copyright Kirill, Fomichev 2014 - * @license MIT - */ - (function (r) { if (typeof exports === "object" && typeof module !== "undefined") { module.exports = r() } else if (typeof define === "function" && define.amd) { define([], r) } else { var e; if (typeof window !== "undefined") { e = window } else if (typeof global !== "undefined") { e = global } else if (typeof self !== "undefined") { e = self } else { e = this } e.base64js = r() } })(function () { var r, e, n; return function () { function r(e, n, t) { function o(f, i) { if (!n[f]) { if (!e[f]) { var u = "function" == typeof require && require; if (!i && u) return u(f, !0); if (a) return a(f, !0); var v = new Error("Cannot find module '" + f + "'"); throw v.code = "MODULE_NOT_FOUND", v } var d = n[f] = { exports: {} }; e[f][0].call(d.exports, function (r) { var n = e[f][1][r]; return o(n || r) }, d, d.exports, r, e, n, t) } return n[f].exports } for (var a = "function" == typeof require && require, f = 0; f < t.length; f++)o(t[f]); return o } return r }()({ "/": [function (r, e, n) { "use strict"; n.byteLength = d; n.toByteArray = h; n.fromByteArray = p; var t = []; var o = []; var a = typeof Uint8Array !== "undefined" ? Uint8Array : Array; var f = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; for (var i = 0, u = f.length; i < u; ++i) { t[i] = f[i]; o[f.charCodeAt(i)] = i } o["-".charCodeAt(0)] = 62; o["_".charCodeAt(0)] = 63; function v(r) { var e = r.length; if (e % 4 > 0) { throw new Error("Invalid string. Length must be a multiple of 4") } var n = r.indexOf("="); if (n === -1) n = e; var t = n === e ? 0 : 4 - n % 4; return [n, t] } function d(r) { var e = v(r); var n = e[0]; var t = e[1]; return (n + t) * 3 / 4 - t } function c(r, e, n) { return (e + n) * 3 / 4 - n } function h(r) { var e; var n = v(r); var t = n[0]; var f = n[1]; var i = new a(c(r, t, f)); var u = 0; var d = f > 0 ? t - 4 : t; for (var h = 0; h < d; h += 4) { e = o[r.charCodeAt(h)] << 18 | o[r.charCodeAt(h + 1)] << 12 | o[r.charCodeAt(h + 2)] << 6 | o[r.charCodeAt(h + 3)]; i[u++] = e >> 16 & 255; i[u++] = e >> 8 & 255; i[u++] = e & 255 } if (f === 2) { e = o[r.charCodeAt(h)] << 2 | o[r.charCodeAt(h + 1)] >> 4; i[u++] = e & 255 } if (f === 1) { e = o[r.charCodeAt(h)] << 10 | o[r.charCodeAt(h + 1)] << 4 | o[r.charCodeAt(h + 2)] >> 2; i[u++] = e >> 8 & 255; i[u++] = e & 255 } return i } function s(r) { return t[r >> 18 & 63] + t[r >> 12 & 63] + t[r >> 6 & 63] + t[r & 63] } function l(r, e, n) { var t; var o = []; for (var a = e; a < n; a += 3) { t = (r[a] << 16 & 16711680) + (r[a + 1] << 8 & 65280) + (r[a + 2] & 255); o.push(s(t)) } return o.join("") } function p(r) { var e; var n = r.length; var o = n % 3; var a = []; var f = 16383; for (var i = 0, u = n - o; i < u; i += f) { a.push(l(r, i, i + f > u ? u : i + f)) } if (o === 1) { e = r[n - 1]; a.push(t[e >> 2] + t[e << 4 & 63] + "==") } else if (o === 2) { e = (r[n - 2] << 8) + r[n - 1]; a.push(t[e >> 10] + t[e >> 4 & 63] + t[e << 2 & 63] + "=") } return a.join("") } }, {}] }, {}, [])("/") }); - - /** - * [promise-polyfill]{@link https://github.com/taylorhakes/promise-polyfill} - * - * @version v8.1.3 - * @author Hakes, Taylor - * @copyright Hakes, Taylor 2014 - * @license MIT - */ - !function(e,n){"object"==typeof exports&&"undefined"!=typeof module?n():"function"==typeof define&&define.amd?define(n):n()}(0,function(){"use strict";function e(e){var n=this.constructor;return this.then(function(t){return n.resolve(e()).then(function(){return t})},function(t){return n.resolve(e()).then(function(){return n.reject(t)})})}function n(e){return!(!e||"undefined"==typeof e.length)}function t(){}function o(e){if(!(this instanceof o))throw new TypeError("Promises must be constructed via new");if("function"!=typeof e)throw new TypeError("not a function");this._state=0,this._handled=!1,this._value=undefined,this._deferreds=[],c(e,this)}function r(e,n){for(;3===e._state;)e=e._value;0!==e._state?(e._handled=!0,o._immediateFn(function(){var t=1===e._state?n.onFulfilled:n.onRejected;if(null!==t){var o;try{o=t(e._value)}catch(r){return void f(n.promise,r)}i(n.promise,o)}else(1===e._state?i:f)(n.promise,e._value)})):e._deferreds.push(n)}function i(e,n){try{if(n===e)throw new TypeError("A promise cannot be resolved with itself.");if(n&&("object"==typeof n||"function"==typeof n)){var t=n.then;if(n instanceof o)return e._state=3,e._value=n,void u(e);if("function"==typeof t)return void c(function(e,n){return function(){e.apply(n,arguments)}}(t,n),e)}e._state=1,e._value=n,u(e)}catch(r){f(e,r)}}function f(e,n){e._state=2,e._value=n,u(e)}function u(e){2===e._state&&0===e._deferreds.length&&o._immediateFn(function(){e._handled||o._unhandledRejectionFn(e._value)});for(var n=0,t=e._deferreds.length;t>n;n++)r(e,e._deferreds[n]);e._deferreds=null}function c(e,n){var t=!1;try{e(function(e){t||(t=!0,i(n,e))},function(e){t||(t=!0,f(n,e))})}catch(o){if(t)return;t=!0,f(n,o)}}var a=setTimeout;o.prototype["catch"]=function(e){return this.then(null,e)},o.prototype.then=function(e,n){var o=new this.constructor(t);return r(this,new function(e,n,t){this.onFulfilled="function"==typeof e?e:null,this.onRejected="function"==typeof n?n:null,this.promise=t}(e,n,o)),o},o.prototype["finally"]=e,o.all=function(e){return new o(function(t,o){function r(e,n){try{if(n&&("object"==typeof n||"function"==typeof n)){var u=n.then;if("function"==typeof u)return void u.call(n,function(n){r(e,n)},o)}i[e]=n,0==--f&&t(i)}catch(c){o(c)}}if(!n(e))return o(new TypeError("Promise.all accepts an array"));var i=Array.prototype.slice.call(e);if(0===i.length)return t([]);for(var f=i.length,u=0;i.length>u;u++)r(u,i[u])})},o.resolve=function(e){return e&&"object"==typeof e&&e.constructor===o?e:new o(function(n){n(e)})},o.reject=function(e){return new o(function(n,t){t(e)})},o.race=function(e){return new o(function(t,r){if(!n(e))return r(new TypeError("Promise.race accepts an array"));for(var i=0,f=e.length;f>i;i++)o.resolve(e[i]).then(t,r)})},o._immediateFn="function"==typeof setImmediate&&function(e){setImmediate(e)}||function(e){a(e,0)},o._unhandledRejectionFn=function(e){void 0!==console&&console&&console.warn("Possible Unhandled Promise Rejection:",e)};var l=function(){if("undefined"!=typeof self)return self;if("undefined"!=typeof window)return window;if("undefined"!=typeof global)return global;throw Error("unable to locate global object")}();"Promise"in l?l.Promise.prototype["finally"]||(l.Promise.prototype["finally"]=e):l.Promise=o}); - - var Keycloak = factory( root["sha256"], root["base64js"] ); - root["Keycloak"] = Keycloak; - - if ( typeof define === "function" && define.amd ) { - define( "keycloak", [], function () { return Keycloak; } ); - } - } -})(window, function (sha256_imported, base64js_imported) { - if (typeof Promise === 'undefined') { - throw Error('Keycloak requires an environment that supports Promises. Make sure that you include the appropriate polyfill.'); - } - - var loggedPromiseDeprecation = false; - - function logPromiseDeprecation() { - if (!loggedPromiseDeprecation) { - loggedPromiseDeprecation = true; - console.warn('[KEYCLOAK] Usage of legacy style promise methods such as `.error()` and `.success()` has been deprecated and support will be removed in future versions. Use standard style promise methods such as `.then() and `.catch()` instead.'); - } - } - - function toKeycloakPromise(promise) { - promise.__proto__ = KeycloakPromise.prototype; - return promise; - } - - function KeycloakPromise(executor) { - return toKeycloakPromise(new Promise(executor)); - } - - KeycloakPromise.prototype = Object.create(Promise.prototype); - KeycloakPromise.prototype.constructor = KeycloakPromise; - - KeycloakPromise.prototype.success = function(callback) { - logPromiseDeprecation(); - - var promise = this.then(function handleSuccess(value) { - callback(value); - }); - - return toKeycloakPromise(promise); - }; - - KeycloakPromise.prototype.error = function(callback) { - logPromiseDeprecation(); - - var promise = this.catch(function handleError(error) { - callback(error); - }); - - return toKeycloakPromise(promise); - }; - - function Keycloak (config) { - if (!(this instanceof Keycloak)) { - return new Keycloak(config); - } - - var kc = this; - var adapter; - var refreshQueue = []; - var callbackStorage; - - var loginIframe = { - enable: true, - callbackList: [], - interval: 5 - }; - - var scripts = document.getElementsByTagName('script'); - for (var i = 0; i < scripts.length; i++) { - if ((scripts[i].src.indexOf('keycloak.js') !== -1 || scripts[i].src.indexOf('keycloak.min.js') !== -1) && scripts[i].src.indexOf('version=') !== -1) { - kc.iframeVersion = scripts[i].src.substring(scripts[i].src.indexOf('version=') + 8).split('&')[0]; - } - } - - var useNonce = true; - var logInfo = createLogger(console.info); - var logWarn = createLogger(console.warn); - - kc.init = function (initOptions) { - kc.authenticated = false; - - callbackStorage = createCallbackStorage(); - var adapters = ['default', 'cordova', 'cordova-native']; - - if (initOptions && adapters.indexOf(initOptions.adapter) > -1) { - adapter = loadAdapter(initOptions.adapter); - } else if (initOptions && typeof initOptions.adapter === "object") { - adapter = initOptions.adapter; - } else { - if (window.Cordova || window.cordova) { - adapter = loadAdapter('cordova'); - } else { - adapter = loadAdapter(); - } - } - - if (initOptions) { - if (typeof initOptions.useNonce !== 'undefined') { - useNonce = initOptions.useNonce; - } - - if (typeof initOptions.checkLoginIframe !== 'undefined') { - loginIframe.enable = initOptions.checkLoginIframe; - } - - if (initOptions.checkLoginIframeInterval) { - loginIframe.interval = initOptions.checkLoginIframeInterval; - } - - if (initOptions.onLoad === 'login-required') { - kc.loginRequired = true; - } - - if (initOptions.responseMode) { - if (initOptions.responseMode === 'query' || initOptions.responseMode === 'fragment') { - kc.responseMode = initOptions.responseMode; - } else { - throw 'Invalid value for responseMode'; - } - } - - if (initOptions.flow) { - switch (initOptions.flow) { - case 'standard': - kc.responseType = 'code'; - break; - case 'implicit': - kc.responseType = 'id_token token'; - break; - case 'hybrid': - kc.responseType = 'code id_token token'; - break; - default: - throw 'Invalid value for flow'; - } - kc.flow = initOptions.flow; - } - - if (initOptions.timeSkew != null) { - kc.timeSkew = initOptions.timeSkew; - } - - if(initOptions.redirectUri) { - kc.redirectUri = initOptions.redirectUri; - } - - if (initOptions.silentCheckSsoRedirectUri) { - kc.silentCheckSsoRedirectUri = initOptions.silentCheckSsoRedirectUri; - } - - if (initOptions.pkceMethod) { - if (initOptions.pkceMethod !== "S256") { - throw 'Invalid value for pkceMethod'; - } - kc.pkceMethod = initOptions.pkceMethod; - } - - if (typeof initOptions.enableLogging === 'boolean') { - kc.enableLogging = initOptions.enableLogging; - } else { - kc.enableLogging = false; - } - } - - if (!kc.responseMode) { - kc.responseMode = 'fragment'; - } - if (!kc.responseType) { - kc.responseType = 'code'; - kc.flow = 'standard'; - } - - var promise = createPromise(); - - var initPromise = createPromise(); - initPromise.promise.then(function() { - kc.onReady && kc.onReady(kc.authenticated); - promise.setSuccess(kc.authenticated); - }).catch(function(errorData) { - promise.setError(errorData); - }); - - var configPromise = loadConfig(config); - - function onLoad() { - var doLogin = function(prompt) { - if (!prompt) { - options.prompt = 'none'; - } - - kc.login(options).then(function () { - initPromise.setSuccess(); - }).catch(function () { - initPromise.setError(); - }); - } - - var checkSsoSilently = function() { - var ifrm = document.createElement("iframe"); - var src = kc.createLoginUrl({prompt: 'none', redirectUri: kc.silentCheckSsoRedirectUri}); - ifrm.setAttribute("src", src); - ifrm.setAttribute("title", "keycloak-silent-check-sso"); - ifrm.style.display = "none"; - document.body.appendChild(ifrm); - - var messageCallback = function(event) { - if (event.origin !== window.location.origin || ifrm.contentWindow !== event.source) { - return; - } - - var oauth = parseCallback(event.data); - processCallback(oauth, initPromise); - - document.body.removeChild(ifrm); - window.removeEventListener("message", messageCallback); - }; - - window.addEventListener("message", messageCallback); - }; - - var options = {}; - switch (initOptions.onLoad) { - case 'check-sso': - if (loginIframe.enable) { - setupCheckLoginIframe().then(function() { - checkLoginIframe().then(function (unchanged) { - if (!unchanged) { - kc.silentCheckSsoRedirectUri ? checkSsoSilently() : doLogin(false); - } else { - initPromise.setSuccess(); - } - }).catch(function () { - initPromise.setError(); - }); - }); - } else { - kc.silentCheckSsoRedirectUri ? checkSsoSilently() : doLogin(false); - } - break; - case 'login-required': - doLogin(true); - break; - default: - throw 'Invalid value for onLoad'; - } - } - - function processInit() { - var callback = parseCallback(window.location.href); - - if (callback) { - window.history.replaceState(window.history.state, null, callback.newUrl); - } - - if (callback && callback.valid) { - return setupCheckLoginIframe().then(function() { - processCallback(callback, initPromise); - }).catch(function (e) { - initPromise.setError(); - }); - } else if (initOptions) { - if (initOptions.token && initOptions.refreshToken) { - setToken(initOptions.token, initOptions.refreshToken, initOptions.idToken); - - if (loginIframe.enable) { - setupCheckLoginIframe().then(function() { - checkLoginIframe().then(function (unchanged) { - if (unchanged) { - kc.onAuthSuccess && kc.onAuthSuccess(); - initPromise.setSuccess(); - scheduleCheckIframe(); - } else { - initPromise.setSuccess(); - } - }).catch(function () { - initPromise.setError(); - }); - }); - } else { - kc.updateToken(-1).then(function() { - kc.onAuthSuccess && kc.onAuthSuccess(); - initPromise.setSuccess(); - }).catch(function() { - kc.onAuthError && kc.onAuthError(); - if (initOptions.onLoad) { - onLoad(); - } else { - initPromise.setError(); - } - }); - } - } else if (initOptions.onLoad) { - onLoad(); - } else { - initPromise.setSuccess(); - } - } else { - initPromise.setSuccess(); - } - } - - configPromise.then(processInit); - configPromise.catch(function() { - promise.setError(); - }); - - return promise.promise; - } - - kc.login = function (options) { - return adapter.login(options); - } - - function generateRandomData(len) { - // use web crypto APIs if possible - var array = null; - var crypto = window.crypto || window.msCrypto; - if (crypto && crypto.getRandomValues && window.Uint8Array) { - array = new Uint8Array(len); - crypto.getRandomValues(array); - return array; - } - - // fallback to Math random - array = new Array(len); - for (var j = 0; j < array.length; j++) { - array[j] = Math.floor(256 * Math.random()); - } - return array; - } - - function generateCodeVerifier(len) { - return generateRandomString(len, 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'); - } - - function generateRandomString(len, alphabet){ - var randomData = generateRandomData(len); - var chars = new Array(len); - for (var i = 0; i < len; i++) { - chars[i] = alphabet.charCodeAt(randomData[i] % alphabet.length); - } - return String.fromCharCode.apply(null, chars); - } - - function generatePkceChallenge(pkceMethod, codeVerifier) { - switch (pkceMethod) { - // The use of the "plain" method is considered insecure and therefore not supported. - case "S256": - // hash codeVerifier, then encode as url-safe base64 without padding - var hashBytes = new Uint8Array(sha256_imported.arrayBuffer(codeVerifier)); - var encodedHash = base64js_imported.fromByteArray(hashBytes) - .replace(/\+/g, '-') - .replace(/\//g, '_') - .replace(/\=/g, ''); - return encodedHash; - default: - throw 'Invalid value for pkceMethod'; - } - } - - kc.createLoginUrl = function(options) { - var state = createUUID(); - var nonce = createUUID(); - - var redirectUri = adapter.redirectUri(options); - - var callbackState = { - state: state, - nonce: nonce, - redirectUri: encodeURIComponent(redirectUri) - }; - - if (options && options.prompt) { - callbackState.prompt = options.prompt; - } - - var baseUrl; - if (options && options.action == 'register') { - baseUrl = kc.endpoints.register(); - } else { - baseUrl = kc.endpoints.authorize(); - } - - var scope; - if (options && options.scope) { - if (options.scope.indexOf("openid") != -1) { - scope = options.scope; - } else { - scope = "openid " + options.scope; - } - } else { - scope = "openid"; - } - - var url = baseUrl - + '?client_id=' + encodeURIComponent(kc.clientId) - + '&redirect_uri=' + encodeURIComponent(redirectUri) - + '&state=' + encodeURIComponent(state) - + '&response_mode=' + encodeURIComponent(kc.responseMode) - + '&response_type=' + encodeURIComponent(kc.responseType) - + '&scope=' + encodeURIComponent(scope); - if (useNonce) { - url = url + '&nonce=' + encodeURIComponent(nonce); - } - - if (options && options.prompt) { - url += '&prompt=' + encodeURIComponent(options.prompt); - } - - if (options && options.maxAge) { - url += '&max_age=' + encodeURIComponent(options.maxAge); - } - - if (options && options.loginHint) { - url += '&login_hint=' + encodeURIComponent(options.loginHint); - } - - if (options && options.idpHint) { - url += '&kc_idp_hint=' + encodeURIComponent(options.idpHint); - } - - if (options && options.locale) { - url += '&ui_locales=' + encodeURIComponent(options.locale); - } - - if (kc.pkceMethod) { - var codeVerifier = generateCodeVerifier(96); - callbackState.pkceCodeVerifier = codeVerifier; - var pkceChallenge = generatePkceChallenge(kc.pkceMethod, codeVerifier); - url += '&code_challenge=' + pkceChallenge; - url += '&code_challenge_method=' + kc.pkceMethod; - } - - callbackStorage.add(callbackState); - - return url; - } - - kc.logout = function(options) { - return adapter.logout(options); - } - - kc.createLogoutUrl = function(options) { - var url = kc.endpoints.logout() - + '?redirect_uri=' + encodeURIComponent(adapter.redirectUri(options, false)); - - return url; - } - - kc.register = function (options) { - return adapter.register(options); - } - - kc.createRegisterUrl = function(options) { - if (!options) { - options = {}; - } - options.action = 'register'; - return kc.createLoginUrl(options); - } - - kc.createAccountUrl = function(options) { - var realm = getRealmUrl(); - var url = undefined; - if (typeof realm !== 'undefined') { - url = realm - + '/account' - + '?referrer=' + encodeURIComponent(kc.clientId) - + '&referrer_uri=' + encodeURIComponent(adapter.redirectUri(options)); - } - return url; - } - - kc.accountManagement = function() { - return adapter.accountManagement(); - } - - kc.hasRealmRole = function (role) { - var access = kc.realmAccess; - return !!access && access.roles.indexOf(role) >= 0; - } - - kc.hasResourceRole = function(role, resource) { - if (!kc.resourceAccess) { - return false; - } - - var access = kc.resourceAccess[resource || kc.clientId]; - return !!access && access.roles.indexOf(role) >= 0; - } - - kc.loadUserProfile = function() { - var url = getRealmUrl() + '/account'; - var req = new XMLHttpRequest(); - req.open('GET', url, true); - req.setRequestHeader('Accept', 'application/json'); - req.setRequestHeader('Authorization', 'bearer ' + kc.token); - - var promise = createPromise(); - - req.onreadystatechange = function () { - if (req.readyState == 4) { - if (req.status == 200) { - kc.profile = JSON.parse(req.responseText); - promise.setSuccess(kc.profile); - } else { - promise.setError(); - } - } - } - - req.send(); - - return promise.promise; - } - - kc.loadUserInfo = function() { - var url = kc.endpoints.userinfo(); - var req = new XMLHttpRequest(); - req.open('GET', url, true); - req.setRequestHeader('Accept', 'application/json'); - req.setRequestHeader('Authorization', 'bearer ' + kc.token); - - var promise = createPromise(); - - req.onreadystatechange = function () { - if (req.readyState == 4) { - if (req.status == 200) { - kc.userInfo = JSON.parse(req.responseText); - promise.setSuccess(kc.userInfo); - } else { - promise.setError(); - } - } - } - - req.send(); - - return promise.promise; - } - - kc.isTokenExpired = function(minValidity) { - if (!kc.tokenParsed || (!kc.refreshToken && kc.flow != 'implicit' )) { - throw 'Not authenticated'; - } - - if (kc.timeSkew == null) { - logInfo('[KEYCLOAK] Unable to determine if token is expired as timeskew is not set'); - return true; - } - - var expiresIn = kc.tokenParsed['exp'] - Math.ceil(new Date().getTime() / 1000) + kc.timeSkew; - if (minValidity) { - if (isNaN(minValidity)) { - throw 'Invalid minValidity'; - } - expiresIn -= minValidity; - } - return expiresIn < 0; - } - - kc.updateToken = function(minValidity) { - var promise = createPromise(); - - if (!kc.refreshToken) { - promise.setError(); - return promise.promise; - } - - minValidity = minValidity || 5; - - var exec = function() { - var refreshToken = false; - if (minValidity == -1) { - refreshToken = true; - logInfo('[KEYCLOAK] Refreshing token: forced refresh'); - } else if (!kc.tokenParsed || kc.isTokenExpired(minValidity)) { - refreshToken = true; - logInfo('[KEYCLOAK] Refreshing token: token expired'); - } - - if (!refreshToken) { - promise.setSuccess(false); - } else { - var params = 'grant_type=refresh_token&' + 'refresh_token=' + kc.refreshToken; - var url = kc.endpoints.token(); - - refreshQueue.push(promise); - - if (refreshQueue.length == 1) { - var req = new XMLHttpRequest(); - req.open('POST', url, true); - req.setRequestHeader('Content-type', 'application/x-www-form-urlencoded'); - req.withCredentials = true; - - params += '&client_id=' + encodeURIComponent(kc.clientId); - - var timeLocal = new Date().getTime(); - - req.onreadystatechange = function () { - if (req.readyState == 4) { - if (req.status == 200) { - logInfo('[KEYCLOAK] Token refreshed'); - - timeLocal = (timeLocal + new Date().getTime()) / 2; - - var tokenResponse = JSON.parse(req.responseText); - - setToken(tokenResponse['access_token'], tokenResponse['refresh_token'], tokenResponse['id_token'], timeLocal); - - kc.onAuthRefreshSuccess && kc.onAuthRefreshSuccess(); - for (var p = refreshQueue.pop(); p != null; p = refreshQueue.pop()) { - p.setSuccess(true); - } - } else { - logWarn('[KEYCLOAK] Failed to refresh token'); - - if (req.status == 400) { - kc.clearToken(); - } - - kc.onAuthRefreshError && kc.onAuthRefreshError(); - for (var p = refreshQueue.pop(); p != null; p = refreshQueue.pop()) { - p.setError(true); - } - } - } - }; - - req.send(params); - } - } - } - - if (loginIframe.enable) { - var iframePromise = checkLoginIframe(); - iframePromise.then(function() { - exec(); - }).catch(function() { - promise.setError(); - }); - } else { - exec(); - } - - return promise.promise; - } - - kc.clearToken = function() { - if (kc.token) { - setToken(null, null, null); - kc.onAuthLogout && kc.onAuthLogout(); - if (kc.loginRequired) { - kc.login(); - } - } - } - - function getRealmUrl() { - if (typeof kc.authServerUrl !== 'undefined') { - if (kc.authServerUrl.charAt(kc.authServerUrl.length - 1) == '/') { - return kc.authServerUrl + 'realms/' + encodeURIComponent(kc.realm); - } else { - return kc.authServerUrl + '/realms/' + encodeURIComponent(kc.realm); - } - } else { - return undefined; - } - } - - function getOrigin() { - if (!window.location.origin) { - return window.location.protocol + "//" + window.location.hostname + (window.location.port ? ':' + window.location.port: ''); - } else { - return window.location.origin; - } - } - - function processCallback(oauth, promise) { - var code = oauth.code; - var error = oauth.error; - var prompt = oauth.prompt; - - var timeLocal = new Date().getTime(); - - if (error) { - if (prompt != 'none') { - var errorData = { error: error, error_description: oauth.error_description }; - kc.onAuthError && kc.onAuthError(errorData); - promise && promise.setError(errorData); - } else { - promise && promise.setSuccess(); - } - return; - } else if ((kc.flow != 'standard') && (oauth.access_token || oauth.id_token)) { - authSuccess(oauth.access_token, null, oauth.id_token, true); - } - - if ((kc.flow != 'implicit') && code) { - var params = 'code=' + code + '&grant_type=authorization_code'; - var url = kc.endpoints.token(); - - var req = new XMLHttpRequest(); - req.open('POST', url, true); - req.setRequestHeader('Content-type', 'application/x-www-form-urlencoded'); - - params += '&client_id=' + encodeURIComponent(kc.clientId); - params += '&redirect_uri=' + oauth.redirectUri; - - if (oauth.pkceCodeVerifier) { - params += '&code_verifier=' + oauth.pkceCodeVerifier; - } - - req.withCredentials = true; - - req.onreadystatechange = function() { - if (req.readyState == 4) { - if (req.status == 200) { - - var tokenResponse = JSON.parse(req.responseText); - authSuccess(tokenResponse['access_token'], tokenResponse['refresh_token'], tokenResponse['id_token'], kc.flow === 'standard'); - scheduleCheckIframe(); - } else { - kc.onAuthError && kc.onAuthError(); - promise && promise.setError(); - } - } - }; - - req.send(params); - } - - function authSuccess(accessToken, refreshToken, idToken, fulfillPromise) { - timeLocal = (timeLocal + new Date().getTime()) / 2; - - setToken(accessToken, refreshToken, idToken, timeLocal); - - if (useNonce && ((kc.tokenParsed && kc.tokenParsed.nonce != oauth.storedNonce) || - (kc.refreshTokenParsed && kc.refreshTokenParsed.nonce != oauth.storedNonce) || - (kc.idTokenParsed && kc.idTokenParsed.nonce != oauth.storedNonce))) { - - logInfo('[KEYCLOAK] Invalid nonce, clearing token'); - kc.clearToken(); - promise && promise.setError(); - } else { - if (fulfillPromise) { - kc.onAuthSuccess && kc.onAuthSuccess(); - promise && promise.setSuccess(); - } - } - } - - } - - function loadConfig(url) { - var promise = createPromise(); - var configUrl; - - if (!config) { - configUrl = 'keycloak.json'; - } else if (typeof config === 'string') { - configUrl = config; - } - - function setupOidcEndoints(oidcConfiguration) { - if (! oidcConfiguration) { - kc.endpoints = { - authorize: function() { - return getRealmUrl() + '/protocol/openid-connect/auth'; - }, - token: function() { - return getRealmUrl() + '/protocol/openid-connect/token'; - }, - logout: function() { - return getRealmUrl() + '/protocol/openid-connect/logout'; - }, - checkSessionIframe: function() { - var src = getRealmUrl() + '/protocol/openid-connect/login-status-iframe.html'; - if (kc.iframeVersion) { - src = src + '?version=' + kc.iframeVersion; - } - return src; - }, - register: function() { - return getRealmUrl() + '/protocol/openid-connect/registrations'; - }, - userinfo: function() { - return getRealmUrl() + '/protocol/openid-connect/userinfo'; - } - }; - } else { - kc.endpoints = { - authorize: function() { - return oidcConfiguration.authorization_endpoint; - }, - token: function() { - return oidcConfiguration.token_endpoint; - }, - logout: function() { - if (!oidcConfiguration.end_session_endpoint) { - throw "Not supported by the OIDC server"; - } - return oidcConfiguration.end_session_endpoint; - }, - checkSessionIframe: function() { - if (!oidcConfiguration.check_session_iframe) { - throw "Not supported by the OIDC server"; - } - return oidcConfiguration.check_session_iframe; - }, - register: function() { - throw 'Redirection to "Register user" page not supported in standard OIDC mode'; - }, - userinfo: function() { - if (!oidcConfiguration.userinfo_endpoint) { - throw "Not supported by the OIDC server"; - } - return oidcConfiguration.userinfo_endpoint; - } - } - } - } - - if (configUrl) { - var req = new XMLHttpRequest(); - req.open('GET', configUrl, true); - req.setRequestHeader('Accept', 'application/json'); - - req.onreadystatechange = function () { - if (req.readyState == 4) { - if (req.status == 200 || fileLoaded(req)) { - var config = JSON.parse(req.responseText); - - kc.authServerUrl = config['auth-server-url']; - kc.realm = config['realm']; - kc.clientId = config['resource']; - setupOidcEndoints(null); - promise.setSuccess(); - } else { - promise.setError(); - } - } - }; - - req.send(); - } else { - if (!config.clientId) { - throw 'clientId missing'; - } - - kc.clientId = config.clientId; - - var oidcProvider = config['oidcProvider']; - if (!oidcProvider) { - if (!config['url']) { - var scripts = document.getElementsByTagName('script'); - for (var i = 0; i < scripts.length; i++) { - if (scripts[i].src.match(/.*keycloak\.js/)) { - config.url = scripts[i].src.substr(0, scripts[i].src.indexOf('/js/keycloak.js')); - break; - } - } - } - if (!config.realm) { - throw 'realm missing'; - } - - kc.authServerUrl = config.url; - kc.realm = config.realm; - setupOidcEndoints(null); - promise.setSuccess(); - } else { - if (typeof oidcProvider === 'string') { - var oidcProviderConfigUrl; - if (oidcProvider.charAt(oidcProvider.length - 1) == '/') { - oidcProviderConfigUrl = oidcProvider + '.well-known/openid-configuration'; - } else { - oidcProviderConfigUrl = oidcProvider + '/.well-known/openid-configuration'; - } - var req = new XMLHttpRequest(); - req.open('GET', oidcProviderConfigUrl, true); - req.setRequestHeader('Accept', 'application/json'); - - req.onreadystatechange = function () { - if (req.readyState == 4) { - if (req.status == 200 || fileLoaded(req)) { - var oidcProviderConfig = JSON.parse(req.responseText); - setupOidcEndoints(oidcProviderConfig); - promise.setSuccess(); - } else { - promise.setError(); - } - } - }; - - req.send(); - } else { - setupOidcEndoints(oidcProvider); - promise.setSuccess(); - } - } - } - - return promise.promise; - } - - function fileLoaded(xhr) { - return xhr.status == 0 && xhr.responseText && xhr.responseURL.startsWith('file:'); - } - - function setToken(token, refreshToken, idToken, timeLocal) { - if (kc.tokenTimeoutHandle) { - clearTimeout(kc.tokenTimeoutHandle); - kc.tokenTimeoutHandle = null; - } - - if (refreshToken) { - kc.refreshToken = refreshToken; - kc.refreshTokenParsed = decodeToken(refreshToken); - } else { - delete kc.refreshToken; - delete kc.refreshTokenParsed; - } - - if (idToken) { - kc.idToken = idToken; - kc.idTokenParsed = decodeToken(idToken); - } else { - delete kc.idToken; - delete kc.idTokenParsed; - } - - if (token) { - kc.token = token; - kc.tokenParsed = decodeToken(token); - kc.sessionId = kc.tokenParsed.session_state; - kc.authenticated = true; - kc.subject = kc.tokenParsed.sub; - kc.realmAccess = kc.tokenParsed.realm_access; - kc.resourceAccess = kc.tokenParsed.resource_access; - - if (timeLocal) { - kc.timeSkew = Math.floor(timeLocal / 1000) - kc.tokenParsed.iat; - } - - if (kc.timeSkew != null) { - logInfo('[KEYCLOAK] Estimated time difference between browser and server is ' + kc.timeSkew + ' seconds'); - - if (kc.onTokenExpired) { - var expiresIn = (kc.tokenParsed['exp'] - (new Date().getTime() / 1000) + kc.timeSkew) * 1000; - logInfo('[KEYCLOAK] Token expires in ' + Math.round(expiresIn / 1000) + ' s'); - if (expiresIn <= 0) { - kc.onTokenExpired(); - } else { - kc.tokenTimeoutHandle = setTimeout(kc.onTokenExpired, expiresIn); - } - } - } - } else { - delete kc.token; - delete kc.tokenParsed; - delete kc.subject; - delete kc.realmAccess; - delete kc.resourceAccess; - - kc.authenticated = false; - } - } - - function decodeToken(str) { - str = str.split('.')[1]; - - str = str.replace('/-/g', '+'); - str = str.replace('/_/g', '/'); - switch (str.length % 4) - { - case 0: - break; - case 2: - str += '=='; - break; - case 3: - str += '='; - break; - default: - throw 'Invalid token'; - } - - str = (str + '===').slice(0, str.length + (str.length % 4)); - str = str.replace(/-/g, '+').replace(/_/g, '/'); - - str = decodeURIComponent(escape(atob(str))); - - str = JSON.parse(str); - return str; - } - - function createUUID() { - var hexDigits = '0123456789abcdef'; - var s = generateRandomString(36, hexDigits).split(""); - s[14] = '4'; - s[19] = hexDigits.substr((s[19] & 0x3) | 0x8, 1); - s[8] = s[13] = s[18] = s[23] = '-'; - var uuid = s.join(''); - return uuid; - } - - function parseCallback(url) { - var oauth = parseCallbackUrl(url); - if (!oauth) { - return; - } - - var oauthState = callbackStorage.get(oauth.state); - - if (oauthState) { - oauth.valid = true; - oauth.redirectUri = oauthState.redirectUri; - oauth.storedNonce = oauthState.nonce; - oauth.prompt = oauthState.prompt; - oauth.pkceCodeVerifier = oauthState.pkceCodeVerifier; - } - - return oauth; - } - - function parseCallbackUrl(url) { - var supportedParams; - switch (kc.flow) { - case 'standard': - supportedParams = ['code', 'state', 'session_state']; - break; - case 'implicit': - supportedParams = ['access_token', 'token_type', 'id_token', 'state', 'session_state', 'expires_in']; - break; - case 'hybrid': - supportedParams = ['access_token', 'id_token', 'code', 'state', 'session_state']; - break; - } - - supportedParams.push('error'); - supportedParams.push('error_description'); - supportedParams.push('error_uri'); - - var queryIndex = url.indexOf('?'); - var fragmentIndex = url.indexOf('#'); - - var newUrl; - var parsed; - - if (kc.responseMode === 'query' && queryIndex !== -1) { - newUrl = url.substring(0, queryIndex); - parsed = parseCallbackParams(url.substring(queryIndex + 1, fragmentIndex !== -1 ? fragmentIndex : url.length), supportedParams); - if (parsed.paramsString !== '') { - newUrl += '?' + parsed.paramsString; - } - if (fragmentIndex !== -1) { - newUrl += url.substring(fragmentIndex); - } - } else if (kc.responseMode === 'fragment' && fragmentIndex !== -1) { - newUrl = url.substring(0, fragmentIndex); - parsed = parseCallbackParams(url.substring(fragmentIndex + 1), supportedParams); - if (parsed.paramsString !== '') { - newUrl += '#' + parsed.paramsString; - } - } - - if (parsed && parsed.oauthParams) { - if (kc.flow === 'standard' || kc.flow === 'hybrid') { - if ((parsed.oauthParams.code || parsed.oauthParams.error) && parsed.oauthParams.state) { - parsed.oauthParams.newUrl = newUrl; - return parsed.oauthParams; - } - } else if (kc.flow === 'implicit') { - if ((parsed.oauthParams.access_token || parsed.oauthParams.error) && parsed.oauthParams.state) { - parsed.oauthParams.newUrl = newUrl; - return parsed.oauthParams; - } - } - } - } - - function parseCallbackParams(paramsString, supportedParams) { - var p = paramsString.split('&'); - var result = { - paramsString: '', - oauthParams: {} - } - for (var i = 0; i < p.length; i++) { - var split = p[i].indexOf("="); - var key = p[i].slice(0, split); - if (supportedParams.indexOf(key) !== -1) { - result.oauthParams[key] = p[i].slice(split + 1); - } else { - if (result.paramsString !== '') { - result.paramsString += '&'; - } - result.paramsString += p[i]; - } - } - return result; - } - - function createPromise() { - // Need to create a native Promise which also preserves the - // interface of the custom promise type previously used by the API - var p = { - setSuccess: function(result) { - p.resolve(result); - }, - - setError: function(result) { - p.reject(result); - } - }; - p.promise = new KeycloakPromise(function(resolve, reject) { - p.resolve = resolve; - p.reject = reject; - }); - return p; - } - - - function setupCheckLoginIframe() { - var promise = createPromise(); - - if (!loginIframe.enable) { - promise.setSuccess(); - return promise.promise; - } - - if (loginIframe.iframe) { - promise.setSuccess(); - return promise.promise; - } - - var iframe = document.createElement('iframe'); - loginIframe.iframe = iframe; - - iframe.onload = function() { - var authUrl = kc.endpoints.authorize(); - if (authUrl.charAt(0) === '/') { - loginIframe.iframeOrigin = getOrigin(); - } else { - loginIframe.iframeOrigin = authUrl.substring(0, authUrl.indexOf('/', 8)); - } - promise.setSuccess(); - } - - var src = kc.endpoints.checkSessionIframe(); - iframe.setAttribute('src', src ); - iframe.setAttribute('title', 'keycloak-session-iframe' ); - iframe.style.display = 'none'; - document.body.appendChild(iframe); - - var messageCallback = function(event) { - if ((event.origin !== loginIframe.iframeOrigin) || (loginIframe.iframe.contentWindow !== event.source)) { - return; - } - - if (!(event.data == 'unchanged' || event.data == 'changed' || event.data == 'error')) { - return; - } - - - if (event.data != 'unchanged') { - kc.clearToken(); - } - - var callbacks = loginIframe.callbackList.splice(0, loginIframe.callbackList.length); - - for (var i = callbacks.length - 1; i >= 0; --i) { - var promise = callbacks[i]; - if (event.data == 'error') { - promise.setError(); - } else { - promise.setSuccess(event.data == 'unchanged'); - } - } - }; - - window.addEventListener('message', messageCallback, false); - - return promise.promise; - } - - function scheduleCheckIframe() { - if (loginIframe.enable) { - if (kc.token) { - setTimeout(function() { - checkLoginIframe().then(function(unchanged) { - if (unchanged) { - scheduleCheckIframe(); - } - }); - }, loginIframe.interval * 1000); - } - } - } - - function checkLoginIframe() { - var promise = createPromise(); - - if (loginIframe.iframe && loginIframe.iframeOrigin ) { - var msg = kc.clientId + ' ' + (kc.sessionId ? kc.sessionId : ''); - loginIframe.callbackList.push(promise); - var origin = loginIframe.iframeOrigin; - if (loginIframe.callbackList.length == 1) { - loginIframe.iframe.contentWindow.postMessage(msg, origin); - } - } else { - promise.setSuccess(); - } - - return promise.promise; - } - - function loadAdapter(type) { - if (!type || type == 'default') { - return { - login: function(options) { - window.location.replace(kc.createLoginUrl(options)); - return createPromise().promise; - }, - - logout: function(options) { - window.location.replace(kc.createLogoutUrl(options)); - return createPromise().promise; - }, - - register: function(options) { - window.location.replace(kc.createRegisterUrl(options)); - return createPromise().promise; - }, - - accountManagement : function() { - var accountUrl = kc.createAccountUrl(); - if (typeof accountUrl !== 'undefined') { - window.location.href = accountUrl; - } else { - throw "Not supported by the OIDC server"; - } - return createPromise().promise; - }, - - redirectUri: function(options, encodeHash) { - if (arguments.length == 1) { - encodeHash = true; - } - - if (options && options.redirectUri) { - return options.redirectUri; - } else if (kc.redirectUri) { - return kc.redirectUri; - } else { - return location.href; - } - } - }; - } - - if (type == 'cordova') { - loginIframe.enable = false; - var cordovaOpenWindowWrapper = function(loginUrl, target, options) { - if (window.cordova && window.cordova.InAppBrowser) { - // Use inappbrowser for IOS and Android if available - return window.cordova.InAppBrowser.open(loginUrl, target, options); - } else { - return window.open(loginUrl, target, options); - } - }; - - var shallowCloneCordovaOptions = function (userOptions) { - if (userOptions && userOptions.cordovaOptions) { - return Object.keys(userOptions.cordovaOptions).reduce(function (options, optionName) { - options[optionName] = userOptions.cordovaOptions[optionName]; - return options; - }, {}); - } else { - return {}; - } - }; - - var formatCordovaOptions = function (cordovaOptions) { - return Object.keys(cordovaOptions).reduce(function (options, optionName) { - options.push(optionName+"="+cordovaOptions[optionName]); - return options; - }, []).join(","); - }; - - var createCordovaOptions = function (userOptions) { - var cordovaOptions = shallowCloneCordovaOptions(userOptions); - cordovaOptions.location = 'no'; - if (userOptions && userOptions.prompt == 'none') { - cordovaOptions.hidden = 'yes'; - } - return formatCordovaOptions(cordovaOptions); - }; - - return { - login: function(options) { - var promise = createPromise(); - - var cordovaOptions = createCordovaOptions(options); - var loginUrl = kc.createLoginUrl(options); - var ref = cordovaOpenWindowWrapper(loginUrl, '_blank', cordovaOptions); - var completed = false; - - var closed = false; - var closeBrowser = function() { - closed = true; - ref.close(); - }; - - ref.addEventListener('loadstart', function(event) { - if (event.url.indexOf('http://localhost') == 0) { - var callback = parseCallback(event.url); - processCallback(callback, promise); - closeBrowser(); - completed = true; - } - }); - - ref.addEventListener('loaderror', function(event) { - if (!completed) { - if (event.url.indexOf('http://localhost') == 0) { - var callback = parseCallback(event.url); - processCallback(callback, promise); - closeBrowser(); - completed = true; - } else { - promise.setError(); - closeBrowser(); - } - } - }); - - ref.addEventListener('exit', function(event) { - if (!closed) { - promise.setError({ - reason: "closed_by_user" - }); - } - }); - - return promise.promise; - }, - - logout: function(options) { - var promise = createPromise(); - - var logoutUrl = kc.createLogoutUrl(options); - var ref = cordovaOpenWindowWrapper(logoutUrl, '_blank', 'location=no,hidden=yes'); - - var error; - - ref.addEventListener('loadstart', function(event) { - if (event.url.indexOf('http://localhost') == 0) { - ref.close(); - } - }); - - ref.addEventListener('loaderror', function(event) { - if (event.url.indexOf('http://localhost') == 0) { - ref.close(); - } else { - error = true; - ref.close(); - } - }); - - ref.addEventListener('exit', function(event) { - if (error) { - promise.setError(); - } else { - kc.clearToken(); - promise.setSuccess(); - } - }); - - return promise.promise; - }, - - register : function(options) { - var promise = createPromise(); - var registerUrl = kc.createRegisterUrl(); - var cordovaOptions = createCordovaOptions(options); - var ref = cordovaOpenWindowWrapper(registerUrl, '_blank', cordovaOptions); - ref.addEventListener('loadstart', function(event) { - if (event.url.indexOf('http://localhost') == 0) { - ref.close(); - var oauth = parseCallback(event.url); - processCallback(oauth, promise); - } - }); - return promise.promise; - }, - - accountManagement : function() { - var accountUrl = kc.createAccountUrl(); - if (typeof accountUrl !== 'undefined') { - var ref = cordovaOpenWindowWrapper(accountUrl, '_blank', 'location=no'); - ref.addEventListener('loadstart', function(event) { - if (event.url.indexOf('http://localhost') == 0) { - ref.close(); - } - }); - } else { - throw "Not supported by the OIDC server"; - } - }, - - redirectUri: function(options) { - return 'http://localhost'; - } - } - } - - if (type == 'cordova-native') { - loginIframe.enable = false; - - return { - login: function(options) { - var promise = createPromise(); - var loginUrl = kc.createLoginUrl(options); - - universalLinks.subscribe('keycloak', function(event) { - universalLinks.unsubscribe('keycloak'); - window.cordova.plugins.browsertab.close(); - var oauth = parseCallback(event.url); - processCallback(oauth, promise); - }); - - window.cordova.plugins.browsertab.openUrl(loginUrl); - return promise.promise; - }, - - logout: function(options) { - var promise = createPromise(); - var logoutUrl = kc.createLogoutUrl(options); - - universalLinks.subscribe('keycloak', function(event) { - universalLinks.unsubscribe('keycloak'); - window.cordova.plugins.browsertab.close(); - kc.clearToken(); - promise.setSuccess(); - }); - - window.cordova.plugins.browsertab.openUrl(logoutUrl); - return promise.promise; - }, - - register : function(options) { - var promise = createPromise(); - var registerUrl = kc.createRegisterUrl(options); - universalLinks.subscribe('keycloak' , function(event) { - universalLinks.unsubscribe('keycloak'); - window.cordova.plugins.browsertab.close(); - var oauth = parseCallback(event.url); - processCallback(oauth, promise); - }); - window.cordova.plugins.browsertab.openUrl(registerUrl); - return promise.promise; - - }, - - accountManagement : function() { - var accountUrl = kc.createAccountUrl(); - if (typeof accountUrl !== 'undefined') { - window.cordova.plugins.browsertab.openUrl(accountUrl); - } else { - throw "Not supported by the OIDC server"; - } - }, - - redirectUri: function(options) { - if (options && options.redirectUri) { - return options.redirectUri; - } else if (kc.redirectUri) { - return kc.redirectUri; - } else { - return "http://localhost"; - } - } - } - } - - throw 'invalid adapter type: ' + type; - } - - var LocalStorage = function() { - if (!(this instanceof LocalStorage)) { - return new LocalStorage(); - } - - localStorage.setItem('kc-test', 'test'); - localStorage.removeItem('kc-test'); - - var cs = this; - - function clearExpired() { - var time = new Date().getTime(); - for (var i = 0; i < localStorage.length; i++) { - var key = localStorage.key(i); - if (key && key.indexOf('kc-callback-') == 0) { - var value = localStorage.getItem(key); - if (value) { - try { - var expires = JSON.parse(value).expires; - if (!expires || expires < time) { - localStorage.removeItem(key); - } - } catch (err) { - localStorage.removeItem(key); - } - } - } - } - } - - cs.get = function(state) { - if (!state) { - return; - } - - var key = 'kc-callback-' + state; - var value = localStorage.getItem(key); - if (value) { - localStorage.removeItem(key); - value = JSON.parse(value); - } - - clearExpired(); - return value; - }; - - cs.add = function(state) { - clearExpired(); - - var key = 'kc-callback-' + state.state; - state.expires = new Date().getTime() + (60 * 60 * 1000); - localStorage.setItem(key, JSON.stringify(state)); - }; - }; - - var CookieStorage = function() { - if (!(this instanceof CookieStorage)) { - return new CookieStorage(); - } - - var cs = this; - - cs.get = function(state) { - if (!state) { - return; - } - - var value = getCookie('kc-callback-' + state); - setCookie('kc-callback-' + state, '', cookieExpiration(-100)); - if (value) { - return JSON.parse(value); - } - }; - - cs.add = function(state) { - setCookie('kc-callback-' + state.state, JSON.stringify(state), cookieExpiration(60)); - }; - - cs.removeItem = function(key) { - setCookie(key, '', cookieExpiration(-100)); - }; - - var cookieExpiration = function (minutes) { - var exp = new Date(); - exp.setTime(exp.getTime() + (minutes*60*1000)); - return exp; - }; - - var getCookie = function (key) { - var name = key + '='; - var ca = document.cookie.split(';'); - for (var i = 0; i < ca.length; i++) { - var c = ca[i]; - while (c.charAt(0) == ' ') { - c = c.substring(1); - } - if (c.indexOf(name) == 0) { - return c.substring(name.length, c.length); - } - } - return ''; - }; - - var setCookie = function (key, value, expirationDate) { - var cookie = key + '=' + value + '; ' - + 'expires=' + expirationDate.toUTCString() + '; '; - document.cookie = cookie; - } - }; - - function createCallbackStorage() { - try { - return new LocalStorage(); - } catch (err) { - } - - return new CookieStorage(); - } - - function createLogger(fn) { - return function() { - if (kc.enableLogging) { - fn.apply(console, Array.prototype.slice.call(arguments)); - } - }; - } - } - - return Keycloak; -}) diff --git a/applications/osb-portal/webpack.common.js b/applications/osb-portal/webpack.common.js index b2f95b95..72800ff7 100644 --- a/applications/osb-portal/webpack.common.js +++ b/applications/osb-portal/webpack.common.js @@ -8,20 +8,12 @@ console.log(contentbase); module.exports = env => { - if(!env) { + if (!env) { env = {} } - - function setEnv(content) { - console.log("Replacing ENV", env); - let result = content.toString(); - for(const v in env) { - result = result.replace(new RegExp(`__${v}__`), env[v]); - } - console.log(result); - return result; - } + + return { output: { path: path.resolve(__dirname, 'public'), @@ -51,15 +43,15 @@ module.exports = env => { { test: /\.less$/, use: [ - { - loader: 'style-loader', - }, - { - loader: 'css-loader', - }, - { - loader: 'less-loader', - }, + { + loader: 'style-loader', + }, + { + loader: 'css-loader', + }, + { + loader: 'less-loader', + }, ], }, { @@ -72,7 +64,7 @@ module.exports = env => { test: /\.js$/, loader: "source-map-loader" }, - + ] }, @@ -82,10 +74,10 @@ module.exports = env => { { from: './src/assets-parametrized', contentbase, }, - { + { from: './src/assets', contentbase, }, - + ]), ], diff --git a/applications/osb-portal/webpack.dev.js b/applications/osb-portal/webpack.dev.js index b616768f..013351e4 100644 --- a/applications/osb-portal/webpack.dev.js +++ b/applications/osb-portal/webpack.dev.js @@ -18,6 +18,15 @@ if (process.env.USE_MOCKS) { module.exports = env => { const osbDomain = env && env.DOMAIN ? env.DOMAIN : 'osb.local'; const replaceHost = (uri, appName) => uri.replace("__APP_NAME__", appName + '.' + osbDomain); + function setEnv(content) { + console.log("Replacing ENV", env); + let result = content.toString(); + for (const v in env) { + result = result.replace(new RegExp(`__${v}__`), env[v]); + } + console.log(result); + return result; + } return merge( { mode: 'development', diff --git a/applications/workspaces/deploy/values.yaml b/applications/workspaces/deploy/values.yaml index d43c3fee..06417b87 100644 --- a/applications/workspaces/deploy/values.yaml +++ b/applications/workspaces/deploy/values.yaml @@ -15,6 +15,9 @@ harness: size: 4G mountpath: /usr/src/app/workspaces/static/workspaces dependencies: + build: + - cloudharness-base + - cloudharness-flask soft: - events - common diff --git a/applications/workspaces/server/.dockerignore b/applications/workspaces/server/.dockerignore index f9619601..a05d73b5 100644 --- a/applications/workspaces/server/.dockerignore +++ b/applications/workspaces/server/.dockerignore @@ -4,7 +4,6 @@ README.md tox.ini git_push.sh test-requirements.txt -setup.py # Byte-compiled / optimized / DLL files __pycache__/ diff --git a/applications/workspaces/server/Dockerfile b/applications/workspaces/server/Dockerfile index 42c7afb5..a606599d 100644 --- a/applications/workspaces/server/Dockerfile +++ b/applications/workspaces/server/Dockerfile @@ -1,6 +1,8 @@ ARG REGISTRY ARG TAG=latest -FROM ${REGISTRY}cloudharness-base:${TAG} +ARG CLOUDHARNESS_FLASK=${REGISTRY}cloudharness-flask:${TAG} + +FROM $CLOUDHARNESS_FLASK RUN apk update RUN apk upgrade @@ -26,9 +28,9 @@ EXPOSE 8080 ENV FLASK_ENV=production ENV FLASK_RUN_HOST=0.0.0.0 ENV FLASK_RUN_PORT=8080 +ENV PORT=$FLASK_RUN_PORT ENV FLASK_APP=workspaces.__main__ ENV FLASK_LOG_LEVEL=info -ENTRYPOINT ["flask"] - -CMD ["run"] +RUN pip3 install -e . +ENTRYPOINT gunicorn --workers=$WORKERS --bind=0.0.0.0:$PORT $FLASK_APP:app \ No newline at end of file diff --git a/applications/workspaces/server/workspaces/__main__.py b/applications/workspaces/server/workspaces/__main__.py index cae8c90d..326772f0 100644 --- a/applications/workspaces/server/workspaces/__main__.py +++ b/applications/workspaces/server/workspaces/__main__.py @@ -1,5 +1,6 @@ #!/usr/bin/env python3 +from flask.logging import default_handler import atexit import connexion import logging @@ -11,14 +12,13 @@ from flask_cors import CORS import cloudharness +from cloudharness.utils.server import init_flask, main from workspaces.config import Config from workspaces.repository.database import db, setup_db from workspaces.service.events import start_kafka_consumers, stop_kafka_consumers -logger = logging.getLogger(Config.APP_NAME) - -from flask.logging import default_handler +logger = cloudharness.log def setup_logging(): @@ -34,10 +34,11 @@ def setup_logging(): def mkdirs(): - Path(os.path.join(Config.STATIC_DIR, Config.WORKSPACES_DIR)).mkdir(parents=True, exist_ok=True) + Path(os.path.join(Config.STATIC_DIR, Config.WORKSPACES_DIR)).mkdir( + parents=True, exist_ok=True) -def setup_static_router(): +def setup_static_router(app): # set the static folder root to the www folder app.static_folder = Config.STATIC_DIR # remove the static route (if exists) @@ -48,34 +49,28 @@ def setup_static_router(): view_func=app.send_static_file) -connexion_app = connexion.App(Config.APP_NAME, specification_dir=Config.OPENAPI_DIR) -app = connexion_app.app -app.config.from_object(Config) -setup_static_router() -mkdirs() -db.init_app(app) - -cors = CORS(app, resources={r"/api/*": {"origins": "*"}}) - -with app.app_context(): - setup_logging() +def init_app(app): + cors = CORS(app, resources={r"/api/*": {"origins": "*"}}) if app.config['ENV'] != 'development': cloudharness.init(Config.APP_NAME) - setup_db(app) - connexion_app.add_api(Config.OPENAPI_FILE, - arguments={'title': 'Workspace Manager API'}, - resolver=connexion.resolver.MethodViewResolver((__package__ or '') + '.views.api')) - atexit.register(stop_kafka_consumers) + try: - start_kafka_consumers() - except: - logger.error('Couldn not start kafka consumers', exc_info=True) + setup_db(app) + except Exception as e: + logger.error("Could not init database. Some application functionality won't be available.", exc_info=True) + try: + atexit.register(stop_kafka_consumers) + start_kafka_consumers() + except Exception as e: + logger.error("Could not start kafka consumers. Some application functionality won't be available.", exc_info=True) + setup_static_router(app) -@app.route('/', defaults={'file': 'index.html'}) -def index(file): - return send_from_directory(app.static_folder, file) +app = init_flask(title="Workspace Manager API", webapp=True, init_app_fn=init_app, + resolver=connexion.resolver.MethodViewResolver( + 'workspaces.views.api'), + config=Config) -if __name__ == "__main__": - connexion_app.run(port=8080) +if __name__ == '__main__': + main() diff --git a/applications/workspaces/server/workspaces/repository/database.py b/applications/workspaces/server/workspaces/repository/database.py index 0ef9c960..31d06f17 100644 --- a/applications/workspaces/server/workspaces/repository/database.py +++ b/applications/workspaces/server/workspaces/repository/database.py @@ -1,13 +1,12 @@ """Setup for the repository.""" -import logging +from cloudharness import log import os from flask_sqlalchemy import SQLAlchemy from ..config import Config from open_alchemy import init_yaml -logger = logging.getLogger(Config.APP_NAME) # Construct models db = SQLAlchemy() @@ -17,6 +16,7 @@ def setup_db(app): + db.init_app(app) db.create_all() from .fixtures import create_fixtures create_fixtures(app) diff --git a/applications/workspaces/server/workspaces/repository/models.py b/applications/workspaces/server/workspaces/repository/models.py index 52102656..01fdc808 100644 --- a/applications/workspaces/server/workspaces/repository/models.py +++ b/applications/workspaces/server/workspaces/repository/models.py @@ -530,6 +530,7 @@ class WorkspaceResourceDict(_WorkspaceResourceDictBase, total=False): """TypedDict for properties that are not required.""" id: int + folder: typing.Optional[str] status: str timestamp_created: typing.Optional[datetime.datetime] timestamp_updated: typing.Optional[datetime.datetime] @@ -546,7 +547,9 @@ class TWorkspaceResource(typing_extensions.Protocol): Attrs: id: The id of the WorkspaceResource. name: WorkspaceResource name - location: WorkspaceResource location where the resource is stored + location: WorkspaceResource location original location of the resource + folder: WorkspaceResource folder where the resource will stored in the + pvc status: Resource status: * a - Available * e - Error, not available * p - Pending timestamp_created: Date/time of creation of the WorkspaceResource @@ -568,6 +571,7 @@ class TWorkspaceResource(typing_extensions.Protocol): id: int name: str location: str + folder: typing.Optional[str] status: str timestamp_created: typing.Optional[datetime.datetime] timestamp_updated: typing.Optional[datetime.datetime] @@ -581,6 +585,7 @@ def __init__( location: str, resource_type: str, id: typing.Optional[int] = None, + folder: typing.Optional[str] = None, status: str = "p", timestamp_created: typing.Optional[datetime.datetime] = None, timestamp_updated: typing.Optional[datetime.datetime] = None, @@ -593,7 +598,10 @@ def __init__( Args: id: The id of the WorkspaceResource. name: WorkspaceResource name - location: WorkspaceResource location where the resource is stored + location: WorkspaceResource location original location of the + resource + folder: WorkspaceResource folder where the resource will stored in + the pvc status: Resource status: * a - Available * e - Error, not available * p - Pending timestamp_created: Date/time of creation of the WorkspaceResource @@ -615,6 +623,7 @@ def from_dict( location: str, resource_type: str, id: typing.Optional[int] = None, + folder: typing.Optional[str] = None, status: str = "p", timestamp_created: typing.Optional[datetime.datetime] = None, timestamp_updated: typing.Optional[datetime.datetime] = None, @@ -627,7 +636,10 @@ def from_dict( Args: id: The id of the WorkspaceResource. name: WorkspaceResource name - location: WorkspaceResource location where the resource is stored + location: WorkspaceResource location original location of the + resource + folder: WorkspaceResource folder where the resource will stored in + the pvc status: Resource status: * a - Available * e - Error, not available * p - Pending timestamp_created: Date/time of creation of the WorkspaceResource diff --git a/deployment-configuration/values-template-dev.yaml b/deployment-configuration/values-template-dev.yaml index 6b178e82..8ac175f6 100644 --- a/deployment-configuration/values-template-dev.yaml +++ b/deployment-configuration/values-template-dev.yaml @@ -1,2 +1,4 @@ backup: - active: false \ No newline at end of file + active: true + schedule: "*/1 * * * *" +mainapp: osb-portal \ No newline at end of file diff --git a/deployment/codefresh-dev.yaml b/deployment/codefresh-dev.yaml index 2769cf6d..6c18ac17 100644 --- a/deployment/codefresh-dev.yaml +++ b/deployment/codefresh-dev.yaml @@ -154,7 +154,7 @@ steps: image_name: osb-portal title: Osb portal working_directory: ./build/applications/osb-portal - common: + events: type: build stage: build tag: '${{CF_BUILD_ID}}' @@ -165,24 +165,10 @@ steps: - TAG=${{CF_BUILD_ID}} - NAMESPACE=${{NAMESPACE}} - DOMAIN=${{DOMAIN}} - image_name: common - title: Common - working_directory: ./build/applications/common/server - netpyne: - type: build - stage: build - tag: '${{CF_BUILD_ID}}' - dockerfile: Dockerfile - registry: '${{CODEFRESH_REGISTRY}}' - build_arguments: - - REGISTRY=${{REGISTRY}}/ - - TAG=${{CF_BUILD_ID}} - - NAMESPACE=${{NAMESPACE}} - - DOMAIN=${{DOMAIN}} - image_name: netpyne - title: Netpyne - working_directory: ./build/applications/netpyne - nwb-explorer: + image_name: events + title: Events + working_directory: ./build/applications/events + common: type: build stage: build tag: '${{CF_BUILD_ID}}' @@ -193,9 +179,9 @@ steps: - TAG=${{CF_BUILD_ID}} - NAMESPACE=${{NAMESPACE}} - DOMAIN=${{DOMAIN}} - image_name: nwb-explorer - title: Nwb explorer - working_directory: ./build/applications/nwb-explorer + image_name: common + title: Common + working_directory: ./build/applications/common/server jupyterhub: type: build stage: build @@ -396,27 +382,19 @@ steps: tags: - '${{DEPLOYMENT_PUBLISH_TAG}}' registry: '${{REGISTRY_PUBLISH_URL}}' - publish_common: - stage: publish - type: push - title: Common - candidate: '${{REGISTRY}}/common:${{CF_BUILD_ID}}' - tags: - - '${{DEPLOYMENT_PUBLISH_TAG}}' - registry: '${{REGISTRY_PUBLISH_URL}}' - publish_netpyne: + publish_events: stage: publish type: push - title: Netpyne - candidate: '${{REGISTRY}}/netpyne:${{CF_BUILD_ID}}' + title: Events + candidate: '${{REGISTRY}}/events:${{CF_BUILD_ID}}' tags: - '${{DEPLOYMENT_PUBLISH_TAG}}' registry: '${{REGISTRY_PUBLISH_URL}}' - publish_nwb-explorer: + publish_common: stage: publish type: push - title: Nwb explorer - candidate: '${{REGISTRY}}/nwb-explorer:${{CF_BUILD_ID}}' + title: Common + candidate: '${{REGISTRY}}/common:${{CF_BUILD_ID}}' tags: - '${{DEPLOYMENT_PUBLISH_TAG}}' registry: '${{REGISTRY_PUBLISH_URL}}' diff --git a/deployment/codefresh-prod.yaml b/deployment/codefresh-prod.yaml index bff53637..ce03cd0d 100644 --- a/deployment/codefresh-prod.yaml +++ b/deployment/codefresh-prod.yaml @@ -130,29 +130,20 @@ steps: - '${{DEPLOYMENT_PUBLISH_TAG}}' - latest registry: '${{REGISTRY_PUBLISH_URL}}' - publish_common: - stage: publish - type: push - title: Common - candidate: '${{REGISTRY}}/common:${{DEPLOYMENT_TAG}}' - tags: - - '${{DEPLOYMENT_PUBLISH_TAG}}' - - latest - registry: '${{REGISTRY_PUBLISH_URL}}' - publish_netpyne: + publish_events: stage: publish type: push - title: Netpyne - candidate: '${{REGISTRY}}/netpyne:${{DEPLOYMENT_TAG}}' + title: Events + candidate: '${{REGISTRY}}/events:${{DEPLOYMENT_TAG}}' tags: - '${{DEPLOYMENT_PUBLISH_TAG}}' - latest registry: '${{REGISTRY_PUBLISH_URL}}' - publish_nwb-explorer: + publish_common: stage: publish type: push - title: Nwb explorer - candidate: '${{REGISTRY}}/nwb-explorer:${{DEPLOYMENT_TAG}}' + title: Common + candidate: '${{REGISTRY}}/common:${{DEPLOYMENT_TAG}}' tags: - '${{DEPLOYMENT_PUBLISH_TAG}}' - latest From 8317a7fa360acc57562bc525a0611498fef4378c Mon Sep 17 00:00:00 2001 From: Filippo Ledda Date: Tue, 23 Feb 2021 18:57:23 +0100 Subject: [PATCH 018/321] #97 Add missing file --- applications/osb-portal/nginx.conf | 88 +++++++++++++++++++ .../src/assets/workspace-data/notebook.ipynb | 44 ++++++++++ 2 files changed, 132 insertions(+) create mode 100644 applications/osb-portal/nginx.conf create mode 100644 applications/osb-portal/src/assets/workspace-data/notebook.ipynb diff --git a/applications/osb-portal/nginx.conf b/applications/osb-portal/nginx.conf new file mode 100644 index 00000000..05f515cd --- /dev/null +++ b/applications/osb-portal/nginx.conf @@ -0,0 +1,88 @@ + +user nginx; +worker_processes auto; + +error_log /var/log/nginx/error.log warn; +pid /var/run/nginx.pid; + + +events { + worker_connections 1024; +} + + +http { + include /etc/nginx/mime.types; + default_type application/octet-stream; + + log_format main '$remote_addr - $remote_user [$time_local] "$request" ' + '$status $body_bytes_sent "$http_referer" ' + '"$http_user_agent" "$http_x_forwarded_for"'; + + access_log /var/log/nginx/access.log main; + + sendfile on; + #tcp_nopush on; + + keepalive_timeout 65; + + gzip on; + + server { + listen 80; + server_name localhost; + + #charset koi8-r; + #access_log /var/log/nginx/host.access.log main; + + location / { + root /usr/share/nginx/html; + try_files $uri /index.html; + } + + # + location ~ ^/api/(?.*?)/(?.*$) { + resolver kube-dns.kube-system.svc.cluster.local; + set $bcknd http://$subdomain.__REALM__.svc.cluster.local:8080/$path$is_args$args; + proxy_pass $bcknd; + } + + location ~ ^/workspaces/(?.*$) { + resolver kube-dns.kube-system.svc.cluster.local; + set $bcknd http://workspaces.__REALM__.svc.cluster.local:8080/workspaces/$path$is_args$args; + proxy_pass $bcknd; + } + + #error_page 404 /404.html; + + # redirect server error pages to the static page /50x.html + # + error_page 500 502 503 504 /50x.html; + location = /50x.html { + root /usr/share/nginx/html; + } + + # proxy the PHP scripts to Apache listening on 127.0.0.1:80 + # + #location ~ \.php$ { + # proxy_pass http://127.0.0.1; + #} + + # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 + # + #location ~ \.php$ { + # root html; + # fastcgi_pass 127.0.0.1:9000; + # fastcgi_index index.php; + # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; + # include fastcgi_params; + #} + + # deny access to .htaccess files, if Apache's document root + # concurs with nginx's one + # + #location ~ /\.ht { + # deny all; + #} + } +} \ No newline at end of file diff --git a/applications/osb-portal/src/assets/workspace-data/notebook.ipynb b/applications/osb-portal/src/assets/workspace-data/notebook.ipynb new file mode 100644 index 00000000..b1f9f3f2 --- /dev/null +++ b/applications/osb-portal/src/assets/workspace-data/notebook.ipynb @@ -0,0 +1,44 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Welcome to the Open Source Brain lab!\n", + "--\n", + "\n", + "You can edit and run notebooks and other files in this workspace.\n", + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "nwbfile" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.9" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} \ No newline at end of file From 5bdd56f1d79724d65adfb8f8da3d9f7073f4e54a Mon Sep 17 00:00:00 2001 From: Filippo Ledda Date: Tue, 23 Feb 2021 19:01:32 +0100 Subject: [PATCH 019/321] #97 Fix deployment missing applications --- deployment/codefresh-dev.yaml | 44 ++++++++++++++++++++++++++++++++++ deployment/codefresh-prod.yaml | 18 ++++++++++++++ 2 files changed, 62 insertions(+) diff --git a/deployment/codefresh-dev.yaml b/deployment/codefresh-dev.yaml index 6c18ac17..b6db6df9 100644 --- a/deployment/codefresh-dev.yaml +++ b/deployment/codefresh-dev.yaml @@ -182,6 +182,34 @@ steps: image_name: common title: Common working_directory: ./build/applications/common/server + netpyne: + type: build + stage: build + tag: '${{CF_BUILD_ID}}' + dockerfile: Dockerfile + registry: '${{CODEFRESH_REGISTRY}}' + build_arguments: + - REGISTRY=${{REGISTRY}}/ + - TAG=${{CF_BUILD_ID}} + - NAMESPACE=${{NAMESPACE}} + - DOMAIN=${{DOMAIN}} + image_name: netpyne + title: Netpyne + working_directory: ./build/applications/netpyne + nwb-explorer: + type: build + stage: build + tag: '${{CF_BUILD_ID}}' + dockerfile: Dockerfile + registry: '${{CODEFRESH_REGISTRY}}' + build_arguments: + - REGISTRY=${{REGISTRY}}/ + - TAG=${{CF_BUILD_ID}} + - NAMESPACE=${{NAMESPACE}} + - DOMAIN=${{DOMAIN}} + image_name: nwb-explorer + title: Nwb explorer + working_directory: ./build/applications/nwb-explorer jupyterhub: type: build stage: build @@ -398,6 +426,22 @@ steps: tags: - '${{DEPLOYMENT_PUBLISH_TAG}}' registry: '${{REGISTRY_PUBLISH_URL}}' + publish_netpyne: + stage: publish + type: push + title: Netpyne + candidate: '${{REGISTRY}}/netpyne:${{CF_BUILD_ID}}' + tags: + - '${{DEPLOYMENT_PUBLISH_TAG}}' + registry: '${{REGISTRY_PUBLISH_URL}}' + publish_nwb-explorer: + stage: publish + type: push + title: Nwb explorer + candidate: '${{REGISTRY}}/nwb-explorer:${{CF_BUILD_ID}}' + tags: + - '${{DEPLOYMENT_PUBLISH_TAG}}' + registry: '${{REGISTRY_PUBLISH_URL}}' publish_jupyterhub: stage: publish type: push diff --git a/deployment/codefresh-prod.yaml b/deployment/codefresh-prod.yaml index ce03cd0d..bae9b398 100644 --- a/deployment/codefresh-prod.yaml +++ b/deployment/codefresh-prod.yaml @@ -148,6 +148,24 @@ steps: - '${{DEPLOYMENT_PUBLISH_TAG}}' - latest registry: '${{REGISTRY_PUBLISH_URL}}' + publish_netpyne: + stage: publish + type: push + title: Netpyne + candidate: '${{REGISTRY}}/netpyne:${{DEPLOYMENT_TAG}}' + tags: + - '${{DEPLOYMENT_PUBLISH_TAG}}' + - latest + registry: '${{REGISTRY_PUBLISH_URL}}' + publish_nwb-explorer: + stage: publish + type: push + title: Nwb explorer + candidate: '${{REGISTRY}}/nwb-explorer:${{DEPLOYMENT_TAG}}' + tags: + - '${{DEPLOYMENT_PUBLISH_TAG}}' + - latest + registry: '${{REGISTRY_PUBLISH_URL}}' publish_jupyterhub: stage: publish type: push From 006ccd00b128d78774f63403d693e2c148364ed0 Mon Sep 17 00:00:00 2001 From: Filippo Ledda Date: Wed, 24 Feb 2021 11:41:24 +0100 Subject: [PATCH 020/321] Fix workspaces post refactoring --- applications/osb-portal/package.json | 4 +- .../osb-portal/src/components/App.tsx | 47 -------------- .../src/components/header/Banner.tsx | 4 +- .../src/components/header/Header.tsx | 51 +++++++-------- .../osb-portal/src/components/index.ts | 4 +- .../src/components/menu/MainMenu.tsx | 9 +-- .../src/components/menu/MainMenuItem.tsx | 29 +++++++-- .../src/components/pages/HomePage.tsx | 65 ------------------- .../src/components/pages/WorkspacePage.tsx | 26 -------- .../components/workspace/WorkspaceFrame.tsx | 2 +- .../workspace/drawer/WorkspaceDrawer.tsx | 1 - .../drawer/WorkspaceInteractions.tsx | 31 +++++---- applications/osb-portal/webpack.dev.js | 2 + .../workspaces/views/base_model_view.py | 14 ++-- 14 files changed, 88 insertions(+), 201 deletions(-) delete mode 100644 applications/osb-portal/src/components/App.tsx delete mode 100644 applications/osb-portal/src/components/pages/HomePage.tsx delete mode 100644 applications/osb-portal/src/components/pages/WorkspacePage.tsx diff --git a/applications/osb-portal/package.json b/applications/osb-portal/package.json index 9aa7e962..9121738d 100644 --- a/applications/osb-portal/package.json +++ b/applications/osb-portal/package.json @@ -4,7 +4,7 @@ "description": "", "main": "index.js", "scripts": { - "start:dev": "webpack-dev-server --progress --config webpack.dev.js", + "start:dev": "webpack-dev-server --progress --config webpack.dev.js --env.DOMAIN=v2dev.opensourcebrain.org --env.NAMESPACE=osb2", "start:test": "webpack-dev-server --progress --config webpack.dev.js --env.DOMAIN=v2.opensourcebrain.org --env.NAMESPACE=osb2", "start:minikube": "webpack-dev-server --progress --config webpack.dev.js --env.DOMAIN=osb.local --env.NAMESPACE=osb2", "prebuild": "tslint -c tslint.json 'src/**/*.{ts,tsx}'", @@ -72,4 +72,4 @@ "redux": "^4.0.5", "redux-logger": "^3.0.6" } -} +} \ No newline at end of file diff --git a/applications/osb-portal/src/components/App.tsx b/applications/osb-portal/src/components/App.tsx deleted file mode 100644 index bb62c7f1..00000000 --- a/applications/osb-portal/src/components/App.tsx +++ /dev/null @@ -1,47 +0,0 @@ -import * as React from "react"; -import { BrowserRouter as Router, Route, Switch } from "react-router-dom"; -import { ThemeProvider } from "@material-ui/core/styles"; -import { CssBaseline, makeStyles } from "@material-ui/core"; -import SentryErrorBoundary from "./sentry/SentryErrorBoundary"; -import HomePage from "./pages/HomePage"; -import theme from "../theme"; -import { Header, ErrorDialog, WorkspacePage, ProtectedRoute } from "./index"; - -const useStyles = makeStyles(() => ({ - mainContainer: { - overflow: "auto", - minHeight: "100vh", - display: "flex", - flexDirection: "column", - [theme.breakpoints.up("md")]: { - maxHeight: "100vh", - overflow: "hidden", - } - }, -})); - -export const App = (props: any) => { - const classes = useStyles(); - - return ( - - - - -
-
- - - - - - - - - - -
-
-
- ); -}; diff --git a/applications/osb-portal/src/components/header/Banner.tsx b/applications/osb-portal/src/components/header/Banner.tsx index 1fd6de59..3675ff3b 100644 --- a/applications/osb-portal/src/components/header/Banner.tsx +++ b/applications/osb-portal/src/components/header/Banner.tsx @@ -52,7 +52,9 @@ export const Banner = (props: any) => { {text2} - + {'' && // TODO temporarily disabled + + } {user === null ? ( ) : null} diff --git a/applications/osb-portal/src/components/header/Header.tsx b/applications/osb-portal/src/components/header/Header.tsx index ec2c3466..9cb7ff2d 100644 --- a/applications/osb-portal/src/components/header/Header.tsx +++ b/applications/osb-portal/src/components/header/Header.tsx @@ -12,7 +12,6 @@ import { makeStyles, } from "@material-ui/core"; import PersonIcon from "@material-ui/icons/Person"; -import { radius } from '../../theme'; const title = "Open Source Brain"; @@ -86,31 +85,31 @@ export const Header = (props: any) => { Sign in ) : ( - - - - - - My account - Settings - Logout - - - - - - - ); + + + + + + My account + Settings + Logout + + + + + + + ); const handleToggleDrawer = (e: any) => { if (props.drawerEnabled) { diff --git a/applications/osb-portal/src/components/index.ts b/applications/osb-portal/src/components/index.ts index 71427b31..1378906b 100644 --- a/applications/osb-portal/src/components/index.ts +++ b/applications/osb-portal/src/components/index.ts @@ -1,6 +1,6 @@ import { connect } from 'react-redux' -import { App as app } from './App' +import { App as app } from '../App' import { Workspaces as workspace } from './workspace/Workspaces' import { WorkspaceToolBox as workspacetoolbox } from './workspace/NewWorkspaceToolBox' import workspaceInteractions from './workspace/drawer/WorkspaceInteractions'; @@ -11,7 +11,7 @@ import { WorkspaceDrawer as workspacedrawer } from './workspace/drawer/Workspace import { ErrorDialog as errorDialog } from './error-dialog/ErrorDialog' import { WorkspaceFrame as workspaceFrame } from './workspace/WorkspaceFrame'; import { ProtectedRoute as protectedRoute } from './auth/ProtectedRouter'; -import workspacePage from "./pages/WorkspacePage"; +import workspacePage from "../pages/WorkspacePage"; import { RootState } from '../store/rootReducer' import * as WorkspacesActions from '../store/actions/workspaces' diff --git a/applications/osb-portal/src/components/menu/MainMenu.tsx b/applications/osb-portal/src/components/menu/MainMenu.tsx index c60e41e2..c20a6dbe 100644 --- a/applications/osb-portal/src/components/menu/MainMenu.tsx +++ b/applications/osb-portal/src/components/menu/MainMenu.tsx @@ -25,11 +25,12 @@ export const MainMenu = () => { - - - - + + + + ); }; diff --git a/applications/osb-portal/src/components/menu/MainMenuItem.tsx b/applications/osb-portal/src/components/menu/MainMenuItem.tsx index 7dd368d1..18eb8caa 100644 --- a/applications/osb-portal/src/components/menu/MainMenuItem.tsx +++ b/applications/osb-portal/src/components/menu/MainMenuItem.tsx @@ -15,9 +15,15 @@ const useStyles = makeStyles((theme) => ({ } })); +export interface MenuItem { + label: string; + callback: (e: any) => void; +} + export type MenuItemProps = { title: string, - className: string + className: string, + items: MenuItem[] } @@ -76,9 +82,22 @@ export const MainMenuItem = (props: MenuItemProps) => { - Profile - My account - Logout + { + props.items.map(item => + { + item.callback(e); + handleClose(e); + } + } + > + {item.label} + + ) + } + @@ -86,6 +105,6 @@ export const MainMenuItem = (props: MenuItemProps) => { )} - + ) } \ No newline at end of file diff --git a/applications/osb-portal/src/components/pages/HomePage.tsx b/applications/osb-portal/src/components/pages/HomePage.tsx deleted file mode 100644 index 868e155a..00000000 --- a/applications/osb-portal/src/components/pages/HomePage.tsx +++ /dev/null @@ -1,65 +0,0 @@ -import * as React from "react"; - -import { Grid, Paper } from "@material-ui/core"; -import Box from "@material-ui/core/Box"; -import MainMenu from "../menu/MainMenu"; -import { makeStyles } from "@material-ui/core/styles"; -import { Latest } from "../latest/Latest"; - -import { - Header, - Banner, - WorkspaceDrawer, - Workspaces, - WorkspaceToolBox, - ErrorDialog, -} from ".."; - -const useStyles = makeStyles((theme) => ({ - paper: { - marginBottom: theme.spacing(2), - overflow: "hidden", - }, - moreMargin: { - marginBottom: theme.spacing(4), - }, -})); - - -export default (props: any) => { - const classes = useStyles(); - - return <> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -}; diff --git a/applications/osb-portal/src/components/pages/WorkspacePage.tsx b/applications/osb-portal/src/components/pages/WorkspacePage.tsx deleted file mode 100644 index 3150fde4..00000000 --- a/applications/osb-portal/src/components/pages/WorkspacePage.tsx +++ /dev/null @@ -1,26 +0,0 @@ -import * as React from "react"; -import Divider from "@material-ui/core/Divider"; -import { useParams } from "react-router-dom"; - -import { - WorkspaceDrawer, - WorkspaceFrame -} from ".."; - -// import workspaceService from "../../service/WorkspaceService"; -// import { Workspace } from "../../types/workspace"; - -export default (props: any) => { - const { workspaceId } = useParams(); - - props.selectWorkspace(workspaceId as string); - - return ( - <> - - - - - - ); -}; diff --git a/applications/osb-portal/src/components/workspace/WorkspaceFrame.tsx b/applications/osb-portal/src/components/workspace/WorkspaceFrame.tsx index 2c7e1307..fae7272a 100644 --- a/applications/osb-portal/src/components/workspace/WorkspaceFrame.tsx +++ b/applications/osb-portal/src/components/workspace/WorkspaceFrame.tsx @@ -50,7 +50,7 @@ export const WorkspaceFrame = (props: { user: UserInfo, workspace: Workspace, lo } } - const domain = window.location.host.includes('.') ? window.location.host.split('.').slice(1).join('.') : window.location.host // remove the first part of the hostname + const domain = window.location.host.includes('www.') ? window.location.host.split('.').slice(1).join('.') : window.location.host // remove the first part of the hostname const workspaceParam = `workspace=${encodeURIComponent(id)}`; const userParam = (user == null) ? '' : `${user.id}`; const application = workspace.lastOpen.type.application.subdomain; diff --git a/applications/osb-portal/src/components/workspace/drawer/WorkspaceDrawer.tsx b/applications/osb-portal/src/components/workspace/drawer/WorkspaceDrawer.tsx index 94a4ed7c..0b503d23 100644 --- a/applications/osb-portal/src/components/workspace/drawer/WorkspaceDrawer.tsx +++ b/applications/osb-portal/src/components/workspace/drawer/WorkspaceDrawer.tsx @@ -4,7 +4,6 @@ import { makeStyles, useTheme } from "@material-ui/core/styles"; import Drawer from "@material-ui/core/Drawer"; import Box from "@material-ui/core/Box"; import IconButton from "@material-ui/core/IconButton"; -import AddIcon from "@material-ui/icons/Add"; import Divider from "@material-ui/core/Divider"; import { WorkspaceInteractions } from "../.."; diff --git a/applications/osb-portal/src/components/workspace/drawer/WorkspaceInteractions.tsx b/applications/osb-portal/src/components/workspace/drawer/WorkspaceInteractions.tsx index 7af45bdb..c8f5d404 100644 --- a/applications/osb-portal/src/components/workspace/drawer/WorkspaceInteractions.tsx +++ b/applications/osb-portal/src/components/workspace/drawer/WorkspaceInteractions.tsx @@ -91,7 +91,7 @@ export default (props: WorkspaceProps | any) => { } if (workspace.resources.find((resource: any) => resource.status === ResourceStatus.pending)) { - setTimeout(props.refreshWorkspace, 10000); + setTimeout(props.refreshWorkspace, 30000); } @@ -172,20 +172,23 @@ export default (props: WorkspaceProps | any) => { /> - - } - > - User shared space - + { false && // TODO user shared space back when available + + } + > + User shared space + + + + + + + } - - - - ) : <>
diff --git a/applications/osb-portal/webpack.dev.js b/applications/osb-portal/webpack.dev.js index 013351e4..4f23ff97 100644 --- a/applications/osb-portal/webpack.dev.js +++ b/applications/osb-portal/webpack.dev.js @@ -18,6 +18,7 @@ if (process.env.USE_MOCKS) { module.exports = env => { const osbDomain = env && env.DOMAIN ? env.DOMAIN : 'osb.local'; const replaceHost = (uri, appName) => uri.replace("__APP_NAME__", appName + '.' + osbDomain); + function setEnv(content) { console.log("Replacing ENV", env); let result = content.toString(); @@ -27,6 +28,7 @@ module.exports = env => { console.log(result); return result; } + return merge( { mode: 'development', diff --git a/applications/workspaces/server/workspaces/views/base_model_view.py b/applications/workspaces/server/workspaces/views/base_model_view.py index 02bc0015..b883cde9 100644 --- a/applications/workspaces/server/workspaces/views/base_model_view.py +++ b/applications/workspaces/server/workspaces/views/base_model_view.py @@ -43,17 +43,17 @@ def post(self, body): obj = obj.to_dict() return obj, result_code - def get(self, id): + def get(self, id_): """Get an object from the repository.""" - obj, found = self.repository.get(id=id) + obj, found = self.repository.get(id=id_) if not found: - return f"{self.repository.model.__name__} with id {id} not found.", 404 + return f"{self.repository.model.__name__} with id {id_} not found.", 404 return obj.to_dict() - def put(self, body, id): + def put(self, body, id_): """Update an object in the repository.""" - return self.repository.put(body, id) + return self.repository.put(body, id_) - def delete(self, id): + def delete(self, id_): """Delete an object from the repository.""" - return self.repository.delete(id) + return self.repository.delete(id_) From e68cf9be549c06e3415c07259cd8413502edc196 Mon Sep 17 00:00:00 2001 From: Filippo Ledda Date: Wed, 24 Feb 2021 12:11:44 +0100 Subject: [PATCH 021/321] Fix refactoring --- applications/osb-portal/src/App.tsx | 47 +++++++++++++ .../drawer/WorkspaceResourceBrowser.tsx | 4 +- .../osb-portal/src/pages/HomePage.tsx | 68 +++++++++++++++++++ .../osb-portal/src/pages/WorkspacePage.tsx | 26 +++++++ 4 files changed, 143 insertions(+), 2 deletions(-) create mode 100644 applications/osb-portal/src/App.tsx create mode 100644 applications/osb-portal/src/pages/HomePage.tsx create mode 100644 applications/osb-portal/src/pages/WorkspacePage.tsx diff --git a/applications/osb-portal/src/App.tsx b/applications/osb-portal/src/App.tsx new file mode 100644 index 00000000..40894215 --- /dev/null +++ b/applications/osb-portal/src/App.tsx @@ -0,0 +1,47 @@ +import * as React from "react"; +import { BrowserRouter as Router, Route, Switch } from "react-router-dom"; +import { ThemeProvider } from "@material-ui/core/styles"; +import { CssBaseline, makeStyles } from "@material-ui/core"; +import SentryErrorBoundary from "./components/sentry/SentryErrorBoundary"; +import HomePage from "./pages/HomePage"; +import theme from "./theme"; +import { Header, ErrorDialog, WorkspacePage, ProtectedRoute } from "./components/index"; + +const useStyles = makeStyles(() => ({ + mainContainer: { + overflow: "auto", + minHeight: "100vh", + display: "flex", + flexDirection: "column", + [theme.breakpoints.up("md")]: { + maxHeight: "100vh", + overflow: "hidden", + } + }, +})); + +export const App = (props: any) => { + const classes = useStyles(); + + return ( + + + + +
+
+ + + + + + + + + + +
+
+
+ ); +}; diff --git a/applications/osb-portal/src/components/workspace/drawer/WorkspaceResourceBrowser.tsx b/applications/osb-portal/src/components/workspace/drawer/WorkspaceResourceBrowser.tsx index 24c3268b..6eaa4a94 100644 --- a/applications/osb-portal/src/components/workspace/drawer/WorkspaceResourceBrowser.tsx +++ b/applications/osb-portal/src/components/workspace/drawer/WorkspaceResourceBrowser.tsx @@ -14,7 +14,7 @@ import { LoadingIcon, FolderIcon, } from "../../icons"; -import { ActionLineWeight } from "material-ui/svg-icons"; + const openFileResource = (resource: WorkspaceResource, refreshWorkspace: any) => (e: any) => { const fileName = "/opt/workspace/" + resource.folder + "/" + resource.location.slice(resource.location.lastIndexOf("/") + 1); @@ -79,7 +79,7 @@ export default (props: WorkspaceProps) => { icon={null} key={idx} nodeId={idx + ''} - label={} + label={} />) ) } diff --git a/applications/osb-portal/src/pages/HomePage.tsx b/applications/osb-portal/src/pages/HomePage.tsx new file mode 100644 index 00000000..1c9dd48a --- /dev/null +++ b/applications/osb-portal/src/pages/HomePage.tsx @@ -0,0 +1,68 @@ +import * as React from "react"; + +import { Grid, Paper } from "@material-ui/core"; +import Box from "@material-ui/core/Box"; +import MainMenu from "../components/menu/MainMenu"; +import { makeStyles } from "@material-ui/core/styles"; +import { Latest } from "../components/latest/Latest"; + +import { + Header, + Banner, + WorkspaceDrawer, + Workspaces, + WorkspaceToolBox, + ErrorDialog, +} from "../components"; + +const useStyles = makeStyles((theme) => ({ + paper: { + marginBottom: theme.spacing(2), + overflow: "hidden", + }, + moreMargin: { + marginBottom: theme.spacing(4), + }, +})); + + +export default (props: any) => { + const classes = useStyles(); + + return <> + { + false && + // TODO menu back when we implement functionality + } + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +}; diff --git a/applications/osb-portal/src/pages/WorkspacePage.tsx b/applications/osb-portal/src/pages/WorkspacePage.tsx new file mode 100644 index 00000000..8d39687a --- /dev/null +++ b/applications/osb-portal/src/pages/WorkspacePage.tsx @@ -0,0 +1,26 @@ +import * as React from "react"; +import Divider from "@material-ui/core/Divider"; +import { useParams } from "react-router-dom"; + +import { + WorkspaceDrawer, + WorkspaceFrame +} from "../components"; + +// import workspaceService from "../../service/WorkspaceService"; +// import { Workspace } from "../../types/workspace"; + +export default (props: any) => { + const { workspaceId } = useParams(); + + props.selectWorkspace(workspaceId as string); + + return ( + <> + + + + + + ); +}; From b98f4b4eee736b103a3f98448865d6c9d340ef92 Mon Sep 17 00:00:00 2001 From: Filippo Ledda Date: Wed, 24 Feb 2021 14:30:44 +0100 Subject: [PATCH 022/321] Fix tls --- applications/nwb-explorer/Dockerfile | 2 +- deployment-configuration/values-template.yaml | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/applications/nwb-explorer/Dockerfile b/applications/nwb-explorer/Dockerfile index 08335c31..9668cc90 100644 --- a/applications/nwb-explorer/Dockerfile +++ b/applications/nwb-explorer/Dockerfile @@ -1,4 +1,4 @@ -FROM node:13.14 as jsbuild +FROM node:15 as jsbuild ENV REPO=https://github.com/MetaCell/nwb-explorer.git ENV BRANCH_TAG="development" ENV FOLDER=nwb-explorer diff --git a/deployment-configuration/values-template.yaml b/deployment-configuration/values-template.yaml index 9246057e..2614a1a3 100644 --- a/deployment-configuration/values-template.yaml +++ b/deployment-configuration/values-template.yaml @@ -1,2 +1,3 @@ domain: v2.opensourcebrain.org -mainapp: osb-portal \ No newline at end of file +mainapp: osb-portal +tls: true \ No newline at end of file From 684872b9f750a661103410f6a0b376ed0c13468e Mon Sep 17 00:00:00 2001 From: Filippo Ledda Date: Wed, 24 Feb 2021 15:10:28 +0100 Subject: [PATCH 023/321] Update gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 16b2995a..9b95c024 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,4 @@ cloud-harness /build .vscode skaffold.yaml +/deployment.yaml From 059dba7ea9785b17ae7b75aa84feb74da029717d Mon Sep 17 00:00:00 2001 From: Filippo Ledda Date: Thu, 25 Feb 2021 12:45:10 +0100 Subject: [PATCH 024/321] #94 show user workspaces when logged by default --- applications/osb-portal/package.json | 2 +- .../components/workspace/WorkspaceEditor.tsx | 11 +++-------- .../components/workspace/WorkspaceFrame.tsx | 2 +- .../src/components/workspace/Workspaces.tsx | 1 - .../workspace/drawer/WorkspaceInteractions.tsx | 2 +- applications/osb-portal/src/index.tsx | 2 +- .../src/store/reducers/workspaces.ts | 18 +++++++++++++++--- applications/osb-portal/webpack.common.js | 1 + 8 files changed, 23 insertions(+), 16 deletions(-) diff --git a/applications/osb-portal/package.json b/applications/osb-portal/package.json index 9121738d..baed6817 100644 --- a/applications/osb-portal/package.json +++ b/applications/osb-portal/package.json @@ -4,7 +4,7 @@ "description": "", "main": "index.js", "scripts": { - "start:dev": "webpack-dev-server --progress --config webpack.dev.js --env.DOMAIN=v2dev.opensourcebrain.org --env.NAMESPACE=osb2", + "start:dev": "webpack-dev-server --progress --config webpack.dev.js --env.DOMAIN=v2dev.opensourcebrain.org --env.NAMESPACE=osb2dev", "start:test": "webpack-dev-server --progress --config webpack.dev.js --env.DOMAIN=v2.opensourcebrain.org --env.NAMESPACE=osb2", "start:minikube": "webpack-dev-server --progress --config webpack.dev.js --env.DOMAIN=osb.local --env.NAMESPACE=osb2", "prebuild": "tslint -c tslint.json 'src/**/*.{ts,tsx}'", diff --git a/applications/osb-portal/src/components/workspace/WorkspaceEditor.tsx b/applications/osb-portal/src/components/workspace/WorkspaceEditor.tsx index fbcd2c31..75915421 100644 --- a/applications/osb-portal/src/components/workspace/WorkspaceEditor.tsx +++ b/applications/osb-portal/src/components/workspace/WorkspaceEditor.tsx @@ -45,7 +45,7 @@ async function readFile(file: Blob) { }) } -let thumbnail : Blob; +let thumbnail: Blob; export default (props: WorkspaceEditProps) => { @@ -54,10 +54,10 @@ export default (props: WorkspaceEditProps) => { >({ ...props.workspace }); const handleCreateWorkspace = async (publicable: boolean = false) => { - workspaceService.createWorkspace({...workspaceForm, publicable}).then( + workspaceService.createWorkspace({ ...workspaceForm, publicable }).then( async (workspace) => { if (thumbnail) { - const fileThumbnail : any = await readFile(thumbnail); + const fileThumbnail: any = await readFile(thumbnail); workspaceService.updateWorkspaceThumbnail(workspace.id, new Blob([fileThumbnail])).then(() => props.onLoadWorkspace(true)); } else { props.onLoadWorkspace(true) @@ -107,11 +107,6 @@ export default (props: WorkspaceEditProps) => { Create - - - diff --git a/applications/osb-portal/src/components/workspace/WorkspaceFrame.tsx b/applications/osb-portal/src/components/workspace/WorkspaceFrame.tsx index fae7272a..6020a499 100644 --- a/applications/osb-portal/src/components/workspace/WorkspaceFrame.tsx +++ b/applications/osb-portal/src/components/workspace/WorkspaceFrame.tsx @@ -39,7 +39,7 @@ export const WorkspaceFrame = (props: { user: UserInfo, workspace: Workspace, lo alert("Error open resource, ResourceOpen function failed!"); }); } else { - timerId = setTimeout(openResource, 3000, contentWindow, workspaceResource); + timerId = setTimeout(openResource, 15000, contentWindow, workspaceResource); } } diff --git a/applications/osb-portal/src/components/workspace/Workspaces.tsx b/applications/osb-portal/src/components/workspace/Workspaces.tsx index 6bbfeadd..50e78628 100644 --- a/applications/osb-portal/src/components/workspace/Workspaces.tsx +++ b/applications/osb-portal/src/components/workspace/Workspaces.tsx @@ -45,7 +45,6 @@ export const Workspaces = ({ publicWorkspaces, userWorkspaces, showPublicWorkspa textColor="primary" indicatorColor="primary" onChange={handleChange} - aria-label="disabled tabs example" > diff --git a/applications/osb-portal/src/components/workspace/drawer/WorkspaceInteractions.tsx b/applications/osb-portal/src/components/workspace/drawer/WorkspaceInteractions.tsx index c8f5d404..8622cdcb 100644 --- a/applications/osb-portal/src/components/workspace/drawer/WorkspaceInteractions.tsx +++ b/applications/osb-portal/src/components/workspace/drawer/WorkspaceInteractions.tsx @@ -91,7 +91,7 @@ export default (props: WorkspaceProps | any) => { } if (workspace.resources.find((resource: any) => resource.status === ResourceStatus.pending)) { - setTimeout(props.refreshWorkspace, 30000); + setTimeout(props.refreshWorkspace, 5000); } diff --git a/applications/osb-portal/src/index.tsx b/applications/osb-portal/src/index.tsx index e3c5022d..14d88ce7 100644 --- a/applications/osb-portal/src/index.tsx +++ b/applications/osb-portal/src/index.tsx @@ -38,7 +38,7 @@ const timeout = (ms: number, promise: Promise) => { -timeout(5000, initUser()).then((user: UserInfo) => { +timeout(10000, initUser()).then((user: UserInfo) => { if (user) { store.dispatch(userLogin(user)); } diff --git a/applications/osb-portal/src/store/reducers/workspaces.ts b/applications/osb-portal/src/store/reducers/workspaces.ts index 057cb4fe..e145020e 100644 --- a/applications/osb-portal/src/store/reducers/workspaces.ts +++ b/applications/osb-portal/src/store/reducers/workspaces.ts @@ -1,6 +1,7 @@ import { createSlice, PayloadAction, AnyAction, Action } from '@reduxjs/toolkit' import { Workspace } from '../../types/workspace'; +import * as UserActions from '../actions/user'; interface WorkspaceState { userWorkspaces: Workspace[], @@ -21,10 +22,10 @@ const workspaceSlice = createSlice({ name: 'workspaces', initialState, reducers: { - showPublicWorkspaces(state, action: Action){ + showPublicWorkspaces(state, action: Action) { return { ...state, showPublic: true }; }, - showUserWorkspaces(state, action: Action){ + showUserWorkspaces(state, action: Action) { return { ...state, showPublic: false }; }, loadPublicWorkspaces(state, action: PayloadAction) { @@ -48,6 +49,17 @@ const workspaceSlice = createSlice({ } }); + + export const WorkspaceActions = workspaceSlice.actions; -export default workspaceSlice.reducer; + +function reduceRest(state: WorkspaceState, action: Action) { + switch (action.type) { + + case UserActions.userLogin.type: + return { ...state, showPublic: false } + } +} + +export default (state: WorkspaceState, action: Action) => ({ ...workspaceSlice.reducer(state, action), ...reduceRest(state, action) }) \ No newline at end of file diff --git a/applications/osb-portal/webpack.common.js b/applications/osb-portal/webpack.common.js index 72800ff7..094d60e4 100644 --- a/applications/osb-portal/webpack.common.js +++ b/applications/osb-portal/webpack.common.js @@ -15,6 +15,7 @@ module.exports = env => { return { + devtool: 'eval-source-map', output: { path: path.resolve(__dirname, 'public'), filename: path.join('js', 'bundle.js') From 685ed76ce35f5ccc0348150e59392383bec2d3ca Mon Sep 17 00:00:00 2001 From: Filippo Ledda Date: Thu, 25 Feb 2021 12:45:40 +0100 Subject: [PATCH 025/321] #97 fix workspaces after refactoring --- applications/workspaces/server/run.py | 3 -- .../workspaces/server/workspaces/__main__.py | 20 ++++------- .../repository/base_model_repository.py | 13 ++++--- .../workspaces/repository/model_repository.py | 10 +++--- .../server/workspaces/service/events.py | 34 +++++++++++-------- .../workspaces/views/base_model_view.py | 4 +-- 6 files changed, 41 insertions(+), 43 deletions(-) delete mode 100644 applications/workspaces/server/run.py diff --git a/applications/workspaces/server/run.py b/applications/workspaces/server/run.py deleted file mode 100644 index c9d8342e..00000000 --- a/applications/workspaces/server/run.py +++ /dev/null @@ -1,3 +0,0 @@ -from workspaces.__main__ import connexion_app - -connexion_app.run(port=8080) \ No newline at end of file diff --git a/applications/workspaces/server/workspaces/__main__.py b/applications/workspaces/server/workspaces/__main__.py index 326772f0..e4363908 100644 --- a/applications/workspaces/server/workspaces/__main__.py +++ b/applications/workspaces/server/workspaces/__main__.py @@ -21,18 +21,6 @@ logger = cloudharness.log -def setup_logging(): - logger.setLevel(logging.INFO) - # app.logger.removeHandler(default_handler) - # app.logger.getLogger - # ch = logging.StreamHandler() - # ch.setLevel(Config.LOG_LEVEL) - default_handler.setFormatter(logging.Formatter( - '%(asctime)s - %(name)s - %(levelname)s - %(message)s')) - # logger.addHandler(ch) - logger.info("setting up logging, done.") - - def mkdirs(): Path(os.path.join(Config.STATIC_DIR, Config.WORKSPACES_DIR)).mkdir( parents=True, exist_ok=True) @@ -57,13 +45,16 @@ def init_app(app): try: setup_db(app) except Exception as e: - logger.error("Could not init database. Some application functionality won't be available.", exc_info=True) + log.error( + "Could not init database. Some application functionality won't be available.", exc_info=True) try: atexit.register(stop_kafka_consumers) start_kafka_consumers() except Exception as e: - logger.error("Could not start kafka consumers. Some application functionality won't be available.", exc_info=True) + log.error( + "Could not start kafka consumers. Some application functionality won't be available.", exc_info=True) + mkdirs() setup_static_router(app) @@ -73,4 +64,5 @@ def init_app(app): config=Config) if __name__ == '__main__': + cloudharness.set_debug() main() diff --git a/applications/workspaces/server/workspaces/repository/base_model_repository.py b/applications/workspaces/server/workspaces/repository/base_model_repository.py index 39cb2eda..eb3eb216 100644 --- a/applications/workspaces/server/workspaces/repository/base_model_repository.py +++ b/applications/workspaces/server/workspaces/repository/base_model_repository.py @@ -11,7 +11,7 @@ import logging from ..config import Config -logger = logging.getLogger(Config.APP_NAME) +from cloudharness import log as logger class BaseModelRepository: @@ -117,7 +117,8 @@ def _create_filter(self, field, comparator, value): q=name__like=My%Name (search all records where name matches %My%Name%) q=id__!=10 (id is not 10) """ - logger.info('Search for workspace filter: %s %s %s', field.key, comparator, value) + logger.debug('Search for workspace filter: %s %s %s', + field.key, comparator, value) if comparator == '==': return field == value elif comparator in ('!', 'not'): @@ -165,20 +166,22 @@ def search(self, page=1, per_page=20, q=None, *args, **kwargs): field_comparator, value = arg.strip().split('=') field_comparator = field_comparator.split('__') field = field_comparator[0] - if len(field_comparator)>1: + if len(field_comparator) > 1: comparator = field_comparator[1] else: comparator = '=' attr = getattr(self.model, field) if isinstance(attr.comparator.type, sqlalchemy.types.Boolean): value = value.upper() in ('TRUE', '1', 'T') - logger.info("Filter attr: %s comparator: %s value: %s", attr.key, comparator, value) + logger.debug("Filter attr: %s comparator: %s value: %s", + attr.key, comparator, value) filters.append((attr, comparator, value)) sqs = self._get_qs(filters) else: sqs = self._get_qs() objects = sqs.paginate(page, per_page, True) - total_objects = len(sqs.all()) # db.session.query(func.count(self.model.id)).scalar() + # db.session.query(func.count(self.model.id)).scalar() + total_objects = len(sqs.all()) for obj in objects.items: self._calculated_fields_populate(obj) total_pages = math.ceil(total_objects / per_page) diff --git a/applications/workspaces/server/workspaces/repository/model_repository.py b/applications/workspaces/server/workspaces/repository/model_repository.py index 8fa84dc4..da8f4d5a 100644 --- a/applications/workspaces/server/workspaces/repository/model_repository.py +++ b/applications/workspaces/server/workspaces/repository/model_repository.py @@ -1,9 +1,9 @@ -import logging - from flask import request, current_app from sqlalchemy import desc from sqlalchemy.sql import func +from cloudharness import log as logger + from ..config import Config from ..utils import get_keycloak_data @@ -13,7 +13,7 @@ WorkspaceImage, WorkspaceResource from ..service.kubernetes import create_persistent_volume_claim -logger = logging.getLogger(Config.APP_NAME) + class WorkspaceRepository(BaseModelRepository): @@ -28,7 +28,7 @@ def search_qs(self, filter=None): q_base = self.model.query if filter is not None: q_base = q_base.filter(*[self._create_filter(*f) for f in filter]) - logger.info(f"searching workspaces on keycloak_id: {self.keycloak_id}") + logger.debug(f"searching workspaces on keycloak_id: {self.keycloak_id}") if filter and any(field for field, condition, value in filter if field.key == 'publicable' and value): q1 = q_base elif self.keycloak_id != -1: @@ -50,7 +50,7 @@ def delete(self, id): workspace = self.model.query.filter_by(id=id).first() for resource in workspace.resources: - logger.info("deleting resource %s", resource.id) + logger.debug("deleting resource %s", resource.id) resource_repository.delete(resource.id) logger.info("deleting workspace %s", id) super().delete(id) diff --git a/applications/workspaces/server/workspaces/service/events.py b/applications/workspaces/server/workspaces/service/events.py index 8be488e0..334f0438 100644 --- a/applications/workspaces/server/workspaces/service/events.py +++ b/applications/workspaces/server/workspaces/service/events.py @@ -1,4 +1,4 @@ -import logging +from cloudharness import log from flask import current_app @@ -12,47 +12,53 @@ from .. import ResourceStatus -logger = logging.getLogger(Config.APP_NAME) - def _create_topic(name): client = EventClient(name) try: client.create_topic() except: - logger.info(f'Queue {name} already exists!') + log.info(f'Queue {name} already exists!') pass return client -def set_resource_state(app, message): - logger.info(f'Got message: {message}') + +def set_resource_state(event_client, app, message): + log.info(f'Got message: {message}') workspace_resource_id = message['payload'] with app.app_context(): status = message.get('status', OperationStatus.FAILED) workspaceResourceRepository = BaseModelRepository(WorkspaceResource) - workspace_resource, found = workspaceResourceRepository.get(id=workspace_resource_id) + workspace_resource, found = workspaceResourceRepository.get( + id=workspace_resource_id) if status == OperationStatus.SUCCEEDED: workspace_resource.status = ResourceStatus.SUCCESS # success else: workspace_resource.status = ResourceStatus.ERROR # error - logger.info('Going to update Workspace Resource') + log.info('Going to update Workspace Resource') workspaceResourceRepository.save(obj=workspace_resource) - logger.info(f'Updated WorkspaceResource status to {workspace_resource.status}') + log.info( + f'Updated WorkspaceResource status to {workspace_resource.status}') + _consumer_clients = [] _consumer_queues = ( - {'group':'workspaces', 'name': 'osb-download-file-queue', 'handler': set_resource_state}, + {'group': 'workspaces', 'name': 'osb-download-file-queue', + 'handler': set_resource_state}, ) + def start_kafka_consumers(): - logger.info('Starting Kafka consumer threads') + log.info('Starting Kafka consumer threads') for queue in _consumer_queues: client = _create_topic(queue['name']) - client.async_consume(app=current_app, group_id=queue['group'], handler=queue['handler']) + client.async_consume( + app=current_app, group_id=queue['group'], handler=queue['handler']) _consumer_clients.append(client) + def stop_kafka_consumers(): - logger.info('Stopping Kafka consumer threads') + log.info('Stopping Kafka consumer threads') for t in _consumer_clients: t.close() - logger.info(f'Stopped Kafka consumer thread: {t}') + log.info(f'Stopped Kafka consumer thread: {t}') diff --git a/applications/workspaces/server/workspaces/views/base_model_view.py b/applications/workspaces/server/workspaces/views/base_model_view.py index b883cde9..502ec73a 100644 --- a/applications/workspaces/server/workspaces/views/base_model_view.py +++ b/applications/workspaces/server/workspaces/views/base_model_view.py @@ -23,8 +23,8 @@ def search(self, page=1, per_page=20, *args, **kwargs): current page number of pages """ - logger.info("Search args %s", args) - logger.info("Search kwargs %s", kwargs) + logger.debug("Search args %s", args) + logger.debug("Search kwargs %s", kwargs) page, total_pages, objects = self.repository.search(page=page, per_page=per_page, *args, From 741816c08982f93fb1fa5e7d89cc7b12aa221025 Mon Sep 17 00:00:00 2001 From: Filippo Ledda Date: Thu, 25 Feb 2021 13:54:27 +0100 Subject: [PATCH 026/321] #97 add pod affinity to workspaces --- .../workspaces/deploy/templates/postgres.yaml | 43 ++++++++++++------- applications/workspaces/deploy/values.yaml | 21 +++++---- .../workspaces/deploy/workspacesx.yaml | 2 +- 3 files changed, 40 insertions(+), 26 deletions(-) diff --git a/applications/workspaces/deploy/templates/postgres.yaml b/applications/workspaces/deploy/templates/postgres.yaml index 67b3b234..0ca1ddd4 100644 --- a/applications/workspaces/deploy/templates/postgres.yaml +++ b/applications/workspaces/deploy/templates/postgres.yaml @@ -3,7 +3,7 @@ kind: PersistentVolumeClaim metadata: name: workspaces-db labels: - app: {{ .Values.apps.workspaces.postgres.name }} + app: {{ .Values.apps.workspaces.harness.database.name }} {{ include "deploy_utils.labels" $ | indent 4 }} spec: accessModes: @@ -15,51 +15,62 @@ spec: apiVersion: v1 kind: Service metadata: - name: {{ .Values.apps.workspaces.postgres.name }} + name: {{ .Values.apps.workspaces.harness.database.name }} labels: - app: {{ .Values.apps.workspaces.postgres.name }} + app: {{ .Values.apps.workspaces.harness.database.name }} {{ include "deploy_utils.labels" $ | indent 4 }} spec: type: ClusterIP ports: - port: 5432 selector: - app: {{ .Values.apps.workspaces.postgres.name }} + app: {{ .Values.apps.workspaces.harness.database.name }} --- apiVersion: apps/v1 kind: Deployment metadata: - name: {{ .Values.apps.workspaces.postgres.name }} + name: {{ .Values.apps.workspaces.harness.database.name }} labels: - app: {{ .Values.apps.workspaces.postgres.name }} + app: {{ .Values.apps.workspaces.harness.database.name }} {{ include "deploy_utils.labels" $ | indent 4 }} spec: replicas: 1 selector: matchLabels: - app: {{ .Values.apps.workspaces.postgres.name | quote }} + app: {{ .Values.apps.workspaces.harness.database.name | quote }} {{ include "deploy_utils.labels" $ | indent 6 }} template: metadata: labels: - app: {{ .Values.apps.workspaces.postgres.name }} + app: {{ .Values.apps.workspaces.harness.database.name }} + service: db {{ include "deploy_utils.labels" $ | indent 8 }} spec: + affinity: + podAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchExpressions: + - key: service + operator: In + values: + - db + topologyKey: kubernetes.io/hostname containers: - - name: {{ .Values.apps.workspaces.postgres.name | default "workspaces-postgress" | quote }} - image: {{ .Values.apps.workspaces.postgres.image | quote }} + - name: {{ .Values.apps.workspaces.harness.database.name | default "workspaces-postgress" | quote }} + image: {{ .Values.apps.workspaces.harness.database.image | quote }} imagePullPolicy: "IfNotPresent" env: - name: POSTGRES_DB - value: {{ .Values.apps.workspaces.postgres.initialdb | quote }} + value: {{ .Values.apps.workspaces.harness.database.initialdb | quote }} - name: POSTGRES_USER - value: {{ .Values.apps.workspaces.postgres.user | quote }} + value: {{ .Values.apps.workspaces.harness.database.user | quote }} - name: POSTGRES_PASSWORD - value: {{ .Values.apps.workspaces.postgres.password | quote }} + value: {{ .Values.apps.workspaces.harness.database.password | quote }} - name: PGDATA - value: {{ .Values.apps.workspaces.postgres.pgdata }} + value: {{ .Values.apps.workspaces.harness.database.pgdata }} ports: - - containerPort: {{ .Values.apps.workspaces.postgres.port }} + - containerPort: {{ .Values.apps.workspaces.harness.database.port }} resources: requests: memory: "128Mi" @@ -69,7 +80,7 @@ spec: cpu: "500m" volumeMounts: - name: workspaces-db - mountPath: {{ .Values.apps.workspaces.postgres.datavolume }} + mountPath: {{ .Values.apps.workspaces.harness.database.datavolume }} volumes: - name: workspaces-db persistentVolumeClaim: diff --git a/applications/workspaces/deploy/values.yaml b/applications/workspaces/deploy/values.yaml index 06417b87..feaa1184 100644 --- a/applications/workspaces/deploy/values.yaml +++ b/applications/workspaces/deploy/values.yaml @@ -23,12 +23,15 @@ harness: - common hard: - argo -postgres: - name: workspaces-postgres-host - port: 5432 - image: postgres:latest - initialdb: workspaces - user: workspace - password: secret - datavolume: /opt/data/ - pgdata: /opt/data/pgdata + database: + auto: false + name: workspaces-postgres-host + type: postgres + port: 5432 + image: postgres:latest + initialdb: workspaces + user: workspace + password: secret + datavolume: /opt/data/ + pgdata: /opt/data/pgdata + diff --git a/applications/workspaces/deploy/workspacesx.yaml b/applications/workspaces/deploy/workspacesx.yaml index 460e6dbf..6b47ba79 100644 --- a/applications/workspaces/deploy/workspacesx.yaml +++ b/applications/workspaces/deploy/workspacesx.yaml @@ -57,7 +57,7 @@ spec: resources: requests: memory: "128Mi" - cpu: "200m" + cpu: "50m" limits: memory: "256Mi" cpu: "500m" From 90767eaa63904e31a4c7eb48730916703a179e38 Mon Sep 17 00:00:00 2001 From: Filippo Ledda Date: Thu, 25 Feb 2021 15:19:27 +0100 Subject: [PATCH 027/321] #97 Fix workspace resource opening --- .../components/workspace/WorkspaceFrame.tsx | 4 +- .../drawer/WorkspaceInteractions.tsx | 2 +- .../drawer/WorkspaceResourceBrowser.tsx | 2 +- .../server/workspaces/controller/workspace.py | 49 +++++++++++-------- .../controller/workspace_resource.py | 7 +-- .../values-template-dev.yaml | 4 +- 6 files changed, 37 insertions(+), 31 deletions(-) diff --git a/applications/osb-portal/src/components/workspace/WorkspaceFrame.tsx b/applications/osb-portal/src/components/workspace/WorkspaceFrame.tsx index 6020a499..79239446 100644 --- a/applications/osb-portal/src/components/workspace/WorkspaceFrame.tsx +++ b/applications/osb-portal/src/components/workspace/WorkspaceFrame.tsx @@ -36,10 +36,10 @@ export const WorkspaceFrame = (props: { user: UserInfo, workspace: Workspace, lo const iFrame: HTMLIFrameElement = document.getElementById("workspace-frame") as HTMLIFrameElement; iFrame.contentWindow.postMessage(fileName, '*'); }).catch(() => { - alert("Error open resource, ResourceOpen function failed!"); + console.error("Error opening resource, ResourceOpen function failed!"); }); } else { - timerId = setTimeout(openResource, 15000, contentWindow, workspaceResource); + timerId = setTimeout(openResource, 5000, contentWindow, workspaceResource); } } diff --git a/applications/osb-portal/src/components/workspace/drawer/WorkspaceInteractions.tsx b/applications/osb-portal/src/components/workspace/drawer/WorkspaceInteractions.tsx index 8622cdcb..9f3af565 100644 --- a/applications/osb-portal/src/components/workspace/drawer/WorkspaceInteractions.tsx +++ b/applications/osb-portal/src/components/workspace/drawer/WorkspaceInteractions.tsx @@ -91,7 +91,7 @@ export default (props: WorkspaceProps | any) => { } if (workspace.resources.find((resource: any) => resource.status === ResourceStatus.pending)) { - setTimeout(props.refreshWorkspace, 5000); + setTimeout(props.refreshWorkspace, 15000); } diff --git a/applications/osb-portal/src/components/workspace/drawer/WorkspaceResourceBrowser.tsx b/applications/osb-portal/src/components/workspace/drawer/WorkspaceResourceBrowser.tsx index 6eaa4a94..94a74e0a 100644 --- a/applications/osb-portal/src/components/workspace/drawer/WorkspaceResourceBrowser.tsx +++ b/applications/osb-portal/src/components/workspace/drawer/WorkspaceResourceBrowser.tsx @@ -23,7 +23,7 @@ const openFileResource = (resource: WorkspaceResource, refreshWorkspace: any) => iFrame.contentWindow.postMessage(fileName, '*'); refreshWorkspace(); }).catch(() => { - alert("Error open resource, ResourceOpen function failed!"); + console.error("Error opening resource, ResourceOpen function failed!"); }); } diff --git a/applications/workspaces/server/workspaces/controller/workspace.py b/applications/workspaces/server/workspaces/controller/workspace.py index f0d5bd84..92b18e88 100644 --- a/applications/workspaces/server/workspaces/controller/workspace.py +++ b/applications/workspaces/server/workspaces/controller/workspace.py @@ -7,23 +7,26 @@ from ..repository.model_repository import WorkspaceRepository, WorkspaceImageRepository, db from ..repository.models import WorkspaceImage -def _save_image(id=None, image=None, filename_base=None): + +def _save_image(id_=None, image=None, filename_base=None): ext = mimetypes.guess_extension(image.mimetype) - folder = os.path.join(Config.WORKSPACES_DIR, f"{id}") - Path(os.path.join(Config.STATIC_DIR,folder)).mkdir(parents=True, exist_ok=True) + folder = os.path.join(Config.WORKSPACES_DIR, f"{id_}") + Path(os.path.join(Config.STATIC_DIR, folder)).mkdir( + parents=True, exist_ok=True) if filename_base is None: filename = image.filename else: filename = f"{filename_base}{ext}" filename = os.path.join(folder, filename) - image.save(os.path.join(Config.STATIC_DIR,filename)) + image.save(os.path.join(Config.STATIC_DIR, filename)) return filename -def setthumbnail(id=None, thumbNail=None, body=None, **kwargs): - workspace, found = WorkspaceRepository().get(id=id) + +def setthumbnail(id_=None, thumbNail=None, body=None, **kwargs): + workspace, found = WorkspaceRepository().get(id=id_) if not found: - return f"Workspace with id {id} not found.", 404 + return f"Workspace with id {id_} not found.", 404 if not thumbNail: return f"Thumbnail is not specified.", 404 # ext = mimetypes.guess_extension(thumbNail.mimetype) @@ -32,16 +35,18 @@ def setthumbnail(id=None, thumbNail=None, body=None, **kwargs): # filename = f"{folder}/thumbnail{ext}" # thumbNail.save(os.path.join(Config.STATIC_DIR,filename)) - saved_filename = _save_image(id=id, image=thumbNail, filename_base="thumbnail") + saved_filename = _save_image( + id=id_, image=thumbNail, filename_base="thumbnail") workspace.thumbnail = saved_filename db.session.add(workspace) - db.session.commit() + db.session.commit() return "Saved", 200 -def addimage(id=None, image=None, body=None, **kwargs): - workspace, found = WorkspaceRepository().get(id=id) + +def addimage(id_=None, image=None, body=None, **kwargs): + workspace, found = WorkspaceRepository().get(id=id_) if not found: - return f"Workspace with id {id} not found.", 404 + return f"Workspace with id {id_} not found.", 404 if not image: return f"Workspace Image is not specified.", 404 @@ -51,16 +56,17 @@ def addimage(id=None, image=None, body=None, **kwargs): # image.save(os.path.join(Config.STATIC_DIR, image.filename)) - saved_filename = _save_image(id=id, image=image) - workspace.gallery.append(WorkspaceImage(image = saved_filename)) + saved_filename = _save_image(id=id_, image=image) + workspace.gallery.append(WorkspaceImage(image=saved_filename)) db.session.add(workspace) - db.session.commit() + db.session.commit() return "Saved", 200 -def delimage(id=None, image_id=None, **kwargs): - workspace, found = WorkspaceRepository().get(id=id) + +def delimage(id_=None, image_id=None, **kwargs): + workspace, found = WorkspaceRepository().get(id=id_) if not found: - return f"Workspace with id {id} not found.", 404 + return f"Workspace with id {id_} not found.", 404 if not image_id: return f"Image Id is not specified.", 404 @@ -69,13 +75,14 @@ def delimage(id=None, image_id=None, **kwargs): if not found: return f"Workspace Image with id {image_id} not found.", 404 - if wsi.workspace_id != id: - return f"Workspace Image Id {image_id} doesn't belong to Workspace {id}.", 404 + if wsi.workspace_id != id_: + return f"Workspace Image Id {image_id} doesn't belong to Workspace {id_}.", 404 result = wsir.delete(id=image_id) try: filename = os.path.join(Config.STATIC_DIR, wsi.image) os.remove(filename) except Exception as e: - current_app.logger.info(f"Failed removing image {wsi.image} from filesystem.") + current_app.logger.info( + f"Failed removing image {wsi.image} from filesystem.") return result diff --git a/applications/workspaces/server/workspaces/controller/workspace_resource.py b/applications/workspaces/server/workspaces/controller/workspace_resource.py index 9e56d52c..487120e3 100644 --- a/applications/workspaces/server/workspaces/controller/workspace_resource.py +++ b/applications/workspaces/server/workspaces/controller/workspace_resource.py @@ -4,11 +4,12 @@ from ..repository.database import db from ..repository.models import WorkspaceResource -def open(id=None, **kwargs): + +def open(id_=None, **kwargs): # upate last open timestamp wsrr = WorkspaceResourceRepository() - workspace_resource, found = wsrr.get(id=id) + workspace_resource, found = wsrr.get(id=id_) if not found: - return f"WorkspaceResource with id {id} not found.", 404 + return f"WorkspaceResource with id {id_} not found.", 404 return wsrr.open(workspace_resource) diff --git a/deployment-configuration/values-template-dev.yaml b/deployment-configuration/values-template-dev.yaml index 8ac175f6..6b178e82 100644 --- a/deployment-configuration/values-template-dev.yaml +++ b/deployment-configuration/values-template-dev.yaml @@ -1,4 +1,2 @@ backup: - active: true - schedule: "*/1 * * * *" -mainapp: osb-portal \ No newline at end of file + active: false \ No newline at end of file From ee7e96f90f11ade600fa34353925aa9ffce9e512 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 25 Feb 2021 14:42:44 +0000 Subject: [PATCH 028/321] chore(deps): bump cryptography Bumps [cryptography](https://github.com/pyca/cryptography) from 2.9.2 to 3.3.2. - [Release notes](https://github.com/pyca/cryptography/releases) - [Changelog](https://github.com/pyca/cryptography/blob/main/CHANGELOG.rst) - [Commits](https://github.com/pyca/cryptography/compare/2.9.2...3.3.2) Signed-off-by: dependabot[bot] --- .../workspaces/server/requirements/requirements-base.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/applications/workspaces/server/requirements/requirements-base.txt b/applications/workspaces/server/requirements/requirements-base.txt index a6249fd2..5dd200cb 100644 --- a/applications/workspaces/server/requirements/requirements-base.txt +++ b/applications/workspaces/server/requirements/requirements-base.txt @@ -1,5 +1,5 @@ connexion == 2.6.0 -cryptography==2.9.2 +cryptography==3.3.2 Flask==1.1.2 Flask-Cors==3.0.8 flask-oidc==1.4.0 From ce08705767f476f108e07e2603a33e20e30d96fb Mon Sep 17 00:00:00 2001 From: Filippo Ledda Date: Mon, 1 Mar 2021 11:22:51 +0100 Subject: [PATCH 029/321] #104 go back from login/registration clicking on logo --- ...ocker-compose.yaml => docker-compose.yaml} | 0 .../custom/login/resources/css/login.css | 1 + .../accounts/themes/custom/login/template.ftl | 11 +++++ deployment/codefresh-dev.yaml | 44 ------------------- deployment/codefresh-prod.yaml | 18 -------- 5 files changed, 12 insertions(+), 62 deletions(-) rename applications/accounts/{Docker-compose.yaml => docker-compose.yaml} (100%) diff --git a/applications/accounts/Docker-compose.yaml b/applications/accounts/docker-compose.yaml similarity index 100% rename from applications/accounts/Docker-compose.yaml rename to applications/accounts/docker-compose.yaml diff --git a/applications/accounts/themes/custom/login/resources/css/login.css b/applications/accounts/themes/custom/login/resources/css/login.css index b67fb097..533d1422 100644 --- a/applications/accounts/themes/custom/login/resources/css/login.css +++ b/applications/accounts/themes/custom/login/resources/css/login.css @@ -26,6 +26,7 @@ body { position: absolute; right: 0; top: 20px; + cursor: pointer; } .login-pf-header { diff --git a/applications/accounts/themes/custom/login/template.ftl b/applications/accounts/themes/custom/login/template.ftl index c6cf2056..7928dfa4 100644 --- a/applications/accounts/themes/custom/login/template.ftl +++ b/applications/accounts/themes/custom/login/template.ftl @@ -34,6 +34,7 @@ + @@ -147,6 +148,16 @@
+ diff --git a/deployment/codefresh-dev.yaml b/deployment/codefresh-dev.yaml index b6db6df9..6c18ac17 100644 --- a/deployment/codefresh-dev.yaml +++ b/deployment/codefresh-dev.yaml @@ -182,34 +182,6 @@ steps: image_name: common title: Common working_directory: ./build/applications/common/server - netpyne: - type: build - stage: build - tag: '${{CF_BUILD_ID}}' - dockerfile: Dockerfile - registry: '${{CODEFRESH_REGISTRY}}' - build_arguments: - - REGISTRY=${{REGISTRY}}/ - - TAG=${{CF_BUILD_ID}} - - NAMESPACE=${{NAMESPACE}} - - DOMAIN=${{DOMAIN}} - image_name: netpyne - title: Netpyne - working_directory: ./build/applications/netpyne - nwb-explorer: - type: build - stage: build - tag: '${{CF_BUILD_ID}}' - dockerfile: Dockerfile - registry: '${{CODEFRESH_REGISTRY}}' - build_arguments: - - REGISTRY=${{REGISTRY}}/ - - TAG=${{CF_BUILD_ID}} - - NAMESPACE=${{NAMESPACE}} - - DOMAIN=${{DOMAIN}} - image_name: nwb-explorer - title: Nwb explorer - working_directory: ./build/applications/nwb-explorer jupyterhub: type: build stage: build @@ -426,22 +398,6 @@ steps: tags: - '${{DEPLOYMENT_PUBLISH_TAG}}' registry: '${{REGISTRY_PUBLISH_URL}}' - publish_netpyne: - stage: publish - type: push - title: Netpyne - candidate: '${{REGISTRY}}/netpyne:${{CF_BUILD_ID}}' - tags: - - '${{DEPLOYMENT_PUBLISH_TAG}}' - registry: '${{REGISTRY_PUBLISH_URL}}' - publish_nwb-explorer: - stage: publish - type: push - title: Nwb explorer - candidate: '${{REGISTRY}}/nwb-explorer:${{CF_BUILD_ID}}' - tags: - - '${{DEPLOYMENT_PUBLISH_TAG}}' - registry: '${{REGISTRY_PUBLISH_URL}}' publish_jupyterhub: stage: publish type: push diff --git a/deployment/codefresh-prod.yaml b/deployment/codefresh-prod.yaml index bae9b398..ce03cd0d 100644 --- a/deployment/codefresh-prod.yaml +++ b/deployment/codefresh-prod.yaml @@ -148,24 +148,6 @@ steps: - '${{DEPLOYMENT_PUBLISH_TAG}}' - latest registry: '${{REGISTRY_PUBLISH_URL}}' - publish_netpyne: - stage: publish - type: push - title: Netpyne - candidate: '${{REGISTRY}}/netpyne:${{DEPLOYMENT_TAG}}' - tags: - - '${{DEPLOYMENT_PUBLISH_TAG}}' - - latest - registry: '${{REGISTRY_PUBLISH_URL}}' - publish_nwb-explorer: - stage: publish - type: push - title: Nwb explorer - candidate: '${{REGISTRY}}/nwb-explorer:${{DEPLOYMENT_TAG}}' - tags: - - '${{DEPLOYMENT_PUBLISH_TAG}}' - - latest - registry: '${{REGISTRY_PUBLISH_URL}}' publish_jupyterhub: stage: publish type: push From bd91710248fc1da340b62b6ba624d759cae3836d Mon Sep 17 00:00:00 2001 From: Filippo Ledda Date: Mon, 1 Mar 2021 11:41:33 +0100 Subject: [PATCH 030/321] #101 Fix lose focus on input --- .../osb-portal/src/components/workspace/AddResourceForm.tsx | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/applications/osb-portal/src/components/workspace/AddResourceForm.tsx b/applications/osb-portal/src/components/workspace/AddResourceForm.tsx index 0dd66881..855983b0 100644 --- a/applications/osb-portal/src/components/workspace/AddResourceForm.tsx +++ b/applications/osb-portal/src/components/workspace/AddResourceForm.tsx @@ -25,7 +25,10 @@ export default (props: WorkspaceEditProps) => { const handleSetUrl = (e: any) => { setUrl(e.target.value); + setName(urlToName(e.target.value)); + + } const handleSetName = (e: any) => setName(e.target.value); @@ -39,6 +42,7 @@ export default (props: WorkspaceEditProps) => { { Date: Mon, 1 Mar 2021 12:00:26 +0100 Subject: [PATCH 031/321] #104 Add resource validation --- .../components/workspace/AddResourceForm.tsx | 44 ++++++++++++++++--- 1 file changed, 38 insertions(+), 6 deletions(-) diff --git a/applications/osb-portal/src/components/workspace/AddResourceForm.tsx b/applications/osb-portal/src/components/workspace/AddResourceForm.tsx index 855983b0..90aa3d53 100644 --- a/applications/osb-portal/src/components/workspace/AddResourceForm.tsx +++ b/applications/osb-portal/src/components/workspace/AddResourceForm.tsx @@ -7,12 +7,24 @@ import Grid from "@material-ui/core/Grid"; import workspaceResourceService, { urlToName } from '../../service/WorkspaceResourceService' import { Workspace } from '../../types/workspace'; +import { ForumTwoTone } from "@material-ui/icons"; interface WorkspaceEditProps { workspace: Workspace; onResourceAdded: () => void; } +function isValidHttpUrl(s: string) { + let url; + + try { + url = new URL(s); + } catch (_) { + return false; + } + + return url.protocol === "http:" || url.protocol === "https:"; +} export default (props: WorkspaceEditProps) => { @@ -23,18 +35,34 @@ export default (props: WorkspaceEditProps) => { const [name, setName] = React.useState(null); + const [nameError, setNameError] = React.useState(null); + + const [urlError, setUrlError] = React.useState(null); + const handleSetUrl = (e: any) => { setUrl(e.target.value); - setName(urlToName(e.target.value)); - - } const handleSetName = (e: any) => setName(e.target.value); const handleAddResource = () => { - workspaceResourceService.addResource(workspace, url, name).then(onResourceAdded, () => alert('An error occurred while adding the resource')); + let error = false; + for (const resource of workspace.resources) { + if (resource.name === name) { + error = true; + setNameError("A resource already exists with this name"); + break; + } + } + if (!isValidHttpUrl(url)) { + error = true; + setUrlError("Insert a valid public http url") + } + if (!error) { + workspaceResourceService.addResource(workspace, url, name).then(onResourceAdded, () => alert('An error occurred while adding the resource')); + } + } return ( @@ -42,8 +70,10 @@ export default (props: WorkspaceEditProps) => { { Date: Mon, 1 Mar 2021 17:03:53 +0100 Subject: [PATCH 032/321] #104 Fix workspace image error --- applications/osb-portal/package.json | 2 +- .../workspace/NewWorkspaceToolBox.tsx | 72 ++++++++++--------- .../components/workspace/WorkspaceEditor.tsx | 3 +- .../osb-portal/src/service/UserService.tsx | 27 +++---- applications/osb-portal/src/theme.js | 62 ++++++++-------- applications/workspaces/api/openapi.yaml | 2 +- .../workspaces/server/workspaces/__main__.py | 35 ++++----- .../server/workspaces/controller/workspace.py | 6 +- .../server/workspaces/openapi/openapi.yaml | 2 +- .../workspaces/repository/model_repository.py | 30 +++++--- .../workspaces/server/workspaces/utils.py | 19 +++-- 11 files changed, 140 insertions(+), 120 deletions(-) diff --git a/applications/osb-portal/package.json b/applications/osb-portal/package.json index baed6817..52b9c289 100644 --- a/applications/osb-portal/package.json +++ b/applications/osb-portal/package.json @@ -6,7 +6,7 @@ "scripts": { "start:dev": "webpack-dev-server --progress --config webpack.dev.js --env.DOMAIN=v2dev.opensourcebrain.org --env.NAMESPACE=osb2dev", "start:test": "webpack-dev-server --progress --config webpack.dev.js --env.DOMAIN=v2.opensourcebrain.org --env.NAMESPACE=osb2", - "start:minikube": "webpack-dev-server --progress --config webpack.dev.js --env.DOMAIN=osb.local --env.NAMESPACE=osb2", + "start:minikube": "webpack-dev-server --progress --config webpack.dev.js --env.DOMAIN=osb.local --env.NAMESPACE=osblocal", "prebuild": "tslint -c tslint.json 'src/**/*.{ts,tsx}'", "build": "webpack --mode=production --config webpack.prod.js --devtool source-map --env.DOMAIN=$DOMAIN --env.NAMESPACE=$NAMESPACE", "prebuild-dev": "tslint --fix -c tslint.json 'src/**/*.{ts,tsx}'", diff --git a/applications/osb-portal/src/components/workspace/NewWorkspaceToolBox.tsx b/applications/osb-portal/src/components/workspace/NewWorkspaceToolBox.tsx index af05379a..cd982590 100644 --- a/applications/osb-portal/src/components/workspace/NewWorkspaceToolBox.tsx +++ b/applications/osb-portal/src/components/workspace/NewWorkspaceToolBox.tsx @@ -63,41 +63,43 @@ export const WorkspaceToolBox = (props: any) => { - - - - - - - - - - - + + + + + + + + + + + + + diff --git a/applications/osb-portal/src/components/workspace/WorkspaceEditor.tsx b/applications/osb-portal/src/components/workspace/WorkspaceEditor.tsx index 75915421..f949dac8 100644 --- a/applications/osb-portal/src/components/workspace/WorkspaceEditor.tsx +++ b/applications/osb-portal/src/components/workspace/WorkspaceEditor.tsx @@ -58,13 +58,12 @@ export default (props: WorkspaceEditProps) => { async (workspace) => { if (thumbnail) { const fileThumbnail: any = await readFile(thumbnail); - workspaceService.updateWorkspaceThumbnail(workspace.id, new Blob([fileThumbnail])).then(() => props.onLoadWorkspace(true)); + workspaceService.updateWorkspaceThumbnail(workspace.id, new Blob([fileThumbnail])).then(() => props.onLoadWorkspace(true), e => console.error('Error uploading thumbnail')); } else { props.onLoadWorkspace(true) } } ); - props.onLoadWorkspace(false) }; diff --git a/applications/osb-portal/src/service/UserService.tsx b/applications/osb-portal/src/service/UserService.tsx index 9f44eda2..f3e5bf79 100644 --- a/applications/osb-portal/src/service/UserService.tsx +++ b/applications/osb-portal/src/service/UserService.tsx @@ -6,18 +6,7 @@ import { UserInfo } from '../types/user'; const keycloak = Keycloak('/keycloak.json'); -// set token refresh to 5 minutes -keycloak.onTokenExpired = () => { - keycloak.updateToken(300).then((refreshed) => { - if (refreshed) { - initApis(keycloak.token); - } else { - console.error('not refreshed ' + new Date()); - } - }).catch(() => { - console.error('Failed to refresh token ' + new Date()); - }) -} + declare const window: any; @@ -54,7 +43,19 @@ export async function initUser(): Promise { errorCallback(err); return null; } - + // set token refresh to 5 minutes + keycloak.onTokenExpired = () => { + keycloak.updateToken(3).then((refreshed) => { + if (refreshed) { + initApis(keycloak.token); + } else { + console.error('not refreshed ' + new Date()); + } + }).catch(() => { + console.error('Failed to refresh token ' + new Date()); + }) + } + keycloak.updateToken(-1); // activate refresh token return user; } diff --git a/applications/osb-portal/src/theme.js b/applications/osb-portal/src/theme.js index b208776c..e040e718 100644 --- a/applications/osb-portal/src/theme.js +++ b/applications/osb-portal/src/theme.js @@ -17,7 +17,7 @@ export const { const theme = { darkMode: true, - spacing: [0, gutter / 2, gutter * 2 / 3, gutter, 30, 40, 50, 100, 150, 200], + spacing: [0, gutter / 2, gutter * 2 / 3, gutter, 30, 40, 50, 100, 150, 200, 300], typography: { useNextVariants: true, htmlFontSize: 12, @@ -31,12 +31,12 @@ const theme = { palette: { type: 'dark', primary: { - main: primaryColor, + main: primaryColor, dark: secondaryColor }, - secondary: { - main: secondaryColor, - dark: primaryColor + secondary: { + main: secondaryColor, + dark: primaryColor }, background: { default: bgDarker, @@ -50,7 +50,7 @@ const theme = { fontWeight: 400, flex: 1 }, - + h2: { fontSize: '1.5rem', fontWeight: 400, @@ -90,25 +90,25 @@ const theme = { overrides: { MuiInput: { input: { - outline: 'none !important', - border: 'none !important', + outline: 'none !important', + border: 'none !important', boxShadow: 'none !important', }, - root:{ color: fontColor } + root: { color: fontColor } }, MuiSelect: { root: { - outline: 'none !important', - border: 'none !important', + outline: 'none !important', + border: 'none !important', boxShadow: 'none !important' }, - select: { "&:focus" :{ background: "none" } }, + select: { "&:focus": { background: "none" } }, }, MuiGrid: { - root: { - display: 'flex' - } + root: { + display: 'flex' + } }, MuiCard: { root: { flex: 1 } }, MuiBottomNavigation: { root: { backgroundColor: bgRegular, marginBottom: 8, borderRadius: 4 } }, @@ -120,16 +120,16 @@ const theme = { borderRadius: '5px' }, }, - MuiBottomNavigationAction: { + MuiBottomNavigationAction: { root: { color: fontColor, textTransform: 'uppercase' }, label: { fontSize: "0.65rem", "&.Mui-selected": { fontSize: "0.65rem" } }, }, MuiFormControl: { root: { overflow: 'visible' } }, - MuiFab:{ + MuiFab: { }, - MuiButton: { + MuiButton: { root: { - + }, outlined: { borderWidth: 2, @@ -143,40 +143,42 @@ const theme = { padding: gutter / 2 } }, - MuiMenuItem: { - root:{ + MuiMenuItem: { + root: { fontSize: '1em', - paddingTop: gutter / 2, + paddingTop: gutter / 2, }, gutters: { paddingLeft: gutter * 2, paddingRight: gutter * 2 } - + }, MuiDialogTitle: { root: { fontWeight: 600, fontSize: '1rem' } }, - MuiDialogContent: { root: { paddingBottom: gutter} }, - MuiCollapse: { + MuiDialogContent: { root: { paddingBottom: gutter } }, + MuiCollapse: { container: { padding: 0 }, wrapper: { padding: "0px!important" } }, MuiIcon: { fontSizeLarge: { fontSize: '1.75rem' } }, - MuiExpansionPanelSummary: { - root: { padding: '0px!important', margin: 0, minHeight: 'unset!important', display: "flex", - flexDirection: "row-reverse" }, + MuiExpansionPanelSummary: { + root: { + padding: '0px!important', margin: 0, minHeight: 'unset!important', display: "flex", + flexDirection: "row-reverse" + }, content: { margin: '0px!important', cursor: 'auto' }, expandIcon: { marginRight: 0 } }, MuiExpansionPanelDetails: { root: { padding: 0, margin: 0, minHeight: 'unset!important', flexDirection: 'column' } }, MuiExpansionPanel: { root: { padding: 0, margin: '0px!important', minHeight: 'unset' } }, MuiAutocomplete: { popupIndicator: { marginRight: 0 } }, - MuiCardContent: { + MuiCardContent: { root: { '&:last-child': { paddingBottom: 16 } } - }, + }, MuiTabs: { root: { minHeight: '20px', diff --git a/applications/workspaces/api/openapi.yaml b/applications/workspaces/api/openapi.yaml index 96d2bcfe..be7407ba 100644 --- a/applications/workspaces/api/openapi.yaml +++ b/applications/workspaces/api/openapi.yaml @@ -805,7 +805,7 @@ components: type: http scheme: bearer bearerFormat: JWT - x-bearerInfoFunc: workspaces.utils._decode_token + x-bearerInfoFunc: cloudharness.auth.AuthClient.decode_token schemas: Valid: type: object diff --git a/applications/workspaces/server/workspaces/__main__.py b/applications/workspaces/server/workspaces/__main__.py index e4363908..9a8e0549 100644 --- a/applications/workspaces/server/workspaces/__main__.py +++ b/applications/workspaces/server/workspaces/__main__.py @@ -20,6 +20,7 @@ logger = cloudharness.log +skip_dependencies = os.getenv('WORKFLOWS_SKIP_DEPENDENCIES', False) def mkdirs(): Path(os.path.join(Config.STATIC_DIR, Config.WORKSPACES_DIR)).mkdir( @@ -39,26 +40,28 @@ def setup_static_router(app): def init_app(app): cors = CORS(app, resources={r"/api/*": {"origins": "*"}}) - if app.config['ENV'] != 'development': - cloudharness.init(Config.APP_NAME) - - try: - setup_db(app) - except Exception as e: - log.error( - "Could not init database. Some application functionality won't be available.", exc_info=True) - - try: - atexit.register(stop_kafka_consumers) - start_kafka_consumers() - except Exception as e: - log.error( - "Could not start kafka consumers. Some application functionality won't be available.", exc_info=True) + + + if not skip_dependencies: + if app.config['ENV'] != 'development': + cloudharness.init(Config.APP_NAME) + try: + setup_db(app) + except Exception as e: + logger.error( + "Could not init database. Some application functionality won't be available.", exc_info=True) + + try: + atexit.register(stop_kafka_consumers) + start_kafka_consumers() + except Exception as e: + log.error( + "Could not start kafka consumers. Some application functionality won't be available.", exc_info=True) mkdirs() setup_static_router(app) -app = init_flask(title="Workspace Manager API", webapp=True, init_app_fn=init_app, +app = init_flask(title="Workspace Manager API", webapp=False, init_app_fn=init_app, resolver=connexion.resolver.MethodViewResolver( 'workspaces.views.api'), config=Config) diff --git a/applications/workspaces/server/workspaces/controller/workspace.py b/applications/workspaces/server/workspaces/controller/workspace.py index 92b18e88..4baa0d5d 100644 --- a/applications/workspaces/server/workspaces/controller/workspace.py +++ b/applications/workspaces/server/workspaces/controller/workspace.py @@ -23,11 +23,11 @@ def _save_image(id_=None, image=None, filename_base=None): return filename -def setthumbnail(id_=None, thumbNail=None, body=None, **kwargs): +def setthumbnail(id_=None, thumb_nail=None, body=None, **kwargs): workspace, found = WorkspaceRepository().get(id=id_) if not found: return f"Workspace with id {id_} not found.", 404 - if not thumbNail: + if not thumb_nail: return f"Thumbnail is not specified.", 404 # ext = mimetypes.guess_extension(thumbNail.mimetype) # folder = os.path.join(Config.WORKSPACES_DIR, f"{id}") @@ -36,7 +36,7 @@ def setthumbnail(id_=None, thumbNail=None, body=None, **kwargs): # filename = f"{folder}/thumbnail{ext}" # thumbNail.save(os.path.join(Config.STATIC_DIR,filename)) saved_filename = _save_image( - id=id_, image=thumbNail, filename_base="thumbnail") + id_=id_, image=thumb_nail, filename_base="thumbnail") workspace.thumbnail = saved_filename db.session.add(workspace) db.session.commit() diff --git a/applications/workspaces/server/workspaces/openapi/openapi.yaml b/applications/workspaces/server/workspaces/openapi/openapi.yaml index 762d040f..b345bbff 100644 --- a/applications/workspaces/server/workspaces/openapi/openapi.yaml +++ b/applications/workspaces/server/workspaces/openapi/openapi.yaml @@ -801,7 +801,7 @@ components: type: http scheme: bearer bearerFormat: JWT - x-bearerInfoFunc: workspaces.utils._decode_token + x-bearerInfoFunc: cloudharness.auth.AuthClient.decode_token schemas: Valid: type: object diff --git a/applications/workspaces/server/workspaces/repository/model_repository.py b/applications/workspaces/server/workspaces/repository/model_repository.py index da8f4d5a..70b4767a 100644 --- a/applications/workspaces/server/workspaces/repository/model_repository.py +++ b/applications/workspaces/server/workspaces/repository/model_repository.py @@ -14,8 +14,6 @@ from ..service.kubernetes import create_persistent_volume_claim - - class WorkspaceRepository(BaseModelRepository): model = Workspace defaults = {} @@ -28,8 +26,9 @@ def search_qs(self, filter=None): q_base = self.model.query if filter is not None: q_base = q_base.filter(*[self._create_filter(*f) for f in filter]) - logger.debug(f"searching workspaces on keycloak_id: {self.keycloak_id}") - if filter and any(field for field, condition, value in filter if field.key == 'publicable' and value): + logger.debug( + f"searching workspaces on keycloak_id: {self.keycloak_id}") + if filter and any(field for field, condition, value in filter if field.key == 'publicable' and value): q1 = q_base elif self.keycloak_id != -1: owner = User.query.filter_by(keycloak_id=self.keycloak_id).first() @@ -39,7 +38,8 @@ def search_qs(self, filter=None): # logged in but not known as owner so return no workspaces owner_id = 0 q1 = q_base.filter_by(keycloakuser_id=owner_id) - q1 = q1.union(q_base.filter(Workspace.collaborators.any(keycloak_id=self.keycloak_id))) + q1 = q1.union(q_base.filter( + Workspace.collaborators.any(keycloak_id=self.keycloak_id))) q1 = q1.union(q_base.filter_by(publicable=True)) else: q1 = q_base.filter_by(publicable=True) @@ -83,7 +83,8 @@ def pre_commit(self, workspace): def post_commit(self, workspace): # Create a new Persistent Volume Claim for this workspace logger.debug(f'Post Commit for workspace id: {workspace.id}') - create_persistent_volume_claim(name=self.get_pvc_name(workspace), size='2Gi', logger=logger) + create_persistent_volume_claim(name=self.get_pvc_name( + workspace), size='2Gi', logger=logger) wsrr = WorkspaceResourceRepository() for workspace_resource in workspace.resources: wsr = wsrr.post_commit(workspace_resource) @@ -117,9 +118,11 @@ class WorkspaceResourceRepository(BaseModelRepository): def pre_commit(self, workspace_resource): # Check if we can determine the resource type - logger.debug(f'Pre Commit for workspace resource id: {workspace_resource.id}') + logger.debug( + f'Pre Commit for workspace resource id: {workspace_resource.id}') if workspace_resource.location[-3:] == "nwb": - logger.debug(f'Pre Commit for workspace resource id: {workspace_resource.id} setting type to e') + logger.debug( + f'Pre Commit for workspace resource id: {workspace_resource.id} setting type to e') workspace_resource.resource_type = "e" if workspace_resource.folder is None or len(workspace_resource.folder) == 0: workspace_resource.folder = workspace_resource.name @@ -127,13 +130,18 @@ def pre_commit(self, workspace_resource): def post_commit(self, workspace_resource): # Create a load WorkspaceResource workflow task - logger.debug(f'Post Commit for workspace resource id: {workspace_resource.id}') + logger.debug( + f'Post Commit for workspace resource id: {workspace_resource.id}') workspace, found = WorkspaceRepository().get(id=workspace_resource.workspace_id) if workspace_resource.folder is None or len(workspace_resource.folder) == 0: workspace_resource.folder = workspace_resource.name if found: - from ..service.workflow import create_operation - create_operation(workspace, workspace_resource) + try: + from ..service.workflow import create_operation + create_operation(workspace, workspace_resource) + except Exception as e: + logger.error( + "An error occurred while adding the default resource to the workspace", exc_info=True) return workspace_resource def post_get(self, workspace_resource): diff --git a/applications/workspaces/server/workspaces/utils.py b/applications/workspaces/server/workspaces/utils.py index e63e6708..e795c6f6 100644 --- a/applications/workspaces/server/workspaces/utils.py +++ b/applications/workspaces/server/workspaces/utils.py @@ -3,21 +3,24 @@ import sys import json import requests -from cloudharness.utils import env -from flask import request, current_app +from flask import request from typing import List from urllib.parse import urljoin +from cloudharness import log +from cloudharness.utils import env +from cloudharness.auth import AuthClient + def get_keycloak_data(): bearer = request.headers.get('Authorization', None) - current_app.logger.debug(f'Bearer: {bearer}') + log.debug(f'Bearer: {bearer}') if not bearer or bearer == 'Bearer undefined': decoded_token = None keycloak_id = -1 # No authorization --> no user --> only publicable workspaces else: token = bearer.split(' ')[1] - decoded_token = _decode_token(token) + decoded_token = AuthClient.decode_token(token) keycloak_id = decoded_token['sub'] return keycloak_id, decoded_token @@ -42,9 +45,11 @@ def _decode_token(token): AUTH_PUBLIC_KEY_URL = f'{SCHEMA}{BASE_PATH}' current_app.logger.debug(f'auth pub key url: {AUTH_PUBLIC_KEY_URL}') - KEY = json.loads(requests.get(AUTH_PUBLIC_KEY_URL, verify=False).text)['public_key'] - KEY = b"-----BEGIN PUBLIC KEY-----\n" + str.encode(KEY) + b"\n-----END PUBLIC KEY-----" + KEY = json.loads(requests.get(AUTH_PUBLIC_KEY_URL, + verify=False).text)['public_key'] + KEY = b"-----BEGIN PUBLIC KEY-----\n" + \ + str.encode(KEY) + b"\n-----END PUBLIC KEY-----" decoded = jwt.decode(token, KEY, algorithms='RS256', audience='account') - return decoded \ No newline at end of file + return decoded From 34c2fcd828ffaf07f49b9c12275ac644afd1b2b8 Mon Sep 17 00:00:00 2001 From: Filippo Ledda Date: Mon, 1 Mar 2021 17:36:59 +0100 Subject: [PATCH 033/321] #104 Improve thumbnail --- .../components/workspace/WorkspaceEditor.tsx | 33 +++++++++++++++---- 1 file changed, 26 insertions(+), 7 deletions(-) diff --git a/applications/osb-portal/src/components/workspace/WorkspaceEditor.tsx b/applications/osb-portal/src/components/workspace/WorkspaceEditor.tsx index f949dac8..c32e780c 100644 --- a/applications/osb-portal/src/components/workspace/WorkspaceEditor.tsx +++ b/applications/osb-portal/src/components/workspace/WorkspaceEditor.tsx @@ -45,6 +45,9 @@ async function readFile(file: Blob) { }) } + + + let thumbnail: Blob; export default (props: WorkspaceEditProps) => { @@ -53,6 +56,9 @@ export default (props: WorkspaceEditProps) => { Workspace >({ ...props.workspace }); + + const [thumbnailPreview, setThumbnailPreview] = React.useState(null); + const handleCreateWorkspace = async (publicable: boolean = false) => { workspaceService.createWorkspace({ ...workspaceForm, publicable }).then( async (workspace) => { @@ -65,7 +71,21 @@ export default (props: WorkspaceEditProps) => { } ); - }; + } + + + + const previewFile = (file: Blob) => { + + const fileReader: FileReader = new FileReader(); + + fileReader.onload = () => { + setThumbnailPreview(fileReader.result); + }; + + fileReader.readAsDataURL(file); + + } const setNameField = (e: any) => setWorkspaceForm({ ...workspaceForm, name: e.target.value }); @@ -73,6 +93,7 @@ export default (props: WorkspaceEditProps) => { setWorkspaceForm({ ...workspaceForm, description: e.target.value }); const setThumbnail = (uploadedThumbnail: any) => { thumbnail = uploadedThumbnail; + previewFile(thumbnail); } return ( <> @@ -110,10 +131,10 @@ export default (props: WorkspaceEditProps) => { - + { setThumbnail(acceptedFiles[0]) }}> {({ getRootProps, getInputProps, acceptedFiles }: { getRootProps: (p: any) => any, getInputProps: () => any, acceptedFiles: any[] }) => ( -
+
@@ -130,15 +151,13 @@ export default (props: WorkspaceEditProps) => { } - + {acceptedFiles.length === 0 ? "Upload workspace preview image" : - Thumbnail File Uploaded:
- {acceptedFiles[0].name} -
+ null }
From 69f5fb268d70c7c6aa2a6ae29970dc022f410197 Mon Sep 17 00:00:00 2001 From: Filippo Ledda Date: Mon, 1 Mar 2021 17:47:44 +0100 Subject: [PATCH 034/321] #104 Improve workspace submit --- .../components/workspace/WorkspaceEditor.tsx | 27 ++++++++++++++++--- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/applications/osb-portal/src/components/workspace/WorkspaceEditor.tsx b/applications/osb-portal/src/components/workspace/WorkspaceEditor.tsx index c32e780c..50a487d2 100644 --- a/applications/osb-portal/src/components/workspace/WorkspaceEditor.tsx +++ b/applications/osb-portal/src/components/workspace/WorkspaceEditor.tsx @@ -1,20 +1,21 @@ import * as React from "react"; -import { makeStyles } from "@material-ui/core/styles"; import Button from "@material-ui/core/Button"; import TextField from "@material-ui/core/TextField"; -import FormControlLabel from '@material-ui/core/FormControlLabel'; import Box from "@material-ui/core/Box"; -import Checkbox from '@material-ui/core/Checkbox'; import Grid from "@material-ui/core/Grid"; import IconButton from "@material-ui/core/IconButton"; import Typography from '@material-ui/core/Typography'; +import CircularProgress from '@material-ui/core/CircularProgress'; import Dropzone from 'react-dropzone' import PublishIcon from '@material-ui/icons/Publish'; import DeleteForeverIcon from '@material-ui/icons/DeleteForever'; import { fade } from '@material-ui/core/styles/colorManipulator'; + import { radius, gutter } from '../../theme'; import workspaceService from '../../service/WorkspaceService' import { Workspace } from '../../types/workspace'; + + interface WorkspaceEditProps { workspace: Workspace; onLoadWorkspace: (refresh?: boolean) => void; @@ -60,15 +61,22 @@ export default (props: WorkspaceEditProps) => { const [thumbnailPreview, setThumbnailPreview] = React.useState(null); const handleCreateWorkspace = async (publicable: boolean = false) => { + setLoading(true) workspaceService.createWorkspace({ ...workspaceForm, publicable }).then( async (workspace) => { if (thumbnail) { const fileThumbnail: any = await readFile(thumbnail); workspaceService.updateWorkspaceThumbnail(workspace.id, new Blob([fileThumbnail])).then(() => props.onLoadWorkspace(true), e => console.error('Error uploading thumbnail')); } else { + setLoading(true) props.onLoadWorkspace(true) } } + , (e) => { + setLoading(false); + console.error('Error submitting the workspace', e); + } + ); } @@ -95,6 +103,7 @@ export default (props: WorkspaceEditProps) => { thumbnail = uploadedThumbnail; previewFile(thumbnail); } + const [loading, setLoading] = React.useState(false); return ( <> @@ -123,9 +132,19 @@ export default (props: WorkspaceEditProps) => { - + {loading && + } From 7d3bf1505d154e20b53766c869df2023e8db4e77 Mon Sep 17 00:00:00 2001 From: Filippo Ledda Date: Mon, 1 Mar 2021 19:11:28 +0100 Subject: [PATCH 035/321] #104 Improve resource submit and monitoring --- .../osb-portal/src/assets/images/banner.png | Bin 703548 -> 262620 bytes .../src/components/header/Banner.tsx | 4 ++-- .../components/workspace/WorkspaceEditor.tsx | 3 ++- .../drawer/WorkspaceInteractions.tsx | 5 ++++- .../drawer/WorkspaceResourceBrowser.tsx | 5 ++++- .../osb-portal/src/pages/WorkspacePage.tsx | 4 ++-- .../osb-portal/src/types/workspace.ts | 6 +++--- .../workspaces/repository/model_repository.py | 6 ++++-- .../server/workspaces/service/events.py | 19 ++++++++++-------- 9 files changed, 32 insertions(+), 20 deletions(-) diff --git a/applications/osb-portal/src/assets/images/banner.png b/applications/osb-portal/src/assets/images/banner.png index d554e6fc9e636b62624422116fce7802e3f14121..5e9cc597b074eb6551dae9cd636fc44c54dfbf14 100644 GIT binary patch literal 262620 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

+1)0Ub#aFjEwAg1iPfW^E4M}-jr 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 s1!(;DmsH4KHl^(gSFw>6lv6Dy8qE+0)0? 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

BFJTpWnG<9W+NT)2eSYR#{Wk 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ƈ_Fj_#7vt0Y9Dp{U0;%Jy`8Y;r%^V4N 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 B-f{o{ literal 703548 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:Nh7lsiJO&s1+?2cTI)P} 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