Skip to content

Commit 076cd77

Browse files
authored
Merge pull request #149 from brendandburns/sockets
Improve loading on Windows and add tests.
2 parents 398ccf0 + 4e89b54 commit 076cd77

File tree

2 files changed

+101
-3
lines changed

2 files changed

+101
-3
lines changed

src/config.ts

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,27 @@ import api = require('./api');
1414
import { Cluster, Context, newClusters, newContexts, newUsers, User } from './config_types';
1515

1616
export class KubeConfig {
17+
// Only public for testing.
18+
public static findHomeDir(): string | null {
19+
if (process.env.HOME) {
20+
if (fs.existsSync(process.env.HOME)) {
21+
return process.env.HOME;
22+
}
23+
}
24+
if (process.platform !== 'win32') {
25+
return null;
26+
}
27+
if (process.env.HOMEDRIVE && process.env.HOMEPATH) {
28+
const dir = path.join(process.env.HOMEDRIVE, process.env.HOMEPATH);
29+
if (fs.existsSync(dir)) {
30+
return dir;
31+
}
32+
}
33+
if (process.env.USERPROFILE && fs.existsSync(process.env.USERPROFILE)) {
34+
return process.env.USERPROFILE;
35+
}
36+
return null;
37+
}
1738

1839
// Only really public for testing...
1940
public static findObject(list: any[], name: string, key: string) {
@@ -199,14 +220,16 @@ export class KubeConfig {
199220
this.loadFromFile(process.env.KUBECONFIG);
200221
return;
201222
}
202-
if (process.env.HOME) {
203-
const config = path.join(process.env.HOME, '.kube', 'config');
223+
const home = KubeConfig.findHomeDir();
224+
if (home) {
225+
const config = path.join(home, '.kube', 'config');
204226
if (fs.existsSync(config)) {
205227
this.loadFromFile(config);
206228
return;
207229
}
208230
}
209231
if (process.platform === 'win32' && shelljs.which('wsl.exe')) {
232+
// TODO: Handle if someome set $KUBECONFIG in wsl here...
210233
const result = shelljs.exec('wsl.exe cat $HOME/.kube/config', { silent: true });
211234
if (result.code === 0) {
212235
this.loadFromString(result.stdout);

src/config_test.ts

Lines changed: 76 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -322,6 +322,81 @@ describe('KubeConfig', () => {
322322
});
323323
});
324324

325+
describe('findHome', () => {
326+
it('should load from HOME if present', () => {
327+
const currentHome = process.env.HOME;
328+
const expectedHome = 'foobar';
329+
process.env.HOME = expectedHome;
330+
const dir = join(process.env.HOME, '.kube');
331+
const arg = {};
332+
arg[dir] = { config: 'data' };
333+
mockfs(arg);
334+
335+
const home = KubeConfig.findHomeDir();
336+
337+
mockfs.restore();
338+
process.env.HOME = currentHome;
339+
340+
expect(home).to.equal(expectedHome);
341+
});
342+
});
343+
344+
describe('win32HomeDirTests', () => {
345+
let originalPlatform: string;
346+
347+
before(() => {
348+
originalPlatform = process.platform;
349+
Object.defineProperty(process, 'platform', {
350+
value: 'win32',
351+
});
352+
});
353+
354+
after(() => {
355+
Object.defineProperty(process, 'platform', {
356+
value: originalPlatform,
357+
});
358+
});
359+
360+
it('should load from HOMEDRIVE/HOMEPATH if present', () => {
361+
const currentHome = process.env.HOME;
362+
363+
delete process.env.HOME;
364+
process.env.HOMEDRIVE = 'foo';
365+
process.env.HOMEPATH = 'bar';
366+
const dir = join(process.env.HOMEDRIVE, process.env.HOMEPATH);
367+
const arg = {};
368+
arg[dir] = { config: 'data' };
369+
mockfs(arg);
370+
371+
const home = KubeConfig.findHomeDir();
372+
373+
mockfs.restore();
374+
process.env.HOME = currentHome;
375+
376+
expect(home).to.equal(dir);
377+
});
378+
379+
it('should load from USERPROFILE if present', () => {
380+
const currentHome = process.env.HOME;
381+
const dir = 'someplace';
382+
383+
delete process.env.HOME;
384+
process.env.HOMEDRIVE = 'foo';
385+
process.env.HOMEPATH = 'bar';
386+
process.env.USERPROFILE = dir;
387+
const arg = {};
388+
arg[dir] = { config: 'data' };
389+
mockfs(arg);
390+
391+
const home = KubeConfig.findHomeDir();
392+
393+
mockfs.restore();
394+
process.env.HOME = currentHome;
395+
396+
expect(home).to.equal(dir);
397+
});
398+
});
399+
325400
describe('loadContextConfigObjects', () => {
326401
it('should fail if name is missing from context', () => {
327402
expect(() => {
@@ -562,7 +637,7 @@ describe('KubeConfig', () => {
562637
const data = readFileSync(kcFileName);
563638
const dir = join(process.env.HOME, '.kube');
564639
const arg = {};
565-
arg[dir] = {config: data};
640+
arg[dir] = { config: data };
566641
mockfs(arg);
567642

568643
const kc = new KubeConfig();

0 commit comments

Comments
 (0)