@opensoha/contracts 0.1.27 → 0.1.29

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (94) hide show
  1. package/COMPATIBILITY.md +4 -3
  2. package/README.md +8 -9
  3. package/compat/consumer-revisions.json +1 -1
  4. package/compat/json-schema-ecosystem-0.1.0.json +1 -1
  5. package/compat/openapi-loose-boundaries-0.1.0.json +1 -1
  6. package/fixtures/openapi/KubernetesClusterRegistrationRequest/invalid/metric-cluster-value-length.json +3 -0
  7. package/fixtures/openapi/KubernetesClusterRegistrationRequest/invalid/metric-cluster-value-type.json +3 -0
  8. package/fixtures/openapi/KubernetesClusterRegistrationRequest/valid/metric-cluster-alias.json +5 -0
  9. package/fixtures/openapi/KubernetesClusterRegistrationRequest/valid/metric-cluster-reset.json +3 -0
  10. package/fixtures/openapi/KubernetesHelmReleaseValuesUpdateInput/invalid/revision-overflow.json +4 -0
  11. package/fixtures/openapi/KubernetesHelmReleaseValuesUpdateInput/valid/legacy.json +3 -0
  12. package/fixtures/openapi/KubernetesHelmReleaseValuesUpdateInput/valid/observed-revision.json +4 -0
  13. package/fixtures/openapi/KubernetesJobDetail/invalid/execution-observation.json +23 -0
  14. package/fixtures/openapi/KubernetesJobDetail/valid/execution-observation.json +23 -0
  15. package/fixtures/openapi/KubernetesNode/invalid/labels.json +10 -0
  16. package/fixtures/openapi/KubernetesNode/valid/labels.json +11 -0
  17. package/fixtures/openapi/KubernetesPodListEnvelope/invalid/empty-uid.json +13 -0
  18. package/fixtures/openapi/KubernetesPodListEnvelope/invalid/invalid-container-state.json +20 -0
  19. package/fixtures/openapi/KubernetesPodListEnvelope/invalid/missing-container-ready.json +19 -0
  20. package/fixtures/openapi/KubernetesPodListEnvelope/valid/container-statuses.json +67 -0
  21. package/fixtures/openapi/KubernetesPodListEnvelope/valid/running-pod.json +1 -0
  22. package/fixtures/openapi/KubernetesPrometheusDetail/invalid/metric-cluster-value-type.json +4 -0
  23. package/fixtures/openapi/KubernetesPrometheusDetail/valid/metric-cluster-alias.json +5 -0
  24. package/fixtures/openapi/KubernetesResourceGraphEnvelope/invalid/network-edge-source-payload.json +73 -0
  25. package/fixtures/openapi/KubernetesResourceGraphEnvelope/valid/network-edge-facts.json +67 -0
  26. package/fixtures/openapi/KubernetesSecretCertificate/invalid/secret-data.json +1 -0
  27. package/fixtures/openapi/KubernetesSecretCertificate/invalid/status.json +1 -0
  28. package/fixtures/openapi/KubernetesSecretCertificate/valid/available.json +1 -0
  29. package/fixtures/openapi/KubernetesSecretCertificate/valid/missing.json +1 -0
  30. package/gen/go/sohaapi/client.go +1 -1
  31. package/gen/go/sohaapi/client_test.go +13 -0
  32. package/gen/go/sohaapi/kubernetes_workload_optional_test.go +40 -0
  33. package/gen/go/sohaapi/pod_status_compat_test.go +36 -0
  34. package/gen/go/sohaapi/types.go +421 -88
  35. package/gen/ts/sohaapi/index.ts +756 -4
  36. package/helmrelease/runtime/values_upgrade.go +78 -0
  37. package/helmrelease/runtime/values_upgrade_test.go +123 -0
  38. package/helmrelease/values_update.go +31 -0
  39. package/openapi/soha-api.json +1191 -14
  40. package/openapi/soha-api.yaml +588 -28
  41. package/openapi/spec_generated.go +3 -3
  42. package/package.json +1 -1
  43. package/resource/agent_profiles.go +9 -15
  44. package/resource/agent_profiles_test.go +9 -3
  45. package/resource/custom_graph_page.go +18 -0
  46. package/resource/models.go +102 -57
  47. package/resource/network_topology.go +22 -0
  48. package/resource/network_topology_projection.go +36 -22
  49. package/resource/network_topology_projection_test.go +4 -0
  50. package/resource/network_topology_test.go +20 -0
  51. package/resource/network_topology_validation.go +5 -0
  52. package/resource/observed_workload.go +18 -0
  53. package/resource/pod_status_test.go +22 -0
  54. package/resource/rbac_graph.go +4 -0
  55. package/resource/rollout_optional_test.go +33 -0
  56. package/resource/runtime/network_relationship_primitives.go +66 -0
  57. package/resource/runtime/network_relationship_primitives_test.go +147 -0
  58. package/resource/runtime/network_topology.go +17 -5
  59. package/resource/runtime/network_topology_builder.go +405 -0
  60. package/resource/runtime/network_topology_builder_backends.go +195 -0
  61. package/resource/runtime/network_topology_builder_gateway_l4_test.go +86 -0
  62. package/resource/runtime/network_topology_builder_ingress.go +302 -0
  63. package/resource/runtime/network_topology_builder_legacy.go +66 -0
  64. package/resource/runtime/network_topology_builder_providers.go +242 -0
  65. package/resource/runtime/network_topology_builder_test.go +186 -0
  66. package/resource/runtime/network_topology_declarations.go +329 -0
  67. package/resource/runtime/resource_edit.go +22 -0
  68. package/resource/runtime/resource_edit_test.go +32 -0
  69. package/resource/runtime/resource_graph_collect.go +325 -0
  70. package/resource/runtime/resource_graph_configuration.go +59 -0
  71. package/resource/runtime/resource_graph_configuration_collect.go +198 -0
  72. package/resource/runtime/resource_graph_configuration_test.go +470 -0
  73. package/resource/runtime/resource_graph_custom_page.go +159 -0
  74. package/resource/runtime/resource_graph_custom_root.go +132 -0
  75. package/resource/runtime/resource_graph_custom_root_test.go +197 -0
  76. package/resource/runtime/resource_graph_enrichment.go +417 -0
  77. package/resource/runtime/resource_graph_enrichment_hpa_test.go +117 -0
  78. package/resource/runtime/resource_graph_enrichment_test.go +201 -0
  79. package/resource/runtime/resource_graph_metadata.go +125 -0
  80. package/resource/runtime/resource_graph_metadata_test.go +204 -0
  81. package/resource/runtime/resource_graph_network.go +224 -0
  82. package/resource/runtime/resource_graph_network_collect.go +174 -0
  83. package/resource/runtime/resource_graph_network_collect_test.go +147 -0
  84. package/resource/runtime/resource_graph_network_test.go +342 -0
  85. package/resource/runtime/resource_graph_rbac.go +278 -0
  86. package/resource/runtime/resource_graph_rbac_test.go +372 -0
  87. package/resource/runtime/resource_graph_rules.go +834 -0
  88. package/resource/runtime/resource_graph_storage.go +144 -0
  89. package/resource/runtime/resource_graph_storage_collect.go +163 -0
  90. package/resource/runtime/resource_graph_storage_test.go +397 -0
  91. package/resource/runtime/resource_graph_test.go +627 -0
  92. package/resource/runtime/secret_certificate.go +44 -0
  93. package/resource/runtime/secret_certificate_test.go +87 -0
  94. package/resource/storage_graph.go +4 -0
@@ -621,6 +621,18 @@
621
621
  "type": "integer"
622
622
  }
623
623
  },
624
+ "KubernetesExpectedWorkloadUID": {
625
+ "description": "Kubernetes UID observed in the workload list or detail. When supplied, deletion requires this identity and rejects a same-name replacement.",
626
+ "in": "query",
627
+ "name": "expectedUid",
628
+ "required": false,
629
+ "schema": {
630
+ "maxLength": 128,
631
+ "minLength": 1,
632
+ "pattern": "^[A-Za-z0-9._-]+$",
633
+ "type": "string"
634
+ }
635
+ },
624
636
  "KubernetesJobName": {
625
637
  "in": "path",
626
638
  "name": "jobName",
@@ -26483,6 +26495,11 @@
26483
26495
  "prometheusClusterLabel": {
26484
26496
  "type": "string"
26485
26497
  },
26498
+ "prometheusClusterLabelValue": {
26499
+ "description": "Exact value of prometheusClusterLabel for this cluster. Omitted updates preserve the saved value; an explicit empty string restores the legacy Soha cluster ID default. A non-empty value requires a valid label name.",
26500
+ "maxLength": 1024,
26501
+ "type": "string"
26502
+ },
26486
26503
  "prometheusTransport": {
26487
26504
  "$ref": "#/components/schemas/KubernetesPrometheusTransport"
26488
26505
  },
@@ -27436,6 +27453,13 @@
27436
27453
  "minimum": 0,
27437
27454
  "type": "integer"
27438
27455
  },
27456
+ "uid": {
27457
+ "description": "Kubernetes object UID for identity-checked deletion. Omitted if unavailable.",
27458
+ "maxLength": 128,
27459
+ "minLength": 1,
27460
+ "pattern": "^[A-Za-z0-9._-]+$",
27461
+ "type": "string"
27462
+ },
27439
27463
  "updatedReplicas": {
27440
27464
  "format": "int32",
27441
27465
  "minimum": 0,
@@ -27526,6 +27550,13 @@
27526
27550
  "strategy": {
27527
27551
  "type": "string"
27528
27552
  },
27553
+ "uid": {
27554
+ "description": "Kubernetes object UID for identity-checked deletion. Omitted if unavailable.",
27555
+ "maxLength": 128,
27556
+ "minLength": 1,
27557
+ "pattern": "^[A-Za-z0-9._-]+$",
27558
+ "type": "string"
27559
+ },
27529
27560
  "updatedReplicas": {
27530
27561
  "format": "int32",
27531
27562
  "minimum": 0,
@@ -27583,12 +27614,21 @@
27583
27614
  },
27584
27615
  "type": "array"
27585
27616
  },
27617
+ "matchesCurrentTemplate": {
27618
+ "description": "When supplied, whether the retained ControllerRevision patch exactly matches the current DaemonSet Pod template. False is a confirmed mismatch; omission means this endpoint did not evaluate it.",
27619
+ "type": "boolean",
27620
+ "x-go-pointer": true
27621
+ },
27586
27622
  "name": {
27587
27623
  "type": "string"
27588
27624
  },
27589
27625
  "namespace": {
27590
27626
  "type": "string"
27591
27627
  },
27628
+ "podRevisionHash": {
27629
+ "description": "Observed controller-revision-hash used by owned Pods; omitted when unavailable. Do not infer it from resource names.",
27630
+ "type": "string"
27631
+ },
27592
27632
  "readyReplicas": {
27593
27633
  "format": "int32",
27594
27634
  "minimum": 0,
@@ -29198,6 +29238,77 @@
29198
29238
  ],
29199
29239
  "type": "object"
29200
29240
  },
29241
+ "KubernetesHelmReleaseValues": {
29242
+ "additionalProperties": false,
29243
+ "properties": {
29244
+ "allowedActions": {
29245
+ "items": {
29246
+ "type": "string"
29247
+ },
29248
+ "type": "array"
29249
+ },
29250
+ "content": {
29251
+ "type": "string"
29252
+ },
29253
+ "diffEnabled": {
29254
+ "type": "boolean"
29255
+ },
29256
+ "editable": {
29257
+ "type": "boolean"
29258
+ },
29259
+ "name": {
29260
+ "type": "string"
29261
+ },
29262
+ "namespace": {
29263
+ "type": "string"
29264
+ },
29265
+ "original": {
29266
+ "type": "string"
29267
+ },
29268
+ "revision": {
29269
+ "type": "string"
29270
+ }
29271
+ },
29272
+ "required": [
29273
+ "name",
29274
+ "namespace",
29275
+ "content",
29276
+ "editable",
29277
+ "diffEnabled"
29278
+ ],
29279
+ "type": "object"
29280
+ },
29281
+ "KubernetesHelmReleaseValuesEnvelope": {
29282
+ "additionalProperties": false,
29283
+ "properties": {
29284
+ "data": {
29285
+ "$ref": "#/components/schemas/KubernetesHelmReleaseValues"
29286
+ }
29287
+ },
29288
+ "required": [
29289
+ "data"
29290
+ ],
29291
+ "type": "object"
29292
+ },
29293
+ "KubernetesHelmReleaseValuesUpdateInput": {
29294
+ "additionalProperties": false,
29295
+ "properties": {
29296
+ "content": {
29297
+ "description": "Complete Helm values YAML.",
29298
+ "type": "string"
29299
+ },
29300
+ "expectedRevision": {
29301
+ "description": "Latest Helm revision observed by the editor. When supplied, a changed revision returns 409 and an Agent without conditional updates returns 501.",
29302
+ "maximum": 2147483646,
29303
+ "minimum": 1,
29304
+ "type": "integer"
29305
+ }
29306
+ },
29307
+ "required": [
29308
+ "content"
29309
+ ],
29310
+ "type": "object"
29311
+ },
29201
29312
  "KubernetesHorizontalPodAutoscaler": {
29202
29313
  "additionalProperties": false,
29203
29314
  "properties": {
@@ -30114,6 +30225,22 @@
30114
30225
  "minimum": 0,
30115
30226
  "type": "integer"
30116
30227
  },
30228
+ "completionTarget": {
30229
+ "description": "Native spec.completions when specified; absence is not a zero completion target.",
30230
+ "format": "int32",
30231
+ "minimum": 0,
30232
+ "type": "integer",
30233
+ "x-go-pointer": true
30234
+ },
30235
+ "completionTime": {
30236
+ "type": "string"
30237
+ },
30238
+ "conditions": {
30239
+ "items": {
30240
+ "$ref": "#/components/schemas/KubernetesWorkloadCondition"
30241
+ },
30242
+ "type": "array"
30243
+ },
30117
30244
  "failed": {
30118
30245
  "format": "int32",
30119
30246
  "minimum": 0,
@@ -30125,10 +30252,17 @@
30125
30252
  "namespace": {
30126
30253
  "type": "string"
30127
30254
  },
30255
+ "startTime": {
30256
+ "type": "string"
30257
+ },
30128
30258
  "succeeded": {
30129
30259
  "format": "int32",
30130
30260
  "minimum": 0,
30131
30261
  "type": "integer"
30262
+ },
30263
+ "suspend": {
30264
+ "type": "boolean",
30265
+ "x-go-pointer": true
30132
30266
  }
30133
30267
  },
30134
30268
  "required": [
@@ -30150,6 +30284,12 @@
30150
30284
  "minimum": 0,
30151
30285
  "type": "integer"
30152
30286
  },
30287
+ "activeDeadlineSeconds": {
30288
+ "format": "int64",
30289
+ "minimum": 0,
30290
+ "type": "integer",
30291
+ "x-go-pointer": true
30292
+ },
30153
30293
  "allowedActions": {
30154
30294
  "items": {
30155
30295
  "type": "string"
@@ -30159,6 +30299,12 @@
30159
30299
  "annotations": {
30160
30300
  "$ref": "#/components/schemas/KubernetesStringMap"
30161
30301
  },
30302
+ "backoffLimit": {
30303
+ "format": "int32",
30304
+ "minimum": 0,
30305
+ "type": "integer",
30306
+ "x-go-pointer": true
30307
+ },
30162
30308
  "completionMode": {
30163
30309
  "type": "string"
30164
30310
  },
@@ -30167,9 +30313,22 @@
30167
30313
  "minimum": 0,
30168
30314
  "type": "integer"
30169
30315
  },
30316
+ "completionTarget": {
30317
+ "description": "Native spec.completions when specified; absence is not a zero completion target.",
30318
+ "format": "int32",
30319
+ "minimum": 0,
30320
+ "type": "integer",
30321
+ "x-go-pointer": true
30322
+ },
30170
30323
  "completionTime": {
30171
30324
  "type": "string"
30172
30325
  },
30326
+ "conditions": {
30327
+ "items": {
30328
+ "$ref": "#/components/schemas/KubernetesWorkloadCondition"
30329
+ },
30330
+ "type": "array"
30331
+ },
30173
30332
  "createdAt": {
30174
30333
  "type": "string"
30175
30334
  },
@@ -30211,6 +30370,16 @@
30211
30370
  "format": "int32",
30212
30371
  "minimum": 0,
30213
30372
  "type": "integer"
30373
+ },
30374
+ "suspend": {
30375
+ "type": "boolean",
30376
+ "x-go-pointer": true
30377
+ },
30378
+ "ttlSecondsAfterFinished": {
30379
+ "format": "int32",
30380
+ "minimum": 0,
30381
+ "type": "integer",
30382
+ "x-go-pointer": true
30214
30383
  }
30215
30384
  },
30216
30385
  "required": [
@@ -31070,6 +31239,13 @@
31070
31239
  "internalIp": {
31071
31240
  "type": "string"
31072
31241
  },
31242
+ "labels": {
31243
+ "additionalProperties": {
31244
+ "type": "string"
31245
+ },
31246
+ "description": "Kubernetes Node labels available to the current reader.",
31247
+ "type": "object"
31248
+ },
31073
31249
  "name": {
31074
31250
  "type": "string"
31075
31251
  },
@@ -31371,6 +31547,23 @@
31371
31547
  },
31372
31548
  "type": "object"
31373
31549
  },
31550
+ "KubernetesObservedResourceYamlInput": {
31551
+ "additionalProperties": false,
31552
+ "properties": {
31553
+ "content": {
31554
+ "minLength": 1,
31555
+ "type": "string"
31556
+ },
31557
+ "requireObservedIdentity": {
31558
+ "description": "Require the YAML to include the UID and resource version of the object read before editing. A changed or replaced object returns conflict.",
31559
+ "type": "boolean"
31560
+ }
31561
+ },
31562
+ "required": [
31563
+ "content"
31564
+ ],
31565
+ "type": "object"
31566
+ },
31374
31567
  "KubernetesPersistentVolume": {
31375
31568
  "additionalProperties": false,
31376
31569
  "properties": {
@@ -31676,6 +31869,13 @@
31676
31869
  },
31677
31870
  "type": "array"
31678
31871
  },
31872
+ "containerStatuses": {
31873
+ "description": "Init containers followed by ordinary containers in spec order, including unknown entries before status is reported. Restartable init containers have kind sidecar. Does not include ephemeral containers.",
31874
+ "items": {
31875
+ "$ref": "#/components/schemas/KubernetesPodContainerStatus"
31876
+ },
31877
+ "type": "array"
31878
+ },
31679
31879
  "cpu": {
31680
31880
  "type": "string"
31681
31881
  },
@@ -31712,6 +31912,10 @@
31712
31912
  "podIp": {
31713
31913
  "type": "string"
31714
31914
  },
31915
+ "qosClass": {
31916
+ "description": "Kubernetes status.qosClass, omitted when not reported.",
31917
+ "type": "string"
31918
+ },
31715
31919
  "readyContainers": {
31716
31920
  "type": "string"
31717
31921
  },
@@ -31724,8 +31928,10 @@
31724
31928
  "type": "integer"
31725
31929
  },
31726
31930
  "uid": {
31727
- "description": "Immutable Pod identity. Required by clients restoring a saved live session; absent on older providers.",
31931
+ "description": "Immutable Pod identity for restoring saved live sessions and identity-checked deletion. Older providers may omit it.",
31932
+ "maxLength": 128,
31728
31933
  "minLength": 1,
31934
+ "pattern": "^[A-Za-z0-9._-]+$",
31729
31935
  "type": "string"
31730
31936
  }
31731
31937
  },
@@ -31739,6 +31945,50 @@
31739
31945
  ],
31740
31946
  "type": "object"
31741
31947
  },
31948
+ "KubernetesPodContainerStatus": {
31949
+ "additionalProperties": false,
31950
+ "properties": {
31951
+ "exitCode": {
31952
+ "description": "Present only when the current container state is terminated, including a successful zero exit code.",
31953
+ "format": "int32",
31954
+ "type": "integer",
31955
+ "x-go-type-skip-optional-pointer": false
31956
+ },
31957
+ "kind": {
31958
+ "enum": [
31959
+ "init",
31960
+ "sidecar",
31961
+ "container"
31962
+ ],
31963
+ "type": "string"
31964
+ },
31965
+ "name": {
31966
+ "type": "string"
31967
+ },
31968
+ "ready": {
31969
+ "type": "boolean"
31970
+ },
31971
+ "reason": {
31972
+ "type": "string"
31973
+ },
31974
+ "state": {
31975
+ "enum": [
31976
+ "running",
31977
+ "waiting",
31978
+ "terminated",
31979
+ "unknown"
31980
+ ],
31981
+ "type": "string"
31982
+ }
31983
+ },
31984
+ "required": [
31985
+ "name",
31986
+ "kind",
31987
+ "ready",
31988
+ "state"
31989
+ ],
31990
+ "type": "object"
31991
+ },
31742
31992
  "KubernetesPodDetail": {
31743
31993
  "additionalProperties": false,
31744
31994
  "properties": {
@@ -31809,8 +32059,10 @@
31809
32059
  "type": "string"
31810
32060
  },
31811
32061
  "uid": {
31812
- "description": "Immutable Pod identity. Required by clients restoring a saved live session; absent on older providers.",
32062
+ "description": "Immutable Pod identity for restoring saved live sessions and identity-checked deletion. Older providers may omit it.",
32063
+ "maxLength": 128,
31813
32064
  "minLength": 1,
32065
+ "pattern": "^[A-Za-z0-9._-]+$",
31814
32066
  "type": "string"
31815
32067
  },
31816
32068
  "volumes": {
@@ -32237,6 +32489,11 @@
32237
32489
  "clusterLabel": {
32238
32490
  "type": "string"
32239
32491
  },
32492
+ "clusterLabelValue": {
32493
+ "description": "Configured metric cluster label value. Omitted or empty uses the Soha cluster ID for legacy compatibility.",
32494
+ "maxLength": 1024,
32495
+ "type": "string"
32496
+ },
32240
32497
  "grafanaBaseUrl": {
32241
32498
  "type": "string"
32242
32499
  },
@@ -33495,18 +33752,39 @@
33495
33752
  "KubernetesResourceGraphEdge": {
33496
33753
  "additionalProperties": false,
33497
33754
  "properties": {
33755
+ "fieldPath": {
33756
+ "type": "string"
33757
+ },
33498
33758
  "id": {
33499
33759
  "minLength": 1,
33500
33760
  "type": "string"
33501
33761
  },
33762
+ "note": {
33763
+ "type": "string"
33764
+ },
33765
+ "port": {
33766
+ "type": "string"
33767
+ },
33768
+ "protocol": {
33769
+ "type": "string"
33770
+ },
33502
33771
  "relation": {
33503
33772
  "minLength": 1,
33504
33773
  "type": "string"
33505
33774
  },
33775
+ "resolutionState": {
33776
+ "type": "string"
33777
+ },
33778
+ "sectionName": {
33779
+ "type": "string"
33780
+ },
33506
33781
  "sourceId": {
33507
33782
  "minLength": 1,
33508
33783
  "type": "string"
33509
33784
  },
33785
+ "sourceRef": {
33786
+ "$ref": "#/components/schemas/KubernetesResourceRef"
33787
+ },
33510
33788
  "targetId": {
33511
33789
  "minLength": 1,
33512
33790
  "type": "string"
@@ -34112,6 +34390,10 @@
34112
34390
  },
34113
34391
  "namespace": {
34114
34392
  "type": "string"
34393
+ },
34394
+ "requireObservedIdentity": {
34395
+ "description": "Require the YAML to identify the observed Kubernetes object by metadata.uid and metadata.resourceVersion.",
34396
+ "type": "boolean"
34115
34397
  }
34116
34398
  },
34117
34399
  "required": [
@@ -34441,6 +34723,57 @@
34441
34723
  ],
34442
34724
  "type": "object"
34443
34725
  },
34726
+ "KubernetesSecretCertificate": {
34727
+ "additionalProperties": false,
34728
+ "properties": {
34729
+ "name": {
34730
+ "type": "string"
34731
+ },
34732
+ "namespace": {
34733
+ "type": "string"
34734
+ },
34735
+ "notAfter": {
34736
+ "format": "date-time",
34737
+ "type": "string"
34738
+ },
34739
+ "notBefore": {
34740
+ "format": "date-time",
34741
+ "type": "string"
34742
+ },
34743
+ "selfSigned": {
34744
+ "description": "The first certificate is signed by its own key; this is not a trust validation result.",
34745
+ "type": "boolean",
34746
+ "x-go-pointer": true
34747
+ },
34748
+ "status": {
34749
+ "enum": [
34750
+ "available",
34751
+ "missing",
34752
+ "invalid",
34753
+ "unsupported_type"
34754
+ ],
34755
+ "type": "string"
34756
+ }
34757
+ },
34758
+ "required": [
34759
+ "name",
34760
+ "namespace",
34761
+ "status"
34762
+ ],
34763
+ "type": "object"
34764
+ },
34765
+ "KubernetesSecretCertificateEnvelope": {
34766
+ "additionalProperties": false,
34767
+ "properties": {
34768
+ "data": {
34769
+ "$ref": "#/components/schemas/KubernetesSecretCertificate"
34770
+ }
34771
+ },
34772
+ "required": [
34773
+ "data"
34774
+ ],
34775
+ "type": "object"
34776
+ },
34444
34777
  "KubernetesSecretDataInput": {
34445
34778
  "additionalProperties": false,
34446
34779
  "description": "Data values are plain text. The response detail returns Kubernetes Base64-encoded values.",
@@ -35576,6 +35909,10 @@
35576
35909
  "format": "date-time",
35577
35910
  "type": "string"
35578
35911
  },
35912
+ "name": {
35913
+ "maxLength": 253,
35914
+ "type": "string"
35915
+ },
35579
35916
  "namespace": {
35580
35917
  "maxLength": 63,
35581
35918
  "type": "string"
@@ -35636,6 +35973,10 @@
35636
35973
  "KubernetesTopologyGraphEdge": {
35637
35974
  "additionalProperties": false,
35638
35975
  "properties": {
35976
+ "fieldPath": {
35977
+ "maxLength": 1024,
35978
+ "type": "string"
35979
+ },
35639
35980
  "id": {
35640
35981
  "maxLength": 2048,
35641
35982
  "minLength": 1,
@@ -35666,7 +36007,14 @@
35666
36007
  "weights",
35667
36008
  "mirrors",
35668
36009
  "resolves",
35669
- "selects"
36010
+ "selects",
36011
+ "uses-class",
36012
+ "uses-secret",
36013
+ "uses-config",
36014
+ "parameters",
36015
+ "targets",
36016
+ "authorizes-reference",
36017
+ "policy-peer"
35670
36018
  ],
35671
36019
  "type": "string",
35672
36020
  "x-enum-varnames": [
@@ -35676,7 +36024,14 @@
35676
36024
  "KubernetesTopologyGraphEdgeRelationWeights",
35677
36025
  "KubernetesTopologyGraphEdgeRelationMirrors",
35678
36026
  "KubernetesTopologyGraphEdgeRelationResolves",
35679
- "KubernetesTopologyGraphEdgeRelationSelects"
36027
+ "KubernetesTopologyGraphEdgeRelationSelects",
36028
+ "KubernetesTopologyGraphEdgeRelationUsesClass",
36029
+ "KubernetesTopologyGraphEdgeRelationUsesSecret",
36030
+ "KubernetesTopologyGraphEdgeRelationUsesConfig",
36031
+ "KubernetesTopologyGraphEdgeRelationParameters",
36032
+ "KubernetesTopologyGraphEdgeRelationTargets",
36033
+ "KubernetesTopologyGraphEdgeRelationAuthorizesReference",
36034
+ "KubernetesTopologyGraphEdgeRelationPolicyPeer"
35680
36035
  ]
35681
36036
  },
35682
36037
  "resolutionState": {
@@ -35686,6 +36041,10 @@
35686
36041
  "maxLength": 2048,
35687
36042
  "type": "string"
35688
36043
  },
36044
+ "sectionName": {
36045
+ "maxLength": 253,
36046
+ "type": "string"
36047
+ },
35689
36048
  "source": {
35690
36049
  "maxLength": 2048,
35691
36050
  "minLength": 1,
@@ -35931,7 +36290,7 @@
35931
36290
  "type": "array"
35932
36291
  },
35933
36292
  "version": {
35934
- "pattern": "^v1$",
36293
+ "pattern": "^v1$|^network\\.topology\\.(snapshot|named-root)\\.v1$",
35935
36294
  "type": "string"
35936
36295
  }
35937
36296
  },
@@ -35990,7 +36349,8 @@
35990
36349
  "sourceId": {
35991
36350
  "enum": [
35992
36351
  "kubernetes.ingressclasses",
35993
- "gateway.gatewayclasses"
36352
+ "gateway.gatewayclasses",
36353
+ "kubernetes.namespaces"
35994
36354
  ]
35995
36355
  }
35996
36356
  },
@@ -36009,6 +36369,10 @@
36009
36369
  }
36010
36370
  ],
36011
36371
  "properties": {
36372
+ "name": {
36373
+ "maxLength": 253,
36374
+ "type": "string"
36375
+ },
36012
36376
  "namespace": {
36013
36377
  "maxLength": 63,
36014
36378
  "pattern": "^$|^[a-z0-9]([a-z0-9-]*[a-z0-9])?$",
@@ -36016,6 +36380,10 @@
36016
36380
  },
36017
36381
  "sourceId": {
36018
36382
  "enum": [
36383
+ "kubernetes.networkpolicies",
36384
+ "kubernetes.namespaces",
36385
+ "kubernetes.configmaps",
36386
+ "gateway.backendtlspolicies",
36019
36387
  "kubernetes.services",
36020
36388
  "kubernetes.pods",
36021
36389
  "kubernetes.endpointslices",
@@ -36041,6 +36409,10 @@
36041
36409
  ],
36042
36410
  "type": "string",
36043
36411
  "x-enum-varnames": [
36412
+ "KubernetesTopologySourceKubernetesNetworkpolicies",
36413
+ "KubernetesTopologySourceKubernetesNamespaces",
36414
+ "KubernetesTopologySourceKubernetesConfigmaps",
36415
+ "KubernetesTopologySourceGatewayBackendtlspolicies",
36044
36416
  "KubernetesTopologySourceKubernetesServices",
36045
36417
  "KubernetesTopologySourceKubernetesPods",
36046
36418
  "KubernetesTopologySourceKubernetesEndpointslices",
@@ -71455,7 +71827,7 @@
71455
71827
  "info": {
71456
71828
  "description": "Public OpenSoha core API contract. This first contract focuses on stable cross-repository boundaries: auth, health, runner-facing control-plane callbacks, AI Gateway, and MCP capability discovery. Pod session WebSocket targets and their UID-aware ticket requirements are described separately in x-soha-websocket-paths to preserve HTTP client generation.\n",
71457
71829
  "title": "Soha API",
71458
- "version": "0.1.27"
71830
+ "version": "0.1.29"
71459
71831
  },
71460
71832
  "openapi": "3.1.0",
71461
71833
  "paths": {
@@ -83726,6 +84098,63 @@
83726
84098
  }
83727
84099
  }
83728
84100
  },
84101
+ "/clusters/{clusterID}/configuration/secrets/{name}/certificate": {
84102
+ "get": {
84103
+ "description": "Public metadata for the first tls.crt certificate of a TLS Secret. Requires resource-scoped Secret view; never returns certificate PEM, Secret data or private keys. Dates do not establish certificate trust, host matching or controller deployment.",
84104
+ "operationId": "getKubernetesSecretCertificate",
84105
+ "parameters": [
84106
+ {
84107
+ "$ref": "#/components/parameters/ClusterID"
84108
+ },
84109
+ {
84110
+ "$ref": "#/components/parameters/KubernetesResourceName"
84111
+ },
84112
+ {
84113
+ "in": "query",
84114
+ "name": "namespace",
84115
+ "required": true,
84116
+ "schema": {
84117
+ "minLength": 1,
84118
+ "type": "string"
84119
+ }
84120
+ }
84121
+ ],
84122
+ "responses": {
84123
+ "200": {
84124
+ "content": {
84125
+ "application/json": {
84126
+ "schema": {
84127
+ "$ref": "#/components/schemas/KubernetesSecretCertificateEnvelope"
84128
+ }
84129
+ }
84130
+ },
84131
+ "description": "Public certificate metadata, including explicit missing or invalid certificate state."
84132
+ },
84133
+ "400": {
84134
+ "$ref": "#/components/responses/Error"
84135
+ },
84136
+ "403": {
84137
+ "$ref": "#/components/responses/Error"
84138
+ },
84139
+ "404": {
84140
+ "$ref": "#/components/responses/Error"
84141
+ },
84142
+ "503": {
84143
+ "$ref": "#/components/responses/Error"
84144
+ }
84145
+ },
84146
+ "tags": [
84147
+ "Platform"
84148
+ ],
84149
+ "x-soha-implementation-status": "implemented",
84150
+ "x-soha-permissions": {
84151
+ "keys": [
84152
+ "platform.configuration.secrets.view"
84153
+ ],
84154
+ "mode": "all"
84155
+ }
84156
+ }
84157
+ },
83729
84158
  "/clusters/{clusterID}/configuration/secrets/{name}/data": {
83730
84159
  "put": {
83731
84160
  "operationId": "updateKubernetesSecretData",
@@ -83891,6 +84320,79 @@
83891
84320
  }
83892
84321
  }
83893
84322
  },
84323
+ "/clusters/{clusterID}/configuration/secrets/{name}/yaml": {
84324
+ "put": {
84325
+ "operationId": "applyKubernetesSecretYaml",
84326
+ "parameters": [
84327
+ {
84328
+ "$ref": "#/components/parameters/ClusterID"
84329
+ },
84330
+ {
84331
+ "$ref": "#/components/parameters/KubernetesResourceName"
84332
+ },
84333
+ {
84334
+ "in": "query",
84335
+ "name": "namespace",
84336
+ "required": true,
84337
+ "schema": {
84338
+ "minLength": 1,
84339
+ "type": "string"
84340
+ }
84341
+ }
84342
+ ],
84343
+ "requestBody": {
84344
+ "content": {
84345
+ "application/json": {
84346
+ "schema": {
84347
+ "$ref": "#/components/schemas/KubernetesObservedResourceYamlInput"
84348
+ }
84349
+ }
84350
+ },
84351
+ "required": true
84352
+ },
84353
+ "responses": {
84354
+ "200": {
84355
+ "content": {
84356
+ "application/json": {
84357
+ "schema": {
84358
+ "$ref": "#/components/schemas/KubernetesResourceYamlEnvelope"
84359
+ }
84360
+ }
84361
+ },
84362
+ "description": "Updated Kubernetes resource YAML."
84363
+ },
84364
+ "400": {
84365
+ "$ref": "#/components/responses/Error"
84366
+ },
84367
+ "403": {
84368
+ "$ref": "#/components/responses/Error"
84369
+ },
84370
+ "404": {
84371
+ "$ref": "#/components/responses/Error"
84372
+ },
84373
+ "409": {
84374
+ "$ref": "#/components/responses/Error"
84375
+ },
84376
+ "501": {
84377
+ "$ref": "#/components/responses/Error"
84378
+ },
84379
+ "503": {
84380
+ "$ref": "#/components/responses/Error"
84381
+ }
84382
+ },
84383
+ "tags": [
84384
+ "Platform"
84385
+ ],
84386
+ "x-soha-implementation-status": "implemented",
84387
+ "x-soha-permissions": {
84388
+ "keys": [
84389
+ "platform.configuration.secret-data.view",
84390
+ "platform.configuration.secrets.update"
84391
+ ],
84392
+ "mode": "all"
84393
+ }
84394
+ }
84395
+ },
83894
84396
  "/clusters/{clusterID}/configuration/validatingwebhookconfigurations": {
83895
84397
  "get": {
83896
84398
  "operationId": "listKubernetesValidatingWebhookConfigurations",
@@ -84741,6 +85243,81 @@
84741
85243
  }
84742
85244
  }
84743
85245
  },
85246
+ "/clusters/{clusterID}/helm/releases/{releaseName}/values": {
85247
+ "put": {
85248
+ "operationId": "updateKubernetesHelmReleaseValues",
85249
+ "parameters": [
85250
+ {
85251
+ "$ref": "#/components/parameters/ClusterID"
85252
+ },
85253
+ {
85254
+ "$ref": "#/components/parameters/KubernetesReleaseName"
85255
+ },
85256
+ {
85257
+ "in": "query",
85258
+ "name": "namespace",
85259
+ "required": true,
85260
+ "schema": {
85261
+ "minLength": 1,
85262
+ "type": "string"
85263
+ }
85264
+ }
85265
+ ],
85266
+ "requestBody": {
85267
+ "content": {
85268
+ "application/json": {
85269
+ "schema": {
85270
+ "$ref": "#/components/schemas/KubernetesHelmReleaseValuesUpdateInput"
85271
+ }
85272
+ }
85273
+ },
85274
+ "required": true
85275
+ },
85276
+ "responses": {
85277
+ "200": {
85278
+ "content": {
85279
+ "application/json": {
85280
+ "schema": {
85281
+ "$ref": "#/components/schemas/KubernetesHelmReleaseValuesEnvelope"
85282
+ }
85283
+ }
85284
+ },
85285
+ "description": "Helm release values after upgrade."
85286
+ },
85287
+ "400": {
85288
+ "$ref": "#/components/responses/Error"
85289
+ },
85290
+ "403": {
85291
+ "$ref": "#/components/responses/Error"
85292
+ },
85293
+ "404": {
85294
+ "$ref": "#/components/responses/Error"
85295
+ },
85296
+ "409": {
85297
+ "$ref": "#/components/responses/Error"
85298
+ },
85299
+ "501": {
85300
+ "$ref": "#/components/responses/Error"
85301
+ },
85302
+ "502": {
85303
+ "$ref": "#/components/responses/Error"
85304
+ },
85305
+ "503": {
85306
+ "$ref": "#/components/responses/Error"
85307
+ }
85308
+ },
85309
+ "tags": [
85310
+ "Platform"
85311
+ ],
85312
+ "x-soha-implementation-status": "implemented",
85313
+ "x-soha-permissions": {
85314
+ "keys": [
85315
+ "platform.helm.releases.update"
85316
+ ],
85317
+ "mode": "all"
85318
+ }
85319
+ }
85320
+ },
84744
85321
  "/clusters/{clusterID}/infrastructure/nodes": {
84745
85322
  "get": {
84746
85323
  "operationId": "listKubernetesNodes",
@@ -86634,9 +87211,56 @@
86634
87211
  }
86635
87212
  }
86636
87213
  },
86637
- "/clusters/{clusterID}/network/ingresses/{name}/detail": {
86638
- "get": {
86639
- "operationId": "getKubernetesIngressDetail",
87214
+ "/clusters/{clusterID}/network/ingresses/{name}/detail": {
87215
+ "get": {
87216
+ "operationId": "getKubernetesIngressDetail",
87217
+ "parameters": [
87218
+ {
87219
+ "$ref": "#/components/parameters/ClusterID"
87220
+ },
87221
+ {
87222
+ "$ref": "#/components/parameters/KubernetesResourceName"
87223
+ },
87224
+ {
87225
+ "$ref": "#/components/parameters/KubernetesNamespaceQuery"
87226
+ }
87227
+ ],
87228
+ "responses": {
87229
+ "200": {
87230
+ "content": {
87231
+ "application/json": {
87232
+ "schema": {
87233
+ "$ref": "#/components/schemas/KubernetesIngressDetailEnvelope"
87234
+ }
87235
+ }
87236
+ },
87237
+ "description": "Ingress routes and authorized backend relations."
87238
+ },
87239
+ "403": {
87240
+ "$ref": "#/components/responses/Error"
87241
+ },
87242
+ "404": {
87243
+ "$ref": "#/components/responses/Error"
87244
+ },
87245
+ "503": {
87246
+ "$ref": "#/components/responses/Error"
87247
+ }
87248
+ },
87249
+ "tags": [
87250
+ "Platform"
87251
+ ],
87252
+ "x-soha-implementation-status": "implemented",
87253
+ "x-soha-permissions": {
87254
+ "keys": [
87255
+ "platform.network.ingresses.view"
87256
+ ],
87257
+ "mode": "all"
87258
+ }
87259
+ }
87260
+ },
87261
+ "/clusters/{clusterID}/network/ingresses/{name}/yaml": {
87262
+ "put": {
87263
+ "operationId": "applyKubernetesIngressYaml",
86640
87264
  "parameters": [
86641
87265
  {
86642
87266
  "$ref": "#/components/parameters/ClusterID"
@@ -86645,19 +87269,38 @@
86645
87269
  "$ref": "#/components/parameters/KubernetesResourceName"
86646
87270
  },
86647
87271
  {
86648
- "$ref": "#/components/parameters/KubernetesNamespaceQuery"
87272
+ "in": "query",
87273
+ "name": "namespace",
87274
+ "required": true,
87275
+ "schema": {
87276
+ "minLength": 1,
87277
+ "type": "string"
87278
+ }
86649
87279
  }
86650
87280
  ],
87281
+ "requestBody": {
87282
+ "content": {
87283
+ "application/json": {
87284
+ "schema": {
87285
+ "$ref": "#/components/schemas/KubernetesObservedResourceYamlInput"
87286
+ }
87287
+ }
87288
+ },
87289
+ "required": true
87290
+ },
86651
87291
  "responses": {
86652
87292
  "200": {
86653
87293
  "content": {
86654
87294
  "application/json": {
86655
87295
  "schema": {
86656
- "$ref": "#/components/schemas/KubernetesIngressDetailEnvelope"
87296
+ "$ref": "#/components/schemas/KubernetesResourceYamlEnvelope"
86657
87297
  }
86658
87298
  }
86659
87299
  },
86660
- "description": "Ingress routes and authorized backend relations."
87300
+ "description": "Updated Kubernetes resource YAML."
87301
+ },
87302
+ "400": {
87303
+ "$ref": "#/components/responses/Error"
86661
87304
  },
86662
87305
  "403": {
86663
87306
  "$ref": "#/components/responses/Error"
@@ -86665,6 +87308,12 @@
86665
87308
  "404": {
86666
87309
  "$ref": "#/components/responses/Error"
86667
87310
  },
87311
+ "409": {
87312
+ "$ref": "#/components/responses/Error"
87313
+ },
87314
+ "501": {
87315
+ "$ref": "#/components/responses/Error"
87316
+ },
86668
87317
  "503": {
86669
87318
  "$ref": "#/components/responses/Error"
86670
87319
  }
@@ -86675,7 +87324,7 @@
86675
87324
  "x-soha-implementation-status": "implemented",
86676
87325
  "x-soha-permissions": {
86677
87326
  "keys": [
86678
- "platform.network.ingresses.view"
87327
+ "platform.network.ingresses.update"
86679
87328
  ],
86680
87329
  "mode": "all"
86681
87330
  }
@@ -87181,6 +87830,78 @@
87181
87830
  }
87182
87831
  }
87183
87832
  },
87833
+ "/clusters/{clusterID}/network/services/{serviceName}/yaml": {
87834
+ "put": {
87835
+ "operationId": "applyKubernetesServiceYaml",
87836
+ "parameters": [
87837
+ {
87838
+ "$ref": "#/components/parameters/ClusterID"
87839
+ },
87840
+ {
87841
+ "$ref": "#/components/parameters/KubernetesServiceName"
87842
+ },
87843
+ {
87844
+ "in": "query",
87845
+ "name": "namespace",
87846
+ "required": true,
87847
+ "schema": {
87848
+ "minLength": 1,
87849
+ "type": "string"
87850
+ }
87851
+ }
87852
+ ],
87853
+ "requestBody": {
87854
+ "content": {
87855
+ "application/json": {
87856
+ "schema": {
87857
+ "$ref": "#/components/schemas/KubernetesObservedResourceYamlInput"
87858
+ }
87859
+ }
87860
+ },
87861
+ "required": true
87862
+ },
87863
+ "responses": {
87864
+ "200": {
87865
+ "content": {
87866
+ "application/json": {
87867
+ "schema": {
87868
+ "$ref": "#/components/schemas/KubernetesResourceYamlEnvelope"
87869
+ }
87870
+ }
87871
+ },
87872
+ "description": "Updated Kubernetes resource YAML."
87873
+ },
87874
+ "400": {
87875
+ "$ref": "#/components/responses/Error"
87876
+ },
87877
+ "403": {
87878
+ "$ref": "#/components/responses/Error"
87879
+ },
87880
+ "404": {
87881
+ "$ref": "#/components/responses/Error"
87882
+ },
87883
+ "409": {
87884
+ "$ref": "#/components/responses/Error"
87885
+ },
87886
+ "501": {
87887
+ "$ref": "#/components/responses/Error"
87888
+ },
87889
+ "503": {
87890
+ "$ref": "#/components/responses/Error"
87891
+ }
87892
+ },
87893
+ "tags": [
87894
+ "Platform"
87895
+ ],
87896
+ "x-soha-implementation-status": "implemented",
87897
+ "x-soha-permissions": {
87898
+ "keys": [
87899
+ "platform.network.services.update"
87900
+ ],
87901
+ "mode": "all"
87902
+ }
87903
+ }
87904
+ },
87184
87905
  "/clusters/{clusterID}/network/topology": {
87185
87906
  "get": {
87186
87907
  "operationId": "getKubernetesNetworkTopology",
@@ -87774,6 +88495,24 @@
87774
88495
  "minLength": 1,
87775
88496
  "type": "string"
87776
88497
  }
88498
+ },
88499
+ {
88500
+ "description": "Exact served group/version for a CRD instance, or apiextensions.k8s.io/v1 for a CRD definition. Required together with resource for explicit CRD graphs.",
88501
+ "in": "query",
88502
+ "name": "apiVersion",
88503
+ "schema": {
88504
+ "minLength": 1,
88505
+ "type": "string"
88506
+ }
88507
+ },
88508
+ {
88509
+ "description": "Exact CRD plural resource name. For a CRD definition use customresourcedefinitions.",
88510
+ "in": "query",
88511
+ "name": "resource",
88512
+ "schema": {
88513
+ "minLength": 1,
88514
+ "type": "string"
88515
+ }
87777
88516
  }
87778
88517
  ],
87779
88518
  "responses": {
@@ -88661,6 +89400,111 @@
88661
89400
  }
88662
89401
  }
88663
89402
  },
89403
+ "/clusters/{clusterID}/workloads/daemonsets/{daemonSetName}/rollouts": {
89404
+ "get": {
89405
+ "description": "Retained ControllerRevisions controlled by the selected DaemonSet UID. Replica counts include only Pods controlled by that DaemonSet and referencing the ControllerRevision hash label, not replicas inferred from template names. podRevisionHash is the observed history label; matchesCurrentTemplate compares the native stored patch with the selected DaemonSet template and does not imply every Pod is updated.",
89406
+ "operationId": "listKubernetesDaemonSetRollouts",
89407
+ "parameters": [
89408
+ {
89409
+ "$ref": "#/components/parameters/ClusterID"
89410
+ },
89411
+ {
89412
+ "$ref": "#/components/parameters/KubernetesDaemonSetName"
89413
+ },
89414
+ {
89415
+ "$ref": "#/components/parameters/KubernetesNamespaceDefaultQuery"
89416
+ }
89417
+ ],
89418
+ "responses": {
89419
+ "200": {
89420
+ "content": {
89421
+ "application/json": {
89422
+ "schema": {
89423
+ "$ref": "#/components/schemas/KubernetesDeploymentRolloutListEnvelope"
89424
+ }
89425
+ }
89426
+ },
89427
+ "description": "Retained DaemonSet ControllerRevisions. Revision is the native ControllerRevision sequence, name is the ControllerRevision name, and zero replicas means no currently observed owned Pod references this revision. This is not a permanent change archive."
89428
+ },
89429
+ "403": {
89430
+ "$ref": "#/components/responses/Error"
89431
+ },
89432
+ "404": {
89433
+ "$ref": "#/components/responses/Error"
89434
+ },
89435
+ "503": {
89436
+ "$ref": "#/components/responses/Error"
89437
+ }
89438
+ },
89439
+ "tags": [
89440
+ "Platform"
89441
+ ],
89442
+ "x-soha-implementation-status": "implemented",
89443
+ "x-soha-permissions": {
89444
+ "keys": [
89445
+ "platform.workloads.daemon-sets.view"
89446
+ ],
89447
+ "mode": "all"
89448
+ }
89449
+ }
89450
+ },
89451
+ "/clusters/{clusterID}/workloads/daemonsets/{daemonSetName}/rollouts/{revisionName}/yaml": {
89452
+ "get": {
89453
+ "description": "Read a retained ControllerRevision only when its controlling owner UID matches the selected DaemonSet in the same namespace. Does not resolve Secret references. Inline template values may be sensitive, as in workload YAML.",
89454
+ "operationId": "getKubernetesDaemonSetRevisionYaml",
89455
+ "parameters": [
89456
+ {
89457
+ "$ref": "#/components/parameters/ClusterID"
89458
+ },
89459
+ {
89460
+ "$ref": "#/components/parameters/KubernetesDaemonSetName"
89461
+ },
89462
+ {
89463
+ "$ref": "#/components/parameters/KubernetesNamespaceDefaultQuery"
89464
+ },
89465
+ {
89466
+ "in": "path",
89467
+ "name": "revisionName",
89468
+ "required": true,
89469
+ "schema": {
89470
+ "minLength": 1,
89471
+ "type": "string"
89472
+ }
89473
+ }
89474
+ ],
89475
+ "responses": {
89476
+ "200": {
89477
+ "content": {
89478
+ "application/json": {
89479
+ "schema": {
89480
+ "$ref": "#/components/schemas/KubernetesResourceYamlEnvelope"
89481
+ }
89482
+ }
89483
+ },
89484
+ "description": "Authorized ControllerRevision YAML; it is a stored template patch, not a live DaemonSet object."
89485
+ },
89486
+ "403": {
89487
+ "$ref": "#/components/responses/Error"
89488
+ },
89489
+ "404": {
89490
+ "$ref": "#/components/responses/Error"
89491
+ },
89492
+ "503": {
89493
+ "$ref": "#/components/responses/Error"
89494
+ }
89495
+ },
89496
+ "tags": [
89497
+ "Platform"
89498
+ ],
89499
+ "x-soha-implementation-status": "implemented",
89500
+ "x-soha-permissions": {
89501
+ "keys": [
89502
+ "platform.workloads.daemon-sets.view"
89503
+ ],
89504
+ "mode": "all"
89505
+ }
89506
+ }
89507
+ },
88664
89508
  "/clusters/{clusterID}/workloads/daemonsets/{daemonSetName}/yaml": {
88665
89509
  "get": {
88666
89510
  "operationId": "getKubernetesDaemonSetYaml",
@@ -88762,6 +89606,59 @@
88762
89606
  }
88763
89607
  }
88764
89608
  },
89609
+ "/clusters/{clusterID}/workloads/deployments/{deploymentName}": {
89610
+ "delete": {
89611
+ "description": "Request deletion of a Deployment. With expectedUid, a same-name replacement is rejected and an Agent that cannot enforce the precondition returns 501.",
89612
+ "operationId": "deleteKubernetesDeployment",
89613
+ "parameters": [
89614
+ {
89615
+ "$ref": "#/components/parameters/ClusterID"
89616
+ },
89617
+ {
89618
+ "$ref": "#/components/parameters/KubernetesDeploymentName"
89619
+ },
89620
+ {
89621
+ "$ref": "#/components/parameters/KubernetesNamespaceQuery"
89622
+ },
89623
+ {
89624
+ "$ref": "#/components/parameters/KubernetesExpectedWorkloadUID"
89625
+ }
89626
+ ],
89627
+ "responses": {
89628
+ "204": {
89629
+ "description": "Deletion requested."
89630
+ },
89631
+ "400": {
89632
+ "$ref": "#/components/responses/Error"
89633
+ },
89634
+ "403": {
89635
+ "$ref": "#/components/responses/Error"
89636
+ },
89637
+ "404": {
89638
+ "$ref": "#/components/responses/Error"
89639
+ },
89640
+ "409": {
89641
+ "$ref": "#/components/responses/Error"
89642
+ },
89643
+ "501": {
89644
+ "$ref": "#/components/responses/Error"
89645
+ },
89646
+ "503": {
89647
+ "$ref": "#/components/responses/Error"
89648
+ }
89649
+ },
89650
+ "tags": [
89651
+ "Platform"
89652
+ ],
89653
+ "x-soha-implementation-status": "implemented",
89654
+ "x-soha-permissions": {
89655
+ "keys": [
89656
+ "platform.deployment.delete"
89657
+ ],
89658
+ "mode": "all"
89659
+ }
89660
+ }
89661
+ },
88765
89662
  "/clusters/{clusterID}/workloads/deployments/{deploymentName}/detail": {
88766
89663
  "get": {
88767
89664
  "operationId": "getKubernetesDeploymentDetail",
@@ -89107,6 +90004,62 @@
89107
90004
  }
89108
90005
  }
89109
90006
  },
90007
+ "/clusters/{clusterID}/workloads/jobs/{jobName}/metrics": {
90008
+ "get": {
90009
+ "operationId": "getKubernetesJobMetrics",
90010
+ "parameters": [
90011
+ {
90012
+ "$ref": "#/components/parameters/ClusterID"
90013
+ },
90014
+ {
90015
+ "$ref": "#/components/parameters/KubernetesJobName"
90016
+ },
90017
+ {
90018
+ "$ref": "#/components/parameters/KubernetesNamespaceDefaultQuery"
90019
+ },
90020
+ {
90021
+ "$ref": "#/components/parameters/KubernetesMetricsRangeMinutesQuery"
90022
+ },
90023
+ {
90024
+ "$ref": "#/components/parameters/KubernetesMetricsStepSecondsQuery"
90025
+ }
90026
+ ],
90027
+ "responses": {
90028
+ "200": {
90029
+ "content": {
90030
+ "application/json": {
90031
+ "schema": {
90032
+ "$ref": "#/components/schemas/KubernetesResourceMetricsEnvelope"
90033
+ }
90034
+ }
90035
+ },
90036
+ "description": "Prometheus metrics aggregated from Pods owned by the current Job UID in the selected namespace; retained Pods only, with explicit missing or unconfigured results."
90037
+ },
90038
+ "400": {
90039
+ "$ref": "#/components/responses/Error"
90040
+ },
90041
+ "403": {
90042
+ "$ref": "#/components/responses/Error"
90043
+ },
90044
+ "404": {
90045
+ "$ref": "#/components/responses/Error"
90046
+ },
90047
+ "503": {
90048
+ "$ref": "#/components/responses/Error"
90049
+ }
90050
+ },
90051
+ "tags": [
90052
+ "Platform"
90053
+ ],
90054
+ "x-soha-implementation-status": "implemented",
90055
+ "x-soha-permissions": {
90056
+ "keys": [
90057
+ "platform.workloads.jobs.view"
90058
+ ],
90059
+ "mode": "all"
90060
+ }
90061
+ }
90062
+ },
89110
90063
  "/clusters/{clusterID}/workloads/jobs/{jobName}/yaml": {
89111
90064
  "get": {
89112
90065
  "operationId": "getKubernetesJobYaml",
@@ -89254,6 +90207,7 @@
89254
90207
  },
89255
90208
  "/clusters/{clusterID}/workloads/pods/{podName}": {
89256
90209
  "delete": {
90210
+ "description": "Request deletion of a Pod. With expectedUid, a same-name replacement is rejected and an Agent that cannot enforce the precondition returns 501.",
89257
90211
  "operationId": "deleteKubernetesPod",
89258
90212
  "parameters": [
89259
90213
  {
@@ -89264,6 +90218,9 @@
89264
90218
  },
89265
90219
  {
89266
90220
  "$ref": "#/components/parameters/KubernetesNamespaceQuery"
90221
+ },
90222
+ {
90223
+ "$ref": "#/components/parameters/KubernetesExpectedWorkloadUID"
89267
90224
  }
89268
90225
  ],
89269
90226
  "responses": {
@@ -89282,6 +90239,9 @@
89282
90239
  "409": {
89283
90240
  "$ref": "#/components/responses/Error"
89284
90241
  },
90242
+ "501": {
90243
+ "$ref": "#/components/responses/Error"
90244
+ },
89285
90245
  "503": {
89286
90246
  "$ref": "#/components/responses/Error"
89287
90247
  }
@@ -89686,6 +90646,62 @@
89686
90646
  }
89687
90647
  }
89688
90648
  },
90649
+ "/clusters/{clusterID}/workloads/replicasets/{replicaSetName}/metrics": {
90650
+ "get": {
90651
+ "operationId": "getKubernetesReplicaSetMetrics",
90652
+ "parameters": [
90653
+ {
90654
+ "$ref": "#/components/parameters/ClusterID"
90655
+ },
90656
+ {
90657
+ "$ref": "#/components/parameters/KubernetesReplicaSetName"
90658
+ },
90659
+ {
90660
+ "$ref": "#/components/parameters/KubernetesNamespaceDefaultQuery"
90661
+ },
90662
+ {
90663
+ "$ref": "#/components/parameters/KubernetesMetricsRangeMinutesQuery"
90664
+ },
90665
+ {
90666
+ "$ref": "#/components/parameters/KubernetesMetricsStepSecondsQuery"
90667
+ }
90668
+ ],
90669
+ "responses": {
90670
+ "200": {
90671
+ "content": {
90672
+ "application/json": {
90673
+ "schema": {
90674
+ "$ref": "#/components/schemas/KubernetesResourceMetricsEnvelope"
90675
+ }
90676
+ }
90677
+ },
90678
+ "description": "Prometheus metrics aggregated from Pods owned by the current ReplicaSet UID in the selected namespace; retained Pods only, with explicit missing or unconfigured results."
90679
+ },
90680
+ "400": {
90681
+ "$ref": "#/components/responses/Error"
90682
+ },
90683
+ "403": {
90684
+ "$ref": "#/components/responses/Error"
90685
+ },
90686
+ "404": {
90687
+ "$ref": "#/components/responses/Error"
90688
+ },
90689
+ "503": {
90690
+ "$ref": "#/components/responses/Error"
90691
+ }
90692
+ },
90693
+ "tags": [
90694
+ "Platform"
90695
+ ],
90696
+ "x-soha-implementation-status": "implemented",
90697
+ "x-soha-permissions": {
90698
+ "keys": [
90699
+ "platform.workloads.replica-sets.view"
90700
+ ],
90701
+ "mode": "all"
90702
+ }
90703
+ }
90704
+ },
89689
90705
  "/clusters/{clusterID}/workloads/replicasets/{replicaSetName}/yaml": {
89690
90706
  "get": {
89691
90707
  "operationId": "getKubernetesReplicaSetYaml",
@@ -89870,6 +90886,62 @@
89870
90886
  }
89871
90887
  }
89872
90888
  },
90889
+ "/clusters/{clusterID}/workloads/replicationcontrollers/{name}/metrics": {
90890
+ "get": {
90891
+ "operationId": "getKubernetesReplicationControllerMetrics",
90892
+ "parameters": [
90893
+ {
90894
+ "$ref": "#/components/parameters/ClusterID"
90895
+ },
90896
+ {
90897
+ "$ref": "#/components/parameters/KubernetesResourceName"
90898
+ },
90899
+ {
90900
+ "$ref": "#/components/parameters/KubernetesNamespaceDefaultQuery"
90901
+ },
90902
+ {
90903
+ "$ref": "#/components/parameters/KubernetesMetricsRangeMinutesQuery"
90904
+ },
90905
+ {
90906
+ "$ref": "#/components/parameters/KubernetesMetricsStepSecondsQuery"
90907
+ }
90908
+ ],
90909
+ "responses": {
90910
+ "200": {
90911
+ "content": {
90912
+ "application/json": {
90913
+ "schema": {
90914
+ "$ref": "#/components/schemas/KubernetesResourceMetricsEnvelope"
90915
+ }
90916
+ }
90917
+ },
90918
+ "description": "Prometheus metrics aggregated from Pods owned by the current ReplicationController UID in the selected namespace; retained Pods only, with explicit missing or unconfigured results."
90919
+ },
90920
+ "400": {
90921
+ "$ref": "#/components/responses/Error"
90922
+ },
90923
+ "403": {
90924
+ "$ref": "#/components/responses/Error"
90925
+ },
90926
+ "404": {
90927
+ "$ref": "#/components/responses/Error"
90928
+ },
90929
+ "503": {
90930
+ "$ref": "#/components/responses/Error"
90931
+ }
90932
+ },
90933
+ "tags": [
90934
+ "Platform"
90935
+ ],
90936
+ "x-soha-implementation-status": "implemented",
90937
+ "x-soha-permissions": {
90938
+ "keys": [
90939
+ "platform.workloads.replication-controllers.view"
90940
+ ],
90941
+ "mode": "all"
90942
+ }
90943
+ }
90944
+ },
89873
90945
  "/clusters/{clusterID}/workloads/replicationcontrollers/{name}/yaml": {
89874
90946
  "get": {
89875
90947
  "operationId": "getKubernetesReplicationControllerYaml",
@@ -90064,6 +91136,111 @@
90064
91136
  }
90065
91137
  }
90066
91138
  },
91139
+ "/clusters/{clusterID}/workloads/statefulsets/{statefulSetName}/rollouts": {
91140
+ "get": {
91141
+ "description": "Retained ControllerRevisions controlled by the selected StatefulSet UID. Replica counts include only Pods controlled by that StatefulSet and referencing the revision, not replicas inferred from the template.",
91142
+ "operationId": "listKubernetesStatefulSetRollouts",
91143
+ "parameters": [
91144
+ {
91145
+ "$ref": "#/components/parameters/ClusterID"
91146
+ },
91147
+ {
91148
+ "$ref": "#/components/parameters/KubernetesStatefulSetName"
91149
+ },
91150
+ {
91151
+ "$ref": "#/components/parameters/KubernetesNamespaceDefaultQuery"
91152
+ }
91153
+ ],
91154
+ "responses": {
91155
+ "200": {
91156
+ "content": {
91157
+ "application/json": {
91158
+ "schema": {
91159
+ "$ref": "#/components/schemas/KubernetesDeploymentRolloutListEnvelope"
91160
+ }
91161
+ }
91162
+ },
91163
+ "description": "Retained StatefulSet ControllerRevisions. Revision is the native ControllerRevision sequence, name is the ControllerRevision name, and zero replicas means no currently observed owned Pod references this revision. This is not a permanent change archive."
91164
+ },
91165
+ "403": {
91166
+ "$ref": "#/components/responses/Error"
91167
+ },
91168
+ "404": {
91169
+ "$ref": "#/components/responses/Error"
91170
+ },
91171
+ "503": {
91172
+ "$ref": "#/components/responses/Error"
91173
+ }
91174
+ },
91175
+ "tags": [
91176
+ "Platform"
91177
+ ],
91178
+ "x-soha-implementation-status": "implemented",
91179
+ "x-soha-permissions": {
91180
+ "keys": [
91181
+ "platform.workloads.stateful-sets.view"
91182
+ ],
91183
+ "mode": "all"
91184
+ }
91185
+ }
91186
+ },
91187
+ "/clusters/{clusterID}/workloads/statefulsets/{statefulSetName}/rollouts/{revisionName}/yaml": {
91188
+ "get": {
91189
+ "description": "Read a retained ControllerRevision only when its controlling owner UID matches the selected StatefulSet in the same namespace. Does not resolve Secret references. Inline template values may be sensitive, as in workload YAML.",
91190
+ "operationId": "getKubernetesStatefulSetRevisionYaml",
91191
+ "parameters": [
91192
+ {
91193
+ "$ref": "#/components/parameters/ClusterID"
91194
+ },
91195
+ {
91196
+ "$ref": "#/components/parameters/KubernetesStatefulSetName"
91197
+ },
91198
+ {
91199
+ "$ref": "#/components/parameters/KubernetesNamespaceDefaultQuery"
91200
+ },
91201
+ {
91202
+ "in": "path",
91203
+ "name": "revisionName",
91204
+ "required": true,
91205
+ "schema": {
91206
+ "minLength": 1,
91207
+ "type": "string"
91208
+ }
91209
+ }
91210
+ ],
91211
+ "responses": {
91212
+ "200": {
91213
+ "content": {
91214
+ "application/json": {
91215
+ "schema": {
91216
+ "$ref": "#/components/schemas/KubernetesResourceYamlEnvelope"
91217
+ }
91218
+ }
91219
+ },
91220
+ "description": "Authorized ControllerRevision YAML; it is a stored template patch, not a live StatefulSet object."
91221
+ },
91222
+ "403": {
91223
+ "$ref": "#/components/responses/Error"
91224
+ },
91225
+ "404": {
91226
+ "$ref": "#/components/responses/Error"
91227
+ },
91228
+ "503": {
91229
+ "$ref": "#/components/responses/Error"
91230
+ }
91231
+ },
91232
+ "tags": [
91233
+ "Platform"
91234
+ ],
91235
+ "x-soha-implementation-status": "implemented",
91236
+ "x-soha-permissions": {
91237
+ "keys": [
91238
+ "platform.workloads.stateful-sets.view"
91239
+ ],
91240
+ "mode": "all"
91241
+ }
91242
+ }
91243
+ },
90067
91244
  "/clusters/{clusterID}/workloads/statefulsets/{statefulSetName}/yaml": {
90068
91245
  "get": {
90069
91246
  "operationId": "getKubernetesStatefulSetYaml",