Commit graph

2407 commits

Author SHA1 Message Date
rcourtman
8769f07eea Land SMART/SSH temperature feature, rc.6 finalization, and post-IA-revert governance reconciliation 2026-05-27 15:27:25 +01:00
rcourtman
84c43ad3e1 Fix Windows agent installer readiness path 2026-05-26 10:19:56 +01:00
rcourtman
6f4a9ca88b Show backup age in workload rows 2026-05-26 10:05:40 +01:00
rcourtman
d6f2ec202d Simplify Proxmox backup recovery navigation 2026-05-26 09:45:05 +01:00
rcourtman
c1a4f4579e Align Windows agent onboarding with seamless install flow 2026-05-26 09:29:03 +01:00
rcourtman
a0b75792a4 Add Proxmox backup recovery coverage views 2026-05-26 09:19:45 +01:00
rcourtman
d5589cc8ca Make agent machine onboarding seamless 2026-05-26 09:07:59 +01:00
rcourtman
1e16cf34f5 Keep Machines limited to Pulse Agent resources 2026-05-26 07:45:16 +01:00
rcourtman
3561803d76 Add pingable machine availability preset 2026-05-26 07:37:49 +01:00
rcourtman
95500b0376 Clarify availability check add flows 2026-05-26 06:14:06 +01:00
rcourtman
7cf0a474ee Rename Standalone surface to Machines 2026-05-25 21:51:31 +01:00
rcourtman
7470b62a01 Fix Proxmox PBS backup artifact surface 2026-05-25 21:47:12 +01:00
rcourtman
bfafe559f6 Classify agentless machine availability targets 2026-05-25 21:38:43 +01:00
rcourtman
4721f3d1c0 Fix resolved notifications after direct alert dispatch
Refs #1350
2026-05-25 20:18:52 +01:00
rcourtman
f2e3169b12 Rename Standalone default tab to Machines 2026-05-25 18:07:55 +01:00
rcourtman
ed67706824 Keep Standalone availability checks in focused tab 2026-05-25 17:51:09 +01:00
rcourtman
697634da76 Consolidate Standalone IA governance 2026-05-25 17:28:22 +01:00
rcourtman
ce37d78772 Normalize Standalone landing decision 2026-05-25 17:19:46 +01:00
rcourtman
ed1770c4f4 Rename Agents surface to Standalone 2026-05-25 17:15:31 +01:00
rcourtman
d6f60963a1 Show availability checks on Agents page 2026-05-25 16:44:16 +01:00
rcourtman
322457c03b Move availability checks to monitoring settings 2026-05-25 16:08:47 +01:00
rcourtman
bfc79ff06d Retire remaining settings route aliases 2026-05-25 15:10:33 +01:00
rcourtman
cfb16e6da1 Retire legacy settings infrastructure aliases 2026-05-25 14:07:17 +01:00
rcourtman
3c0bd12fc6 Retire aggregate route-state path builders 2026-05-25 13:42:26 +01:00
rcourtman
3f9c8168fb Retire legacy top-level browser aliases 2026-05-25 13:16:42 +01:00
rcourtman
8b0b1b0c6e Retire aggregate top-level workspace routes 2026-05-25 12:34:57 +01:00
rcourtman
c9be4c86f2 Clarify aggregate workspace routes 2026-05-25 11:43:35 +01:00
rcourtman
e38f0b8e1f Remove legacy infrastructure route 2026-05-25 11:04:38 +01:00
rcourtman
052e344e1b Add Kubernetes RBAC inventory to the agent + canonical + UI
Some checks are pending
Build and Test / Secret Scan (push) Waiting to run
Build and Test / Frontend & Backend (push) Waiting to run
Closes the only API-coverage gap from the Docker / Kubernetes IA
maturity review: Roles, ClusterRoles, RoleBindings, and
ClusterRoleBindings now flow from the Kubernetes agent through the
canonical resource registry into the Kubernetes platform-page
Configuration tab.

Agent: pkg/agents/kubernetes/report.go gains four new report struct
types that carry summary counts plus subject-kind sets; individual
subject names and full PolicyRule contents are deliberately omitted
so Pulse stays a "what permissions exist where" surface, not an RBAC
enumeration tool. internal/kubernetesagent/agent.go gains four
collectors that call rbacv1.RoleList/ClusterRoleList/etc. through the
existing runKubernetesCallWithRetry wrapper, matching the
ServiceAccount collector's RBAC-forbidden retry pattern.

Canonical: internal/models mirrors with NormalizeCollections coverage;
convert* funcs in internal/monitoring/kubernetes_agents.go translate
agent report -> model; ResourceTypeK8sRole / K8sClusterRole /
K8sRoleBinding / K8sClusterRoleBinding join the canonical type set;
registry ingest* + adapter resourceFrom* functions emit one Resource
per RBAC object with ruleCount / roleKind / roleName / subjectCount /
subjectKinds / aggregationLabels on the K8s meta; search mapping in
internal/api/resources.go and the privacy allow-list in
internal/api/org_handlers.go pick up the four new type tokens; the
K8s privacy category in unifiedresources/policy_metadata.go classifies
them like the rest of K8s.

Frontend: ResourceType union + ResourceKubernetesMeta carry the new
kinds and RBAC summary fields; KubernetesPageSurface query asks for
them; the page model buckets them into the Configuration group;
KubernetesConfigTable renders Role / ClusterRole rule counts and the
aggregated flag, plus RoleBinding / ClusterRoleBinding role refs and
"N subjects · Kind1, Kind2 +overflow" subject summaries.

Curated demo seeds per-namespace Roles + RoleBindings plus an
aggregated ClusterRole + ClusterRoleBinding for pulse-demo-monitoring
in each cluster so the Configuration tab renders 18 RBAC rows across
the three demo clusters.

Contracts updated for the canonical-shape guard: monitoring,
api-contracts, unified-resources, frontend-primitives,
organization-settings (canonical) plus agent-lifecycle and
storage-recovery (dependent via Extension Points). Verification
proofs extended: kubernetes_registry_test.go, kubernetes_agents_test.go,
agent_inventory_test.go (new TestCollectRBACInventoryReportsSummaryCountsOnly
that pins the subject-name-omission contract), demo_scenarios_test.go,
adapter_coverage_test.go, contract_test.go, org_handlers_test.go,
resourceIdentity.test.ts, reportingResourceTypes.test.ts,
KubernetesConfigTable.test.tsx, and the
subsystem_lookup_test.py line-anchor bumps that the contract edits
shifted (api-contracts 246 -> 253, organization-settings 92 -> 93).

Verified:
- go build ./internal/... ./cmd/... clean
- go test ./internal/unifiedresources/..., ./internal/mock/...,
  ./internal/kubernetesagent/..., ./internal/api/...,
  the K8s subset of ./internal/monitoring/... all clean (three
  pre-existing unrelated monitoring failures noted earlier remain
  unchanged by this commit)
- npm run type-check, lint:eslint, lint:theme,
  lint:canonical-platforms clean
- vitest: 70 K8s frontend tests pass including the new RBAC render
  coverage in KubernetesConfigTable.test.tsx
- browser proof on /kubernetes/configuration: 36 config rows
  including 18 RBAC rows across three clusters; ClusterRole
  "pulse-demo-monitoring" shows "12 rules · Aggregated";
  ClusterRoleBinding shows "3 subjects · Group, ServiceAccount +1"
2026-05-25 09:25:03 +01:00
rcourtman
29b5a9cc00 Give each curated Kubernetes demo cluster a distinct story
Per-cluster node profiles, kubelet versions, and degraded scenarios
replace the global rotation that made every demo cluster look like a
copy of the same one. Production EU keeps its prod-euw1-k8s-{01..05}
nodes and the NotReady worker on prod-euw1-k8s-03 (preserving the
existing host-posture test contract). Staging EU runs
stage-euw1-k8s-{01..05} and carries the payments-worker
CrashLoopBackOff. Development EU runs dev-euw1-{01..05} and carries
an ImagePullBackOff on cron-nightly-backfill (re-labelled from the
previous "Pending / PodInitializing" rotation so the curated
reconciler doesn't recover it). The unused Edge profile gets distinct
edge-pop-{lax,nrt,fra,iad,sin}-01 names + k3s version for when the
cluster count is bumped above three.

A new TestKubernetesDemoClustersTellDistinctStories test guards the
slice goal: each cluster's nodes use its own prefix, exactly one
cluster carries each degraded scenario, and every cluster has a
unique kubelet version. The monitoring subsystem contract is updated
to reflect the new three-cluster cast (Production EU + Staging EU +
Development EU) plus the per-cluster scenario distribution.

Side effect: with distinct node names per cluster, the K8s page
model's cluster-to-node matching now resolves all five nodes for
each cluster (previously two clusters showed "0 nodes" because every
cluster's nodes shared the same prod-euw1-* names, breaking
buildKubernetesClusterChildCounts' clusterId lookup).

Verified:
- go vet ./internal/mock/..., go test ./internal/mock/... clean
- browser proof on /kubernetes/overview: three clusters render with
  distinct versions (v1.30.4 / v1.31.2 / v1.32.0-rc.1) and 5 nodes
  each (vs the previous 5/0/0 split)
- /kubernetes/nodes: 15 rows across the three clusters with three
  distinct name prefixes; one red NotReady dot on Production EU's
  prod-euw1-k8s-03; fourteen green Ready dots elsewhere
2026-05-25 08:28:20 +01:00
rcourtman
6d7ee5d732 Tighten platform overview IA 2026-05-24 19:41:29 +01:00
rcourtman
c713027379 Normalize Kubernetes workflow tab contracts 2026-05-24 19:26:04 +01:00
rcourtman
a590024ca0 Consolidate container and Kubernetes platform tabs 2026-05-24 19:20:14 +01:00
rcourtman
3403104662 Expose Docker and Kubernetes API tab fields 2026-05-24 18:47:55 +01:00
rcourtman
223b11185f Add native Docker containers table 2026-05-24 17:41:35 +01:00
rcourtman
a76a75bdf6 Split Kubernetes workload tabs 2026-05-24 17:13:26 +01:00
rcourtman
f59ec0ceaf Add Kubernetes controllers native table 2026-05-24 16:38:49 +01:00
rcourtman
a353d11493 Split Docker inventory into native tables 2026-05-24 15:54:23 +01:00
rcourtman
eab8f0969b Add Kubernetes events native table 2026-05-24 15:32:19 +01:00
rcourtman
ad844ece90 Add Kubernetes autoscaling native table 2026-05-24 15:20:59 +01:00
rcourtman
65e7147f2e Add Kubernetes policy native table 2026-05-24 15:10:36 +01:00
rcourtman
9d149ac11a Add Kubernetes config native table 2026-05-24 14:53:03 +01:00
rcourtman
aa14a96644 Add Kubernetes services native table 2026-05-24 14:34:13 +01:00
rcourtman
ecd3e4d377 Add Kubernetes networking native table 2026-05-24 14:21:25 +01:00
rcourtman
0d22db1a27 Add Kubernetes storage native table 2026-05-24 14:05:34 +01:00
rcourtman
c8380613d7 Seed native platform tab fixtures 2026-05-24 13:16:00 +01:00
rcourtman
7c58ca0f79 Promote Kubernetes nodes to platform tab 2026-05-24 12:52:54 +01:00
rcourtman
49c9ca7656 Use metadata-only Kubernetes config inventory 2026-05-24 12:36:50 +01:00
rcourtman
120dd5353a Expand Docker Swarm metadata inventory 2026-05-24 12:07:10 +01:00
rcourtman
0d67ca1b4a Expand Kubernetes API-native inventory surfaces
Collect native Kubernetes config, policy, and autoscaling objects.
Project the new resource types through API filters, unified resources, mock fixtures, and Kubernetes tabs.
Keep Secret inventory metadata-only and route k8s-secret policy as restricted local-only.
2026-05-24 11:12:33 +01:00