diff options
Diffstat (limited to 'src/main/java/org/onap/a1pesimulator/controller')
6 files changed, 447 insertions, 0 deletions
diff --git a/src/main/java/org/onap/a1pesimulator/controller/RanA1Controller.java b/src/main/java/org/onap/a1pesimulator/controller/RanA1Controller.java new file mode 100644 index 0000000..4262d27 --- /dev/null +++ b/src/main/java/org/onap/a1pesimulator/controller/RanA1Controller.java @@ -0,0 +1,123 @@ +/* + * Copyright (C) 2021 Samsung Electronics + * 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.onap.a1pesimulator.controller; + +import java.io.IOException; +import java.net.URISyntaxException; +import java.util.Collection; +import org.onap.a1pesimulator.data.PolicyNotification; +import org.onap.a1pesimulator.data.PolicyNotificationActionEnum; +import org.onap.a1pesimulator.service.a1.A1Service; +import org.onap.a1pesimulator.service.a1.OnPolicyAction; +import org.onap.a1pesimulator.service.a1.PolicyInstancesHolder; +import org.springframework.http.ResponseEntity; +import org.springframework.messaging.simp.SimpMessagingTemplate; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * A1 interface facade + * Only operations defined by OSC_2.1.0 should be provided here + */ + +@RestController +@RequestMapping({"${restapi.version}/a1-p"}) +public class RanA1Controller { + + private static final String TOPIC_POLICY = "/topic/policy"; + private final SimpMessagingTemplate messagingTemplate; + private final A1Service a1Service; + private final Collection<OnPolicyAction> onPolicyActions; + private final PolicyInstancesHolder policyHolder; + + public RanA1Controller(A1Service a1Service, SimpMessagingTemplate messagingTemplate, + Collection<OnPolicyAction> onPolicyActions, PolicyInstancesHolder policyHolder) { + this.a1Service = a1Service; + this.messagingTemplate = messagingTemplate; + this.onPolicyActions = onPolicyActions; + this.policyHolder = policyHolder; + } + + @GetMapping(value = "/healthcheck") + public ResponseEntity<String> healthcheck() throws URISyntaxException { + return a1Service.healthCheck(); + } + + @PutMapping(value = "/policytypes/{policyTypeId}") + public ResponseEntity<String> putPolicySchema(@PathVariable Integer policyTypeId, @RequestBody String body) + throws URISyntaxException { + return a1Service.putPolicySchema(policyTypeId, body); + } + + @PutMapping(value = "/policytypes/{policyTypeId}/policies/{policyInstanceId}") + public ResponseEntity<String> putPolicyInstance(@PathVariable Integer policyTypeId, + @PathVariable String policyInstanceId, @RequestBody String body) throws URISyntaxException { + ResponseEntity<String> response = a1Service.putPolicy(policyTypeId, policyInstanceId, body); + if (!response.getStatusCode().is2xxSuccessful()) { + return response; + } + policyHolder.addPolicy(policyInstanceId, body); + onPolicyActions.forEach(action -> handleOnPolicyAction(policyTypeId, policyInstanceId, body, action)); + messagingTemplate.convertAndSend(TOPIC_POLICY, + new PolicyNotification(policyInstanceId, policyTypeId, PolicyNotificationActionEnum.CREATED, body)); + return response; + } + + @DeleteMapping(value = "/policytypes/{policyTypeId}/policies/{policyInstanceId}") + public ResponseEntity<String> deletePolicyInstance(@PathVariable Integer policyTypeId, + @PathVariable String policyInstanceId) throws URISyntaxException { + ResponseEntity<String> response = a1Service.deletePolicy(policyTypeId, policyInstanceId); + if (!response.getStatusCode().is2xxSuccessful()) { + return response; + } + + policyHolder.removePolicy(policyInstanceId); + messagingTemplate.convertAndSend(TOPIC_POLICY, + new PolicyNotification(policyInstanceId, policyTypeId, PolicyNotificationActionEnum.DELETED)); + return response; + } + + @GetMapping(value = "/policytypes") + public ResponseEntity<String> getPolicyTypeIds() throws URISyntaxException { + return a1Service.getPolicyTypeIds(); + } + + @GetMapping(value = "/policytypes/{policyTypeId}") + public ResponseEntity<String> getPolicyType(@PathVariable Integer policyTypeId) throws URISyntaxException { + return a1Service.getPolicyType(policyTypeId); + } + + @GetMapping(value = "/policytypes/{policyTypeId}/policies") + public ResponseEntity<String> getPolicyIdsOfType(@PathVariable Integer policyTypeId) + throws URISyntaxException, IOException { + return a1Service.getPolicyIdsOfType(policyTypeId); + } + + @GetMapping(value = "/policytypes/{policyTypeId}/policies/{policyInstanceId}") + public ResponseEntity<String> getPolicy(@PathVariable Integer policyTypeId, @PathVariable String policyInstanceId) + throws URISyntaxException { + return a1Service.getPolicy(policyTypeId, policyInstanceId); + } + + private void handleOnPolicyAction(Integer policyTypeId, String policyId, String body, OnPolicyAction action) { + if (action.isForMe(policyTypeId, policyId, body)) { + action.onPolicy(policyTypeId, policyId, body); + } + } +} diff --git a/src/main/java/org/onap/a1pesimulator/controller/RanCellController.java b/src/main/java/org/onap/a1pesimulator/controller/RanCellController.java new file mode 100644 index 0000000..d454116 --- /dev/null +++ b/src/main/java/org/onap/a1pesimulator/controller/RanCellController.java @@ -0,0 +1,133 @@ +/* + * Copyright (C) 2021 Samsung Electronics + * 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.onap.a1pesimulator.controller; + +import java.util.Optional; +import org.onap.a1pesimulator.data.cell.CellDetails; +import org.onap.a1pesimulator.data.cell.RanCell; +import org.onap.a1pesimulator.data.ves.Event; +import org.onap.a1pesimulator.data.ves.RanPeriodicVesEvent; +import org.onap.a1pesimulator.service.cell.RanCellService; +import org.onap.a1pesimulator.service.cell.RanCellStateService; +import org.onap.a1pesimulator.service.ves.RanVesBrokerService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping({"${restapi.version}/ran/cells"}) +public class RanCellController { + + private static final Logger log = LoggerFactory.getLogger(RanCellController.class); + private final RanCellService ranCellService; + private final RanCellStateService ranCellStateService; + private final RanVesBrokerService ranVesBrokerService; + + public RanCellController(RanCellService ranCellService, RanCellStateService ranCellStateService, + RanVesBrokerService ranVesBrokerService) { + this.ranCellService = ranCellService; + this.ranCellStateService = ranCellStateService; + this.ranVesBrokerService = ranVesBrokerService; + } + + @GetMapping + public ResponseEntity<RanCell> getCells() { + return ResponseEntity.ok(ranCellService.getCells()); + } + + @GetMapping(value = "/{identifier}") + public ResponseEntity<CellDetails> getCellById(final @PathVariable String identifier) { + + if (!ranCellService.getCellIds().contains(identifier)) { + return ResponseEntity.notFound().build(); + } + return ResponseEntity.ok(ranCellService.getCellById(identifier)); + } + + @PostMapping(value = "/{identifier}/startFailure") + public ResponseEntity<String> startSendingFailureVesEvents(final @PathVariable String identifier) { + + ranCellService.failure(identifier); + ranVesBrokerService.startSendingFailureVesEvents(identifier); + ranCellStateService.failingState(identifier); + + return ResponseEntity.accepted().body("Failure VES Event sending started"); + } + + @PostMapping(value = "/{identifier}/stopFailure") + public ResponseEntity<Void> stopSendingFailureVesEvents(final @PathVariable String identifier) { + + ranCellService.recoverFromFailure(identifier); + + Optional<RanPeriodicVesEvent> vesEvent = ranVesBrokerService.stopSendingVesEvents(identifier); + + if (!vesEvent.isPresent()) { + return ResponseEntity.notFound().build(); + } + + ranCellStateService.stopState(identifier); + return ResponseEntity.accepted().build(); + } + + @PostMapping(value = "/{identifier}/start") + public ResponseEntity<String> startSendingVesEvents(final @RequestBody Optional<Event> vesEventOpt, + final @PathVariable String identifier, final @RequestParam(required = false) Integer interval) { + log.info("Start sending ves events every {} seconds for {} ", getInterval(interval), identifier); + + Event vesEvent = vesEventOpt.orElse(ranVesBrokerService.getGlobalPmVesStructure()); + + ResponseEntity<String> responseEntity = + ranVesBrokerService.startSendingVesEvents(identifier, vesEvent, getInterval(interval)); + if (!responseEntity.getStatusCode().is2xxSuccessful()) { + return responseEntity; + } + + ranCellStateService.activateState(identifier); + return responseEntity; + } + + @PostMapping(value = "/{identifier}/stop") + public ResponseEntity<Void> stopSendingVesEvents(final @PathVariable String identifier) { + log.info("Stop sending custom ves events for {}", identifier); + Optional<RanPeriodicVesEvent> vesEvent = ranVesBrokerService.stopSendingVesEvents(identifier); + if (!vesEvent.isPresent()) { + return ResponseEntity.notFound().build(); + } + + ranCellStateService.stopState(identifier); + return ResponseEntity.accepted().build(); + } + + @GetMapping(value = "/{identifier}/eventStructure") + public ResponseEntity<Event> getVesEventStructure(final @PathVariable String identifier) { + if (!ranVesBrokerService.getEnabledEventElementIdentifiers().contains(identifier)) { + return ResponseEntity.notFound().build(); + } + return ResponseEntity.ok(ranVesBrokerService.getEventStructure(identifier)); + } + + private Integer getInterval(Integer requested) { + if (requested == null) { + return ranVesBrokerService.getGlobalVesInterval(); + } + return requested; + } +} diff --git a/src/main/java/org/onap/a1pesimulator/controller/RanController.java b/src/main/java/org/onap/a1pesimulator/controller/RanController.java new file mode 100644 index 0000000..03ea4b8 --- /dev/null +++ b/src/main/java/org/onap/a1pesimulator/controller/RanController.java @@ -0,0 +1,50 @@ +/* + * Copyright (C) 2021 Samsung Electronics + * 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.onap.a1pesimulator.controller; + +import org.onap.a1pesimulator.data.Topology; +import org.onap.a1pesimulator.service.cell.RanCellService; +import org.onap.a1pesimulator.util.ItemsRefresher; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping({"${restapi.version}/ran"}) +public class RanController { + + private static final Logger log = LoggerFactory.getLogger(RanController.class); + private final RanCellService ranCellService; + private final ItemsRefresher refresher; + + public RanController(RanCellService ranCellService, final ItemsRefresher refresher) { + this.ranCellService = ranCellService; + this.refresher = refresher; + } + + @GetMapping + public ResponseEntity<Topology> getRan() { + return ResponseEntity.ok(ranCellService.getTopology()); + } + + @GetMapping(value = "/refresh") + public ResponseEntity<Void> refreshRan() { + refresher.refresh(); + log.info("Refreshed the items on request"); + return ResponseEntity.ok().build(); + } +} diff --git a/src/main/java/org/onap/a1pesimulator/controller/RanEventConfigureController.java b/src/main/java/org/onap/a1pesimulator/controller/RanEventConfigureController.java new file mode 100644 index 0000000..5efe07a --- /dev/null +++ b/src/main/java/org/onap/a1pesimulator/controller/RanEventConfigureController.java @@ -0,0 +1,48 @@ +/* + * Copyright (C) 2021 Samsung Electronics + * 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.onap.a1pesimulator.controller; + +import org.onap.a1pesimulator.data.ves.GlobalVesConfiguration; +import org.onap.a1pesimulator.service.ves.RanVesBrokerService; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping({"${restapi.version}/ran/eventConfig"}) +public class RanEventConfigureController { + + private final RanVesBrokerService ranVesBrokerService; + + public RanEventConfigureController(RanVesBrokerService ranVesBrokerService) { + this.ranVesBrokerService = ranVesBrokerService; + } + + @GetMapping + public ResponseEntity<GlobalVesConfiguration> getEventConfig() { + GlobalVesConfiguration config = new GlobalVesConfiguration(ranVesBrokerService.getGlobalVesInterval(), + ranVesBrokerService.getGlobalPmVesStructure()); + return ResponseEntity.ok(config); + } + + @PostMapping + public ResponseEntity<Void> setEventConfig(final @RequestBody GlobalVesConfiguration config) { + ranVesBrokerService.setGlobalPmVesStructure(config.getEvent()); + ranVesBrokerService.setGlobalVesInterval(config.getInterval()); + return ResponseEntity.ok().build(); + } +} diff --git a/src/main/java/org/onap/a1pesimulator/controller/RanPolicyController.java b/src/main/java/org/onap/a1pesimulator/controller/RanPolicyController.java new file mode 100644 index 0000000..bfe645c --- /dev/null +++ b/src/main/java/org/onap/a1pesimulator/controller/RanPolicyController.java @@ -0,0 +1,45 @@ +/* + * Copyright (C) 2021 Samsung Electronics + * 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.onap.a1pesimulator.controller; + +import java.io.IOException; +import java.net.URISyntaxException; +import org.onap.a1pesimulator.service.a1.A1Service; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; + +@Controller +public class RanPolicyController { + + private final A1Service a1Service; + + public RanPolicyController(A1Service a1Service) { + this.a1Service = a1Service; + } + + /** + * Method for reading all policies of given policy type from A1 PE Simulator in one go + * + * @return Policy instance list for wanted policyType + * @throws IOException + * @throws URISyntaxException + */ + @GetMapping(value = "${restapi.version}/ran/policies/{policyTypeId}") + public ResponseEntity<String> getAllPolicies(@PathVariable Integer policyTypeId) + throws IOException, URISyntaxException { + return a1Service.getAllPoliciesForType(policyTypeId); + } +} diff --git a/src/main/java/org/onap/a1pesimulator/controller/RanUeController.java b/src/main/java/org/onap/a1pesimulator/controller/RanUeController.java new file mode 100644 index 0000000..5cbaaba --- /dev/null +++ b/src/main/java/org/onap/a1pesimulator/controller/RanUeController.java @@ -0,0 +1,48 @@ +/* + * Copyright (C) 2021 Samsung Electronics + * 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.onap.a1pesimulator.controller; + +import java.util.Optional; +import org.onap.a1pesimulator.data.ue.RanUserEquipment; +import org.onap.a1pesimulator.data.ue.UserEquipment; +import org.onap.a1pesimulator.service.ue.RanUeService; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping({"${restapi.version}/ran/ues"}) +public class RanUeController { + + private final RanUeService ranUeService; + + public RanUeController(RanUeService ranUeService) { + this.ranUeService = ranUeService; + } + + @GetMapping + public ResponseEntity<RanUserEquipment> getUes() { + return ResponseEntity.ok(ranUeService.getUes()); + } + + @GetMapping(value = "/{identifier}") + public ResponseEntity<UserEquipment> getUeById(final @PathVariable String identifier) { + + Optional<UserEquipment> userEquipment = ranUeService.getUserEquipment(identifier); + return userEquipment.map(ResponseEntity::ok).orElseGet(() -> ResponseEntity.notFound().build()); + + } +} |