blob: 85f6380b133410e280d25540004e351e9201c729 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package com.epam.datalab.backendapi.service.impl;
import com.epam.datalab.auth.UserInfo;
import com.epam.datalab.backendapi.conf.SelfServiceApplicationConfiguration;
import com.epam.datalab.backendapi.dao.ExploratoryDAO;
import com.epam.datalab.backendapi.domain.BillingReport;
import com.epam.datalab.backendapi.domain.BillingReportLine;
import com.epam.datalab.backendapi.domain.ProjectDTO;
import com.epam.datalab.backendapi.domain.ProjectEndpointDTO;
import com.epam.datalab.backendapi.domain.RequestId;
import com.epam.datalab.backendapi.resources.TestBase;
import com.epam.datalab.backendapi.resources.dto.HealthStatusPageDTO;
import com.epam.datalab.backendapi.resources.dto.ProjectInfrastructureInfo;
import com.epam.datalab.backendapi.service.BillingService;
import com.epam.datalab.backendapi.service.EndpointService;
import com.epam.datalab.backendapi.service.ProjectService;
import com.epam.datalab.backendapi.util.RequestBuilder;
import com.epam.datalab.cloud.CloudProvider;
import com.epam.datalab.dto.InfrastructureMetaInfoDTO;
import com.epam.datalab.dto.UserEnvironmentResources;
import com.epam.datalab.dto.UserInstanceDTO;
import com.epam.datalab.dto.UserInstanceStatus;
import com.epam.datalab.dto.aws.edge.EdgeInfoAws;
import com.epam.datalab.dto.azure.edge.EdgeInfoAzure;
import com.epam.datalab.dto.base.DataEngineType;
import com.epam.datalab.dto.billing.BillingResourceType;
import com.epam.datalab.dto.computational.UserComputationalResource;
import com.epam.datalab.dto.gcp.edge.EdgeInfoGcp;
import com.epam.datalab.dto.status.EnvResource;
import com.epam.datalab.dto.status.EnvResourceList;
import com.epam.datalab.rest.client.RESTService;
import com.jcabi.manifests.Manifests;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import static org.junit.Assert.assertEquals;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyBoolean;
import static org.mockito.Matchers.anyListOf;
import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions;
import static org.mockito.Mockito.when;
@RunWith(MockitoJUnitRunner.class)
public class InfrastructureInfoServiceImplTest extends TestBase {
private static final String PROJECT = "project";
private static final String EXPLORATORY_NAME = "exploratoryName";
private static final String COMPUTE_NAME = "computeName";
private static final String CURRENCY = "currency";
private static final String UUID = "uuid";
private static final String INFRASTRUCTURE_STATUS = "infrastructure/status";
@Mock
private ExploratoryDAO expDAO;
@Mock
private SelfServiceApplicationConfiguration configuration;
@Mock
private ProjectService projectService;
@Mock
private EndpointService endpointService;
@Mock
private BillingService billingService;
@Mock
private RESTService provisioningService;
@Mock
private RequestBuilder requestBuilder;
@Mock
private RequestId requestId;
@InjectMocks
private InfrastructureInfoServiceImpl infoService;
@Test
public void getUserResources() {
when(endpointService.getEndpoints()).thenReturn(Collections.singletonList(getEndpointDTO()));
when(projectService.getUserProjects(any(UserInfo.class), anyBoolean())).thenReturn(Collections.singletonList(getProjectDTO()));
when(expDAO.findExploratories(anyString(), anyString())).thenReturn(getUserInstanceDTOs());
when(billingService.getBillingProjectQuoteUsed(anyString())).thenReturn(10);
when(projectService.get(anyString())).thenReturn(getProjectDTO());
when(billingService.getExploratoryBillingData(anyString(), anyString(), anyString(), anyListOf(String.class))).thenReturn(getReport());
List<ProjectInfrastructureInfo> actualUserResources = infoService.getUserResources(getUserInfo());
assertEquals("resources should be equal", getProjectInfrastructureInfo(), actualUserResources);
verify(endpointService).getEndpoints();
verify(projectService).getUserProjects(getUserInfo(), Boolean.FALSE);
verify(expDAO).findExploratories(USER.toLowerCase(), PROJECT);
verify(billingService).getBillingProjectQuoteUsed(PROJECT);
verify(projectService).get(PROJECT);
verify(billingService).getExploratoryBillingData(PROJECT, ENDPOINT_NAME, EXPLORATORY_NAME, Collections.singletonList(COMPUTE_NAME));
verifyNoMoreInteractions(endpointService, projectService, expDAO, billingService);
}
@Test
public void getAwsUserResources() {
when(endpointService.getEndpoints()).thenReturn(Collections.singletonList(getEndpointDTO()));
when(projectService.getUserProjects(any(UserInfo.class), anyBoolean())).thenReturn(Collections.singletonList(getAwsProjectDTO()));
when(expDAO.findExploratories(anyString(), anyString())).thenReturn(getUserInstanceDTOs());
when(billingService.getBillingProjectQuoteUsed(anyString())).thenReturn(10);
when(projectService.get(anyString())).thenReturn(getAwsProjectDTO());
when(billingService.getExploratoryBillingData(anyString(), anyString(), anyString(), anyListOf(String.class))).thenReturn(getReport());
List<ProjectInfrastructureInfo> actualUserResources = infoService.getUserResources(getUserInfo());
assertEquals("resources should be equal", getAwsProjectInfrastructureInfo(), actualUserResources);
verify(endpointService).getEndpoints();
verify(projectService).getUserProjects(getUserInfo(), Boolean.FALSE);
verify(expDAO).findExploratories(USER.toLowerCase(), PROJECT);
verify(billingService).getBillingProjectQuoteUsed(PROJECT);
verify(projectService).get(PROJECT);
verify(billingService).getExploratoryBillingData(PROJECT, ENDPOINT_NAME, EXPLORATORY_NAME, Collections.singletonList(COMPUTE_NAME));
verifyNoMoreInteractions(endpointService, projectService, expDAO, billingService);
}
@Test
public void getAzureUserResources() {
when(endpointService.getEndpoints()).thenReturn(Collections.singletonList(getEndpointDTO()));
when(projectService.getUserProjects(any(UserInfo.class), anyBoolean())).thenReturn(Collections.singletonList(getAzureProjectDTO()));
when(expDAO.findExploratories(anyString(), anyString())).thenReturn(getUserInstanceDTOs());
when(billingService.getBillingProjectQuoteUsed(anyString())).thenReturn(10);
when(projectService.get(anyString())).thenReturn(getAzureProjectDTO());
when(billingService.getExploratoryBillingData(anyString(), anyString(), anyString(), anyListOf(String.class))).thenReturn(getReport());
List<ProjectInfrastructureInfo> actualUserResources = infoService.getUserResources(getUserInfo());
assertEquals("resources should be equal", getAzureProjectInfrastructureInfo(), actualUserResources);
verify(endpointService).getEndpoints();
verify(projectService).getUserProjects(getUserInfo(), Boolean.FALSE);
verify(expDAO).findExploratories(USER.toLowerCase(), PROJECT);
verify(billingService).getBillingProjectQuoteUsed(PROJECT);
verify(projectService).get(PROJECT);
verify(billingService).getExploratoryBillingData(PROJECT, ENDPOINT_NAME, EXPLORATORY_NAME, Collections.singletonList(COMPUTE_NAME));
verifyNoMoreInteractions(endpointService, projectService, expDAO, billingService);
}
@Test
public void getGcpUserResources() {
when(endpointService.getEndpoints()).thenReturn(Collections.singletonList(getEndpointDTO()));
when(projectService.getUserProjects(any(UserInfo.class), anyBoolean())).thenReturn(Collections.singletonList(getGcpProjectDTO()));
when(expDAO.findExploratories(anyString(), anyString())).thenReturn(getUserInstanceDTOs());
when(billingService.getBillingProjectQuoteUsed(anyString())).thenReturn(10);
when(projectService.get(anyString())).thenReturn(getGcpProjectDTO());
when(billingService.getExploratoryBillingData(anyString(), anyString(), anyString(), anyListOf(String.class))).thenReturn(getReport());
List<ProjectInfrastructureInfo> actualUserResources = infoService.getUserResources(getUserInfo());
assertEquals("resources should be equal", getGcpProjectInfrastructureInfo(), actualUserResources);
verify(endpointService).getEndpoints();
verify(projectService).getUserProjects(getUserInfo(), Boolean.FALSE);
verify(expDAO).findExploratories(USER.toLowerCase(), PROJECT);
verify(billingService).getBillingProjectQuoteUsed(PROJECT);
verify(projectService).get(PROJECT);
verify(billingService).getExploratoryBillingData(PROJECT, ENDPOINT_NAME, EXPLORATORY_NAME, Collections.singletonList(COMPUTE_NAME));
verifyNoMoreInteractions(endpointService, projectService, expDAO, billingService);
}
@Test
public void getHeathStatus() {
when(configuration.isBillingSchedulerEnabled()).thenReturn(Boolean.TRUE);
when(configuration.isAuditEnabled()).thenReturn(Boolean.TRUE);
when(projectService.isAnyProjectAssigned(any(UserInfo.class))).thenReturn(Boolean.TRUE);
HealthStatusPageDTO actualHeathStatus = infoService.getHeathStatus(getUserInfo());
assertEquals("HealthStatusPageDTO should be equal", getHealthStatusPageDTO(), actualHeathStatus);
verify(projectService).isAnyProjectAssigned(getUserInfo());
verify(configuration).isBillingSchedulerEnabled();
verify(configuration).isAuditEnabled();
verifyNoMoreInteractions(configuration, projectService);
}
@Test
public void getInfrastructureMetaInfo() {
Manifests.DEFAULT.put("GIT-Branch", "branch");
Manifests.DEFAULT.put("GIT-Commit", "commit");
Manifests.DEFAULT.put("DataLab-Version", "version");
InfrastructureMetaInfoDTO actualInfrastructureMetaInfo = infoService.getInfrastructureMetaInfo();
assertEquals("InfrastructureMetaInfoDTO should be equal", getInfrastructureMetaInfoDTO(), actualInfrastructureMetaInfo);
}
@Test
public void updateInfrastructureStatuses() {
List<EnvResource> envResources = Collections.singletonList(new EnvResource().withId("id"));
when(endpointService.get(anyString())).thenReturn(getEndpointDTO());
when(provisioningService.post(anyString(), anyString(), any(UserEnvironmentResources.class), any())).thenReturn(UUID);
when(requestBuilder.newInfrastructureStatus(anyString(), any(CloudProvider.class), any(EnvResourceList.class))).thenReturn(
new UserEnvironmentResources());
infoService.updateInfrastructureStatuses(getUserInfo(), ENDPOINT_NAME, envResources, envResources);
verify(endpointService).get(ENDPOINT_NAME);
verify(requestBuilder).newInfrastructureStatus(USER.toLowerCase(), CloudProvider.AWS, new EnvResourceList()
.withHostList(envResources)
.withClusterList(envResources));
verify(provisioningService).post(ENDPOINT_URL + INFRASTRUCTURE_STATUS, TOKEN, new UserEnvironmentResources(), String.class);
verify(requestId).put(USER.toLowerCase(), UUID);
verifyNoMoreInteractions(endpointService, provisioningService, requestBuilder, requestId);
}
private InfrastructureMetaInfoDTO getInfrastructureMetaInfoDTO() {
return InfrastructureMetaInfoDTO.builder()
.branch("branch")
.commit("commit")
.version("version")
.releaseNotes("https://github.com/apache/incubator-datalab/blob/branch/RELEASE_NOTES.md")
.build();
}
private HealthStatusPageDTO getHealthStatusPageDTO() {
return HealthStatusPageDTO.builder()
.status("ok")
.listResources(Collections.emptyList())
.billingEnabled(Boolean.TRUE)
.auditEnabled(Boolean.TRUE)
.projectAdmin(Boolean.FALSE)
.admin(Boolean.FALSE)
.projectAssigned(Boolean.TRUE)
.bucketBrowser(HealthStatusPageDTO.BucketBrowser.builder()
.view(Boolean.TRUE)
.upload(Boolean.TRUE)
.download(Boolean.TRUE)
.delete(Boolean.TRUE)
.build())
.build();
}
private List<ProjectInfrastructureInfo> getProjectInfrastructureInfo() {
List<ProjectInfrastructureInfo> objects = new ArrayList<>();
objects.add(ProjectInfrastructureInfo.builder()
.project(PROJECT)
.billingQuoteUsed(10)
.shared(Collections.singletonMap(ENDPOINT_NAME, Collections.emptyMap()))
.exploratory(getUserInstanceDTOs())
.exploratoryBilling(Collections.singletonList(getReport()))
.endpoints(Collections.singletonList(getEndpointDTO()))
.build());
return objects;
}
private List<ProjectInfrastructureInfo> getAwsProjectInfrastructureInfo() {
List<ProjectInfrastructureInfo> objects = new ArrayList<>();
objects.add(ProjectInfrastructureInfo.builder()
.project(PROJECT)
.billingQuoteUsed(10)
.shared(Collections.singletonMap(ENDPOINT_NAME, getAwsEdgeInfo()))
.exploratory(getUserInstanceDTOs())
.exploratoryBilling(Collections.singletonList(getReport()))
.endpoints(Collections.singletonList(getEndpointDTO()))
.build());
return objects;
}
private List<ProjectInfrastructureInfo> getAzureProjectInfrastructureInfo() {
List<ProjectInfrastructureInfo> objects = new ArrayList<>();
objects.add(ProjectInfrastructureInfo.builder()
.project(PROJECT)
.billingQuoteUsed(10)
.shared(Collections.singletonMap(ENDPOINT_NAME, getAzureEdgeInfo()))
.exploratory(getUserInstanceDTOs())
.exploratoryBilling(Collections.singletonList(getReport()))
.endpoints(Collections.singletonList(getEndpointDTO()))
.build());
return objects;
}
private List<ProjectInfrastructureInfo> getGcpProjectInfrastructureInfo() {
List<ProjectInfrastructureInfo> objects = new ArrayList<>();
objects.add(ProjectInfrastructureInfo.builder()
.project(PROJECT)
.billingQuoteUsed(10)
.shared(Collections.singletonMap(ENDPOINT_NAME, getGcpEdgeInfo()))
.exploratory(getUserInstanceDTOs())
.exploratoryBilling(Collections.singletonList(getReport()))
.endpoints(Collections.singletonList(getEndpointDTO()))
.build());
return objects;
}
private Map<String, String> getAwsEdgeInfo() {
HashMap<String, String> edge = new HashMap<>();
edge.put("status", "running");
edge.put("edge_node_ip", "publicIp");
edge.put("user_own_bicket_name", "ownBucketName");
edge.put("shared_bucket_name", "sharedBucketName");
return edge;
}
private Map<String, String> getAzureEdgeInfo() {
HashMap<String, String> edge = new HashMap<>();
edge.put("status", "running");
edge.put("edge_node_ip", "publicIp");
edge.put("user_container_name", "userContainerName");
edge.put("shared_container_name", "sharedContainerName");
edge.put("user_storage_account_name", "userStorageAccountName");
edge.put("shared_storage_account_name", "sharedStorageAccountName");
edge.put("datalake_name", "dataLakeName");
edge.put("datalake_user_directory_name", "dataLakeDirectoryName");
edge.put("datalake_shared_directory_name", "dataLakeSharedDirectoryName");
return edge;
}
private Map<String, String> getGcpEdgeInfo() {
HashMap<String, String> edge = new HashMap<>();
edge.put("status", "running");
edge.put("edge_node_ip", "publicIp");
edge.put("user_own_bucket_name", "ownBucketName");
edge.put("shared_bucket_name", "sharedBucketName");
return edge;
}
private ProjectDTO getProjectDTO() {
return ProjectDTO.builder()
.name(PROJECT)
.endpoints(Collections.singletonList(new ProjectEndpointDTO(ENDPOINT_NAME, UserInstanceStatus.RUNNING, null)))
.build();
}
private ProjectDTO getAwsProjectDTO() {
EdgeInfoAws edgeInfoAws = new EdgeInfoAws();
edgeInfoAws.setPublicIp("publicIp");
edgeInfoAws.setUserOwnBucketName("ownBucketName");
edgeInfoAws.setSharedBucketName("sharedBucketName");
return ProjectDTO.builder()
.name(PROJECT)
.endpoints(Collections.singletonList(new ProjectEndpointDTO(ENDPOINT_NAME, UserInstanceStatus.RUNNING, edgeInfoAws)))
.build();
}
private ProjectDTO getAzureProjectDTO() {
EdgeInfoAzure edgeInfoAzure = new EdgeInfoAzure();
edgeInfoAzure.setPublicIp("publicIp");
edgeInfoAzure.setUserContainerName("userContainerName");
edgeInfoAzure.setSharedContainerName("sharedContainerName");
edgeInfoAzure.setUserStorageAccountName("userStorageAccountName");
edgeInfoAzure.setSharedStorageAccountName("sharedStorageAccountName");
edgeInfoAzure.setDataLakeName("dataLakeName");
edgeInfoAzure.setDataLakeDirectoryName("dataLakeDirectoryName");
edgeInfoAzure.setDataLakeSharedDirectoryName("dataLakeSharedDirectoryName");
return ProjectDTO.builder()
.name(PROJECT)
.endpoints(Collections.singletonList(new ProjectEndpointDTO(ENDPOINT_NAME, UserInstanceStatus.RUNNING, edgeInfoAzure)))
.build();
}
private ProjectDTO getGcpProjectDTO() {
EdgeInfoGcp edgeInfoGcp = new EdgeInfoGcp();
edgeInfoGcp.setPublicIp("publicIp");
edgeInfoGcp.setUserOwnBucketName("ownBucketName");
edgeInfoGcp.setSharedBucketName("sharedBucketName");
return ProjectDTO.builder()
.name(PROJECT)
.endpoints(Collections.singletonList(new ProjectEndpointDTO(ENDPOINT_NAME, UserInstanceStatus.RUNNING, edgeInfoGcp)))
.build();
}
private List<UserInstanceDTO> getUserInstanceDTOs() {
return Collections.singletonList(
new UserInstanceDTO().withUser(USER).withProject(PROJECT).withExploratoryName(EXPLORATORY_NAME).withEndpoint(ENDPOINT_NAME)
.withResources(Collections.singletonList(getCompute()))
);
}
private UserComputationalResource getCompute() {
UserComputationalResource resource = new UserComputationalResource();
resource.setComputationalName(COMPUTE_NAME);
resource.setImageName(DataEngineType.SPARK_STANDALONE.getName());
return resource;
}
private BillingReport getReport() {
BillingReportLine line1 = BillingReportLine.builder().cost(1.0).user(USER).resourceType(BillingResourceType.EXPLORATORY).project(PROJECT).endpoint(ENDPOINT_NAME)
.resourceName(EXPLORATORY_NAME).currency(CURRENCY).build();
BillingReportLine line2 = BillingReportLine.builder().cost(1.0).user(USER).resourceType(BillingResourceType.COMPUTATIONAL).project(PROJECT).endpoint(ENDPOINT_NAME)
.resourceName(COMPUTE_NAME).exploratoryName(EXPLORATORY_NAME).currency(CURRENCY).build();
List<BillingReportLine> billingReportLines = Arrays.asList(line1, line2);
return BillingReport.builder()
.name(EXPLORATORY_NAME)
.reportLines(billingReportLines)
.totalCost(2.0)
.currency(CURRENCY)
.build();
}
}