add Mermaid graph generator for HostingAssetType structure (WIP)

This commit is contained in:
Michael Hoennig 2024-07-05 11:58:04 +02:00
parent f6d66d5712
commit 1fb4451b80
5 changed files with 263 additions and 18 deletions

View File

@ -0,0 +1,77 @@
### HostingAsset Type Structure
This code generated was by HsHostingAssetType.main, do not amend manually.
```mermaid
%%{init:{'flowchart':{'htmlLabels':false}}}%%
flowchart LR
subgraph MARIADB[ ]
style MARIADB fill:white,stroke:white,stroke-width:0px
HA:MARIADB_INSTANCE
HA:MARIADB_USER
HA:MARIADB_DATABASE
end
subgraph PGSQL[ ]
style PGSQL fill:white,stroke:white,stroke-width:0px
HA:PGSQL_INSTANCE
HA:PGSQL_USER
HA:PGSQL_DATABASE
end
subgraph DOMAIN_SETUP[ ]
style DOMAIN_SETUP fill:white,stroke:white,stroke-width:0px
HA:DOMAIN_SETUP
HA:DOMAIN_DNS_SETUP
HA:DOMAIN_HTTP_SETUP
end
subgraph EMAIL[ ]
style EMAIL fill:white,stroke:white,stroke-width:0px
HA:DOMAIN_EMAIL_SUBMISSION_SETUP
HA:DOMAIN_EMAIL_MAILBOX_SETUP
HA:EMAIL_ADDRESS
end
style HA:CLOUD_SERVER fill:#99bcdb,stroke:#274d6e,stroke-width:4px
style HA:MANAGED_SERVER fill:#99bcdb,stroke:#274d6e,stroke-width:4px
style HA:MANAGED_WEBSPACE fill:#99bcdb,stroke:#274d6e,stroke-width:4px
style HA:UNIX_USER fill:#99bcdb,stroke:#274d6e,stroke-width:4px
style HA:DOMAIN_SETUP fill:#99bcdb,stroke:#274d6e,stroke-width:4px
style HA:DOMAIN_DNS_SETUP fill:#99bcdb,stroke:#274d6e,stroke-width:4px
style HA:DOMAIN_HTTP_SETUP fill:#99bcdb,stroke:#274d6e,stroke-width:4px
style HA:DOMAIN_EMAIL_SUBMISSION_SETUP fill:#99bcdb,stroke:#274d6e,stroke-width:4px
style HA:DOMAIN_EMAIL_MAILBOX_SETUP fill:#99bcdb,stroke:#274d6e,stroke-width:4px
style HA:EMAIL_ALIAS fill:#99bcdb,stroke:#274d6e,stroke-width:4px
style HA:EMAIL_ADDRESS fill:#99bcdb,stroke:#274d6e,stroke-width:4px
style HA:PGSQL_INSTANCE fill:#99bcdb,stroke:#274d6e,stroke-width:4px
style HA:PGSQL_USER fill:#99bcdb,stroke:#274d6e,stroke-width:4px
style HA:PGSQL_DATABASE fill:#99bcdb,stroke:#274d6e,stroke-width:4px
style HA:MARIADB_INSTANCE fill:#99bcdb,stroke:#274d6e,stroke-width:4px
style HA:MARIADB_USER fill:#99bcdb,stroke:#274d6e,stroke-width:4px
style HA:MARIADB_DATABASE fill:#99bcdb,stroke:#274d6e,stroke-width:4px
BI:CLOUD_SERVER --> HA:CLOUD_SERVER
BI:MANAGED_SERVER --> HA:MANAGED_SERVER
BI:MANAGED_WEBSPACE --> HA:MANAGED_WEBSPACE
HA:MANAGED_SERVER ==> HA:MANAGED_WEBSPACE
HA:MANAGED_WEBSPACE ==> HA:UNIX_USER
HA:DOMAIN_SETUP ==> HA:DOMAIN_DNS_SETUP
HA:DOMAIN_SETUP ==> HA:DOMAIN_HTTP_SETUP
HA:UNIX_USER -.-> HA:DOMAIN_HTTP_SETUP
HA:DOMAIN_SETUP ==> HA:DOMAIN_EMAIL_SUBMISSION_SETUP
HA:DOMAIN_SETUP ==> HA:DOMAIN_EMAIL_MAILBOX_SETUP
HA:MANAGED_WEBSPACE ==> HA:EMAIL_ALIAS
HA:DOMAIN_EMAIL_MAILBOX_SETUP ==> HA:EMAIL_ADDRESS
HA:MANAGED_SERVER ==> HA:PGSQL_INSTANCE
HA:MANAGED_WEBSPACE ==> HA:PGSQL_USER
HA:PGSQL_INSTANCE -.-> HA:PGSQL_USER
HA:MANAGED_WEBSPACE ==> HA:PGSQL_DATABASE
HA:PGSQL_INSTANCE -.-> HA:PGSQL_DATABASE
HA:MANAGED_WEBSPACE ==> HA:MARIADB_INSTANCE
HA:MANAGED_WEBSPACE ==> HA:MARIADB_USER
HA:MARIADB_INSTANCE -.-> HA:MARIADB_USER
HA:MANAGED_WEBSPACE ==> HA:MARIADB_DATABASE
HA:MARIADB_INSTANCE -.-> HA:MARIADB_DATABASE
```

View File

@ -1,8 +1,51 @@
package net.hostsharing.hsadminng.hs.booking.item;
import static net.hostsharing.hsadminng.hs.booking.item.HsBookingItemTypeOptionRelation.withOptionalParent;
public enum HsBookingItemType {
PRIVATE_CLOUD,
CLOUD_SERVER,
MANAGED_SERVER,
MANAGED_WEBSPACE
CLOUD_SERVER(withOptionalParent(PRIVATE_CLOUD)),
MANAGED_SERVER(withOptionalParent(PRIVATE_CLOUD)),
MANAGED_WEBSPACE(withOptionalParent(MANAGED_SERVER)),
DOMAIN_SETUP; // TODO.spec: experimental
private final HsBookingItemTypeRelation bookingItemTypeRelation;
HsBookingItemType() {
this.bookingItemTypeRelation = null;
}
HsBookingItemType(final HsBookingItemTypeRelation bookingItemTypeRelation) {
this.bookingItemTypeRelation = bookingItemTypeRelation;
}
}
class HsBookingItemTypeRelation {
final HsBookingItemType parentType;
HsBookingItemTypeRelation(final HsBookingItemType parentType) {
this.parentType = parentType;
}
}
class HsBookingItemTypeOptionRelation extends HsBookingItemTypeRelation {
private HsBookingItemTypeOptionRelation(final HsBookingItemType parentType) {
super(parentType);
}
static HsBookingItemTypeRelation withOptionalParent(final HsBookingItemType parentType) {
return new HsBookingItemTypeOptionRelation(parentType);
}
}
class HsBookingItemTypeRequiredRelation extends HsBookingItemTypeRelation {
private HsBookingItemTypeRequiredRelation(final HsBookingItemType parentType) {
super(parentType);
}
static HsBookingItemTypeRelation requiredParent(final HsBookingItemType parentType) {
return new HsBookingItemTypeRequiredRelation(parentType);
}
}

View File

@ -8,7 +8,7 @@ import java.util.List;
import static java.util.Collections.emptyList;
import static java.util.Optional.ofNullable;
import static net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetType.DOMAIN_EMAIL_SETUP;
import static net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAssetType.DOMAIN_EMAIL_MAILBOX_SETUP;
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_USER;
@ -88,7 +88,7 @@ class HsManagedWebspaceBookingItemValidator extends HsBookingItemEntityValidator
return (final HsBookingItemEntity entity, final IntegerProperty prop, final Integer factor) -> {
final var unixUserCount = ofNullable(entity.getRelatedHostingAsset())
.map(ha -> ha.getSubHostingAssets().stream()
.filter(bi -> bi.getType() == DOMAIN_EMAIL_SETUP)
.filter(bi -> bi.getType() == DOMAIN_EMAIL_MAILBOX_SETUP)
.flatMap(domainEMailSetup -> domainEMailSetup.getSubHostingAssets().stream()
.filter(subAsset -> subAsset.getType()==EMAIL_ADDRESS))
.count())

View File

@ -1,33 +1,100 @@
package net.hostsharing.hsadminng.hs.hosting.asset;
import net.hostsharing.hsadminng.hs.booking.item.HsBookingItemType;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.StandardOpenOption;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import static java.util.Arrays.stream;
import static java.util.stream.Collectors.joining;
public enum HsHostingAssetType {
CLOUD_SERVER, // named e.g. vm1234
MANAGED_SERVER, // named e.g. vm1234
MANAGED_WEBSPACE(MANAGED_SERVER), // named eg. xyz00
CLOUD_SERVER(HsBookingItemType.CLOUD_SERVER), // named e.g. vm1234
MANAGED_SERVER(HsBookingItemType.MANAGED_SERVER), // named e.g. vm1234
MANAGED_WEBSPACE(HsBookingItemType.MANAGED_WEBSPACE, MANAGED_SERVER), // named eg. xyz00
UNIX_USER(MANAGED_WEBSPACE), // named e.g. xyz00-abc
DOMAIN_SETUP, // named e.g. example.org
DOMAIN_DNS_SETUP(DOMAIN_SETUP), // named e.g. example.org
DOMAIN_HTTP_SETUP(DOMAIN_SETUP), // named e.g. example.org
DOMAIN_EMAIL_SETUP(DOMAIN_SETUP), // named e.g. example.org
DOMAIN_HTTP_SETUP(DOMAIN_SETUP, UNIX_USER), // named e.g. example.org
DOMAIN_EMAIL_SUBMISSION_SETUP(DOMAIN_SETUP, null), // named e.g. example.org
DOMAIN_EMAIL_MAILBOX_SETUP(DOMAIN_SETUP, null), // named e.g. example.org
// TODO.spec: SECURE_MX
EMAIL_ALIAS(MANAGED_WEBSPACE), // named e.g. xyz00-abc
EMAIL_ADDRESS(DOMAIN_EMAIL_SETUP), // named e.g. sample@example.org
PGSQL_USER(MANAGED_WEBSPACE), // named e.g. xyz00_abc
PGSQL_DATABASE(MANAGED_WEBSPACE), // named e.g. xyz00_abc, TODO.spec: or PGSQL_USER?
MARIADB_USER(MANAGED_WEBSPACE), // named e.g. xyz00_abc
MARIADB_DATABASE(MANAGED_WEBSPACE); // named e.g. xyz00_abc, TODO.spec: or MARIADB_USER?
EMAIL_ADDRESS(DOMAIN_EMAIL_MAILBOX_SETUP), // named e.g. sample@example.org
PGSQL_INSTANCE(MANAGED_SERVER), // named e.g. xyz00_abc
PGSQL_USER(MANAGED_WEBSPACE, PGSQL_INSTANCE), // named e.g. xyz00_abc
PGSQL_DATABASE(MANAGED_WEBSPACE, PGSQL_INSTANCE), // named e.g. xyz00_abc, TODO.spec: or PGSQL_USER?
MARIADB_INSTANCE(MANAGED_WEBSPACE, null), // named e.g. xyz00_abc
MARIADB_USER(MANAGED_WEBSPACE, MARIADB_INSTANCE), // named e.g. xyz00_abc
MARIADB_DATABASE(MANAGED_WEBSPACE, MARIADB_INSTANCE); // named e.g. xyz00_abc, TODO.spec: or MARIADB_USER?
public final HsBookingItemType bookingItemType;
public final HsHostingAssetType parentAssetType;
public final HsHostingAssetType assignedToAssetType;
HsHostingAssetType(final HsHostingAssetType parentAssetType) {
HsHostingAssetType(
final HsBookingItemType bookingItemType,
final HsHostingAssetType parentAssetType,
final HsHostingAssetType assignedToAssetType) {
this.bookingItemType = bookingItemType;
this.parentAssetType = parentAssetType;
this.assignedToAssetType = assignedToAssetType;
}
HsHostingAssetType(
final HsHostingAssetType parentAssetType,
final HsHostingAssetType assignedToAssetType) {
this.bookingItemType = null;
this.parentAssetType = parentAssetType;
this.assignedToAssetType = assignedToAssetType;
}
HsHostingAssetType(
final HsBookingItemType bookingItemType,
final HsHostingAssetType parentAssetType) {
this.bookingItemType = bookingItemType;
this.parentAssetType = parentAssetType;
this.assignedToAssetType = null;
}
HsHostingAssetType(
final HsBookingItemType bookingItemType) {
this.bookingItemType = bookingItemType;
this.parentAssetType = null;
this.assignedToAssetType = null;
}
HsHostingAssetType(
final HsHostingAssetType parentAssetType) {
this.bookingItemType = null;
this.parentAssetType = parentAssetType;
this.assignedToAssetType = null;
}
HsHostingAssetType() {
this(null);
this(null, null, null);
}
private List<String> edges() {
final var edges = new ArrayList<String>();
if (bookingItemType != null) {
edges.add("BI:" + bookingItemType.name() + " --> HA:" + name());
}
if (parentAssetType != null) {
edges.add("HA:" + parentAssetType.name() + " ==> HA:" + name());
}
if (assignedToAssetType != null) {
edges.add("HA:" + assignedToAssetType.name() + " -.-> HA:" + name());
}
return edges;
}
public static <T extends Enum<?>> HsHostingAssetType of(final T value) {
@ -37,4 +104,62 @@ public enum HsHostingAssetType {
static String asString(final HsHostingAssetType type) {
return type == null ? null : type.name();
}
public static void main(final String[] args) throws IOException {
final String hostingAssetNodes = stream(HsHostingAssetType.values())
.map(n -> "style HA:"+n.name()+" fill:#99bcdb,stroke:#274d6e,stroke-width:4px")
.collect(joining("\n"));
final String edges = stream(HsHostingAssetType.values())
.map(HsHostingAssetType::edges)
.flatMap(Collection::stream)
.collect(joining("\n"));
Files.writeString(
Path.of("doc/hs-hosting-asset-type-structure.md"),
"""
### HostingAsset Type Structure
This code generated was by %{this}.main, do not amend manually.
```mermaid
%%{init:{'flowchart':{'htmlLabels':false}}}%%
flowchart LR
subgraph MARIADB[ ]
style MARIADB fill:white,stroke:white,stroke-width:0px
HA:MARIADB_INSTANCE
HA:MARIADB_USER
HA:MARIADB_DATABASE
end
subgraph PGSQL[ ]
style PGSQL fill:white,stroke:white,stroke-width:0px
HA:PGSQL_INSTANCE
HA:PGSQL_USER
HA:PGSQL_DATABASE
end
subgraph DOMAIN_SETUP[ ]
style DOMAIN_SETUP fill:white,stroke:white,stroke-width:0px
HA:DOMAIN_SETUP
HA:DOMAIN_DNS_SETUP
HA:DOMAIN_HTTP_SETUP
end
subgraph EMAIL[ ]
style EMAIL fill:white,stroke:white,stroke-width:0px
HA:DOMAIN_EMAIL_SUBMISSION_SETUP
HA:DOMAIN_EMAIL_MAILBOX_SETUP
HA:EMAIL_ADDRESS
end
%{hosting-asset-nodes}
%{edges}
```
"""
.replace("%{this}", HsHostingAssetType.class.getSimpleName())
.replace("%{hosting-asset-nodes}", hostingAssetNodes)
.replace("%{edges}", edges),
StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING);
}
}

View File

@ -152,7 +152,7 @@ class HsManagedServerBookingItemValidatorUnitTest {
"xyz00_%c%c",
2, HsHostingAssetType.MARIADB_DATABASE
),
generateDomainEmailSetupsWithEMailAddresses(26, HsHostingAssetType.DOMAIN_EMAIL_SETUP,
generateDomainEmailSetupsWithEMailAddresses(26, HsHostingAssetType.DOMAIN_EMAIL_MAILBOX_SETUP,
"%c%c.example.com",
10, HsHostingAssetType.EMAIL_ADDRESS
)