Added check of callback URL in service registration
[nonrtric.git] / policy-agent / src / main / java / org / oransc / policyagent / controllers / ServiceController.java
index 3d36228..922ba3d 100644 (file)
@@ -28,10 +28,11 @@ import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiResponse;
 import io.swagger.annotations.ApiResponses;
 
+import java.net.MalformedURLException;
+import java.net.URL;
 import java.time.Duration;
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.List;
 
 import org.oransc.policyagent.exceptions.ServiceException;
 import org.oransc.policyagent.repository.Policies;
@@ -43,7 +44,6 @@ import org.springframework.http.HttpStatus;
 import org.springframework.http.ResponseEntity;
 import org.springframework.web.bind.annotation.DeleteMapping;
 import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.PutMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestParam;
@@ -79,11 +79,9 @@ public class ServiceController {
         }
 
         Collection<ServiceStatus> servicesStatus = new ArrayList<>();
-        synchronized (this.services) {
-            for (Service s : this.services.getAll()) {
-                if (name == null || name.equals(s.getName())) {
-                    servicesStatus.add(toServiceStatus(s));
-                }
+        for (Service s : this.services.getAll()) {
+            if (name == null || name.equals(s.getName())) {
+                servicesStatus.add(toServiceStatus(s));
             }
         }
 
@@ -96,24 +94,33 @@ public class ServiceController {
             s.getCallbackUrl());
     }
 
-    private void validateRegistrationInfo(ServiceRegistrationInfo registrationInfo) throws ServiceException {
+    private void validateRegistrationInfo(ServiceRegistrationInfo registrationInfo)
+        throws ServiceException, MalformedURLException {
         if (registrationInfo.serviceName.isEmpty()) {
             throw new ServiceException("Missing mandatory parameter 'serviceName'");
         }
+        if (registrationInfo.keepAliveIntervalSeconds < 0) {
+            throw new ServiceException("Keepalive interval shoul be greater or equal to 0");
+        }
+        if (!registrationInfo.callbackUrl.isEmpty()) {
+            new URL(registrationInfo.callbackUrl);
+        }
     }
 
     @ApiOperation(value = "Register a service")
     @ApiResponses(
         value = { //
-            @ApiResponse(code = 200, message = "OK", response = String.class),
-            @ApiResponse(code = 400, message = "Cannot parse the ServiceRegistrationInfo", response = String.class)})
+            @ApiResponse(code = 200, message = "Service updated", response = String.class),
+            @ApiResponse(code = 201, message = "Service created", response = String.class), //
+            @ApiResponse(code = 400, message = "The ServiceRegistrationInfo is not accepted", response = String.class)})
     @PutMapping("/service")
     public ResponseEntity<String> putService(//
         @RequestBody ServiceRegistrationInfo registrationInfo) {
         try {
             validateRegistrationInfo(registrationInfo);
+            final boolean isCreate = this.services.get(registrationInfo.serviceName) == null;
             this.services.put(toService(registrationInfo));
-            return new ResponseEntity<>("OK", HttpStatus.OK);
+            return new ResponseEntity<>("OK", isCreate ? HttpStatus.CREATED : HttpStatus.OK);
         } catch (Exception e) {
             return new ResponseEntity<>(e.getMessage(), HttpStatus.BAD_REQUEST);
         }
@@ -143,7 +150,7 @@ public class ServiceController {
         value = { //
             @ApiResponse(code = 200, message = "Service supervision timer refreshed, OK"),
             @ApiResponse(code = 404, message = "The service is not found, needs re-registration")})
-    @PostMapping("/services/keepalive")
+    @PutMapping("/services/keepalive")
     public ResponseEntity<String> keepAliveService(//
         @RequestParam(name = "name", required = true) String serviceName) {
         try {
@@ -155,19 +162,15 @@ public class ServiceController {
     }
 
     private Service removeService(String name) throws ServiceException {
-        synchronized (this.services) {
-            Service service = this.services.getService(name);
-            this.services.remove(service.getName());
-            return service;
-        }
+        Service service = this.services.getService(name); // Just to verify that it exists
+        this.services.remove(service.getName());
+        return service;
     }
 
     private void removePolicies(Service service) {
-        synchronized (this.policies) {
-            List<Policy> policyList = new ArrayList<>(this.policies.getForService(service.getName()));
-            for (Policy policy : policyList) {
-                this.policies.remove(policy);
-            }
+        Collection<Policy> policyList = this.policies.getForService(service.getName());
+        for (Policy policy : policyList) {
+            this.policies.remove(policy);
         }
     }