@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
@@ -0,0 +1,87 @@
1
+ package runtime
2
+
3
+ import (
4
+ "crypto/ecdsa"
5
+ "crypto/elliptic"
6
+ "crypto/rand"
7
+ "crypto/x509"
8
+ "crypto/x509/pkix"
9
+ "encoding/json"
10
+ "encoding/pem"
11
+ "math/big"
12
+ "strings"
13
+ "testing"
14
+ "time"
15
+ )
16
+
17
+ func TestSecretCertificateMetadata(t *testing.T) {
18
+ key, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader)
19
+ if err != nil {
20
+ t.Fatal(err)
21
+ }
22
+ start := time.Date(2026, 11, 2, 8, 0, 0, 0, time.UTC)
23
+ template := &x509.Certificate{SerialNumber: big.NewInt(1), Subject: pkix.Name{CommonName: "demo.test"}, NotBefore: start, NotAfter: start.Add(30 * 24 * time.Hour)}
24
+ der, err := x509.CreateCertificate(rand.Reader, template, template, &key.PublicKey, key)
25
+ if err != nil {
26
+ t.Fatal(err)
27
+ }
28
+ crt := pem.EncodeToMemory(&pem.Block{Type: "CERTIFICATE", Bytes: der})
29
+ for _, tc := range []struct {
30
+ name, kind string
31
+ data []byte
32
+ status string
33
+ }{
34
+ {"valid", "kubernetes.io/tls", crt, "available"},
35
+ {"missing", "kubernetes.io/tls", nil, "missing"},
36
+ {"invalid", "kubernetes.io/tls", []byte("not a certificate"), "invalid"},
37
+ {"oversized", "kubernetes.io/tls", make([]byte, (1<<20)+1), "invalid"},
38
+ {"private key block", "kubernetes.io/tls", pem.EncodeToMemory(&pem.Block{Type: "PRIVATE KEY", Bytes: []byte("secret-sentinel")}), "invalid"},
39
+ {"wrong type", "Opaque", crt, "unsupported_type"},
40
+ } {
41
+ t.Run(tc.name, func(t *testing.T) {
42
+ v := SecretCertificateMetadata("demo-tls", "demo", tc.kind, tc.data)
43
+ if v.Status != tc.status || v.Name != "demo-tls" || v.Namespace != "demo" {
44
+ t.Fatalf("metadata = %+v", v)
45
+ }
46
+ if tc.status == "available" {
47
+ if v.NotBefore != start.Format(time.RFC3339) || v.NotAfter != template.NotAfter.Format(time.RFC3339) || v.SelfSigned == nil || !*v.SelfSigned {
48
+ t.Fatalf("certificate dates = %+v", v)
49
+ }
50
+ } else if v.NotBefore != "" || v.NotAfter != "" {
51
+ t.Fatal("unreadable certificate has invented dates")
52
+ }
53
+ encoded, err := json.Marshal(v)
54
+ if err != nil {
55
+ t.Fatal(err)
56
+ }
57
+ for _, forbidden := range []string{"tls.key", "tls.crt", "BEGIN", "secret-sentinel", "\"data\""} {
58
+ if strings.Contains(string(encoded), forbidden) {
59
+ t.Fatalf("response contains %q", forbidden)
60
+ }
61
+ }
62
+ })
63
+ }
64
+ }
65
+
66
+ func TestSecretCertificateMetadataExplicitlyReportsNotSelfSigned(t *testing.T) {
67
+ issuerKey, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader)
68
+ if err != nil {
69
+ t.Fatal(err)
70
+ }
71
+ leafKey, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader)
72
+ if err != nil {
73
+ t.Fatal(err)
74
+ }
75
+ start := time.Date(2026, 11, 2, 8, 0, 0, 0, time.UTC)
76
+ issuer := &x509.Certificate{SerialNumber: big.NewInt(1), Subject: pkix.Name{CommonName: "Demo CA"}, NotBefore: start, NotAfter: start.Add(365 * 24 * time.Hour), IsCA: true, BasicConstraintsValid: true, KeyUsage: x509.KeyUsageCertSign}
77
+ leaf := &x509.Certificate{SerialNumber: big.NewInt(2), Subject: pkix.Name{CommonName: "demo.test"}, NotBefore: start, NotAfter: start.Add(90 * 24 * time.Hour)}
78
+ der, err := x509.CreateCertificate(rand.Reader, leaf, issuer, &leafKey.PublicKey, issuerKey)
79
+ if err != nil {
80
+ t.Fatal(err)
81
+ }
82
+ v := SecretCertificateMetadata("tls", "demo", "kubernetes.io/tls", pem.EncodeToMemory(&pem.Block{Type: "CERTIFICATE", Bytes: der}))
83
+ encoded, err := json.Marshal(v)
84
+ if err != nil || v.Status != "available" || v.SelfSigned == nil || *v.SelfSigned || !strings.Contains(string(encoded), `"selfSigned":false`) {
85
+ t.Fatalf("non-self-signed projection: %s %v", encoded, err)
86
+ }
87
+ }
@@ -0,0 +1,4 @@
1
+ package resource
2
+
3
+ // StorageResourceGraphFeature identifies Agent support for the storage graph roots.
4
+ const StorageResourceGraphFeature = "resource.graph.storage.v1"