From 6a37af48d1db199a0f5a9e9c48f7c5f834a90d1b Mon Sep 17 00:00:00 2001 From: Jim Hahn Date: Thu, 30 Jul 2020 18:05:02 -0400 Subject: Add "special" Operation classes for new usecases Created place-holder for new "usecases" controller. Note: as of yet, this is still just a normal java project; it will be turned into a full-fledged kie-based controller in a later review. Added some Operation and a few other support classes that will be needed. Note: the detmTarget() method and it's various supporting methods, detmXxx(), found in GetTargetEntityOperation2 were cloned from the pre-existing ControlLoopOperationManager2 class, and modified to fit the strategy of the new controller. Likewise for the junit tests of those methods. Issue-ID: POLICY-2748 Change-Id: Idffa135a11a56bd6afdd2728706fd40168e80912 Signed-off-by: Jim Hahn --- .../usecases/GetTargetEntityOperation2.java | 204 +++++++++++++++++++++ .../apps/controller/usecases/LockOperation2.java | 75 ++++++++ .../controller/usecases/UsecasesConstants.java | 49 +++++ 3 files changed, 328 insertions(+) create mode 100644 controlloop/common/controller-usecases/src/main/java/org/onap/policy/drools/apps/controller/usecases/GetTargetEntityOperation2.java create mode 100644 controlloop/common/controller-usecases/src/main/java/org/onap/policy/drools/apps/controller/usecases/LockOperation2.java create mode 100644 controlloop/common/controller-usecases/src/main/java/org/onap/policy/drools/apps/controller/usecases/UsecasesConstants.java (limited to 'controlloop/common/controller-usecases/src/main') diff --git a/controlloop/common/controller-usecases/src/main/java/org/onap/policy/drools/apps/controller/usecases/GetTargetEntityOperation2.java b/controlloop/common/controller-usecases/src/main/java/org/onap/policy/drools/apps/controller/usecases/GetTargetEntityOperation2.java new file mode 100644 index 000000000..e1259e48d --- /dev/null +++ b/controlloop/common/controller-usecases/src/main/java/org/onap/policy/drools/apps/controller/usecases/GetTargetEntityOperation2.java @@ -0,0 +1,204 @@ +/*- + * ============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.drools.apps.controller.usecases; + +import static org.onap.policy.drools.apps.controller.usecases.UsecasesConstants.AAI_DEFAULT_GENERIC_VNF; +import static org.onap.policy.drools.apps.controller.usecases.UsecasesConstants.GENERIC_VNF_VNF_ID; +import static org.onap.policy.drools.apps.controller.usecases.UsecasesConstants.GENERIC_VNF_VNF_NAME; +import static org.onap.policy.drools.apps.controller.usecases.UsecasesConstants.PNF_NAME; +import static org.onap.policy.drools.apps.controller.usecases.UsecasesConstants.VSERVER_VSERVER_NAME; + +import java.util.Collections; +import java.util.List; +import java.util.concurrent.CompletableFuture; +import org.onap.aai.domain.yang.GenericVnf; +import org.onap.policy.controlloop.VirtualControlLoopEvent; +import org.onap.policy.controlloop.actorserviceprovider.OperationOutcome; +import org.onap.policy.controlloop.actorserviceprovider.OperationProperties; +import org.onap.policy.controlloop.actorserviceprovider.impl.OperationPartial; +import org.onap.policy.controlloop.actorserviceprovider.parameters.ControlLoopOperationParams; +import org.onap.policy.controlloop.eventmanager.StepContext; +import org.onap.policy.controlloop.policy.Target; + +/** + * An operation to get the target entity. This is a "pseudo" operation; it is not found + * within an ActorService, but is created directly. It gets/sets the targetEntity found + * within the step context's properties. + */ +public class GetTargetEntityOperation2 extends OperationPartial { + + private final StepContext stepContext; + private final VirtualControlLoopEvent event; + + + /** + * Constructs the operation as a preprocessing step for a policy's operation. + * + * @param stepContext the step's context + * @param event event being processed + * @param params operation's parameters + */ + public GetTargetEntityOperation2(StepContext stepContext, VirtualControlLoopEvent event, + ControlLoopOperationParams params) { + super(params, null, Collections.emptyList()); + this.event = event; + this.stepContext = stepContext; + } + + @Override + public List getPropertyNames() { + String propName = detmTarget(params.getTarget()); + return (propName == null ? Collections.emptyList() : List.of(propName)); + } + + @Override + public CompletableFuture start() { + throw new UnsupportedOperationException("cannot start get-target-entity operation"); + } + + /** + * Determines the target entity. + * + * @param target policy target + * + * @return the property containing the target entity, or {@code null} if the target + * entity is already known + */ + private String detmTarget(Target target) { + if (stepContext.contains(OperationProperties.AAI_TARGET_ENTITY)) { + // the target entity has already been determined + return null; + } + + if (target == null) { + throw new IllegalArgumentException("The target is null"); + } + + if (target.getType() == null) { + throw new IllegalArgumentException("The target type is null"); + } + + switch (target.getType()) { + case PNF: + return detmPnfTarget(); + case VM: + case VNF: + case VFMODULE: + return detmVfModuleTarget(); + default: + throw new IllegalArgumentException("The target type is not supported"); + } + } + + /** + * Determines the PNF target entity. + * + * @return the property containing the target entity, or {@code null} if the target + * entity is already known + */ + private String detmPnfTarget() { + if (!PNF_NAME.equalsIgnoreCase(event.getTarget())) { + throw new IllegalArgumentException("Target does not match target type"); + } + + String targetEntity = event.getAai().get(PNF_NAME); + if (targetEntity == null) { + throw new IllegalArgumentException("AAI section is missing " + PNF_NAME); + } + + setTargetEntity(targetEntity); + + return null; + } + + /** + * Determines the VF Module target entity. + * + * @return the property containing the target entity, or {@code null} if the target + * entity is already known + */ + private String detmVfModuleTarget() { + String targetFieldName = event.getTarget(); + if (targetFieldName == null) { + throw new IllegalArgumentException("Target is null"); + } + + String targetEntity; + + switch (targetFieldName.toLowerCase()) { + case VSERVER_VSERVER_NAME: + targetEntity = event.getAai().get(VSERVER_VSERVER_NAME); + break; + case GENERIC_VNF_VNF_ID: + targetEntity = event.getAai().get(GENERIC_VNF_VNF_ID); + break; + case GENERIC_VNF_VNF_NAME: + return detmVnfName(); + default: + throw new IllegalArgumentException("Target does not match target type"); + } + + if (targetEntity == null) { + throw new IllegalArgumentException("Enrichment data is missing " + targetFieldName); + } + + setTargetEntity(targetEntity); + + return null; + } + + /** + * Determines the VNF Name target entity. + * + * @return the property containing the target entity, or {@code null} if the target + * entity is already known + */ + private String detmVnfName() { + // if the onset is enriched with the vnf-id, we don't need an A&AI response + String targetEntity = event.getAai().get(GENERIC_VNF_VNF_ID); + if (targetEntity == null) { + // don't have the data yet - add a step to retrieve it + return AAI_DEFAULT_GENERIC_VNF; + } + + setTargetEntity(targetEntity); + + return null; + } + + @Override + public void setProperty(String name, Object value) { + // only care about one property + if (UsecasesConstants.AAI_DEFAULT_GENERIC_VNF.equals(name)) { + GenericVnf vnf = (GenericVnf) value; + setTargetEntity(vnf.getVnfId()); + } + } + + /** + * Sets the target entity within the properties. + * + * @param targetEntity the new target entity + */ + private void setTargetEntity(String targetEntity) { + stepContext.setProperty(OperationProperties.AAI_TARGET_ENTITY, targetEntity); + } +} diff --git a/controlloop/common/controller-usecases/src/main/java/org/onap/policy/drools/apps/controller/usecases/LockOperation2.java b/controlloop/common/controller-usecases/src/main/java/org/onap/policy/drools/apps/controller/usecases/LockOperation2.java new file mode 100644 index 000000000..f5b03d2f5 --- /dev/null +++ b/controlloop/common/controller-usecases/src/main/java/org/onap/policy/drools/apps/controller/usecases/LockOperation2.java @@ -0,0 +1,75 @@ +/*- + * ============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.drools.apps.controller.usecases; + +import java.util.List; +import java.util.concurrent.CompletableFuture; +import lombok.Getter; +import org.onap.policy.controlloop.actorserviceprovider.OperationOutcome; +import org.onap.policy.controlloop.actorserviceprovider.OperationProperties; +import org.onap.policy.controlloop.actorserviceprovider.impl.OperationPartial; +import org.onap.policy.controlloop.actorserviceprovider.parameters.ControlLoopOperationParams; +import org.onap.policy.controlloop.eventmanager.StepContext; + +/** + * A LOCK operation for a particular target entity. This is a "pseudo" operation; it is + * not found within an ActorService, but is created directly. + */ +public class LockOperation2 extends OperationPartial { + + private final StepContext stepContext; + + private static final List PROPERTY_NAMES = List.of(OperationProperties.AAI_TARGET_ENTITY); + + /** + * Set when {@link #setProperty(String, Object)} is invoked. + */ + @Getter + private String targetEntity; + + + /** + * Constructs the lock operation as a preprocessing step for a policy's operation. + * + * @param stepContext the context to use to request the lock + * @param params operation's parameters + */ + public LockOperation2(StepContext stepContext, ControlLoopOperationParams params) { + super(params, null, PROPERTY_NAMES); + this.stepContext = stepContext; + } + + @Override + public CompletableFuture start() { + if (targetEntity == null) { + throw new IllegalStateException("target lock entity has not been determined yet"); + } + + return stepContext.requestLock(targetEntity); + } + + @Override + public void setProperty(String name, Object value) { + if (OperationProperties.AAI_TARGET_ENTITY.equals(name) && value != null) { + targetEntity = value.toString(); + } + } +} diff --git a/controlloop/common/controller-usecases/src/main/java/org/onap/policy/drools/apps/controller/usecases/UsecasesConstants.java b/controlloop/common/controller-usecases/src/main/java/org/onap/policy/drools/apps/controller/usecases/UsecasesConstants.java new file mode 100644 index 000000000..17db745ad --- /dev/null +++ b/controlloop/common/controller-usecases/src/main/java/org/onap/policy/drools/apps/controller/usecases/UsecasesConstants.java @@ -0,0 +1,49 @@ +/*- + * ============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.drools.apps.controller.usecases; + +public class UsecasesConstants { + + public static final String GET_TARGET_ENTITY_ACTOR = "pseudo/getTargetEntity"; + public static final String GET_TARGET_ENTITY_OPERATION = "pseudo/getTargetEntity"; + + public static final String PROV_STATUS_ACTIVE = "ACTIVE"; + public static final String VM_NAME = "VM_NAME"; + public static final String VNF_NAME = "VNF_NAME"; + public static final String GENERIC_VNF_VNF_ID = "generic-vnf.vnf-id"; + public static final String GENERIC_VNF_VNF_NAME = "generic-vnf.vnf-name"; + public static final String VSERVER_VSERVER_NAME = "vserver.vserver-name"; + public static final String GENERIC_VNF_IS_CLOSED_LOOP_DISABLED = "generic-vnf.is-closed-loop-disabled"; + public static final String VSERVER_IS_CLOSED_LOOP_DISABLED = "vserver.is-closed-loop-disabled"; + public static final String PNF_IS_IN_MAINT = "pnf.in-maint"; + public static final String GENERIC_VNF_PROV_STATUS = "generic-vnf.prov-status"; + public static final String VSERVER_PROV_STATUS = "vserver.prov-status"; + public static final String PNF_ID = "pnf.pnf-id"; + public static final String PNF_NAME = "pnf.pnf-name"; + + // additional properties that the Operations may need + + public static final String AAI_DEFAULT_GENERIC_VNF = "AAI/default/genericVnf"; + + private UsecasesConstants() { + super(); + } +} -- cgit 1.2.3-korg