kustodian 1.0.0
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/LICENSE +21 -0
- package/README.md +346 -0
- package/dist/cli/bin.d.ts +3 -0
- package/dist/cli/bin.d.ts.map +1 -0
- package/dist/cli/bin.js +67 -0
- package/dist/cli/bin.js.map +1 -0
- package/dist/cli/command.d.ts +57 -0
- package/dist/cli/command.d.ts.map +1 -0
- package/dist/cli/command.js +26 -0
- package/dist/cli/command.js.map +1 -0
- package/dist/cli/commands/apply.d.ts +8 -0
- package/dist/cli/commands/apply.d.ts.map +1 -0
- package/dist/cli/commands/apply.js +802 -0
- package/dist/cli/commands/apply.js.map +1 -0
- package/dist/cli/commands/init.d.ts +5 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +403 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/sources.d.ts +5 -0
- package/dist/cli/commands/sources.d.ts.map +1 -0
- package/dist/cli/commands/sources.js +377 -0
- package/dist/cli/commands/sources.js.map +1 -0
- package/dist/cli/commands/update.d.ts +5 -0
- package/dist/cli/commands/update.d.ts.map +1 -0
- package/dist/cli/commands/update.js +314 -0
- package/dist/cli/commands/update.js.map +1 -0
- package/dist/cli/commands/validate.d.ts +5 -0
- package/dist/cli/commands/validate.d.ts.map +1 -0
- package/dist/cli/commands/validate.js +126 -0
- package/dist/cli/commands/validate.js.map +1 -0
- package/dist/cli/container.d.ts +48 -0
- package/dist/cli/container.d.ts.map +1 -0
- package/dist/cli/container.js +49 -0
- package/dist/cli/container.js.map +1 -0
- package/dist/cli/index.d.ts +8 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +9 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/middleware.d.ts +118 -0
- package/dist/cli/middleware.d.ts.map +1 -0
- package/dist/cli/middleware.js +280 -0
- package/dist/cli/middleware.js.map +1 -0
- package/dist/cli/runner.d.ts +34 -0
- package/dist/cli/runner.d.ts.map +1 -0
- package/dist/cli/runner.js +156 -0
- package/dist/cli/runner.js.map +1 -0
- package/dist/cli/utils/defaults.d.ts +23 -0
- package/dist/cli/utils/defaults.d.ts.map +1 -0
- package/dist/cli/utils/defaults.js +43 -0
- package/dist/cli/utils/defaults.js.map +1 -0
- package/dist/core/error.d.ts +117 -0
- package/dist/core/error.d.ts.map +1 -0
- package/dist/core/error.js +210 -0
- package/dist/core/error.js.map +1 -0
- package/dist/core/index.d.ts +6 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +6 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/logger.d.ts +31 -0
- package/dist/core/logger.d.ts.map +1 -0
- package/dist/core/logger.js +78 -0
- package/dist/core/logger.js.map +1 -0
- package/dist/core/path.d.ts +57 -0
- package/dist/core/path.d.ts.map +1 -0
- package/dist/core/path.js +154 -0
- package/dist/core/path.js.map +1 -0
- package/dist/core/result.d.ts +80 -0
- package/dist/core/result.d.ts.map +1 -0
- package/dist/core/result.js +150 -0
- package/dist/core/result.js.map +1 -0
- package/dist/core/types.d.ts +80 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +5 -0
- package/dist/core/types.js.map +1 -0
- package/dist/generator/external-substitutions.d.ts +21 -0
- package/dist/generator/external-substitutions.d.ts.map +1 -0
- package/dist/generator/external-substitutions.js +49 -0
- package/dist/generator/external-substitutions.js.map +1 -0
- package/dist/generator/flux.d.ts +61 -0
- package/dist/generator/flux.d.ts.map +1 -0
- package/dist/generator/flux.js +294 -0
- package/dist/generator/flux.js.map +1 -0
- package/dist/generator/generator.d.ts +77 -0
- package/dist/generator/generator.d.ts.map +1 -0
- package/dist/generator/generator.js +183 -0
- package/dist/generator/generator.js.map +1 -0
- package/dist/generator/index.d.ts +9 -0
- package/dist/generator/index.d.ts.map +1 -0
- package/dist/generator/index.js +9 -0
- package/dist/generator/index.js.map +1 -0
- package/dist/generator/kustomization-resolution.d.ts +40 -0
- package/dist/generator/kustomization-resolution.d.ts.map +1 -0
- package/dist/generator/kustomization-resolution.js +59 -0
- package/dist/generator/kustomization-resolution.js.map +1 -0
- package/dist/generator/namespace.d.ts +74 -0
- package/dist/generator/namespace.d.ts.map +1 -0
- package/dist/generator/namespace.js +109 -0
- package/dist/generator/namespace.js.map +1 -0
- package/dist/generator/output.d.ts +56 -0
- package/dist/generator/output.d.ts.map +1 -0
- package/dist/generator/output.js +171 -0
- package/dist/generator/output.js.map +1 -0
- package/dist/generator/preservation.d.ts +45 -0
- package/dist/generator/preservation.d.ts.map +1 -0
- package/dist/generator/preservation.js +71 -0
- package/dist/generator/preservation.js.map +1 -0
- package/dist/generator/substitution.d.ts +79 -0
- package/dist/generator/substitution.d.ts.map +1 -0
- package/dist/generator/substitution.js +210 -0
- package/dist/generator/substitution.js.map +1 -0
- package/dist/generator/types.d.ts +162 -0
- package/dist/generator/types.d.ts.map +1 -0
- package/dist/generator/types.js +2 -0
- package/dist/generator/types.js.map +1 -0
- package/dist/generator/validation/cycle-detection.d.ts +25 -0
- package/dist/generator/validation/cycle-detection.d.ts.map +1 -0
- package/dist/generator/validation/cycle-detection.js +101 -0
- package/dist/generator/validation/cycle-detection.js.map +1 -0
- package/dist/generator/validation/enablement.d.ts +24 -0
- package/dist/generator/validation/enablement.d.ts.map +1 -0
- package/dist/generator/validation/enablement.js +69 -0
- package/dist/generator/validation/enablement.js.map +1 -0
- package/dist/generator/validation/graph.d.ts +29 -0
- package/dist/generator/validation/graph.d.ts.map +1 -0
- package/dist/generator/validation/graph.js +106 -0
- package/dist/generator/validation/graph.js.map +1 -0
- package/dist/generator/validation/index.d.ts +38 -0
- package/dist/generator/validation/index.d.ts.map +1 -0
- package/dist/generator/validation/index.js +64 -0
- package/dist/generator/validation/index.js.map +1 -0
- package/dist/generator/validation/reference.d.ts +45 -0
- package/dist/generator/validation/reference.d.ts.map +1 -0
- package/dist/generator/validation/reference.js +143 -0
- package/dist/generator/validation/reference.js.map +1 -0
- package/dist/generator/validation/requirements.d.ts +25 -0
- package/dist/generator/validation/requirements.d.ts.map +1 -0
- package/dist/generator/validation/requirements.js +64 -0
- package/dist/generator/validation/requirements.js.map +1 -0
- package/dist/generator/validation/types.d.ts +116 -0
- package/dist/generator/validation/types.d.ts.map +1 -0
- package/dist/generator/validation/types.js +13 -0
- package/dist/generator/validation/types.js.map +1 -0
- package/dist/k8s/exec.d.ts +20 -0
- package/dist/k8s/exec.d.ts.map +1 -0
- package/dist/k8s/exec.js +47 -0
- package/dist/k8s/exec.js.map +1 -0
- package/dist/k8s/flux.d.ts +57 -0
- package/dist/k8s/flux.d.ts.map +1 -0
- package/dist/k8s/flux.js +202 -0
- package/dist/k8s/flux.js.map +1 -0
- package/dist/k8s/index.d.ts +6 -0
- package/dist/k8s/index.d.ts.map +1 -0
- package/dist/k8s/index.js +6 -0
- package/dist/k8s/index.js.map +1 -0
- package/dist/k8s/kubeconfig.d.ts +45 -0
- package/dist/k8s/kubeconfig.d.ts.map +1 -0
- package/dist/k8s/kubeconfig.js +152 -0
- package/dist/k8s/kubeconfig.js.map +1 -0
- package/dist/k8s/kubectl.d.ts +68 -0
- package/dist/k8s/kubectl.d.ts.map +1 -0
- package/dist/k8s/kubectl.js +187 -0
- package/dist/k8s/kubectl.js.map +1 -0
- package/dist/k8s/types.d.ts +65 -0
- package/dist/k8s/types.d.ts.map +1 -0
- package/dist/k8s/types.js +2 -0
- package/dist/k8s/types.js.map +1 -0
- package/dist/loader/file.d.ts +39 -0
- package/dist/loader/file.d.ts.map +1 -0
- package/dist/loader/file.js +121 -0
- package/dist/loader/file.js.map +1 -0
- package/dist/loader/index.d.ts +5 -0
- package/dist/loader/index.d.ts.map +1 -0
- package/dist/loader/index.js +5 -0
- package/dist/loader/index.js.map +1 -0
- package/dist/loader/profile.d.ts +23 -0
- package/dist/loader/profile.d.ts.map +1 -0
- package/dist/loader/profile.js +84 -0
- package/dist/loader/profile.js.map +1 -0
- package/dist/loader/project.d.ts +76 -0
- package/dist/loader/project.d.ts.map +1 -0
- package/dist/loader/project.js +279 -0
- package/dist/loader/project.js.map +1 -0
- package/dist/loader/yaml.d.ts +15 -0
- package/dist/loader/yaml.d.ts.map +1 -0
- package/dist/loader/yaml.js +44 -0
- package/dist/loader/yaml.js.map +1 -0
- package/dist/nodes/index.d.ts +5 -0
- package/dist/nodes/index.d.ts.map +1 -0
- package/dist/nodes/index.js +5 -0
- package/dist/nodes/index.js.map +1 -0
- package/dist/nodes/kubectl-labeler.d.ts +7 -0
- package/dist/nodes/kubectl-labeler.d.ts.map +1 -0
- package/dist/nodes/kubectl-labeler.js +89 -0
- package/dist/nodes/kubectl-labeler.js.map +1 -0
- package/dist/nodes/labeler.d.ts +74 -0
- package/dist/nodes/labeler.d.ts.map +1 -0
- package/dist/nodes/labeler.js +118 -0
- package/dist/nodes/labeler.js.map +1 -0
- package/dist/nodes/profile.d.ts +58 -0
- package/dist/nodes/profile.d.ts.map +1 -0
- package/dist/nodes/profile.js +128 -0
- package/dist/nodes/profile.js.map +1 -0
- package/dist/nodes/types.d.ts +84 -0
- package/dist/nodes/types.d.ts.map +1 -0
- package/dist/nodes/types.js +77 -0
- package/dist/nodes/types.js.map +1 -0
- package/dist/plugins/generators.d.ts +49 -0
- package/dist/plugins/generators.d.ts.map +1 -0
- package/dist/plugins/generators.js +7 -0
- package/dist/plugins/generators.js.map +1 -0
- package/dist/plugins/hooks.d.ts +120 -0
- package/dist/plugins/hooks.d.ts.map +1 -0
- package/dist/plugins/hooks.js +41 -0
- package/dist/plugins/hooks.js.map +1 -0
- package/dist/plugins/index.d.ts +8 -0
- package/dist/plugins/index.d.ts.map +1 -0
- package/dist/plugins/index.js +15 -0
- package/dist/plugins/index.js.map +1 -0
- package/dist/plugins/loader.d.ts +40 -0
- package/dist/plugins/loader.d.ts.map +1 -0
- package/dist/plugins/loader.js +236 -0
- package/dist/plugins/loader.js.map +1 -0
- package/dist/plugins/object-types.d.ts +71 -0
- package/dist/plugins/object-types.d.ts.map +1 -0
- package/dist/plugins/object-types.js +65 -0
- package/dist/plugins/object-types.js.map +1 -0
- package/dist/plugins/registry.d.ts +87 -0
- package/dist/plugins/registry.d.ts.map +1 -0
- package/dist/plugins/registry.js +158 -0
- package/dist/plugins/registry.js.map +1 -0
- package/dist/plugins/substitution-providers.d.ts +48 -0
- package/dist/plugins/substitution-providers.d.ts.map +1 -0
- package/dist/plugins/substitution-providers.js +2 -0
- package/dist/plugins/substitution-providers.js.map +1 -0
- package/dist/plugins/types.d.ts +288 -0
- package/dist/plugins/types.d.ts.map +1 -0
- package/dist/plugins/types.js +25 -0
- package/dist/plugins/types.js.map +1 -0
- package/dist/registry/auth.d.ts +14 -0
- package/dist/registry/auth.d.ts.map +1 -0
- package/dist/registry/auth.js +40 -0
- package/dist/registry/auth.js.map +1 -0
- package/dist/registry/client.d.ts +24 -0
- package/dist/registry/client.d.ts.map +1 -0
- package/dist/registry/client.js +85 -0
- package/dist/registry/client.js.map +1 -0
- package/dist/registry/dockerhub.d.ts +6 -0
- package/dist/registry/dockerhub.d.ts.map +1 -0
- package/dist/registry/dockerhub.js +91 -0
- package/dist/registry/dockerhub.js.map +1 -0
- package/dist/registry/ghcr.d.ts +6 -0
- package/dist/registry/ghcr.d.ts.map +1 -0
- package/dist/registry/ghcr.js +95 -0
- package/dist/registry/ghcr.js.map +1 -0
- package/dist/registry/helm.d.ts +11 -0
- package/dist/registry/helm.d.ts.map +1 -0
- package/dist/registry/helm.js +124 -0
- package/dist/registry/helm.js.map +1 -0
- package/dist/registry/index.d.ts +8 -0
- package/dist/registry/index.d.ts.map +1 -0
- package/dist/registry/index.js +12 -0
- package/dist/registry/index.js.map +1 -0
- package/dist/registry/types.d.ts +55 -0
- package/dist/registry/types.d.ts.map +1 -0
- package/dist/registry/types.js +2 -0
- package/dist/registry/types.js.map +1 -0
- package/dist/registry/version.d.ts +22 -0
- package/dist/registry/version.d.ts.map +1 -0
- package/dist/registry/version.js +62 -0
- package/dist/registry/version.js.map +1 -0
- package/dist/schema/cluster.d.ts +2890 -0
- package/dist/schema/cluster.d.ts.map +1 -0
- package/dist/schema/cluster.js +231 -0
- package/dist/schema/cluster.js.map +1 -0
- package/dist/schema/common.d.ts +1059 -0
- package/dist/schema/common.d.ts.map +1 -0
- package/dist/schema/common.js +340 -0
- package/dist/schema/common.js.map +1 -0
- package/dist/schema/index.d.ts +8 -0
- package/dist/schema/index.d.ts.map +1 -0
- package/dist/schema/index.js +8 -0
- package/dist/schema/index.js.map +1 -0
- package/dist/schema/node-list.d.ts +361 -0
- package/dist/schema/node-list.d.ts.map +1 -0
- package/dist/schema/node-list.js +104 -0
- package/dist/schema/node-list.js.map +1 -0
- package/dist/schema/profile.d.ts +166 -0
- package/dist/schema/profile.d.ts.map +1 -0
- package/dist/schema/profile.js +61 -0
- package/dist/schema/profile.js.map +1 -0
- package/dist/schema/project.d.ts +168 -0
- package/dist/schema/project.d.ts.map +1 -0
- package/dist/schema/project.js +40 -0
- package/dist/schema/project.js.map +1 -0
- package/dist/schema/sources.d.ts +338 -0
- package/dist/schema/sources.d.ts.map +1 -0
- package/dist/schema/sources.js +111 -0
- package/dist/schema/sources.js.map +1 -0
- package/dist/schema/template.d.ts +2711 -0
- package/dist/schema/template.d.ts.map +1 -0
- package/dist/schema/template.js +97 -0
- package/dist/schema/template.js.map +1 -0
- package/dist/sources/cache/index.d.ts +9 -0
- package/dist/sources/cache/index.d.ts.map +1 -0
- package/dist/sources/cache/index.js +278 -0
- package/dist/sources/cache/index.js.map +1 -0
- package/dist/sources/cache/metadata.d.ts +36 -0
- package/dist/sources/cache/metadata.d.ts.map +1 -0
- package/dist/sources/cache/metadata.js +21 -0
- package/dist/sources/cache/metadata.js.map +1 -0
- package/dist/sources/cache/ttl.d.ts +20 -0
- package/dist/sources/cache/ttl.d.ts.map +1 -0
- package/dist/sources/cache/ttl.js +53 -0
- package/dist/sources/cache/ttl.js.map +1 -0
- package/dist/sources/fetchers/git.d.ts +6 -0
- package/dist/sources/fetchers/git.d.ts.map +1 -0
- package/dist/sources/fetchers/git.js +165 -0
- package/dist/sources/fetchers/git.js.map +1 -0
- package/dist/sources/fetchers/http.d.ts +6 -0
- package/dist/sources/fetchers/http.d.ts.map +1 -0
- package/dist/sources/fetchers/http.js +159 -0
- package/dist/sources/fetchers/http.js.map +1 -0
- package/dist/sources/fetchers/index.d.ts +11 -0
- package/dist/sources/fetchers/index.d.ts.map +1 -0
- package/dist/sources/fetchers/index.js +24 -0
- package/dist/sources/fetchers/index.js.map +1 -0
- package/dist/sources/fetchers/oci.d.ts +6 -0
- package/dist/sources/fetchers/oci.d.ts.map +1 -0
- package/dist/sources/fetchers/oci.js +156 -0
- package/dist/sources/fetchers/oci.js.map +1 -0
- package/dist/sources/fetchers/types.d.ts +25 -0
- package/dist/sources/fetchers/types.d.ts.map +1 -0
- package/dist/sources/fetchers/types.js +2 -0
- package/dist/sources/fetchers/types.js.map +1 -0
- package/dist/sources/index.d.ts +6 -0
- package/dist/sources/index.d.ts.map +1 -0
- package/dist/sources/index.js +10 -0
- package/dist/sources/index.js.map +1 -0
- package/dist/sources/loader.d.ts +34 -0
- package/dist/sources/loader.d.ts.map +1 -0
- package/dist/sources/loader.js +89 -0
- package/dist/sources/loader.js.map +1 -0
- package/dist/sources/resolver.d.ts +17 -0
- package/dist/sources/resolver.d.ts.map +1 -0
- package/dist/sources/resolver.js +125 -0
- package/dist/sources/resolver.js.map +1 -0
- package/dist/sources/types.d.ts +151 -0
- package/dist/sources/types.d.ts.map +1 -0
- package/dist/sources/types.js +2 -0
- package/dist/sources/types.js.map +1 -0
- package/package.json +101 -0
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
import { exec } from 'node:child_process';
|
|
2
|
+
import * as fs from 'node:fs/promises';
|
|
3
|
+
import * as os from 'node:os';
|
|
4
|
+
import * as path from 'node:path';
|
|
5
|
+
import { promisify } from 'node:util';
|
|
6
|
+
import { Errors, failure, success, } from '../../core/index.js';
|
|
7
|
+
import { is_git_source } from '../../schema/index.js';
|
|
8
|
+
const exec_async = promisify(exec);
|
|
9
|
+
const DEFAULT_TIMEOUT = 120_000; // 2 minutes
|
|
10
|
+
/**
|
|
11
|
+
* Creates a Git source fetcher.
|
|
12
|
+
*/
|
|
13
|
+
export function create_git_fetcher() {
|
|
14
|
+
return new GitFetcher();
|
|
15
|
+
}
|
|
16
|
+
class GitFetcher {
|
|
17
|
+
type = 'git';
|
|
18
|
+
is_mutable(source) {
|
|
19
|
+
if (!is_git_source(source))
|
|
20
|
+
return true;
|
|
21
|
+
// Branches are mutable, tags and commits are immutable
|
|
22
|
+
return source.git.ref.branch !== undefined;
|
|
23
|
+
}
|
|
24
|
+
async fetch(source, options) {
|
|
25
|
+
if (!is_git_source(source)) {
|
|
26
|
+
return failure(Errors.invalid_argument('source', 'Expected a git source'));
|
|
27
|
+
}
|
|
28
|
+
const { url, ref, path: subpath } = source.git;
|
|
29
|
+
const timeout = options?.timeout ?? DEFAULT_TIMEOUT;
|
|
30
|
+
// Determine the ref to fetch
|
|
31
|
+
const git_ref = ref.branch ?? ref.tag ?? ref.commit;
|
|
32
|
+
if (!git_ref) {
|
|
33
|
+
return failure(Errors.invalid_argument('source', 'No git ref specified'));
|
|
34
|
+
}
|
|
35
|
+
// Create temp directory for clone
|
|
36
|
+
const temp_dir = await fs.mkdtemp(path.join(os.tmpdir(), 'kustodian-git-'));
|
|
37
|
+
try {
|
|
38
|
+
// Clone with depth=1 for efficiency (shallow clone)
|
|
39
|
+
// For commits, we need a full clone to checkout specific commits
|
|
40
|
+
const is_commit = ref.commit !== undefined;
|
|
41
|
+
const depth_flag = is_commit ? '' : '--depth=1';
|
|
42
|
+
const branch_flag = ref.branch || ref.tag ? `--branch=${git_ref}` : '';
|
|
43
|
+
const clone_cmd = `git clone ${depth_flag} ${branch_flag} --single-branch "${url}" "${temp_dir}"`.trim();
|
|
44
|
+
await this.exec_git(clone_cmd, timeout, source.name);
|
|
45
|
+
// If fetching a specific commit, checkout that commit
|
|
46
|
+
if (is_commit) {
|
|
47
|
+
await this.exec_git(`git -C "${temp_dir}" checkout ${git_ref}`, timeout, source.name);
|
|
48
|
+
}
|
|
49
|
+
// Get the actual commit SHA for versioning
|
|
50
|
+
const version = await this.get_commit_sha(temp_dir, timeout, source.name);
|
|
51
|
+
if (!version.success) {
|
|
52
|
+
return failure(version.error);
|
|
53
|
+
}
|
|
54
|
+
// Determine final content path
|
|
55
|
+
let content_path = temp_dir;
|
|
56
|
+
if (subpath) {
|
|
57
|
+
content_path = path.join(temp_dir, subpath);
|
|
58
|
+
// Verify subpath exists
|
|
59
|
+
try {
|
|
60
|
+
await fs.access(content_path);
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
return failure(Errors.not_found('path', `${url}:${subpath}`));
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
// Create a clean output directory with just the templates
|
|
67
|
+
const output_dir = await fs.mkdtemp(path.join(os.tmpdir(), 'kustodian-templates-'));
|
|
68
|
+
// Copy content (excluding .git directory)
|
|
69
|
+
await this.copy_excluding_git(content_path, output_dir);
|
|
70
|
+
// Cleanup original clone
|
|
71
|
+
await fs.rm(temp_dir, { recursive: true, force: true });
|
|
72
|
+
return success({
|
|
73
|
+
path: output_dir,
|
|
74
|
+
version: version.value,
|
|
75
|
+
from_cache: false,
|
|
76
|
+
fetched_at: new Date(),
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
catch (error) {
|
|
80
|
+
// Cleanup on error
|
|
81
|
+
await fs.rm(temp_dir, { recursive: true, force: true }).catch(() => { });
|
|
82
|
+
if (error instanceof Error && error.message.includes('Authentication')) {
|
|
83
|
+
return failure(Errors.source_auth_error(source.name, error));
|
|
84
|
+
}
|
|
85
|
+
return failure(Errors.source_fetch_error(source.name, error));
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
async list_versions(source) {
|
|
89
|
+
if (!is_git_source(source)) {
|
|
90
|
+
return failure(Errors.invalid_argument('source', 'Expected a git source'));
|
|
91
|
+
}
|
|
92
|
+
const { url } = source.git;
|
|
93
|
+
try {
|
|
94
|
+
// Use ls-remote to list refs without cloning
|
|
95
|
+
const { stdout } = await exec_async(`git ls-remote --tags --heads "${url}"`, {
|
|
96
|
+
timeout: DEFAULT_TIMEOUT,
|
|
97
|
+
});
|
|
98
|
+
const versions = [];
|
|
99
|
+
for (const line of stdout.split('\n')) {
|
|
100
|
+
if (!line.trim())
|
|
101
|
+
continue;
|
|
102
|
+
const [sha, ref] = line.split('\t');
|
|
103
|
+
if (!sha || !ref)
|
|
104
|
+
continue;
|
|
105
|
+
// Parse ref name
|
|
106
|
+
let version;
|
|
107
|
+
if (ref.startsWith('refs/tags/')) {
|
|
108
|
+
version = ref.replace('refs/tags/', '').replace(/\^{}$/, '');
|
|
109
|
+
}
|
|
110
|
+
else if (ref.startsWith('refs/heads/')) {
|
|
111
|
+
version = ref.replace('refs/heads/', '');
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
continue;
|
|
115
|
+
}
|
|
116
|
+
// Deduplicate (annotated tags appear twice)
|
|
117
|
+
if (!versions.some((v) => v.version === version)) {
|
|
118
|
+
versions.push({
|
|
119
|
+
version,
|
|
120
|
+
digest: sha,
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
return success(versions);
|
|
125
|
+
}
|
|
126
|
+
catch (error) {
|
|
127
|
+
return failure(Errors.source_fetch_error(source.name, error));
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
async exec_git(command, timeout, source_name) {
|
|
131
|
+
try {
|
|
132
|
+
const { stdout } = await exec_async(command, { timeout });
|
|
133
|
+
return success(stdout);
|
|
134
|
+
}
|
|
135
|
+
catch (error) {
|
|
136
|
+
if (error instanceof Error && 'killed' in error && error.killed) {
|
|
137
|
+
return failure(Errors.source_timeout(source_name, timeout));
|
|
138
|
+
}
|
|
139
|
+
throw error;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
async get_commit_sha(repo_path, timeout, source_name) {
|
|
143
|
+
const result = await this.exec_git(`git -C "${repo_path}" rev-parse HEAD`, timeout, source_name);
|
|
144
|
+
if (!result.success)
|
|
145
|
+
return result;
|
|
146
|
+
return success(result.value.trim());
|
|
147
|
+
}
|
|
148
|
+
async copy_excluding_git(src, dest) {
|
|
149
|
+
const entries = await fs.readdir(src, { withFileTypes: true });
|
|
150
|
+
for (const entry of entries) {
|
|
151
|
+
if (entry.name === '.git')
|
|
152
|
+
continue;
|
|
153
|
+
const src_path = path.join(src, entry.name);
|
|
154
|
+
const dest_path = path.join(dest, entry.name);
|
|
155
|
+
if (entry.isDirectory()) {
|
|
156
|
+
await fs.mkdir(dest_path, { recursive: true });
|
|
157
|
+
await this.copy_excluding_git(src_path, dest_path);
|
|
158
|
+
}
|
|
159
|
+
else {
|
|
160
|
+
await fs.copyFile(src_path, dest_path);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
//# sourceMappingURL=git.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git.js","sourceRoot":"","sources":["../../../src/sources/fetchers/git.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAC1C,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EACL,MAAM,EAGN,OAAO,EACP,OAAO,GACR,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAA2B,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAI/E,MAAM,UAAU,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;AAEnC,MAAM,eAAe,GAAG,OAAO,CAAC,CAAC,YAAY;AAE7C;;GAEG;AACH,MAAM,UAAU,kBAAkB;IAChC,OAAO,IAAI,UAAU,EAAE,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU;IACL,IAAI,GAAG,KAAc,CAAC;IAE/B,UAAU,CAAC,MAA0B;QACnC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC;YAAE,OAAO,IAAI,CAAC;QACxC,uDAAuD;QACvD,OAAO,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC;IAC7C,CAAC;IAED,KAAK,CAAC,KAAK,CACT,MAA0B,EAC1B,OAA0B;QAE1B,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3B,OAAO,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,uBAAuB,CAAC,CAAC,CAAC;QAC7E,CAAC;QAED,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC;QAC/C,MAAM,OAAO,GAAG,OAAO,EAAE,OAAO,IAAI,eAAe,CAAC;QAEpD,6BAA6B;QAC7B,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC;QACpD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,sBAAsB,CAAC,CAAC,CAAC;QAC5E,CAAC;QAED,kCAAkC;QAClC,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,gBAAgB,CAAC,CAAC,CAAC;QAE5E,IAAI,CAAC;YACH,oDAAoD;YACpD,iEAAiE;YACjE,MAAM,SAAS,GAAG,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC;YAC3C,MAAM,UAAU,GAAG,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC;YAChD,MAAM,WAAW,GAAG,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,YAAY,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAEvE,MAAM,SAAS,GACb,aAAa,UAAU,IAAI,WAAW,qBAAqB,GAAG,MAAM,QAAQ,GAAG,CAAC,IAAI,EAAE,CAAC;YAEzF,MAAM,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;YAErD,sDAAsD;YACtD,IAAI,SAAS,EAAE,CAAC;gBACd,MAAM,IAAI,CAAC,QAAQ,CAAC,WAAW,QAAQ,cAAc,OAAO,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;YACxF,CAAC;YAED,2CAA2C;YAC3C,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;YAC1E,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;gBACrB,OAAO,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YAChC,CAAC;YAED,+BAA+B;YAC/B,IAAI,YAAY,GAAG,QAAQ,CAAC;YAC5B,IAAI,OAAO,EAAE,CAAC;gBACZ,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;gBAC5C,wBAAwB;gBACxB,IAAI,CAAC;oBACH,MAAM,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;gBAChC,CAAC;gBAAC,MAAM,CAAC;oBACP,OAAO,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,GAAG,GAAG,IAAI,OAAO,EAAE,CAAC,CAAC,CAAC;gBAChE,CAAC;YACH,CAAC;YAED,0DAA0D;YAC1D,MAAM,UAAU,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,sBAAsB,CAAC,CAAC,CAAC;YAEpF,0CAA0C;YAC1C,MAAM,IAAI,CAAC,kBAAkB,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;YAExD,yBAAyB;YACzB,MAAM,EAAE,CAAC,EAAE,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YAExD,OAAO,OAAO,CAAC;gBACb,IAAI,EAAE,UAAU;gBAChB,OAAO,EAAE,OAAO,CAAC,KAAK;gBACtB,UAAU,EAAE,KAAK;gBACjB,UAAU,EAAE,IAAI,IAAI,EAAE;aACvB,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,mBAAmB;YACnB,MAAM,EAAE,CAAC,EAAE,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YAExE,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC;gBACvE,OAAO,OAAO,CAAC,MAAM,CAAC,iBAAiB,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;YAC/D,CAAC;YACD,OAAO,OAAO,CAAC,MAAM,CAAC,kBAAkB,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;QAChE,CAAC;IACH,CAAC;IAED,KAAK,CAAC,aAAa,CACjB,MAA0B;QAE1B,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3B,OAAO,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,uBAAuB,CAAC,CAAC,CAAC;QAC7E,CAAC;QAED,MAAM,EAAE,GAAG,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC;QAE3B,IAAI,CAAC;YACH,6CAA6C;YAC7C,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,iCAAiC,GAAG,GAAG,EAAE;gBAC3E,OAAO,EAAE,eAAe;aACzB,CAAC,CAAC;YAEH,MAAM,QAAQ,GAAwB,EAAE,CAAC;YAEzC,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;gBACtC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;oBAAE,SAAS;gBAE3B,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBACpC,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG;oBAAE,SAAS;gBAE3B,iBAAiB;gBACjB,IAAI,OAAe,CAAC;gBACpB,IAAI,GAAG,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;oBACjC,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;gBAC/D,CAAC;qBAAM,IAAI,GAAG,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;oBACzC,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;gBAC3C,CAAC;qBAAM,CAAC;oBACN,SAAS;gBACX,CAAC;gBAED,4CAA4C;gBAC5C,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,EAAE,CAAC;oBACjD,QAAQ,CAAC,IAAI,CAAC;wBACZ,OAAO;wBACP,MAAM,EAAE,GAAG;qBACZ,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YAED,OAAO,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC3B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,OAAO,CAAC,MAAM,CAAC,kBAAkB,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;QAChE,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,QAAQ,CACpB,OAAe,EACf,OAAe,EACf,WAAmB;QAEnB,IAAI,CAAC;YACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;YAC1D,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC;QACzB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,KAAK,IAAI,QAAQ,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;gBAChE,OAAO,OAAO,CAAC,MAAM,CAAC,cAAc,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;YAC9D,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,cAAc,CAC1B,SAAiB,EACjB,OAAe,EACf,WAAmB;QAEnB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAChC,WAAW,SAAS,kBAAkB,EACtC,OAAO,EACP,WAAW,CACZ,CAAC;QACF,IAAI,CAAC,MAAM,CAAC,OAAO;YAAE,OAAO,MAAM,CAAC;QACnC,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IACtC,CAAC;IAEO,KAAK,CAAC,kBAAkB,CAAC,GAAW,EAAE,IAAY;QACxD,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QAE/D,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM;gBAAE,SAAS;YAEpC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YAC5C,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YAE9C,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;gBACxB,MAAM,EAAE,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC/C,MAAM,IAAI,CAAC,kBAAkB,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;YACrD,CAAC;iBAAM,CAAC;gBACN,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;YACzC,CAAC;QACH,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../../src/sources/fetchers/http.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAMpD;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,iBAAiB,CAEvD"}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
import { exec } from 'node:child_process';
|
|
2
|
+
import * as crypto from 'node:crypto';
|
|
3
|
+
import * as fs from 'node:fs/promises';
|
|
4
|
+
import * as os from 'node:os';
|
|
5
|
+
import * as path from 'node:path';
|
|
6
|
+
import { promisify } from 'node:util';
|
|
7
|
+
import { Errors, failure, success, } from '../../core/index.js';
|
|
8
|
+
import { is_http_source } from '../../schema/index.js';
|
|
9
|
+
const exec_async = promisify(exec);
|
|
10
|
+
const DEFAULT_TIMEOUT = 120_000; // 2 minutes
|
|
11
|
+
/**
|
|
12
|
+
* Creates an HTTP source fetcher.
|
|
13
|
+
*/
|
|
14
|
+
export function create_http_fetcher() {
|
|
15
|
+
return new HttpFetcher();
|
|
16
|
+
}
|
|
17
|
+
class HttpFetcher {
|
|
18
|
+
type = 'http';
|
|
19
|
+
is_mutable(source) {
|
|
20
|
+
if (!is_http_source(source))
|
|
21
|
+
return true;
|
|
22
|
+
// HTTP sources with checksums are immutable (content is verified)
|
|
23
|
+
// Without checksum, we assume mutable
|
|
24
|
+
return source.http.checksum === undefined;
|
|
25
|
+
}
|
|
26
|
+
async fetch(source, options) {
|
|
27
|
+
if (!is_http_source(source)) {
|
|
28
|
+
return failure(Errors.invalid_argument('source', 'Expected an http source'));
|
|
29
|
+
}
|
|
30
|
+
const { url, checksum, headers } = source.http;
|
|
31
|
+
const timeout = options?.timeout ?? DEFAULT_TIMEOUT;
|
|
32
|
+
// Create temp directory for download
|
|
33
|
+
const temp_dir = await fs.mkdtemp(path.join(os.tmpdir(), 'kustodian-http-'));
|
|
34
|
+
const archive_path = path.join(temp_dir, 'archive');
|
|
35
|
+
try {
|
|
36
|
+
// Download the archive
|
|
37
|
+
const controller = new AbortController();
|
|
38
|
+
const timeout_id = setTimeout(() => controller.abort(), timeout);
|
|
39
|
+
const fetch_options = {
|
|
40
|
+
signal: controller.signal,
|
|
41
|
+
};
|
|
42
|
+
if (headers) {
|
|
43
|
+
fetch_options.headers = headers;
|
|
44
|
+
}
|
|
45
|
+
const response = await fetch(url, fetch_options);
|
|
46
|
+
clearTimeout(timeout_id);
|
|
47
|
+
if (!response.ok) {
|
|
48
|
+
if (response.status === 401 || response.status === 403) {
|
|
49
|
+
return failure(Errors.source_auth_error(source.name));
|
|
50
|
+
}
|
|
51
|
+
return failure(Errors.source_fetch_error(source.name, new Error(`HTTP ${response.status}: ${response.statusText}`)));
|
|
52
|
+
}
|
|
53
|
+
// Write to file
|
|
54
|
+
const buffer = await response.arrayBuffer();
|
|
55
|
+
await fs.writeFile(archive_path, new Uint8Array(buffer));
|
|
56
|
+
// Verify checksum if provided
|
|
57
|
+
if (checksum) {
|
|
58
|
+
const verify_result = await this.verify_checksum(archive_path, checksum, source.name);
|
|
59
|
+
if (!verify_result.success) {
|
|
60
|
+
return verify_result;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
// Compute checksum for version identifier
|
|
64
|
+
const actual_checksum = await this.compute_checksum(archive_path);
|
|
65
|
+
// Extract archive
|
|
66
|
+
const extract_dir = path.join(temp_dir, 'extracted');
|
|
67
|
+
await fs.mkdir(extract_dir, { recursive: true });
|
|
68
|
+
const extract_result = await this.extract_archive(archive_path, extract_dir, url, source.name);
|
|
69
|
+
if (!extract_result.success) {
|
|
70
|
+
return extract_result;
|
|
71
|
+
}
|
|
72
|
+
// Find the actual content directory (archives often have a root folder)
|
|
73
|
+
const content_dir = await this.find_content_dir(extract_dir);
|
|
74
|
+
// Create clean output directory
|
|
75
|
+
const output_dir = await fs.mkdtemp(path.join(os.tmpdir(), 'kustodian-templates-'));
|
|
76
|
+
await fs.cp(content_dir, output_dir, { recursive: true });
|
|
77
|
+
// Cleanup
|
|
78
|
+
await fs.rm(temp_dir, { recursive: true, force: true });
|
|
79
|
+
return success({
|
|
80
|
+
path: output_dir,
|
|
81
|
+
version: checksum ?? `sha256:${actual_checksum.slice(0, 16)}`,
|
|
82
|
+
from_cache: false,
|
|
83
|
+
fetched_at: new Date(),
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
catch (error) {
|
|
87
|
+
// Cleanup on error
|
|
88
|
+
await fs.rm(temp_dir, { recursive: true, force: true }).catch(() => { });
|
|
89
|
+
if (error instanceof Error && error.name === 'AbortError') {
|
|
90
|
+
return failure(Errors.source_timeout(source.name, timeout));
|
|
91
|
+
}
|
|
92
|
+
return failure(Errors.source_fetch_error(source.name, error));
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
async list_versions(_source) {
|
|
96
|
+
// HTTP sources don't have version listing capability
|
|
97
|
+
return success([]);
|
|
98
|
+
}
|
|
99
|
+
async verify_checksum(file_path, expected, source_name) {
|
|
100
|
+
// Parse expected checksum (format: algorithm:hash or just hash for sha256)
|
|
101
|
+
const [algorithm, hash] = expected.includes(':')
|
|
102
|
+
? expected.split(':')
|
|
103
|
+
: ['sha256', expected];
|
|
104
|
+
const actual = await this.compute_checksum(file_path, algorithm);
|
|
105
|
+
if (actual.toLowerCase() !== hash.toLowerCase()) {
|
|
106
|
+
return failure(Errors.source_checksum_mismatch(source_name, expected, `${algorithm}:${actual}`));
|
|
107
|
+
}
|
|
108
|
+
return success(undefined);
|
|
109
|
+
}
|
|
110
|
+
async compute_checksum(file_path, algorithm = 'sha256') {
|
|
111
|
+
const content = await fs.readFile(file_path);
|
|
112
|
+
return crypto.createHash(algorithm).update(new Uint8Array(content)).digest('hex');
|
|
113
|
+
}
|
|
114
|
+
async extract_archive(archive_path, dest_dir, url, source_name) {
|
|
115
|
+
const lower_url = url.toLowerCase();
|
|
116
|
+
try {
|
|
117
|
+
if (lower_url.endsWith('.tar.gz') || lower_url.endsWith('.tgz')) {
|
|
118
|
+
await exec_async(`tar -xzf "${archive_path}" -C "${dest_dir}"`);
|
|
119
|
+
}
|
|
120
|
+
else if (lower_url.endsWith('.tar')) {
|
|
121
|
+
await exec_async(`tar -xf "${archive_path}" -C "${dest_dir}"`);
|
|
122
|
+
}
|
|
123
|
+
else if (lower_url.endsWith('.zip')) {
|
|
124
|
+
await exec_async(`unzip -q "${archive_path}" -d "${dest_dir}"`);
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
// Try to detect format from content
|
|
128
|
+
const { stdout } = await exec_async(`file "${archive_path}"`);
|
|
129
|
+
if (stdout.includes('gzip')) {
|
|
130
|
+
await exec_async(`tar -xzf "${archive_path}" -C "${dest_dir}"`);
|
|
131
|
+
}
|
|
132
|
+
else if (stdout.includes('Zip')) {
|
|
133
|
+
await exec_async(`unzip -q "${archive_path}" -d "${dest_dir}"`);
|
|
134
|
+
}
|
|
135
|
+
else if (stdout.includes('tar')) {
|
|
136
|
+
await exec_async(`tar -xf "${archive_path}" -C "${dest_dir}"`);
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
return failure(Errors.invalid_argument('source', `Unknown archive format for ${url}`));
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
return success(undefined);
|
|
143
|
+
}
|
|
144
|
+
catch (error) {
|
|
145
|
+
return failure(Errors.source_fetch_error(source_name, error));
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
async find_content_dir(extract_dir) {
|
|
149
|
+
const entries = await fs.readdir(extract_dir, { withFileTypes: true });
|
|
150
|
+
const dirs = entries.filter((e) => e.isDirectory());
|
|
151
|
+
// If there's exactly one directory, assume it's the content root
|
|
152
|
+
if (dirs.length === 1 && entries.length === 1 && dirs[0]) {
|
|
153
|
+
return path.join(extract_dir, dirs[0].name);
|
|
154
|
+
}
|
|
155
|
+
// Otherwise, use the extract directory itself
|
|
156
|
+
return extract_dir;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
//# sourceMappingURL=http.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../../src/sources/fetchers/http.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export { create_git_fetcher } from './git.js';
|
|
2
|
+
export { create_http_fetcher } from './http.js';
|
|
3
|
+
export { create_oci_fetcher } from './oci.js';
|
|
4
|
+
export type { SourceFetcherType } from './types.js';
|
|
5
|
+
import { type TemplateSourceType } from '../../schema/index.js';
|
|
6
|
+
import type { SourceFetcherType } from './types.js';
|
|
7
|
+
/**
|
|
8
|
+
* Gets the appropriate fetcher for a source type.
|
|
9
|
+
*/
|
|
10
|
+
export declare function get_fetcher_for_source(source: TemplateSourceType): SourceFetcherType;
|
|
11
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/sources/fetchers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAC9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAC9C,YAAY,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEpD,OAAO,EACL,KAAK,kBAAkB,EAIxB,MAAM,uBAAuB,CAAC;AAI/B,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEpD;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,kBAAkB,GAAG,iBAAiB,CAYpF"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export { create_git_fetcher } from './git.js';
|
|
2
|
+
export { create_http_fetcher } from './http.js';
|
|
3
|
+
export { create_oci_fetcher } from './oci.js';
|
|
4
|
+
import { is_git_source, is_http_source, is_oci_source, } from '../../schema/index.js';
|
|
5
|
+
import { create_git_fetcher } from './git.js';
|
|
6
|
+
import { create_http_fetcher } from './http.js';
|
|
7
|
+
import { create_oci_fetcher } from './oci.js';
|
|
8
|
+
/**
|
|
9
|
+
* Gets the appropriate fetcher for a source type.
|
|
10
|
+
*/
|
|
11
|
+
export function get_fetcher_for_source(source) {
|
|
12
|
+
if (is_git_source(source)) {
|
|
13
|
+
return create_git_fetcher();
|
|
14
|
+
}
|
|
15
|
+
if (is_http_source(source)) {
|
|
16
|
+
return create_http_fetcher();
|
|
17
|
+
}
|
|
18
|
+
if (is_oci_source(source)) {
|
|
19
|
+
return create_oci_fetcher();
|
|
20
|
+
}
|
|
21
|
+
// This should never happen due to schema validation
|
|
22
|
+
throw new Error(`Unknown source type for source: ${source.name}`);
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/sources/fetchers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAC9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAG9C,OAAO,EAEL,aAAa,EACb,cAAc,EACd,aAAa,GACd,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAC9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAG9C;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,MAA0B;IAC/D,IAAI,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1B,OAAO,kBAAkB,EAAE,CAAC;IAC9B,CAAC;IACD,IAAI,cAAc,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3B,OAAO,mBAAmB,EAAE,CAAC;IAC/B,CAAC;IACD,IAAI,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1B,OAAO,kBAAkB,EAAE,CAAC;IAC9B,CAAC;IACD,oDAAoD;IACpD,MAAM,IAAI,KAAK,CAAC,mCAAmC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;AACpE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oci.d.ts","sourceRoot":"","sources":["../../../src/sources/fetchers/oci.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAMpD;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,iBAAiB,CAEtD"}
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
import { exec } from 'node:child_process';
|
|
2
|
+
import * as fs from 'node:fs/promises';
|
|
3
|
+
import * as os from 'node:os';
|
|
4
|
+
import * as path from 'node:path';
|
|
5
|
+
import { promisify } from 'node:util';
|
|
6
|
+
import { Errors, failure, success, } from '../../core/index.js';
|
|
7
|
+
import { is_oci_source } from '../../schema/index.js';
|
|
8
|
+
const exec_async = promisify(exec);
|
|
9
|
+
const DEFAULT_TIMEOUT = 120_000; // 2 minutes
|
|
10
|
+
/**
|
|
11
|
+
* Creates an OCI source fetcher.
|
|
12
|
+
*/
|
|
13
|
+
export function create_oci_fetcher() {
|
|
14
|
+
return new OciFetcher();
|
|
15
|
+
}
|
|
16
|
+
class OciFetcher {
|
|
17
|
+
type = 'oci';
|
|
18
|
+
is_mutable(source) {
|
|
19
|
+
if (!is_oci_source(source))
|
|
20
|
+
return true;
|
|
21
|
+
// Digests are immutable, 'latest' tag is mutable, other tags are treated as immutable
|
|
22
|
+
if (source.oci.digest)
|
|
23
|
+
return false;
|
|
24
|
+
return source.oci.tag === 'latest';
|
|
25
|
+
}
|
|
26
|
+
async fetch(source, options) {
|
|
27
|
+
if (!is_oci_source(source)) {
|
|
28
|
+
return failure(Errors.invalid_argument('source', 'Expected an oci source'));
|
|
29
|
+
}
|
|
30
|
+
const { registry, repository, tag, digest } = source.oci;
|
|
31
|
+
const timeout = options?.timeout ?? DEFAULT_TIMEOUT;
|
|
32
|
+
// Build OCI reference
|
|
33
|
+
const ref = digest ?? tag;
|
|
34
|
+
if (!ref) {
|
|
35
|
+
return failure(Errors.invalid_argument('source', 'No OCI tag or digest specified'));
|
|
36
|
+
}
|
|
37
|
+
const oci_ref = `${registry}/${repository}:${ref}`;
|
|
38
|
+
// Create temp directory for pull
|
|
39
|
+
const output_dir = await fs.mkdtemp(path.join(os.tmpdir(), 'kustodian-oci-'));
|
|
40
|
+
try {
|
|
41
|
+
// Try flux first, then oras
|
|
42
|
+
let pull_result = await this.try_flux_pull(oci_ref, output_dir, timeout, source.name);
|
|
43
|
+
if (!pull_result.success && pull_result.error.code === 'SOURCE_FETCH_ERROR') {
|
|
44
|
+
// Flux not available, try oras
|
|
45
|
+
pull_result = await this.try_oras_pull(oci_ref, output_dir, timeout, source.name);
|
|
46
|
+
}
|
|
47
|
+
if (!pull_result.success) {
|
|
48
|
+
return pull_result;
|
|
49
|
+
}
|
|
50
|
+
// Get the actual digest for version identifier
|
|
51
|
+
const version = digest ?? (await this.get_digest(registry, repository, ref, timeout, source.name));
|
|
52
|
+
return success({
|
|
53
|
+
path: output_dir,
|
|
54
|
+
version: version ?? ref,
|
|
55
|
+
from_cache: false,
|
|
56
|
+
fetched_at: new Date(),
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
catch (error) {
|
|
60
|
+
// Cleanup on error
|
|
61
|
+
await fs.rm(output_dir, { recursive: true, force: true }).catch(() => { });
|
|
62
|
+
return failure(Errors.source_fetch_error(source.name, error));
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
async list_versions(source) {
|
|
66
|
+
if (!is_oci_source(source)) {
|
|
67
|
+
return failure(Errors.invalid_argument('source', 'Expected an oci source'));
|
|
68
|
+
}
|
|
69
|
+
const { registry, repository } = source.oci;
|
|
70
|
+
try {
|
|
71
|
+
// Try using oras to list tags
|
|
72
|
+
const { stdout } = await exec_async(`oras repo tags ${registry}/${repository}`, {
|
|
73
|
+
timeout: DEFAULT_TIMEOUT,
|
|
74
|
+
});
|
|
75
|
+
const versions = stdout
|
|
76
|
+
.split('\n')
|
|
77
|
+
.map((line) => line.trim())
|
|
78
|
+
.filter((line) => line.length > 0)
|
|
79
|
+
.map((version) => ({ version }));
|
|
80
|
+
return success(versions);
|
|
81
|
+
}
|
|
82
|
+
catch {
|
|
83
|
+
// If oras fails, try crane
|
|
84
|
+
try {
|
|
85
|
+
const { stdout } = await exec_async(`crane ls ${registry}/${repository}`, {
|
|
86
|
+
timeout: DEFAULT_TIMEOUT,
|
|
87
|
+
});
|
|
88
|
+
const versions = stdout
|
|
89
|
+
.split('\n')
|
|
90
|
+
.map((line) => line.trim())
|
|
91
|
+
.filter((line) => line.length > 0)
|
|
92
|
+
.map((version) => ({ version }));
|
|
93
|
+
return success(versions);
|
|
94
|
+
}
|
|
95
|
+
catch (error) {
|
|
96
|
+
return failure(Errors.source_fetch_error(source.name, error));
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
async try_flux_pull(oci_ref, output_dir, timeout, source_name) {
|
|
101
|
+
try {
|
|
102
|
+
await exec_async(`flux pull artifact oci://${oci_ref} --output="${output_dir}"`, { timeout });
|
|
103
|
+
return success(undefined);
|
|
104
|
+
}
|
|
105
|
+
catch (error) {
|
|
106
|
+
if (error instanceof Error && error.message.includes('not found')) {
|
|
107
|
+
return failure(Errors.source_fetch_error(source_name, new Error('flux CLI not found')));
|
|
108
|
+
}
|
|
109
|
+
if (error instanceof Error && error.message.includes('unauthorized')) {
|
|
110
|
+
return failure(Errors.source_auth_error(source_name, error));
|
|
111
|
+
}
|
|
112
|
+
if (error instanceof Error && 'killed' in error && error.killed) {
|
|
113
|
+
return failure(Errors.source_timeout(source_name, timeout));
|
|
114
|
+
}
|
|
115
|
+
return failure(Errors.source_fetch_error(source_name, error));
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
async try_oras_pull(oci_ref, output_dir, timeout, source_name) {
|
|
119
|
+
try {
|
|
120
|
+
await exec_async(`oras pull ${oci_ref} --output="${output_dir}"`, { timeout });
|
|
121
|
+
return success(undefined);
|
|
122
|
+
}
|
|
123
|
+
catch (error) {
|
|
124
|
+
if (error instanceof Error && error.message.includes('not found')) {
|
|
125
|
+
return failure(Errors.source_fetch_error(source_name, new Error('Neither flux nor oras CLI found')));
|
|
126
|
+
}
|
|
127
|
+
if (error instanceof Error && error.message.includes('unauthorized')) {
|
|
128
|
+
return failure(Errors.source_auth_error(source_name, error));
|
|
129
|
+
}
|
|
130
|
+
if (error instanceof Error && 'killed' in error && error.killed) {
|
|
131
|
+
return failure(Errors.source_timeout(source_name, timeout));
|
|
132
|
+
}
|
|
133
|
+
return failure(Errors.source_fetch_error(source_name, error));
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
async get_digest(registry, repository, tag, timeout, _source_name) {
|
|
137
|
+
try {
|
|
138
|
+
// Try crane first
|
|
139
|
+
const { stdout } = await exec_async(`crane digest ${registry}/${repository}:${tag}`, {
|
|
140
|
+
timeout,
|
|
141
|
+
});
|
|
142
|
+
return stdout.trim();
|
|
143
|
+
}
|
|
144
|
+
catch {
|
|
145
|
+
// If crane fails, try oras
|
|
146
|
+
try {
|
|
147
|
+
const { stdout } = await exec_async(`oras manifest fetch ${registry}/${repository}:${tag} --descriptor | jq -r .digest`, { timeout });
|
|
148
|
+
return stdout.trim() || null;
|
|
149
|
+
}
|
|
150
|
+
catch {
|
|
151
|
+
return null;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
//# sourceMappingURL=oci.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oci.js","sourceRoot":"","sources":["../../../src/sources/fetchers/oci.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { KustodianErrorType, ResultType } from '../../core/index.js';
|
|
2
|
+
import type { TemplateSourceType } from '../../schema/index.js';
|
|
3
|
+
import type { FetchOptionsType, FetchResultType, RemoteVersionType } from '../types.js';
|
|
4
|
+
/**
|
|
5
|
+
* Base interface for source fetchers.
|
|
6
|
+
* Each source type (git, http, oci) implements this interface.
|
|
7
|
+
*/
|
|
8
|
+
export interface SourceFetcherType {
|
|
9
|
+
/** Unique identifier for this fetcher type */
|
|
10
|
+
readonly type: 'git' | 'http' | 'oci';
|
|
11
|
+
/**
|
|
12
|
+
* Fetches templates from the source to a temporary directory.
|
|
13
|
+
* The caller is responsible for caching the result.
|
|
14
|
+
*/
|
|
15
|
+
fetch(source: TemplateSourceType, options?: FetchOptionsType): Promise<ResultType<FetchResultType, KustodianErrorType>>;
|
|
16
|
+
/**
|
|
17
|
+
* Lists available versions from the remote.
|
|
18
|
+
*/
|
|
19
|
+
list_versions(source: TemplateSourceType): Promise<ResultType<RemoteVersionType[], KustodianErrorType>>;
|
|
20
|
+
/**
|
|
21
|
+
* Determines if this source reference is mutable.
|
|
22
|
+
*/
|
|
23
|
+
is_mutable(source: TemplateSourceType): boolean;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/sources/fetchers/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC1E,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,KAAK,EAAE,gBAAgB,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAExF;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAChC,8CAA8C;IAC9C,QAAQ,CAAC,IAAI,EAAE,KAAK,GAAG,MAAM,GAAG,KAAK,CAAC;IAEtC;;;OAGG;IACH,KAAK,CACH,MAAM,EAAE,kBAAkB,EAC1B,OAAO,CAAC,EAAE,gBAAgB,GACzB,OAAO,CAAC,UAAU,CAAC,eAAe,EAAE,kBAAkB,CAAC,CAAC,CAAC;IAE5D;;OAEG;IACH,aAAa,CACX,MAAM,EAAE,kBAAkB,GACzB,OAAO,CAAC,UAAU,CAAC,iBAAiB,EAAE,EAAE,kBAAkB,CAAC,CAAC,CAAC;IAEhE;;OAEG;IACH,UAAU,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC;CACjD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/sources/fetchers/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { type CacheMetaType, cache_meta_schema, calculate_expiry, create_cache_manager, DEFAULT_TTL, is_expired, META_FILENAME, parse_ttl, TEMPLATES_DIRNAME, } from './cache/index.js';
|
|
2
|
+
export { create_git_fetcher, create_http_fetcher, create_oci_fetcher, get_fetcher_for_source, } from './fetchers/index.js';
|
|
3
|
+
export { type LoadedSourcesResultType, type LoadSourcesOptionsType, load_templates_from_sources, type SourcedTemplateType, } from './loader.js';
|
|
4
|
+
export { type CreateResolverOptionsType, create_source_resolver, DEFAULT_CACHE_DIR, } from './resolver.js';
|
|
5
|
+
export type { CacheEntryType, CacheManagerType, FetchOptionsType, FetchResultType, RemoteVersionType, ResolvedSourceType, ResolverOptionsType, SourceFetcherType, SourceResolverType, } from './types.js';
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/sources/index.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,KAAK,aAAa,EAClB,iBAAiB,EACjB,gBAAgB,EAChB,oBAAoB,EACpB,WAAW,EACX,UAAU,EACV,aAAa,EACb,SAAS,EACT,iBAAiB,GAClB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,kBAAkB,EAClB,sBAAsB,GACvB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,KAAK,uBAAuB,EAC5B,KAAK,sBAAsB,EAC3B,2BAA2B,EAC3B,KAAK,mBAAmB,GACzB,MAAM,aAAa,CAAC;AAGrB,OAAO,EACL,KAAK,yBAAyB,EAC9B,sBAAsB,EACtB,iBAAiB,GAClB,MAAM,eAAe,CAAC;AACvB,YAAY,EACV,cAAc,EACd,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,EACf,iBAAiB,EACjB,kBAAkB,EAClB,mBAAmB,EACnB,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,YAAY,CAAC"}
|