Skip to content

Commit

Permalink
v2.0.0 fixes
Browse files Browse the repository at this point in the history
  • Loading branch information
raffis committed Feb 15, 2019
1 parent f02db50 commit 986709d
Show file tree
Hide file tree
Showing 12 changed files with 208 additions and 138 deletions.
6 changes: 3 additions & 3 deletions config.json
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@
"hostDefinition": {},
"serviceTemplates": ["generic-service"],
"hostTemplates": ["generic-host"],
"applyServices": false
"applyServices": true
},
"NodePort": {
"discover": true,
Expand All @@ -50,7 +50,7 @@
"hostDefinition": {},
"serviceTemplates": ["generic-service"],
"hostTemplates": ["generic-host"],
"applyServices": false,
"applyServices": true,
"attachToNodes": false
},
"LoadBalancer": {
Expand All @@ -60,7 +60,7 @@
"hostDefinition": {},
"serviceTemplates": ["generic-service"],
"hostTemplates": ["generic-host"],
"applyServices": false
"applyServices": true
}
}
}
Expand Down
19 changes: 12 additions & 7 deletions src/config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ const config = {
},
ingresses: {
discover: process.env.KUBERNETES_INGRESSES_DISCOVER || defaultConfig.kubernetes.ingresses.discover || true,
hostName: process.env.KUBERNETES_INGRESSES_HOSTNAME || defaultConfig.kubernetes.ingresses.hostName || 'kubernetes-ingresses',
applyServices: process.env.KUBERNETES_INGRESSES_APPLYSERVICES || defaultConfig.kubernetes.ingresses.applyServices || true,
serviceDefinition: process.env.KUBERNETES_INGRESSES_SERVICE_DEFINITION || defaultConfig.kubernetes.ingresses.serviceDefinition || {},
hostDefinition: process.env.KUBERNETES_INGRESSES_HOST_DEFINITION || defaultConfig.kubernetes.ingresses.hostDefinition || {},
Expand All @@ -34,17 +35,19 @@ const config = {
attachToNodes: process.env.KUBERNETES_INGRESSES_ATTACHTONODES || defaultConfig.kubernetes.ingresses.attachToNodes || false,
},
volumes: {
discover: process.env.KUBERNETES_INGRESSES_DISCOVER || defaultConfig.kubernetes.volumes.discover || true,
applyServices: process.env.KUBERNETES_INGRESSES_APPLYSERVICES || defaultConfig.kubernetes.volumes.applyServices || true,
serviceDefinition: process.env.KUBERNETES_INGRESSES_SERVICE_DEFINITION || defaultConfig.kubernetes.volumes.serviceDefinition || {},
hostDefinition: process.env.KUBERNETES_INGRESSES_HOST_DEFINITION || defaultConfig.kubernetes.volumes.hostDefinition || {},
serviceTemplates: process.env.KUBERNETES_INGRESSES_SERVICE_TEMPLATES || defaultConfig.kubernetes.volumes.serviceTemplates || ['generic-service'],
hostTemplates: process.env.KUBERNETES_INGRESSES_HOST_TEMPLATES || defaultConfig.kubernetes.volumes.hostTemplates || ['generic-host'],
attachToNodes: process.env.KUBERNETES_INGRESSES_ATTACHTONODES || defaultConfig.kubernetes.volumes.attachToNodes || false,
discover: process.env.KUBERNETES_VOLUMES_DISCOVER || defaultConfig.kubernetes.volumes.discover || true,
hostName: process.env.KUBERNETES_VOLUMES_HOSTNAME || defaultConfig.kubernetes.volumes.hostName || 'kubernetes-volumes',
applyServices: process.env.KUBERNETES_VOLUMES_APPLYSERVICES || defaultConfig.kubernetes.volumes.applyServices || true,
serviceDefinition: process.env.KUBERNETES_VOLUMES_SERVICE_DEFINITION || defaultConfig.kubernetes.volumes.serviceDefinition || {},
hostDefinition: process.env.KUBERNETES_VOLUMES_HOST_DEFINITION || defaultConfig.kubernetes.volumes.hostDefinition || {},
serviceTemplates: process.env.KUBERNETES_VOLUMES_SERVICE_TEMPLATES || defaultConfig.kubernetes.volumes.serviceTemplates || ['generic-service'],
hostTemplates: process.env.KUBERNETES_VOLUMES_HOST_TEMPLATES || defaultConfig.kubernetes.volumes.hostTemplates || ['generic-host'],
attachToNodes: process.env.KUBERNETES_VOLUMES_ATTACHTONODES || defaultConfig.kubernetes.volumes.attachToNodes || false,
},
services: {
ClusterIP: {
discover: process.env.KUBERNETES_SERVICES_CLUSTERIP_DISCOVER || defaultConfig.kubernetes.services.ClusterIP.discover || false,
hostName: process.env.KUBERNETES_SERVICES_CLUSTERIP_HOSTNAME || defaultConfig.kubernetes.services.ClusterIP.hostName || 'kubernetes-clusterip-services',
applyServices: process.env.KUBERNETES_SERVICES_CLUSTERIP_APPLYSERVICES || defaultConfig.kubernetes.services.ClusterIP.applyServices || true,
serviceDefinition: process.env.KUBERNETES_SERVICES_CLUSTERIP_SERVICE_DEFINITION || defaultConfig.kubernetes.services.ClusterIP.serviceDefinition || {},
hostDefinition: process.env.KUBERNETES_SERVICES_CLUSTERIP_HOST_DEFINITION || defaultConfig.kubernetes.services.ClusterIP.hostDefinition || {},
Expand All @@ -53,6 +56,7 @@ const config = {
},
NodePort: {
discover: process.env.KUBERNETES_SERVICES_NODEPORT_DISCOVER || defaultConfig.kubernetes.services.NodePort.discover || true,
hostName: process.env.KUBERNETES_SERVICES_NODEPORT_HOSTNAME || defaultConfig.kubernetes.services.NodePort.hostName || 'kubernetes-nodeport-services',
applyServices: process.env.KUBERNETES_SERVICES_NODEPORT_APPLYSERVICES || defaultConfig.kubernetes.services.NodePort.applyServices || true,
serviceDefinition: process.env.KUBERNETES_SERVICES_NODEPORT_SERVICE_DEFINITION || defaultConfig.kubernetes.services.NodePort.serviceDefinition || {},
hostDefinition: process.env.KUBERNETES_SERVICES_NODEPORT_HOST_DEFINITION || defaultConfig.kubernetes.services.NodePort.hostDefinition || {},
Expand All @@ -61,6 +65,7 @@ const config = {
},
LoadBalancer: {
discover: process.env.KUBERNETES_SERVICES_LOADBALANCER_DISCOVER || defaultConfig.kubernetes.services.LoadBalancer.discover || true,
hostName: process.env.KUBERNETES_SERVICES_LOADBALANCER_HOSTNAME || defaultConfig.kubernetes.services.LoadBalancer.hostName || 'kubernetes-loadbalancer-services',
applyServices: process.env.KUBERNETES_SERVICES_LOADBALANCER_APPLYSERVICES || defaultConfig.kubernetes.services.LoadBalancer.applyServices || true,
serviceDefinition: process.env.KUBERNETES_SERVICES_LOADBALANCER_SERVICE_DEFINITION || defaultConfig.kubernetes.services.LoadBalancer.serviceDefinition || {},
hostDefinition: process.env.KUBERNETES_SERVICES_LOADBALANCER_HOST_DEFINITION || defaultConfig.kubernetes.services.LoadBalancer.hostDefinition || {},
Expand Down
45 changes: 44 additions & 1 deletion src/icinga.ts
Original file line number Diff line number Diff line change
Expand Up @@ -210,7 +210,7 @@ export default class Icinga {
/**
* Cleanup all previously deployed icinga kubernetes objects
*/
public async cleanup(): Promise<any> {
/*public async cleanup(): Promise<any> {
this.logger.info('start cleanup, removing all kubernetes objects from icinga');
return new Promise((resolve, reject) => {
Expand Down Expand Up @@ -238,6 +238,49 @@ export default class Icinga {
handlers.push(this.deleteHost(host.attrs.name));
}
await Promise.all(handlers);
resolve(true);
});
});
}*/

/**
* Delete services by filter
*/
public async deleteServicesByFilter(filter: string): Promise<any> {
return new Promise((resolve, reject) => {
this.icingaClient.getServiceFiltered({filter: filter}, async (err, result) => {
console.log(err, result);
if (err) {
return reject(err);
}

let handlers = [];
for (const service of result) {
handlers.push(this.deleteService(service.attrs.host_name, service.attrs.name));
}

await Promise.all(handlers);
resolve(true);
});
});
}

/**
* Delete hosts by filter
*/
public async deleteHostsByFilter(filter: string): Promise<any> {
return new Promise((resolve, reject) => {
this.icingaClient.getHostFiltered({filter: filter}, async (err, result) => {
if (err) {
return reject(err);
}

let handlers = [];
for (const host of result) {
handlers.push(this.deleteHost(host.attrs.name));
}

await Promise.all(handlers);
resolve(true);
});
Expand Down
50 changes: 23 additions & 27 deletions src/kube/ingress.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import {Logger} from 'winston';
import Icinga from '../icinga';
import JSONStream from 'json-stream';
import KubeNode from './node';
import Resource from './abstract.resource';

Expand All @@ -21,11 +20,10 @@ interface IngressOptions {
export default class Ingress extends Resource {
protected logger: Logger;
protected icinga: Icinga;
protected jsonStream: JSONStream;
protected kubeNode: KubeNode;
protected options = {
applyServices: true,
hostName: "kubernetes-ingresses",
hostName: 'kubernetes-ingresses',
attachToNodes: false,
hostDefinition: {},
serviceDefinition: {},
Expand All @@ -36,11 +34,10 @@ export default class Ingress extends Resource {
/**
* kubernetes hosts
*/
constructor(logger: Logger, kubeNode: KubeNode, icinga: Icinga, jsonStream: JSONStream, options: IngressOptions) {
constructor(logger: Logger, kubeNode: KubeNode, icinga: Icinga, options: IngressOptions) {
super();
this.logger = logger;
this.icinga = icinga;
this.jsonStream = jsonStream;
this.kubeNode = kubeNode;
this.options = Object.assign(this.options, options);
}
Expand Down Expand Up @@ -102,6 +99,7 @@ export default class Ingress extends Resource {
'check_command': 'http',
'display_name': `${spec.host}${base}:http`,
'vars._kubernetes': true,
'vars._kubernetes_uid': definition.metadata.uid,
'vars.kubernetes': definition,
'vars.http_address': spec.host,
'vars.http_vhost': spec.host,
Expand Down Expand Up @@ -130,38 +128,45 @@ export default class Ingress extends Resource {
* Get hostname
*/
protected getHostname(definition: any): string {
if(definition.metadata.annotations['kube-icinga/host']) {
if (definition.metadata.annotations['kube-icinga/host']) {
return definition.metadata.annotations['kube-icinga/host'];
} else if(this.options.hostName === null) {
} else if (this.options.hostName === null) {
return this.escapeName(['ingress', definition.metadata.namespace, definition.metadata.name].join('-'));
}

return this.options.hostName;
}
}

/**
* Delete object
*/
protected deleteObject(definition: any): Promise<boolean> {
if (this.options.hostName === null) {
let hostname = this.getHostname(definition);
return this.icinga.deleteHost(hostname);
}

return this.icinga.deleteServicesByFilter('service.vars.kubernetes.metadata.uid=="'+definition.metadata.uid+'"');
}

/**
* Start kube listener
*/
public async kubeListener(provider) {
console.log("Start listener before try");
try {
let stream = provider();
console.log("Start listener");
console.log(stream);
stream.pipe(this.jsonStream);
this.jsonStream.on('data', async (object) => {
console.log("data");
stream.on('data', async (object) => {
this.logger.debug('received kubernetes ingress resource', {object});

if (object.object.kind !== 'Ingress') {
this.logger.error('skip invalid ingress object', {object: object});
return;
}

let hostname = this.escapeName(['ingress', object.object.metadata.namespace, object.object.metadata.name].join('-'));
if (object.type == 'MODIFIED' || object.type == 'DELETED') {
let hostname = this.getHostname(object.object);
await this.icinga.deleteHost(hostname);
await this.deleteObject(object.object).catch((err) => {
this.logger.error('failed to remove objects', {error: err})
});
}

if (object.type == 'ADDED' || object.type == 'MODIFIED') {
Expand All @@ -171,16 +176,7 @@ console.log("Start listener before try");
}
});

this.jsonStream.on('finish', () => {
console.log("finish", this.kubeListener, provider);
this.kubeListener(provider);
});
this.jsonStream.on('error', () => {
console.log("error", this.kubeListener, provider);
this.kubeListener(provider);
});
this.jsonStream.on('end', () => {
console.log("end", this.kubeListener, provider);
stream.on('finish', () => {
this.kubeListener(provider);
});
} catch (err) {
Expand Down
12 changes: 4 additions & 8 deletions src/kube/node.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import {Logger} from 'winston';
import Icinga from '../icinga';
import JSONStream from 'json-stream';
import Resource from './abstract.resource';

interface NodeOptions {
Expand All @@ -15,7 +14,6 @@ interface NodeOptions {
export default class Node extends Resource {
protected logger: Logger;
protected icinga: Icinga;
protected jsonStream: JSONStream;
protected nodes: string[] = [];
protected options: NodeOptions = {
discover: true,
Expand All @@ -26,11 +24,10 @@ export default class Node extends Resource {
/**
* kubernetes hosts
*/
constructor(logger: Logger, icinga: Icinga, jsonStream: JSONStream, options: NodeOptions) {
constructor(logger: Logger, icinga: Icinga, options: NodeOptions) {
super();
this.logger = logger;
this.icinga = icinga;
this.jsonStream = jsonStream;
this.options = Object.assign(this.options, options);
}

Expand Down Expand Up @@ -67,9 +64,8 @@ export default class Node extends Resource {
*/
public async kubeListener(provider) {
try {
const stream = provider();
stream.pipe(this.jsonStream);
this.jsonStream.on('data', async (object) => {
let stream = provider();
stream.on('data', async (object) => {
// ignore MODIFIER for kube nodes
if (object.type === 'MODIFIED') {
return;
Expand All @@ -92,7 +88,7 @@ export default class Node extends Resource {
}
});

this.jsonStream.on('finish', () => {
stream.on('finish', () => {
this.kubeListener(provider);
});
} catch (err) {
Expand Down
Loading

0 comments on commit 986709d

Please sign in to comment.