diff options
author | Øyvind Grønnesby <oyving@verizonmedia.com> | 2020-05-14 13:53:46 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-05-14 13:53:46 +0200 |
commit | 00425b2db4fa59f5abdf7b87d2b041397e138bf1 (patch) | |
tree | 908eb50e1bc141b7ea0240c16283bfe087c42b80 /controller-server | |
parent | 83c42b7ce7e973f010e22f8f01a1aa508a964150 (diff) | |
parent | ae8ef6082f4e76c8c3c863925e33852a30636b93 (diff) |
Merge pull request #13228 from vespa-engine/ogronnesby/remove-tenant-cost
Remove the TenantCost interface and the tenant cost API
Diffstat (limited to 'controller-server')
3 files changed, 0 insertions, 123 deletions
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiHandler.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiHandler.java index 5115ecaf196..13efadc027a 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiHandler.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiHandler.java @@ -207,8 +207,6 @@ public class ApplicationApiHandler extends LoggingRequestHandler { if (path.matches("/application/v4/")) return root(request); if (path.matches("/application/v4/tenant")) return tenants(request); if (path.matches("/application/v4/tenant/{tenant}")) return tenant(path.get("tenant"), request); - if (path.matches("/application/v4/tenant/{tenant}/cost")) return tenantCost(path.get("tenant"), request); - if (path.matches("/application/v4/tenant/{tenant}/cost/{month}")) return tenantCost(path.get("tenant"), path.get("month"), request); if (path.matches("/application/v4/tenant/{tenant}/application")) return applications(path.get("tenant"), Optional.empty(), request); if (path.matches("/application/v4/tenant/{tenant}/application/{application}")) return application(path.get("tenant"), path.get("application"), request); if (path.matches("/application/v4/tenant/{tenant}/application/{application}/compile-version")) return compileVersion(path.get("tenant"), path.get("application")); @@ -348,63 +346,6 @@ public class ApplicationApiHandler extends LoggingRequestHandler { return new SlimeJsonResponse(slime); } - private HttpResponse tenantCost(String tenantName, HttpRequest request) { - return controller.tenants().get(TenantName.from(tenantName)) - .map(tenant -> tenantCost(tenant, request)) - .orElseGet(() -> ErrorResponse.notFoundError("Tenant '" + tenantName + "' does not exist")); - } - - private HttpResponse tenantCost(Tenant tenant, HttpRequest request) { - Set<YearMonth> months = controller.serviceRegistry().tenantCost().monthsWithMetering(tenant.name()); - - var slime = new Slime(); - var objectCursor = slime.setObject(); - var monthsCursor = objectCursor.setArray("months"); - - months.forEach(month -> monthsCursor.addString(month.toString())); - return new SlimeJsonResponse(slime); - } - - private HttpResponse tenantCost(String tenantName, String dateString, HttpRequest request) { - return controller.tenants().get(TenantName.from(tenantName)) - .map(tenant -> tenantCost(tenant, tenantCostParseDate(dateString), request)) - .orElseGet(() -> ErrorResponse.notFoundError("Tenant '" + tenantName + "' does not exist")); - } - - private YearMonth tenantCostParseDate(String dateString) { - try { - return YearMonth.parse(dateString); - } catch (DateTimeParseException e){ - throw new IllegalArgumentException("Could not parse year-month '" + dateString + "'"); - } - } - - private HttpResponse tenantCost(Tenant tenant, YearMonth month, HttpRequest request) { - var slime = new Slime(); - Cursor cursor = slime.setObject(); - cursor.setString("month", month.toString()); - List<CostInfo> costInfos = controller.serviceRegistry().tenantCost() - .getTenantCostOfMonth(tenant.name(), month); - Cursor array = cursor.setArray("items"); - - costInfos.forEach(costInfo -> { - Cursor costObject = array.addObject(); - costObject.setString("applicationId", costInfo.getApplicationId().serializedForm()); - costObject.setString("zoneId", costInfo.getZoneId().value()); - Cursor cpu = costObject.setObject("cpu"); - cpu.setDouble("usage", costInfo.getCpuHours().setScale(1, RoundingMode.HALF_UP).doubleValue()); - cpu.setLong("charge", costInfo.getCpuCost()); - Cursor memory = costObject.setObject("memory"); - memory.setDouble("usage", costInfo.getMemoryHours().setScale(1, RoundingMode.HALF_UP).doubleValue()); - memory.setLong("charge", costInfo.getMemoryCost()); - Cursor disk = costObject.setObject("disk"); - disk.setDouble("usage", costInfo.getDiskHours().setScale(1, RoundingMode.HALF_UP).doubleValue()); - disk.setLong("charge", costInfo.getDiskCost()); - }); - - return new SlimeJsonResponse(slime); - } - private HttpResponse applications(String tenantName, Optional<String> applicationName, HttpRequest request) { TenantName tenant = TenantName.from(tenantName); if (controller.tenants().get(tenantName).isEmpty()) diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/integration/ServiceRegistryMock.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/integration/ServiceRegistryMock.java index 98178f2a19f..39b8dc110d4 100644 --- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/integration/ServiceRegistryMock.java +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/integration/ServiceRegistryMock.java @@ -18,7 +18,6 @@ import com.yahoo.vespa.hosted.controller.api.integration.organization.MockBillin import com.yahoo.vespa.hosted.controller.api.integration.organization.MockContactRetriever; import com.yahoo.vespa.hosted.controller.api.integration.organization.MockIssueHandler; import com.yahoo.vespa.hosted.controller.api.integration.resource.CostReportConsumerMock; -import com.yahoo.vespa.hosted.controller.api.integration.resource.MockTenantCost; import com.yahoo.vespa.hosted.controller.api.integration.routing.GlobalRoutingService; import com.yahoo.vespa.hosted.controller.api.integration.routing.MemoryGlobalRoutingService; import com.yahoo.vespa.hosted.controller.api.integration.stubs.DummyOwnershipIssues; @@ -55,7 +54,6 @@ public class ServiceRegistryMock extends AbstractComponent implements ServiceReg private final MockTesterCloud mockTesterCloud; private final ApplicationStoreMock applicationStoreMock = new ApplicationStoreMock(); private final MockRunDataStore mockRunDataStore = new MockRunDataStore(); - private final MockTenantCost mockTenantCost = new MockTenantCost(); private final MockResourceTagger mockResourceTagger = new MockResourceTagger(); public ServiceRegistryMock(SystemName system) { @@ -169,9 +167,6 @@ public class ServiceRegistryMock extends AbstractComponent implements ServiceReg } @Override - public MockTenantCost tenantCost() { return mockTenantCost;} - - @Override public ZoneRegistryMock zoneRegistry() { return zoneRegistryMock; } diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiTest.java index 7c703735dbf..388ca65dc40 100644 --- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiTest.java +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiTest.java @@ -40,9 +40,7 @@ import com.yahoo.vespa.hosted.controller.api.integration.deployment.JobType; import com.yahoo.vespa.hosted.controller.api.integration.organization.Contact; import com.yahoo.vespa.hosted.controller.api.integration.organization.IssueId; import com.yahoo.vespa.hosted.controller.api.integration.organization.User; -import com.yahoo.vespa.hosted.controller.api.integration.resource.CostInfo; import com.yahoo.vespa.hosted.controller.api.integration.resource.MeteringData; -import com.yahoo.vespa.hosted.controller.api.integration.resource.MockTenantCost; import com.yahoo.vespa.hosted.controller.api.integration.resource.ResourceAllocation; import com.yahoo.vespa.hosted.controller.api.integration.resource.ResourceSnapshot; import com.yahoo.vespa.hosted.controller.api.integration.stubs.MockMeteringClient; @@ -176,14 +174,6 @@ public class ApplicationApiTest extends ControllerContainerTest { .data("{\"athensDomain\":\"domain1\", \"property\":\"property1\"}"), new File("tenant-without-applications.json")); - // GET list of months for a tenant - tester.assertResponse(request("/application/v4/tenant/tenant1/cost", GET).userIdentity(USER_ID).oktaAccessToken(OKTA_AT).oktaIdentityToken(OKTA_IT), - "{\"months\":[]}"); - - // GET cost for a month for a tenant - tester.assertResponse(request("/application/v4/tenant/tenant1/cost/2018-01", GET).userIdentity(USER_ID).oktaAccessToken(OKTA_AT).oktaIdentityToken(OKTA_IT), - "{\"month\":\"2018-01\",\"items\":[]}"); - // Add another Athens domain, so we can try to create more tenants createAthenzDomainWithAdmin(ATHENZ_TENANT_DOMAIN_2, USER_ID); // New domain to test tenant w/property ID // Add property info for that property id, as well, in the mock organization. @@ -985,44 +975,6 @@ public class ApplicationApiTest extends ControllerContainerTest { } @Test - public void testTenantCostResponse() { - ApplicationId applicationId = createTenantAndApplication(); - MockTenantCost mockTenantCost = deploymentTester.controllerTester().serviceRegistry().tenantCost(); - - mockTenantCost.setMonthsWithMetering( - new TreeSet<>(Set.of( - YearMonth.of(2019, 10), - YearMonth.of(2019, 9) - )) - ); - - tester.assertResponse(request("/application/v4/tenant/" + applicationId.tenant().value() + "/cost", GET) - .userIdentity(USER_ID) - .oktaAccessToken(OKTA_AT).oktaIdentityToken(OKTA_IT), - "{\"months\":[\"2019-09\",\"2019-10\"]}"); - - CostInfo costInfo1 = new CostInfo(applicationId, ZoneId.from("prod", "us-south-1"), - new BigDecimal("7.0"), - new BigDecimal("600.0"), - new BigDecimal("1000.0"), - 35, 23, 10); - CostInfo costInfo2 = new CostInfo(applicationId, ZoneId.from("prod", "us-north-1"), - new BigDecimal("2.0"), - new BigDecimal("3.0"), - new BigDecimal("4.0"), - 10, 20, 30); - - mockTenantCost.setCostInfoList( - List.of(costInfo1, costInfo2) - ); - - tester.assertResponse(request("/application/v4/tenant/" + applicationId.tenant().value() + "/cost/2019-09", GET) - .userIdentity(USER_ID) - .oktaAccessToken(OKTA_AT).oktaIdentityToken(OKTA_IT), - new File("cost-report.json")); - } - - @Test public void testErrorResponses() throws Exception { createAthenzDomainWithAdmin(ATHENZ_TENANT_DOMAIN, USER_ID); @@ -1179,17 +1131,6 @@ public class ApplicationApiTest extends ControllerContainerTest { "{\"error-code\":\"NOT_FOUND\",\"message\":\"Could not delete instance 'tenant1.application1.instance1': Instance not found\"}", 404); - // GET cost of unknown tenant - tester.assertResponse(request("/application/v4/tenant/no-such-tenant/cost", GET).userIdentity(USER_ID).oktaAccessToken(OKTA_AT).oktaIdentityToken(OKTA_IT), - "{\"error-code\":\"NOT_FOUND\",\"message\":\"Tenant 'no-such-tenant' does not exist\"}", 404); - - tester.assertResponse(request("/application/v4/tenant/no-such-tenant/cost/2018-01-01", GET).userIdentity(USER_ID).oktaAccessToken(OKTA_AT).oktaIdentityToken(OKTA_IT), - "{\"error-code\":\"NOT_FOUND\",\"message\":\"Tenant 'no-such-tenant' does not exist\"}", 404); - - // GET cost with invalid date string - tester.assertResponse(request("/application/v4/tenant/tenant1/cost/not-a-valid-date", GET).userIdentity(USER_ID).oktaAccessToken(OKTA_AT).oktaIdentityToken(OKTA_IT), - "{\"error-code\":\"BAD_REQUEST\",\"message\":\"Could not parse year-month 'not-a-valid-date'\"}", 400); - // DELETE tenant tester.assertResponse(request("/application/v4/tenant/tenant1", DELETE) .userIdentity(USER_ID) |