diff --git a/src/main/java/io/weaviate/client/v1/schema/Schema.java b/src/main/java/io/weaviate/client/v1/schema/Schema.java index c1f454ca1..650acf3eb 100644 --- a/src/main/java/io/weaviate/client/v1/schema/Schema.java +++ b/src/main/java/io/weaviate/client/v1/schema/Schema.java @@ -15,6 +15,7 @@ import io.weaviate.client.v1.schema.api.TenantsCreator; import io.weaviate.client.v1.schema.api.TenantsDeleter; import io.weaviate.client.v1.schema.api.TenantsGetter; +import io.weaviate.client.v1.schema.api.TenantsUpdater; public class Schema { private final Config config; @@ -69,6 +70,10 @@ public TenantsCreator tenantsCreator() { return new TenantsCreator(httpClient, config); } + public TenantsUpdater tenantsUpdater() { + return new TenantsUpdater(httpClient, config); + } + public TenantsDeleter tenantsDeleter() { return new TenantsDeleter(httpClient, config); } diff --git a/src/main/java/io/weaviate/client/v1/schema/api/TenantsUpdater.java b/src/main/java/io/weaviate/client/v1/schema/api/TenantsUpdater.java new file mode 100644 index 000000000..dd4e039eb --- /dev/null +++ b/src/main/java/io/weaviate/client/v1/schema/api/TenantsUpdater.java @@ -0,0 +1,38 @@ +package io.weaviate.client.v1.schema.api; + +import io.weaviate.client.Config; +import io.weaviate.client.base.BaseClient; +import io.weaviate.client.base.ClientResult; +import io.weaviate.client.base.Response; +import io.weaviate.client.base.Result; +import io.weaviate.client.base.http.HttpClient; +import io.weaviate.client.base.util.UrlEncoder; +import io.weaviate.client.v1.schema.model.Tenant; +import org.apache.http.HttpStatus; + +public class TenantsUpdater extends BaseClient implements ClientResult { + + private String className; + private Tenant[] tenants; + + public TenantsUpdater(HttpClient httpClient, Config config) { + super(httpClient, config); + } + + public TenantsUpdater withClassName(String className) { + this.className = className; + return this; + } + + public TenantsUpdater withTenants(Tenant... tenants) { + this.tenants = tenants; + return this; + } + + @Override + public Result run() { + String path = String.format("/schema/%s/tenants", UrlEncoder.encodePathParam(className)); + Response resp = sendPutRequest(path, tenants, Tenant[].class); + return new Result<>(resp.getStatusCode(), resp.getStatusCode() == HttpStatus.SC_OK, resp.getErrors()); + } +} diff --git a/src/main/java/io/weaviate/client/v1/schema/model/ActivityStatus.java b/src/main/java/io/weaviate/client/v1/schema/model/ActivityStatus.java new file mode 100644 index 000000000..9ae972cc4 --- /dev/null +++ b/src/main/java/io/weaviate/client/v1/schema/model/ActivityStatus.java @@ -0,0 +1,8 @@ +package io.weaviate.client.v1.schema.model; + +public interface ActivityStatus { + String HOT = "HOT"; + String WARM = "WARM"; + String COLD = "COLD"; + String FROZEN = "FROZEN"; +} diff --git a/src/main/java/io/weaviate/client/v1/schema/model/Tenant.java b/src/main/java/io/weaviate/client/v1/schema/model/Tenant.java index ce9f7002d..cdf36e896 100644 --- a/src/main/java/io/weaviate/client/v1/schema/model/Tenant.java +++ b/src/main/java/io/weaviate/client/v1/schema/model/Tenant.java @@ -14,4 +14,5 @@ @FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE) public class Tenant { String name; + String activityStatus; } diff --git a/src/test/java/io/weaviate/integration/client/AssertMultiTenancy.java b/src/test/java/io/weaviate/integration/client/AssertMultiTenancy.java index 24d61378d..3b227226f 100644 --- a/src/test/java/io/weaviate/integration/client/AssertMultiTenancy.java +++ b/src/test/java/io/weaviate/integration/client/AssertMultiTenancy.java @@ -5,8 +5,12 @@ import io.weaviate.client.base.WeaviateError; import io.weaviate.client.base.WeaviateErrorMessage; import io.weaviate.client.v1.data.model.WeaviateObject; +import io.weaviate.client.v1.schema.model.ActivityStatus; +import io.weaviate.client.v1.schema.model.Tenant; import java.util.List; +import java.util.Objects; +import java.util.Optional; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.InstanceOfAssertFactories.STRING; @@ -70,4 +74,51 @@ public void error(Result result, T expectedValue, int expectedStatusCode, .extracting(m -> ((WeaviateErrorMessage) m).getMessage()).asInstanceOf(STRING) .contains(expectedContains); } + + public void tenantActive(String className, String tenantName) { + tenantStatus(className, tenantName, ActivityStatus.HOT); + } + + public void tenantInactive(String className, String tenantName) { + tenantStatus(className, tenantName, ActivityStatus.COLD); + } + + private void tenantStatus(String className, String tenantName, String activityStatus) { + Result> result = client.schema().tenantsGetter() + .withClassName(className) + .run(); + + assertThat(result).isNotNull() + .returns(false, Result::hasErrors) + .extracting(Result::getResult).isNotNull(); + + Optional maybeTenant = result.getResult().stream() + .filter(Objects::nonNull) + .filter(tenant -> tenantName.equals(tenant.getName())) + .filter(tenant -> activityStatus.equals(tenant.getActivityStatus())) + .findFirst(); + + assertThat(maybeTenant).isNotEmpty(); + } + + public void tenantActiveGetsObjects(String className, String tenantName, int objectsCount) { + Result> result = client.data().objectsGetter() + .withClassName(className) + .withTenant(tenantName) + .run(); + + assertThat(result).isNotNull() + .returns(false, Result::hasErrors) + .extracting(Result::getResult).asList() + .hasSize(objectsCount); + } + + public void tenantInactiveGetsNoObjects(String className, String tenantName) { + Result> result = client.data().objectsGetter() + .withClassName(className) + .withTenant(tenantName) + .run(); + + error(result, null, 422, "tenant not active"); + } } diff --git a/src/test/java/io/weaviate/integration/client/WeaviateTestGenerics.java b/src/test/java/io/weaviate/integration/client/WeaviateTestGenerics.java index 47940180b..eb2da6e09 100644 --- a/src/test/java/io/weaviate/integration/client/WeaviateTestGenerics.java +++ b/src/test/java/io/weaviate/integration/client/WeaviateTestGenerics.java @@ -61,6 +61,13 @@ public class WeaviateTestGenerics { )); } + public static final Tenant TENANT_1 = Tenant.builder() + .name("TenantNo1") + .build(); + public static final Tenant TENANT_2 = Tenant.builder() + .name("TenantNo2") + .build(); + public void createWeaviateTestSchemaFood(WeaviateClient client) { createWeaviateTestSchemaFood(client, false); @@ -368,27 +375,23 @@ private void createSchema(WeaviateClient client, WeaviateClass cl) { } - public void createTenantsPizza(WeaviateClient client, String... tenants) { + public void createTenantsPizza(WeaviateClient client, Tenant... tenants) { createTenants(client, "Pizza", tenants); } - public void createTenantsSoup(WeaviateClient client, String... tenants) { + public void createTenantsSoup(WeaviateClient client, Tenant... tenants) { createTenants(client, "Soup", tenants); } - public void createTenantsFood(WeaviateClient client, String... tenants) { + public void createTenantsFood(WeaviateClient client, Tenant... tenants) { createTenantsPizza(client, tenants); createTenantsSoup(client, tenants); } - private void createTenants(WeaviateClient client, String className, String[] tenants) { - Tenant[] t = Arrays.stream(tenants) - .map(tenant -> Tenant.builder().name(tenant).build()) - .toArray(Tenant[]::new); - + private void createTenants(WeaviateClient client, String className, Tenant[] tenants) { Result createStatus = client.schema().tenantsCreator() .withClassName(className) - .withTenants(t) + .withTenants(tenants) .run(); assertThat(createStatus).isNotNull() .returns(false, Result::hasErrors) diff --git a/src/test/java/io/weaviate/integration/client/WeaviateVersion.java b/src/test/java/io/weaviate/integration/client/WeaviateVersion.java index adb0239c7..fa8b2a475 100644 --- a/src/test/java/io/weaviate/integration/client/WeaviateVersion.java +++ b/src/test/java/io/weaviate/integration/client/WeaviateVersion.java @@ -3,9 +3,9 @@ public class WeaviateVersion { // to be set according to weaviate docker image - public static final String EXPECTED_WEAVIATE_VERSION = "1.20.0"; + public static final String EXPECTED_WEAVIATE_VERSION = "1.21.0-rc.1"; // to be set according to weaviate docker image - public static final String EXPECTED_WEAVIATE_GIT_HASH = "7865a4a"; + public static final String EXPECTED_WEAVIATE_GIT_HASH = "b0d0063"; private WeaviateVersion() {} } diff --git a/src/test/java/io/weaviate/integration/client/batch/ClientBatchMultiTenancyTest.java b/src/test/java/io/weaviate/integration/client/batch/ClientBatchMultiTenancyTest.java index a0b02701b..b649e3eee 100644 --- a/src/test/java/io/weaviate/integration/client/batch/ClientBatchMultiTenancyTest.java +++ b/src/test/java/io/weaviate/integration/client/batch/ClientBatchMultiTenancyTest.java @@ -10,6 +10,7 @@ import io.weaviate.client.v1.data.model.WeaviateObject; import io.weaviate.client.v1.filters.Operator; import io.weaviate.client.v1.filters.WhereFilter; +import io.weaviate.client.v1.schema.model.Tenant; import io.weaviate.integration.client.AssertMultiTenancy; import io.weaviate.integration.client.WeaviateTestGenerics; import org.junit.After; @@ -59,7 +60,10 @@ public void after() { @Test public void shouldCreateObjects() { - String[] tenants = new String[]{"TenantNo1", "TenantNo2"}; + Tenant[] tenants = new Tenant[]{ + WeaviateTestGenerics.TENANT_1, + WeaviateTestGenerics.TENANT_2, + }; testGenerics.createSchemaPizzaForTenants(client); testGenerics.createSchemaSoupForTenants(client); testGenerics.createTenantsPizza(client, tenants); @@ -100,28 +104,28 @@ public void shouldCreateObjects() { .id(WeaviateTestGenerics.PIZZA_QUATTRO_FORMAGGI_ID) .className("Pizza") .properties(propsQuatroFormaggi) - .tenant(tenant) + .tenant(tenant.getName()) .build(); WeaviateObject pizzaFruttiDiMare = WeaviateObject.builder() .id(WeaviateTestGenerics.PIZZA_FRUTTI_DI_MARE_ID) .className("Pizza") .properties(propsFruttiDiMare) - .tenant(tenant) + .tenant(tenant.getName()) .build(); WeaviateObject soupChicken = WeaviateObject.builder() .id(WeaviateTestGenerics.SOUP_CHICKENSOUP_ID) .className("Soup") .properties(propsChicken) - .tenant(tenant) + .tenant(tenant.getName()) .build(); WeaviateObject soupBeautiful = WeaviateObject.builder() .id(WeaviateTestGenerics.SOUP_BEAUTIFUL_ID) .className("Soup") .properties(propsBeautiful) - .tenant(tenant) + .tenant(tenant.getName()) .build(); return Stream.of(pizzaQuatroFormaggi, pizzaFruttiDiMare, soupChicken, soupBeautiful); @@ -139,14 +143,14 @@ public void shouldCreateObjects() { Map> grouped = Arrays.stream(result.getResult()) .collect(Collectors.groupingBy(ObjectGetResponse::getTenant)); Arrays.stream(tenants).forEach(tenant -> { - assertThat(grouped.get(tenant)).isNotNull() + assertThat(grouped.get(tenant.getName())).isNotNull() .hasSize(4) .extracting(ObjectGetResponse::getId) .containsExactlyInAnyOrderElementsOf(ids.keySet()); - grouped.get(tenant).forEach(item -> + grouped.get(tenant.getName()).forEach(item -> assertThat(item).isNotNull() - .returns(tenant, ObjectGetResponse::getTenant) + .returns(tenant.getName(), ObjectGetResponse::getTenant) .extracting(ObjectGetResponse::getResult) .returns(ObjectGetResponseStatus.SUCCESS, ObjectsGetResponseAO2Result::getStatus) ); @@ -155,14 +159,17 @@ public void shouldCreateObjects() { // verify created Arrays.stream(tenants).forEach(tenant -> ids.forEach((id, className) -> - assertMT.objectExists(className, id, tenant) + assertMT.objectExists(className, id, tenant.getName()) ) ); } @Test public void shouldNotCreateObjectsWithoutTenant() { - String[] tenants = new String[]{"TenantNo1", "TenantNo2"}; + Tenant[] tenants = new Tenant[]{ + WeaviateTestGenerics.TENANT_1, + WeaviateTestGenerics.TENANT_2, + }; testGenerics.createSchemaPizzaForTenants(client); testGenerics.createSchemaSoupForTenants(client); testGenerics.createTenantsPizza(client, tenants); @@ -243,23 +250,27 @@ public void shouldNotCreateObjectsWithoutTenant() { // verify not created Arrays.stream(tenants).forEach(tenant -> ids.forEach((id, className) -> - assertMT.objectDoesNotExist(className, id, tenant) + assertMT.objectDoesNotExist(className, id, tenant.getName()) ) ); } @Test public void shouldDeleteObjects() { - String[] tenants = new String[]{"TenantNo1", "TenantNo2"}; + Tenant[] tenants = new Tenant[]{ + WeaviateTestGenerics.TENANT_1, + WeaviateTestGenerics.TENANT_2, + }; + String[] tenantNames = Arrays.stream(tenants).map(Tenant::getName).toArray(String[]::new); testGenerics.createSchemaFoodForTenants(client); testGenerics.createTenantsFood(client, tenants); - testGenerics.createDataFoodForTenants(client, tenants); + testGenerics.createDataFoodForTenants(client, tenantNames); Arrays.stream(tenants).forEach(tenant -> WeaviateTestGenerics.IDS_BY_CLASS.forEach((className, ids) -> { Result result = client.batch().objectsBatchDeleter() .withClassName(className) - .withTenant(tenant) + .withTenant(tenant.getName()) .withWhere(WhereFilter.builder() .operator(Operator.Like) .path(new String[]{"_id"}) @@ -275,17 +286,21 @@ public void shouldDeleteObjects() { .returns((long) ids.size(), BatchDeleteResponse.Results::getSuccessful); // verify deleted - ids.forEach(id -> assertMT.objectDoesNotExist(className, id, tenant)); + ids.forEach(id -> assertMT.objectDoesNotExist(className, id, tenant.getName())); }) ); } @Test public void shouldNotDeleteObjectsWithoutTenant() { - String[] tenants = new String[]{"TenantNo1", "TenantNo2"}; + Tenant[] tenants = new Tenant[]{ + WeaviateTestGenerics.TENANT_1, + WeaviateTestGenerics.TENANT_2, + }; + String[] tenantNames = Arrays.stream(tenants).map(Tenant::getName).toArray(String[]::new); testGenerics.createSchemaFoodForTenants(client); testGenerics.createTenantsFood(client, tenants); - testGenerics.createDataFoodForTenants(client, tenants); + testGenerics.createDataFoodForTenants(client, tenantNames); WeaviateTestGenerics.IDS_BY_CLASS.forEach((className, ids) -> { Result result = client.batch().objectsBatchDeleter() @@ -302,7 +317,7 @@ public void shouldNotDeleteObjectsWithoutTenant() { Arrays.stream(tenants).forEach(tenant -> WeaviateTestGenerics.IDS_BY_CLASS.forEach((className, ids) -> - ids.forEach(id -> assertMT.objectExists(className, id, tenant)) + ids.forEach(id -> assertMT.objectExists(className, id, tenant.getName())) ) ); } diff --git a/src/test/java/io/weaviate/integration/client/batch/ClientBatchReferencesMultiTenancyTest.java b/src/test/java/io/weaviate/integration/client/batch/ClientBatchReferencesMultiTenancyTest.java index 36128f386..f5b48efb8 100644 --- a/src/test/java/io/weaviate/integration/client/batch/ClientBatchReferencesMultiTenancyTest.java +++ b/src/test/java/io/weaviate/integration/client/batch/ClientBatchReferencesMultiTenancyTest.java @@ -9,6 +9,7 @@ import io.weaviate.client.v1.batch.model.BatchReferenceResponseStatus; import io.weaviate.client.v1.data.model.WeaviateObject; import io.weaviate.client.v1.schema.model.Property; +import io.weaviate.client.v1.schema.model.Tenant; import io.weaviate.integration.client.WeaviateTestGenerics; import org.junit.After; import org.junit.Before; @@ -52,15 +53,19 @@ public void after() { @Test public void shouldCreateReferencesBetweenMTClasses() { - String[] tenants = new String[]{"TenantNo1", "TenantNo2"}; + Tenant[] tenants = new Tenant[]{ + WeaviateTestGenerics.TENANT_1, + WeaviateTestGenerics.TENANT_2, + }; + String[] tenantNames = Arrays.stream(tenants).map(Tenant::getName).toArray(String[]::new); List soupIds = WeaviateTestGenerics.IDS_BY_CLASS.get("Soup"); List pizzaIds = WeaviateTestGenerics.IDS_BY_CLASS.get("Pizza"); testGenerics.createSchemaSoupForTenants(client); testGenerics.createTenantsSoup(client, tenants); - testGenerics.createDataSoupForTenants(client, tenants); + testGenerics.createDataSoupForTenants(client, tenantNames); testGenerics.createSchemaPizzaForTenants(client); testGenerics.createTenantsPizza(client, tenants); - testGenerics.createDataPizzaForTenants(client, tenants); + testGenerics.createDataPizzaForTenants(client, tenantNames); createSoupToPizzaRefProp(); @@ -68,7 +73,7 @@ public void shouldCreateReferencesBetweenMTClasses() { soupIds.stream().flatMap(soupId -> pizzaIds.stream().map(pizzaId -> client.batch().referencePayloadBuilder() - .withTenant(tenant) + .withTenant(tenant.getName()) .withFromClassName("Soup") .withFromID(soupId) .withFromRefProp("relatedToPizza") @@ -99,7 +104,7 @@ public void shouldCreateReferencesBetweenMTClasses() { Arrays.stream(tenants).forEach(tenant -> soupIds.forEach(soupId -> { Result> getSoupResult = client.data().objectsGetter() - .withTenant(tenant) + .withTenant(tenant.getName()) .withClassName("Soup") .withID(soupId) .run(); @@ -118,15 +123,19 @@ public void shouldCreateReferencesBetweenMTClasses() { @Test public void shouldNotCreateReferencesBetweenMTClassesWithoutTenant() { - String[] tenants = new String[]{"TenantNo1", "TenantNo2"}; + Tenant[] tenants = new Tenant[]{ + WeaviateTestGenerics.TENANT_1, + WeaviateTestGenerics.TENANT_2, + }; + String[] tenantNames = Arrays.stream(tenants).map(Tenant::getName).toArray(String[]::new); List soupIds = WeaviateTestGenerics.IDS_BY_CLASS.get("Soup"); List pizzaIds = WeaviateTestGenerics.IDS_BY_CLASS.get("Pizza"); testGenerics.createSchemaSoupForTenants(client); testGenerics.createTenantsSoup(client, tenants); - testGenerics.createDataSoupForTenants(client, tenants); + testGenerics.createDataSoupForTenants(client, tenantNames); testGenerics.createSchemaPizzaForTenants(client); testGenerics.createTenantsPizza(client, tenants); - testGenerics.createDataPizzaForTenants(client, tenants); + testGenerics.createDataPizzaForTenants(client, tenantNames); createSoupToPizzaRefProp(); @@ -167,7 +176,7 @@ public void shouldNotCreateReferencesBetweenMTClassesWithoutTenant() { Arrays.stream(tenants).forEach(tenant -> soupIds.forEach(soupId -> { Result> getSoupResult = client.data().objectsGetter() - .withTenant(tenant) + .withTenant(tenant.getName()) .withClassName("Soup") .withID(soupId) .run(); @@ -186,12 +195,16 @@ public void shouldNotCreateReferencesBetweenMTClassesWithoutTenant() { @Test public void shouldCreateReferencesBetweenMTAndNonMTClasses() { - String[] tenants = new String[]{"TenantNo1", "TenantNo2"}; + Tenant[] tenants = new Tenant[]{ + WeaviateTestGenerics.TENANT_1, + WeaviateTestGenerics.TENANT_2, + }; + String[] tenantNames = Arrays.stream(tenants).map(Tenant::getName).toArray(String[]::new); List soupIds = WeaviateTestGenerics.IDS_BY_CLASS.get("Soup"); List pizzaIds = WeaviateTestGenerics.IDS_BY_CLASS.get("Pizza"); testGenerics.createSchemaSoupForTenants(client); testGenerics.createTenantsSoup(client, tenants); - testGenerics.createDataSoupForTenants(client, tenants); + testGenerics.createDataSoupForTenants(client, tenantNames); testGenerics.createSchemaPizza(client); testGenerics.createDataPizza(client); @@ -201,7 +214,7 @@ public void shouldCreateReferencesBetweenMTAndNonMTClasses() { soupIds.stream().flatMap(soupId -> pizzaIds.stream().map(pizzaId -> client.batch().referencePayloadBuilder() - .withTenant(tenant) + .withTenant(tenant.getName()) .withFromClassName("Soup") .withFromID(soupId) .withFromRefProp("relatedToPizza") @@ -232,7 +245,7 @@ public void shouldCreateReferencesBetweenMTAndNonMTClasses() { Arrays.stream(tenants).forEach(tenant -> soupIds.forEach(soupId -> { Result> getSoupResult = client.data().objectsGetter() - .withTenant(tenant) + .withTenant(tenant.getName()) .withClassName("Soup") .withID(soupId) .run(); @@ -251,12 +264,16 @@ public void shouldCreateReferencesBetweenMTAndNonMTClasses() { @Test public void shouldNotCreateReferencesBetweenMTAndNonMTClassesWithoutTenant() { - String[] tenants = new String[]{"TenantNo1", "TenantNo2"}; + Tenant[] tenants = new Tenant[]{ + WeaviateTestGenerics.TENANT_1, + WeaviateTestGenerics.TENANT_2, + }; + String[] tenantNames = Arrays.stream(tenants).map(Tenant::getName).toArray(String[]::new); List soupIds = WeaviateTestGenerics.IDS_BY_CLASS.get("Soup"); List pizzaIds = WeaviateTestGenerics.IDS_BY_CLASS.get("Pizza"); testGenerics.createSchemaSoupForTenants(client); testGenerics.createTenantsSoup(client, tenants); - testGenerics.createDataSoupForTenants(client, tenants); + testGenerics.createDataSoupForTenants(client, tenantNames); testGenerics.createSchemaPizza(client); testGenerics.createDataPizza(client); @@ -299,7 +316,7 @@ public void shouldNotCreateReferencesBetweenMTAndNonMTClassesWithoutTenant() { Arrays.stream(tenants).forEach(tenant -> soupIds.forEach(soupId -> { Result> getSoupResult = client.data().objectsGetter() - .withTenant(tenant) + .withTenant(tenant.getName()) .withClassName("Soup") .withID(soupId) .run(); @@ -318,14 +335,18 @@ public void shouldNotCreateReferencesBetweenMTAndNonMTClassesWithoutTenant() { @Test public void shouldNotCreateReferencesBetweenNonMTAndMTClasses() { - String[] tenants = new String[]{"TenantNo1", "TenantNo2"}; + Tenant[] tenants = new Tenant[]{ + WeaviateTestGenerics.TENANT_1, + WeaviateTestGenerics.TENANT_2, + }; + String[] tenantNames = Arrays.stream(tenants).map(Tenant::getName).toArray(String[]::new); List soupIds = WeaviateTestGenerics.IDS_BY_CLASS.get("Soup"); List pizzaIds = WeaviateTestGenerics.IDS_BY_CLASS.get("Pizza"); testGenerics.createSchemaSoup(client); testGenerics.createDataSoup(client); testGenerics.createSchemaPizzaForTenants(client); testGenerics.createTenantsPizza(client, tenants); - testGenerics.createDataPizzaForTenants(client, tenants); + testGenerics.createDataPizzaForTenants(client, tenantNames); createSoupToPizzaRefProp(); @@ -333,7 +354,7 @@ public void shouldNotCreateReferencesBetweenNonMTAndMTClasses() { soupIds.stream().flatMap(soupId -> pizzaIds.stream().map(pizzaId -> client.batch().referencePayloadBuilder() - .withTenant(tenant) + .withTenant(tenant.getName()) .withFromClassName("Soup") .withFromID(soupId) .withFromRefProp("relatedToPizza") diff --git a/src/test/java/io/weaviate/integration/client/cluster/ClientClusterMultiTenancyTest.java b/src/test/java/io/weaviate/integration/client/cluster/ClientClusterMultiTenancyTest.java index 9f4f905e5..92d92dbfa 100644 --- a/src/test/java/io/weaviate/integration/client/cluster/ClientClusterMultiTenancyTest.java +++ b/src/test/java/io/weaviate/integration/client/cluster/ClientClusterMultiTenancyTest.java @@ -5,6 +5,7 @@ import io.weaviate.client.base.Result; import io.weaviate.client.base.util.TriConsumer; import io.weaviate.client.v1.cluster.model.NodesStatusResponse; +import io.weaviate.client.v1.schema.model.Tenant; import io.weaviate.integration.client.WeaviateTestGenerics; import org.junit.After; import org.junit.Before; @@ -14,6 +15,7 @@ import org.testcontainers.containers.wait.strategy.Wait; import java.io.File; +import java.util.Arrays; import java.util.List; import java.util.function.Consumer; @@ -49,16 +51,26 @@ public void after() { @Test public void shouldGetNodeStatusPerClass() { - String[] pizzaTenants = new String[]{"TenantPizza1", "TenantPizza2"}; - String[] soupTenants = new String[]{"TenantSoup1", "TenantSoup2", "TenantSoup3"}; + Tenant[] pizzaTenants = new Tenant[] { + Tenant.builder().name("TenantPizza1").build(), + Tenant.builder().name("TenantPizza2").build(), + }; + Tenant[] soupTenants = new Tenant[] { + Tenant.builder().name("TenantSoup1").build(), + Tenant.builder().name("TenantSoup2").build(), + Tenant.builder().name("TenantSoup3").build(), + }; + String[] pizzaTenantNames = Arrays.stream(pizzaTenants).map(Tenant::getName).toArray(String[]::new); + String[] soupTenantNames = Arrays.stream(soupTenants).map(Tenant::getName).toArray(String[]::new); + List pizzaIds = WeaviateTestGenerics.IDS_BY_CLASS.get("Pizza"); List soupIds = WeaviateTestGenerics.IDS_BY_CLASS.get("Soup"); testGenerics.createSchemaPizzaForTenants(client); testGenerics.createTenantsPizza(client, pizzaTenants); - testGenerics.createDataPizzaForTenants(client, pizzaTenants); + testGenerics.createDataPizzaForTenants(client, pizzaTenantNames); testGenerics.createSchemaSoupForTenants(client); testGenerics.createTenantsSoup(client, soupTenants); - testGenerics.createDataSoupForTenants(client, soupTenants); + testGenerics.createDataSoupForTenants(client, soupTenantNames); Consumer> assertSingleNode = (Result result) -> assertThat(result).isNotNull() diff --git a/src/test/java/io/weaviate/integration/client/data/ClientDataMultiTenancyTest.java b/src/test/java/io/weaviate/integration/client/data/ClientDataMultiTenancyTest.java index b58e1eff1..bc515c94f 100644 --- a/src/test/java/io/weaviate/integration/client/data/ClientDataMultiTenancyTest.java +++ b/src/test/java/io/weaviate/integration/client/data/ClientDataMultiTenancyTest.java @@ -5,6 +5,7 @@ import io.weaviate.client.base.Result; import io.weaviate.client.base.WeaviateError; import io.weaviate.client.v1.data.model.WeaviateObject; +import io.weaviate.client.v1.schema.model.Tenant; import io.weaviate.integration.client.AssertMultiTenancy; import io.weaviate.integration.client.WeaviateTestGenerics; import org.junit.After; @@ -52,7 +53,10 @@ public void after() { @Test public void shouldCreateObjects() { - String[] tenants = new String[]{"TenantNo1", "TenantNo2"}; + Tenant[] tenants = new Tenant[]{ + WeaviateTestGenerics.TENANT_1, + WeaviateTestGenerics.TENANT_2, + }; testGenerics.createSchemaPizzaForTenants(client); testGenerics.createTenantsPizza(client, tenants); @@ -73,7 +77,7 @@ public void shouldCreateObjects() { .withClassName("Pizza") .withID(WeaviateTestGenerics.PIZZA_QUATTRO_FORMAGGI_ID) .withProperties(propsQuatroFormaggi) - .withTenant(tenant) + .withTenant(tenant.getName()) .run(); assertThat(pizzaQuatroFormaggiStatus).isNotNull() @@ -81,7 +85,7 @@ public void shouldCreateObjects() { .extracting(Result::getResult) .returns(WeaviateTestGenerics.PIZZA_QUATTRO_FORMAGGI_ID, WeaviateObject::getId) .returns("Pizza", WeaviateObject::getClassName) - .returns(tenant, WeaviateObject::getTenant) + .returns(tenant.getName(), WeaviateObject::getTenant) .extracting(WeaviateObject::getProperties) .returns("Quattro Formaggi", p -> p.get("name")) .returns(1.4d, p -> p.get("price")) @@ -92,7 +96,7 @@ public void shouldCreateObjects() { .withClassName("Pizza") .withID(WeaviateTestGenerics.PIZZA_FRUTTI_DI_MARE_ID) .withProperties(propsFruttiDiMare) - .withTenant(tenant) + .withTenant(tenant.getName()) .run(); assertThat(pizzaFruttiDiMareStatus).isNotNull() @@ -100,7 +104,7 @@ public void shouldCreateObjects() { .extracting(Result::getResult) .returns(WeaviateTestGenerics.PIZZA_FRUTTI_DI_MARE_ID, WeaviateObject::getId) .returns("Pizza", WeaviateObject::getClassName) - .returns(tenant, WeaviateObject::getTenant) + .returns(tenant.getName(), WeaviateObject::getTenant) .extracting(WeaviateObject::getProperties) .returns("Frutti di Mare", p -> p.get("name")) .returns(2.5d, p -> p.get("price")) @@ -113,12 +117,16 @@ public void shouldCreateObjects() { Arrays.asList( WeaviateTestGenerics.PIZZA_QUATTRO_FORMAGGI_ID, WeaviateTestGenerics.PIZZA_FRUTTI_DI_MARE_ID - ).forEach(id -> assertMT.objectExists("Pizza", id, tenant))); + ).forEach(id -> assertMT.objectExists("Pizza", id, tenant.getName()))); } @Test public void shouldNotCreateObjectsWithoutTenant() { - String[] tenants = new String[]{"TenantNo1", "TenantNo2"}; + Tenant[] tenants = new Tenant[]{ + WeaviateTestGenerics.TENANT_1, + WeaviateTestGenerics.TENANT_2, + }; + testGenerics.createSchemaPizzaForTenants(client); testGenerics.createTenantsPizza(client, tenants); @@ -155,21 +163,25 @@ public void shouldNotCreateObjectsWithoutTenant() { Arrays.asList( WeaviateTestGenerics.PIZZA_QUATTRO_FORMAGGI_ID, WeaviateTestGenerics.PIZZA_FRUTTI_DI_MARE_ID - ).forEach(id -> assertMT.objectDoesNotExist("Pizza", id, tenant))); + ).forEach(id -> assertMT.objectDoesNotExist("Pizza", id, tenant.getName()))); } @Test public void shouldGetObjects() { - String[] tenants = new String[]{"TenantNo1", "TenantNo2"}; + Tenant[] tenants = new Tenant[]{ + WeaviateTestGenerics.TENANT_1, + WeaviateTestGenerics.TENANT_2, + }; + String[] tenantNames = Arrays.stream(tenants).map(Tenant::getName).toArray(String[]::new); testGenerics.createSchemaFoodForTenants(client); testGenerics.createTenantsFood(client, tenants); - testGenerics.createDataFoodForTenants(client, tenants); + testGenerics.createDataFoodForTenants(client, tenantNames); Arrays.stream(tenants).forEach(tenant -> { WeaviateTestGenerics.IDS_BY_CLASS.forEach((className, ids) -> { ids.forEach(id -> { Result> getResultByClassId = client.data().objectsGetter() - .withTenant(tenant) + .withTenant(tenant.getName()) .withClassName(className) .withID(id) .run(); @@ -182,11 +194,11 @@ public void shouldGetObjects() { .extracting(o -> (WeaviateObject) o) .returns(id, WeaviateObject::getId) .returns(className, WeaviateObject::getClassName) - .returns(tenant, WeaviateObject::getTenant); + .returns(tenant.getName(), WeaviateObject::getTenant); }); Result> getResultByClass = client.data().objectsGetter() - .withTenant(tenant) + .withTenant(tenant.getName()) .withClassName(className) .run(); @@ -199,7 +211,7 @@ public void shouldGetObjects() { }); Result> getResultAll = client.data().objectsGetter() - .withTenant(tenant) + .withTenant(tenant.getName()) .run(); assertThat(getResultAll).isNotNull() @@ -214,10 +226,14 @@ public void shouldGetObjects() { @Test public void shouldNotGetObjectsWithoutTenant() { - String[] tenants = new String[]{"TenantNo1", "TenantNo2"}; + Tenant[] tenants = new Tenant[]{ + WeaviateTestGenerics.TENANT_1, + WeaviateTestGenerics.TENANT_2, + }; + String[] tenantNames = Arrays.stream(tenants).map(Tenant::getName).toArray(String[]::new); testGenerics.createSchemaFoodForTenants(client); testGenerics.createTenantsFood(client, tenants); - testGenerics.createDataFoodForTenants(client, tenants); + testGenerics.createDataFoodForTenants(client, tenantNames); WeaviateTestGenerics.IDS_BY_CLASS.forEach((className, ids) -> { ids.forEach(id -> { @@ -226,14 +242,14 @@ public void shouldNotGetObjectsWithoutTenant() { .withID(id) .run(); - assertMT.error(getResultByClassId, null, 500, "has multi-tenancy enabled, but request was without tenant"); // TODO 422? + assertMT.error(getResultByClassId, null, 422, "has multi-tenancy enabled, but request was without tenant"); }); Result> getResultByClass = client.data().objectsGetter() .withClassName(className) .run(); - assertMT.error(getResultByClass, null, 500, "has multi-tenancy enabled, but request was without tenant"); // TODO 422? + assertMT.error(getResultByClass, null, 422, "has multi-tenancy enabled, but request was without tenant"); }); Result> getResultAll = client.data().objectsGetter() @@ -247,10 +263,14 @@ public void shouldNotGetObjectsWithoutTenant() { @Test public void shouldCheckObjects() { - String[] tenants = new String[]{"TenantNo1", "TenantNo2"}; + Tenant[] tenants = new Tenant[]{ + WeaviateTestGenerics.TENANT_1, + WeaviateTestGenerics.TENANT_2, + }; + String[] tenantNames = Arrays.stream(tenants).map(Tenant::getName).toArray(String[]::new); testGenerics.createSchemaFoodForTenants(client); testGenerics.createTenantsFood(client, tenants); - testGenerics.createDataFoodForTenants(client, tenants); + testGenerics.createDataFoodForTenants(client, tenantNames); Arrays.stream(tenants).forEach(tenant -> WeaviateTestGenerics.IDS_BY_CLASS.forEach((className, ids) -> @@ -258,7 +278,7 @@ public void shouldCheckObjects() { Result checkResult = client.data().checker() .withClassName(className) .withID(id) - .withTenant(tenant) + .withTenant(tenant.getName()) .run(); assertThat(checkResult).isNotNull() @@ -271,10 +291,14 @@ public void shouldCheckObjects() { @Test public void shouldNotCheckObjectsWithoutTenant() { - String[] tenants = new String[]{"TenantNo1", "TenantNo2"}; + Tenant[] tenants = new Tenant[]{ + WeaviateTestGenerics.TENANT_1, + WeaviateTestGenerics.TENANT_2, + }; + String[] tenantNames = Arrays.stream(tenants).map(Tenant::getName).toArray(String[]::new); testGenerics.createSchemaFoodForTenants(client); testGenerics.createTenantsFood(client, tenants); - testGenerics.createDataFoodForTenants(client, tenants); + testGenerics.createDataFoodForTenants(client, tenantNames); WeaviateTestGenerics.IDS_BY_CLASS.forEach((className, ids) -> ids.forEach(id -> { @@ -287,7 +311,7 @@ public void shouldNotCheckObjectsWithoutTenant() { .returns(false, Result::getResult) .returns(true, Result::hasErrors) .extracting(Result::getError) - .returns(500, WeaviateError::getStatusCode) // TODO 422? + .returns(422, WeaviateError::getStatusCode) .extracting(WeaviateError::getMessages).asList() .isEmpty(); }) @@ -296,10 +320,14 @@ public void shouldNotCheckObjectsWithoutTenant() { @Test public void shouldDeleteObjects() { - String[] tenants = new String[]{"TenantNo1", "TenantNo2"}; + Tenant[] tenants = new Tenant[]{ + WeaviateTestGenerics.TENANT_1, + WeaviateTestGenerics.TENANT_2, + }; + String[] tenantNames = Arrays.stream(tenants).map(Tenant::getName).toArray(String[]::new); testGenerics.createSchemaFoodForTenants(client); testGenerics.createTenantsFood(client, tenants); - testGenerics.createDataFoodForTenants(client, tenants); + testGenerics.createDataFoodForTenants(client, tenantNames); Arrays.stream(tenants).forEach(tenant -> WeaviateTestGenerics.IDS_BY_CLASS.forEach((className, ids) -> { @@ -307,7 +335,7 @@ public void shouldDeleteObjects() { ids.forEach(id -> { Result deleteStatus = client.data().deleter() - .withTenant(tenant) + .withTenant(tenant.getName()) .withClassName(className) .withID(id) .run(); @@ -317,8 +345,8 @@ public void shouldDeleteObjects() { .returns(true, Result::getResult); // verify deleted - assertMT.objectDoesNotExist(className, id, tenant); - assertMT.countObjects(className, tenant, --expectedObjectsLeft[0]); + assertMT.objectDoesNotExist(className, id, tenant.getName()); + assertMT.countObjects(className, tenant.getName(), --expectedObjectsLeft[0]); }); }) ); @@ -326,10 +354,14 @@ public void shouldDeleteObjects() { @Test public void shouldNotDeleteObjectsWithoutTenant() { - String[] tenants = new String[]{"TenantNo1", "TenantNo2"}; + Tenant[] tenants = new Tenant[]{ + WeaviateTestGenerics.TENANT_1, + WeaviateTestGenerics.TENANT_2, + }; + String[] tenantNames = Arrays.stream(tenants).map(Tenant::getName).toArray(String[]::new); testGenerics.createSchemaFoodForTenants(client); testGenerics.createTenantsFood(client, tenants); - testGenerics.createDataFoodForTenants(client, tenants); + testGenerics.createDataFoodForTenants(client, tenantNames); WeaviateTestGenerics.IDS_BY_CLASS.forEach((className, ids) -> ids.forEach(id -> { @@ -338,27 +370,31 @@ public void shouldNotDeleteObjectsWithoutTenant() { .withID(id) .run(); - assertMT.error(deleteStatus, false, 500, "has multi-tenancy enabled, but request was without tenant"); // TODO 422? + assertMT.error(deleteStatus, false, 422, "has multi-tenancy enabled, but request was without tenant"); // verify not deleted Arrays.stream(tenants).forEach(tenant -> - assertMT.objectExists(className, id, tenant) + assertMT.objectExists(className, id, tenant.getName()) ); }) ); // verify not deleted Arrays.stream(tenants).forEach(tenant -> - assertMT.countObjects(tenant, WeaviateTestGenerics.IDS_ALL.size()) + assertMT.countObjects(tenant.getName(), WeaviateTestGenerics.IDS_ALL.size()) ); } @Test public void shouldUpdateObjects() { - String[] tenants = new String[]{"TenantNo1", "TenantNo2"}; + Tenant[] tenants = new Tenant[]{ + WeaviateTestGenerics.TENANT_1, + WeaviateTestGenerics.TENANT_2, + }; + String[] tenantNames = Arrays.stream(tenants).map(Tenant::getName).toArray(String[]::new); testGenerics.createSchemaSoupForTenants(client); testGenerics.createTenantsSoup(client, tenants); - testGenerics.createDataSoupForTenants(client, tenants); + testGenerics.createDataSoupForTenants(client, tenantNames); Map propsChicken = new HashMap<>(); propsChicken.put("name", "ChickenSoup"); @@ -374,7 +410,7 @@ public void shouldUpdateObjects() { Arrays.stream(tenants).forEach(tenant -> { Result soupChickenStatus = client.data().updater() - .withTenant(tenant) + .withTenant(tenant.getName()) .withClassName("Soup") .withID(WeaviateTestGenerics.SOUP_CHICKENSOUP_ID) .withProperties(propsChicken) @@ -385,7 +421,7 @@ public void shouldUpdateObjects() { .returns(true, Result::getResult); Result soupBeautifulStatus = client.data().updater() - .withTenant(tenant) + .withTenant(tenant.getName()) .withClassName("Soup") .withID(WeaviateTestGenerics.SOUP_BEAUTIFUL_ID) .withProperties(propsBeautiful) @@ -397,7 +433,7 @@ public void shouldUpdateObjects() { // verify updated Result> soupChicken = client.data().objectsGetter() - .withTenant(tenant) + .withTenant(tenant.getName()) .withClassName("Soup") .withID(WeaviateTestGenerics.SOUP_CHICKENSOUP_ID) .run(); @@ -408,7 +444,7 @@ public void shouldUpdateObjects() { .hasSize(1) .first() .extracting(o -> (WeaviateObject) o) - .returns(tenant, WeaviateObject::getTenant) + .returns(tenant.getName(), WeaviateObject::getTenant) .extracting(WeaviateObject::getProperties) .returns(propsChicken.get("name"), p -> p.get("name")) .returns(propsChicken.get("description"), p -> p.get("description")) @@ -416,7 +452,7 @@ public void shouldUpdateObjects() { .returns(propsChicken.get("bestBefore"), p -> p.get("bestBefore")); Result> soupBeautiful = client.data().objectsGetter() - .withTenant(tenant) + .withTenant(tenant.getName()) .withClassName("Soup") .withID(WeaviateTestGenerics.SOUP_BEAUTIFUL_ID) .run(); @@ -427,7 +463,7 @@ public void shouldUpdateObjects() { .hasSize(1) .first() .extracting(o -> (WeaviateObject) o) - .returns(tenant, WeaviateObject::getTenant) + .returns(tenant.getName(), WeaviateObject::getTenant) .extracting(WeaviateObject::getProperties) .returns(propsBeautiful.get("name"), p -> p.get("name")) .returns(propsBeautiful.get("description"), p -> p.get("description")) @@ -438,10 +474,14 @@ public void shouldUpdateObjects() { @Test public void shouldNotUpdateObjectsWithoutTenant() { - String[] tenants = new String[]{"TenantNo1", "TenantNo2"}; + Tenant[] tenants = new Tenant[]{ + WeaviateTestGenerics.TENANT_1, + WeaviateTestGenerics.TENANT_2, + }; + String[] tenantNames = Arrays.stream(tenants).map(Tenant::getName).toArray(String[]::new); testGenerics.createSchemaSoupForTenants(client); testGenerics.createTenantsSoup(client, tenants); - testGenerics.createDataSoupForTenants(client, tenants); + testGenerics.createDataSoupForTenants(client, tenantNames); Map propsChicken = new HashMap<>(); propsChicken.put("name", "ChickenSoup"); @@ -461,7 +501,7 @@ public void shouldNotUpdateObjectsWithoutTenant() { .withProperties(propsChicken) .run(); - assertMT.error(soupChickenStatus, false, 500, "has multi-tenancy enabled, but request was without tenant"); // TODO 422? + assertMT.error(soupChickenStatus, false, 422, "has multi-tenancy enabled, but request was without tenant"); Result soupBeautifulStatus = client.data().updater() .withClassName("Soup") @@ -469,12 +509,12 @@ public void shouldNotUpdateObjectsWithoutTenant() { .withProperties(propsBeautiful) .run(); - assertMT.error(soupBeautifulStatus, false, 500, "has multi-tenancy enabled, but request was without tenant"); // TODO 422? + assertMT.error(soupBeautifulStatus, false, 422, "has multi-tenancy enabled, but request was without tenant"); // verify not updated Arrays.stream(tenants).forEach(tenant -> { Result> soupChicken = client.data().objectsGetter() - .withTenant(tenant) + .withTenant(tenant.getName()) .withClassName("Soup") .withID(WeaviateTestGenerics.SOUP_CHICKENSOUP_ID) .run(); @@ -485,7 +525,7 @@ public void shouldNotUpdateObjectsWithoutTenant() { .hasSize(1) .first() .extracting(o -> (WeaviateObject) o) - .returns(tenant, WeaviateObject::getTenant) + .returns(tenant.getName(), WeaviateObject::getTenant) .extracting(WeaviateObject::getProperties) .returns("ChickenSoup", p -> p.get("name")) .returns("Used by humans when their inferior genetics are attacked by microscopic organisms.", p -> p.get("description")) @@ -493,7 +533,7 @@ public void shouldNotUpdateObjectsWithoutTenant() { .returns("2022-05-06T07:08:09+05:00", p -> p.get("bestBefore")); Result> soupBeautiful = client.data().objectsGetter() - .withTenant(tenant) + .withTenant(tenant.getName()) .withClassName("Soup") .withID(WeaviateTestGenerics.SOUP_BEAUTIFUL_ID) .run(); @@ -504,7 +544,7 @@ public void shouldNotUpdateObjectsWithoutTenant() { .hasSize(1) .first() .extracting(o -> (WeaviateObject) o) - .returns(tenant, WeaviateObject::getTenant) + .returns(tenant.getName(), WeaviateObject::getTenant) .extracting(WeaviateObject::getProperties) .returns("Beautiful", p -> p.get("name")) .returns("Putting the game of letter soups to a whole new level.", p -> p.get("description")) @@ -515,10 +555,14 @@ public void shouldNotUpdateObjectsWithoutTenant() { @Test public void shouldMergeObjects() { - String[] tenants = new String[]{"TenantNo1", "TenantNo2"}; + Tenant[] tenants = new Tenant[]{ + WeaviateTestGenerics.TENANT_1, + WeaviateTestGenerics.TENANT_2, + }; + String[] tenantNames = Arrays.stream(tenants).map(Tenant::getName).toArray(String[]::new); testGenerics.createSchemaSoupForTenants(client); testGenerics.createTenantsSoup(client, tenants); - testGenerics.createDataSoupForTenants(client, tenants); + testGenerics.createDataSoupForTenants(client, tenantNames); Map propsChicken = new HashMap<>(); propsChicken.put("description", "updated ChickenSoup description"); @@ -530,7 +574,7 @@ public void shouldMergeObjects() { Arrays.stream(tenants).forEach(tenant -> { Result soupChickenStatus = client.data().updater() - .withTenant(tenant) + .withTenant(tenant.getName()) .withClassName("Soup") .withID(WeaviateTestGenerics.SOUP_CHICKENSOUP_ID) .withProperties(propsChicken) @@ -542,7 +586,7 @@ public void shouldMergeObjects() { .returns(true, Result::getResult); Result soupBeautifulStatus = client.data().updater() - .withTenant(tenant) + .withTenant(tenant.getName()) .withClassName("Soup") .withID(WeaviateTestGenerics.SOUP_BEAUTIFUL_ID) .withProperties(propsBeautiful) @@ -555,7 +599,7 @@ public void shouldMergeObjects() { // verify merged Result> soupChicken = client.data().objectsGetter() - .withTenant(tenant) + .withTenant(tenant.getName()) .withClassName("Soup") .withID(WeaviateTestGenerics.SOUP_CHICKENSOUP_ID) .run(); @@ -566,7 +610,7 @@ public void shouldMergeObjects() { .hasSize(1) .first() .extracting(o -> (WeaviateObject) o) - .returns(tenant, WeaviateObject::getTenant) + .returns(tenant.getName(), WeaviateObject::getTenant) .extracting(WeaviateObject::getProperties) .returns("ChickenSoup", p -> p.get("name")) .returns(propsChicken.get("description"), p -> p.get("description")) @@ -574,7 +618,7 @@ public void shouldMergeObjects() { .returns("2022-05-06T07:08:09+05:00", p -> p.get("bestBefore")); Result> soupBeautiful = client.data().objectsGetter() - .withTenant(tenant) + .withTenant(tenant.getName()) .withClassName("Soup") .withID(WeaviateTestGenerics.SOUP_BEAUTIFUL_ID) .run(); @@ -585,7 +629,7 @@ public void shouldMergeObjects() { .hasSize(1) .first() .extracting(o -> (WeaviateObject) o) - .returns(tenant, WeaviateObject::getTenant) + .returns(tenant.getName(), WeaviateObject::getTenant) .extracting(WeaviateObject::getProperties) .returns("Beautiful", p -> p.get("name")) .returns(propsBeautiful.get("description"), p -> p.get("description")) @@ -596,10 +640,14 @@ public void shouldMergeObjects() { @Test public void shouldNotMergeObjectsWithoutTenant() { - String[] tenants = new String[]{"TenantNo1", "TenantNo2"}; + Tenant[] tenants = new Tenant[]{ + WeaviateTestGenerics.TENANT_1, + WeaviateTestGenerics.TENANT_2, + }; + String[] tenantNames = Arrays.stream(tenants).map(Tenant::getName).toArray(String[]::new); testGenerics.createSchemaSoupForTenants(client); testGenerics.createTenantsSoup(client, tenants); - testGenerics.createDataSoupForTenants(client, tenants); + testGenerics.createDataSoupForTenants(client, tenantNames); Map propsChicken = new HashMap<>(); propsChicken.put("description", "updated ChickenSoup description"); @@ -616,7 +664,7 @@ public void shouldNotMergeObjectsWithoutTenant() { .withMerge() .run(); - assertMT.error(soupChickenStatus, false, 500, "has multi-tenancy enabled, but request was without tenant"); // TODO 422? + assertMT.error(soupChickenStatus, false, 422, "has multi-tenancy enabled, but request was without tenant"); Result soupBeautifulStatus = client.data().updater() .withClassName("Soup") @@ -625,12 +673,12 @@ public void shouldNotMergeObjectsWithoutTenant() { .withMerge() .run(); - assertMT.error(soupBeautifulStatus, false, 500, "has multi-tenancy enabled, but request was without tenant"); // TODO 422? + assertMT.error(soupBeautifulStatus, false, 422, "has multi-tenancy enabled, but request was without tenant"); // verify not updated Arrays.stream(tenants).forEach(tenant -> { Result> soupChicken = client.data().objectsGetter() - .withTenant(tenant) + .withTenant(tenant.getName()) .withClassName("Soup") .withID(WeaviateTestGenerics.SOUP_CHICKENSOUP_ID) .run(); @@ -641,7 +689,7 @@ public void shouldNotMergeObjectsWithoutTenant() { .hasSize(1) .first() .extracting(o -> (WeaviateObject) o) - .returns(tenant, WeaviateObject::getTenant) + .returns(tenant.getName(), WeaviateObject::getTenant) .extracting(WeaviateObject::getProperties) .returns("ChickenSoup", p -> p.get("name")) .returns("Used by humans when their inferior genetics are attacked by microscopic organisms.", p -> p.get("description")) @@ -649,7 +697,7 @@ public void shouldNotMergeObjectsWithoutTenant() { .returns("2022-05-06T07:08:09+05:00", p -> p.get("bestBefore")); Result> soupBeautiful = client.data().objectsGetter() - .withTenant(tenant) + .withTenant(tenant.getName()) .withClassName("Soup") .withID(WeaviateTestGenerics.SOUP_BEAUTIFUL_ID) .run(); @@ -660,7 +708,7 @@ public void shouldNotMergeObjectsWithoutTenant() { .hasSize(1) .first() .extracting(o -> (WeaviateObject) o) - .returns(tenant, WeaviateObject::getTenant) + .returns(tenant.getName(), WeaviateObject::getTenant) .extracting(WeaviateObject::getProperties) .returns("Beautiful", p -> p.get("name")) .returns("Putting the game of letter soups to a whole new level.", p -> p.get("description")) diff --git a/src/test/java/io/weaviate/integration/client/data/ClientReferencesMultiTenancyTest.java b/src/test/java/io/weaviate/integration/client/data/ClientReferencesMultiTenancyTest.java index c9b0d9b83..f3808ba74 100644 --- a/src/test/java/io/weaviate/integration/client/data/ClientReferencesMultiTenancyTest.java +++ b/src/test/java/io/weaviate/integration/client/data/ClientReferencesMultiTenancyTest.java @@ -10,6 +10,7 @@ import io.weaviate.client.v1.data.model.SingleRef; import io.weaviate.client.v1.data.model.WeaviateObject; import io.weaviate.client.v1.schema.model.Property; +import io.weaviate.client.v1.schema.model.Tenant; import io.weaviate.integration.client.AssertMultiTenancy; import io.weaviate.integration.client.WeaviateTestGenerics; import org.junit.After; @@ -59,15 +60,19 @@ public void after() { @Test public void shouldCreateReferencesBetweenMTClasses() { - String[] tenants = new String[]{"TenantNo1", "TenantNo2"}; + Tenant[] tenants = new Tenant[]{ + WeaviateTestGenerics.TENANT_1, + WeaviateTestGenerics.TENANT_2, + }; + String[] tenantNames = Arrays.stream(tenants).map(Tenant::getName).toArray(String[]::new); List soupIds = WeaviateTestGenerics.IDS_BY_CLASS.get("Soup"); List pizzaIds = WeaviateTestGenerics.IDS_BY_CLASS.get("Pizza"); testGenerics.createSchemaSoupForTenants(client); testGenerics.createTenantsSoup(client, tenants); - testGenerics.createDataSoupForTenants(client, tenants); + testGenerics.createDataSoupForTenants(client, tenantNames); testGenerics.createSchemaPizzaForTenants(client); testGenerics.createTenantsPizza(client, tenants); - testGenerics.createDataPizzaForTenants(client, tenants); + testGenerics.createDataPizzaForTenants(client, tenantNames); createSoupToPizzaRefProp(); @@ -84,7 +89,7 @@ public void shouldCreateReferencesBetweenMTClasses() { .withID(soupId) .withReferenceProperty("relatedToPizza") .withReference(pizzaRef) - .withTenant(tenant) + .withTenant(tenant.getName()) .run(); assertThat(result).isNotNull() @@ -98,7 +103,7 @@ public void shouldCreateReferencesBetweenMTClasses() { Arrays.stream(tenants).forEach(tenant -> soupIds.forEach(soupId -> { Result> getSoupResult = client.data().objectsGetter() - .withTenant(tenant) + .withTenant(tenant.getName()) .withClassName("Soup") .withID(soupId) .run(); @@ -117,15 +122,19 @@ public void shouldCreateReferencesBetweenMTClasses() { @Test public void shouldNotCreateReferencesBetweenMTClassesWithoutTenant() { - String[] tenants = new String[]{"TenantNo1", "TenantNo2"}; + Tenant[] tenants = new Tenant[]{ + WeaviateTestGenerics.TENANT_1, + WeaviateTestGenerics.TENANT_2, + }; + String[] tenantNames = Arrays.stream(tenants).map(Tenant::getName).toArray(String[]::new); List soupIds = WeaviateTestGenerics.IDS_BY_CLASS.get("Soup"); List pizzaIds = WeaviateTestGenerics.IDS_BY_CLASS.get("Pizza"); testGenerics.createSchemaSoupForTenants(client); testGenerics.createTenantsSoup(client, tenants); - testGenerics.createDataSoupForTenants(client, tenants); + testGenerics.createDataSoupForTenants(client, tenantNames); testGenerics.createSchemaPizzaForTenants(client); testGenerics.createTenantsPizza(client, tenants); - testGenerics.createDataPizzaForTenants(client, tenants); + testGenerics.createDataPizzaForTenants(client, tenantNames); createSoupToPizzaRefProp(); @@ -151,7 +160,7 @@ public void shouldNotCreateReferencesBetweenMTClassesWithoutTenant() { Arrays.stream(tenants).forEach(tenant -> soupIds.forEach(soupId -> { Result> getSoupResult = client.data().objectsGetter() - .withTenant(tenant) + .withTenant(tenant.getName()) .withClassName("Soup") .withID(soupId) .run(); @@ -170,18 +179,22 @@ public void shouldNotCreateReferencesBetweenMTClassesWithoutTenant() { @Test public void shouldDeleteReferencesBetweenMTClasses() { - String[] tenants = new String[]{"TenantNo1", "TenantNo2"}; + Tenant[] tenants = new Tenant[]{ + WeaviateTestGenerics.TENANT_1, + WeaviateTestGenerics.TENANT_2, + }; + String[] tenantNames = Arrays.stream(tenants).map(Tenant::getName).toArray(String[]::new); List soupIds = WeaviateTestGenerics.IDS_BY_CLASS.get("Soup"); List pizzaIds = WeaviateTestGenerics.IDS_BY_CLASS.get("Pizza"); testGenerics.createSchemaSoupForTenants(client); testGenerics.createTenantsSoup(client, tenants); - testGenerics.createDataSoupForTenants(client, tenants); + testGenerics.createDataSoupForTenants(client, tenantNames); testGenerics.createSchemaPizzaForTenants(client); testGenerics.createTenantsPizza(client, tenants); - testGenerics.createDataPizzaForTenants(client, tenants); + testGenerics.createDataPizzaForTenants(client, tenantNames); createSoupToPizzaRefProp(); - createSoupToPizzaRefs(soupIds, pizzaIds, tenants); + createSoupToPizzaRefs(soupIds, pizzaIds, tenantNames); Arrays.stream(tenants).forEach(tenant -> soupIds.forEach(soupId -> { @@ -198,7 +211,7 @@ public void shouldDeleteReferencesBetweenMTClasses() { .withID(soupId) .withReferenceProperty("relatedToPizza") .withReference(pizzaRef) - .withTenant(tenant) + .withTenant(tenant.getName()) .run(); assertThat(result).isNotNull() @@ -207,7 +220,7 @@ public void shouldDeleteReferencesBetweenMTClasses() { // verify deleted one by one Result> getSoupResult = client.data().objectsGetter() - .withTenant(tenant) + .withTenant(tenant.getName()) .withClassName("Soup") .withID(soupId) .run(); @@ -227,18 +240,22 @@ public void shouldDeleteReferencesBetweenMTClasses() { @Test public void shouldNotDeleteReferencesBetweenMTClassesWithoutTenant() { - String[] tenants = new String[]{"TenantNo1", "TenantNo2"}; + Tenant[] tenants = new Tenant[]{ + WeaviateTestGenerics.TENANT_1, + WeaviateTestGenerics.TENANT_2, + }; + String[] tenantNames = Arrays.stream(tenants).map(Tenant::getName).toArray(String[]::new); List soupIds = WeaviateTestGenerics.IDS_BY_CLASS.get("Soup"); List pizzaIds = WeaviateTestGenerics.IDS_BY_CLASS.get("Pizza"); testGenerics.createSchemaSoupForTenants(client); testGenerics.createTenantsSoup(client, tenants); - testGenerics.createDataSoupForTenants(client, tenants); + testGenerics.createDataSoupForTenants(client, tenantNames); testGenerics.createSchemaPizzaForTenants(client); testGenerics.createTenantsPizza(client, tenants); - testGenerics.createDataPizzaForTenants(client, tenants); + testGenerics.createDataPizzaForTenants(client, tenantNames); createSoupToPizzaRefProp(); - createSoupToPizzaRefs(soupIds, pizzaIds, tenants); + createSoupToPizzaRefs(soupIds, pizzaIds, tenantNames); soupIds.forEach(soupId -> { pizzaIds.forEach(pizzaId -> { @@ -254,7 +271,7 @@ public void shouldNotDeleteReferencesBetweenMTClassesWithoutTenant() { .withReference(pizzaRef) .run(); - assertMT.error(result, false, 500, "has multi-tenancy enabled, but request was without tenant"); // TODO 422? + assertMT.error(result, false, 422, "has multi-tenancy enabled, but request was without tenant"); }); }); @@ -262,7 +279,7 @@ public void shouldNotDeleteReferencesBetweenMTClassesWithoutTenant() { Arrays.stream(tenants).forEach(tenant -> soupIds.forEach(soupId -> { Result> getSoupResult = client.data().objectsGetter() - .withTenant(tenant) + .withTenant(tenant.getName()) .withClassName("Soup") .withID(soupId) .run(); @@ -281,20 +298,24 @@ public void shouldNotDeleteReferencesBetweenMTClassesWithoutTenant() { @Test public void shouldReplaceReferencesBetweenMTClasses() { - String[] tenants = new String[]{"TenantNo1", "TenantNo2"}; + Tenant[] tenants = new Tenant[]{ + WeaviateTestGenerics.TENANT_1, + WeaviateTestGenerics.TENANT_2, + }; + String[] tenantNames = Arrays.stream(tenants).map(Tenant::getName).toArray(String[]::new); List soupIds = WeaviateTestGenerics.IDS_BY_CLASS.get("Soup"); List pizzaIds = WeaviateTestGenerics.IDS_BY_CLASS.get("Pizza"); List pizzaIdsBefore = pizzaIds.subList(0, 2); List pizzaIdsAfter = pizzaIds.subList(2, pizzaIds.size()); testGenerics.createSchemaSoupForTenants(client); testGenerics.createTenantsSoup(client, tenants); - testGenerics.createDataSoupForTenants(client, tenants); + testGenerics.createDataSoupForTenants(client, tenantNames); testGenerics.createSchemaPizzaForTenants(client); testGenerics.createTenantsPizza(client, tenants); - testGenerics.createDataPizzaForTenants(client, tenants); + testGenerics.createDataPizzaForTenants(client, tenantNames); createSoupToPizzaRefProp(); - createSoupToPizzaRefs(soupIds, pizzaIdsBefore, tenants); + createSoupToPizzaRefs(soupIds, pizzaIdsBefore, tenantNames); Arrays.stream(tenants).forEach(tenant -> soupIds.forEach(soupId -> { @@ -310,7 +331,7 @@ public void shouldReplaceReferencesBetweenMTClasses() { .withID(soupId) .withReferenceProperty("relatedToPizza") .withReferences(refs) - .withTenant(tenant) + .withTenant(tenant.getName()) .run(); assertThat(result).isNotNull() @@ -323,7 +344,7 @@ public void shouldReplaceReferencesBetweenMTClasses() { Arrays.stream(tenants).forEach(tenant -> { soupIds.forEach(soupId -> { Result> getSoupResult = client.data().objectsGetter() - .withTenant(tenant) + .withTenant(tenant.getName()) .withClassName("Soup") .withID(soupId) .run(); @@ -353,20 +374,24 @@ public void shouldReplaceReferencesBetweenMTClasses() { @Test public void shouldNotReplaceReferencesBetweenMTClassesWithoutTenant() { - String[] tenants = new String[]{"TenantNo1", "TenantNo2"}; + Tenant[] tenants = new Tenant[]{ + WeaviateTestGenerics.TENANT_1, + WeaviateTestGenerics.TENANT_2, + }; + String[] tenantNames = Arrays.stream(tenants).map(Tenant::getName).toArray(String[]::new); List soupIds = WeaviateTestGenerics.IDS_BY_CLASS.get("Soup"); List pizzaIds = WeaviateTestGenerics.IDS_BY_CLASS.get("Pizza"); List pizzaIdsBefore = pizzaIds.subList(0, 2); List pizzaIdsAfter = pizzaIds.subList(2, pizzaIds.size()); testGenerics.createSchemaSoupForTenants(client); testGenerics.createTenantsSoup(client, tenants); - testGenerics.createDataSoupForTenants(client, tenants); + testGenerics.createDataSoupForTenants(client, tenantNames); testGenerics.createSchemaPizzaForTenants(client); testGenerics.createTenantsPizza(client, tenants); - testGenerics.createDataPizzaForTenants(client, tenants); + testGenerics.createDataPizzaForTenants(client, tenantNames); createSoupToPizzaRefProp(); - createSoupToPizzaRefs(soupIds, pizzaIdsBefore, tenants); + createSoupToPizzaRefs(soupIds, pizzaIdsBefore, tenantNames); soupIds.forEach(soupId -> { SingleRef[] refs = pizzaIdsAfter.stream().map(pizzaId -> @@ -383,14 +408,14 @@ public void shouldNotReplaceReferencesBetweenMTClassesWithoutTenant() { .withReferences(refs) .run(); - assertMT.error(result, false, 500, "has multi-tenancy enabled, but request was without tenant"); // TODO 422? + assertMT.error(result, false, 422, "has multi-tenancy enabled, but request was without tenant"); }); // verify not replaced Arrays.stream(tenants).forEach(tenant -> { soupIds.forEach(soupId -> { Result> getSoupResult = client.data().objectsGetter() - .withTenant(tenant) + .withTenant(tenant.getName()) .withClassName("Soup") .withID(soupId) .run(); @@ -420,12 +445,16 @@ public void shouldNotReplaceReferencesBetweenMTClassesWithoutTenant() { @Test public void shouldCreateReferencesBetweenMTAndNonMTClasses() { - String[] tenants = new String[]{"TenantNo1", "TenantNo2"}; + Tenant[] tenants = new Tenant[]{ + WeaviateTestGenerics.TENANT_1, + WeaviateTestGenerics.TENANT_2, + }; + String[] tenantNames = Arrays.stream(tenants).map(Tenant::getName).toArray(String[]::new); List soupIds = WeaviateTestGenerics.IDS_BY_CLASS.get("Soup"); List pizzaIds = WeaviateTestGenerics.IDS_BY_CLASS.get("Pizza"); testGenerics.createSchemaSoupForTenants(client); testGenerics.createTenantsSoup(client, tenants); - testGenerics.createDataSoupForTenants(client, tenants); + testGenerics.createDataSoupForTenants(client, tenantNames); testGenerics.createSchemaPizza(client); testGenerics.createDataPizza(client); @@ -444,7 +473,7 @@ public void shouldCreateReferencesBetweenMTAndNonMTClasses() { .withID(soupId) .withReferenceProperty("relatedToPizza") .withReference(pizzaRef) - .withTenant(tenant) + .withTenant(tenant.getName()) .run(); assertThat(result).isNotNull() @@ -458,7 +487,7 @@ public void shouldCreateReferencesBetweenMTAndNonMTClasses() { Arrays.stream(tenants).forEach(tenant -> soupIds.forEach(soupId -> { Result> getSoupResult = client.data().objectsGetter() - .withTenant(tenant) + .withTenant(tenant.getName()) .withClassName("Soup") .withID(soupId) .run(); @@ -477,12 +506,16 @@ public void shouldCreateReferencesBetweenMTAndNonMTClasses() { @Test public void shouldNotCreateReferencesBetweenMTAndNotMTClassesWithoutTenant() { - String[] tenants = new String[]{"TenantNo1", "TenantNo2"}; + Tenant[] tenants = new Tenant[]{ + WeaviateTestGenerics.TENANT_1, + WeaviateTestGenerics.TENANT_2, + }; + String[] tenantNames = Arrays.stream(tenants).map(Tenant::getName).toArray(String[]::new); List soupIds = WeaviateTestGenerics.IDS_BY_CLASS.get("Soup"); List pizzaIds = WeaviateTestGenerics.IDS_BY_CLASS.get("Pizza"); testGenerics.createSchemaSoupForTenants(client); testGenerics.createTenantsSoup(client, tenants); - testGenerics.createDataSoupForTenants(client, tenants); + testGenerics.createDataSoupForTenants(client, tenantNames); testGenerics.createSchemaPizza(client); testGenerics.createDataPizza(client); @@ -502,7 +535,7 @@ public void shouldNotCreateReferencesBetweenMTAndNotMTClassesWithoutTenant() { .withReference(pizzaRef) .run(); - assertMT.error(refAddResult, false, 500, "has multi-tenancy enabled, but request was without tenant"); // TODO 422? + assertMT.error(refAddResult, false, 422, "has multi-tenancy enabled, but request was without tenant"); }) ); @@ -510,7 +543,7 @@ public void shouldNotCreateReferencesBetweenMTAndNotMTClassesWithoutTenant() { Arrays.stream(tenants).forEach(tenant -> soupIds.forEach(soupId -> { Result> getSoupResult = client.data().objectsGetter() - .withTenant(tenant) + .withTenant(tenant.getName()) .withClassName("Soup") .withID(soupId) .run(); @@ -529,17 +562,21 @@ public void shouldNotCreateReferencesBetweenMTAndNotMTClassesWithoutTenant() { @Test public void shouldDeleteReferencesBetweenMTAndNonMTClasses() { - String[] tenants = new String[]{"TenantNo1", "TenantNo2"}; + Tenant[] tenants = new Tenant[]{ + WeaviateTestGenerics.TENANT_1, + WeaviateTestGenerics.TENANT_2, + }; + String[] tenantNames = Arrays.stream(tenants).map(Tenant::getName).toArray(String[]::new); List soupIds = WeaviateTestGenerics.IDS_BY_CLASS.get("Soup"); List pizzaIds = WeaviateTestGenerics.IDS_BY_CLASS.get("Pizza"); testGenerics.createSchemaSoupForTenants(client); testGenerics.createTenantsSoup(client, tenants); - testGenerics.createDataSoupForTenants(client, tenants); + testGenerics.createDataSoupForTenants(client, tenantNames); testGenerics.createSchemaPizza(client); testGenerics.createDataPizza(client); createSoupToPizzaRefProp(); - createSoupToPizzaRefs(soupIds, pizzaIds, tenants); + createSoupToPizzaRefs(soupIds, pizzaIds, tenantNames); Arrays.stream(tenants).forEach(tenant -> soupIds.forEach(soupId -> { @@ -556,7 +593,7 @@ public void shouldDeleteReferencesBetweenMTAndNonMTClasses() { .withID(soupId) .withReferenceProperty("relatedToPizza") .withReference(pizzaRef) - .withTenant(tenant) + .withTenant(tenant.getName()) .run(); assertThat(result).isNotNull() @@ -565,7 +602,7 @@ public void shouldDeleteReferencesBetweenMTAndNonMTClasses() { // verify deleted one by one Result> getSoupResult = client.data().objectsGetter() - .withTenant(tenant) + .withTenant(tenant.getName()) .withClassName("Soup") .withID(soupId) .run(); @@ -585,17 +622,21 @@ public void shouldDeleteReferencesBetweenMTAndNonMTClasses() { @Test public void shouldNotDeleteReferencesBetweenMTAndNonMTClassesWithoutTenant() { - String[] tenants = new String[]{"TenantNo1", "TenantNo2"}; + Tenant[] tenants = new Tenant[]{ + WeaviateTestGenerics.TENANT_1, + WeaviateTestGenerics.TENANT_2, + }; + String[] tenantNames = Arrays.stream(tenants).map(Tenant::getName).toArray(String[]::new); List soupIds = WeaviateTestGenerics.IDS_BY_CLASS.get("Soup"); List pizzaIds = WeaviateTestGenerics.IDS_BY_CLASS.get("Pizza"); testGenerics.createSchemaSoupForTenants(client); testGenerics.createTenantsSoup(client, tenants); - testGenerics.createDataSoupForTenants(client, tenants); + testGenerics.createDataSoupForTenants(client, tenantNames); testGenerics.createSchemaPizza(client); testGenerics.createDataPizza(client); createSoupToPizzaRefProp(); - createSoupToPizzaRefs(soupIds, pizzaIds, tenants); + createSoupToPizzaRefs(soupIds, pizzaIds, tenantNames); soupIds.forEach(soupId -> { pizzaIds.forEach(pizzaId -> { @@ -611,7 +652,7 @@ public void shouldNotDeleteReferencesBetweenMTAndNonMTClassesWithoutTenant() { .withReference(pizzaRef) .run(); - assertMT.error(result, false, 500, "has multi-tenancy enabled, but request was without tenant"); // TODO 422? + assertMT.error(result, false, 422, "has multi-tenancy enabled, but request was without tenant"); }); }); @@ -619,7 +660,7 @@ public void shouldNotDeleteReferencesBetweenMTAndNonMTClassesWithoutTenant() { Arrays.stream(tenants).forEach(tenant -> soupIds.forEach(soupId -> { Result> getSoupResult = client.data().objectsGetter() - .withTenant(tenant) + .withTenant(tenant.getName()) .withClassName("Soup") .withID(soupId) .run(); @@ -638,19 +679,23 @@ public void shouldNotDeleteReferencesBetweenMTAndNonMTClassesWithoutTenant() { @Test public void shouldReplaceReferencesBetweenMTAndNonMTClasses() { - String[] tenants = new String[]{"TenantNo1", "TenantNo2"}; + Tenant[] tenants = new Tenant[]{ + WeaviateTestGenerics.TENANT_1, + WeaviateTestGenerics.TENANT_2, + }; + String[] tenantNames = Arrays.stream(tenants).map(Tenant::getName).toArray(String[]::new); List soupIds = WeaviateTestGenerics.IDS_BY_CLASS.get("Soup"); List pizzaIds = WeaviateTestGenerics.IDS_BY_CLASS.get("Pizza"); List pizzaIdsBefore = pizzaIds.subList(0, 2); List pizzaIdsAfter = pizzaIds.subList(2, pizzaIds.size()); testGenerics.createSchemaSoupForTenants(client); testGenerics.createTenantsSoup(client, tenants); - testGenerics.createDataSoupForTenants(client, tenants); + testGenerics.createDataSoupForTenants(client, tenantNames); testGenerics.createSchemaPizza(client); testGenerics.createDataPizza(client); createSoupToPizzaRefProp(); - createSoupToPizzaRefs(soupIds, pizzaIdsBefore, tenants); + createSoupToPizzaRefs(soupIds, pizzaIdsBefore, tenantNames); Arrays.stream(tenants).forEach(tenant -> soupIds.forEach(soupId -> { @@ -666,7 +711,7 @@ public void shouldReplaceReferencesBetweenMTAndNonMTClasses() { .withID(soupId) .withReferenceProperty("relatedToPizza") .withReferences(refs) - .withTenant(tenant) + .withTenant(tenant.getName()) .run(); assertThat(result).isNotNull() @@ -679,7 +724,7 @@ public void shouldReplaceReferencesBetweenMTAndNonMTClasses() { Arrays.stream(tenants).forEach(tenant -> { soupIds.forEach(soupId -> { Result> getSoupResult = client.data().objectsGetter() - .withTenant(tenant) + .withTenant(tenant.getName()) .withClassName("Soup") .withID(soupId) .run(); @@ -709,19 +754,23 @@ public void shouldReplaceReferencesBetweenMTAndNonMTClasses() { @Test public void shouldNotReplaceReferencesBetweenMTAndNonMtClassesWithoutTenant() { - String[] tenants = new String[]{"TenantNo1", "TenantNo2"}; + Tenant[] tenants = new Tenant[]{ + WeaviateTestGenerics.TENANT_1, + WeaviateTestGenerics.TENANT_2, + }; + String[] tenantNames = Arrays.stream(tenants).map(Tenant::getName).toArray(String[]::new); List soupIds = WeaviateTestGenerics.IDS_BY_CLASS.get("Soup"); List pizzaIds = WeaviateTestGenerics.IDS_BY_CLASS.get("Pizza"); List pizzaIdsBefore = pizzaIds.subList(0, 2); List pizzaIdsAfter = pizzaIds.subList(2, pizzaIds.size()); testGenerics.createSchemaSoupForTenants(client); testGenerics.createTenantsSoup(client, tenants); - testGenerics.createDataSoupForTenants(client, tenants); + testGenerics.createDataSoupForTenants(client, tenantNames); testGenerics.createSchemaPizza(client); testGenerics.createDataPizza(client); createSoupToPizzaRefProp(); - createSoupToPizzaRefs(soupIds, pizzaIdsBefore, tenants); + createSoupToPizzaRefs(soupIds, pizzaIdsBefore, tenantNames); soupIds.forEach(soupId -> { SingleRef[] refs = pizzaIdsAfter.stream().map(pizzaId -> @@ -738,14 +787,14 @@ public void shouldNotReplaceReferencesBetweenMTAndNonMtClassesWithoutTenant() { .withReferences(refs) .run(); - assertMT.error(result, false, 500, "has multi-tenancy enabled, but request was without tenant"); // TODO 422? + assertMT.error(result, false, 422, "has multi-tenancy enabled, but request was without tenant"); }); // verify not replaced Arrays.stream(tenants).forEach(tenant -> { soupIds.forEach(soupId -> { Result> getSoupResult = client.data().objectsGetter() - .withTenant(tenant) + .withTenant(tenant.getName()) .withClassName("Soup") .withID(soupId) .run(); @@ -775,14 +824,14 @@ public void shouldNotReplaceReferencesBetweenMTAndNonMtClassesWithoutTenant() { @Test public void shouldNotCreateReferencesBetweenNonMTAndMTClasses() { - String tenantPizza = "tenantPizza"; + Tenant tenantPizza = Tenant.builder().name("tenantPizza").build(); List soupIds = WeaviateTestGenerics.IDS_BY_CLASS.get("Soup"); List pizzaIds = WeaviateTestGenerics.IDS_BY_CLASS.get("Pizza"); testGenerics.createSchemaSoup(client); testGenerics.createDataSoup(client); testGenerics.createSchemaPizzaForTenants(client); testGenerics.createTenantsPizza(client, tenantPizza); - testGenerics.createDataPizzaForTenants(client, tenantPizza); + testGenerics.createDataPizzaForTenants(client, tenantPizza.getName()); createSoupToPizzaRefProp(); @@ -798,10 +847,10 @@ public void shouldNotCreateReferencesBetweenNonMTAndMTClasses() { .withID(soupId) .withReferenceProperty("relatedToPizza") .withReference(pizzaRef) - .withTenant(tenantPizza) + .withTenant(tenantPizza.getName()) .run(); - assertMT.error(result, false, 500, "has multi-tenancy disabled, but request was with tenant"); // TODO 422? + assertMT.error(result, false, 422, "has multi-tenancy disabled, but request was with tenant"); }) ); @@ -825,14 +874,14 @@ public void shouldNotCreateReferencesBetweenNonMTAndMTClasses() { @Test public void shouldNotReplaceReferencesBetweenNonMTAndMTClasses() { - String tenantPizza = "tenantPizza"; + Tenant tenantPizza = Tenant.builder().name("tenantPizza").build(); List soupIds = WeaviateTestGenerics.IDS_BY_CLASS.get("Soup"); List pizzaIds = WeaviateTestGenerics.IDS_BY_CLASS.get("Pizza"); testGenerics.createSchemaSoup(client); testGenerics.createDataSoup(client); testGenerics.createSchemaPizzaForTenants(client); testGenerics.createTenantsPizza(client, tenantPizza); - testGenerics.createDataPizzaForTenants(client, tenantPizza); + testGenerics.createDataPizzaForTenants(client, tenantPizza.getName()); createSoupToPizzaRefProp(); @@ -849,10 +898,10 @@ public void shouldNotReplaceReferencesBetweenNonMTAndMTClasses() { .withID(soupId) .withReferenceProperty("relatedToPizza") .withReferences(refs) - .withTenant(tenantPizza) + .withTenant(tenantPizza.getName()) .run(); - assertMT.error(result, false, 500, "has multi-tenancy disabled, but request was with tenant"); // TODO 422? + assertMT.error(result, false, 422, "has multi-tenancy disabled, but request was with tenant"); }); // verify not replaced diff --git a/src/test/java/io/weaviate/integration/client/graphql/ClientGraphQLMultiTenancyTest.java b/src/test/java/io/weaviate/integration/client/graphql/ClientGraphQLMultiTenancyTest.java index cc6d5e521..5ff376e00 100644 --- a/src/test/java/io/weaviate/integration/client/graphql/ClientGraphQLMultiTenancyTest.java +++ b/src/test/java/io/weaviate/integration/client/graphql/ClientGraphQLMultiTenancyTest.java @@ -22,6 +22,8 @@ import java.util.List; import java.util.Map; +import static io.weaviate.integration.client.WeaviateTestGenerics.TENANT_1; +import static io.weaviate.integration.client.WeaviateTestGenerics.TENANT_2; import static org.assertj.core.api.Assertions.assertThat; public class ClientGraphQLMultiTenancyTest { @@ -51,22 +53,19 @@ public void after() { @Test public void shouldGetAllDataForTenant() { - String tenant1 = "TenantNo1"; - String tenant2 = "TenantNo2"; - testGenerics.createSchemaPizzaForTenants(client); - testGenerics.createTenantsPizza(client, tenant1, tenant2); - testGenerics.createDataPizzaQuattroFormaggiForTenants(client, tenant1); - testGenerics.createDataPizzaFruttiDiMareForTenants(client, tenant1); - testGenerics.createDataPizzaHawaiiForTenants(client, tenant2); - testGenerics.createDataPizzaDoenerForTenants(client, tenant2); + testGenerics.createTenantsPizza(client, TENANT_1, TENANT_2); + testGenerics.createDataPizzaQuattroFormaggiForTenants(client, TENANT_1.getName()); + testGenerics.createDataPizzaFruttiDiMareForTenants(client, TENANT_1.getName()); + testGenerics.createDataPizzaHawaiiForTenants(client, TENANT_2.getName()); + testGenerics.createDataPizzaDoenerForTenants(client, TENANT_2.getName()); Map expectedIdsByTenant = new HashMap<>(); - expectedIdsByTenant.put(tenant1, new String[]{ + expectedIdsByTenant.put(TENANT_1.getName(), new String[]{ WeaviateTestGenerics.PIZZA_QUATTRO_FORMAGGI_ID, WeaviateTestGenerics.PIZZA_FRUTTI_DI_MARE_ID, }); - expectedIdsByTenant.put(tenant2, new String[]{ + expectedIdsByTenant.put(TENANT_2.getName(), new String[]{ WeaviateTestGenerics.PIZZA_HAWAII_ID, WeaviateTestGenerics.PIZZA_DOENER_ID, }); @@ -87,21 +86,18 @@ public void shouldGetAllDataForTenant() { @Test public void shouldGetLimitedDataForTenant() { - String tenant1 = "TenantNo1"; - String tenant2 = "TenantNo2"; - testGenerics.createSchemaPizzaForTenants(client); - testGenerics.createTenantsPizza(client, tenant1, tenant2); - testGenerics.createDataPizzaQuattroFormaggiForTenants(client, tenant1); - testGenerics.createDataPizzaFruttiDiMareForTenants(client, tenant1); - testGenerics.createDataPizzaHawaiiForTenants(client, tenant2); - testGenerics.createDataPizzaDoenerForTenants(client, tenant2); + testGenerics.createTenantsPizza(client, TENANT_1, TENANT_2); + testGenerics.createDataPizzaQuattroFormaggiForTenants(client, TENANT_1.getName()); + testGenerics.createDataPizzaFruttiDiMareForTenants(client, TENANT_1.getName()); + testGenerics.createDataPizzaHawaiiForTenants(client, TENANT_2.getName()); + testGenerics.createDataPizzaDoenerForTenants(client, TENANT_2.getName()); Map expectedIdsByTenant = new HashMap<>(); - expectedIdsByTenant.put(tenant1, new String[]{ + expectedIdsByTenant.put(TENANT_1.getName(), new String[]{ WeaviateTestGenerics.PIZZA_QUATTRO_FORMAGGI_ID, }); - expectedIdsByTenant.put(tenant2, new String[]{ + expectedIdsByTenant.put(TENANT_2.getName(), new String[]{ WeaviateTestGenerics.PIZZA_HAWAII_ID, }); @@ -122,21 +118,18 @@ public void shouldGetLimitedDataForTenant() { @Test public void shouldGetFilteredDataForTenant() { - String tenant1 = "TenantNo1"; - String tenant2 = "TenantNo2"; - testGenerics.createSchemaPizzaForTenants(client); - testGenerics.createTenantsPizza(client, tenant1, tenant2); - testGenerics.createDataPizzaQuattroFormaggiForTenants(client, tenant1); - testGenerics.createDataPizzaFruttiDiMareForTenants(client, tenant1); - testGenerics.createDataPizzaHawaiiForTenants(client, tenant2); - testGenerics.createDataPizzaDoenerForTenants(client, tenant2); + testGenerics.createTenantsPizza(client, TENANT_1, TENANT_2); + testGenerics.createDataPizzaQuattroFormaggiForTenants(client, TENANT_1.getName()); + testGenerics.createDataPizzaFruttiDiMareForTenants(client, TENANT_1.getName()); + testGenerics.createDataPizzaHawaiiForTenants(client, TENANT_2.getName()); + testGenerics.createDataPizzaDoenerForTenants(client, TENANT_2.getName()); Map expectedIdsByTenant = new HashMap<>(); - expectedIdsByTenant.put(tenant1, new String[]{ + expectedIdsByTenant.put(TENANT_1.getName(), new String[]{ WeaviateTestGenerics.PIZZA_FRUTTI_DI_MARE_ID, }); - expectedIdsByTenant.put(tenant2, new String[]{ + expectedIdsByTenant.put(TENANT_2.getName(), new String[]{ }); expectedIdsByTenant.forEach((tenant, expectedIds) -> { @@ -162,18 +155,15 @@ public void shouldGetFilteredDataForTenant() { @Test public void shouldAggregateAllDataForTenant() { - String tenant1 = "TenantNo1"; - String tenant2 = "TenantNo2"; - testGenerics.createSchemaPizzaForTenants(client); - testGenerics.createTenantsPizza(client, tenant1, tenant2); - testGenerics.createDataPizzaQuattroFormaggiForTenants(client, tenant1); - testGenerics.createDataPizzaFruttiDiMareForTenants(client, tenant1); - testGenerics.createDataPizzaHawaiiForTenants(client, tenant2); - testGenerics.createDataPizzaDoenerForTenants(client, tenant2); + testGenerics.createTenantsPizza(client, TENANT_1, TENANT_2); + testGenerics.createDataPizzaQuattroFormaggiForTenants(client, TENANT_1.getName()); + testGenerics.createDataPizzaFruttiDiMareForTenants(client, TENANT_1.getName()); + testGenerics.createDataPizzaHawaiiForTenants(client, TENANT_2.getName()); + testGenerics.createDataPizzaDoenerForTenants(client, TENANT_2.getName()); Map> expectedAggValuesByTenant = new HashMap<>(); - expectedAggValuesByTenant.put(tenant1, new HashMap() {{ + expectedAggValuesByTenant.put(TENANT_1.getName(), new HashMap() {{ put("count", 2.0); put("maximum", 2.5); put("minimum", 1.4); @@ -182,7 +172,7 @@ public void shouldAggregateAllDataForTenant() { put("mode", 1.4); put("sum", 3.9); }}); - expectedAggValuesByTenant.put(tenant2, new HashMap() {{ + expectedAggValuesByTenant.put(TENANT_2.getName(), new HashMap() {{ put("count", 2.0); put("maximum", 1.2); put("minimum", 1.1); @@ -215,18 +205,15 @@ public void shouldAggregateAllDataForTenant() { @Test public void shouldAggregateFilteredDataForTenant() { - String tenant1 = "TenantNo1"; - String tenant2 = "TenantNo2"; - testGenerics.createSchemaPizzaForTenants(client); - testGenerics.createTenantsPizza(client, tenant1, tenant2); - testGenerics.createDataPizzaQuattroFormaggiForTenants(client, tenant1); - testGenerics.createDataPizzaFruttiDiMareForTenants(client, tenant1); - testGenerics.createDataPizzaHawaiiForTenants(client, tenant2); - testGenerics.createDataPizzaDoenerForTenants(client, tenant2); + testGenerics.createTenantsPizza(client, TENANT_1, TENANT_2); + testGenerics.createDataPizzaQuattroFormaggiForTenants(client, TENANT_1.getName()); + testGenerics.createDataPizzaFruttiDiMareForTenants(client, TENANT_1.getName()); + testGenerics.createDataPizzaHawaiiForTenants(client, TENANT_2.getName()); + testGenerics.createDataPizzaDoenerForTenants(client, TENANT_2.getName()); Map> expectedAggValuesByTenant = new HashMap<>(); - expectedAggValuesByTenant.put(tenant1, new HashMap() {{ + expectedAggValuesByTenant.put(TENANT_1.getName(), new HashMap() {{ put("count", 1.0); put("maximum", 2.5); put("minimum", 2.5); @@ -235,7 +222,7 @@ public void shouldAggregateFilteredDataForTenant() { put("mode", 2.5); put("sum", 2.5); }}); - expectedAggValuesByTenant.put(tenant2, new HashMap() {{ + expectedAggValuesByTenant.put(TENANT_2.getName(), new HashMap() {{ put("count", 0.0); put("maximum", null); put("minimum", null); diff --git a/src/test/java/io/weaviate/integration/client/schema/ClientSchemaMultiTenancyTest.java b/src/test/java/io/weaviate/integration/client/schema/ClientSchemaMultiTenancyTest.java index 634cb2cfa..87d5f85ba 100644 --- a/src/test/java/io/weaviate/integration/client/schema/ClientSchemaMultiTenancyTest.java +++ b/src/test/java/io/weaviate/integration/client/schema/ClientSchemaMultiTenancyTest.java @@ -4,6 +4,7 @@ import io.weaviate.client.WeaviateClient; import io.weaviate.client.base.Result; import io.weaviate.client.v1.misc.model.MultiTenancyConfig; +import io.weaviate.client.v1.schema.model.ActivityStatus; import io.weaviate.client.v1.schema.model.DataType; import io.weaviate.client.v1.schema.model.Property; import io.weaviate.client.v1.schema.model.Tenant; @@ -22,6 +23,8 @@ import java.util.Collections; import java.util.List; +import static io.weaviate.integration.client.WeaviateTestGenerics.TENANT_1; +import static io.weaviate.integration.client.WeaviateTestGenerics.TENANT_2; import static org.assertj.core.api.Assertions.assertThat; public class ClientSchemaMultiTenancyTest { @@ -169,12 +172,13 @@ public void shouldNotAddTenantsToNonMTClass() { .withTenants(tenantObjs) .run(); - assertMT.error(addResult, false, 422,"multi-tenancy is not enabled for class"); + assertMT.error(addResult, false, 422, "multi-tenancy is not enabled for class"); } @Test public void shouldGetTenantsFromMTClass() { - String[] tenants = new String[]{"TenantNo1", "TenantNo2"}; + Tenant[] tenants = new Tenant[]{TENANT_1, TENANT_2}; + String[] tenantNames = Arrays.stream(tenants).map(Tenant::getName).toArray(String[]::new); testGenerics.createSchemaPizzaForTenants(client); testGenerics.createTenantsPizza(client, tenants); @@ -190,7 +194,7 @@ public void shouldGetTenantsFromMTClass() { String[] fetchedTenants = getResult.getResult().stream() .map(Tenant::getName) .toArray(String[]::new); - assertThat(fetchedTenants).containsExactlyInAnyOrder(tenants); + assertThat(fetchedTenants).containsExactlyInAnyOrder(tenantNames); } @Test @@ -204,15 +208,61 @@ public void shouldNotGetTenantsFromNonMTClass() { assertMT.error(getResult, null, 422, "multi-tenancy is not enabled for class"); } + @Test + public void shouldUpdateTenantsOfMTClass() { + Tenant[] tenants = new Tenant[]{TENANT_1, TENANT_2}; + testGenerics.createSchemaPizzaForTenants(client); + testGenerics.createTenantsPizza(client, tenants); + + Result updateResult = client.schema().tenantsUpdater() + .withClassName("Pizza") + .withTenants(Arrays.stream(tenants) + .map(tenant -> Tenant.builder().name(tenant.getName()).activityStatus(ActivityStatus.COLD).build()) + .toArray(Tenant[]::new)) + .run(); + + assertThat(updateResult).isNotNull() + .returns(false, Result::hasErrors) + .returns(true, Result::getResult); + } + + @Test + public void shouldNotUpdateNonExistentTenantsOfMTClass() { + Tenant[] tenants = new Tenant[]{TENANT_1, TENANT_2}; + testGenerics.createSchemaPizzaForTenants(client); + testGenerics.createTenantsPizza(client, tenants); + + Result updateResult = client.schema().tenantsUpdater() + .withClassName("Pizza") + .withTenants(Tenant.builder().name("nonExistentTenant").activityStatus(ActivityStatus.COLD).build()) + .run(); + + assertMT.error(updateResult, false, 422, "nonExistentTenant", "not found"); + } + + @Test + public void shouldNotUpdateTenantsOfNonMTClass() { + testGenerics.createSchemaPizza(client); + + Result updateResult = client.schema().tenantsUpdater() + .withClassName("Pizza") + .withTenants( + Tenant.builder().name(TENANT_1.getName()).activityStatus(ActivityStatus.COLD).build(), + Tenant.builder().name(TENANT_2.getName()).activityStatus(ActivityStatus.COLD).build()) + .run(); + + assertMT.error(updateResult, false, 422, "multi-tenancy is not enabled for class"); + } + @Test public void shouldDeleteTenantsFromMTClass() { - String[] tenants = new String[]{"TenantNo1", "TenantNo2"}; + Tenant[] tenants = new Tenant[]{TENANT_1, TENANT_2}; testGenerics.createSchemaPizzaForTenants(client); testGenerics.createTenantsPizza(client, tenants); Result deleteResult = client.schema().tenantsDeleter() .withClassName("Pizza") - .withTenants(tenants) + .withTenants(TENANT_1.getName(), TENANT_2.getName(), "nonExistentTenant") .run(); assertThat(deleteResult).isNotNull() @@ -232,4 +282,106 @@ public void shouldNotDeleteTenantsFromNonMTClass() { assertMT.error(deleteResult, false, 422, "multi-tenancy is not enabled for class"); } + + @Test + public void shouldActivateDeactivateTenants() { + Tenant[] tenants = new Tenant[]{ + Tenant.builder().name("TenantNo1").build(), // default activity status (HOT) + Tenant.builder().name("TenantNo2").activityStatus(ActivityStatus.HOT).build(), + Tenant.builder().name("TenantNo3").activityStatus(ActivityStatus.COLD).build(), + }; + + String classPizza = "Pizza"; + int pizzaSize = WeaviateTestGenerics.IDS_BY_CLASS.get(classPizza).size(); + + // create tenants (1,2,3) + testGenerics.createSchemaPizzaForTenants(client); + testGenerics.createTenantsPizza(client, tenants); + + // populate active tenants (1,2) + testGenerics.createDataPizzaForTenants(client, tenants[0].getName(), tenants[1].getName()); + + assertMT.tenantActive(classPizza, tenants[0].getName()); + assertMT.tenantActiveGetsObjects(classPizza, tenants[0].getName(), pizzaSize); + assertMT.tenantActive(classPizza, tenants[1].getName()); + assertMT.tenantActiveGetsObjects(classPizza, tenants[1].getName(), pizzaSize); + assertMT.tenantInactive(classPizza, tenants[2].getName()); + assertMT.tenantInactiveGetsNoObjects(classPizza, tenants[2].getName()); + + // deactivate tenant (1) + Result result = client.schema().tenantsUpdater() + .withClassName(classPizza) + .withTenants(Tenant.builder().name(tenants[0].getName()).activityStatus(ActivityStatus.COLD).build()) + .run(); + assertThat(result).isNotNull() + .returns(false, Result::hasErrors) + .returns(true, Result::getResult); + + assertMT.tenantInactive(classPizza, tenants[0].getName()); + assertMT.tenantInactiveGetsNoObjects(classPizza, tenants[0].getName()); + assertMT.tenantActive(classPizza, tenants[1].getName()); + assertMT.tenantActiveGetsObjects(classPizza, tenants[1].getName(), pizzaSize); + assertMT.tenantInactive(classPizza, tenants[2].getName()); + assertMT.tenantInactiveGetsNoObjects(classPizza, tenants[2].getName()); + + // activate tenant (3) + Result result2 = client.schema().tenantsUpdater() + .withClassName(classPizza) + .withTenants(Tenant.builder().name(tenants[2].getName()).activityStatus(ActivityStatus.HOT).build()) + .run(); + assertThat(result2).isNotNull() + .returns(false, Result::hasErrors) + .returns(true, Result::getResult); + + // populate active tenant (3) + testGenerics.createDataPizzaForTenants(client, tenants[2].getName()); + + assertMT.tenantInactive(classPizza, tenants[0].getName()); + assertMT.tenantInactiveGetsNoObjects(classPizza, tenants[0].getName()); + assertMT.tenantActive(classPizza, tenants[1].getName()); + assertMT.tenantActiveGetsObjects(classPizza, tenants[1].getName(), pizzaSize); + assertMT.tenantActive(classPizza, tenants[2].getName()); + assertMT.tenantActiveGetsObjects(classPizza, tenants[2].getName(), pizzaSize); + + // activate tenant (1) + Result result3 = client.schema().tenantsUpdater() + .withClassName(classPizza) + .withTenants(Tenant.builder().name(tenants[0].getName()).activityStatus(ActivityStatus.HOT).build()) + .run(); + assertThat(result3).isNotNull() + .returns(false, Result::hasErrors) + .returns(true, Result::getResult); + + assertMT.tenantActive(classPizza, tenants[0].getName()); + assertMT.tenantActiveGetsObjects(classPizza, tenants[0].getName(), pizzaSize); + assertMT.tenantActive(classPizza, tenants[1].getName()); + assertMT.tenantActiveGetsObjects(classPizza, tenants[1].getName(), pizzaSize); + assertMT.tenantActive(classPizza, tenants[2].getName()); + assertMT.tenantActiveGetsObjects(classPizza, tenants[2].getName(), pizzaSize); + + // deactivate tenant (2) + Result result4 = client.schema().tenantsUpdater() + .withClassName(classPizza) + .withTenants(Tenant.builder().name(tenants[1].getName()).activityStatus(ActivityStatus.COLD).build()) + .run(); + assertThat(result4).isNotNull() + .returns(false, Result::hasErrors) + .returns(true, Result::getResult); + + assertMT.tenantActive(classPizza, tenants[0].getName()); + assertMT.tenantActiveGetsObjects(classPizza, tenants[0].getName(), pizzaSize); + assertMT.tenantInactive(classPizza, tenants[1].getName()); + assertMT.tenantInactiveGetsNoObjects(classPizza, tenants[1].getName()); + assertMT.tenantActive(classPizza, tenants[2].getName()); + assertMT.tenantActiveGetsObjects(classPizza, tenants[2].getName(), pizzaSize); + + // delete tenants + Result result5 = client.schema().tenantsDeleter() + .withClassName(classPizza) + .withTenants(Arrays.stream(tenants).map(Tenant::getName).toArray(String[]::new)) + .run(); + assertThat(result5).isNotNull() + .returns(false, Result::hasErrors) + .returns(true, Result::getResult); + } } diff --git a/src/test/resources/docker-compose-azure.yaml b/src/test/resources/docker-compose-azure.yaml index 1334f3be6..3889a42df 100644 --- a/src/test/resources/docker-compose-azure.yaml +++ b/src/test/resources/docker-compose-azure.yaml @@ -10,7 +10,7 @@ services: - --scheme - http - --write-timeout=600s - image: semitechnologies/weaviate:1.20.0 + image: semitechnologies/weaviate:1.21.0-rc.1 restart: on-failure:0 environment: PERSISTENCE_DATA_PATH: '/var/lib/weaviate' diff --git a/src/test/resources/docker-compose-cluster.yaml b/src/test/resources/docker-compose-cluster.yaml index 51d935360..934f988bf 100644 --- a/src/test/resources/docker-compose-cluster.yaml +++ b/src/test/resources/docker-compose-cluster.yaml @@ -10,7 +10,7 @@ services: - --scheme - http - --write-timeout=600s - image: semitechnologies/weaviate:1.20.0 + image: semitechnologies/weaviate:1.21.0-rc.1 restart: on-failure:0 environment: LOG_LEVEL: 'debug' @@ -41,7 +41,7 @@ services: - '8088' - --scheme - http - image: semitechnologies/weaviate:1.20.0 + image: semitechnologies/weaviate:1.21.0-rc.1 restart: on-failure:0 environment: LOG_LEVEL: 'debug' diff --git a/src/test/resources/docker-compose-okta-cc.yaml b/src/test/resources/docker-compose-okta-cc.yaml index 6a78f8006..44d0cc49e 100644 --- a/src/test/resources/docker-compose-okta-cc.yaml +++ b/src/test/resources/docker-compose-okta-cc.yaml @@ -10,7 +10,7 @@ services: - --scheme - http - --write-timeout=600s - image: semitechnologies/weaviate:1.20.0 + image: semitechnologies/weaviate:1.21.0-rc.1 restart: on-failure:0 environment: PERSISTENCE_DATA_PATH: '/var/lib/weaviate' diff --git a/src/test/resources/docker-compose-okta-users.yaml b/src/test/resources/docker-compose-okta-users.yaml index afe6e8907..177c63088 100644 --- a/src/test/resources/docker-compose-okta-users.yaml +++ b/src/test/resources/docker-compose-okta-users.yaml @@ -10,7 +10,7 @@ services: - --scheme - http - --write-timeout=600s - image: semitechnologies/weaviate:1.20.0 + image: semitechnologies/weaviate:1.21.0-rc.1 restart: on-failure:0 environment: PERSISTENCE_DATA_PATH: '/var/lib/weaviate' diff --git a/src/test/resources/docker-compose-test.yaml b/src/test/resources/docker-compose-test.yaml index 49fa2f415..36512e2ea 100644 --- a/src/test/resources/docker-compose-test.yaml +++ b/src/test/resources/docker-compose-test.yaml @@ -9,7 +9,7 @@ services: - '8080' - --scheme - http - image: semitechnologies/weaviate:1.20.0 + image: semitechnologies/weaviate:1.21.0-rc.1 links: - "contextionary:contextionary" restart: on-failure:0 diff --git a/src/test/resources/docker-compose-wcs.yaml b/src/test/resources/docker-compose-wcs.yaml index e2b91f520..4d9565883 100644 --- a/src/test/resources/docker-compose-wcs.yaml +++ b/src/test/resources/docker-compose-wcs.yaml @@ -10,7 +10,7 @@ services: - --scheme - http - --write-timeout=600s - image: semitechnologies/weaviate:1.20.0 + image: semitechnologies/weaviate:1.21.0-rc.1 restart: on-failure:0 environment: PERSISTENCE_DATA_PATH: '/var/lib/weaviate'