From f3d92289c47daf5f784ef5483b6a6be42a9ce939 Mon Sep 17 00:00:00 2001 From: jellyliao Date: Mon, 10 Feb 2025 17:31:14 +0800 Subject: [PATCH] Resolved the issue where the custom database prefix was lost after the primary cluster created the database. --- .../api/model/AbstractMetaStore.java | 22 ++++++++++++++++ .../api/model/PrimaryMetaStore.java | 18 +++++++++++++ .../api/model/AbstractMetaStoreTest.java | 12 +++++++++ .../api/model/PrimaryMetaStoreTest.java | 26 +++++++++++++++++++ ...DatabaseWhitelistAccessControlHandler.java | 2 +- .../ReadWriteCreateAccessControlHandler.java | 2 +- 6 files changed, 80 insertions(+), 2 deletions(-) diff --git a/waggle-dance-api/src/main/java/com/hotels/bdp/waggledance/api/model/AbstractMetaStore.java b/waggle-dance-api/src/main/java/com/hotels/bdp/waggledance/api/model/AbstractMetaStore.java index dc9539a4c..78e4f3bfc 100644 --- a/waggle-dance-api/src/main/java/com/hotels/bdp/waggledance/api/model/AbstractMetaStore.java +++ b/waggle-dance-api/src/main/java/com/hotels/bdp/waggledance/api/model/AbstractMetaStore.java @@ -80,6 +80,20 @@ public AbstractMetaStore( this.writableDatabaseWhitelist = writableDatabaseWhitelist; } + public AbstractMetaStore( + String name, + String remoteMetaStoreUris, + String databasePrefix, + AccessControlType accessControlType, + List writableDatabaseWhitelist) { + this.name = name; + this.remoteMetaStoreUris = remoteMetaStoreUris; + this.databasePrefix = databasePrefix; + this.accessControlType = accessControlType; + this.writableDatabaseWhitelist = writableDatabaseWhitelist; + } + + public static FederatedMetaStore newFederatedInstance(String name, String remoteMetaStoreUris) { return new FederatedMetaStore(name, remoteMetaStoreUris); } @@ -95,6 +109,14 @@ public static PrimaryMetaStore newPrimaryInstance(String name, String remoteMeta return new PrimaryMetaStore(name, remoteMetaStoreUris, AccessControlType.READ_ONLY); } + public static PrimaryMetaStore newPrimaryInstance( + String name, + String remoteMetaStoreUris, + String databasePrefix, + AccessControlType accessControlType) { + return new PrimaryMetaStore(name, remoteMetaStoreUris, databasePrefix, accessControlType); + } + public String getDatabasePrefix() { return databasePrefix; } diff --git a/waggle-dance-api/src/main/java/com/hotels/bdp/waggledance/api/model/PrimaryMetaStore.java b/waggle-dance-api/src/main/java/com/hotels/bdp/waggledance/api/model/PrimaryMetaStore.java index d72bb41c0..08cd59dff 100644 --- a/waggle-dance-api/src/main/java/com/hotels/bdp/waggledance/api/model/PrimaryMetaStore.java +++ b/waggle-dance-api/src/main/java/com/hotels/bdp/waggledance/api/model/PrimaryMetaStore.java @@ -43,6 +43,24 @@ public PrimaryMetaStore( super(name, remoteMetaStoreUris, accessControlType, writableDatabaseWhitelist); } + public PrimaryMetaStore( + String name, + String remoteMetaStoreUris, + String databasePrefix, + AccessControlType accessControlType, + String... writableDatabaseWhitelist) { + this(name, remoteMetaStoreUris, databasePrefix, accessControlType, Arrays.asList(writableDatabaseWhitelist)); + } + + public PrimaryMetaStore( + String name, + String remoteMetaStoreUris, + String databasePrefix, + AccessControlType accessControlType, + List writableDatabaseWhitelist) { + super(name, remoteMetaStoreUris, databasePrefix, accessControlType, writableDatabaseWhitelist); + } + @Override public FederationType getFederationType() { return FederationType.PRIMARY; diff --git a/waggle-dance-api/src/test/java/com/hotels/bdp/waggledance/api/model/AbstractMetaStoreTest.java b/waggle-dance-api/src/test/java/com/hotels/bdp/waggledance/api/model/AbstractMetaStoreTest.java index 3134c9cf6..191805b35 100644 --- a/waggle-dance-api/src/test/java/com/hotels/bdp/waggledance/api/model/AbstractMetaStoreTest.java +++ b/waggle-dance-api/src/test/java/com/hotels/bdp/waggledance/api/model/AbstractMetaStoreTest.java @@ -154,6 +154,18 @@ public void newPrimaryInstanceWithDefaultAccessControlType() { assertThat(primaryMetaStore.getAccessControlType(), is(AccessControlType.READ_ONLY)); } + @Test + public void newPrimaryPrefixInstance() { + AccessControlType access = AccessControlType.READ_AND_WRITE_AND_CREATE; + String databasePrefix = "primary"; + PrimaryMetaStore primaryMetaStore = AbstractMetaStore.newPrimaryInstance(name, remoteMetaStoreUri, databasePrefix, access); + assertThat(primaryMetaStore.getName(), is(name)); + assertThat(primaryMetaStore.getRemoteMetaStoreUris(), is(remoteMetaStoreUri)); + assertThat(primaryMetaStore.getDatabasePrefix(), is(databasePrefix)); + assertThat(primaryMetaStore.getAccessControlType(), is(access)); + } + + @Test public void mappedDatabases() { List mappedDatabases = new ArrayList<>(); diff --git a/waggle-dance-api/src/test/java/com/hotels/bdp/waggledance/api/model/PrimaryMetaStoreTest.java b/waggle-dance-api/src/test/java/com/hotels/bdp/waggledance/api/model/PrimaryMetaStoreTest.java index ccaf34b49..0615d2807 100644 --- a/waggle-dance-api/src/test/java/com/hotels/bdp/waggledance/api/model/PrimaryMetaStoreTest.java +++ b/waggle-dance-api/src/test/java/com/hotels/bdp/waggledance/api/model/PrimaryMetaStoreTest.java @@ -36,6 +36,7 @@ public class PrimaryMetaStoreTest extends AbstractMetaStoreTest whitelist = new ArrayList<>(); private final AccessControlType accessControlType = AccessControlType.READ_AND_WRITE_ON_DATABASE_WHITELIST; + private final String databasePrefix = "primary"; public PrimaryMetaStoreTest() { super(new PrimaryMetaStore()); @@ -120,4 +121,29 @@ public void constructorWithArrayListForWhitelist() { assertThat(store.getWritableDatabaseWhiteList(), is(whitelist)); } + @Test + public void nonEmptyPrefixConstructor() { + whitelist.add("databaseOne"); + whitelist.add("databaseTwo"); + PrimaryMetaStore store = new PrimaryMetaStore(name, remoteMetaStoreUris, databasePrefix, accessControlType, whitelist.get(0), + whitelist.get(1)); + assertThat(store.getName(), is(name)); + assertThat(store.getRemoteMetaStoreUris(), is(remoteMetaStoreUris)); + assertThat(store.getDatabasePrefix(), is(databasePrefix)); + assertThat(store.getAccessControlType(), is(accessControlType)); + assertThat(store.getWritableDatabaseWhiteList(), is(whitelist)); + } + + @Test + public void constructorWithPrefixArrayListForWhitelist() { + whitelist.add("databaseOne"); + whitelist.add("databaseTwo"); + PrimaryMetaStore store = new PrimaryMetaStore(name, remoteMetaStoreUris, databasePrefix, accessControlType, whitelist); + assertThat(store.getName(), is(name)); + assertThat(store.getRemoteMetaStoreUris(), is(remoteMetaStoreUris)); + assertThat(store.getDatabasePrefix(), is(databasePrefix)); + assertThat(store.getAccessControlType(), is(accessControlType)); + assertThat(store.getWritableDatabaseWhiteList(), is(whitelist)); + } + } diff --git a/waggle-dance-core/src/main/java/com/hotels/bdp/waggledance/server/security/DatabaseWhitelistAccessControlHandler.java b/waggle-dance-core/src/main/java/com/hotels/bdp/waggledance/server/security/DatabaseWhitelistAccessControlHandler.java index 25a1d2fb6..136781807 100644 --- a/waggle-dance-core/src/main/java/com/hotels/bdp/waggledance/server/security/DatabaseWhitelistAccessControlHandler.java +++ b/waggle-dance-core/src/main/java/com/hotels/bdp/waggledance/server/security/DatabaseWhitelistAccessControlHandler.java @@ -74,7 +74,7 @@ public void databaseCreatedNotification(String name) { AbstractMetaStore newMetaStore; if (metaStore instanceof PrimaryMetaStore) { newMetaStore = new PrimaryMetaStore(metaStore.getName(), metaStore.getRemoteMetaStoreUris(), - metaStore.getAccessControlType(), newWritableDatabaseWhiteList); + metaStore.getDatabasePrefix(), metaStore.getAccessControlType(), newWritableDatabaseWhiteList); newMetaStore.setMappedDatabases(mappedDatabases); } else { throw new WaggleDanceException( diff --git a/waggle-dance-core/src/main/java/com/hotels/bdp/waggledance/server/security/ReadWriteCreateAccessControlHandler.java b/waggle-dance-core/src/main/java/com/hotels/bdp/waggledance/server/security/ReadWriteCreateAccessControlHandler.java index f4fd41c39..a590047af 100644 --- a/waggle-dance-core/src/main/java/com/hotels/bdp/waggledance/server/security/ReadWriteCreateAccessControlHandler.java +++ b/waggle-dance-core/src/main/java/com/hotels/bdp/waggledance/server/security/ReadWriteCreateAccessControlHandler.java @@ -55,7 +55,7 @@ public void databaseCreatedNotification(String name) { AbstractMetaStore newMetaStore; if (metaStore instanceof PrimaryMetaStore) { newMetaStore = new PrimaryMetaStore(metaStore.getName(), metaStore.getRemoteMetaStoreUris(), - metaStore.getAccessControlType()); + metaStore.getDatabasePrefix(), metaStore.getAccessControlType()); newMetaStore.setMappedDatabases(mappedDatabases); } else { throw new WaggleDanceException(