Commit 6ffaca2541b3aa315475308f3f855dca94645b68
Merge branch 'feature/edge' of github.com:volodymyr-babak/thingsboard into feature/edge
Showing
2 changed files
with
198 additions
and
1 deletions
... | ... | @@ -28,6 +28,7 @@ import com.google.gson.JsonObject; |
28 | 28 | import io.grpc.stub.StreamObserver; |
29 | 29 | import lombok.Data; |
30 | 30 | import lombok.extern.slf4j.Slf4j; |
31 | +import org.apache.commons.lang.RandomStringUtils; | |
31 | 32 | import org.checkerframework.checker.nullness.qual.Nullable; |
32 | 33 | import org.thingsboard.server.common.data.Dashboard; |
33 | 34 | import org.thingsboard.server.common.data.DataConstants; |
... | ... | @@ -878,6 +879,7 @@ public final class EdgeGrpcSession implements Closeable { |
878 | 879 | device.setType(deviceUpdateMsg.getType()); |
879 | 880 | device.setLabel(deviceUpdateMsg.getLabel()); |
880 | 881 | device = ctx.getDeviceService().saveDevice(device); |
882 | + createDeviceCredentials(device); | |
881 | 883 | createRelationFromEdge(device.getId()); |
882 | 884 | ctx.getDeviceStateService().onDeviceAdded(device); |
883 | 885 | pushDeviceCreatedEventToRuleEngine(device); |
... | ... | @@ -888,6 +890,14 @@ public final class EdgeGrpcSession implements Closeable { |
888 | 890 | return device; |
889 | 891 | } |
890 | 892 | |
893 | + private void createDeviceCredentials(Device device) { | |
894 | + DeviceCredentials deviceCredentials = new DeviceCredentials(); | |
895 | + deviceCredentials.setDeviceId(device.getId()); | |
896 | + deviceCredentials.setCredentialsType(DeviceCredentialsType.ACCESS_TOKEN); | |
897 | + deviceCredentials.setCredentialsId(RandomStringUtils.randomAlphanumeric(20)); | |
898 | + ctx.getDeviceCredentialsService().createDeviceCredentials(device.getTenantId(), deviceCredentials); | |
899 | + } | |
900 | + | |
891 | 901 | private void pushDeviceCreatedEventToRuleEngine(Device device) { |
892 | 902 | try { |
893 | 903 | ObjectNode entityNode = mapper.valueToTree(device); | ... | ... |
... | ... | @@ -45,7 +45,8 @@ import org.thingsboard.server.common.data.Tenant; |
45 | 45 | import org.thingsboard.server.common.data.UpdateMessage; |
46 | 46 | import org.thingsboard.server.common.data.User; |
47 | 47 | import org.thingsboard.server.common.data.alarm.Alarm; |
48 | -import org.thingsboard.server.common.data.id.AlarmId; | |
48 | +import org.thingsboard.server.common.data.edge.Edge; | |
49 | +import org.thingsboard.server.common.data.edge.EdgeSearchQuery; | |
49 | 50 | import org.thingsboard.server.common.data.alarm.AlarmInfo; |
50 | 51 | import org.thingsboard.server.common.data.alarm.AlarmSearchStatus; |
51 | 52 | import org.thingsboard.server.common.data.alarm.AlarmSeverity; |
... | ... | @@ -56,10 +57,12 @@ import org.thingsboard.server.common.data.audit.ActionType; |
56 | 57 | import org.thingsboard.server.common.data.audit.AuditLog; |
57 | 58 | import org.thingsboard.server.common.data.device.DeviceSearchQuery; |
58 | 59 | import org.thingsboard.server.common.data.entityview.EntityViewSearchQuery; |
60 | +import org.thingsboard.server.common.data.id.AlarmId; | |
59 | 61 | import org.thingsboard.server.common.data.id.AssetId; |
60 | 62 | import org.thingsboard.server.common.data.id.CustomerId; |
61 | 63 | import org.thingsboard.server.common.data.id.DashboardId; |
62 | 64 | import org.thingsboard.server.common.data.id.DeviceId; |
65 | +import org.thingsboard.server.common.data.id.EdgeId; | |
63 | 66 | import org.thingsboard.server.common.data.id.EntityId; |
64 | 67 | import org.thingsboard.server.common.data.id.EntityViewId; |
65 | 68 | import org.thingsboard.server.common.data.id.RuleChainId; |
... | ... | @@ -1978,6 +1981,190 @@ public class RestClient implements ClientHttpRequestInterceptor, Closeable { |
1978 | 1981 | } |
1979 | 1982 | } |
1980 | 1983 | |
1984 | + public Edge saveEdge(Edge edge) { | |
1985 | + return restTemplate.postForEntity(baseURL + "/api/edge", edge, Edge.class).getBody(); | |
1986 | + } | |
1987 | + | |
1988 | + public void deleteEdge(EdgeId edgeId) { | |
1989 | + restTemplate.delete(baseURL + "/api/edge/{edgeId}", edgeId.getId()); | |
1990 | + } | |
1991 | + | |
1992 | + public Optional<Edge> getEdgeById(EdgeId edgeId) { | |
1993 | + try { | |
1994 | + ResponseEntity<Edge> edge = restTemplate.getForEntity(baseURL + "/api/edge/{edgeId}", Edge.class, edgeId.getId()); | |
1995 | + return Optional.ofNullable(edge.getBody()); | |
1996 | + } catch (HttpClientErrorException exception) { | |
1997 | + if (exception.getStatusCode() == HttpStatus.NOT_FOUND) { | |
1998 | + return Optional.empty(); | |
1999 | + } else { | |
2000 | + throw exception; | |
2001 | + } | |
2002 | + } | |
2003 | + } | |
2004 | + | |
2005 | + public Optional<Edge> assignEdgeToCustomer(CustomerId customerId, EdgeId edgeId) { | |
2006 | + try { | |
2007 | + ResponseEntity<Edge> edge = restTemplate.postForEntity(baseURL + "/api/customer/{customerId}/edge/{edgeId}", null, Edge.class, customerId.getId(), edgeId.getId()); | |
2008 | + return Optional.ofNullable(edge.getBody()); | |
2009 | + } catch (HttpClientErrorException exception) { | |
2010 | + if (exception.getStatusCode() == HttpStatus.NOT_FOUND) { | |
2011 | + return Optional.empty(); | |
2012 | + } else { | |
2013 | + throw exception; | |
2014 | + } | |
2015 | + } | |
2016 | + } | |
2017 | + | |
2018 | + public Optional<Edge> unassignEdgeFromCustomer(EdgeId edgeId) { | |
2019 | + try { | |
2020 | + ResponseEntity<Edge> edge = restTemplate.exchange(baseURL + "/api/customer/edge/{edgeId}", HttpMethod.DELETE, HttpEntity.EMPTY, Edge.class, edgeId.getId()); | |
2021 | + return Optional.ofNullable(edge.getBody()); | |
2022 | + } catch (HttpClientErrorException exception) { | |
2023 | + if (exception.getStatusCode() == HttpStatus.NOT_FOUND) { | |
2024 | + return Optional.empty(); | |
2025 | + } else { | |
2026 | + throw exception; | |
2027 | + } | |
2028 | + } | |
2029 | + } | |
2030 | + | |
2031 | + public Optional<Device> assignDeviceToEdge(EdgeId edgeId, DeviceId deviceId) { | |
2032 | + try { | |
2033 | + ResponseEntity<Device> device = restTemplate.postForEntity(baseURL + "/api/edge/{edgeId}/device/{deviceId}", null, Device.class, edgeId.getId(), deviceId.getId()); | |
2034 | + return Optional.ofNullable(device.getBody()); | |
2035 | + } catch (HttpClientErrorException exception) { | |
2036 | + if (exception.getStatusCode() == HttpStatus.NOT_FOUND) { | |
2037 | + return Optional.empty(); | |
2038 | + } else { | |
2039 | + throw exception; | |
2040 | + } | |
2041 | + } | |
2042 | + } | |
2043 | + | |
2044 | + public Optional<Device> unassignDeviceFromEdge(DeviceId deviceId) { | |
2045 | + try { | |
2046 | + ResponseEntity<Device> device = restTemplate.exchange(baseURL + "/api/edge/device/{deviceId}", HttpMethod.DELETE, HttpEntity.EMPTY, Device.class, deviceId.getId()); | |
2047 | + return Optional.ofNullable(device.getBody()); | |
2048 | + } catch (HttpClientErrorException exception) { | |
2049 | + if (exception.getStatusCode() == HttpStatus.NOT_FOUND) { | |
2050 | + return Optional.empty(); | |
2051 | + } else { | |
2052 | + throw exception; | |
2053 | + } | |
2054 | + } | |
2055 | + } | |
2056 | + | |
2057 | + public TextPageData<Device> getEdgeDevices(EdgeId edgeId, String deviceType, TextPageLink pageLink) { | |
2058 | + Map<String, String> params = new HashMap<>(); | |
2059 | + params.put("edgeId", edgeId.getId().toString()); | |
2060 | + params.put("type", deviceType); | |
2061 | + addPageLinkToParam(params, pageLink); | |
2062 | + return restTemplate.exchange( | |
2063 | + baseURL + "/api/edge/{edgeId}/devices?type={type}&" + getUrlParams(pageLink), | |
2064 | + HttpMethod.GET, HttpEntity.EMPTY, | |
2065 | + new ParameterizedTypeReference<TextPageData<Device>>() { | |
2066 | + }, params).getBody(); | |
2067 | + } | |
2068 | + | |
2069 | + public Optional<Asset> assignAssetToEdge(EdgeId edgeId, AssetId assetId) { | |
2070 | + try { | |
2071 | + ResponseEntity<Asset> asset = restTemplate.postForEntity(baseURL + "/api/edge/{edgeId}/asset/{assetId}", null, Asset.class, edgeId.getId(), assetId.getId()); | |
2072 | + return Optional.ofNullable(asset.getBody()); | |
2073 | + } catch (HttpClientErrorException exception) { | |
2074 | + if (exception.getStatusCode() == HttpStatus.NOT_FOUND) { | |
2075 | + return Optional.empty(); | |
2076 | + } else { | |
2077 | + throw exception; | |
2078 | + } | |
2079 | + } | |
2080 | + } | |
2081 | + | |
2082 | + public Optional<Asset> unassignAssetFromEdge(AssetId assetId) { | |
2083 | + try { | |
2084 | + ResponseEntity<Asset> asset = restTemplate.exchange(baseURL + "/api/edge/asset/{assetId}", HttpMethod.DELETE, HttpEntity.EMPTY, Asset.class, assetId.getId()); | |
2085 | + return Optional.ofNullable(asset.getBody()); | |
2086 | + } catch (HttpClientErrorException exception) { | |
2087 | + if (exception.getStatusCode() == HttpStatus.NOT_FOUND) { | |
2088 | + return Optional.empty(); | |
2089 | + } else { | |
2090 | + throw exception; | |
2091 | + } | |
2092 | + } | |
2093 | + } | |
2094 | + | |
2095 | + public TextPageData<Asset> getEdgeAssets(EdgeId edgeId, String assetType, TextPageLink pageLink) { | |
2096 | + Map<String, String> params = new HashMap<>(); | |
2097 | + params.put("edgeId", edgeId.getId().toString()); | |
2098 | + params.put("type", assetType); | |
2099 | + addPageLinkToParam(params, pageLink); | |
2100 | + return restTemplate.exchange( | |
2101 | + baseURL + "/api/edge/{edgeId}/assets?type={type}&" + getUrlParams(pageLink), | |
2102 | + HttpMethod.GET, HttpEntity.EMPTY, | |
2103 | + new ParameterizedTypeReference<TextPageData<Asset>>() { | |
2104 | + }, params).getBody(); | |
2105 | + } | |
2106 | + | |
2107 | + public TextPageData<Edge> getTenantEdges(String type, TextPageLink pageLink) { | |
2108 | + Map<String, String> params = new HashMap<>(); | |
2109 | + params.put("type", type); | |
2110 | + addPageLinkToParam(params, pageLink); | |
2111 | + return restTemplate.exchange( | |
2112 | + baseURL + "/api/tenant/edges?type={type}&" + getUrlParams(pageLink), | |
2113 | + HttpMethod.GET, HttpEntity.EMPTY, | |
2114 | + new ParameterizedTypeReference<TextPageData<Edge>>() { | |
2115 | + }, params).getBody(); | |
2116 | + } | |
2117 | + | |
2118 | + public Optional<Edge> getTenantEdge(String edgeName) { | |
2119 | + try { | |
2120 | + ResponseEntity<Edge> edge = restTemplate.getForEntity(baseURL + "/api/tenant/edges?edgeName={edgeName}", Edge.class, edgeName); | |
2121 | + return Optional.ofNullable(edge.getBody()); | |
2122 | + } catch (HttpClientErrorException exception) { | |
2123 | + if (exception.getStatusCode() == HttpStatus.NOT_FOUND) { | |
2124 | + return Optional.empty(); | |
2125 | + } else { | |
2126 | + throw exception; | |
2127 | + } | |
2128 | + } | |
2129 | + } | |
2130 | + | |
2131 | + public TextPageData<Edge> getCustomerEdges(CustomerId customerId, String edgeType, TextPageLink pageLink) { | |
2132 | + Map<String, String> params = new HashMap<>(); | |
2133 | + params.put("customerId", customerId.getId().toString()); | |
2134 | + params.put("type", edgeType); | |
2135 | + addPageLinkToParam(params, pageLink); | |
2136 | + return restTemplate.exchange( | |
2137 | + baseURL + "/api/customer/{customerId}/edges?type={type}&" + getUrlParams(pageLink), | |
2138 | + HttpMethod.GET, HttpEntity.EMPTY, | |
2139 | + new ParameterizedTypeReference<TextPageData<Edge>>() { | |
2140 | + }, params).getBody(); | |
2141 | + } | |
2142 | + | |
2143 | + public List<Edge> getEdgesByIds(List<EdgeId> edgeIds) { | |
2144 | + return restTemplate.exchange(baseURL + "/api/edges?edgeIds={edgeIds}", | |
2145 | + HttpMethod.GET, | |
2146 | + HttpEntity.EMPTY, new ParameterizedTypeReference<List<Edge>>() { | |
2147 | + }, listIdsToString(edgeIds)).getBody(); | |
2148 | + } | |
2149 | + | |
2150 | + public List<Edge> findByQuery(EdgeSearchQuery query) { | |
2151 | + return restTemplate.exchange( | |
2152 | + baseURL + "/api/edges", | |
2153 | + HttpMethod.POST, | |
2154 | + new HttpEntity<>(query), | |
2155 | + new ParameterizedTypeReference<List<Edge>>() { | |
2156 | + }).getBody(); | |
2157 | + } | |
2158 | + | |
2159 | + public List<EntitySubtype> getEdgeTypes() { | |
2160 | + return restTemplate.exchange( | |
2161 | + baseURL + "/api/edge/types", | |
2162 | + HttpMethod.GET, | |
2163 | + HttpEntity.EMPTY, | |
2164 | + new ParameterizedTypeReference<List<EntitySubtype>>() { | |
2165 | + }).getBody(); | |
2166 | + } | |
2167 | + | |
1981 | 2168 | @Deprecated |
1982 | 2169 | public Optional<JsonNode> getAttributes(String accessToken, String clientKeys, String sharedKeys) { |
1983 | 2170 | Map<String, String> params = new HashMap<>(); | ... | ... |