@opensoha/contracts 0.1.24 → 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.
- package/COMPATIBILITY.md +24 -0
- package/README.md +1 -1
- package/agent/environment/export.go +1 -0
- package/agent/environment/protocol_test.go +1 -1
- package/agent/guest/protocol_test.go +2 -2
- package/auth/catalog_generated.go +2 -2
- package/auth/gateway_permissions_test.go +48 -0
- package/auth/permission-catalog.json +300 -1
- package/compat/consumer-revisions.json +1 -1
- package/compat/json-schema-ecosystem-0.1.0.json +1 -1
- package/compat/openapi-loose-boundaries-0.1.0.json +1 -1
- package/delivery/document.schema.json +127 -9
- package/examples/relations_compat_test.go +18 -0
- package/fixtures/openapi/DeliveryDocument/invalid/migration-missing-guide-build-template.json +30 -0
- package/fixtures/openapi/DeliveryDocument/invalid/migration-missing-guide-deployment-template.json +30 -0
- package/fixtures/openapi/DeliveryDocument/invalid/migration-missing-guide-workflow-template.json +27 -0
- package/fixtures/openapi/DeliveryDocument/valid/migration-build-template.json +31 -0
- package/fixtures/openapi/DeliveryDocument/valid/migration-deployment-template.json +31 -0
- package/fixtures/openapi/DeliveryDocument/valid/migration-workflow-template.json +28 -0
- package/fixtures/openapi/DeliveryPlanInput/invalid/manual-plan.json +7 -0
- package/fixtures/openapi/DeliveryPlanInput/valid/manual-plan.json +6 -0
- package/fixtures/openapi/DeliveryTargetInput/invalid/candidate-on-runtime-deploy.json +9 -0
- package/fixtures/openapi/DeliveryTargetInput/invalid/config-update-missing-service.json +7 -0
- package/fixtures/openapi/DeliveryTargetInput/valid/template-configuration-only.json +8 -0
- package/fixtures/openapi/DeliveryTargetInput/valid/template-configuration-without-runtime-environment.json +1 -0
- package/fixtures/openapi/KubernetesAgentActionCheck/invalid/unproven-state.json +6 -0
- package/fixtures/openapi/KubernetesAgentActionCheck/valid/configured-denied.json +9 -0
- package/fixtures/openapi/KubernetesAgentActionProfile/invalid/wildcard.json +1 -0
- package/fixtures/openapi/KubernetesAgentActionProfile/valid/workbench.json +1 -0
- package/fixtures/openapi/KubernetesClusterRegistrationRequest/invalid/action-profile.json +3 -0
- package/fixtures/openapi/KubernetesClusterRegistrationRequest/valid/action-profile.json +5 -0
- package/fixtures/openapi/KubernetesImportCandidateListEnvelope/invalid/source-with-spec.json +33 -0
- package/fixtures/openapi/KubernetesImportCandidateListEnvelope/invalid/source-without-uid.json +29 -0
- package/fixtures/openapi/KubernetesImportCandidateListEnvelope/valid/stable-source.json +30 -0
- package/fixtures/openapi/KubernetesNodeListEnvelope/invalid/condition-status-boolean.json +17 -0
- package/fixtures/openapi/KubernetesNodeListEnvelope/invalid/taint-effect-missing.json +16 -0
- package/fixtures/openapi/KubernetesNodeListEnvelope/valid/legacy-fields-absent.json +11 -0
- package/fixtures/openapi/KubernetesNodeListEnvelope/valid/no-taints.json +13 -0
- package/fixtures/openapi/KubernetesNodeListEnvelope/valid/ready-cordoned-tainted.json +28 -0
- package/fixtures/openapi/KubernetesNodeListEnvelope/valid/unknown-fields-null.json +13 -0
- package/fixtures/openapi/KubernetesPod/invalid/pod-uid.json +9 -0
- package/fixtures/openapi/KubernetesPod/valid/pod-uid.json +9 -0
- package/fixtures/openapi/KubernetesPodDetail/invalid/pod-uid.json +6 -0
- package/fixtures/openapi/KubernetesPodDetail/valid/pod-uid.json +6 -0
- package/fixtures/openapi/KubernetesServiceImportRequest/invalid/empty-source-uid.json +48 -0
- package/fixtures/openapi/KubernetesServiceImportRequest/valid/pinned-workloads-and-cr.json +48 -0
- package/fixtures/openapi/KubernetesTopologyCoverage/invalid/empty-as-success.json +5 -0
- package/fixtures/openapi/KubernetesTopologyCoverage/valid/not-installed.json +6 -0
- package/fixtures/openapi/KubernetesTopologyGraphEdge/invalid/negative-weight.json +8 -0
- package/fixtures/openapi/KubernetesTopologyGraphEdge/valid/zero-weight.json +20 -0
- package/fixtures/openapi/KubernetesTopologyGraphNode/invalid/fake-flow-kind.json +42 -0
- package/fixtures/openapi/KubernetesTopologyGraphNode/valid/rule.json +42 -0
- package/fixtures/openapi/KubernetesTopologySnapshot/invalid/raw-source-field.json +33 -0
- package/fixtures/openapi/KubernetesTopologySnapshot/valid/projected-source.json +32 -0
- package/fixtures/openapi/KubernetesTopologySnapshotRequest/invalid/arbitrary-gvr.json +8 -0
- package/fixtures/openapi/KubernetesTopologySnapshotRequest/valid/bounded-sources.json +11 -0
- package/fixtures/openapi/KubernetesTopologySourceQuery/invalid/cluster-namespace.json +4 -0
- package/fixtures/openapi/KubernetesTopologySourceQuery/valid/all-namespaces.json +4 -0
- package/fixtures/openapi/ManifestExecutionTaskPayload/invalid/initialization.json +7 -0
- package/fixtures/openapi/ManifestExecutionTaskPayload/valid/initialization.json +7 -0
- package/fixtures/openapi/ManifestRootResource/invalid/root.json +1 -0
- package/fixtures/openapi/ManifestRootResource/valid/root.json +1 -0
- package/fixtures/openapi/ResourceMonitoringPanel/invalid/unknown-quality.json +7 -0
- package/fixtures/openapi/ResourceMonitoringPanel/valid/not-collected.json +7 -0
- package/fixtures/openapi/ResourceMonitoringPoint/invalid/string-zero.json +4 -0
- package/fixtures/openapi/ResourceMonitoringPoint/valid/missing.json +4 -0
- package/fixtures/openapi/ResourceMonitoringPoint/valid/zero.json +4 -0
- package/fixtures/openapi/ResourceMonitoringView/invalid/raw-query.json +12 -0
- package/fixtures/openapi/ResourceMonitoringView/valid/unconfigured.json +12 -0
- package/fixtures/openapi/ResourceRelationConfig/invalid/executable-rule.json +17 -0
- package/fixtures/openapi/ResourceRelationConfig/valid/unknown-kind.json +13 -0
- package/fixtures/openapi/ServiceDeploymentTemplateInput/invalid/migration-missing-guide-valid-yaml.json +38 -0
- package/fixtures/openapi/ServiceDeploymentTemplateInput/valid/migration-valid-yaml.json +39 -0
- package/fixtures/openapi/TemplateMigrationAssessment/invalid/initialization.json +9 -0
- package/fixtures/openapi/TemplateMigrationAssessment/valid/initialization.json +9 -0
- package/fixtures/openapi/TemplateMigrationPolicy/invalid/blank-guide.json +5 -0
- package/fixtures/openapi/TemplateMigrationPolicy/invalid/missing-guide.json +4 -0
- package/fixtures/openapi/TemplateMigrationPolicy/invalid/unknown-escape-hatch.json +6 -0
- package/fixtures/openapi/TemplateMigrationPolicy/valid/legacy-safe.json +4 -0
- package/fixtures/openapi/TemplateMigrationPolicy/valid/ordered-data-change.json +5 -0
- package/fixtures/openapi/TemplateUpdateBatchInput/invalid/duplicate-candidates.json +11 -0
- package/fixtures/openapi/TemplateUpdateBatchInput/invalid/empty-identities.json +10 -0
- package/fixtures/openapi/TemplateUpdateBatchInput/valid/staged-adoption.json +10 -0
- package/fixtures/openapi/TemplateUpdatePolicyInput/invalid/unknown-mode.json +8 -0
- package/fixtures/openapi/TemplateUpdatePolicyInput/valid/explicit-automatic.json +8 -0
- package/fixtures/openapi/TemplateUpdatePreviewInput/invalid/empty-identities.json +10 -0
- package/fixtures/openapi/TemplateUpdatePreviewInput/invalid/empty-targets.json +6 -0
- package/fixtures/openapi/TemplateUpdatePreviewInput/valid/cross-version-manual.json +14 -0
- package/gen/go/sohaapi/client.go +1 -1
- package/gen/go/sohaapi/client_test.go +2 -2
- package/gen/go/sohaapi/import_source_compat_test.go +12 -0
- package/gen/go/sohaapi/kubernetes_monitoring_test.go +67 -0
- package/gen/go/sohaapi/types.go +2210 -387
- package/gen/ts/sohaapi/index.ts +1862 -5
- package/go.mod +2 -2
- package/helmrelease/delivery.go +4 -1
- package/helmrelease/initialization.go +10 -0
- package/helmrelease/runtime/delivery.go +40 -10
- package/helmrelease/runtime/delivery_test.go +4 -0
- package/helmrelease/runtime/initialization.go +186 -0
- package/helmrelease/runtime/initialization_test.go +203 -0
- package/openapi/soha-api.json +5514 -1179
- package/openapi/soha-api.yaml +1080 -11
- package/openapi/spec_generated.go +3 -3
- package/openapi/spec_test.go +76 -0
- package/package.json +1 -1
- package/resource/agent_access.go +12 -0
- package/resource/agent_profiles.go +62 -0
- package/resource/agent_profiles_test.go +36 -0
- package/resource/kubernetes_kinds.go +73 -0
- package/resource/kubernetes_kinds_test.go +38 -0
- package/resource/models.go +25 -14
- package/resource/network_topology.go +166 -0
- package/resource/network_topology_projection.go +208 -0
- package/resource/network_topology_projection_test.go +53 -0
- package/resource/network_topology_test.go +51 -0
- package/resource/network_topology_validation.go +29 -0
- package/resource/node_drain.go +34 -0
- package/resource/relations.go +225 -0
- package/resource/relations_test.go +47 -0
- package/resource/resource_monitoring.go +99 -0
- package/resource/root_cr.go +38 -0
- package/resource/runtime/argocd_integration_test.go +1 -1
- package/resource/runtime/initialization.go +66 -0
- package/resource/runtime/initialization_test.go +80 -0
- package/resource/runtime/network_topology.go +232 -0
- package/resource/runtime/network_topology_test.go +62 -0
- package/resource/runtime/node_drain.go +124 -0
- package/resource/runtime/node_drain_test.go +95 -0
- package/resource/runtime/relations.go +161 -0
- package/resource/runtime/relations_test.go +100 -0
- package/resource/runtime/resource_edit.go +128 -0
- package/resource/runtime/resource_edit_test.go +183 -0
- package/resource/runtime/resource_monitoring.go +243 -0
- package/resource/runtime/resource_monitoring_test.go +88 -0
- package/resource/runtime/root_cr.go +79 -0
- package/resource/runtime/root_cr_test.go +118 -0
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
package runtime
|
|
2
|
+
|
|
3
|
+
import (
|
|
4
|
+
"context"
|
|
5
|
+
"reflect"
|
|
6
|
+
"testing"
|
|
7
|
+
|
|
8
|
+
"github.com/opensoha/soha-contracts/gen/go/sohaapi"
|
|
9
|
+
apierrors "k8s.io/apimachinery/pkg/api/errors"
|
|
10
|
+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
|
11
|
+
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
|
|
12
|
+
"k8s.io/apimachinery/pkg/runtime"
|
|
13
|
+
"k8s.io/apimachinery/pkg/runtime/schema"
|
|
14
|
+
"k8s.io/client-go/dynamic/fake"
|
|
15
|
+
ktesting "k8s.io/client-go/testing"
|
|
16
|
+
)
|
|
17
|
+
|
|
18
|
+
func TestRootCRPublicationFences(t *testing.T) {
|
|
19
|
+
for _, mode := range []string{"apply", "dry-run", "retry", "replaced", "changed", "deleted", "deleting", "helm", "git", "controller", "status", "finalizer", "force", "conflict-replaced"} {
|
|
20
|
+
t.Run(mode, func(t *testing.T) {
|
|
21
|
+
root, live, desired, options := rootPublicationFixture(mode)
|
|
22
|
+
client := fake.NewSimpleDynamicClient(runtime.NewScheme(), live)
|
|
23
|
+
gvr := schema.GroupVersionResource{Group: "unknown.example", Version: "v1", Resource: "databases"}
|
|
24
|
+
resources := client.Resource(gvr).Namespace("team")
|
|
25
|
+
if mode == "deleted" {
|
|
26
|
+
if err := resources.Delete(context.Background(), root.Name, metav1.DeleteOptions{}); err != nil {
|
|
27
|
+
t.Fatal(err)
|
|
28
|
+
}
|
|
29
|
+
client.ClearActions()
|
|
30
|
+
}
|
|
31
|
+
writes := rootPublicationUpdates(t, client, root, live, mode, gvr)
|
|
32
|
+
_, err := ApplyRootCR(context.Background(), resources, desired, root, options)
|
|
33
|
+
valid := mode == "apply" || mode == "dry-run" || mode == "retry"
|
|
34
|
+
if valid && err != nil || !valid && err == nil {
|
|
35
|
+
t.Fatalf("error=%v valid=%v", err, valid)
|
|
36
|
+
}
|
|
37
|
+
expected := 0
|
|
38
|
+
if mode == "apply" || mode == "dry-run" || mode == "conflict-replaced" {
|
|
39
|
+
expected = 1
|
|
40
|
+
}
|
|
41
|
+
if *writes != expected {
|
|
42
|
+
t.Fatalf("writes=%d want=%d", *writes, expected)
|
|
43
|
+
}
|
|
44
|
+
for _, action := range client.Actions() {
|
|
45
|
+
if action.GetVerb() != "get" && action.GetVerb() != "update" {
|
|
46
|
+
t.Fatalf("unexpected mutation: %s", action.GetVerb())
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
})
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
func rootPublicationFixture(mode string) (sohaapi.ManifestRootResource, *unstructured.Unstructured, *unstructured.Unstructured, metav1.PatchOptions) {
|
|
54
|
+
root := sohaapi.ManifestRootResource{APIVersion: "unknown.example/v1", Kind: "Database", Namespace: "team", Name: "db", UID: "uid-1", Generation: 2, CrdName: "databases.unknown.example"}
|
|
55
|
+
live := &unstructured.Unstructured{Object: map[string]any{"apiVersion": root.APIVersion, "kind": root.Kind, "metadata": map[string]any{"namespace": root.Namespace, "name": root.Name, "uid": root.UID, "resourceVersion": "12", "generation": int64(2)}, "spec": map[string]any{"size": int64(1)}}}
|
|
56
|
+
desired := &unstructured.Unstructured{Object: map[string]any{"apiVersion": root.APIVersion, "kind": root.Kind, "metadata": map[string]any{"namespace": root.Namespace, "name": root.Name}, "spec": map[string]any{"size": int64(2)}}}
|
|
57
|
+
force := mode == "force"
|
|
58
|
+
options := metav1.PatchOptions{FieldManager: "opensoha-manifest/binding", Force: &force}
|
|
59
|
+
switch mode {
|
|
60
|
+
case "dry-run":
|
|
61
|
+
options.DryRun = []string{metav1.DryRunAll}
|
|
62
|
+
case "retry":
|
|
63
|
+
live.Object["spec"] = desired.Object["spec"]
|
|
64
|
+
live.SetGeneration(3)
|
|
65
|
+
case "replaced":
|
|
66
|
+
live.SetUID("uid-2")
|
|
67
|
+
case "changed":
|
|
68
|
+
live.SetGeneration(3)
|
|
69
|
+
case "deleting":
|
|
70
|
+
now := metav1.Now()
|
|
71
|
+
live.SetDeletionTimestamp(&now)
|
|
72
|
+
case "helm":
|
|
73
|
+
live.SetLabels(map[string]string{"app.kubernetes.io/managed-by": "Helm"})
|
|
74
|
+
case "git":
|
|
75
|
+
live.SetManagedFields([]metav1.ManagedFieldsEntry{{Manager: "argocd-controller"}})
|
|
76
|
+
case "controller":
|
|
77
|
+
yes := true
|
|
78
|
+
live.SetOwnerReferences([]metav1.OwnerReference{{UID: "parent", Controller: &yes}})
|
|
79
|
+
case "status":
|
|
80
|
+
desired.Object["status"] = map[string]any{"ready": true}
|
|
81
|
+
case "finalizer":
|
|
82
|
+
desired.SetFinalizers([]string{"operator/hold"})
|
|
83
|
+
}
|
|
84
|
+
return root, live, desired, options
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
func rootPublicationUpdates(t *testing.T, client *fake.FakeDynamicClient, root sohaapi.ManifestRootResource, live *unstructured.Unstructured, mode string, gvr schema.GroupVersionResource) *int {
|
|
88
|
+
t.Helper()
|
|
89
|
+
writes := new(int)
|
|
90
|
+
client.PrependReactor("update", "databases", func(action ktesting.Action) (bool, runtime.Object, error) {
|
|
91
|
+
*writes++
|
|
92
|
+
update, ok := action.(ktesting.UpdateActionImpl)
|
|
93
|
+
if !ok {
|
|
94
|
+
t.Fatalf("expected update action, got %T", action)
|
|
95
|
+
}
|
|
96
|
+
object, ok := update.GetObject().(*unstructured.Unstructured)
|
|
97
|
+
if !ok {
|
|
98
|
+
t.Fatalf("expected unstructured root, got %T", update.GetObject())
|
|
99
|
+
}
|
|
100
|
+
if mode == "dry-run" && len(update.GetUpdateOptions().DryRun) != 1 {
|
|
101
|
+
t.Fatal("preflight performed a real update")
|
|
102
|
+
}
|
|
103
|
+
body := object.Object
|
|
104
|
+
if string(object.GetUID()) != root.UID || object.GetResourceVersion() != "12" || !reflect.DeepEqual(object.Object["status"], live.Object["status"]) {
|
|
105
|
+
t.Fatalf("unsafe patch: %v", body)
|
|
106
|
+
}
|
|
107
|
+
if mode == "conflict-replaced" {
|
|
108
|
+
replaced := live.DeepCopy()
|
|
109
|
+
replaced.SetUID("uid-2")
|
|
110
|
+
if err := client.Tracker().Update(gvr, replaced, "team"); err != nil {
|
|
111
|
+
t.Fatal(err)
|
|
112
|
+
}
|
|
113
|
+
return true, nil, apierrors.NewConflict(gvr.GroupResource(), root.Name, nil)
|
|
114
|
+
}
|
|
115
|
+
return true, object, nil
|
|
116
|
+
})
|
|
117
|
+
return writes
|
|
118
|
+
}
|