@intentius/chant-lexicon-k8s 0.1.14 → 0.1.16

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 (50) hide show
  1. package/README.md +0 -1
  2. package/dist/integrity.json +14 -6
  3. package/dist/manifest.json +1 -1
  4. package/dist/meta.json +216 -0
  5. package/dist/rules/argo-appset-single-project.ts +66 -0
  6. package/dist/rules/argo-ast.ts +121 -0
  7. package/dist/rules/argo-automated-prune.ts +75 -0
  8. package/dist/rules/argo-helpers.ts +49 -0
  9. package/dist/rules/argo002.ts +47 -0
  10. package/dist/rules/argo003.ts +80 -0
  11. package/dist/rules/argo005.ts +59 -0
  12. package/dist/rules/wk8301.ts +11 -3
  13. package/dist/skills/chant-k8s-argo.md +176 -0
  14. package/dist/types/index.d.ts +34 -0
  15. package/package.json +1 -1
  16. package/src/codegen/docs.ts +14 -1
  17. package/src/codegen/versions.ts +8 -5
  18. package/src/composites/argo-app.ts +380 -0
  19. package/src/composites/composites.test.ts +136 -0
  20. package/src/composites/index.ts +12 -0
  21. package/src/crd/crd-sources.ts +18 -0
  22. package/src/crd/loader.ts +4 -5
  23. package/src/crd/parser.test.ts +61 -0
  24. package/src/crd/parser.ts +37 -2
  25. package/src/describe-resources.ts +8 -1
  26. package/src/export-resources-io.test.ts +72 -0
  27. package/src/export-resources.ts +60 -0
  28. package/src/generated/index.d.ts +34 -0
  29. package/src/generated/index.ts +25 -0
  30. package/src/generated/lexicon-k8s.json +216 -0
  31. package/src/import/live-export.test.ts +114 -0
  32. package/src/import/live-export.ts +89 -0
  33. package/src/index.ts +5 -0
  34. package/src/lifecycle-integration.test.ts +111 -0
  35. package/src/lint/post-synth/argo-helpers.ts +49 -0
  36. package/src/lint/post-synth/argo002.ts +47 -0
  37. package/src/lint/post-synth/argo003.ts +80 -0
  38. package/src/lint/post-synth/argo005.ts +59 -0
  39. package/src/lint/post-synth/post-synth.test.ts +146 -2
  40. package/src/lint/post-synth/wk8301.ts +11 -3
  41. package/src/lint/rules/argo-appset-single-project.ts +66 -0
  42. package/src/lint/rules/argo-ast.ts +121 -0
  43. package/src/lint/rules/argo-automated-prune.ts +75 -0
  44. package/src/lint/rules/rules.test.ts +109 -0
  45. package/src/plugin.test.ts +6 -1
  46. package/src/plugin.ts +44 -1
  47. package/src/serializer-ownership.test.ts +44 -0
  48. package/src/serializer.test.ts +25 -0
  49. package/src/serializer.ts +9 -4
  50. package/src/skills/chant-k8s-argo.md +176 -0
package/src/crd/parser.ts CHANGED
@@ -12,12 +12,24 @@ import type { CRDSpec } from "./types";
12
12
  import type { PropertyConstraints } from "@intentius/chant/codegen/json-schema";
13
13
  import { loadAll } from "js-yaml";
14
14
 
15
+ /**
16
+ * Group names whose first segment doesn't yield the conventional namespace.
17
+ * "argoproj.io" → "Argo" (not "Argoproj") to match the Argo CD vocabulary
18
+ * and the ArgoAppFor / ArgoAppSetForRegions composites.
19
+ */
20
+ const GROUP_NAMESPACE_OVERRIDES: Record<string, string> = {
21
+ "argoproj.io": "Argo",
22
+ };
23
+
15
24
  /**
16
25
  * Normalize a CRD group to a PascalCase namespace segment.
17
26
  * "cert-manager.io" → "CertManager"
18
27
  * "monitoring.coreos.com" → "Monitoring"
28
+ * "argoproj.io" → "Argo" (override)
19
29
  */
20
30
  function normalizeGroupName(group: string): string {
31
+ const override = GROUP_NAMESPACE_OVERRIDES[group];
32
+ if (override) return override;
21
33
  // Take the first segment before the first dot
22
34
  const firstSegment = group.split(".")[0];
23
35
  // Convert kebab-case to PascalCase
@@ -165,10 +177,33 @@ function extractPropertyTypes(schema: OpenAPISchema, parentTypeName: string): Pa
165
177
  // "K8s::Ray::RayCluster::AutoscalerOptions".
166
178
  const shortName = parentTypeName.split("::").pop()!;
167
179
 
180
+ // Property-type identifiers must be unique within a resource. Singularizing
181
+ // array names can collide a sibling scalar object — e.g. Argo Application has
182
+ // both `source` (object) and `sources` (array), which both reduce to
183
+ // `Application_Source`. Track emitted names and fall back to the raw
184
+ // (un-singularized) name, then a numeric suffix, on collision.
185
+ const usedNames = new Set<string>();
186
+ const uniqueName = (base: string, raw: string): string => {
187
+ if (!usedNames.has(base)) {
188
+ usedNames.add(base);
189
+ return base;
190
+ }
191
+ const rawCandidate = `${shortName}_${pascalCase(raw)}`;
192
+ if (!usedNames.has(rawCandidate)) {
193
+ usedNames.add(rawCandidate);
194
+ return rawCandidate;
195
+ }
196
+ let i = 2;
197
+ while (usedNames.has(`${base}${i}`)) i++;
198
+ const suffixed = `${base}${i}`;
199
+ usedNames.add(suffixed);
200
+ return suffixed;
201
+ };
202
+
168
203
  for (const [name, prop] of Object.entries(specSchema.properties)) {
169
204
  // Extract inline object definitions as property types
170
205
  if (prop.type === "object" && prop.properties) {
171
- const ptName = `${shortName}_${pascalCase(name)}`;
206
+ const ptName = uniqueName(`${shortName}_${pascalCase(name)}`, name);
172
207
  const requiredSet = new Set<string>(prop.required ?? []);
173
208
 
174
209
  results.push({
@@ -189,7 +224,7 @@ function extractPropertyTypes(schema: OpenAPISchema, parentTypeName: string): Pa
189
224
  if (prop.type === "array" && prop.items?.type === "object" && prop.items.properties) {
190
225
  const itemSchema = prop.items;
191
226
  const itemProps = itemSchema.properties!;
192
- const ptName = `${shortName}_${pascalCase(singularize(name))}`;
227
+ const ptName = uniqueName(`${shortName}_${pascalCase(singularize(name))}`, name);
193
228
  const requiredSet = new Set<string>(itemSchema.required ?? []);
194
229
 
195
230
  results.push({
@@ -15,6 +15,7 @@
15
15
  import { exec } from "node:child_process";
16
16
  import { promisify } from "node:util";
17
17
  import type { ResourceMetadata } from "@intentius/chant/lexicon";
18
+ import { hasOwnershipMarker, classifyOwnership } from "@intentius/chant/ownership";
18
19
 
19
20
  const execAsync = promisify(exec);
20
21
 
@@ -22,7 +23,7 @@ const execAsync = promisify(exec);
22
23
  * Map chant entity types to `kubectl get` resource names. Add entries here
23
24
  * as new types are needed.
24
25
  */
25
- const KUBECTL_RESOURCE: Record<string, string> = {
26
+ export const KUBECTL_RESOURCE: Record<string, string> = {
26
27
  "K8s::Apps::Deployment": "deployment.apps",
27
28
  "K8s::Apps::StatefulSet": "statefulset.apps",
28
29
  "K8s::Apps::DaemonSet": "daemonset.apps",
@@ -85,6 +86,7 @@ export async function describeResources(options: {
85
86
  buildOutput: string;
86
87
  entityNames: string[];
87
88
  entities: Map<string, { entityType: string; props: Record<string, unknown> }>;
89
+ owned?: boolean;
88
90
  }): Promise<Record<string, ResourceMetadata>> {
89
91
  const result: Record<string, ResourceMetadata> = {};
90
92
  const skippedTypes = new Set<string>();
@@ -106,11 +108,16 @@ export async function describeResources(options: {
106
108
  try {
107
109
  const { stdout } = await execAsync(cmd);
108
110
  const obj: KubectlResponse = JSON.parse(stdout);
111
+ // owned filter: skip resources not carrying chant's marker label.
112
+ if (options.owned && !hasOwnershipMarker(obj.metadata?.labels, "label")) {
113
+ continue;
114
+ }
109
115
  result[entityName] = {
110
116
  type: entityType,
111
117
  physicalId: obj.metadata?.uid,
112
118
  status: statusFromKubectl(obj),
113
119
  lastUpdated: obj.metadata?.creationTimestamp,
120
+ ownership: classifyOwnership(obj.metadata?.labels, "label"),
114
121
  attributes: pruneUndefined({
115
122
  namespace: obj.metadata?.namespace,
116
123
  labels: obj.metadata?.labels,
@@ -0,0 +1,72 @@
1
+ import { describe, test, expect, vi, beforeEach } from "vitest";
2
+
3
+ // Synchronous delivery (value, or Error for skipped kinds) avoids dangling
4
+ // unhandled rejections when a kind is missing / RBAC-denied.
5
+ const execMock = vi.fn();
6
+ vi.mock("node:child_process", async () => {
7
+ const actual = await vi.importActual<typeof import("node:child_process")>("node:child_process");
8
+ return {
9
+ ...actual,
10
+ exec: (
11
+ cmd: string,
12
+ cb: (err: Error | null, out: { stdout: string; stderr: string }) => void,
13
+ ) => {
14
+ const r = execMock(cmd);
15
+ queueMicrotask(() =>
16
+ r instanceof Error
17
+ ? cb(r, { stdout: "", stderr: "" })
18
+ : cb(null, r as { stdout: string; stderr: string }),
19
+ );
20
+ },
21
+ };
22
+ });
23
+
24
+ const { exportResources } = await import("./export-resources");
25
+
26
+ const liveDeployment = {
27
+ apiVersion: "apps/v1",
28
+ kind: "Deployment",
29
+ metadata: { name: "web", namespace: "default", uid: "d-1" },
30
+ spec: { replicas: 3, selector: { matchLabels: { app: "web" } } },
31
+ };
32
+
33
+ const emptyList = { stdout: JSON.stringify({ items: [] }), stderr: "" };
34
+
35
+ describe("k8s exportResources I/O glue (#160)", () => {
36
+ beforeEach(() => execMock.mockReset());
37
+
38
+ test("sweeps known kinds via `kubectl get <kind> -A -o json` and maps to IR", async () => {
39
+ execMock.mockImplementation((cmd?: string) =>
40
+ cmd?.includes("get deployment.apps")
41
+ ? { stdout: JSON.stringify({ items: [liveDeployment] }), stderr: "" }
42
+ : emptyList,
43
+ );
44
+ const ir = await exportResources({ environment: "prod" });
45
+ const cmds = execMock.mock.calls.map((c) => c[0] as string).filter(Boolean);
46
+ expect(cmds.every((c) => c.startsWith("kubectl get ") && c.endsWith("-A -o json"))).toBe(true);
47
+ expect(cmds).toContain("kubectl get deployment.apps -A -o json");
48
+ expect(ir.resources.map((r) => r.type)).toContain("K8s::Apps::Deployment");
49
+ });
50
+
51
+ test("a kind that errors is skipped; the rest of the sweep still maps", async () => {
52
+ execMock.mockImplementation((cmd?: string) => {
53
+ if (cmd?.includes("get secret ")) return new Error("Error from server (Forbidden)");
54
+ if (cmd?.includes("get deployment.apps")) {
55
+ return { stdout: JSON.stringify({ items: [liveDeployment] }), stderr: "" };
56
+ }
57
+ return emptyList;
58
+ });
59
+ const ir = await exportResources({ environment: "prod" });
60
+ expect(ir.resources.map((r) => r.type)).toContain("K8s::Apps::Deployment");
61
+ });
62
+
63
+ test("a type selector narrows the sweep to a single kubectl get", async () => {
64
+ execMock.mockImplementation(() => ({
65
+ stdout: JSON.stringify({ items: [liveDeployment] }),
66
+ stderr: "",
67
+ }));
68
+ await exportResources({ environment: "prod", selector: { type: "K8s::Apps::Deployment" } });
69
+ expect(execMock.mock.calls.length).toBe(1);
70
+ expect(execMock.mock.calls[0][0]).toBe("kubectl get deployment.apps -A -o json");
71
+ });
72
+ });
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Live export for the Kubernetes lexicon — implements
3
+ * LexiconPlugin.exportResources() so `chant import --from <cluster-env>`
4
+ * regenerates live objects as chant TypeScript.
5
+ *
6
+ * Reads live objects with `kubectl get <kinds> -A -o json`, strips
7
+ * server-managed noise to reach the declared shape (kept under `verbatim`),
8
+ * and maps to the import IR via the shared K8sParser. All I/O lives here; the
9
+ * cleaning and IR-building logic is pure in `./import/live-export`.
10
+ */
11
+ import { exec } from "node:child_process";
12
+ import { promisify } from "node:util";
13
+ import type { ExportedTemplate, ResourceSelector } from "@intentius/chant/lexicon";
14
+ import { KUBECTL_RESOURCE } from "./describe-resources";
15
+ import { buildExportFromObjects } from "./import/live-export";
16
+
17
+ const execAsync = promisify(exec);
18
+
19
+ interface KubectlList {
20
+ items?: unknown[];
21
+ }
22
+
23
+ export async function exportResources(options: {
24
+ environment: string;
25
+ selector?: ResourceSelector;
26
+ owned?: boolean;
27
+ verbatim?: boolean;
28
+ }): Promise<ExportedTemplate> {
29
+ // Resolve which kinds to query. A type selector narrows to one kind;
30
+ // otherwise sweep every kind chant knows how to map.
31
+ const kinds = options.selector?.type
32
+ ? [KUBECTL_RESOURCE[options.selector.type]].filter(Boolean)
33
+ : Array.from(new Set(Object.values(KUBECTL_RESOURCE)));
34
+
35
+ if (kinds.length === 0) {
36
+ return { resources: [], parameters: [] };
37
+ }
38
+
39
+ // One List per kind keeps parsing simple and isolates a missing-kind error
40
+ // to that kind rather than failing the whole export.
41
+ const objects: unknown[] = [];
42
+ for (const kind of kinds) {
43
+ try {
44
+ const { stdout } = await execAsync(
45
+ ["kubectl", "get", kind, "-A", "-o", "json"].join(" "),
46
+ );
47
+ const list = JSON.parse(stdout) as KubectlList;
48
+ if (Array.isArray(list.items)) objects.push(...list.items);
49
+ } catch {
50
+ // Kind not present in the cluster / RBAC denied — skip it, don't fail
51
+ // the whole export.
52
+ }
53
+ }
54
+
55
+ return buildExportFromObjects(objects, {
56
+ verbatim: options.verbatim,
57
+ selector: options.selector,
58
+ owned: options.owned,
59
+ });
60
+ }
@@ -76,6 +76,40 @@ export declare class APIVersions {
76
76
  readonly uid: string;
77
77
  }
78
78
 
79
+ export declare class Application {
80
+ constructor(props: {
81
+ metadata: Record<string, unknown>;
82
+ /** ApplicationSpec represents desired application state. Contains link to repository with application definition and additional parameters link definition revision. */
83
+ spec: Record<string, unknown>;
84
+ /** Operation contains information about a requested or running operation */
85
+ operation?: Record<string, unknown>;
86
+ });
87
+ readonly name: string;
88
+ readonly namespace: string;
89
+ readonly uid: string;
90
+ }
91
+
92
+ export declare class ApplicationSet {
93
+ constructor(props: {
94
+ metadata: Record<string, unknown>;
95
+ spec: Record<string, unknown>;
96
+ });
97
+ readonly name: string;
98
+ readonly namespace: string;
99
+ readonly uid: string;
100
+ }
101
+
102
+ export declare class AppProject {
103
+ constructor(props: {
104
+ metadata: Record<string, unknown>;
105
+ /** AppProjectSpec is the specification of an AppProject */
106
+ spec: Record<string, unknown>;
107
+ });
108
+ readonly name: string;
109
+ readonly namespace: string;
110
+ readonly uid: string;
111
+ }
112
+
79
113
  export declare class BatchJob {
80
114
  constructor(props: {
81
115
  /** Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata */
@@ -7,6 +7,9 @@ export const APIResourceList = createResource("K8s::Core::APIResourceList", "k8s
7
7
  export const APIService = createResource("K8s::Apiregistration::APIService", "k8s", {"name":"name","namespace":"namespace","uid":"uid"});
8
8
  export const APIServiceList = createResource("K8s::Apiregistration::APIServiceList", "k8s", {"name":"name","namespace":"namespace","uid":"uid"});
9
9
  export const APIVersions = createResource("K8s::Core::APIVersions", "k8s", {"name":"name","namespace":"namespace","uid":"uid"});
10
+ export const Application = createResource("K8s::Argo::Application", "k8s", {"name":"name","namespace":"namespace","uid":"uid"});
11
+ export const ApplicationSet = createResource("K8s::Argo::ApplicationSet", "k8s", {"name":"name","namespace":"namespace","uid":"uid"});
12
+ export const AppProject = createResource("K8s::Argo::AppProject", "k8s", {"name":"name","namespace":"namespace","uid":"uid"});
10
13
  export const BatchJob = createResource("K8s::Batch::Job", "k8s", {"name":"name","namespace":"namespace","uid":"uid"});
11
14
  export const Binding = createResource("K8s::Core::Binding", "k8s", {"name":"name","namespace":"namespace","uid":"uid"});
12
15
  export const CertificateSigningRequest = createResource("K8s::Certificates::CertificateSigningRequest", "k8s", {"name":"name","namespace":"namespace","uid":"uid"});
@@ -153,6 +156,28 @@ export const VolumeAttributesClassList = createResource("K8s::Storage::VolumeAtt
153
156
  export const WatchEvent = createResource("K8s::Core::WatchEvent", "k8s", {"name":"name","namespace":"namespace","uid":"uid"});
154
157
 
155
158
  export const Affinity = createProperty("K8s::Core::Affinity", "k8s");
159
+ export const Application_Destination = createProperty("K8s::Argo::Application.destination", "k8s");
160
+ export const Application_IgnoreDifference = createProperty("K8s::Argo::Application.ignoreDifferences", "k8s");
161
+ export const Application_Info = createProperty("K8s::Argo::Application.info", "k8s");
162
+ export const Application_Source = createProperty("K8s::Argo::Application.source", "k8s");
163
+ export const Application_Sources = createProperty("K8s::Argo::Application.sources", "k8s");
164
+ export const Application_SyncPolicy = createProperty("K8s::Argo::Application.syncPolicy", "k8s");
165
+ export const ApplicationSet_Generator = createProperty("K8s::Argo::ApplicationSet.generators", "k8s");
166
+ export const ApplicationSet_IgnoreApplicationDifference = createProperty("K8s::Argo::ApplicationSet.ignoreApplicationDifferences", "k8s");
167
+ export const ApplicationSet_PreservedFields = createProperty("K8s::Argo::ApplicationSet.preservedFields", "k8s");
168
+ export const ApplicationSet_Strategy = createProperty("K8s::Argo::ApplicationSet.strategy", "k8s");
169
+ export const ApplicationSet_SyncPolicy = createProperty("K8s::Argo::ApplicationSet.syncPolicy", "k8s");
170
+ export const ApplicationSet_Template = createProperty("K8s::Argo::ApplicationSet.template", "k8s");
171
+ export const AppProject_ClusterResourceBlacklist = createProperty("K8s::Argo::AppProject.clusterResourceBlacklist", "k8s");
172
+ export const AppProject_ClusterResourceWhitelist = createProperty("K8s::Argo::AppProject.clusterResourceWhitelist", "k8s");
173
+ export const AppProject_Destination = createProperty("K8s::Argo::AppProject.destinations", "k8s");
174
+ export const AppProject_DestinationServiceAccount = createProperty("K8s::Argo::AppProject.destinationServiceAccounts", "k8s");
175
+ export const AppProject_NamespaceResourceBlacklist = createProperty("K8s::Argo::AppProject.namespaceResourceBlacklist", "k8s");
176
+ export const AppProject_NamespaceResourceWhitelist = createProperty("K8s::Argo::AppProject.namespaceResourceWhitelist", "k8s");
177
+ export const AppProject_OrphanedResources = createProperty("K8s::Argo::AppProject.orphanedResources", "k8s");
178
+ export const AppProject_Role = createProperty("K8s::Argo::AppProject.roles", "k8s");
179
+ export const AppProject_SignatureKey = createProperty("K8s::Argo::AppProject.signatureKeys", "k8s");
180
+ export const AppProject_SyncWindow = createProperty("K8s::Argo::AppProject.syncWindows", "k8s");
156
181
  export const Capabilities = createProperty("K8s::Core::Capabilities", "k8s");
157
182
  export const ConfigMapKeySelector = createProperty("K8s::Core::ConfigMapKeySelector", "k8s");
158
183
  export const Container = createProperty("K8s::Core::Container", "k8s");
@@ -46,6 +46,137 @@
46
46
  "kind": "property",
47
47
  "lexicon": "k8s"
48
48
  },
49
+ "AppProject": {
50
+ "resourceType": "K8s::Argo::AppProject",
51
+ "kind": "resource",
52
+ "lexicon": "k8s",
53
+ "apiVersion": "argoproj.io/v1alpha1",
54
+ "gvkKind": "AppProject"
55
+ },
56
+ "AppProject_ClusterResourceBlacklist": {
57
+ "resourceType": "K8s::Argo::AppProject.clusterResourceBlacklist",
58
+ "kind": "property",
59
+ "lexicon": "k8s"
60
+ },
61
+ "AppProject_ClusterResourceWhitelist": {
62
+ "resourceType": "K8s::Argo::AppProject.clusterResourceWhitelist",
63
+ "kind": "property",
64
+ "lexicon": "k8s"
65
+ },
66
+ "AppProject_Destination": {
67
+ "resourceType": "K8s::Argo::AppProject.destinations",
68
+ "kind": "property",
69
+ "lexicon": "k8s"
70
+ },
71
+ "AppProject_DestinationServiceAccount": {
72
+ "resourceType": "K8s::Argo::AppProject.destinationServiceAccounts",
73
+ "kind": "property",
74
+ "lexicon": "k8s"
75
+ },
76
+ "AppProject_NamespaceResourceBlacklist": {
77
+ "resourceType": "K8s::Argo::AppProject.namespaceResourceBlacklist",
78
+ "kind": "property",
79
+ "lexicon": "k8s"
80
+ },
81
+ "AppProject_NamespaceResourceWhitelist": {
82
+ "resourceType": "K8s::Argo::AppProject.namespaceResourceWhitelist",
83
+ "kind": "property",
84
+ "lexicon": "k8s"
85
+ },
86
+ "AppProject_OrphanedResources": {
87
+ "resourceType": "K8s::Argo::AppProject.orphanedResources",
88
+ "kind": "property",
89
+ "lexicon": "k8s"
90
+ },
91
+ "AppProject_Role": {
92
+ "resourceType": "K8s::Argo::AppProject.roles",
93
+ "kind": "property",
94
+ "lexicon": "k8s"
95
+ },
96
+ "AppProject_SignatureKey": {
97
+ "resourceType": "K8s::Argo::AppProject.signatureKeys",
98
+ "kind": "property",
99
+ "lexicon": "k8s"
100
+ },
101
+ "AppProject_SyncWindow": {
102
+ "resourceType": "K8s::Argo::AppProject.syncWindows",
103
+ "kind": "property",
104
+ "lexicon": "k8s"
105
+ },
106
+ "Application": {
107
+ "resourceType": "K8s::Argo::Application",
108
+ "kind": "resource",
109
+ "lexicon": "k8s",
110
+ "apiVersion": "argoproj.io/v1alpha1",
111
+ "gvkKind": "Application"
112
+ },
113
+ "ApplicationSet": {
114
+ "resourceType": "K8s::Argo::ApplicationSet",
115
+ "kind": "resource",
116
+ "lexicon": "k8s",
117
+ "apiVersion": "argoproj.io/v1alpha1",
118
+ "gvkKind": "ApplicationSet"
119
+ },
120
+ "ApplicationSet_Generator": {
121
+ "resourceType": "K8s::Argo::ApplicationSet.generators",
122
+ "kind": "property",
123
+ "lexicon": "k8s"
124
+ },
125
+ "ApplicationSet_IgnoreApplicationDifference": {
126
+ "resourceType": "K8s::Argo::ApplicationSet.ignoreApplicationDifferences",
127
+ "kind": "property",
128
+ "lexicon": "k8s"
129
+ },
130
+ "ApplicationSet_PreservedFields": {
131
+ "resourceType": "K8s::Argo::ApplicationSet.preservedFields",
132
+ "kind": "property",
133
+ "lexicon": "k8s"
134
+ },
135
+ "ApplicationSet_Strategy": {
136
+ "resourceType": "K8s::Argo::ApplicationSet.strategy",
137
+ "kind": "property",
138
+ "lexicon": "k8s"
139
+ },
140
+ "ApplicationSet_SyncPolicy": {
141
+ "resourceType": "K8s::Argo::ApplicationSet.syncPolicy",
142
+ "kind": "property",
143
+ "lexicon": "k8s"
144
+ },
145
+ "ApplicationSet_Template": {
146
+ "resourceType": "K8s::Argo::ApplicationSet.template",
147
+ "kind": "property",
148
+ "lexicon": "k8s"
149
+ },
150
+ "Application_Destination": {
151
+ "resourceType": "K8s::Argo::Application.destination",
152
+ "kind": "property",
153
+ "lexicon": "k8s"
154
+ },
155
+ "Application_IgnoreDifference": {
156
+ "resourceType": "K8s::Argo::Application.ignoreDifferences",
157
+ "kind": "property",
158
+ "lexicon": "k8s"
159
+ },
160
+ "Application_Info": {
161
+ "resourceType": "K8s::Argo::Application.info",
162
+ "kind": "property",
163
+ "lexicon": "k8s"
164
+ },
165
+ "Application_Source": {
166
+ "resourceType": "K8s::Argo::Application.source",
167
+ "kind": "property",
168
+ "lexicon": "k8s"
169
+ },
170
+ "Application_Sources": {
171
+ "resourceType": "K8s::Argo::Application.sources",
172
+ "kind": "property",
173
+ "lexicon": "k8s"
174
+ },
175
+ "Application_SyncPolicy": {
176
+ "resourceType": "K8s::Argo::Application.syncPolicy",
177
+ "kind": "property",
178
+ "lexicon": "k8s"
179
+ },
49
180
  "AutoscalerOptions": {
50
181
  "resourceType": "K8s::Ray::RayCluster.autoscalerOptions",
51
182
  "kind": "property",
@@ -133,6 +264,16 @@
133
264
  "apiVersion": "certificates.k8s.io/v1",
134
265
  "gvkKind": "CertificateSigningRequestList"
135
266
  },
267
+ "ClusterResourceBlacklist": {
268
+ "resourceType": "K8s::Argo::AppProject.clusterResourceBlacklist",
269
+ "kind": "property",
270
+ "lexicon": "k8s"
271
+ },
272
+ "ClusterResourceWhitelist": {
273
+ "resourceType": "K8s::Argo::AppProject.clusterResourceWhitelist",
274
+ "kind": "property",
275
+ "lexicon": "k8s"
276
+ },
136
277
  "ClusterRole": {
137
278
  "resourceType": "K8s::Rbac::ClusterRole",
138
279
  "kind": "resource",
@@ -325,6 +466,11 @@
325
466
  "kind": "property",
326
467
  "lexicon": "k8s"
327
468
  },
469
+ "DestinationServiceAccount": {
470
+ "resourceType": "K8s::Argo::AppProject.destinationServiceAccounts",
471
+ "kind": "property",
472
+ "lexicon": "k8s"
473
+ },
328
474
  "DeviceClass": {
329
475
  "resourceType": "K8s::Resource::DeviceClass",
330
476
  "kind": "resource",
@@ -449,6 +595,11 @@
449
595
  "kind": "property",
450
596
  "lexicon": "k8s"
451
597
  },
598
+ "Generator": {
599
+ "resourceType": "K8s::Argo::ApplicationSet.generators",
600
+ "kind": "property",
601
+ "lexicon": "k8s"
602
+ },
452
603
  "HPA": {
453
604
  "resourceType": "K8s::Autoscaling::HorizontalPodAutoscaler",
454
605
  "kind": "resource",
@@ -509,6 +660,21 @@
509
660
  "apiVersion": "networking.k8s.io/v1beta1",
510
661
  "gvkKind": "IPAddressList"
511
662
  },
663
+ "IgnoreApplicationDifference": {
664
+ "resourceType": "K8s::Argo::ApplicationSet.ignoreApplicationDifferences",
665
+ "kind": "property",
666
+ "lexicon": "k8s"
667
+ },
668
+ "IgnoreDifference": {
669
+ "resourceType": "K8s::Argo::Application.ignoreDifferences",
670
+ "kind": "property",
671
+ "lexicon": "k8s"
672
+ },
673
+ "Info": {
674
+ "resourceType": "K8s::Argo::Application.info",
675
+ "kind": "property",
676
+ "lexicon": "k8s"
677
+ },
512
678
  "Ing": {
513
679
  "resourceType": "K8s::Networking::Ingress",
514
680
  "kind": "resource",
@@ -678,6 +844,16 @@
678
844
  "apiVersion": "v1",
679
845
  "gvkKind": "NamespaceList"
680
846
  },
847
+ "NamespaceResourceBlacklist": {
848
+ "resourceType": "K8s::Argo::AppProject.namespaceResourceBlacklist",
849
+ "kind": "property",
850
+ "lexicon": "k8s"
851
+ },
852
+ "NamespaceResourceWhitelist": {
853
+ "resourceType": "K8s::Argo::AppProject.namespaceResourceWhitelist",
854
+ "kind": "property",
855
+ "lexicon": "k8s"
856
+ },
681
857
  "NetPol": {
682
858
  "resourceType": "K8s::Networking::NetworkPolicy",
683
859
  "kind": "resource",
@@ -756,6 +932,11 @@
756
932
  "kind": "property",
757
933
  "lexicon": "k8s"
758
934
  },
935
+ "OrphanedResources": {
936
+ "resourceType": "K8s::Argo::AppProject.orphanedResources",
937
+ "kind": "property",
938
+ "lexicon": "k8s"
939
+ },
759
940
  "PDB": {
760
941
  "resourceType": "K8s::Policy::PodDisruptionBudget",
761
942
  "kind": "resource",
@@ -899,6 +1080,11 @@
899
1080
  "kind": "property",
900
1081
  "lexicon": "k8s"
901
1082
  },
1083
+ "PreservedFields": {
1084
+ "resourceType": "K8s::Argo::ApplicationSet.preservedFields",
1085
+ "kind": "property",
1086
+ "lexicon": "k8s"
1087
+ },
902
1088
  "PriorityClass": {
903
1089
  "resourceType": "K8s::Scheduling::PriorityClass",
904
1090
  "kind": "resource",
@@ -1330,6 +1516,21 @@
1330
1516
  }
1331
1517
  }
1332
1518
  },
1519
+ "SignatureKey": {
1520
+ "resourceType": "K8s::Argo::AppProject.signatureKeys",
1521
+ "kind": "property",
1522
+ "lexicon": "k8s"
1523
+ },
1524
+ "Source": {
1525
+ "resourceType": "K8s::Argo::Application.source",
1526
+ "kind": "property",
1527
+ "lexicon": "k8s"
1528
+ },
1529
+ "Sources": {
1530
+ "resourceType": "K8s::Argo::Application.sources",
1531
+ "kind": "property",
1532
+ "lexicon": "k8s"
1533
+ },
1333
1534
  "StatefulSet": {
1334
1535
  "resourceType": "K8s::Apps::StatefulSet",
1335
1536
  "kind": "resource",
@@ -1370,6 +1571,11 @@
1370
1571
  "apiVersion": "storage.k8s.io/v1",
1371
1572
  "gvkKind": "StorageClassList"
1372
1573
  },
1574
+ "Strategy": {
1575
+ "resourceType": "K8s::Argo::ApplicationSet.strategy",
1576
+ "kind": "property",
1577
+ "lexicon": "k8s"
1578
+ },
1373
1579
  "Subject": {
1374
1580
  "resourceType": "K8s::Rbac::Subject",
1375
1581
  "kind": "property",
@@ -1392,11 +1598,21 @@
1392
1598
  "kind": "property",
1393
1599
  "lexicon": "k8s"
1394
1600
  },
1601
+ "SyncWindow": {
1602
+ "resourceType": "K8s::Argo::AppProject.syncWindows",
1603
+ "kind": "property",
1604
+ "lexicon": "k8s"
1605
+ },
1395
1606
  "TCPSocketAction": {
1396
1607
  "resourceType": "K8s::Core::TCPSocketAction",
1397
1608
  "kind": "property",
1398
1609
  "lexicon": "k8s"
1399
1610
  },
1611
+ "Template": {
1612
+ "resourceType": "K8s::Argo::ApplicationSet.template",
1613
+ "kind": "property",
1614
+ "lexicon": "k8s"
1615
+ },
1400
1616
  "TokenRequest": {
1401
1617
  "resourceType": "K8s::Authentication::TokenRequest",
1402
1618
  "kind": "resource",