Compare commits
No commits in common. "9a05cad38e6f79fe7329161ab1aa69bcd8010aee" and "89808cecf70479e59e73ae2f55c4741d2f44867e" have entirely different histories.
9a05cad38e
...
89808cecf7
@ -111,23 +111,7 @@ time gw-importHostingAssets
|
|||||||
|
|
||||||
### Fetch the Query Statistics
|
### Fetch the Query Statistics
|
||||||
|
|
||||||
And afterward we can query the statistics in PostgreSQL, e.g.:
|
And afterward we can query the statistics in PostgreSQL:
|
||||||
|
|
||||||
```SQL
|
|
||||||
WITH statements AS (
|
|
||||||
SELECT * FROM pg_stat_statements pss
|
|
||||||
)
|
|
||||||
SELECT calls,
|
|
||||||
total_exec_time::int/(60*1000) as total_exec_time_mins,
|
|
||||||
mean_exec_time::int as mean_exec_time_millis,
|
|
||||||
query
|
|
||||||
FROM statements
|
|
||||||
WHERE calls > 100 AND shared_blks_hit > 0
|
|
||||||
ORDER BY total_exec_time_mins DESC
|
|
||||||
LIMIT 16;
|
|
||||||
```
|
|
||||||
|
|
||||||
### Reset the Query Statistics
|
|
||||||
|
|
||||||
```SQL
|
```SQL
|
||||||
SELECT pg_stat_statements_reset();
|
SELECT pg_stat_statements_reset();
|
||||||
|
@ -4,7 +4,6 @@ import com.opencsv.CSVParserBuilder;
|
|||||||
import com.opencsv.CSVReader;
|
import com.opencsv.CSVReader;
|
||||||
import com.opencsv.CSVReaderBuilder;
|
import com.opencsv.CSVReaderBuilder;
|
||||||
import lombok.SneakyThrows;
|
import lombok.SneakyThrows;
|
||||||
import net.hostsharing.hsadminng.hs.hosting.asset.HsHostingAsset;
|
|
||||||
import net.hostsharing.hsadminng.rbac.context.ContextBasedTest;
|
import net.hostsharing.hsadminng.rbac.context.ContextBasedTest;
|
||||||
import net.hostsharing.hsadminng.rbac.rbacobject.RbacObject;
|
import net.hostsharing.hsadminng.rbac.rbacobject.RbacObject;
|
||||||
import net.hostsharing.hsadminng.rbac.test.JpaAttempt;
|
import net.hostsharing.hsadminng.rbac.test.JpaAttempt;
|
||||||
@ -36,7 +35,6 @@ import java.util.Comparator;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.TreeMap;
|
import java.util.TreeMap;
|
||||||
import java.util.UUID;
|
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
import static java.lang.Boolean.parseBoolean;
|
import static java.lang.Boolean.parseBoolean;
|
||||||
@ -124,9 +122,7 @@ public class CsvDataImport extends ContextBasedTest {
|
|||||||
@SneakyThrows
|
@SneakyThrows
|
||||||
public static String[] parseCsvLine(final String csvLine) {
|
public static String[] parseCsvLine(final String csvLine) {
|
||||||
try (final var reader = new CSVReader(new StringReader(csvLine))) {
|
try (final var reader = new CSVReader(new StringReader(csvLine))) {
|
||||||
return stream(ofNullable(reader.readNext()).orElse(emptyArray(String.class)))
|
return ofNullable(reader.readNext()).orElse(emptyArray(String.class));
|
||||||
.map(String::trim)
|
|
||||||
.toArray(String[]::new);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -142,11 +138,16 @@ public class CsvDataImport extends ContextBasedTest {
|
|||||||
|
|
||||||
public <T extends RbacObject> T persist(final Integer id, final T entity) {
|
public <T extends RbacObject> T persist(final Integer id, final T entity) {
|
||||||
try {
|
try {
|
||||||
if (entity instanceof HsHostingAssetRawEntity ha ) { // && ha.getType() == HsHostingAssetType.EMAIL_ALIAS) {
|
final var asString = entity.toString();
|
||||||
//noinspection unchecked
|
if ( asString.contains("'null null, null'") || asString.equals("person()")) {
|
||||||
return (T) persistViaSql(id, ha);
|
errors.add("skipping to persist empty record-id " + id + " #" + entity.hashCode() + ": " + entity);
|
||||||
|
return entity;
|
||||||
}
|
}
|
||||||
return persistViaEM(id, entity);
|
//System.out.println("persisting #" + entity.hashCode() + ": " + entity);
|
||||||
|
em.persist(entity);
|
||||||
|
// uncomment for debugging purposes
|
||||||
|
// em.flush(); // makes it slow, but produces better error messages
|
||||||
|
// System.out.println("persisted #" + entity.hashCode() + " as " + entity.getUuid());
|
||||||
} catch (Exception exc) {
|
} catch (Exception exc) {
|
||||||
errors.add("failed to persist #" + entity.hashCode() + ": " + entity);
|
errors.add("failed to persist #" + entity.hashCode() + ": " + entity);
|
||||||
errors.add(exc.toString());
|
errors.add(exc.toString());
|
||||||
@ -154,62 +155,6 @@ public class CsvDataImport extends ContextBasedTest {
|
|||||||
return entity;
|
return entity;
|
||||||
}
|
}
|
||||||
|
|
||||||
public <T extends RbacObject> T persistViaEM(final Integer id, final T entity) {
|
|
||||||
//System.out.println("persisting #" + entity.hashCode() + ": " + entity);
|
|
||||||
em.persist(entity);
|
|
||||||
// uncomment for debugging purposes
|
|
||||||
// em.flush(); // makes it slow, but produces better error messages
|
|
||||||
// System.out.println("persisted #" + entity.hashCode() + " as " + entity.getUuid());
|
|
||||||
return entity;
|
|
||||||
}
|
|
||||||
|
|
||||||
@SneakyThrows
|
|
||||||
public RbacObject<HsHostingAsset> persistViaSql(final Integer id, final HsHostingAssetRawEntity entity) {
|
|
||||||
if (entity.getUuid() == null) {
|
|
||||||
entity.setUuid(UUID.randomUUID());
|
|
||||||
}
|
|
||||||
|
|
||||||
final var query = em.createNativeQuery("""
|
|
||||||
insert into hs_hosting_asset(
|
|
||||||
uuid,
|
|
||||||
type,
|
|
||||||
bookingitemuuid,
|
|
||||||
parentassetuuid,
|
|
||||||
assignedtoassetuuid,
|
|
||||||
alarmcontactuuid,
|
|
||||||
identifier,
|
|
||||||
caption,
|
|
||||||
config,
|
|
||||||
version)
|
|
||||||
values (
|
|
||||||
:uuid,
|
|
||||||
:type,
|
|
||||||
:bookingitemuuid,
|
|
||||||
:parentassetuuid,
|
|
||||||
:assignedtoassetuuid,
|
|
||||||
:alarmcontactuuid,
|
|
||||||
:identifier,
|
|
||||||
:caption,
|
|
||||||
cast(:config as jsonb),
|
|
||||||
:version)
|
|
||||||
""")
|
|
||||||
.setParameter("uuid", entity.getUuid())
|
|
||||||
.setParameter("type", entity.getType().name())
|
|
||||||
.setParameter("bookingitemuuid", ofNullable(entity.getBookingItem()).map(RbacObject::getUuid).orElse(null))
|
|
||||||
.setParameter("parentassetuuid", ofNullable(entity.getParentAsset()).map(RbacObject::getUuid).orElse(null))
|
|
||||||
.setParameter("assignedtoassetuuid", ofNullable(entity.getAssignedToAsset()).map(RbacObject::getUuid).orElse(null))
|
|
||||||
.setParameter("alarmcontactuuid", ofNullable(entity.getAlarmContact()).map(RbacObject::getUuid).orElse(null))
|
|
||||||
.setParameter("identifier", entity.getIdentifier())
|
|
||||||
.setParameter("caption", entity.getCaption())
|
|
||||||
.setParameter("config", entity.getConfig().toString())
|
|
||||||
.setParameter("version", entity.getVersion());
|
|
||||||
logError(() -> {
|
|
||||||
final var count = query.executeUpdate();
|
|
||||||
assertThat(count).isEqualTo(1);
|
|
||||||
});
|
|
||||||
return entity;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected <E> String toFormattedString(final Map<Integer, E> map) {
|
protected <E> String toFormattedString(final Map<Integer, E> map) {
|
||||||
if ( map.isEmpty() ) {
|
if ( map.isEmpty() ) {
|
||||||
return "{}";
|
return "{}";
|
||||||
@ -342,7 +287,7 @@ class Record {
|
|||||||
}
|
}
|
||||||
|
|
||||||
String getString(final String columnName) {
|
String getString(final String columnName) {
|
||||||
return row[columns.indexOf(columnName)].trim();
|
return row[columns.indexOf(columnName)];
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean isEmpty(final String columnName) {
|
boolean isEmpty(final String columnName) {
|
||||||
|
@ -132,6 +132,7 @@ public class ImportHostingAssets extends ImportOfficeData {
|
|||||||
void verifyIpNumbers() {
|
void verifyIpNumbers() {
|
||||||
assumeThatWeAreImportingControlledTestData();
|
assumeThatWeAreImportingControlledTestData();
|
||||||
|
|
||||||
|
// no contacts yet => mostly null values
|
||||||
assertThat(firstOfEachType(5, IPV4_NUMBER)).isEqualToIgnoringWhitespace("""
|
assertThat(firstOfEachType(5, IPV4_NUMBER)).isEqualToIgnoringWhitespace("""
|
||||||
{
|
{
|
||||||
1000363=HsHostingAssetRawEntity(IPV4_NUMBER, 83.223.95.34),
|
1000363=HsHostingAssetRawEntity(IPV4_NUMBER, 83.223.95.34),
|
||||||
@ -159,6 +160,7 @@ public class ImportHostingAssets extends ImportOfficeData {
|
|||||||
void verifyHives() {
|
void verifyHives() {
|
||||||
assumeThatWeAreImportingControlledTestData();
|
assumeThatWeAreImportingControlledTestData();
|
||||||
|
|
||||||
|
// no contacts yet => mostly null values
|
||||||
assertThat(toFormattedString(first(5, hives))).isEqualToIgnoringWhitespace("""
|
assertThat(toFormattedString(first(5, hives))).isEqualToIgnoringWhitespace("""
|
||||||
{
|
{
|
||||||
2000001=Hive[hive_id=1, hive_name=h00, inet_addr_id=358, serverRef=null],
|
2000001=Hive[hive_id=1, hive_name=h00, inet_addr_id=358, serverRef=null],
|
||||||
@ -230,6 +232,7 @@ public class ImportHostingAssets extends ImportOfficeData {
|
|||||||
void verifyPacketComponents() {
|
void verifyPacketComponents() {
|
||||||
assumeThatWeAreImportingControlledTestData();
|
assumeThatWeAreImportingControlledTestData();
|
||||||
|
|
||||||
|
// no contacts yet => mostly null values
|
||||||
assertThat(firstOfEachType(5, CLOUD_SERVER, MANAGED_SERVER, MANAGED_WEBSPACE))
|
assertThat(firstOfEachType(5, CLOUD_SERVER, MANAGED_SERVER, MANAGED_WEBSPACE))
|
||||||
.isEqualToIgnoringWhitespace("""
|
.isEqualToIgnoringWhitespace("""
|
||||||
{
|
{
|
||||||
@ -280,6 +283,7 @@ public class ImportHostingAssets extends ImportOfficeData {
|
|||||||
void verifyUnixUsers() {
|
void verifyUnixUsers() {
|
||||||
assumeThatWeAreImportingControlledTestData();
|
assumeThatWeAreImportingControlledTestData();
|
||||||
|
|
||||||
|
// no contacts yet => mostly null values
|
||||||
assertThat(firstOfEachType(15, UNIX_USER)).isEqualToIgnoringWhitespace("""
|
assertThat(firstOfEachType(15, UNIX_USER)).isEqualToIgnoringWhitespace("""
|
||||||
{
|
{
|
||||||
4005803=HsHostingAssetRawEntity(UNIX_USER, lug00, LUGs, MANAGED_WEBSPACE:lug00, { "SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "shell": "/bin/bash", "userid": 102090}),
|
4005803=HsHostingAssetRawEntity(UNIX_USER, lug00, LUGs, MANAGED_WEBSPACE:lug00, { "SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "shell": "/bin/bash", "userid": 102090}),
|
||||||
@ -316,6 +320,7 @@ public class ImportHostingAssets extends ImportOfficeData {
|
|||||||
void verifyEmailAliases() {
|
void verifyEmailAliases() {
|
||||||
assumeThatWeAreImportingControlledTestData();
|
assumeThatWeAreImportingControlledTestData();
|
||||||
|
|
||||||
|
// no contacts yet => mostly null values
|
||||||
assertThat(firstOfEachType(15, EMAIL_ALIAS)).isEqualToIgnoringWhitespace("""
|
assertThat(firstOfEachType(15, EMAIL_ALIAS)).isEqualToIgnoringWhitespace("""
|
||||||
{
|
{
|
||||||
5002403=HsHostingAssetRawEntity(EMAIL_ALIAS, lug00, lug00, MANAGED_WEBSPACE:lug00, { "target": "[michael.mellis@example.com]"}),
|
5002403=HsHostingAssetRawEntity(EMAIL_ALIAS, lug00, lug00, MANAGED_WEBSPACE:lug00, { "target": "[michael.mellis@example.com]"}),
|
||||||
@ -373,84 +378,34 @@ public class ImportHostingAssets extends ImportOfficeData {
|
|||||||
@Test
|
@Test
|
||||||
@Order(19000)
|
@Order(19000)
|
||||||
@Commit
|
@Commit
|
||||||
void persistBookingProjects() {
|
void persistHostingAssetEntities() {
|
||||||
|
|
||||||
System.out.println("PERSISTING booking-projects to database '" + jdbcUrl + "' as user '" + postgresAdminUser + "'");
|
System.out.println("PERSISTING hosting-assets to database '" + jdbcUrl + "' as user '" + postgresAdminUser + "'");
|
||||||
|
|
||||||
jpaAttempt.transacted(() -> {
|
jpaAttempt.transacted(() -> {
|
||||||
context(rbacSuperuser);
|
context(rbacSuperuser);
|
||||||
bookingProjects.forEach(this::persist);
|
bookingProjects.forEach(this::persist);
|
||||||
}).assertSuccessful();
|
}).assertSuccessful();
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
@Order(19010)
|
|
||||||
@Commit
|
|
||||||
void persistBookingItems() {
|
|
||||||
|
|
||||||
System.out.println("PERSISTING booking-items to database '" + jdbcUrl + "' as user '" + postgresAdminUser + "'");
|
|
||||||
|
|
||||||
jpaAttempt.transacted(() -> {
|
jpaAttempt.transacted(() -> {
|
||||||
context(rbacSuperuser);
|
context(rbacSuperuser);
|
||||||
bookingItems.forEach(this::persistRecursively);
|
bookingItems.forEach(this::persistRecursively);
|
||||||
}).assertSuccessful();
|
}).assertSuccessful();
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
@Order(19120)
|
|
||||||
@Commit
|
|
||||||
void persistCloudServers() {
|
|
||||||
|
|
||||||
System.out.println("PERSISTING cloud-servers to database '" + jdbcUrl + "' as user '" + postgresAdminUser + "'");
|
|
||||||
|
|
||||||
persistHostingAssetsOfType(CLOUD_SERVER);
|
persistHostingAssetsOfType(CLOUD_SERVER);
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
@Order(19130)
|
|
||||||
@Commit
|
|
||||||
void persistManagedServers() {
|
|
||||||
System.out.println("PERSISTING managed-servers to database '" + jdbcUrl + "' as user '" + postgresAdminUser + "'");
|
|
||||||
persistHostingAssetsOfType(MANAGED_SERVER);
|
persistHostingAssetsOfType(MANAGED_SERVER);
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
@Order(19140)
|
|
||||||
@Commit
|
|
||||||
void persistManagedWebspaces() {
|
|
||||||
System.out.println("PERSISTING managed-webspaces to database '" + jdbcUrl + "' as user '" + postgresAdminUser + "'");
|
|
||||||
persistHostingAssetsOfType(MANAGED_WEBSPACE);
|
persistHostingAssetsOfType(MANAGED_WEBSPACE);
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
@Order(19150)
|
|
||||||
@Commit
|
|
||||||
void persistIPNumbers() {
|
|
||||||
System.out.println("PERSISTING ip-numbers to database '" + jdbcUrl + "' as user '" + postgresAdminUser + "'");
|
|
||||||
persistHostingAssetsOfType(IPV4_NUMBER);
|
persistHostingAssetsOfType(IPV4_NUMBER);
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
@Order(19160)
|
|
||||||
@Commit
|
|
||||||
void persistUnixUsers() {
|
|
||||||
System.out.println("PERSISTING unix-users to database '" + jdbcUrl + "' as user '" + postgresAdminUser + "'");
|
|
||||||
persistHostingAssetsOfType(UNIX_USER);
|
persistHostingAssetsOfType(UNIX_USER);
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
@Order(19170)
|
|
||||||
@Commit
|
|
||||||
void persistEmailAliases() {
|
|
||||||
System.out.println("PERSISTING email-aliases to database '" + jdbcUrl + "' as user '" + postgresAdminUser + "'");
|
|
||||||
persistHostingAssetsOfType(EMAIL_ALIAS);
|
persistHostingAssetsOfType(EMAIL_ALIAS);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@Order(19900)
|
@Order(19010)
|
||||||
void verifyPersistedUnixUsersWithUserId() {
|
void verifyPersistedUnixUsersWithUserId() {
|
||||||
assumeThatWeAreImportingControlledTestData();
|
assumeThatWeAreImportingControlledTestData();
|
||||||
|
|
||||||
|
// no contacts yet => mostly null value
|
||||||
assertThat(firstOfEachType(15, UNIX_USER)).isEqualToIgnoringWhitespace("""
|
assertThat(firstOfEachType(15, UNIX_USER)).isEqualToIgnoringWhitespace("""
|
||||||
{
|
{
|
||||||
4005803=HsHostingAssetRawEntity(UNIX_USER, lug00, LUGs, MANAGED_WEBSPACE:lug00, { "SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "password": null, "shell": "/bin/bash", "userid": 102090}),
|
4005803=HsHostingAssetRawEntity(UNIX_USER, lug00, LUGs, MANAGED_WEBSPACE:lug00, { "SSD hard quota": 0, "SSD soft quota": 0, "locked": false, "password": null, "shell": "/bin/bash", "userid": 102090}),
|
||||||
@ -471,20 +426,6 @@ public class ImportHostingAssets extends ImportOfficeData {
|
|||||||
""");
|
""");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
|
||||||
@Order(19910)
|
|
||||||
void verifyBookingItemsAreActuallyPersisted() {
|
|
||||||
final var biCount = (Integer) em.createNativeQuery("SELECT count(*) FROM hs_booking_item", Integer.class).getSingleResult();
|
|
||||||
assertThat(biCount).isGreaterThan(isImportingControlledTestData() ? 5 : 500);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
@Order(19920)
|
|
||||||
void verifyHostingAssetsAreActuallyPersisted() {
|
|
||||||
final var haCount = (Integer) em.createNativeQuery("SELECT count(*) FROM hs_hosting_asset", Integer.class).getSingleResult();
|
|
||||||
assertThat(haCount).isGreaterThan(isImportingControlledTestData() ? 20 : 10000);
|
|
||||||
}
|
|
||||||
|
|
||||||
// ============================================================================================
|
// ============================================================================================
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
Loading…
Reference in New Issue
Block a user