diff --git a/.aliases b/.aliases index f215442d..be378ea2 100644 --- a/.aliases +++ b/.aliases @@ -84,3 +84,9 @@ alias fp='grep -r '@Accepts' src | sed -e 's/^.*@/@/g' | sort -u | wc -l' alias gw-spotless='./gradlew spotlessApply -x pitest -x test -x :processResources' alias gw-test='. .aliases; ./gradlew test importOfficeData' alias gw-check='. .aliases; gw test importOfficeData check -x pitest -x :dependencyCheckAnalyze' + +# etc/docker-compose.yml limits CPUs+MEM and includes a PostgreSQL config for analysing slow queries +alias gw-importOfficeData-in-docker-compose=' + docker-compose -f etc/docker-compose.yml down && + docker-compose -f etc/docker-compose.yml up -d && sleep 10 && + time gw-importHostingAssets' diff --git a/doc/rbac-performance-analysis.md b/doc/rbac-performance-analysis.md index 3e43a090..504d1639 100644 --- a/doc/rbac-performance-analysis.md +++ b/doc/rbac-performance-analysis.md @@ -126,7 +126,7 @@ SELECT calls, query FROM statements WHERE calls > 100 AND shared_blks_hit > 0 -ORDER BY total_exec_time_mins DESC +ORDER BY total_exec_time DESC LIMIT 16; ``` diff --git a/docker-compose.yml b/etc/docker-compose.yml similarity index 65% rename from docker-compose.yml rename to etc/docker-compose.yml index 974104bb..f35c4077 100644 --- a/docker-compose.yml +++ b/etc/docker-compose.yml @@ -7,7 +7,7 @@ services: environment: POSTGRES_PASSWORD: password volumes: - - /home/mi/Projekte/Hostsharing/hsadmin-ng/etc/postgresql-log-slow-queries.conf:/etc/postgresql/postgresql.conf + - ./postgresql-log-slow-queries.conf:/etc/postgresql/postgresql.conf ports: - "5432:5432" command: @@ -17,3 +17,11 @@ services: apt-get update && apt-get install -y postgresql-contrib && docker-entrypoint.sh postgres -c config_file=/etc/postgresql/postgresql.conf + deploy: + resources: + limits: + cpus: '2' + memory: 8G + reservations: + cpus: '1' + memory: 2G diff --git a/src/main/java/net/hostsharing/hsadminng/hs/booking/item/HsBookingItemEntity.java b/src/main/java/net/hostsharing/hsadminng/hs/booking/item/HsBookingItemEntity.java index a7b9db66..58a5d4b8 100644 --- a/src/main/java/net/hostsharing/hsadminng/hs/booking/item/HsBookingItemEntity.java +++ b/src/main/java/net/hostsharing/hsadminng/hs/booking/item/HsBookingItemEntity.java @@ -158,8 +158,8 @@ public class HsBookingItemEntity implements Stringifyable, BaseEntity directProps() { - return resources; + public PatchableMapWrapper directProps() { + return getResources(); } @Override diff --git a/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetEntity.java b/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetEntity.java index 4083ab36..46b315ff 100644 --- a/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetEntity.java +++ b/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetEntity.java @@ -128,8 +128,8 @@ public class HsHostingAssetEntity implements HsHostingAsset { } @Override - public Map directProps() { - return config; + public PatchableMapWrapper directProps() { + return getConfig(); } @Override diff --git a/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetEntityPatcher.java b/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetEntityPatcher.java index 856b4243..c16c22e0 100644 --- a/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetEntityPatcher.java +++ b/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetEntityPatcher.java @@ -14,7 +14,7 @@ public class HsHostingAssetEntityPatcher implements EntityPatcher !errorMsg.matches(ignoreRegExp)) + .filter(error -> ignoreRegExpPatterns.stream().noneMatch(p -> p.matcher(error).matches() )) .toList() ); return this; diff --git a/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsEMailAddressHostingAssetValidator.java b/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsEMailAddressHostingAssetValidator.java index 3ee8f3d3..77c32768 100644 --- a/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsEMailAddressHostingAssetValidator.java +++ b/src/main/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsEMailAddressHostingAssetValidator.java @@ -11,20 +11,22 @@ import static net.hostsharing.hsadminng.hs.validation.StringProperty.stringPrope class HsEMailAddressHostingAssetValidator extends HostingAssetEntityValidator { - private static final String UNIX_USER_REGEX = "^[a-z][a-z0-9]{2}[0-9]{2}(-[a-z0-9][a-z0-9\\._-]*)?$"; // also accepts legacy pac-names + private static final String TARGET_MAILBOX_REGEX = "^[a-z][a-z0-9]{2}[0-9]{2}(-[a-z0-9][a-z0-9\\.+_-]*)?$"; // also accepts legacy pac-names private static final String EMAIL_ADDRESS_LOCAL_PART_REGEX = "[a-zA-Z0-9_!#$%&'*+/=?`{|}~^.-]+"; // RFC 5322 private static final String EMAIL_ADDRESS_DOMAIN_PART_REGEX = "[a-zA-Z0-9.-]+"; - private static final String EMAIL_ADDRESS_FULL_REGEX = "^" + EMAIL_ADDRESS_LOCAL_PART_REGEX + "@" + EMAIL_ADDRESS_DOMAIN_PART_REGEX + "$"; + private static final String EMAIL_ADDRESS_FULL_REGEX = "^(" + EMAIL_ADDRESS_LOCAL_PART_REGEX + ")?@" + EMAIL_ADDRESS_DOMAIN_PART_REGEX + "$"; + private static final String NOBODY_REGEX = "^nobody$"; + private static final String DEVNULL_REGEX = "^/dev/null$"; public static final int EMAIL_ADDRESS_MAX_LENGTH = 320; // according to RFC 5321 and RFC 5322 HsEMailAddressHostingAssetValidator() { super( HsHostingAssetType.EMAIL_ADDRESS, AlarmContact.isOptional(), - stringProperty("local-part").matchesRegEx("^" + EMAIL_ADDRESS_LOCAL_PART_REGEX + "$").required(), - stringProperty("sub-domain").matchesRegEx("^" + EMAIL_ADDRESS_LOCAL_PART_REGEX + "$").optional(), + stringProperty("local-part").matchesRegEx("^" + EMAIL_ADDRESS_LOCAL_PART_REGEX + "$").writeOnce().optional(), + stringProperty("sub-domain").matchesRegEx("^" + EMAIL_ADDRESS_LOCAL_PART_REGEX + "$").writeOnce().optional(), arrayOf( - stringProperty("target").maxLength(EMAIL_ADDRESS_MAX_LENGTH).matchesRegEx(UNIX_USER_REGEX, EMAIL_ADDRESS_FULL_REGEX) + stringProperty("target").maxLength(EMAIL_ADDRESS_MAX_LENGTH).matchesRegEx(TARGET_MAILBOX_REGEX, EMAIL_ADDRESS_FULL_REGEX, NOBODY_REGEX, DEVNULL_REGEX) ).required().minLength(1)); } @@ -43,9 +45,9 @@ class HsEMailAddressHostingAssetValidator extends HostingAssetEntityValidator { } private static String combineIdentifier(final HsHostingAsset emailAddressAssetEntity) { - return emailAddressAssetEntity.getDirectValue("local-part", String.class) + - ofNullable(emailAddressAssetEntity.getDirectValue("sub-domain", String.class)).map(s -> "." + s).orElse("") + - "@" + - emailAddressAssetEntity.getParentAsset().getIdentifier(); + return ofNullable(emailAddressAssetEntity.getDirectValue("local-part", String.class)).orElse("") + + "@" + + ofNullable(emailAddressAssetEntity.getDirectValue("sub-domain", String.class)).map(s -> s + ".").orElse("") + + emailAddressAssetEntity.getParentAsset().getParentAsset().getIdentifier(); } } diff --git a/src/main/java/net/hostsharing/hsadminng/hs/validation/ArrayProperty.java b/src/main/java/net/hostsharing/hsadminng/hs/validation/ArrayProperty.java index 9001ea81..085d9e0f 100644 --- a/src/main/java/net/hostsharing/hsadminng/hs/validation/ArrayProperty.java +++ b/src/main/java/net/hostsharing/hsadminng/hs/validation/ArrayProperty.java @@ -43,10 +43,10 @@ public class ArrayProperty

, E> extends Valid @Override protected void validate(final List result, final E[] propValue, final PropertiesProvider propProvider) { if (minLength != null && propValue.length < minLength) { - result.add(propertyName + "' length is expected to be at min " + minLength + " but length of " + display(propValue) + " is " + propValue.length); + result.add(propertyName + "' length is expected to be at min " + minLength + " but length of " + displayArray(propValue) + " is " + propValue.length); } if (maxLength != null && propValue.length > maxLength) { - result.add(propertyName + "' length is expected to be at max " + maxLength + " but length of " + display(propValue) + " is " + propValue.length); + result.add(propertyName + "' length is expected to be at max " + maxLength + " but length of " + displayArray(propValue) + " is " + propValue.length); } stream(propValue).forEach(e -> elementsOf.validate(result, e, propProvider)); } @@ -57,7 +57,7 @@ public class ArrayProperty

, E> extends Valid } @SafeVarargs - private String display(final E... propValue) { + private String displayArray(final E... propValue) { return "[" + Arrays.toString(propValue) + "]"; } } diff --git a/src/main/java/net/hostsharing/hsadminng/hs/validation/PropertiesProvider.java b/src/main/java/net/hostsharing/hsadminng/hs/validation/PropertiesProvider.java index 363e0126..89c3f5cd 100644 --- a/src/main/java/net/hostsharing/hsadminng/hs/validation/PropertiesProvider.java +++ b/src/main/java/net/hostsharing/hsadminng/hs/validation/PropertiesProvider.java @@ -1,11 +1,11 @@ package net.hostsharing.hsadminng.hs.validation; -import java.util.Map; +import net.hostsharing.hsadminng.mapper.PatchableMapWrapper; public interface PropertiesProvider { boolean isLoaded(); - Map directProps(); + PatchableMapWrapper directProps(); Object getContextValue(final String propName); default T getDirectValue(final String propName, final Class clazz) { @@ -16,6 +16,10 @@ public interface PropertiesProvider { return cast(propName, directProps().get(propName), clazz, defaultValue); } + default boolean isPatched(String propertyName) { + return directProps().isPatched(propertyName); + } + default T getContextValue(final String propName, final Class clazz) { return cast(propName, getContextValue(propName), clazz, null); } diff --git a/src/main/java/net/hostsharing/hsadminng/hs/validation/StringProperty.java b/src/main/java/net/hostsharing/hsadminng/hs/validation/StringProperty.java index 7870ca87..f9a27e85 100644 --- a/src/main/java/net/hostsharing/hsadminng/hs/validation/StringProperty.java +++ b/src/main/java/net/hostsharing/hsadminng/hs/validation/StringProperty.java @@ -77,6 +77,7 @@ public class StringProperty

> extends ValidatableProp @Override protected void validate(final List result, final String propValue, final PropertiesProvider propProvider) { + super.validate(result, propValue, propProvider); if (minLength != null && propValue.length()> extends ValidatableProp stream(matchesRegEx).map(p -> p.matcher(propValue)).noneMatch(Matcher::matches)) { result.add(propertyName + "' is expected to match any of " + Arrays.toString(matchesRegEx) + " but " + display(propValue) + " does not match" + (matchesRegEx.length>1?" any":"")); } - if (isReadOnly() && propValue != null) { - result.add(propertyName + "' is readonly but given as " + display(propValue)); - } } - private String display(final String propValue) { + @Override + protected String display(final String propValue) { return undisclosed ? "provided value" : ("'" + propValue + "'"); } diff --git a/src/main/java/net/hostsharing/hsadminng/hs/validation/ValidatableProperty.java b/src/main/java/net/hostsharing/hsadminng/hs/validation/ValidatableProperty.java index 0d8fa604..696f645b 100644 --- a/src/main/java/net/hostsharing/hsadminng/hs/validation/ValidatableProperty.java +++ b/src/main/java/net/hostsharing/hsadminng/hs/validation/ValidatableProperty.java @@ -34,7 +34,7 @@ import static org.apache.commons.lang3.ObjectUtils.isArray; public abstract class ValidatableProperty

, T> { protected static final String[] KEY_ORDER_HEAD = Array.of("propertyName"); - protected static final String[] KEY_ORDER_TAIL = Array.of("required", "requiresAtLeastOneOf", "requiresAtMaxOneOf", "defaultValue", "readOnly", "writeOnly", "computed", "isTotalsValidator", "thresholdPercentage"); + protected static final String[] KEY_ORDER_TAIL = Array.of("required", "requiresAtLeastOneOf", "requiresAtMaxOneOf", "defaultValue", "readOnly", "writeOnce","writeOnly", "computed", "isTotalsValidator", "thresholdPercentage"); protected static final String[] KEY_ORDER = Array.join(KEY_ORDER_HEAD, KEY_ORDER_TAIL); final Class type; @@ -66,6 +66,9 @@ public abstract class ValidatableProperty

, T @Accessors(makeFinal = true, chain = true, fluent = false) private boolean writeOnly; + @Accessors(makeFinal = true, chain = true, fluent = false) + private boolean writeOnce; + private Function[], T[]> deferredInit; private boolean isTotalsValidator = false; @@ -97,7 +100,11 @@ public abstract class ValidatableProperty

, T public P writeOnly() { this.writeOnly = true; - optional(); + return self(); + } + + public P writeOnce() { + this.writeOnce = true; return self(); } @@ -198,6 +205,9 @@ public abstract class ValidatableProperty

, T if (required == TRUE) { result.add(propertyName + "' is required but missing"); } + if (isWriteOnce() && propsProvider.isLoaded() && propsProvider.isPatched(propertyName) ) { + result.add(propertyName + "' is write-once but got removed"); + } validateRequiresAtLeastOneOf(result, propsProvider); } if (propValue != null){ @@ -239,19 +249,35 @@ public abstract class ValidatableProperty

, T } } - protected abstract void validate(final List result, final T propValue, final PropertiesProvider propProvider); + protected void validate(final List result, final T propValue, final PropertiesProvider propProvider) { + if (isReadOnly() && propValue != null) { + result.add(propertyName + "' is readonly but given as " + display(propValue)); + } + if (isWriteOnce() && propProvider.isLoaded() && propValue != null && propProvider.isPatched(propertyName) ) { + result.add(propertyName + "' is write-once but given as " + display(propValue)); + } + } public void verifyConsistency(final Map.Entry, ?> typeDef) { - if (required == null && requiresAtLeastOneOf == null && requiresAtMaxOneOf == null && !readOnly && defaultValue == null) { + if (isSpecPotentiallyComplete()) { throw new IllegalStateException(typeDef.getKey() + "[" + propertyName + "] not fully initialized, please call either .readOnly(), .required(), .optional(), .withDefault(...), .requiresAtLeastOneOf(...) or .requiresAtMaxOneOf(...)" ); } } + private boolean isSpecPotentiallyComplete() { + return required == null && requiresAtLeastOneOf == null && requiresAtMaxOneOf == null && !readOnly && !writeOnly + && defaultValue == null; + } + @SuppressWarnings("unchecked") public T getValue(final Map propValues) { return (T) Optional.ofNullable(propValues.get(propertyName)).orElse(defaultValue); } + protected String display(final T propValue) { + return propValue == null ? null : propValue.toString(); + } + protected abstract String simpleTypeName(); public Map toOrderedMap() { diff --git a/src/main/java/net/hostsharing/hsadminng/mapper/PatchableMapWrapper.java b/src/main/java/net/hostsharing/hsadminng/mapper/PatchableMapWrapper.java index 01b71ead..6f08b923 100644 --- a/src/main/java/net/hostsharing/hsadminng/mapper/PatchableMapWrapper.java +++ b/src/main/java/net/hostsharing/hsadminng/mapper/PatchableMapWrapper.java @@ -7,7 +7,9 @@ import org.apache.commons.lang3.tuple.ImmutablePair; import jakarta.validation.constraints.NotNull; import java.util.Collection; +import java.util.HashSet; import java.util.Map; +import java.util.Objects; import java.util.Set; import java.util.function.Consumer; @@ -23,6 +25,7 @@ public class PatchableMapWrapper implements Map { .configure(SerializationFeature.INDENT_OUTPUT, true); private final Map delegate; + private final Set patched = new HashSet<>(); private PatchableMapWrapper(final Map map) { delegate = map; @@ -36,6 +39,10 @@ public class PatchableMapWrapper implements Map { }); } + public static PatchableMapWrapper of(final Map delegate) { + return new PatchableMapWrapper(delegate); + } + @NotNull public static ImmutablePair entry(final String key, final E value) { return new ImmutablePair<>(key, value); @@ -45,6 +52,7 @@ public class PatchableMapWrapper implements Map { if (entries != null ) { delegate.clear(); delegate.putAll(entries); + patched.clear(); } } @@ -58,6 +66,10 @@ public class PatchableMapWrapper implements Map { }); } + public boolean isPatched(final String propertyName) { + return patched.contains(propertyName); + } + @SneakyThrows public String toString() { return jsonWriter.writeValueAsString(delegate); @@ -92,11 +104,17 @@ public class PatchableMapWrapper implements Map { @Override public T put(final String key, final T value) { + if (!Objects.equals(value, delegate.get(key))) { + patched.add(key); + } return delegate.put(key, value); } @Override public T remove(final Object key) { + if (delegate.containsKey(key.toString())) { + patched.add(key.toString()); + } return delegate.remove(key); } @@ -107,20 +125,24 @@ public class PatchableMapWrapper implements Map { @Override public void clear() { + patched.addAll(delegate.keySet()); delegate.clear(); } @Override + @NotNull public Set keySet() { return delegate.keySet(); } @Override + @NotNull public Collection values() { return delegate.values(); } @Override + @NotNull public Set> entrySet() { return delegate.entrySet(); } diff --git a/src/main/resources/db/changelog/1-rbac/1058-rbac-generators.sql b/src/main/resources/db/changelog/1-rbac/1058-rbac-generators.sql index 4bfc83b2..59223d9d 100644 --- a/src/main/resources/db/changelog/1-rbac/1058-rbac-generators.sql +++ b/src/main/resources/db/changelog/1-rbac/1058-rbac-generators.sql @@ -189,15 +189,11 @@ begin select g.descendantUuid, g.ascendantUuid, level + 1 as level from RbacGrants g inner join grants on grants.descendantUuid = g.ascendantUuid - where g.assumed - ), - granted as ( - select distinct descendantUuid - from grants + where g.assumed and level<10 ) select distinct perm.objectUuid as objectUuid - from granted - join RbacPermission perm on granted.descendantUuid = perm.uuid + from grants + join RbacPermission perm on grants.descendantUuid = perm.uuid join RbacObject obj on obj.uuid = perm.objectUuid where obj.objectTable = '%1$s' -- 'SELECT' permission is included in all other permissions limit 8001 diff --git a/src/test/java/net/hostsharing/hsadminng/hs/booking/item/HsBookingItemRepositoryIntegrationTest.java b/src/test/java/net/hostsharing/hsadminng/hs/booking/item/HsBookingItemRepositoryIntegrationTest.java index eedfe603..d0d58cfc 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/booking/item/HsBookingItemRepositoryIntegrationTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/booking/item/HsBookingItemRepositoryIntegrationTest.java @@ -170,9 +170,9 @@ class HsBookingItemRepositoryIntegrationTest extends ContextBasedTestWithCleanup // then allTheseBookingItemsAreReturned( result, - "HsBookingItemEntity(D-1000212:D-1000212 default project, MANAGED_WEBSPACE, [2022-10-01,), separate ManagedWebspace, { Daemons: 0, Multi: 1, SSD: 100, Traffic: 50 } )", - "HsBookingItemEntity(D-1000212:D-1000212 default project, MANAGED_SERVER, [2022-10-01,), separate ManagedServer, { CPU: 2, RAM: 8, SSD: 500, Traffic: 500 } )", - "HsBookingItemEntity(D-1000212:D-1000212 default project, PRIVATE_CLOUD, [2024-04-01,), some PrivateCloud, { CPU: 10, HDD: 10000, RAM: 32, SSD: 4000, Traffic: 2000 } )"); + "HsBookingItemEntity(D-1000212:D-1000212 default project, MANAGED_WEBSPACE, [2022-10-01,), separate ManagedWebspace, { Daemons: 0, Multi: 1, SSD: 100, Traffic: 50 })", + "HsBookingItemEntity(D-1000212:D-1000212 default project, MANAGED_SERVER, [2022-10-01,), separate ManagedServer, { CPU: 2, RAM: 8, SSD: 500, Traffic: 500 })", + "HsBookingItemEntity(D-1000212:D-1000212 default project, PRIVATE_CLOUD, [2024-04-01,), some PrivateCloud, { CPU: 10, HDD: 10000, RAM: 32, SSD: 4000, Traffic: 2000 })"); assertThat(result.stream().filter(bi -> bi.getRelatedHostingAsset()!=null).findAny()) .as("at least one relatedProject expected, but none found => fetching relatedProject does not work") .isNotEmpty(); @@ -193,9 +193,9 @@ class HsBookingItemRepositoryIntegrationTest extends ContextBasedTestWithCleanup // then: exactlyTheseBookingItemsAreReturned( result, - "HsBookingItemEntity(D-1000111:D-1000111 default project, MANAGED_WEBSPACE, [2022-10-01,), separate ManagedWebspace, { Daemons: 0, Multi: 1, SSD: 100, Traffic: 50 } )", - "HsBookingItemEntity(D-1000111:D-1000111 default project, MANAGED_SERVER, [2022-10-01,), separate ManagedServer, { CPU: 2, RAM: 8, SSD: 500, Traffic: 500 } )", - "HsBookingItemEntity(D-1000111:D-1000111 default project, PRIVATE_CLOUD, [2024-04-01,), some PrivateCloud, { CPU: 10, HDD: 10000, RAM: 32, SSD: 4000, Traffic: 2000 } )"); + "HsBookingItemEntity(D-1000111:D-1000111 default project, MANAGED_WEBSPACE, [2022-10-01,), separate ManagedWebspace, { Daemons : 0, Multi : 1, SSD : 100, Traffic : 50 })", + "HsBookingItemEntity(D-1000111:D-1000111 default project, MANAGED_SERVER, [2022-10-01,), separate ManagedServer, { CPU : 2, RAM : 8, SSD : 500, Traffic : 500 })", + "HsBookingItemEntity(D-1000111:D-1000111 default project, PRIVATE_CLOUD, [2024-04-01,), some PrivateCloud, { CPU : 10, HDD : 10000, RAM : 32, SSD : 4000, Traffic : 2000 })"); } } @@ -359,6 +359,7 @@ class HsBookingItemRepositoryIntegrationTest extends ContextBasedTestWithCleanup .extracting(HsBookingItemEntity::toString) .extracting(string -> string.replaceAll("\\s+", " ")) .extracting(string -> string.replaceAll("\"", "")) + .extracting(string -> string.replaceAll(" : ", ": ")) .contains(bookingItemNames); } } diff --git a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetControllerAcceptanceTest.java b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetControllerAcceptanceTest.java index 1e822604..476b6bb0 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetControllerAcceptanceTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetControllerAcceptanceTest.java @@ -546,7 +546,7 @@ class HsHostingAssetControllerAcceptanceTest extends ContextBasedTestWithCleanup .contentType(ContentType.JSON) .body(""" { - "caption": "some patched test-unix-user", + "caption" : "some patched test-unix-user", "config": { "shell": "/bin/bash", "totpKey": "0x1234567890abcdef0123456789abcdef", @@ -588,7 +588,7 @@ class HsHostingAssetControllerAcceptanceTest extends ContextBasedTestWithCleanup }).returnedValue()).isPresent().get() .matches(asset -> { assertThat(asset.getCaption()).isEqualTo("some patched test-unix-user"); - assertThat(asset.getConfig().toString()).isEqualTo(""" + assertThat(asset.getConfig().toString()).isEqualToIgnoringWhitespace(""" { "password": "$6$Jr5w/Y8zo8pCkqg7$/rePRbvey3R6Sz/02YTlTQcRt5qdBPTj2h5.hz.rB8NfIoND8pFOjeB7orYcPs9JNf3JDxPP2V.6MQlE5BwAY/", "shell": "/bin/bash", diff --git a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetRepositoryIntegrationTest.java b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetRepositoryIntegrationTest.java index 99f0efd6..ae733e54 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetRepositoryIntegrationTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/HsHostingAssetRepositoryIntegrationTest.java @@ -227,7 +227,7 @@ class HsHostingAssetRepositoryIntegrationTest extends ContextBasedTestWithCleanu exactlyTheseAssetsAreReturned( result, "HsHostingAssetEntity(MANAGED_WEBSPACE, fir01, some Webspace, MANAGED_SERVER:vm1011, D-1000111:D-1000111 default project:separate ManagedWebspace)", - "HsHostingAssetEntity(MANAGED_SERVER, vm1011, some ManagedServer, D-1000111:D-1000111 default project:separate ManagedServer, { monit_max_cpu_usage: 90, monit_max_ram_usage: 80, monit_max_ssd_usage: 70 } )"); + "HsHostingAssetEntity(MANAGED_SERVER, vm1011, some ManagedServer, D-1000111:D-1000111 default project:separate ManagedServer, { monit_max_cpu_usage : 90, monit_max_ram_usage : 80, monit_max_ssd_usage : 70 })"); } @Test @@ -444,6 +444,7 @@ class HsHostingAssetRepositoryIntegrationTest extends ContextBasedTestWithCleanu .extracting(HsHostingAssetEntity::toString) .extracting(input -> input.replaceAll("\\s+", " ")) .extracting(input -> input.replaceAll("\"", "")) + .extracting(input -> input.replaceAll("\" : ", "\": ")) .containsExactlyInAnyOrder(serverNames); } } diff --git a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsDomainDnsSetupHostingAssetValidatorUnitTest.java b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsDomainDnsSetupHostingAssetValidatorUnitTest.java index 3234ba28..a907dc60 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsDomainDnsSetupHostingAssetValidatorUnitTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsDomainDnsSetupHostingAssetValidatorUnitTest.java @@ -5,8 +5,10 @@ import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemType; import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetEntity; import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetEntity.HsHostingAssetEntityBuilder; import net.hostsharing.hsadminng.mapper.Array; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import java.util.ArrayList; import java.util.Map; import static java.util.Map.entry; @@ -60,6 +62,11 @@ class HsDomainDnsSetupHostingAssetValidatorUnitTest { )); } + @BeforeEach + void reset() { + HsDomainDnsSetupHostingAssetValidator.addZonefileErrorsTo(null); + } + @Test void containsExpectedProperties() { // when @@ -318,4 +325,30 @@ class HsDomainDnsSetupHostingAssetValidatorUnitTest { "[example.org|DNS] zone example.org/IN: not loaded due to errors." ); } + + @Test + void acceptsInvalidZonefileWithActiveErrorFilter() { + // given + final var givenEntity = validEntityBuilder().config(Map.ofEntries( + entry("user-RR", Array.of( + "example.org. 1814400 IN SOA example.org. root.example.org (1234 10800 900 604800 86400)", + "example.org. 1814400 IN SOA example.org. root.example.org (4321 10800 900 604800 86400)" + )) + )) + .build(); + final var validator = HostingAssetEntityValidatorRegistry.forType(givenEntity.getType()); + + // when + final var zonefileErrors = new ArrayList(); + HsDomainDnsSetupHostingAssetValidator.addZonefileErrorsTo(zonefileErrors); + final var errors = validator.validateContext(givenEntity); + + // then + assertThat(errors).isEmpty(); + assertThat(zonefileErrors).containsExactlyInAnyOrder( + "[example.org|DNS] dns_master_load:line 26: example.org: multiple RRs of singleton type", + "[example.org|DNS] zone example.org/IN: loading from master file (null) failed: multiple RRs of singleton type", + "[example.org|DNS] zone example.org/IN: not loaded due to errors." + ); + } } diff --git a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsEMailAddressHostingAssetValidatorUnitTest.java b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsEMailAddressHostingAssetValidatorUnitTest.java index 4a30f394..386ba632 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsEMailAddressHostingAssetValidatorUnitTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/hosting/asset/validators/HsEMailAddressHostingAssetValidatorUnitTest.java @@ -4,30 +4,43 @@ import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetEntity; import net.hostsharing.hsadminng.mapper.Array; import org.junit.jupiter.api.Test; +import java.util.HashMap; import java.util.Map; -import static java.util.Map.entry; +import static java.util.Map.ofEntries; import static net.hostsharing.hsadminng.hs.booking.item.TestHsBookingItem.TEST_MANAGED_SERVER_BOOKING_ITEM; import static net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetType.DOMAIN_MBOX_SETUP; import static net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetType.EMAIL_ADDRESS; import static net.hostsharing.hsadminng.hs.hosting.asset.TestHsHostingAssetEntities.TEST_MANAGED_SERVER_HOSTING_ASSET; +import static net.hostsharing.hsadminng.mapper.PatchableMapWrapper.entry; import static org.assertj.core.api.Assertions.assertThat; class HsEMailAddressHostingAssetValidatorUnitTest { - final static HsHostingAssetEntity domainMboxetup = HsHostingAssetEntity.builder() + final static HsHostingAssetEntity domainSetup = HsHostingAssetEntity.builder() .type(DOMAIN_MBOX_SETUP) .identifier("example.org") .build(); + final static HsHostingAssetEntity domainMboxSetup = HsHostingAssetEntity.builder() + .type(DOMAIN_MBOX_SETUP) + .identifier("example.org|MBOX") + .parentAsset(domainSetup) + .build(); static HsHostingAssetEntity.HsHostingAssetEntityBuilder validEntityBuilder() { return HsHostingAssetEntity.builder() .type(EMAIL_ADDRESS) - .parentAsset(domainMboxetup) - .identifier("test@example.org") - .config(Map.ofEntries( - entry("local-part", "test"), - entry("target", Array.of("xyz00", "xyz00-abc", "office@example.com")) - )); + .parentAsset(domainMboxSetup) + .identifier("old-local-part@example.org") + .config(new HashMap<>(ofEntries( + entry("local-part", "old-local-part"), + entry("target", Array.of( + "xyz00", + "xyz00-abc", + "xyz00-xyz+list", + "office@example.com", + "/dev/null" + )) + ))); } @Test @@ -37,9 +50,9 @@ class HsEMailAddressHostingAssetValidatorUnitTest { // then assertThat(validator.properties()).map(Map::toString).containsExactlyInAnyOrder( - "{type=string, propertyName=local-part, matchesRegEx=[^[a-zA-Z0-9_!#$%&'*+/=?`{|}~^.-]+$], required=true}", - "{type=string, propertyName=sub-domain, matchesRegEx=[^[a-zA-Z0-9_!#$%&'*+/=?`{|}~^.-]+$]}", - "{type=string[], propertyName=target, elementsOf={type=string, propertyName=target, matchesRegEx=[^[a-z][a-z0-9]{2}[0-9]{2}(-[a-z0-9][a-z0-9\\._-]*)?$, ^[a-zA-Z0-9_!#$%&'*+/=?`{|}~^.-]+@[a-zA-Z0-9.-]+$], maxLength=320}, required=true, minLength=1}"); + "{type=string, propertyName=local-part, matchesRegEx=[^[a-zA-Z0-9_!#$%&'*+/=?`{|}~^.-]+$], writeOnce=true}", + "{type=string, propertyName=sub-domain, matchesRegEx=[^[a-zA-Z0-9_!#$%&'*+/=?`{|}~^.-]+$], writeOnce=true}", + "{type=string[], propertyName=target, elementsOf={type=string, propertyName=target, matchesRegEx=[^[a-z][a-z0-9]{2}[0-9]{2}(-[a-z0-9][a-z0-9\\.+_-]*)?$, ^([a-zA-Z0-9_!#$%&'*+/=?`{|}~^.-]+)?@[a-zA-Z0-9.-]+$, ^nobody$, ^/dev/null$], maxLength=320}, required=true, minLength=1}"); } @Test @@ -59,10 +72,14 @@ class HsEMailAddressHostingAssetValidatorUnitTest { void rejectsInvalidProperties() { // given final var emailAddressHostingAssetEntity = validEntityBuilder() - .config(Map.ofEntries( + .config(new HashMap<>(ofEntries( entry("local-part", "no@allowed"), entry("sub-domain", "no@allowedeither"), - entry("target", Array.of("xyz00", "xyz00-abc", "garbage", "office@example.com")))) + entry("target", Array.of( + "xyz00", + "xyz00-abc", + "garbage", + "office@example.com"))))) .build(); final var validator = HostingAssetEntityValidatorRegistry.forType(emailAddressHostingAssetEntity.getType()); @@ -71,9 +88,69 @@ class HsEMailAddressHostingAssetValidatorUnitTest { // then assertThat(result).containsExactlyInAnyOrder( - "'EMAIL_ADDRESS:test@example.org.config.local-part' is expected to match any of [^[a-zA-Z0-9_!#$%&'*+/=?`{|}~^.-]+$] but 'no@allowed' does not match", - "'EMAIL_ADDRESS:test@example.org.config.sub-domain' is expected to match any of [^[a-zA-Z0-9_!#$%&'*+/=?`{|}~^.-]+$] but 'no@allowedeither' does not match", - "'EMAIL_ADDRESS:test@example.org.config.target' is expected to match any of [^[a-z][a-z0-9]{2}[0-9]{2}(-[a-z0-9][a-z0-9\\._-]*)?$, ^[a-zA-Z0-9_!#$%&'*+/=?`{|}~^.-]+@[a-zA-Z0-9.-]+$] but 'garbage' does not match any"); + "'EMAIL_ADDRESS:old-local-part@example.org.config.local-part' is expected to match any of [^[a-zA-Z0-9_!#$%&'*+/=?`{|}~^.-]+$] but 'no@allowed' does not match", + "'EMAIL_ADDRESS:old-local-part@example.org.config.sub-domain' is expected to match any of [^[a-zA-Z0-9_!#$%&'*+/=?`{|}~^.-]+$] but 'no@allowedeither' does not match", + "'EMAIL_ADDRESS:old-local-part@example.org.config.target' is expected to match any of [^[a-z][a-z0-9]{2}[0-9]{2}(-[a-z0-9][a-z0-9\\.+_-]*)?$, ^([a-zA-Z0-9_!#$%&'*+/=?`{|}~^.-]+)?@[a-zA-Z0-9.-]+$, ^nobody$, ^/dev/null$] but 'garbage' does not match any"); + } + + @Test + void rejectsOverwritingWriteOnceProperties() { + // given + final var emailAddressHostingAssetEntity = validEntityBuilder() + .isLoaded(true) + .build(); + final var validator = HostingAssetEntityValidatorRegistry.forType(emailAddressHostingAssetEntity.getType()); + + // when + emailAddressHostingAssetEntity.getConfig().put("local-part", "new-local-part"); + emailAddressHostingAssetEntity.getConfig().put("sub-domain", "new-sub-domain"); + final var result = validator.validateEntity(emailAddressHostingAssetEntity); + + // then + assertThat(result).containsExactlyInAnyOrder( + "'EMAIL_ADDRESS:old-local-part@example.org.config.local-part' is write-once but given as 'new-local-part'", + "'EMAIL_ADDRESS:old-local-part@example.org.config.sub-domain' is write-once but given as 'new-sub-domain'"); + } + + @Test + void rejectsRemovingWriteOnceProperties() { + // given + final var emailAddressHostingAssetEntity = validEntityBuilder() + .config(new HashMap<>(ofEntries( + entry("local-part", "old-local-part"), + entry("sub-domain", "old-sub-domain"), + entry("target", Array.of("xyz00", "xyz00-abc", "office@example.com")) + ))) + .isLoaded(true) + .build(); + final var validator = HostingAssetEntityValidatorRegistry.forType(emailAddressHostingAssetEntity.getType()); + + // when + emailAddressHostingAssetEntity.getConfig().remove("local-part"); + emailAddressHostingAssetEntity.getConfig().remove("sub-domain"); + final var result = validator.validateEntity(emailAddressHostingAssetEntity); + + // then + assertThat(result).containsExactlyInAnyOrder( + "'EMAIL_ADDRESS:old-local-part@example.org.config.local-part' is write-once but got removed", + "'EMAIL_ADDRESS:old-local-part@example.org.config.sub-domain' is write-once but got removed"); + } + + @Test + void acceptsOverwritingWriteOncePropertiesWithSameValues() { + // given + final var emailAddressHostingAssetEntity = validEntityBuilder() + .isLoaded(true) + .build(); + final var validator = HostingAssetEntityValidatorRegistry.forType(emailAddressHostingAssetEntity.getType()); + + // when + emailAddressHostingAssetEntity.getConfig().put("local-part", "old-local-part"); + emailAddressHostingAssetEntity.getConfig().remove("sub-domain"); // is not there anyway + final var result = validator.validateEntity(emailAddressHostingAssetEntity); + + // then + assertThat(result).isEmpty(); } @Test @@ -89,7 +166,7 @@ class HsEMailAddressHostingAssetValidatorUnitTest { // then assertThat(result).containsExactlyInAnyOrder( - "'identifier' expected to match '^\\Qtest@example.org\\E$', but is 'abc00-office'"); + "'identifier' expected to match '^\\Qold-local-part@example.org\\E$', but is 'abc00-office'"); } @Test @@ -107,8 +184,8 @@ class HsEMailAddressHostingAssetValidatorUnitTest { // then assertThat(result).containsExactlyInAnyOrder( - "'EMAIL_ADDRESS:test@example.org.bookingItem' must be null but is of type MANAGED_SERVER", - "'EMAIL_ADDRESS:test@example.org.parentAsset' must be of type DOMAIN_MBOX_SETUP but is of type MANAGED_SERVER", - "'EMAIL_ADDRESS:test@example.org.assignedToAsset' must be null but is of type MANAGED_SERVER"); + "'EMAIL_ADDRESS:old-local-part@example.org.bookingItem' must be null but is of type MANAGED_SERVER", + "'EMAIL_ADDRESS:old-local-part@example.org.parentAsset' must be of type DOMAIN_MBOX_SETUP but is of type MANAGED_SERVER", + "'EMAIL_ADDRESS:old-local-part@example.org.assignedToAsset' must be null but is of type MANAGED_SERVER"); } } diff --git a/src/test/java/net/hostsharing/hsadminng/hs/migration/CsvDataImport.java b/src/test/java/net/hostsharing/hsadminng/hs/migration/CsvDataImport.java index 9112c000..2ce2e924 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/migration/CsvDataImport.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/migration/CsvDataImport.java @@ -20,6 +20,7 @@ import org.springframework.transaction.support.TransactionTemplate; import jakarta.persistence.EntityManager; import jakarta.persistence.PersistenceContext; import jakarta.servlet.http.HttpServletRequest; +import jakarta.validation.ValidationException; import jakarta.validation.constraints.NotNull; import java.io.BufferedReader; import java.io.IOException; @@ -309,7 +310,7 @@ public class CsvDataImport extends ContextBasedTest { void logError(final Runnable assertion) { try { assertion.run(); - } catch (final AssertionError exc) { + } catch (final AssertionError | ValidationException exc) { logError(exc.getMessage()); } } diff --git a/src/test/java/net/hostsharing/hsadminng/hs/migration/HsHostingAssetRealEntity.java b/src/test/java/net/hostsharing/hsadminng/hs/migration/HsHostingAssetRealEntity.java index 51665b9c..b83f97ee 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/migration/HsHostingAssetRealEntity.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/migration/HsHostingAssetRealEntity.java @@ -103,8 +103,8 @@ public class HsHostingAssetRealEntity implements HsHostingAsset { } @Override - public Map directProps() { - return config; + public PatchableMapWrapper directProps() { + return getConfig(); } @Override diff --git a/src/test/java/net/hostsharing/hsadminng/hs/migration/ImportHostingAssets.java b/src/test/java/net/hostsharing/hsadminng/hs/migration/ImportHostingAssets.java index c3a0f467..041424f4 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/migration/ImportHostingAssets.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/migration/ImportHostingAssets.java @@ -15,7 +15,9 @@ import net.hostsharing.hsadminng.hs.hosting.asset.validators.HostingAssetEntityS import net.hostsharing.hsadminng.hs.hosting.asset.validators.HostingAssetEntityValidatorRegistry; import net.hostsharing.hsadminng.hs.hosting.asset.validators.HsDomainDnsSetupHostingAssetValidator; import net.hostsharing.hsadminng.rbac.test.JpaAttempt; +import org.apache.commons.collections4.ListUtils; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.junit.jupiter.api.MethodOrderer; import org.junit.jupiter.api.Order; import org.junit.jupiter.api.Tag; @@ -35,6 +37,8 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Objects; +import java.util.Set; import java.util.TreeMap; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicReference; @@ -54,6 +58,7 @@ import static net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetType.DOMA import static net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetType.DOMAIN_MBOX_SETUP; import static net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetType.DOMAIN_SETUP; import static net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetType.DOMAIN_SMTP_SETUP; +import static net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetType.EMAIL_ADDRESS; import static net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetType.EMAIL_ALIAS; import static net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetType.IPV4_NUMBER; import static net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetType.MANAGED_SERVER; @@ -118,19 +123,8 @@ import static org.assertj.core.api.Assumptions.assumeThat; @ExtendWith(OrderedDependedTestsExtension.class) public class ImportHostingAssets extends ImportOfficeData { - static final Integer IP_NUMBER_ID_OFFSET = 1000000; - static final Integer HIVE_ID_OFFSET = 2000000; - static final Integer PACKET_ID_OFFSET = 3000000; - static final Integer UNIXUSER_ID_OFFSET = 4000000; - static final Integer EMAILALIAS_ID_OFFSET = 5000000; - static final Integer DBINSTANCE_ID_OFFSET = 6000000; - static final Integer DBUSER_ID_OFFSET = 7000000; - static final Integer DB_ID_OFFSET = 8000000; - static final Integer DOMAIN_SETUP_OFFSET = 10000000; - static final Integer DOMAIN_DNS_SETUP_OFFSET = 11000000; - static final Integer DOMAIN_HTTP_SETUP_OFFSET = 12000000; - static final Integer DOMAIN_MBOX_SETUP_OFFSET = 13000000; - static final Integer DOMAIN_SMTP_SETUP_OFFSET = 14000000; + private static final Set NOBODY_SUBSTITUTES = Set.of("nomail", "bounce"); + static List zonefileErrors = new ArrayList<>(); record Hive(int hive_id, String hive_name, int inet_addr_id, AtomicReference serverRef) {} @@ -138,7 +132,21 @@ public class ImportHostingAssets extends ImportOfficeData { static Map bookingProjects = new WriteOnceMap<>(); static Map bookingItems = new WriteOnceMap<>(); static Map hives = new WriteOnceMap<>(); - static Map hostingAssets = new WriteOnceMap<>(); // TODO.impl: separate maps for each type? + + static Map ipNumberAssets = new WriteOnceMap<>(); + static Map packetAssets = new WriteOnceMap<>(); + static Map unixUserAssets = new WriteOnceMap<>(); + static Map emailAliasAssets = new WriteOnceMap<>(); + static Map dbInstanceAssets = new WriteOnceMap<>(); + static Map dbUserAssets = new WriteOnceMap<>(); + static Map dbAssets = new WriteOnceMap<>(); + static Map domainSetupAssets = new WriteOnceMap<>(); + static Map domainDnsSetupAssets = new WriteOnceMap<>(); + static Map domainHttpSetupAssets = new WriteOnceMap<>(); + static Map domainMBoxSetupAssets = new WriteOnceMap<>(); + static Map domainSmtpSetupAssets = new WriteOnceMap<>(); + static Map emailAddressAssets = new WriteOnceMap<>(); + static Map dbUsersByEngineAndName = new WriteOnceMap<>(); static Map domainSetupsByName = new WriteOnceMap<>(); @@ -171,13 +179,13 @@ public class ImportHostingAssets extends ImportOfficeData { void verifyIpNumbers() { assumeThatWeAreImportingControlledTestData(); - assertThat(firstOfEachType(5, IPV4_NUMBER)).isEqualToIgnoringWhitespace(""" + assertThat(firstOfEach(5, ipNumberAssets)).isEqualToIgnoringWhitespace(""" { - 1000363=HsHostingAssetRealEntity(IPV4_NUMBER, 83.223.95.34), - 1000381=HsHostingAssetRealEntity(IPV4_NUMBER, 83.223.95.52), - 1000402=HsHostingAssetRealEntity(IPV4_NUMBER, 83.223.95.73), - 1000433=HsHostingAssetRealEntity(IPV4_NUMBER, 83.223.95.104), - 1000457=HsHostingAssetRealEntity(IPV4_NUMBER, 83.223.95.128) + 363=HsHostingAssetRealEntity(IPV4_NUMBER, 83.223.95.34), + 381=HsHostingAssetRealEntity(IPV4_NUMBER, 83.223.95.52), + 402=HsHostingAssetRealEntity(IPV4_NUMBER, 83.223.95.73), + 433=HsHostingAssetRealEntity(IPV4_NUMBER, 83.223.95.104), + 457=HsHostingAssetRealEntity(IPV4_NUMBER, 83.223.95.128) } """); } @@ -200,11 +208,11 @@ public class ImportHostingAssets extends ImportOfficeData { assertThat(toJsonFormattedString(first(5, hives))).isEqualToIgnoringWhitespace(""" { - 2000001=Hive[hive_id=1, hive_name=h00, inet_addr_id=358, serverRef=null], - 2000002=Hive[hive_id=2, hive_name=h01, inet_addr_id=359, serverRef=null], - 2000004=Hive[hive_id=4, hive_name=h02, inet_addr_id=360, serverRef=null], - 2000007=Hive[hive_id=7, hive_name=h03, inet_addr_id=361, serverRef=null], - 2000013=Hive[hive_id=13, hive_name=h04, inet_addr_id=430, serverRef=null] + 1001=Hive[hive_id=1001, hive_name=h00, inet_addr_id=358, serverRef=null], + 1002=Hive[hive_id=1002, hive_name=h01, inet_addr_id=359, serverRef=null], + 1004=Hive[hive_id=1004, hive_name=h02, inet_addr_id=360, serverRef=null], + 1007=Hive[hive_id=1007, hive_name=h03, inet_addr_id=361, serverRef=null], + 1013=Hive[hive_id=1013, hive_name=h04, inet_addr_id=430, serverRef=null] } """); } @@ -225,30 +233,32 @@ public class ImportHostingAssets extends ImportOfficeData { void verifyPackets() { assumeThatWeAreImportingControlledTestData(); - assertThat(firstOfEachType(3, CLOUD_SERVER, MANAGED_SERVER, MANAGED_WEBSPACE)).isEqualToIgnoringWhitespace(""" - { - 3000630=HsHostingAssetRealEntity(MANAGED_WEBSPACE, hsh00, HA hsh00, MANAGED_SERVER:vm1050, D-1000000:hsh default project:BI hsh00), - 3000968=HsHostingAssetRealEntity(MANAGED_SERVER, vm1061, HA vm1061, D-1015200:rar default project:BI vm1061), - 3000978=HsHostingAssetRealEntity(MANAGED_SERVER, vm1050, HA vm1050, D-1000000:hsh default project:BI vm1050), - 3001061=HsHostingAssetRealEntity(MANAGED_SERVER, vm1068, HA vm1068, D-1000300:mim default project:BI vm1068), - 3001094=HsHostingAssetRealEntity(MANAGED_WEBSPACE, lug00, HA lug00, MANAGED_SERVER:vm1068, D-1000300:mim default project:BI lug00), - 3001112=HsHostingAssetRealEntity(MANAGED_WEBSPACE, mim00, HA mim00, MANAGED_SERVER:vm1068, D-1000300:mim default project:BI mim00), - 3023611=HsHostingAssetRealEntity(CLOUD_SERVER, vm2097, HA vm2097, D-1101800:wws default project:BI vm2097) - } - """); assertThat(firstOfEachType( 3, HsBookingItemType.CLOUD_SERVER, HsBookingItemType.MANAGED_SERVER, HsBookingItemType.MANAGED_WEBSPACE)).isEqualToIgnoringWhitespace(""" { - 3000630=HsBookingItemEntity(D-1000000:hsh default project, MANAGED_WEBSPACE, [2001-06-01,), BI hsh00), - 3000968=HsBookingItemEntity(D-1015200:rar default project, MANAGED_SERVER, [2013-04-01,), BI vm1061), - 3000978=HsBookingItemEntity(D-1000000:hsh default project, MANAGED_SERVER, [2013-04-01,), BI vm1050), - 3001061=HsBookingItemEntity(D-1000300:mim default project, MANAGED_SERVER, [2013-08-19,), BI vm1068), - 3001094=HsBookingItemEntity(D-1000300:mim default project, MANAGED_WEBSPACE, [2013-09-10,), BI lug00), - 3001112=HsBookingItemEntity(D-1000300:mim default project, MANAGED_WEBSPACE, [2013-09-17,), BI mim00), - 3023611=HsBookingItemEntity(D-1101800:wws default project, CLOUD_SERVER, [2022-08-10,), BI vm2097) + 10630=HsBookingItemEntity(D-1000000:hsh default project, MANAGED_WEBSPACE, [2001-06-01,), BI hsh00), + 10968=HsBookingItemEntity(D-1015200:rar default project, MANAGED_SERVER, [2013-04-01,), BI vm1061), + 10978=HsBookingItemEntity(D-1000000:hsh default project, MANAGED_SERVER, [2013-04-01,), BI vm1050), + 11061=HsBookingItemEntity(D-1000300:mim default project, MANAGED_SERVER, [2013-08-19,), BI vm1068), + 11094=HsBookingItemEntity(D-1000300:mim default project, MANAGED_WEBSPACE, [2013-09-10,), BI lug00), + 11112=HsBookingItemEntity(D-1000300:mim default project, MANAGED_WEBSPACE, [2013-09-17,), BI mim00), + 23611=HsBookingItemEntity(D-1101800:wws default project, CLOUD_SERVER, [2022-08-10,), BI vm2097) + } + """); + assertThat(firstOfEach(9, packetAssets)).isEqualToIgnoringWhitespace(""" + { + 10630=HsHostingAssetRealEntity(MANAGED_WEBSPACE, hsh00, HA hsh00, MANAGED_SERVER:vm1050, D-1000000:hsh default project:BI hsh00), + 10968=HsHostingAssetRealEntity(MANAGED_SERVER, vm1061, HA vm1061, D-1015200:rar default project:BI vm1061), + 10978=HsHostingAssetRealEntity(MANAGED_SERVER, vm1050, HA vm1050, D-1000000:hsh default project:BI vm1050), + 11061=HsHostingAssetRealEntity(MANAGED_SERVER, vm1068, HA vm1068, D-1000300:mim default project:BI vm1068), + 11094=HsHostingAssetRealEntity(MANAGED_WEBSPACE, lug00, HA lug00, MANAGED_SERVER:vm1068, D-1000300:mim default project:BI lug00), + 11112=HsHostingAssetRealEntity(MANAGED_WEBSPACE, mim00, HA mim00, MANAGED_SERVER:vm1068, D-1000300:mim default project:BI mim00), + 11447=HsHostingAssetRealEntity(MANAGED_SERVER, vm1093, HA vm1093, D-1000000:hsh default project:BI vm1093), + 19959=HsHostingAssetRealEntity(MANAGED_WEBSPACE, dph00, HA dph00, MANAGED_SERVER:vm1093, D-1101900:dph default project:BI dph00), + 23611=HsHostingAssetRealEntity(CLOUD_SERVER, vm2097, HA vm2097, D-1101800:wws default project:BI vm2097) } """); } @@ -269,18 +279,16 @@ public class ImportHostingAssets extends ImportOfficeData { void verifyPacketComponents() { assumeThatWeAreImportingControlledTestData(); - assertThat(firstOfEachType(5, CLOUD_SERVER, MANAGED_SERVER, MANAGED_WEBSPACE)) + assertThat(firstOfEach(7, packetAssets)) .isEqualToIgnoringWhitespace(""" { - 3000630=HsHostingAssetRealEntity(MANAGED_WEBSPACE, hsh00, HA hsh00, MANAGED_SERVER:vm1050, D-1000000:hsh default project:BI hsh00), - 3000968=HsHostingAssetRealEntity(MANAGED_SERVER, vm1061, HA vm1061, D-1015200:rar default project:BI vm1061), - 3000978=HsHostingAssetRealEntity(MANAGED_SERVER, vm1050, HA vm1050, D-1000000:hsh default project:BI vm1050), - 3001061=HsHostingAssetRealEntity(MANAGED_SERVER, vm1068, HA vm1068, D-1000300:mim default project:BI vm1068), - 3001094=HsHostingAssetRealEntity(MANAGED_WEBSPACE, lug00, HA lug00, MANAGED_SERVER:vm1068, D-1000300:mim default project:BI lug00), - 3001112=HsHostingAssetRealEntity(MANAGED_WEBSPACE, mim00, HA mim00, MANAGED_SERVER:vm1068, D-1000300:mim default project:BI mim00), - 3001447=HsHostingAssetRealEntity(MANAGED_SERVER, vm1093, HA vm1093, D-1000000:hsh default project:BI vm1093), - 3019959=HsHostingAssetRealEntity(MANAGED_WEBSPACE, dph00, HA dph00, MANAGED_SERVER:vm1093, D-1101900:dph default project:BI dph00), - 3023611=HsHostingAssetRealEntity(CLOUD_SERVER, vm2097, HA vm2097, D-1101800:wws default project:BI vm2097) + 10630=HsHostingAssetRealEntity(MANAGED_WEBSPACE, hsh00, HA hsh00, MANAGED_SERVER:vm1050, D-1000000:hsh default project:BI hsh00), + 10968=HsHostingAssetRealEntity(MANAGED_SERVER, vm1061, HA vm1061, D-1015200:rar default project:BI vm1061), + 10978=HsHostingAssetRealEntity(MANAGED_SERVER, vm1050, HA vm1050, D-1000000:hsh default project:BI vm1050), + 11061=HsHostingAssetRealEntity(MANAGED_SERVER, vm1068, HA vm1068, D-1000300:mim default project:BI vm1068), + 11094=HsHostingAssetRealEntity(MANAGED_WEBSPACE, lug00, HA lug00, MANAGED_SERVER:vm1068, D-1000300:mim default project:BI lug00), + 11112=HsHostingAssetRealEntity(MANAGED_WEBSPACE, mim00, HA mim00, MANAGED_SERVER:vm1068, D-1000300:mim default project:BI mim00), + 11447=HsHostingAssetRealEntity(MANAGED_SERVER, vm1093, HA vm1093, D-1000000:hsh default project:BI vm1093) } """); assertThat(firstOfEachType( @@ -290,15 +298,15 @@ public class ImportHostingAssets extends ImportOfficeData { HsBookingItemType.MANAGED_WEBSPACE)) .isEqualToIgnoringWhitespace(""" { - 3000630=HsBookingItemEntity(D-1000000:hsh default project, MANAGED_WEBSPACE, [2001-06-01,), BI hsh00, {"HDD": 10, "Multi": 25, "SLA-Platform": "EXT24H", "SSD": 16, "Traffic": 50}), - 3000968=HsBookingItemEntity(D-1015200:rar default project, MANAGED_SERVER, [2013-04-01,), BI vm1061, {"CPU": 6, "HDD": 250, "RAM": 14, "SLA-EMail": true, "SLA-Maria": true, "SLA-Office": true, "SLA-PgSQL": true, "SLA-Platform": "EXT4H", "SLA-Web": true, "SSD": 375, "Traffic": 250}), - 3000978=HsBookingItemEntity(D-1000000:hsh default project, MANAGED_SERVER, [2013-04-01,), BI vm1050, {"CPU": 4, "HDD": 250, "RAM": 32, "SLA-EMail": true, "SLA-Maria": true, "SLA-Office": true, "SLA-PgSQL": true, "SLA-Platform": "EXT4H", "SLA-Web": true, "SSD": 150, "Traffic": 250}), - 3001061=HsBookingItemEntity(D-1000300:mim default project, MANAGED_SERVER, [2013-08-19,), BI vm1068, {"CPU": 2, "HDD": 250, "RAM": 4, "SLA-EMail": true, "SLA-Maria": true, "SLA-Office": true, "SLA-PgSQL": true, "SLA-Platform": "EXT2H", "SLA-Web": true, "Traffic": 250}), - 3001094=HsBookingItemEntity(D-1000300:mim default project, MANAGED_WEBSPACE, [2013-09-10,), BI lug00, {"Multi": 5, "SLA-Platform": "EXT24H", "SSD": 1, "Traffic": 10}), - 3001112=HsBookingItemEntity(D-1000300:mim default project, MANAGED_WEBSPACE, [2013-09-17,), BI mim00, {"Multi": 5, "SLA-Platform": "EXT24H", "SSD": 3, "Traffic": 20}), - 3001447=HsBookingItemEntity(D-1000000:hsh default project, MANAGED_SERVER, [2014-11-28,), BI vm1093, {"CPU": 6, "HDD": 500, "RAM": 16, "SLA-EMail": true, "SLA-Maria": true, "SLA-Office": true, "SLA-PgSQL": true, "SLA-Platform": "EXT4H", "SLA-Web": true, "SSD": 300, "Traffic": 250}), - 3019959=HsBookingItemEntity(D-1101900:dph default project, MANAGED_WEBSPACE, [2021-06-02,), BI dph00, {"Multi": 1, "SLA-Platform": "EXT24H", "SSD": 25, "Traffic": 20}), - 3023611=HsBookingItemEntity(D-1101800:wws default project, CLOUD_SERVER, [2022-08-10,), BI vm2097, {"CPU": 8, "RAM": 12, "SLA-Infrastructure": "EXT4H", "SSD": 25, "Traffic": 250}) + 10630=HsBookingItemEntity(D-1000000:hsh default project, MANAGED_WEBSPACE, [2001-06-01,), BI hsh00, {"HDD": 10, "Multi": 25, "SLA-Platform": "EXT24H", "SSD": 16, "Traffic": 50}), + 10968=HsBookingItemEntity(D-1015200:rar default project, MANAGED_SERVER, [2013-04-01,), BI vm1061, {"CPU": 6, "HDD": 250, "RAM": 14, "SLA-EMail": true, "SLA-Maria": true, "SLA-Office": true, "SLA-PgSQL": true, "SLA-Platform": "EXT4H", "SLA-Web": true, "SSD": 375, "Traffic": 250}), + 10978=HsBookingItemEntity(D-1000000:hsh default project, MANAGED_SERVER, [2013-04-01,), BI vm1050, {"CPU": 4, "HDD": 250, "RAM": 32, "SLA-EMail": true, "SLA-Maria": true, "SLA-Office": true, "SLA-PgSQL": true, "SLA-Platform": "EXT4H", "SLA-Web": true, "SSD": 150, "Traffic": 250}), + 11061=HsBookingItemEntity(D-1000300:mim default project, MANAGED_SERVER, [2013-08-19,), BI vm1068, {"CPU": 2, "HDD": 250, "RAM": 4, "SLA-EMail": true, "SLA-Maria": true, "SLA-Office": true, "SLA-PgSQL": true, "SLA-Platform": "EXT2H", "SLA-Web": true, "Traffic": 250}), + 11094=HsBookingItemEntity(D-1000300:mim default project, MANAGED_WEBSPACE, [2013-09-10,), BI lug00, {"Multi": 5, "SLA-Platform": "EXT24H", "SSD": 1, "Traffic": 10}), + 11112=HsBookingItemEntity(D-1000300:mim default project, MANAGED_WEBSPACE, [2013-09-17,), BI mim00, {"Multi": 5, "SLA-Platform": "EXT24H", "SSD": 3, "Traffic": 20}), + 11447=HsBookingItemEntity(D-1000000:hsh default project, MANAGED_SERVER, [2014-11-28,), BI vm1093, {"CPU": 6, "HDD": 500, "RAM": 16, "SLA-EMail": true, "SLA-Maria": true, "SLA-Office": true, "SLA-PgSQL": true, "SLA-Platform": "EXT4H", "SLA-Web": true, "SSD": 300, "Traffic": 250}), + 19959=HsBookingItemEntity(D-1101900:dph default project, MANAGED_WEBSPACE, [2021-06-02,), BI dph00, {"Multi": 1, "SLA-Platform": "EXT24H", "SSD": 25, "Traffic": 20}), + 23611=HsBookingItemEntity(D-1101800:wws default project, CLOUD_SERVER, [2022-08-10,), BI vm2097, {"CPU": 8, "RAM": 12, "SLA-Infrastructure": "EXT4H", "SSD": 25, "Traffic": 250}) } """); } @@ -319,22 +327,22 @@ public class ImportHostingAssets extends ImportOfficeData { void verifyUnixUsers() { assumeThatWeAreImportingControlledTestData(); - assertThat(firstOfEachType(15, UNIX_USER)).isEqualToIgnoringWhitespace(""" + assertThat(firstOfEach(15, unixUserAssets)).isEqualToIgnoringWhitespace(""" { - 4005803=HsHostingAssetRealEntity(UNIX_USER, lug00, LUGs, MANAGED_WEBSPACE:lug00, {"SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "shell": "/bin/bash", "userid": 102090}), - 4005805=HsHostingAssetRealEntity(UNIX_USER, lug00-wla.1, Paul Klemm, MANAGED_WEBSPACE:lug00, {"SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "shell": "/bin/bash", "userid": 102091}), - 4005809=HsHostingAssetRealEntity(UNIX_USER, lug00-wla.2, Walter Müller, MANAGED_WEBSPACE:lug00, {"SSD hard quota": 8, "SSD soft quota": 4, "locked": false, "shell": "/bin/bash", "userid": 102093}), - 4005811=HsHostingAssetRealEntity(UNIX_USER, lug00-ola.a, LUG OLA - POP a, MANAGED_WEBSPACE:lug00, {"SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "shell": "/usr/bin/passwd", "userid": 102094}), - 4005813=HsHostingAssetRealEntity(UNIX_USER, lug00-ola.b, LUG OLA - POP b, MANAGED_WEBSPACE:lug00, {"SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "shell": "/usr/bin/passwd", "userid": 102095}), - 4005835=HsHostingAssetRealEntity(UNIX_USER, lug00-test, Test, MANAGED_WEBSPACE:lug00, {"SSD hard quota": 1024, "SSD soft quota": 1024, "locked": false, "shell": "/usr/bin/passwd", "userid": 102106}), - 4005964=HsHostingAssetRealEntity(UNIX_USER, mim00, Michael Mellis, MANAGED_WEBSPACE:mim00, {"SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "shell": "/bin/bash", "userid": 102147}), - 4005966=HsHostingAssetRealEntity(UNIX_USER, mim00-1981, Jahrgangstreffen 1981, MANAGED_WEBSPACE:mim00, {"SSD hard quota": 256, "SSD soft quota": 128, "locked": false, "shell": "/bin/bash", "userid": 102148}), - 4005990=HsHostingAssetRealEntity(UNIX_USER, mim00-mail, Mailbox, MANAGED_WEBSPACE:mim00, {"SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "shell": "/bin/bash", "userid": 102160}), - 4100705=HsHostingAssetRealEntity(UNIX_USER, hsh00-mim, Michael Mellis, MANAGED_WEBSPACE:hsh00, {"HDD hard quota": 0, "HDD soft quota": 0, "SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "shell": "/bin/false", "userid": 10003}), - 4100824=HsHostingAssetRealEntity(UNIX_USER, hsh00, Hostsharing Paket, MANAGED_WEBSPACE:hsh00, {"HDD hard quota": 0, "HDD soft quota": 0, "SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "shell": "/bin/bash", "userid": 10000}), - 4167846=HsHostingAssetRealEntity(UNIX_USER, hsh00-dph, hsh00-uph, MANAGED_WEBSPACE:hsh00, {"HDD hard quota": 0, "HDD soft quota": 0, "SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "shell": "/bin/false", "userid": 110568}), - 4169546=HsHostingAssetRealEntity(UNIX_USER, dph00, Reinhard Wiese, MANAGED_WEBSPACE:dph00, {"SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "shell": "/bin/bash", "userid": 110593}), - 4169596=HsHostingAssetRealEntity(UNIX_USER, dph00-dph, Domain admin, MANAGED_WEBSPACE:dph00, {"SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "shell": "/bin/bash", "userid": 110594}) + 5803=HsHostingAssetRealEntity(UNIX_USER, lug00, LUGs, MANAGED_WEBSPACE:lug00, {"SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "shell": "/bin/bash", "userid": 102090}), + 5805=HsHostingAssetRealEntity(UNIX_USER, lug00-wla.1, Paul Klemm, MANAGED_WEBSPACE:lug00, {"SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "shell": "/bin/bash", "userid": 102091}), + 5809=HsHostingAssetRealEntity(UNIX_USER, lug00-wla.2, Walter Müller, MANAGED_WEBSPACE:lug00, {"SSD hard quota": 8, "SSD soft quota": 4, "locked": false, "shell": "/bin/bash", "userid": 102093}), + 5811=HsHostingAssetRealEntity(UNIX_USER, lug00-ola.a, LUG OLA - POP a, MANAGED_WEBSPACE:lug00, {"SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "shell": "/usr/bin/passwd", "userid": 102094}), + 5813=HsHostingAssetRealEntity(UNIX_USER, lug00-ola.b, LUG OLA - POP b, MANAGED_WEBSPACE:lug00, {"SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "shell": "/usr/bin/passwd", "userid": 102095}), + 5835=HsHostingAssetRealEntity(UNIX_USER, lug00-test, Test, MANAGED_WEBSPACE:lug00, {"SSD hard quota": 1024, "SSD soft quota": 1024, "locked": false, "shell": "/usr/bin/passwd", "userid": 102106}), + 5964=HsHostingAssetRealEntity(UNIX_USER, mim00, Michael Mellis, MANAGED_WEBSPACE:mim00, {"SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "shell": "/bin/bash", "userid": 102147}), + 5966=HsHostingAssetRealEntity(UNIX_USER, mim00-1981, Jahrgangstreffen 1981, MANAGED_WEBSPACE:mim00, {"SSD hard quota": 256, "SSD soft quota": 128, "locked": false, "shell": "/bin/bash", "userid": 102148}), + 5990=HsHostingAssetRealEntity(UNIX_USER, mim00-mail, Mailbox, MANAGED_WEBSPACE:mim00, {"SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "shell": "/bin/bash", "userid": 102160}), + 6705=HsHostingAssetRealEntity(UNIX_USER, hsh00-mim, Michael Mellis, MANAGED_WEBSPACE:hsh00, {"HDD hard quota": 0, "HDD soft quota": 0, "SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "shell": "/bin/false", "userid": 10003}), + 6824=HsHostingAssetRealEntity(UNIX_USER, hsh00, Hostsharing Paket, MANAGED_WEBSPACE:hsh00, {"HDD hard quota": 0, "HDD soft quota": 0, "SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "shell": "/bin/bash", "userid": 10000}), + 7846=HsHostingAssetRealEntity(UNIX_USER, hsh00-dph, hsh00-uph, MANAGED_WEBSPACE:hsh00, {"HDD hard quota": 0, "HDD soft quota": 0, "SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "shell": "/bin/false", "userid": 110568}), + 9546=HsHostingAssetRealEntity(UNIX_USER, dph00, Reinhard Wiese, MANAGED_WEBSPACE:dph00, {"SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "shell": "/bin/bash", "userid": 110593}), + 9596=HsHostingAssetRealEntity(UNIX_USER, dph00-dph, Domain admin, MANAGED_WEBSPACE:dph00, {"SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "shell": "/bin/bash", "userid": 110594}) } """); } @@ -355,17 +363,17 @@ public class ImportHostingAssets extends ImportOfficeData { void verifyEmailAliases() { assumeThatWeAreImportingControlledTestData(); - assertThat(firstOfEachType(15, EMAIL_ALIAS)).isEqualToIgnoringWhitespace(""" + assertThat(firstOfEach(15, emailAliasAssets)).isEqualToIgnoringWhitespace(""" { - 5002403=HsHostingAssetRealEntity(EMAIL_ALIAS, lug00, lug00, MANAGED_WEBSPACE:lug00, {"target": [ "michael.mellis@example.com" ]}), - 5002405=HsHostingAssetRealEntity(EMAIL_ALIAS, lug00-wla-listar, lug00-wla-listar, MANAGED_WEBSPACE:lug00, {"target": [ "|/home/pacs/lug00/users/in/mailinglist/listar" ]}), - 5002429=HsHostingAssetRealEntity(EMAIL_ALIAS, mim00, mim00, MANAGED_WEBSPACE:mim00, {"target": [ "mim12-mi@mim12.hostsharing.net" ]}), - 5002431=HsHostingAssetRealEntity(EMAIL_ALIAS, mim00-abruf, mim00-abruf, MANAGED_WEBSPACE:mim00, {"target": [ "michael.mellis@hostsharing.net" ]}), - 5002449=HsHostingAssetRealEntity(EMAIL_ALIAS, mim00-hhfx, mim00-hhfx, MANAGED_WEBSPACE:mim00, {"target": [ "mim00-hhfx", "|/usr/bin/formail -I 'Reply-To: hamburger-fx@example.net' | /usr/lib/sendmail mim00-hhfx-l" ]}), - 5002451=HsHostingAssetRealEntity(EMAIL_ALIAS, mim00-hhfx-l, mim00-hhfx-l, MANAGED_WEBSPACE:mim00, {"target": [ ":include:/home/pacs/mim00/etc/hhfx.list" ]}), - 5002454=HsHostingAssetRealEntity(EMAIL_ALIAS, mim00-dev.null, mim00-dev.null, MANAGED_WEBSPACE:mim00, {"target": [ "/dev/null" ]}), - 5002455=HsHostingAssetRealEntity(EMAIL_ALIAS, mim00-1_with_space, mim00-1_with_space, MANAGED_WEBSPACE:mim00, {"target": [ "|/home/pacs/mim00/install/corpslistar/listar" ]}), - 5002456=HsHostingAssetRealEntity(EMAIL_ALIAS, mim00-1_with_single_quotes, mim00-1_with_single_quotes, MANAGED_WEBSPACE:mim00, {"target": [ "|/home/pacs/rir00/mailinglist/ecartis -r kybs06-intern" ]}) + 2403=HsHostingAssetRealEntity(EMAIL_ALIAS, lug00, lug00, MANAGED_WEBSPACE:lug00, {"target": [ "michael.mellis@example.com" ]}), + 2405=HsHostingAssetRealEntity(EMAIL_ALIAS, lug00-wla-listar, lug00-wla-listar, MANAGED_WEBSPACE:lug00, {"target": [ "|/home/pacs/lug00/users/in/mailinglist/listar" ]}), + 2429=HsHostingAssetRealEntity(EMAIL_ALIAS, mim00, mim00, MANAGED_WEBSPACE:mim00, {"target": [ "mim12-mi@mim12.hostsharing.net" ]}), + 2431=HsHostingAssetRealEntity(EMAIL_ALIAS, mim00-abruf, mim00-abruf, MANAGED_WEBSPACE:mim00, {"target": [ "michael.mellis@hostsharing.net" ]}), + 2449=HsHostingAssetRealEntity(EMAIL_ALIAS, mim00-hhfx, mim00-hhfx, MANAGED_WEBSPACE:mim00, {"target": [ "mim00-hhfx", "|/usr/bin/formail -I 'Reply-To: hamburger-fx@example.net' | /usr/lib/sendmail mim00-hhfx-l" ]}), + 2451=HsHostingAssetRealEntity(EMAIL_ALIAS, mim00-hhfx-l, mim00-hhfx-l, MANAGED_WEBSPACE:mim00, {"target": [ ":include:/home/pacs/mim00/etc/hhfx.list" ]}), + 2454=HsHostingAssetRealEntity(EMAIL_ALIAS, mim00-dev.null, mim00-dev.null, MANAGED_WEBSPACE:mim00, {"target": [ "/dev/null" ]}), + 2455=HsHostingAssetRealEntity(EMAIL_ALIAS, mim00-1_with_space, mim00-1_with_space, MANAGED_WEBSPACE:mim00, {"target": [ "|/home/pacs/mim00/install/corpslistar/listar" ]}), + 2456=HsHostingAssetRealEntity(EMAIL_ALIAS, mim00-1_with_single_quotes, mim00-1_with_single_quotes, MANAGED_WEBSPACE:mim00, {"target": [ "|/home/pacs/rir00/mailinglist/ecartis -r kybs06-intern" ]}) } """); } @@ -373,7 +381,7 @@ public class ImportHostingAssets extends ImportOfficeData { @Test @Order(15000) void createDatabaseInstances() { - createDatabaseInstances(hostingAssets.values().stream().filter(ha -> ha.getType() == MANAGED_SERVER).toList()); + createDatabaseInstances(packetAssets.values().stream().filter(ha -> ha.getType() == MANAGED_SERVER).toList()); } @Test @@ -381,16 +389,16 @@ public class ImportHostingAssets extends ImportOfficeData { void verifyDatabaseInstances() { assumeThatWeAreImportingControlledTestData(); - assertThat(firstOfEachType(5, PGSQL_INSTANCE, MARIADB_INSTANCE)).isEqualToIgnoringWhitespace(""" + assertThat(firstOfEach(8, dbInstanceAssets)).isEqualToIgnoringWhitespace(""" { - 6000000=HsHostingAssetRealEntity(PGSQL_INSTANCE, vm1061|PgSql.default, vm1061-PostgreSQL default instance, MANAGED_SERVER:vm1061), - 6000001=HsHostingAssetRealEntity(MARIADB_INSTANCE, vm1061|MariaDB.default, vm1061-MariaDB default instance, MANAGED_SERVER:vm1061), - 6000002=HsHostingAssetRealEntity(PGSQL_INSTANCE, vm1050|PgSql.default, vm1050-PostgreSQL default instance, MANAGED_SERVER:vm1050), - 6000003=HsHostingAssetRealEntity(MARIADB_INSTANCE, vm1050|MariaDB.default, vm1050-MariaDB default instance, MANAGED_SERVER:vm1050), - 6000004=HsHostingAssetRealEntity(PGSQL_INSTANCE, vm1068|PgSql.default, vm1068-PostgreSQL default instance, MANAGED_SERVER:vm1068), - 6000005=HsHostingAssetRealEntity(MARIADB_INSTANCE, vm1068|MariaDB.default, vm1068-MariaDB default instance, MANAGED_SERVER:vm1068), - 6000006=HsHostingAssetRealEntity(PGSQL_INSTANCE, vm1093|PgSql.default, vm1093-PostgreSQL default instance, MANAGED_SERVER:vm1093), - 6000007=HsHostingAssetRealEntity(MARIADB_INSTANCE, vm1093|MariaDB.default, vm1093-MariaDB default instance, MANAGED_SERVER:vm1093) + 0=HsHostingAssetRealEntity(PGSQL_INSTANCE, vm1061|PgSql.default, vm1061-PostgreSQL default instance, MANAGED_SERVER:vm1061), + 1=HsHostingAssetRealEntity(MARIADB_INSTANCE, vm1061|MariaDB.default, vm1061-MariaDB default instance, MANAGED_SERVER:vm1061), + 2=HsHostingAssetRealEntity(PGSQL_INSTANCE, vm1050|PgSql.default, vm1050-PostgreSQL default instance, MANAGED_SERVER:vm1050), + 3=HsHostingAssetRealEntity(MARIADB_INSTANCE, vm1050|MariaDB.default, vm1050-MariaDB default instance, MANAGED_SERVER:vm1050), + 4=HsHostingAssetRealEntity(PGSQL_INSTANCE, vm1068|PgSql.default, vm1068-PostgreSQL default instance, MANAGED_SERVER:vm1068), + 5=HsHostingAssetRealEntity(MARIADB_INSTANCE, vm1068|MariaDB.default, vm1068-MariaDB default instance, MANAGED_SERVER:vm1068), + 6=HsHostingAssetRealEntity(PGSQL_INSTANCE, vm1093|PgSql.default, vm1093-PostgreSQL default instance, MANAGED_SERVER:vm1093), + 7=HsHostingAssetRealEntity(MARIADB_INSTANCE, vm1093|MariaDB.default, vm1093-MariaDB default instance, MANAGED_SERVER:vm1093) } """); } @@ -411,18 +419,18 @@ public class ImportHostingAssets extends ImportOfficeData { void verifyDatabaseUsers() { assumeThatWeAreImportingControlledTestData(); - assertThat(firstOfEachType(5, PGSQL_USER, MARIADB_USER)).isEqualToIgnoringWhitespace(""" + assertThat(firstOfEach(10, dbUserAssets)).isEqualToIgnoringWhitespace(""" { - 7001857=HsHostingAssetRealEntity(PGSQL_USER, PGU|hsh00, hsh00, MANAGED_WEBSPACE:hsh00, PGSQL_INSTANCE:vm1050|PgSql.default, { "password": "SCRAM-SHA-256$4096:Zml4ZWQgc2FsdA==$JDiZmaxU+O+ByArLY/CkYZ8HbOk0r/I8LyABnno5gQs=:NI3T500/63dzI1B07Jh3UtQGlukS6JxuS0XoxM/QgAc="}), - 7001858=HsHostingAssetRealEntity(MARIADB_USER, MAU|hsh00, hsh00, MANAGED_WEBSPACE:hsh00, MARIADB_INSTANCE:vm1050|MariaDB.default, { "password": "*59067A36BA197AD0A47D74909296C5B002A0FB9F"}), - 7001859=HsHostingAssetRealEntity(PGSQL_USER, PGU|hsh00_vorstand, hsh00_vorstand, MANAGED_WEBSPACE:hsh00, PGSQL_INSTANCE:vm1050|PgSql.default, { "password": "SCRAM-SHA-256$4096:Zml4ZWQgc2FsdA==$54Wh+OGx/GaIvAia+I3k78jHGhqmYwe4+iLssmH5zhk=:D4Gq1z2Li2BVSaZrz1azDrs6pwsIzhq4+suK1Hh6ZIg="}), - 7001860=HsHostingAssetRealEntity(PGSQL_USER, PGU|hsh00_hsadmin, hsh00_hsadmin, MANAGED_WEBSPACE:hsh00, PGSQL_INSTANCE:vm1050|PgSql.default, { "password": "SCRAM-SHA-256$4096:Zml4ZWQgc2FsdA==$54Wh+OGx/GaIvAia+I3k78jHGhqmYwe4+iLssmH5zhk=:D4Gq1z2Li2BVSaZrz1azDrs6pwsIzhq4+suK1Hh6ZIg="}), - 7001861=HsHostingAssetRealEntity(PGSQL_USER, PGU|hsh00_hsadmin_ro, hsh00_hsadmin_ro, MANAGED_WEBSPACE:hsh00, PGSQL_INSTANCE:vm1050|PgSql.default, { "password": "SCRAM-SHA-256$4096:Zml4ZWQgc2FsdA==$UhJnJJhmKANbcaG+izWK3rz5bmhhluSuiCJFlUmDVI8=:6AC4mbLfJGiGlEOWhpz9BivvMODhLLHOnRnnktJPgn8="}), - 7004908=HsHostingAssetRealEntity(MARIADB_USER, MAU|hsh00_mantis, hsh00_mantis, MANAGED_WEBSPACE:hsh00, MARIADB_INSTANCE:vm1050|MariaDB.default, { "password": "*EA4C0889A22AAE66BBEBC88161E8CF862D73B44F"}), - 7004909=HsHostingAssetRealEntity(MARIADB_USER, MAU|hsh00_mantis_ro, hsh00_mantis_ro, MANAGED_WEBSPACE:hsh00, MARIADB_INSTANCE:vm1050|MariaDB.default, { "password": "*B3BB6D0DA2EC01958616E9B3BCD2926FE8C38383"}), - 7004931=HsHostingAssetRealEntity(PGSQL_USER, PGU|hsh00_phpPgSqlAdmin, hsh00_phpPgSqlAdmin, MANAGED_WEBSPACE:hsh00, PGSQL_INSTANCE:vm1050|PgSql.default, { "password": "SCRAM-SHA-256$4096:Zml4ZWQgc2FsdA==$UhJnJJhmKANbcaG+izWK3rz5bmhhluSuiCJFlUmDVI8=:6AC4mbLfJGiGlEOWhpz9BivvMODhLLHOnRnnktJPgn8="}), - 7004932=HsHostingAssetRealEntity(MARIADB_USER, MAU|hsh00_phpMyAdmin, hsh00_phpMyAdmin, MANAGED_WEBSPACE:hsh00, MARIADB_INSTANCE:vm1050|MariaDB.default, { "password": "*3188720B1889EF5447C722629765F296F40257C2"}), - 7007520=HsHostingAssetRealEntity(MARIADB_USER, MAU|lug00_wla, lug00_wla, MANAGED_WEBSPACE:lug00, MARIADB_INSTANCE:vm1068|MariaDB.default, { "password": "*11667C0EAC42BF8B0295ABEDC7D2868A835E4DB5"}) + 1857=HsHostingAssetRealEntity(PGSQL_USER, PGU|hsh00, hsh00, MANAGED_WEBSPACE:hsh00, PGSQL_INSTANCE:vm1050|PgSql.default, { "password": "SCRAM-SHA-256$4096:Zml4ZWQgc2FsdA==$JDiZmaxU+O+ByArLY/CkYZ8HbOk0r/I8LyABnno5gQs=:NI3T500/63dzI1B07Jh3UtQGlukS6JxuS0XoxM/QgAc="}), + 1858=HsHostingAssetRealEntity(MARIADB_USER, MAU|hsh00, hsh00, MANAGED_WEBSPACE:hsh00, MARIADB_INSTANCE:vm1050|MariaDB.default, { "password": "*59067A36BA197AD0A47D74909296C5B002A0FB9F"}), + 1859=HsHostingAssetRealEntity(PGSQL_USER, PGU|hsh00_vorstand, hsh00_vorstand, MANAGED_WEBSPACE:hsh00, PGSQL_INSTANCE:vm1050|PgSql.default, { "password": "SCRAM-SHA-256$4096:Zml4ZWQgc2FsdA==$54Wh+OGx/GaIvAia+I3k78jHGhqmYwe4+iLssmH5zhk=:D4Gq1z2Li2BVSaZrz1azDrs6pwsIzhq4+suK1Hh6ZIg="}), + 1860=HsHostingAssetRealEntity(PGSQL_USER, PGU|hsh00_hsadmin, hsh00_hsadmin, MANAGED_WEBSPACE:hsh00, PGSQL_INSTANCE:vm1050|PgSql.default, { "password": "SCRAM-SHA-256$4096:Zml4ZWQgc2FsdA==$54Wh+OGx/GaIvAia+I3k78jHGhqmYwe4+iLssmH5zhk=:D4Gq1z2Li2BVSaZrz1azDrs6pwsIzhq4+suK1Hh6ZIg="}), + 1861=HsHostingAssetRealEntity(PGSQL_USER, PGU|hsh00_hsadmin_ro, hsh00_hsadmin_ro, MANAGED_WEBSPACE:hsh00, PGSQL_INSTANCE:vm1050|PgSql.default, { "password": "SCRAM-SHA-256$4096:Zml4ZWQgc2FsdA==$UhJnJJhmKANbcaG+izWK3rz5bmhhluSuiCJFlUmDVI8=:6AC4mbLfJGiGlEOWhpz9BivvMODhLLHOnRnnktJPgn8="}), + 4908=HsHostingAssetRealEntity(MARIADB_USER, MAU|hsh00_mantis, hsh00_mantis, MANAGED_WEBSPACE:hsh00, MARIADB_INSTANCE:vm1050|MariaDB.default, { "password": "*EA4C0889A22AAE66BBEBC88161E8CF862D73B44F"}), + 4909=HsHostingAssetRealEntity(MARIADB_USER, MAU|hsh00_mantis_ro, hsh00_mantis_ro, MANAGED_WEBSPACE:hsh00, MARIADB_INSTANCE:vm1050|MariaDB.default, { "password": "*B3BB6D0DA2EC01958616E9B3BCD2926FE8C38383"}), + 4931=HsHostingAssetRealEntity(PGSQL_USER, PGU|hsh00_phpPgSqlAdmin, hsh00_phpPgSqlAdmin, MANAGED_WEBSPACE:hsh00, PGSQL_INSTANCE:vm1050|PgSql.default, { "password": "SCRAM-SHA-256$4096:Zml4ZWQgc2FsdA==$UhJnJJhmKANbcaG+izWK3rz5bmhhluSuiCJFlUmDVI8=:6AC4mbLfJGiGlEOWhpz9BivvMODhLLHOnRnnktJPgn8="}), + 4932=HsHostingAssetRealEntity(MARIADB_USER, MAU|hsh00_phpMyAdmin, hsh00_phpMyAdmin, MANAGED_WEBSPACE:hsh00, MARIADB_INSTANCE:vm1050|MariaDB.default, { "password": "*3188720B1889EF5447C722629765F296F40257C2"}), + 7520=HsHostingAssetRealEntity(MARIADB_USER, MAU|lug00_wla, lug00_wla, MANAGED_WEBSPACE:lug00, MARIADB_INSTANCE:vm1068|MariaDB.default, { "password": "*11667C0EAC42BF8B0295ABEDC7D2868A835E4DB5"}) } """); } @@ -443,18 +451,18 @@ public class ImportHostingAssets extends ImportOfficeData { void verifyDatabases() { assumeThatWeAreImportingControlledTestData(); - assertThat(firstOfEachType(5, PGSQL_DATABASE, MARIADB_DATABASE)).isEqualToIgnoringWhitespace(""" + assertThat(firstOfEach(10, dbAssets)).isEqualToIgnoringWhitespace(""" { - 8000077=HsHostingAssetRealEntity(PGSQL_DATABASE, PGD|hsh00_vorstand, hsh00_vorstand, PGSQL_USER:PGU|hsh00_vorstand, { "encoding": "LATIN1"}), - 8000786=HsHostingAssetRealEntity(MARIADB_DATABASE, MAD|hsh00_addr, hsh00_addr, MARIADB_USER:MAU|hsh00, { "encoding": "latin1"}), - 8000805=HsHostingAssetRealEntity(MARIADB_DATABASE, MAD|hsh00_db2, hsh00_db2, MARIADB_USER:MAU|hsh00, { "encoding": "latin1"}), - 8001858=HsHostingAssetRealEntity(PGSQL_DATABASE, PGD|hsh00, hsh00, PGSQL_USER:PGU|hsh00, { "encoding": "LATIN1"}), - 8001860=HsHostingAssetRealEntity(PGSQL_DATABASE, PGD|hsh00_hsadmin, hsh00_hsadmin, PGSQL_USER:PGU|hsh00_hsadmin, { "encoding": "UTF8"}), - 8004908=HsHostingAssetRealEntity(MARIADB_DATABASE, MAD|hsh00_mantis, hsh00_mantis, MARIADB_USER:MAU|hsh00_mantis, { "encoding": "utf8"}), - 8004931=HsHostingAssetRealEntity(PGSQL_DATABASE, PGD|hsh00_phpPgSqlAdmin, hsh00_phpPgSqlAdmin, PGSQL_USER:PGU|hsh00_phpPgSqlAdmin, { "encoding": "UTF8"}), - 8004932=HsHostingAssetRealEntity(PGSQL_DATABASE, PGD|hsh00_phpPgSqlAdmin_new, hsh00_phpPgSqlAdmin_new, PGSQL_USER:PGU|hsh00_phpPgSqlAdmin, { "encoding": "UTF8"}), - 8004941=HsHostingAssetRealEntity(MARIADB_DATABASE, MAD|hsh00_phpMyAdmin, hsh00_phpMyAdmin, MARIADB_USER:MAU|hsh00_phpMyAdmin, { "encoding": "utf8"}), - 8004942=HsHostingAssetRealEntity(MARIADB_DATABASE, MAD|hsh00_phpMyAdmin_old, hsh00_phpMyAdmin_old, MARIADB_USER:MAU|hsh00_phpMyAdmin, { "encoding": "utf8"}) + 1077=HsHostingAssetRealEntity(PGSQL_DATABASE, PGD|hsh00_vorstand, hsh00_vorstand, PGSQL_USER:PGU|hsh00_vorstand, {"encoding": "LATIN1"}), + 1786=HsHostingAssetRealEntity(MARIADB_DATABASE, MAD|hsh00_addr, hsh00_addr, MARIADB_USER:MAU|hsh00, {"encoding": "latin1"}), + 1805=HsHostingAssetRealEntity(MARIADB_DATABASE, MAD|hsh00_dba, hsh00_dba, MARIADB_USER:MAU|hsh00, {"encoding": "latin1"}), + 1858=HsHostingAssetRealEntity(PGSQL_DATABASE, PGD|hsh00, hsh00, PGSQL_USER:PGU|hsh00, {"encoding": "LATIN1"}), + 1860=HsHostingAssetRealEntity(PGSQL_DATABASE, PGD|hsh00_hsadmin, hsh00_hsadmin, PGSQL_USER:PGU|hsh00_hsadmin, {"encoding": "UTF8"}), + 4908=HsHostingAssetRealEntity(MARIADB_DATABASE, MAD|hsh00_mantis, hsh00_mantis, MARIADB_USER:MAU|hsh00_mantis, {"encoding": "utf8"}), + 4931=HsHostingAssetRealEntity(PGSQL_DATABASE, PGD|hsh00_phpPgSqlAdmin, hsh00_phpPgSqlAdmin, PGSQL_USER:PGU|hsh00_phpPgSqlAdmin, {"encoding": "UTF8"}), + 4932=HsHostingAssetRealEntity(PGSQL_DATABASE, PGD|hsh00_phpPgSqlAdmin_new, hsh00_phpPgSqlAdmin_new, PGSQL_USER:PGU|hsh00_phpPgSqlAdmin, {"encoding": "UTF8"}), + 4941=HsHostingAssetRealEntity(MARIADB_DATABASE, MAD|hsh00_phpMyAdmin, hsh00_phpMyAdmin, MARIADB_USER:MAU|hsh00_phpMyAdmin, {"encoding": "utf8"}), + 4942=HsHostingAssetRealEntity(MARIADB_DATABASE, MAD|hsh00_phpMyAdmin_old, hsh00_phpMyAdmin_old, MARIADB_USER:MAU|hsh00_phpMyAdmin, {"encoding": "utf8"}) } """); } @@ -481,68 +489,112 @@ public class ImportHostingAssets extends ImportOfficeData { }); } - private String vmName(final String zonenfileName) { - return zonenfileName.substring(zonenfileName.length() - "vm0000.json".length()).substring(0, 6); - } - @Test @Order(16029) void verifyDomains() { assumeThatWeAreImportingControlledTestData(); - assertThat(firstOfEachType( - 12, - DOMAIN_SETUP, - DOMAIN_DNS_SETUP, - DOMAIN_HTTP_SETUP, - DOMAIN_MBOX_SETUP, - DOMAIN_SMTP_SETUP)).isEqualToIgnoringWhitespace(""" + assertThat(firstOfEach(12, domainSetupAssets)).isEqualToIgnoringWhitespace(""" { - 10004531=HsHostingAssetRealEntity(DOMAIN_SETUP, l-u-g.org, l-u-g.org), - 10004532=HsHostingAssetRealEntity(DOMAIN_SETUP, linuxfanboysngirls.de, linuxfanboysngirls.de), - 10004534=HsHostingAssetRealEntity(DOMAIN_SETUP, lug-mars.de, lug-mars.de), - 10004581=HsHostingAssetRealEntity(DOMAIN_SETUP, 1981.ist-im-netz.de, 1981.ist-im-netz.de, DOMAIN_SETUP:ist-im-netz.de), - 10004587=HsHostingAssetRealEntity(DOMAIN_SETUP, mellis.de, mellis.de), - 10004589=HsHostingAssetRealEntity(DOMAIN_SETUP, ist-im-netz.de, ist-im-netz.de), - 10004600=HsHostingAssetRealEntity(DOMAIN_SETUP, waera.de, waera.de), - 10004604=HsHostingAssetRealEntity(DOMAIN_SETUP, xn--wra-qla.de, wära.de), - 10027662=HsHostingAssetRealEntity(DOMAIN_SETUP, dph-netzwerk.de, dph-netzwerk.de), - 11004531=HsHostingAssetRealEntity(DOMAIN_DNS_SETUP, l-u-g.org|DNS, DNS-Setup für l-u-g.org, DOMAIN_SETUP:l-u-g.org, MANAGED_WEBSPACE:lug00, {"TTL": 21600, "auto-A-RR": true, "auto-AAAA-RR": false, "auto-AUTOCONFIG-RR": false, "auto-AUTODISCOVER-RR": false, "auto-DKIM-RR": false, "auto-MAILSERVICES-RR": false, "auto-MX-RR": true, "auto-NS-RR": true, "auto-SOA": true, "auto-SPF-RR": false, "auto-WILDCARD-A-RR": true, "auto-WILDCARD-AAAA-RR": false, "auto-WILDCARD-MX-RR": true, "auto-WILDCARD-SPF-RR": false, "user-RR": [ ]}), - 11004532=HsHostingAssetRealEntity(DOMAIN_DNS_SETUP, linuxfanboysngirls.de|DNS, DNS-Setup für linuxfanboysngirls.de, DOMAIN_SETUP:linuxfanboysngirls.de, MANAGED_WEBSPACE:lug00, {"TTL": 21600, "auto-A-RR": true, "auto-AAAA-RR": false, "auto-AUTOCONFIG-RR": false, "auto-AUTODISCOVER-RR": false, "auto-DKIM-RR": false, "auto-MAILSERVICES-RR": false, "auto-MX-RR": true, "auto-NS-RR": true, "auto-SOA": true, "auto-SPF-RR": false, "auto-WILDCARD-A-RR": true, "auto-WILDCARD-AAAA-RR": false, "auto-WILDCARD-MX-RR": true, "auto-WILDCARD-SPF-RR": false, "user-RR": [ ]}), - 11004534=HsHostingAssetRealEntity(DOMAIN_DNS_SETUP, lug-mars.de|DNS, DNS-Setup für lug-mars.de, DOMAIN_SETUP:lug-mars.de, MANAGED_WEBSPACE:lug00, {"TTL": 14400, "auto-A-RR": true, "auto-AAAA-RR": false, "auto-AUTOCONFIG-RR": false, "auto-AUTODISCOVER-RR": false, "auto-DKIM-RR": false, "auto-MAILSERVICES-RR": false, "auto-MX-RR": false, "auto-NS-RR": true, "auto-SOA": false, "auto-SPF-RR": false, "auto-WILDCARD-A-RR": true, "auto-WILDCARD-AAAA-RR": false, "auto-WILDCARD-MX-RR": false, "auto-WILDCARD-SPF-RR": false, "user-RR": [ "lug-mars.de. 14400 IN SOA dns1.hostsharing.net. hostmaster.hostsharing.net. 1611590905 10800 3600 604800 3600", "lug-mars.de. 14400 IN MX 10 mailin1.hostsharing.net.", "lug-mars.de. 14400 IN MX 20 mailin2.hostsharing.net.", "lug-mars.de. 14400 IN MX 30 mailin3.hostsharing.net.", "bbb.lug-mars.de. 14400 IN A 83.223.79.72", "ftp.lug-mars.de. 14400 IN A 83.223.79.72", "www.lug-mars.de. 14400 IN A 83.223.79.72" ]}), - 11004581=HsHostingAssetRealEntity(DOMAIN_DNS_SETUP, 1981.ist-im-netz.de|DNS, DNS-Setup für 1981.ist-im-netz.de, DOMAIN_SETUP:1981.ist-im-netz.de, MANAGED_WEBSPACE:mim00, {"TTL": 21600, "auto-A-RR": true, "auto-AAAA-RR": false, "auto-AUTOCONFIG-RR": false, "auto-AUTODISCOVER-RR": false, "auto-DKIM-RR": false, "auto-MAILSERVICES-RR": false, "auto-MX-RR": true, "auto-NS-RR": true, "auto-SOA": true, "auto-SPF-RR": false, "auto-WILDCARD-A-RR": true, "auto-WILDCARD-AAAA-RR": false, "auto-WILDCARD-MX-RR": true, "auto-WILDCARD-SPF-RR": false, "user-RR": [ ]}), - 11004587=HsHostingAssetRealEntity(DOMAIN_DNS_SETUP, mellis.de|DNS, DNS-Setup für mellis.de, DOMAIN_SETUP:mellis.de, MANAGED_WEBSPACE:mim00, {"TTL": 21600, "auto-A-RR": true, "auto-AAAA-RR": true, "auto-AUTOCONFIG-RR": true, "auto-AUTODISCOVER-RR": true, "auto-DKIM-RR": true, "auto-MAILSERVICES-RR": true, "auto-MX-RR": true, "auto-NS-RR": true, "auto-SOA": true, "auto-SPF-RR": false, "auto-WILDCARD-A-RR": true, "auto-WILDCARD-AAAA-RR": true, "auto-WILDCARD-MX-RR": true, "auto-WILDCARD-SPF-RR": true, "user-RR": [ "dump.hoennig.de. 21600 IN CNAME mih12.hostsharing.net.", "fotos.hoennig.de. 21600 IN CNAME mih12.hostsharing.net.", "maven.hoennig.de. 21600 IN NS dns1.hostsharing.net." ]}), - 11004589=HsHostingAssetRealEntity(DOMAIN_DNS_SETUP, ist-im-netz.de|DNS, DNS-Setup für ist-im-netz.de, DOMAIN_SETUP:ist-im-netz.de, MANAGED_WEBSPACE:mim00, {"TTL": 700, "auto-A-RR": true, "auto-AAAA-RR": false, "auto-AUTOCONFIG-RR": false, "auto-AUTODISCOVER-RR": false, "auto-DKIM-RR": false, "auto-MAILSERVICES-RR": false, "auto-MX-RR": true, "auto-NS-RR": true, "auto-SOA": true, "auto-SPF-RR": false, "auto-WILDCARD-A-RR": true, "auto-WILDCARD-AAAA-RR": false, "auto-WILDCARD-MX-RR": false, "auto-WILDCARD-SPF-RR": false, "user-RR": [ ]}), - 11004600=HsHostingAssetRealEntity(DOMAIN_DNS_SETUP, waera.de|DNS, DNS-Setup für waera.de, DOMAIN_SETUP:waera.de, MANAGED_WEBSPACE:mim00, {"TTL": 21600, "auto-A-RR": false, "auto-AAAA-RR": false, "auto-AUTOCONFIG-RR": false, "auto-AUTODISCOVER-RR": false, "auto-DKIM-RR": false, "auto-MAILSERVICES-RR": false, "auto-MX-RR": false, "auto-NS-RR": false, "auto-SOA": false, "auto-SPF-RR": false, "auto-WILDCARD-A-RR": false, "auto-WILDCARD-AAAA-RR": false, "auto-WILDCARD-MX-RR": false, "auto-WILDCARD-SPF-RR": false, "user-RR": [ ]}), - 11004604=HsHostingAssetRealEntity(DOMAIN_DNS_SETUP, xn--wra-qla.de|DNS, DNS-Setup für wära.de, DOMAIN_SETUP:xn--wra-qla.de, MANAGED_WEBSPACE:mim00, {"TTL": 21600, "auto-A-RR": false, "auto-AAAA-RR": false, "auto-AUTOCONFIG-RR": false, "auto-AUTODISCOVER-RR": false, "auto-DKIM-RR": false, "auto-MAILSERVICES-RR": false, "auto-MX-RR": false, "auto-NS-RR": false, "auto-SOA": false, "auto-SPF-RR": false, "auto-WILDCARD-A-RR": false, "auto-WILDCARD-AAAA-RR": false, "auto-WILDCARD-MX-RR": false, "auto-WILDCARD-SPF-RR": false, "user-RR": [ ]}), - 11027662=HsHostingAssetRealEntity(DOMAIN_DNS_SETUP, dph-netzwerk.de|DNS, DNS-Setup für dph-netzwerk.de, DOMAIN_SETUP:dph-netzwerk.de, MANAGED_WEBSPACE:dph00, {"TTL": 21600, "auto-A-RR": true, "auto-AAAA-RR": true, "auto-AUTOCONFIG-RR": true, "auto-AUTODISCOVER-RR": true, "auto-DKIM-RR": false, "auto-MAILSERVICES-RR": true, "auto-MX-RR": true, "auto-NS-RR": true, "auto-SOA": true, "auto-SPF-RR": false, "auto-WILDCARD-A-RR": true, "auto-WILDCARD-AAAA-RR": true, "auto-WILDCARD-MX-RR": true, "auto-WILDCARD-SPF-RR": false, "user-RR": [ "dph-netzwerk.de. 21600 IN TXT \\"v=spf1 include:spf.hostsharing.net ?all\\"", "*.dph-netzwerk.de. 21600 IN TXT \\"v=spf1 include:spf.hostsharing.net ?all\\"" ]}), - 12004531=HsHostingAssetRealEntity(DOMAIN_HTTP_SETUP, l-u-g.org|HTTP, HTTP-Setup für l-u-g.org, DOMAIN_SETUP:l-u-g.org, UNIX_USER:lug00, {"autoconfig": false, "cgi": true, "fastcgi": true, "fcgi-php-bin": "/usr/lib/cgi-bin/php", "greylisting": true, "htdocsfallback": true, "includes": true, "indexes": true, "letsencrypt": false, "multiviews": true, "passenger": true, "passenger-errorpage": false, "passenger-nodejs": "/usr/bin/node", "passenger-python": "/usr/bin/python3", "passenger-ruby": "/usr/bin/ruby", "subdomains": [ "*" ]}), - 12004532=HsHostingAssetRealEntity(DOMAIN_HTTP_SETUP, linuxfanboysngirls.de|HTTP, HTTP-Setup für linuxfanboysngirls.de, DOMAIN_SETUP:linuxfanboysngirls.de, UNIX_USER:lug00-wla.2, {"autoconfig": false, "cgi": true, "fastcgi": true, "fcgi-php-bin": "/usr/lib/cgi-bin/php", "greylisting": true, "htdocsfallback": true, "includes": true, "indexes": true, "letsencrypt": false, "multiviews": true, "passenger": true, "passenger-errorpage": false, "passenger-nodejs": "/usr/bin/node", "passenger-python": "/usr/bin/python3", "passenger-ruby": "/usr/bin/ruby", "subdomains": [ "*" ]}), - 12004534=HsHostingAssetRealEntity(DOMAIN_HTTP_SETUP, lug-mars.de|HTTP, HTTP-Setup für lug-mars.de, DOMAIN_SETUP:lug-mars.de, UNIX_USER:lug00-wla.2, {"autoconfig": false, "cgi": true, "fastcgi": true, "fcgi-php-bin": "/usr/lib/cgi-bin/php", "greylisting": true, "htdocsfallback": true, "includes": true, "indexes": true, "letsencrypt": true, "multiviews": true, "passenger": true, "passenger-errorpage": false, "passenger-nodejs": "/usr/bin/node", "passenger-python": "/usr/bin/python3", "passenger-ruby": "/usr/bin/ruby", "subdomains": [ "www" ]}), - 12004581=HsHostingAssetRealEntity(DOMAIN_HTTP_SETUP, 1981.ist-im-netz.de|HTTP, HTTP-Setup für 1981.ist-im-netz.de, DOMAIN_SETUP:1981.ist-im-netz.de, UNIX_USER:mim00, {"autoconfig": false, "cgi": true, "fastcgi": true, "fcgi-php-bin": "/usr/lib/cgi-bin/php", "greylisting": true, "htdocsfallback": true, "includes": true, "indexes": true, "letsencrypt": false, "multiviews": true, "passenger": true, "passenger-errorpage": false, "passenger-nodejs": "/usr/bin/node", "passenger-python": "/usr/bin/python3", "passenger-ruby": "/usr/bin/ruby", "subdomains": [ "*" ]}), - 12004587=HsHostingAssetRealEntity(DOMAIN_HTTP_SETUP, mellis.de|HTTP, HTTP-Setup für mellis.de, DOMAIN_SETUP:mellis.de, UNIX_USER:mim00, {"autoconfig": false, "cgi": true, "fastcgi": true, "fcgi-php-bin": "/usr/lib/cgi-bin/php", "greylisting": false, "htdocsfallback": true, "includes": true, "indexes": true, "letsencrypt": true, "multiviews": true, "passenger": true, "passenger-errorpage": false, "passenger-nodejs": "/usr/bin/node", "passenger-python": "/usr/bin/python3", "passenger-ruby": "/usr/bin/ruby", "subdomains": [ "www", "michael", "test", "photos", "static", "input" ]}), - 12004589=HsHostingAssetRealEntity(DOMAIN_HTTP_SETUP, ist-im-netz.de|HTTP, HTTP-Setup für ist-im-netz.de, DOMAIN_SETUP:ist-im-netz.de, UNIX_USER:mim00, {"autoconfig": false, "cgi": true, "fastcgi": true, "fcgi-php-bin": "/usr/lib/cgi-bin/php", "greylisting": false, "htdocsfallback": true, "includes": true, "indexes": true, "letsencrypt": true, "multiviews": true, "passenger": true, "passenger-errorpage": false, "passenger-nodejs": "/usr/bin/node", "passenger-python": "/usr/bin/python3", "passenger-ruby": "/usr/bin/ruby", "subdomains": [ "*" ]}), - 12004600=HsHostingAssetRealEntity(DOMAIN_HTTP_SETUP, waera.de|HTTP, HTTP-Setup für waera.de, DOMAIN_SETUP:waera.de, UNIX_USER:mim00, {"autoconfig": false, "cgi": true, "fastcgi": true, "fcgi-php-bin": "/usr/lib/cgi-bin/php", "greylisting": true, "htdocsfallback": true, "includes": true, "indexes": true, "letsencrypt": false, "multiviews": true, "passenger": true, "passenger-errorpage": false, "passenger-nodejs": "/usr/bin/node", "passenger-python": "/usr/bin/python3", "passenger-ruby": "/usr/bin/ruby", "subdomains": [ "*" ]}), - 12004604=HsHostingAssetRealEntity(DOMAIN_HTTP_SETUP, xn--wra-qla.de|HTTP, HTTP-Setup für wära.de, DOMAIN_SETUP:xn--wra-qla.de, UNIX_USER:mim00, {"autoconfig": false, "cgi": true, "fastcgi": true, "fcgi-php-bin": "/usr/lib/cgi-bin/php", "greylisting": true, "htdocsfallback": true, "includes": true, "indexes": true, "letsencrypt": false, "multiviews": true, "passenger": true, "passenger-errorpage": false, "passenger-nodejs": "/usr/bin/node", "passenger-python": "/usr/bin/python3", "passenger-ruby": "/usr/bin/ruby", "subdomains": [ "*" ]}), - 12027662=HsHostingAssetRealEntity(DOMAIN_HTTP_SETUP, dph-netzwerk.de|HTTP, HTTP-Setup für dph-netzwerk.de, DOMAIN_SETUP:dph-netzwerk.de, UNIX_USER:dph00-dph, {"autoconfig": true, "cgi": true, "fastcgi": true, "fcgi-php-bin": "/usr/lib/cgi-bin/php", "greylisting": true, "htdocsfallback": true, "includes": true, "indexes": true, "letsencrypt": true, "multiviews": true, "passenger": true, "passenger-errorpage": false, "passenger-nodejs": "/usr/bin/node", "passenger-python": "/usr/bin/python3", "passenger-ruby": "/usr/bin/ruby", "subdomains": [ "*" ]}), - 13004531=HsHostingAssetRealEntity(DOMAIN_MBOX_SETUP, l-u-g.org|MBOX, E-Mail-Empfang-Setup für l-u-g.org, DOMAIN_SETUP:l-u-g.org, MANAGED_WEBSPACE:lug00), - 13004532=HsHostingAssetRealEntity(DOMAIN_MBOX_SETUP, linuxfanboysngirls.de|MBOX, E-Mail-Empfang-Setup für linuxfanboysngirls.de, DOMAIN_SETUP:linuxfanboysngirls.de, MANAGED_WEBSPACE:lug00), - 13004534=HsHostingAssetRealEntity(DOMAIN_MBOX_SETUP, lug-mars.de|MBOX, E-Mail-Empfang-Setup für lug-mars.de, DOMAIN_SETUP:lug-mars.de, MANAGED_WEBSPACE:lug00), - 13004581=HsHostingAssetRealEntity(DOMAIN_MBOX_SETUP, 1981.ist-im-netz.de|MBOX, E-Mail-Empfang-Setup für 1981.ist-im-netz.de, DOMAIN_SETUP:1981.ist-im-netz.de, MANAGED_WEBSPACE:mim00), - 13004587=HsHostingAssetRealEntity(DOMAIN_MBOX_SETUP, mellis.de|MBOX, E-Mail-Empfang-Setup für mellis.de, DOMAIN_SETUP:mellis.de, MANAGED_WEBSPACE:mim00), - 13004589=HsHostingAssetRealEntity(DOMAIN_MBOX_SETUP, ist-im-netz.de|MBOX, E-Mail-Empfang-Setup für ist-im-netz.de, DOMAIN_SETUP:ist-im-netz.de, MANAGED_WEBSPACE:mim00), - 13004600=HsHostingAssetRealEntity(DOMAIN_MBOX_SETUP, waera.de|MBOX, E-Mail-Empfang-Setup für waera.de, DOMAIN_SETUP:waera.de, MANAGED_WEBSPACE:mim00), - 13004604=HsHostingAssetRealEntity(DOMAIN_MBOX_SETUP, xn--wra-qla.de|MBOX, E-Mail-Empfang-Setup für wära.de, DOMAIN_SETUP:xn--wra-qla.de, MANAGED_WEBSPACE:mim00), - 13027662=HsHostingAssetRealEntity(DOMAIN_MBOX_SETUP, dph-netzwerk.de|MBOX, E-Mail-Empfang-Setup für dph-netzwerk.de, DOMAIN_SETUP:dph-netzwerk.de, MANAGED_WEBSPACE:dph00), - 14004531=HsHostingAssetRealEntity(DOMAIN_SMTP_SETUP, l-u-g.org|SMTP, E-Mail-Versand-Setup für l-u-g.org, DOMAIN_SETUP:l-u-g.org, MANAGED_WEBSPACE:lug00), - 14004532=HsHostingAssetRealEntity(DOMAIN_SMTP_SETUP, linuxfanboysngirls.de|SMTP, E-Mail-Versand-Setup für linuxfanboysngirls.de, DOMAIN_SETUP:linuxfanboysngirls.de, MANAGED_WEBSPACE:lug00), - 14004534=HsHostingAssetRealEntity(DOMAIN_SMTP_SETUP, lug-mars.de|SMTP, E-Mail-Versand-Setup für lug-mars.de, DOMAIN_SETUP:lug-mars.de, MANAGED_WEBSPACE:lug00), - 14004581=HsHostingAssetRealEntity(DOMAIN_SMTP_SETUP, 1981.ist-im-netz.de|SMTP, E-Mail-Versand-Setup für 1981.ist-im-netz.de, DOMAIN_SETUP:1981.ist-im-netz.de, MANAGED_WEBSPACE:mim00), - 14004587=HsHostingAssetRealEntity(DOMAIN_SMTP_SETUP, mellis.de|SMTP, E-Mail-Versand-Setup für mellis.de, DOMAIN_SETUP:mellis.de, MANAGED_WEBSPACE:mim00), - 14004589=HsHostingAssetRealEntity(DOMAIN_SMTP_SETUP, ist-im-netz.de|SMTP, E-Mail-Versand-Setup für ist-im-netz.de, DOMAIN_SETUP:ist-im-netz.de, MANAGED_WEBSPACE:mim00), - 14004600=HsHostingAssetRealEntity(DOMAIN_SMTP_SETUP, waera.de|SMTP, E-Mail-Versand-Setup für waera.de, DOMAIN_SETUP:waera.de, MANAGED_WEBSPACE:mim00), - 14004604=HsHostingAssetRealEntity(DOMAIN_SMTP_SETUP, xn--wra-qla.de|SMTP, E-Mail-Versand-Setup für wära.de, DOMAIN_SETUP:xn--wra-qla.de, MANAGED_WEBSPACE:mim00), - 14027662=HsHostingAssetRealEntity(DOMAIN_SMTP_SETUP, dph-netzwerk.de|SMTP, E-Mail-Versand-Setup für dph-netzwerk.de, DOMAIN_SETUP:dph-netzwerk.de, MANAGED_WEBSPACE:dph00) + 4531=HsHostingAssetRealEntity(DOMAIN_SETUP, l-u-g.org, l-u-g.org), + 4532=HsHostingAssetRealEntity(DOMAIN_SETUP, linuxfanboysngirls.de, linuxfanboysngirls.de), + 4534=HsHostingAssetRealEntity(DOMAIN_SETUP, lug-mars.de, lug-mars.de), + 4581=HsHostingAssetRealEntity(DOMAIN_SETUP, 1981.ist-im-netz.de, 1981.ist-im-netz.de, DOMAIN_SETUP:ist-im-netz.de), + 4587=HsHostingAssetRealEntity(DOMAIN_SETUP, mellis.de, mellis.de), + 4589=HsHostingAssetRealEntity(DOMAIN_SETUP, ist-im-netz.de, ist-im-netz.de), + 4600=HsHostingAssetRealEntity(DOMAIN_SETUP, waera.de, waera.de), + 4604=HsHostingAssetRealEntity(DOMAIN_SETUP, xn--wra-qla.de, wära.de), + 7662=HsHostingAssetRealEntity(DOMAIN_SETUP, dph-netzwerk.de, dph-netzwerk.de) + } + """); + + assertThat(firstOfEach(12, domainDnsSetupAssets)).isEqualToIgnoringWhitespace(""" + { + 4531=HsHostingAssetRealEntity(DOMAIN_DNS_SETUP, l-u-g.org|DNS, DNS-Setup für l-u-g.org, DOMAIN_SETUP:l-u-g.org, MANAGED_WEBSPACE:lug00, {"TTL": 21600, "auto-A-RR": true, "auto-AAAA-RR": false, "auto-AUTOCONFIG-RR": false, "auto-AUTODISCOVER-RR": false, "auto-DKIM-RR": false, "auto-MAILSERVICES-RR": false, "auto-MX-RR": true, "auto-NS-RR": true, "auto-SOA": true, "auto-SPF-RR": false, "auto-WILDCARD-A-RR": true, "auto-WILDCARD-AAAA-RR": false, "auto-WILDCARD-MX-RR": true, "auto-WILDCARD-SPF-RR": false, "user-RR": [ ]}), + 4532=HsHostingAssetRealEntity(DOMAIN_DNS_SETUP, linuxfanboysngirls.de|DNS, DNS-Setup für linuxfanboysngirls.de, DOMAIN_SETUP:linuxfanboysngirls.de, MANAGED_WEBSPACE:lug00, {"TTL": 21600, "auto-A-RR": true, "auto-AAAA-RR": false, "auto-AUTOCONFIG-RR": false, "auto-AUTODISCOVER-RR": false, "auto-DKIM-RR": false, "auto-MAILSERVICES-RR": false, "auto-MX-RR": true, "auto-NS-RR": true, "auto-SOA": true, "auto-SPF-RR": false, "auto-WILDCARD-A-RR": true, "auto-WILDCARD-AAAA-RR": false, "auto-WILDCARD-MX-RR": true, "auto-WILDCARD-SPF-RR": false, "user-RR": [ ]}), + 4534=HsHostingAssetRealEntity(DOMAIN_DNS_SETUP, lug-mars.de|DNS, DNS-Setup für lug-mars.de, DOMAIN_SETUP:lug-mars.de, MANAGED_WEBSPACE:lug00, {"TTL": 14400, "auto-A-RR": true, "auto-AAAA-RR": false, "auto-AUTOCONFIG-RR": false, "auto-AUTODISCOVER-RR": false, "auto-DKIM-RR": false, "auto-MAILSERVICES-RR": false, "auto-MX-RR": false, "auto-NS-RR": true, "auto-SOA": false, "auto-SPF-RR": false, "auto-WILDCARD-A-RR": true, "auto-WILDCARD-AAAA-RR": false, "auto-WILDCARD-MX-RR": false, "auto-WILDCARD-SPF-RR": false, "user-RR": [ "lug-mars.de. 14400 IN SOA dns1.hostsharing.net. hostmaster.hostsharing.net. 1611590905 10800 3600 604800 3600", "lug-mars.de. 14400 IN MX 10 mailin1.hostsharing.net.", "lug-mars.de. 14400 IN MX 20 mailin2.hostsharing.net.", "lug-mars.de. 14400 IN MX 30 mailin3.hostsharing.net.", "bbb.lug-mars.de. 14400 IN A 83.223.79.72", "ftp.lug-mars.de. 14400 IN A 83.223.79.72", "www.lug-mars.de. 14400 IN A 83.223.79.72" ]}), + 4581=HsHostingAssetRealEntity(DOMAIN_DNS_SETUP, 1981.ist-im-netz.de|DNS, DNS-Setup für 1981.ist-im-netz.de, DOMAIN_SETUP:1981.ist-im-netz.de, MANAGED_WEBSPACE:mim00, {"TTL": 21600, "auto-A-RR": true, "auto-AAAA-RR": false, "auto-AUTOCONFIG-RR": false, "auto-AUTODISCOVER-RR": false, "auto-DKIM-RR": false, "auto-MAILSERVICES-RR": false, "auto-MX-RR": true, "auto-NS-RR": true, "auto-SOA": true, "auto-SPF-RR": false, "auto-WILDCARD-A-RR": true, "auto-WILDCARD-AAAA-RR": false, "auto-WILDCARD-MX-RR": true, "auto-WILDCARD-SPF-RR": false, "user-RR": [ ]}), + 4587=HsHostingAssetRealEntity(DOMAIN_DNS_SETUP, mellis.de|DNS, DNS-Setup für mellis.de, DOMAIN_SETUP:mellis.de, MANAGED_WEBSPACE:mim00, {"TTL": 21600, "auto-A-RR": true, "auto-AAAA-RR": true, "auto-AUTOCONFIG-RR": true, "auto-AUTODISCOVER-RR": true, "auto-DKIM-RR": true, "auto-MAILSERVICES-RR": true, "auto-MX-RR": true, "auto-NS-RR": true, "auto-SOA": true, "auto-SPF-RR": false, "auto-WILDCARD-A-RR": true, "auto-WILDCARD-AAAA-RR": true, "auto-WILDCARD-MX-RR": true, "auto-WILDCARD-SPF-RR": true, "user-RR": [ "dump.hoennig.de. 21600 IN CNAME mih12.hostsharing.net.", "fotos.hoennig.de. 21600 IN CNAME mih12.hostsharing.net.", "maven.hoennig.de. 21600 IN NS dns1.hostsharing.net." ]}), + 4589=HsHostingAssetRealEntity(DOMAIN_DNS_SETUP, ist-im-netz.de|DNS, DNS-Setup für ist-im-netz.de, DOMAIN_SETUP:ist-im-netz.de, MANAGED_WEBSPACE:mim00, {"TTL": 700, "auto-A-RR": true, "auto-AAAA-RR": false, "auto-AUTOCONFIG-RR": false, "auto-AUTODISCOVER-RR": false, "auto-DKIM-RR": false, "auto-MAILSERVICES-RR": false, "auto-MX-RR": true, "auto-NS-RR": true, "auto-SOA": true, "auto-SPF-RR": false, "auto-WILDCARD-A-RR": true, "auto-WILDCARD-AAAA-RR": false, "auto-WILDCARD-MX-RR": false, "auto-WILDCARD-SPF-RR": false, "user-RR": [ ]}), + 4600=HsHostingAssetRealEntity(DOMAIN_DNS_SETUP, waera.de|DNS, DNS-Setup für waera.de, DOMAIN_SETUP:waera.de, MANAGED_WEBSPACE:mim00, {"TTL": 21600, "auto-A-RR": false, "auto-AAAA-RR": false, "auto-AUTOCONFIG-RR": false, "auto-AUTODISCOVER-RR": false, "auto-DKIM-RR": false, "auto-MAILSERVICES-RR": false, "auto-MX-RR": false, "auto-NS-RR": false, "auto-SOA": false, "auto-SPF-RR": false, "auto-WILDCARD-A-RR": false, "auto-WILDCARD-AAAA-RR": false, "auto-WILDCARD-MX-RR": false, "auto-WILDCARD-SPF-RR": false, "user-RR": [ ]}), + 4604=HsHostingAssetRealEntity(DOMAIN_DNS_SETUP, xn--wra-qla.de|DNS, DNS-Setup für wära.de, DOMAIN_SETUP:xn--wra-qla.de, MANAGED_WEBSPACE:mim00, {"TTL": 21600, "auto-A-RR": false, "auto-AAAA-RR": false, "auto-AUTOCONFIG-RR": false, "auto-AUTODISCOVER-RR": false, "auto-DKIM-RR": false, "auto-MAILSERVICES-RR": false, "auto-MX-RR": false, "auto-NS-RR": false, "auto-SOA": false, "auto-SPF-RR": false, "auto-WILDCARD-A-RR": false, "auto-WILDCARD-AAAA-RR": false, "auto-WILDCARD-MX-RR": false, "auto-WILDCARD-SPF-RR": false, "user-RR": [ ]}), + 7662=HsHostingAssetRealEntity(DOMAIN_DNS_SETUP, dph-netzwerk.de|DNS, DNS-Setup für dph-netzwerk.de, DOMAIN_SETUP:dph-netzwerk.de, MANAGED_WEBSPACE:dph00, {"TTL": 21600, "auto-A-RR": true, "auto-AAAA-RR": true, "auto-AUTOCONFIG-RR": true, "auto-AUTODISCOVER-RR": true, "auto-DKIM-RR": false, "auto-MAILSERVICES-RR": true, "auto-MX-RR": true, "auto-NS-RR": true, "auto-SOA": true, "auto-SPF-RR": false, "auto-WILDCARD-A-RR": true, "auto-WILDCARD-AAAA-RR": true, "auto-WILDCARD-MX-RR": true, "auto-WILDCARD-SPF-RR": false, "user-RR": [ "dph-netzwerk.de. 21600 IN TXT \\"v=spf1 include:spf.hostsharing.net ?all\\"", "*.dph-netzwerk.de. 21600 IN TXT \\"v=spf1 include:spf.hostsharing.net ?all\\"" ]}) + } + """); + + assertThat(firstOfEach(12, domainHttpSetupAssets)).isEqualToIgnoringWhitespace(""" + { + 4531=HsHostingAssetRealEntity(DOMAIN_HTTP_SETUP, l-u-g.org|HTTP, HTTP-Setup für l-u-g.org, DOMAIN_SETUP:l-u-g.org, UNIX_USER:lug00, {"autoconfig": false, "cgi": true, "fastcgi": true, "fcgi-php-bin": "/usr/lib/cgi-bin/php", "greylisting": true, "htdocsfallback": true, "includes": true, "indexes": true, "letsencrypt": false, "multiviews": true, "passenger": true, "passenger-errorpage": false, "passenger-nodejs": "/usr/bin/node", "passenger-python": "/usr/bin/python3", "passenger-ruby": "/usr/bin/ruby", "subdomains": [ "*" ]}), + 4532=HsHostingAssetRealEntity(DOMAIN_HTTP_SETUP, linuxfanboysngirls.de|HTTP, HTTP-Setup für linuxfanboysngirls.de, DOMAIN_SETUP:linuxfanboysngirls.de, UNIX_USER:lug00-wla.2, {"autoconfig": false, "cgi": true, "fastcgi": true, "fcgi-php-bin": "/usr/lib/cgi-bin/php", "greylisting": true, "htdocsfallback": true, "includes": true, "indexes": true, "letsencrypt": false, "multiviews": true, "passenger": true, "passenger-errorpage": false, "passenger-nodejs": "/usr/bin/node", "passenger-python": "/usr/bin/python3", "passenger-ruby": "/usr/bin/ruby", "subdomains": [ "*" ]}), + 4534=HsHostingAssetRealEntity(DOMAIN_HTTP_SETUP, lug-mars.de|HTTP, HTTP-Setup für lug-mars.de, DOMAIN_SETUP:lug-mars.de, UNIX_USER:lug00-wla.2, {"autoconfig": false, "cgi": true, "fastcgi": true, "fcgi-php-bin": "/usr/lib/cgi-bin/php", "greylisting": true, "htdocsfallback": true, "includes": true, "indexes": true, "letsencrypt": true, "multiviews": true, "passenger": true, "passenger-errorpage": false, "passenger-nodejs": "/usr/bin/node", "passenger-python": "/usr/bin/python3", "passenger-ruby": "/usr/bin/ruby", "subdomains": [ "www" ]}), + 4581=HsHostingAssetRealEntity(DOMAIN_HTTP_SETUP, 1981.ist-im-netz.de|HTTP, HTTP-Setup für 1981.ist-im-netz.de, DOMAIN_SETUP:1981.ist-im-netz.de, UNIX_USER:mim00, {"autoconfig": false, "cgi": true, "fastcgi": true, "fcgi-php-bin": "/usr/lib/cgi-bin/php", "greylisting": true, "htdocsfallback": true, "includes": true, "indexes": true, "letsencrypt": false, "multiviews": true, "passenger": true, "passenger-errorpage": false, "passenger-nodejs": "/usr/bin/node", "passenger-python": "/usr/bin/python3", "passenger-ruby": "/usr/bin/ruby", "subdomains": [ "*" ]}), + 4587=HsHostingAssetRealEntity(DOMAIN_HTTP_SETUP, mellis.de|HTTP, HTTP-Setup für mellis.de, DOMAIN_SETUP:mellis.de, UNIX_USER:mim00, {"autoconfig": false, "cgi": true, "fastcgi": true, "fcgi-php-bin": "/usr/lib/cgi-bin/php", "greylisting": false, "htdocsfallback": true, "includes": true, "indexes": true, "letsencrypt": true, "multiviews": true, "passenger": true, "passenger-errorpage": false, "passenger-nodejs": "/usr/bin/node", "passenger-python": "/usr/bin/python3", "passenger-ruby": "/usr/bin/ruby", "subdomains": [ "www", "michael", "test", "photos", "static", "input" ]}), + 4589=HsHostingAssetRealEntity(DOMAIN_HTTP_SETUP, ist-im-netz.de|HTTP, HTTP-Setup für ist-im-netz.de, DOMAIN_SETUP:ist-im-netz.de, UNIX_USER:mim00, {"autoconfig": false, "cgi": true, "fastcgi": true, "fcgi-php-bin": "/usr/lib/cgi-bin/php", "greylisting": false, "htdocsfallback": true, "includes": true, "indexes": true, "letsencrypt": true, "multiviews": true, "passenger": true, "passenger-errorpage": false, "passenger-nodejs": "/usr/bin/node", "passenger-python": "/usr/bin/python3", "passenger-ruby": "/usr/bin/ruby", "subdomains": [ "*" ]}), + 4600=HsHostingAssetRealEntity(DOMAIN_HTTP_SETUP, waera.de|HTTP, HTTP-Setup für waera.de, DOMAIN_SETUP:waera.de, UNIX_USER:mim00, {"autoconfig": false, "cgi": true, "fastcgi": true, "fcgi-php-bin": "/usr/lib/cgi-bin/php", "greylisting": true, "htdocsfallback": true, "includes": true, "indexes": true, "letsencrypt": false, "multiviews": true, "passenger": true, "passenger-errorpage": false, "passenger-nodejs": "/usr/bin/node", "passenger-python": "/usr/bin/python3", "passenger-ruby": "/usr/bin/ruby", "subdomains": [ "*" ]}), + 4604=HsHostingAssetRealEntity(DOMAIN_HTTP_SETUP, xn--wra-qla.de|HTTP, HTTP-Setup für wära.de, DOMAIN_SETUP:xn--wra-qla.de, UNIX_USER:mim00, {"autoconfig": false, "cgi": true, "fastcgi": true, "fcgi-php-bin": "/usr/lib/cgi-bin/php", "greylisting": true, "htdocsfallback": true, "includes": true, "indexes": true, "letsencrypt": false, "multiviews": true, "passenger": true, "passenger-errorpage": false, "passenger-nodejs": "/usr/bin/node", "passenger-python": "/usr/bin/python3", "passenger-ruby": "/usr/bin/ruby", "subdomains": [ "*" ]}), + 7662=HsHostingAssetRealEntity(DOMAIN_HTTP_SETUP, dph-netzwerk.de|HTTP, HTTP-Setup für dph-netzwerk.de, DOMAIN_SETUP:dph-netzwerk.de, UNIX_USER:dph00-dph, {"autoconfig": true, "cgi": true, "fastcgi": true, "fcgi-php-bin": "/usr/lib/cgi-bin/php", "greylisting": true, "htdocsfallback": true, "includes": true, "indexes": true, "letsencrypt": true, "multiviews": true, "passenger": true, "passenger-errorpage": false, "passenger-nodejs": "/usr/bin/node", "passenger-python": "/usr/bin/python3", "passenger-ruby": "/usr/bin/ruby", "subdomains": [ "*" ]}) + } + """); + + assertThat(firstOfEach(12, domainMBoxSetupAssets)).isEqualToIgnoringWhitespace(""" + { + 4531=HsHostingAssetRealEntity(DOMAIN_MBOX_SETUP, l-u-g.org|MBOX, E-Mail-Empfang-Setup für l-u-g.org, DOMAIN_SETUP:l-u-g.org, MANAGED_WEBSPACE:lug00), + 4532=HsHostingAssetRealEntity(DOMAIN_MBOX_SETUP, linuxfanboysngirls.de|MBOX, E-Mail-Empfang-Setup für linuxfanboysngirls.de, DOMAIN_SETUP:linuxfanboysngirls.de, MANAGED_WEBSPACE:lug00), + 4534=HsHostingAssetRealEntity(DOMAIN_MBOX_SETUP, lug-mars.de|MBOX, E-Mail-Empfang-Setup für lug-mars.de, DOMAIN_SETUP:lug-mars.de, MANAGED_WEBSPACE:lug00), + 4581=HsHostingAssetRealEntity(DOMAIN_MBOX_SETUP, 1981.ist-im-netz.de|MBOX, E-Mail-Empfang-Setup für 1981.ist-im-netz.de, DOMAIN_SETUP:1981.ist-im-netz.de, MANAGED_WEBSPACE:mim00), + 4587=HsHostingAssetRealEntity(DOMAIN_MBOX_SETUP, mellis.de|MBOX, E-Mail-Empfang-Setup für mellis.de, DOMAIN_SETUP:mellis.de, MANAGED_WEBSPACE:mim00), + 4589=HsHostingAssetRealEntity(DOMAIN_MBOX_SETUP, ist-im-netz.de|MBOX, E-Mail-Empfang-Setup für ist-im-netz.de, DOMAIN_SETUP:ist-im-netz.de, MANAGED_WEBSPACE:mim00), + 4600=HsHostingAssetRealEntity(DOMAIN_MBOX_SETUP, waera.de|MBOX, E-Mail-Empfang-Setup für waera.de, DOMAIN_SETUP:waera.de, MANAGED_WEBSPACE:mim00), + 4604=HsHostingAssetRealEntity(DOMAIN_MBOX_SETUP, xn--wra-qla.de|MBOX, E-Mail-Empfang-Setup für wära.de, DOMAIN_SETUP:xn--wra-qla.de, MANAGED_WEBSPACE:mim00), + 7662=HsHostingAssetRealEntity(DOMAIN_MBOX_SETUP, dph-netzwerk.de|MBOX, E-Mail-Empfang-Setup für dph-netzwerk.de, DOMAIN_SETUP:dph-netzwerk.de, MANAGED_WEBSPACE:dph00) + } + """); + + assertThat(firstOfEach(12, domainSmtpSetupAssets)).isEqualToIgnoringWhitespace(""" + { + 4531=HsHostingAssetRealEntity(DOMAIN_SMTP_SETUP, l-u-g.org|SMTP, E-Mail-Versand-Setup für l-u-g.org, DOMAIN_SETUP:l-u-g.org, MANAGED_WEBSPACE:lug00), + 4532=HsHostingAssetRealEntity(DOMAIN_SMTP_SETUP, linuxfanboysngirls.de|SMTP, E-Mail-Versand-Setup für linuxfanboysngirls.de, DOMAIN_SETUP:linuxfanboysngirls.de, MANAGED_WEBSPACE:lug00), + 4534=HsHostingAssetRealEntity(DOMAIN_SMTP_SETUP, lug-mars.de|SMTP, E-Mail-Versand-Setup für lug-mars.de, DOMAIN_SETUP:lug-mars.de, MANAGED_WEBSPACE:lug00), + 4581=HsHostingAssetRealEntity(DOMAIN_SMTP_SETUP, 1981.ist-im-netz.de|SMTP, E-Mail-Versand-Setup für 1981.ist-im-netz.de, DOMAIN_SETUP:1981.ist-im-netz.de, MANAGED_WEBSPACE:mim00), + 4587=HsHostingAssetRealEntity(DOMAIN_SMTP_SETUP, mellis.de|SMTP, E-Mail-Versand-Setup für mellis.de, DOMAIN_SETUP:mellis.de, MANAGED_WEBSPACE:mim00), + 4589=HsHostingAssetRealEntity(DOMAIN_SMTP_SETUP, ist-im-netz.de|SMTP, E-Mail-Versand-Setup für ist-im-netz.de, DOMAIN_SETUP:ist-im-netz.de, MANAGED_WEBSPACE:mim00), + 4600=HsHostingAssetRealEntity(DOMAIN_SMTP_SETUP, waera.de|SMTP, E-Mail-Versand-Setup für waera.de, DOMAIN_SETUP:waera.de, MANAGED_WEBSPACE:mim00), + 4604=HsHostingAssetRealEntity(DOMAIN_SMTP_SETUP, xn--wra-qla.de|SMTP, E-Mail-Versand-Setup für wära.de, DOMAIN_SETUP:xn--wra-qla.de, MANAGED_WEBSPACE:mim00), + 7662=HsHostingAssetRealEntity(DOMAIN_SMTP_SETUP, dph-netzwerk.de|SMTP, E-Mail-Versand-Setup für dph-netzwerk.de, DOMAIN_SETUP:dph-netzwerk.de, MANAGED_WEBSPACE:dph00) + } + """); + } + + @Test + @Order(17010) + void importEmailAddresses() { + try (Reader reader = resourceReader(MIGRATION_DATA_PATH + "/hosting/emailaddr.csv")) { + final var lines = readAllLines(reader); + importEmailAddresses(justHeader(lines), withoutHeader(lines)); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + @Test + @Order(17029) + void verifyEmailAddresses() { + assumeThatWeAreImportingControlledTestData(); + + assertThat(firstOfEach(12, emailAddressAssets)).isEqualToIgnoringWhitespace(""" + { + 54745=HsHostingAssetRealEntity(EMAIL_ADDRESS, lugmaster@l-u-g.org, lugmaster@l-u-g.org, DOMAIN_MBOX_SETUP:l-u-g.org|MBOX, {"local-part": "lugmaster", "target": [ "nobody" ]}), + 54746=HsHostingAssetRealEntity(EMAIL_ADDRESS, abuse@l-u-g.org, abuse@l-u-g.org, DOMAIN_MBOX_SETUP:l-u-g.org|MBOX, {"local-part": "abuse", "target": [ "lug00" ]}), + 54747=HsHostingAssetRealEntity(EMAIL_ADDRESS, postmaster@l-u-g.org, postmaster@l-u-g.org, DOMAIN_MBOX_SETUP:l-u-g.org|MBOX, {"local-part": "postmaster", "target": [ "nobody" ]}), + 54748=HsHostingAssetRealEntity(EMAIL_ADDRESS, webmaster@l-u-g.org, webmaster@l-u-g.org, DOMAIN_MBOX_SETUP:l-u-g.org|MBOX, {"local-part": "webmaster", "target": [ "nobody" ]}), + 54749=HsHostingAssetRealEntity(EMAIL_ADDRESS, abuse@linuxfanboysngirls.de, abuse@linuxfanboysngirls.de, DOMAIN_MBOX_SETUP:linuxfanboysngirls.de|MBOX, {"local-part": "abuse", "target": [ "lug00-mars" ]}), + 54750=HsHostingAssetRealEntity(EMAIL_ADDRESS, postmaster@linuxfanboysngirls.de, postmaster@linuxfanboysngirls.de, DOMAIN_MBOX_SETUP:linuxfanboysngirls.de|MBOX, {"local-part": "postmaster", "target": [ "m.hinsel@example.org" ]}), + 54751=HsHostingAssetRealEntity(EMAIL_ADDRESS, webmaster@linuxfanboysngirls.de, webmaster@linuxfanboysngirls.de, DOMAIN_MBOX_SETUP:linuxfanboysngirls.de|MBOX, {"local-part": "webmaster", "target": [ "m.hinsel@example.org" ]}), + 54755=HsHostingAssetRealEntity(EMAIL_ADDRESS, abuse@lug-mars.de, abuse@lug-mars.de, DOMAIN_MBOX_SETUP:lug-mars.de|MBOX, {"local-part": "abuse", "target": [ "lug00-marl" ]}), + 54756=HsHostingAssetRealEntity(EMAIL_ADDRESS, postmaster@lug-mars.de, postmaster@lug-mars.de, DOMAIN_MBOX_SETUP:lug-mars.de|MBOX, {"local-part": "postmaster", "target": [ "m.hinsel@example.org" ]}), + 54757=HsHostingAssetRealEntity(EMAIL_ADDRESS, webmaster@lug-mars.de, webmaster@lug-mars.de, DOMAIN_MBOX_SETUP:lug-mars.de|MBOX, {"local-part": "webmaster", "target": [ "m.hinsel@example.org" ]}), + 54760=HsHostingAssetRealEntity(EMAIL_ADDRESS, info@hamburg-west.l-u-g.org, info@hamburg-west.l-u-g.org, DOMAIN_MBOX_SETUP:l-u-g.org|MBOX, {"local-part": "info", "sub-domain": "hamburg-west", "target": [ "peter.lottmann@example.com" ]}), + 54761=HsHostingAssetRealEntity(EMAIL_ADDRESS, lugmaster@hamburg-west.l-u-g.org, lugmaster@hamburg-west.l-u-g.org, DOMAIN_MBOX_SETUP:l-u-g.org|MBOX, {"local-part": "lugmaster", "sub-domain": "hamburg-west", "target": [ "raoul.lottmann@example.com" ]}) } """); } @@ -563,16 +615,90 @@ public class ImportHostingAssets extends ImportOfficeData { @Test @Order(18020) - void validateHostingAssets() { - hostingAssets.forEach((id, ha) -> { - try { + void validateIpNumberAssets() { + validateHostingAssets(ipNumberAssets); + } + + @Test + @Order(18021) + void validateServerAndWebspaceAssets() { + validateHostingAssets(packetAssets); + } + + @Test + @Order(18022) + void validateUnixUserAssets() { + validateHostingAssets(unixUserAssets); + } + + @Test + @Order(18023) + void validateEmailAliasAssets() { + validateHostingAssets(emailAliasAssets); + } + + @Test + @Order(18030) + void validateDbInstanceAssets() { + validateHostingAssets(dbInstanceAssets); + } + + @Test + @Order(18031) + void validateDbUserAssets() { + validateHostingAssets(dbUserAssets); + } + + @Test + @Order(18032) + void validateDbAssets() { + validateHostingAssets(dbAssets); + } + + @Test + @Order(18040) + void validateDomainSetupAssets() { + validateHostingAssets(domainSetupAssets); + } + + @Test + @Order(18041) + void validateDomainDnsSetupAssets() { + validateHostingAssets(domainDnsSetupAssets); + } + + @Test + @Order(18042) + void validateDomainHttpSetupAssets() { + validateHostingAssets(domainHttpSetupAssets); + } + + @Test + @Order(18043) + void validateDomainSmtpSetupAssets() { + validateHostingAssets(domainSmtpSetupAssets); + } + + @Test + @Order(18044) + void validateDomainMBoxSetupAssets() { + validateHostingAssets(domainMBoxSetupAssets); + } + + @Test + @Order(18050) + void validateEmailAddressAssets() { + validateHostingAssets(emailAddressAssets); + } + + void validateHostingAssets(final Map assets) { + assets.forEach((id, ha) -> { + logError(() -> new HostingAssetEntitySaveProcessor(em, ha) .preprocessEntity() .validateEntity() - .prepareForSave(); - } catch (final Exception exc) { - errors.add("validation failed for id:" + id + "( " + ha + "): " + exc.getMessage()); - } + .prepareForSave() + ); }); } @@ -583,6 +709,9 @@ public class ImportHostingAssets extends ImportOfficeData { if (isImportingControlledTestData()) { expectError("zonedata dom_owner of mellis.de is old00 but expected to be mim00"); expectError("\nexpected: \"vm1068\"\n but was: \"vm1093\""); + expectError("['EMAIL_ADDRESS:webmaster@hamburg-west.l-u-g.org.config.target' is expected to match any of [^[a-z][a-z0-9]{2}[0-9]{2}(-[a-z0-9][a-z0-9\\.+_-]*)?$, ^([a-zA-Z0-9_!#$%&'*+/=?`{|}~^.-]+)?@[a-zA-Z0-9.-]+$, ^nobody$, ^/dev/null$] but 'raoul.lottmann@example.com peter.lottmann@example.com' does not match any]"); + expectError("['EMAIL_ADDRESS:abuse@mellis.de.config.target' length is expected to be at min 1 but length of [[]] is 0]"); + expectError("['EMAIL_ADDRESS:abuse@ist-im-netz.de.config.target' length is expected to be at min 1 but length of [[]] is 0]"); } this.assertNoErrors(); } @@ -622,7 +751,7 @@ public class ImportHostingAssets extends ImportOfficeData { System.out.println("PERSISTING cloud-servers to database '" + jdbcUrl + "' as user '" + postgresAdminUser + "'"); - persistHostingAssetsOfType(CLOUD_SERVER); + persistHostingAssets(packetAssets, CLOUD_SERVER); } @Test @@ -630,7 +759,7 @@ public class ImportHostingAssets extends ImportOfficeData { @Commit void persistManagedServers() { System.out.println("PERSISTING managed-servers to database '" + jdbcUrl + "' as user '" + postgresAdminUser + "'"); - persistHostingAssetsOfType(MANAGED_SERVER); + persistHostingAssets(packetAssets, MANAGED_SERVER); } @Test @@ -638,7 +767,7 @@ public class ImportHostingAssets extends ImportOfficeData { @Commit void persistManagedWebspaces() { System.out.println("PERSISTING managed-webspaces to database '" + jdbcUrl + "' as user '" + postgresAdminUser + "'"); - persistHostingAssetsOfType(MANAGED_WEBSPACE); + persistHostingAssets(packetAssets, MANAGED_WEBSPACE); } @Test @@ -646,7 +775,7 @@ public class ImportHostingAssets extends ImportOfficeData { @Commit void persistIPNumbers() { System.out.println("PERSISTING ip-numbers to database '" + jdbcUrl + "' as user '" + postgresAdminUser + "'"); - persistHostingAssetsOfType(IPV4_NUMBER); + persistHostingAssets(ipNumberAssets); } @Test @@ -654,7 +783,7 @@ public class ImportHostingAssets extends ImportOfficeData { @Commit void persistUnixUsers() { System.out.println("PERSISTING unix-users to database '" + jdbcUrl + "' as user '" + postgresAdminUser + "'"); - persistHostingAssetsOfType(UNIX_USER); + persistHostingAssets(unixUserAssets); } @Test @@ -662,7 +791,7 @@ public class ImportHostingAssets extends ImportOfficeData { @Commit void persistEmailAliases() { System.out.println("PERSISTING email-aliases to database '" + jdbcUrl + "' as user '" + postgresAdminUser + "'"); - persistHostingAssetsOfType(EMAIL_ALIAS); + persistHostingAssets(emailAliasAssets); } @Test @@ -670,7 +799,7 @@ public class ImportHostingAssets extends ImportOfficeData { @Commit void persistDatabaseInstances() { System.out.println("PERSISTING db-users to database '" + jdbcUrl + "' as user '" + postgresAdminUser + "'"); - persistHostingAssetsOfType(PGSQL_INSTANCE, MARIADB_INSTANCE); + persistHostingAssets(dbInstanceAssets); } @Test @@ -678,7 +807,7 @@ public class ImportHostingAssets extends ImportOfficeData { @Commit void persistDatabaseUsers() { System.out.println("PERSISTING db-users to database '" + jdbcUrl + "' as user '" + postgresAdminUser + "'"); - persistHostingAssetsOfType(PGSQL_USER, MARIADB_USER); + persistHostingAssets(dbUserAssets); } @Test @@ -686,7 +815,7 @@ public class ImportHostingAssets extends ImportOfficeData { @Commit void persistDatabases() { System.out.println("PERSISTING databases to database '" + jdbcUrl + "' as user '" + postgresAdminUser + "'"); - persistHostingAssetsOfType(PGSQL_DATABASE, MARIADB_DATABASE); + persistHostingAssets(dbAssets); } @Test @@ -694,7 +823,7 @@ public class ImportHostingAssets extends ImportOfficeData { @Commit void persistDomainSetups() { System.out.println("PERSISTING domain setups to database '" + jdbcUrl + "' as user '" + postgresAdminUser + "'"); - persistHostingAssetsOfType(DOMAIN_SETUP); + persistHostingAssets(domainSetupAssets); } @Test @@ -702,7 +831,8 @@ public class ImportHostingAssets extends ImportOfficeData { @Commit void persistDomainDnsSetups() { System.out.println("PERSISTING domain DNS setups to database '" + jdbcUrl + "' as user '" + postgresAdminUser + "'"); - persistHostingAssetsOfType(DOMAIN_DNS_SETUP); + HsDomainDnsSetupHostingAssetValidator.addZonefileErrorsTo(zonefileErrors); + persistHostingAssets(domainDnsSetupAssets); } @Test @@ -710,7 +840,7 @@ public class ImportHostingAssets extends ImportOfficeData { @Commit void persistDomainHttpSetups() { System.out.println("PERSISTING domain HTTP setups to database '" + jdbcUrl + "' as user '" + postgresAdminUser + "'"); - persistHostingAssetsOfType(DOMAIN_HTTP_SETUP); + persistHostingAssets(domainHttpSetupAssets); } @Test @@ -718,7 +848,7 @@ public class ImportHostingAssets extends ImportOfficeData { @Commit void persistDomainMboxSetups() { System.out.println("PERSISTING domain MBOX setups to database '" + jdbcUrl + "' as user '" + postgresAdminUser + "'"); - persistHostingAssetsOfType(DOMAIN_MBOX_SETUP); + persistHostingAssets(domainMBoxSetupAssets); } @Test @@ -726,7 +856,15 @@ public class ImportHostingAssets extends ImportOfficeData { @Commit void persistDomainSmtpSetups() { System.out.println("PERSISTING domain SMTP setups to database '" + jdbcUrl + "' as user '" + postgresAdminUser + "'"); - persistHostingAssetsOfType(DOMAIN_SMTP_SETUP); + persistHostingAssets(domainSmtpSetupAssets); + } + + @Test + @Order(19400) + @Commit + void persistEmailAddresses() { + System.out.println("PERSISTING email-aliases to database '" + jdbcUrl + "' as user '" + postgresAdminUser + "'"); + persistHostingAssets(emailAddressAssets); } @Test @@ -734,22 +872,22 @@ public class ImportHostingAssets extends ImportOfficeData { void verifyPersistedUnixUsersWithUserId() { assumeThatWeAreImportingControlledTestData(); - assertThat(firstOfEachType(15, UNIX_USER)).isEqualToIgnoringWhitespace(""" + assertThat(firstOfEach(15, unixUserAssets)).isEqualToIgnoringWhitespace(""" { - 4005803=HsHostingAssetRealEntity(UNIX_USER, lug00, LUGs, MANAGED_WEBSPACE:lug00, { "SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "password": null, "shell": "/bin/bash", "userid": 102090}), - 4005805=HsHostingAssetRealEntity(UNIX_USER, lug00-wla.1, Paul Klemm, MANAGED_WEBSPACE:lug00, { "SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "password": null, "shell": "/bin/bash", "userid": 102091}), - 4005809=HsHostingAssetRealEntity(UNIX_USER, lug00-wla.2, Walter Müller, MANAGED_WEBSPACE:lug00, { "SSD hard quota": 8, "SSD soft quota": 4, "locked": false, "password": null, "shell": "/bin/bash", "userid": 102093}), - 4005811=HsHostingAssetRealEntity(UNIX_USER, lug00-ola.a, LUG OLA - POP a, MANAGED_WEBSPACE:lug00, { "SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "password": null, "shell": "/usr/bin/passwd", "userid": 102094}), - 4005813=HsHostingAssetRealEntity(UNIX_USER, lug00-ola.b, LUG OLA - POP b, MANAGED_WEBSPACE:lug00, { "SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "password": null, "shell": "/usr/bin/passwd", "userid": 102095}), - 4005835=HsHostingAssetRealEntity(UNIX_USER, lug00-test, Test, MANAGED_WEBSPACE:lug00, { "SSD hard quota": 1024, "SSD soft quota": 1024, "locked": false, "password": null, "shell": "/usr/bin/passwd", "userid": 102106}), - 4005964=HsHostingAssetRealEntity(UNIX_USER, mim00, Michael Mellis, MANAGED_WEBSPACE:mim00, { "SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "password": null, "shell": "/bin/bash", "userid": 102147}), - 4005966=HsHostingAssetRealEntity(UNIX_USER, mim00-1981, Jahrgangstreffen 1981, MANAGED_WEBSPACE:mim00, { "SSD hard quota": 256, "SSD soft quota": 128, "locked": false, "password": null, "shell": "/bin/bash", "userid": 102148}), - 4005990=HsHostingAssetRealEntity(UNIX_USER, mim00-mail, Mailbox, MANAGED_WEBSPACE:mim00, { "SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "password": null, "shell": "/bin/bash", "userid": 102160}), - 4100705=HsHostingAssetRealEntity(UNIX_USER, hsh00-mim, Michael Mellis, MANAGED_WEBSPACE:hsh00, { "HDD hard quota": 0, "HDD soft quota": 0, "SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "password": null, "shell": "/bin/false", "userid": 10003}), - 4100824=HsHostingAssetRealEntity(UNIX_USER, hsh00, Hostsharing Paket, MANAGED_WEBSPACE:hsh00, { "HDD hard quota": 0, "HDD soft quota": 0, "SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "password": null, "shell": "/bin/bash", "userid": 10000}), - 4167846=HsHostingAssetRealEntity(UNIX_USER, hsh00-dph, hsh00-uph, MANAGED_WEBSPACE:hsh00, { "HDD hard quota": 0, "HDD soft quota": 0, "SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "password": null, "shell": "/bin/false", "userid": 110568}), - 4169546=HsHostingAssetRealEntity(UNIX_USER, dph00, Reinhard Wiese, MANAGED_WEBSPACE:dph00, { "SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "password": null, "shell": "/bin/bash", "userid": 110593}), - 4169596=HsHostingAssetRealEntity(UNIX_USER, dph00-dph, Domain admin, MANAGED_WEBSPACE:dph00, { "SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "password": null, "shell": "/bin/bash", "userid": 110594}) + 5803=HsHostingAssetRealEntity(UNIX_USER, lug00, LUGs, MANAGED_WEBSPACE:lug00, {"SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "password": null, "shell": "/bin/bash", "userid": 102090}), + 5805=HsHostingAssetRealEntity(UNIX_USER, lug00-wla.1, Paul Klemm, MANAGED_WEBSPACE:lug00, {"SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "password": null, "shell": "/bin/bash", "userid": 102091}), + 5809=HsHostingAssetRealEntity(UNIX_USER, lug00-wla.2, Walter Müller, MANAGED_WEBSPACE:lug00, {"SSD hard quota": 8, "SSD soft quota": 4, "locked": false, "password": null, "shell": "/bin/bash", "userid": 102093}), + 5811=HsHostingAssetRealEntity(UNIX_USER, lug00-ola.a, LUG OLA - POP a, MANAGED_WEBSPACE:lug00, {"SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "password": null, "shell": "/usr/bin/passwd", "userid": 102094}), + 5813=HsHostingAssetRealEntity(UNIX_USER, lug00-ola.b, LUG OLA - POP b, MANAGED_WEBSPACE:lug00, {"SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "password": null, "shell": "/usr/bin/passwd", "userid": 102095}), + 5835=HsHostingAssetRealEntity(UNIX_USER, lug00-test, Test, MANAGED_WEBSPACE:lug00, {"SSD hard quota": 1024, "SSD soft quota": 1024, "locked": false, "password": null, "shell": "/usr/bin/passwd", "userid": 102106}), + 5964=HsHostingAssetRealEntity(UNIX_USER, mim00, Michael Mellis, MANAGED_WEBSPACE:mim00, {"SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "password": null, "shell": "/bin/bash", "userid": 102147}), + 5966=HsHostingAssetRealEntity(UNIX_USER, mim00-1981, Jahrgangstreffen 1981, MANAGED_WEBSPACE:mim00, {"SSD hard quota": 256, "SSD soft quota": 128, "locked": false, "password": null, "shell": "/bin/bash", "userid": 102148}), + 5990=HsHostingAssetRealEntity(UNIX_USER, mim00-mail, Mailbox, MANAGED_WEBSPACE:mim00, {"SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "password": null, "shell": "/bin/bash", "userid": 102160}), + 6705=HsHostingAssetRealEntity(UNIX_USER, hsh00-mim, Michael Mellis, MANAGED_WEBSPACE:hsh00, {"HDD hard quota": 0, "HDD soft quota": 0, "SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "password": null, "shell": "/bin/false", "userid": 10003}), + 6824=HsHostingAssetRealEntity(UNIX_USER, hsh00, Hostsharing Paket, MANAGED_WEBSPACE:hsh00, {"HDD hard quota": 0, "HDD soft quota": 0, "SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "password": null, "shell": "/bin/bash", "userid": 10000}), + 7846=HsHostingAssetRealEntity(UNIX_USER, hsh00-dph, hsh00-uph, MANAGED_WEBSPACE:hsh00, {"HDD hard quota": 0, "HDD soft quota": 0, "SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "password": null, "shell": "/bin/false", "userid": 110568}), + 9546=HsHostingAssetRealEntity(UNIX_USER, dph00, Reinhard Wiese, MANAGED_WEBSPACE:dph00, {"SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "password": null, "shell": "/bin/bash", "userid": 110593}), + 9596=HsHostingAssetRealEntity(UNIX_USER, dph00-dph, Domain admin, MANAGED_WEBSPACE:dph00, {"SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "password": null, "shell": "/bin/bash", "userid": 110594}) } """); } @@ -768,6 +906,16 @@ public class ImportHostingAssets extends ImportOfficeData { final var haCount = (Integer) em.createNativeQuery("select count(*) from hs_hosting_asset", Integer.class) .getSingleResult(); assertThat(haCount).isGreaterThan(isImportingControlledTestData() ? 40 : 15000); + + verifyActuallyPersistedHostingAssetCount(CLOUD_SERVER, 1, 50); + verifyActuallyPersistedHostingAssetCount(MANAGED_SERVER, 4, 100); + verifyActuallyPersistedHostingAssetCount(MANAGED_WEBSPACE, 4, 100); + verifyActuallyPersistedHostingAssetCount(UNIX_USER, 14, 100); + verifyActuallyPersistedHostingAssetCount(EMAIL_ALIAS, 9, 1400); + verifyActuallyPersistedHostingAssetCount(PGSQL_DATABASE, 8, 100); + verifyActuallyPersistedHostingAssetCount(MARIADB_DATABASE, 8, 100); + verifyActuallyPersistedHostingAssetCount(DOMAIN_SETUP, 9, 100); + verifyActuallyPersistedHostingAssetCount(EMAIL_ADDRESS, 71, 30000); } // ============================================================================================ @@ -787,6 +935,12 @@ public class ImportHostingAssets extends ImportOfficeData { assertNoErrors(); } + // ============================================================================================ + + private String vmName(final String zonenfileName) { + return zonenfileName.substring(zonenfileName.length() - "vm0000.json".length()).substring(0, 6); + } + private void persistRecursively(final Integer key, final HsBookingItemEntity bi) { if (bi.getParentItem() != null) { persistRecursively(key, HsBookingItemEntityValidatorRegistry.validated(bi.getParentItem())); @@ -794,30 +948,50 @@ public class ImportHostingAssets extends ImportOfficeData { persist(key, HsBookingItemEntityValidatorRegistry.validated(bi)); } - // ============================================================================================ + private void persistHostingAssets(final Map assets) { + persistHostingAssets(assets, null); + } - private void persistHostingAssetsOfType(final HsHostingAssetType... hsHostingAssetTypes) { - final var hsHostingAssetTypeSet = stream(hsHostingAssetTypes).collect(toSet()); + private void persistHostingAssets(final Map assets, final HsHostingAssetType type) { + final var assetsOfType = assets.entrySet().stream() + .filter(entry -> type == null || type == entry.getValue().getType()) + .toList(); + final var chunkSize = isImportingControlledTestData() ? 10 : 500; + ListUtils.partition(assetsOfType, chunkSize).forEach(chunk -> + jpaAttempt.transacted(() -> { + context(rbacSuperuser); + chunk.forEach(entry -> + logError(() -> + new HostingAssetEntitySaveProcessor(em, entry.getValue()) + .preprocessEntity() + .validateEntityIgnoring( + "'EMAIL_ALIAS:.*\\.config\\.target' .*", + "'EMAIL_ADDRESS:.*\\.config\\.target' .*" + ) + .prepareForSave() + .saveUsing(entity -> persist(entry.getKey(), entity)) + .validateContext() + )); + } + ).assertSuccessful() + ); + } - if (hsHostingAssetTypeSet.contains(DOMAIN_DNS_SETUP)) { - HsDomainDnsSetupHostingAssetValidator.addZonefileErrorsTo(zonefileErrors); + private void verifyActuallyPersistedHostingAssetCount( + final HsHostingAssetType assetType, + final int expectedCountInTestDataCount, + final int minCountExpectedInProdData) { + final var q = em.createNativeQuery( + "select count(*) from hs_hosting_asset where type = cast(:type as HsHostingAssetType)", + Integer.class); + q.setParameter("type", assetType.name()); + final var count = (Integer) q.getSingleResult(); + if (isImportingControlledTestData()) { + assertThat(count).isEqualTo(expectedCountInTestDataCount); + } else { + assertThat(count).isGreaterThanOrEqualTo(minCountExpectedInProdData); } - jpaAttempt.transacted(() -> - hostingAssets.forEach((key, ha) -> { - if (hsHostingAssetTypeSet.contains(ha.getType())) { - context(rbacSuperuser); // if put only outside the loop, it seems to get lost after a while, no idea why - logError(() -> - new HostingAssetEntitySaveProcessor(em, ha) - .preprocessEntity() - .validateEntityIgnoring("'EMAIL_ALIAS:.*\\.config\\.target' .*") - .prepareForSave() - .saveUsing(entity -> persist(key, entity)) - .validateContext() - ); - } - }) - ).assertSuccessful(); } private void importIpNumbers(final String[] header, final List records) { @@ -831,7 +1005,7 @@ public class ImportHostingAssets extends ImportOfficeData { .identifier(rec.getString("inet_addr")) .caption(rec.getString("description")) .build(); - hostingAssets.put(IP_NUMBER_ID_OFFSET + rec.getInteger("inet_addr_id"), ipNumber); + ipNumberAssets.put(rec.getInteger("inet_addr_id"), ipNumber); }); } @@ -847,7 +1021,7 @@ public class ImportHostingAssets extends ImportOfficeData { rec.getString("hive_name"), rec.getInteger("inet_addr_id"), new AtomicReference<>()); - hives.put(HIVE_ID_OFFSET + hive_id, hive); + hives.put(hive_id, hive); }); } @@ -879,7 +1053,7 @@ public class ImportHostingAssets extends ImportOfficeData { .project(bookingProjects.get(bp_id)) .validity(toPostgresDateRange(created, cancelled)) .build(); - bookingItems.put(PACKET_ID_OFFSET + packet_id, bookingItem); + bookingItems.put(packet_id, bookingItem); final var haType = determineHaType(basepacket_code); logError(() -> assertThat(!free || haType == MANAGED_WEBSPACE || bookingItem.getRelatedProject() @@ -898,11 +1072,10 @@ public class ImportHostingAssets extends ImportOfficeData { .bookingItem(bookingItem) .caption("HA " + packet_name) .build(); - hostingAssets.put(PACKET_ID_OFFSET + packet_id, asset); + packetAssets.put(packet_id, asset); if (haType == MANAGED_SERVER) { hive(hive_id).serverRef.set(asset); } - if (cur_inet_addr_id != null) { ipNumber(cur_inet_addr_id).setAssignedToAsset(asset); } @@ -1032,7 +1205,7 @@ public class ImportHostingAssets extends ImportOfficeData { final var packet_id = rec.getInteger("packet_id"); final var unixUserAsset = HsHostingAssetRealEntity.builder() .type(UNIX_USER) - .parentAsset(hostingAssets.get(PACKET_ID_OFFSET + packet_id)) + .parentAsset(packetAssets.get(packet_id)) .identifier(rec.getString("name")) .caption(rec.getString("comment")) .isLoaded(true) // avoid overwriting imported userids with generated ids @@ -1076,7 +1249,7 @@ public class ImportHostingAssets extends ImportOfficeData { unixUserAsset.getConfig().remove("HDD soft quota"); } - hostingAssets.put(UNIXUSER_ID_OFFSET + unixuser_id, unixUserAsset); + unixUserAssets.put(unixuser_id, unixUserAsset); }); } @@ -1086,19 +1259,19 @@ public class ImportHostingAssets extends ImportOfficeData { .map(this::trimAll) .map(row -> new Record(columns, row)) .forEach(rec -> { - final var unixuser_id = rec.getInteger("emailalias_id"); + final var emailalias_id = rec.getInteger("emailalias_id"); final var packet_id = rec.getInteger("pac_id"); final var targets = parseCsvLine(rec.getString("target")); - final var unixUserAsset = HsHostingAssetRealEntity.builder() + final var emailAliasAsset = HsHostingAssetRealEntity.builder() .type(EMAIL_ALIAS) - .parentAsset(hostingAssets.get(PACKET_ID_OFFSET + packet_id)) + .parentAsset(packetAssets.get(packet_id)) .identifier(rec.getString("name")) .caption(rec.getString("name")) .config(ofEntries( entry("target", targets) )) .build(); - hostingAssets.put(EMAILALIAS_ID_OFFSET + unixuser_id, unixUserAsset); + emailAliasAssets.put(emailalias_id, emailAliasAsset); }); } @@ -1116,7 +1289,7 @@ public class ImportHostingAssets extends ImportOfficeData { .caption(pa.getIdentifier() + "-PostgreSQL default instance") .build(); pa.getSubHostingAssets().add(pgSqlInstanceAsset); - hostingAssets.put(DBINSTANCE_ID_OFFSET + idRef.getAndIncrement(), pgSqlInstanceAsset); + dbInstanceAssets.put(idRef.getAndIncrement(), pgSqlInstanceAsset); final var mariaDbInstanceAsset = HsHostingAssetRealEntity.builder() .type(MARIADB_INSTANCE) @@ -1125,7 +1298,7 @@ public class ImportHostingAssets extends ImportOfficeData { .caption(pa.getIdentifier() + "-MariaDB default instance") .build(); pa.getSubHostingAssets().add(mariaDbInstanceAsset); - hostingAssets.put(DBINSTANCE_ID_OFFSET + idRef.getAndIncrement(), mariaDbInstanceAsset); + dbInstanceAssets.put(idRef.getAndIncrement(), mariaDbInstanceAsset); }); } @@ -1151,14 +1324,14 @@ public class ImportHostingAssets extends ImportOfficeData { final HsHostingAssetType dbInstanceAssetType = "mysql".equals(engine) ? MARIADB_INSTANCE : "pgsql".equals(engine) ? PGSQL_INSTANCE : failWith("unknown DB engine " + engine); - final var relatedWebspaceHA = hostingAssets.get(PACKET_ID_OFFSET + packet_id).getParentAsset(); + final var relatedWebspaceHA = packetAssets.get(packet_id).getParentAsset(); final var dbInstanceAsset = relatedWebspaceHA.getSubHostingAssets().stream() .filter(ha -> ha.getType() == dbInstanceAssetType) .findAny().orElseThrow(); // there is exactly one: the default instance for the given type final var dbUserAsset = HsHostingAssetRealEntity.builder() .type(dbUserAssetType) - .parentAsset(hostingAssets.get(PACKET_ID_OFFSET + packet_id)) + .parentAsset(packetAssets.get(packet_id)) .assignedToAsset(dbInstanceAsset) .identifier(dbUserAssetType.name().substring(0, 2) + "U|" + name) .caption(name) @@ -1167,7 +1340,7 @@ public class ImportHostingAssets extends ImportOfficeData { ))) .build(); dbUsersByEngineAndName.put(engine + ":" + name, dbUserAsset); - hostingAssets.put(DBUSER_ID_OFFSET + dbuser_id, dbUserAsset); + dbUserAssets.put(dbuser_id, dbUserAsset); }); } @@ -1198,7 +1371,7 @@ public class ImportHostingAssets extends ImportOfficeData { type == MARIADB_DATABASE ? encoding.toLowerCase() : encoding.toUpperCase()) )) .build(); - hostingAssets.put(DB_ID_OFFSET + database_id, dbAsset); + dbAssets.put(database_id, dbAsset); }); } @@ -1212,8 +1385,8 @@ public class ImportHostingAssets extends ImportOfficeData { .forEach(rec -> { final var domain_id = rec.getInteger("domain_id"); final var domain_name = rec.getString("domain_name"); - // final var domain_since = rec.getString("domain_since"); - // final var domain_dns_master = rec.getString("domain_dns_master"); + // final var domain_since = rec.getString("domain_since"); TODO.spec: to related BookingItem? + // final var domain_dns_master = rec.getString("domain_dns_master"); TODO.spec: do we need this and where? final var owner_id = rec.getInteger("domain_owner"); final var domainoptions = rec.getString("domainoptions"); @@ -1228,11 +1401,11 @@ public class ImportHostingAssets extends ImportOfficeData { )) .build(); domainSetupsByName.put(domain_name, domainSetupAsset); - hostingAssets.put(DOMAIN_SETUP_OFFSET + domain_id, domainSetupAsset); + domainSetupAssets.put(domain_id, domainSetupAsset); domainSetupAsset.setSubHostingAssets(new ArrayList<>()); // Domain DNS Setup - final var ownerAsset = hostingAssets.get(UNIXUSER_ID_OFFSET + owner_id); + final var ownerAsset = unixUserAssets.get(owner_id); final var webspaceAsset = ownerAsset.getParentAsset(); assertThat(webspaceAsset.getType()).isEqualTo(MANAGED_WEBSPACE); final var domainDnsSetupAsset = HsHostingAssetRealEntity.builder() @@ -1243,7 +1416,7 @@ public class ImportHostingAssets extends ImportOfficeData { .caption("DNS-Setup für " + IDN.toUnicode(domain_name)) .config(new HashMap<>()) // is read from separate files .build(); - hostingAssets.put(DOMAIN_DNS_SETUP_OFFSET + domain_id, domainDnsSetupAsset); + domainDnsSetupAssets.put(domain_id, domainDnsSetupAsset); domainSetupAsset.getSubHostingAssets().add(domainDnsSetupAsset); // Domain HTTP Setup @@ -1282,7 +1455,7 @@ public class ImportHostingAssets extends ImportOfficeData { httpDomainSetupValidator.getProperty("passenger-ruby").defaultValue())) )) .build(); - hostingAssets.put(DOMAIN_HTTP_SETUP_OFFSET + domain_id, domainHttpSetupAsset); + domainHttpSetupAssets.put(domain_id, domainHttpSetupAsset); domainSetupAsset.getSubHostingAssets().add(domainHttpSetupAsset); // Domain MBOX Setup @@ -1295,8 +1468,9 @@ public class ImportHostingAssets extends ImportOfficeData { .config(ofEntries( // no properties available )) + .subHostingAssets(new ArrayList<>()) .build(); - hostingAssets.put(DOMAIN_MBOX_SETUP_OFFSET + domain_id, domainMboxSetupAsset); + domainMBoxSetupAssets.put(domain_id, domainMboxSetupAsset); domainSetupAsset.getSubHostingAssets().add(domainMboxSetupAsset); // Domain SMTP Setup @@ -1310,7 +1484,7 @@ public class ImportHostingAssets extends ImportOfficeData { // no properties available )) .build(); - hostingAssets.put(DOMAIN_SMTP_SETUP_OFFSET + domain_id, domainSmtpSetupAsset); + domainSmtpSetupAssets.put(domain_id, domainSmtpSetupAsset); domainSetupAsset.getSubHostingAssets().add(domainSmtpSetupAsset); }); @@ -1378,6 +1552,53 @@ public class ImportHostingAssets extends ImportOfficeData { }); } + private void importEmailAddresses(final String[] header, final List records) { + final var columns = new Columns(header); + records.stream() + .map(this::trimAll) + .map(row -> new Record(columns, row)) + .forEach(rec -> { + // emailaddr_id;domain_id;localpart;subdomain;target + final var emailaddr_id = rec.getInteger("emailaddr_id"); + final var domain_id = rec.getInteger("domain_id"); + final var localpart = rec.getString("localpart"); + final var subdomain = rec.getString("subdomain"); + final var targets = stream(parseCsvLine(rec.getString("target"))) + .map(t -> NOBODY_SUBSTITUTES.contains(t) ? "nobody" : t) + .toArray(String[]::new); + final var domainMboxSetup = domainMBoxSetupAssets.get(domain_id); + final var domainSetup = domainMboxSetup.getParentAsset(); + final var emailAddress = localpart + "@" + + (subdomain != null && !subdomain.isBlank() ? subdomain + "." : "") + domainSetup.getIdentifier(); + final var emailAddressAsset = HsHostingAssetRealEntity.builder() + .type(EMAIL_ADDRESS) + .parentAsset(domainMboxSetup) + .identifier(emailAddress) + .caption(emailAddress) + .config(ofNonNullEntries( + entryIfNotNull("local-part", localpart), + entryIfNotNull("sub-domain", subdomain), + entry("target", targets) + )) + .build(); + emailAddressAssets.put(emailaddr_id, emailAddressAsset); + domainMboxSetup.getSubHostingAssets().add(emailAddressAsset); + }); + } + + @SafeVarargs + private static Map ofNonNullEntries(final Map.Entry... entries) { + //noinspection unchecked + return ofEntries(stream(entries).filter(Objects::nonNull).toArray(Map.Entry[]::new)); + } + + private static Map.Entry entryIfNotNull(final String key, final @Nullable String value) { + if (value == null || value.isBlank()) { + return null; + } + return entry(key, value); + } + // ============================================================================================ V returning( @@ -1408,26 +1629,31 @@ public class ImportHostingAssets extends ImportOfficeData { } private static HsHostingAssetRealEntity ipNumber(final Integer inet_addr_id) { - return inet_addr_id != null ? hostingAssets.get(IP_NUMBER_ID_OFFSET + inet_addr_id) : null; + return inet_addr_id != null ? ipNumberAssets.get(inet_addr_id) : null; } private static Hive hive(final Integer hive_id) { - return hive_id != null ? hives.get(HIVE_ID_OFFSET + hive_id) : null; + return hive_id != null ? hives.get(hive_id) : null; } private static HsHostingAssetRealEntity pac(final Integer packet_id) { - return packet_id != null ? hostingAssets.get(PACKET_ID_OFFSET + packet_id) : null; + return packet_id != null ? packetAssets.get(packet_id) : null; } - private String firstOfEachType( + private String firstOfEach( final int maxCount, - final HsHostingAssetType... types) { - return toJsonFormattedString(stream(types) - .flatMap(t -> - hostingAssets.entrySet().stream() - .filter(hae -> hae.getValue().getType() == t) - .limit(maxCount) - ) + final Map assets) { + return toJsonFormattedString(assets.entrySet().stream().limit(maxCount) + .collect(toMap(Map.Entry::getKey, Map.Entry::getValue, ImportHostingAssets::uniqueKeys, TreeMap::new))); + } + + private String firstOfEach( + final int maxCount, + final Map assets, + final HsHostingAssetType type) { + return toJsonFormattedString(assets.entrySet().stream() + .filter(hae -> hae.getValue().getType() == type) + .limit(maxCount) .collect(toMap(Map.Entry::getKey, Map.Entry::getValue, ImportHostingAssets::uniqueKeys, TreeMap::new))); } diff --git a/src/test/java/net/hostsharing/hsadminng/hs/migration/ImportOfficeData.java b/src/test/java/net/hostsharing/hsadminng/hs/migration/ImportOfficeData.java index 5bdacaab..a33d6be4 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/migration/ImportOfficeData.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/migration/ImportOfficeData.java @@ -134,6 +134,15 @@ public class ImportOfficeData extends CsvDataImport { static Map coopShares = new WriteOnceMap<>(); static Map coopAssets = new WriteOnceMap<>(); + @Test + @Order(1) + void verifyInitialDatabase() { + // SQL DELETE for thousands of records takes too long, so we make sure, we only start with initial or test data + final var contactCount = (Integer) em.createNativeQuery("select count(*) from hs_office_contact", Integer.class) + .getSingleResult(); + assertThat(contactCount).isLessThan(20); + } + @Test @Order(1010) void importBusinessPartners() { diff --git a/src/test/java/net/hostsharing/hsadminng/hs/validation/PasswordPropertyUnitTest.java b/src/test/java/net/hostsharing/hsadminng/hs/validation/PasswordPropertyUnitTest.java index aea913e5..64ca8236 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/validation/PasswordPropertyUnitTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/validation/PasswordPropertyUnitTest.java @@ -1,6 +1,7 @@ package net.hostsharing.hsadminng.hs.validation; import net.hostsharing.hsadminng.hash.LinuxEtcShadowHashGenerator; +import net.hostsharing.hsadminng.mapper.PatchableMapWrapper; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; @@ -109,10 +110,10 @@ class PasswordPropertyUnitTest { } @Override - public Map directProps() { - return Map.ofEntries( + public PatchableMapWrapper directProps() { + return PatchableMapWrapper.of(Map.ofEntries( entry(passwordProp.propertyName, "some password") - ); + )); } @Override diff --git a/src/test/java/net/hostsharing/hsadminng/rbac/test/PatchUnitTestBase.java b/src/test/java/net/hostsharing/hsadminng/rbac/test/PatchUnitTestBase.java index d446258b..97fa53ec 100644 --- a/src/test/java/net/hostsharing/hsadminng/rbac/test/PatchUnitTestBase.java +++ b/src/test/java/net/hostsharing/hsadminng/rbac/test/PatchUnitTestBase.java @@ -34,7 +34,7 @@ public abstract class PatchUnitTestBase { @Test @SuppressWarnings("unchecked") - void willPatchAllProperties() { + protected void willPatchAllProperties() { // given final var givenEntity = newInitialEntity(); final var patchResource = newPatchResource(); @@ -55,7 +55,7 @@ public abstract class PatchUnitTestBase { @ParameterizedTest @MethodSource("propertyTestCases") - void willPatchOnlyGivenProperty(final Property testCase) { + protected void willPatchOnlyGivenProperty(final Property testCase) { // given final var givenEntity = newInitialEntity(); diff --git a/src/test/resources/migration/hosting/database.csv b/src/test/resources/migration/hosting/database.csv index e992d086..3dc130b7 100644 --- a/src/test/resources/migration/hosting/database.csv +++ b/src/test/resources/migration/hosting/database.csv @@ -1,8 +1,8 @@ database_id;engine;packet_id;name;owner;encoding -77;pgsql;630;hsh00_vorstand;hsh00_vorstand;LATIN1 -786;mysql;630;hsh00_addr;hsh00;latin1 -805;mysql;630;hsh00_db2;hsh00;LATIN-1 +1077;pgsql;630;hsh00_vorstand;hsh00_vorstand;LATIN1 +1786;mysql;630;hsh00_addr;hsh00;latin1 +1805;mysql;630;hsh00_dba;hsh00;LATIN-1 1858;pgsql;630;hsh00;hsh00;LATIN1 1860;pgsql;630;hsh00_hsadmin;hsh00_hsadmin;UTF8 diff --git a/src/test/resources/migration/hosting/database_user.csv b/src/test/resources/migration/hosting/database_user.csv index 33018673..8d43c218 100644 --- a/src/test/resources/migration/hosting/database_user.csv +++ b/src/test/resources/migration/hosting/database_user.csv @@ -1,17 +1,17 @@ dbuser_id;engine;packet_id;name;password_hash -1857;pgsql;630;hsh00;SCRAM-SHA-256$4096:Zml4ZWQgc2FsdA==$JDiZmaxU+O+ByArLY/CkYZ8HbOk0r/I8LyABnno5gQs=:NI3T500/63dzI1B07Jh3UtQGlukS6JxuS0XoxM/QgAc= -1858;mysql;630;hsh00;*59067A36BA197AD0A47D74909296C5B002A0FB9F -1859;pgsql;630;hsh00_vorstand;SCRAM-SHA-256$4096:Zml4ZWQgc2FsdA==$54Wh+OGx/GaIvAia+I3k78jHGhqmYwe4+iLssmH5zhk=:D4Gq1z2Li2BVSaZrz1azDrs6pwsIzhq4+suK1Hh6ZIg= -1860;pgsql;630;hsh00_hsadmin;SCRAM-SHA-256$4096:Zml4ZWQgc2FsdA==$54Wh+OGx/GaIvAia+I3k78jHGhqmYwe4+iLssmH5zhk=:D4Gq1z2Li2BVSaZrz1azDrs6pwsIzhq4+suK1Hh6ZIg= -1861;pgsql;630;hsh00_hsadmin_ro;SCRAM-SHA-256$4096:Zml4ZWQgc2FsdA==$UhJnJJhmKANbcaG+izWK3rz5bmhhluSuiCJFlUmDVI8=:6AC4mbLfJGiGlEOWhpz9BivvMODhLLHOnRnnktJPgn8= -4931;pgsql;630;hsh00_phpPgSqlAdmin;SCRAM-SHA-256$4096:Zml4ZWQgc2FsdA==$UhJnJJhmKANbcaG+izWK3rz5bmhhluSuiCJFlUmDVI8=:6AC4mbLfJGiGlEOWhpz9BivvMODhLLHOnRnnktJPgn8= -4908;mysql;630;hsh00_mantis;*EA4C0889A22AAE66BBEBC88161E8CF862D73B44F -4909;mysql;630;hsh00_mantis_ro;*B3BB6D0DA2EC01958616E9B3BCD2926FE8C38383 -4932;mysql;630;hsh00_phpMyAdmin;*3188720B1889EF5447C722629765F296F40257C2 +1857;pgsql;10630;hsh00;SCRAM-SHA-256$4096:Zml4ZWQgc2FsdA==$JDiZmaxU+O+ByArLY/CkYZ8HbOk0r/I8LyABnno5gQs=:NI3T500/63dzI1B07Jh3UtQGlukS6JxuS0XoxM/QgAc= +1858;mysql;10630;hsh00;*59067A36BA197AD0A47D74909296C5B002A0FB9F +1859;pgsql;10630;hsh00_vorstand;SCRAM-SHA-256$4096:Zml4ZWQgc2FsdA==$54Wh+OGx/GaIvAia+I3k78jHGhqmYwe4+iLssmH5zhk=:D4Gq1z2Li2BVSaZrz1azDrs6pwsIzhq4+suK1Hh6ZIg= +1860;pgsql;10630;hsh00_hsadmin;SCRAM-SHA-256$4096:Zml4ZWQgc2FsdA==$54Wh+OGx/GaIvAia+I3k78jHGhqmYwe4+iLssmH5zhk=:D4Gq1z2Li2BVSaZrz1azDrs6pwsIzhq4+suK1Hh6ZIg= +1861;pgsql;10630;hsh00_hsadmin_ro;SCRAM-SHA-256$4096:Zml4ZWQgc2FsdA==$UhJnJJhmKANbcaG+izWK3rz5bmhhluSuiCJFlUmDVI8=:6AC4mbLfJGiGlEOWhpz9BivvMODhLLHOnRnnktJPgn8= +4931;pgsql;10630;hsh00_phpPgSqlAdmin;SCRAM-SHA-256$4096:Zml4ZWQgc2FsdA==$UhJnJJhmKANbcaG+izWK3rz5bmhhluSuiCJFlUmDVI8=:6AC4mbLfJGiGlEOWhpz9BivvMODhLLHOnRnnktJPgn8= +4908;mysql;10630;hsh00_mantis;*EA4C0889A22AAE66BBEBC88161E8CF862D73B44F +4909;mysql;10630;hsh00_mantis_ro;*B3BB6D0DA2EC01958616E9B3BCD2926FE8C38383 +4932;mysql;10630;hsh00_phpMyAdmin;*3188720B1889EF5447C722629765F296F40257C2 -7520;mysql;1094;lug00_wla;*11667C0EAC42BF8B0295ABEDC7D2868A835E4DB5 -7522;pgsql;1094;lug00_ola;SCRAM-SHA-256$4096:Zml4ZWQgc2FsdA==$tir+cV3ZzOZeEWurwAJk+8qkvsTAWaBfwx846oYMOr4=:p4yk/4hHkfSMAFxSuTuh3RIrbSpHNBh7h6raVa3nt1c= +7520;mysql;11094;lug00_wla;*11667C0EAC42BF8B0295ABEDC7D2868A835E4DB5 +7522;pgsql;11094;lug00_ola;SCRAM-SHA-256$4096:Zml4ZWQgc2FsdA==$tir+cV3ZzOZeEWurwAJk+8qkvsTAWaBfwx846oYMOr4=:p4yk/4hHkfSMAFxSuTuh3RIrbSpHNBh7h6raVa3nt1c= -7604;mysql;1112;mim00_test;*156CFD94A0594A5C3F4C6742376DDF4B8C5F6D90 -7605;pgsql;1112;mim00_office;SCRAM-SHA-256$4096:Zml4ZWQgc2FsdA==$43jziwd1o+nkfjE0zFbks24Zy5GK+km87B7vzEQt4So=:xRQntZxBxdo1JJbhkegnUFKHT0T8MDW75hkQs2S3z6k= +7604;mysql;11112;mim00_test;*156CFD94A0594A5C3F4C6742376DDF4B8C5F6D90 +7605;pgsql;11112;mim00_office;SCRAM-SHA-256$4096:Zml4ZWQgc2FsdA==$43jziwd1o+nkfjE0zFbks24Zy5GK+km87B7vzEQt4So=:xRQntZxBxdo1JJbhkegnUFKHT0T8MDW75hkQs2S3z6k= diff --git a/src/test/resources/migration/hosting/domain.csv b/src/test/resources/migration/hosting/domain.csv index 3471bcfd..0181c8df 100644 --- a/src/test/resources/migration/hosting/domain.csv +++ b/src/test/resources/migration/hosting/domain.csv @@ -7,4 +7,4 @@ domain_id;domain_name;domain_since;domain_dns_master;domain_owner;valid_subdomai 4589;ist-im-netz.de;2013-09-17;dns.hostsharing.net;5964;*;/usr/bin/python3;/usr/bin/node;/usr/bin/ruby;/usr/lib/cgi-bin/php;htdocsfallback,indexes,includes,letsencrypt,multiviews,cgi,fastcgi,passenger 4600;waera.de;2013-09-17;dns.hostsharing.net;5964;*;/usr/bin/python3;/usr/bin/node;/usr/bin/ruby;/usr/lib/cgi-bin/php;greylisting,multiviews,indexes,htdocsfallback,includes,cgi,fastcgi,passenger 4604;xn--wra-qla.de;2013-09-17;dns.hostsharing.net;5964;*;/usr/bin/python3;/usr/bin/node;/usr/bin/ruby;/usr/lib/cgi-bin/php;greylisting,multiviews,indexes,htdocsfallback,includes,cgi,fastcgi,passenger -27662;dph-netzwerk.de;2021-06-02;h93.hostsharing.net;169596;*;/usr/bin/python3;/usr/bin/node;/usr/bin/ruby;/usr/lib/cgi-bin/php;htdocsfallback,indexes,autoconfig,greylisting,includes,letsencrypt,multiviews,cgi,fastcgi,passenger +7662;dph-netzwerk.de;2021-06-02;h93.hostsharing.net;9596;*;/usr/bin/python3;/usr/bin/node;/usr/bin/ruby;/usr/lib/cgi-bin/php;htdocsfallback,indexes,autoconfig,greylisting,includes,letsencrypt,multiviews,cgi,fastcgi,passenger diff --git a/src/test/resources/migration/hosting/emailaddr.csv b/src/test/resources/migration/hosting/emailaddr.csv new file mode 100644 index 00000000..924641fe --- /dev/null +++ b/src/test/resources/migration/hosting/emailaddr.csv @@ -0,0 +1,72 @@ +emailaddr_id;domain_id;localpart;subdomain;target +54746;4531;abuse;;lug00 +54747;4531;postmaster;;nomail +54748;4531;webmaster;;bounce +54745;4531;lugmaster;;nobody +54749;4532;abuse;;lug00-mars +54750;4532;postmaster;;m.hinsel@example.org +54751;4532;webmaster;;m.hinsel@example.org +54755;4534;abuse;;lug00-marl +54756;4534;postmaster;;m.hinsel@example.org +54757;4534;webmaster;;m.hinsel@example.org +54760;4531;info;hamburg-west;peter.lottmann@example.com +54761;4531;lugmaster;hamburg-west;raoul.lottmann@example.com +54762;4531;postmaster;hamburg-west;raoul.lottmann@example.com +54763;4531;webmaster;hamburg-west;raoul.lottmann@example.com peter.lottmann@example.com +54764;4531;;eliza;eliza@example.net +54765;4531;;;lug00 +54766;4532;;;nomail +54767;4532;hostmaster;;hostmaster@example.net +54795;4534;;;bounce +54796;4534;hostmaster;;hostmaster@example.net +54963;4581;abuse;;mim00 +54964;4581;postmaster;;mim00 +54965;4581;webmaster;;mim00 +54981;4587;abuse;; +54982;4587;postmaster;;/dev/null +54983;4587;webmaster;;mim00 +54987;4589;abuse;;"" +54988;4589;postmaster;;mim00 +54989;4589;webmaster;;mim00 +55020;4600;abuse;;mim00 +55021;4600;postmaster;;mim00 +55022;4600;webmaster;;mim00 +55032;4604;abuse;;mim00 +55033;4604;postmaster;;mim00 +55034;4604;webmaster;;mim00 +55037;4587;;eberhard;eberhard@mellis.de +55038;4587;;marleen;marleen@mellis.de +55039;4587;;michael;mh@dump.mellis.de +55040;4587;lists;michael;mim00-lists +55041;4587;ooo;michael;mim00-ooo +55043;4587;;test;test@mellis.de +55044;4587;;trap;mim00-spam +55046;4587;anke;;anke@segelschule-jade.de +55052;4587;eberhard;;mellis@example.org +55053;4587;gitti;;gitta.mellis@gmx.de +55054;4587;imap;;mim00-imap +55057;4587;listar;;mim00-listar +55059;4587;marleen;;marleen.mellis@t-online.de +55060;4587;mime;;mh@dump.mellis.de +55061;4587;michael;;mh@dump.mellis.de +55062;4587;monika;;nomail +55063;4587;nobody;;nobody +55064;4587;palm;;mim00-imap +55065;4587;procmail;;mim00-mail +55066;4587;reporter.web.de;;nomail +55067;4587;script;;mim00-script +55068;4587;spamtrap;;mim00-spamtrap +55069;4587;susanne;;susanne.mellis@example.net +55070;4587;test;;mim00-test +55071;4587;ursula;;01234wasauchimmer@example.net +55072;4587;webcmstag;;mim00-webcmstag +55073;4587;wichtig;;mim00-imap,01234567@smsmail.example.org +55074;4604;;;@waera.de +60601;4589;highlander;;mim00-highlander,michael@mellis.de +65150;4589;little-sunshine;;mim00-marleen +75964;4589;;mail;michael@mellis.de +75965;4589;;;michael@mellis.de +77726;4587;chat;michael;mim00-chat +93790;7662;abuse;;dph00-dph +93791;7662;postmaster;;dph00-dph +93792;7662;webmaster;;dph00-dph diff --git a/src/test/resources/migration/hosting/emailalias.csv b/src/test/resources/migration/hosting/emailalias.csv index b2421536..4d5b31c9 100644 --- a/src/test/resources/migration/hosting/emailalias.csv +++ b/src/test/resources/migration/hosting/emailalias.csv @@ -1,10 +1,10 @@ emailalias_id;pac_id;name;target -2403;1094;lug00;michael.mellis@example.com -2405;1094;lug00-wla-listar;|/home/pacs/lug00/users/in/mailinglist/listar -2429;1112;mim00;mim12-mi@mim12.hostsharing.net -2431;1112;mim00-abruf;michael.mellis@hostsharing.net -2449;1112;mim00-hhfx;"mim00-hhfx,""|/usr/bin/formail -I 'Reply-To: hamburger-fx@example.net' | /usr/lib/sendmail mim00-hhfx-l""" -2451;1112;mim00-hhfx-l;:include:/home/pacs/mim00/etc/hhfx.list -2454;1112;mim00-dev.null; /dev/null -2455;1112;mim00-1_with_space;" ""|/home/pacs/mim00/install/corpslistar/listar""" -2456;1112;mim00-1_with_single_quotes;'|/home/pacs/rir00/mailinglist/ecartis -r kybs06-intern' +2403;11094;lug00;michael.mellis@example.com +2405;11094;lug00-wla-listar;|/home/pacs/lug00/users/in/mailinglist/listar +2429;11112;mim00;mim12-mi@mim12.hostsharing.net +2431;11112;mim00-abruf;michael.mellis@hostsharing.net +2449;11112;mim00-hhfx;"mim00-hhfx,""|/usr/bin/formail -I 'Reply-To: hamburger-fx@example.net' | /usr/lib/sendmail mim00-hhfx-l""" +2451;11112;mim00-hhfx-l;:include:/home/pacs/mim00/etc/hhfx.list +2454;11112;mim00-dev.null; /dev/null +2455;11112;mim00-1_with_space;" ""|/home/pacs/mim00/install/corpslistar/listar""" +2456;11112;mim00-1_with_single_quotes;'|/home/pacs/rir00/mailinglist/ecartis -r kybs06-intern' diff --git a/src/test/resources/migration/hosting/hive.csv b/src/test/resources/migration/hosting/hive.csv index fe23e0d3..97e5b551 100644 --- a/src/test/resources/migration/hosting/hive.csv +++ b/src/test/resources/migration/hosting/hive.csv @@ -1,26 +1,26 @@ hive_id;hive_name;inet_addr_id;description -1;h00;358; -2;h01;359; -4;h02;360; -7;h03;361; -13;h04;430; -14;h50;433; -20;h05;354; -21;h06;355; -22;h07;357; -28;h60;363; -31;h63;431; -37;h67;381; -38;h97;537; -39;h96;536; -45;h74;485; -50;h82;514; -128;h19;565; -148;h50;522; -163;h92;457; -173;h25;1759; -192;h93;1778; -193;h95;1779; -205;vm1107;1861; -208;vm1110;1864; -210;vm1112;1833; +1001;h00;358; +1002;h01;359; +1004;h02;360; +1007;h03;361; +1013;h04;430; +1014;h50;433; +1020;h05;354; +1021;h06;355; +1022;h07;357; +1028;h60;363; +1031;h63;431; +1037;h67;381; +1038;h97;537; +1039;h96;536; +1045;h74;485; +1050;h82;514; +1128;h19;565; +1148;h50;522; +1163;h92;457; +1173;h25;1759; +1192;h93;1778; +1193;h95;1779; +1205;vm1107;1861; +1208;vm1110;1864; +1210;vm1112;1833; diff --git a/src/test/resources/migration/hosting/packet.csv b/src/test/resources/migration/hosting/packet.csv index 92383a80..63637444 100644 --- a/src/test/resources/migration/hosting/packet.csv +++ b/src/test/resources/migration/hosting/packet.csv @@ -1,10 +1,10 @@ packet_id;basepacket_code;packet_name;bp_id;hive_id;created;cancelled;cur_inet_addr_id;old_inet_addr_id;free -630;PAC/WEB;hsh00;213;14;2001-06-01;;473;;1 -968;SRV/MGD;vm1061;132;28;2013-04-01;;363;;0 -978;SRV/MGD;vm1050;213;14;2013-04-01;;433;;1 -1061;SRV/MGD;vm1068;100;37;2013-08-19;;381;;f -1094;PAC/WEB;lug00;100;37;2013-09-10;;1168;;1 -1112;PAC/WEB;mim00;100;37;2013-09-17;;402;;1 -1447;SRV/MGD;vm1093;213;163;2014-11-28;;457;;t -19959;PAC/WEB;dph00;542;163;2021-06-02;;574;;0 +10630;PAC/WEB;hsh00;213;1014;2001-06-01;;473;;1 +10968;SRV/MGD;vm1061;132;1028;2013-04-01;;363;;0 +10978;SRV/MGD;vm1050;213;1014;2013-04-01;;433;;1 +11061;SRV/MGD;vm1068;100;1037;2013-08-19;;381;;f +11094;PAC/WEB;lug00;100;1037;2013-09-10;;1168;;1 +11112;PAC/WEB;mim00;100;1037;2013-09-17;;402;;1 +11447;SRV/MGD;vm1093;213;1163;2014-11-28;;457;;t +19959;PAC/WEB;dph00;542;1163;2021-06-02;;574;;0 23611;SRV/CLD;vm2097;541;;2022-08-10;;1790;;0 diff --git a/src/test/resources/migration/hosting/packet_component.csv b/src/test/resources/migration/hosting/packet_component.csv index 74004918..ce35034f 100644 --- a/src/test/resources/migration/hosting/packet_component.csv +++ b/src/test/resources/migration/hosting/packet_component.csv @@ -1,68 +1,68 @@ packet_component_id;packet_id;quantity;basecomponent_code;created;cancelled -46105;1094;10;TRAFFIC;2017-03-27; -46109;1094;5;MULTI;2017-03-27; -46111;1094;0;DAEMON;2017-03-27; -46113;1094;1024;QUOTA;2017-03-27; -46117;1112;0;DAEMON;2017-03-27; -46121;1112;20;TRAFFIC;2017-03-27; -46122;1112;5;MULTI;2017-03-27; -46123;1112;3072;QUOTA;2017-03-27; -143133;1094;1;SLABASIC;2017-09-01; -143483;1112;1;SLABASIC;2017-09-01; -757383;1112;0;SLAEXT24H;; -770533;1094;0;SLAEXT24H;; -784283;1112;0;OFFICE;; -797433;1094;0;OFFICE;; -1228033;1112;0;STORAGE;; -1241433;1094;0;STORAGE;; -1266451;978;0;SLAPLAT4H;2021-10-05; -1266452;978;250;TRAFFIC;2021-10-05; -1266453;978;0;SLAPLAT8H;2021-10-05; -1266454;978;0;SLAMAIL4H;2021-10-05; -1266455;978;0;SLAMARIA8H;2021-10-05; -1266456;978;0;SLAPGSQL4H;2021-10-05; -1266457;978;0;SLAWEB4H;2021-10-05; -1266458;978;0;SLAMARIA4H;2021-10-05; -1266459;978;0;SLAPGSQL8H;2021-10-05; -1266460;978;0;SLAOFFIC8H;2021-10-05; -1266461;978;0;SLAWEB8H;2021-10-05; -1266462;978;256000;STORAGE;2021-10-05; -1266463;978;153600;QUOTA;2021-10-05; -1266464;978;0;SLAOFFIC4H;2021-10-05; -1266465;978;32768;RAM;2021-10-05; -1266466;978;4;CPU;2021-10-05; -1266467;978;1;SLABASIC;2021-10-05; -1266468;978;0;SLAMAIL8H;2021-10-05; -1275583;978;0;SLAPLAT2H;2022-04-20; -1280533;978;0;SLAWEB2H;2022-04-20; -1285483;978;0;SLAMARIA2H;2022-04-20; -1290433;978;0;SLAPGSQL2H;2022-04-20; -1295383;978;0;SLAMAIL2H;2022-04-20; -1300333;978;0;SLAOFFIC2H;2022-04-20; -1305933;1447;0;SLAWEB2H;2022-05-02; -1305934;1447;0;SLAPLAT4H;2022-05-02; -1305935;1447;0;SLAWEB8H;2022-05-02; -1305936;1447;0;SLAOFFIC4H;2022-05-02; -1305937;1447;0;SLAMARIA4H;2022-05-02; -1305938;1447;0;SLAOFFIC8H;2022-05-02; -1305939;1447;1;SLABASIC;2022-05-02; -1305940;1447;0;SLAMAIL8H;2022-05-02; -1305941;1447;0;SLAPGSQL4H;2022-05-02; -1305942;1447;6;CPU;2022-05-02; -1305943;1447;250;TRAFFIC;2022-05-02; -1305944;1447;0;SLAOFFIC2H;2022-05-02; -1305945;1447;0;SLAMAIL4H;2022-05-02; -1305946;1447;0;SLAPGSQL2H;2022-05-02; -1305947;1447;0;SLAMARIA2H;2022-05-02; -1305948;1447;0;SLAMARIA8H;2022-05-02; -1305949;1447;0;SLAWEB4H;2022-05-02; -1305950;1447;16384;RAM;2022-05-02; -1305951;1447;0;SLAPGSQL8H;2022-05-02; -1305952;1447;512000;STORAGE;2022-05-02; -1305953;1447;0;SLAMAIL2H;2022-05-02; -1305954;1447;0;SLAPLAT2H;2022-05-02; -1305955;1447;0;SLAPLAT8H;2022-05-02; -1305956;1447;307200;QUOTA;2022-05-02; +46105;11094;10;TRAFFIC;2017-03-27; +46109;11094;5;MULTI;2017-03-27; +46111;11094;0;DAEMON;2017-03-27; +46113;11094;1024;QUOTA;2017-03-27; +46117;11112;0;DAEMON;2017-03-27; +46121;11112;20;TRAFFIC;2017-03-27; +46122;11112;5;MULTI;2017-03-27; +46123;11112;3072;QUOTA;2017-03-27; +143133;11094;1;SLABASIC;2017-09-01; +143483;11112;1;SLABASIC;2017-09-01; +757383;11112;0;SLAEXT24H;; +770533;11094;0;SLAEXT24H;; +784283;11112;0;OFFICE;; +797433;11094;0;OFFICE;; +1228033;11112;0;STORAGE;; +1241433;11094;0;STORAGE;; +1266451;10978;0;SLAPLAT4H;2021-10-05; +1266452;10978;250;TRAFFIC;2021-10-05; +1266453;10978;0;SLAPLAT8H;2021-10-05; +1266454;10978;0;SLAMAIL4H;2021-10-05; +1266455;10978;0;SLAMARIA8H;2021-10-05; +1266456;10978;0;SLAPGSQL4H;2021-10-05; +1266457;10978;0;SLAWEB4H;2021-10-05; +1266458;10978;0;SLAMARIA4H;2021-10-05; +1266459;10978;0;SLAPGSQL8H;2021-10-05; +1266460;10978;0;SLAOFFIC8H;2021-10-05; +1266461;10978;0;SLAWEB8H;2021-10-05; +1266462;10978;256000;STORAGE;2021-10-05; +1266463;10978;153600;QUOTA;2021-10-05; +1266464;10978;0;SLAOFFIC4H;2021-10-05; +1266465;10978;32768;RAM;2021-10-05; +1266466;10978;4;CPU;2021-10-05; +1266467;10978;1;SLABASIC;2021-10-05; +1266468;10978;0;SLAMAIL8H;2021-10-05; +1275583;10978;0;SLAPLAT2H;2022-04-20; +1280533;10978;0;SLAWEB2H;2022-04-20; +1285483;10978;0;SLAMARIA2H;2022-04-20; +1290433;10978;0;SLAPGSQL2H;2022-04-20; +1295383;10978;0;SLAMAIL2H;2022-04-20; +1300333;10978;0;SLAOFFIC2H;2022-04-20; +1305933;11447;0;SLAWEB2H;2022-05-02; +1305934;11447;0;SLAPLAT4H;2022-05-02; +1305935;11447;0;SLAWEB8H;2022-05-02; +1305936;11447;0;SLAOFFIC4H;2022-05-02; +1305937;11447;0;SLAMARIA4H;2022-05-02; +1305938;11447;0;SLAOFFIC8H;2022-05-02; +1305939;11447;1;SLABASIC;2022-05-02; +1305940;11447;0;SLAMAIL8H;2022-05-02; +1305941;11447;0;SLAPGSQL4H;2022-05-02; +1305942;11447;6;CPU;2022-05-02; +1305943;11447;250;TRAFFIC;2022-05-02; +1305944;11447;0;SLAOFFIC2H;2022-05-02; +1305945;11447;0;SLAMAIL4H;2022-05-02; +1305946;11447;0;SLAPGSQL2H;2022-05-02; +1305947;11447;0;SLAMARIA2H;2022-05-02; +1305948;11447;0;SLAMARIA8H;2022-05-02; +1305949;11447;0;SLAWEB4H;2022-05-02; +1305950;11447;16384;RAM;2022-05-02; +1305951;11447;0;SLAPGSQL8H;2022-05-02; +1305952;11447;512000;STORAGE;2022-05-02; +1305953;11447;0;SLAMAIL2H;2022-05-02; +1305954;11447;0;SLAPLAT2H;2022-05-02; +1305955;11447;0;SLAPLAT8H;2022-05-02; +1305956;11447;307200;QUOTA;2022-05-02; 1312013;23611;1;SLABASIC;2022-08-10; 1312014;23611;0;BANDWIDTH;2022-08-10; 1312015;23611;12288;RAM;2022-08-10; @@ -73,33 +73,33 @@ packet_component_id;packet_id;quantity;basecomponent_code;created;cancelled 1312020;23611;8;CPU;2022-08-10; 1312021;23611;250;TRAFFIC;2022-08-10; 1312022;23611;0;SLAINFR4H;2022-08-10; -1313883;978;0;BANDWIDTH;; -1316583;1447;0;BANDWIDTH;; -1338074;968;0;SLAMARIA2H;2023-09-05; -1338075;968;384000;QUOTA;2023-09-05; -1338076;968;1;SLAMAIL8H;2023-09-05; -1338077;968;0;BANDWIDTH;2023-09-05; -1338078;968;0;SLAWEB2H;2023-09-05; -1338079;968;0;SLAOFFIC4H;2023-09-05; -1338080;968;256000;STORAGE;2023-09-05; -1338081;968;0;SLAPLAT4H;2023-09-05; -1338082;968;0;SLAPGSQL2H;2023-09-05; -1338083;968;0;SLAPLAT2H;2023-09-05; -1338084;968;250;TRAFFIC;2023-09-05; -1338085;968;1;SLAMARIA8H;2023-09-05; -1338086;968;0;SLAPGSQL4H;2023-09-05; -1338087;968;0;SLAMAIL2H;2023-09-05; -1338088;968;1;SLAPLAT8H;2023-09-05; -1338089;968;0;SLAWEB4H;2023-09-05; -1338090;968;6;CPU;2023-09-05; -1338091;968;1;SLAPGSQL8H;2023-09-05; -1338092;968;0;SLAMARIA4H;2023-09-05; -1338093;968;0;SLAMAIL4H;2023-09-05; -1338094;968;14336;RAM;2023-09-05; -1338095;968;0;SLAOFFIC2H;2023-09-05; -1338096;968;0;SLAOFFIC8H;2023-09-05; -1338097;968;1;SLABASIC;2023-09-05; -1338098;968;1;SLAWEB8H;2023-09-05; +1313883;10978;0;BANDWIDTH;; +1316583;11447;0;BANDWIDTH;; +1338074;10968;0;SLAMARIA2H;2023-09-05; +1338075;10968;384000;QUOTA;2023-09-05; +1338076;10968;1;SLAMAIL8H;2023-09-05; +1338077;10968;0;BANDWIDTH;2023-09-05; +1338078;10968;0;SLAWEB2H;2023-09-05; +1338079;10968;0;SLAOFFIC4H;2023-09-05; +1338080;10968;256000;STORAGE;2023-09-05; +1338081;10968;0;SLAPLAT4H;2023-09-05; +1338082;10968;0;SLAPGSQL2H;2023-09-05; +1338083;10968;0;SLAPLAT2H;2023-09-05; +1338084;10968;250;TRAFFIC;2023-09-05; +1338085;10968;1;SLAMARIA8H;2023-09-05; +1338086;10968;0;SLAPGSQL4H;2023-09-05; +1338087;10968;0;SLAMAIL2H;2023-09-05; +1338088;10968;1;SLAPLAT8H;2023-09-05; +1338089;10968;0;SLAWEB4H;2023-09-05; +1338090;10968;6;CPU;2023-09-05; +1338091;10968;1;SLAPGSQL8H;2023-09-05; +1338092;10968;0;SLAMARIA4H;2023-09-05; +1338093;10968;0;SLAMAIL4H;2023-09-05; +1338094;10968;14336;RAM;2023-09-05; +1338095;10968;0;SLAOFFIC2H;2023-09-05; +1338096;10968;0;SLAOFFIC8H;2023-09-05; +1338097;10968;1;SLABASIC;2023-09-05; +1338098;10968;1;SLAWEB8H;2023-09-05; 1339228;19959;20;TRAFFIC;2023-10-27; 1339229;19959;1;SLABASIC;2023-10-27; 1339230;19959;0;DAEMON;2023-10-27; @@ -108,36 +108,36 @@ packet_component_id;packet_id;quantity;basecomponent_code;created;cancelled 1339233;19959;0;SLAEXT24H;2023-10-27; 1339234;19959;0;OFFICE;2023-10-27; 1339235;19959;1;MULTI;2023-10-27; -1341088;1061;0;SLAOFFIC2H;2023-12-14; -1341089;1061;0;SLAOFFIC8H;2023-12-14; -1341090;1061;256000;STORAGE;2023-12-14; -1341091;1061;0;SLAMAIL4H;2023-12-14; -1341092;1061;0;SLAMAIL2H;2023-12-14; -1341093;1061;0;SLAPLAT2H;2023-12-14; -1341094;1061;4096;RAM;2023-12-14; -1341095;1061;0;SLAPLAT4H;2023-12-14; -1341096;1061;1;SLAPGSQL8H;2023-12-14; -1341097;1061;2;CPU;2023-12-14; -1341098;1061;0;QUOTA;2023-12-14; -1341099;1061;0;SLAMAIL8H;2023-12-14; -1341100;1061;1;SLABASIC;2023-12-14; -1341101;1061;1;SLAMARIA8H;2023-12-14; -1341102;1061;0;SLAPGSQL4H;2023-12-14; -1341103;1061;0;SLAPGSQL2H;2023-12-14; -1341104;1061;0;SLAMARIA4H;2023-12-14; -1341105;1061;0;SLAOFFIC4H;2023-12-14; -1341106;1061;1;SLAPLAT8H;2023-12-14; -1341107;1061;0;BANDWIDTH;2023-12-14; -1341108;1061;1;SLAWEB8H;2023-12-14; -1341109;1061;0;SLAWEB2H;2023-12-14; -1341110;1061;0;SLAMARIA2H;2023-12-14; -1341111;1061;250;TRAFFIC;2023-12-14; -1341112;1061;0;SLAWEB4H;2023-12-14; -1346628;630;0;SLAEXT24H;2024-03-19; -1346629;630;0;OFFICE;2024-03-19; -1346630;630;16384;QUOTA;2024-03-19; -1346631;630;0;DAEMON;2024-03-19; -1346632;630;10240;STORAGE;2024-03-19; -1346633;630;1;SLABASIC;2024-03-19; -1346634;630;50;TRAFFIC;2024-03-19; -1346635;630;25;MULTI;2024-03-19; +1341088;11061;0;SLAOFFIC2H;2023-12-14; +1341089;11061;0;SLAOFFIC8H;2023-12-14; +1341090;11061;256000;STORAGE;2023-12-14; +1341091;11061;0;SLAMAIL4H;2023-12-14; +1341092;11061;0;SLAMAIL2H;2023-12-14; +1341093;11061;0;SLAPLAT2H;2023-12-14; +1341094;11061;4096;RAM;2023-12-14; +1341095;11061;0;SLAPLAT4H;2023-12-14; +1341096;11061;1;SLAPGSQL8H;2023-12-14; +1341097;11061;2;CPU;2023-12-14; +1341098;11061;0;QUOTA;2023-12-14; +1341099;11061;0;SLAMAIL8H;2023-12-14; +1341100;11061;1;SLABASIC;2023-12-14; +1341101;11061;1;SLAMARIA8H;2023-12-14; +1341102;11061;0;SLAPGSQL4H;2023-12-14; +1341103;11061;0;SLAPGSQL2H;2023-12-14; +1341104;11061;0;SLAMARIA4H;2023-12-14; +1341105;11061;0;SLAOFFIC4H;2023-12-14; +1341106;11061;1;SLAPLAT8H;2023-12-14; +1341107;11061;0;BANDWIDTH;2023-12-14; +1341108;11061;1;SLAWEB8H;2023-12-14; +1341109;11061;0;SLAWEB2H;2023-12-14; +1341110;11061;0;SLAMARIA2H;2023-12-14; +1341111;11061;250;TRAFFIC;2023-12-14; +1341112;11061;0;SLAWEB4H;2023-12-14; +1346628;10630;0;SLAEXT24H;2024-03-19; +1346629;10630;0;OFFICE;2024-03-19; +1346630;10630;16384;QUOTA;2024-03-19; +1346631;10630;0;DAEMON;2024-03-19; +1346632;10630;10240;STORAGE;2024-03-19; +1346633;10630;1;SLABASIC;2024-03-19; +1346634;10630;50;TRAFFIC;2024-03-19; +1346635;10630;25;MULTI;2024-03-19; diff --git a/src/test/resources/migration/hosting/unixuser.csv b/src/test/resources/migration/hosting/unixuser.csv index 7c75fcf5..cd044e0a 100644 --- a/src/test/resources/migration/hosting/unixuser.csv +++ b/src/test/resources/migration/hosting/unixuser.csv @@ -1,19 +1,19 @@ unixuser_id;name;comment;shell;homedir;locked;packet_id;userid;quota_softlimit;quota_hardlimit;storage_softlimit;storage_hardlimit -100824;hsh00;Hostsharing Paket;/bin/bash;/home/pacs/hsh00;0;630;10000;0;0;0;0 +6824;hsh00;Hostsharing Paket;/bin/bash;/home/pacs/hsh00;0;10630;10000;0;0;0;0 -5803;lug00;LUGs;/bin/bash;/home/pacs/lug00;0;1094;102090;0;0;0;0 -5805;lug00-wla.1;Paul Klemm;/bin/bash;/home/pacs/lug00/users/deaf;0;1094;102091;4;0;0;0 -5809;lug00-wla.2;Walter Müller;/bin/bash;/home/pacs/lug00/users/marl;0;1094;102093;4;8;0;0 -5811;lug00-ola.a;LUG OLA - POP a;/usr/bin/passwd;/home/pacs/lug00/users/marl.a;1;1094;102094;0;0;0;0 -5813;lug00-ola.b;LUG OLA - POP b;/usr/bin/passwd;/home/pacs/lug00/users/marl.b;1;1094;102095;0;0;0;0 -5835;lug00-test;Test;/usr/bin/passwd;/home/pacs/lug00/users/test;0;1094;102106;2000000;4000000;20;0 +5803;lug00;LUGs;/bin/bash;/home/pacs/lug00;0;11094;102090;0;0;0;0 +5805;lug00-wla.1;Paul Klemm;/bin/bash;/home/pacs/lug00/users/deaf;0;11094;102091;4;0;0;0 +5809;lug00-wla.2;Walter Müller;/bin/bash;/home/pacs/lug00/users/marl;0;11094;102093;4;8;0;0 +5811;lug00-ola.a;LUG OLA - POP a;/usr/bin/passwd;/home/pacs/lug00/users/marl.a;1;11094;102094;0;0;0;0 +5813;lug00-ola.b;LUG OLA - POP b;/usr/bin/passwd;/home/pacs/lug00/users/marl.b;1;11094;102095;0;0;0;0 +5835;lug00-test;Test;/usr/bin/passwd;/home/pacs/lug00/users/test;0;11094;102106;2000000;4000000;20;0 -100705;hsh00-mim;Michael Mellis;/bin/false;/home/pacs/hsh00/users/mi;0;630;10003;0;0;0;0 -5964;mim00;Michael Mellis;/bin/bash;/home/pacs/mim00;0;1112;102147;0;0;0;0 -5966;mim00-1981;Jahrgangstreffen 1981;/bin/bash;/home/pacs/mim00/users/1981;0;1112;102148;128;256;0;0 -5990;mim00-mail;Mailbox;/bin/bash;/home/pacs/mim00/users/mail;0;1112;102160;0;0;0;0 +6705;hsh00-mim;Michael Mellis;/bin/false;/home/pacs/hsh00/users/mi;0;10630;10003;0;0;0;0 +5964;mim00;Michael Mellis;/bin/bash;/home/pacs/mim00;0;11112;102147;0;0;0;0 +5966;mim00-1981;Jahrgangstreffen 1981;/bin/bash;/home/pacs/mim00/users/1981;0;11112;102148;128;256;0;0 +5990;mim00-mail;Mailbox;/bin/bash;/home/pacs/mim00/users/mail;0;11112;102160;0;0;0;0 -167846;hsh00-dph;hsh00-uph;/bin/false;/home/pacs/hsh00/users/uph;0;630;110568;0;0;0;0 -169546;dph00;Reinhard Wiese;/bin/bash;/home/pacs/dph00;0;19959;110593;0;0;0;0 -169596;dph00-dph;Domain admin;/bin/bash;/home/pacs/dph00/users/uph;0;19959;110594;0;0;0;0 +7846;hsh00-dph;hsh00-uph;/bin/false;/home/pacs/hsh00/users/uph;0;10630;110568;0;0;0;0 +9546;dph00;Reinhard Wiese;/bin/bash;/home/pacs/dph00;0;19959;110593;0;0;0;0 +9596;dph00-dph;Domain admin;/bin/bash;/home/pacs/dph00/users/uph;0;19959;110594;0;0;0;0