Skip to content

Commit 2c53fd2

Browse files
authored
Merge pull request #281 from weaviate/1.30/refactor-tenants-get-by-name-to-use-rest
Use REST instead of gRPC for `tenants.getByName` when available due to filtering issues with rbac
2 parents c933263 + 1d62717 commit 2c53fd2

File tree

2 files changed

+26
-10
lines changed

2 files changed

+26
-10
lines changed

src/collections/tenants/index.ts

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { ConnectionGRPC } from '../../connection/index.js';
2-
import { WeaviateUnsupportedFeatureError } from '../../errors.js';
2+
import { WeaviateUnexpectedStatusCodeError, WeaviateUnsupportedFeatureError } from '../../errors.js';
33
import { Tenant as TenantREST } from '../../openapi/types.js';
44
import { TenantsCreator, TenantsDeleter, TenantsGetter, TenantsUpdater } from '../../schema/index.js';
55
import { DbVersionSupport } from '../../utils/dbVersion.js';
@@ -17,12 +17,10 @@ const parseValueOrValueArray = <V>(value: V | V[]) => (Array.isArray(value) ? va
1717
const parseStringOrTenant = <T extends TenantBase>(tenant: string | T) =>
1818
typeof tenant === 'string' ? tenant : tenant.name;
1919

20-
const parseTenantREST = (tenant: TenantREST): Tenant => {
21-
return {
22-
name: tenant.name!,
23-
activityStatus: Deserialize.activityStatusREST(tenant.activityStatus),
24-
};
25-
};
20+
const parseTenantREST = (tenant: TenantREST): Tenant => ({
21+
name: tenant.name!,
22+
activityStatus: Deserialize.activityStatusREST(tenant.activityStatus),
23+
});
2624

2725
const tenants = (
2826
connection: ConnectionGRPC,
@@ -53,9 +51,20 @@ const tenants = (
5351
return check.supports ? getGRPC() : getREST();
5452
},
5553
getByNames: <T extends TenantBase>(tenants: (string | T)[]) => getGRPC(tenants.map(parseStringOrTenant)),
56-
getByName: <T extends TenantBase>(tenant: string | T) => {
54+
getByName: async <T extends TenantBase>(tenant: string | T) => {
5755
const tenantName = parseStringOrTenant(tenant);
58-
return getGRPC([tenantName]).then((tenants) => tenants[tenantName] || null);
56+
if (await dbVersionSupport.supportsTenantGetRESTMethod().then((check) => !check.supports)) {
57+
return getGRPC([tenantName]).then((tenants) => tenants[tenantName] ?? null);
58+
}
59+
return connection
60+
.get<TenantREST>(`/schema/${collection}/tenants/${tenantName}`)
61+
.then(parseTenantREST)
62+
.catch((err) => {
63+
if (err instanceof WeaviateUnexpectedStatusCodeError && err.code === 404) {
64+
return null;
65+
}
66+
throw err;
67+
});
5968
},
6069
remove: <T extends TenantBase>(tenants: string | T | (string | T)[]) =>
6170
new TenantsDeleter(

src/utils/dbVersion.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -151,11 +151,18 @@ export class DbVersionSupport {
151151
return {
152152
version: version,
153153
supports: version.isAtLeast(1, 25, 0),
154-
message: this.errorMessage('Tenants get method', version.show(), '1.25.0'),
154+
message: this.errorMessage('Tenants get method over gRPC', version.show(), '1.25.0'),
155155
};
156156
});
157157
};
158158

159+
supportsTenantGetRESTMethod = () =>
160+
this.dbVersionProvider.getVersion().then((version) => ({
161+
version: version,
162+
supports: version.isAtLeast(1, 28, 0),
163+
message: this.errorMessage('Tenant get method over REST', version.show(), '1.28.0'),
164+
}));
165+
159166
supportsDynamicVectorIndex = () => {
160167
return this.dbVersionProvider.getVersion().then((version) => {
161168
return {

0 commit comments

Comments
 (0)