From 35867f2e63c26d47417bfefc9a0912f17c4a873a Mon Sep 17 00:00:00 2001 From: Jim Hahn Date: Sat, 8 Feb 2020 08:32:59 -0500 Subject: Add more code to facilitate actor implementation Added obtain() to Context Added startGuardAsync(), in anticipation of adding guards. Moved logRestXxx() from Util to HttpOperation. Added actor.test to facilitate testing of actors. Changed timeoutSec from long to int in various places. Made a couple of methods public to support junit testing. Most of the methods required Params to be passed, which indicated a design issue. Split Operator and Operation so that the Params could be kept in a field and thus need not be passed to every method. Basically, renamed OperatorPartial.java to OperationPartial.java and created a new OperatorPartial.java. Of course, this makes it look to gerrit like it's all new code, when in fact, most of it is unchanged, other than removing the Params argument to the method calls. That accounts for about half of the "lines changed" count. Issue-ID: POLICY-1625 Change-Id: I9e98c9dadcbed145bf84deb06c9db1c864a3c24a Signed-off-by: Jim Hahn --- .../actor/sdnc/BandwidthOnDemandOperation.java | 113 ++++++++ .../actor/sdnc/BandwidthOnDemandOperator.java | 108 ------- .../controlloop/actor/sdnc/RerouteOperation.java | 92 ++++++ .../controlloop/actor/sdnc/RerouteOperator.java | 87 ------ .../actor/sdnc/SdncActorServiceProvider.java | 8 +- .../controlloop/actor/sdnc/SdncOperation.java | 85 ++++++ .../controlloop/actor/sdnc/SdncOperator.java | 148 ---------- .../actor/sdnc/BandwidthOnDemandOperatorTest.java | 32 ++- .../controlloop/actor/sdnc/BasicOperator.java | 94 ------- .../controlloop/actor/sdnc/BasicSdncOperator.java | 148 ++++++++++ .../actor/sdnc/RerouteOperatorTest.java | 34 ++- .../actor/sdnc/SdncActorServiceProviderTest.java | 4 +- .../controlloop/actor/sdnc/SdncOperatorTest.java | 309 +++------------------ 13 files changed, 520 insertions(+), 742 deletions(-) create mode 100644 models-interactions/model-actors/actor.sdnc/src/main/java/org/onap/policy/controlloop/actor/sdnc/BandwidthOnDemandOperation.java delete mode 100644 models-interactions/model-actors/actor.sdnc/src/main/java/org/onap/policy/controlloop/actor/sdnc/BandwidthOnDemandOperator.java create mode 100644 models-interactions/model-actors/actor.sdnc/src/main/java/org/onap/policy/controlloop/actor/sdnc/RerouteOperation.java delete mode 100644 models-interactions/model-actors/actor.sdnc/src/main/java/org/onap/policy/controlloop/actor/sdnc/RerouteOperator.java create mode 100644 models-interactions/model-actors/actor.sdnc/src/main/java/org/onap/policy/controlloop/actor/sdnc/SdncOperation.java delete mode 100644 models-interactions/model-actors/actor.sdnc/src/main/java/org/onap/policy/controlloop/actor/sdnc/SdncOperator.java delete mode 100644 models-interactions/model-actors/actor.sdnc/src/test/java/org/onap/policy/controlloop/actor/sdnc/BasicOperator.java create mode 100644 models-interactions/model-actors/actor.sdnc/src/test/java/org/onap/policy/controlloop/actor/sdnc/BasicSdncOperator.java (limited to 'models-interactions/model-actors/actor.sdnc/src') diff --git a/models-interactions/model-actors/actor.sdnc/src/main/java/org/onap/policy/controlloop/actor/sdnc/BandwidthOnDemandOperation.java b/models-interactions/model-actors/actor.sdnc/src/main/java/org/onap/policy/controlloop/actor/sdnc/BandwidthOnDemandOperation.java new file mode 100644 index 000000000..26cdfada3 --- /dev/null +++ b/models-interactions/model-actors/actor.sdnc/src/main/java/org/onap/policy/controlloop/actor/sdnc/BandwidthOnDemandOperation.java @@ -0,0 +1,113 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP + * ================================================================================ + * Copyright (C) 2020 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.onap.policy.controlloop.actor.sdnc; + +import java.util.UUID; +import org.apache.commons.lang3.StringUtils; +import org.onap.policy.controlloop.actorserviceprovider.controlloop.ControlLoopEventContext; +import org.onap.policy.controlloop.actorserviceprovider.impl.HttpOperator; +import org.onap.policy.controlloop.actorserviceprovider.parameters.ControlLoopOperationParams; +import org.onap.policy.sdnc.SdncHealRequest; +import org.onap.policy.sdnc.SdncHealRequestHeaderInfo; +import org.onap.policy.sdnc.SdncHealRequestInfo; +import org.onap.policy.sdnc.SdncHealServiceInfo; +import org.onap.policy.sdnc.SdncHealVfModuleInfo; +import org.onap.policy.sdnc.SdncHealVfModuleParameter; +import org.onap.policy.sdnc.SdncHealVfModuleParametersInfo; +import org.onap.policy.sdnc.SdncHealVfModuleRequestInput; +import org.onap.policy.sdnc.SdncHealVnfInfo; +import org.onap.policy.sdnc.SdncRequest; + +public class BandwidthOnDemandOperation extends SdncOperation { + public static final String NAME = "BandwidthOnDemand"; + + public static final String URI = "/GENERIC-RESOURCE-API:vf-module-topology-operation"; + + // fields in the enrichment data + public static final String SERVICE_ID_KEY = "service-instance.service-instance-id"; + public static final String VNF_ID = "vnfId"; + + /** + * Constructs the object. + * + * @param params operation parameters + * @param operator operator that created this operation + */ + public BandwidthOnDemandOperation(ControlLoopOperationParams params, HttpOperator operator) { + super(params, operator); + } + + @Override + protected SdncRequest makeRequest(int attempt) { + ControlLoopEventContext context = params.getContext(); + + String serviceInstance = context.getEnrichment().get(SERVICE_ID_KEY); + if (StringUtils.isBlank(serviceInstance)) { + throw new IllegalArgumentException("missing enrichment data, " + SERVICE_ID_KEY); + } + + SdncHealVfModuleParameter bandwidth = new SdncHealVfModuleParameter(); + bandwidth.setName("bandwidth"); + bandwidth.setValue(context.getEnrichment().get("bandwidth")); + + SdncHealVfModuleParameter timeStamp = new SdncHealVfModuleParameter(); + timeStamp.setName("bandwidth-change-time"); + timeStamp.setValue(context.getEnrichment().get("bandwidth-change-time")); + + SdncHealVfModuleParametersInfo vfParametersInfo = new SdncHealVfModuleParametersInfo(); + vfParametersInfo.addParameters(bandwidth); + vfParametersInfo.addParameters(timeStamp); + + SdncHealVfModuleRequestInput vfRequestInfo = new SdncHealVfModuleRequestInput(); + vfRequestInfo.setVfModuleParametersInfo(vfParametersInfo); + + SdncHealServiceInfo serviceInfo = new SdncHealServiceInfo(); + serviceInfo.setServiceInstanceId(serviceInstance); + + SdncHealRequestInfo requestInfo = new SdncHealRequestInfo(); + requestInfo.setRequestAction("SdwanBandwidthChange"); + + SdncHealRequestHeaderInfo headerInfo = new SdncHealRequestHeaderInfo(); + headerInfo.setSvcAction("update"); + headerInfo.setSvcRequestId(UUID.randomUUID().toString()); + + SdncRequest request = new SdncRequest(); + request.setNsInstanceId(serviceInstance); + request.setRequestId(context.getRequestId()); + request.setUrl(URI); + + SdncHealVnfInfo vnfInfo = new SdncHealVnfInfo(); + vnfInfo.setVnfId(context.getEnrichment().get(VNF_ID)); + + SdncHealVfModuleInfo vfModuleInfo = new SdncHealVfModuleInfo(); + vfModuleInfo.setVfModuleId(""); + + SdncHealRequest healRequest = new SdncHealRequest(); + healRequest.setVnfInfo(vnfInfo); + healRequest.setVfModuleInfo(vfModuleInfo); + healRequest.setRequestHeaderInfo(headerInfo); + healRequest.setVfModuleRequestInput(vfRequestInfo); + healRequest.setRequestInfo(requestInfo); + healRequest.setServiceInfo(serviceInfo); + request.setHealRequest(healRequest); + return request; + } +} diff --git a/models-interactions/model-actors/actor.sdnc/src/main/java/org/onap/policy/controlloop/actor/sdnc/BandwidthOnDemandOperator.java b/models-interactions/model-actors/actor.sdnc/src/main/java/org/onap/policy/controlloop/actor/sdnc/BandwidthOnDemandOperator.java deleted file mode 100644 index 2927bd85b..000000000 --- a/models-interactions/model-actors/actor.sdnc/src/main/java/org/onap/policy/controlloop/actor/sdnc/BandwidthOnDemandOperator.java +++ /dev/null @@ -1,108 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP - * ================================================================================ - * Copyright (C) 2020 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END========================================================= - */ - -package org.onap.policy.controlloop.actor.sdnc; - -import java.util.UUID; -import org.apache.commons.lang3.StringUtils; -import org.onap.policy.controlloop.actorserviceprovider.controlloop.ControlLoopEventContext; -import org.onap.policy.sdnc.SdncHealRequest; -import org.onap.policy.sdnc.SdncHealRequestHeaderInfo; -import org.onap.policy.sdnc.SdncHealRequestInfo; -import org.onap.policy.sdnc.SdncHealServiceInfo; -import org.onap.policy.sdnc.SdncHealVfModuleInfo; -import org.onap.policy.sdnc.SdncHealVfModuleParameter; -import org.onap.policy.sdnc.SdncHealVfModuleParametersInfo; -import org.onap.policy.sdnc.SdncHealVfModuleRequestInput; -import org.onap.policy.sdnc.SdncHealVnfInfo; -import org.onap.policy.sdnc.SdncRequest; - -public class BandwidthOnDemandOperator extends SdncOperator { - public static final String NAME = "BandwidthOnDemand"; - - public static final String URI = "/GENERIC-RESOURCE-API:vf-module-topology-operation"; - - // fields in the enrichment data - public static final String SERVICE_ID_KEY = "service-instance.service-instance-id"; - public static final String VNF_ID = "vnfId"; - - /** - * Constructs the object. - * - * @param actorName name of the actor with which this operator is associated - */ - public BandwidthOnDemandOperator(String actorName) { - super(actorName, NAME); - } - - @Override - protected SdncRequest constructRequest(ControlLoopEventContext context) { - String serviceInstance = context.getEnrichment().get(SERVICE_ID_KEY); - if (StringUtils.isBlank(serviceInstance)) { - throw new IllegalArgumentException("missing enrichment data, " + SERVICE_ID_KEY); - } - - SdncHealVfModuleParameter bandwidth = new SdncHealVfModuleParameter(); - bandwidth.setName("bandwidth"); - bandwidth.setValue(context.getEnrichment().get("bandwidth")); - - SdncHealVfModuleParameter timeStamp = new SdncHealVfModuleParameter(); - timeStamp.setName("bandwidth-change-time"); - timeStamp.setValue(context.getEnrichment().get("bandwidth-change-time")); - - SdncHealVfModuleParametersInfo vfParametersInfo = new SdncHealVfModuleParametersInfo(); - vfParametersInfo.addParameters(bandwidth); - vfParametersInfo.addParameters(timeStamp); - - SdncHealVfModuleRequestInput vfRequestInfo = new SdncHealVfModuleRequestInput(); - vfRequestInfo.setVfModuleParametersInfo(vfParametersInfo); - - SdncHealServiceInfo serviceInfo = new SdncHealServiceInfo(); - serviceInfo.setServiceInstanceId(serviceInstance); - - SdncHealRequestInfo requestInfo = new SdncHealRequestInfo(); - requestInfo.setRequestAction("SdwanBandwidthChange"); - - SdncHealRequestHeaderInfo headerInfo = new SdncHealRequestHeaderInfo(); - headerInfo.setSvcAction("update"); - headerInfo.setSvcRequestId(UUID.randomUUID().toString()); - - SdncRequest request = new SdncRequest(); - request.setNsInstanceId(serviceInstance); - request.setRequestId(context.getRequestId()); - request.setUrl(URI); - - SdncHealVnfInfo vnfInfo = new SdncHealVnfInfo(); - vnfInfo.setVnfId(context.getEnrichment().get(VNF_ID)); - - SdncHealVfModuleInfo vfModuleInfo = new SdncHealVfModuleInfo(); - vfModuleInfo.setVfModuleId(""); - - SdncHealRequest healRequest = new SdncHealRequest(); - healRequest.setVnfInfo(vnfInfo); - healRequest.setVfModuleInfo(vfModuleInfo); - healRequest.setRequestHeaderInfo(headerInfo); - healRequest.setVfModuleRequestInput(vfRequestInfo); - healRequest.setRequestInfo(requestInfo); - healRequest.setServiceInfo(serviceInfo); - request.setHealRequest(healRequest); - return request; - } -} diff --git a/models-interactions/model-actors/actor.sdnc/src/main/java/org/onap/policy/controlloop/actor/sdnc/RerouteOperation.java b/models-interactions/model-actors/actor.sdnc/src/main/java/org/onap/policy/controlloop/actor/sdnc/RerouteOperation.java new file mode 100644 index 000000000..f255f3e84 --- /dev/null +++ b/models-interactions/model-actors/actor.sdnc/src/main/java/org/onap/policy/controlloop/actor/sdnc/RerouteOperation.java @@ -0,0 +1,92 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP + * ================================================================================ + * Copyright (C) 2020 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.onap.policy.controlloop.actor.sdnc; + +import java.util.UUID; +import org.apache.commons.lang3.StringUtils; +import org.onap.policy.controlloop.actorserviceprovider.controlloop.ControlLoopEventContext; +import org.onap.policy.controlloop.actorserviceprovider.impl.HttpOperator; +import org.onap.policy.controlloop.actorserviceprovider.parameters.ControlLoopOperationParams; +import org.onap.policy.sdnc.SdncHealNetworkInfo; +import org.onap.policy.sdnc.SdncHealRequest; +import org.onap.policy.sdnc.SdncHealRequestHeaderInfo; +import org.onap.policy.sdnc.SdncHealRequestInfo; +import org.onap.policy.sdnc.SdncHealServiceInfo; +import org.onap.policy.sdnc.SdncRequest; + +public class RerouteOperation extends SdncOperation { + public static final String NAME = "Reroute"; + + public static final String URI = "/GENERIC-RESOURCE-API:network-topology-operation"; + + // fields in the enrichment data + public static final String SERVICE_ID_KEY = "service-instance.service-instance-id"; + public static final String NETWORK_ID_KEY = "network-information.network-id"; + + /** + * Constructs the object. + * + * @param params operation parameters + * @param operator operator that created this operation + */ + public RerouteOperation(ControlLoopOperationParams params, HttpOperator operator) { + super(params, operator); + } + + @Override + protected SdncRequest makeRequest(int attempt) { + ControlLoopEventContext context = params.getContext(); + + String serviceInstance = context.getEnrichment().get(SERVICE_ID_KEY); + if (StringUtils.isBlank(serviceInstance)) { + throw new IllegalArgumentException("missing enrichment data, " + SERVICE_ID_KEY); + } + SdncHealServiceInfo serviceInfo = new SdncHealServiceInfo(); + serviceInfo.setServiceInstanceId(serviceInstance); + + String networkId = context.getEnrichment().get(NETWORK_ID_KEY); + if (StringUtils.isBlank(networkId)) { + throw new IllegalArgumentException("missing enrichment data, " + NETWORK_ID_KEY); + } + SdncHealNetworkInfo networkInfo = new SdncHealNetworkInfo(); + networkInfo.setNetworkId(networkId); + + SdncHealRequestInfo requestInfo = new SdncHealRequestInfo(); + requestInfo.setRequestAction("ReoptimizeSOTNInstance"); + + SdncHealRequestHeaderInfo headerInfo = new SdncHealRequestHeaderInfo(); + headerInfo.setSvcAction("reoptimize"); + headerInfo.setSvcRequestId(UUID.randomUUID().toString()); + + SdncRequest request = new SdncRequest(); + request.setNsInstanceId(serviceInstance); + request.setRequestId(context.getRequestId()); + request.setUrl(URI); + + SdncHealRequest healRequest = new SdncHealRequest(); + healRequest.setRequestHeaderInfo(headerInfo); + healRequest.setNetworkInfo(networkInfo); + healRequest.setRequestInfo(requestInfo); + healRequest.setServiceInfo(serviceInfo); + request.setHealRequest(healRequest); + return request; + } +} diff --git a/models-interactions/model-actors/actor.sdnc/src/main/java/org/onap/policy/controlloop/actor/sdnc/RerouteOperator.java b/models-interactions/model-actors/actor.sdnc/src/main/java/org/onap/policy/controlloop/actor/sdnc/RerouteOperator.java deleted file mode 100644 index da400f8eb..000000000 --- a/models-interactions/model-actors/actor.sdnc/src/main/java/org/onap/policy/controlloop/actor/sdnc/RerouteOperator.java +++ /dev/null @@ -1,87 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP - * ================================================================================ - * Copyright (C) 2020 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END========================================================= - */ - -package org.onap.policy.controlloop.actor.sdnc; - -import java.util.UUID; -import org.apache.commons.lang3.StringUtils; -import org.onap.policy.controlloop.actorserviceprovider.controlloop.ControlLoopEventContext; -import org.onap.policy.sdnc.SdncHealNetworkInfo; -import org.onap.policy.sdnc.SdncHealRequest; -import org.onap.policy.sdnc.SdncHealRequestHeaderInfo; -import org.onap.policy.sdnc.SdncHealRequestInfo; -import org.onap.policy.sdnc.SdncHealServiceInfo; -import org.onap.policy.sdnc.SdncRequest; - -public class RerouteOperator extends SdncOperator { - public static final String NAME = "Reroute"; - - public static final String URI = "/GENERIC-RESOURCE-API:network-topology-operation"; - - // fields in the enrichment data - public static final String SERVICE_ID_KEY = "service-instance.service-instance-id"; - public static final String NETWORK_ID_KEY = "network-information.network-id"; - - /** - * Constructs the object. - * - * @param actorName name of the actor with which this operator is associated - */ - public RerouteOperator(String actorName) { - super(actorName, NAME); - } - - @Override - protected SdncRequest constructRequest(ControlLoopEventContext context) { - String serviceInstance = context.getEnrichment().get(SERVICE_ID_KEY); - if (StringUtils.isBlank(serviceInstance)) { - throw new IllegalArgumentException("missing enrichment data, " + SERVICE_ID_KEY); - } - SdncHealServiceInfo serviceInfo = new SdncHealServiceInfo(); - serviceInfo.setServiceInstanceId(serviceInstance); - - String networkId = context.getEnrichment().get(NETWORK_ID_KEY); - if (StringUtils.isBlank(networkId)) { - throw new IllegalArgumentException("missing enrichment data, " + NETWORK_ID_KEY); - } - SdncHealNetworkInfo networkInfo = new SdncHealNetworkInfo(); - networkInfo.setNetworkId(networkId); - - SdncHealRequestInfo requestInfo = new SdncHealRequestInfo(); - requestInfo.setRequestAction("ReoptimizeSOTNInstance"); - - SdncHealRequestHeaderInfo headerInfo = new SdncHealRequestHeaderInfo(); - headerInfo.setSvcAction("reoptimize"); - headerInfo.setSvcRequestId(UUID.randomUUID().toString()); - - SdncRequest request = new SdncRequest(); - request.setNsInstanceId(serviceInstance); - request.setRequestId(context.getRequestId()); - request.setUrl(URI); - - SdncHealRequest healRequest = new SdncHealRequest(); - healRequest.setRequestHeaderInfo(headerInfo); - healRequest.setNetworkInfo(networkInfo); - healRequest.setRequestInfo(requestInfo); - healRequest.setServiceInfo(serviceInfo); - request.setHealRequest(healRequest); - return request; - } -} diff --git a/models-interactions/model-actors/actor.sdnc/src/main/java/org/onap/policy/controlloop/actor/sdnc/SdncActorServiceProvider.java b/models-interactions/model-actors/actor.sdnc/src/main/java/org/onap/policy/controlloop/actor/sdnc/SdncActorServiceProvider.java index 8dc8ba50d..99a4fdadd 100644 --- a/models-interactions/model-actors/actor.sdnc/src/main/java/org/onap/policy/controlloop/actor/sdnc/SdncActorServiceProvider.java +++ b/models-interactions/model-actors/actor.sdnc/src/main/java/org/onap/policy/controlloop/actor/sdnc/SdncActorServiceProvider.java @@ -30,6 +30,7 @@ import java.util.UUID; import org.onap.policy.controlloop.ControlLoopOperation; import org.onap.policy.controlloop.VirtualControlLoopEvent; import org.onap.policy.controlloop.actorserviceprovider.impl.HttpActor; +import org.onap.policy.controlloop.actorserviceprovider.impl.HttpOperator; import org.onap.policy.controlloop.policy.Policy; import org.onap.policy.sdnc.SdncHealNetworkInfo; import org.onap.policy.sdnc.SdncHealRequest; @@ -76,8 +77,11 @@ public class SdncActorServiceProvider extends HttpActor { public SdncActorServiceProvider() { super(NAME); - addOperator(new RerouteOperator(NAME)); - addOperator(new BandwidthOnDemandOperator(NAME)); + addOperator(HttpOperator.makeOperator(NAME, RerouteOperation.NAME, + RerouteOperation::new)); + + addOperator(HttpOperator.makeOperator(NAME, BandwidthOnDemandOperation.NAME, + BandwidthOnDemandOperation::new)); } diff --git a/models-interactions/model-actors/actor.sdnc/src/main/java/org/onap/policy/controlloop/actor/sdnc/SdncOperation.java b/models-interactions/model-actors/actor.sdnc/src/main/java/org/onap/policy/controlloop/actor/sdnc/SdncOperation.java new file mode 100644 index 000000000..9d42c49d9 --- /dev/null +++ b/models-interactions/model-actors/actor.sdnc/src/main/java/org/onap/policy/controlloop/actor/sdnc/SdncOperation.java @@ -0,0 +1,85 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP + * ================================================================================ + * Copyright (C) 2020 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.onap.policy.controlloop.actor.sdnc; + +import java.util.Map; +import java.util.concurrent.CompletableFuture; +import javax.ws.rs.client.Entity; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; +import org.onap.policy.controlloop.actorserviceprovider.OperationOutcome; +import org.onap.policy.controlloop.actorserviceprovider.impl.HttpOperation; +import org.onap.policy.controlloop.actorserviceprovider.impl.HttpOperator; +import org.onap.policy.controlloop.actorserviceprovider.parameters.ControlLoopOperationParams; +import org.onap.policy.sdnc.SdncRequest; +import org.onap.policy.sdnc.SdncResponse; + +/** + * Superclass for SDNC Operators. + */ +public abstract class SdncOperation extends HttpOperation { + + /** + * Constructs the object. + * + * @param params operation parameters + * @param operator operator that created this operation + */ + public SdncOperation(ControlLoopOperationParams params, HttpOperator operator) { + super(params, operator, SdncResponse.class); + } + + @Override + protected CompletableFuture startOperationAsync(int attempt, OperationOutcome outcome) { + + SdncRequest request = makeRequest(attempt); + + Entity entity = Entity.entity(request, MediaType.APPLICATION_JSON); + + Map headers = makeHeaders(); + + headers.put("Accept", MediaType.APPLICATION_JSON); + String url = makeUrl(); + + logRestRequest(url, request); + + // @formatter:off + return handleResponse(outcome, url, + callback -> operator.getClient().post(callback, makePath(), entity, headers)); + // @formatter:on + } + + /** + * Makes the request. + * + * @param attempt current attempt, starting with "1" + * @return a new request to be posted + */ + protected abstract SdncRequest makeRequest(int attempt); + + /** + * Checks that the response has an "output" and that the output indicates success. + */ + @Override + protected boolean isSuccess(Response rawResponse, SdncResponse response) { + return response.getResponseOutput() != null && "200".equals(response.getResponseOutput().getResponseCode()); + } +} diff --git a/models-interactions/model-actors/actor.sdnc/src/main/java/org/onap/policy/controlloop/actor/sdnc/SdncOperator.java b/models-interactions/model-actors/actor.sdnc/src/main/java/org/onap/policy/controlloop/actor/sdnc/SdncOperator.java deleted file mode 100644 index 479ee908d..000000000 --- a/models-interactions/model-actors/actor.sdnc/src/main/java/org/onap/policy/controlloop/actor/sdnc/SdncOperator.java +++ /dev/null @@ -1,148 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP - * ================================================================================ - * Copyright (C) 2020 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END========================================================= - */ - -package org.onap.policy.controlloop.actor.sdnc; - -import java.util.HashMap; -import java.util.Map; -import java.util.concurrent.CompletableFuture; -import javax.ws.rs.client.Entity; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; -import org.onap.policy.common.endpoints.http.client.HttpClient; -import org.onap.policy.common.utils.coder.CoderException; -import org.onap.policy.common.utils.coder.StandardCoder; -import org.onap.policy.controlloop.actorserviceprovider.AsyncResponseHandler; -import org.onap.policy.controlloop.actorserviceprovider.OperationOutcome; -import org.onap.policy.controlloop.actorserviceprovider.Util; -import org.onap.policy.controlloop.actorserviceprovider.controlloop.ControlLoopEventContext; -import org.onap.policy.controlloop.actorserviceprovider.impl.HttpOperator; -import org.onap.policy.controlloop.actorserviceprovider.parameters.ControlLoopOperationParams; -import org.onap.policy.controlloop.policy.PolicyResult; -import org.onap.policy.sdnc.SdncRequest; -import org.onap.policy.sdnc.SdncResponse; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * Superclass for SDNC Operators. - */ -public abstract class SdncOperator extends HttpOperator { - private static final Logger logger = LoggerFactory.getLogger(SdncOperator.class); - - /** - * Constructs the object. - * - * @param actorName name of the actor with which this operator is associated - * @param name operation name - */ - public SdncOperator(String actorName, String name) { - super(actorName, name); - } - - @Override - protected CompletableFuture startOperationAsync(ControlLoopOperationParams params, int attempt, - OperationOutcome outcome) { - - SdncRequest request = constructRequest(params.getContext()); - return postRequest(params, outcome, request); - } - - /** - * Constructs the request. - * - * @param context associated event context - * @return a new request - */ - protected abstract SdncRequest constructRequest(ControlLoopEventContext context); - - /** - * Posts the request and and arranges to retrieve the response. - * - * @param params operation parameters - * @param outcome updated with the response - * @param sdncRequest request to be posted - * @return the result of the request - */ - private CompletableFuture postRequest(ControlLoopOperationParams params, OperationOutcome outcome, - SdncRequest sdncRequest) { - Map headers = new HashMap<>(); - - headers.put("Accept", "application/json"); - String sdncUrl = getClient().getBaseUrl(); - - Util.logRestRequest(sdncUrl, sdncRequest); - - Entity entity = Entity.entity(sdncRequest, MediaType.APPLICATION_JSON); - - ResponseHandler handler = new ResponseHandler(params, outcome, sdncUrl); - return handler.handle(getClient().post(handler, getPath(), entity, headers)); - } - - private class ResponseHandler extends AsyncResponseHandler { - private final String sdncUrl; - - public ResponseHandler(ControlLoopOperationParams params, OperationOutcome outcome, String sdncUrl) { - super(params, outcome); - this.sdncUrl = sdncUrl; - } - - /** - * Handles the response. - */ - @Override - protected OperationOutcome doComplete(Response rawResponse) { - String strResponse = HttpClient.getBody(rawResponse, String.class); - - Util.logRestResponse(sdncUrl, strResponse); - - SdncResponse response; - try { - response = makeDecoder().decode(strResponse, SdncResponse.class); - } catch (CoderException e) { - logger.warn("Sdnc Heal cannot decode response with http error code {}", rawResponse.getStatus(), e); - return SdncOperator.this.setOutcome(getParams(), getOutcome(), PolicyResult.FAILURE_EXCEPTION); - } - - if (response.getResponseOutput() != null && "200".equals(response.getResponseOutput().getResponseCode())) { - return SdncOperator.this.setOutcome(getParams(), getOutcome(), PolicyResult.SUCCESS); - - } else { - logger.info("Sdnc Heal Restcall failed with http error code {}", rawResponse.getStatus()); - return SdncOperator.this.setOutcome(getParams(), getOutcome(), PolicyResult.FAILURE); - } - } - - /** - * Handles exceptions. - */ - @Override - protected OperationOutcome doFailed(Throwable thrown) { - logger.info("Sdnc Heal Restcall threw an exception", thrown); - return SdncOperator.this.setOutcome(getParams(), getOutcome(), PolicyResult.FAILURE_EXCEPTION); - } - } - - // these may be overridden by junit tests - - protected StandardCoder makeDecoder() { - return new StandardCoder(); - } -} diff --git a/models-interactions/model-actors/actor.sdnc/src/test/java/org/onap/policy/controlloop/actor/sdnc/BandwidthOnDemandOperatorTest.java b/models-interactions/model-actors/actor.sdnc/src/test/java/org/onap/policy/controlloop/actor/sdnc/BandwidthOnDemandOperatorTest.java index 02931a4f1..0623df2f5 100644 --- a/models-interactions/model-actors/actor.sdnc/src/test/java/org/onap/policy/controlloop/actor/sdnc/BandwidthOnDemandOperatorTest.java +++ b/models-interactions/model-actors/actor.sdnc/src/test/java/org/onap/policy/controlloop/actor/sdnc/BandwidthOnDemandOperatorTest.java @@ -26,45 +26,51 @@ import static org.junit.Assert.assertNotNull; import java.util.Map; import org.junit.Before; import org.junit.Test; -import org.onap.policy.common.utils.coder.CoderException; import org.onap.policy.sdnc.SdncRequest; -public class BandwidthOnDemandOperatorTest extends BasicOperator { +public class BandwidthOnDemandOperatorTest extends BasicSdncOperator { - private BandwidthOnDemandOperator oper; + private BandwidthOnDemandOperation oper; + public BandwidthOnDemandOperatorTest() { + super(DEFAULT_ACTOR, BandwidthOnDemandOperation.NAME); + } /** * Set up. */ @Before - public void setUp() { - makeContext(); - oper = new BandwidthOnDemandOperator(ACTOR); + public void setUp() throws Exception { + super.setUp(); + oper = new BandwidthOnDemandOperation(params, operator); } @Test public void testBandwidthOnDemandOperator() { - assertEquals(ACTOR, oper.getActorName()); - assertEquals(BandwidthOnDemandOperator.NAME, oper.getName()); + assertEquals(DEFAULT_ACTOR, oper.getActorName()); + assertEquals(BandwidthOnDemandOperation.NAME, oper.getName()); } @Test - public void testConstructRequest() throws CoderException { - SdncRequest request = oper.constructRequest(context); + public void testMakeRequest() throws Exception { + SdncRequest request = oper.makeRequest(1); assertEquals("my-service", request.getNsInstanceId()); assertEquals(REQ_ID, request.getRequestId()); - assertEquals(BandwidthOnDemandOperator.URI, request.getUrl()); + assertEquals(BandwidthOnDemandOperation.URI, request.getUrl()); assertNotNull(request.getHealRequest().getRequestHeaderInfo().getSvcRequestId()); verifyRequest("bod.json", request); - verifyMissing(oper, BandwidthOnDemandOperator.SERVICE_ID_KEY, "service"); + verifyMissing(BandwidthOnDemandOperation.SERVICE_ID_KEY, "service", BandwidthOnDemandOperation::new); + + // perform the operation + makeContext(); + verifyRequest("bod.json", verifyOperation(oper)); } @Override protected Map makeEnrichment() { - return Map.of(BandwidthOnDemandOperator.SERVICE_ID_KEY, "my-service", BandwidthOnDemandOperator.VNF_ID, + return Map.of(BandwidthOnDemandOperation.SERVICE_ID_KEY, "my-service", BandwidthOnDemandOperation.VNF_ID, "my-vnf"); } } diff --git a/models-interactions/model-actors/actor.sdnc/src/test/java/org/onap/policy/controlloop/actor/sdnc/BasicOperator.java b/models-interactions/model-actors/actor.sdnc/src/test/java/org/onap/policy/controlloop/actor/sdnc/BasicOperator.java deleted file mode 100644 index b9028d462..000000000 --- a/models-interactions/model-actors/actor.sdnc/src/test/java/org/onap/policy/controlloop/actor/sdnc/BasicOperator.java +++ /dev/null @@ -1,94 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP - * ================================================================================ - * Copyright (C) 2020 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END========================================================= - */ - -package org.onap.policy.controlloop.actor.sdnc; - -import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException; -import static org.junit.Assert.assertEquals; - -import java.util.Map; -import java.util.TreeMap; -import java.util.UUID; -import org.onap.policy.common.utils.coder.CoderException; -import org.onap.policy.common.utils.coder.StandardCoder; -import org.onap.policy.common.utils.resources.ResourceUtils; -import org.onap.policy.controlloop.VirtualControlLoopEvent; -import org.onap.policy.controlloop.actorserviceprovider.controlloop.ControlLoopEventContext; - -/** - * Superclass for various operator tests. - */ -public abstract class BasicOperator { - protected static final UUID REQ_ID = UUID.randomUUID(); - protected static final String ACTOR = "my-actor"; - - protected Map enrichment; - protected VirtualControlLoopEvent event; - protected ControlLoopEventContext context; - - /** - * Pretty-prints a request and verifies that the result matches the expected JSON. - * - * @param request type - * @param expectedJsonFile name of the file containing the expected JSON - * @param request request to verify - * @throws CoderException if the request cannot be pretty-printed - */ - protected void verifyRequest(String expectedJsonFile, T request) throws CoderException { - String json = new StandardCoder().encode(request, true); - String expected = ResourceUtils.getResourceAsString(expectedJsonFile); - - // strip request id, because it changes each time - final String stripper = "svc-request-id[^,]*"; - json = json.replaceFirst(stripper, "").trim(); - expected = expected.replaceFirst(stripper, "").trim(); - - assertEquals(expected, json); - } - - /** - * Verifies that an exception is thrown if a field is missing from the enrichment - * data. - * - * @param oper operator to construct the request - * @param fieldName name of the field to be removed from the enrichment data - * @param expectedText text expected in the exception message - */ - protected void verifyMissing(SdncOperator oper, String fieldName, String expectedText) { - makeContext(); - enrichment.remove(fieldName); - - assertThatIllegalArgumentException().isThrownBy(() -> oper.constructRequest(context)) - .withMessageContaining("missing").withMessageContaining(expectedText); - } - - protected void makeContext() { - // need a mutable map, so make a copy - enrichment = new TreeMap<>(makeEnrichment()); - - event = new VirtualControlLoopEvent(); - event.setRequestId(REQ_ID); - event.setAai(enrichment); - - context = new ControlLoopEventContext(event); - } - - protected abstract Map makeEnrichment(); -} diff --git a/models-interactions/model-actors/actor.sdnc/src/test/java/org/onap/policy/controlloop/actor/sdnc/BasicSdncOperator.java b/models-interactions/model-actors/actor.sdnc/src/test/java/org/onap/policy/controlloop/actor/sdnc/BasicSdncOperator.java new file mode 100644 index 000000000..d8c707cc3 --- /dev/null +++ b/models-interactions/model-actors/actor.sdnc/src/test/java/org/onap/policy/controlloop/actor/sdnc/BasicSdncOperator.java @@ -0,0 +1,148 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP + * ================================================================================ + * Copyright (C) 2020 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.onap.policy.controlloop.actor.sdnc; + +import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import java.util.Map; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; +import java.util.function.BiFunction; +import org.onap.policy.common.utils.coder.CoderException; +import org.onap.policy.common.utils.coder.StandardCoder; +import org.onap.policy.common.utils.resources.ResourceUtils; +import org.onap.policy.controlloop.actor.test.BasicHttpOperation; +import org.onap.policy.controlloop.actorserviceprovider.OperationOutcome; +import org.onap.policy.controlloop.actorserviceprovider.impl.HttpOperator; +import org.onap.policy.controlloop.actorserviceprovider.parameters.ControlLoopOperationParams; +import org.onap.policy.controlloop.policy.PolicyResult; +import org.onap.policy.sdnc.SdncRequest; +import org.onap.policy.sdnc.SdncResponse; +import org.onap.policy.sdnc.SdncResponseOutput; +import org.powermock.reflect.Whitebox; + +/** + * Superclass for various operator tests. + */ +public abstract class BasicSdncOperator extends BasicHttpOperation { + + protected SdncResponse response; + + /** + * Constructs the object using a default actor and operation name. + */ + public BasicSdncOperator() { + super(); + } + + /** + * Constructs the object. + * + * @param actor actor name + * @param operation operation name + */ + public BasicSdncOperator(String actor, String operation) { + super(actor, operation); + } + + /** + * Initializes mocks and sets up. + */ + public void setUp() throws Exception { + super.setUp(); + + response = new SdncResponse(); + + SdncResponseOutput output = new SdncResponseOutput(); + response.setResponseOutput(output); + output.setResponseCode("200"); + + when(rawResponse.readEntity(String.class)).thenReturn(new StandardCoder().encode(response)); + } + + /** + * Runs the operation and verifies that the response is successful. + * + * @param operation operation to run + * @return the request that was posted + */ + protected SdncRequest verifyOperation(SdncOperation operation) + throws InterruptedException, ExecutionException, TimeoutException { + + CompletableFuture future2 = operation.startOperationAsync(1, outcome); + assertFalse(future2.isDone()); + + verify(client).post(callbackCaptor.capture(), any(), requestCaptor.capture(), any()); + callbackCaptor.getValue().completed(rawResponse); + + assertEquals(PolicyResult.SUCCESS, future2.get(5, TimeUnit.SECONDS).getResult()); + + return requestCaptor.getValue().getEntity(); + } + + /** + * Pretty-prints a request and verifies that the result matches the expected JSON. + * + * @param request type + * @param expectedJsonFile name of the file containing the expected JSON + * @param request request to verify + * @throws CoderException if the request cannot be pretty-printed + */ + protected void verifyRequest(String expectedJsonFile, T request) throws CoderException { + String json = new StandardCoder().encode(request, true); + String expected = ResourceUtils.getResourceAsString(expectedJsonFile); + + // strip request id, because it changes each time + final String stripper = "svc-request-id[^,]*"; + json = json.replaceFirst(stripper, "").trim(); + expected = expected.replaceFirst(stripper, "").trim(); + + assertEquals(expected, json); + } + + /** + * Verifies that an exception is thrown if a field is missing from the enrichment + * data. + * + * @param fieldName name of the field to be removed from the enrichment data + * @param expectedText text expected in the exception message + */ + protected void verifyMissing(String fieldName, String expectedText, + BiFunction maker) { + + makeContext(); + enrichment.remove(fieldName); + + SdncOperation oper = maker.apply(params, operator); + + assertThatIllegalArgumentException().isThrownBy(() -> Whitebox.invokeMethod(oper, "makeRequest", 1)) + .withMessageContaining("missing").withMessageContaining(expectedText); + } + + protected abstract Map makeEnrichment(); +} diff --git a/models-interactions/model-actors/actor.sdnc/src/test/java/org/onap/policy/controlloop/actor/sdnc/RerouteOperatorTest.java b/models-interactions/model-actors/actor.sdnc/src/test/java/org/onap/policy/controlloop/actor/sdnc/RerouteOperatorTest.java index 0a7bcad6f..7fc5ee7c2 100644 --- a/models-interactions/model-actors/actor.sdnc/src/test/java/org/onap/policy/controlloop/actor/sdnc/RerouteOperatorTest.java +++ b/models-interactions/model-actors/actor.sdnc/src/test/java/org/onap/policy/controlloop/actor/sdnc/RerouteOperatorTest.java @@ -26,45 +26,51 @@ import static org.junit.Assert.assertNotNull; import java.util.Map; import org.junit.Before; import org.junit.Test; -import org.onap.policy.common.utils.coder.CoderException; import org.onap.policy.sdnc.SdncRequest; -public class RerouteOperatorTest extends BasicOperator { +public class RerouteOperatorTest extends BasicSdncOperator { - private RerouteOperator oper; + private RerouteOperation oper; + public RerouteOperatorTest() { + super(DEFAULT_ACTOR, RerouteOperation.NAME); + } /** * Set up. */ @Before - public void setUp() { - makeContext(); - oper = new RerouteOperator(ACTOR); + public void setUp() throws Exception { + super.setUp(); + oper = new RerouteOperation(params, operator); } @Test public void testRerouteOperator() { - assertEquals(ACTOR, oper.getActorName()); - assertEquals(RerouteOperator.NAME, oper.getName()); + assertEquals(DEFAULT_ACTOR, oper.getActorName()); + assertEquals(RerouteOperation.NAME, oper.getName()); } @Test - public void testConstructRequest() throws CoderException { - SdncRequest request = oper.constructRequest(context); + public void testMakeRequest() throws Exception { + SdncRequest request = oper.makeRequest(1); assertEquals("my-service", request.getNsInstanceId()); assertEquals(REQ_ID, request.getRequestId()); - assertEquals(RerouteOperator.URI, request.getUrl()); + assertEquals(RerouteOperation.URI, request.getUrl()); assertNotNull(request.getHealRequest().getRequestHeaderInfo().getSvcRequestId()); verifyRequest("reroute.json", request); - verifyMissing(oper, RerouteOperator.SERVICE_ID_KEY, "service"); - verifyMissing(oper, RerouteOperator.NETWORK_ID_KEY, "network"); + verifyMissing(RerouteOperation.SERVICE_ID_KEY, "service", RerouteOperation::new); + verifyMissing(RerouteOperation.NETWORK_ID_KEY, "network", RerouteOperation::new); + + // perform the operation + makeContext(); + verifyRequest("reroute.json", verifyOperation(oper)); } @Override protected Map makeEnrichment() { - return Map.of(RerouteOperator.SERVICE_ID_KEY, "my-service", RerouteOperator.NETWORK_ID_KEY, "my-network"); + return Map.of(RerouteOperation.SERVICE_ID_KEY, "my-service", RerouteOperation.NETWORK_ID_KEY, "my-network"); } } diff --git a/models-interactions/model-actors/actor.sdnc/src/test/java/org/onap/policy/controlloop/actor/sdnc/SdncActorServiceProviderTest.java b/models-interactions/model-actors/actor.sdnc/src/test/java/org/onap/policy/controlloop/actor/sdnc/SdncActorServiceProviderTest.java index 08655c349..ac81d49c9 100644 --- a/models-interactions/model-actors/actor.sdnc/src/test/java/org/onap/policy/controlloop/actor/sdnc/SdncActorServiceProviderTest.java +++ b/models-interactions/model-actors/actor.sdnc/src/test/java/org/onap/policy/controlloop/actor/sdnc/SdncActorServiceProviderTest.java @@ -41,7 +41,7 @@ import org.onap.policy.sdnc.SdncRequest; public class SdncActorServiceProviderTest { - private static final String REROUTE = RerouteOperator.NAME; + private static final String REROUTE = RerouteOperation.NAME; /** * Set up before test class. @@ -63,7 +63,7 @@ public class SdncActorServiceProviderTest { final SdncActorServiceProvider prov = new SdncActorServiceProvider(); // verify that it has the operators we expect - var expected = Arrays.asList(BandwidthOnDemandOperator.NAME, RerouteOperator.NAME).stream().sorted() + var expected = Arrays.asList(BandwidthOnDemandOperation.NAME, RerouteOperation.NAME).stream().sorted() .collect(Collectors.toList()); var actual = prov.getOperationNames().stream().sorted().collect(Collectors.toList()); diff --git a/models-interactions/model-actors/actor.sdnc/src/test/java/org/onap/policy/controlloop/actor/sdnc/SdncOperatorTest.java b/models-interactions/model-actors/actor.sdnc/src/test/java/org/onap/policy/controlloop/actor/sdnc/SdncOperatorTest.java index 25d383eb8..4bc514c08 100644 --- a/models-interactions/model-actors/actor.sdnc/src/test/java/org/onap/policy/controlloop/actor/sdnc/SdncOperatorTest.java +++ b/models-interactions/model-actors/actor.sdnc/src/test/java/org/onap/policy/controlloop/actor/sdnc/SdncOperatorTest.java @@ -21,306 +21,67 @@ package org.onap.policy.controlloop.actor.sdnc; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; import java.util.Map; -import java.util.Properties; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.TimeoutException; -import javax.ws.rs.Consumes; -import javax.ws.rs.POST; -import javax.ws.rs.Path; -import javax.ws.rs.Produces; -import javax.ws.rs.core.Response; -import javax.ws.rs.core.Response.Status; -import lombok.Setter; -import org.junit.After; -import org.junit.AfterClass; +import java.util.TreeMap; import org.junit.Before; -import org.junit.BeforeClass; import org.junit.Test; -import org.onap.policy.common.endpoints.event.comm.bus.internal.BusTopicParams; -import org.onap.policy.common.endpoints.event.comm.bus.internal.BusTopicParams.TopicParamsBuilder; -import org.onap.policy.common.endpoints.http.client.HttpClient; -import org.onap.policy.common.endpoints.http.client.HttpClientFactoryInstance; -import org.onap.policy.common.endpoints.http.server.HttpServletServer; -import org.onap.policy.common.endpoints.http.server.HttpServletServerFactoryInstance; -import org.onap.policy.common.endpoints.properties.PolicyEndPointProperties; -import org.onap.policy.common.gson.GsonMessageBodyHandler; -import org.onap.policy.common.utils.coder.CoderException; -import org.onap.policy.common.utils.coder.StandardCoder; -import org.onap.policy.common.utils.network.NetworkUtil; -import org.onap.policy.controlloop.VirtualControlLoopEvent; -import org.onap.policy.controlloop.actorserviceprovider.OperationOutcome; -import org.onap.policy.controlloop.actorserviceprovider.Util; -import org.onap.policy.controlloop.actorserviceprovider.controlloop.ControlLoopEventContext; -import org.onap.policy.controlloop.actorserviceprovider.parameters.ControlLoopOperationParams; -import org.onap.policy.controlloop.actorserviceprovider.parameters.HttpParams; -import org.onap.policy.controlloop.policy.PolicyResult; -import org.onap.policy.sdnc.SdncHealRequest; import org.onap.policy.sdnc.SdncRequest; -import org.onap.policy.sdnc.SdncResponse; -import org.onap.policy.sdnc.SdncResponseOutput; -public class SdncOperatorTest { - public static final String MEDIA_TYPE_APPLICATION_JSON = "application/json"; - private static final String EXPECTED_EXCEPTION = "expected exception"; - public static final String HTTP_CLIENT = "my-http-client"; - public static final String HTTP_NO_SERVER = "my-http-no-server-client"; - private static final String ACTOR = "my-actor"; - private static final String OPERATION = "my-operation"; - - /** - * Outcome to be added to the response. - */ - @Setter - private static SdncResponseOutput output; +public class SdncOperatorTest extends BasicSdncOperator { - - private VirtualControlLoopEvent event; - private ControlLoopEventContext context; - private MyOper oper; + private SdncRequest request; + private SdncOperation oper; /** - * Starts the SDNC simulator. - */ - @BeforeClass - public static void setUpBeforeClass() throws Exception { - // allocate a port - int port = NetworkUtil.allocPort(); - - /* - * Start the simulator. Must use "Properties" to configure it, otherwise the - * server will use the wrong serialization provider. - */ - Properties svrprops = getServerProperties("my-server", port); - HttpServletServerFactoryInstance.getServerFactory().build(svrprops).forEach(HttpServletServer::start); - - /* - * Start the clients, one to the server, and one to a non-existent server. - */ - TopicParamsBuilder builder = BusTopicParams.builder().managed(true).hostname("localhost").basePath("sdnc") - .serializationProvider(GsonMessageBodyHandler.class.getName()); - - HttpClientFactoryInstance.getClientFactory().build(builder.clientName(HTTP_CLIENT).port(port).build()); - - HttpClientFactoryInstance.getClientFactory() - .build(builder.clientName(HTTP_NO_SERVER).port(NetworkUtil.allocPort()).build()); - } - - @AfterClass - public static void tearDownAfterClass() { - HttpClientFactoryInstance.getClientFactory().destroy(); - HttpServletServerFactoryInstance.getServerFactory().destroy(); - } - - /** - * Initializes {@link #oper} and sets {@link #output} to a success code. + * Sets up. */ @Before - public void setUp() { - event = new VirtualControlLoopEvent(); - context = new ControlLoopEventContext(event); - - initOper(HTTP_CLIENT); + public void setUp() throws Exception { + super.setUp(); - output = new SdncResponseOutput(); - output.setResponseCode("200"); - } - - @After - public void tearDown() { - oper.shutdown(); + oper = new SdncOperation(params, operator) { + @Override + protected SdncRequest makeRequest(int attempt) { + return request; + } + }; } @Test public void testSdncOperator() { - assertEquals(ACTOR, oper.getActorName()); - assertEquals(OPERATION, oper.getName()); - assertEquals(ACTOR + "." + OPERATION, oper.getFullName()); - } - - @Test - public void testGetClient() { - assertNotNull(oper.getTheClient()); - } - - @Test - public void testStartOperationAsync_testPostRequest() throws Exception { - OperationOutcome outcome = runOperation(); - assertNotNull(outcome); - assertEquals(PolicyResult.SUCCESS, outcome.getResult()); - } - - /** - * Tests postRequest() when decode() throws an exception. - */ - @Test - public void testPostRequestDecodeException() throws Exception { - - oper.setDecodeFailure(true); - - OperationOutcome outcome = runOperation(); - assertNotNull(outcome); - assertEquals(PolicyResult.FAILURE_EXCEPTION, outcome.getResult()); - } - - /** - * Tests postRequest() when there is no "output" field in the response. - */ - @Test - public void testPostRequestNoOutput() throws Exception { - - setOutput(null); - - OperationOutcome outcome = runOperation(); - assertNotNull(outcome); - assertEquals(PolicyResult.FAILURE, outcome.getResult()); + assertEquals(DEFAULT_ACTOR, oper.getActorName()); + assertEquals(DEFAULT_OPERATION, oper.getName()); } - /** - * Tests postRequest() when the output is not a success. - */ @Test - public void testPostRequestOutputFailure() throws Exception { - - output.setResponseCode(null); - - OperationOutcome outcome = runOperation(); - assertNotNull(outcome); - assertEquals(PolicyResult.FAILURE, outcome.getResult()); + public void testStartOperationAsync_testStartRequestAsync() throws Exception { + verifyOperation(oper); } - /** - * Tests postRequest() when the post() request throws an exception retrieving the - * response. - */ @Test - public void testPostRequestException() throws Exception { - - // reset "oper" to point to a non-existent server - oper.shutdown(); - initOper(HTTP_NO_SERVER); - - OperationOutcome outcome = runOperation(); - assertNotNull(outcome); - assertEquals(PolicyResult.FAILURE_EXCEPTION, outcome.getResult()); - } - - private static Properties getServerProperties(String name, int port) { - final Properties props = new Properties(); - props.setProperty(PolicyEndPointProperties.PROPERTY_HTTP_SERVER_SERVICES, name); - - final String svcpfx = PolicyEndPointProperties.PROPERTY_HTTP_SERVER_SERVICES + "." + name; - - props.setProperty(svcpfx + PolicyEndPointProperties.PROPERTY_HTTP_REST_CLASSES_SUFFIX, Server.class.getName()); - props.setProperty(svcpfx + PolicyEndPointProperties.PROPERTY_HTTP_HOST_SUFFIX, "localhost"); - props.setProperty(svcpfx + PolicyEndPointProperties.PROPERTY_HTTP_PORT_SUFFIX, String.valueOf(port)); - props.setProperty(svcpfx + PolicyEndPointProperties.PROPERTY_MANAGED_SUFFIX, "true"); - props.setProperty(svcpfx + PolicyEndPointProperties.PROPERTY_HTTP_SWAGGER_SUFFIX, "false"); - - props.setProperty(svcpfx + PolicyEndPointProperties.PROPERTY_HTTP_SERIALIZATION_PROVIDER, - GsonMessageBodyHandler.class.getName()); - return props; - } - - /** - * Initializes {@link #oper}. - * - * @param clientName name of the client which it should use - */ - private void initOper(String clientName) { - oper = new MyOper(); - - HttpParams params = HttpParams.builder().clientName(clientName).path("request").build(); - Map mapParams = Util.translateToMap(OPERATION, params); - oper.configure(mapParams); - oper.start(); - } + public void testIsSuccess() { + // success case + response.getResponseOutput().setResponseCode("200"); + assertTrue(oper.isSuccess(null, response)); - /** - * Runs the operation. - * - * @return the outcome of the operation, or {@code null} if it does not complete in - * time - */ - private OperationOutcome runOperation() throws InterruptedException, ExecutionException, TimeoutException { - ControlLoopOperationParams params = - ControlLoopOperationParams.builder().actor(ACTOR).operation(OPERATION).context(context).build(); + // failure code + response.getResponseOutput().setResponseCode("555"); + assertFalse(oper.isSuccess(null, response)); - CompletableFuture future = oper.startOperationAsync(params, 1, params.makeOutcome()); + // null code + response.getResponseOutput().setResponseCode(null); + assertFalse(oper.isSuccess(null, response)); - return future.get(5, TimeUnit.SECONDS); + // null output + response.setResponseOutput(null); + assertFalse(oper.isSuccess(null, response)); } - - private class MyOper extends SdncOperator { - - /** - * Set to {@code true} to cause the decoder to throw an exception. - */ - @Setter - private boolean decodeFailure = false; - - public MyOper() { - super(ACTOR, OPERATION); - } - - protected HttpClient getTheClient() { - return getClient(); - } - - @Override - protected SdncRequest constructRequest(ControlLoopEventContext context) { - SdncRequest request = new SdncRequest(); - - SdncHealRequest heal = new SdncHealRequest(); - request.setHealRequest(heal); - - return request; - } - - @Override - protected StandardCoder makeDecoder() { - if (decodeFailure) { - // return a coder that throws exceptions when decode() is invoked - return new StandardCoder() { - @Override - public T decode(String json, Class clazz) throws CoderException { - throw new CoderException(EXPECTED_EXCEPTION); - } - }; - - } else { - return super.makeDecoder(); - } - } - } - - /** - * SDNC Simulator. - */ - @Path("/sdnc") - @Produces(MEDIA_TYPE_APPLICATION_JSON) - public static class Server { - - /** - * Generates a response. - * - * @param request incoming request - * @return resulting response - */ - @POST - @Path("/request") - @Consumes(value = {MEDIA_TYPE_APPLICATION_JSON}) - public Response postRequest(SdncRequest request) { - - SdncResponse response = new SdncResponse(); - response.setResponseOutput(output); - - return Response.status(Status.OK).entity(response).build(); - } + @Override + protected Map makeEnrichment() { + return new TreeMap<>(); } } -- cgit 1.2.3-korg