Generalization of controller
[nonrtric.git] / policy-agent / src / main / java / org / oransc / policyagent / clients / SdncOscA1Client.java
index 804513a..25fadbf 100644 (file)
 
 package org.oransc.policyagent.clients;
 
+import com.google.gson.FieldNamingPolicy;
+import com.google.gson.GsonBuilder;
+
 import java.lang.invoke.MethodHandles;
+import java.nio.charset.StandardCharsets;
 import java.util.Arrays;
 import java.util.List;
+import java.util.Optional;
 
+import org.immutables.value.Value;
 import org.oransc.policyagent.configuration.RicConfig;
 import org.oransc.policyagent.repository.Policy;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.http.HttpStatus;
+import org.springframework.web.reactive.function.client.WebClientResponseException;
 
 import reactor.core.publisher.Flux;
 import reactor.core.publisher.Mono;
@@ -35,23 +43,42 @@ import reactor.core.publisher.Mono;
 @SuppressWarnings("squid:S2629") // Invoke method(s) only conditionally
 public class SdncOscA1Client implements A1Client {
 
-    private static final String URL_PREFIX = "/A1-ADAPTER-API:";
+    @Value.Immutable
+    @org.immutables.gson.Gson.TypeAdapters
+    public interface AdapterRequest {
+        public String nearRtRicUrl();
+
+        public Optional<String> body();
+    }
+
+    @Value.Immutable
+    @org.immutables.gson.Gson.TypeAdapters
+    public interface AdapterResponse {
+        public String body();
+
+        public int httpStatus();
+    }
+
+    static com.google.gson.Gson gson = new GsonBuilder() //
+        .setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_DASHES) //
+        .create(); //
+
     private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
     private final String a1ControllerUsername;
     private final String a1ControllerPassword;
-    private final RicConfig ricConfig;
     private final AsyncRestClient restClient;
+    private final A1UriBuilder uri;
 
-    public SdncOscA1Client(RicConfig ricConfig, String baseUrl, String username, String password) {
-        this(ricConfig, username, password, new AsyncRestClient(baseUrl + "/restconf/operations"));
-        logger.debug("SdncOscA1Client for ric: {}, a1ControllerBaseUrl: {}", ricConfig.name(), baseUrl);
+    public SdncOscA1Client(RicConfig ricConfig, String controllerBaseUrl, String username, String password) {
+        this(ricConfig, username, password, new AsyncRestClient(controllerBaseUrl + "/restconf/operations"));
+        logger.debug("SdncOscA1Client for ric: {}, a1ControllerBaseUrl: {}", ricConfig.name(), controllerBaseUrl);
     }
 
     public SdncOscA1Client(RicConfig ricConfig, String username, String password, AsyncRestClient restClient) {
-        this.ricConfig = ricConfig;
         this.a1ControllerUsername = username;
         this.a1ControllerPassword = password;
         this.restClient = restClient;
+        this.uri = new StdA1UriBuilderVersion1(ricConfig);
     }
 
     @Override
@@ -72,17 +99,8 @@ public class SdncOscA1Client implements A1Client {
 
     @Override
     public Mono<String> putPolicy(Policy policy) {
-        SdncOscAdapterInput inputParams = ImmutableSdncOscAdapterInput.builder() //
-            .nearRtRicUrl(ricConfig.baseUrl()) //
-            .policyTypeId(policy.type().name()) //
-            .policyId(policy.id()) //
-            .policy(policy.json()) //
-            .build();
-        String inputJsonString = JsonHelper.createInputJsonString(inputParams);
-        return restClient
-            .postWithAuthHeader(URL_PREFIX + "putPolicy", inputJsonString, a1ControllerUsername, a1ControllerPassword)
-            .flatMap(response -> JsonHelper.getValueFromResponse(response, "returned-policy")) //
-            .flatMap(JsonHelper::validateJson);
+        final String ricUrl = uri.createPutPolicyUri(policy);
+        return post("putA1Policy", ricUrl, Optional.of(policy.json()));
     }
 
     @Override
@@ -104,39 +122,47 @@ public class SdncOscA1Client implements A1Client {
 
     @Override
     public Mono<String> getPolicyStatus(Policy policy) {
-        SdncOscAdapterInput inputParams = ImmutableSdncOscAdapterInput.builder() //
-            .nearRtRicUrl(ricConfig.baseUrl()) //
-            .policyId(policy.id()) //
-            .build();
-        String inputJsonString = JsonHelper.createInputJsonString(inputParams);
-        logger.debug("POST getPolicyStatus inputJsonString = {}", inputJsonString);
-
-        return restClient
-            .postWithAuthHeader(URL_PREFIX + "getPolicyStatus", inputJsonString, a1ControllerUsername,
-                a1ControllerPassword) //
-            .flatMap(response -> JsonHelper.getValueFromResponse(response, "policy-status"));
+        final String ricUrl = uri.createGetPolicyStatusUri(policy.id());
+        return post("getA1PolicyStatus", ricUrl, Optional.empty());
     }
 
     private Flux<String> getPolicyIds() {
-        SdncOscAdapterInput inputParams = ImmutableSdncOscAdapterInput.builder() //
-            .nearRtRicUrl(ricConfig.baseUrl()) //
-            .build();
-        String inputJsonString = JsonHelper.createInputJsonString(inputParams);
-        return restClient
-            .postWithAuthHeader(URL_PREFIX + "getPolicyIdentities", inputJsonString, a1ControllerUsername,
-                a1ControllerPassword) //
-            .flatMap(response -> JsonHelper.getValueFromResponse(response, "policy-id-list")) //
+        final String ricUrl = uri.createGetPolicyIdsUri();
+        return post("getA1Policy", ricUrl, Optional.empty()) //
             .flatMapMany(JsonHelper::parseJsonArrayOfString);
     }
 
     private Mono<String> deletePolicyById(String policyId) {
-        SdncOscAdapterInput inputParams = ImmutableSdncOscAdapterInput.builder() //
-            .nearRtRicUrl(ricConfig.baseUrl()) //
-            .policyId(policyId) //
+        final String ricUrl = uri.createDeleteUri(policyId);
+        return post("deleteA1Policy", ricUrl, Optional.empty());
+    }
+
+    private Mono<String> post(String rpcName, String ricUrl, Optional<String> body) {
+        AdapterRequest inputParams = ImmutableAdapterRequest.builder() //
+            .nearRtRicUrl(ricUrl) //
+            .body(body) //
             .build();
+        final String inputJsonString = JsonHelper.createInputJsonString(inputParams);
+
+        return restClient
+            .postWithAuthHeader(controllerUrl(rpcName), inputJsonString, a1ControllerUsername, a1ControllerPassword)
+            .flatMap(this::extractResponseBody);
+    }
+
+    private Mono<String> extractResponseBody(String response) {
+        AdapterResponse output = gson.fromJson(response, ImmutableAdapterResponse.class);
+        String body = output.body();
+        if (HttpStatus.valueOf(output.httpStatus()).is2xxSuccessful()) {
+            return Mono.just(body);
+        }
+        byte[] responseBodyBytes = body.getBytes(StandardCharsets.UTF_8);
+        WebClientResponseException e = new WebClientResponseException(output.httpStatus(), "statusText", null,
+            responseBodyBytes, StandardCharsets.UTF_8, null);
+
+        return Mono.error(e);
+    }
 
-        String inputJsonString = JsonHelper.createInputJsonString(inputParams);
-        return restClient.postWithAuthHeader(URL_PREFIX + "deletePolicy", inputJsonString, a1ControllerUsername,
-            a1ControllerPassword);
+    private String controllerUrl(String rpcName) {
+        return "/A1-ADAPTER-API:" + rpcName;
     }
 }