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;
@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
@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
@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;
}
}