@vibesdotdev/integrations-digitalocean 0.0.0-stage → 1.0.0-rc.2
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 +126 -0
- package/README.md +78 -2
- package/dist/ai/index.d.ts +4 -0
- package/dist/ai/index.d.ts.map +1 -0
- package/dist/ai/index.js +4 -0
- package/dist/ai/index.js.map +1 -0
- package/dist/ai/inference.transport.impl.d.ts +5 -0
- package/dist/ai/inference.transport.impl.d.ts.map +1 -0
- package/dist/ai/inference.transport.impl.js +54 -0
- package/dist/ai/inference.transport.impl.js.map +1 -0
- package/dist/ai/provider.plugin.d.ts +6 -0
- package/dist/ai/provider.plugin.d.ts.map +1 -0
- package/dist/ai/provider.plugin.js +126 -0
- package/dist/ai/provider.plugin.js.map +1 -0
- package/dist/ai/providers/cloud/frontier/digitalocean/config/schemas/index.d.ts +62 -0
- package/dist/ai/providers/cloud/frontier/digitalocean/config/schemas/index.d.ts.map +1 -0
- package/dist/ai/providers/cloud/frontier/digitalocean/config/schemas/index.js +73 -0
- package/dist/ai/providers/cloud/frontier/digitalocean/config/schemas/index.js.map +1 -0
- package/dist/ai/providers/cloud/frontier/digitalocean/index.d.ts +2 -0
- package/dist/ai/providers/cloud/frontier/digitalocean/index.d.ts.map +1 -0
- package/dist/ai/providers/cloud/frontier/digitalocean/index.js +2 -0
- package/dist/ai/providers/cloud/frontier/digitalocean/index.js.map +1 -0
- package/dist/ai/providers/cloud/frontier/digitalocean/provider.digitalocean.descriptor.d.ts +183 -0
- package/dist/ai/providers/cloud/frontier/digitalocean/provider.digitalocean.descriptor.d.ts.map +1 -0
- package/dist/ai/providers/cloud/frontier/digitalocean/provider.digitalocean.descriptor.js +66 -0
- package/dist/ai/providers/cloud/frontier/digitalocean/provider.digitalocean.descriptor.js.map +1 -0
- package/dist/apps/api-client.d.ts +45 -0
- package/dist/apps/api-client.d.ts.map +1 -0
- package/dist/apps/api-client.js +47 -0
- package/dist/apps/api-client.js.map +1 -0
- package/dist/apps/build-spec.d.ts +44 -0
- package/dist/apps/build-spec.d.ts.map +1 -0
- package/dist/apps/build-spec.js +463 -0
- package/dist/apps/build-spec.js.map +1 -0
- package/dist/apps/deploy-client.d.ts +42 -0
- package/dist/apps/deploy-client.d.ts.map +1 -0
- package/dist/apps/deploy-client.js +300 -0
- package/dist/apps/deploy-client.js.map +1 -0
- package/dist/apps/index.d.ts +5 -0
- package/dist/apps/index.d.ts.map +1 -0
- package/dist/apps/index.js +4 -0
- package/dist/apps/index.js.map +1 -0
- package/dist/apps/types.d.ts +204 -0
- package/dist/apps/types.d.ts.map +1 -0
- package/dist/apps/types.js +13 -0
- package/dist/apps/types.js.map +1 -0
- package/dist/client/control-plane.d.ts +49 -0
- package/dist/client/control-plane.d.ts.map +1 -0
- package/dist/client/control-plane.js +85 -0
- package/dist/client/control-plane.js.map +1 -0
- package/dist/client/do-fetch.d.ts +41 -0
- package/dist/client/do-fetch.d.ts.map +1 -0
- package/dist/client/do-fetch.js +199 -0
- package/dist/client/do-fetch.js.map +1 -0
- package/dist/client/errors.d.ts +6 -0
- package/dist/client/errors.d.ts.map +1 -0
- package/dist/client/errors.js +34 -0
- package/dist/client/errors.js.map +1 -0
- package/dist/client/factory.d.ts +53 -0
- package/dist/client/factory.d.ts.map +1 -0
- package/dist/client/factory.js +220 -0
- package/dist/client/factory.js.map +1 -0
- package/dist/client/helpers.d.ts +5 -0
- package/dist/client/helpers.d.ts.map +1 -0
- package/dist/client/helpers.js +8 -0
- package/dist/client/helpers.js.map +1 -0
- package/dist/client/index.d.ts +12 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +10 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/paginated.d.ts +19 -0
- package/dist/client/paginated.d.ts.map +1 -0
- package/dist/client/paginated.js +56 -0
- package/dist/client/paginated.js.map +1 -0
- package/dist/client/retry.d.ts +34 -0
- package/dist/client/retry.d.ts.map +1 -0
- package/dist/client/retry.js +53 -0
- package/dist/client/retry.js.map +1 -0
- package/dist/config/digitalocean.config.descriptor.d.ts +197 -0
- package/dist/config/digitalocean.config.descriptor.d.ts.map +1 -0
- package/dist/config/digitalocean.config.descriptor.js +59 -0
- package/dist/config/digitalocean.config.descriptor.js.map +1 -0
- package/dist/credentials/index.d.ts +38 -0
- package/dist/credentials/index.d.ts.map +1 -0
- package/dist/credentials/index.js +56 -0
- package/dist/credentials/index.js.map +1 -0
- package/dist/databases/index.d.ts +82 -0
- package/dist/databases/index.d.ts.map +1 -0
- package/dist/databases/index.js +57 -0
- package/dist/databases/index.js.map +1 -0
- package/dist/digitalocean-friction.policy.d.ts +29 -0
- package/dist/digitalocean-friction.policy.d.ts.map +1 -0
- package/dist/digitalocean-friction.policy.js +21 -0
- package/dist/digitalocean-friction.policy.js.map +1 -0
- package/dist/digitalocean.plugin.d.ts +3 -0
- package/dist/digitalocean.plugin.d.ts.map +1 -0
- package/dist/digitalocean.plugin.js +27 -0
- package/dist/digitalocean.plugin.js.map +1 -0
- package/dist/droplets/index.d.ts +106 -0
- package/dist/droplets/index.d.ts.map +1 -0
- package/dist/droplets/index.js +227 -0
- package/dist/droplets/index.js.map +1 -0
- package/dist/index.d.ts +35 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +32 -0
- package/dist/index.js.map +1 -0
- package/dist/inference-control-plane/index.d.ts +63 -0
- package/dist/inference-control-plane/index.d.ts.map +1 -0
- package/dist/inference-control-plane/index.js +93 -0
- package/dist/inference-control-plane/index.js.map +1 -0
- package/dist/infra/billing.d.ts +26 -0
- package/dist/infra/billing.d.ts.map +1 -0
- package/dist/infra/billing.js +43 -0
- package/dist/infra/billing.js.map +1 -0
- package/dist/infra/credentials.d.ts +11 -0
- package/dist/infra/credentials.d.ts.map +1 -0
- package/dist/infra/credentials.js +15 -0
- package/dist/infra/credentials.js.map +1 -0
- package/dist/infra/deployment-provider/deploy-secrets.d.ts +10 -0
- package/dist/infra/deployment-provider/deploy-secrets.d.ts.map +1 -0
- package/dist/infra/deployment-provider/deploy-secrets.js +66 -0
- package/dist/infra/deployment-provider/deploy-secrets.js.map +1 -0
- package/dist/infra/deployment-provider/digitalocean-deployment-provider.impl.d.ts +97 -0
- package/dist/infra/deployment-provider/digitalocean-deployment-provider.impl.d.ts.map +1 -0
- package/dist/infra/deployment-provider/digitalocean-deployment-provider.impl.js +242 -0
- package/dist/infra/deployment-provider/digitalocean-deployment-provider.impl.js.map +1 -0
- package/dist/infra/deployment-provider/image-publish.d.ts +39 -0
- package/dist/infra/deployment-provider/image-publish.d.ts.map +1 -0
- package/dist/infra/deployment-provider/image-publish.js +146 -0
- package/dist/infra/deployment-provider/image-publish.js.map +1 -0
- package/dist/infra/deployment-provider.descriptor.d.ts +34 -0
- package/dist/infra/deployment-provider.descriptor.d.ts.map +1 -0
- package/dist/infra/deployment-provider.descriptor.js +9 -0
- package/dist/infra/deployment-provider.descriptor.js.map +1 -0
- package/dist/infra/digitalocean-infra.plugin.d.ts +101 -0
- package/dist/infra/digitalocean-infra.plugin.d.ts.map +1 -0
- package/dist/infra/digitalocean-infra.plugin.js +283 -0
- package/dist/infra/digitalocean-infra.plugin.js.map +1 -0
- package/dist/infra/doks/clients.d.ts +183 -0
- package/dist/infra/doks/clients.d.ts.map +1 -0
- package/dist/infra/doks/clients.js +172 -0
- package/dist/infra/doks/clients.js.map +1 -0
- package/dist/infra/doks/digitalocean.d.ts +34 -0
- package/dist/infra/doks/digitalocean.d.ts.map +1 -0
- package/dist/infra/doks/digitalocean.js +267 -0
- package/dist/infra/doks/digitalocean.js.map +1 -0
- package/dist/infra/doks/service-release-schemas.d.ts +1037 -0
- package/dist/infra/doks/service-release-schemas.d.ts.map +1 -0
- package/dist/infra/doks/service-release-schemas.js +51 -0
- package/dist/infra/doks/service-release-schemas.js.map +1 -0
- package/dist/infra/doks/service-release.d.ts +415 -0
- package/dist/infra/doks/service-release.d.ts.map +1 -0
- package/dist/infra/doks/service-release.js +3201 -0
- package/dist/infra/doks/service-release.js.map +1 -0
- package/dist/infra/doks/worker.d.ts +14 -0
- package/dist/infra/doks/worker.d.ts.map +1 -0
- package/dist/infra/doks/worker.js +343 -0
- package/dist/infra/doks/worker.js.map +1 -0
- package/dist/infra/droplet.impl.d.ts +172 -0
- package/dist/infra/droplet.impl.d.ts.map +1 -0
- package/dist/infra/droplet.impl.js +379 -0
- package/dist/infra/droplet.impl.js.map +1 -0
- package/dist/infra/functions.impl.d.ts +123 -0
- package/dist/infra/functions.impl.d.ts.map +1 -0
- package/dist/infra/functions.impl.js +202 -0
- package/dist/infra/functions.impl.js.map +1 -0
- package/dist/infra/index.d.ts +15 -0
- package/dist/infra/index.d.ts.map +1 -0
- package/dist/infra/index.js +12 -0
- package/dist/infra/index.js.map +1 -0
- package/dist/infra/inventory.d.ts +7 -0
- package/dist/infra/inventory.d.ts.map +1 -0
- package/dist/infra/inventory.js +259 -0
- package/dist/infra/inventory.js.map +1 -0
- package/dist/infra/kubernetes-log-stream.d.ts +5 -0
- package/dist/infra/kubernetes-log-stream.d.ts.map +1 -0
- package/dist/infra/kubernetes-log-stream.js +186 -0
- package/dist/infra/kubernetes-log-stream.js.map +1 -0
- package/dist/infra/kubernetes-logs.d.ts +33 -0
- package/dist/infra/kubernetes-logs.d.ts.map +1 -0
- package/dist/infra/kubernetes-logs.descriptor.d.ts +14 -0
- package/dist/infra/kubernetes-logs.descriptor.d.ts.map +1 -0
- package/dist/infra/kubernetes-logs.descriptor.js +28 -0
- package/dist/infra/kubernetes-logs.descriptor.js.map +1 -0
- package/dist/infra/kubernetes-logs.js +196 -0
- package/dist/infra/kubernetes-logs.js.map +1 -0
- package/dist/infra/utilization.d.ts +44 -0
- package/dist/infra/utilization.d.ts.map +1 -0
- package/dist/infra/utilization.js +108 -0
- package/dist/infra/utilization.js.map +1 -0
- package/dist/kubernetes/authority.d.ts +40 -0
- package/dist/kubernetes/authority.d.ts.map +1 -0
- package/dist/kubernetes/authority.js +90 -0
- package/dist/kubernetes/authority.js.map +1 -0
- package/dist/kubernetes/encoding.d.ts +4 -0
- package/dist/kubernetes/encoding.d.ts.map +1 -0
- package/dist/kubernetes/encoding.js +8 -0
- package/dist/kubernetes/encoding.js.map +1 -0
- package/dist/kubernetes/index.d.ts +105 -0
- package/dist/kubernetes/index.d.ts.map +1 -0
- package/dist/kubernetes/index.js +99 -0
- package/dist/kubernetes/index.js.map +1 -0
- package/dist/kubernetes/transport.d.ts +11 -0
- package/dist/kubernetes/transport.d.ts.map +1 -0
- package/dist/kubernetes/transport.js +27 -0
- package/dist/kubernetes/transport.js.map +1 -0
- package/dist/network/index.d.ts +24 -0
- package/dist/network/index.d.ts.map +1 -0
- package/dist/network/index.js +16 -0
- package/dist/network/index.js.map +1 -0
- package/dist/registry/index.d.ts +39 -0
- package/dist/registry/index.d.ts.map +1 -0
- package/dist/registry/index.js +20 -0
- package/dist/registry/index.js.map +1 -0
- package/dist/schemas/app-deployment.d.ts +1474 -0
- package/dist/schemas/app-deployment.d.ts.map +1 -0
- package/dist/schemas/app-deployment.js +156 -0
- package/dist/schemas/app-deployment.js.map +1 -0
- package/dist/schemas/app-platform.d.ts +755 -0
- package/dist/schemas/app-platform.d.ts.map +1 -0
- package/dist/schemas/app-platform.js +253 -0
- package/dist/schemas/app-platform.js.map +1 -0
- package/dist/schemas/cache-database.d.ts +210 -0
- package/dist/schemas/cache-database.d.ts.map +1 -0
- package/dist/schemas/cache-database.js +105 -0
- package/dist/schemas/cache-database.js.map +1 -0
- package/dist/schemas/control-plane.d.ts +456 -0
- package/dist/schemas/control-plane.d.ts.map +1 -0
- package/dist/schemas/control-plane.js +123 -0
- package/dist/schemas/control-plane.js.map +1 -0
- package/dist/schemas/credential-use.d.ts +714 -0
- package/dist/schemas/credential-use.d.ts.map +1 -0
- package/dist/schemas/credential-use.js +73 -0
- package/dist/schemas/credential-use.js.map +1 -0
- package/dist/schemas/doks-worker.d.ts +4071 -0
- package/dist/schemas/doks-worker.d.ts.map +1 -0
- package/dist/schemas/doks-worker.js +330 -0
- package/dist/schemas/doks-worker.js.map +1 -0
- package/dist/schemas/droplet.d.ts +110 -0
- package/dist/schemas/droplet.d.ts.map +1 -0
- package/dist/schemas/droplet.js +22 -0
- package/dist/schemas/droplet.js.map +1 -0
- package/dist/schemas/functions.d.ts +22 -0
- package/dist/schemas/functions.d.ts.map +1 -0
- package/dist/schemas/functions.js +25 -0
- package/dist/schemas/functions.js.map +1 -0
- package/dist/schemas/gitea-git-hosting.d.ts +20 -0
- package/dist/schemas/gitea-git-hosting.d.ts.map +1 -0
- package/dist/schemas/gitea-git-hosting.js +26 -0
- package/dist/schemas/gitea-git-hosting.js.map +1 -0
- package/dist/schemas/http.d.ts +2594 -0
- package/dist/schemas/http.d.ts.map +1 -0
- package/dist/schemas/http.js +4548 -0
- package/dist/schemas/http.js.map +1 -0
- package/dist/schemas/infra-kinds.d.ts +113 -0
- package/dist/schemas/infra-kinds.d.ts.map +1 -0
- package/dist/schemas/infra-kinds.js +93 -0
- package/dist/schemas/infra-kinds.js.map +1 -0
- package/dist/schemas/kubernetes-responses.d.ts +457 -0
- package/dist/schemas/kubernetes-responses.d.ts.map +1 -0
- package/dist/schemas/kubernetes-responses.js +681 -0
- package/dist/schemas/kubernetes-responses.js.map +1 -0
- package/dist/schemas/kubernetes.d.ts +143 -0
- package/dist/schemas/kubernetes.d.ts.map +1 -0
- package/dist/schemas/kubernetes.js +68 -0
- package/dist/schemas/kubernetes.js.map +1 -0
- package/dist/schemas/logs.d.ts +15 -0
- package/dist/schemas/logs.d.ts.map +1 -0
- package/dist/schemas/logs.js +11 -0
- package/dist/schemas/logs.js.map +1 -0
- package/dist/schemas/object-storage.d.ts +167 -0
- package/dist/schemas/object-storage.d.ts.map +1 -0
- package/dist/schemas/object-storage.js +124 -0
- package/dist/schemas/object-storage.js.map +1 -0
- package/dist/schemas/service-settings.d.ts +9 -0
- package/dist/schemas/service-settings.d.ts.map +1 -0
- package/dist/schemas/service-settings.js +21 -0
- package/dist/schemas/service-settings.js.map +1 -0
- package/dist/schemas/utilization.d.ts +57 -0
- package/dist/schemas/utilization.d.ts.map +1 -0
- package/dist/schemas/utilization.js +58 -0
- package/dist/schemas/utilization.js.map +1 -0
- package/dist/schemas/worker-status.d.ts +22 -0
- package/dist/schemas/worker-status.d.ts.map +1 -0
- package/dist/schemas/worker-status.js +14 -0
- package/dist/schemas/worker-status.js.map +1 -0
- package/dist/schemas/worker.d.ts +125 -0
- package/dist/schemas/worker.d.ts.map +1 -0
- package/dist/schemas/worker.js +129 -0
- package/dist/schemas/worker.js.map +1 -0
- package/dist/secrets/app-platform/app-credentials.impl.d.ts +14 -0
- package/dist/secrets/app-platform/app-credentials.impl.d.ts.map +1 -0
- package/dist/secrets/app-platform/app-credentials.impl.js +237 -0
- package/dist/secrets/app-platform/app-credentials.impl.js.map +1 -0
- package/dist/secrets/container-registry/image-publish-settings.descriptor.d.ts +11 -0
- package/dist/secrets/container-registry/image-publish-settings.descriptor.d.ts.map +1 -0
- package/dist/secrets/container-registry/image-publish-settings.descriptor.js +26 -0
- package/dist/secrets/container-registry/image-publish-settings.descriptor.js.map +1 -0
- package/dist/secrets/doks-secret.descriptor.d.ts +18 -0
- package/dist/secrets/doks-secret.descriptor.d.ts.map +1 -0
- package/dist/secrets/doks-secret.descriptor.js +35 -0
- package/dist/secrets/doks-secret.descriptor.js.map +1 -0
- package/dist/secrets/doks-secret.impl.d.ts +98 -0
- package/dist/secrets/doks-secret.impl.d.ts.map +1 -0
- package/dist/secrets/doks-secret.impl.js +451 -0
- package/dist/secrets/doks-secret.impl.js.map +1 -0
- package/dist/secrets/index.d.ts +4 -0
- package/dist/secrets/index.d.ts.map +1 -0
- package/dist/secrets/index.js +4 -0
- package/dist/secrets/index.js.map +1 -0
- package/dist/secrets/secrets-backend-doks.plugin.d.ts +3 -0
- package/dist/secrets/secrets-backend-doks.plugin.d.ts.map +1 -0
- package/dist/secrets/secrets-backend-doks.plugin.js +35 -0
- package/dist/secrets/secrets-backend-doks.plugin.js.map +1 -0
- package/dist/storage/index.d.ts +50 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +92 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/spaces-keys.d.ts +25 -0
- package/dist/storage/spaces-keys.d.ts.map +1 -0
- package/dist/storage/spaces-keys.js +32 -0
- package/dist/storage/spaces-keys.js.map +1 -0
- package/package.json +172 -4
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { MetricsResponseSchema, } from "../schemas/http.js";
|
|
2
|
+
import { UtilizationDropletsSchema, UtilizationClustersSchema, UtilizationAppsSchema } from "../schemas/utilization.js";
|
|
3
|
+
import { UtilizationSummarySchema } from '@vibesdotdev/infra-core';
|
|
4
|
+
import { sanitizeInfraProviderFailure } from '@vibesdotdev/infra-core';
|
|
5
|
+
function sampleSummary(response) {
|
|
6
|
+
const values = response.data?.result
|
|
7
|
+
?.flatMap((r) => r.values ?? [])
|
|
8
|
+
.map((v) => Number(v[1]))
|
|
9
|
+
.filter(Number.isFinite) ?? [];
|
|
10
|
+
return {
|
|
11
|
+
sampleCount: values.length,
|
|
12
|
+
rawArithmeticMean: values.length ? values.reduce((a, b) => a + b, 0) / values.length : undefined
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
export class DigitalOceanUtilizationClient {
|
|
16
|
+
client;
|
|
17
|
+
now;
|
|
18
|
+
constructor(client, now = () => new Date()) {
|
|
19
|
+
this.client = client;
|
|
20
|
+
this.now = now;
|
|
21
|
+
}
|
|
22
|
+
async metric(id, metric, start, end) {
|
|
23
|
+
return this.client.get(`/monitoring/metrics/droplet/${metric}?host_id=${encodeURIComponent(id)}&start=${start}&end=${end}`, {}, MetricsResponseSchema);
|
|
24
|
+
}
|
|
25
|
+
async report(windowHours = 168) {
|
|
26
|
+
const end = Math.floor(this.now().getTime() / 1000), start = end - windowHours * 3600;
|
|
27
|
+
const inventoryResults = await Promise.allSettled([
|
|
28
|
+
this.client.get('/droplets?per_page=200', {}, UtilizationDropletsSchema),
|
|
29
|
+
this.client.get('/kubernetes/clusters?per_page=200', {}, UtilizationClustersSchema),
|
|
30
|
+
this.client.get('/apps?per_page=200', {}, UtilizationAppsSchema)
|
|
31
|
+
]);
|
|
32
|
+
const errors = inventoryResults.flatMap((result, index) => result.status === 'rejected'
|
|
33
|
+
? [
|
|
34
|
+
{
|
|
35
|
+
source: ['droplets', 'clusters', 'apps'][index],
|
|
36
|
+
message: sanitizeInfraProviderFailure(result.reason).message
|
|
37
|
+
}
|
|
38
|
+
]
|
|
39
|
+
: []);
|
|
40
|
+
const dropletPayload = inventoryResults[0]?.status === 'fulfilled' ? inventoryResults[0].value : { droplets: [] };
|
|
41
|
+
const clusterPayload = inventoryResults[1]?.status === 'fulfilled'
|
|
42
|
+
? inventoryResults[1].value
|
|
43
|
+
: { kubernetes_clusters: [] };
|
|
44
|
+
const appPayload = inventoryResults[2]?.status === 'fulfilled' ? inventoryResults[2].value : { apps: [] };
|
|
45
|
+
const poolByDroplet = new Map();
|
|
46
|
+
for (const cluster of clusterPayload.kubernetes_clusters)
|
|
47
|
+
for (const pool of cluster.node_pools ?? [])
|
|
48
|
+
for (const node of pool.nodes ?? [])
|
|
49
|
+
poolByDroplet.set(String(node.droplet_id), {
|
|
50
|
+
name: String(pool.name),
|
|
51
|
+
fixed: pool.auto_scale !== true
|
|
52
|
+
});
|
|
53
|
+
const nodes = await Promise.all(dropletPayload.droplets.map(async (droplet) => {
|
|
54
|
+
const id = String(droplet.id), errors = [];
|
|
55
|
+
const results = await Promise.allSettled(['cpu', 'memory_utilization', 'uptime'].map((metric) => this.metric(id, metric, start, end)));
|
|
56
|
+
const metrics = results.map((result, index) => {
|
|
57
|
+
const name = ['cpu', 'memory_utilization', 'uptime'][index];
|
|
58
|
+
if (result.status === 'rejected') {
|
|
59
|
+
errors.push(`${name}: ${sanitizeInfraProviderFailure(result.reason).message}`);
|
|
60
|
+
return {
|
|
61
|
+
name,
|
|
62
|
+
sampleCount: 0,
|
|
63
|
+
semantics: 'unverified',
|
|
64
|
+
reason: 'Provider metric unavailable; units and aggregation semantics are not proven.'
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
return {
|
|
68
|
+
name,
|
|
69
|
+
...sampleSummary(result.value),
|
|
70
|
+
semantics: 'unverified',
|
|
71
|
+
reason: 'Raw samples are informational only; provider units, counter/gauge semantics, peaks, and p95 are not validated.'
|
|
72
|
+
};
|
|
73
|
+
});
|
|
74
|
+
const pool = poolByDroplet.get(id);
|
|
75
|
+
return {
|
|
76
|
+
id,
|
|
77
|
+
name: String(droplet.name),
|
|
78
|
+
pool: pool?.name,
|
|
79
|
+
fixedPool: pool?.fixed ?? false,
|
|
80
|
+
metrics,
|
|
81
|
+
evidenceStatus: 'unsupported',
|
|
82
|
+
errors
|
|
83
|
+
};
|
|
84
|
+
}));
|
|
85
|
+
const apps = appPayload.apps.map((app) => {
|
|
86
|
+
const spec = app.spec;
|
|
87
|
+
const components = ['services', 'workers', 'jobs', 'static_sites', 'functions'].flatMap((kind) => (spec?.[kind] ?? []).map((component) => ({
|
|
88
|
+
name: String(component.name),
|
|
89
|
+
kind,
|
|
90
|
+
instanceSize: component.instance_size_slug,
|
|
91
|
+
instanceCount: component.instance_count,
|
|
92
|
+
autoscaling: component.autoscaling !== undefined,
|
|
93
|
+
evidenceStatus: 'unsupported',
|
|
94
|
+
reason: 'The current DigitalOcean account API surface does not provide component utilization in this report; no right-sizing recommendation is made.'
|
|
95
|
+
})));
|
|
96
|
+
return { name: String(spec?.name ?? app.id), components };
|
|
97
|
+
});
|
|
98
|
+
return UtilizationSummarySchema.parse({
|
|
99
|
+
provider: 'digitalocean',
|
|
100
|
+
collectedAt: this.now().toISOString(),
|
|
101
|
+
windowHours,
|
|
102
|
+
nodes,
|
|
103
|
+
apps,
|
|
104
|
+
errors
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=utilization.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utilization.js","sourceRoot":"","sources":["../../src/infra/utilization.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Short-lived authenticated access to a DOKS cluster's API server.
|
|
3
|
+
*
|
|
4
|
+
* DigitalOcean mints a kubeconfig on demand with a caller-chosen TTL, so
|
|
5
|
+
* nothing here holds a durable cluster credential: the authority is fetched,
|
|
6
|
+
* used, and discarded. `service-release` proved this path; `kubernetes-logs`
|
|
7
|
+
* reuses it rather than growing a second copy of the parse, which is exactly
|
|
8
|
+
* the duplication that made `--ttl none` ship unreachable in the fleet CLI.
|
|
9
|
+
*
|
|
10
|
+
* Failures never echo a response body: a Kubernetes error can carry object
|
|
11
|
+
* contents, and this module is called from operator-facing surfaces.
|
|
12
|
+
*/
|
|
13
|
+
import type { VibesRuntime } from '@vibesdotdev/kernel';
|
|
14
|
+
import type { DigitalOceanKubernetesClient } from './index.ts';
|
|
15
|
+
import { type KubernetesAuthority } from '../schemas/kubernetes.ts';
|
|
16
|
+
export type { KubernetesAuthority } from '../schemas/kubernetes.ts';
|
|
17
|
+
/** Default kubeconfig lifetime. Long enough for one command, short enough to be uninteresting if leaked. */
|
|
18
|
+
export declare const KUBERNETES_AUTHORITY_TTL_SECONDS = 300;
|
|
19
|
+
export declare function parseKubeconfig(raw: string): KubernetesAuthority;
|
|
20
|
+
export type KubernetesFetchImpl = (input: string, init?: RequestInit) => Promise<Response>;
|
|
21
|
+
/** A request function bound to one cluster's API server. */
|
|
22
|
+
export interface KubernetesApi {
|
|
23
|
+
cluster: {
|
|
24
|
+
id: string;
|
|
25
|
+
name: string;
|
|
26
|
+
};
|
|
27
|
+
/** Resolves `null` for 404 when `allowNotFound`; throws on any other non-2xx. */
|
|
28
|
+
request(path: string, init?: RequestInit, allowNotFound?: boolean): Promise<Response | null>;
|
|
29
|
+
}
|
|
30
|
+
export declare function createKubernetesApi(options: {
|
|
31
|
+
runtime?: VibesRuntime;
|
|
32
|
+
kubernetes: DigitalOceanKubernetesClient;
|
|
33
|
+
cluster: {
|
|
34
|
+
id?: string;
|
|
35
|
+
name?: string;
|
|
36
|
+
};
|
|
37
|
+
fetchImpl?: KubernetesFetchImpl;
|
|
38
|
+
expirySeconds?: number;
|
|
39
|
+
}): Promise<KubernetesApi>;
|
|
40
|
+
//# sourceMappingURL=authority.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authority.d.ts","sourceRoot":"","sources":["../../src/kubernetes/authority.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAGxD,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,YAAY,CAAC;AAI/D,OAAO,EAGN,KAAK,mBAAmB,EACxB,MAAM,0BAA0B,CAAC;AAClC,YAAY,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAEpE,4GAA4G;AAC5G,eAAO,MAAM,gCAAgC,MAAM,CAAC;AAEpD,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,mBAAmB,CA8BhE;AAED,MAAM,MAAM,mBAAmB,GAAG,CACjC,KAAK,EAAE,MAAM,EACb,IAAI,CAAC,EAAE,WAAW,KACd,OAAO,CAAC,QAAQ,CAAC,CAAC;AAEvB,4DAA4D;AAC5D,MAAM,WAAW,aAAa;IAC7B,OAAO,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IACtC,iFAAiF;IACjF,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,WAAW,EAAE,aAAa,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC;CAC7F;AAED,wBAAsB,mBAAmB,CAAC,OAAO,EAAE;IAClD,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB,UAAU,EAAE,4BAA4B,CAAC;IACzC,OAAO,EAAE;QAAE,EAAE,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACxC,SAAS,CAAC,EAAE,mBAAmB,CAAC;IAChC,aAAa,CAAC,EAAE,MAAM,CAAC;CACvB,GAAG,OAAO,CAAC,aAAa,CAAC,CA4CzB"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Short-lived authenticated access to a DOKS cluster's API server.
|
|
3
|
+
*
|
|
4
|
+
* DigitalOcean mints a kubeconfig on demand with a caller-chosen TTL, so
|
|
5
|
+
* nothing here holds a durable cluster credential: the authority is fetched,
|
|
6
|
+
* used, and discarded. `service-release` proved this path; `kubernetes-logs`
|
|
7
|
+
* reuses it rather than growing a second copy of the parse, which is exactly
|
|
8
|
+
* the duplication that made `--ttl none` ship unreachable in the fleet CLI.
|
|
9
|
+
*
|
|
10
|
+
* Failures never echo a response body: a Kubernetes error can carry object
|
|
11
|
+
* contents, and this module is called from operator-facing surfaces.
|
|
12
|
+
*/
|
|
13
|
+
import { decodeBase64Text } from "./encoding.js";
|
|
14
|
+
import { kubernetesRequest } from "./transport.js";
|
|
15
|
+
import { CapabilityError } from '@vibesdotdev/kernel';
|
|
16
|
+
import { parse } from 'yaml';
|
|
17
|
+
import { KubernetesAuthoritySchema, KubeconfigSchema } from "../schemas/kubernetes.js";
|
|
18
|
+
/** Default kubeconfig lifetime. Long enough for one command, short enough to be uninteresting if leaked. */
|
|
19
|
+
export const KUBERNETES_AUTHORITY_TTL_SECONDS = 300;
|
|
20
|
+
export function parseKubeconfig(raw) {
|
|
21
|
+
try {
|
|
22
|
+
const parsed = KubeconfigSchema.parse(parse(raw));
|
|
23
|
+
const contextName = parsed['current-context'];
|
|
24
|
+
const context = parsed.contexts?.find((candidate) => candidate.name === contextName)?.context;
|
|
25
|
+
const cluster = parsed.clusters?.find((candidate) => candidate.name === context?.cluster)?.cluster;
|
|
26
|
+
const user = parsed.users?.find((candidate) => candidate.name === context?.user)?.user;
|
|
27
|
+
if (!cluster?.server || !user)
|
|
28
|
+
throw new Error('invalid authority');
|
|
29
|
+
const token = user.token;
|
|
30
|
+
const certData = user['client-certificate-data'];
|
|
31
|
+
const keyData = user['client-key-data'];
|
|
32
|
+
if (!token && !(certData && keyData))
|
|
33
|
+
throw new Error('missing credentials');
|
|
34
|
+
return KubernetesAuthoritySchema.parse({
|
|
35
|
+
server: cluster.server.replace(/\/$/, ''),
|
|
36
|
+
token,
|
|
37
|
+
ca: cluster['certificate-authority-data']
|
|
38
|
+
? decodeBase64Text(cluster['certificate-authority-data'])
|
|
39
|
+
: undefined,
|
|
40
|
+
cert: certData ? decodeBase64Text(certData) : undefined,
|
|
41
|
+
key: keyData ? decodeBase64Text(keyData) : undefined
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
catch (cause) {
|
|
45
|
+
throw new CapabilityError('DOKS kubeconfig could not be parsed into a usable private Kubernetes authority.', 'INVALID_INPUT', { reason: 'doks-kubeconfig-invalid', cause });
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
export async function createKubernetesApi(options) {
|
|
49
|
+
const resolved = options.cluster.id
|
|
50
|
+
? await options.kubernetes.getCluster(options.cluster.id)
|
|
51
|
+
: await options.kubernetes.findClusterByName(options.cluster.name ?? '');
|
|
52
|
+
if (!resolved)
|
|
53
|
+
throw new Error('Target DOKS cluster was not found.');
|
|
54
|
+
if (resolved.status.state !== 'running') {
|
|
55
|
+
throw new Error(`Target DOKS cluster is not running (${resolved.status.state}).`);
|
|
56
|
+
}
|
|
57
|
+
const authority = parseKubeconfig(await options.kubernetes.fetchKubeconfig(resolved.id, {
|
|
58
|
+
expirySeconds: options.expirySeconds ?? KUBERNETES_AUTHORITY_TTL_SECONDS
|
|
59
|
+
}));
|
|
60
|
+
const fetchImpl = options.fetchImpl ?? ((input, init) => fetch(input, init));
|
|
61
|
+
return {
|
|
62
|
+
cluster: { id: resolved.id, name: resolved.name },
|
|
63
|
+
async request(path, init = {}, allowNotFound = false) {
|
|
64
|
+
const headers = new Headers(init.headers);
|
|
65
|
+
if (authority.token)
|
|
66
|
+
headers.set('authorization', `Bearer ${authority.token}`);
|
|
67
|
+
const requestInit = { ...init, headers };
|
|
68
|
+
if (!options.runtime && (authority.ca || authority.cert || authority.key)) {
|
|
69
|
+
throw new CapabilityError('Kubernetes TLS authority requires a runtime transport.', 'UNAVAILABLE', {
|
|
70
|
+
reason: 'doks-tls-transport-unavailable'
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
const response = options.runtime
|
|
74
|
+
? await kubernetesRequest(options.runtime, authority, `${authority.server}${path}`, requestInit, options.fetchImpl)
|
|
75
|
+
: await fetchImpl(`${authority.server}${path}`, requestInit);
|
|
76
|
+
if (allowNotFound && response.status === 404)
|
|
77
|
+
return null;
|
|
78
|
+
if (!response.ok) {
|
|
79
|
+
const method = init.method !== undefined && /^[A-Z]+$/.test(init.method) ? init.method : 'GET';
|
|
80
|
+
// Path only, never the body: a Kubernetes error response can quote
|
|
81
|
+
// object contents back at the caller.
|
|
82
|
+
const pathname = new URL(path, 'https://kubernetes.invalid').pathname;
|
|
83
|
+
throw new Error(`Kubernetes API request failed (${response.status}) for ${method} ${pathname}; ` +
|
|
84
|
+
'the response body was intentionally redacted.');
|
|
85
|
+
}
|
|
86
|
+
return response;
|
|
87
|
+
}
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=authority.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authority.js","sourceRoot":"","sources":["../../src/kubernetes/authority.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"encoding.d.ts","sourceRoot":"","sources":["../../src/kubernetes/encoding.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEtD"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/** Kubernetes Secret and kubeconfig encodings are UTF-8 over RFC 4648 base64. */
|
|
2
|
+
export function encodeBase64Text(value) {
|
|
3
|
+
return btoa(Array.from(new TextEncoder().encode(value), byte => String.fromCharCode(byte)).join(''));
|
|
4
|
+
}
|
|
5
|
+
export function decodeBase64Text(value) {
|
|
6
|
+
return new TextDecoder('utf-8', { fatal: true }).decode(Uint8Array.from(atob(value), char => char.charCodeAt(0)));
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=encoding.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"encoding.js","sourceRoot":"","sources":["../../src/kubernetes/encoding.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,MAAM,UAAU,gBAAgB,CAAC,KAAa;IAC7C,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;AACtG,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAa;IAC7C,OAAO,IAAI,WAAW,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACnH,CAAC"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DigitalOcean Managed Kubernetes (DOKS).
|
|
3
|
+
*
|
|
4
|
+
* Wraps:
|
|
5
|
+
* - cluster list/get/create/update/delete
|
|
6
|
+
* - node pool list/create/update/delete
|
|
7
|
+
* - kubeconfig fetch (text payload)
|
|
8
|
+
* - control-plane firewall update
|
|
9
|
+
* - OIDC SSO update
|
|
10
|
+
*
|
|
11
|
+
* Mutation methods are exposed but the connector itself never gates — the
|
|
12
|
+
* CLI / runtime descriptor decides what's safe to call without confirmation.
|
|
13
|
+
*/
|
|
14
|
+
import type { DigitalOceanControlPlaneClient } from '../client/control-plane.ts';
|
|
15
|
+
export type DoKubernetesNodePool = DoKubernetesCluster['node_pools'][number];
|
|
16
|
+
export interface DoKubernetesClusterStatus {
|
|
17
|
+
state: 'running' | 'provisioning' | 'errored' | 'degraded' | 'upgrading' | 'deleting' | 'deleted';
|
|
18
|
+
message?: string;
|
|
19
|
+
}
|
|
20
|
+
export interface DoKubernetesMaintenancePolicy {
|
|
21
|
+
start_time?: string;
|
|
22
|
+
day?: string;
|
|
23
|
+
duration?: string;
|
|
24
|
+
}
|
|
25
|
+
export type DoKubernetesCluster = import('zod/v4').infer<typeof import('../schemas/http.ts').DoKubernetesClusterSchema>;
|
|
26
|
+
export interface DoKubernetesVersion {
|
|
27
|
+
slug: string;
|
|
28
|
+
kubernetes_version: string;
|
|
29
|
+
supported_features?: string[];
|
|
30
|
+
}
|
|
31
|
+
export interface DoKubernetesOptions {
|
|
32
|
+
regions: Array<{
|
|
33
|
+
name: string;
|
|
34
|
+
slug: string;
|
|
35
|
+
}>;
|
|
36
|
+
versions: DoKubernetesVersion[];
|
|
37
|
+
sizes: Array<{
|
|
38
|
+
name: string;
|
|
39
|
+
slug: string;
|
|
40
|
+
}>;
|
|
41
|
+
}
|
|
42
|
+
export interface CreateClusterOptions {
|
|
43
|
+
name: string;
|
|
44
|
+
region: string;
|
|
45
|
+
version: string;
|
|
46
|
+
node_pools: DoKubernetesNodePool[];
|
|
47
|
+
vpc_uuid?: string;
|
|
48
|
+
tags?: string[];
|
|
49
|
+
auto_upgrade?: boolean;
|
|
50
|
+
surge_upgrade?: boolean;
|
|
51
|
+
ha?: boolean;
|
|
52
|
+
maintenance_policy?: DoKubernetesMaintenancePolicy;
|
|
53
|
+
}
|
|
54
|
+
export interface UpdateClusterOptions {
|
|
55
|
+
name?: string;
|
|
56
|
+
tags?: string[];
|
|
57
|
+
auto_upgrade?: boolean;
|
|
58
|
+
surge_upgrade?: boolean;
|
|
59
|
+
ha?: boolean;
|
|
60
|
+
maintenance_policy?: DoKubernetesMaintenancePolicy;
|
|
61
|
+
control_plane_firewall?: {
|
|
62
|
+
enabled: boolean;
|
|
63
|
+
allowed_addresses: string[];
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
export declare class DigitalOceanKubernetesClient {
|
|
67
|
+
private readonly client;
|
|
68
|
+
constructor(client: DigitalOceanControlPlaneClient);
|
|
69
|
+
listClusters(): Promise<DoKubernetesCluster[]>;
|
|
70
|
+
findClusterByName(name: string): Promise<DoKubernetesCluster | null>;
|
|
71
|
+
getCluster(clusterId: string): Promise<DoKubernetesCluster>;
|
|
72
|
+
getClusterOrNull(clusterId: string): Promise<DoKubernetesCluster | null>;
|
|
73
|
+
createCluster(options: CreateClusterOptions): Promise<DoKubernetesCluster>;
|
|
74
|
+
updateCluster(clusterId: string, updates: UpdateClusterOptions): Promise<DoKubernetesCluster>;
|
|
75
|
+
deleteCluster(clusterId: string): Promise<void>;
|
|
76
|
+
listNodePools(clusterId: string): Promise<DoKubernetesNodePool[]>;
|
|
77
|
+
getNodePool(clusterId: string, nodePoolId: string): Promise<DoKubernetesNodePool>;
|
|
78
|
+
createNodePool(clusterId: string, nodePool: DoKubernetesNodePool): Promise<DoKubernetesNodePool>;
|
|
79
|
+
updateNodePool(clusterId: string, nodePoolId: string, updates: Partial<DoKubernetesNodePool>): Promise<DoKubernetesNodePool>;
|
|
80
|
+
deleteNodePool(clusterId: string, nodePoolId: string): Promise<void>;
|
|
81
|
+
/**
|
|
82
|
+
* Fetch the raw kubeconfig YAML for the cluster. Caller is responsible for
|
|
83
|
+
* writing to disk and chmod 0600.
|
|
84
|
+
*/
|
|
85
|
+
fetchKubeconfig(clusterId: string, options?: {
|
|
86
|
+
expirySeconds?: number;
|
|
87
|
+
}): Promise<string>;
|
|
88
|
+
listOptions(): Promise<DoKubernetesOptions>;
|
|
89
|
+
latestStableVersion(): Promise<string>;
|
|
90
|
+
updateControlPlaneFirewall(clusterId: string, firewall: {
|
|
91
|
+
enabled: boolean;
|
|
92
|
+
allowed_addresses: string[];
|
|
93
|
+
}): Promise<void>;
|
|
94
|
+
updateClusterlint(clusterId: string, options?: {
|
|
95
|
+
run_clusterlint?: boolean;
|
|
96
|
+
}): Promise<void>;
|
|
97
|
+
updateSso(clusterId: string, sso: {
|
|
98
|
+
enabled: boolean;
|
|
99
|
+
issuer_url?: string;
|
|
100
|
+
client_id?: string;
|
|
101
|
+
}): Promise<void>;
|
|
102
|
+
addRegistries(clusterIds: string[], registries: string[]): Promise<void>;
|
|
103
|
+
}
|
|
104
|
+
export { kubernetesTransportKind, KubernetesTransportDescriptorSchema, type KubernetesTransport, type KubernetesTransportDescriptor } from './transport.ts';
|
|
105
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/kubernetes/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { KubeconfigDocumentSchema } from "../schemas/kubernetes.js";
|
|
2
|
+
import { ClusterListResponseSchema, DoKubernetesClusterSchema, ClusterResponseSchema, NodePoolsResponseSchema, NodePoolResponseSchema, KubernetesOptionsResponseSchema } from "../schemas/http.js";
|
|
3
|
+
export class DigitalOceanKubernetesClient {
|
|
4
|
+
client;
|
|
5
|
+
constructor(client) {
|
|
6
|
+
this.client = client;
|
|
7
|
+
}
|
|
8
|
+
async listClusters() {
|
|
9
|
+
return this.client.collect({
|
|
10
|
+
path: '/kubernetes/clusters',
|
|
11
|
+
extract: (page) => page.kubernetes_clusters ?? [],
|
|
12
|
+
schema: ClusterListResponseSchema,
|
|
13
|
+
itemSchema: DoKubernetesClusterSchema
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
async findClusterByName(name) {
|
|
17
|
+
const clusters = await this.listClusters();
|
|
18
|
+
return clusters.find((c) => c.name === name) ?? null;
|
|
19
|
+
}
|
|
20
|
+
async getCluster(clusterId) {
|
|
21
|
+
const res = await this.client.get(`/kubernetes/clusters/${clusterId}`, {}, ClusterResponseSchema);
|
|
22
|
+
return res.kubernetes_cluster;
|
|
23
|
+
}
|
|
24
|
+
async getClusterOrNull(clusterId) {
|
|
25
|
+
const res = await this.client.getOrNull(`/kubernetes/clusters/${clusterId}`, {}, ClusterResponseSchema);
|
|
26
|
+
return res?.kubernetes_cluster ?? null;
|
|
27
|
+
}
|
|
28
|
+
async createCluster(options) {
|
|
29
|
+
const res = await this.client.post('/kubernetes/clusters', options, {}, ClusterResponseSchema);
|
|
30
|
+
return res.kubernetes_cluster;
|
|
31
|
+
}
|
|
32
|
+
async updateCluster(clusterId, updates) {
|
|
33
|
+
const res = await this.client.put(`/kubernetes/clusters/${clusterId}`, updates, {}, ClusterResponseSchema);
|
|
34
|
+
return res.kubernetes_cluster;
|
|
35
|
+
}
|
|
36
|
+
async deleteCluster(clusterId) {
|
|
37
|
+
await this.client.delete(`/kubernetes/clusters/${clusterId}`);
|
|
38
|
+
}
|
|
39
|
+
async listNodePools(clusterId) {
|
|
40
|
+
const res = await this.client.get(`/kubernetes/clusters/${clusterId}/node_pools`, {}, NodePoolsResponseSchema);
|
|
41
|
+
return res.node_pools;
|
|
42
|
+
}
|
|
43
|
+
async getNodePool(clusterId, nodePoolId) {
|
|
44
|
+
const res = await this.client.get(`/kubernetes/clusters/${clusterId}/node_pools/${nodePoolId}`, {}, NodePoolResponseSchema);
|
|
45
|
+
return res.node_pool;
|
|
46
|
+
}
|
|
47
|
+
async createNodePool(clusterId, nodePool) {
|
|
48
|
+
const res = await this.client.post(`/kubernetes/clusters/${clusterId}/node_pools`, nodePool, {}, NodePoolResponseSchema);
|
|
49
|
+
return res.node_pool;
|
|
50
|
+
}
|
|
51
|
+
async updateNodePool(clusterId, nodePoolId, updates) {
|
|
52
|
+
const res = await this.client.put(`/kubernetes/clusters/${clusterId}/node_pools/${nodePoolId}`, updates, {}, NodePoolResponseSchema);
|
|
53
|
+
return res.node_pool;
|
|
54
|
+
}
|
|
55
|
+
async deleteNodePool(clusterId, nodePoolId) {
|
|
56
|
+
await this.client.delete(`/kubernetes/clusters/${clusterId}/node_pools/${nodePoolId}`);
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Fetch the raw kubeconfig YAML for the cluster. Caller is responsible for
|
|
60
|
+
* writing to disk and chmod 0600.
|
|
61
|
+
*/
|
|
62
|
+
async fetchKubeconfig(clusterId, options = {}) {
|
|
63
|
+
const text = await this.client.get(`/kubernetes/clusters/${clusterId}/kubeconfig`, {
|
|
64
|
+
query: options.expirySeconds ? { expiry_seconds: options.expirySeconds } : undefined
|
|
65
|
+
}, KubeconfigDocumentSchema);
|
|
66
|
+
return text;
|
|
67
|
+
}
|
|
68
|
+
async listOptions() {
|
|
69
|
+
const res = await this.client.get('/kubernetes/options', {}, KubernetesOptionsResponseSchema);
|
|
70
|
+
return res.options;
|
|
71
|
+
}
|
|
72
|
+
async latestStableVersion() {
|
|
73
|
+
const opts = await this.listOptions();
|
|
74
|
+
if (!opts.versions.length) {
|
|
75
|
+
throw new Error('No DOKS Kubernetes versions returned from /kubernetes/options.');
|
|
76
|
+
}
|
|
77
|
+
return opts.versions[0].slug;
|
|
78
|
+
}
|
|
79
|
+
async updateControlPlaneFirewall(clusterId, firewall) {
|
|
80
|
+
await this.client.put(`/kubernetes/clusters/${clusterId}/control_plane_firewall`, firewall);
|
|
81
|
+
}
|
|
82
|
+
async updateClusterlint(clusterId, options = { run_clusterlint: true }) {
|
|
83
|
+
await this.client.post(`/kubernetes/clusters/${clusterId}/clusterlint`, options);
|
|
84
|
+
}
|
|
85
|
+
async updateSso(clusterId, sso) {
|
|
86
|
+
await this.client.put(`/kubernetes/clusters/${clusterId}/sso`, sso);
|
|
87
|
+
}
|
|
88
|
+
async addRegistries(clusterIds, registries) {
|
|
89
|
+
if (clusterIds.length === 0 || registries.length === 0) {
|
|
90
|
+
throw new Error('DOKS registry integration requires at least one cluster and registry.');
|
|
91
|
+
}
|
|
92
|
+
await this.client.post('/kubernetes/registries', {
|
|
93
|
+
cluster_uuids: [...new Set(clusterIds)],
|
|
94
|
+
registries: [...new Set(registries)]
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
export { kubernetesTransportKind, KubernetesTransportDescriptorSchema } from "./transport.js";
|
|
99
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/kubernetes/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type VibesRuntime } from '@vibesdotdev/kernel';
|
|
2
|
+
export { KubernetesTransportDescriptorSchema, type KubernetesTransportDescriptor } from '../schemas/kubernetes.ts';
|
|
3
|
+
import type { KubernetesAuthority } from '../schemas/kubernetes.ts';
|
|
4
|
+
/** Host-owned HTTP transport. TLS material is separate from standard RequestInit. */
|
|
5
|
+
export interface KubernetesTransport {
|
|
6
|
+
request(input: string, init: RequestInit, authority: KubernetesAuthority): Promise<Response>;
|
|
7
|
+
}
|
|
8
|
+
export declare const kubernetesTransportKind: import("@vibesdotdev/kernel").RuntimeKindDescriptorRecord<unknown>;
|
|
9
|
+
/** Resolve the host's declared authority support before sending credentials. */
|
|
10
|
+
export declare function kubernetesRequest(runtime: VibesRuntime, authority: KubernetesAuthority, input: string, init: RequestInit, fallback?: (input: string, init?: RequestInit) => Promise<Response>): Promise<Response>;
|
|
11
|
+
//# sourceMappingURL=transport.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../../src/kubernetes/transport.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsC,KAAK,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAE5F,OAAO,EAAE,mCAAmC,EAAE,KAAK,6BAA6B,EAAE,MAAM,0BAA0B,CAAC;AACnH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAEpE,qFAAqF;AACrF,MAAM,WAAW,mBAAmB;IACnC,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,mBAAmB,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;CAC7F;AACD,eAAO,MAAM,uBAAuB,oEAGlC,CAAC;AAEH,gFAAgF;AAChF,wBAAsB,iBAAiB,CACtC,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,mBAAmB,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EACvF,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,QAAQ,CAAC,GACjE,OAAO,CAAC,QAAQ,CAAC,CAanB"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { CapabilityError, createRuntimeKind } from '@vibesdotdev/kernel';
|
|
2
|
+
import { KubernetesTransportDescriptorSchema } from "../schemas/kubernetes.js";
|
|
3
|
+
export { KubernetesTransportDescriptorSchema } from "../schemas/kubernetes.js";
|
|
4
|
+
export const kubernetesTransportKind = createRuntimeKind({
|
|
5
|
+
id: 'digitalocean/kubernetes-transport',
|
|
6
|
+
descriptorSchema: KubernetesTransportDescriptorSchema
|
|
7
|
+
});
|
|
8
|
+
/** Resolve the host's declared authority support before sending credentials. */
|
|
9
|
+
export async function kubernetesRequest(runtime, authority, input, init, fallback) {
|
|
10
|
+
const required = [];
|
|
11
|
+
if (authority.ca)
|
|
12
|
+
required.push('ca');
|
|
13
|
+
if (authority.cert || authority.key)
|
|
14
|
+
required.push('client-certificate');
|
|
15
|
+
if (runtime.hasKind(kubernetesTransportKind.id)) {
|
|
16
|
+
const transport = await runtime.query(kubernetesTransportKind.id)
|
|
17
|
+
.filter(descriptor => required.every(value => descriptor.authority.includes(value))).first();
|
|
18
|
+
if (transport)
|
|
19
|
+
return transport.request(input, init, authority);
|
|
20
|
+
}
|
|
21
|
+
if (required.length)
|
|
22
|
+
throw new CapabilityError('The host has no transport for the required Kubernetes TLS authority.', 'UNAVAILABLE', {
|
|
23
|
+
reason: 'doks-tls-transport-unavailable', details: { ca: required.includes('ca'), clientCertificate: required.includes('client-certificate') }
|
|
24
|
+
});
|
|
25
|
+
return (fallback ?? runtime.environment.httpFetch?.bind(runtime.environment) ?? fetch)(input, init);
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=transport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport.js","sourceRoot":"","sources":["../../src/kubernetes/transport.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAqB,MAAM,qBAAqB,CAAC;AAC5F,OAAO,EAAE,mCAAmC,EAAsC,MAAM,0BAA0B,CAAC;AACnH,OAAO,EAAE,mCAAmC,EAAsC,MAAM,0BAA0B,CAAC;AAOnH,MAAM,CAAC,MAAM,uBAAuB,GAAG,iBAAiB,CAAC;IACxD,EAAE,EAAE,mCAAmC;IACvC,gBAAgB,EAAE,mCAAmC;CACrD,CAAC,CAAC;AAEH,gFAAgF;AAChF,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACtC,OAAqB,EAAE,SAA8B,EAAE,KAAa,EAAE,IAAiB,EACvF,QAAmE;IAEnE,MAAM,QAAQ,GAAuC,EAAE,CAAC;IACxD,IAAI,SAAS,CAAC,EAAE;QAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtC,IAAI,SAAS,CAAC,IAAI,IAAI,SAAS,CAAC,GAAG;QAAE,QAAQ,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;IACzE,IAAI,OAAO,CAAC,OAAO,CAAC,uBAAuB,CAAC,EAAE,CAAC,EAAE,CAAC;QACjD,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,KAAK,CAAqD,uBAAuB,CAAC,EAAE,CAAC;aACnH,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;QAC9F,IAAI,SAAS;YAAE,OAAO,SAAS,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;IACjE,CAAC;IACD,IAAI,QAAQ,CAAC,MAAM;QAAE,MAAM,IAAI,eAAe,CAAC,sEAAsE,EAAE,aAAa,EAAE;YACrI,MAAM,EAAE,gCAAgC,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,iBAAiB,EAAE,QAAQ,CAAC,QAAQ,CAAC,oBAAoB,CAAC,EAAE;SAC9I,CAAC,CAAC;IACH,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,WAAW,CAAC,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,KAAK,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;AACrG,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DigitalOcean networking: load balancers.
|
|
3
|
+
*
|
|
4
|
+
* Read-only for now — `vibes infra inventory` is the caller, and a load
|
|
5
|
+
* balancer that nothing points at is exactly the kind of resource an inventory
|
|
6
|
+
* has to be able to name. A DOKS service of type LoadBalancer provisions one
|
|
7
|
+
* of these with a hashed name, so the droplet set is the only reliable way to
|
|
8
|
+
* tell which cluster owns it.
|
|
9
|
+
*/
|
|
10
|
+
import type { DigitalOceanControlPlaneClient } from '../client/control-plane.ts';
|
|
11
|
+
export interface DoLoadBalancerForwardingRule {
|
|
12
|
+
entry_protocol: string;
|
|
13
|
+
entry_port: number;
|
|
14
|
+
target_protocol: string;
|
|
15
|
+
target_port: number;
|
|
16
|
+
tls_passthrough?: boolean;
|
|
17
|
+
}
|
|
18
|
+
export type DoLoadBalancer = import('zod/v4').infer<typeof import('../schemas/http.ts').DoLoadBalancerSchema>;
|
|
19
|
+
export declare class DigitalOceanNetworkClient {
|
|
20
|
+
private readonly client;
|
|
21
|
+
constructor(client: DigitalOceanControlPlaneClient);
|
|
22
|
+
listLoadBalancers(): Promise<DoLoadBalancer[]>;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/network/index.ts"],"names":[],"mappings":"AACA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,4BAA4B,CAAC;AAEjF,MAAM,WAAW,4BAA4B;IAC5C,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,MAAM,cAAc,GAAG,OAAO,QAAQ,EAAE,KAAK,CAClD,cAAc,oBAAoB,EAAE,oBAAoB,CACxD,CAAC;AAEF,qBAAa,yBAAyB;IACzB,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,8BAA8B;IAE7D,iBAAiB,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;CAQpD"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { LoadBalancerListResponseSchema, DoLoadBalancerSchema } from "../schemas/http.js";
|
|
2
|
+
export class DigitalOceanNetworkClient {
|
|
3
|
+
client;
|
|
4
|
+
constructor(client) {
|
|
5
|
+
this.client = client;
|
|
6
|
+
}
|
|
7
|
+
async listLoadBalancers() {
|
|
8
|
+
return this.client.collect({
|
|
9
|
+
path: '/load_balancers',
|
|
10
|
+
extract: (page) => page.load_balancers ?? [],
|
|
11
|
+
schema: LoadBalancerListResponseSchema,
|
|
12
|
+
itemSchema: DoLoadBalancerSchema
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/network/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,8BAA8B,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAyB1F,MAAM,OAAO,yBAAyB;IACR;IAA7B,YAA6B,MAAsC;QAAtC,WAAM,GAAN,MAAM,CAAgC;IAAG,CAAC;IAEvE,KAAK,CAAC,iBAAiB;QACtB,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;YAC1B,IAAI,EAAE,iBAAiB;YACvB,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,cAAc,IAAI,EAAE;YAC5C,MAAM,EAAE,8BAA8B;YACtC,UAAU,EAAE,oBAAoB;SAChC,CAAC,CAAC;IACJ,CAAC;CACD"}
|