diff options
author | Jim Hahn <jrh3@att.com> | 2020-03-05 16:41:15 -0500 |
---|---|---|
committer | Jim Hahn <jrh3@att.com> | 2020-03-05 23:06:01 -0500 |
commit | aedb286b0683e9ac24c5160e9d47f596a243697f (patch) | |
tree | 39359f801252f24521a55a2057a1fec8b39c2434 /models-interactions/model-actors/actor.appclcm/src/main | |
parent | 2358a161a4bbd0f0c97696b61fd725c33f7267e6 (diff) |
Add other APPC-LCM operations
Also added legacy ModifyConfig as an operation within APPC-LCM.
Added logging to topic registration keys.
Issue-ID: POLICY-2403
Signed-off-by: Jim Hahn <jrh3@att.com>
Change-Id: Ia54a573fd6218a8afe870184b9a3baebc05b766a
Diffstat (limited to 'models-interactions/model-actors/actor.appclcm/src/main')
4 files changed, 148 insertions, 125 deletions
diff --git a/models-interactions/model-actors/actor.appclcm/src/main/java/org/onap/policy/controlloop/actor/appclcm/AppcLcmActorServiceProvider.java b/models-interactions/model-actors/actor.appclcm/src/main/java/org/onap/policy/controlloop/actor/appclcm/AppcLcmActorServiceProvider.java index 1d04cb5f2..704c44da7 100644 --- a/models-interactions/model-actors/actor.appclcm/src/main/java/org/onap/policy/controlloop/actor/appclcm/AppcLcmActorServiceProvider.java +++ b/models-interactions/model-actors/actor.appclcm/src/main/java/org/onap/policy/controlloop/actor/appclcm/AppcLcmActorServiceProvider.java @@ -1,11 +1,10 @@ /*- * ============LICENSE_START======================================================= - * AppcLcmActorServiceProvider + * ONAP * ================================================================================ * Copyright (C) 2017-2020 AT&T Intellectual Property. All rights reserved. * Modifications copyright (c) 2018 Nokia * Modifications Copyright (C) 2019 Nordix Foundation. - * Modifications 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. @@ -31,6 +30,7 @@ import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; import org.onap.policy.appclcm.AppcLcmBody; import org.onap.policy.appclcm.AppcLcmCommonHeader; import org.onap.policy.appclcm.AppcLcmDmaapWrapper; @@ -39,6 +39,8 @@ import org.onap.policy.appclcm.AppcLcmOutput; import org.onap.policy.appclcm.AppcLcmResponseCode; import org.onap.policy.controlloop.ControlLoopOperation; import org.onap.policy.controlloop.VirtualControlLoopEvent; +import org.onap.policy.controlloop.actor.appc.AppcOperation; +import org.onap.policy.controlloop.actor.appc.ModifyConfigOperation; import org.onap.policy.controlloop.actorserviceprovider.impl.BidirectionalTopicActor; import org.onap.policy.controlloop.actorserviceprovider.impl.BidirectionalTopicOperator; import org.onap.policy.controlloop.actorserviceprovider.parameters.BidirectionalTopicActorParams; @@ -67,17 +69,16 @@ public class AppcLcmActorServiceProvider extends BidirectionalTopicActor<Bidirec private static final String TARGET_VNF = "VNF"; // Strings for recipes - private static final String RECIPE_RESTART = "Restart"; - private static final String RECIPE_REBUILD = "Rebuild"; - private static final String RECIPE_MIGRATE = "Migrate"; - private static final String RECIPE_MODIFY = "ConfigModify"; + private static final String RECIPE_RESTART = AppcLcmConstants.OPERATION_RESTART; + private static final String RECIPE_REBUILD = AppcLcmConstants.OPERATION_REBUILD; + private static final String RECIPE_MIGRATE = AppcLcmConstants.OPERATION_MIGRATE; + private static final String RECIPE_MODIFY = AppcLcmConstants.OPERATION_CONFIG_MODIFY; /* To be used in future releases when LCM ConfigModify is used */ private static final String APPC_REQUEST_PARAMS = "request-parameters"; private static final String APPC_CONFIG_PARAMS = "configuration-parameters"; - private static final ImmutableList<String> recipes = - ImmutableList.of(RECIPE_RESTART, RECIPE_REBUILD, RECIPE_MIGRATE, RECIPE_MODIFY); + private static final Set<String> recipes = AppcLcmConstants.OPERATION_NAMES; private static final ImmutableMap<String, List<String>> targets = new ImmutableMap.Builder<String, List<String>>() .put(RECIPE_RESTART, ImmutableList.of(TARGET_VM)).put(RECIPE_REBUILD, ImmutableList.of(TARGET_VM)) .put(RECIPE_MIGRATE, ImmutableList.of(TARGET_VM)).put(RECIPE_MODIFY, ImmutableList.of(TARGET_VNF)).build(); @@ -91,8 +92,15 @@ public class AppcLcmActorServiceProvider extends BidirectionalTopicActor<Bidirec public AppcLcmActorServiceProvider() { super(NAME, BidirectionalTopicActorParams.class); - addOperator(new BidirectionalTopicOperator(NAME, ConfigModifyOperation.NAME, this, - AppcLcmOperation.SELECTOR_KEYS, ConfigModifyOperation::new)); + // add LCM operations first as they take precedence + for (String opname : AppcLcmConstants.OPERATION_NAMES) { + addOperator(new BidirectionalTopicOperator(NAME, opname, this, AppcLcmOperation.SELECTOR_KEYS, + AppcLcmOperation::new)); + } + + // add legacy operations + addOperator(new BidirectionalTopicOperator(NAME, ModifyConfigOperation.NAME, this, AppcOperation.SELECTOR_KEYS, + ModifyConfigOperation::new)); } /** diff --git a/models-interactions/model-actors/actor.appclcm/src/main/java/org/onap/policy/controlloop/actor/appclcm/AppcLcmConstants.java b/models-interactions/model-actors/actor.appclcm/src/main/java/org/onap/policy/controlloop/actor/appclcm/AppcLcmConstants.java new file mode 100644 index 000000000..efcbe492f --- /dev/null +++ b/models-interactions/model-actors/actor.appclcm/src/main/java/org/onap/policy/controlloop/actor/appclcm/AppcLcmConstants.java @@ -0,0 +1,59 @@ +/*- + * ============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.appclcm; + +import java.util.Collections; +import java.util.HashSet; +import java.util.Set; +import java.util.stream.Collectors; + +public class AppcLcmConstants { + + // Strings for OPERATIONs + public static final String OPERATION_RESTART = "Restart"; + public static final String OPERATION_REBUILD = "Rebuild"; + public static final String OPERATION_MIGRATE = "Migrate"; + public static final String OPERATION_CONFIG_MODIFY = "ConfigModify"; + + public static final Set<String> OPERATION_NAMES = + Set.of(OPERATION_RESTART, OPERATION_REBUILD, OPERATION_MIGRATE, OPERATION_CONFIG_MODIFY); + + // operations from legacy APPC + public static final String LEGACY_MODIFY_CONFIG = "ModifyConfig"; + + public static final Set<String> LEGACY_NAMES = + Set.of(LEGACY_MODIFY_CONFIG); + + public static final Set<String> COMBINED_OPERATION_NAMES; + + static { + Set<String> set = new HashSet<>(OPERATION_NAMES); + set.addAll(LEGACY_NAMES); + COMBINED_OPERATION_NAMES = Collections.unmodifiableSet(set); + } + + protected static final Set<String> SUPPORTS_PAYLOAD = + Set.of(OPERATION_CONFIG_MODIFY).stream().map(String::toLowerCase).collect(Collectors.toSet()); + + private AppcLcmConstants() { + // do nothing + } +} diff --git a/models-interactions/model-actors/actor.appclcm/src/main/java/org/onap/policy/controlloop/actor/appclcm/AppcLcmOperation.java b/models-interactions/model-actors/actor.appclcm/src/main/java/org/onap/policy/controlloop/actor/appclcm/AppcLcmOperation.java index c0b83319c..749622714 100644 --- a/models-interactions/model-actors/actor.appclcm/src/main/java/org/onap/policy/controlloop/actor/appclcm/AppcLcmOperation.java +++ b/models-interactions/model-actors/actor.appclcm/src/main/java/org/onap/policy/controlloop/actor/appclcm/AppcLcmOperation.java @@ -1,6 +1,6 @@ /*- * ============LICENSE_START======================================================= - * AppcLcmOperation + * ONAP * ================================================================================ * Copyright (C) 2020 AT&T Intellectual Property. All rights reserved. * ================================================================================ @@ -24,16 +24,15 @@ import java.util.List; import java.util.Map; import java.util.UUID; import java.util.concurrent.CompletableFuture; -import org.onap.aai.domain.yang.GenericVnf; -import org.onap.policy.aai.AaiConstants; -import org.onap.policy.aai.AaiCqResponse; +import org.apache.commons.lang3.StringUtils; import org.onap.policy.appclcm.AppcLcmBody; import org.onap.policy.appclcm.AppcLcmCommonHeader; import org.onap.policy.appclcm.AppcLcmDmaapWrapper; import org.onap.policy.appclcm.AppcLcmInput; +import org.onap.policy.appclcm.AppcLcmOutput; import org.onap.policy.appclcm.AppcLcmResponseCode; +import org.onap.policy.appclcm.AppcLcmResponseStatus; import org.onap.policy.common.utils.coder.CoderException; -import org.onap.policy.common.utils.coder.StandardCoder; import org.onap.policy.controlloop.VirtualControlLoopEvent; import org.onap.policy.controlloop.actorserviceprovider.OperationOutcome; import org.onap.policy.controlloop.actorserviceprovider.impl.BidirectionalTopicOperation; @@ -41,23 +40,21 @@ import org.onap.policy.controlloop.actorserviceprovider.parameters.Bidirectional import org.onap.policy.controlloop.actorserviceprovider.parameters.ControlLoopOperationParams; import org.onap.policy.controlloop.actorserviceprovider.topic.SelectorKey; import org.onap.policy.controlloop.policy.PolicyResult; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -public abstract class AppcLcmOperation extends BidirectionalTopicOperation<AppcLcmDmaapWrapper, AppcLcmDmaapWrapper> { +public class AppcLcmOperation extends BidirectionalTopicOperation<AppcLcmDmaapWrapper, AppcLcmDmaapWrapper> { - private static final Logger logger = LoggerFactory.getLogger(AppcLcmOperation.class); - private static final StandardCoder coder = new StandardCoder(); + private static final String MISSING_STATUS = "APPC-LCM response is missing the response status"; public static final String VNF_ID_KEY = "vnf-id"; /** * Keys used to match the response with the request listener. The sub request ID is a * UUID, so it can be used to uniquely identify the response. * <p/> - * Note: if these change, then {@link #getExpectedKeyValues(int, Request)} must be - * updated accordingly. + * Note: if these change, then {@link #getExpectedKeyValues(int, AppcLcmDmaapWrapper)} + * must be updated accordingly. */ - public static final List<SelectorKey> SELECTOR_KEYS = List.of(new SelectorKey("common-header", "sub-request-id")); + public static final List<SelectorKey> SELECTOR_KEYS = + List.of(new SelectorKey("body", "output", "common-header", "sub-request-id")); /** * Constructs the object. @@ -67,6 +64,10 @@ public abstract class AppcLcmOperation extends BidirectionalTopicOperation<AppcL */ public AppcLcmOperation(ControlLoopOperationParams params, BidirectionalTopicConfig config) { super(params, config, AppcLcmDmaapWrapper.class); + + if (StringUtils.isBlank(params.getTargetEntity())) { + throw new IllegalArgumentException("missing targetEntity"); + } } /** @@ -74,40 +75,12 @@ public abstract class AppcLcmOperation extends BidirectionalTopicOperation<AppcL * Starts the GUARD using startGuardAsync. */ @Override - @SuppressWarnings("unchecked") protected CompletableFuture<OperationOutcome> startPreprocessorAsync() { - if (params != null) { - ControlLoopOperationParams cqParams = params.toBuilder().actor(AaiConstants.ACTOR_NAME) - .operation(AaiCqResponse.OPERATION).payload(null).retry(null).timeoutSec(null).build(); - - // run Custom Query and Guard, in parallel - return allOf(() -> params.getContext().obtain(AaiCqResponse.CONTEXT_KEY, cqParams), this::startGuardAsync); - } return startGuardAsync(); } @Override protected AppcLcmDmaapWrapper makeRequest(int attempt) { - AaiCqResponse cq = params.getContext().getProperty(AaiCqResponse.CONTEXT_KEY); - - GenericVnf genvnf = cq.getGenericVnfByModelInvariantId(params.getTarget().getResourceID()); - if (genvnf == null) { - logger.info("{}: target entity could not be found for {}", getFullName(), params.getRequestId()); - throw new IllegalArgumentException("target vnf-id could not be found"); - } - - return makeRequest(attempt, genvnf.getVnfId()); - } - - /** - * Makes a request, given the target VNF. This is a support function for - * {@link #makeRequest(int)}. - * - * @param attempt attempt number - * @param targetVnf target VNF - * @return a new request - */ - protected AppcLcmDmaapWrapper makeRequest(int attempt, String targetVnf) { VirtualControlLoopEvent onset = params.getContext().getEvent(); String subRequestId = UUID.randomUUID().toString(); @@ -118,22 +91,21 @@ public abstract class AppcLcmOperation extends BidirectionalTopicOperation<AppcL AppcLcmInput inputRequest = new AppcLcmInput(); inputRequest.setCommonHeader(header); - inputRequest.setAction(getName()); + + AppcLcmRecipeFormatter recipeFormatter = new AppcLcmRecipeFormatter(getName()); + inputRequest.setAction(recipeFormatter.getBodyRecipe()); /* - * Action Identifiers are required for APPC LCM requests. For R1, the recipes supported by - * Policy only require a vnf-id. + * Action Identifiers are required for APPC LCM requests. For R1, the recipes + * supported by Policy only require a vnf-id. */ - if (inputRequest.getActionIdentifiers() != null) { - inputRequest.getActionIdentifiers().put(VNF_ID_KEY, targetVnf); - } else { - inputRequest.setActionIdentifiers(Map.of(VNF_ID_KEY, targetVnf)); - } + inputRequest.setActionIdentifiers(Map.of(VNF_ID_KEY, params.getTargetEntity())); /* - * For R1, the payloads will not be required for the Restart, Rebuild, or Migrate recipes. - * APPC will populate the payload based on A&AI look up of the vnd-id provided in the action - * identifiers. The payload is set when converPayload() is called. + * For R1, the payloads will not be required for the Restart, Rebuild, or Migrate + * recipes. APPC will populate the payload based on A&AI look up of the vnd-id + * provided in the action identifiers. The payload is set when converPayload() is + * called. */ if (operationSupportsPayload()) { convertPayload(params.getPayload(), inputRequest); @@ -144,9 +116,6 @@ public abstract class AppcLcmOperation extends BidirectionalTopicOperation<AppcL AppcLcmBody body = new AppcLcmBody(); body.setInput(inputRequest); - AppcLcmRecipeFormatter recipeFormatter = new AppcLcmRecipeFormatter(getName()); - inputRequest.setAction(recipeFormatter.getBodyRecipe()); - AppcLcmDmaapWrapper dmaapRequest = new AppcLcmDmaapWrapper(); dmaapRequest.setBody(body); dmaapRequest.setVersion("2.0"); @@ -166,14 +135,12 @@ public abstract class AppcLcmOperation extends BidirectionalTopicOperation<AppcL * @param source source from which to get the values * @param map where to place the decoded values */ - private static void convertPayload(Map<String, Object> source, AppcLcmInput request) { - String encodedPayloadString = null; + private void convertPayload(Map<String, Object> source, AppcLcmInput request) { try { - encodedPayloadString = coder.encode(source); + String encodedPayloadString = makeCoder().encode(source); request.setPayload(encodedPayloadString); } catch (CoderException e) { - logger.error("Cannot convert payload. Error encoding source as a string.", e); - throw new IllegalArgumentException("Cannot convert payload. Error encoding source as a string."); + throw new IllegalArgumentException("Cannot convert payload", e); } } @@ -187,16 +154,14 @@ public abstract class AppcLcmOperation extends BidirectionalTopicOperation<AppcL @Override protected Status detmStatus(String rawResponse, AppcLcmDmaapWrapper response) { - if (response == null || response.getBody() == null || response.getBody().getOutput() == null - || response.getBody().getOutput().getStatus() == null) { - throw new IllegalArgumentException("APPC-LCM response is missing the response status"); + AppcLcmResponseStatus status = getStatus(response); + if (status == null) { + throw new IllegalArgumentException(MISSING_STATUS); } - String code = AppcLcmResponseCode.toResponseValue(response.getBody().getOutput().getStatus().getCode()); - + String code = AppcLcmResponseCode.toResponseValue(status.getCode()); if (code == null) { - throw new IllegalArgumentException( - "unknown APPC-LCM response status code: " + response.getBody().getOutput().getStatus().getCode()); + throw new IllegalArgumentException("unknown APPC-LCM response status code: " + status.getCode()); } switch (code) { @@ -218,18 +183,52 @@ public abstract class AppcLcmOperation extends BidirectionalTopicOperation<AppcL */ @Override public OperationOutcome setOutcome(OperationOutcome outcome, PolicyResult result, AppcLcmDmaapWrapper response) { - if (response == null || response.getBody() == null || response.getBody().getOutput() == null - || response.getBody().getOutput().getStatus() == null - || response.getBody().getOutput().getStatus().getMessage() == null) { + AppcLcmResponseStatus status = getStatus(response); + if (status == null) { + return setOutcome(outcome, result); + } + + String message = status.getMessage(); + if (message == null) { return setOutcome(outcome, result); } outcome.setResult(result); - outcome.setMessage(response.getBody().getOutput().getStatus().getMessage()); + outcome.setMessage(message); return outcome; } + /** + * Gets the status from the response. + * + * @param response the response from which to extract the status, or {@code null} + * @return the status, or {@code null} if it does not exist + */ + protected AppcLcmResponseStatus getStatus(AppcLcmDmaapWrapper response) { + if (response == null) { + return null; + } + + AppcLcmBody body = response.getBody(); + if (body == null) { + return null; + } + + AppcLcmOutput output = body.getOutput(); + if (output == null) { + return null; + } + + return output.getStatus(); + } + + /** + * Determines if the operation supports a payload. + * + * @return {@code true} if the operation supports a payload, {@code false} otherwise + */ protected boolean operationSupportsPayload() { - return params.getPayload() != null && !params.getPayload().isEmpty(); + return params.getPayload() != null && !params.getPayload().isEmpty() + && AppcLcmConstants.SUPPORTS_PAYLOAD.contains(params.getOperation().toLowerCase()); } } diff --git a/models-interactions/model-actors/actor.appclcm/src/main/java/org/onap/policy/controlloop/actor/appclcm/ConfigModifyOperation.java b/models-interactions/model-actors/actor.appclcm/src/main/java/org/onap/policy/controlloop/actor/appclcm/ConfigModifyOperation.java deleted file mode 100644 index 02645afd8..000000000 --- a/models-interactions/model-actors/actor.appclcm/src/main/java/org/onap/policy/controlloop/actor/appclcm/ConfigModifyOperation.java +++ /dev/null @@ -1,43 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * AppcLcmOperation - * ================================================================================ - * 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.appclcm; - -import org.onap.policy.controlloop.actorserviceprovider.parameters.BidirectionalTopicConfig; -import org.onap.policy.controlloop.actorserviceprovider.parameters.ControlLoopOperationParams; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class ConfigModifyOperation extends AppcLcmOperation { - - private static final Logger logger = LoggerFactory.getLogger(ConfigModifyOperation.class); - - public static final String NAME = "ConfigModify"; - - /** - * Constructs the object. - * - * @param params operation parameters - * @param config configuration for this operation - */ - public ConfigModifyOperation(ControlLoopOperationParams params, BidirectionalTopicConfig config) { - super(params, config); - } -} |