Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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: 2 additions & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@ components/**
packages/**
!packages/gateway-management-ui/
!packages/gateway-management-ui/**
!packages/operational-dashboard-ui/
!packages/operational-dashboard-ui/**
!components/web-console/
!components/web-console/**
!scripts/bootstrap_pnpm.sh
Expand Down
2 changes: 1 addition & 1 deletion .forbidden-terms-whitelist.json
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@
},
{
"filename": "CLAUDE.md",
"line": 125,
"line": 127,
"rationale": "The em dash appears inside a convention rule that documents the character itself as a forbidden term; it must be shown literally to be unambiguous."
}
]
15 changes: 15 additions & 0 deletions .github/component-paths.json
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,20 @@
".github/workflows/lint.yml"
]
},
"operational_dashboard_ui": {
"directory": "packages/operational-dashboard-ui",
"lint_job": "lint-operational-dashboard-ui",
"paths": [
"packages/operational-dashboard-ui/**",
"package.json",
"pnpm-lock.yaml",
"pnpm-workspace.yaml",
"Makefile",
".github/component-paths.json",
".github/scripts/detect-components.sh",
".github/workflows/lint.yml"
]
},
"e2e": {
"directory": "tests/e2e",
"paths": [
Expand Down Expand Up @@ -112,6 +126,7 @@
"paths": [
"components/web-console/**",
"packages/gateway-management-ui/**",
"packages/operational-dashboard-ui/**",
"components/sdk-typescript/**",
"package.json",
"pnpm-lock.yaml",
Expand Down
24 changes: 23 additions & 1 deletion .github/workflows/lint.yml
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ jobs:
cli: ${{ steps.detect.outputs.cli }}
control_plane: ${{ steps.detect.outputs.control_plane }}
gateway_management_ui: ${{ steps.detect.outputs.gateway_management_ui }}
operational_dashboard_ui: ${{ steps.detect.outputs.operational_dashboard_ui }}
pr_test: ${{ steps.detect.outputs.pr_test }}
sdk_typescript: ${{ steps.detect.outputs.sdk_typescript }}
web_console: ${{ steps.detect.outputs.web_console }}
Expand Down Expand Up @@ -189,6 +190,25 @@ jobs:
- name: Run gateway management UI package quality gates
run: pnpm --filter @openshift-online/hypershell-gateway-management-ui check

lint-operational-dashboard-ui:
name: Operational dashboard UI package quality gates
needs: detect-changes
if: needs.detect-changes.outputs.operational_dashboard_ui == 'true'
runs-on: ubuntu-24.04
steps:
- name: Check out repository
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
- name: Set up Node.js
uses: actions/setup-node@249970729cb0ef3589644e2896645e5dc5ba9c38 # v6.5.0
with:
node-version-file: .node-version
- name: Install pinned pnpm
run: bash scripts/bootstrap_pnpm.sh
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Run operational dashboard UI package quality gates
run: pnpm --filter @openshift-online/hypershell-operational-dashboard-ui check

lint-pr-test:
name: PR test script validation
needs: detect-changes
Expand Down Expand Up @@ -254,6 +274,7 @@ jobs:
- lint-cli
- lint-control-plane
- lint-gateway-management-ui
- lint-operational-dashboard-ui
- lint-pr-test
- lint-sdk-typescript
- lint-web-console
Expand All @@ -266,11 +287,12 @@ jobs:
CLI_RESULT: ${{ needs.lint-cli.result }}
CONTROL_PLANE_RESULT: ${{ needs.lint-control-plane.result }}
GATEWAY_MANAGEMENT_UI_RESULT: ${{ needs.lint-gateway-management-ui.result }}
OPERATIONAL_DASHBOARD_UI_RESULT: ${{ needs.lint-operational-dashboard-ui.result }}
PR_TEST_RESULT: ${{ needs.lint-pr-test.result }}
SDK_TYPESCRIPT_RESULT: ${{ needs.lint-sdk-typescript.result }}
WEB_CONSOLE_RESULT: ${{ needs.lint-web-console.result }}
run: |
for result in "${DETECTION_RESULT}" "${API_SERVER_RESULT}" "${CLI_RESULT}" "${CONTROL_PLANE_RESULT}" "${GATEWAY_MANAGEMENT_UI_RESULT}" "${PR_TEST_RESULT}" "${SDK_TYPESCRIPT_RESULT}" "${WEB_CONSOLE_RESULT}"; do
for result in "${DETECTION_RESULT}" "${API_SERVER_RESULT}" "${CLI_RESULT}" "${CONTROL_PLANE_RESULT}" "${GATEWAY_MANAGEMENT_UI_RESULT}" "${OPERATIONAL_DASHBOARD_UI_RESULT}" "${PR_TEST_RESULT}" "${SDK_TYPESCRIPT_RESULT}" "${WEB_CONSOLE_RESULT}"; do
if [[ "${result}" == failure || "${result}" == cancelled ]]; then
echo "One or more lint jobs failed or were cancelled."
exit 1
Expand Down
2 changes: 2 additions & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ checks manually with `make check`.
- `components/api-server/` - Go REST + gRPC API microservice (rh-trex-ai framework), PostgreSQL-backed
- `components/control-plane/` - Go service, watches API server via gRPC and reconciles gateway resources into K8s
- `packages/gateway-management-ui/` - Private reusable React package containing canonical gateway management workflows
- `packages/operational-dashboard-ui/` - Private reusable React package containing the operational metrics dashboard
- `specs/` - Desired state of the system ([platform](specs/platform/), [standards](specs/standards/))
- `skills/` - Agent skills: [reconcile](skills/build/reconcile), [spec](skills/plan/spec), [full-stack-pipeline](skills/build/full-stack-pipeline), [dev-cluster](skills/build/dev-cluster), [ibm-cluster](skills/deploy/ibm-cluster), [deploy-cluster](skills/deploy/deploy-cluster), [cloud-hub-ingress-bootstrap](skills/deploy/cloud-hub-ingress-bootstrap), [review](skills/review/review-guidance), [amber-review](skills/review/amber-review), [ui-standards](skills/review/ui-standards), [tooling](skills/tooling/)
- `apm.yml` - APM manifest declaring upstream skill dependencies
Expand Down Expand Up @@ -99,6 +100,7 @@ cd components/control-plane && go vet ./... # Vet
# All Components
make build-all # Build all container images
pnpm --filter @openshift-online/hypershell-gateway-management-ui check # Verify reusable gateway UI
pnpm --filter @openshift-online/hypershell-operational-dashboard-ui check # Verify operational dashboard UI
make kind-up # Start local Kind cluster
make kind-down # Destroy Kind cluster
make kind-status # Show cluster status
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -179,7 +179,7 @@ The API server exposes Prometheus metrics on its metrics port (default `:8080/me

| Metric | Type | Description |
|---|---|---|
| `hypershell_gateways_total{phase="Running"|"Provisioning"|"Degraded"|"Failed"}` | Gauge | Number of gateways by phase. Queried live from the database on each scrape. |
| `hypershell_gateways_total{phase="Pending"|"Provisioning"|"Running"|"Degraded"|"Failed"}` | Gauge | Number of gateways by phase. Queried live from the database on each scrape. |

The control plane also exports these metrics through OTLP:

Expand Down
124 changes: 124 additions & 0 deletions components/api-server/openapi/openapi.users.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,124 @@
# NEW ENDPOINT START
paths:
/api/hypershell/v1/users:
get:
summary: List registered users
operationId: listUsers
parameters:
- $ref: '#/components/parameters/page'
- $ref: '#/components/parameters/size'
- $ref: '#/components/parameters/search'
- $ref: '#/components/parameters/orderBy'
- $ref: '#/components/parameters/fields'
responses:
'200':
description: A list of registered users
content:
application/json:
schema:
$ref: '#/components/schemas/UserList'
'401':
$ref: 'openapi.yaml#/components/responses/UnauthorizedError'
'403':
$ref: 'openapi.yaml#/components/responses/ForbiddenError'
'500':
$ref: 'openapi.yaml#/components/responses/InternalServerError'
/api/hypershell/v1/users/{id}:
get:
summary: Get a registered user by ID
operationId: getUser
responses:
'200':
description: User found
content:
application/json:
schema:
$ref: '#/components/schemas/User'
'401':
$ref: 'openapi.yaml#/components/responses/UnauthorizedError'
'404':
description: User not found
content:
application/json:
schema:
$ref: 'openapi.yaml#/components/schemas/Error'
'500':
$ref: 'openapi.yaml#/components/responses/InternalServerError'
parameters:
- $ref: '#/components/parameters/id'
# NEW ENDPOINT END
components:
schemas:
# NEW SCHEMA START
User:
allOf:
- $ref: 'openapi.yaml#/components/schemas/ObjectReference'
- type: object
required:
- username
properties:
username:
type: string
email:
type: string
name:
type: string
# NEW SCHEMA END
# NEW SCHEMA START
UserList:
allOf:
- $ref: 'openapi.yaml#/components/schemas/List'
- type: object
properties:
items:
type: array
items:
$ref: '#/components/schemas/User'
# NEW SCHEMA END
parameters:
id:
name: id
in: path
description: The id of record
required: true
schema:
type: string
page:
name: page
in: query
description: Page number of record list when record list exceeds specified page size
schema:
type: integer
default: 1
minimum: 1
required: false
size:
name: size
in: query
description: Maximum number of records to return
schema:
type: integer
default: 100
minimum: 0
required: false
search:
name: search
in: query
required: false
description: Specifies the search criteria
schema:
type: string
orderBy:
name: orderBy
in: query
required: false
description: Specifies the order by criteria
schema:
type: string
fields:
name: fields
in: query
required: false
description: Supplies a comma-separated list of fields to be returned
schema:
type: string
8 changes: 8 additions & 0 deletions components/api-server/openapi/openapi.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,10 @@ paths:
$ref: 'openapi.roleBindings.yaml#/paths/~1api~1hypershell~1v1~1role_bindings'
/api/hypershell/v1/role_bindings/{id}:
$ref: 'openapi.roleBindings.yaml#/paths/~1api~1hypershell~1v1~1role_bindings~1{id}'
/api/hypershell/v1/users:
$ref: 'openapi.users.yaml#/paths/~1api~1hypershell~1v1~1users'
/api/hypershell/v1/users/{id}:
$ref: 'openapi.users.yaml#/paths/~1api~1hypershell~1v1~1users~1{id}'
# AUTO-ADD NEW PATHS
components:
schemas:
Expand Down Expand Up @@ -162,6 +166,10 @@ components:
$ref: 'openapi.roleBindings.yaml#/components/schemas/RoleBinding'
RoleBindingList:
$ref: 'openapi.roleBindings.yaml#/components/schemas/RoleBindingList'
User:
$ref: 'openapi.users.yaml#/components/schemas/User'
UserList:
$ref: 'openapi.users.yaml#/components/schemas/UserList'
# AUTO-ADD NEW SCHEMAS
parameters:
id:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,8 @@ docs/Role.md
docs/RoleBinding.md
docs/RoleBindingList.md
docs/RoleList.md
docs/User.md
docs/UserList.md
git_push.sh
go.mod
go.sum
Expand Down Expand Up @@ -78,6 +80,8 @@ model_role.go
model_role_binding.go
model_role_binding_list.go
model_role_list.go
model_user.go
model_user_list.go
response.go
test/api_default_test.go
utils.go
4 changes: 4 additions & 0 deletions components/api-server/pkg/api/openapi/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,7 @@ Class | Method | HTTP request | Description
*DefaultAPI* | [**GetMetadata**](docs/DefaultAPI.md#getmetadata) | **Get** /api/hypershell/v1/metadata | Service metadata
*DefaultAPI* | [**GetRole**](docs/DefaultAPI.md#getrole) | **Get** /api/hypershell/v1/roles/{id} | Get a role by ID
*DefaultAPI* | [**GetRoleBinding**](docs/DefaultAPI.md#getrolebinding) | **Get** /api/hypershell/v1/role_bindings/{id} | Get a role binding by ID
*DefaultAPI* | [**GetUser**](docs/DefaultAPI.md#getuser) | **Get** /api/hypershell/v1/users/{id} | Get a registered user by ID
*DefaultAPI* | [**ListGatewayNetworks**](docs/DefaultAPI.md#listgatewaynetworks) | **Get** /api/hypershell/v1/gateway_networks | Returns a list of gatewayNetworks
*DefaultAPI* | [**ListGatewayReleases**](docs/DefaultAPI.md#listgatewayreleases) | **Get** /api/hypershell/v1/gateway_releases | Returns a list of gatewayReleases
*DefaultAPI* | [**ListGatewayServiceAccounts**](docs/DefaultAPI.md#listgatewayserviceaccounts) | **Get** /api/hypershell/v1/gateways/{gateway_id}/service_accounts | List OpenShell gateway service accounts
Expand All @@ -109,6 +110,7 @@ Class | Method | HTTP request | Description
*DefaultAPI* | [**ListManagedDatabases**](docs/DefaultAPI.md#listmanageddatabases) | **Get** /api/hypershell/v1/managed_databases | Returns a list of managedDatabases
*DefaultAPI* | [**ListRoleBindings**](docs/DefaultAPI.md#listrolebindings) | **Get** /api/hypershell/v1/role_bindings | List role bindings
*DefaultAPI* | [**ListRoles**](docs/DefaultAPI.md#listroles) | **Get** /api/hypershell/v1/roles | List all roles
*DefaultAPI* | [**ListUsers**](docs/DefaultAPI.md#listusers) | **Get** /api/hypershell/v1/users | List registered users
*DefaultAPI* | [**RevokeGatewayServiceAccount**](docs/DefaultAPI.md#revokegatewayserviceaccount) | **Post** /api/hypershell/v1/gateways/{gateway_id}/service_accounts/{service_account_id}/revoke | Permanently revoke an OpenShell gateway service account
*DefaultAPI* | [**UpdateGateway**](docs/DefaultAPI.md#updategateway) | **Patch** /api/hypershell/v1/gateways/{id} | Update an gateway
*DefaultAPI* | [**UpdateGatewayNetwork**](docs/DefaultAPI.md#updategatewaynetwork) | **Patch** /api/hypershell/v1/gateway_networks/{id} | Update an gatewayNetwork
Expand Down Expand Up @@ -153,6 +155,8 @@ Class | Method | HTTP request | Description
- [RoleBinding](docs/RoleBinding.md)
- [RoleBindingList](docs/RoleBindingList.md)
- [RoleList](docs/RoleList.md)
- [User](docs/User.md)
- [UserList](docs/UserList.md)


## Documentation For Authorization
Expand Down
Loading
Loading