This is an automated email from the ASF dual-hosted git repository. dgnatyshyn pushed a commit to branch develop in repository https://gitbox.apache.org/repos/asf/incubator-dlab.git
The following commit(s) were added to refs/heads/develop by this push: new 658dfef [Dlab 1661]: Grouped Compute/Notebook shapes by clouds (#673) 658dfef is described below commit 658dfefab40bf1cf0968c3fe6066e5ed625458b5 Author: Dmytro Gnatyshyn <42860905+dg1...@users.noreply.github.com> AuthorDate: Wed Mar 25 13:06:02 2020 +0200 [Dlab 1661]: Grouped Compute/Notebook shapes by clouds (#673) [Dlab 1661]: Grouped Compute/Notebook shapes by clouds --- .../epam/dlab/backendapi/dao/UserRoleDaoImpl.java | 2 ++ .../dlab/backendapi/resources/dto/UserRoleDto.java | 2 ++ .../src/main/resources/mongo/aws/mongo_roles.json | 28 ++++++++++++++++ .../main/resources/mongo/azure/mongo_roles.json | 23 +++++++++++++ .../src/main/resources/mongo/gcp/mongo_roles.json | 26 +++++++++++++++ .../app/administration/roles/roles.component.ts | 9 ++--- .../services/applicationServiceFacade.service.ts | 6 ---- .../src/app/core/services/project.service.ts | 9 ----- .../multi-level-select-dropdown.component.html | 26 ++++++++++++++- .../multi-level-select-dropdown.component.scss | 4 ++- .../multi-level-select-dropdown.component.ts | 39 +++++++++++++++++++++- 11 files changed, 152 insertions(+), 22 deletions(-) diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/UserRoleDaoImpl.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/UserRoleDaoImpl.java index f4deb0a..fffc70b 100644 --- a/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/UserRoleDaoImpl.java +++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/UserRoleDaoImpl.java @@ -56,6 +56,7 @@ public class UserRoleDaoImpl extends BaseDAO implements UserRoleDao { private static final String GROUPS_FIELD = "groups"; private static final String DESCRIPTION = "description"; private static final String TYPE = "type"; + private static final String CLOUD = "cloud"; private static final String ROLES = "roles"; private static final String GROUPS = "$groups"; private static final String GROUP = "group"; @@ -171,6 +172,7 @@ public class UserRoleDaoImpl extends BaseDAO implements UserRoleDao { return new Document().append(ID, "$" + ID) .append(DESCRIPTION, "$" + DESCRIPTION) .append(TYPE, "$" + TYPE) + .append(CLOUD, "$" + CLOUD) .append(USERS_FIELD, "$" + USERS_FIELD) .append(EXPLORATORY_SHAPES_FIELD, "$" + EXPLORATORY_SHAPES_FIELD) .append(PAGES_FIELD, "$" + PAGES_FIELD) diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/UserRoleDto.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/UserRoleDto.java index b1d3337..5c90602 100644 --- a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/UserRoleDto.java +++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/UserRoleDto.java @@ -18,6 +18,7 @@ */ package com.epam.dlab.backendapi.resources.dto; +import com.epam.dlab.cloud.CloudProvider; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Getter; @@ -35,6 +36,7 @@ public class UserRoleDto { private String id; private String description; private Type type; + private CloudProvider cloud; private Set<String> pages; private Set<String> computationals; private Set<String> exploratories; diff --git a/services/self-service/src/main/resources/mongo/aws/mongo_roles.json b/services/self-service/src/main/resources/mongo/aws/mongo_roles.json index 0a566f4..9998d84 100644 --- a/services/self-service/src/main/resources/mongo/aws/mongo_roles.json +++ b/services/self-service/src/main/resources/mongo/aws/mongo_roles.json @@ -3,6 +3,7 @@ "_id": "nbShapes_p2.xlarge_fetching", "description": "Use p2.xlarge instance shape for notebook", "type": "NOTEBOOK_SHAPE", + "cloud": "AWS", "exploratory_shapes": [ "p2.xlarge" ], @@ -14,6 +15,7 @@ "_id": "nbShapes_t2.medium_fetching", "description": "Use t2.medium instance shape for notebook", "type": "NOTEBOOK_SHAPE", + "cloud": "AWS", "exploratory_shapes": [ "t2.medium" ], @@ -25,6 +27,7 @@ "_id": "nbShapes_r3.xlarge_fetching", "description": "Use r3.xlarge instance shape for notebook", "type": "NOTEBOOK_SHAPE", + "cloud": "AWS", "exploratory_shapes": [ "r3.xlarge" ], @@ -36,6 +39,7 @@ "_id": "nbShapes_r4.2xlarge_fetching", "description": "Use r4.2xlarge instance shape for notebook", "type": "NOTEBOOK_SHAPE", + "cloud": "AWS", "exploratory_shapes": [ "r4.2xlarge" ], @@ -47,6 +51,7 @@ "_id": "nbShapes_r3.4xlarge_fetching", "description": "Use r3.4xlarge instance shape for notebook", "type": "NOTEBOOK_SHAPE", + "cloud": "AWS", "exploratory_shapes": [ "r3.4xlarge" ], @@ -58,6 +63,7 @@ "_id": "nbShapes_r3.8xlarge_fetching", "description": "Use r3.8xlarge instance shape for notebook", "type": "NOTEBOOK_SHAPE", + "cloud": "AWS", "exploratory_shapes": [ "r3.8xlarge" ], @@ -69,6 +75,7 @@ "_id": "nbShapes_c4.large_fetching", "description": "Use c4.large instance shape for notebook", "type": "NOTEBOOK_SHAPE", + "cloud": "AWS", "exploratory_shapes": [ "c4.large" ], @@ -80,6 +87,7 @@ "_id": "nbShapes_c4.2xlarge_fetching", "description": "Use c4.2xlarge instance shape for notebook", "type": "NOTEBOOK_SHAPE", + "cloud": "AWS", "exploratory_shapes": [ "c4.2xlarge" ], @@ -91,6 +99,7 @@ "_id": "nbShapes_c4.8xlarge_fetching", "description": "Use c4.8xlarge instance shape for notebook", "type": "NOTEBOOK_SHAPE", + "cloud": "AWS", "exploratory_shapes": [ "c4.8xlarge" ], @@ -102,6 +111,7 @@ "_id": "nbCreateDeeplearning", "description": "Create Notebook Deep Learning", "type": "NOTEBOOK", + "cloud": "AWS", "exploratories": [ "docker.dlab-deeplearning" ], @@ -113,6 +123,7 @@ "_id": "nbCreateJupyter", "description": "Create Notebook Jupyter", "type": "NOTEBOOK", + "cloud": "AWS", "exploratories": [ "docker.dlab-jupyter" ], @@ -124,6 +135,7 @@ "_id": "nbCreateJupyterLab", "description": "Create Notebook JupyterLab", "type": "NOTEBOOK", + "cloud": "AWS", "exploratories": [ "docker.dlab-jupyterlab" ], @@ -135,6 +147,7 @@ "_id": "nbCreateRstudio", "description": "Create Notebook RStudio", "type": "NOTEBOOK", + "cloud": "AWS", "exploratories": [ "docker.dlab-rstudio" ], @@ -146,6 +159,7 @@ "_id": "nbCreateTensor", "description": "Create Notebook Jupyter with TensorFlow", "type": "NOTEBOOK", + "cloud": "AWS", "exploratories": [ "docker.dlab-tensor" ], @@ -157,6 +171,7 @@ "_id": "nbCreateZeppelin", "description": "Create Notebook Apache Zeppelin", "type": "NOTEBOOK", + "cloud": "AWS", "exploratories": [ "docker.dlab-zeppelin" ], @@ -168,6 +183,7 @@ "_id": "nbCreateTensorRstudio", "description": "Create Notebook RStudio with TensorFlow", "type": "NOTEBOOK", + "cloud": "AWS", "exploratories": [ "docker.dlab-tensor-rstudio" ], @@ -179,6 +195,7 @@ "_id": "nbCreateDataEngine", "description": "Create Data Engine", "type": "COMPUTATIONAL", + "cloud": "AWS", "computationals": [ "docker.dlab-dataengine" ], @@ -190,6 +207,7 @@ "_id": "nbCreateDataEngineService", "description": "Create Data Engine Service", "type": "COMPUTATIONAL", + "cloud": "AWS", "computationals": [ "docker.dlab-dataengine-service" ], @@ -201,6 +219,7 @@ "_id": "compShapes_c4.xlarge_fetching", "description": "Use c4.xlarge instance shape for cluster", "type": "COMPUTATIONAL_SHAPE", + "cloud": "AWS", "computational_shapes": [ "c4.xlarge" ], @@ -212,6 +231,7 @@ "_id": "compShapes_r3.xlarge_fetching", "description": "Use r3.xlarge instance shape for cluster", "type": "COMPUTATIONAL_SHAPE", + "cloud": "AWS", "computational_shapes": [ "r3.xlarge" ], @@ -223,6 +243,7 @@ "_id": "compShapes_r4.2xlarge_fetching", "description": "Use r4.2xlarge instance shape for cluster", "type": "COMPUTATIONAL_SHAPE", + "cloud": "AWS", "computational_shapes": [ "r4.2xlarge" ], @@ -234,6 +255,7 @@ "_id": "compShapes_r3.4xlarge_fetching", "description": "Use r3.4xlarge instance shape for cluster", "type": "COMPUTATIONAL_SHAPE", + "cloud": "AWS", "computational_shapes": [ "r3.4xlarge" ], @@ -245,6 +267,7 @@ "_id": "compShapes_r3.8xlarge_fetching", "description": "Use r3.8xlarge instance shape for cluster", "type": "COMPUTATIONAL_SHAPE", + "cloud": "AWS", "computational_shapes": [ "r3.8xlarge" ], @@ -256,6 +279,7 @@ "_id": "compShapes_c4.2xlarge_fetching", "description": "Use c4.2xlarge instance shape for cluster", "type": "COMPUTATIONAL_SHAPE", + "cloud": "AWS", "computational_shapes": [ "c4.2xlarge" ], @@ -267,6 +291,7 @@ "_id": "compShapes_c4.8xlarge_fetching", "description": "Use c4.8xlarge instance shape for cluster", "type": "COMPUTATIONAL_SHAPE", + "cloud": "AWS", "computational_shapes": [ "c4.8xlarge" ], @@ -278,6 +303,7 @@ "_id": "compShapes_p2.xlarge_fetching", "description": "Use p2.xlarge instance shape for cluster", "type": "COMPUTATIONAL_SHAPE", + "cloud": "AWS", "computational_shapes": [ "p2.xlarge" ], @@ -289,6 +315,7 @@ "_id": "nbBillingReportFull", "description": "View full billing report for all users", "type": "BILLING", + "cloud": "AWS", "pages": [ "/api/infrastructure_provision/billing" ], @@ -300,6 +327,7 @@ "_id": "admin", "description": "Allow to execute administration operation", "type": "ADMINISTRATION", + "cloud": "AWS", "pages": [ "environment/*", "/api/infrastructure/backup", diff --git a/services/self-service/src/main/resources/mongo/azure/mongo_roles.json b/services/self-service/src/main/resources/mongo/azure/mongo_roles.json index ca61082..113a705 100644 --- a/services/self-service/src/main/resources/mongo/azure/mongo_roles.json +++ b/services/self-service/src/main/resources/mongo/azure/mongo_roles.json @@ -3,6 +3,7 @@ "_id": "nbShapes_Standard_NC6_fetching", "description": "Use Standard_NC6 instance shape for notebook", "type": "NOTEBOOK_SHAPE", + "cloud": "AZURE", "exploratory_shapes": [ "Standard_NC6" ], @@ -14,6 +15,7 @@ "_id": "nbShapes_Standard_E4s_v3_fetching", "description": "Use Standard_E4s_v3 instance shape for notebook", "type": "NOTEBOOK_SHAPE", + "cloud": "AZURE", "exploratory_shapes": [ "Standard_E4s_v3" ], @@ -25,6 +27,7 @@ "_id": "nbShapes_Standard_E16s_v3_fetching", "description": "Use Standard_E16s_v3 instance shape for notebook", "type": "NOTEBOOK_SHAPE", + "cloud": "AZURE", "exploratory_shapes": [ "Standard_E16s_v3" ], @@ -36,6 +39,7 @@ "_id": "nbShapes_Standard_E32s_v3_fetching", "description": "Use Standard_E32s_v3 instance shape for notebook", "type": "NOTEBOOK_SHAPE", + "cloud": "AZURE", "exploratory_shapes": [ "Standard_E32s_v3" ], @@ -47,6 +51,7 @@ "_id": "nbShapes_Standard_F2s_fetching", "description": "Use Standard_F2s instance shape for notebook", "type": "NOTEBOOK_SHAPE", + "cloud": "AZURE", "exploratory_shapes": [ "Standard_F2s" ], @@ -58,6 +63,7 @@ "_id": "nbShapes_Standard_F4s_fetching", "description": "Use Standard_F4s instance shape for notebook", "type": "NOTEBOOK_SHAPE", + "cloud": "AZURE", "exploratory_shapes": [ "Standard_F4s" ], @@ -69,6 +75,7 @@ "_id": "nbShapes_Standard_F8s_fetching", "description": "Use Standard_F8s instance shape for notebook", "type": "NOTEBOOK_SHAPE", + "cloud": "AZURE", "exploratory_shapes": [ "Standard_F8s" ], @@ -80,6 +87,7 @@ "_id": "nbShapes_Standard_F16s_fetching", "description": "Use Standard_F16s instance shape for notebook", "type": "NOTEBOOK_SHAPE", + "cloud": "AZURE", "exploratory_shapes": [ "Standard_F16s" ], @@ -91,6 +99,7 @@ "_id": "nbCreateDeeplearning", "description": "Create Notebook Deep Learning", "type": "NOTEBOOK", + "cloud": "AZURE", "exploratories": [ "docker.dlab-deeplearning" ], @@ -102,6 +111,7 @@ "_id": "nbCreateJupyter", "description": "Create Notebook Jupyter", "type": "NOTEBOOK", + "cloud": "AZURE", "exploratories": [ "docker.dlab-jupyter" ], @@ -113,6 +123,7 @@ "_id": "nbCreateRstudio", "description": "Create Notebook RStudio", "type": "NOTEBOOK", + "cloud": "AZURE", "exploratories": [ "docker.dlab-rstudio" ], @@ -124,6 +135,7 @@ "_id": "nbCreateTensor", "description": "Create Notebook Jupyter with TensorFlow", "type": "NOTEBOOK", + "cloud": "AZURE", "exploratories": [ "docker.dlab-tensor" ], @@ -135,6 +147,7 @@ "_id": "nbCreateZeppelin", "description": "Create Notebook Apache Zeppelin", "type": "NOTEBOOK", + "cloud": "AZURE", "exploratories": [ "docker.dlab-zeppelin" ], @@ -146,6 +159,7 @@ "_id": "nbCreateDataEngine", "description": "Create Data Engine", "type": "COMPUTATIONAL", + "cloud": "AZURE", "computationals": [ "docker.dlab-dataengine" ], @@ -157,6 +171,7 @@ "_id": "compShapes_Standard_F4s_fetching", "description": "Use Standard_F4s instance shape for cluster", "type": "COMPUTATIONAL_SHAPE", + "cloud": "AZURE", "computational_shapes": [ "Standard_F4s" ], @@ -168,6 +183,7 @@ "_id": "compShapes_Standard_E4s_v3_fetching", "description": "Use Standard_E4s_v3 instance shape for cluster", "type": "COMPUTATIONAL_SHAPE", + "cloud": "AZURE", "computational_shapes": [ "Standard_E4s_v3" ], @@ -179,6 +195,7 @@ "_id": "compShapes_Standard_E16s_v3_fetching", "description": "Use Standard_E16s_v3 instance shape for cluster", "type": "COMPUTATIONAL_SHAPE", + "cloud": "AZURE", "computational_shapes": [ "Standard_E16s_v3" ], @@ -190,6 +207,7 @@ "_id": "compShapes_Standard_E32s_v3_fetching", "description": "Use Standard_E32s_v3 instance shape for cluster", "type": "COMPUTATIONAL_SHAPE", + "cloud": "AZURE", "computational_shapes": [ "Standard_E32s_v3" ], @@ -201,6 +219,7 @@ "_id": "compShapes_Standard_F8s_fetching", "description": "Use Standard_F8s instance shape for cluster", "type": "COMPUTATIONAL_SHAPE", + "cloud": "AZURE", "computational_shapes": [ "Standard_F8s" ], @@ -212,6 +231,7 @@ "_id": "compShapes_Standard_F16s_fetching", "description": "Use Standard_F16s instance shape for cluster", "type": "COMPUTATIONAL_SHAPE", + "cloud": "AZURE", "computational_shapes": [ "Standard_F16s" ], @@ -223,6 +243,7 @@ "_id": "compShapes_Standard_NC6_fetching", "description": "Use Standard_NC6 instance shape for cluster", "type": "COMPUTATIONAL_SHAPE", + "cloud": "AZURE", "computational_shapes": [ "Standard_NC6" ], @@ -234,6 +255,7 @@ "_id": "nbBillingReportFull", "description": "View full billing report for all users", "type": "BILLING", + "cloud": "AZURE", "pages": [ "/api/infrastructure_provision/billing" ], @@ -245,6 +267,7 @@ "_id": "admin", "description": "Allow to execute administration operation", "type": "ADMINISTRATION", + "cloud": "AZURE", "pages": [ "environment/*", "/api/infrastructure/backup", diff --git a/services/self-service/src/main/resources/mongo/gcp/mongo_roles.json b/services/self-service/src/main/resources/mongo/gcp/mongo_roles.json index d3c22ba..8098628 100644 --- a/services/self-service/src/main/resources/mongo/gcp/mongo_roles.json +++ b/services/self-service/src/main/resources/mongo/gcp/mongo_roles.json @@ -3,6 +3,7 @@ "_id": "nbShapes_n1-highcpu-2_fetching", "description": "Use n1-highcpu-2 instance shape for notebook", "type": "NOTEBOOK_SHAPE", + "cloud": "GCP", "exploratory_shapes": [ "n1-highcpu-2" ], @@ -14,6 +15,7 @@ "_id": "nbShapes_n1-highcpu-8_fetching", "description": "Use n1-highcpu-8 instance shape for notebook", "type": "NOTEBOOK_SHAPE", + "cloud": "GCP", "exploratory_shapes": [ "n1-highcpu-8" ], @@ -25,6 +27,7 @@ "_id": "nbShapes_n1-highcpu-32_fetching", "description": "Use n1-highcpu-32 instance shape for notebook", "type": "NOTEBOOK_SHAPE", + "cloud": "GCP", "exploratory_shapes": [ "n1-highcpu-32" ], @@ -36,6 +39,7 @@ "_id": "nbShapes_n1-highmem-4_fetching", "description": "Use n1-highmem-4 instance shape for notebook", "type": "NOTEBOOK_SHAPE", + "cloud": "GCP", "exploratory_shapes": [ "n1-highmem-4" ], @@ -47,6 +51,7 @@ "_id": "nbShapes_n1-highmem-16_fetching", "description": "Use n1-highmem-16 instance shape for notebook", "type": "NOTEBOOK_SHAPE", + "cloud": "GCP", "exploratory_shapes": [ "n1-highmem-16" ], @@ -58,6 +63,7 @@ "_id": "nbShapes_n1-highmem-32_fetching", "description": "Use n1-highmem-32 instance shape for notebook", "type": "NOTEBOOK_SHAPE", + "cloud": "GCP", "exploratory_shapes": [ "n1-highmem-32" ], @@ -69,6 +75,7 @@ "_id": "nbShapes_n1-standard-2_fetching", "description": "Use n1-standard-2 instance shape for notebook", "type": "NOTEBOOK_SHAPE", + "cloud": "GCP", "exploratory_shapes": [ "n1-standard-2" ], @@ -80,6 +87,7 @@ "_id": "nbCreateDeeplearning", "description": "Create Notebook Deep Learning", "type": "NOTEBOOK", + "cloud": "GCP", "exploratories": [ "docker.dlab-deeplearning" ], @@ -91,6 +99,7 @@ "_id": "nbCreateJupyter", "description": "Create Notebook Jupyter", "type": "NOTEBOOK", + "cloud": "GCP", "exploratories": [ "docker.dlab-jupyter" ], @@ -102,6 +111,7 @@ "_id": "nbCreateJupyterLab", "description": "Create Notebook JupyterLab", "type": "NOTEBOOK", + "cloud": "GCP", "exploratories": [ "docker.dlab-jupyterlab" ], @@ -113,6 +123,7 @@ "_id": "nbCreateSuperset", "description": "Create Notebook Superset", "type": "NOTEBOOK", + "cloud": "GCP", "exploratories": [ "docker.dlab-superset" ], @@ -124,6 +135,7 @@ "_id": "nbCreateRstudio", "description": "Create Notebook RStudio", "type": "NOTEBOOK", + "cloud": "GCP", "exploratories": [ "docker.dlab-rstudio" ], @@ -135,6 +147,7 @@ "_id": "nbCreateTensor", "description": "Create Notebook Jupyter with TensorFlow", "type": "NOTEBOOK", + "cloud": "GCP", "exploratories": [ "docker.dlab-tensor" ], @@ -146,6 +159,7 @@ "_id": "nbCreateTensorRstudio", "description": "Create Notebook RStudio with TensorFlow", "type": "NOTEBOOK", + "cloud": "GCP", "exploratories": [ "docker.dlab-tensor-rstudio" ], @@ -157,6 +171,7 @@ "_id": "nbCreateZeppelin", "description": "Create Notebook Apache Zeppelin", "type": "NOTEBOOK", + "cloud": "GCP", "exploratories": [ "docker.dlab-zeppelin" ], @@ -168,6 +183,7 @@ "_id": "nbCreateDataEngine", "description": "Create Data Engine", "type": "COMPUTATIONAL", + "cloud": "GCP", "computationals": [ "docker.dlab-dataengine" ], @@ -179,6 +195,7 @@ "_id": "nbCreateDataEngineService", "description": "Create Data Engine Service", "type": "COMPUTATIONAL", + "cloud": "GCP", "computationals": [ "docker.dlab-dataengine-service" ], @@ -190,6 +207,7 @@ "_id": "compShapes_n1-standard-2_fetching", "description": "Use n1-standard-2 instance shape for cluster", "type": "COMPUTATIONAL_SHAPE", + "cloud": "GCP", "computational_shapes": [ "n1-standard-2" ], @@ -201,6 +219,7 @@ "_id": "compShapes_n1-highmem-4_fetching", "description": "Use n1-highmem-4 instance shape for cluster", "type": "COMPUTATIONAL_SHAPE", + "cloud": "GCP", "computational_shapes": [ "n1-highmem-4" ], @@ -212,6 +231,7 @@ "_id": "compShapes_n1-highmem-16_fetching", "description": "Use n1-highmem-16 instance shape for cluster", "type": "COMPUTATIONAL_SHAPE", + "cloud": "GCP", "computational_shapes": [ "n1-highmem-16" ], @@ -223,6 +243,7 @@ "_id": "compShapes_n1-highmem-32_fetching", "description": "Use n1-highmem-32 instance shape for cluster", "type": "COMPUTATIONAL_SHAPE", + "cloud": "GCP", "computational_shapes": [ "n1-highmem-32" ], @@ -234,6 +255,7 @@ "_id": "compShapes_n1-highcpu-8_fetching", "description": "Use n1-highcpu-8 instance shape for cluster", "type": "COMPUTATIONAL_SHAPE", + "cloud": "GCP", "computational_shapes": [ "n1-highcpu-8" ], @@ -245,6 +267,7 @@ "_id": "compShapes_n1-highcpu-2_fetching", "description": "Use n1-highcpu-2 instance shape for cluster", "type": "COMPUTATIONAL_SHAPE", + "cloud": "GCP", "computational_shapes": [ "n1-highcpu-2" ], @@ -256,6 +279,7 @@ "_id": "compShapes_n1-highcpu-32_fetching", "description": "Use n1-highcpu-32 instance shape for cluster", "type": "COMPUTATIONAL_SHAPE", + "cloud": "GCP", "computational_shapes": [ "n1-highcpu-32" ], @@ -267,6 +291,7 @@ "_id": "nbBillingReportFull", "description": "View full billing report for all users", "type": "BILLING", + "cloud": "GCP", "pages": [ "/api/infrastructure_provision/billing" ], @@ -278,6 +303,7 @@ "_id": "admin", "description": "Allow to execute administration operation", "type": "ADMINISTRATION", + "cloud": "GCP", "pages": [ "environment/*", "/api/infrastructure/backup", diff --git a/services/self-service/src/main/resources/webapp/src/app/administration/roles/roles.component.ts b/services/self-service/src/main/resources/webapp/src/app/administration/roles/roles.component.ts index 11cd9ca..19ab0ed 100644 --- a/services/self-service/src/main/resources/webapp/src/app/administration/roles/roles.component.ts +++ b/services/self-service/src/main/resources/webapp/src/app/administration/roles/roles.component.ts @@ -75,10 +75,11 @@ export class RolesComponent implements OnInit { (roles: any) => { this.roles = roles; this.rolesList = roles.map((role, index) => { - return {role: role.description, type: role.type}; - }) + return {role: role.description, type: role.type, cloud: role.cloud}; + }); + this.rolesList = this.rolesList.sort((a, b) => (a.cloud > b.cloud) ? 1 : ((b.cloud > a.cloud) ? -1 : 0)); this.rolesList = this.rolesList.sort((a, b) => (a.type > b.type) ? 1 : ((b.type > a.type) ? -1 : 0)); - this.updateGroupData(groups); + this.updateGroupData(groups); this.stepperView = false; }, @@ -209,7 +210,7 @@ export class RolesComponent implements OnInit { return v; }).sort((a, b) => (a.group > b.group) ? 1 : ((b.group > a.group) ? -1 : 0)); this.groupsData.forEach(item => { - item.selected_roles = item.roles.map(role => ({role: role.description, type: role.type})); + item.selected_roles = item.roles.map(role => ({role: role.description, type: role.type, cloud: role.cloud})); }); this.getGroupsListCopy(); } diff --git a/services/self-service/src/main/resources/webapp/src/app/core/services/applicationServiceFacade.service.ts b/services/self-service/src/main/resources/webapp/src/app/core/services/applicationServiceFacade.service.ts index ac698a7..121188e 100644 --- a/services/self-service/src/main/resources/webapp/src/app/core/services/applicationServiceFacade.service.ts +++ b/services/self-service/src/main/resources/webapp/src/app/core/services/applicationServiceFacade.service.ts @@ -566,12 +566,6 @@ export class ApplicationServiceFacade { null); } - public buildDeleteProject(param): Observable<any> { - return this.buildRequest(HTTPMethod.DELETE, - this.requestRegistry.Item(ApplicationServiceFacade.PROJECT) + param, - null); - } - public buildToggleProjectStatus(param, data): Observable<any> { return this.buildRequest(HTTPMethod.POST, this.requestRegistry.Item(ApplicationServiceFacade.PROJECT) + param, diff --git a/services/self-service/src/main/resources/webapp/src/app/core/services/project.service.ts b/services/self-service/src/main/resources/webapp/src/app/core/services/project.service.ts index 805c8e8..0bb54b5 100644 --- a/services/self-service/src/main/resources/webapp/src/app/core/services/project.service.ts +++ b/services/self-service/src/main/resources/webapp/src/app/core/services/project.service.ts @@ -70,15 +70,6 @@ export class ProjectService { catchError(ErrorUtils.handleServiceError)); } - public deleteProject(data): Observable<{}> { - const url = `/${data}`; - return this.applicationServiceFacade - .buildDeleteProject(url) - .pipe( - map(response => response), - catchError(ErrorUtils.handleServiceError)); - } - public toggleProjectStatus(data, action): Observable<{}> { const url = `/${action}`; return this.applicationServiceFacade diff --git a/services/self-service/src/main/resources/webapp/src/app/shared/form-controls/multi-level-select-dropdown/multi-level-select-dropdown.component.html b/services/self-service/src/main/resources/webapp/src/app/shared/form-controls/multi-level-select-dropdown/multi-level-select-dropdown.component.html index f6b52da..4e41606 100644 --- a/services/self-service/src/main/resources/webapp/src/app/shared/form-controls/multi-level-select-dropdown/multi-level-select-dropdown.component.html +++ b/services/self-service/src/main/resources/webapp/src/app/shared/form-controls/multi-level-select-dropdown/multi-level-select-dropdown.component.html @@ -49,7 +49,7 @@ </a> </li> - <li class="role-item" role="presentation" *ngIf="model && isOpenCategory[item.type]" > + <li class="role-item" role="presentation" *ngIf="model && isOpenCategory[item.type] && item.type !== 'COMPUTATIONAL_SHAPE' && item.type !== 'NOTEBOOK_SHAPE'" > <a href="#" class="list-item" role="menuitem" (click)="toggleSelectedOptions($event, model, item)"> <span class="empty-checkbox" [ngClass]="{'checked': checkInModel(item.role)}"> <span class="checked-checkbox" *ngIf="checkInModel(item.role)"></span> @@ -57,6 +57,30 @@ {{item.role}} </a> </li> + <li class="role-item" role="presentation" (click)="toggleItemsForCloud(item.type + item.cloud, $event)" + *ngIf="model && isOpenCategory[item.type] && item.type === 'COMPUTATIONAL_SHAPE' && item.cloud !== items[i - 1].cloud + || model && isOpenCategory[item.type] && item.type === 'NOTEBOOK_SHAPE' && item.type !== items[i - 1].type + || model && isOpenCategory[item.type] && item.type === 'NOTEBOOK_SHAPE' && item.cloud !== items[i - 1].cloud + || model && isOpenCategory[item.type] && item.type === 'COMPUTATIONAL_SHAPE' && item.type !== items[i - 1].type" + > + <a href="#" class="list-item" role="menuitem"> + <span class="arrow" [ngClass]="{'rotate-arrow': isCloudOpen[item.type + item.cloud], 'arrow-checked': selectedAllInCloud(item.type, item.cloud) || selectedSomeInCloud(item.type, item.cloud)}"></span> + <span class="empty-checkbox" [ngClass]="{'checked': selectedAllInCloud(item.type, item.cloud) || selectedSomeInCloud(item.type, item.cloud)}" (click)="toggleSelectedCloud($event, model, item.type, item.cloud);$event.stopPropagation()" > + <span class="checked-checkbox" *ngIf="selectedAllInCloud(item.type, item.cloud)"></span> + <span class="line-checkbox" *ngIf="selectedSomeInCloud(item.type, item.cloud)"></span> + </span> + {{item.cloud || 'AWS'}} + </a> + </li> + <li class="role-cloud-item" role="presentation" *ngIf="model && isCloudOpen[item.type + item.cloud] && isOpenCategory[item.type]" > + <a href="#" class="list-item" role="menuitem" (click)="toggleSelectedOptions($event, model, item)"> + <span class="empty-checkbox" [ngClass]="{'checked': checkInModel(item.role)}"> + <span class="checked-checkbox" *ngIf="checkInModel(item.role)"></span> + </span> + {{item.role}} + </a> + </li> + </ng-template> <li *ngIf="items?.length == 0"> diff --git a/services/self-service/src/main/resources/webapp/src/app/shared/form-controls/multi-level-select-dropdown/multi-level-select-dropdown.component.scss b/services/self-service/src/main/resources/webapp/src/app/shared/form-controls/multi-level-select-dropdown/multi-level-select-dropdown.component.scss index 00d9a80..5323a24 100644 --- a/services/self-service/src/main/resources/webapp/src/app/shared/form-controls/multi-level-select-dropdown/multi-level-select-dropdown.component.scss +++ b/services/self-service/src/main/resources/webapp/src/app/shared/form-controls/multi-level-select-dropdown/multi-level-select-dropdown.component.scss @@ -117,7 +117,9 @@ .role-item{ padding-left: 30px; } - + .role-cloud-item{ + padding-left: 60px; + } } diff --git a/services/self-service/src/main/resources/webapp/src/app/shared/form-controls/multi-level-select-dropdown/multi-level-select-dropdown.component.ts b/services/self-service/src/main/resources/webapp/src/app/shared/form-controls/multi-level-select-dropdown/multi-level-select-dropdown.component.ts index 7d160fb..cabf7d9 100644 --- a/services/self-service/src/main/resources/webapp/src/app/shared/form-controls/multi-level-select-dropdown/multi-level-select-dropdown.component.ts +++ b/services/self-service/src/main/resources/webapp/src/app/shared/form-controls/multi-level-select-dropdown/multi-level-select-dropdown.component.ts @@ -35,6 +35,10 @@ export class MultiLevelSelectDropdownComponent { public isOpenCategory = { }; + public isCloudOpen = { + + }; + public labels = { COMPUTATIONAL_SHAPE: 'Compute shapes', NOTEBOOK_SHAPE: 'Notebook shapes', @@ -57,8 +61,21 @@ export class MultiLevelSelectDropdownComponent { this.onUpdate($event); } - selectAllOptions($event) { + toggleSelectedCloud($event, model, category, cloud) { + $event.preventDefault(); + const categoryItems = this.items.filter(role => role.type === category && role.cloud === cloud); + this.selectedAllInCloud(category, cloud) ? this.model = this.model.filter(role => { + if (role.type === category && role.cloud === cloud) { + return false; + } + return true; + }) : categoryItems.forEach(role => { + if (!model.filter(mod => mod.role === role.role).length) {this.model.push(role); } + }); + this.onUpdate($event); + } + selectAllOptions($event) { $event.preventDefault(); this.model = [...this.items]; this.onUpdate($event); @@ -77,6 +94,14 @@ export class MultiLevelSelectDropdownComponent { public toggleItemsForLable(label, $event) { this.isOpenCategory[label] = !this.isOpenCategory[label]; + this.isCloudOpen[label + 'AWS'] = false; + this.isCloudOpen[label + 'GCP'] = false; + this.isCloudOpen[label + 'AZURE'] = false; + $event.preventDefault(); + } + + public toggleItemsForCloud(label, $event) { + this.isCloudOpen[label] = !this.isCloudOpen[label]; $event.preventDefault(); } @@ -92,6 +117,18 @@ export class MultiLevelSelectDropdownComponent { return selected.length && selected.length !== categoryItems.length; } + public selectedAllInCloud(category, cloud) { + const selected = this.model.filter(role => role.type === category && role.cloud === cloud); + const categoryItems = this.items.filter(role => role.type === category && role.cloud === cloud); + return selected.length === categoryItems.length; + } + + public selectedSomeInCloud(category, cloud) { + const selected = this.model.filter(role => role.type === category && role.cloud === cloud); + const categoryItems = this.items.filter(role => role.type === category && role.cloud === cloud); + return selected.length && selected.length !== categoryItems.length; + } + public checkInModel(item) { return this.model.filter(v => v.role === item).length; } --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@dlab.apache.org For additional commands, e-mail: commits-h...@dlab.apache.org