Skip to content

Commit 555d2d6

Browse files
committed
fix: cp from pod was broken
1 parent e745839 commit 555d2d6

File tree

2 files changed

+80
-0
lines changed

2 files changed

+80
-0
lines changed

src/test/integration/cpFromPod.ts

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
import assert from 'node:assert';
2+
import fs from 'node:fs';
3+
import path from 'node:path';
4+
import os from 'node:os';
5+
import { CoreV1Api, KubeConfig, V1Pod } from '../../index.js';
6+
import { Cp } from '../../cp.js';
7+
import { generateName } from './name.js';
8+
9+
export default async function cpFromPod() {
10+
const kc = new KubeConfig();
11+
kc.loadFromDefault();
12+
13+
const coreV1Client = kc.makeApiClient(CoreV1Api);
14+
const cp = new Cp(kc);
15+
16+
const testPodName = generateName('cp-test-pod');
17+
const namespace = 'default';
18+
19+
const pod = new V1Pod();
20+
pod.metadata = { name: testPodName };
21+
pod.spec = {
22+
containers: [
23+
{
24+
name: 'test-container',
25+
image: 'busybox',
26+
command: ['sh', '-c', 'echo "test content" > /tmp/test.txt && sleep 3600'],
27+
},
28+
],
29+
restartPolicy: 'Never',
30+
};
31+
32+
console.log(`Creating pod ${testPodName}`);
33+
await coreV1Client.createNamespacedPod({ namespace, body: pod });
34+
35+
console.log('Waiting for pod to be ready...');
36+
let podReady = false;
37+
for (let i = 0; i < 30; i++) {
38+
const currentPod = await coreV1Client.readNamespacedPod({ name: testPodName, namespace });
39+
if (currentPod.status?.phase === 'Running') {
40+
podReady = true;
41+
break;
42+
}
43+
await new Promise((resolve) => setTimeout(resolve, 1000));
44+
}
45+
46+
assert.strictEqual(podReady, true, 'Pod did not become ready in time');
47+
console.log('Pod is ready');
48+
49+
const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'k8s-cp-test-'));
50+
51+
try {
52+
console.log('Copying file from pod...');
53+
54+
cp.cpFromPod(namespace, testPodName, 'test-container', 'test.txt', tempDir, '/tmp');
55+
56+
// Wait for file to appear
57+
const copiedFilePath = path.join(tempDir, 'test.txt');
58+
let fileExists = false;
59+
for (let i = 0; i < 20; i++) {
60+
if (fs.existsSync(copiedFilePath)) {
61+
fileExists = true;
62+
break;
63+
}
64+
await new Promise((resolve) => setTimeout(resolve, 500));
65+
}
66+
67+
assert.strictEqual(fileExists, true, 'File was not copied');
68+
69+
const content = fs.readFileSync(copiedFilePath, 'utf-8');
70+
assert.strictEqual(content.trim(), 'test content', 'File content does not match');
71+
72+
console.log('cpFromPod test passed!');
73+
} finally {
74+
console.log('Cleaning up...');
75+
await coreV1Client.deleteNamespacedPod({ name: testPodName, namespace });
76+
fs.rmSync(tempDir, { recursive: true, force: true });
77+
}
78+
}

src/test/integration/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import patchNamespace from './patchNamespace.js';
2+
import cpFromPod from './cpFromPod.js';
23

34
console.log('Integration testing');
45

56
await patchNamespace();
7+
await cpFromPod();

0 commit comments

Comments
 (0)