feat: tease enterprise multi-tenancy and API key controls in OSS

Add an Organizations menu entry (admin-only) that routes to an upsell
page explaining the multi-tenancy module, and surface disabled
IP Access Control / Quota Limit items in the API Key dropdown with a
tooltip pointing at the enterprise edition. Both placeholders are
shadowed by the enterprise plugin at build time: the route merger
removes the OSS Organizations entry by name, and the dropdown skips
each placeholder when the same key is contributed via configActions.
This commit is contained in:
gitlawr
2026-06-05 16:41:34 +08:00
committed by jialin
parent 46f859cc3c
commit 42ac377c17
23 changed files with 246 additions and 10 deletions
+3 -1
View File
@@ -23,5 +23,7 @@ export default {
'apikeys.accessScope.inference': 'Inference APIs',
'apikeys.access.permissions': 'Access Permissions',
'apikeys.type.auto': 'Auto-generated',
'apikeys.type.custom': 'Custom'
'apikeys.type.custom': 'Custom',
'apikeys.button.ipConfig': 'IP Access Control',
'quotaLimits.button.title': 'Quota Limit'
};
+1
View File
@@ -46,6 +46,7 @@ export default {
'common.button.enabled': 'Enabled',
'common.button.disabled': 'Disabled',
'common.button.upgrade': 'Upgrade',
'common.enterprise.feature': 'Available in GPUStack Enterprise',
'common.input.holder': 'Please enter',
'common.validate.value': '{name} value is required',
'common.button.edit': 'Edit',
+1
View File
@@ -31,6 +31,7 @@ export default {
'menu.accessControl': 'Access Control',
'menu.accessControl.apikeys': 'API Keys',
'menu.accessControl.users': 'Users',
'menu.accessControl.organizations': 'Organizations',
'menu.profile': 'Preferences',
'menu.login': 'Login',
'menu.usage': 'Usage',
+15
View File
@@ -0,0 +1,15 @@
export default {
'organizations.upsell.title': 'Organizations are an Enterprise feature',
'organizations.upsell.subtitle':
'Multi-tenancy lets you isolate users, resources, and quotas across teams. Upgrade to GPUStack Enterprise to manage organizations.',
'organizations.upsell.featuresTitle': 'What you get in Enterprise',
'organizations.upsell.feature.orgs':
'Create organizations to group users and isolate workloads',
'organizations.upsell.feature.members':
'Manage members and roles per organization',
'organizations.upsell.feature.quotas':
'Set resource and token quotas per organization',
'organizations.upsell.feature.isolation':
'Scope API keys, model deployments, and resources per organization',
'organizations.upsell.cta': 'Learn about Enterprise'
};
+3 -1
View File
@@ -23,7 +23,9 @@ export default {
'apikeys.accessScope.inference': 'Inference APIs',
'apikeys.access.permissions': 'Access Permissions',
'apikeys.type.auto': 'Auto-generated',
'apikeys.type.custom': 'Custom'
'apikeys.type.custom': 'Custom',
'apikeys.button.ipConfig': 'IP Access Control',
'quotaLimits.button.title': 'Quota Limit'
};
// ========== To-Do: Translate Keys (Remove After Translation) ==========
+1
View File
@@ -46,6 +46,7 @@ export default {
'common.button.enabled': '有効',
'common.button.disabled': '無効',
'common.button.upgrade': 'アップグレード',
'common.enterprise.feature': 'Available in GPUStack Enterprise',
'common.input.holder': '入力してください',
'common.validate.value': '{name} の値は必須です',
'common.button.edit': '編集',
+1
View File
@@ -37,6 +37,7 @@ export default {
'menu.accessControl': 'Access Control',
'menu.accessControl.apikeys': 'API Keys',
'menu.accessControl.users': 'Users',
'menu.accessControl.organizations': 'Organizations',
'menu.resources.clusters': 'Clusters',
'menu.resources.credentials': 'Cloud Credentials',
'menu.models.userModels': 'My Models',
+15
View File
@@ -0,0 +1,15 @@
export default {
'organizations.upsell.title': 'Organizations are an Enterprise feature',
'organizations.upsell.subtitle':
'Multi-tenancy lets you isolate users, resources, and quotas across teams. Upgrade to GPUStack Enterprise to manage organizations.',
'organizations.upsell.featuresTitle': 'What you get in Enterprise',
'organizations.upsell.feature.orgs':
'Create organizations to group users and isolate workloads',
'organizations.upsell.feature.members':
'Manage members and roles per organization',
'organizations.upsell.feature.quotas':
'Set resource and token quotas per organization',
'organizations.upsell.feature.isolation':
'Scope API keys, model deployments, and resources per organization',
'organizations.upsell.cta': 'Learn about Enterprise'
};
+3 -1
View File
@@ -23,7 +23,9 @@ export default {
'apikeys.accessScope.inference': 'Inference APIs',
'apikeys.access.permissions': 'Access Permissions',
'apikeys.type.auto': 'Auto-generated',
'apikeys.type.custom': 'Custom'
'apikeys.type.custom': 'Custom',
'apikeys.button.ipConfig': 'IP Access Control',
'quotaLimits.button.title': 'Quota Limit'
};
// ========== To-Do: Translate Keys (Remove After Translation) ==========
+1
View File
@@ -46,6 +46,7 @@ export default {
'common.button.enabled': 'Активно',
'common.button.disabled': 'Отключено',
'common.button.upgrade': 'Обновить',
'common.enterprise.feature': 'Available in GPUStack Enterprise',
'common.input.holder': 'Введите значение',
'common.validate.value': 'Поле {name} обязательно',
'common.button.edit': 'Редактировать',
+1
View File
@@ -36,6 +36,7 @@ export default {
'menu.accessControl': 'Управление доступом',
'menu.accessControl.apikeys': 'API Ключи',
'menu.accessControl.users': 'Пользователи',
'menu.accessControl.organizations': 'Организации',
'menu.resources.clusters': 'Кластеры',
'menu.resources.credentials': 'Облачные аккаунты',
'menu.models.userModels': 'Мои модели',
+15
View File
@@ -0,0 +1,15 @@
export default {
'organizations.upsell.title': 'Organizations are an Enterprise feature',
'organizations.upsell.subtitle':
'Multi-tenancy lets you isolate users, resources, and quotas across teams. Upgrade to GPUStack Enterprise to manage organizations.',
'organizations.upsell.featuresTitle': 'What you get in Enterprise',
'organizations.upsell.feature.orgs':
'Create organizations to group users and isolate workloads',
'organizations.upsell.feature.members':
'Manage members and roles per organization',
'organizations.upsell.feature.quotas':
'Set resource and token quotas per organization',
'organizations.upsell.feature.isolation':
'Scope API keys, model deployments, and resources per organization',
'organizations.upsell.cta': 'Learn about Enterprise'
};
+3 -1
View File
@@ -23,5 +23,7 @@ export default {
'apikeys.accessScope.inference': 'Inference APIs',
'apikeys.access.permissions': 'Access Permissions',
'apikeys.type.auto': 'Auto-generated',
'apikeys.type.custom': 'Custom'
'apikeys.type.custom': 'Custom',
'apikeys.button.ipConfig': 'IP Access Control',
'quotaLimits.button.title': 'Quota Limit'
};
+1
View File
@@ -46,6 +46,7 @@ export default {
'common.button.enabled': 'Etkin',
'common.button.disabled': 'Devre dışı',
'common.button.upgrade': 'Yükselt',
'common.enterprise.feature': 'Available in GPUStack Enterprise',
'common.input.holder': 'Lütfen girin',
'common.validate.value': '{name} değeri gereklidir',
'common.button.edit': 'Düzenle',
+1
View File
@@ -29,6 +29,7 @@ export default {
'menu.accessControl': 'Erişim Kontrolü',
'menu.accessControl.apikeys': 'API Anahtarları',
'menu.accessControl.users': 'Kullanıcılar',
'menu.accessControl.organizations': 'Organizasyonlar',
'menu.profile': 'Preferences',
'menu.login': 'Giriş',
'menu.usage': 'Kullanım',
+15
View File
@@ -0,0 +1,15 @@
export default {
'organizations.upsell.title': 'Organizations are an Enterprise feature',
'organizations.upsell.subtitle':
'Multi-tenancy lets you isolate users, resources, and quotas across teams. Upgrade to GPUStack Enterprise to manage organizations.',
'organizations.upsell.featuresTitle': 'What you get in Enterprise',
'organizations.upsell.feature.orgs':
'Create organizations to group users and isolate workloads',
'organizations.upsell.feature.members':
'Manage members and roles per organization',
'organizations.upsell.feature.quotas':
'Set resource and token quotas per organization',
'organizations.upsell.feature.isolation':
'Scope API keys, model deployments, and resources per organization',
'organizations.upsell.cta': 'Learn about Enterprise'
};
+3 -1
View File
@@ -22,5 +22,7 @@ export default {
'apikeys.accessScope.inference': '推理接口',
'apikeys.access.permissions': '访问权限',
'apikeys.type.auto': '自动生成',
'apikeys.type.custom': '自定义'
'apikeys.type.custom': '自定义',
'apikeys.button.ipConfig': 'IP 访问控制',
'quotaLimits.button.title': '配额限制'
};
+1
View File
@@ -44,6 +44,7 @@ export default {
'common.button.rollback': '回滚',
'common.button.new': '新建{ text }',
'common.button.upgrade': '升级',
'common.enterprise.feature': 'GPUStack 企业版可用',
'common.input.holder': '请输入',
'common.holder.search': '搜索',
'common.button.edit': '编辑',
+1
View File
@@ -38,6 +38,7 @@ export default {
'menu.accessControl': '访问控制',
'menu.accessControl.apikeys': 'API 密钥',
'menu.accessControl.users': '用户',
'menu.accessControl.organizations': '组织',
'menu.resources.clusters': '集群',
'menu.resources.credentials': '云凭证',
'menu.resources.clusterDetail': '集群详情',
+12
View File
@@ -0,0 +1,12 @@
export default {
'organizations.upsell.title': '组织是企业版功能',
'organizations.upsell.subtitle':
'多租户可在团队间隔离用户、资源与配额。升级到 GPUStack 企业版即可管理组织。',
'organizations.upsell.featuresTitle': '企业版包含的能力',
'organizations.upsell.feature.orgs': '创建组织来分组用户并隔离工作负载',
'organizations.upsell.feature.members': '为每个组织管理成员与角色',
'organizations.upsell.feature.quotas': '为每个组织设置资源与 Token 配额',
'organizations.upsell.feature.isolation':
'按组织隔离 API 密钥、模型部署与资源',
'organizations.upsell.cta': '了解企业版'
};