@tickernelz/paperclip-pro-plugin-kubernetes 2026.925.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 +22 -0
- package/README.md +180 -0
- package/dist/adapter-defaults.d.ts +29 -0
- package/dist/adapter-defaults.d.ts.map +1 -0
- package/dist/adapter-defaults.js +98 -0
- package/dist/adapter-defaults.js.map +1 -0
- package/dist/adapter-registry.d.ts +64 -0
- package/dist/adapter-registry.d.ts.map +1 -0
- package/dist/adapter-registry.js +25 -0
- package/dist/adapter-registry.js.map +1 -0
- package/dist/cilium-network-policy.d.ts +12 -0
- package/dist/cilium-network-policy.d.ts.map +1 -0
- package/dist/cilium-network-policy.js +60 -0
- package/dist/cilium-network-policy.js.map +1 -0
- package/dist/file-sync.d.ts +73 -0
- package/dist/file-sync.d.ts.map +1 -0
- package/dist/file-sync.js +752 -0
- package/dist/file-sync.js.map +1 -0
- package/dist/image-allowlist.d.ts +18 -0
- package/dist/image-allowlist.d.ts.map +1 -0
- package/dist/image-allowlist.js +39 -0
- package/dist/image-allowlist.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/job-orchestrator.d.ts +24 -0
- package/dist/job-orchestrator.d.ts.map +1 -0
- package/dist/job-orchestrator.js +90 -0
- package/dist/job-orchestrator.js.map +1 -0
- package/dist/kube-client.d.ts +15 -0
- package/dist/kube-client.d.ts.map +1 -0
- package/dist/kube-client.js +23 -0
- package/dist/kube-client.js.map +1 -0
- package/dist/lease-lifecycle.d.ts +62 -0
- package/dist/lease-lifecycle.d.ts.map +1 -0
- package/dist/lease-lifecycle.js +155 -0
- package/dist/lease-lifecycle.js.map +1 -0
- package/dist/manifest.d.ts +4 -0
- package/dist/manifest.d.ts.map +1 -0
- package/dist/manifest.js +108 -0
- package/dist/manifest.js.map +1 -0
- package/dist/network-policy.d.ts +22 -0
- package/dist/network-policy.d.ts.map +1 -0
- package/dist/network-policy.js +116 -0
- package/dist/network-policy.js.map +1 -0
- package/dist/plugin.d.ts +3 -0
- package/dist/plugin.d.ts.map +1 -0
- package/dist/plugin.js +820 -0
- package/dist/plugin.js.map +1 -0
- package/dist/pod-exec.d.ts +67 -0
- package/dist/pod-exec.d.ts.map +1 -0
- package/dist/pod-exec.js +401 -0
- package/dist/pod-exec.js.map +1 -0
- package/dist/pod-spec-builder.d.ts +25 -0
- package/dist/pod-spec-builder.d.ts.map +1 -0
- package/dist/pod-spec-builder.js +82 -0
- package/dist/pod-spec-builder.js.map +1 -0
- package/dist/sandbox-cr-builder.d.ts +40 -0
- package/dist/sandbox-cr-builder.d.ts.map +1 -0
- package/dist/sandbox-cr-builder.js +123 -0
- package/dist/sandbox-cr-builder.js.map +1 -0
- package/dist/sandbox-cr-orchestrator.d.ts +62 -0
- package/dist/sandbox-cr-orchestrator.d.ts.map +1 -0
- package/dist/sandbox-cr-orchestrator.js +248 -0
- package/dist/sandbox-cr-orchestrator.js.map +1 -0
- package/dist/sandbox-orchestrator.d.ts +39 -0
- package/dist/sandbox-orchestrator.d.ts.map +1 -0
- package/dist/sandbox-orchestrator.js +2 -0
- package/dist/sandbox-orchestrator.js.map +1 -0
- package/dist/scoped-network-egress.d.ts +19 -0
- package/dist/scoped-network-egress.d.ts.map +1 -0
- package/dist/scoped-network-egress.js +86 -0
- package/dist/scoped-network-egress.js.map +1 -0
- package/dist/secret-manager.d.ts +14 -0
- package/dist/secret-manager.d.ts.map +1 -0
- package/dist/secret-manager.js +39 -0
- package/dist/secret-manager.js.map +1 -0
- package/dist/tenant-orchestrator.d.ts +35 -0
- package/dist/tenant-orchestrator.d.ts.map +1 -0
- package/dist/tenant-orchestrator.js +263 -0
- package/dist/tenant-orchestrator.js.map +1 -0
- package/dist/types.d.ts +279 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +65 -0
- package/dist/types.js.map +1 -0
- package/dist/upload-interceptor.d.ts +44 -0
- package/dist/upload-interceptor.d.ts.map +1 -0
- package/dist/upload-interceptor.js +114 -0
- package/dist/upload-interceptor.js.map +1 -0
- package/dist/utils.d.ts +11 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +51 -0
- package/dist/utils.js.map +1 -0
- package/dist/worker.d.ts +3 -0
- package/dist/worker.d.ts.map +1 -0
- package/dist/worker.js +5 -0
- package/dist/worker.js.map +1 -0
- package/manifests/operator-prerequisites.yaml +22 -0
- package/package.json +47 -0
package/dist/manifest.js
ADDED
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
const PLUGIN_ID = "paperclip.kubernetes-sandbox-provider";
|
|
2
|
+
const PLUGIN_VERSION = "0.1.0-alpha.1";
|
|
3
|
+
const manifest = {
|
|
4
|
+
id: PLUGIN_ID,
|
|
5
|
+
apiVersion: 1,
|
|
6
|
+
version: PLUGIN_VERSION,
|
|
7
|
+
displayName: "Kubernetes Sandbox (alpha)",
|
|
8
|
+
description: "Built on kubernetes-sigs/agent-sandbox (v1alpha1). ALPHA — expect breaking changes as the upstream CRD evolves. Falls back to stable batch/v1 Job mode for clusters without agent-sandbox installed. First-party Paperclip sandbox-provider plugin for Kubernetes.",
|
|
9
|
+
author: "Paperclip",
|
|
10
|
+
categories: ["automation"],
|
|
11
|
+
capabilities: ["environment.drivers.register"],
|
|
12
|
+
entrypoints: {
|
|
13
|
+
worker: "./dist/worker.js",
|
|
14
|
+
},
|
|
15
|
+
environmentDrivers: [
|
|
16
|
+
{
|
|
17
|
+
driverKey: "kubernetes",
|
|
18
|
+
kind: "sandbox_provider",
|
|
19
|
+
displayName: "Kubernetes",
|
|
20
|
+
description: "Dispatches agent runs in per-tenant Kubernetes namespaces. Default backend (sandbox-cr, alpha) uses kubernetes-sigs/agent-sandbox for multi-command exec; fallback backend (job) uses stable batch/v1 Job for clusters without agent-sandbox installed.",
|
|
21
|
+
configSchema: {
|
|
22
|
+
type: "object",
|
|
23
|
+
properties: {
|
|
24
|
+
inCluster: {
|
|
25
|
+
type: "boolean",
|
|
26
|
+
description: "When true, the plugin uses the in-pod ServiceAccount credentials. Requires paperclip-server to be running inside the target cluster.",
|
|
27
|
+
},
|
|
28
|
+
kubeconfig: {
|
|
29
|
+
type: "string",
|
|
30
|
+
format: "secret-ref",
|
|
31
|
+
description: "Inline kubeconfig YAML. Paste a kubeconfig or an existing Paperclip secret reference; pasted values are stored as company secrets.",
|
|
32
|
+
},
|
|
33
|
+
namespacePrefix: {
|
|
34
|
+
type: "string",
|
|
35
|
+
description: "Prefix for the per-company tenant namespace (default: paperclip-).",
|
|
36
|
+
},
|
|
37
|
+
companySlug: {
|
|
38
|
+
type: "string",
|
|
39
|
+
description: "Override the auto-derived company slug used in the tenant namespace name.",
|
|
40
|
+
},
|
|
41
|
+
imageRegistry: {
|
|
42
|
+
type: "string",
|
|
43
|
+
description: "Override the default registry for agent runtime images (default: ghcr.io/paperclip-pro).",
|
|
44
|
+
},
|
|
45
|
+
imageAllowList: {
|
|
46
|
+
type: "array",
|
|
47
|
+
items: { type: "string" },
|
|
48
|
+
description: "Glob patterns of allowed `target.imageOverride` values. Empty list = no override permitted.",
|
|
49
|
+
},
|
|
50
|
+
imagePullSecrets: {
|
|
51
|
+
type: "array",
|
|
52
|
+
items: { type: "string" },
|
|
53
|
+
description: "Names of pre-created Docker image pull secrets in the tenant namespace.",
|
|
54
|
+
},
|
|
55
|
+
egressAllowFqdns: {
|
|
56
|
+
type: "array",
|
|
57
|
+
items: { type: "string" },
|
|
58
|
+
description: "Additional FQDNs to allow egress to from agent pods. Adapter-default FQDNs (e.g. api.anthropic.com) are added automatically.",
|
|
59
|
+
},
|
|
60
|
+
egressAllowCidrs: {
|
|
61
|
+
type: "array",
|
|
62
|
+
items: { type: "string" },
|
|
63
|
+
description: "Additional CIDRs to allow egress to from agent pods.",
|
|
64
|
+
},
|
|
65
|
+
egressMode: {
|
|
66
|
+
type: "string",
|
|
67
|
+
enum: ["standard", "cilium"],
|
|
68
|
+
description: "Network policy mode. `cilium` enables FQDN-based egress filtering via CiliumNetworkPolicy.",
|
|
69
|
+
},
|
|
70
|
+
runtimeClassName: {
|
|
71
|
+
type: "string",
|
|
72
|
+
description: "Optional RuntimeClass for pod isolation (e.g. `kata-fc` for Firecracker-backed microVMs). Cluster must have the RuntimeClass installed.",
|
|
73
|
+
},
|
|
74
|
+
serviceAccountAnnotations: {
|
|
75
|
+
type: "object",
|
|
76
|
+
additionalProperties: { type: "string" },
|
|
77
|
+
description: "Annotations applied to the per-tenant ServiceAccount (e.g. `eks.amazonaws.com/role-arn` for IRSA).",
|
|
78
|
+
},
|
|
79
|
+
jobTtlSecondsAfterFinished: {
|
|
80
|
+
type: "integer",
|
|
81
|
+
minimum: 0,
|
|
82
|
+
description: "Seconds after a Job completes before it is garbage-collected (default: 900).",
|
|
83
|
+
},
|
|
84
|
+
podActivityDeadlineSec: {
|
|
85
|
+
type: "integer",
|
|
86
|
+
minimum: 1,
|
|
87
|
+
description: "Hard ceiling on a single run's wall-clock time (default: 3600).",
|
|
88
|
+
},
|
|
89
|
+
adapterType: {
|
|
90
|
+
type: "string",
|
|
91
|
+
description: "The adapter type that Jobs in this environment will run (e.g. `claude_local`, `codex_local`). Defaults to `claude_local`. Each environment is bound to one adapter; create multiple environments for different adapters.",
|
|
92
|
+
},
|
|
93
|
+
backend: {
|
|
94
|
+
type: "string",
|
|
95
|
+
enum: ["sandbox-cr", "job"],
|
|
96
|
+
description: "sandbox-cr (default, alpha — requires kubernetes-sigs/agent-sandbox installed) | job (stable fallback — batch/v1 Job, one-shot entrypoint, no multi-command exec)",
|
|
97
|
+
},
|
|
98
|
+
},
|
|
99
|
+
anyOf: [
|
|
100
|
+
{ required: ["inCluster"] },
|
|
101
|
+
{ required: ["kubeconfig"] },
|
|
102
|
+
],
|
|
103
|
+
},
|
|
104
|
+
},
|
|
105
|
+
],
|
|
106
|
+
};
|
|
107
|
+
export default manifest;
|
|
108
|
+
//# sourceMappingURL=manifest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest.js","sourceRoot":"","sources":["../src/manifest.ts"],"names":[],"mappings":"AAEA,MAAM,SAAS,GAAG,uCAAuC,CAAC;AAC1D,MAAM,cAAc,GAAG,eAAe,CAAC;AAEvC,MAAM,QAAQ,GAA8B;IAC1C,EAAE,EAAE,SAAS;IACb,UAAU,EAAE,CAAC;IACb,OAAO,EAAE,cAAc;IACvB,WAAW,EAAE,4BAA4B;IACzC,WAAW,EACT,oQAAoQ;IACtQ,MAAM,EAAE,WAAW;IACnB,UAAU,EAAE,CAAC,YAAY,CAAC;IAC1B,YAAY,EAAE,CAAC,8BAA8B,CAAC;IAC9C,WAAW,EAAE;QACX,MAAM,EAAE,kBAAkB;KAC3B;IACD,kBAAkB,EAAE;QAClB;YACE,SAAS,EAAE,YAAY;YACvB,IAAI,EAAE,kBAAkB;YACxB,WAAW,EAAE,YAAY;YACzB,WAAW,EACT,yPAAyP;YAC3P,YAAY,EAAE;gBACZ,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACV,SAAS,EAAE;wBACT,IAAI,EAAE,SAAS;wBACf,WAAW,EACT,sIAAsI;qBACzI;oBACD,UAAU,EAAE;wBACV,IAAI,EAAE,QAAQ;wBACd,MAAM,EAAE,YAAY;wBACpB,WAAW,EACT,oIAAoI;qBACvI;oBACD,eAAe,EAAE;wBACf,IAAI,EAAE,QAAQ;wBACd,WAAW,EAAE,oEAAoE;qBAClF;oBACD,WAAW,EAAE;wBACX,IAAI,EAAE,QAAQ;wBACd,WAAW,EAAE,2EAA2E;qBACzF;oBACD,aAAa,EAAE;wBACb,IAAI,EAAE,QAAQ;wBACd,WAAW,EAAE,0FAA0F;qBACxG;oBACD,cAAc,EAAE;wBACd,IAAI,EAAE,OAAO;wBACb,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;wBACzB,WAAW,EACT,6FAA6F;qBAChG;oBACD,gBAAgB,EAAE;wBAChB,IAAI,EAAE,OAAO;wBACb,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;wBACzB,WAAW,EAAE,yEAAyE;qBACvF;oBACD,gBAAgB,EAAE;wBAChB,IAAI,EAAE,OAAO;wBACb,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;wBACzB,WAAW,EACT,8HAA8H;qBACjI;oBACD,gBAAgB,EAAE;wBAChB,IAAI,EAAE,OAAO;wBACb,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;wBACzB,WAAW,EAAE,sDAAsD;qBACpE;oBACD,UAAU,EAAE;wBACV,IAAI,EAAE,QAAQ;wBACd,IAAI,EAAE,CAAC,UAAU,EAAE,QAAQ,CAAC;wBAC5B,WAAW,EAAE,4FAA4F;qBAC1G;oBACD,gBAAgB,EAAE;wBAChB,IAAI,EAAE,QAAQ;wBACd,WAAW,EACT,yIAAyI;qBAC5I;oBACD,yBAAyB,EAAE;wBACzB,IAAI,EAAE,QAAQ;wBACd,oBAAoB,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;wBACxC,WAAW,EACT,oGAAoG;qBACvG;oBACD,0BAA0B,EAAE;wBAC1B,IAAI,EAAE,SAAS;wBACf,OAAO,EAAE,CAAC;wBACV,WAAW,EAAE,8EAA8E;qBAC5F;oBACD,sBAAsB,EAAE;wBACtB,IAAI,EAAE,SAAS;wBACf,OAAO,EAAE,CAAC;wBACV,WAAW,EAAE,iEAAiE;qBAC/E;oBACD,WAAW,EAAE;wBACX,IAAI,EAAE,QAAQ;wBACd,WAAW,EACT,0NAA0N;qBAC7N;oBACD,OAAO,EAAE;wBACP,IAAI,EAAE,QAAQ;wBACd,IAAI,EAAE,CAAC,YAAY,EAAE,KAAK,CAAC;wBAC3B,WAAW,EACT,mKAAmK;qBACtK;iBACF;gBACD,KAAK,EAAE;oBACL,EAAE,QAAQ,EAAE,CAAC,WAAW,CAAC,EAAE;oBAC3B,EAAE,QAAQ,EAAE,CAAC,YAAY,CAAC,EAAE;iBAC7B;aACF;SACF;KACF;CACF,CAAC;AAEF,eAAe,QAAQ,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export interface BuildNetworkPolicyInput {
|
|
2
|
+
namespace: string;
|
|
3
|
+
paperclipServerNamespace: string;
|
|
4
|
+
egressAllowCidrs: string[];
|
|
5
|
+
/**
|
|
6
|
+
* Adapter-configured FQDNs (e.g. `api.anthropic.com`). Standard
|
|
7
|
+
* NetworkPolicy cannot express FQDNs natively — only Cilium can.
|
|
8
|
+
* When this list is non-empty AND no explicit `egressAllowCidrs`
|
|
9
|
+
* was provided, the standard NetworkPolicy falls back to "public
|
|
10
|
+
* IPv4 except RFC1918/link-local/loopback/multicast" so the
|
|
11
|
+
* configured FQDNs at least become reachable. This is broader
|
|
12
|
+
* than the operator probably wants — switch to `egressMode:
|
|
13
|
+
* "cilium"` for exact FQDN allow-listing in production.
|
|
14
|
+
*/
|
|
15
|
+
egressAllowFqdns?: string[];
|
|
16
|
+
name?: string;
|
|
17
|
+
podSelector?: Record<string, string>;
|
|
18
|
+
includeBaseRules?: boolean;
|
|
19
|
+
ownerReferences?: Record<string, unknown>[];
|
|
20
|
+
}
|
|
21
|
+
export declare function buildNetworkPolicyManifests(input: BuildNetworkPolicyInput): Record<string, unknown>[];
|
|
22
|
+
//# sourceMappingURL=network-policy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"network-policy.d.ts","sourceRoot":"","sources":["../src/network-policy.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,uBAAuB;IACtC,SAAS,EAAE,MAAM,CAAC;IAClB,wBAAwB,EAAE,MAAM,CAAC;IACjC,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B;;;;;;;;;OASG;IACH,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;CAC7C;AA2BD,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,uBAAuB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CA6FrG"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* IPv4 ranges to carve out of `0.0.0.0/0` when we apply the
|
|
3
|
+
* public-internet fallback. Keeps agent pods from reaching cluster
|
|
4
|
+
* internals (RFC1918), node link-local + AWS IMDS (169.254.0.0/16),
|
|
5
|
+
* cluster loopback (127.0.0.0/8), CGNAT (100.64.0.0/10), this-network
|
|
6
|
+
* (0.0.0.0/8), and multicast (224.0.0.0/4).
|
|
7
|
+
*/
|
|
8
|
+
const PRIVATE_AND_LINK_LOCAL_EXCEPT_CIDRS = [
|
|
9
|
+
"0.0.0.0/8",
|
|
10
|
+
"10.0.0.0/8",
|
|
11
|
+
"100.64.0.0/10",
|
|
12
|
+
"127.0.0.0/8",
|
|
13
|
+
"169.254.0.0/16",
|
|
14
|
+
"172.16.0.0/12",
|
|
15
|
+
"192.168.0.0/16",
|
|
16
|
+
"224.0.0.0/4",
|
|
17
|
+
];
|
|
18
|
+
// Design note: the deny-all baseline blocks all ingress to agent pods.
|
|
19
|
+
// Paperclip-server does NOT push to agent pods — the agent shim makes
|
|
20
|
+
// outbound calls to paperclip-server via the egress allow-list (port 3100).
|
|
21
|
+
// This pull/callback model means no ingress rule is needed. If a future
|
|
22
|
+
// feature requires server→agent push (e.g. forced shutdown, live exec),
|
|
23
|
+
// add a targeted ingress rule here scoped to the paperclip-server pod
|
|
24
|
+
// selector.
|
|
25
|
+
export function buildNetworkPolicyManifests(input) {
|
|
26
|
+
const denyAll = {
|
|
27
|
+
apiVersion: "networking.k8s.io/v1",
|
|
28
|
+
kind: "NetworkPolicy",
|
|
29
|
+
metadata: {
|
|
30
|
+
name: "paperclip-deny-all",
|
|
31
|
+
namespace: input.namespace,
|
|
32
|
+
labels: { "paperclip.io/managed-by": "paperclip-k8s-plugin" },
|
|
33
|
+
},
|
|
34
|
+
spec: {
|
|
35
|
+
podSelector: {},
|
|
36
|
+
policyTypes: ["Ingress", "Egress"],
|
|
37
|
+
},
|
|
38
|
+
};
|
|
39
|
+
const egressAllow = {
|
|
40
|
+
apiVersion: "networking.k8s.io/v1",
|
|
41
|
+
kind: "NetworkPolicy",
|
|
42
|
+
metadata: {
|
|
43
|
+
namespace: input.namespace,
|
|
44
|
+
labels: { "paperclip.io/managed-by": "paperclip-k8s-plugin" },
|
|
45
|
+
},
|
|
46
|
+
spec: {
|
|
47
|
+
podSelector: { matchLabels: input.podSelector ?? { "paperclip.io/role": "agent" } },
|
|
48
|
+
policyTypes: ["Egress"],
|
|
49
|
+
egress: [
|
|
50
|
+
...(input.includeBaseRules === false ? [] : [{
|
|
51
|
+
to: [
|
|
52
|
+
{
|
|
53
|
+
namespaceSelector: { matchLabels: { "kubernetes.io/metadata.name": "kube-system" } },
|
|
54
|
+
podSelector: { matchLabels: { "k8s-app": "kube-dns" } },
|
|
55
|
+
},
|
|
56
|
+
],
|
|
57
|
+
ports: [
|
|
58
|
+
{ protocol: "UDP", port: 53 },
|
|
59
|
+
{ protocol: "TCP", port: 53 },
|
|
60
|
+
],
|
|
61
|
+
}]),
|
|
62
|
+
...(input.includeBaseRules === false ? [] : [{
|
|
63
|
+
to: [
|
|
64
|
+
{
|
|
65
|
+
namespaceSelector: { matchLabels: { "kubernetes.io/metadata.name": input.paperclipServerNamespace } },
|
|
66
|
+
podSelector: { matchLabels: { app: "paperclip-server" } },
|
|
67
|
+
},
|
|
68
|
+
],
|
|
69
|
+
ports: [{ protocol: "TCP", port: 3100 }],
|
|
70
|
+
}]),
|
|
71
|
+
// NOTE: operator-supplied CIDRs are intentionally NOT port-scoped —
|
|
72
|
+
// operators may need them for non-HTTP services (e.g. private VCS
|
|
73
|
+
// mirrors, S3 endpoints, internal artifact registries). Operators
|
|
74
|
+
// should keep CIDRs as specific as possible. For HTTP/HTTPS-only
|
|
75
|
+
// LLM endpoints, the public-IPv4 fallback below is port-scoped
|
|
76
|
+
// (TCP 80/443).
|
|
77
|
+
...input.egressAllowCidrs.map((cidr) => ({
|
|
78
|
+
to: [{ ipBlock: { cidr } }],
|
|
79
|
+
})),
|
|
80
|
+
// Standard-NetworkPolicy fallback for FQDN-based egress. If the
|
|
81
|
+
// adapter requires FQDNs (e.g. api.anthropic.com) and the
|
|
82
|
+
// operator didn't supply explicit CIDRs, allow public IPv4 with
|
|
83
|
+
// private/link-local/loopback/multicast carved out. This makes
|
|
84
|
+
// the default `egressMode: "standard"` config functional out of
|
|
85
|
+
// the box for cloud LLM APIs without inadvertently exposing
|
|
86
|
+
// cluster internals or link-local metadata endpoints. Operators
|
|
87
|
+
// who want exact FQDN enforcement should use `egressMode: "cilium"`.
|
|
88
|
+
...(input.egressAllowCidrs.length === 0 &&
|
|
89
|
+
(input.egressAllowFqdns?.length ?? 0) > 0
|
|
90
|
+
? [
|
|
91
|
+
{
|
|
92
|
+
to: [
|
|
93
|
+
{
|
|
94
|
+
ipBlock: {
|
|
95
|
+
cidr: "0.0.0.0/0",
|
|
96
|
+
except: PRIVATE_AND_LINK_LOCAL_EXCEPT_CIDRS,
|
|
97
|
+
},
|
|
98
|
+
},
|
|
99
|
+
],
|
|
100
|
+
ports: [
|
|
101
|
+
{ protocol: "TCP", port: 443 },
|
|
102
|
+
{ protocol: "TCP", port: 80 },
|
|
103
|
+
],
|
|
104
|
+
},
|
|
105
|
+
]
|
|
106
|
+
: []),
|
|
107
|
+
],
|
|
108
|
+
},
|
|
109
|
+
};
|
|
110
|
+
egressAllow.metadata.name = input.name ?? "paperclip-egress-allow";
|
|
111
|
+
if (input.ownerReferences) {
|
|
112
|
+
egressAllow.metadata.ownerReferences = input.ownerReferences;
|
|
113
|
+
}
|
|
114
|
+
return [denyAll, egressAllow];
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=network-policy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"network-policy.js","sourceRoot":"","sources":["../src/network-policy.ts"],"names":[],"mappings":"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"}
|
package/dist/plugin.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AA2MA,QAAA,MAAM,MAAM,gEA8zBV,CAAC;AAEH,eAAe,MAAM,CAAC"}
|