diff options
author | Øyvind Grønnesby <oyving@verizonmedia.com> | 2022-03-01 11:24:18 +0100 |
---|---|---|
committer | Leandro Alves <leandroalves@yahooinc.com> | 2022-03-14 11:01:55 +0100 |
commit | 6012cf065da30cf9baee97706d67a6ff6e77cb46 (patch) | |
tree | dc5ba6fc61e3a6acab5b61d6b22cbf225296e95a /controller-server | |
parent | fed4f6dddba35fe13b9d10dc79485fa7d4d97afb (diff) |
Clean up the tenant info classes
There was some repetition in the TenantInfo classes. Created dedicated
classes for TenantAddress and TenantContact. Used these throughout the
TenantInfo tree.
This commit also removes the 'invoiceEmail' field that was never used.
Diffstat (limited to 'controller-server')
6 files changed, 94 insertions, 87 deletions
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/TenantSerializer.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/TenantSerializer.java index 1b6a0a6a122..020e9137779 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/TenantSerializer.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/TenantSerializer.java @@ -22,8 +22,9 @@ import com.yahoo.vespa.hosted.controller.tenant.CloudTenant; import com.yahoo.vespa.hosted.controller.tenant.DeletedTenant; import com.yahoo.vespa.hosted.controller.tenant.LastLoginInfo; import com.yahoo.vespa.hosted.controller.tenant.Tenant; +import com.yahoo.vespa.hosted.controller.tenant.TenantAddress; +import com.yahoo.vespa.hosted.controller.tenant.TenantContact; import com.yahoo.vespa.hosted.controller.tenant.TenantInfo; -import com.yahoo.vespa.hosted.controller.tenant.TenantInfoAddress; import com.yahoo.vespa.hosted.controller.tenant.TenantInfoBillingContact; import java.net.URI; @@ -193,33 +194,34 @@ public class TenantSerializer { } TenantInfo tenantInfoFromSlime(Inspector infoObject) { - if (!infoObject.valid()) return TenantInfo.EMPTY; + if (!infoObject.valid()) return TenantInfo.empty(); - return TenantInfo.EMPTY + return TenantInfo.empty() .withName(infoObject.field("name").asString()) .withEmail(infoObject.field("email").asString()) .withWebsite(infoObject.field("website").asString()) - .withContactName(infoObject.field("contactName").asString()) - .withContactEmail(infoObject.field("contactEmail").asString()) - .withInvoiceEmail(infoObject.field("invoiceEmail").asString()) + .withContact(TenantContact.from( + infoObject.field("contactName").asString(), + infoObject.field("contactEmail").asString())) .withAddress(tenantInfoAddressFromSlime(infoObject.field("address"))) - .withBillingContact(tenantInfoBillingContactFromSlime(infoObject.field("billingContact"))); + .withBilling(tenantInfoBillingContactFromSlime(infoObject.field("billingContact"))); } - private TenantInfoAddress tenantInfoAddressFromSlime(Inspector addressObject) { - return TenantInfoAddress.EMPTY - .withAddressLines(addressObject.field("addressLines").asString()) - .withPostalCodeOrZip(addressObject.field("postalCodeOrZip").asString()) + private TenantAddress tenantInfoAddressFromSlime(Inspector addressObject) { + return TenantAddress.empty() + .withAddress(addressObject.field("addressLines").asString()) + .withCode(addressObject.field("postalCodeOrZip").asString()) .withCity(addressObject.field("city").asString()) - .withStateRegionProvince(addressObject.field("stateRegionProvince").asString()) + .withRegion(addressObject.field("stateRegionProvince").asString()) .withCountry(addressObject.field("country").asString()); } private TenantInfoBillingContact tenantInfoBillingContactFromSlime(Inspector billingObject) { - return TenantInfoBillingContact.EMPTY - .withName(billingObject.field("name").asString()) - .withEmail(billingObject.field("email").asString()) - .withPhone(billingObject.field("phone").asString()) + return TenantInfoBillingContact.empty() + .withContact(TenantContact.from( + billingObject.field("name").asString(), + billingObject.field("email").asString(), + billingObject.field("phone").asString())) .withAddress(tenantInfoAddressFromSlime(billingObject.field("address"))); } @@ -252,21 +254,20 @@ public class TenantSerializer { infoCursor.setString("name", info.name()); infoCursor.setString("email", info.email()); infoCursor.setString("website", info.website()); - infoCursor.setString("invoiceEmail", info.invoiceEmail()); - infoCursor.setString("contactName", info.contactName()); - infoCursor.setString("contactEmail", info.contactEmail()); + infoCursor.setString("contactName", info.contact().name()); + infoCursor.setString("contactEmail", info.contact().email()); toSlime(info.address(), infoCursor); toSlime(info.billingContact(), infoCursor); } - private void toSlime(TenantInfoAddress address, Cursor parentCursor) { + private void toSlime(TenantAddress address, Cursor parentCursor) { if (address.isEmpty()) return; Cursor addressCursor = parentCursor.setObject("address"); - addressCursor.setString("addressLines", address.addressLines()); - addressCursor.setString("postalCodeOrZip", address.postalCodeOrZip()); + addressCursor.setString("addressLines", address.address()); + addressCursor.setString("postalCodeOrZip", address.code()); addressCursor.setString("city", address.city()); - addressCursor.setString("stateRegionProvince", address.stateRegionProvince()); + addressCursor.setString("stateRegionProvince", address.region()); addressCursor.setString("country", address.country()); } @@ -274,9 +275,9 @@ public class TenantSerializer { if (billingContact.isEmpty()) return; Cursor addressCursor = parentCursor.setObject("billingContact"); - addressCursor.setString("name", billingContact.name()); - addressCursor.setString("email", billingContact.email()); - addressCursor.setString("phone", billingContact.phone()); + addressCursor.setString("name", billingContact.contact().name()); + addressCursor.setString("email", billingContact.contact().email()); + addressCursor.setString("phone", billingContact.contact().phone()); toSlime(billingContact.address(), addressCursor); } 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 de8f1ec7ddc..954b5826317 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 @@ -111,8 +111,9 @@ import com.yahoo.vespa.hosted.controller.tenant.CloudTenant; import com.yahoo.vespa.hosted.controller.tenant.DeletedTenant; import com.yahoo.vespa.hosted.controller.tenant.LastLoginInfo; import com.yahoo.vespa.hosted.controller.tenant.Tenant; +import com.yahoo.vespa.hosted.controller.tenant.TenantAddress; +import com.yahoo.vespa.hosted.controller.tenant.TenantContact; import com.yahoo.vespa.hosted.controller.tenant.TenantInfo; -import com.yahoo.vespa.hosted.controller.tenant.TenantInfoAddress; import com.yahoo.vespa.hosted.controller.tenant.TenantInfoBillingContact; import com.yahoo.vespa.hosted.controller.versions.VersionStatus; import com.yahoo.vespa.hosted.controller.versions.VespaVersion; @@ -503,9 +504,8 @@ public class ApplicationApiHandler extends AuditLoggingRequestHandler { infoCursor.setString("name", info.name()); infoCursor.setString("email", info.email()); infoCursor.setString("website", info.website()); - infoCursor.setString("invoiceEmail", info.invoiceEmail()); - infoCursor.setString("contactName", info.contactName()); - infoCursor.setString("contactEmail", info.contactEmail()); + infoCursor.setString("contactName", info.contact().name()); + infoCursor.setString("contactEmail", info.contact().email()); toSlime(info.address(), infoCursor); toSlime(info.billingContact(), infoCursor); } @@ -513,14 +513,14 @@ public class ApplicationApiHandler extends AuditLoggingRequestHandler { return new SlimeJsonResponse(slime); } - private void toSlime(TenantInfoAddress address, Cursor parentCursor) { + private void toSlime(TenantAddress address, Cursor parentCursor) { if (address.isEmpty()) return; Cursor addressCursor = parentCursor.setObject("address"); - addressCursor.setString("addressLines", address.addressLines()); - addressCursor.setString("postalCodeOrZip", address.postalCodeOrZip()); + addressCursor.setString("addressLines", address.address()); + addressCursor.setString("postalCodeOrZip", address.code()); addressCursor.setString("city", address.city()); - addressCursor.setString("stateRegionProvince", address.stateRegionProvince()); + addressCursor.setString("stateRegionProvince", address.region()); addressCursor.setString("country", address.country()); } @@ -528,9 +528,9 @@ public class ApplicationApiHandler extends AuditLoggingRequestHandler { if (billingContact.isEmpty()) return; Cursor addressCursor = parentCursor.setObject("billingContact"); - addressCursor.setString("name", billingContact.name()); - addressCursor.setString("email", billingContact.email()); - addressCursor.setString("phone", billingContact.phone()); + addressCursor.setString("name", billingContact.contact().name()); + addressCursor.setString("email", billingContact.contact().email()); + addressCursor.setString("phone", billingContact.contact().phone()); toSlime(billingContact.address(), addressCursor); } @@ -550,24 +550,27 @@ public class ApplicationApiHandler extends AuditLoggingRequestHandler { // Merge info from request with the existing info Inspector insp = toSlime(request.getData()).get(); - TenantInfo mergedInfo = TenantInfo.EMPTY + + TenantContact mergedContact = TenantContact.empty() + .withName(getString(insp.field("contactName"), oldInfo.contact().name())) + .withEmail(getString(insp.field("contactEmail"), oldInfo.contact().email())); + + TenantInfo mergedInfo = TenantInfo.empty() .withName(getString(insp.field("name"), oldInfo.name())) - .withEmail(getString(insp.field("email"), oldInfo.email())) - .withWebsite(getString(insp.field("website"), oldInfo.website())) - .withInvoiceEmail(getString(insp.field("invoiceEmail"), oldInfo.invoiceEmail())) - .withContactName(getString(insp.field("contactName"), oldInfo.contactName())) - .withContactEmail(getString(insp.field("contactEmail"), oldInfo.contactEmail())) + .withEmail(getString(insp.field("email"), oldInfo.email())) + .withWebsite(getString(insp.field("website"), oldInfo.website())) + .withContact(mergedContact) .withAddress(updateTenantInfoAddress(insp.field("address"), oldInfo.address())) - .withBillingContact(updateTenantInfoBillingContact(insp.field("billingContact"), oldInfo.billingContact())); + .withBilling(updateTenantInfoBillingContact(insp.field("billingContact"), oldInfo.billingContact())); // Assert that we have a valid tenant info - if (mergedInfo.contactName().isBlank()) { + if (mergedInfo.contact().name().isBlank()) { throw new IllegalArgumentException("'contactName' cannot be empty"); } - if (mergedInfo.contactEmail().isBlank()) { + if (mergedInfo.contact().email().isBlank()) { throw new IllegalArgumentException("'contactEmail' cannot be empty"); } - if (! mergedInfo.contactEmail().contains("@")) { + if (! mergedInfo.contact().email().contains("@")) { // email address validation is notoriously hard - we should probably just try to send a // verification email to this address. checking for @ is a simple best-effort. throw new IllegalArgumentException("'contactEmail' needs to be an email address"); @@ -589,20 +592,20 @@ public class ApplicationApiHandler extends AuditLoggingRequestHandler { return new MessageResponse("Tenant info updated"); } - private TenantInfoAddress updateTenantInfoAddress(Inspector insp, TenantInfoAddress oldAddress) { + private TenantAddress updateTenantInfoAddress(Inspector insp, TenantAddress oldAddress) { if (!insp.valid()) return oldAddress; - TenantInfoAddress address = TenantInfoAddress.EMPTY + TenantAddress address = TenantAddress.empty() .withCountry(getString(insp.field("country"), oldAddress.country())) - .withStateRegionProvince(getString(insp.field("stateRegionProvince"), oldAddress.stateRegionProvince())) + .withRegion(getString(insp.field("stateRegionProvince"), oldAddress.region())) .withCity(getString(insp.field("city"), oldAddress.city())) - .withPostalCodeOrZip(getString(insp.field("postalCodeOrZip"), oldAddress.postalCodeOrZip())) - .withAddressLines(getString(insp.field("addressLines"), oldAddress.addressLines())); + .withCode(getString(insp.field("postalCodeOrZip"), oldAddress.code())) + .withAddress(getString(insp.field("addressLines"), oldAddress.address())); - List<String> fields = List.of(address.addressLines(), - address.postalCodeOrZip(), + List<String> fields = List.of(address.address(), + address.code(), address.country(), address.city(), - address.stateRegionProvince()); + address.region()); if (fields.stream().allMatch(String::isBlank) || fields.stream().noneMatch(String::isBlank)) return address; @@ -610,7 +613,7 @@ public class ApplicationApiHandler extends AuditLoggingRequestHandler { throw new IllegalArgumentException("All address fields must be set"); } - private TenantInfoBillingContact updateTenantInfoBillingContact(Inspector insp, TenantInfoBillingContact oldContact) { + private TenantContact updateTenantInfoContact(Inspector insp, TenantContact oldContact) { if (!insp.valid()) return oldContact; String email = getString(insp.field("email"), oldContact.email()); @@ -621,10 +624,17 @@ public class ApplicationApiHandler extends AuditLoggingRequestHandler { throw new IllegalArgumentException("'email' needs to be an email address"); } - return TenantInfoBillingContact.EMPTY + return TenantContact.empty() .withName(getString(insp.field("name"), oldContact.name())) - .withEmail(email) - .withPhone(getString(insp.field("phone"), oldContact.phone())) + .withEmail(getString(insp.field("email"), oldContact.email())) + .withPhone(getString(insp.field("phone"), oldContact.phone())); + } + + private TenantInfoBillingContact updateTenantInfoBillingContact(Inspector insp, TenantInfoBillingContact oldContact) { + if (!insp.valid()) return oldContact; + + return TenantInfoBillingContact.empty() + .withContact(updateTenantInfoContact(insp, oldContact.contact())) .withAddress(updateTenantInfoAddress(insp.field("address"), oldContact.address())); } @@ -647,6 +657,7 @@ public class ApplicationApiHandler extends AuditLoggingRequestHandler { .forEach(notification -> toSlime(notificationsArray.addObject(), notification, includeTenantFieldInResponse, excludeMessages)); return new SlimeJsonResponse(slime); } + private static <T> boolean propertyEquals(HttpRequest request, String property, Function<String, T> mapper, Optional<T> value) { return Optional.ofNullable(request.getProperty(property)) .map(propertyValue -> value.isPresent() && mapper.apply(propertyValue).equals(value.get())) @@ -1851,8 +1862,7 @@ public class ApplicationApiHandler extends AuditLoggingRequestHandler { User user = getAttribute(request, User.ATTRIBUTE_NAME, User.class); TenantInfo info = controller.tenants().require(tenant, CloudTenant.class) .info() - .withContactName(user.name()) - .withContactEmail(user.email()); + .withContact(TenantContact.from(user.name(), user.email())); // Store changes controller.tenants().lockOrThrow(tenant, LockedTenant.Cloud.class, lockedTenant -> { lockedTenant = lockedTenant.withInfo(info); diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/persistence/TenantSerializerTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/persistence/TenantSerializerTest.java index 0b986667911..898ef957f32 100644 --- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/persistence/TenantSerializerTest.java +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/persistence/TenantSerializerTest.java @@ -16,8 +16,9 @@ import com.yahoo.vespa.hosted.controller.tenant.AthenzTenant; import com.yahoo.vespa.hosted.controller.tenant.CloudTenant; import com.yahoo.vespa.hosted.controller.tenant.DeletedTenant; import com.yahoo.vespa.hosted.controller.tenant.LastLoginInfo; +import com.yahoo.vespa.hosted.controller.tenant.TenantAddress; +import com.yahoo.vespa.hosted.controller.tenant.TenantContact; import com.yahoo.vespa.hosted.controller.tenant.TenantInfo; -import com.yahoo.vespa.hosted.controller.tenant.TenantInfoAddress; import com.yahoo.vespa.hosted.controller.tenant.TenantInfoBillingContact; import org.junit.Test; @@ -97,7 +98,7 @@ public class TenantSerializerTest { Optional.of(new SimplePrincipal("foobar-user")), ImmutableBiMap.of(publicKey, new SimplePrincipal("joe"), otherPublicKey, new SimplePrincipal("jane")), - TenantInfo.EMPTY, + TenantInfo.empty(), List.of(), Optional.empty() ); @@ -116,7 +117,7 @@ public class TenantSerializerTest { Optional.of(new SimplePrincipal("foobar-user")), ImmutableBiMap.of(publicKey, new SimplePrincipal("joe"), otherPublicKey, new SimplePrincipal("jane")), - TenantInfo.EMPTY.withName("Ofni Tnanet"), + TenantInfo.empty().withName("Ofni Tnanet"), List.of( new TenantSecretStore("ss1", "123", "role1"), new TenantSecretStore("ss2", "124", "role2") @@ -131,39 +132,35 @@ public class TenantSerializerTest { @Test public void cloud_tenant_with_tenant_info_partial() { - TenantInfo partialInfo = TenantInfo.EMPTY - .withAddress(TenantInfoAddress.EMPTY.withCity("Hønefoss")); + TenantInfo partialInfo = TenantInfo.empty() + .withAddress(TenantAddress.empty().withCity("Hønefoss")); Slime slime = new Slime(); Cursor parentObject = slime.setObject(); serializer.toSlime(partialInfo, parentObject); - assertEquals("{\"info\":{\"name\":\"\",\"email\":\"\",\"website\":\"\",\"invoiceEmail\":\"\",\"contactName\":\"\",\"contactEmail\":\"\",\"address\":{\"addressLines\":\"\",\"postalCodeOrZip\":\"\",\"city\":\"Hønefoss\",\"stateRegionProvince\":\"\",\"country\":\"\"}}}", slime.toString()); + assertEquals("{\"info\":{\"name\":\"\",\"email\":\"\",\"website\":\"\",\"contactName\":\"\",\"contactEmail\":\"\",\"address\":{\"addressLines\":\"\",\"postalCodeOrZip\":\"\",\"city\":\"Hønefoss\",\"stateRegionProvince\":\"\",\"country\":\"\"}}}", slime.toString()); } @Test public void cloud_tenant_with_tenant_info_full() { - TenantInfo fullInfo = TenantInfo.EMPTY + TenantInfo fullInfo = TenantInfo.empty() .withName("My Company") .withEmail("email@mycomp.any") .withWebsite("http://mycomp.any") - .withContactEmail("ceo@mycomp.any") - .withContactName("My Name") - .withInvoiceEmail("invoice@mycomp.any") - .withAddress(TenantInfoAddress.EMPTY + .withContact(TenantContact.from("My Name", "ceo@mycomp.any")) + .withAddress(TenantAddress.empty() .withCity("Hønefoss") - .withAddressLines("Riperbakken 2") + .withAddress("Riperbakken 2") .withCountry("Norway") - .withPostalCodeOrZip("3510") - .withStateRegionProvince("Viken")) - .withBillingContact(TenantInfoBillingContact.EMPTY - .withEmail("thomas@sodor.com") - .withName("Thomas The Tank Engine") - .withPhone("NA") - .withAddress(TenantInfoAddress.EMPTY + .withCode("3510") + .withRegion("Viken")) + .withBilling(TenantInfoBillingContact.empty() + .withContact(TenantContact.from("Thomas The Tank Engine", "thomas@sodor.com", "NA")) + .withAddress(TenantAddress.empty() .withCity("Suddery") .withCountry("Sodor") - .withAddressLines("Central Station") - .withStateRegionProvince("Irish Sea"))); + .withAddress("Central Station") + .withRegion("Irish Sea"))); Slime slime = new Slime(); Cursor parentCursor = slime.setObject(); diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiCloudTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiCloudTest.java index fa1483fd90f..3c693bf4991 100644 --- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiCloudTest.java +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiCloudTest.java @@ -97,11 +97,11 @@ public class ApplicationApiCloudTest extends ControllerContainerCloudTest { tester.assertResponse(postPartial, "{\"message\":\"Tenant info updated\"}", 200); // Read back the updated info - tester.assertResponse(infoRequest, "{\"name\":\"\",\"email\":\"\",\"website\":\"\",\"invoiceEmail\":\"\",\"contactName\":\"newName\",\"contactEmail\":\"foo@example.com\",\"billingContact\":{\"name\":\"billingName\",\"email\":\"\",\"phone\":\"\"}}", 200); + tester.assertResponse(infoRequest, "{\"name\":\"\",\"email\":\"\",\"website\":\"\",\"contactName\":\"newName\",\"contactEmail\":\"foo@example.com\",\"billingContact\":{\"name\":\"billingName\",\"email\":\"\",\"phone\":\"\"}}", 200); String fullAddress = "{\"addressLines\":\"addressLines\",\"postalCodeOrZip\":\"postalCodeOrZip\",\"city\":\"city\",\"stateRegionProvince\":\"stateRegionProvince\",\"country\":\"country\"}"; String fullBillingContact = "{\"name\":\"name\",\"email\":\"foo@example\",\"phone\":\"phone\",\"address\":" + fullAddress + "}"; - String fullInfo = "{\"name\":\"name\",\"email\":\"foo@example\",\"website\":\"https://yahoo.com\",\"invoiceEmail\":\"invoiceEmail\",\"contactName\":\"contactName\",\"contactEmail\":\"contact@example.com\",\"address\":" + fullAddress + ",\"billingContact\":" + fullBillingContact + "}"; + String fullInfo = "{\"name\":\"name\",\"email\":\"foo@example\",\"website\":\"https://yahoo.com\",\"contactName\":\"contactName\",\"contactEmail\":\"contact@example.com\",\"address\":" + fullAddress + ",\"billingContact\":" + fullBillingContact + "}"; // Now set all fields var postFull = diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/filter/SignatureFilterTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/filter/SignatureFilterTest.java index 7f588367819..15c7dbf73ab 100644 --- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/filter/SignatureFilterTest.java +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/filter/SignatureFilterTest.java @@ -74,7 +74,7 @@ public class SignatureFilterTest { LastLoginInfo.EMPTY, Optional.empty(), ImmutableBiMap.of(), - TenantInfo.EMPTY, + TenantInfo.empty(), List.of(), Optional.empty())); tester.curator().writeApplication(new Application(appId, tester.clock().instant())); @@ -120,7 +120,7 @@ public class SignatureFilterTest { LastLoginInfo.EMPTY, Optional.empty(), ImmutableBiMap.of(publicKey, () -> "user"), - TenantInfo.EMPTY, + TenantInfo.empty(), List.of(), Optional.empty())); verifySecurityContext(requestOf(signer.signed(request.copy(), Method.POST, () -> new ByteArrayInputStream(hiBytes)), hiBytes), diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/user/responses/tenant-info-after-created.json b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/user/responses/tenant-info-after-created.json index 942b5c1db45..938037d74df 100644 --- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/user/responses/tenant-info-after-created.json +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/user/responses/tenant-info-after-created.json @@ -2,7 +2,6 @@ "name": "", "email": "", "website":"", - "invoiceEmail":"", "contactName": "administrator", "contactEmail": "administrator@tenant" }
\ No newline at end of file |