add-domain-email-setup-validation #74
@ -12,7 +12,7 @@ package Booking #feb28c {
|
|||||||
entity BI_MANAGED_SERVER
|
entity BI_MANAGED_SERVER
|
||||||
entity BI_MANAGED_WEBSPACE
|
entity BI_MANAGED_WEBSPACE
|
||||||
entity BI_DOMAIN_DNS_SETUP
|
entity BI_DOMAIN_DNS_SETUP
|
||||||
entity BI_DOMAIN_EMAIL_SUBMISSION_SETUP
|
entity BI_DOMAIN_SMTP_SETUP
|
||||||
}
|
}
|
||||||
|
|
||||||
package Hosting #feb28c{
|
package Hosting #feb28c{
|
||||||
@ -20,8 +20,8 @@ package Hosting #feb28c{
|
|||||||
entity HA_DOMAIN_SETUP
|
entity HA_DOMAIN_SETUP
|
||||||
entity HA_DOMAIN_DNS_SETUP
|
entity HA_DOMAIN_DNS_SETUP
|
||||||
entity HA_DOMAIN_HTTP_SETUP
|
entity HA_DOMAIN_HTTP_SETUP
|
||||||
entity HA_DOMAIN_EMAIL_SUBMISSION_SETUP
|
entity HA_DOMAIN_SMTP_SETUP
|
||||||
entity HA_DOMAIN_EMAIL_MAILBOX_SETUP
|
entity HA_DOMAIN_MBOX_SETUP
|
||||||
entity HA_EMAIL_ADDRESS
|
entity HA_EMAIL_ADDRESS
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -52,12 +52,12 @@ HA_DOMAIN_SETUP o..> HA_DOMAIN_SETUP
|
|||||||
HA_DOMAIN_DNS_SETUP *==> HA_DOMAIN_SETUP
|
HA_DOMAIN_DNS_SETUP *==> HA_DOMAIN_SETUP
|
||||||
HA_DOMAIN_HTTP_SETUP *==> HA_DOMAIN_SETUP
|
HA_DOMAIN_HTTP_SETUP *==> HA_DOMAIN_SETUP
|
||||||
HA_DOMAIN_HTTP_SETUP o..> HA_UNIX_USER
|
HA_DOMAIN_HTTP_SETUP o..> HA_UNIX_USER
|
||||||
HA_DOMAIN_EMAIL_SUBMISSION_SETUP *==> HA_DOMAIN_SETUP
|
HA_DOMAIN_SMTP_SETUP *==> HA_DOMAIN_SETUP
|
||||||
HA_DOMAIN_EMAIL_SUBMISSION_SETUP o..> HA_MANAGED_WEBSPACE
|
HA_DOMAIN_SMTP_SETUP o..> HA_MANAGED_WEBSPACE
|
||||||
HA_DOMAIN_EMAIL_MAILBOX_SETUP *==> HA_DOMAIN_SETUP
|
HA_DOMAIN_MBOX_SETUP *==> HA_DOMAIN_SETUP
|
||||||
HA_DOMAIN_EMAIL_MAILBOX_SETUP o..> HA_MANAGED_WEBSPACE
|
HA_DOMAIN_MBOX_SETUP o..> HA_MANAGED_WEBSPACE
|
||||||
HA_EMAIL_ALIAS *==> HA_MANAGED_WEBSPACE
|
HA_EMAIL_ALIAS *==> HA_MANAGED_WEBSPACE
|
||||||
HA_EMAIL_ADDRESS *==> HA_DOMAIN_EMAIL_MAILBOX_SETUP
|
HA_EMAIL_ADDRESS *==> HA_DOMAIN_MBOX_SETUP
|
||||||
HA_IP_NUMBER o..> HA_CLOUD_SERVER
|
HA_IP_NUMBER o..> HA_CLOUD_SERVER
|
||||||
HA_IP_NUMBER o..> HA_MANAGED_SERVER
|
HA_IP_NUMBER o..> HA_MANAGED_SERVER
|
||||||
HA_IP_NUMBER o..> HA_MANAGED_WEBSPACE
|
HA_IP_NUMBER o..> HA_MANAGED_WEBSPACE
|
||||||
@ -82,7 +82,7 @@ package Booking #feb28c {
|
|||||||
entity BI_MANAGED_SERVER
|
entity BI_MANAGED_SERVER
|
||||||
entity BI_MANAGED_WEBSPACE
|
entity BI_MANAGED_WEBSPACE
|
||||||
entity BI_DOMAIN_DNS_SETUP
|
entity BI_DOMAIN_DNS_SETUP
|
||||||
entity BI_DOMAIN_EMAIL_SUBMISSION_SETUP
|
entity BI_DOMAIN_SMTP_SETUP
|
||||||
}
|
}
|
||||||
|
|
||||||
package Hosting #feb28c{
|
package Hosting #feb28c{
|
||||||
@ -145,7 +145,7 @@ package Booking #feb28c {
|
|||||||
entity BI_MANAGED_SERVER
|
entity BI_MANAGED_SERVER
|
||||||
entity BI_MANAGED_WEBSPACE
|
entity BI_MANAGED_WEBSPACE
|
||||||
entity BI_DOMAIN_DNS_SETUP
|
entity BI_DOMAIN_DNS_SETUP
|
||||||
entity BI_DOMAIN_EMAIL_SUBMISSION_SETUP
|
entity BI_DOMAIN_SMTP_SETUP
|
||||||
}
|
}
|
||||||
|
|
||||||
package Hosting #feb28c{
|
package Hosting #feb28c{
|
||||||
|
@ -8,9 +8,7 @@ public enum HsBookingItemType implements Node {
|
|||||||
PRIVATE_CLOUD,
|
PRIVATE_CLOUD,
|
||||||
CLOUD_SERVER(PRIVATE_CLOUD),
|
CLOUD_SERVER(PRIVATE_CLOUD),
|
||||||
MANAGED_SERVER(PRIVATE_CLOUD),
|
MANAGED_SERVER(PRIVATE_CLOUD),
|
||||||
MANAGED_WEBSPACE(MANAGED_SERVER),
|
MANAGED_WEBSPACE(MANAGED_SERVER);
|
||||||
DOMAIN_DNS_SETUP, // TODO.spec: experimental
|
|
||||||
DOMAIN_EMAIL_SUBMISSION_SETUP; // TODO.spec: experimental
|
|
||||||
|
|
||||||
private final HsBookingItemType parentItemType;
|
private final HsBookingItemType parentItemType;
|
||||||
|
|
||||||
|
@ -8,7 +8,7 @@ import java.util.List;
|
|||||||
|
|
||||||
import static java.util.Collections.emptyList;
|
import static java.util.Collections.emptyList;
|
||||||
import static java.util.Optional.ofNullable;
|
import static java.util.Optional.ofNullable;
|
||||||
import static net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetType.DOMAIN_EMAIL_MAILBOX_SETUP;
|
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.HsHostingAssetType.EMAIL_ADDRESS;
|
||||||
import static net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetType.MARIADB_DATABASE;
|
import static net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetType.MARIADB_DATABASE;
|
||||||
import static net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetType.MARIADB_USER;
|
import static net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetType.MARIADB_USER;
|
||||||
@ -88,7 +88,7 @@ class HsManagedWebspaceBookingItemValidator extends HsBookingItemEntityValidator
|
|||||||
return (final HsBookingItemEntity entity, final IntegerProperty prop, final Integer factor) -> {
|
return (final HsBookingItemEntity entity, final IntegerProperty prop, final Integer factor) -> {
|
||||||
final var unixUserCount = ofNullable(entity.getRelatedHostingAsset())
|
final var unixUserCount = ofNullable(entity.getRelatedHostingAsset())
|
||||||
.map(ha -> ha.getSubHostingAssets().stream()
|
.map(ha -> ha.getSubHostingAssets().stream()
|
||||||
.filter(bi -> bi.getType() == DOMAIN_EMAIL_MAILBOX_SETUP)
|
.filter(bi -> bi.getType() == DOMAIN_MBOX_SETUP)
|
||||||
.flatMap(domainEMailSetup -> domainEMailSetup.getSubHostingAssets().stream()
|
.flatMap(domainEMailSetup -> domainEMailSetup.getSubHostingAssets().stream()
|
||||||
.filter(subAsset -> subAsset.getType()==EMAIL_ADDRESS))
|
.filter(subAsset -> subAsset.getType()==EMAIL_ADDRESS))
|
||||||
.count())
|
.count())
|
||||||
|
@ -45,6 +45,10 @@ public enum HsHostingAssetType implements Node {
|
|||||||
inGroup("Webspace"),
|
inGroup("Webspace"),
|
||||||
requiredParent(MANAGED_WEBSPACE)),
|
requiredParent(MANAGED_WEBSPACE)),
|
||||||
|
|
||||||
|
EMAIL_ALIAS( // named e.g. xyz00-abc
|
||||||
|
inGroup("Webspace"),
|
||||||
|
requiredParent(MANAGED_WEBSPACE)),
|
||||||
|
|
||||||
DOMAIN_SETUP( // named e.g. example.org
|
DOMAIN_SETUP( // named e.g. example.org
|
||||||
inGroup("Domain"),
|
inGroup("Domain"),
|
||||||
optionalParent(SAME_TYPE)
|
optionalParent(SAME_TYPE)
|
||||||
@ -52,32 +56,29 @@ public enum HsHostingAssetType implements Node {
|
|||||||
|
|
||||||
DOMAIN_DNS_SETUP( // named e.g. example.org
|
DOMAIN_DNS_SETUP( // named e.g. example.org
|
||||||
inGroup("Domain"),
|
inGroup("Domain"),
|
||||||
requiredParent(DOMAIN_SETUP)),
|
requiredParent(DOMAIN_SETUP),
|
||||||
|
assignedTo(MANAGED_WEBSPACE)),
|
||||||
|
|
||||||
DOMAIN_HTTP_SETUP( // named e.g. example.org
|
DOMAIN_HTTP_SETUP( // named e.g. example.org
|
||||||
inGroup("Domain"),
|
inGroup("Domain"),
|
||||||
requiredParent(DOMAIN_SETUP),
|
requiredParent(DOMAIN_SETUP),
|
||||||
assignedTo(UNIX_USER)),
|
assignedTo(UNIX_USER)),
|
||||||
|
|
||||||
DOMAIN_EMAIL_SUBMISSION_SETUP( // named e.g. example.org
|
DOMAIN_SMTP_SETUP( // named e.g. example.org
|
||||||
inGroup("Domain"),
|
inGroup("Domain"),
|
||||||
requiredParent(DOMAIN_SETUP),
|
requiredParent(DOMAIN_SETUP),
|
||||||
assignedTo(MANAGED_WEBSPACE)),
|
assignedTo(MANAGED_WEBSPACE)),
|
||||||
|
|
||||||
DOMAIN_EMAIL_MAILBOX_SETUP( // named e.g. example.org
|
DOMAIN_MBOX_SETUP( // named e.g. example.org
|
||||||
inGroup("Domain"),
|
inGroup("Domain"),
|
||||||
requiredParent(DOMAIN_SETUP),
|
requiredParent(DOMAIN_SETUP),
|
||||||
assignedTo(MANAGED_WEBSPACE)),
|
assignedTo(MANAGED_WEBSPACE)),
|
||||||
|
|
||||||
// TODO.spec: SECURE_MX
|
// TODO.spec: SECURE_MX
|
||||||
|
|
||||||
EMAIL_ALIAS( // named e.g. xyz00-abc
|
|
||||||
inGroup("Webspace"),
|
|
||||||
requiredParent(MANAGED_WEBSPACE)),
|
|
||||||
|
|
||||||
EMAIL_ADDRESS( // named e.g. sample@example.org
|
EMAIL_ADDRESS( // named e.g. sample@example.org
|
||||||
inGroup("Domain"),
|
inGroup("Domain"),
|
||||||
requiredParent(DOMAIN_EMAIL_MAILBOX_SETUP)),
|
requiredParent(DOMAIN_MBOX_SETUP)),
|
||||||
|
|
||||||
PGSQL_INSTANCE( // TODO.spec: identifier to be specified
|
PGSQL_INSTANCE( // TODO.spec: identifier to be specified
|
||||||
inGroup("PostgreSQL"),
|
inGroup("PostgreSQL"),
|
||||||
|
@ -23,6 +23,9 @@ public class HostingAssetEntityValidatorRegistry {
|
|||||||
register(DOMAIN_SETUP, new HsDomainSetupHostingAssetValidator());
|
register(DOMAIN_SETUP, new HsDomainSetupHostingAssetValidator());
|
||||||
register(DOMAIN_DNS_SETUP, new HsDomainDnsSetupHostingAssetValidator());
|
register(DOMAIN_DNS_SETUP, new HsDomainDnsSetupHostingAssetValidator());
|
||||||
register(DOMAIN_HTTP_SETUP, new HsDomainHttpSetupHostingAssetValidator());
|
register(DOMAIN_HTTP_SETUP, new HsDomainHttpSetupHostingAssetValidator());
|
||||||
|
register(DOMAIN_SMTP_SETUP, new HsDomainSmtpSetupHostingAssetValidator());
|
||||||
hsh-michaelhoennig marked this conversation as resolved
Outdated
|
|||||||
|
register(DOMAIN_MBOX_SETUP, new HsDomainMboxSetupHostingAssetValidator());
|
||||||
|
register(EMAIL_ADDRESS, new HsEMailAddressHostingAssetValidator());
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void register(final Enum<HsHostingAssetType> type, final HsEntityValidator<HsHostingAssetEntity> validator) {
|
private static void register(final Enum<HsHostingAssetType> type, final HsEntityValidator<HsHostingAssetEntity> validator) {
|
||||||
|
@ -60,7 +60,7 @@ class HsDomainDnsSetupHostingAssetValidator extends HostingAssetEntityValidator
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected Pattern identifierPattern(final HsHostingAssetEntity assetEntity) {
|
protected Pattern identifierPattern(final HsHostingAssetEntity assetEntity) {
|
||||||
return Pattern.compile("^" + assetEntity.getParentAsset().getIdentifier() + Pattern.quote(IDENTIFIER_SUFFIX) + "$");
|
return Pattern.compile("^" + Pattern.quote(assetEntity.getParentAsset().getIdentifier() + IDENTIFIER_SUFFIX) + "$");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -43,7 +43,7 @@ class HsDomainHttpSetupHostingAssetValidator extends HostingAssetEntityValidator
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected Pattern identifierPattern(final HsHostingAssetEntity assetEntity) {
|
protected Pattern identifierPattern(final HsHostingAssetEntity assetEntity) {
|
||||||
return Pattern.compile("^" + assetEntity.getParentAsset().getIdentifier() + Pattern.quote(IDENTIFIER_SUFFIX) + "$");
|
return Pattern.compile("^" + Pattern.quote(assetEntity.getParentAsset().getIdentifier() + IDENTIFIER_SUFFIX) + "$");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -0,0 +1,34 @@
|
|||||||
|
package net.hostsharing.hsadminng.hs.hosting.asset.validators;
|
||||||
|
|
||||||
|
import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetEntity;
|
||||||
|
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
|
import static java.util.Optional.ofNullable;
|
||||||
|
import static net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetType.DOMAIN_MBOX_SETUP;
|
||||||
|
|
||||||
|
class HsDomainMboxSetupHostingAssetValidator extends HostingAssetEntityValidator {
|
||||||
|
|
||||||
|
public static final String IDENTIFIER_SUFFIX = "|MBOX";
|
||||||
|
|
||||||
|
HsDomainMboxSetupHostingAssetValidator() {
|
||||||
|
super(
|
||||||
|
DOMAIN_MBOX_SETUP,
|
||||||
|
AlarmContact.isOptional(),
|
||||||
|
|
||||||
|
NO_EXTRA_PROPERTIES);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Pattern identifierPattern(final HsHostingAssetEntity assetEntity) {
|
||||||
|
return Pattern.compile("^" + Pattern.quote(assetEntity.getParentAsset().getIdentifier() + IDENTIFIER_SUFFIX) + "$");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void preprocessEntity(final HsHostingAssetEntity entity) {
|
||||||
|
super.preprocessEntity(entity);
|
||||||
|
if (entity.getIdentifier() == null) {
|
||||||
|
ofNullable(entity.getParentAsset()).ifPresent(pa -> entity.setIdentifier(pa.getIdentifier() + IDENTIFIER_SUFFIX));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -43,7 +43,6 @@ class HsDomainSetupHostingAssetValidator extends HostingAssetEntityValidator {
|
|||||||
// - user has Admin/Agent-role for all its sub-domains and the direct parent-Domain which are set up at at Hostsharing
|
// - user has Admin/Agent-role for all its sub-domains and the direct parent-Domain which are set up at at Hostsharing
|
||||||
// - domain has DNS zone with TXT record approval
|
// - domain has DNS zone with TXT record approval
|
||||||
// - parent-domain has DNS zone with TXT record approval
|
// - parent-domain has DNS zone with TXT record approval
|
||||||
// - dom
|
|
||||||
//
|
//
|
||||||
// TXT-Record check:
|
// TXT-Record check:
|
||||||
// new InitialDirContext().getAttributes("dns:_netblocks.google.com", new String[] { "TXT"}).get("TXT").getAll();
|
// new InitialDirContext().getAttributes("dns:_netblocks.google.com", new String[] { "TXT"}).get("TXT").getAll();
|
||||||
|
@ -0,0 +1,34 @@
|
|||||||
|
package net.hostsharing.hsadminng.hs.hosting.asset.validators;
|
||||||
|
|
||||||
|
import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetEntity;
|
||||||
|
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
|
import static java.util.Optional.ofNullable;
|
||||||
|
import static net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetType.DOMAIN_SMTP_SETUP;
|
||||||
|
|
||||||
|
class HsDomainSmtpSetupHostingAssetValidator extends HostingAssetEntityValidator {
|
||||||
|
|
||||||
|
public static final String IDENTIFIER_SUFFIX = "|SMTP";
|
||||||
|
|
||||||
|
HsDomainSmtpSetupHostingAssetValidator() {
|
||||||
|
super(
|
||||||
|
DOMAIN_SMTP_SETUP,
|
||||||
|
AlarmContact.isOptional(),
|
||||||
|
|
||||||
|
NO_EXTRA_PROPERTIES);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Pattern identifierPattern(final HsHostingAssetEntity assetEntity) {
|
||||||
|
return Pattern.compile("^" + Pattern.quote(assetEntity.getParentAsset().getIdentifier() + IDENTIFIER_SUFFIX) + "$");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void preprocessEntity(final HsHostingAssetEntity entity) {
|
||||||
|
super.preprocessEntity(entity);
|
||||||
|
if (entity.getIdentifier() == null) {
|
||||||
|
ofNullable(entity.getParentAsset()).ifPresent(pa -> entity.setIdentifier(pa.getIdentifier() + IDENTIFIER_SUFFIX));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,51 @@
|
|||||||
|
package net.hostsharing.hsadminng.hs.hosting.asset.validators;
|
||||||
|
|
||||||
|
import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetEntity;
|
||||||
|
import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetType;
|
||||||
|
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
|
import static java.util.Optional.ofNullable;
|
||||||
|
import static net.hostsharing.hsadminng.hs.validation.ArrayProperty.arrayOf;
|
||||||
|
import static net.hostsharing.hsadminng.hs.validation.StringProperty.stringProperty;
|
||||||
|
|
||||||
|
class HsEMailAddressHostingAssetValidator extends HostingAssetEntityValidator {
|
||||||
|
|
||||||
|
private static final String UNIX_USER_REGEX = "^[a-z][a-z0-9]{2}[0-9]{2}(-[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 + "$";
|
||||||
|
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(),
|
||||||
|
arrayOf(
|
||||||
|
stringProperty("target").maxLength(EMAIL_ADDRESS_MAX_LENGTH).matchesRegEx(UNIX_USER_REGEX, EMAIL_ADDRESS_FULL_REGEX)
|
||||||
|
).required().minLength(1));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void preprocessEntity(final HsHostingAssetEntity entity) {
|
||||||
|
super.preprocessEntity(entity);
|
||||||
|
super.preprocessEntity(entity);
|
||||||
|
if (entity.getIdentifier() == null) {
|
||||||
|
entity.setIdentifier(combineIdentifier(entity));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Pattern identifierPattern(final HsHostingAssetEntity assetEntity) {
|
||||||
|
return Pattern.compile("^"+ Pattern.quote(combineIdentifier(assetEntity)) + "$");
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String combineIdentifier(final HsHostingAssetEntity emailAddressAssetEntity) {
|
||||||
|
return emailAddressAssetEntity.getDirectValue("local-part", String.class) +
|
||||||
|
ofNullable(emailAddressAssetEntity.getDirectValue("sub-domain", String.class)).map(s -> "." + s).orElse("") +
|
||||||
|
"@" +
|
||||||
|
emailAddressAssetEntity.getParentAsset().getIdentifier();
|
||||||
|
}
|
||||||
|
}
|
@ -13,7 +13,8 @@ components:
|
|||||||
- DOMAIN_SETUP
|
- DOMAIN_SETUP
|
||||||
- DOMAIN_DNS_SETUP
|
- DOMAIN_DNS_SETUP
|
||||||
- DOMAIN_HTTP_SETUP
|
- DOMAIN_HTTP_SETUP
|
||||||
- DOMAIN_EMAIL_SETUP
|
- DOMAIN_SMTP_SETUP
|
||||||
|
- DOMAIN_MBOX_SETUP
|
||||||
- EMAIL_ALIAS
|
- EMAIL_ALIAS
|
||||||
- EMAIL_ADDRESS
|
- EMAIL_ADDRESS
|
||||||
- PGSQL_USER
|
- PGSQL_USER
|
||||||
|
@ -12,7 +12,8 @@ create type HsHostingAssetType as enum (
|
|||||||
'DOMAIN_SETUP',
|
'DOMAIN_SETUP',
|
||||||
'DOMAIN_DNS_SETUP',
|
'DOMAIN_DNS_SETUP',
|
||||||
'DOMAIN_HTTP_SETUP',
|
'DOMAIN_HTTP_SETUP',
|
||||||
'DOMAIN_EMAIL_SETUP',
|
'DOMAIN_SMTP_SETUP',
|
||||||
|
'DOMAIN_MBOX_SETUP',
|
||||||
'EMAIL_ALIAS',
|
'EMAIL_ALIAS',
|
||||||
'EMAIL_ADDRESS',
|
'EMAIL_ADDRESS',
|
||||||
'PGSQL_USER',
|
'PGSQL_USER',
|
||||||
@ -64,12 +65,13 @@ begin
|
|||||||
when 'MANAGED_SERVER' then null
|
when 'MANAGED_SERVER' then null
|
||||||
when 'MANAGED_WEBSPACE' then 'MANAGED_SERVER'
|
when 'MANAGED_WEBSPACE' then 'MANAGED_SERVER'
|
||||||
when 'UNIX_USER' then 'MANAGED_WEBSPACE'
|
when 'UNIX_USER' then 'MANAGED_WEBSPACE'
|
||||||
|
when 'EMAIL_ALIAS' then 'MANAGED_WEBSPACE'
|
||||||
when 'DOMAIN_SETUP' then null
|
when 'DOMAIN_SETUP' then null
|
||||||
when 'DOMAIN_DNS_SETUP' then 'DOMAIN_SETUP'
|
when 'DOMAIN_DNS_SETUP' then 'DOMAIN_SETUP'
|
||||||
when 'DOMAIN_HTTP_SETUP' then 'DOMAIN_SETUP'
|
when 'DOMAIN_HTTP_SETUP' then 'DOMAIN_SETUP'
|
||||||
when 'DOMAIN_EMAIL_SETUP' then 'DOMAIN_SETUP'
|
when 'DOMAIN_SMTP_SETUP' then 'DOMAIN_SETUP'
|
||||||
when 'EMAIL_ALIAS' then 'MANAGED_WEBSPACE'
|
when 'DOMAIN_MBOX_SETUP' then 'DOMAIN_SETUP'
|
||||||
when 'EMAIL_ADDRESS' then 'DOMAIN_EMAIL_SETUP'
|
when 'EMAIL_ADDRESS' then 'DOMAIN_MBOX_SETUP'
|
||||||
when 'PGSQL_USER' then 'MANAGED_WEBSPACE'
|
when 'PGSQL_USER' then 'MANAGED_WEBSPACE'
|
||||||
when 'PGSQL_DATABASE' then 'MANAGED_WEBSPACE'
|
when 'PGSQL_DATABASE' then 'MANAGED_WEBSPACE'
|
||||||
when 'MARIADB_USER' then 'MANAGED_WEBSPACE'
|
when 'MARIADB_USER' then 'MANAGED_WEBSPACE'
|
||||||
|
@ -14,16 +14,17 @@ declare
|
|||||||
currentTask varchar;
|
currentTask varchar;
|
||||||
relatedProject hs_booking_project;
|
relatedProject hs_booking_project;
|
||||||
relatedDebitor hs_office_debitor;
|
relatedDebitor hs_office_debitor;
|
||||||
relatedPrivateCloudBookingItem hs_booking_item;
|
privateCloudBI hs_booking_item;
|
||||||
relatedManagedServerBookingItem hs_booking_item;
|
managedServerBI hs_booking_item;
|
||||||
relatedCloudServerBookingItem hs_booking_item;
|
cloudServerBI hs_booking_item;
|
||||||
relatedManagedWebspaceBookingItem hs_booking_item;
|
managedWebspaceBI hs_booking_item;
|
||||||
debitorNumberSuffix varchar;
|
debitorNumberSuffix varchar;
|
||||||
defaultPrefix varchar;
|
defaultPrefix varchar;
|
||||||
managedServerUuid uuid;
|
managedServerUuid uuid;
|
||||||
managedWebspaceUuid uuid;
|
managedWebspaceUuid uuid;
|
||||||
webUnixUserUuid uuid;
|
webUnixUserUuid uuid;
|
||||||
domainSetupUuid uuid;
|
domainSetupUuid uuid;
|
||||||
|
domainMBoxSetupUuid uuid;
|
||||||
begin
|
begin
|
||||||
currentTask := 'creating hosting-asset test-data ' || givenProjectCaption;
|
currentTask := 'creating hosting-asset test-data ' || givenProjectCaption;
|
||||||
call defineContext(currentTask, null, 'superuser-alex@hostsharing.net', 'global#global:ADMIN');
|
call defineContext(currentTask, null, 'superuser-alex@hostsharing.net', 'global#global:ADMIN');
|
||||||
@ -39,47 +40,51 @@ begin
|
|||||||
where debitor.uuid = relatedProject.debitorUuid;
|
where debitor.uuid = relatedProject.debitorUuid;
|
||||||
assert relatedDebitor.uuid is not null, 'relatedDebitor for "' || givenProjectCaption || '" must not be null';
|
assert relatedDebitor.uuid is not null, 'relatedDebitor for "' || givenProjectCaption || '" must not be null';
|
||||||
|
|
||||||
select item.* into relatedPrivateCloudBookingItem
|
select item.* into privateCloudBI
|
||||||
from hs_booking_item item
|
from hs_booking_item item
|
||||||
where item.projectUuid = relatedProject.uuid
|
where item.projectUuid = relatedProject.uuid
|
||||||
and item.type = 'PRIVATE_CLOUD';
|
and item.type = 'PRIVATE_CLOUD';
|
||||||
assert relatedPrivateCloudBookingItem.uuid is not null, 'relatedPrivateCloudBookingItem for "' || givenProjectCaption|| '" must not be null';
|
assert privateCloudBI.uuid is not null, 'relatedPrivateCloudBookingItem for "' || givenProjectCaption|| '" must not be null';
|
||||||
|
|
||||||
select item.* into relatedManagedServerBookingItem
|
select item.* into managedServerBI
|
||||||
from hs_booking_item item
|
from hs_booking_item item
|
||||||
where item.projectUuid = relatedProject.uuid
|
where item.projectUuid = relatedProject.uuid
|
||||||
and item.type = 'MANAGED_SERVER';
|
and item.type = 'MANAGED_SERVER';
|
||||||
assert relatedManagedServerBookingItem.uuid is not null, 'relatedManagedServerBookingItem for "' || givenProjectCaption|| '" must not be null';
|
assert managedServerBI.uuid is not null, 'relatedManagedServerBookingItem for "' || givenProjectCaption|| '" must not be null';
|
||||||
|
|
||||||
select item.* into relatedCloudServerBookingItem
|
select item.* into cloudServerBI
|
||||||
from hs_booking_item item
|
from hs_booking_item item
|
||||||
where item.parentItemuuid = relatedPrivateCloudBookingItem.uuid
|
where item.parentItemuuid = privateCloudBI.uuid
|
||||||
and item.type = 'CLOUD_SERVER';
|
and item.type = 'CLOUD_SERVER';
|
||||||
assert relatedCloudServerBookingItem.uuid is not null, 'relatedCloudServerBookingItem for "' || givenProjectCaption|| '" must not be null';
|
assert cloudServerBI.uuid is not null, 'relatedCloudServerBookingItem for "' || givenProjectCaption|| '" must not be null';
|
||||||
|
|
||||||
select item.* into relatedManagedWebspaceBookingItem
|
select item.* into managedWebspaceBI
|
||||||
from hs_booking_item item
|
from hs_booking_item item
|
||||||
where item.projectUuid = relatedProject.uuid
|
where item.projectUuid = relatedProject.uuid
|
||||||
and item.type = 'MANAGED_WEBSPACE';
|
and item.type = 'MANAGED_WEBSPACE';
|
||||||
assert relatedManagedWebspaceBookingItem.uuid is not null, 'relatedManagedWebspaceBookingItem for "' || givenProjectCaption|| '" must not be null';
|
assert managedWebspaceBI.uuid is not null, 'relatedManagedWebspaceBookingItem for "' || givenProjectCaption|| '" must not be null';
|
||||||
|
|
||||||
select uuid_generate_v4() into managedServerUuid;
|
select uuid_generate_v4() into managedServerUuid;
|
||||||
select uuid_generate_v4() into managedWebspaceUuid;
|
select uuid_generate_v4() into managedWebspaceUuid;
|
||||||
select uuid_generate_v4() into webUnixUserUuid;
|
select uuid_generate_v4() into webUnixUserUuid;
|
||||||
select uuid_generate_v4() into domainSetupUuid;
|
select uuid_generate_v4() into domainSetupUuid;
|
||||||
|
select uuid_generate_v4() into domainMBoxSetupUuid;
|
||||||
debitorNumberSuffix := relatedDebitor.debitorNumberSuffix;
|
debitorNumberSuffix := relatedDebitor.debitorNumberSuffix;
|
||||||
defaultPrefix := relatedDebitor.defaultPrefix;
|
defaultPrefix := relatedDebitor.defaultPrefix;
|
||||||
|
|
||||||
insert into hs_hosting_asset
|
insert into hs_hosting_asset
|
||||||
(uuid, bookingitemuuid, type, parentAssetUuid, assignedToAssetUuid, identifier, caption, config)
|
(uuid, bookingitemuuid, type, parentAssetUuid, assignedToAssetUuid, identifier, caption, config)
|
||||||
values (managedServerUuid, relatedManagedServerBookingItem.uuid, 'MANAGED_SERVER', null, null, 'vm10' || debitorNumberSuffix, 'some ManagedServer', '{ "monit_max_cpu_usage": 90, "monit_max_ram_usage": 80, "monit_max_ssd_usage": 70 }'::jsonb),
|
values (managedServerUuid, managedServerBI.uuid, 'MANAGED_SERVER', null, null, 'vm10' || debitorNumberSuffix, 'some ManagedServer', '{ "monit_max_cpu_usage": 90, "monit_max_ram_usage": 80, "monit_max_ssd_usage": 70 }'::jsonb),
|
||||||
(uuid_generate_v4(), relatedCloudServerBookingItem.uuid, 'CLOUD_SERVER', null, null, 'vm20' || debitorNumberSuffix, 'another CloudServer', '{}'::jsonb),
|
(uuid_generate_v4(), cloudServerBI.uuid, 'CLOUD_SERVER', null, null, 'vm20' || debitorNumberSuffix, 'another CloudServer', '{}'::jsonb),
|
||||||
(managedWebspaceUuid, relatedManagedWebspaceBookingItem.uuid, 'MANAGED_WEBSPACE', managedServerUuid, null, defaultPrefix || '01', 'some Webspace', '{}'::jsonb),
|
(managedWebspaceUuid, managedWebspaceBI.uuid, 'MANAGED_WEBSPACE', managedServerUuid, null, defaultPrefix || '01', 'some Webspace', '{}'::jsonb),
|
||||||
(uuid_generate_v4(), null, 'EMAIL_ALIAS', managedWebspaceUuid, null, defaultPrefix || '01-web', 'some E-Mail-Alias', '{ "target": [ "office@example.org", "archive@example.com" ] }'::jsonb),
|
(uuid_generate_v4(), null, 'EMAIL_ALIAS', managedWebspaceUuid, null, defaultPrefix || '01-web', 'some E-Mail-Alias', '{ "target": [ "office@example.org", "archive@example.com" ] }'::jsonb),
|
||||||
(webUnixUserUuid, null, 'UNIX_USER', managedWebspaceUuid, null, defaultPrefix || '01-web', 'some UnixUser for Website', '{ "SSD-soft-quota": "128", "SSD-hard-quota": "256", "HDD-soft-quota": "512", "HDD-hard-quota": "1024"}'::jsonb),
|
(webUnixUserUuid, null, 'UNIX_USER', managedWebspaceUuid, null, defaultPrefix || '01-web', 'some UnixUser for Website', '{ "SSD-soft-quota": "128", "SSD-hard-quota": "256", "HDD-soft-quota": "512", "HDD-hard-quota": "1024"}'::jsonb),
|
||||||
(domainSetupUuid, null, 'DOMAIN_SETUP', null, null, defaultPrefix || '.example.org', 'some Domain-Setup', '{}'::jsonb),
|
(domainSetupUuid, null, 'DOMAIN_SETUP', null, null, defaultPrefix || '.example.org', 'some Domain-Setup', '{}'::jsonb),
|
||||||
(uuid_generate_v4(), null, 'DOMAIN_DNS_SETUP', domainSetupUuid, null, defaultPrefix || '.example.org|DNS', 'some Domain-DNS-Setup', '{}'::jsonb),
|
(uuid_generate_v4(), null, 'DOMAIN_DNS_SETUP', domainSetupUuid, null, defaultPrefix || '.example.org|DNS', 'some Domain-DNS-Setup', '{}'::jsonb),
|
||||||
(uuid_generate_v4(), null, 'DOMAIN_HTTP_SETUP', domainSetupUuid, webUnixUserUuid, defaultPrefix || '.example.org|HTTP', 'some Domain-HTTP-Setup', '{ "option-htdocsfallback": true, "use-fcgiphpbin": "/usr/lib/cgi-bin/php", "validsubdomainnames": "*"}'::jsonb);
|
(uuid_generate_v4(), null, 'DOMAIN_HTTP_SETUP', domainSetupUuid, webUnixUserUuid, defaultPrefix || '.example.org|HTTP', 'some Domain-HTTP-Setup', '{ "option-htdocsfallback": true, "use-fcgiphpbin": "/usr/lib/cgi-bin/php", "validsubdomainnames": "*"}'::jsonb),
|
||||||
|
(uuid_generate_v4(), null, 'DOMAIN_SMTP_SETUP', domainSetupUuid, managedWebspaceUuid, defaultPrefix || '.example.org|DNS', 'some Domain-SMPT-Setup', '{}'::jsonb),
|
||||||
|
(domainMBoxSetupUuid, null, 'DOMAIN_MBOX_SETUP', domainSetupUuid, managedWebspaceUuid, defaultPrefix || '.example.org|DNS', 'some Domain-MBOX-Setup', '{}'::jsonb),
|
||||||
|
(uuid_generate_v4(), null, 'EMAIL_ADDRESS', domainMBoxSetupUuid, null, 'test@' || defaultPrefix || '.example.org', 'some E-Mail-Address', '{}'::jsonb);
|
||||||
end; $$;
|
end; $$;
|
||||||
--//
|
--//
|
||||||
|
|
||||||
|
@ -152,7 +152,7 @@ class HsManagedServerBookingItemValidatorUnitTest {
|
|||||||
"xyz00_%c%c",
|
"xyz00_%c%c",
|
||||||
2, HsHostingAssetType.MARIADB_DATABASE
|
2, HsHostingAssetType.MARIADB_DATABASE
|
||||||
),
|
),
|
||||||
generateDomainEmailSetupsWithEMailAddresses(26, HsHostingAssetType.DOMAIN_EMAIL_MAILBOX_SETUP,
|
generateDomainEmailSetupsWithEMailAddresses(26, HsHostingAssetType.DOMAIN_MBOX_SETUP,
|
||||||
"%c%c.example.com",
|
"%c%c.example.com",
|
||||||
10, HsHostingAssetType.EMAIL_ADDRESS
|
10, HsHostingAssetType.EMAIL_ADDRESS
|
||||||
)
|
)
|
||||||
|
@ -251,7 +251,7 @@ public class HsHostingAssetControllerRestTest {
|
|||||||
List.of(
|
List.of(
|
||||||
HsHostingAssetEntity.builder()
|
HsHostingAssetEntity.builder()
|
||||||
.type(HsHostingAssetType.DOMAIN_HTTP_SETUP)
|
.type(HsHostingAssetType.DOMAIN_HTTP_SETUP)
|
||||||
.identifier("example.org")
|
.identifier("example.org|HTTP")
|
||||||
.caption("some fake Domain-HTTP-Setup")
|
.caption("some fake Domain-HTTP-Setup")
|
||||||
.config(Map.ofEntries(
|
.config(Map.ofEntries(
|
||||||
entry("htdocsfallback", false),
|
entry("htdocsfallback", false),
|
||||||
@ -276,7 +276,7 @@ public class HsHostingAssetControllerRestTest {
|
|||||||
[
|
[
|
||||||
{
|
{
|
||||||
"type": "DOMAIN_HTTP_SETUP",
|
"type": "DOMAIN_HTTP_SETUP",
|
||||||
"identifier": "example.org",
|
"identifier": "example.org|HTTP",
|
||||||
"caption": "some fake Domain-HTTP-Setup",
|
"caption": "some fake Domain-HTTP-Setup",
|
||||||
"alarmContact": null,
|
"alarmContact": null,
|
||||||
"config": {
|
"config": {
|
||||||
@ -299,6 +299,70 @@ public class HsHostingAssetControllerRestTest {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
"""),
|
||||||
|
DOMAIN_SMTP_SETUP(
|
||||||
|
List.of(
|
||||||
|
HsHostingAssetEntity.builder()
|
||||||
|
.type(HsHostingAssetType.DOMAIN_SMTP_SETUP)
|
||||||
|
.identifier("example.org|SMTP")
|
||||||
|
.caption("some fake Domain-SMTP-Setup")
|
||||||
|
.build()),
|
||||||
|
"""
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"type": "DOMAIN_SMTP_SETUP",
|
||||||
|
"identifier": "example.org|SMTP",
|
||||||
|
"caption": "some fake Domain-SMTP-Setup",
|
||||||
|
"alarmContact": null,
|
||||||
|
"config": {}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
"""),
|
||||||
|
DOMAIN_MBOX_SETUP(
|
||||||
|
List.of(
|
||||||
|
HsHostingAssetEntity.builder()
|
||||||
|
.type(HsHostingAssetType.DOMAIN_MBOX_SETUP)
|
||||||
|
.identifier("example.org|MBOX")
|
||||||
|
.caption("some fake Domain-MBOX-Setup")
|
||||||
|
.build()),
|
||||||
|
"""
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"type": "DOMAIN_MBOX_SETUP",
|
||||||
|
"identifier": "example.org|MBOX",
|
||||||
|
"caption": "some fake Domain-MBOX-Setup",
|
||||||
|
"alarmContact": null,
|
||||||
|
"config": {}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
"""),
|
||||||
|
EMAIL_ADDRESS(
|
||||||
|
List.of(
|
||||||
|
HsHostingAssetEntity.builder()
|
||||||
|
.type(HsHostingAssetType.EMAIL_ADDRESS)
|
||||||
|
.parentAsset(HsHostingAssetEntity.builder()
|
||||||
|
.type(HsHostingAssetType.DOMAIN_MBOX_SETUP)
|
||||||
|
.identifier("example.org|MBOX")
|
||||||
|
.caption("some fake Domain-MBOX-Setup")
|
||||||
|
.build())
|
||||||
|
.identifier("office@example.org")
|
||||||
|
.caption("some fake EMail-Address")
|
||||||
|
.config(Map.ofEntries(
|
||||||
|
entry("target", Array.of("xyz00", "xyz00-abc", "office@example.com"))
|
||||||
|
))
|
||||||
|
.build()),
|
||||||
|
"""
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"type": "EMAIL_ADDRESS",
|
||||||
|
"identifier": "office@example.org",
|
||||||
|
"caption": "some fake EMail-Address",
|
||||||
|
"alarmContact": null,
|
||||||
|
"config": {
|
||||||
|
"target": ["xyz00","xyz00-abc","office@example.com"]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
""");
|
""");
|
||||||
|
|
||||||
final HsHostingAssetType assetType;
|
final HsHostingAssetType assetType;
|
||||||
|
@ -38,7 +38,10 @@ class HsHostingAssetPropsControllerAcceptanceTest {
|
|||||||
"EMAIL_ALIAS",
|
"EMAIL_ALIAS",
|
||||||
"DOMAIN_SETUP",
|
"DOMAIN_SETUP",
|
||||||
"DOMAIN_DNS_SETUP",
|
"DOMAIN_DNS_SETUP",
|
||||||
"DOMAIN_HTTP_SETUP"
|
"DOMAIN_HTTP_SETUP",
|
||||||
|
"DOMAIN_SMTP_SETUP",
|
||||||
|
"DOMAIN_MBOX_SETUP",
|
||||||
|
"EMAIL_ADDRESS"
|
||||||
]
|
]
|
||||||
"""));
|
"""));
|
||||||
// @formatter:on
|
// @formatter:on
|
||||||
|
@ -25,8 +25,6 @@ class HsHostingAssetTypeUnitTest {
|
|||||||
entity BI_CLOUD_SERVER
|
entity BI_CLOUD_SERVER
|
||||||
entity BI_MANAGED_SERVER
|
entity BI_MANAGED_SERVER
|
||||||
entity BI_MANAGED_WEBSPACE
|
entity BI_MANAGED_WEBSPACE
|
||||||
entity BI_DOMAIN_DNS_SETUP
|
|
||||||
entity BI_DOMAIN_EMAIL_SUBMISSION_SETUP
|
|
||||||
}
|
}
|
||||||
|
|
||||||
package Hosting #feb28c{
|
package Hosting #feb28c{
|
||||||
@ -34,8 +32,8 @@ class HsHostingAssetTypeUnitTest {
|
|||||||
entity HA_DOMAIN_SETUP
|
entity HA_DOMAIN_SETUP
|
||||||
entity HA_DOMAIN_DNS_SETUP
|
entity HA_DOMAIN_DNS_SETUP
|
||||||
entity HA_DOMAIN_HTTP_SETUP
|
entity HA_DOMAIN_HTTP_SETUP
|
||||||
entity HA_DOMAIN_EMAIL_SUBMISSION_SETUP
|
entity HA_DOMAIN_SMTP_SETUP
|
||||||
entity HA_DOMAIN_EMAIL_MAILBOX_SETUP
|
entity HA_DOMAIN_MBOX_SETUP
|
||||||
entity HA_EMAIL_ADDRESS
|
entity HA_EMAIL_ADDRESS
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -62,16 +60,17 @@ class HsHostingAssetTypeUnitTest {
|
|||||||
HA_MANAGED_WEBSPACE *==> BI_MANAGED_WEBSPACE
|
HA_MANAGED_WEBSPACE *==> BI_MANAGED_WEBSPACE
|
||||||
HA_MANAGED_WEBSPACE o..> HA_MANAGED_SERVER
|
HA_MANAGED_WEBSPACE o..> HA_MANAGED_SERVER
|
||||||
HA_UNIX_USER *==> HA_MANAGED_WEBSPACE
|
HA_UNIX_USER *==> HA_MANAGED_WEBSPACE
|
||||||
|
HA_EMAIL_ALIAS *==> HA_MANAGED_WEBSPACE
|
||||||
HA_DOMAIN_SETUP o..> HA_DOMAIN_SETUP
|
HA_DOMAIN_SETUP o..> HA_DOMAIN_SETUP
|
||||||
HA_DOMAIN_DNS_SETUP *==> HA_DOMAIN_SETUP
|
HA_DOMAIN_DNS_SETUP *==> HA_DOMAIN_SETUP
|
||||||
|
HA_DOMAIN_DNS_SETUP o..> HA_MANAGED_WEBSPACE
|
||||||
HA_DOMAIN_HTTP_SETUP *==> HA_DOMAIN_SETUP
|
HA_DOMAIN_HTTP_SETUP *==> HA_DOMAIN_SETUP
|
||||||
HA_DOMAIN_HTTP_SETUP o..> HA_UNIX_USER
|
HA_DOMAIN_HTTP_SETUP o..> HA_UNIX_USER
|
||||||
HA_DOMAIN_EMAIL_SUBMISSION_SETUP *==> HA_DOMAIN_SETUP
|
HA_DOMAIN_SMTP_SETUP *==> HA_DOMAIN_SETUP
|
||||||
HA_DOMAIN_EMAIL_SUBMISSION_SETUP o..> HA_MANAGED_WEBSPACE
|
HA_DOMAIN_SMTP_SETUP o..> HA_MANAGED_WEBSPACE
|
||||||
HA_DOMAIN_EMAIL_MAILBOX_SETUP *==> HA_DOMAIN_SETUP
|
HA_DOMAIN_MBOX_SETUP *==> HA_DOMAIN_SETUP
|
||||||
HA_DOMAIN_EMAIL_MAILBOX_SETUP o..> HA_MANAGED_WEBSPACE
|
HA_DOMAIN_MBOX_SETUP o..> HA_MANAGED_WEBSPACE
|
||||||
HA_EMAIL_ALIAS *==> HA_MANAGED_WEBSPACE
|
HA_EMAIL_ADDRESS *==> HA_DOMAIN_MBOX_SETUP
|
||||||
HA_EMAIL_ADDRESS *==> HA_DOMAIN_EMAIL_MAILBOX_SETUP
|
|
||||||
HA_IP_NUMBER o..> HA_CLOUD_SERVER
|
HA_IP_NUMBER o..> HA_CLOUD_SERVER
|
||||||
HA_IP_NUMBER o..> HA_MANAGED_SERVER
|
HA_IP_NUMBER o..> HA_MANAGED_SERVER
|
||||||
HA_IP_NUMBER o..> HA_MANAGED_WEBSPACE
|
HA_IP_NUMBER o..> HA_MANAGED_WEBSPACE
|
||||||
@ -96,8 +95,6 @@ class HsHostingAssetTypeUnitTest {
|
|||||||
entity BI_CLOUD_SERVER
|
entity BI_CLOUD_SERVER
|
||||||
entity BI_MANAGED_SERVER
|
entity BI_MANAGED_SERVER
|
||||||
entity BI_MANAGED_WEBSPACE
|
entity BI_MANAGED_WEBSPACE
|
||||||
entity BI_DOMAIN_DNS_SETUP
|
|
||||||
entity BI_DOMAIN_EMAIL_SUBMISSION_SETUP
|
|
||||||
}
|
}
|
||||||
|
|
||||||
package Hosting #feb28c{
|
package Hosting #feb28c{
|
||||||
@ -160,8 +157,6 @@ class HsHostingAssetTypeUnitTest {
|
|||||||
entity BI_CLOUD_SERVER
|
entity BI_CLOUD_SERVER
|
||||||
entity BI_MANAGED_SERVER
|
entity BI_MANAGED_SERVER
|
||||||
entity BI_MANAGED_WEBSPACE
|
entity BI_MANAGED_WEBSPACE
|
||||||
entity BI_DOMAIN_DNS_SETUP
|
|
||||||
entity BI_DOMAIN_EMAIL_SUBMISSION_SETUP
|
|
||||||
}
|
}
|
||||||
|
|
||||||
package Hosting #feb28c{
|
package Hosting #feb28c{
|
||||||
|
@ -36,7 +36,10 @@ class HostingAssetEntityValidatorRegistryUnitTest {
|
|||||||
HsHostingAssetType.EMAIL_ALIAS,
|
HsHostingAssetType.EMAIL_ALIAS,
|
||||||
HsHostingAssetType.DOMAIN_SETUP,
|
HsHostingAssetType.DOMAIN_SETUP,
|
||||||
HsHostingAssetType.DOMAIN_DNS_SETUP,
|
HsHostingAssetType.DOMAIN_DNS_SETUP,
|
||||||
HsHostingAssetType.DOMAIN_HTTP_SETUP
|
HsHostingAssetType.DOMAIN_HTTP_SETUP,
|
||||||
|
HsHostingAssetType.DOMAIN_SMTP_SETUP,
|
||||||
|
HsHostingAssetType.DOMAIN_MBOX_SETUP,
|
||||||
|
HsHostingAssetType.EMAIL_ADDRESS
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -12,6 +12,7 @@ import java.util.Map;
|
|||||||
import static java.util.Map.entry;
|
import static java.util.Map.entry;
|
||||||
import static net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetType.DOMAIN_DNS_SETUP;
|
import static net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetType.DOMAIN_DNS_SETUP;
|
||||||
import static net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetType.DOMAIN_SETUP;
|
import static net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetType.DOMAIN_SETUP;
|
||||||
|
import static net.hostsharing.hsadminng.hs.hosting.asset.TestHsHostingAssetEntities.TEST_MANAGED_WEBSPACE_HOSTING_ASSET;
|
||||||
import static net.hostsharing.hsadminng.hs.hosting.asset.validators.HsDomainDnsSetupHostingAssetValidator.RR_COMMENT;
|
import static net.hostsharing.hsadminng.hs.hosting.asset.validators.HsDomainDnsSetupHostingAssetValidator.RR_COMMENT;
|
||||||
import static net.hostsharing.hsadminng.hs.hosting.asset.validators.HsDomainDnsSetupHostingAssetValidator.RR_RECORD_DATA;
|
import static net.hostsharing.hsadminng.hs.hosting.asset.validators.HsDomainDnsSetupHostingAssetValidator.RR_RECORD_DATA;
|
||||||
import static net.hostsharing.hsadminng.hs.hosting.asset.validators.HsDomainDnsSetupHostingAssetValidator.RR_RECORD_TYPE;
|
import static net.hostsharing.hsadminng.hs.hosting.asset.validators.HsDomainDnsSetupHostingAssetValidator.RR_RECORD_TYPE;
|
||||||
@ -23,14 +24,15 @@ import static org.assertj.core.api.Assertions.assertThat;
|
|||||||
class HsDomainDnsSetupHostingAssetValidatorUnitTest {
|
class HsDomainDnsSetupHostingAssetValidatorUnitTest {
|
||||||
|
|
||||||
static final HsHostingAssetEntity validDomainSetupEntity = HsHostingAssetEntity.builder()
|
static final HsHostingAssetEntity validDomainSetupEntity = HsHostingAssetEntity.builder()
|
||||||
.type(DOMAIN_SETUP)
|
.type(DOMAIN_SETUP)
|
||||||
.identifier("example.org")
|
.identifier("example.org")
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
static HsHostingAssetEntityBuilder validEntityBuilder() {
|
static HsHostingAssetEntityBuilder validEntityBuilder() {
|
||||||
return HsHostingAssetEntity.builder()
|
return HsHostingAssetEntity.builder()
|
||||||
.type(DOMAIN_DNS_SETUP)
|
.type(DOMAIN_DNS_SETUP)
|
||||||
.parentAsset(validDomainSetupEntity)
|
.parentAsset(validDomainSetupEntity)
|
||||||
|
.assignedToAsset(TEST_MANAGED_WEBSPACE_HOSTING_ASSET)
|
||||||
.identifier("example.org|DNS")
|
.identifier("example.org|DNS")
|
||||||
.config(Map.ofEntries(
|
.config(Map.ofEntries(
|
||||||
entry("user-RR", Array.of(
|
entry("user-RR", Array.of(
|
||||||
@ -95,7 +97,7 @@ class HsDomainDnsSetupHostingAssetValidatorUnitTest {
|
|||||||
|
|
||||||
// then
|
// then
|
||||||
assertThat(result).containsExactly(
|
assertThat(result).containsExactly(
|
||||||
"'identifier' expected to match '^example.org\\Q|DNS\\E$', but is 'example.org'"
|
"'identifier' expected to match '^\\Qexample.org|DNS\\E$', but is 'example.org'"
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -129,7 +131,7 @@ class HsDomainDnsSetupHostingAssetValidatorUnitTest {
|
|||||||
assertThat(result).containsExactlyInAnyOrder(
|
assertThat(result).containsExactlyInAnyOrder(
|
||||||
"'DOMAIN_DNS_SETUP:example.org|DNS.bookingItem' must be null but is of type CLOUD_SERVER",
|
"'DOMAIN_DNS_SETUP:example.org|DNS.bookingItem' must be null but is of type CLOUD_SERVER",
|
||||||
"'DOMAIN_DNS_SETUP:example.org|DNS.parentAsset' must be of type DOMAIN_SETUP but is null",
|
"'DOMAIN_DNS_SETUP:example.org|DNS.parentAsset' must be of type DOMAIN_SETUP but is null",
|
||||||
"'DOMAIN_DNS_SETUP:example.org|DNS.assignedToAsset' must be null but is of type DOMAIN_SETUP");
|
"'DOMAIN_DNS_SETUP:example.org|DNS.assignedToAsset' must be of type MANAGED_WEBSPACE but is of type DOMAIN_SETUP");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -87,7 +87,7 @@ class HsDomainHttpSetupHostingAssetValidatorUnitTest {
|
|||||||
|
|
||||||
// then
|
// then
|
||||||
assertThat(result).containsExactly(
|
assertThat(result).containsExactly(
|
||||||
"'identifier' expected to match '^example.org\\Q|HTTP\\E$', but is 'example.org'"
|
"'identifier' expected to match '^\\Qexample.org|HTTP\\E$', but is 'example.org'"
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -0,0 +1,133 @@
|
|||||||
|
package net.hostsharing.hsadminng.hs.hosting.asset.validators;
|
||||||
|
|
||||||
|
import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemEntity;
|
||||||
|
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 org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import static java.util.Map.entry;
|
||||||
|
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.MANAGED_WEBSPACE;
|
||||||
|
import static org.assertj.core.api.Assertions.assertThat;
|
||||||
|
|
||||||
|
class HsDomainMboxHostingAssetValidatorUnitTest {
|
||||||
|
|
||||||
|
static final HsHostingAssetEntity validDomainSetupEntity = HsHostingAssetEntity.builder()
|
||||||
|
.type(DOMAIN_SETUP)
|
||||||
|
.identifier("example.org")
|
||||||
|
.build();
|
||||||
|
|
||||||
|
static HsHostingAssetEntityBuilder validEntityBuilder() {
|
||||||
|
return HsHostingAssetEntity.builder()
|
||||||
|
.type(DOMAIN_MBOX_SETUP)
|
||||||
|
.parentAsset(validDomainSetupEntity)
|
||||||
|
.assignedToAsset(HsHostingAssetEntity.builder().type(MANAGED_WEBSPACE).build())
|
||||||
|
.identifier("example.org|MBOX");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void containsExpectedProperties() {
|
||||||
|
// when
|
||||||
|
final var validator = HostingAssetEntityValidatorRegistry.forType(DOMAIN_MBOX_SETUP);
|
||||||
|
|
||||||
|
// then
|
||||||
|
assertThat(validator.properties()).map(Map::toString).isEmpty();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void preprocessesTakesIdentifierFromParent() {
|
||||||
|
// given
|
||||||
|
final var givenEntity = validEntityBuilder().build();
|
||||||
|
assertThat(givenEntity.getParentAsset().getIdentifier()).as("precondition failed").isEqualTo("example.org");
|
||||||
|
final var validator = HostingAssetEntityValidatorRegistry.forType(givenEntity.getType());
|
||||||
|
|
||||||
|
// when
|
||||||
|
validator.preprocessEntity(givenEntity);
|
||||||
|
|
||||||
|
// then
|
||||||
|
assertThat(givenEntity.getIdentifier()).isEqualTo("example.org|MBOX");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void rejectsInvalidIdentifier() {
|
||||||
|
// given
|
||||||
|
final var givenEntity = validEntityBuilder().identifier("example.org").build();
|
||||||
|
final var validator = HostingAssetEntityValidatorRegistry.forType(givenEntity.getType());
|
||||||
|
|
||||||
|
// when
|
||||||
|
final var result = validator.validateEntity(givenEntity);
|
||||||
|
|
||||||
|
// then
|
||||||
|
assertThat(result).containsExactly(
|
||||||
|
"'identifier' expected to match '^\\Qexample.org|MBOX\\E$', but is 'example.org'"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void acceptsValidIdentifier() {
|
||||||
|
// given
|
||||||
|
final var givenEntity = validEntityBuilder().identifier(validDomainSetupEntity.getIdentifier()+"|MBOX").build();
|
||||||
|
final var validator = HostingAssetEntityValidatorRegistry.forType(givenEntity.getType());
|
||||||
|
|
||||||
|
// when
|
||||||
|
final var result = validator.validateEntity(givenEntity);
|
||||||
|
|
||||||
|
// then
|
||||||
|
assertThat(result).isEmpty();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void rejectsInvalidReferencedEntities() {
|
||||||
|
// given
|
||||||
|
final var mangedServerHostingAssetEntity = validEntityBuilder()
|
||||||
|
.bookingItem(HsBookingItemEntity.builder().type(HsBookingItemType.CLOUD_SERVER).build())
|
||||||
|
.parentAsset(HsHostingAssetEntity.builder().type(MANAGED_WEBSPACE).build())
|
||||||
|
.assignedToAsset(null)
|
||||||
|
.build();
|
||||||
|
final var validator = HostingAssetEntityValidatorRegistry.forType(mangedServerHostingAssetEntity.getType());
|
||||||
|
|
||||||
|
// when
|
||||||
|
final var result = validator.validateEntity(mangedServerHostingAssetEntity);
|
||||||
|
|
||||||
|
// then
|
||||||
|
assertThat(result).containsExactlyInAnyOrder(
|
||||||
|
"'DOMAIN_MBOX_SETUP:example.org|MBOX.bookingItem' must be null but is of type CLOUD_SERVER",
|
||||||
|
"'DOMAIN_MBOX_SETUP:example.org|MBOX.parentAsset' must be of type DOMAIN_SETUP but is of type MANAGED_WEBSPACE",
|
||||||
|
"'DOMAIN_MBOX_SETUP:example.org|MBOX.assignedToAsset' must be of type MANAGED_WEBSPACE but is null");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void acceptsValidEntity() {
|
||||||
|
// given
|
||||||
|
final var givenEntity = validEntityBuilder().build();
|
||||||
|
final var validator = HostingAssetEntityValidatorRegistry.forType(givenEntity.getType());
|
||||||
|
|
||||||
|
// when
|
||||||
|
final var errors = validator.validateEntity(givenEntity);
|
||||||
|
|
||||||
|
// then
|
||||||
|
assertThat(errors).isEmpty();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void rejectsInvalidProperties() {
|
||||||
|
// given
|
||||||
|
final var mangedServerHostingAssetEntity = validEntityBuilder()
|
||||||
|
.config(Map.ofEntries(
|
||||||
|
entry("any", "false")
|
||||||
|
))
|
||||||
|
.build();
|
||||||
|
final var validator = HostingAssetEntityValidatorRegistry.forType(mangedServerHostingAssetEntity.getType());
|
||||||
|
|
||||||
|
// when
|
||||||
|
final var result = validator.validateEntity(mangedServerHostingAssetEntity);
|
||||||
|
|
||||||
|
// then
|
||||||
|
assertThat(result).containsExactlyInAnyOrder(
|
||||||
|
"'DOMAIN_MBOX_SETUP:example.org|MBOX.config.any' is not expected but is set to 'false'");
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,133 @@
|
|||||||
|
package net.hostsharing.hsadminng.hs.hosting.asset.validators;
|
||||||
|
|
||||||
|
import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemEntity;
|
||||||
|
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 org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import static java.util.Map.entry;
|
||||||
|
import static net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetType.DOMAIN_SMTP_SETUP;
|
||||||
|
import static net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetType.DOMAIN_SETUP;
|
||||||
|
import static net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetType.MANAGED_WEBSPACE;
|
||||||
|
import static org.assertj.core.api.Assertions.assertThat;
|
||||||
|
|
||||||
|
class HsDomainSmtpSetupHostingAssetValidatorUnitTest {
|
||||||
|
|
||||||
|
static final HsHostingAssetEntity validDomainSetupEntity = HsHostingAssetEntity.builder()
|
||||||
|
.type(DOMAIN_SETUP)
|
||||||
|
.identifier("example.org")
|
||||||
|
.build();
|
||||||
|
|
||||||
|
static HsHostingAssetEntityBuilder validEntityBuilder() {
|
||||||
|
return HsHostingAssetEntity.builder()
|
||||||
|
.type(DOMAIN_SMTP_SETUP)
|
||||||
|
.parentAsset(validDomainSetupEntity)
|
||||||
|
.assignedToAsset(HsHostingAssetEntity.builder().type(MANAGED_WEBSPACE).build())
|
||||||
|
.identifier("example.org|SMTP");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void containsExpectedProperties() {
|
||||||
|
// when
|
||||||
|
final var validator = HostingAssetEntityValidatorRegistry.forType(DOMAIN_SMTP_SETUP);
|
||||||
|
|
||||||
|
// then
|
||||||
|
assertThat(validator.properties()).map(Map::toString).isEmpty();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void preprocessesTakesIdentifierFromParent() {
|
||||||
|
// given
|
||||||
|
final var givenEntity = validEntityBuilder().build();
|
||||||
|
assertThat(givenEntity.getParentAsset().getIdentifier()).as("precondition failed").isEqualTo("example.org");
|
||||||
|
final var validator = HostingAssetEntityValidatorRegistry.forType(givenEntity.getType());
|
||||||
|
|
||||||
|
// when
|
||||||
|
validator.preprocessEntity(givenEntity);
|
||||||
|
|
||||||
|
// then
|
||||||
|
assertThat(givenEntity.getIdentifier()).isEqualTo("example.org|SMTP");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void rejectsInvalidIdentifier() {
|
||||||
|
// given
|
||||||
|
final var givenEntity = validEntityBuilder().identifier("example.org").build();
|
||||||
|
final var validator = HostingAssetEntityValidatorRegistry.forType(givenEntity.getType());
|
||||||
|
|
||||||
|
// when
|
||||||
|
final var result = validator.validateEntity(givenEntity);
|
||||||
|
|
||||||
|
// then
|
||||||
|
assertThat(result).containsExactly(
|
||||||
|
"'identifier' expected to match '^\\Qexample.org|SMTP\\E$', but is 'example.org'"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void acceptsValidIdentifier() {
|
||||||
|
// given
|
||||||
|
final var givenEntity = validEntityBuilder().identifier(validDomainSetupEntity.getIdentifier()+"|SMTP").build();
|
||||||
|
final var validator = HostingAssetEntityValidatorRegistry.forType(givenEntity.getType());
|
||||||
|
|
||||||
|
// when
|
||||||
|
final var result = validator.validateEntity(givenEntity);
|
||||||
|
|
||||||
|
// then
|
||||||
|
assertThat(result).isEmpty();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void rejectsInvalidReferencedEntities() {
|
||||||
|
// given
|
||||||
|
final var mangedServerHostingAssetEntity = validEntityBuilder()
|
||||||
|
.bookingItem(HsBookingItemEntity.builder().type(HsBookingItemType.CLOUD_SERVER).build())
|
||||||
|
.parentAsset(HsHostingAssetEntity.builder().type(MANAGED_WEBSPACE).build())
|
||||||
|
.assignedToAsset(null)
|
||||||
|
.build();
|
||||||
|
final var validator = HostingAssetEntityValidatorRegistry.forType(mangedServerHostingAssetEntity.getType());
|
||||||
|
|
||||||
|
// when
|
||||||
|
final var result = validator.validateEntity(mangedServerHostingAssetEntity);
|
||||||
|
|
||||||
|
// then
|
||||||
|
assertThat(result).containsExactlyInAnyOrder(
|
||||||
|
"'DOMAIN_SMTP_SETUP:example.org|SMTP.bookingItem' must be null but is of type CLOUD_SERVER",
|
||||||
|
"'DOMAIN_SMTP_SETUP:example.org|SMTP.parentAsset' must be of type DOMAIN_SETUP but is of type MANAGED_WEBSPACE",
|
||||||
|
"'DOMAIN_SMTP_SETUP:example.org|SMTP.assignedToAsset' must be of type MANAGED_WEBSPACE but is null");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void acceptsValidEntity() {
|
||||||
|
// given
|
||||||
|
final var givenEntity = validEntityBuilder().build();
|
||||||
|
final var validator = HostingAssetEntityValidatorRegistry.forType(givenEntity.getType());
|
||||||
|
|
||||||
|
// when
|
||||||
|
final var errors = validator.validateEntity(givenEntity);
|
||||||
|
|
||||||
|
// then
|
||||||
|
assertThat(errors).isEmpty();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void rejectsInvalidProperties() {
|
||||||
|
// given
|
||||||
|
final var mangedServerHostingAssetEntity = validEntityBuilder()
|
||||||
|
.config(Map.ofEntries(
|
||||||
|
entry("any", "false")
|
||||||
|
))
|
||||||
|
.build();
|
||||||
|
final var validator = HostingAssetEntityValidatorRegistry.forType(mangedServerHostingAssetEntity.getType());
|
||||||
|
|
||||||
|
// when
|
||||||
|
final var result = validator.validateEntity(mangedServerHostingAssetEntity);
|
||||||
|
|
||||||
|
// then
|
||||||
|
assertThat(result).containsExactlyInAnyOrder(
|
||||||
|
"'DOMAIN_SMTP_SETUP:example.org|SMTP.config.any' is not expected but is set to 'false'");
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,114 @@
|
|||||||
|
package net.hostsharing.hsadminng.hs.hosting.asset.validators;
|
||||||
|
|
||||||
|
import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetEntity;
|
||||||
|
import net.hostsharing.hsadminng.mapper.Array;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import static java.util.Map.entry;
|
||||||
|
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 org.assertj.core.api.Assertions.assertThat;
|
||||||
|
|
||||||
|
class HsEMailAddressHostingAssetValidatorUnitTest {
|
||||||
|
|
||||||
|
final static HsHostingAssetEntity domainMboxetup = HsHostingAssetEntity.builder()
|
||||||
|
.type(DOMAIN_MBOX_SETUP)
|
||||||
|
.identifier("example.org")
|
||||||
|
.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"))
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void containsAllValidations() {
|
||||||
|
// when
|
||||||
|
final var validator = HostingAssetEntityValidatorRegistry.forType(EMAIL_ADDRESS);
|
||||||
|
|
||||||
|
// 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-zA-Z0-9_!#$%&'*+/=?`{|}~^.-]+@[a-zA-Z0-9.-]+$], maxLength=320}, required=true, minLength=1}");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void acceptsValidEntity() {
|
||||||
|
// given
|
||||||
|
final var emailAddressHostingAssetEntity = validEntityBuilder().build();
|
||||||
|
final var validator = HostingAssetEntityValidatorRegistry.forType(emailAddressHostingAssetEntity.getType());
|
||||||
|
|
||||||
|
// when
|
||||||
|
final var result = validator.validateEntity(emailAddressHostingAssetEntity);
|
||||||
|
|
||||||
|
// then
|
||||||
|
assertThat(result).isEmpty();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void rejectsInvalidProperties() {
|
||||||
|
// given
|
||||||
|
final var emailAddressHostingAssetEntity = validEntityBuilder()
|
||||||
|
.config(Map.ofEntries(
|
||||||
|
entry("local-part", "no@allowed"),
|
||||||
|
entry("sub-domain", "no@allowedeither"),
|
||||||
|
entry("target", Array.of("xyz00", "xyz00-abc", "garbage", "office@example.com"))))
|
||||||
|
.build();
|
||||||
|
final var validator = HostingAssetEntityValidatorRegistry.forType(emailAddressHostingAssetEntity.getType());
|
||||||
|
|
||||||
|
// when
|
||||||
|
final var result = validator.validateEntity(emailAddressHostingAssetEntity);
|
||||||
|
|
||||||
|
// 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-zA-Z0-9_!#$%&'*+/=?`{|}~^.-]+@[a-zA-Z0-9.-]+$] but 'garbage' does not match any");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void rejectsInvalidIdentifier() {
|
||||||
|
// given
|
||||||
|
final var emailAddressHostingAssetEntity = validEntityBuilder()
|
||||||
|
.identifier("abc00-office")
|
||||||
|
.build();
|
||||||
|
final var validator = HostingAssetEntityValidatorRegistry.forType(emailAddressHostingAssetEntity.getType());
|
||||||
|
|
||||||
|
// when
|
||||||
|
final var result = validator.validateEntity(emailAddressHostingAssetEntity);
|
||||||
|
|
||||||
|
// then
|
||||||
|
assertThat(result).containsExactlyInAnyOrder(
|
||||||
|
"'identifier' expected to match '^\\Qtest@example.org\\E$', but is 'abc00-office'");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void validatesInvalidReferences() {
|
||||||
|
// given
|
||||||
|
final var emailAddressHostingAssetEntity = validEntityBuilder()
|
||||||
|
.bookingItem(TEST_MANAGED_SERVER_BOOKING_ITEM)
|
||||||
|
.parentAsset(TEST_MANAGED_SERVER_HOSTING_ASSET)
|
||||||
|
.assignedToAsset(TEST_MANAGED_SERVER_HOSTING_ASSET)
|
||||||
|
.build();
|
||||||
|
final var validator = HostingAssetEntityValidatorRegistry.forType(emailAddressHostingAssetEntity.getType());
|
||||||
|
|
||||||
|
// when
|
||||||
|
final var result = validator.validateEntity(emailAddressHostingAssetEntity);
|
||||||
|
|
||||||
|
// 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");
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user
auch kürzere Namen