Skip to content

Commit 95cc3eb

Browse files
authored
feat: add multi-tenant management to Operational & Observability (#93)
1 parent 7ef9f8a commit 95cc3eb

4 files changed

Lines changed: 85 additions & 2 deletions

File tree

app/product/operational-observability/page.tsx

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,25 @@ export const metadata: Metadata = {
1919
};
2020

2121
const sections: FeaturePageSection[] = [
22+
{
23+
id: "multi-tenant-management",
24+
title: "Multi-tenant management",
25+
description: "RustFS Operator automates multi-tenant storage operations, from elastic capacity scaling to instant MNMD cluster provisioning with strict resource isolation.",
26+
items: [
27+
{
28+
title: "Elastic storage auto-scaling",
29+
description: "Scaling RustFS capacity and disk pools on demand with zero downtime, driven by automated Operator orchestration.",
30+
},
31+
{
32+
title: "MNMD cluster provisioning",
33+
description: "Provisioning multi-node, multi-disk RustFS clusters instantly with simultaneous multi-writer access for high-concurrency workloads.",
34+
},
35+
{
36+
title: "Tenant-aware resource isolation",
37+
description: "Enforcing strict capacity quotas, IOPS limits, and isolated access credentials across dynamically managed RustFS storage pools.",
38+
},
39+
],
40+
},
2241
{
2342
title: "Console operations",
2443
items: [

components/business/feature-page.tsx

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ import Link from "next/link";
3131
import type { ReactNode } from "react";
3232

3333
export interface FeaturePageSection {
34+
id?: string;
3435
title: string;
3536
description?: string;
3637
items?: {
@@ -39,6 +40,17 @@ export interface FeaturePageSection {
3940
}[];
4041
}
4142

43+
function sectionId(title: string, explicitId?: string) {
44+
return (
45+
explicitId ??
46+
title
47+
.toLowerCase()
48+
.replace(/&/g, "and")
49+
.replace(/[^a-z0-9]+/g, "-")
50+
.replace(/^-+|-+$/g, "")
51+
);
52+
}
53+
4254
export interface FeaturePageLink {
4355
label: string;
4456
href: string;
@@ -350,7 +362,10 @@ function FeatureSection({
350362
const reverse = sectionIndex % 2 === 1;
351363

352364
return (
353-
<section className="border-t border-border py-16 sm:py-20">
365+
<section
366+
id={sectionId(section.title, section.id)}
367+
className="scroll-mt-24 border-t border-border py-16 sm:py-20"
368+
>
354369
<div>
355370
<h2 className="text-3xl font-semibold tracking-tight text-foreground sm:text-4xl">
356371
{section.title}

components/business/product-section-illustration.tsx

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -432,6 +432,43 @@ function InsightsVisual() {
432432
);
433433
}
434434

435+
function MultiTenantVisual() {
436+
const tenants = [
437+
{ label: "Tenant A", quota: "5 TB" },
438+
{ label: "Tenant B", quota: "2 TB" },
439+
{ label: "Tenant C", quota: "500 GB" },
440+
];
441+
442+
return (
443+
<IllustrationFrame label="Operator-managed multi-tenancy">
444+
<div className="grid w-full max-w-lg grid-cols-[minmax(0,1fr)_auto_minmax(0,1fr)] items-center gap-3">
445+
<div className="grid gap-2">
446+
{tenants.map((tenant, index) => (
447+
<Reveal key={tenant.label} delay={index * 0.1}>
448+
<Tile icon={UsersIcon} label={tenant.label} detail={tenant.quota} />
449+
</Reveal>
450+
))}
451+
</div>
452+
<div className="flex flex-col items-center gap-2">
453+
<DataFlowLine direction="horizontal" className="w-8" />
454+
<motion.span
455+
className="flex size-11 items-center justify-center border border-brand/60 bg-brand/5"
456+
animate={{ boxShadow: ["0 0 0px transparent", "0 0 18px var(--color-brand)", "0 0 0px transparent"] }}
457+
transition={{ duration: 2.2, repeat: Infinity }}
458+
>
459+
<BlocksIcon className="size-5 text-brand" />
460+
</motion.span>
461+
<span className="font-mono text-[7px] uppercase tracking-[0.12em] text-brand">Operator</span>
462+
</div>
463+
<div className="grid gap-2">
464+
<Tile icon={DatabaseIcon} label="Pool 01" detail="auto-scaling" accent />
465+
<Tile icon={ServerIcon} label="Pool 02" detail="MNMD cluster" />
466+
</div>
467+
</div>
468+
</IllustrationFrame>
469+
);
470+
}
471+
435472
function CliVisual() {
436473
return (
437474
<IllustrationFrame label="rc client">
@@ -615,7 +652,13 @@ const illustrations: Record<ProductIllustrationVariant, ((props: { sectionIndex:
615652
return visuals[sectionIndex] ?? visuals[0];
616653
},
617654
ops: ({ sectionIndex }) => {
618-
const visuals = [<ConsoleVisual key="console" />, <OtelVisual key="otel" />, <InsightsVisual key="insights" />, <CliVisual key="cli" />];
655+
const visuals = [
656+
<MultiTenantVisual key="multi-tenant" />,
657+
<ConsoleVisual key="console" />,
658+
<OtelVisual key="otel" />,
659+
<InsightsVisual key="insights" />,
660+
<CliVisual key="cli" />,
661+
];
619662
return visuals[sectionIndex] ?? visuals[0];
620663
},
621664
security: ({ sectionIndex }) => {

data/navigation.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,11 @@ export const resourceNavigation: NavigationItem[] = [
4646
href: "/erasure-code-calculator",
4747
description: "Optimal EC configurations for durability and storage efficiency.",
4848
},
49+
{
50+
title: "Multi-tenant management",
51+
href: "/product/operational-observability#multi-tenant-management",
52+
description: "Operator-driven elastic scaling, MNMD provisioning, and tenant isolation.",
53+
},
4954
{
5055
title: "Documentation",
5156
href: "/docs",
@@ -67,6 +72,7 @@ export const footerNavigation = [
6772
{ title: "Data Management", href: "/product/data-management" },
6873
{ title: "High Availability & Scale", href: "/product/high-availability-scale" },
6974
{ title: "Operational & Observability", href: "/product/operational-observability" },
75+
{ title: "Multi-tenant management", href: "/product/operational-observability#multi-tenant-management" },
7076
{ title: "Security & Compliance", href: "/product/security-compliance" },
7177
],
7278
},

0 commit comments

Comments
 (0)