1 |
|
2 |
|
3 | const _ = require('lodash');
|
4 | const expect = require('chai').expect;
|
5 | const Promise = require('bluebird');
|
6 | const TestConfig = require('../config');
|
7 | const Utils = require('../utils');
|
8 | const Manager = require('../../app/services/manager');
|
9 | const createEsClient = require('../../config/elasticsearch');
|
10 | const createRedisClient = require('../../config/redis');
|
11 | const config = require('../../config/index');
|
12 |
|
13 | const log = config.log;
|
14 |
|
15 | Promise.longStackTraces();
|
16 | Promise.onPossiblyUnhandledRejection((error) => log.error('Likely error: ', error.stack));
|
17 |
|
18 | describe('job manager', function () {
|
19 | this.timeout(5000);
|
20 |
|
21 | let source = null;
|
22 | let redis = null;
|
23 | let manager = null;
|
24 | let utils = null;
|
25 |
|
26 | before((done) => {
|
27 | source = createEsClient(TestConfig.elasticsearch.source);
|
28 | redis = createRedisClient(TestConfig.redis.host, TestConfig.redis.port);
|
29 | manager = new Manager(redis);
|
30 | utils = new Utils();
|
31 |
|
32 | utils.deleteAllTemplates(source)
|
33 | .finally(() => utils.deleteAllIndices(source))
|
34 | .finally(() => redis.flushdb())
|
35 | .finally(() => done());
|
36 | });
|
37 |
|
38 | afterEach((done) => {
|
39 | utils.deleteAllTemplates(source)
|
40 | .finally(() => utils.deleteAllIndices(source))
|
41 | .finally(() => redis.flushdb())
|
42 | .finally(() => done());
|
43 | });
|
44 |
|
45 | it('should not accept the same name twice', (done) => {
|
46 | const names = [
|
47 | 'same',
|
48 | 'same',
|
49 | 'different'
|
50 | ];
|
51 |
|
52 | const getName = () => {
|
53 | return names.shift();
|
54 | };
|
55 |
|
56 | manager._setWorkerName(getName).then((name) => {
|
57 | expect(name).to.be.equals('same');
|
58 | return manager._setWorkerName(getName);
|
59 | }).then((name) => {
|
60 | expect(name).to.be.equals('different');
|
61 | done();
|
62 | }).catch(done);
|
63 | });
|
64 |
|
65 | it('should expire old names', function (done) {
|
66 | this.timeout(2000);
|
67 | const names = [
|
68 | 'same',
|
69 | 'same'
|
70 | ];
|
71 |
|
72 | manager._overrideNameTimeout(1);
|
73 |
|
74 | const getName = () => {
|
75 | return names.shift();
|
76 | };
|
77 |
|
78 | manager._setWorkerName(getName).delay(1100).then((name) => {
|
79 | expect(name).to.be.equals('same');
|
80 | return manager._setWorkerName(getName);
|
81 | }).then((name) => {
|
82 | expect(name).to.be.equals('same');
|
83 | done();
|
84 | }).catch(done);
|
85 | });
|
86 |
|
87 | it('should expire worker statuses', function (done) {
|
88 | this.timeout(2000);
|
89 | const names = [
|
90 | 'same',
|
91 | 'different'
|
92 | ];
|
93 |
|
94 | manager._overrideNameTimeout(1);
|
95 |
|
96 | const getName = () => {
|
97 | return names.shift();
|
98 | };
|
99 |
|
100 | manager._setWorkerName(getName).then((name) => {
|
101 | expect(name).to.be.equals('same');
|
102 | return manager._setWorkerName(getName);
|
103 | }).then((name) => {
|
104 | expect(name).to.be.equals('different');
|
105 | return manager.workerHeartbeat('same', 'running');
|
106 | }).then(() => {
|
107 | return manager.workerHeartbeat('different', 'broken');
|
108 | }).then(() => {
|
109 | return manager.getWorkersStatus();
|
110 | }).delay(500).then((status) => {
|
111 | expect(_.size(status)).to.be.equals(2);
|
112 | expect(status.same).to.be.equals('running');
|
113 | expect(status.different).to.be.equals('broken');
|
114 | return manager.workerHeartbeat('same', 'running');
|
115 | }).delay(600).then(() => {
|
116 | return manager.getWorkersStatus();
|
117 | }).then((status) => {
|
118 | expect(_.size(status)).to.be.equals(1);
|
119 | expect(status.same).to.be.equals('running');
|
120 | done();
|
121 | }).catch(done);
|
122 | });
|
123 | });
|