X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;f=policy-agent%2Fsrc%2Fmain%2Fjava%2Forg%2Foransc%2Fpolicyagent%2Fclients%2FSdncOscA1Client.java;h=ece40e14e147dcdc49c79a8d49fe98ad905df266;hb=776c8156aae66f505ab234063923e66e7e610a01;hp=25fadbf582097419cfe3194a8bf22888d6338828;hpb=97d18aedfa83bfeb9f914a1b748aa224f04fb8b5;p=nonrtric.git diff --git a/policy-agent/src/main/java/org/oransc/policyagent/clients/SdncOscA1Client.java b/policy-agent/src/main/java/org/oransc/policyagent/clients/SdncOscA1Client.java index 25fadbf5..ece40e14 100644 --- a/policy-agent/src/main/java/org/oransc/policyagent/clients/SdncOscA1Client.java +++ b/policy-agent/src/main/java/org/oransc/policyagent/clients/SdncOscA1Client.java @@ -30,6 +30,7 @@ import java.util.List; import java.util.Optional; import org.immutables.value.Value; +import org.oransc.policyagent.configuration.ControllerConfig; import org.oransc.policyagent.configuration.RicConfig; import org.oransc.policyagent.repository.Policy; import org.slf4j.Logger; @@ -40,6 +41,9 @@ import org.springframework.web.reactive.function.client.WebClientResponseExcepti import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; +/** + * Client for accessing the A1 adapter in the SDNC controller in OSC. + */ @SuppressWarnings("squid:S2629") // Invoke method(s) only conditionally public class SdncOscA1Client implements A1Client { @@ -63,27 +67,50 @@ public class SdncOscA1Client implements A1Client { .setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_DASHES) // .create(); // + private static final String GET_POLICY_RPC = "getA1Policy"; + private static final String UNHANDELED_PROTOCOL = "Bug, unhandeled protocoltype: "; private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); - private final String a1ControllerUsername; - private final String a1ControllerPassword; + private final ControllerConfig controllerConfig; private final AsyncRestClient restClient; - private final A1UriBuilder uri; - - 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.a1ControllerUsername = username; - this.a1ControllerPassword = password; + private final RicConfig ricConfig; + private final A1ProtocolType protocolType; + + /** + * Constructor + * + * @param protocolType the southbound protocol of the controller. Supported + * protocols are SDNC_OSC_STD_V1_1 and SDNC_OSC_OSC_V1 + * @param ricConfig + * @param controllerBaseUrl the base URL of the SDNC controller + * @param username username to accesss the SDNC controller + * @param password password to accesss the SDNC controller + */ + public SdncOscA1Client(A1ProtocolType protocolType, RicConfig ricConfig, ControllerConfig controllerConfig) { + this(protocolType, ricConfig, controllerConfig, + new AsyncRestClient(controllerConfig.baseUrl() + "/restconf/operations")); + logger.debug("SdncOscA1Client for ric: {}, a1Controller: {}", ricConfig.name(), controllerConfig); + } + + public SdncOscA1Client(A1ProtocolType protocolType, RicConfig ricConfig, ControllerConfig controllerConfig, + AsyncRestClient restClient) { this.restClient = restClient; - this.uri = new StdA1UriBuilderVersion1(ricConfig); + this.ricConfig = ricConfig; + this.protocolType = protocolType; + this.controllerConfig = controllerConfig; } @Override public Mono> getPolicyTypeIdentities() { - return Mono.just(Arrays.asList("")); + if (this.protocolType == A1ProtocolType.SDNC_OSC_STD_V1_1) { + return Mono.just(Arrays.asList("")); + } else if (this.protocolType == A1ProtocolType.SDNC_OSC_OSC_V1) { + OscA1Client.UriBuilder uri = new OscA1Client.UriBuilder(ricConfig); + final String ricUrl = uri.createPolicyTypesUri(); + return post(GET_POLICY_RPC, ricUrl, Optional.empty()) // + .flatMapMany(SdncJsonHelper::parseJsonArrayOfString) // + .collectList(); + } + throw new NullPointerException(UNHANDELED_PROTOCOL + this.protocolType); } @Override @@ -94,46 +121,93 @@ public class SdncOscA1Client implements A1Client { @Override public Mono getPolicyTypeSchema(String policyTypeId) { - return Mono.just("{}"); + if (this.protocolType == A1ProtocolType.SDNC_OSC_STD_V1_1) { + return Mono.just("{}"); + } else if (this.protocolType == A1ProtocolType.SDNC_OSC_OSC_V1) { + OscA1Client.UriBuilder uri = new OscA1Client.UriBuilder(ricConfig); + final String ricUrl = uri.createGetSchemaUri(policyTypeId); + return post(GET_POLICY_RPC, ricUrl, Optional.empty()); + } + throw new NullPointerException(UNHANDELED_PROTOCOL + this.protocolType); } @Override public Mono putPolicy(Policy policy) { - final String ricUrl = uri.createPutPolicyUri(policy); + final String ricUrl = getUriBuilder().createPutPolicyUri(policy.type().name(), policy.id()); return post("putA1Policy", ricUrl, Optional.of(policy.json())); } @Override public Mono deletePolicy(Policy policy) { - return deletePolicyById(policy.id()); + return deletePolicyById(policy.type().name(), policy.id()); } @Override public Flux deleteAllPolicies() { - return getPolicyIds() // - .flatMap(this::deletePolicyById); // + if (this.protocolType == A1ProtocolType.SDNC_OSC_STD_V1_1) { + return getPolicyIds() // + .flatMap(policyId -> deletePolicyById("", policyId)); // + } else if (this.protocolType == A1ProtocolType.SDNC_OSC_OSC_V1) { + OscA1Client.UriBuilder uriBuilder = new OscA1Client.UriBuilder(ricConfig); + return getPolicyTypeIdentities() // + .flatMapMany(Flux::fromIterable) + .flatMap(type -> post(GET_POLICY_RPC, uriBuilder.createGetPolicyIdsUri(type), Optional.empty())) // + .flatMap(SdncJsonHelper::parseJsonArrayOfString); + } + throw new NullPointerException(UNHANDELED_PROTOCOL + this.protocolType); } @Override public Mono getProtocolVersion() { - return getPolicyIdentities() // - .flatMap(x -> Mono.just(A1ProtocolType.SDNC_OSC)); + return tryStdProtocolVersion() // + .onErrorResume(t -> tryOscProtocolVersion()); } @Override public Mono getPolicyStatus(Policy policy) { - final String ricUrl = uri.createGetPolicyStatusUri(policy.id()); + final String ricUrl = getUriBuilder().createGetPolicyStatusUri(policy.type().name(), policy.id()); return post("getA1PolicyStatus", ricUrl, Optional.empty()); } + private A1UriBuilder getUriBuilder() { + if (protocolType == A1ProtocolType.SDNC_OSC_STD_V1_1) { + return new StdA1ClientVersion1.UriBuilder(ricConfig); + } else if (this.protocolType == A1ProtocolType.SDNC_OSC_OSC_V1) { + return new OscA1Client.UriBuilder(ricConfig); + } + throw new NullPointerException(UNHANDELED_PROTOCOL + this.protocolType); + } + + private Mono tryOscProtocolVersion() { + OscA1Client.UriBuilder oscApiuriBuilder = new OscA1Client.UriBuilder(ricConfig); + return post(GET_POLICY_RPC, oscApiuriBuilder.createHealtcheckUri(), Optional.empty()) // + .flatMap(x -> Mono.just(A1ProtocolType.SDNC_OSC_OSC_V1)); + } + + private Mono tryStdProtocolVersion() { + StdA1ClientVersion1.UriBuilder uriBuilder = new StdA1ClientVersion1.UriBuilder(ricConfig); + return post(GET_POLICY_RPC, uriBuilder.createGetPolicyIdsUri(), Optional.empty()) // + .flatMap(x -> Mono.just(A1ProtocolType.SDNC_OSC_STD_V1_1)); + } + private Flux getPolicyIds() { - final String ricUrl = uri.createGetPolicyIdsUri(); - return post("getA1Policy", ricUrl, Optional.empty()) // - .flatMapMany(JsonHelper::parseJsonArrayOfString); + if (this.protocolType == A1ProtocolType.SDNC_OSC_STD_V1_1) { + StdA1ClientVersion1.UriBuilder uri = new StdA1ClientVersion1.UriBuilder(ricConfig); + final String ricUrl = uri.createGetPolicyIdsUri(); + return post(GET_POLICY_RPC, ricUrl, Optional.empty()) // + .flatMapMany(SdncJsonHelper::parseJsonArrayOfString); + } else if (this.protocolType == A1ProtocolType.SDNC_OSC_OSC_V1) { + OscA1Client.UriBuilder uri = new OscA1Client.UriBuilder(ricConfig); + return getPolicyTypeIdentities() // + .flatMapMany(Flux::fromIterable) + .flatMap(type -> post(GET_POLICY_RPC, uri.createGetPolicyIdsUri(type), Optional.empty())) // + .flatMap(SdncJsonHelper::parseJsonArrayOfString); + } + throw new NullPointerException(UNHANDELED_PROTOCOL + this.protocolType); } - private Mono deletePolicyById(String policyId) { - final String ricUrl = uri.createDeleteUri(policyId); + private Mono deletePolicyById(String type, String policyId) { + final String ricUrl = getUriBuilder().createDeleteUri(type, policyId); return post("deleteA1Policy", ricUrl, Optional.empty()); } @@ -142,10 +216,11 @@ public class SdncOscA1Client implements A1Client { .nearRtRicUrl(ricUrl) // .body(body) // .build(); - final String inputJsonString = JsonHelper.createInputJsonString(inputParams); + final String inputJsonString = SdncJsonHelper.createInputJsonString(inputParams); return restClient - .postWithAuthHeader(controllerUrl(rpcName), inputJsonString, a1ControllerUsername, a1ControllerPassword) + .postWithAuthHeader(controllerUrl(rpcName), inputJsonString, this.controllerConfig.userName(), + this.controllerConfig.password()) // .flatMap(this::extractResponseBody); }