@kubernetes/client-node
Advanced tools
Comparing version 0.10.1 to 0.10.2
@@ -0,1 +1,2 @@ | ||
import { Informer, ListPromise, ObjectCallback } from './informer'; | ||
import { KubernetesObject } from './types'; | ||
@@ -7,4 +8,3 @@ import { Watch } from './watch'; | ||
} | ||
export declare type ListCallback<T extends KubernetesObject> = (list: T[]) => void; | ||
export declare class ListWatch<T extends KubernetesObject> implements ObjectCache<T> { | ||
export declare class ListWatch<T extends KubernetesObject> implements ObjectCache<T>, Informer<T> { | ||
private readonly path; | ||
@@ -15,10 +15,15 @@ private readonly watch; | ||
private readonly indexCache; | ||
constructor(path: string, watch: Watch, listFn: (callback: ListCallback<T>) => void); | ||
private readonly callbackCache; | ||
constructor(path: string, watch: Watch, listFn: ListPromise<T>, autoStart?: boolean); | ||
start(): void; | ||
on(verb: string, cb: ObjectCallback<T>): void; | ||
get(name: string, namespace?: string): T | undefined; | ||
list(namespace?: string | undefined): ReadonlyArray<T>; | ||
private doneHandler; | ||
private addOrUpdateItems; | ||
private indexObj; | ||
private watchHandler; | ||
} | ||
export declare function addOrUpdateObject<T extends KubernetesObject>(objects: T[], obj: T): void; | ||
export declare function deleteObject<T extends KubernetesObject>(objects: T[], obj: T): void; | ||
export declare function deleteItems<T extends KubernetesObject>(oldObjects: T[], newObjects: T[], deleteCallback?: Array<ObjectCallback<T>>): T[]; | ||
export declare function addOrUpdateObject<T extends KubernetesObject>(objects: T[], obj: T, addCallback?: Array<ObjectCallback<T>>, updateCallback?: Array<ObjectCallback<T>>): void; | ||
export declare function deleteObject<T extends KubernetesObject>(objects: T[], obj: T, deleteCallback?: Array<ObjectCallback<T>>): void; |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
const tslib_1 = require("tslib"); | ||
const informer_1 = require("./informer"); | ||
class ListWatch { | ||
constructor(path, watch, listFn) { | ||
constructor(path, watch, listFn, autoStart = true) { | ||
this.path = path; | ||
@@ -10,6 +12,21 @@ this.watch = watch; | ||
this.indexCache = {}; | ||
this.callbackCache = {}; | ||
this.watch = watch; | ||
this.listFn = listFn; | ||
if (autoStart) { | ||
this.doneHandler(null); | ||
} | ||
} | ||
start() { | ||
this.doneHandler(null); | ||
} | ||
on(verb, cb) { | ||
if (verb !== informer_1.ADD && verb !== informer_1.UPDATE && verb !== informer_1.DELETE) { | ||
throw new Error(`Unknown verb: ${verb}`); | ||
} | ||
if (!this.callbackCache[verb]) { | ||
this.callbackCache[verb] = []; | ||
} | ||
this.callbackCache[verb].push(cb); | ||
} | ||
get(name, namespace) { | ||
@@ -27,8 +44,17 @@ return this.objects.find((obj) => { | ||
doneHandler(err) { | ||
this.listFn((result) => { | ||
this.objects = result; | ||
for (const elt of this.objects) { | ||
this.indexObj(elt); | ||
return tslib_1.__awaiter(this, void 0, void 0, function* () { | ||
const promise = this.listFn(); | ||
const result = yield promise; | ||
const list = result.body; | ||
deleteItems(this.objects, list.items, this.callbackCache[informer_1.DELETE]); | ||
this.addOrUpdateItems(list.items); | ||
this.watch.watch(this.path, { resourceVersion: list.metadata.resourceVersion }, this.watchHandler.bind(this), this.doneHandler.bind(this)); | ||
}); | ||
} | ||
addOrUpdateItems(items) { | ||
items.forEach((obj) => { | ||
addOrUpdateObject(this.objects, obj, this.callbackCache[informer_1.ADD], this.callbackCache[informer_1.UPDATE]); | ||
if (obj.metadata.namespace) { | ||
this.indexObj(obj); | ||
} | ||
this.watch.watch(this.path, {}, this.watchHandler.bind(this), this.doneHandler.bind(this)); | ||
}); | ||
@@ -48,3 +74,3 @@ } | ||
case 'MODIFIED': | ||
addOrUpdateObject(this.objects, obj); | ||
addOrUpdateObject(this.objects, obj, this.callbackCache[informer_1.ADD], this.callbackCache[informer_1.UPDATE]); | ||
if (obj.metadata.namespace) { | ||
@@ -55,3 +81,3 @@ this.indexObj(obj); | ||
case 'DELETED': | ||
deleteObject(this.objects, obj); | ||
deleteObject(this.objects, obj, this.callbackCache[informer_1.DELETE]); | ||
if (obj.metadata.namespace) { | ||
@@ -68,10 +94,29 @@ const namespaceList = this.indexCache[obj.metadata.namespace]; | ||
exports.ListWatch = ListWatch; | ||
// external for testing | ||
function deleteItems(oldObjects, newObjects, deleteCallback) { | ||
return oldObjects.filter((obj) => { | ||
if (findKubernetesObject(newObjects, obj) === -1) { | ||
if (deleteCallback) { | ||
deleteCallback.forEach((fn) => fn(obj)); | ||
} | ||
return false; | ||
} | ||
return true; | ||
}); | ||
} | ||
exports.deleteItems = deleteItems; | ||
// Only public for testing. | ||
function addOrUpdateObject(objects, obj) { | ||
function addOrUpdateObject(objects, obj, addCallback, updateCallback) { | ||
const ix = findKubernetesObject(objects, obj); | ||
if (ix === -1) { | ||
objects.push(obj); | ||
if (addCallback) { | ||
addCallback.forEach((elt) => elt(obj)); | ||
} | ||
} | ||
else { | ||
objects[ix] = obj; | ||
if (updateCallback) { | ||
updateCallback.forEach((elt) => elt(obj)); | ||
} | ||
} | ||
@@ -89,6 +134,9 @@ } | ||
// Public for testing. | ||
function deleteObject(objects, obj) { | ||
function deleteObject(objects, obj, deleteCallback) { | ||
const ix = findKubernetesObject(objects, obj); | ||
if (ix !== -1) { | ||
objects.splice(ix, 1); | ||
if (deleteCallback) { | ||
deleteCallback.forEach((elt) => elt(obj)); | ||
} | ||
} | ||
@@ -95,0 +143,0 @@ } |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
const tslib_1 = require("tslib"); | ||
const jsonpath = tslib_1.__importStar(require("jsonpath-plus")); | ||
const shelljs = tslib_1.__importStar(require("shelljs")); | ||
const jsonpath = require("jsonpath-plus"); | ||
const shelljs = require("shelljs"); | ||
class CloudAuth { | ||
@@ -7,0 +6,0 @@ isAuthProvider(user) { |
export interface Cluster { | ||
readonly name: string; | ||
readonly caData?: string; | ||
readonly caFile?: string; | ||
caFile?: string; | ||
readonly server: string; | ||
@@ -12,6 +12,6 @@ readonly skipTLSVerify: boolean; | ||
readonly certData?: string; | ||
readonly certFile?: string; | ||
certFile?: string; | ||
readonly exec?: any; | ||
readonly keyData?: string; | ||
readonly keyFile?: string; | ||
keyFile?: string; | ||
readonly authProvider?: any; | ||
@@ -18,0 +18,0 @@ readonly token?: string; |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
const tslib_1 = require("tslib"); | ||
const fs = tslib_1.__importStar(require("fs")); | ||
const u = tslib_1.__importStar(require("underscore")); | ||
const fs = require("fs"); | ||
const u = require("underscore"); | ||
function newClusters(a) { | ||
@@ -7,0 +6,0 @@ return u.map(a, clusterIterator()); |
@@ -24,6 +24,2 @@ /// <reference types="node" /> | ||
'currentContext': string; | ||
/** | ||
* Root directory for a config file driven config. Used for loading relative cert paths. | ||
*/ | ||
'rootDirectory': string; | ||
getContexts(): Context[]; | ||
@@ -46,4 +42,9 @@ getClusters(): Cluster[]; | ||
loadFromCluster(pathPrefix?: string): void; | ||
mergeConfig(config: KubeConfig): void; | ||
addCluster(cluster: Cluster): void; | ||
addUser(user: User): void; | ||
addContext(ctx: Context): void; | ||
loadFromDefault(): void; | ||
makeApiClient<T extends ApiType>(apiClientType: ApiConstructor<T>): T; | ||
makePathsAbsolute(rootDirectory: string): void; | ||
private getCurrentContextObject; | ||
@@ -57,5 +58,3 @@ private applyHTTPSOptions; | ||
} | ||
export interface ApiConstructor<T extends ApiType> { | ||
new (server: string): T; | ||
} | ||
declare type ApiConstructor<T extends ApiType> = new (server: string) => T; | ||
export declare class Config { | ||
@@ -72,3 +71,4 @@ static SERVICEACCOUNT_ROOT: string; | ||
} | ||
export declare function bufferFromFileOrString(root?: string, file?: string, data?: string): Buffer | null; | ||
export declare function makeAbsolutePath(root: string, file: string): string; | ||
export declare function bufferFromFileOrString(file?: string, data?: string): Buffer | null; | ||
export declare function findHomeDir(): string | null; | ||
@@ -79,1 +79,2 @@ export interface Named { | ||
export declare function findObject<T extends Named>(list: T[], name: string, key: string): T | null; | ||
export {}; |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
const tslib_1 = require("tslib"); | ||
const fs = require("fs"); | ||
@@ -8,3 +7,3 @@ const path = require("path"); | ||
const shelljs = require("shelljs"); | ||
const api = tslib_1.__importStar(require("./api")); | ||
const api = require("./api"); | ||
const cloud_auth_1 = require("./cloud_auth"); | ||
@@ -66,4 +65,5 @@ const config_types_1 = require("./config_types"); | ||
loadFromFile(file) { | ||
this.rootDirectory = path.dirname(file); | ||
const rootDirectory = path.dirname(file); | ||
this.loadFromString(fs.readFileSync(file, 'utf8')); | ||
this.makePathsAbsolute(rootDirectory); | ||
} | ||
@@ -152,5 +152,47 @@ applytoHTTPSOptions(opts) { | ||
} | ||
mergeConfig(config) { | ||
this.currentContext = config.currentContext; | ||
config.clusters.forEach((cluster) => { | ||
this.addCluster(cluster); | ||
}); | ||
config.users.forEach((user) => { | ||
this.addUser(user); | ||
}); | ||
config.contexts.forEach((ctx) => { | ||
this.addContext(ctx); | ||
}); | ||
} | ||
addCluster(cluster) { | ||
this.clusters.forEach((c, ix) => { | ||
if (c.name === cluster.name) { | ||
throw new Error(`Duplicate cluster: ${c.name}`); | ||
} | ||
}); | ||
this.clusters.push(cluster); | ||
} | ||
addUser(user) { | ||
this.users.forEach((c, ix) => { | ||
if (c.name === user.name) { | ||
throw new Error(`Duplicate user: ${c.name}`); | ||
} | ||
}); | ||
this.users.push(user); | ||
} | ||
addContext(ctx) { | ||
this.contexts.forEach((c, ix) => { | ||
if (c.name === ctx.name) { | ||
throw new Error(`Duplicate context: ${c.name}`); | ||
} | ||
}); | ||
this.contexts.push(ctx); | ||
} | ||
loadFromDefault() { | ||
if (process.env.KUBECONFIG && process.env.KUBECONFIG.length > 0) { | ||
this.loadFromFile(process.env.KUBECONFIG); | ||
const files = process.env.KUBECONFIG.split(path.delimiter); | ||
this.loadFromFile(files[0]); | ||
for (let i = 1; i < files.length; i++) { | ||
const kc = new KubeConfig(); | ||
kc.loadFromFile(files[i]); | ||
this.mergeConfig(kc); | ||
} | ||
return; | ||
@@ -191,2 +233,17 @@ } | ||
} | ||
makePathsAbsolute(rootDirectory) { | ||
this.clusters.forEach((cluster) => { | ||
if (cluster.caFile) { | ||
cluster.caFile = makeAbsolutePath(rootDirectory, cluster.caFile); | ||
} | ||
}); | ||
this.users.forEach((user) => { | ||
if (user.certFile) { | ||
user.certFile = makeAbsolutePath(rootDirectory, user.certFile); | ||
} | ||
if (user.keyFile) { | ||
user.keyFile = makeAbsolutePath(rootDirectory, user.keyFile); | ||
} | ||
}); | ||
} | ||
getCurrentContextObject() { | ||
@@ -204,13 +261,11 @@ return this.getContextObject(this.currentContext); | ||
} | ||
const ca = cluster != null | ||
? bufferFromFileOrString(this.rootDirectory, cluster.caFile, cluster.caData) | ||
: null; | ||
const ca = cluster != null ? bufferFromFileOrString(cluster.caFile, cluster.caData) : null; | ||
if (ca) { | ||
opts.ca = ca; | ||
} | ||
const cert = bufferFromFileOrString(this.rootDirectory, user.certFile, user.certData); | ||
const cert = bufferFromFileOrString(user.certFile, user.certData); | ||
if (cert) { | ||
opts.cert = cert; | ||
} | ||
const key = bufferFromFileOrString(this.rootDirectory, user.keyFile, user.keyData); | ||
const key = bufferFromFileOrString(user.keyFile, user.keyData); | ||
if (key) { | ||
@@ -285,8 +340,12 @@ opts.key = key; | ||
exports.Config = Config; | ||
function makeAbsolutePath(root, file) { | ||
if (!root || path.isAbsolute(file)) { | ||
return file; | ||
} | ||
return path.join(root, file); | ||
} | ||
exports.makeAbsolutePath = makeAbsolutePath; | ||
// This is public really only for testing. | ||
function bufferFromFileOrString(root, file, data) { | ||
function bufferFromFileOrString(file, data) { | ||
if (file) { | ||
if (!path.isAbsolute(file) && root) { | ||
file = path.join(root, file); | ||
} | ||
return fs.readFileSync(file); | ||
@@ -293,0 +352,0 @@ } |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
const tslib_1 = require("tslib"); | ||
const shell = tslib_1.__importStar(require("shelljs")); | ||
const shell = require("shelljs"); | ||
class ExecAuth { | ||
@@ -6,0 +5,0 @@ constructor() { |
@@ -11,1 +11,2 @@ export * from './config'; | ||
export * from './log'; | ||
export * from './informer'; |
@@ -13,2 +13,3 @@ "use strict"; | ||
tslib_1.__exportStar(require("./log"), exports); | ||
tslib_1.__exportStar(require("./informer"), exports); | ||
//# sourceMappingURL=index.js.map |
@@ -7,7 +7,7 @@ import { V1ListMeta, V1ObjectMeta } from './api'; | ||
} | ||
export interface KubernetesListObject { | ||
export interface KubernetesListObject<T extends KubernetesObject> { | ||
apiVersion?: string; | ||
kind?: string; | ||
metadata?: V1ListMeta; | ||
items: KubernetesObject; | ||
items: T[]; | ||
} |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
const tslib_1 = require("tslib"); | ||
const json_stream_1 = tslib_1.__importDefault(require("json-stream")); | ||
const JSONStream = require("json-stream"); | ||
const request = require("request"); | ||
@@ -39,3 +38,3 @@ class DefaultRequest { | ||
this.config.applyToRequest(requestOptions); | ||
const stream = new json_stream_1.default(); | ||
const stream = new JSONStream(); | ||
stream.on('data', (data) => callback(data.type, data.object)); | ||
@@ -42,0 +41,0 @@ const req = this.requestImpl.webRequest(requestOptions, (error, response, body) => { |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
const tslib_1 = require("tslib"); | ||
const yaml = tslib_1.__importStar(require("js-yaml")); | ||
const yaml = require("js-yaml"); | ||
function loadYaml(data, opts) { | ||
@@ -6,0 +5,0 @@ return yaml.safeLoad(data, opts); |
{ | ||
"name": "@kubernetes/client-node", | ||
"version": "0.10.1", | ||
"version": "0.10.2", | ||
"description": "NodeJS client for kubernetes", | ||
@@ -50,3 +50,3 @@ "repository": { | ||
"dependencies": { | ||
"@types/js-yaml": "^3.11.2", | ||
"@types/js-yaml": "^3.12.1", | ||
"@types/node": "^10.12.0", | ||
@@ -69,3 +69,3 @@ "@types/request": "^2.47.1", | ||
"@types/chai-as-promised": "^7.1.0", | ||
"@types/mocha": "^5.2.5", | ||
"@types/mocha": "^5.2.7", | ||
"@types/mock-fs": "^3.6.30", | ||
@@ -77,3 +77,3 @@ "@types/stream-buffers": "^3.0.3", | ||
"jasmine": "^3.3.0", | ||
"mocha": "^5.2.0", | ||
"mocha": "^6.1.4", | ||
"mock-fs": "^4.7.0", | ||
@@ -86,4 +86,4 @@ "nock": "^10.0.6", | ||
"ts-mockito": "^2.3.1", | ||
"ts-node": "^7.0.1", | ||
"tslint": "^5.11.0", | ||
"ts-node": "^8.2.0", | ||
"tslint": "^5.17.0", | ||
"typescript": "^3.1.3" | ||
@@ -90,0 +90,0 @@ }, |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
6628611
44
36273
Updated@types/js-yaml@^3.12.1