Commit d7c09b9f6721d4b0f713a57058f0b5c8712aabb9

Authored by Volodymyr Babak
Committed by Andrew Shvayka
1 parent f47de8cf

Added Api swagger desc for assing*ToEdge and unassing*FromEdge

@@ -518,8 +518,11 @@ public class AssetController extends BaseController { @@ -518,8 +518,11 @@ public class AssetController extends BaseController {
518 518
519 @ApiOperation(value = "Assign asset to edge (assignAssetToEdge)", 519 @ApiOperation(value = "Assign asset to edge (assignAssetToEdge)",
520 notes = "Creates assignment of an existing asset to an instance of The Edge. " + 520 notes = "Creates assignment of an existing asset to an instance of The Edge. " +
521 - "The Edge is a software product for edge computing. " +  
522 - "It allows bringing data analysis and management to the edge, while seamlessly synchronizing with the platform server (cloud). ", produces = MediaType.APPLICATION_JSON_VALUE) 521 + EDGE_ASSIGN_ASYNC_FIRST_STEP_DESCRIPTION +
  522 + "Second, remote edge service will receive a copy of assignment asset " +
  523 + EDGE_ASSIGN_RECEIVE_STEP_DESCRIPTION + ". " +
  524 + "Third, once asset will be delivered to edge service, it's going to be available for usage on remote edge instance.",
  525 + produces = MediaType.APPLICATION_JSON_VALUE)
523 @PreAuthorize("hasAuthority('TENANT_ADMIN')") 526 @PreAuthorize("hasAuthority('TENANT_ADMIN')")
524 @RequestMapping(value = "/edge/{edgeId}/asset/{assetId}", method = RequestMethod.POST) 527 @RequestMapping(value = "/edge/{edgeId}/asset/{assetId}", method = RequestMethod.POST)
525 @ResponseBody 528 @ResponseBody
@@ -554,7 +557,12 @@ public class AssetController extends BaseController { @@ -554,7 +557,12 @@ public class AssetController extends BaseController {
554 } 557 }
555 558
556 @ApiOperation(value = "Unassign asset from edge (unassignAssetFromEdge)", 559 @ApiOperation(value = "Unassign asset from edge (unassignAssetFromEdge)",
557 - notes = "Clears assignment of the asset to the edge", produces = MediaType.APPLICATION_JSON_VALUE) 560 + notes = "Clears assignment of the asset to the edge. " +
  561 + EDGE_UNASSIGN_ASYNC_FIRST_STEP_DESCRIPTION +
  562 + "Second, remote edge service will receive an 'unassign' command to remove asset " +
  563 + EDGE_UNASSIGN_RECEIVE_STEP_DESCRIPTION + ". " +
  564 + "Third, once 'unassign' command will be delivered to edge service, it's going to remove asset locally.",
  565 + produces = MediaType.APPLICATION_JSON_VALUE)
558 @PreAuthorize("hasAuthority('TENANT_ADMIN')") 566 @PreAuthorize("hasAuthority('TENANT_ADMIN')")
559 @RequestMapping(value = "/edge/{edgeId}/asset/{assetId}", method = RequestMethod.DELETE) 567 @RequestMapping(value = "/edge/{edgeId}/asset/{assetId}", method = RequestMethod.DELETE)
560 @ResponseBody 568 @ResponseBody
@@ -219,6 +219,11 @@ public abstract class BaseController { @@ -219,6 +219,11 @@ public abstract class BaseController {
219 protected static final String EVENT_START_TIME_DESCRIPTION = "Timestamp. Events with creation time before it won't be queried."; 219 protected static final String EVENT_START_TIME_DESCRIPTION = "Timestamp. Events with creation time before it won't be queried.";
220 protected static final String EVENT_END_TIME_DESCRIPTION = "Timestamp. Events with creation time after it won't be queried."; 220 protected static final String EVENT_END_TIME_DESCRIPTION = "Timestamp. Events with creation time after it won't be queried.";
221 221
  222 + protected static final String EDGE_UNASSIGN_ASYNC_FIRST_STEP_DESCRIPTION = "Unassignment works in async way - first, 'unassign' notification event pushed to edge queue on platform. ";
  223 + protected static final String EDGE_UNASSIGN_RECEIVE_STEP_DESCRIPTION = "(Edge will receive this instantly, if it's currently connected, or once it's going to be connected to platform)" ;
  224 + protected static final String EDGE_ASSIGN_ASYNC_FIRST_STEP_DESCRIPTION = "Assignment works in async way - first, notification event pushed to edge service queue on platform. ";
  225 + protected static final String EDGE_ASSIGN_RECEIVE_STEP_DESCRIPTION = "(Edge will receive this instantly, if it's currently connected, or once it's going to be connected to platform)";
  226 +
222 protected static final String MARKDOWN_CODE_BLOCK_START = "```json\n"; 227 protected static final String MARKDOWN_CODE_BLOCK_START = "```json\n";
223 protected static final String MARKDOWN_CODE_BLOCK_END = "\n```"; 228 protected static final String MARKDOWN_CODE_BLOCK_END = "\n```";
224 protected static final String EVENT_ERROR_FILTER_OBJ = MARKDOWN_CODE_BLOCK_START + "{ \"eventType\": \"ERROR\", \"server\": \"ip-172-31-24-152\", " + 229 protected static final String EVENT_ERROR_FILTER_OBJ = MARKDOWN_CODE_BLOCK_START + "{ \"eventType\": \"ERROR\", \"server\": \"ip-172-31-24-152\", " +
@@ -805,6 +805,13 @@ public class DashboardController extends BaseController { @@ -805,6 +805,13 @@ public class DashboardController extends BaseController {
805 return null; 805 return null;
806 } 806 }
807 807
  808 + @ApiOperation(value = "Assign dashboard to edge (assignDashboardToEdge)",
  809 + notes = "Creates assignment of an existing dashboard to an instance of The Edge. " +
  810 + EDGE_ASSIGN_ASYNC_FIRST_STEP_DESCRIPTION +
  811 + "Second, remote edge service will receive a copy of assignment dashboard " +
  812 + EDGE_ASSIGN_RECEIVE_STEP_DESCRIPTION + ". " +
  813 + "Third, once dashboard will be delivered to edge service, it's going to be available for usage on remote edge instance.",
  814 + produces = MediaType.APPLICATION_JSON_VALUE)
808 @PreAuthorize("hasAuthority('TENANT_ADMIN')") 815 @PreAuthorize("hasAuthority('TENANT_ADMIN')")
809 @RequestMapping(value = "/edge/{edgeId}/dashboard/{dashboardId}", method = RequestMethod.POST) 816 @RequestMapping(value = "/edge/{edgeId}/dashboard/{dashboardId}", method = RequestMethod.POST)
810 @ResponseBody 817 @ResponseBody
@@ -838,6 +845,13 @@ public class DashboardController extends BaseController { @@ -838,6 +845,13 @@ public class DashboardController extends BaseController {
838 } 845 }
839 } 846 }
840 847
  848 + @ApiOperation(value = "Unassign dashboard from edge (unassignDashboardFromEdge)",
  849 + notes = "Clears assignment of the dashboard to the edge. " +
  850 + EDGE_UNASSIGN_ASYNC_FIRST_STEP_DESCRIPTION +
  851 + "Second, remote edge service will receive an 'unassign' command to remove dashboard " +
  852 + EDGE_UNASSIGN_RECEIVE_STEP_DESCRIPTION + ". " +
  853 + "Third, once 'unassign' command will be delivered to edge service, it's going to remove dashboard locally.",
  854 + produces = MediaType.APPLICATION_JSON_VALUE)
841 @PreAuthorize("hasAuthority('TENANT_ADMIN')") 855 @PreAuthorize("hasAuthority('TENANT_ADMIN')")
842 @RequestMapping(value = "/edge/{edgeId}/dashboard/{dashboardId}", method = RequestMethod.DELETE) 856 @RequestMapping(value = "/edge/{edgeId}/dashboard/{dashboardId}", method = RequestMethod.DELETE)
843 @ResponseBody 857 @ResponseBody
@@ -24,6 +24,7 @@ import io.swagger.annotations.ApiParam; @@ -24,6 +24,7 @@ import io.swagger.annotations.ApiParam;
24 import lombok.RequiredArgsConstructor; 24 import lombok.RequiredArgsConstructor;
25 import lombok.extern.slf4j.Slf4j; 25 import lombok.extern.slf4j.Slf4j;
26 import org.springframework.http.HttpStatus; 26 import org.springframework.http.HttpStatus;
  27 +import org.springframework.http.MediaType;
27 import org.springframework.http.ResponseEntity; 28 import org.springframework.http.ResponseEntity;
28 import org.springframework.security.access.prepost.PreAuthorize; 29 import org.springframework.security.access.prepost.PreAuthorize;
29 import org.springframework.web.bind.annotation.PathVariable; 30 import org.springframework.web.bind.annotation.PathVariable;
@@ -782,8 +783,11 @@ public class DeviceController extends BaseController { @@ -782,8 +783,11 @@ public class DeviceController extends BaseController {
782 783
783 @ApiOperation(value = "Assign device to edge (assignDeviceToEdge)", 784 @ApiOperation(value = "Assign device to edge (assignDeviceToEdge)",
784 notes = "Creates assignment of an existing device to an instance of The Edge. " + 785 notes = "Creates assignment of an existing device to an instance of The Edge. " +
785 - "The Edge is a software product for edge computing. " +  
786 - "It allows bringing data analysis and management to the edge, while seamlessly synchronizing with the platform server (cloud). ") 786 + EDGE_ASSIGN_ASYNC_FIRST_STEP_DESCRIPTION +
  787 + "Second, remote edge service will receive a copy of assignment device " +
  788 + EDGE_ASSIGN_RECEIVE_STEP_DESCRIPTION + ". " +
  789 + "Third, once device will be delivered to edge service, it's going to be available for usage on remote edge instance.",
  790 + produces = MediaType.APPLICATION_JSON_VALUE)
787 @PreAuthorize("hasAuthority('TENANT_ADMIN')") 791 @PreAuthorize("hasAuthority('TENANT_ADMIN')")
788 @RequestMapping(value = "/edge/{edgeId}/device/{deviceId}", method = RequestMethod.POST) 792 @RequestMapping(value = "/edge/{edgeId}/device/{deviceId}", method = RequestMethod.POST)
789 @ResponseBody 793 @ResponseBody
@@ -821,7 +825,12 @@ public class DeviceController extends BaseController { @@ -821,7 +825,12 @@ public class DeviceController extends BaseController {
821 } 825 }
822 826
823 @ApiOperation(value = "Unassign device from edge (unassignDeviceFromEdge)", 827 @ApiOperation(value = "Unassign device from edge (unassignDeviceFromEdge)",
824 - notes = "Clears assignment of the device to the edge") 828 + notes = "Clears assignment of the device to the edge. " +
  829 + EDGE_UNASSIGN_ASYNC_FIRST_STEP_DESCRIPTION +
  830 + "Second, remote edge service will receive an 'unassign' command to remove device " +
  831 + EDGE_UNASSIGN_RECEIVE_STEP_DESCRIPTION + ". " +
  832 + "Third, once 'unassign' command will be delivered to edge service, it's going to remove device locally.",
  833 + produces = MediaType.APPLICATION_JSON_VALUE)
825 @PreAuthorize("hasAuthority('TENANT_ADMIN')") 834 @PreAuthorize("hasAuthority('TENANT_ADMIN')")
826 @RequestMapping(value = "/edge/{edgeId}/device/{deviceId}", method = RequestMethod.DELETE) 835 @RequestMapping(value = "/edge/{edgeId}/device/{deviceId}", method = RequestMethod.DELETE)
827 @ResponseBody 836 @ResponseBody
@@ -142,7 +142,7 @@ public class EdgeController extends BaseController { @@ -142,7 +142,7 @@ public class EdgeController extends BaseController {
142 @PreAuthorize("hasAuthority('TENANT_ADMIN')") 142 @PreAuthorize("hasAuthority('TENANT_ADMIN')")
143 @RequestMapping(value = "/edge", method = RequestMethod.POST) 143 @RequestMapping(value = "/edge", method = RequestMethod.POST)
144 @ResponseBody 144 @ResponseBody
145 - public Edge saveEdge(@ApiParam(value = "A JSON value representing the ed.", required = true) 145 + public Edge saveEdge(@ApiParam(value = "A JSON value representing the edge.", required = true)
146 @RequestBody Edge edge) throws ThingsboardException { 146 @RequestBody Edge edge) throws ThingsboardException {
147 try { 147 try {
148 TenantId tenantId = getCurrentUser().getTenantId(); 148 TenantId tenantId = getCurrentUser().getTenantId();
@@ -20,9 +20,11 @@ import com.google.common.util.concurrent.Futures; @@ -20,9 +20,11 @@ import com.google.common.util.concurrent.Futures;
20 import com.google.common.util.concurrent.ListenableFuture; 20 import com.google.common.util.concurrent.ListenableFuture;
21 import com.google.common.util.concurrent.MoreExecutors; 21 import com.google.common.util.concurrent.MoreExecutors;
22 import com.google.common.util.concurrent.SettableFuture; 22 import com.google.common.util.concurrent.SettableFuture;
  23 +import io.swagger.annotations.ApiOperation;
23 import lombok.extern.slf4j.Slf4j; 24 import lombok.extern.slf4j.Slf4j;
24 import org.springframework.beans.factory.annotation.Autowired; 25 import org.springframework.beans.factory.annotation.Autowired;
25 import org.springframework.http.HttpStatus; 26 import org.springframework.http.HttpStatus;
  27 +import org.springframework.http.MediaType;
26 import org.springframework.security.access.prepost.PreAuthorize; 28 import org.springframework.security.access.prepost.PreAuthorize;
27 import org.springframework.web.bind.annotation.PathVariable; 29 import org.springframework.web.bind.annotation.PathVariable;
28 import org.springframework.web.bind.annotation.RequestBody; 30 import org.springframework.web.bind.annotation.RequestBody;
@@ -611,6 +613,13 @@ public class EntityViewController extends BaseController { @@ -611,6 +613,13 @@ public class EntityViewController extends BaseController {
611 } 613 }
612 } 614 }
613 615
  616 + @ApiOperation(value = "Assign entity view to edge (assignEntityViewToEdge)",
  617 + notes = "Creates assignment of an existing entity view to an instance of The Edge. " +
  618 + EDGE_ASSIGN_ASYNC_FIRST_STEP_DESCRIPTION +
  619 + "Second, remote edge service will receive a copy of assignment entity view " +
  620 + EDGE_ASSIGN_RECEIVE_STEP_DESCRIPTION + ". " +
  621 + "Third, once entity view will be delivered to edge service, it's going to be available for usage on remote edge instance.",
  622 + produces = MediaType.APPLICATION_JSON_VALUE)
614 @PreAuthorize("hasAuthority('TENANT_ADMIN')") 623 @PreAuthorize("hasAuthority('TENANT_ADMIN')")
615 @RequestMapping(value = "/edge/{edgeId}/entityView/{entityViewId}", method = RequestMethod.POST) 624 @RequestMapping(value = "/edge/{edgeId}/entityView/{entityViewId}", method = RequestMethod.POST)
616 @ResponseBody 625 @ResponseBody
@@ -641,6 +650,13 @@ public class EntityViewController extends BaseController { @@ -641,6 +650,13 @@ public class EntityViewController extends BaseController {
641 } 650 }
642 } 651 }
643 652
  653 + @ApiOperation(value = "Unassign entity view from edge (unassignEntityViewFromEdge)",
  654 + notes = "Clears assignment of the entity view to the edge. " +
  655 + EDGE_UNASSIGN_ASYNC_FIRST_STEP_DESCRIPTION +
  656 + "Second, remote edge service will receive an 'unassign' command to remove entity view " +
  657 + EDGE_UNASSIGN_RECEIVE_STEP_DESCRIPTION + ". " +
  658 + "Third, once 'unassign' command will be delivered to edge service, it's going to remove entity view locally.",
  659 + produces = MediaType.APPLICATION_JSON_VALUE)
644 @PreAuthorize("hasAuthority('TENANT_ADMIN')") 660 @PreAuthorize("hasAuthority('TENANT_ADMIN')")
645 @RequestMapping(value = "/edge/{edgeId}/entityView/{entityViewId}", method = RequestMethod.DELETE) 661 @RequestMapping(value = "/edge/{edgeId}/entityView/{entityViewId}", method = RequestMethod.DELETE)
646 @ResponseBody 662 @ResponseBody
@@ -20,10 +20,12 @@ import com.fasterxml.jackson.databind.JsonNode; @@ -20,10 +20,12 @@ import com.fasterxml.jackson.databind.JsonNode;
20 import com.fasterxml.jackson.databind.ObjectMapper; 20 import com.fasterxml.jackson.databind.ObjectMapper;
21 import com.fasterxml.jackson.databind.node.ArrayNode; 21 import com.fasterxml.jackson.databind.node.ArrayNode;
22 import com.fasterxml.jackson.databind.node.ObjectNode; 22 import com.fasterxml.jackson.databind.node.ObjectNode;
  23 +import io.swagger.annotations.ApiOperation;
23 import lombok.extern.slf4j.Slf4j; 24 import lombok.extern.slf4j.Slf4j;
24 import org.springframework.beans.factory.annotation.Autowired; 25 import org.springframework.beans.factory.annotation.Autowired;
25 import org.springframework.beans.factory.annotation.Value; 26 import org.springframework.beans.factory.annotation.Value;
26 import org.springframework.http.HttpStatus; 27 import org.springframework.http.HttpStatus;
  28 +import org.springframework.http.MediaType;
27 import org.springframework.security.access.prepost.PreAuthorize; 29 import org.springframework.security.access.prepost.PreAuthorize;
28 import org.springframework.util.CollectionUtils; 30 import org.springframework.util.CollectionUtils;
29 import org.springframework.util.StringUtils; 31 import org.springframework.util.StringUtils;
@@ -494,6 +496,14 @@ public class RuleChainController extends BaseController { @@ -494,6 +496,14 @@ public class RuleChainController extends BaseController {
494 return msgData; 496 return msgData;
495 } 497 }
496 498
  499 + @ApiOperation(value = "Assign rule chain to edge (assignRuleChainToEdge)",
  500 + notes = "Creates assignment of an existing rule chain to an instance of The Edge. " +
  501 + EDGE_ASSIGN_ASYNC_FIRST_STEP_DESCRIPTION +
  502 + "Second, remote edge service will receive a copy of assignment rule chain " +
  503 + EDGE_ASSIGN_RECEIVE_STEP_DESCRIPTION + ". " +
  504 + "Third, once rule chain will be delivered to edge service, it's going to start processing messages locally. " +
  505 + "\n\nOnly rule chain with type 'EDGE' can be assigned to edge.",
  506 + produces = MediaType.APPLICATION_JSON_VALUE)
497 @PreAuthorize("hasAuthority('TENANT_ADMIN')") 507 @PreAuthorize("hasAuthority('TENANT_ADMIN')")
498 @RequestMapping(value = "/edge/{edgeId}/ruleChain/{ruleChainId}", method = RequestMethod.POST) 508 @RequestMapping(value = "/edge/{edgeId}/ruleChain/{ruleChainId}", method = RequestMethod.POST)
499 @ResponseBody 509 @ResponseBody
@@ -527,6 +537,13 @@ public class RuleChainController extends BaseController { @@ -527,6 +537,13 @@ public class RuleChainController extends BaseController {
527 } 537 }
528 } 538 }
529 539
  540 + @ApiOperation(value = "Unassign rule chain from edge (unassignRuleChainFromEdge)",
  541 + notes = "Clears assignment of the rule chain to the edge. " +
  542 + EDGE_UNASSIGN_ASYNC_FIRST_STEP_DESCRIPTION +
  543 + "Second, remote edge service will receive an 'unassign' command to remove rule chain " +
  544 + EDGE_UNASSIGN_RECEIVE_STEP_DESCRIPTION + ". " +
  545 + "Third, once 'unassign' command will be delivered to edge service, it's going to remove rule chain locally.",
  546 + produces = MediaType.APPLICATION_JSON_VALUE)
530 @PreAuthorize("hasAuthority('TENANT_ADMIN')") 547 @PreAuthorize("hasAuthority('TENANT_ADMIN')")
531 @RequestMapping(value = "/edge/{edgeId}/ruleChain/{ruleChainId}", method = RequestMethod.DELETE) 548 @RequestMapping(value = "/edge/{edgeId}/ruleChain/{ruleChainId}", method = RequestMethod.DELETE)
532 @ResponseBody 549 @ResponseBody
@@ -544,6 +544,9 @@ public class BaseRuleChainService extends AbstractEntityService implements RuleC @@ -544,6 +544,9 @@ public class BaseRuleChainService extends AbstractEntityService implements RuleC
544 if (!edge.getTenantId().equals(ruleChain.getTenantId())) { 544 if (!edge.getTenantId().equals(ruleChain.getTenantId())) {
545 throw new DataValidationException("Can't assign ruleChain to edge from different tenant!"); 545 throw new DataValidationException("Can't assign ruleChain to edge from different tenant!");
546 } 546 }
  547 + if (!RuleChainType.EDGE.equals(ruleChain.getType())) {
  548 + throw new DataValidationException("Can't assign non EDGE ruleChain to edge!");
  549 + }
547 try { 550 try {
548 createRelation(tenantId, new EntityRelation(edgeId, ruleChainId, EntityRelation.CONTAINS_TYPE, RelationTypeGroup.EDGE)); 551 createRelation(tenantId, new EntityRelation(edgeId, ruleChainId, EntityRelation.CONTAINS_TYPE, RelationTypeGroup.EDGE));
549 } catch (Exception e) { 552 } catch (Exception e) {