151 changed files with 4245 additions and 1110 deletions
@ -0,0 +1,40 @@ |
|||
# |
|||
# Copyright © 2016-2023 The Thingsboard Authors |
|||
# |
|||
# Licensed under the Apache License, Version 2.0 (the "License"); |
|||
# you may not use this file except in compliance with the License. |
|||
# You may obtain a copy of the License at |
|||
# |
|||
# http://www.apache.org/licenses/LICENSE-2.0 |
|||
# |
|||
# Unless required by applicable law or agreed to in writing, software |
|||
# distributed under the License is distributed on an "AS IS" BASIS, |
|||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|||
# See the License for the specific language governing permissions and |
|||
# limitations under the License. |
|||
# |
|||
|
|||
name: Check configuration files |
|||
on: |
|||
push: |
|||
branches: |
|||
- master |
|||
pull_request: |
|||
paths: |
|||
- 'application/src/main/resources/thingsboard.yml' |
|||
jobs: |
|||
build: |
|||
name: Check thingsboard.yml file |
|||
runs-on: ubuntu-20.04 |
|||
steps: |
|||
- name: Checkout code |
|||
uses: actions/checkout@v2 |
|||
- name: Set up Python 3.10 |
|||
uses: actions/setup-python@v3 |
|||
with: |
|||
python-version: "3.10.2" |
|||
architecture: "x64" |
|||
env: |
|||
AGENT_TOOLSDIRECTORY: /opt/hostedtoolcache |
|||
- name: Run Verification Script |
|||
run: python3 tools/src/main/python/check_yml_file.py |
|||
@ -0,0 +1,13 @@ |
|||
{ |
|||
"widgetsBundle": { |
|||
"alias": "weather_widgets", |
|||
"title": "Weather widgets", |
|||
"image": null, |
|||
"description": null, |
|||
"externalId": null, |
|||
"name": "Weather widgets" |
|||
}, |
|||
"widgetTypeFqns": [ |
|||
"wind_speed_and_direction" |
|||
] |
|||
} |
|||
@ -0,0 +1,29 @@ |
|||
{ |
|||
"fqn": "wind_speed_and_direction", |
|||
"name": "Wind speed and direction", |
|||
"deprecated": false, |
|||
"image": "data:image/png;base64,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", |
|||
"description": "Displays the latest values of the wind speed and direction.", |
|||
"descriptor": { |
|||
"type": "latest", |
|||
"sizeX": 3, |
|||
"sizeY": 3, |
|||
"resources": [], |
|||
"templateHtml": "<tb-wind-speed-direction-widget \n [ctx]=\"ctx\"\n [widgetTitlePanel]=\"widgetTitlePanel\">\n</tb-wind-speed-direction-widget>", |
|||
"templateCss": "", |
|||
"controllerScript": "self.onInit = function() {\n self.ctx.$scope.windSpeedDirectionWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.windSpeedDirectionWidget.onDataUpdated();\n};\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 2,\n singleEntity: true,\n previewWidth: '270px',\n previewHeight: '270px',\n embedTitlePanel: true\n };\n};\n\nself.actionSources = function() {\n return {\n 'cardClick': {\n name: 'widget-action.card-click',\n multiple: false\n }\n };\n}\n\nself.onDestroy = function() {\n};\n", |
|||
"settingsSchema": "", |
|||
"dataKeySettingsSchema": "", |
|||
"settingsDirective": "tb-wind-speed-direction-widget-settings", |
|||
"hasBasicMode": true, |
|||
"basicModeDirective": "tb-wind-speed-direction-basic-config", |
|||
"defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"windDirection\",\"color\":\"#4caf50\",\"settings\":{},\"_hash\":0.7227918773301678,\"funcBody\":\"if (prevValue === 0) {\\n prevValue = Math.random() * 360;\\n}\\nvar value = prevValue + Math.random() * 20 - 10;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 360) {\\n\\tvalue = 360;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"centerValue\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.2392660816082064,\"funcBody\":\"var value = prevValue + Math.random() * 7;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 30) {\\n\\tvalue = 0;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":\"m/s\",\"decimals\":1,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]}}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":false,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"0px\",\"settings\":{\"layout\":\"default\",\"centerValueFont\":{\"family\":\"Roboto\",\"size\":24,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\",\"lineHeight\":\"32px\"},\"centerValueColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"ticksColor\":\"rgba(0, 0, 0, 0.12)\",\"directionalNamesElseDegrees\":true,\"majorTicksFont\":{\"family\":\"Roboto\",\"size\":14,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\",\"lineHeight\":\"20px\"},\"majorTicksColor\":\"rgba(158, 158, 158, 1)\",\"minorTicksFont\":{\"family\":\"Roboto\",\"size\":14,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\",\"lineHeight\":\"20px\"},\"minorTicksColor\":\"rgba(0, 0, 0, 0.12)\",\"arrowColor\":\"rgba(0, 0, 0, 0.87)\",\"background\":{\"type\":\"color\",\"color\":\"#fff\",\"overlay\":{\"enabled\":false,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}}},\"title\":\"Wind speed and direction\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"units\":\"\",\"decimals\":0,\"useDashboardTimewindow\":true,\"showLegend\":false,\"widgetStyle\":{},\"actions\":{\"headerButton\":[]},\"configMode\":\"basic\",\"displayTimewindow\":true,\"margin\":\"0px\",\"borderRadius\":\"0px\",\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"showTitleIcon\":false,\"titleTooltip\":\"\",\"titleFont\":{\"size\":16,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"24px\"},\"titleIcon\":\"air\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"iconSize\":\"24px\",\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"14px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1\"},\"color\":null},\"titleColor\":\"rgba(0, 0, 0, 0.87)\"}" |
|||
}, |
|||
"externalId": null, |
|||
"tags": [ |
|||
"wind", |
|||
"weather", |
|||
"compass", |
|||
"degrees" |
|||
] |
|||
} |
|||
File diff suppressed because it is too large
@ -1,64 +0,0 @@ |
|||
/** |
|||
* Copyright © 2016-2023 The Thingsboard Authors |
|||
* |
|||
* Licensed under the Apache License, Version 2.0 (the "License"); |
|||
* you may not use this file except in compliance with the License. |
|||
* You may obtain a copy of the License at |
|||
* |
|||
* http://www.apache.org/licenses/LICENSE-2.0
|
|||
* |
|||
* Unless required by applicable law or agreed to in writing, software |
|||
* distributed under the License is distributed on an "AS IS" BASIS, |
|||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|||
* See the License for the specific language governing permissions and |
|||
* limitations under the License. |
|||
*/ |
|||
package org.thingsboard.server.dao.alarm; |
|||
|
|||
import lombok.AllArgsConstructor; |
|||
import lombok.Builder; |
|||
import lombok.Data; |
|||
import org.thingsboard.server.common.data.alarm.Alarm; |
|||
import org.thingsboard.server.common.data.alarm.AlarmApiCallResult; |
|||
import org.thingsboard.server.common.data.alarm.AlarmSeverity; |
|||
import org.thingsboard.server.common.data.id.EntityId; |
|||
|
|||
import java.util.Collections; |
|||
import java.util.List; |
|||
|
|||
@Builder |
|||
@Data |
|||
@AllArgsConstructor |
|||
@Deprecated |
|||
public class AlarmOperationResult { |
|||
private final Alarm alarm; |
|||
private final boolean successful; |
|||
private final boolean created; |
|||
private final AlarmSeverity oldSeverity; |
|||
private final List<EntityId> propagatedEntitiesList; |
|||
|
|||
public AlarmOperationResult(Alarm alarm, boolean successful) { |
|||
this(alarm, successful, Collections.emptyList()); |
|||
} |
|||
|
|||
public AlarmOperationResult(Alarm alarm, boolean successful, List<EntityId> propagatedEntitiesList) { |
|||
this(alarm, successful, false, null, propagatedEntitiesList); |
|||
} |
|||
|
|||
public AlarmOperationResult(Alarm alarm, boolean successful, boolean created, List<EntityId> propagatedEntitiesList) { |
|||
this.alarm = alarm; |
|||
this.successful = successful; |
|||
this.created = created; |
|||
this.propagatedEntitiesList = propagatedEntitiesList; |
|||
this.oldSeverity = null; |
|||
} |
|||
|
|||
//Temporary while we have not removed the AlarmOperationResult.
|
|||
public AlarmOperationResult(AlarmApiCallResult result) { |
|||
this.alarm = result.getAlarm() != null ? new Alarm(result.getAlarm()) : null; |
|||
this.successful = result.isSuccessful() && (result.isCreated() || result.isModified()); |
|||
this.created = result.isCreated(); |
|||
this.oldSeverity = result.getOldSeverity(); |
|||
this.propagatedEntitiesList = result.getPropagatedEntitiesList(); |
|||
} |
|||
} |
|||
@ -0,0 +1,50 @@ |
|||
/** |
|||
* Copyright © 2016-2023 The Thingsboard Authors |
|||
* |
|||
* Licensed under the Apache License, Version 2.0 (the "License"); |
|||
* you may not use this file except in compliance with the License. |
|||
* You may obtain a copy of the License at |
|||
* |
|||
* http://www.apache.org/licenses/LICENSE-2.0
|
|||
* |
|||
* Unless required by applicable law or agreed to in writing, software |
|||
* distributed under the License is distributed on an "AS IS" BASIS, |
|||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|||
* See the License for the specific language governing permissions and |
|||
* limitations under the License. |
|||
*/ |
|||
package org.thingsboard.server.dao.service; |
|||
|
|||
import org.junit.Assert; |
|||
import org.junit.Test; |
|||
import org.springframework.beans.factory.annotation.Autowired; |
|||
import org.thingsboard.server.cache.TbTransactionalCache; |
|||
import org.thingsboard.server.common.data.EntitySubtype; |
|||
import org.thingsboard.server.common.data.EntityType; |
|||
import org.thingsboard.server.common.data.id.TenantId; |
|||
import org.thingsboard.server.common.data.page.PageData; |
|||
|
|||
import java.util.ArrayList; |
|||
import java.util.List; |
|||
import java.util.UUID; |
|||
|
|||
@DaoSqlTest |
|||
public class TbCacheSerializationTest extends AbstractServiceTest { |
|||
|
|||
@Autowired |
|||
TbTransactionalCache<TenantId, PageData<EntitySubtype>> alarmTypesCache; |
|||
|
|||
@Test |
|||
public void AlarmTypesSerializationTest() { |
|||
var typesCount = 13; |
|||
TenantId tenantId = new TenantId(UUID.randomUUID()); |
|||
List<EntitySubtype> types = new ArrayList<>(typesCount); |
|||
for (int i = 0; i < typesCount; i++) { |
|||
types.add(new EntitySubtype(tenantId, EntityType.ALARM, "alarm_type_" + i)); |
|||
} |
|||
PageData<EntitySubtype> alarmTypesPage = new PageData<>(types, 1, typesCount, false); |
|||
alarmTypesCache.put(tenantId, alarmTypesPage); |
|||
PageData<EntitySubtype> foundAlarmTypes = alarmTypesCache.get(tenantId).get(); |
|||
Assert.assertEquals(alarmTypesPage, foundAlarmTypes); |
|||
} |
|||
} |
|||
@ -0,0 +1,122 @@ |
|||
# |
|||
# Copyright © 2016-2023 The Thingsboard Authors |
|||
# |
|||
# Licensed under the Apache License, Version 2.0 (the "License"); |
|||
# you may not use this file except in compliance with the License. |
|||
# You may obtain a copy of the License at |
|||
# |
|||
# http://www.apache.org/licenses/LICENSE-2.0 |
|||
# |
|||
# Unless required by applicable law or agreed to in writing, software |
|||
# distributed under the License is distributed on an "AS IS" BASIS, |
|||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|||
# See the License for the specific language governing permissions and |
|||
# limitations under the License. |
|||
# |
|||
|
|||
import sys |
|||
import re |
|||
|
|||
def extract_properties_with_comments(yaml_file_path): |
|||
properties = {} |
|||
|
|||
with open(yaml_file_path, 'r') as file: |
|||
lines = file.readlines() |
|||
index = 0 |
|||
key_level_map = {0 : ''} |
|||
parse_line('', '', key_level_map, 0, index, lines, properties) |
|||
|
|||
return properties |
|||
|
|||
|
|||
def parse_line(table_name, comment, key_level_map, parent_line_level, index, lines, properties): |
|||
if index >= len(lines): |
|||
return |
|||
line = lines[index] |
|||
line_level = (len(line) - len(line.lstrip())) if line.strip() else 0 |
|||
line = line.strip() |
|||
# if line is empty - parse next line |
|||
if not line: |
|||
index = index + 1 |
|||
parse_line(table_name, comment, key_level_map, line_level, index, lines, properties) |
|||
# if line is a comment - save comment and parse next line |
|||
else: |
|||
if line_level == 0: |
|||
key_level_map = {0 : ''} |
|||
if line.startswith('#'): |
|||
if line_level == 0: |
|||
table_name = line.lstrip('#') |
|||
elif line_level == parent_line_level: |
|||
comment = comment + '\n' + line.lstrip('#') |
|||
else: |
|||
comment = line.lstrip('#') |
|||
index = index + 1 |
|||
parse_line(table_name, comment, key_level_map, line_level, index, lines, properties) |
|||
else: |
|||
# Check if it's a property line |
|||
if ':' in line: |
|||
# clean comment if level was changed |
|||
if line_level != parent_line_level: |
|||
comment = '' |
|||
key, value = line.split(':', 1) |
|||
if key.startswith('- '): |
|||
key = key.lstrip('- ') |
|||
key_level_map[line_level] = key |
|||
value = value.strip() |
|||
if value.split('#')[0]: |
|||
current_key = '' |
|||
for k in key_level_map.keys(): |
|||
if k <= line_level: |
|||
current_key = ((current_key + '.') if current_key else '') + key_level_map[k] |
|||
properties[current_key] = (value, comment, table_name) |
|||
comment = '' |
|||
index = index + 1 |
|||
parse_line(table_name, comment, key_level_map, line_level, index, lines, properties) |
|||
|
|||
def extract_property_info(properties): |
|||
rows = [] |
|||
for property_name, value in properties.items(): |
|||
if '#' in value[0]: |
|||
value_parts = value[0].split('#') |
|||
comment = value_parts[1] |
|||
else: |
|||
comment = value[1] |
|||
pattern = r'\"\$\{(.*?)\:(.*?)\}\"' |
|||
match = re.match(pattern, value[0]) |
|||
if match is not None: |
|||
rows.append((property_name, match.group(1), match.group(2), comment, value[2])) |
|||
else: |
|||
rows.append((property_name, "", value[0].split('#')[0], comment, value[2])) |
|||
return rows |
|||
|
|||
def check_descriptions(properties): |
|||
variables_without_description = [] |
|||
for row in properties: |
|||
# Extract information from the tuple |
|||
property_name, env_variable, default_value, comment, table_name = row |
|||
if comment == '' or len(comment) < 5 : |
|||
variables_without_description.append(property_name) |
|||
|
|||
return variables_without_description |
|||
|
|||
|
|||
if __name__ == '__main__': |
|||
sys. setrecursionlimit(10000) |
|||
# path to the YAML file |
|||
input_yaml_file = "application/src/main/resources/thingsboard.yml" |
|||
|
|||
# Parse yml file to map where key is property key path with '.' separator |
|||
# and value is an object (env_name_with_default_value, comment, table_name) |
|||
properties = extract_properties_with_comments(input_yaml_file) |
|||
|
|||
# Extract property information (extract env name, default value and comment nearby property) |
|||
property_info = extract_property_info(properties) |
|||
|
|||
# Check all properies have descriptions |
|||
variables_without_desc = check_descriptions(property_info) |
|||
|
|||
if len(variables_without_desc) > 0: |
|||
print(f"There are some yml properties without valid description: (total {len(variables_without_desc)}) {variables_without_desc}.") |
|||
exit(1) |
|||
else: |
|||
print("All yml properties have valid description.") |
|||
Some files were not shown because too many files changed in this diff
Loading…
Reference in new issue