diff --git a/src/collections/tenants/index.ts b/src/collections/tenants/index.ts index f72c6959..320f166d 100644 --- a/src/collections/tenants/index.ts +++ b/src/collections/tenants/index.ts @@ -1,5 +1,5 @@ import { ConnectionGRPC } from '../../connection/index.js'; -import { WeaviateUnsupportedFeatureError } from '../../errors.js'; +import { WeaviateUnexpectedStatusCodeError, WeaviateUnsupportedFeatureError } from '../../errors.js'; import { Tenant as TenantREST } from '../../openapi/types.js'; import { TenantsCreator, TenantsDeleter, TenantsGetter, TenantsUpdater } from '../../schema/index.js'; import { DbVersionSupport } from '../../utils/dbVersion.js'; @@ -17,12 +17,10 @@ const parseValueOrValueArray = (value: V | V[]) => (Array.isArray(value) ? va const parseStringOrTenant = (tenant: string | T) => typeof tenant === 'string' ? tenant : tenant.name; -const parseTenantREST = (tenant: TenantREST): Tenant => { - return { - name: tenant.name!, - activityStatus: Deserialize.activityStatusREST(tenant.activityStatus), - }; -}; +const parseTenantREST = (tenant: TenantREST): Tenant => ({ + name: tenant.name!, + activityStatus: Deserialize.activityStatusREST(tenant.activityStatus), +}); const tenants = ( connection: ConnectionGRPC, @@ -53,9 +51,20 @@ const tenants = ( return check.supports ? getGRPC() : getREST(); }, getByNames: (tenants: (string | T)[]) => getGRPC(tenants.map(parseStringOrTenant)), - getByName: (tenant: string | T) => { + getByName: async (tenant: string | T) => { const tenantName = parseStringOrTenant(tenant); - return getGRPC([tenantName]).then((tenants) => tenants[tenantName] || null); + if (await dbVersionSupport.supportsTenantGetRESTMethod().then((check) => !check.supports)) { + return getGRPC([tenantName]).then((tenants) => tenants[tenantName] ?? null); + } + return connection + .get(`/schema/${collection}/tenants/${tenantName}`) + .then(parseTenantREST) + .catch((err) => { + if (err instanceof WeaviateUnexpectedStatusCodeError && err.code === 404) { + return null; + } + throw err; + }); }, remove: (tenants: string | T | (string | T)[]) => new TenantsDeleter( diff --git a/src/utils/dbVersion.ts b/src/utils/dbVersion.ts index d5265095..a945e414 100644 --- a/src/utils/dbVersion.ts +++ b/src/utils/dbVersion.ts @@ -151,11 +151,18 @@ export class DbVersionSupport { return { version: version, supports: version.isAtLeast(1, 25, 0), - message: this.errorMessage('Tenants get method', version.show(), '1.25.0'), + message: this.errorMessage('Tenants get method over gRPC', version.show(), '1.25.0'), }; }); }; + supportsTenantGetRESTMethod = () => + this.dbVersionProvider.getVersion().then((version) => ({ + version: version, + supports: version.isAtLeast(1, 28, 0), + message: this.errorMessage('Tenant get method over REST', version.show(), '1.28.0'), + })); + supportsDynamicVectorIndex = () => { return this.dbVersionProvider.getVersion().then((version) => { return {