Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
a37e636
Add api-platform gateway extension
AnoshanJ Apr 28, 2026
1a3a335
Update ingress-gw backend and port of platform-resources extension
AnoshanJ Apr 28, 2026
ef86952
Update platform resources exxtension
AnoshanJ Apr 28, 2026
d9390b7
Update agent manager service config
AnoshanJ Apr 28, 2026
8a4d574
Update trace-ingestion endpoint
AnoshanJ Apr 28, 2026
5f6f808
Update installation scripts
AnoshanJ Apr 28, 2026
eda17f3
Update gateway bootstrap job
AnoshanJ Apr 28, 2026
8426f7e
Update make-setup installation
AnoshanJ Apr 28, 2026
ed26e76
Update otel collector name and displayName
AnoshanJ Apr 28, 2026
0fe391c
Add port-forward
AnoshanJ Apr 28, 2026
9df7243
Add system label to gateway pods for ingress network policy
AnoshanJ Apr 28, 2026
b1b6cf5
Update Organization Gateway UI to handle regular GW
AnoshanJ Apr 28, 2026
9a27436
Update quick-start installation
AnoshanJ Apr 28, 2026
0a83540
Update api-platform extension github chart-name
AnoshanJ Apr 28, 2026
cbc027d
Remove amp-ai-gateway-extension
AnoshanJ Apr 28, 2026
065efa6
Update api-platform gw references
AnoshanJ Apr 28, 2026
b7a13e1
Updaet port-forwarding for gateway
AnoshanJ Apr 28, 2026
7ca8732
Update documentation for gateway changes
AnoshanJ Apr 28, 2026
13df366
Update Makefile to clarify migration steps and service access instruc…
AnoshanJ Apr 28, 2026
4ef8f13
Update restapi name for traces-api
AnoshanJ Apr 28, 2026
688359f
Address review comments
AnoshanJ Apr 29, 2026
c105bb7
Update port-forwarding during make-setup
AnoshanJ Apr 29, 2026
08cd4b1
Update review comments
AnoshanJ Apr 29, 2026
673b67a
Enhance port-forwarding scripts to support additional flag
AnoshanJ Apr 30, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/release-config.json
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,6 @@
"wso2-amp-secrets-extension",
"wso2-amp-thunder-extension",
"wso2-amp-evaluation-extension",
"wso2-amp-ai-gateway-extension"
"wso2-amp-api-platform-gateway-extension"
]
}
41 changes: 29 additions & 12 deletions Makefile
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
.PHONY: help setup setup-colima setup-k3d setup-openchoreo setup-platform setup-console-local setup-console-local-force dev-up dev-down dev-restart dev-rebuild dev-logs dev-migrate openchoreo-up openchoreo-down openchoreo-status teardown db-connect db-logs service-logs service-shell console-logs port-forward gen-eval-artifacts
.PHONY: help setup setup-colima setup-k3d setup-openchoreo setup-platform setup-gateway setup-console-local setup-console-local-force dev-up dev-down dev-restart dev-rebuild dev-logs dev-migrate openchoreo-up openchoreo-down openchoreo-status teardown db-connect db-logs service-logs service-shell console-logs port-forward stop-port-forward gen-eval-artifacts

# Default target
help:
Expand All @@ -10,6 +10,7 @@ help:
@echo " make setup-k3d - Create k3d cluster"
@echo " make setup-openchoreo - Install OpenChoreo on k3d"
@echo " make setup-platform - Build images and start core platform services"
@echo " make setup-gateway - Install API Platform Gateway (run via make setup)"
@echo " make setup-console-local - Install console deps (only if changed)"
@echo " make setup-console-local-force - Force reinstall console deps"
@echo ""
Expand All @@ -19,13 +20,14 @@ help:
@echo " make dev-restart - Restart platform services"
@echo " make dev-rebuild - Rebuild images and restart services"
@echo " make dev-logs - Tail all platform logs"
@echo " make dev-migrate - Generate evaluators and run database migrations"
@echo " make dev-migrate - Generate evaluators and run database migrations (run after dev-up/setup)"
@echo ""
@echo "☸️ OpenChoreo Runtime:"
@echo " make openchoreo-up - Start OpenChoreo cluster"
@echo " make openchoreo-down - Stop OpenChoreo cluster (saves resources)"
@echo " make openchoreo-status - Check OpenChoreo cluster status"
@echo " make port-forward - Forward OpenChoreo services to localhost"
@echo " make port-forward - Stop and restart all port-forwards (interactive)"
@echo " make stop-port-forward - Stop all active port-forwards"
@echo ""
@echo "🗄️ Database:"
@echo " make db-connect - Connect to PostgreSQL"
Expand All @@ -45,17 +47,19 @@ help:

# Complete setup
setup: setup-colima setup-k3d setup-openchoreo setup-platform setup-console-local
@$(MAKE) dev-migrate
@cd deployments/scripts && ./port-forward.sh --platform --background
@$(MAKE) setup-gateway
@cd deployments/scripts && ./port-forward.sh --background
@echo ""
@echo "✅ Complete setup finished!"
@echo "✅ Setup complete!"
@echo ""
@echo "🌐 Access your services:"
@echo " Console: http://localhost:3000"
@echo " API: http://localhost:8080"
@echo " Traces Observer Service: http://localhost:9098"
@echo " Database: localhost:5432"
@echo " Console: http://localhost:3000"
@echo " API: http://localhost:8080"
@echo " API Platform Gateway: http://localhost:22893"
@echo ""
@echo "📊 To access OpenChoreo services, run:"
@echo " make port-forward"
@echo "Run 'make stop-port-forward' to stop port-forwards"
@echo "Run 'make port-forward' to restart in a dedicated terminal"

# Setup individual components
setup-colima:
Expand All @@ -75,6 +79,9 @@ gen-keys:
setup-platform: gen-keys
@cd deployments/scripts && ./setup-platform.sh

setup-gateway:
@cd deployments/scripts && ./setup-gateway.sh

# Console local setup with dependency tracking
# This will only rebuild when rush.json or pnpm-lock.yaml changes
.make:
Expand Down Expand Up @@ -182,8 +189,18 @@ openchoreo-status:
@kubectl get pods -n openchoreo-system --context kind-openchoreo-local 2>/dev/null || echo "Cluster not accessible"

# Port forwarding for OpenChoreo
PLATFORM ?=
GATEWAY ?=
BACKGROUND ?=

port-forward:
@cd deployments/scripts && ./port-forward.sh
@cd deployments/scripts && ./port-forward.sh \
$(if $(filter true,$(PLATFORM)),--platform) \
$(if $(filter true,$(GATEWAY)),--gateway) \
$(if $(filter true,$(BACKGROUND)),--background)

stop-port-forward:
@cd deployments/scripts && ./stop-port-forward.sh

# Database commands
db-connect:
Expand Down
2 changes: 1 addition & 1 deletion agent-manager-service/config/config_loader.go
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,7 @@ func loadEnvs() {
IsTraceContentEnabled: r.readOptionalBool("OTEL_TRACELOOP_TRACE_CONTENT", true),

// OTLP Exporter configuration
ExporterEndpoint: r.readOptionalString("OTEL_EXPORTER_OTLP_ENDPOINT", "http://obs-gateway-gateway-gateway-runtime.openchoreo-data-plane.svc.cluster.local:22893/otel"),
ExporterEndpoint: r.readOptionalString("OTEL_EXPORTER_OTLP_ENDPOINT", "http://api-platform-default-default-gateway-gateway-runtime.openchoreo-data-plane.svc.cluster.local:22893/otel"),
}

// Observer service configuration - temporarily use localhost for agent-manager-service to access observer service
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -122,17 +122,17 @@ export const AddAIGatewayOrganization: React.FC = () => {
},
onError: (e: unknown) => {
// eslint-disable-next-line no-console
console.error("Failed to create AI gateway:", e);
console.error("Failed to create gateway:", e);
},
}
);
}, [formData, validateForm, createGateway, navigate, orgId]);

return (
<PageLayout
title="Add AI Gateway"
title="Add Gateway"
backHref={backHref}
backLabel="Back to AI Gateways"
backLabel="Back to Gateways"
disableIcon
>
<Form.Stack spacing={2}>
Expand All @@ -159,7 +159,7 @@ export const AddAIGatewayOrganization: React.FC = () => {
<Alert severity="error" sx={{ mt: 2 }}>
{createError instanceof Error
? createError.message
: "Failed to create AI gateway"}
: "Failed to create gateway"}
</Alert>
)}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ export const GatewaysOrganization: React.FC = () => {
<Route
index
element={
<PageLayout title="AI Gateways" disableIcon>
<PageLayout title="Gateways" disableIcon>
<AIGatewaysTable onEditGateway={handleEditGateway} />
</PageLayout>
}
Expand Down
4 changes: 2 additions & 2 deletions console/workspaces/pages/gateways/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,8 @@ import { DoorClosedLocked } from "@wso2/oxygen-ui-icons-react";
import { GatewaysOrganization } from "./Gateways.Organization";

export const metaData = {
title: "AI Gateways",
description: "A page component for AI Gateway management",
title: "Gateways",
description: "A page component for Gateway management",
icon: DoorClosedLocked,
path: "/gateways",
component: GatewaysOrganization,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ export function AIGatewaysTable({ onEditGateway }: AIGatewaysTableProps) {
isLoading,
error,
refetch,
} = useListGateways({ orgName: orgId }, { type: "AI" });
} = useListGateways({ orgName: orgId });
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major | 🏗️ Heavy lift

Unbounded fetch at Line 73 can become a scalability bottleneck after removing type filtering.

Now that all gateway types are loaded, this view does client-side search + pagination on the full dataset. For orgs with many gateways, this increases payload size and render cost. Please move pagination (and ideally filtering) to the API query path (limit/offset supported by listGateways) instead of loading everything at once.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@console/workspaces/pages/gateways/src/subComponents/AIGatewaysTable.tsx` at
line 73, The component AIGatewaysTable currently calls useListGateways({
orgName: orgId }) which fetches all gateways client-side and causes scalability
issues; update AIGatewaysTable to pass pagination and filter params (e.g.,
limit, offset, and search/type filters) into useListGateways so the hook calls
listGateways with those query params instead of fetching everything, wire the
table pagination controls and search input to update limit/offset (and any
filter keys) and ensure useListGateways forwards them to listGateways so the API
performs paging/filtering server-side.


const { mutateAsync: deleteGateway } = useDeleteGateway();

Expand Down Expand Up @@ -101,7 +101,7 @@ export function AIGatewaysTable({ onEditGateway }: AIGatewaysTableProps) {
<Box flexGrow={1}>
<SearchBar
key="search-bar"
placeholder="Search AI Gateways..."
placeholder="Search Gateways..."
size="small"
fullWidth
value={searchQuery}
Expand All @@ -122,7 +122,7 @@ export function AIGatewaysTable({ onEditGateway }: AIGatewaysTableProps) {
color="primary"
startIcon={<Plus size={16} />}
>
Add AI Gateway
Add Gateway
</Button>
)}
</Stack>
Expand Down Expand Up @@ -204,8 +204,8 @@ export function AIGatewaysTable({ onEditGateway }: AIGatewaysTableProps) {
<ListingTable.Container>
<ListingTable.EmptyState
illustration={<DoorClosedLocked size={64} />}
title="No available AI gateway"
description="Add an AI gateway to manage and monitor your AI gateway deployments."
title="No available gateway"
description="Add a gateway to manage and monitor your gateway deployments."
action={
<Button
component={Link}
Expand All @@ -217,7 +217,7 @@ export function AIGatewaysTable({ onEditGateway }: AIGatewaysTableProps) {
variant="contained"
startIcon={<Plus size={16} />}
>
Add AI Gateway
Add Gateway
</Button>
}
/>
Expand All @@ -233,7 +233,7 @@ export function AIGatewaysTable({ onEditGateway }: AIGatewaysTableProps) {
<ListingTable.Container>
<ListingTable.EmptyState
illustration={<Search size={64} />}
title="No AI Gateways found."
title="No Gateways found."
description="Try a different keyword or clear the search filter."
/>
</ListingTable.Container>
Expand All @@ -255,6 +255,9 @@ export function AIGatewaysTable({ onEditGateway }: AIGatewaysTableProps) {
<ListingTable.Head>
<ListingTable.Row>
<ListingTable.Cell width="300px">Name</ListingTable.Cell>
<ListingTable.Cell align="center" width="120px">
Type
</ListingTable.Cell>
<ListingTable.Cell align="center" width="120px">
Status
</ListingTable.Cell>
Expand Down Expand Up @@ -336,6 +339,15 @@ export function AIGatewaysTable({ onEditGateway }: AIGatewaysTableProps) {
</Stack>
</ListingTable.Cell>

<ListingTable.Cell align="center">
<Chip
label={gateway.gatewayType === "AI" ? "AI" : "Regular"}
size="small"
variant="outlined"
color={gateway.gatewayType === "AI" ? "info" : "default"}
/>
</ListingTable.Cell>

<ListingTable.Cell align="center">
<Chip
label={isActive ? "Active" : "Inactive"}
Expand Down Expand Up @@ -374,7 +386,7 @@ export function AIGatewaysTable({ onEditGateway }: AIGatewaysTableProps) {
size="small"
onClick={() =>
addConfirmation({
title: "Delete AI Gateway",
title: "Delete Gateway",
description: `Are you sure you want to delete ${displayName}?`,
confirmButtonText: "Delete",
confirmButtonColor: "error",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -113,7 +113,7 @@ export const AddAIGatewayForm: React.FC<AddAIGatewayFormProps> = ({
<Form.ElementWrapper label="Name" name="displayName">
<TextField
id="displayName"
placeholder="e.g., Production AI Gateway"
placeholder="e.g., Production Gateway"
value={formData.displayName}
onChange={(e: React.ChangeEvent<HTMLInputElement>) =>
handleFieldChange("displayName", e.target.value)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -152,7 +152,7 @@ export function EditGatewayDrawer({
<DrawerWrapper open={open} onClose={onClose}>
<DrawerHeader
icon={<Edit size={24} />}
title="Edit AI Gateway"
title="Edit Gateway"
onClose={onClose}
/>
<DrawerContent>
Expand Down Expand Up @@ -184,7 +184,7 @@ export function EditGatewayDrawer({
onChange={(e) =>
handleFieldChange("displayName", e.target.value)
}
placeholder="e.g., Production AI Gateway"
placeholder="e.g., Production Gateway"
error={Boolean(errors.displayName)}
helperText={errors.displayName}
disabled={isPending}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -130,7 +130,7 @@ export const ViewGateway: React.FC = () => {
absoluteRouteMap.children.org.children.gateways.path,
{ orgId: orgId ?? "" },
)}
backLabel="Back to AI Gateways"
backLabel="Back to Gateways"
description={
gateway?.createdAt
? `Created ${formatDistanceToNow(new Date(gateway.createdAt), {
Expand Down Expand Up @@ -230,6 +230,26 @@ export const ViewGateway: React.FC = () => {
</Stack>
</Card>
</Grid>
<Grid size={{ xs: 12, sm: 6, md: 4 }}>
<Card variant="outlined" sx={{ p: 2, height: "100%" }}>
<Stack spacing={0.5}>
<Typography
variant="caption"
color="text.secondary"
sx={{ fontWeight: 500 }}
>
Type
</Typography>
<Chip
label={gateway.gatewayType?.toUpperCase() === "AI" ? "AI" : "Regular"}
size="small"
variant="outlined"
color={gateway.gatewayType?.toUpperCase() === "AI" ? "info" : "default"}
sx={{ width: "fit-content" }}
/>
</Stack>
</Card>
</Grid>
<Grid size={{ xs: 12, sm: 6, md: 4 }}>
<Card variant="outlined" sx={{ p: 2, height: "100%" }}>
<Stack spacing={0.5}>
Expand Down
4 changes: 2 additions & 2 deletions deployments/docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -101,8 +101,8 @@ services:
- "api.openchoreo.localhost:host-gateway"
# Thunder IDP for OAuth2 token exchange (must match OpenChoreo's security.oidc config)
- "thunder.amp.localhost:host-gateway"
# AI Gateway runtime for agent endpoint access (port 8084 mapped via k3d)
- "ai-gateway.amp.localhost:host-gateway"
# API Platform Gateway runtime for agent endpoint access
- "api-platform-gateway.amp.localhost:host-gateway"

# Agent Manager Console (React Frontend)
agent-manager-console:
Expand Down
2 changes: 1 addition & 1 deletion deployments/helm-charts/wso2-agent-manager/values.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -124,7 +124,7 @@ agentManagerService:
# OpenTelemetry configuration
otel:
traceContent: "true"
exporterEndpoint: "http://obs-gateway-gateway-gateway-runtime.openchoreo-data-plane.svc.cluster.local:22893/otel"
exporterEndpoint: "http://api-platform-default-default-gateway-gateway-runtime.openchoreo-data-plane.svc.cluster.local:22893/otel"

# Key Manager configuration
keyManager:
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
apiVersion: v2
name: wso2-amp-ai-gateway-extension
description: A Helm chart to deploy and auto-register the WSO2 AI API Gateway for the Agent Management Platform.
name: wso2-amp-api-platform-gateway-extension
description: A Helm chart to deploy and auto-register the unified API Platform Gateway for the Agent Management Platform.
type: application
version: 0.0.0-dev
appVersion: "0.0.0-dev"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,13 +51,13 @@ Defaults to "<release-name>-config" when not explicitly set.

{{/*
Name of the APIGateway CR.
Defaults to the release name when gateway.name is not explicitly set.
Defaults to "api-platform-<orgName>-<environment>" when gateway.name is not explicitly set.
*/}}
{{- define "wso2-amp-gateway-extension.apiGatewayName" -}}
{{- if .Values.gateway.name }}
{{- .Values.gateway.name }}
{{- else }}
{{- .Release.Name | trunc 63 | trimSuffix "-" }}
{{- printf "api-platform-%s-%s" .Values.agentManager.orgName .Values.gateway.environment | lower | trunc 63 | trimSuffix "-" }}
{{- end }}
Comment thread
coderabbitai[bot] marked this conversation as resolved.
{{- end }}

Expand All @@ -78,7 +78,7 @@ Resolve the IDP client ID from secret or direct value
valueFrom:
secretKeyRef:
name: {{ .Values.agentManager.idp.existingSecret }}
key: {{ .Values.agentManager.idp.existingSecretClientIdKey }}
key: {{ required "agentManager.idp.existingSecretClientIdKey is required when using existingSecret" .Values.agentManager.idp.existingSecretClientIdKey }}
{{- else }}
- name: IDP_CLIENT_ID
value: {{ .Values.agentManager.idp.clientId | quote }}
Expand All @@ -94,7 +94,7 @@ Resolve the IDP client secret from secret or direct value
valueFrom:
secretKeyRef:
name: {{ .Values.agentManager.idp.existingSecret }}
key: {{ .Values.agentManager.idp.existingSecretClientSecretKey }}
key: {{ required "agentManager.idp.existingSecretClientSecretKey is required when using existingSecret" .Values.agentManager.idp.existingSecretClientSecretKey }}
{{- else }}
- name: IDP_CLIENT_SECRET
value: {{ .Values.agentManager.idp.clientSecret | quote }}
Expand Down
Loading
Loading