hosting-asset-validation-beyond-property-validators #65
@ -167,7 +167,7 @@ public abstract class HsHostingAssetEntityValidator extends HsEntityValidator<Hs
|
|||||||
return List.of(referenceFieldName + "' must not be null but is null");
|
return List.of(referenceFieldName + "' must not be null but is null");
|
||||||
}
|
}
|
||||||
if (policy == Policy.FORBIDDEN && subEntity != null) {
|
if (policy == Policy.FORBIDDEN && subEntity != null) {
|
||||||
return List.of(referenceFieldName + "' must not be null but is set to "+ assetEntity.getBookingItem().toShortString());
|
return List.of(referenceFieldName + "' must be null but is set to "+ assetEntity.getBookingItem().toShortString());
|
||||||
}
|
}
|
||||||
final var subItemType = subEntity != null ? subEntityTypeGetter.apply(subEntity) : null;
|
final var subItemType = subEntity != null ? subEntityTypeGetter.apply(subEntity) : null;
|
||||||
if (subEntityType != null && subItemType != subEntityType) {
|
if (subEntityType != null && subItemType != subEntityType) {
|
||||||
@ -234,4 +234,3 @@ public abstract class HsHostingAssetEntityValidator extends HsEntityValidator<Hs
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -22,6 +22,7 @@ import org.springframework.boot.test.context.SpringBootTest;
|
|||||||
import org.springframework.boot.test.web.server.LocalServerPort;
|
import org.springframework.boot.test.web.server.LocalServerPort;
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
@ -220,9 +221,7 @@ class HsHostingAssetControllerAcceptanceTest extends ContextBasedTestWithCleanup
|
|||||||
void parentAssetAgent_canAddSubAsset() {
|
void parentAssetAgent_canAddSubAsset() {
|
||||||
|
|
||||||
context.define("superuser-alex@hostsharing.net");
|
context.define("superuser-alex@hostsharing.net");
|
||||||
final var givenParentAsset = givenParentAsset(MANAGED_SERVER, "vm1011");
|
final var givenParentAsset = givenParentAsset(MANAGED_WEBSPACE, "fir01");
|
||||||
|
|
||||||
context.define("person-FirbySusan@example.com");
|
|
||||||
|
|
||||||
final var location = RestAssured // @formatter:off
|
final var location = RestAssured // @formatter:off
|
||||||
.given()
|
.given()
|
||||||
@ -232,9 +231,9 @@ class HsHostingAssetControllerAcceptanceTest extends ContextBasedTestWithCleanup
|
|||||||
.body("""
|
.body("""
|
||||||
{
|
{
|
||||||
"parentAssetUuid": "%s",
|
"parentAssetUuid": "%s",
|
||||||
"type": "MANAGED_WEBSPACE",
|
"type": "UNIX_USER",
|
||||||
"identifier": "fir90",
|
"identifier": "fir01-temp",
|
||||||
"caption": "some new ManagedWebspace in client's ManagedServer",
|
"caption": "some new UnixUser in client's ManagedWebspace",
|
||||||
"config": {}
|
"config": {}
|
||||||
}
|
}
|
||||||
""".formatted(givenParentAsset.getUuid()))
|
""".formatted(givenParentAsset.getUuid()))
|
||||||
@ -246,9 +245,9 @@ class HsHostingAssetControllerAcceptanceTest extends ContextBasedTestWithCleanup
|
|||||||
.contentType(ContentType.JSON)
|
.contentType(ContentType.JSON)
|
||||||
.body("", lenientlyEquals("""
|
.body("", lenientlyEquals("""
|
||||||
{
|
{
|
||||||
"type": "MANAGED_WEBSPACE",
|
"type": "UNIX_USER",
|
||||||
"identifier": "fir90",
|
"identifier": "fir01-temp",
|
||||||
"caption": "some new ManagedWebspace in client's ManagedServer",
|
"caption": "some new UnixUser in client's ManagedWebspace",
|
||||||
"config": {}
|
"config": {}
|
||||||
}
|
}
|
||||||
"""))
|
"""))
|
||||||
@ -265,7 +264,9 @@ class HsHostingAssetControllerAcceptanceTest extends ContextBasedTestWithCleanup
|
|||||||
void propertyValidationsArePerformend_whenAddingAsset() {
|
void propertyValidationsArePerformend_whenAddingAsset() {
|
||||||
|
|
||||||
context.define("superuser-alex@hostsharing.net");
|
context.define("superuser-alex@hostsharing.net");
|
||||||
final var givenBookingItem = givenBookingItem("D-1000111 default project", "some PrivateCloud");
|
final var givenBookingItem = givenSomeNewBookingItem("D-1000111 default project",
|
||||||
|
HsBookingItemType.MANAGED_SERVER,
|
||||||
|
"some PrivateCloud");
|
||||||
|
|
||||||
RestAssured // @formatter:off
|
RestAssured // @formatter:off
|
||||||
.given()
|
.given()
|
||||||
@ -558,10 +559,22 @@ class HsHostingAssetControllerAcceptanceTest extends ContextBasedTestWithCleanup
|
|||||||
}).assertSuccessful().returnedValue();
|
}).assertSuccessful().returnedValue();
|
||||||
}
|
}
|
||||||
|
|
||||||
HsBookingItemEntity givenBookingItem(final String projectCaption, final String bookingItemCaption) {
|
HsBookingItemEntity givenSomeNewBookingItem(final String projectCaption, final HsBookingItemType bookingItemType, final String bookingItemCaption) {
|
||||||
return bookingItemRepo.findByCaption(bookingItemCaption).stream()
|
return jpaAttempt.transacted(() -> {
|
||||||
.filter(bi -> bi.getRelatedProject().getCaption().contains(projectCaption))
|
context.define("superuser-alex@hostsharing.net");
|
||||||
.findAny().orElseThrow();
|
final var project = projectRepo.findByCaption(projectCaption).getFirst();
|
||||||
|
final var resources = switch (bookingItemType) {
|
||||||
|
case MANAGED_SERVER -> Map.<String, Object>ofEntries(entry("CPUs", 1), entry("RAM", 20), entry("SSD", 25), entry("Traffic", 250));
|
||||||
|
default -> new HashMap<String, Object>();
|
||||||
|
};
|
||||||
|
final var newBookingItem = HsBookingItemEntity.builder()
|
||||||
|
.project(project)
|
||||||
|
.type(bookingItemType)
|
||||||
|
.caption(bookingItemCaption)
|
||||||
|
.resources(resources)
|
||||||
|
.build();
|
||||||
|
return toCleanup(bookingItemRepo.save(newBookingItem));
|
||||||
|
}).assertSuccessful().returnedValue();
|
||||||
}
|
}
|
||||||
|
|
||||||
HsHostingAssetEntity givenParentAsset(final HsHostingAssetType assetType, final String assetIdentifier) {
|
HsHostingAssetEntity givenParentAsset(final HsHostingAssetType assetType, final String assetIdentifier) {
|
||||||
@ -574,16 +587,23 @@ class HsHostingAssetControllerAcceptanceTest extends ContextBasedTestWithCleanup
|
|||||||
@SafeVarargs
|
@SafeVarargs
|
||||||
private HsHostingAssetEntity givenSomeTemporaryHostingAsset(final String identifierSuffix,
|
private HsHostingAssetEntity givenSomeTemporaryHostingAsset(final String identifierSuffix,
|
||||||
final HsHostingAssetType hostingAssetType,
|
final HsHostingAssetType hostingAssetType,
|
||||||
final Map.Entry<String, Object>... resources) {
|
final Map.Entry<String, Object>... config) {
|
||||||
return jpaAttempt.transacted(() -> {
|
return jpaAttempt.transacted(() -> {
|
||||||
context.define("superuser-alex@hostsharing.net");
|
context.define("superuser-alex@hostsharing.net");
|
||||||
|
final var bookingItemType = switch (hostingAssetType) {
|
||||||
|
case CLOUD_SERVER -> HsBookingItemType.CLOUD_SERVER;
|
||||||
|
case MANAGED_SERVER -> HsBookingItemType.MANAGED_SERVER;
|
||||||
|
case MANAGED_WEBSPACE -> HsBookingItemType.MANAGED_WEBSPACE;
|
||||||
|
default -> null;
|
||||||
|
};
|
||||||
|
final var newBookingItem = givenSomeNewBookingItem("D-1000111 default project", bookingItemType, "temp ManagedServer");
|
||||||
final var newAsset = HsHostingAssetEntity.builder()
|
final var newAsset = HsHostingAssetEntity.builder()
|
||||||
.uuid(UUID.randomUUID())
|
.uuid(UUID.randomUUID())
|
||||||
.bookingItem(givenBookingItem("D-1000111 default project", "some ManagedServer"))
|
.bookingItem(newBookingItem)
|
||||||
.type(hostingAssetType)
|
.type(hostingAssetType)
|
||||||
.identifier("vm" + identifierSuffix)
|
.identifier("vm" + identifierSuffix)
|
||||||
.caption("some test-asset")
|
.caption("some test-asset")
|
||||||
.config(Map.ofEntries(resources))
|
.config(Map.ofEntries(config))
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
return assetRepo.save(newAsset);
|
return assetRepo.save(newAsset);
|
||||||
|
@ -58,7 +58,7 @@ class HsHostingAssetEntityUnitTest {
|
|||||||
void toStringContainsAllPropertiesAndResourcesSortedByKey() {
|
void toStringContainsAllPropertiesAndResourcesSortedByKey() {
|
||||||
|
|
||||||
assertThat(givenWebspace.toString()).isEqualTo(
|
assertThat(givenWebspace.toString()).isEqualTo(
|
||||||
"HsHostingAssetEntity(MANAGED_WEBSPACE, xyz00, some managed webspace, MANAGED_SERVER:vm1234, D-1234500:test project:test booking item, { CPUs: 2, HDD-storage: 2048, SSD-storage: 512 })");
|
"HsHostingAssetEntity(MANAGED_WEBSPACE, xyz00, some managed webspace, MANAGED_SERVER:vm1234, D-1234500:test project:test cloud server booking item, { CPUs: 2, HDD-storage: 2048, SSD-storage: 512 })");
|
||||||
|
|
||||||
assertThat(givenUnixUser.toString()).isEqualTo(
|
assertThat(givenUnixUser.toString()).isEqualTo(
|
||||||
"HsHostingAssetEntity(UNIX_USER, xyz00-web, some unix-user, MANAGED_WEBSPACE:xyz00, { HDD-hard-quota: 512, HDD-soft-quota: 256, SSD-hard-quota: 256, SSD-soft-quota: 128 })");
|
"HsHostingAssetEntity(UNIX_USER, xyz00-web, some unix-user, MANAGED_WEBSPACE:xyz00, { HDD-hard-quota: 512, HDD-soft-quota: 256, SSD-hard-quota: 256, SSD-soft-quota: 128 })");
|
||||||
|
@ -3,7 +3,6 @@ package net.hostsharing.hsadminng.hs.hosting.asset.validators;
|
|||||||
import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemEntity;
|
import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemEntity;
|
||||||
import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemType;
|
import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemType;
|
||||||
import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetEntity;
|
import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetEntity;
|
||||||
import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetType;
|
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
|
||||||
@ -21,6 +20,7 @@ class HsHostingAssetEntityValidatorUnitTest {
|
|||||||
.identifier("vm1234")
|
.identifier("vm1234")
|
||||||
.bookingItem(HsBookingItemEntity.builder().type(HsBookingItemType.MANAGED_SERVER).build())
|
.bookingItem(HsBookingItemEntity.builder().type(HsBookingItemType.MANAGED_SERVER).build())
|
||||||
.parentAsset(HsHostingAssetEntity.builder().type(MANAGED_SERVER).build())
|
.parentAsset(HsHostingAssetEntity.builder().type(MANAGED_SERVER).build())
|
||||||
|
.assignedToAsset(HsHostingAssetEntity.builder().type(MANAGED_SERVER).build())
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
// when
|
// when
|
||||||
@ -28,8 +28,8 @@ class HsHostingAssetEntityValidatorUnitTest {
|
|||||||
|
|
||||||
// then
|
// then
|
||||||
assertThat(result.getMessage()).contains(
|
assertThat(result.getMessage()).contains(
|
||||||
"'MANAGED_SERVER:vm1234.parentAsset' must not be null but is set to D-???????-?:null",
|
"'MANAGED_SERVER:vm1234.parentAsset' must be null but is set to D-???????-?:null",
|
||||||
"'MANAGED_SERVER:vm1234.assignedToAsset' must not be null but is set to D-???????-?:null"
|
"'MANAGED_SERVER:vm1234.assignedToAsset' must be null but is set to D-???????-?:null"
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -20,6 +20,8 @@ class HsManagedServerHostingAssetValidatorUnitTest {
|
|||||||
.type(MANAGED_SERVER)
|
.type(MANAGED_SERVER)
|
||||||
.identifier("vm1234")
|
.identifier("vm1234")
|
||||||
.bookingItem(HsBookingItemEntity.builder().type(HsBookingItemType.MANAGED_SERVER).build())
|
.bookingItem(HsBookingItemEntity.builder().type(HsBookingItemType.MANAGED_SERVER).build())
|
||||||
|
.parentAsset(HsHostingAssetEntity.builder().build())
|
||||||
|
.assignedToAsset(HsHostingAssetEntity.builder().build())
|
||||||
.config(Map.ofEntries(
|
.config(Map.ofEntries(
|
||||||
entry("monit_max_hdd_usage", "90"),
|
entry("monit_max_hdd_usage", "90"),
|
||||||
entry("monit_max_cpu_usage", 2),
|
entry("monit_max_cpu_usage", 2),
|
||||||
@ -33,8 +35,8 @@ class HsManagedServerHostingAssetValidatorUnitTest {
|
|||||||
|
|
||||||
// then
|
// then
|
||||||
assertThat(result).containsExactlyInAnyOrder(
|
assertThat(result).containsExactlyInAnyOrder(
|
||||||
"'MANAGED_SERVER:vm1234.parentAsset' must not be null but is set to D-???????-?:null",
|
"'MANAGED_SERVER:vm1234.parentAsset' must be null but is set to D-???????-?:null",
|
||||||
"'MANAGED_SERVER:vm1234.assignedToAsset' must not be null but is set to D-???????-?:null",
|
"'MANAGED_SERVER:vm1234.assignedToAsset' must be null but is set to D-???????-?:null",
|
||||||
"'MANAGED_SERVER:vm1234.config.monit_max_cpu_usage' is expected to be >= 10 but is 2",
|
"'MANAGED_SERVER:vm1234.config.monit_max_cpu_usage' is expected to be >= 10 but is 2",
|
||||||
"'MANAGED_SERVER:vm1234.config.monit_max_ram_usage' is expected to be <= 100 but is 101",
|
"'MANAGED_SERVER:vm1234.config.monit_max_ram_usage' is expected to be <= 100 but is 101",
|
||||||
"'MANAGED_SERVER:vm1234.config.monit_max_hdd_usage' is expected to be of type class java.lang.Integer, but is of type 'String'");
|
"'MANAGED_SERVER:vm1234.config.monit_max_hdd_usage' is expected to be of type class java.lang.Integer, but is of type 'String'");
|
||||||
|
@ -84,7 +84,11 @@ class HsManagedWebspaceHostingAssetValidatorUnitTest {
|
|||||||
final var validator = HsHostingAssetEntityValidatorRegistry.forType(MANAGED_WEBSPACE);
|
final var validator = HsHostingAssetEntityValidatorRegistry.forType(MANAGED_WEBSPACE);
|
||||||
final var mangedWebspaceHostingAssetEntity = HsHostingAssetEntity.builder()
|
final var mangedWebspaceHostingAssetEntity = HsHostingAssetEntity.builder()
|
||||||
.type(MANAGED_WEBSPACE)
|
.type(MANAGED_WEBSPACE)
|
||||||
.bookingItem(HsBookingItemEntity.builder().type(HsBookingItemType.MANAGED_WEBSPACE).build())
|
.bookingItem(HsBookingItemEntity.builder()
|
||||||
|
.type(HsBookingItemType.MANAGED_WEBSPACE)
|
||||||
|
.caption("some ManagedWebspace")
|
||||||
|
.resources(Map.ofEntries(entry("SSD", 25), entry("Traffic", 250)))
|
||||||
|
.build())
|
||||||
.parentAsset(mangedServerAssetEntity)
|
.parentAsset(mangedServerAssetEntity)
|
||||||
.identifier("abc00")
|
.identifier("abc00")
|
||||||
.build();
|
.build();
|
||||||
|
@ -3,6 +3,7 @@ package net.hostsharing.hsadminng.hs.hosting.asset.validators;
|
|||||||
import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetEntity;
|
import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetEntity;
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
import static net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetType.MANAGED_WEBSPACE;
|
||||||
import static net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetType.UNIX_USER;
|
import static net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetType.UNIX_USER;
|
||||||
import static org.assertj.core.api.Assertions.assertThat;
|
import static org.assertj.core.api.Assertions.assertThat;
|
||||||
|
|
||||||
@ -13,7 +14,8 @@ class HsUnixUserHostingAssetValidatorUnitTest {
|
|||||||
// given
|
// given
|
||||||
final var unixUserHostingAsset = HsHostingAssetEntity.builder()
|
final var unixUserHostingAsset = HsHostingAssetEntity.builder()
|
||||||
.type(UNIX_USER)
|
.type(UNIX_USER)
|
||||||
.identifier("abc")
|
.parentAsset(HsHostingAssetEntity.builder().type(MANAGED_WEBSPACE).identifier("abc00").build())
|
||||||
|
.identifier("xyz99-temp")
|
||||||
.build();
|
.build();
|
||||||
final var validator = HsHostingAssetEntityValidatorRegistry.forType(unixUserHostingAsset.getType());
|
final var validator = HsHostingAssetEntityValidatorRegistry.forType(unixUserHostingAsset.getType());
|
||||||
|
|
||||||
@ -22,6 +24,7 @@ class HsUnixUserHostingAssetValidatorUnitTest {
|
|||||||
final var result = validator.validate(unixUserHostingAsset);
|
final var result = validator.validate(unixUserHostingAsset);
|
||||||
|
|
||||||
// then
|
// then
|
||||||
assertThat(result).containsExactly("'identifier' expected to match '^vm[0-9][0-9][0-9][0-9]$', but is 'xyz99'");
|
assertThat(result).containsExactly(
|
||||||
|
"'identifier' expected to match '^abc00$|^abc00-[a-z0-9]+$', but is 'xyz99-temp'");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user