@opensoha/contracts 0.1.25 → 0.1.26

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 (81) hide show
  1. package/COMPATIBILITY.md +24 -0
  2. package/README.md +1 -1
  3. package/agent/environment/export.go +1 -0
  4. package/agent/environment/protocol_test.go +1 -1
  5. package/agent/guest/protocol_test.go +2 -2
  6. package/compat/json-schema-ecosystem-0.1.0.json +1 -1
  7. package/compat/openapi-loose-boundaries-0.1.0.json +1 -1
  8. package/delivery/document.schema.json +127 -9
  9. package/examples/relations_compat_test.go +18 -0
  10. package/fixtures/openapi/DeliveryDocument/invalid/migration-missing-guide-build-template.json +30 -0
  11. package/fixtures/openapi/DeliveryDocument/invalid/migration-missing-guide-deployment-template.json +30 -0
  12. package/fixtures/openapi/DeliveryDocument/invalid/migration-missing-guide-workflow-template.json +27 -0
  13. package/fixtures/openapi/DeliveryDocument/valid/migration-build-template.json +31 -0
  14. package/fixtures/openapi/DeliveryDocument/valid/migration-deployment-template.json +31 -0
  15. package/fixtures/openapi/DeliveryDocument/valid/migration-workflow-template.json +28 -0
  16. package/fixtures/openapi/DeliveryPlanInput/invalid/manual-plan.json +7 -0
  17. package/fixtures/openapi/DeliveryPlanInput/valid/manual-plan.json +6 -0
  18. package/fixtures/openapi/DeliveryTargetInput/invalid/candidate-on-runtime-deploy.json +9 -0
  19. package/fixtures/openapi/DeliveryTargetInput/invalid/config-update-missing-service.json +7 -0
  20. package/fixtures/openapi/DeliveryTargetInput/valid/template-configuration-only.json +8 -0
  21. package/fixtures/openapi/DeliveryTargetInput/valid/template-configuration-without-runtime-environment.json +1 -0
  22. package/fixtures/openapi/KubernetesImportCandidateListEnvelope/invalid/source-with-spec.json +33 -0
  23. package/fixtures/openapi/KubernetesImportCandidateListEnvelope/invalid/source-without-uid.json +29 -0
  24. package/fixtures/openapi/KubernetesImportCandidateListEnvelope/valid/stable-source.json +30 -0
  25. package/fixtures/openapi/KubernetesPod/invalid/pod-uid.json +9 -0
  26. package/fixtures/openapi/KubernetesPod/valid/pod-uid.json +9 -0
  27. package/fixtures/openapi/KubernetesPodDetail/invalid/pod-uid.json +6 -0
  28. package/fixtures/openapi/KubernetesPodDetail/valid/pod-uid.json +6 -0
  29. package/fixtures/openapi/KubernetesServiceImportRequest/invalid/empty-source-uid.json +48 -0
  30. package/fixtures/openapi/KubernetesServiceImportRequest/valid/pinned-workloads-and-cr.json +48 -0
  31. package/fixtures/openapi/ManifestExecutionTaskPayload/invalid/initialization.json +7 -0
  32. package/fixtures/openapi/ManifestExecutionTaskPayload/valid/initialization.json +7 -0
  33. package/fixtures/openapi/ManifestRootResource/invalid/root.json +1 -0
  34. package/fixtures/openapi/ManifestRootResource/valid/root.json +1 -0
  35. package/fixtures/openapi/ResourceRelationConfig/invalid/executable-rule.json +17 -0
  36. package/fixtures/openapi/ResourceRelationConfig/valid/unknown-kind.json +13 -0
  37. package/fixtures/openapi/ServiceDeploymentTemplateInput/invalid/migration-missing-guide-valid-yaml.json +38 -0
  38. package/fixtures/openapi/ServiceDeploymentTemplateInput/valid/migration-valid-yaml.json +39 -0
  39. package/fixtures/openapi/TemplateMigrationAssessment/invalid/initialization.json +9 -0
  40. package/fixtures/openapi/TemplateMigrationAssessment/valid/initialization.json +9 -0
  41. package/fixtures/openapi/TemplateMigrationPolicy/invalid/blank-guide.json +5 -0
  42. package/fixtures/openapi/TemplateMigrationPolicy/invalid/missing-guide.json +4 -0
  43. package/fixtures/openapi/TemplateMigrationPolicy/invalid/unknown-escape-hatch.json +6 -0
  44. package/fixtures/openapi/TemplateMigrationPolicy/valid/legacy-safe.json +4 -0
  45. package/fixtures/openapi/TemplateMigrationPolicy/valid/ordered-data-change.json +5 -0
  46. package/fixtures/openapi/TemplateUpdateBatchInput/invalid/duplicate-candidates.json +11 -0
  47. package/fixtures/openapi/TemplateUpdateBatchInput/invalid/empty-identities.json +10 -0
  48. package/fixtures/openapi/TemplateUpdateBatchInput/valid/staged-adoption.json +10 -0
  49. package/fixtures/openapi/TemplateUpdatePolicyInput/invalid/unknown-mode.json +8 -0
  50. package/fixtures/openapi/TemplateUpdatePolicyInput/valid/explicit-automatic.json +8 -0
  51. package/fixtures/openapi/TemplateUpdatePreviewInput/invalid/empty-identities.json +10 -0
  52. package/fixtures/openapi/TemplateUpdatePreviewInput/invalid/empty-targets.json +6 -0
  53. package/fixtures/openapi/TemplateUpdatePreviewInput/valid/cross-version-manual.json +14 -0
  54. package/gen/go/sohaapi/client.go +1 -1
  55. package/gen/go/sohaapi/client_test.go +2 -2
  56. package/gen/go/sohaapi/import_source_compat_test.go +12 -0
  57. package/gen/go/sohaapi/types.go +945 -159
  58. package/gen/ts/sohaapi/index.ts +746 -4
  59. package/go.mod +2 -2
  60. package/helmrelease/delivery.go +4 -1
  61. package/helmrelease/initialization.go +10 -0
  62. package/helmrelease/runtime/delivery.go +40 -10
  63. package/helmrelease/runtime/delivery_test.go +4 -0
  64. package/helmrelease/runtime/initialization.go +186 -0
  65. package/helmrelease/runtime/initialization_test.go +203 -0
  66. package/openapi/soha-api.json +2195 -55
  67. package/openapi/soha-api.yaml +349 -9
  68. package/openapi/spec_generated.go +3 -3
  69. package/openapi/spec_test.go +42 -0
  70. package/package.json +1 -1
  71. package/resource/models.go +2 -0
  72. package/resource/relations.go +225 -0
  73. package/resource/relations_test.go +47 -0
  74. package/resource/root_cr.go +38 -0
  75. package/resource/runtime/argocd_integration_test.go +1 -1
  76. package/resource/runtime/initialization.go +66 -0
  77. package/resource/runtime/initialization_test.go +80 -0
  78. package/resource/runtime/relations.go +161 -0
  79. package/resource/runtime/relations_test.go +100 -0
  80. package/resource/runtime/root_cr.go +79 -0
  81. package/resource/runtime/root_cr_test.go +118 -0
package/COMPATIBILITY.md CHANGED
@@ -530,3 +530,27 @@ only synchronize their release-version metadata to satisfy their existing
530
530
  guards. Candidate matrices use the packed/local contracts source. Consumers
531
531
  must still pin the published version and validate the registry/proxy package
532
532
  before claiming released-version acceptance.
533
+
534
+
535
+ ## 0.1.26 delivery workbench contracts
536
+
537
+ This release candidate adds optional stable Kubernetes resource identities,
538
+ generic root-CR relationships and publication control, immutable template
539
+ versions/adoption previews, migration declarations, and create-only first-release
540
+ initialization. Existing request fields, operation IDs, action enums and client
541
+ methods remain compatible. Published version snapshots and fixed consumer
542
+ revisions are preserved.
543
+
544
+ Template adoption is configuration, not proof of deployment. Runtime baselines
545
+ require matching original resource UIDs and healthy execution/observation
546
+ receipts. Unknown existing deployments remain blocked; initialization cannot
547
+ adopt existing resources or replay uncertain writes. Migration guides are
548
+ review information and are not executed as scripts.
549
+
550
+ Core and Agent must implement the matching capability/provider protocols before
551
+ using root-CR or initialization tasks. Old runtimes must reject unsupported
552
+ protocols rather than interpret them as ordinary SSA or Helm updates. Publishing
553
+ this SDK alone does not enable the feature or validate a production deployment.
554
+ Consumers must pin the actually published npm/Go artifacts and validate the
555
+ released combination; local tarballs and provenance policy files do not prove
556
+ registry publication or an npm provenance attestation.
package/README.md CHANGED
@@ -118,7 +118,7 @@ calling code in the consumer until those APIs are promoted into the supported
118
118
  client surface. Redirect-oriented flows such as OIDC provider redirects should
119
119
  not use the JSON-only `doJSON` helper until a non-JSON client mode is added.
120
120
 
121
- The Go generator and generated DTO checks run with Go 1.27.2 in CI.
121
+ The Go generator and generated DTO checks run with Go 1.27.3 in CI.
122
122
 
123
123
  ## Validation
124
124
 
@@ -86,6 +86,7 @@ func (w *ExportWriter) Finish(request Request) (ExportResult, error) {
86
86
  if err := binary.Write(w.Writer, binary.BigEndian, uint32(0)); err != nil {
87
87
  return ExportResult{}, err
88
88
  }
89
+ // #nosec G115 -- ValidateFor bounds all three lease IDs to 128 runes and the remaining receipt fields are fixed or bounded.
89
90
  if err := binary.Write(w.Writer, binary.BigEndian, uint32(len(data))); err != nil {
90
91
  return ExportResult{}, err
91
92
  }
@@ -16,7 +16,7 @@ func TestRequestFixturesMatchRuntimeBoundary(t *testing.T) {
16
16
  }
17
17
  for _, file := range files {
18
18
  t.Run(kind+"/"+filepath.Base(file), func(t *testing.T) {
19
- data, err := os.ReadFile(file)
19
+ data, err := os.ReadFile(file) // #nosec G304 -- Glob is rooted in repository fixtures with fixed valid/invalid categories.
20
20
  if err != nil {
21
21
  t.Fatal(err)
22
22
  }
@@ -35,7 +35,7 @@ func TestSchemaFixtures(t *testing.T) {
35
35
  }
36
36
  for _, file := range files {
37
37
  t.Run(name+"/"+kind+"/"+filepath.Base(file), func(t *testing.T) {
38
- data, err := os.ReadFile(file)
38
+ data, err := os.ReadFile(file) // #nosec G304 -- Glob uses only the fixed repository fixture names and valid/invalid categories above.
39
39
  if err != nil {
40
40
  t.Fatal(err)
41
41
  }
@@ -50,7 +50,7 @@ func TestSchemaFixtures(t *testing.T) {
50
50
 
51
51
  func guestFixture[T any](t *testing.T, name string) T {
52
52
  t.Helper()
53
- data, err := os.ReadFile("../../fixtures/json-schema/personal-guest-" + name + "/valid/minimal.json")
53
+ data, err := os.ReadFile("../../fixtures/json-schema/personal-guest-" + name + "/valid/minimal.json") // #nosec G304 -- All callers pass constant test fixture names, never external input.
54
54
  if err != nil {
55
55
  t.Fatal(err)
56
56
  }
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "0.1.25",
2
+ "version": "0.1.26",
3
3
  "schemas": {
4
4
  "plugins/plugin-manifest.schema.json": {
5
5
  "rootRequired": ["id", "name", "publisher", "type", "version"],
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "0.1.25",
2
+ "version": "0.1.26",
3
3
  "generatedFrom": "openapi/soha-api.yaml",
4
4
  "entries": [
5
5
  {
@@ -177,6 +177,9 @@
177
177
  "default": true,
178
178
  "type": "boolean"
179
179
  },
180
+ "migrationPolicy": {
181
+ "$ref": "#/$defs/TemplateMigrationPolicy"
182
+ },
180
183
  "variableSchema": {
181
184
  "additionalProperties": {
182
185
  "$ref": "#/$defs/DeliveryBuildVariableSchema"
@@ -317,6 +320,9 @@
317
320
  "health": {
318
321
  "$ref": "#/$defs/DeploymentTemplateHealth"
319
322
  },
323
+ "migrationPolicy": {
324
+ "$ref": "#/$defs/TemplateMigrationPolicy"
325
+ },
320
326
  "parameterSchema": {
321
327
  "$ref": "#/$defs/TemplateParameterSchema"
322
328
  },
@@ -804,21 +810,68 @@
804
810
  "additionalProperties": false,
805
811
  "allOf": [
806
812
  {
807
- "if": {
813
+ "else": {
814
+ "allOf": [
815
+ {
816
+ "if": {
817
+ "properties": {
818
+ "action": {
819
+ "enum": [
820
+ "build_deploy",
821
+ "deploy",
822
+ "config_update"
823
+ ]
824
+ }
825
+ }
826
+ },
827
+ "then": {
828
+ "required": [
829
+ "applicationEnvironmentId"
830
+ ]
831
+ }
832
+ }
833
+ ],
808
834
  "properties": {
809
- "action": {
810
- "enum": [
811
- "build_deploy",
812
- "deploy",
813
- "config_update"
814
- ]
835
+ "serviceId": {
836
+ "minLength": 1,
837
+ "type": "string"
815
838
  }
816
839
  }
817
840
  },
818
- "then": {
841
+ "if": {
819
842
  "required": [
820
- "applicationEnvironmentId"
843
+ "templateCandidateId"
821
844
  ]
845
+ },
846
+ "then": {
847
+ "not": {
848
+ "anyOf": [
849
+ {
850
+ "required": [
851
+ "helmRevision"
852
+ ]
853
+ },
854
+ {
855
+ "required": [
856
+ "buildArgs"
857
+ ]
858
+ },
859
+ {
860
+ "required": [
861
+ "repositoryRefs"
862
+ ]
863
+ }
864
+ ]
865
+ },
866
+ "properties": {
867
+ "action": {
868
+ "const": "config_update"
869
+ },
870
+ "releaseBundleId": {
871
+ "maxLength": 0,
872
+ "type": "string"
873
+ }
874
+ }
822
875
  }
823
876
  },
824
877
  {
@@ -897,6 +950,10 @@
897
950
  "type": "array"
898
951
  },
899
952
  "serviceId": {
953
+ "type": "string"
954
+ },
955
+ "templateCandidateId": {
956
+ "maxLength": 256,
900
957
  "minLength": 1,
901
958
  "type": "string"
902
959
  }
@@ -1068,6 +1125,9 @@
1068
1125
  "enabled": {
1069
1126
  "default": true,
1070
1127
  "type": "boolean"
1128
+ },
1129
+ "migrationPolicy": {
1130
+ "$ref": "#/$defs/TemplateMigrationPolicy"
1071
1131
  }
1072
1132
  },
1073
1133
  "required": [
@@ -1376,6 +1436,64 @@
1376
1436
  },
1377
1437
  "type": "object"
1378
1438
  },
1439
+ "TemplateMigrationPolicy": {
1440
+ "additionalProperties": false,
1441
+ "if": {
1442
+ "anyOf": [
1443
+ {
1444
+ "properties": {
1445
+ "sequential": {
1446
+ "const": true
1447
+ }
1448
+ },
1449
+ "required": [
1450
+ "sequential"
1451
+ ]
1452
+ },
1453
+ {
1454
+ "properties": {
1455
+ "irreversible": {
1456
+ "const": true
1457
+ }
1458
+ },
1459
+ "required": [
1460
+ "irreversible"
1461
+ ]
1462
+ }
1463
+ ]
1464
+ },
1465
+ "properties": {
1466
+ "guide": {
1467
+ "description": "Human migration/recovery instructions. Never executed as a script.",
1468
+ "maxLength": 2000,
1469
+ "type": "string"
1470
+ },
1471
+ "irreversible": {
1472
+ "description": "Forward changes require approval; ordinary rollback across this boundary is forbidden.",
1473
+ "type": "boolean"
1474
+ },
1475
+ "sequential": {
1476
+ "description": "Must cross this boundary as adjacent published versions; approval cannot waive it.",
1477
+ "type": "boolean"
1478
+ }
1479
+ },
1480
+ "required": [
1481
+ "sequential",
1482
+ "irreversible"
1483
+ ],
1484
+ "then": {
1485
+ "properties": {
1486
+ "guide": {
1487
+ "minLength": 1,
1488
+ "pattern": "\\S"
1489
+ }
1490
+ },
1491
+ "required": [
1492
+ "guide"
1493
+ ]
1494
+ },
1495
+ "type": "object"
1496
+ },
1379
1497
  "TemplateParameterSchema": {
1380
1498
  "additionalProperties": false,
1381
1499
  "description": "Restricted JSON Schema. Objects reject undeclared keys unless mapValues specifies their schema. secret_reference accepts only a namespaced Secret name/key reference, never a plaintext credential. External references and executable expressions are unsupported.",
@@ -0,0 +1,18 @@
1
+ package examples
2
+
3
+ import (
4
+ sdk "github.com/opensoha/soha-contracts/gen/go/sohaapi"
5
+ "testing"
6
+ )
7
+
8
+ func TestRelationAdditionPreservesPublishedEnumNames(t *testing.T) {
9
+ values := []sdk.PersonalGuestRuntimeInputKind{sdk.Browser, sdk.Docker, sdk.Execute, sdk.FileRead, sdk.FileWrite}
10
+ for i, want := range []string{"browser", "docker", "execute", "file_read", "file_write"} {
11
+ if string(values[i]) != want {
12
+ t.Fatalf("published enum %d changed", i)
13
+ }
14
+ }
15
+ if sdk.JSON != sdk.ExportDeliveryDocumentParamsFormatJSON || sdk.Yaml != sdk.ExportDeliveryDocumentParamsFormatYaml {
16
+ t.Fatal("published format aliases changed")
17
+ }
18
+ }
@@ -0,0 +1,30 @@
1
+ {
2
+ "apiVersion": "delivery.soha.io/v1alpha1",
3
+ "kind": "BuildTemplate",
4
+ "metadata": {
5
+ "name": "node-image"
6
+ },
7
+ "spec": {
8
+ "buildCommands": [
9
+ "npm ci",
10
+ "npm run build"
11
+ ],
12
+ "variableSchema": {
13
+ "MODE": {
14
+ "type": "string",
15
+ "required": true,
16
+ "enum": [
17
+ "production",
18
+ "development"
19
+ ]
20
+ }
21
+ },
22
+ "defaultVariables": {
23
+ "MODE": "production"
24
+ },
25
+ "migrationPolicy": {
26
+ "sequential": true,
27
+ "irreversible": false
28
+ }
29
+ }
30
+ }
@@ -0,0 +1,30 @@
1
+ {
2
+ "apiVersion": "delivery.soha.io/v1alpha1",
3
+ "kind": "DeploymentTemplate",
4
+ "metadata": {
5
+ "name": "http-service"
6
+ },
7
+ "spec": {
8
+ "source": {
9
+ "renderer": "raw_yaml",
10
+ "files": [
11
+ {
12
+ "path": "config.yaml",
13
+ "content": "apiVersion: v1\nkind: ConfigMap\nmetadata:\n name: example\ndata:\n mode: prod\n"
14
+ }
15
+ ]
16
+ },
17
+ "parameterSchema": {
18
+ "type": "object"
19
+ },
20
+ "defaults": {},
21
+ "health": {
22
+ "mode": "configuration_only",
23
+ "timeoutSeconds": 60
24
+ },
25
+ "migrationPolicy": {
26
+ "sequential": true,
27
+ "irreversible": false
28
+ }
29
+ }
30
+ }
@@ -0,0 +1,27 @@
1
+ {
2
+ "apiVersion": "delivery.soha.io/v1alpha1",
3
+ "kind": "WorkflowTemplate",
4
+ "metadata": {
5
+ "name": "build-release",
6
+ "displayName": "\u8054\u5408\u6784\u5efa\u53d1\u5e03"
7
+ },
8
+ "spec": {
9
+ "definition": {
10
+ "mode": "delivery_batch",
11
+ "schemaVersion": 1,
12
+ "stages": [
13
+ "build",
14
+ "plan",
15
+ "deploy",
16
+ "health"
17
+ ],
18
+ "executionMode": "build_all_then_deploy",
19
+ "stopOnFailure": true,
20
+ "maxConcurrency": 4
21
+ },
22
+ "migrationPolicy": {
23
+ "sequential": true,
24
+ "irreversible": false
25
+ }
26
+ }
27
+ }
@@ -0,0 +1,31 @@
1
+ {
2
+ "apiVersion": "delivery.soha.io/v1alpha1",
3
+ "kind": "BuildTemplate",
4
+ "metadata": {
5
+ "name": "node-image"
6
+ },
7
+ "spec": {
8
+ "buildCommands": [
9
+ "npm ci",
10
+ "npm run build"
11
+ ],
12
+ "variableSchema": {
13
+ "MODE": {
14
+ "type": "string",
15
+ "required": true,
16
+ "enum": [
17
+ "production",
18
+ "development"
19
+ ]
20
+ }
21
+ },
22
+ "defaultVariables": {
23
+ "MODE": "production"
24
+ },
25
+ "migrationPolicy": {
26
+ "sequential": true,
27
+ "irreversible": true,
28
+ "guide": "Backup, migrate in order, verify; forward repair only."
29
+ }
30
+ }
31
+ }
@@ -0,0 +1,31 @@
1
+ {
2
+ "apiVersion": "delivery.soha.io/v1alpha1",
3
+ "kind": "DeploymentTemplate",
4
+ "metadata": {
5
+ "name": "http-service"
6
+ },
7
+ "spec": {
8
+ "source": {
9
+ "renderer": "raw_yaml",
10
+ "files": [
11
+ {
12
+ "path": "config.yaml",
13
+ "content": "apiVersion: v1\nkind: ConfigMap\nmetadata:\n name: example\ndata:\n mode: prod\n"
14
+ }
15
+ ]
16
+ },
17
+ "parameterSchema": {
18
+ "type": "object"
19
+ },
20
+ "defaults": {},
21
+ "health": {
22
+ "mode": "configuration_only",
23
+ "timeoutSeconds": 60
24
+ },
25
+ "migrationPolicy": {
26
+ "sequential": true,
27
+ "irreversible": true,
28
+ "guide": "Backup, migrate in order, verify; forward repair only."
29
+ }
30
+ }
31
+ }
@@ -0,0 +1,28 @@
1
+ {
2
+ "apiVersion": "delivery.soha.io/v1alpha1",
3
+ "kind": "WorkflowTemplate",
4
+ "metadata": {
5
+ "name": "build-release",
6
+ "displayName": "\u8054\u5408\u6784\u5efa\u53d1\u5e03"
7
+ },
8
+ "spec": {
9
+ "definition": {
10
+ "mode": "delivery_batch",
11
+ "schemaVersion": 1,
12
+ "stages": [
13
+ "build",
14
+ "plan",
15
+ "deploy",
16
+ "health"
17
+ ],
18
+ "executionMode": "build_all_then_deploy",
19
+ "stopOnFailure": true,
20
+ "maxConcurrency": 4
21
+ },
22
+ "migrationPolicy": {
23
+ "sequential": true,
24
+ "irreversible": true,
25
+ "guide": "Backup, migrate in order, verify; forward repair only."
26
+ }
27
+ }
28
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "applicationId": "app",
3
+ "applicationEnvironmentId": "test",
4
+ "action": "rollback",
5
+ "source": "manual",
6
+ "templateCandidateId": "worker-only"
7
+ }
@@ -0,0 +1,6 @@
1
+ {
2
+ "applicationId": "app",
3
+ "applicationEnvironmentId": "test",
4
+ "action": "deploy",
5
+ "source": "manual"
6
+ }
@@ -0,0 +1,9 @@
1
+ {
2
+ "id": "adopt1",
3
+ "applicationId": "retail",
4
+ "serviceId": "api",
5
+ "applicationEnvironmentId": "retail-test",
6
+ "action": "deploy",
7
+ "releaseBundleId": "bundle",
8
+ "templateCandidateId": "candidate-1"
9
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "id": "adopt1",
3
+ "applicationId": "retail",
4
+ "serviceId": "",
5
+ "applicationEnvironmentId": "retail-test",
6
+ "action": "config_update"
7
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "id": "adopt1",
3
+ "applicationId": "retail",
4
+ "serviceId": "",
5
+ "applicationEnvironmentId": "retail-test",
6
+ "action": "config_update",
7
+ "templateCandidateId": "candidate-1"
8
+ }
@@ -0,0 +1 @@
1
+ {"id":"adopt-build","applicationId":"retail","serviceId":"","action":"config_update","templateCandidateId":"candidate-1"}
@@ -0,0 +1,33 @@
1
+ {
2
+ "items": [
3
+ {
4
+ "clusterId": "test",
5
+ "namespace": "middleware",
6
+ "workloadKind": "StatefulSet",
7
+ "workloadName": "database",
8
+ "desiredReplicas": 3,
9
+ "readyReplicas": 3,
10
+ "relatedResources": [],
11
+ "source": {
12
+ "resource": {
13
+ "clusterId": "test",
14
+ "apiVersion": "apps/v1",
15
+ "kind": "StatefulSet",
16
+ "namespace": "middleware",
17
+ "name": "database",
18
+ "scopeMode": "namespace",
19
+ "uid": "uid-1",
20
+ "resourceVersion": "42"
21
+ },
22
+ "specDigest": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
23
+ "generation": 3,
24
+ "observedAt": "2026-10-21T08:00:00Z",
25
+ "owners": [],
26
+ "spec": {
27
+ "password": "must-not-be-in-contract"
28
+ }
29
+ }
30
+ }
31
+ ],
32
+ "truncated": false
33
+ }
@@ -0,0 +1,29 @@
1
+ {
2
+ "items": [
3
+ {
4
+ "clusterId": "test",
5
+ "namespace": "middleware",
6
+ "workloadKind": "StatefulSet",
7
+ "workloadName": "database",
8
+ "desiredReplicas": 3,
9
+ "readyReplicas": 3,
10
+ "relatedResources": [],
11
+ "source": {
12
+ "resource": {
13
+ "clusterId": "test",
14
+ "apiVersion": "apps/v1",
15
+ "kind": "StatefulSet",
16
+ "namespace": "middleware",
17
+ "name": "database",
18
+ "scopeMode": "namespace",
19
+ "resourceVersion": "42"
20
+ },
21
+ "specDigest": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
22
+ "generation": 3,
23
+ "observedAt": "2026-10-21T08:00:00Z",
24
+ "owners": []
25
+ }
26
+ }
27
+ ],
28
+ "truncated": false
29
+ }
@@ -0,0 +1,30 @@
1
+ {
2
+ "items": [
3
+ {
4
+ "clusterId": "test",
5
+ "namespace": "middleware",
6
+ "workloadKind": "StatefulSet",
7
+ "workloadName": "database",
8
+ "desiredReplicas": 3,
9
+ "readyReplicas": 3,
10
+ "relatedResources": [],
11
+ "source": {
12
+ "resource": {
13
+ "clusterId": "test",
14
+ "apiVersion": "apps/v1",
15
+ "kind": "StatefulSet",
16
+ "namespace": "middleware",
17
+ "name": "database",
18
+ "scopeMode": "namespace",
19
+ "uid": "uid-1",
20
+ "resourceVersion": "42"
21
+ },
22
+ "specDigest": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
23
+ "generation": 3,
24
+ "observedAt": "2026-10-21T08:00:00Z",
25
+ "owners": []
26
+ }
27
+ }
28
+ ],
29
+ "truncated": false
30
+ }
@@ -0,0 +1,9 @@
1
+ {
2
+ "name": "api-0",
3
+ "namespace": "test",
4
+ "phase": "Running",
5
+ "restarts": 0,
6
+ "uid": "",
7
+ "readyContainers": "1/1",
8
+ "ageSeconds": 60
9
+ }
@@ -0,0 +1,9 @@
1
+ {
2
+ "name": "api-0",
3
+ "namespace": "test",
4
+ "phase": "Running",
5
+ "restarts": 0,
6
+ "uid": "uid-original",
7
+ "readyContainers": "1/1",
8
+ "ageSeconds": 60
9
+ }
@@ -0,0 +1,6 @@
1
+ {
2
+ "name": "api-0",
3
+ "namespace": "test",
4
+ "phase": "Running",
5
+ "uid": ""
6
+ }
@@ -0,0 +1,6 @@
1
+ {
2
+ "name": "api-0",
3
+ "namespace": "test",
4
+ "phase": "Running",
5
+ "uid": "uid-original"
6
+ }