You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@dlab.apache.org by of...@apache.org on 2020/03/26 16:40:52 UTC
[incubator-dlab] branch DLAB-1571 updated: Refactoring local billing
This is an automated email from the ASF dual-hosted git repository.
ofuks pushed a commit to branch DLAB-1571
in repository https://gitbox.apache.org/repos/asf/incubator-dlab.git
The following commit(s) were added to refs/heads/DLAB-1571 by this push:
new 4b7abeb Refactoring local billing
4b7abeb is described below
commit 4b7abeb99b1afbc6bf84eadc5ba89863c918c5c6
Author: Oleh Fuks <ol...@gmail.com>
AuthorDate: Thu Mar 26 18:40:35 2020 +0200
Refactoring local billing
---
.../com/epam/dlab/billing/DlabResourceType.java | 86 -----
.../epam/dlab/backendapi/dao/BaseBillingDAO.java | 358 ---------------------
.../com/epam/dlab/backendapi/dao/BillingDAO.java | 6 -
.../dlab/backendapi/dao/aws/AwsBillingDAO.java | 74 -----
.../dlab/backendapi/dao/azure/AzureBillingDAO.java | 121 -------
.../dlab/backendapi/dao/gcp/GcpBillingDao.java | 65 ----
.../com/epam/dlab/backendapi/domain/BaseShape.java | 23 --
.../backendapi/domain/DataEngineServiceShape.java | 37 ---
.../dlab/backendapi/domain/DataEngineShape.java | 34 --
.../epam/dlab/backendapi/domain/EndpointShape.java | 14 -
.../dlab/backendapi/domain/ExploratoryShape.java | 14 -
.../com/epam/dlab/backendapi/domain/SsnShape.java | 14 -
.../backendapi/modules/AwsSelfServiceModule.java | 83 -----
.../backendapi/modules/AzureSelfServiceModule.java | 81 -----
.../backendapi/modules/CloudProviderModule.java | 32 +-
.../backendapi/modules/GcpSelfServiceModule.java | 84 -----
.../dlab/backendapi/modules/ModuleFactory.java | 13 -
.../dlab/backendapi/resources/BillingResource.java | 26 +-
.../dlab/backendapi/service/BillingService.java | 80 +----
.../dlab/backendapi/service/BillingServiceNew.java | 39 ---
.../epam/dlab/backendapi/service/ShapeFormat.java | 5 -
.../backendapi/service/aws/AwsBillingService.java | 110 -------
.../service/azure/AzureBillingService.java | 116 -------
.../backendapi/service/gcp/GcpBillingService.java | 104 ------
...ServiceImplNew.java => BillingServiceImpl.java} | 10 +-
.../impl/InfrastructureInfoServiceImpl.java | 10 +-
.../service/aws/AwsBillingServiceTest.java | 224 -------------
.../service/azure/AzureBillingServiceTest.java | 208 ------------
28 files changed, 24 insertions(+), 2047 deletions(-)
diff --git a/services/common/src/main/java/com/epam/dlab/billing/DlabResourceType.java b/services/common/src/main/java/com/epam/dlab/billing/DlabResourceType.java
index 54a590e..dfec0dc 100644
--- a/services/common/src/main/java/com/epam/dlab/billing/DlabResourceType.java
+++ b/services/common/src/main/java/com/epam/dlab/billing/DlabResourceType.java
@@ -19,10 +19,6 @@
package com.epam.dlab.billing;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
public enum DlabResourceType {
SSN,
SSN_BUCKET,
@@ -51,88 +47,6 @@ public enum DlabResourceType {
return null;
}
- public static String getResourceTypeName(String id) {
- DlabResourceType resourceTypeId = DlabResourceType.of(id);
- if (resourceTypeId != null) {
- switch (resourceTypeId) {
- case COMPUTATIONAL:
- return "Cluster";
- case EXPLORATORY:
- return "Notebook";
- case EDGE:
- return "Edge Node";
- case VOLUME:
- return "Volume";
- case EDGE_BUCKET:
- case SSN_BUCKET:
- case COLLABORATION_BUCKET:
- return "Bucket";
- case EDGE_CONTAINER:
- case SSN_CONTAINER:
- case COLLABORATION_CONTAINER:
- return "Container";
- case SSN_STORAGE_ACCOUNT:
- case EDGE_STORAGE_ACCOUNT:
- case COLLABORATION_STORAGE_ACCOUNT:
- return "Storage Account";
- case SSN:
- return "SSN";
- case DATA_LAKE_STORE:
- return "Data Lake Store Account";
- }
- }
- return id;
- }
-
- public static List<String> getResourceTypeIds(List<String> names) {
- if (names == null || names.isEmpty()) {
- return Collections.emptyList();
- }
-
- List<String> list = new ArrayList<>();
- names.forEach(e -> {
- switch (e) {
- case "Cluster":
- list.add(DlabResourceType.COMPUTATIONAL.toString());
- break;
- case "Notebook":
- list.add(DlabResourceType.EXPLORATORY.toString());
- break;
- case "Edge Node":
- list.add(DlabResourceType.EDGE.toString());
- break;
- case "Bucket":
- list.add(DlabResourceType.EDGE_BUCKET.toString());
- list.add(DlabResourceType.SSN_BUCKET.toString());
- list.add(DlabResourceType.COLLABORATION_BUCKET.toString());
- break;
- case "Container":
- list.add(DlabResourceType.EDGE_CONTAINER.toString());
- list.add(DlabResourceType.SSN_CONTAINER.toString());
- list.add(DlabResourceType.COLLABORATION_CONTAINER.toString());
- break;
- case "SSN":
- list.add(DlabResourceType.SSN.toString());
- break;
- case "Storage Account":
- list.add(DlabResourceType.SSN_STORAGE_ACCOUNT.toString());
- list.add(DlabResourceType.EDGE_STORAGE_ACCOUNT.toString());
- list.add(DlabResourceType.COLLABORATION_STORAGE_ACCOUNT.toString());
- break;
- case "Data Lake Store Account":
- list.add(DlabResourceType.DATA_LAKE_STORE.toString());
- break;
- case "Volume":
- list.add(DlabResourceType.VOLUME.toString());
- break;
- default:
- list.add(e);
- }
- });
-
- return list;
- }
-
@Override
public String toString() {
return super.toString().toUpperCase();
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/BaseBillingDAO.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/BaseBillingDAO.java
index 71223db..31f9b4d 100644
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/BaseBillingDAO.java
+++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/BaseBillingDAO.java
@@ -19,89 +19,33 @@
package com.epam.dlab.backendapi.dao;
-import com.epam.dlab.MongoKeyWords;
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.domain.BaseShape;
-import com.epam.dlab.backendapi.domain.DataEngineServiceShape;
-import com.epam.dlab.backendapi.domain.DataEngineShape;
-import com.epam.dlab.backendapi.domain.EndpointShape;
-import com.epam.dlab.backendapi.domain.ExploratoryShape;
-import com.epam.dlab.backendapi.domain.SsnShape;
-import com.epam.dlab.backendapi.resources.dto.BillingFilter;
-import com.epam.dlab.backendapi.roles.RoleType;
-import com.epam.dlab.backendapi.roles.UserRoles;
-import com.epam.dlab.billing.BillingCalculationUtils;
-import com.epam.dlab.billing.DlabResourceType;
-import com.epam.dlab.dto.UserInstanceStatus;
-import com.epam.dlab.dto.base.DataEngineType;
-import com.epam.dlab.model.aws.ReportLine;
-import com.google.common.collect.Lists;
import com.google.inject.Inject;
-import com.mongodb.client.AggregateIterable;
-import com.mongodb.client.FindIterable;
-import com.mongodb.client.model.Aggregates;
-import com.mongodb.client.model.Filters;
import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.lang3.StringUtils;
-import org.bson.Document;
import org.bson.conversions.Bson;
import java.math.BigDecimal;
-import java.util.ArrayList;
import java.util.Arrays;
-import java.util.HashMap;
import java.util.List;
-import java.util.Map;
import java.util.Optional;
import java.util.function.Supplier;
-import java.util.stream.StreamSupport;
-import static com.epam.dlab.backendapi.dao.ComputationalDAO.COMPUTATIONAL_ID;
-import static com.epam.dlab.backendapi.dao.ExploratoryDAO.COMPUTATIONAL_RESOURCES;
-import static com.epam.dlab.backendapi.dao.ExploratoryDAO.EXPLORATORY_ID;
import static com.epam.dlab.backendapi.dao.MongoCollections.BILLING;
-import static com.epam.dlab.backendapi.dao.MongoCollections.USER_INSTANCES;
-import static com.epam.dlab.model.aws.ReportLine.FIELD_RESOURCE_TYPE;
-import static com.epam.dlab.model.aws.ReportLine.FIELD_USAGE_DATE;
import static com.mongodb.client.model.Accumulators.sum;
import static com.mongodb.client.model.Aggregates.group;
import static com.mongodb.client.model.Aggregates.match;
import static com.mongodb.client.model.Filters.eq;
-import static com.mongodb.client.model.Filters.gte;
-import static com.mongodb.client.model.Filters.in;
-import static com.mongodb.client.model.Filters.lte;
-import static com.mongodb.client.model.Filters.regex;
-import static com.mongodb.client.model.Projections.excludeId;
-import static com.mongodb.client.model.Projections.fields;
-import static com.mongodb.client.model.Projections.include;
import static java.util.Collections.singletonList;
@Slf4j
public abstract class BaseBillingDAO extends BaseDAO implements BillingDAO {
- public static final String SHAPE = "shape";
- public static final String SERVICE_BASE_NAME = "service_base_name";
public static final String ITEMS = "lines";
- public static final String COST_TOTAL = "cost_total";
public static final String FULL_REPORT = "full_report";
-
private static final String PROJECT = "project";
- private static final String MASTER_NODE_SHAPE = "master_node_shape";
- private static final String SLAVE_NODE_SHAPE = "slave_node_shape";
- private static final String TOTAL_INSTANCE_NUMBER = "total_instance_number";
-
- private static final String DATAENGINE_SHAPE = "dataengine_instance_shape";
- private static final String DATAENGINE_INSTANCE_COUNT = "dataengine_instance_count";
-
- private static final String DATAENGINE_DOCKER_IMAGE = "image";
private static final int ONE_HUNDRED = 100;
private static final String TOTAL_FIELD_NAME = "total";
private static final String COST_FIELD = "$cost";
public static final String SHARED_RESOURCE_NAME = "Shared resource";
- protected static final String FIELD_PROJECT = "project";
- private static final String EDGE_FORMAT = "%s-%s-%s-edge";
- private static final String PROJECT_COLLECTION = "Projects";
- private static final String TAGS = "tags";
@Inject
protected SettingsDAO settings;
@@ -111,160 +55,6 @@ public abstract class BaseBillingDAO extends BaseDAO implements BillingDAO {
private ProjectDAO projectDAO;
@Override
- public Document getReport(UserInfo userInfo, BillingFilter filter) {
- boolean isFullReport = UserRoles.checkAccess(userInfo, RoleType.PAGE, "/api/infrastructure_provision/billing",
- userInfo.getRoles());
- setUserFilter(userInfo, filter, isFullReport);
- List<Bson> matchCriteria = matchCriteria(filter);
- List<Bson> pipeline = new ArrayList<>();
- if (!matchCriteria.isEmpty()) {
- pipeline.add(Aggregates.match(Filters.and(matchCriteria)));
- }
- pipeline.add(groupCriteria());
- pipeline.add(sortCriteria());
- final Map<String, BaseShape> shapes = getShapes(filter.getShapes());
- return prepareReport(filter.getStatuses(), !filter.getShapes().isEmpty(),
- getCollection(BILLING).aggregate(pipeline), shapes, isFullReport);
- }
-
- private Document prepareReport(List<UserInstanceStatus> statuses, boolean filterByShape,
- AggregateIterable<Document> agg,
- Map<String, BaseShape> shapes, boolean fullReport) {
-
- List<Document> reportItems = new ArrayList<>();
-
- String usageDateStart = null;
- String usageDateEnd = null;
- double costTotal = 0D;
-
- for (Document d : agg) {
- Document id = (Document) d.get(MongoKeyWords.MONGO_ID);
- String resourceId = id.getString(dlabIdFieldName());
- BaseShape shape = shapes.get(resourceId);
- final UserInstanceStatus status = Optional.ofNullable(shape).map(BaseShape::getStatus).orElse(null);
- if ((filterByShape && shape == null) ||
- (!statuses.isEmpty() && statuses.stream().noneMatch(s -> s.equals(status)))) {
- continue;
- }
-
-
- String dateStart = d.getString(MongoKeyWords.USAGE_FROM);
- if (StringUtils.compare(usageDateStart, dateStart, false) > 0) {
- usageDateStart = dateStart;
- }
- String dateEnd = d.getString(MongoKeyWords.USAGE_TO);
- if (StringUtils.compare(usageDateEnd, dateEnd) < 0) {
- usageDateEnd = dateEnd;
- }
-
-
- costTotal += d.getDouble(MongoKeyWords.COST);
-
- final String dlabResourceType = id.getString("dlab_resource_type");
- final String statusString = Optional
- .ofNullable(status)
- .map(UserInstanceStatus::toString)
- .orElse(StringUtils.EMPTY);
-
- Document item = new Document()
- .append(MongoKeyWords.DLAB_USER, getOrDefault(id.getString(USER)))
- .append(dlabIdFieldName(), resourceId)
- .append(shapeFieldName(), Optional.ofNullable(shape).map(BaseShape::format)
- .orElse(StringUtils.EMPTY))
- .append("dlab_resource_type", DlabResourceType
- .getResourceTypeName(dlabResourceType)) //todo check on azure!!!
- .append(STATUS, statusString)
- .append(FIELD_RESOURCE_TYPE, resourceType(id))
- .append(productFieldName(), id.getString(productFieldName()))
- .append(PROJECT, getOrDefault(id.getString(PROJECT)))
- .append(MongoKeyWords.COST, d.getDouble(MongoKeyWords.COST))
- .append(costFieldName(), BillingCalculationUtils.formatDouble(d.getDouble(MongoKeyWords
- .COST)))
- .append(currencyCodeFieldName(), id.getString(currencyCodeFieldName()))
- .append(usageDateFromFieldName(), dateStart)
- .append(usageDateToFieldName(), dateEnd);
-
- reportItems.add(item);
- }
-
- return new Document()
- .append(SERVICE_BASE_NAME, settings.getServiceBaseName())
- .append(usageDateFromFieldName(), usageDateStart)
- .append(usageDateToFieldName(), usageDateEnd)
- .append(ITEMS, reportItems)
- .append(COST_TOTAL, BillingCalculationUtils.formatDouble(BillingCalculationUtils.round
- (costTotal, 2)))
- .append(currencyCodeFieldName(), (reportItems.isEmpty() ? null :
- reportItems.get(0).getString(currencyCodeFieldName())))
- .append(FULL_REPORT, fullReport);
-
- }
-
- protected String resourceType(Document id) {
- return id.getString(FIELD_RESOURCE_TYPE);
- }
-
- protected String currencyCodeFieldName() {
- return "currency_code";
- }
-
- protected String usageDateToFieldName() {
- return MongoKeyWords.USAGE_TO;
- }
-
- protected String costFieldName() {
- return MongoKeyWords.COST;
- }
-
- protected String productFieldName() {
- return ReportLine.FIELD_PRODUCT;
- }
-
- protected String usageDateFromFieldName() {
- return MongoKeyWords.USAGE_FROM;
- }
-
- protected String dlabIdFieldName() {
- return ReportLine.FIELD_DLAB_ID;
- }
-
- protected String shapeFieldName() {
- return SHAPE;
- }
-
- protected abstract Bson sortCriteria();
-
- protected abstract Bson groupCriteria();
-
- private Map<String, BaseShape> getShapes(List<String> shapeNames) {
- FindIterable<Document> userInstances = getUserInstances();
- final Map<String, BaseShape> shapes = new HashMap<>();
-
- for (Document d : userInstances) {
- getExploratoryShape(shapeNames, d)
- .ifPresent(shape -> shapes.put(d.getString(EXPLORATORY_ID), shape));
- @SuppressWarnings("unchecked")
- List<Document> comp = (List<Document>) d.get(COMPUTATIONAL_RESOURCES);
- comp.forEach(c -> (isDataEngine(c.getString(DATAENGINE_DOCKER_IMAGE)) ? getDataEngineShape(shapeNames, c) :
- getDataEngineServiceShape(shapeNames, c))
- .ifPresent(shape -> shapes.put(c.getString(COMPUTATIONAL_ID), shape)));
- }
-
- StreamSupport.stream(getCollection(PROJECT_COLLECTION).find().spliterator(), false)
- .forEach(d -> ((List<Document>) d.get("endpoints"))
- .forEach(endpoint -> getEndpointShape(shapeNames, endpoint)
- .ifPresent(shape -> shapes.put(String.format(EDGE_FORMAT, getServiceBaseName(),
- d.getString("name").toLowerCase(),
- endpoint.getString("name")), shape))));
-
- getSsnShape(shapeNames)
- .ifPresent(shape -> shapes.put(getServiceBaseName() + "-ssn", shape));
-
- log.trace("Loaded shapes is {}", shapes);
- return shapes;
- }
-
- @Override
public Double getTotalCost() {
return aggregateBillingData(singletonList(group(null, sum(TOTAL_FIELD_NAME, COST_FIELD))));
}
@@ -306,7 +96,6 @@ public abstract class BaseBillingDAO extends BaseDAO implements BillingDAO {
.isPresent();
}
-
@Override
public boolean isProjectQuoteReached(String project) {
final Double projectCost = getProjectCost(project);
@@ -320,10 +109,6 @@ public abstract class BaseBillingDAO extends BaseDAO implements BillingDAO {
return toPercentage(() -> projectDAO.getAllowedBudget(project), getProjectCost(project));
}
- private String getOrDefault(String value) {
- return StringUtils.isNotBlank(value) ? value : SHARED_RESOURCE_NAME;
- }
-
private Integer toPercentage(Supplier<Optional<Integer>> allowedBudget, Double totalCost) {
return allowedBudget.get()
.map(userBudget -> (totalCost * ONE_HUNDRED) / userBudget)
@@ -331,152 +116,9 @@ public abstract class BaseBillingDAO extends BaseDAO implements BillingDAO {
.orElse(BigDecimal.ZERO.intValue());
}
- private List<Bson> matchCriteria(BillingFilter filter) {
-
- List<Bson> searchCriteria = new ArrayList<>();
-
- if (filter.getUsers() != null && !filter.getUsers().isEmpty()) {
- searchCriteria.add(Filters.in(MongoKeyWords.DLAB_USER, filter.getUsers()));
- }
-
- if (filter.getResourceTypes() != null && !filter.getResourceTypes().isEmpty()) {
- searchCriteria.add(Filters.in("dlab_resource_type",
- DlabResourceType.getResourceTypeIds(filter.getResourceTypes())));
- }
-
- if (filter.getDlabId() != null && !filter.getDlabId().isEmpty()) {
- searchCriteria.add(regex(dlabIdFieldName(), filter.getDlabId(), "i"));
- }
-
- if (filter.getDateStart() != null && !filter.getDateStart().isEmpty()) {
- searchCriteria.add(gte(FIELD_USAGE_DATE, filter.getDateStart()));
- }
- if (filter.getDateEnd() != null && !filter.getDateEnd().isEmpty()) {
- searchCriteria.add(lte(FIELD_USAGE_DATE, filter.getDateEnd()));
- }
- if (filter.getProjects() != null && !filter.getProjects().isEmpty()) {
- searchCriteria.add(in(PROJECT, filter.getProjects()));
- }
-
- searchCriteria.addAll(cloudMatchCriteria(filter));
- return searchCriteria;
- }
-
- protected abstract List<Bson> cloudMatchCriteria(BillingFilter filter);
-
private Double aggregateBillingData(List<Bson> pipeline) {
return Optional.ofNullable(aggregate(BILLING, pipeline).first())
.map(d -> d.getDouble(TOTAL_FIELD_NAME))
.orElse(BigDecimal.ZERO.doubleValue());
}
-
- private FindIterable<Document> getUserInstances() {
- return getCollection(USER_INSTANCES)
- .find()
- .projection(
- fields(excludeId(),
- include(SHAPE, EXPLORATORY_ID, STATUS, TAGS,
- COMPUTATIONAL_RESOURCES + "." + COMPUTATIONAL_ID,
- COMPUTATIONAL_RESOURCES + "." + MASTER_NODE_SHAPE,
- COMPUTATIONAL_RESOURCES + "." + SLAVE_NODE_SHAPE,
- COMPUTATIONAL_RESOURCES + "." + TOTAL_INSTANCE_NUMBER,
- COMPUTATIONAL_RESOURCES + "." + DATAENGINE_SHAPE,
- COMPUTATIONAL_RESOURCES + "." + DATAENGINE_INSTANCE_COUNT,
- COMPUTATIONAL_RESOURCES + "." + DATAENGINE_DOCKER_IMAGE,
- COMPUTATIONAL_RESOURCES + "." + STATUS,
- COMPUTATIONAL_RESOURCES + "." + TAGS
- )));
- }
-
- private Optional<ExploratoryShape> getExploratoryShape(List<String> shapeNames, Document d) {
- final String shape = d.getString(SHAPE);
- if (isShapeAcceptable(shapeNames, shape)) {
- return Optional.of(ExploratoryShape.builder()
- .shape(shape)
- .status(UserInstanceStatus.of(d.getString(STATUS)))
- .tags((Map<String, String>) d.get(TAGS))
- .build());
- }
- return Optional.empty();
- }
-
- private Optional<DataEngineServiceShape> getDataEngineServiceShape(List<String> shapeNames, Document c) {
- final String desMasterShape = c.getString(MASTER_NODE_SHAPE);
- final String desSlaveShape = c.getString(SLAVE_NODE_SHAPE);
- if (isShapeAcceptable(shapeNames, desMasterShape, desSlaveShape)) {
- return Optional.of(DataEngineServiceShape.builder()
- .shape(desMasterShape)
- .status(UserInstanceStatus.of(c.getString(STATUS)))
- .slaveCount(c.getString(TOTAL_INSTANCE_NUMBER))
- .slaveShape(desSlaveShape)
- .tags((Map<String, String>) c.get(TAGS))
- .build());
- }
- return Optional.empty();
- }
-
- private Optional<DataEngineShape> getDataEngineShape(List<String> shapeNames, Document c) {
- final String shape = c.getString(DATAENGINE_SHAPE);
- if ((isShapeAcceptable(shapeNames, shape)) && StringUtils.isNotEmpty(c.getString(COMPUTATIONAL_ID))) {
-
- return Optional.of(DataEngineShape.builder()
- .shape(shape)
- .status(UserInstanceStatus.of(c.getString(STATUS)))
- .slaveCount(c.getString(DATAENGINE_INSTANCE_COUNT))
- .tags((Map<String, String>) c.get(TAGS))
- .build());
- }
- return Optional.empty();
- }
-
- private Optional<SsnShape> getSsnShape(List<String> shapeNames) {
- final String shape = getSsnShape();
- if (isShapeAcceptable(shapeNames, shape)) {
- return Optional.of(SsnShape.builder()
- .shape(shape)
- .status(UserInstanceStatus.RUNNING)
- .build());
- }
- return Optional.empty();
- }
-
- private Optional<EndpointShape> getEndpointShape(List<String> shapeNames, Document endpoint) {
- if (isShapeAcceptable(shapeNames, getSsnShape())) {
- return Optional.of(EndpointShape.builder()
- .shape(StringUtils.EMPTY)
- .status(UserInstanceStatus.of(endpoint.getString("status")))
- .build());
- }
- return Optional.empty();
- }
-
- private boolean isDataEngine(String dockerImage) {
- return DataEngineType.fromDockerImageName(dockerImage) == DataEngineType.SPARK_STANDALONE;
- }
-
- private boolean isShapeAcceptable(List<String> shapeNames, String... shapes) {
- return shapeNames == null || shapeNames.isEmpty() || Arrays.stream(shapes).anyMatch(shapeNames::contains);
- }
-
- protected String getServiceBaseName() {
- return settings.getServiceBaseName();
- }
-
- protected String getSsnShape() {
- return settings.getSsnInstanceSize();
- }
-
- protected void usersToLowerCase(List<String> users) {
- if (users != null) {
- users.replaceAll(u -> u != null ? u.toLowerCase() : null);
- }
- }
-
- protected void setUserFilter(UserInfo userInfo, BillingFilter filter, boolean isFullReport) {
- if (isFullReport) {
- usersToLowerCase(filter.getUsers());
- } else {
- filter.setUsers(Lists.newArrayList(userInfo.getName().toLowerCase()));
- }
- }
}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/BillingDAO.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/BillingDAO.java
index 1ea06b8..d50c62f 100644
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/BillingDAO.java
+++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/BillingDAO.java
@@ -18,10 +18,6 @@
*/
package com.epam.dlab.backendapi.dao;
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.resources.dto.BillingFilter;
-import org.bson.Document;
-
public interface BillingDAO {
Double getTotalCost();
@@ -40,6 +36,4 @@ public interface BillingDAO {
boolean isUserQuoteReached(String user);
boolean isProjectQuoteReached(String project);
-
- Document getReport(UserInfo userInfo, BillingFilter filter);
}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/aws/AwsBillingDAO.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/aws/AwsBillingDAO.java
deleted file mode 100644
index fde1d8f..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/aws/AwsBillingDAO.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * 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.dlab.backendapi.dao.aws;
-
-import com.epam.dlab.MongoKeyWords;
-import com.epam.dlab.backendapi.dao.BaseBillingDAO;
-import com.epam.dlab.backendapi.resources.dto.BillingFilter;
-import org.bson.Document;
-import org.bson.conversions.Bson;
-
-import java.util.Collections;
-import java.util.List;
-
-import static com.epam.dlab.model.aws.ReportLine.FIELD_COST;
-import static com.epam.dlab.model.aws.ReportLine.FIELD_CURRENCY_CODE;
-import static com.epam.dlab.model.aws.ReportLine.FIELD_DLAB_ID;
-import static com.epam.dlab.model.aws.ReportLine.FIELD_PRODUCT;
-import static com.epam.dlab.model.aws.ReportLine.FIELD_RESOURCE_TYPE;
-import static com.epam.dlab.model.aws.ReportLine.FIELD_USAGE_DATE;
-import static com.mongodb.client.model.Accumulators.max;
-import static com.mongodb.client.model.Accumulators.min;
-import static com.mongodb.client.model.Accumulators.sum;
-import static com.mongodb.client.model.Aggregates.group;
-import static com.mongodb.client.model.Aggregates.sort;
-
-/**
- * DAO for user billing.
- */
-public class AwsBillingDAO extends BaseBillingDAO {
-
- public static final String DLAB_RESOURCE_TYPE = "dlab_resource_type";
- public static final String USAGE_DATE_START = "from";
- public static final String USAGE_DATE_END = "to";
- public static final String TAG_RESOURCE_ID = "tag_resource_id";
-
- @Override
- protected Bson sortCriteria() {
- return sort(new Document(ID + "." + USER, 1)
- .append(ID + "." + FIELD_DLAB_ID, 1)
- .append(ID + "." + DLAB_RESOURCE_TYPE, 1)
- .append(ID + "." + FIELD_PRODUCT, 1));
- }
-
- @Override
- protected Bson groupCriteria() {
- return group(getGroupingFields(USER, FIELD_DLAB_ID, DLAB_RESOURCE_TYPE, FIELD_PRODUCT, FIELD_RESOURCE_TYPE,
- FIELD_CURRENCY_CODE, FIELD_PROJECT),
- sum(FIELD_COST, "$" + FIELD_COST),
- min(MongoKeyWords.USAGE_FROM, "$" + FIELD_USAGE_DATE),
- max(MongoKeyWords.USAGE_TO, "$" + FIELD_USAGE_DATE));
- }
-
- @Override
- protected List<Bson> cloudMatchCriteria(BillingFilter filter) {
- return Collections.emptyList();
- }
-}
\ No newline at end of file
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/azure/AzureBillingDAO.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/azure/AzureBillingDAO.java
deleted file mode 100644
index 8eeb52c..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/azure/AzureBillingDAO.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- * 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.dlab.backendapi.dao.azure;
-
-import com.epam.dlab.MongoKeyWords;
-import com.epam.dlab.backendapi.dao.BaseBillingDAO;
-import com.epam.dlab.backendapi.resources.dto.BillingFilter;
-import com.epam.dlab.billing.DlabResourceType;
-import com.google.inject.Singleton;
-import com.mongodb.client.model.Accumulators;
-import com.mongodb.client.model.Aggregates;
-import com.mongodb.client.model.Filters;
-import com.mongodb.client.model.Sorts;
-import lombok.extern.slf4j.Slf4j;
-import org.bson.Document;
-import org.bson.conversions.Bson;
-
-import java.util.Collections;
-import java.util.List;
-
-@Singleton
-@Slf4j
-public class AzureBillingDAO extends BaseBillingDAO {
- public static final String SIZE = "size";
-
- @Override
- protected List<Bson> cloudMatchCriteria(BillingFilter filter) {
- if (!filter.getProducts().isEmpty()) {
- return Collections.singletonList(Filters.in(MongoKeyWords.METER_CATEGORY, filter.getProducts()));
- } else {
- return Collections.emptyList();
- }
- }
-
- @Override
- protected Bson groupCriteria() {
- return Aggregates.group(getGroupingFields(
- MongoKeyWords.DLAB_USER,
- MongoKeyWords.DLAB_ID,
- MongoKeyWords.RESOURCE_TYPE,
- MongoKeyWords.METER_CATEGORY,
- MongoKeyWords.CURRENCY_CODE,
- FIELD_PROJECT),
- Accumulators.sum(MongoKeyWords.COST, MongoKeyWords.prepend$(MongoKeyWords.COST)),
- Accumulators.min(MongoKeyWords.USAGE_FROM, MongoKeyWords.prepend$(MongoKeyWords.USAGE_DAY)),
- Accumulators.max(MongoKeyWords.USAGE_TO, MongoKeyWords.prepend$(MongoKeyWords.USAGE_DAY))
- );
- }
-
- @Override
- protected Bson sortCriteria() {
- return Aggregates.sort(Sorts.ascending(
- MongoKeyWords.prependId(MongoKeyWords.DLAB_USER),
- MongoKeyWords.prependId(MongoKeyWords.DLAB_ID),
- MongoKeyWords.prependId(MongoKeyWords.RESOURCE_TYPE),
- MongoKeyWords.prependId(MongoKeyWords.METER_CATEGORY)));
- }
-
- @Override
- protected String getServiceBaseName() {
- return settings.getServiceBaseName().replace("_", "-").toLowerCase();
- }
-
- @Override
- protected String shapeFieldName() {
- return SIZE;
- }
-
- @Override
- protected String dlabIdFieldName() {
- return MongoKeyWords.DLAB_ID;
- }
-
- @Override
- protected String productFieldName() {
- return MongoKeyWords.METER_CATEGORY;
- }
-
- @Override
- protected String costFieldName() {
- return MongoKeyWords.COST_STRING;
- }
-
- @Override
- protected String usageDateFromFieldName() {
- return MongoKeyWords.USAGE_FROM;
- }
-
- @Override
- protected String usageDateToFieldName() {
- return MongoKeyWords.USAGE_TO;
- }
-
- @Override
- protected String currencyCodeFieldName() {
- return MongoKeyWords.CURRENCY_CODE;
- }
-
- @Override
- protected String resourceType(Document id) {
- return DlabResourceType.getResourceTypeName(id.getString(MongoKeyWords.RESOURCE_TYPE));
- }
-
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/gcp/GcpBillingDao.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/gcp/GcpBillingDao.java
deleted file mode 100644
index 1105066..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/dao/gcp/GcpBillingDao.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * 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.dlab.backendapi.dao.gcp;
-
-import com.epam.dlab.backendapi.dao.BaseBillingDAO;
-import com.epam.dlab.backendapi.resources.dto.BillingFilter;
-import org.bson.Document;
-import org.bson.conversions.Bson;
-
-import java.util.Collections;
-import java.util.List;
-
-import static com.epam.dlab.MongoKeyWords.USAGE_FROM;
-import static com.epam.dlab.MongoKeyWords.USAGE_TO;
-import static com.epam.dlab.backendapi.dao.aws.AwsBillingDAO.DLAB_RESOURCE_TYPE;
-import static com.epam.dlab.model.aws.ReportLine.FIELD_COST;
-import static com.epam.dlab.model.aws.ReportLine.FIELD_DLAB_ID;
-import static com.epam.dlab.model.aws.ReportLine.FIELD_PRODUCT;
-import static com.epam.dlab.model.aws.ReportLine.FIELD_USAGE_DATE;
-import static com.mongodb.client.model.Accumulators.max;
-import static com.mongodb.client.model.Accumulators.min;
-import static com.mongodb.client.model.Accumulators.sum;
-import static com.mongodb.client.model.Aggregates.group;
-import static com.mongodb.client.model.Aggregates.sort;
-
-public class GcpBillingDao extends BaseBillingDAO {
- @Override
- protected Bson sortCriteria() {
- return sort(new Document(ID + "." + USER, 1)
- .append(ID + "." + FIELD_DLAB_ID, 1)
- .append(ID + "." + FIELD_PRODUCT, 1));
- }
-
- @Override
- protected Bson groupCriteria() {
- return group(getGroupingFields(USER, FIELD_DLAB_ID, DLAB_RESOURCE_TYPE, FIELD_PRODUCT,
- currencyCodeFieldName(), FIELD_PROJECT),
- sum(FIELD_COST, "$" + FIELD_COST),
- min(USAGE_FROM, "$" + FIELD_USAGE_DATE),
- max(USAGE_TO, "$" + FIELD_USAGE_DATE)
- );
- }
-
- @Override
- protected List<Bson> cloudMatchCriteria(BillingFilter filter) {
- return Collections.emptyList();
- }
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/BaseShape.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/BaseShape.java
deleted file mode 100644
index 4a56034..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/BaseShape.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package com.epam.dlab.backendapi.domain;
-
-import com.epam.dlab.backendapi.service.ShapeFormat;
-import com.epam.dlab.dto.UserInstanceStatus;
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-import java.util.Map;
-
-@Data
-@AllArgsConstructor
-@NoArgsConstructor
-public class BaseShape implements ShapeFormat {
- protected String shape;
- protected UserInstanceStatus status;
- protected Map<String, String> tags;
-
- @Override
- public String format() {
- return shape;
- }
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/DataEngineServiceShape.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/DataEngineServiceShape.java
deleted file mode 100644
index 73c0193..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/DataEngineServiceShape.java
+++ /dev/null
@@ -1,37 +0,0 @@
-package com.epam.dlab.backendapi.domain;
-
-import com.epam.dlab.backendapi.service.ShapeFormat;
-import com.epam.dlab.dto.UserInstanceStatus;
-import lombok.Builder;
-import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.lang3.StringUtils;
-
-import java.util.Map;
-
-
-@Slf4j
-public class DataEngineServiceShape extends BaseShape implements ShapeFormat {
- private static final String DES_NAME_FORMAT = "Master: %s%sSlave: %d x %s";
- private String slaveCount;
- private String slaveShape;
-
- @Builder
- public DataEngineServiceShape(String shape, UserInstanceStatus status, String slaveCount, String slaveShape,
- Map<String, String> tags) {
- super(shape, status, tags);
- this.slaveCount = slaveCount;
- this.slaveShape = slaveShape;
- }
-
- @Override
- public String format() {
- Integer count;
- try {
- count = Integer.valueOf(slaveCount);
- } catch (NumberFormatException e) {
- log.error("Cannot parse string {} to integer", slaveCount);
- return StringUtils.EMPTY;
- }
- return String.format(DES_NAME_FORMAT, shape, System.lineSeparator(), count - 1, slaveShape);
- }
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/DataEngineShape.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/DataEngineShape.java
deleted file mode 100644
index 8d4c003..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/DataEngineShape.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package com.epam.dlab.backendapi.domain;
-
-import com.epam.dlab.backendapi.service.ShapeFormat;
-import com.epam.dlab.dto.UserInstanceStatus;
-import lombok.Builder;
-import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.lang3.StringUtils;
-
-import java.util.Map;
-
-@Slf4j
-public class DataEngineShape extends BaseShape implements ShapeFormat {
- private static final String DE_NAME_FORMAT = "%d x %s";
- private String slaveCount;
-
-
- @Builder
- public DataEngineShape(String shape, UserInstanceStatus status, String slaveCount, Map<String, String> tags) {
- super(shape, status, tags);
- this.slaveCount = slaveCount;
- }
-
- @Override
- public String format() {
- Integer count;
- try {
- count = Integer.valueOf(slaveCount);
- } catch (NumberFormatException e) {
- log.error("Cannot parse string {} to integer", slaveCount);
- return StringUtils.EMPTY;
- }
- return String.format(DE_NAME_FORMAT, count, shape);
- }
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/EndpointShape.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/EndpointShape.java
deleted file mode 100644
index 5f41cad..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/EndpointShape.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package com.epam.dlab.backendapi.domain;
-
-import com.epam.dlab.dto.UserInstanceStatus;
-import lombok.Builder;
-
-import java.util.Collections;
-
-public class EndpointShape extends BaseShape {
-
- @Builder
- public EndpointShape(String shape, UserInstanceStatus status) {
- super(shape, status, Collections.emptyMap());
- }
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/ExploratoryShape.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/ExploratoryShape.java
deleted file mode 100644
index 74ceab0..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/ExploratoryShape.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package com.epam.dlab.backendapi.domain;
-
-import com.epam.dlab.dto.UserInstanceStatus;
-import lombok.Builder;
-
-import java.util.Map;
-
-public class ExploratoryShape extends BaseShape {
-
- @Builder
- public ExploratoryShape(String shape, UserInstanceStatus status, Map<String, String> tags) {
- super(shape, status, tags);
- }
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/SsnShape.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/SsnShape.java
deleted file mode 100644
index a38a99e..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/domain/SsnShape.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package com.epam.dlab.backendapi.domain;
-
-import com.epam.dlab.dto.UserInstanceStatus;
-import lombok.Builder;
-
-import java.util.Collections;
-
-public class SsnShape extends BaseShape {
-
- @Builder
- public SsnShape(String shape, UserInstanceStatus status) {
- super(shape, status, Collections.emptyMap());
- }
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/modules/AwsSelfServiceModule.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/modules/AwsSelfServiceModule.java
deleted file mode 100644
index 0fd45de..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/modules/AwsSelfServiceModule.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * 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.dlab.backendapi.modules;
-
-import com.epam.dlab.backendapi.SelfServiceApplication;
-import com.epam.dlab.backendapi.annotation.BudgetLimited;
-import com.epam.dlab.backendapi.conf.SelfServiceApplicationConfiguration;
-import com.epam.dlab.backendapi.dao.BillingDAO;
-import com.epam.dlab.backendapi.dao.aws.AwsBillingDAO;
-import com.epam.dlab.backendapi.interceptor.BudgetLimitInterceptor;
-import com.epam.dlab.backendapi.resources.aws.ComputationalResourceAws;
-import com.epam.dlab.backendapi.service.BillingService;
-import com.epam.dlab.backendapi.service.aws.AwsBillingService;
-import com.epam.dlab.cloud.CloudModule;
-import com.epam.dlab.mongo.MongoServiceFactory;
-import com.fiestacabin.dropwizard.quartz.SchedulerConfiguration;
-import com.google.inject.Injector;
-import com.google.inject.Provides;
-import com.google.inject.Singleton;
-import io.dropwizard.setup.Environment;
-import org.quartz.Scheduler;
-import org.quartz.SchedulerException;
-import org.quartz.impl.StdSchedulerFactory;
-
-import static com.google.inject.matcher.Matchers.annotatedWith;
-import static com.google.inject.matcher.Matchers.any;
-
-public class AwsSelfServiceModule extends CloudModule {
-
- private static final String MONGO_URI_FORMAT = "mongodb://%s:%s@%s:%d/%s";
- private static final String QUARTZ_MONGO_URI_PROPERTY = "org.quartz.jobStore.mongoUri";
- private static final String QUARTZ_DB_NAME = "org.quartz.jobStore.dbName";
-
- @Override
- protected void configure() {
- bind(BillingService.class).to(AwsBillingService.class);
- bind(SchedulerConfiguration.class).toInstance(
- new SchedulerConfiguration(SelfServiceApplication.class.getPackage().getName()));
- bind(BillingDAO.class).to(AwsBillingDAO.class);
- final BudgetLimitInterceptor budgetLimitInterceptor = new BudgetLimitInterceptor();
- requestInjection(budgetLimitInterceptor);
- bindInterceptor(any(), annotatedWith(BudgetLimited.class), budgetLimitInterceptor);
- }
-
- @Override
- public void init(Environment environment, Injector injector) {
- environment.jersey().register(injector.getInstance(ComputationalResourceAws.class));
-//
-
- /*injector.getInstance(SecurityFactory.class).configure(injector, environment,
- SelfServiceSecurityAuthenticator.class, injector.getInstance(Authorizer.class));*/
- }
-
-
- @Provides
- @Singleton
- Scheduler provideScheduler(SelfServiceApplicationConfiguration configuration) throws SchedulerException {
- final MongoServiceFactory mongoFactory = configuration.getMongoFactory();
- final String database = mongoFactory.getDatabase();
- final String mongoUri = String.format(MONGO_URI_FORMAT, mongoFactory.getUsername(), mongoFactory.getPassword(),
- mongoFactory.getHost(), mongoFactory.getPort(), database);
- System.setProperty(QUARTZ_MONGO_URI_PROPERTY, mongoUri);
- System.setProperty(QUARTZ_DB_NAME, database);
- return StdSchedulerFactory.getDefaultScheduler();
- }
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/modules/AzureSelfServiceModule.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/modules/AzureSelfServiceModule.java
deleted file mode 100644
index ee04041..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/modules/AzureSelfServiceModule.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * 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.dlab.backendapi.modules;
-
-import com.epam.dlab.backendapi.SelfServiceApplication;
-import com.epam.dlab.backendapi.annotation.BudgetLimited;
-import com.epam.dlab.backendapi.conf.SelfServiceApplicationConfiguration;
-import com.epam.dlab.backendapi.dao.BillingDAO;
-import com.epam.dlab.backendapi.dao.azure.AzureBillingDAO;
-import com.epam.dlab.backendapi.interceptor.BudgetLimitInterceptor;
-import com.epam.dlab.backendapi.resources.azure.ComputationalResourceAzure;
-import com.epam.dlab.backendapi.service.BillingService;
-import com.epam.dlab.backendapi.service.azure.AzureBillingService;
-import com.epam.dlab.cloud.CloudModule;
-import com.epam.dlab.mongo.MongoServiceFactory;
-import com.fiestacabin.dropwizard.quartz.SchedulerConfiguration;
-import com.google.inject.Injector;
-import com.google.inject.Provides;
-import com.google.inject.Singleton;
-import io.dropwizard.setup.Environment;
-import lombok.extern.slf4j.Slf4j;
-import org.quartz.Scheduler;
-import org.quartz.SchedulerException;
-import org.quartz.impl.StdSchedulerFactory;
-
-import static com.google.inject.matcher.Matchers.annotatedWith;
-import static com.google.inject.matcher.Matchers.any;
-
-@Slf4j
-public class AzureSelfServiceModule extends CloudModule {
-
- private static final String MONGO_URI_FORMAT = "mongodb://%s:%s@%s:%d/%s";
- private static final String QUARTZ_MONGO_URI_PROPERTY = "org.quartz.jobStore.mongoUri";
- private static final String QUARTZ_DB_NAME = "org.quartz.jobStore.dbName";
-
- @Override
- protected void configure() {
- bind(BillingService.class).to(AzureBillingService.class);
- bind(SchedulerConfiguration.class).toInstance(
- new SchedulerConfiguration(SelfServiceApplication.class.getPackage().getName()));
- bind(BillingDAO.class).to(AzureBillingDAO.class);
- final BudgetLimitInterceptor budgetLimitInterceptor = new BudgetLimitInterceptor();
- requestInjection(budgetLimitInterceptor);
- bindInterceptor(any(), annotatedWith(BudgetLimited.class), budgetLimitInterceptor);
- }
-
- @Override
- public void init(Environment environment, Injector injector) {
- environment.jersey().register(injector.getInstance(ComputationalResourceAzure.class));
-
- }
-
- @Provides
- @Singleton
- Scheduler provideScheduler(SelfServiceApplicationConfiguration configuration) throws SchedulerException {
- final MongoServiceFactory mongoFactory = configuration.getMongoFactory();
- final String database = mongoFactory.getDatabase();
- final String mongoUri = String.format(MONGO_URI_FORMAT, mongoFactory.getUsername(), mongoFactory.getPassword(),
- mongoFactory.getHost(), mongoFactory.getPort(), database);
- System.setProperty(QUARTZ_MONGO_URI_PROPERTY, mongoUri);
- System.setProperty(QUARTZ_DB_NAME, database);
- return StdSchedulerFactory.getDefaultScheduler();
- }
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/modules/CloudProviderModule.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/modules/CloudProviderModule.java
index 0ee0d10..f251b01 100644
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/modules/CloudProviderModule.java
+++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/modules/CloudProviderModule.java
@@ -22,10 +22,6 @@ package com.epam.dlab.backendapi.modules;
import com.epam.dlab.backendapi.SelfServiceApplication;
import com.epam.dlab.backendapi.annotation.BudgetLimited;
import com.epam.dlab.backendapi.conf.SelfServiceApplicationConfiguration;
-import com.epam.dlab.backendapi.dao.BillingDAO;
-import com.epam.dlab.backendapi.dao.aws.AwsBillingDAO;
-import com.epam.dlab.backendapi.dao.azure.AzureBillingDAO;
-import com.epam.dlab.backendapi.dao.gcp.GcpBillingDao;
import com.epam.dlab.backendapi.interceptor.BudgetLimitInterceptor;
import com.epam.dlab.backendapi.resources.BillingResource;
import com.epam.dlab.backendapi.resources.aws.ComputationalResourceAws;
@@ -33,13 +29,9 @@ import com.epam.dlab.backendapi.resources.azure.ComputationalResourceAzure;
import com.epam.dlab.backendapi.resources.gcp.ComputationalResourceGcp;
import com.epam.dlab.backendapi.resources.gcp.GcpOauthResource;
import com.epam.dlab.backendapi.service.BillingService;
-import com.epam.dlab.backendapi.service.BillingServiceNew;
import com.epam.dlab.backendapi.service.InfrastructureInfoService;
import com.epam.dlab.backendapi.service.InfrastructureTemplateService;
-import com.epam.dlab.backendapi.service.aws.AwsBillingService;
-import com.epam.dlab.backendapi.service.azure.AzureBillingService;
-import com.epam.dlab.backendapi.service.gcp.GcpBillingService;
-import com.epam.dlab.backendapi.service.impl.BillingServiceImplNew;
+import com.epam.dlab.backendapi.service.impl.BillingServiceImpl;
import com.epam.dlab.backendapi.service.impl.InfrastructureInfoServiceImpl;
import com.epam.dlab.backendapi.service.impl.InfrastructureTemplateServiceImpl;
import com.epam.dlab.cloud.CloudModule;
@@ -70,8 +62,7 @@ public class CloudProviderModule extends CloudModule {
@Override
protected void configure() {
- bindBilling();
- bind(BillingServiceNew.class).to(BillingServiceImplNew.class);
+ bind(BillingService.class).to(BillingServiceImpl.class);
bind(InfrastructureInfoService.class).to(InfrastructureInfoServiceImpl.class);
bind(InfrastructureTemplateService.class).to(InfrastructureTemplateServiceImpl.class);
bind(SchedulerConfiguration.class).toInstance(
@@ -104,23 +95,4 @@ public class CloudProviderModule extends CloudModule {
System.setProperty(QUARTZ_DB_NAME, database);
return StdSchedulerFactory.getDefaultScheduler();
}
-
- private void bindBilling() {
- switch (configuration.getCloudProvider()) {
- case AWS:
- bind(BillingService.class).to(AwsBillingService.class);
- bind(BillingDAO.class).to(AwsBillingDAO.class);
- break;
- case AZURE:
- bind(BillingService.class).to(AzureBillingService.class);
- bind(BillingDAO.class).to(AzureBillingDAO.class);
- break;
- case GCP:
- bind(BillingService.class).to(GcpBillingService.class);
- bind(BillingDAO.class).to(GcpBillingDao.class);
- break;
- default:
- throw new UnsupportedOperationException("Unsupported cloud provider " + configuration.getCloudProvider());
- }
- }
}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/modules/GcpSelfServiceModule.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/modules/GcpSelfServiceModule.java
deleted file mode 100644
index 276238e..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/modules/GcpSelfServiceModule.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * 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.dlab.backendapi.modules;
-
-import com.epam.dlab.backendapi.SelfServiceApplication;
-import com.epam.dlab.backendapi.annotation.BudgetLimited;
-import com.epam.dlab.backendapi.conf.SelfServiceApplicationConfiguration;
-import com.epam.dlab.backendapi.dao.BillingDAO;
-import com.epam.dlab.backendapi.dao.gcp.GcpBillingDao;
-import com.epam.dlab.backendapi.interceptor.BudgetLimitInterceptor;
-import com.epam.dlab.backendapi.resources.gcp.ComputationalResourceGcp;
-import com.epam.dlab.backendapi.resources.gcp.GcpOauthResource;
-import com.epam.dlab.backendapi.service.BillingService;
-import com.epam.dlab.backendapi.service.gcp.GcpBillingService;
-import com.epam.dlab.cloud.CloudModule;
-import com.epam.dlab.mongo.MongoServiceFactory;
-import com.fiestacabin.dropwizard.quartz.SchedulerConfiguration;
-import com.google.inject.Injector;
-import com.google.inject.Provides;
-import com.google.inject.Singleton;
-import io.dropwizard.setup.Environment;
-import org.quartz.Scheduler;
-import org.quartz.SchedulerException;
-import org.quartz.impl.StdSchedulerFactory;
-
-import static com.google.inject.matcher.Matchers.annotatedWith;
-import static com.google.inject.matcher.Matchers.any;
-
-public class GcpSelfServiceModule extends CloudModule {
-
- private static final String MONGO_URI_FORMAT = "mongodb://%s:%s@%s:%d/%s";
- private static final String QUARTZ_MONGO_URI_PROPERTY = "org.quartz.jobStore.mongoUri";
- private static final String QUARTZ_DB_NAME = "org.quartz.jobStore.dbName";
-
- @Override
- @SuppressWarnings("unchecked")
- public void init(Environment environment, Injector injector) {
- environment.jersey().register(injector.getInstance(ComputationalResourceGcp.class));
- if (injector.getInstance(SelfServiceApplicationConfiguration.class).isGcpOuauth2AuthenticationEnabled()) {
- environment.jersey().register(injector.getInstance(GcpOauthResource.class));
- }
-
- }
-
- @Override
- protected void configure() {
- bind(BillingService.class).to(GcpBillingService.class);
- bind(BillingDAO.class).to(GcpBillingDao.class);
- bind(SchedulerConfiguration.class).toInstance(
- new SchedulerConfiguration(SelfServiceApplication.class.getPackage().getName()));
- final BudgetLimitInterceptor budgetLimitInterceptor = new BudgetLimitInterceptor();
- requestInjection(budgetLimitInterceptor);
- bindInterceptor(any(), annotatedWith(BudgetLimited.class), budgetLimitInterceptor);
- }
-
- @Provides
- @Singleton
- Scheduler provideScheduler(SelfServiceApplicationConfiguration configuration) throws SchedulerException {
- final MongoServiceFactory mongoFactory = configuration.getMongoFactory();
- final String database = mongoFactory.getDatabase();
- final String mongoUri = String.format(MONGO_URI_FORMAT, mongoFactory.getUsername(), mongoFactory.getPassword(),
- mongoFactory.getHost(), mongoFactory.getPort(), database);
- System.setProperty(QUARTZ_MONGO_URI_PROPERTY, mongoUri);
- System.setProperty(QUARTZ_DB_NAME, database);
- return StdSchedulerFactory.getDefaultScheduler();
- }
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/modules/ModuleFactory.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/modules/ModuleFactory.java
index 1480fe7..eb8d3bc 100644
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/modules/ModuleFactory.java
+++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/modules/ModuleFactory.java
@@ -48,17 +48,4 @@ public class ModuleFactory {
public static CloudModule getCloudProviderModule(SelfServiceApplicationConfiguration configuration) {
return new CloudProviderModule(configuration);
}
-
- private static CloudModule getCloudModule(SelfServiceApplicationConfiguration configuration) {
- switch (configuration.getCloudProvider()) {
- case AWS:
- return new AwsSelfServiceModule();
- case AZURE:
- return new AzureSelfServiceModule();
- case GCP:
- return new GcpSelfServiceModule();
- default:
- throw new UnsupportedOperationException("Unsupported cloud provider " + configuration.getCloudProvider());
- }
- }
}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/BillingResource.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/BillingResource.java
index 54e3695..1916a38 100644
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/BillingResource.java
+++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/BillingResource.java
@@ -22,7 +22,6 @@ package com.epam.dlab.backendapi.resources;
import com.epam.dlab.auth.UserInfo;
import com.epam.dlab.backendapi.resources.dto.BillingFilter;
import com.epam.dlab.backendapi.service.BillingService;
-import com.epam.dlab.backendapi.service.BillingServiceNew;
import com.google.inject.Inject;
import io.dropwizard.auth.Auth;
@@ -41,43 +40,24 @@ import javax.ws.rs.core.Response;
public class BillingResource {
private final BillingService billingService;
- private final BillingServiceNew billingServiceNew;
@Inject
- public BillingResource(BillingService billingService, BillingServiceNew billingServiceNew) {
+ public BillingResource(BillingService billingService) {
this.billingService = billingService;
- this.billingServiceNew = billingServiceNew;
}
-// @POST
-// @Path("/report")
-// @Produces(MediaType.APPLICATION_JSON)
-// public Document getBillingReport(@Auth UserInfo userInfo, @Valid @NotNull BillingFilter formDTO) {
-// return billingService.getBillingReport(userInfo, formDTO);
-// }
-//
-// @POST
-// @Path("/report/download")
-// @Produces(MediaType.APPLICATION_OCTET_STREAM)
-// public Response downloadBillingReport(@Auth UserInfo userInfo, @Valid @NotNull BillingFilter formDTO) {
-// return Response.ok(billingService.downloadReport(userInfo, formDTO))
-// .header(HttpHeaders.CONTENT_DISPOSITION,
-// "attachment; filename=\"" + billingService.getReportFileName(userInfo, formDTO) + "\"")
-// .build();
-// }
-
@POST
@Path("/report")
@Produces(MediaType.APPLICATION_JSON)
public Response getBillingReport(@Auth UserInfo userInfo, @Valid @NotNull BillingFilter filter) {
- return Response.ok(billingServiceNew.getBillingReport(userInfo, filter)).build();
+ return Response.ok(billingService.getBillingReport(userInfo, filter)).build();
}
@POST
@Path("/report/download")
@Produces(MediaType.APPLICATION_OCTET_STREAM)
public Response downloadBillingReport(@Auth UserInfo userInfo, @Valid @NotNull BillingFilter filter) {
- return Response.ok(billingServiceNew.downloadReport(userInfo, filter))
+ return Response.ok(billingService.downloadReport(userInfo, filter))
.header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"billing-report.csv\"")
.build();
}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/BillingService.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/BillingService.java
index c16bd10..40a5c14 100644
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/BillingService.java
+++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/BillingService.java
@@ -20,82 +20,20 @@
package com.epam.dlab.backendapi.service;
import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.dao.BaseBillingDAO;
-import com.epam.dlab.backendapi.dao.BillingDAO;
+import com.epam.dlab.backendapi.domain.BillingReport;
+import com.epam.dlab.backendapi.domain.BillingReportLine;
import com.epam.dlab.backendapi.resources.dto.BillingFilter;
-import com.epam.dlab.backendapi.util.CSVFormatter;
-import com.epam.dlab.exceptions.DlabException;
-import com.google.inject.Inject;
-import jersey.repackaged.com.google.common.collect.Lists;
-import lombok.extern.slf4j.Slf4j;
-import org.bson.Document;
+import com.epam.dlab.dto.UserInstanceDTO;
+import com.epam.dlab.dto.billing.BillingData;
-import java.text.ParseException;
import java.util.List;
-@Slf4j
-public abstract class BillingService {
+public interface BillingService {
+ BillingReport getBillingReport(UserInfo userInfo, BillingFilter filter);
- @Inject
- private BillingDAO billingDAO;
+ String downloadReport(UserInfo userInfo, BillingFilter filter);
- public Document getReport(UserInfo userInfo, BillingFilter filter) {
- log.trace("Get billing report for user {} with filter {}", userInfo.getName(), filter);
- try {
- return billingDAO.getReport(userInfo, filter);
- } catch (RuntimeException t) {
- log.error("Cannot load billing report for user {} with filter {}", userInfo.getName(), filter, t);
- throw new DlabException("Cannot load billing report: " + t.getLocalizedMessage(), t);
- }
- }
+ List<BillingReportLine> getBillingReportLines(UserInfo userInfo, BillingFilter filter);
- protected String getValueOrEmpty(Document document, String key) {
- String value = document.getString(key);
- return value == null ? "" : value;
- }
-
- String getHeaders(boolean full) {
- return CSVFormatter.formatLine(getHeadersList(full), CSVFormatter.SEPARATOR);
- }
-
- public Document getBillingReport(UserInfo userInfo, BillingFilter filter) {
- filter.getUsers().replaceAll(s -> s.equalsIgnoreCase(BaseBillingDAO.SHARED_RESOURCE_NAME) ? null : s);
- return getReport(userInfo, filter);
- }
-
- public byte[] downloadReport(UserInfo userInfo, BillingFilter filter) {
- return prepareReport(getReport(userInfo, filter)).getBytes();
- }
-
- String prepareReport(Document document) {
- try {
- StringBuilder builder =
- new StringBuilder(CSVFormatter.formatLine(Lists.newArrayList(getFirstLine(document)),
- CSVFormatter.SEPARATOR, '\"'));
-
- Boolean full = (Boolean) document.get(BaseBillingDAO.FULL_REPORT);
- builder.append(getHeaders(full));
-
- @SuppressWarnings("unchecked")
- List<Document> items = (List<Document>) document.get(BaseBillingDAO.ITEMS);
-
- items.forEach(d -> builder.append(getLine(full, d)));
-
- builder.append(getTotal(full, document));
-
- return builder.toString();
- } catch (ParseException e) {
- throw new DlabException("Cannot prepare CSV file", e);
- }
- }
-
- public abstract String getFirstLine(Document document) throws ParseException;
-
- public abstract List<String> getHeadersList(boolean full);
-
- public abstract String getLine(boolean full, Document document);
-
- public abstract String getTotal(boolean full, Document document);
-
- public abstract String getReportFileName(UserInfo userInfo, BillingFilter filter);
+ List<BillingData> getExploratoryRemoteBillingData(UserInfo user, String endpoint, List<UserInstanceDTO> userInstanceDTOS);
}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/BillingServiceNew.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/BillingServiceNew.java
deleted file mode 100644
index 0ec17a9..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/BillingServiceNew.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * 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.dlab.backendapi.service;
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.domain.BillingReport;
-import com.epam.dlab.backendapi.domain.BillingReportLine;
-import com.epam.dlab.backendapi.resources.dto.BillingFilter;
-import com.epam.dlab.dto.UserInstanceDTO;
-import com.epam.dlab.dto.billing.BillingData;
-
-import java.util.List;
-
-public interface BillingServiceNew {
- BillingReport getBillingReport(UserInfo userInfo, BillingFilter filter);
-
- String downloadReport(UserInfo userInfo, BillingFilter filter);
-
- List<BillingReportLine> getBillingReportLines(UserInfo userInfo, BillingFilter filter);
-
- List<BillingData> getExploratoryRemoteBillingData(UserInfo user, String endpoint, List<UserInstanceDTO> userInstanceDTOS);
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/ShapeFormat.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/ShapeFormat.java
deleted file mode 100644
index da224ab..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/ShapeFormat.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package com.epam.dlab.backendapi.service;
-
-public interface ShapeFormat {
- String format();
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/aws/AwsBillingService.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/aws/AwsBillingService.java
deleted file mode 100644
index eb94ea5..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/aws/AwsBillingService.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- * 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.dlab.backendapi.service.aws;
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.dao.aws.AwsBillingDAO;
-import com.epam.dlab.backendapi.resources.dto.BillingFilter;
-import com.epam.dlab.backendapi.service.BillingService;
-import com.epam.dlab.backendapi.util.CSVFormatter;
-import com.epam.dlab.model.aws.ReportLine;
-import com.google.inject.Singleton;
-import lombok.extern.slf4j.Slf4j;
-import org.bson.Document;
-
-import java.text.ParseException;
-import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.List;
-
-@Slf4j
-@Singleton
-public class AwsBillingService extends BillingService {
-
- @Override
- public String getReportFileName(UserInfo userInfo, BillingFilter filter) {
- return "aws-billing-report.csv";
- }
-
- public String getFirstLine(Document document) throws ParseException {
-
- SimpleDateFormat from = new SimpleDateFormat("yyyy-MM-dd");
- SimpleDateFormat to = new SimpleDateFormat("MMM dd, yyyy");
-
- return String.format("Service base name: %s " +
- "Resource tag ID: %s " +
- "Available reporting period from: %s to: %s",
- document.get(AwsBillingDAO.SERVICE_BASE_NAME), document.get(AwsBillingDAO.TAG_RESOURCE_ID),
- to.format(from.parse((String) document.get(AwsBillingDAO.USAGE_DATE_START))),
- to.format(from.parse((String) document.get(AwsBillingDAO.USAGE_DATE_END))));
-
- }
-
- public List<String> getHeadersList(boolean full) {
- List<String> headers = new ArrayList<>();
-
- if (full) {
- headers.add("USER");
- }
-
- headers.add("PROJECT");
- headers.add("ENVIRONMENT NAME");
- headers.add("RESOURCE TYPE");
- headers.add("SHAPE");
- headers.add("SERVICE");
- headers.add("SERVICE CHARGES");
-
- return headers;
- }
-
- public String getLine(boolean full, Document document) {
- List<String> items = new ArrayList<>();
-
- if (full) {
- items.add(getValueOrEmpty(document, ReportLine.FIELD_USER_ID));
- }
-
- items.add(getValueOrEmpty(document, ReportLine.FIELD_PROJECT));
- items.add(getValueOrEmpty(document, ReportLine.FIELD_DLAB_ID));
- items.add(getValueOrEmpty(document, AwsBillingDAO.DLAB_RESOURCE_TYPE));
- items.add(getValueOrEmpty(document, AwsBillingDAO.SHAPE).replace(System.lineSeparator(), " "));
- items.add(getValueOrEmpty(document, ReportLine.FIELD_PRODUCT));
-
- items.add(getValueOrEmpty(document, ReportLine.FIELD_COST)
- + " " + getValueOrEmpty(document, ReportLine.FIELD_CURRENCY_CODE));
-
- return CSVFormatter.formatLine(items, CSVFormatter.SEPARATOR);
- }
-
- public String getTotal(boolean full, Document document) {
- int padding = getHeadersList(full).size() - 1;
-
- List<String> items = new ArrayList<>();
- while (padding-- > 0) {
- items.add("");
- }
-
- items.add(String.format("Total: %s %s", getValueOrEmpty(document, AwsBillingDAO.COST_TOTAL),
- getValueOrEmpty(document, ReportLine.FIELD_CURRENCY_CODE)));
-
- return CSVFormatter.formatLine(items, CSVFormatter.SEPARATOR);
-
- }
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/azure/AzureBillingService.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/azure/AzureBillingService.java
deleted file mode 100644
index 9ff33a8..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/azure/AzureBillingService.java
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- * 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.dlab.backendapi.service.azure;
-
-import com.epam.dlab.MongoKeyWords;
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.dao.BaseBillingDAO;
-import com.epam.dlab.backendapi.dao.BillingDAO;
-import com.epam.dlab.backendapi.dao.azure.AzureBillingDAO;
-import com.epam.dlab.backendapi.resources.dto.BillingFilter;
-import com.epam.dlab.backendapi.service.BillingService;
-import com.epam.dlab.backendapi.util.CSVFormatter;
-import com.epam.dlab.model.aws.ReportLine;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import lombok.extern.slf4j.Slf4j;
-import org.bson.Document;
-
-import java.text.ParseException;
-import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.List;
-
-@Slf4j
-@Singleton
-public class AzureBillingService extends BillingService {
-
- @Inject
- private BillingDAO billingDAO;
-
- @Override
- public String getReportFileName(UserInfo userInfo, BillingFilter filter) {
- return "azure-billing-report.csv";
- }
-
- @Override
- public String getFirstLine(Document document) throws ParseException {
- SimpleDateFormat from = new SimpleDateFormat("yyyy-MM-dd");
- SimpleDateFormat to = new SimpleDateFormat("MMM dd, yyyy");
-
- return String.format("Service base name: %s " +
- "Available reporting period from: %s to: %s",
- document.get(BaseBillingDAO.SERVICE_BASE_NAME),
- to.format(from.parse((String) document.get(MongoKeyWords.USAGE_FROM))),
- to.format(from.parse((String) document.get(MongoKeyWords.USAGE_TO))));
- }
-
- public List<String> getHeadersList(boolean full) {
- List<String> headers = new ArrayList<>();
-
- if (full) {
- headers.add("USER");
- }
-
- headers.add("PROJECT");
- headers.add("ENVIRONMENT NAME");
- headers.add("RESOURCE TYPE");
- headers.add("INSTANCE SIZE");
- headers.add("CATEGORY");
- headers.add("SERVICE CHARGES");
-
- return headers;
- }
-
- @Override
- public String getLine(boolean full, Document document) {
- List<String> items = new ArrayList<>();
-
- if (full) {
- items.add(getValueOrEmpty(document, MongoKeyWords.DLAB_USER));
- }
-
- items.add(getValueOrEmpty(document, ReportLine.FIELD_PROJECT));
- items.add(getValueOrEmpty(document, MongoKeyWords.DLAB_ID));
- items.add(getValueOrEmpty(document, MongoKeyWords.RESOURCE_TYPE));
- items.add(getValueOrEmpty(document, AzureBillingDAO.SIZE).replace(System.lineSeparator(), " "));
- items.add(getValueOrEmpty(document, MongoKeyWords.METER_CATEGORY));
-
- items.add(getValueOrEmpty(document, MongoKeyWords.COST_STRING)
- + " " + getValueOrEmpty(document, MongoKeyWords.CURRENCY_CODE));
-
- return CSVFormatter.formatLine(items, CSVFormatter.SEPARATOR);
- }
-
- @Override
- public String getTotal(boolean full, Document document) {
- int padding = getHeadersList(full).size() - 1;
-
- List<String> items = new ArrayList<>();
- while (padding-- > 0) {
- items.add("");
- }
-
- items.add(String.format("Total: %s %s", getValueOrEmpty(document, MongoKeyWords.COST_STRING),
- getValueOrEmpty(document, MongoKeyWords.CURRENCY_CODE)));
-
- return CSVFormatter.formatLine(items, CSVFormatter.SEPARATOR);
- }
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/gcp/GcpBillingService.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/gcp/GcpBillingService.java
deleted file mode 100644
index a7599f7..0000000
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/gcp/GcpBillingService.java
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- * 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.dlab.backendapi.service.gcp;
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.dao.aws.AwsBillingDAO;
-import com.epam.dlab.backendapi.resources.dto.BillingFilter;
-import com.epam.dlab.backendapi.service.BillingService;
-import com.epam.dlab.backendapi.util.CSVFormatter;
-import com.epam.dlab.model.aws.ReportLine;
-import org.bson.Document;
-
-import java.text.ParseException;
-import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.List;
-
-public class GcpBillingService extends BillingService {
- @Override
- public String getFirstLine(Document document) throws ParseException {
- SimpleDateFormat from = new SimpleDateFormat("yyyy-MM-dd");
- SimpleDateFormat to = new SimpleDateFormat("MMM dd, yyyy");
-
- return String.format("Service base name: %s Available reporting period from: %s to: %s",
- document.get(AwsBillingDAO.SERVICE_BASE_NAME),
- to.format(from.parse((String) document.get("from"))),
- to.format(from.parse((String) document.get("to"))));
- }
-
- @Override
- public List<String> getHeadersList(boolean full) {
- List<String> headers = new ArrayList<>();
-
- if (full) {
- headers.add("USER");
- }
-
- headers.add("PROJECT");
- headers.add("ENVIRONMENT NAME");
- headers.add("RESOURCE TYPE");
- headers.add("SHAPE");
- headers.add("SERVICE");
- headers.add("SERVICE CHARGES");
-
- return headers;
- }
-
- @Override
- public String getLine(boolean full, Document document) {
- List<String> items = new ArrayList<>();
-
- if (full) {
- items.add(getValueOrEmpty(document, ReportLine.FIELD_USER_ID));
- }
-
- items.add(getValueOrEmpty(document, ReportLine.FIELD_PROJECT));
- items.add(getValueOrEmpty(document, ReportLine.FIELD_DLAB_ID));
- items.add(getValueOrEmpty(document, AwsBillingDAO.DLAB_RESOURCE_TYPE));
- items.add(getValueOrEmpty(document, AwsBillingDAO.SHAPE).replace(System.lineSeparator(), " "));
- items.add(getValueOrEmpty(document, ReportLine.FIELD_PRODUCT));
-
- items.add(getValueOrEmpty(document, ReportLine.FIELD_COST)
- + " " + getValueOrEmpty(document, ReportLine.FIELD_CURRENCY_CODE));
-
- return CSVFormatter.formatLine(items, CSVFormatter.SEPARATOR);
- }
-
- @Override
- public String getTotal(boolean full, Document document) {
- int padding = getHeadersList(full).size() - 1;
-
- List<String> items = new ArrayList<>();
- while (padding-- > 0) {
- items.add("");
- }
-
- items.add(String.format("Total: %s %s", getValueOrEmpty(document, AwsBillingDAO.COST_TOTAL),
- getValueOrEmpty(document, ReportLine.FIELD_CURRENCY_CODE)));
-
- return CSVFormatter.formatLine(items, CSVFormatter.SEPARATOR);
- }
-
- @Override
- public String getReportFileName(UserInfo userInfo, BillingFilter filter) {
- return "gcp-billing-report.csv";
- }
-}
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/BillingServiceImplNew.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/BillingServiceImpl.java
similarity index 96%
rename from services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/BillingServiceImplNew.java
rename to services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/BillingServiceImpl.java
index d922461..100dd00 100644
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/BillingServiceImplNew.java
+++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/BillingServiceImpl.java
@@ -29,7 +29,7 @@ import com.epam.dlab.backendapi.domain.ProjectEndpointDTO;
import com.epam.dlab.backendapi.resources.dto.BillingFilter;
import com.epam.dlab.backendapi.roles.RoleType;
import com.epam.dlab.backendapi.roles.UserRoles;
-import com.epam.dlab.backendapi.service.BillingServiceNew;
+import com.epam.dlab.backendapi.service.BillingService;
import com.epam.dlab.backendapi.service.EndpointService;
import com.epam.dlab.backendapi.service.ExploratoryService;
import com.epam.dlab.backendapi.service.ProjectService;
@@ -69,7 +69,7 @@ import java.util.stream.Collectors;
import java.util.stream.Stream;
@Slf4j
-public class BillingServiceImplNew implements BillingServiceNew {
+public class BillingServiceImpl implements BillingService {
private static final String BILLING_PATH = "/api/billing";
private static final String BILLING_REPORT_PATH = "/api/billing/report";
@@ -80,9 +80,9 @@ public class BillingServiceImplNew implements BillingServiceNew {
private final RESTService provisioningService;
@Inject
- public BillingServiceImplNew(ProjectService projectService, EndpointService endpointService,
- ExploratoryService exploratoryService, SelfServiceApplicationConfiguration configuration,
- @Named(ServiceConsts.PROVISIONING_SERVICE_NAME) RESTService provisioningService) {
+ public BillingServiceImpl(ProjectService projectService, EndpointService endpointService,
+ ExploratoryService exploratoryService, SelfServiceApplicationConfiguration configuration,
+ @Named(ServiceConsts.PROVISIONING_SERVICE_NAME) RESTService provisioningService) {
this.projectService = projectService;
this.endpointService = endpointService;
this.exploratoryService = exploratoryService;
diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/InfrastructureInfoServiceImpl.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/InfrastructureInfoServiceImpl.java
index deb0019..3f86c29 100644
--- a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/InfrastructureInfoServiceImpl.java
+++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/InfrastructureInfoServiceImpl.java
@@ -28,7 +28,7 @@ import com.epam.dlab.backendapi.domain.EndpointDTO;
import com.epam.dlab.backendapi.domain.ProjectEndpointDTO;
import com.epam.dlab.backendapi.resources.dto.HealthStatusPageDTO;
import com.epam.dlab.backendapi.resources.dto.ProjectInfrastructureInfo;
-import com.epam.dlab.backendapi.service.BillingServiceNew;
+import com.epam.dlab.backendapi.service.BillingService;
import com.epam.dlab.backendapi.service.EndpointService;
import com.epam.dlab.backendapi.service.InfrastructureInfoService;
import com.epam.dlab.backendapi.service.ProjectService;
@@ -64,19 +64,19 @@ public class InfrastructureInfoServiceImpl implements InfrastructureInfoService
private final BillingDAO billingDAO;
private final ProjectService projectService;
private final EndpointService endpointService;
- private final BillingServiceNew billingServiceNew;
+ private final BillingService billingService;
@Inject
public InfrastructureInfoServiceImpl(ExploratoryDAO expDAO, EnvDAO envDAO, SelfServiceApplicationConfiguration configuration,
BillingDAO billingDAO, ProjectService projectService, EndpointService endpointService,
- BillingServiceNew billingServiceNew) {
+ BillingService billingService) {
this.expDAO = expDAO;
this.envDAO = envDAO;
this.configuration = configuration;
this.billingDAO = billingDAO;
this.projectService = projectService;
this.endpointService = endpointService;
- this.billingServiceNew = billingServiceNew;
+ this.billingService = billingService;
}
@Override
@@ -102,7 +102,7 @@ public class InfrastructureInfoServiceImpl implements InfrastructureInfoService
.map(exp -> {
List<BillingData> exploratoryRemoteBillingData = new ArrayList<>();
try {
- exploratoryRemoteBillingData = billingServiceNew.getExploratoryRemoteBillingData(user, (String) exp.get("endpoint"),
+ exploratoryRemoteBillingData = billingService.getExploratoryRemoteBillingData(user, (String) exp.get("endpoint"),
expDAO.findExploratories(e.getKey(), (String) exp.get("endpoint"), user.getName()));
} catch (Exception ex) {
log.error("Cannot retrieve billing information", ex);
diff --git a/services/self-service/src/test/java/com/epam/dlab/backendapi/service/aws/AwsBillingServiceTest.java b/services/self-service/src/test/java/com/epam/dlab/backendapi/service/aws/AwsBillingServiceTest.java
deleted file mode 100644
index 0c9cf26..0000000
--- a/services/self-service/src/test/java/com/epam/dlab/backendapi/service/aws/AwsBillingServiceTest.java
+++ /dev/null
@@ -1,224 +0,0 @@
-/*
- * 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.dlab.backendapi.service.aws;
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.dao.aws.AwsBillingDAO;
-import com.epam.dlab.backendapi.resources.dto.BillingFilter;
-import com.epam.dlab.exceptions.DlabException;
-import org.bson.Document;
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.rules.ExpectedException;
-import org.junit.runner.RunWith;
-import org.mockito.InjectMocks;
-import org.mockito.Mock;
-import org.mockito.runners.MockitoJUnitRunner;
-
-import java.text.ParseException;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-import static org.mockito.Mockito.any;
-import static org.mockito.Mockito.doThrow;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.verifyNoMoreInteractions;
-import static org.mockito.Mockito.when;
-
-@RunWith(MockitoJUnitRunner.class)
-public class AwsBillingServiceTest {
-
- private UserInfo userInfo;
- private BillingFilter billingFilter;
- private Document basicDocument;
-
- @Mock
- private AwsBillingDAO billingDAO;
-
- @InjectMocks
- private AwsBillingService awsBillingService;
-
- @Rule
- public ExpectedException expectedException = ExpectedException.none();
-
- @Before
- public void setUp() {
- userInfo = getUserInfo();
- billingFilter = new BillingFilter();
- basicDocument = getBasicDocument();
- }
-
- @Test
- public void getReportWithTheSameInstanceOfDocument() {
- Document expectedDocument = new Document();
- when(billingDAO.getReport(any(UserInfo.class), any(BillingFilter.class))).thenReturn(expectedDocument);
-
- Document actualDocument = awsBillingService.getReport(userInfo, billingFilter);
- assertEquals(expectedDocument, actualDocument);
-
- verify(billingDAO).getReport(userInfo, billingFilter);
- verifyNoMoreInteractions(billingDAO);
- }
-
- @Test
- public void getReportWithAnotherInstanceOfDocument() {
- Document expectedDocument = new Document().append("someField", "someValue");
- Document anotherDocument = new Document().append("someField", "anotherValue");
- when(billingDAO.getReport(any(UserInfo.class), any(BillingFilter.class))).thenReturn(anotherDocument);
-
- Document actualDocument = awsBillingService.getReport(userInfo, billingFilter);
- assertNotEquals(expectedDocument, actualDocument);
-
- verify(billingDAO).getReport(userInfo, billingFilter);
- verifyNoMoreInteractions(billingDAO);
- }
-
- @Test
- public void getReportWithException() {
- doThrow(new RuntimeException()).when(billingDAO).getReport(any(UserInfo.class), any(BillingFilter.class));
-
- try {
- awsBillingService.getReport(userInfo, billingFilter);
- } catch (DlabException e) {
- assertEquals("Cannot load billing report: null", e.getMessage());
- }
-
- verify(billingDAO).getReport(userInfo, billingFilter);
- verifyNoMoreInteractions(billingDAO);
- }
-
- @Test
- public void downloadReport() {
- when(billingDAO.getReport(any(UserInfo.class), any(BillingFilter.class))).thenReturn(basicDocument);
-
- byte[] result = awsBillingService.downloadReport(userInfo, billingFilter);
- assertNotNull(result);
- assertTrue(result.length > 0);
-
- verify(billingDAO).getReport(userInfo, billingFilter);
- verifyNoMoreInteractions(billingDAO);
- }
-
- @Test
- public void downloadReportWithInapproprietaryDateFormatInDocument() {
- basicDocument.put("from", "someDateStart");
- when(billingDAO.getReport(any(UserInfo.class), any(BillingFilter.class))).thenReturn(basicDocument);
-
- try {
- awsBillingService.downloadReport(userInfo, billingFilter);
- } catch (DlabException e) {
- assertEquals("Cannot prepare CSV file", e.getMessage());
- }
-
- verify(billingDAO).getReport(userInfo, billingFilter);
- verifyNoMoreInteractions(billingDAO);
- }
-
- @Test
- public void downloadReportWhenDocumentHasNotAllRequiredFields() {
- basicDocument.remove("lines");
- when(billingDAO.getReport(any(UserInfo.class), any(BillingFilter.class))).thenReturn(basicDocument);
-
- expectedException.expect(NullPointerException.class);
-
- awsBillingService.downloadReport(userInfo, billingFilter);
- }
-
- @Test
- public void getReportFileName() {
- String result = awsBillingService.getReportFileName(userInfo, billingFilter);
- assertEquals("aws-billing-report.csv", result);
- }
-
- @Test
- public void getFirstLine() throws ParseException {
- String result = awsBillingService.getFirstLine(basicDocument);
- assertEquals("Service base name: someSBN Resource tag ID: someTagResourceId Available reporting " +
- "period from: Mar 21, 2018 to: Mar 22, 2018", result);
- }
-
- @Test
- public void getFirstLineWithException() throws ParseException {
- basicDocument.put("from", "someStartDate");
-
- expectedException.expect(ParseException.class);
- expectedException.expectMessage("Unparseable date: \"someStartDate\"");
-
- awsBillingService.getFirstLine(basicDocument);
-
- }
-
- @Test
- public void getHeadersList() {
- List<String> expectedResult1 =
- Arrays.asList("USER", "PROJECT", "ENVIRONMENT NAME", "RESOURCE TYPE", "SHAPE", "SERVICE", "SERVICE CHARGES");
- List<String> expectedResult2 = expectedResult1.subList(1, expectedResult1.size());
-
- List<String> actualResult1 = awsBillingService.getHeadersList(true);
- assertEquals(expectedResult1, actualResult1);
-
- List<String> actualResult2 = awsBillingService.getHeadersList(false);
- assertEquals(expectedResult2, actualResult2);
- }
-
- @Test
- public void getLine() {
- String expectedResult1 = "someUser,someProject,someId,someResType,someShape,someProduct,someCost someCode\n";
- String actualResult1 = awsBillingService.getLine(true, basicDocument);
- assertEquals(expectedResult1, actualResult1);
-
- basicDocument.remove("user");
- String expectedResult2 = "someProject,someId,someResType,someShape,someProduct,someCost someCode\n";
- String actualResult2 = awsBillingService.getLine(false, basicDocument);
- assertEquals(expectedResult2, actualResult2);
- }
-
- @Test
- public void getTotal() {
- String expectedResult1 = ",,,,,,Total: someCostTotal someCode\n";
- String actualResult1 = awsBillingService.getTotal(true, basicDocument);
- assertEquals(expectedResult1, actualResult1);
-
- String expectedResult2 = ",,,,,Total: someCostTotal someCode\n";
- String actualResult2 = awsBillingService.getTotal(false, basicDocument);
- assertEquals(expectedResult2, actualResult2);
- }
-
- private UserInfo getUserInfo() {
- return new UserInfo("user", "token");
- }
-
- private Document getBasicDocument() {
- return new Document().append("service_base_name", "someSBN").append("user", "someUser")
- .append("project", "someProject").append("dlab_id", "someId")
- .append("dlab_resource_type", "someResType").append("tag_resource_id", "someTagResourceId")
- .append("from", "2018-03-21").append("to", "2018-03-22").append("full_report", false)
- .append("shape", "someShape").append("product", "someProduct").append("cost", "someCost")
- .append("cost_total", "someCostTotal").append("currency_code", "someCode")
- .append("lines", Collections.singletonList(new Document()));
- }
-
-}
diff --git a/services/self-service/src/test/java/com/epam/dlab/backendapi/service/azure/AzureBillingServiceTest.java b/services/self-service/src/test/java/com/epam/dlab/backendapi/service/azure/AzureBillingServiceTest.java
deleted file mode 100644
index ebd4b83..0000000
--- a/services/self-service/src/test/java/com/epam/dlab/backendapi/service/azure/AzureBillingServiceTest.java
+++ /dev/null
@@ -1,208 +0,0 @@
-/*
- * 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.dlab.backendapi.service.azure;
-
-import com.epam.dlab.auth.UserInfo;
-import com.epam.dlab.backendapi.dao.BillingDAO;
-import com.epam.dlab.backendapi.resources.dto.BillingFilter;
-import com.epam.dlab.exceptions.DlabException;
-import org.bson.Document;
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.rules.ExpectedException;
-import org.junit.runner.RunWith;
-import org.mockito.InjectMocks;
-import org.mockito.Mock;
-import org.mockito.runners.MockitoJUnitRunner;
-
-import java.text.ParseException;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-import static org.mockito.Mockito.any;
-import static org.mockito.Mockito.doThrow;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.verifyNoMoreInteractions;
-import static org.mockito.Mockito.when;
-
-@RunWith(MockitoJUnitRunner.class)
-public class AzureBillingServiceTest {
-
- private UserInfo userInfo;
- private BillingFilter billingFilter;
- private Document basicDocument;
-
- @Mock
- private BillingDAO billingDAO;
-
- @InjectMocks
- private AzureBillingService azureBillingService;
-
- @Rule
- public ExpectedException expectedException = ExpectedException.none();
-
- @Before
- public void setUp() {
- userInfo = getUserInfo();
- billingFilter = new BillingFilter();
- basicDocument = getBasicDocument();
- }
-
- @Test
- public void getReportWithTheSameInstanceOfDocument() {
- when(billingDAO.getReport(any(UserInfo.class), any(BillingFilter.class))).thenReturn(new Document());
-
- Document actualDocument = azureBillingService.getReport(userInfo, billingFilter);
- assertEquals(new Document(), actualDocument);
-
- verify(billingDAO).getReport(userInfo, billingFilter);
- verifyNoMoreInteractions(billingDAO);
- }
-
- @Test
- public void getReportWithException() {
- doThrow(new RuntimeException()).when(billingDAO).getReport(any(UserInfo.class), any(BillingFilter.class));
-
- try {
- azureBillingService.getReport(userInfo, billingFilter);
- } catch (DlabException e) {
- assertEquals("Cannot load billing report: null", e.getMessage());
- }
-
- verify(billingDAO).getReport(userInfo, billingFilter);
- verifyNoMoreInteractions(billingDAO);
- }
-
- @Test
- public void downloadReport() {
- when(billingDAO.getReport(any(UserInfo.class), any(BillingFilter.class))).thenReturn(basicDocument);
-
- byte[] result = azureBillingService.downloadReport(userInfo, billingFilter);
- assertNotNull(result);
- assertTrue(result.length > 0);
-
- verify(billingDAO).getReport(userInfo, billingFilter);
- verifyNoMoreInteractions(billingDAO);
- }
-
- @Test
- public void downloadReportWithInapproprietaryDateFormatInDocument() {
- basicDocument.put("from", "someDateStart");
- when(billingDAO.getReport(any(UserInfo.class), any(BillingFilter.class))).thenReturn(basicDocument);
-
- try {
- azureBillingService.downloadReport(userInfo, billingFilter);
- } catch (DlabException e) {
- assertEquals("Cannot prepare CSV file", e.getMessage());
- }
-
- verify(billingDAO).getReport(userInfo, billingFilter);
- verifyNoMoreInteractions(billingDAO);
- }
-
- @Test
- public void downloadReportWhenDocumentHasNotAllRequiredFields() {
- basicDocument.remove("lines");
- when(billingDAO.getReport(any(UserInfo.class), any(BillingFilter.class))).thenReturn(basicDocument);
-
- expectedException.expect(NullPointerException.class);
-
- azureBillingService.downloadReport(userInfo, billingFilter);
- }
-
- @Test
- public void getReportFileName() {
- String result = azureBillingService.getReportFileName(userInfo, billingFilter);
- assertEquals("azure-billing-report.csv", result);
- }
-
- @Test
- public void getFirstLine() throws ParseException {
- String result = azureBillingService.getFirstLine(basicDocument);
- assertEquals("Service base name: someSBN Available reporting period from: Mar 21, 2018 " +
- "to: Mar 22, 2018", result);
- }
-
- @Test
- public void getFirstLineWithException() throws ParseException {
- basicDocument.put("from", "someStartDate");
-
- expectedException.expect(ParseException.class);
-
- expectedException.expectMessage("Unparseable date: \"someStartDate\"");
- azureBillingService.getFirstLine(basicDocument);
- }
-
- @Test
- public void getHeadersList() {
- List<String> expectedResult1 =
- Arrays.asList("USER", "PROJECT" ,"ENVIRONMENT NAME", "RESOURCE TYPE", "INSTANCE SIZE", "CATEGORY", "SERVICE " +
- "CHARGES");
- List<String> expectedResult2 = expectedResult1.subList(1, expectedResult1.size());
-
- List<String> actualResult1 = azureBillingService.getHeadersList(true);
- assertEquals(expectedResult1, actualResult1);
-
- List<String> actualResult2 = azureBillingService.getHeadersList(false);
- assertEquals(expectedResult2, actualResult2);
- }
-
- @Test
- public void getLine() {
- String expectedResult1 = "someUser,someProject,someId,someResType,someSize,someMeterCategory,someCost someCode\n";
- String actualResult1 = azureBillingService.getLine(true, basicDocument);
- assertEquals(expectedResult1, actualResult1);
-
- basicDocument.remove("user");
- String expectedResult2 = "someProject,someId,someResType,someSize,someMeterCategory,someCost someCode\n";
- String actualResult2 = azureBillingService.getLine(false, basicDocument);
- assertEquals(expectedResult2, actualResult2);
- }
-
- @Test
- public void getTotal() {
- String expectedResult1 = ",,,,,,Total: someCost someCode\n";
- String actualResult1 = azureBillingService.getTotal(true, basicDocument);
- assertEquals(expectedResult1, actualResult1);
-
- String expectedResult2 = ",,,,,Total: someCost someCode\n";
- String actualResult2 = azureBillingService.getTotal(false, basicDocument);
- assertEquals(expectedResult2, actualResult2);
- }
-
- private UserInfo getUserInfo() {
- return new UserInfo("user", "token");
- }
-
- private Document getBasicDocument() {
- return new Document().append("service_base_name", "someSBN").append("user", "someUser")
- .append("project", "someProject").append("dlabId", "someId").append("resourceType", "someResType")
- .append("from", "2018-03-21").append("size", "someSize").append("to", "2018-03-22")
- .append("full_report", false).append("meterCategory", "someMeterCategory")
- .append("costString", "someCost").append("currencyCode", "someCode")
- .append("lines", Collections.singletonList(new Document()));
- }
-
-}
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@dlab.apache.org
For additional commands, e-mail: commits-help@dlab.apache.org