X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;f=policy-agent%2Fsrc%2Fmain%2Fjava%2Forg%2Foransc%2Fpolicyagent%2Fcontrollers%2FPolicyController.java;h=e0971c5068c7d8379152877163478dd4e7bf99d0;hb=1b8d76de3262675c5afe45351929b0d5d2c0bab1;hp=6d849b1b8e86ac0a1fd91f06f2a191b5981e57ae;hpb=637540bc28fbf337e0c4c58c051a6b4f7ceb321d;p=nonrtric.git diff --git a/policy-agent/src/main/java/org/oransc/policyagent/controllers/PolicyController.java b/policy-agent/src/main/java/org/oransc/policyagent/controllers/PolicyController.java index 6d849b1b..e0971c50 100644 --- a/policy-agent/src/main/java/org/oransc/policyagent/controllers/PolicyController.java +++ b/policy-agent/src/main/java/org/oransc/policyagent/controllers/PolicyController.java @@ -31,7 +31,7 @@ import io.swagger.annotations.ApiResponses; import java.util.Collection; import java.util.Vector; -import org.oransc.policyagent.clients.A1Client; +import org.oransc.policyagent.clients.A1ClientFactory; import org.oransc.policyagent.configuration.ApplicationConfig; import org.oransc.policyagent.exceptions.ServiceException; import org.oransc.policyagent.repository.ImmutablePolicy; @@ -59,40 +59,45 @@ public class PolicyController { private final Rics rics; private final PolicyTypes policyTypes; private final Policies policies; - private final A1Client a1Client; + private final A1ClientFactory a1ClientFactory; private static Gson gson = new GsonBuilder() // .serializeNulls() // .create(); // @Autowired - PolicyController(ApplicationConfig config, PolicyTypes types, Policies policies, Rics rics, A1Client a1Client) { + PolicyController(ApplicationConfig config, PolicyTypes types, Policies policies, Rics rics, + A1ClientFactory a1ClientFactory) { this.policyTypes = types; this.policies = policies; this.rics = rics; - this.a1Client = a1Client; + this.a1ClientFactory = a1ClientFactory; } @GetMapping("/policy_schemas") @ApiOperation(value = "Returns policy type schema definitions") - @ApiResponses(value = {@ApiResponse(code = 200, message = "Policy Types found")}) + @ApiResponses( + value = { + @ApiResponse(code = 200, message = "Policy schemas", response = String.class, responseContainer = "List")}) public ResponseEntity getPolicySchemas(@RequestParam(name = "ric", required = false) String ricName) { - if (ricName == null) { - Collection types = this.policyTypes.getAll(); - return new ResponseEntity(toPolicyTypeSchemasJson(types), HttpStatus.OK); - } else { - try { - Collection types = rics.getRic(ricName).getSupportedPolicyTypes(); + synchronized (this.policyTypes) { + if (ricName == null) { + Collection types = this.policyTypes.getAll(); return new ResponseEntity(toPolicyTypeSchemasJson(types), HttpStatus.OK); - } catch (ServiceException e) { - return new ResponseEntity(e.toString(), HttpStatus.NOT_FOUND); + } else { + try { + Collection types = rics.getRic(ricName).getSupportedPolicyTypes(); + return new ResponseEntity(toPolicyTypeSchemasJson(types), HttpStatus.OK); + } catch (ServiceException e) { + return new ResponseEntity(e.toString(), HttpStatus.NOT_FOUND); + } } } } @GetMapping("/policy_schema") @ApiOperation(value = "Returns one policy type schema definition") - @ApiResponses(value = {@ApiResponse(code = 200, message = "Policy Type found")}) + @ApiResponses(value = {@ApiResponse(code = 200, message = "Policy schema", response = Object.class)}) public ResponseEntity getPolicySchema(@RequestParam(name = "id", required = true) String id) { try { PolicyType type = policyTypes.getType(id); @@ -103,27 +108,36 @@ public class PolicyController { } @GetMapping("/policy_types") - @ApiOperation(value = "Returns policy types") - @ApiResponses(value = {@ApiResponse(code = 200, message = "Policy Types found")}) + @ApiOperation(value = "Query policy type names") + @ApiResponses( + value = {@ApiResponse( + code = 200, + message = "Policy type names", + response = String.class, + responseContainer = "List")}) public ResponseEntity getPolicyTypes(@RequestParam(name = "ric", required = false) String ricName) { - if (ricName == null) { - Collection types = this.policyTypes.getAll(); - return new ResponseEntity(toPolicyTypeIdsJson(types), HttpStatus.OK); - } else { - try { - Collection types = rics.getRic(ricName).getSupportedPolicyTypes(); + synchronized (this.policyTypes) { + if (ricName == null) { + Collection types = this.policyTypes.getAll(); return new ResponseEntity(toPolicyTypeIdsJson(types), HttpStatus.OK); - } catch (ServiceException e) { - return new ResponseEntity(e.toString(), HttpStatus.NOT_FOUND); + } else { + try { + Collection types = rics.getRic(ricName).getSupportedPolicyTypes(); + return new ResponseEntity(toPolicyTypeIdsJson(types), HttpStatus.OK); + } catch (ServiceException e) { + return new ResponseEntity(e.toString(), HttpStatus.NOT_FOUND); + } } } } @GetMapping("/policy") - @ApiOperation(value = "Returns the policy") + @ApiOperation(value = "Returns a policy configuration") // @ApiResponses( - value = {@ApiResponse(code = 200, message = "Policy found"), - @ApiResponse(code = 204, message = "Policy is not found")}) + value = { // + @ApiResponse(code = 200, message = "Policy found", response = Object.class), // + @ApiResponse(code = 204, message = "Policy is not found")} // + ) public ResponseEntity getPolicy( // @RequestParam(name = "instance", required = true) String instance) { try { @@ -135,14 +149,15 @@ public class PolicyController { } @DeleteMapping("/policy") - @ApiOperation(value = "Deletes the policy") - @ApiResponses(value = {@ApiResponse(code = 204, message = "Policy deleted")}) + @ApiOperation(value = "Delete a policy", response = Object.class) + @ApiResponses(value = {@ApiResponse(code = 204, message = "Policy deleted", response = Object.class)}) public Mono> deletePolicy( // @RequestParam(name = "instance", required = true) String id) { Policy policy = policies.get(id); - if (policy != null && policy.ric().state().equals(Ric.RicState.ACTIVE)) { - return a1Client.deletePolicy(policy.ric().getConfig().baseUrl(), id) // - .doOnEach(notUsed -> policies.removeId(id)) // + if (policy != null && policy.ric().getState() == Ric.RicState.IDLE) { + policies.remove(policy); + return a1ClientFactory.createA1Client(policy.ric()) // + .flatMap(client -> client.deletePolicy(policy)) // .flatMap(notUsed -> { return Mono.just(new ResponseEntity<>(HttpStatus.NO_CONTENT)); }); @@ -152,59 +167,86 @@ public class PolicyController { } @PutMapping(path = "/policy") - @ApiOperation(value = "Create the policy") - @ApiResponses(value = {@ApiResponse(code = 201, message = "Policy created")}) + @ApiOperation(value = "Put a policy", response = String.class) + @ApiResponses(value = {@ApiResponse(code = 200, message = "Policy created or updated")}) public Mono> putPolicy( // @RequestParam(name = "type", required = true) String typeName, // @RequestParam(name = "instance", required = true) String instanceId, // @RequestParam(name = "ric", required = true) String ricName, // @RequestParam(name = "service", required = true) String service, // - @RequestBody String jsonBody) { + @RequestBody Object jsonBody) { + + String jsonString = gson.toJson(jsonBody); Ric ric = rics.get(ricName); PolicyType type = policyTypes.get(typeName); - if (ric != null && type != null && ric.state().equals(Ric.RicState.ACTIVE)) { + if (ric != null && type != null && ric.getState() == Ric.RicState.IDLE) { Policy policy = ImmutablePolicy.builder() // .id(instanceId) // - .json(jsonBody) // + .json(jsonString) // .type(type) // .ric(ric) // .ownerServiceName(service) // .lastModified(getTimeStampUTC()) // .build(); - return a1Client.putPolicy(policy.ric().getConfig().baseUrl(), policy.id(), policy.json()) // + return a1ClientFactory.createA1Client(ric) // + .flatMap(client -> client.putPolicy(policy)) // .doOnNext(notUsed -> policies.put(policy)) // .flatMap(notUsed -> { - return Mono.just(new ResponseEntity<>(HttpStatus.CREATED)); + return Mono.just(new ResponseEntity<>(HttpStatus.OK)); }); } return Mono.just(new ResponseEntity<>(HttpStatus.NOT_FOUND)); } @GetMapping("/policies") - @ApiOperation(value = "Returns the policies") - @ApiResponses(value = {@ApiResponse(code = 200, message = "Policies found")}) + @ApiOperation(value = "Query policies") + @ApiResponses( + value = { + @ApiResponse(code = 200, message = "Policies", response = PolicyInfo.class, responseContainer = "List")}) public ResponseEntity getPolicies( // @RequestParam(name = "type", required = false) String type, // @RequestParam(name = "ric", required = false) String ric, // @RequestParam(name = "service", required = false) String service) // { - Collection result = null; + synchronized (policies) { + Collection result = null; - if (type != null) { - result = policies.getForType(type); - result = filter(result, null, ric, service); - } else if (service != null) { - result = policies.getForService(service); - result = filter(result, type, ric, null); - } else if (ric != null) { - result = policies.getForRic(ric); - result = filter(result, type, null, service); - } else { - result = policies.getAll(); + if (type != null) { + result = policies.getForType(type); + result = filter(result, null, ric, service); + } else if (service != null) { + result = policies.getForService(service); + result = filter(result, type, ric, null); + } else if (ric != null) { + result = policies.getForRic(ric); + result = filter(result, type, null, service); + } else { + result = policies.getAll(); + } + + return new ResponseEntity(policiesToJson(result), HttpStatus.OK); } + } + + @GetMapping("/policy_status") + @ApiOperation(value = "Returns a policy status") // + @ApiResponses( + value = { // + @ApiResponse(code = 200, message = "Policy status", response = Object.class), // + @ApiResponse(code = 204, message = "Policy is not found", response = String.class)} // + ) + public Mono> getPolicyStatus( // + @RequestParam(name = "instance", required = true) String instance) { + try { + Policy policy = policies.getPolicy(instance); - return new ResponseEntity(policiesToJson(result), HttpStatus.OK); + return a1ClientFactory.createA1Client(policy.ric()) // + .flatMap(client -> client.getPolicyStatus(policy)) // + .flatMap(status -> Mono.just(new ResponseEntity(status, HttpStatus.OK))); + } catch (ServiceException e) { + return Mono.just(new ResponseEntity(e.getMessage(), HttpStatus.NO_CONTENT)); + } } private boolean include(String filter, String value) { @@ -228,14 +270,16 @@ public class PolicyController { private String policiesToJson(Collection policies) { Vector v = new Vector<>(policies.size()); for (Policy p : policies) { - PolicyInfo policyInfo = ImmutablePolicyInfo.builder() // - .json(p.json()) // - .id(p.id()) // - .ric(p.ric().name()) // - .type(p.type().name()) // - .service(p.ownerServiceName()) // - .lastModified(p.lastModified()) // - .build(); + PolicyInfo policyInfo = new PolicyInfo(); + policyInfo.id = p.id(); + policyInfo.json = p.json(); + policyInfo.ric = p.ric().name(); + policyInfo.type = p.type().name(); + policyInfo.service = p.ownerServiceName(); + policyInfo.lastModified = p.lastModified(); + if (!policyInfo.validate()) { + throw new RuntimeException("BUG, all fields must be set"); + } v.add(policyInfo); } return gson.toJson(v);