Skip to content
This repository has been archived by the owner on Mar 9, 2022. It is now read-only.

Commit

Permalink
Filtering out non-running containers/tasks/pods (#209)
Browse files Browse the repository at this point in the history
  • Loading branch information
janmiderback committed Dec 19, 2017
1 parent fedb61f commit 3d6749b
Show file tree
Hide file tree
Showing 6 changed files with 348 additions and 11 deletions.
16 changes: 11 additions & 5 deletions src/orchestration/KubernetesClient.js
Original file line number Diff line number Diff line change
Expand Up @@ -43,12 +43,18 @@ class KubernetesClient {
*/
static async listEngines() {
const pods = await kubeHttpGet(`/api/v1/pods?labelSelector=${Config.discoveryLabel}`);

const engineInfoEntries = pods.items.map((pod) => {
const runningPods = pods.items.filter(
(pod) => {
if (pod.status.phase.toLowerCase() === 'running') {
logger.debug(`Valid engine pod info received: ${JSON.stringify(pod)}`);
return true;
}
logger.info(`Discarding non-running engine pod: ${JSON.stringify(pod)}`);
return false;
});
const engineInfoEntries = runningPods.map((pod) => {
const labels = pod.metadata.labels;
const engine = {
ip: pod.status.podIP,
};
const engine = { ip: pod.status.podIP };
const key = pod.metadata.uid;
return { key, engine, kubernetes: pod, labels };
});
Expand Down
10 changes: 9 additions & 1 deletion src/orchestration/LocalDockerClient.js
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,15 @@ class LocalDockerClient {
return new Promise((resolve, reject) => {
LocalDockerClient.docker.listContainers({ filters: { label: [Config.discoveryLabel] } }, (err, containers) => {
if (!err) {
const engineInfoEntries = containers.map((local) => {
const runningContainers = containers.filter((container) => {
if (container.State.toLowerCase() === 'running') {
logger.debug(`Valid engine container info received: ${JSON.stringify(container)}`);
return true;
}
logger.info(`Discarding non-running engine container: ${JSON.stringify(container)}`);
return false;
});
const engineInfoEntries = runningContainers.map((local) => {
const labels = local.Labels;
const engine = {
ip: getIpAddress(local),
Expand Down
17 changes: 12 additions & 5 deletions src/orchestration/SwarmDockerClient.js
Original file line number Diff line number Diff line change
Expand Up @@ -30,13 +30,20 @@ function getIpAddress(task) {

function getTasks(docker, discoveryLabel) {
return new Promise((resolve, reject) => {
docker.listTasks({ filters: '{ "desired-state": ["running"] }' }, (err, tasks) => {
docker.listTasks({}, (err, tasks) => {
if (!err) {
// We do filtering on the discovery label here, but this should be possible to do by
// specifying a filter on labels above.
const filteredTasks = tasks.filter(
task => discoveryLabel in task.Spec.ContainerSpec.Labels);
resolve(filteredTasks);
// specifying the filter in the listTasks() call above.
const labeledTasks = tasks.filter(task => discoveryLabel in task.Spec.ContainerSpec.Labels);
const runningTasks = labeledTasks.filter((task) => {
if (task.Status.State.toLowerCase() === 'running') {
logger.debug(`Valid engine container task received: ${JSON.stringify(task)}`);
return true;
}
logger.info(`Discarding non-running engine task: ${JSON.stringify(task)}`);
return false;
});
resolve(runningTasks);
} else {
logger.error('Error when listing Docker Swarm tasks', err);
reject(err);
Expand Down
123 changes: 123 additions & 0 deletions test/test-data/KubernetesClient.spec.data.json
Original file line number Diff line number Diff line change
Expand Up @@ -256,6 +256,129 @@
],
"qosClass": "BestEffort"
}
},
{
"metadata": {
"name": "engine-deployment-4234688684-pm222",
"generateName": "engine-deployment-4234688684-",
"namespace": "default",
"selfLink": "/api/v1/namespaces/default/pods/engine-deployment-4234688684-pm222",
"uid": "89fff5bc-872b-11e7-b00a-00155d014987",
"resourceVersion": "113232",
"creationTimestamp": "2017-08-22T11:17:51Z",
"labels": {
"qix-engine": "prod",
"pod-template-hash": "4163433257",
"service": "engine",
"qix-engine-api-port": "9076",
"qix-engine-metrics-port": "9090"
},
"annotations": {
"kubernetes.io/created-by": "{\"kind\":\"SerializedReference\",\"apiVersion\":\"v1\",\"reference\":{\"kind\":\"ReplicaSet\",\"namespace\":\"default\",\"name\":\"engine-deployment-4163433257\",\"uid\":\"88cb5d22-872b-11e7-b00a-00155d014987\",\"apiVersion\":\"extensions\",\"resourceVersion\":\"113210\"}}\n"
},
"ownerReferences": [
{
"apiVersion": "extensions/v1beta1",
"kind": "ReplicaSet",
"name": "engine-deployment-4234688684",
"uid": "88fffd22-872b-11e7-b00a-00155d014987",
"controller": true,
"blockOwnerDeletion": true
}
]
},
"spec": {
"volumes": [
{
"name": "default-token-4l9dx",
"secret": {
"secretName": "default-token-4l9dx",
"defaultMode": 420
}
}
],
"containers": [
{
"name": "engine",
"image": "qlikea/engine:12.42.0",
"ports": [
{
"containerPort": 9076,
"protocol": "TCP"
},
{
"containerPort": 9098,
"protocol": "TCP"
}
],
"resources": {},
"volumeMounts": [
{
"name": "default-token-4l9dx",
"readOnly": true,
"mountPath": "/var/run/secrets/kubernetes.io/serviceaccount"
}
],
"terminationMessagePath": "/dev/termination-log",
"terminationMessagePolicy": "File",
"imagePullPolicy": "IfNotPresent"
}
],
"restartPolicy": "Always",
"terminationGracePeriodSeconds": 30,
"dnsPolicy": "ClusterFirst",
"serviceAccountName": "default",
"serviceAccount": "default",
"nodeName": "minikube",
"securityContext": {},
"imagePullSecrets": [
{
"name": "dockerhub"
}
],
"schedulerName": "default-scheduler"
},
"status": {
"phase": "Paused",
"conditions": [
{
"type": "Initialized",
"status": "True",
"lastProbeTime": null,
"lastTransitionTime": "2017-08-22T11:17:51Z"
},
{
"type": "Ready",
"status": "True",
"lastProbeTime": null,
"lastTransitionTime": "2017-08-22T11:17:53Z"
},
{
"type": "PodScheduled",
"status": "True",
"lastProbeTime": null,
"lastTransitionTime": "2017-08-22T11:17:51Z"
}
],
"startTime": "2017-08-22T11:17:51Z",
"containerStatuses": [
{
"name": "engine",
"state": {
"running": {
"startedAt": "2017-08-22T11:17:52Z"
}
},
"lastState": {},
"ready": true,
"restartCount": 0,
"image": "qlikea/engine:12.42.0",
"imageID": "docker-pullable://qlikea/engine@sha256:331d299079cb758403099dd0cfbd34a2970f3a2d15504d4994fd8425558116ce",
"containerID": "docker://063f46fbc0a77a4cf2e82a2856ceee222a1a0738dfbf33701a49af0a06e2d203"
}
],
"qosClass": "BestEffort"
}
}
]
},
Expand Down
50 changes: 50 additions & 0 deletions test/test-data/LocalDockerClient.spec.data.json
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,56 @@
}
},
"Mounts": []
},
{
"Id": "c506c9b17ee150673dd5818c4ae21f09618f3581c0f19e1c1a24450c6c2eb421",
"Names": [
"/mira_engine3_1"
],
"Image": "qlikea/engine:12.38.0",
"ImageID": "sha256:8f00a39a3f0151ae7d80744eafd6ee71474df010349d44c9cf455a76baf59b1f",
"Command": "./entrypoint.sh",
"Created": 1502866132,
"Ports": [
{
"IP": "0.0.0.0",
"PrivatePort": 9076,
"PublicPort": 9376,
"Type": "tcp"
}
],
"Labels": {
"foo": "foo2",
"bar": "bar2",
"qix-engine": "prod",
"qix-engine-api-port": "9276",
"qix-engine-metrics-port": "9090"
},
"State": "paused",
"Status": "Paused About a minute",
"HostConfig": {
"NetworkMode": "mira_default"
},
"NetworkSettings": {
"Networks": {
"mira_default": {
"IPAMConfig": null,
"Links": null,
"Aliases": null,
"NetworkID": "0ff1add8bc3c672e38b3cfbd6d3d10e824297550f67428508151bde8b19d7916",
"EndpointID": "c64e002b80cd25fb8e402a082157991f569624029f02da957550f14b68560479",
"Gateway": "172.19.0.1",
"IPAddress": "172.19.0.3",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:13:00:02",
"DriverOpts": null
}
}
},
"Mounts": []
}
],
"miraOutput": [
Expand Down
Loading

0 comments on commit 3d6749b

Please sign in to comment.