Showing
14 changed files
with
125 additions
and
38 deletions
@@ -3,7 +3,7 @@ | @@ -3,7 +3,7 @@ | ||
3 | "additionalInfo": null, | 3 | "additionalInfo": null, |
4 | "name": "Root Rule Chain", | 4 | "name": "Root Rule Chain", |
5 | "firstRuleNodeId": null, | 5 | "firstRuleNodeId": null, |
6 | - "root": false, | 6 | + "root": true, |
7 | "debugMode": false, | 7 | "debugMode": false, |
8 | "configuration": null | 8 | "configuration": null |
9 | }, | 9 | }, |
@@ -161,15 +161,15 @@ public class RuleChainController extends BaseController { | @@ -161,15 +161,15 @@ public class RuleChainController extends BaseController { | ||
161 | TenantId tenantId = getCurrentUser().getTenantId(); | 161 | TenantId tenantId = getCurrentUser().getTenantId(); |
162 | RuleChain previousRootRuleChain = ruleChainService.getRootTenantRuleChain(tenantId); | 162 | RuleChain previousRootRuleChain = ruleChainService.getRootTenantRuleChain(tenantId); |
163 | if (ruleChainService.setRootRuleChain(getTenantId(), ruleChainId)) { | 163 | if (ruleChainService.setRootRuleChain(getTenantId(), ruleChainId)) { |
164 | + if (previousRootRuleChain != null) { | ||
165 | + previousRootRuleChain = ruleChainService.findRuleChainById(getTenantId(), previousRootRuleChain.getId()); | ||
164 | 166 | ||
165 | - previousRootRuleChain = ruleChainService.findRuleChainById(getTenantId(), previousRootRuleChain.getId()); | ||
166 | - | ||
167 | - tbClusterService.onEntityStateChange(previousRootRuleChain.getTenantId(), previousRootRuleChain.getId(), | ||
168 | - ComponentLifecycleEvent.UPDATED); | ||
169 | - | ||
170 | - logEntityAction(previousRootRuleChain.getId(), previousRootRuleChain, | ||
171 | - null, ActionType.UPDATED, null); | 167 | + tbClusterService.onEntityStateChange(previousRootRuleChain.getTenantId(), previousRootRuleChain.getId(), |
168 | + ComponentLifecycleEvent.UPDATED); | ||
172 | 169 | ||
170 | + logEntityAction(previousRootRuleChain.getId(), previousRootRuleChain, | ||
171 | + null, ActionType.UPDATED, null); | ||
172 | + } | ||
173 | ruleChain = ruleChainService.findRuleChainById(getTenantId(), ruleChainId); | 173 | ruleChain = ruleChainService.findRuleChainById(getTenantId(), ruleChainId); |
174 | 174 | ||
175 | tbClusterService.onEntityStateChange(ruleChain.getTenantId(), ruleChain.getId(), | 175 | tbClusterService.onEntityStateChange(ruleChain.getTenantId(), ruleChain.getId(), |
@@ -88,26 +88,33 @@ public class BaseRuleChainService extends AbstractEntityService implements RuleC | @@ -88,26 +88,33 @@ public class BaseRuleChainService extends AbstractEntityService implements RuleC | ||
88 | RuleChain ruleChain = ruleChainDao.findById(tenantId, ruleChainId.getId()); | 88 | RuleChain ruleChain = ruleChainDao.findById(tenantId, ruleChainId.getId()); |
89 | if (!ruleChain.isRoot()) { | 89 | if (!ruleChain.isRoot()) { |
90 | RuleChain previousRootRuleChain = getRootTenantRuleChain(ruleChain.getTenantId()); | 90 | RuleChain previousRootRuleChain = getRootTenantRuleChain(ruleChain.getTenantId()); |
91 | - if (!previousRootRuleChain.getId().equals(ruleChain.getId())) { | ||
92 | - try { | 91 | + try { |
92 | + if (previousRootRuleChain == null) { | ||
93 | + setRootAndSave(tenantId, ruleChain); | ||
94 | + return true; | ||
95 | + } else if (!previousRootRuleChain.getId().equals(ruleChain.getId())) { | ||
93 | deleteRelation(tenantId, new EntityRelation(previousRootRuleChain.getTenantId(), previousRootRuleChain.getId(), | 96 | deleteRelation(tenantId, new EntityRelation(previousRootRuleChain.getTenantId(), previousRootRuleChain.getId(), |
94 | EntityRelation.CONTAINS_TYPE, RelationTypeGroup.RULE_CHAIN)); | 97 | EntityRelation.CONTAINS_TYPE, RelationTypeGroup.RULE_CHAIN)); |
95 | previousRootRuleChain.setRoot(false); | 98 | previousRootRuleChain.setRoot(false); |
96 | ruleChainDao.save(tenantId, previousRootRuleChain); | 99 | ruleChainDao.save(tenantId, previousRootRuleChain); |
97 | - createRelation(tenantId, new EntityRelation(ruleChain.getTenantId(), ruleChain.getId(), | ||
98 | - EntityRelation.CONTAINS_TYPE, RelationTypeGroup.RULE_CHAIN)); | ||
99 | - ruleChain.setRoot(true); | ||
100 | - ruleChainDao.save(tenantId, ruleChain); | 100 | + setRootAndSave(tenantId, ruleChain); |
101 | return true; | 101 | return true; |
102 | - } catch (ExecutionException | InterruptedException e) { | ||
103 | - log.warn("[{}] Failed to set root rule chain, ruleChainId: [{}]", ruleChainId); | ||
104 | - throw new RuntimeException(e); | ||
105 | } | 102 | } |
103 | + } catch (ExecutionException | InterruptedException e) { | ||
104 | + log.warn("[{}] Failed to set root rule chain, ruleChainId: [{}]", ruleChainId); | ||
105 | + throw new RuntimeException(e); | ||
106 | } | 106 | } |
107 | } | 107 | } |
108 | return false; | 108 | return false; |
109 | } | 109 | } |
110 | 110 | ||
111 | + private void setRootAndSave(TenantId tenantId, RuleChain ruleChain) throws ExecutionException, InterruptedException { | ||
112 | + createRelation(tenantId, new EntityRelation(ruleChain.getTenantId(), ruleChain.getId(), | ||
113 | + EntityRelation.CONTAINS_TYPE, RelationTypeGroup.RULE_CHAIN)); | ||
114 | + ruleChain.setRoot(true); | ||
115 | + ruleChainDao.save(tenantId, ruleChain); | ||
116 | + } | ||
117 | + | ||
111 | @Override | 118 | @Override |
112 | public RuleChainMetaData saveRuleChainMetaData(TenantId tenantId, RuleChainMetaData ruleChainMetaData) { | 119 | public RuleChainMetaData saveRuleChainMetaData(TenantId tenantId, RuleChainMetaData ruleChainMetaData) { |
113 | Validator.validateId(ruleChainMetaData.getRuleChainId(), "Incorrect rule chain id."); | 120 | Validator.validateId(ruleChainMetaData.getRuleChainId(), "Incorrect rule chain id."); |
@@ -58,7 +58,7 @@ In case of any issues you can examine service logs for errors. | @@ -58,7 +58,7 @@ In case of any issues you can examine service logs for errors. | ||
58 | For example to see ThingsBoard node logs execute the following command: | 58 | For example to see ThingsBoard node logs execute the following command: |
59 | 59 | ||
60 | ` | 60 | ` |
61 | -$ docker-compose logs -f tb1 | 61 | +$ docker-compose logs -f tb-core1 tb-rule-engine1 |
62 | ` | 62 | ` |
63 | 63 | ||
64 | Or use `docker-compose ps` to see the state of all the containers. | 64 | Or use `docker-compose ps` to see the state of all the containers. |
@@ -24,14 +24,28 @@ services: | @@ -24,14 +24,28 @@ services: | ||
24 | - "9042" | 24 | - "9042" |
25 | volumes: | 25 | volumes: |
26 | - ./tb-node/cassandra:/var/lib/cassandra | 26 | - ./tb-node/cassandra:/var/lib/cassandra |
27 | - tb1: | 27 | + tb-core1: |
28 | env_file: | 28 | env_file: |
29 | - tb-node.cassandra.env | 29 | - tb-node.cassandra.env |
30 | depends_on: | 30 | depends_on: |
31 | - kafka | 31 | - kafka |
32 | - redis | 32 | - redis |
33 | - cassandra | 33 | - cassandra |
34 | - tb2: | 34 | + tb-core2: |
35 | + env_file: | ||
36 | + - tb-node.cassandra.env | ||
37 | + depends_on: | ||
38 | + - kafka | ||
39 | + - redis | ||
40 | + - cassandra | ||
41 | + tb-rule-engine1: | ||
42 | + env_file: | ||
43 | + - tb-node.cassandra.env | ||
44 | + depends_on: | ||
45 | + - kafka | ||
46 | + - redis | ||
47 | + - cassandra | ||
48 | + tb-rule-engine2: | ||
35 | env_file: | 49 | env_file: |
36 | - tb-node.cassandra.env | 50 | - tb-node.cassandra.env |
37 | depends_on: | 51 | depends_on: |
@@ -20,10 +20,16 @@ services: | @@ -20,10 +20,16 @@ services: | ||
20 | postgres: | 20 | postgres: |
21 | volumes: | 21 | volumes: |
22 | - postgres-db-volume:/var/lib/postgresql/data | 22 | - postgres-db-volume:/var/lib/postgresql/data |
23 | - tb1: | 23 | + tb-core1: |
24 | volumes: | 24 | volumes: |
25 | - tb-log-volume:/var/log/thingsboard | 25 | - tb-log-volume:/var/log/thingsboard |
26 | - tb2: | 26 | + tb-core2: |
27 | + volumes: | ||
28 | + - tb-log-volume:/var/log/thingsboard | ||
29 | + tb-rule-engine1: | ||
30 | + volumes: | ||
31 | + - tb-log-volume:/var/log/thingsboard | ||
32 | + tb-rule-engine2: | ||
27 | volumes: | 33 | volumes: |
28 | - tb-log-volume:/var/log/thingsboard | 34 | - tb-log-volume:/var/log/thingsboard |
29 | tb-coap-transport: | 35 | tb-coap-transport: |
@@ -27,14 +27,28 @@ services: | @@ -27,14 +27,28 @@ services: | ||
27 | POSTGRES_PASSWORD: postgres | 27 | POSTGRES_PASSWORD: postgres |
28 | volumes: | 28 | volumes: |
29 | - ./tb-node/postgres:/var/lib/postgresql/data | 29 | - ./tb-node/postgres:/var/lib/postgresql/data |
30 | - tb1: | 30 | + tb-core1: |
31 | env_file: | 31 | env_file: |
32 | - tb-node.postgres.env | 32 | - tb-node.postgres.env |
33 | depends_on: | 33 | depends_on: |
34 | - kafka | 34 | - kafka |
35 | - redis | 35 | - redis |
36 | - postgres | 36 | - postgres |
37 | - tb2: | 37 | + tb-core2: |
38 | + env_file: | ||
39 | + - tb-node.postgres.env | ||
40 | + depends_on: | ||
41 | + - kafka | ||
42 | + - redis | ||
43 | + - postgres | ||
44 | + tb-rule-engine1: | ||
45 | + env_file: | ||
46 | + - tb-node.postgres.env | ||
47 | + depends_on: | ||
48 | + - kafka | ||
49 | + - redis | ||
50 | + - postgres | ||
51 | + tb-rule-engine2: | ||
38 | env_file: | 52 | env_file: |
39 | - tb-node.postgres.env | 53 | - tb-node.postgres.env |
40 | depends_on: | 54 | depends_on: |
@@ -48,7 +48,7 @@ services: | @@ -48,7 +48,7 @@ services: | ||
48 | - tb-js-executor.env | 48 | - tb-js-executor.env |
49 | depends_on: | 49 | depends_on: |
50 | - kafka | 50 | - kafka |
51 | - tb1: | 51 | + tb-core1: |
52 | restart: always | 52 | restart: always |
53 | image: "${DOCKER_REPO}/${TB_NODE_DOCKER_NAME}:${TB_VERSION}" | 53 | image: "${DOCKER_REPO}/${TB_NODE_DOCKER_NAME}:${TB_VERSION}" |
54 | ports: | 54 | ports: |
@@ -59,7 +59,8 @@ services: | @@ -59,7 +59,8 @@ services: | ||
59 | max-size: "200m" | 59 | max-size: "200m" |
60 | max-file: "30" | 60 | max-file: "30" |
61 | environment: | 61 | environment: |
62 | - TB_SERVICE_ID: tb1 | 62 | + TB_SERVICE_ID: tb-core1 |
63 | + TB_SERVICE_TYPE: tb-core | ||
63 | env_file: | 64 | env_file: |
64 | - tb-node.env | 65 | - tb-node.env |
65 | volumes: | 66 | volumes: |
@@ -69,7 +70,7 @@ services: | @@ -69,7 +70,7 @@ services: | ||
69 | - kafka | 70 | - kafka |
70 | - redis | 71 | - redis |
71 | - tb-js-executor | 72 | - tb-js-executor |
72 | - tb2: | 73 | + tb-core2: |
73 | restart: always | 74 | restart: always |
74 | image: "${DOCKER_REPO}/${TB_NODE_DOCKER_NAME}:${TB_VERSION}" | 75 | image: "${DOCKER_REPO}/${TB_NODE_DOCKER_NAME}:${TB_VERSION}" |
75 | ports: | 76 | ports: |
@@ -80,7 +81,52 @@ services: | @@ -80,7 +81,52 @@ services: | ||
80 | max-size: "200m" | 81 | max-size: "200m" |
81 | max-file: "30" | 82 | max-file: "30" |
82 | environment: | 83 | environment: |
83 | - TB_SERVICE_ID: tb2 | 84 | + TB_SERVICE_ID: tb-core2 |
85 | + TB_SERVICE_TYPE: tb-core | ||
86 | + env_file: | ||
87 | + - tb-node.env | ||
88 | + volumes: | ||
89 | + - ./tb-node/conf:/config | ||
90 | + - ./tb-node/log:/var/log/thingsboard | ||
91 | + depends_on: | ||
92 | + - kafka | ||
93 | + - redis | ||
94 | + - tb-js-executor | ||
95 | + tb-rule-engine1: | ||
96 | + restart: always | ||
97 | + image: "${DOCKER_REPO}/${TB_NODE_DOCKER_NAME}:${TB_VERSION}" | ||
98 | + ports: | ||
99 | + - "8080" | ||
100 | + logging: | ||
101 | + driver: "json-file" | ||
102 | + options: | ||
103 | + max-size: "200m" | ||
104 | + max-file: "30" | ||
105 | + environment: | ||
106 | + TB_SERVICE_ID: tb-rule-engine1 | ||
107 | + TB_SERVICE_TYPE: tb-rule-engine | ||
108 | + env_file: | ||
109 | + - tb-node.env | ||
110 | + volumes: | ||
111 | + - ./tb-node/conf:/config | ||
112 | + - ./tb-node/log:/var/log/thingsboard | ||
113 | + depends_on: | ||
114 | + - kafka | ||
115 | + - redis | ||
116 | + - tb-js-executor | ||
117 | + tb-rule-engine2: | ||
118 | + restart: always | ||
119 | + image: "${DOCKER_REPO}/${TB_NODE_DOCKER_NAME}:${TB_VERSION}" | ||
120 | + ports: | ||
121 | + - "8080" | ||
122 | + logging: | ||
123 | + driver: "json-file" | ||
124 | + options: | ||
125 | + max-size: "200m" | ||
126 | + max-file: "30" | ||
127 | + environment: | ||
128 | + TB_SERVICE_ID: tb-rule-engine2 | ||
129 | + TB_SERVICE_TYPE: tb-rule-engine | ||
84 | env_file: | 130 | env_file: |
85 | - tb-node.env | 131 | - tb-node.env |
86 | volumes: | 132 | volumes: |
@@ -195,8 +241,8 @@ services: | @@ -195,8 +241,8 @@ services: | ||
195 | MQTT_PORT: 1883 | 241 | MQTT_PORT: 1883 |
196 | FORCE_HTTPS_REDIRECT: "false" | 242 | FORCE_HTTPS_REDIRECT: "false" |
197 | links: | 243 | links: |
198 | - - tb1 | ||
199 | - - tb2 | 244 | + - tb-core1 |
245 | + - tb-core2 | ||
200 | - tb-web-ui1 | 246 | - tb-web-ui1 |
201 | - tb-web-ui2 | 247 | - tb-web-ui2 |
202 | - tb-mqtt-transport1 | 248 | - tb-mqtt-transport1 |
@@ -49,6 +49,6 @@ if [ ! -z "${ADDITIONAL_STARTUP_SERVICES// }" ]; then | @@ -49,6 +49,6 @@ if [ ! -z "${ADDITIONAL_STARTUP_SERVICES// }" ]; then | ||
49 | docker-compose -f docker-compose.yml $ADDITIONAL_COMPOSE_ARGS up -d redis $ADDITIONAL_STARTUP_SERVICES | 49 | docker-compose -f docker-compose.yml $ADDITIONAL_COMPOSE_ARGS up -d redis $ADDITIONAL_STARTUP_SERVICES |
50 | fi | 50 | fi |
51 | 51 | ||
52 | -docker-compose -f docker-compose.yml $ADDITIONAL_COMPOSE_ARGS run --no-deps --rm -e INSTALL_TB=true -e LOAD_DEMO=${loadDemo} tb1 | 52 | +docker-compose -f docker-compose.yml $ADDITIONAL_COMPOSE_ARGS run --no-deps --rm -e INSTALL_TB=true -e LOAD_DEMO=${loadDemo} tb-core1 |
53 | 53 | ||
54 | 54 |
@@ -44,8 +44,8 @@ ADDITIONAL_COMPOSE_ARGS=$(additionalComposeArgs) || exit $? | @@ -44,8 +44,8 @@ ADDITIONAL_COMPOSE_ARGS=$(additionalComposeArgs) || exit $? | ||
44 | 44 | ||
45 | ADDITIONAL_STARTUP_SERVICES=$(additionalStartupServices) || exit $? | 45 | ADDITIONAL_STARTUP_SERVICES=$(additionalStartupServices) || exit $? |
46 | 46 | ||
47 | -docker-compose -f docker-compose.yml $ADDITIONAL_COMPOSE_ARGS pull tb1 | 47 | +docker-compose -f docker-compose.yml $ADDITIONAL_COMPOSE_ARGS pull tb-core1 |
48 | 48 | ||
49 | docker-compose -f docker-compose.yml $ADDITIONAL_COMPOSE_ARGS up -d redis $ADDITIONAL_STARTUP_SERVICES | 49 | docker-compose -f docker-compose.yml $ADDITIONAL_COMPOSE_ARGS up -d redis $ADDITIONAL_STARTUP_SERVICES |
50 | 50 | ||
51 | -docker-compose -f docker-compose.yml $ADDITIONAL_COMPOSE_ARGS run --no-deps --rm -e UPGRADE_TB=true -e FROM_VERSION=${fromVersion} tb1 | 51 | +docker-compose -f docker-compose.yml $ADDITIONAL_COMPOSE_ARGS run --no-deps --rm -e UPGRADE_TB=true -e FROM_VERSION=${fromVersion} tb-core1 |
@@ -111,6 +111,6 @@ backend tb-api-backend | @@ -111,6 +111,6 @@ backend tb-api-backend | ||
111 | balance leastconn | 111 | balance leastconn |
112 | option tcp-check | 112 | option tcp-check |
113 | option log-health-checks | 113 | option log-health-checks |
114 | - server tbApi1 tb1:8080 check inter 5s resolvers docker_resolver resolve-prefer ipv4 | ||
115 | - server tbApi2 tb2:8080 check inter 5s resolvers docker_resolver resolve-prefer ipv4 | 114 | + server tbApi1 tb-core1:8080 check inter 5s resolvers docker_resolver resolve-prefer ipv4 |
115 | + server tbApi2 tb-core2:8080 check inter 5s resolvers docker_resolver resolve-prefer ipv4 | ||
116 | http-request set-header X-Forwarded-Port %[dst_port] | 116 | http-request set-header X-Forwarded-Port %[dst_port] |
@@ -4,7 +4,7 @@ ZOOKEEPER_ENABLED=true | @@ -4,7 +4,7 @@ ZOOKEEPER_ENABLED=true | ||
4 | ZOOKEEPER_URL=zookeeper:2181 | 4 | ZOOKEEPER_URL=zookeeper:2181 |
5 | TB_QUEUE_TYPE=kafka | 5 | TB_QUEUE_TYPE=kafka |
6 | TB_KAFKA_SERVERS=kafka:9092 | 6 | TB_KAFKA_SERVERS=kafka:9092 |
7 | -JS_EVALUATOR=local | 7 | +JS_EVALUATOR=remote |
8 | TRANSPORT_TYPE=remote | 8 | TRANSPORT_TYPE=remote |
9 | CACHE_TYPE=redis | 9 | CACHE_TYPE=redis |
10 | REDIS_HOST=redis | 10 | REDIS_HOST=redis |
@@ -92,7 +92,7 @@ public class ThingsBoardDbInstaller extends ExternalResource { | @@ -92,7 +92,7 @@ public class ThingsBoardDbInstaller extends ExternalResource { | ||
92 | dockerCompose.withCommand("up -d redis postgres"); | 92 | dockerCompose.withCommand("up -d redis postgres"); |
93 | dockerCompose.invokeCompose(); | 93 | dockerCompose.invokeCompose(); |
94 | 94 | ||
95 | - dockerCompose.withCommand("run --no-deps --rm -e INSTALL_TB=true -e LOAD_DEMO=true tb1"); | 95 | + dockerCompose.withCommand("run --no-deps --rm -e INSTALL_TB=true -e LOAD_DEMO=true tb-core1"); |
96 | dockerCompose.invokeCompose(); | 96 | dockerCompose.invokeCompose(); |
97 | 97 | ||
98 | } finally { | 98 | } finally { |