<version>1.1.0-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
- <dependency>
- <groupId>org.onap.policy.drools-applications</groupId>
- <artifactId>actor.appclcm</artifactId>
- <version>1.1.0-SNAPSHOT</version>
- <scope>provided</scope>
- </dependency>
- <dependency>
- <groupId>org.onap.policy.drools-applications</groupId>
- <artifactId>aai</artifactId>
- <version>1.1.0-SNAPSHOT</version>
- <scope>provided</scope>
- </dependency>
<dependency>
<groupId>org.onap.policy.drools-applications</groupId>
<artifactId>appc</artifactId>
import java.util.List;
import org.onap.policy.controlloop.VirtualControlLoopEvent;
-import org.onap.policy.controlloop.actor.appclcm.AppcLcmActorServiceProvider;
-import org.onap.policy.aai.AAIGETVnfResponse;
-import org.onap.policy.aai.util.AAIException;
import org.onap.policy.appc.CommonHeader;
import org.onap.policy.appc.Request;
import org.onap.policy.controlloop.ControlLoopOperation;
* @throws AAIException
*/
public static Request constructRequest(VirtualControlLoopEvent onset, ControlLoopOperation operation,
- Policy policy, AAIGETVnfResponse vnfResponse) throws AAIException {
+ Policy policy, String targetVnf) {
/*
* Construct an APPC request
*/
request.CommonHeader.SubRequestID = operation.subRequestId;
request.Action = policy.getRecipe().substring(0, 1).toUpperCase()
+ policy.getRecipe().substring(1);
-
- /*
- * The target vnf-id may not be the same as the source vnf-id
- * specified in the yaml, the target vnf-id is retrieved by
- * a named query to A&AI.
- */
- String sourceVnf = onset.AAI.get("generic-vnf.vnf-id");
- if (sourceVnf == null) {
- /*
- * Lets see if the vnf-name is provided
- */
- sourceVnf = vnfResponse.vnfID;
- if (sourceVnf == null) {
- throw new AAIException("No vnf-id found");
- }
- }
- String targetVnf = AppcLcmActorServiceProvider.vnfNamedQuery(
- policy.getTarget().getResourceID(), sourceVnf);
/*
* For now Policy generates the PG Streams as a demo, in the
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
-import org.onap.policy.aai.AAIGETVnfResponse;
-import org.onap.policy.aai.util.AAIException;
import org.onap.policy.appc.Request;
import org.onap.policy.appc.Response;
import org.onap.policy.appc.ResponseCode;
private static VirtualControlLoopEvent onsetEvent;
private static ControlLoopOperation operation;
private static Policy policy;
- private static AAIGETVnfResponse aaiResponse;
static {
/*
policy.setRetry(2);
policy.setTimeout(300);
- /* Construct a mock A&AI response */
- aaiResponse = new AAIGETVnfResponse();
- aaiResponse.vnfID = "vnf01";
-
/* Set environment properties */
PolicyEngine.manager.setEnvironmentProperty("aai.url", "http://localhost:6666");
PolicyEngine.manager.setEnvironmentProperty("aai.username", "AAI");
public void constructModifyConfigRequestTest() {
Request appcRequest = null;
- try {
- appcRequest = APPCActorServiceProvider.constructRequest(onsetEvent, operation, policy, aaiResponse);
- } catch (AAIException e) {
- logger.warn(e.toString());
- fail("no vnfid found");
- }
+ appcRequest = APPCActorServiceProvider.constructRequest(onsetEvent, operation, policy, "vnf01");
/* The service provider must return a non null APPC request */
assertNotNull(appcRequest);
import org.onap.policy.aai.AAINQInstanceFilters;
import org.onap.policy.aai.AAINQInventoryResponseItem;
-import org.onap.policy.aai.AAIGETVnfResponse;
import org.onap.policy.aai.AAIManager;
import org.onap.policy.aai.AAINQNamedQuery;
import org.onap.policy.aai.AAINQQueryParameters;
public class AppcLcmActorServiceProvider implements Actor {
private static final Logger logger = LoggerFactory.getLogger(AppcLcmActorServiceProvider.class);
-
- /* The source vnf-id provided from the DCAE onset */
- private static final String DCAE_VNF_ID = "generic-vnf.vnf-id";
/* To be used in future releases to restart a single vm */
private static final String APPC_VM_ID = "vm-id";
* @throws AAIException
*/
public static LCMRequestWrapper constructRequest(VirtualControlLoopEvent onset,
- ControlLoopOperation operation, Policy policy, AAIGETVnfResponse vnfResponse) throws AAIException {
+ ControlLoopOperation operation, Policy policy, String targetVnf) throws AAIException {
/* Construct an APPC request using LCM Model */
* a vnf-id.
*/
HashMap<String, String> requestActionIdentifiers = new HashMap<>();
- String vnfId = onset.AAI.get(DCAE_VNF_ID);
- if (vnfId == null) {
- vnfId = vnfResponse.vnfID;
- if (vnfId == null) {
- throw new AAIException("No vnf-id found");
- }
- }
- requestActionIdentifiers.put("vnf-id", vnfId);
+ requestActionIdentifiers.put("vnf-id", targetVnf);
appcRequest.setActionIdentifiers(requestActionIdentifiers);
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
-import org.onap.policy.aai.AAIGETVnfResponse;
import org.onap.policy.aai.util.AAIException;
import org.onap.policy.appclcm.LCMCommonHeader;
import org.onap.policy.appclcm.LCMRequest;
private static VirtualControlLoopEvent onsetEvent;
private static ControlLoopOperation operation;
private static Policy policy;
- private static AAIGETVnfResponse aaiResponse;
private static LCMRequestWrapper dmaapRequest;
private static LCMResponseWrapper dmaapResponse;
policy.setPayload(null);
policy.setRetry(2);
policy.setTimeout(300);
-
- /* Construct a mock A&AI response */
- aaiResponse = new AAIGETVnfResponse();
- aaiResponse.vnfID = "vnf01";
/* A sample DMAAP request wrapper. */
dmaapRequest = new LCMRequestWrapper();
LCMRequestWrapper dmaapRequest = null;
try {
- dmaapRequest = AppcLcmActorServiceProvider.constructRequest(onsetEvent, operation, policy, aaiResponse);
+ dmaapRequest = AppcLcmActorServiceProvider.constructRequest(onsetEvent, operation, policy, "vnf01");
} catch (AAIException e) {
logger.warn(e.toString());
fail("no vnfid found");
String resourceId = "82194af1-3c2c-485a-8f44-420e22a9eaa4";
String targetVnfId = null;
try {
- targetVnfId = AppcLcmActorServiceProvider.vnfNamedQuery(resourceId, aaiResponse.vnfID);
+ targetVnfId = AppcLcmActorServiceProvider.vnfNamedQuery(resourceId, "vnf01");
} catch (AAIException e) {
logger.warn(e.toString());
fail("no vnf-id found");
}
assertNotNull(targetVnfId);
- assertEquals(targetVnfId, aaiResponse.vnfID);
+ assertEquals(targetVnfId, "vnf01");
}
}
import org.onap.policy.aai.AAIGETVnfResponse;
import org.onap.policy.aai.AAIGETVserverResponse;
import org.onap.policy.aai.AAIManager;
+import org.onap.policy.aai.util.AAIException;
import org.onap.policy.controlloop.ControlLoopEventStatus;
import org.onap.policy.controlloop.ControlLoopException;
import org.onap.policy.controlloop.ControlLoopNotificationType;
return notification;
}
- public ControlLoopOperationManager processControlLoop() throws ControlLoopException {
+ public ControlLoopOperationManager processControlLoop() throws ControlLoopException, AAIException {
//
// Check if they activated us
//
//
LockResult<GuardResult, TargetLock> lockResult = PolicyGuard.lockTarget(
this.currentOperation.policy.getTarget().getType(),
- this.getTargetInstance(this.currentOperation.policy),
+ this.currentOperation.getTargetEntity(),
this.onset.requestID,
this);
//
return false;
}
- public String getTargetInstance(Policy policy) {
- if (policy.getTarget() != null) {
- if (policy.getTarget().getType() != null) {
- switch(policy.getTarget().getType()) {
- case PNF:
- break;
- case VM:
- case VNF:
- if (this.onset.target.equalsIgnoreCase("vserver.vserver-name")) {
- return this.onset.AAI.get("vserver.vserver-name");
- }
- else if (this.onset.target.equalsIgnoreCase("generic-vnf.vnf-id")) {
- return this.onset.AAI.get("generic-vnf.vnf-id");
- }
- else if (this.onset.target.equalsIgnoreCase("generic-vnf.vnf-name")) {
- return this.onset.AAI.get("generic-vnf.vnf-name");
- }
- break;
- default:
- break;
- }
- }
- }
- return null;
- }
-
@Override
public String toString() {
return "ControlLoopEventManager [closedLoopControlName=" + closedLoopControlName + ", requestID=" + requestID
private LinkedList<Operation> operationHistory = new LinkedList<Operation>();
private PolicyResult policyResult = null;
private ControlLoopEventManager eventManager = null;
+ private String targetEntity;
public ControlLoopEventManager getEventManager() {
return eventManager;
this.eventManager = eventManager;
}
+ public String getTargetEntity() {
+ return this.targetEntity;
+ }
//
// Internal class used for tracking
this.guardApprovalStatus = guardApprovalStatus;
}
-
- public ControlLoopOperationManager(ControlLoopEvent onset, Policy policy, ControlLoopEventManager em) throws ControlLoopException {
+ public String getTarget(Policy policy) throws ControlLoopException, AAIException {
+ if (policy.getTarget() != null) {
+ if (policy.getTarget().getType() != null) {
+ switch(policy.getTarget().getType()) {
+ case PNF:
+ break;
+ case VM:
+ case VNF:
+ VirtualControlLoopEvent virtualOnset = (VirtualControlLoopEvent) this.onset;
+ if (this.onset.target.equalsIgnoreCase("vserver.vserver-name")) {
+ return virtualOnset.AAI.get("vserver.vserver-name");
+ }
+ else if (this.onset.target.equalsIgnoreCase("generic-vnf.vnf-id")) {
+ return virtualOnset.AAI.get("generic-vnf.vnf-id");
+ }
+ else if (this.onset.target.equalsIgnoreCase("generic-vnf.vnf-name")) {
+ /*
+ * If the vnf-name was retrieved from the onset then the vnf-id
+ * must be obtained from the event manager's A&AI GET query
+ */
+ String vnfId = this.eventManager.getVnfResponse().vnfID;
+ if (vnfId == null) {
+ throw new AAIException("No vnf-id found");
+ }
+ return vnfId;
+ }
+ break;
+ default:
+ throw new ControlLoopException("The target type is not supported");
+ }
+ }
+ else {
+ throw new ControlLoopException("The target type is null");
+ }
+ }
+ else {
+ throw new ControlLoopException("The target is null");
+ }
+ return null;
+ }
+
+ public ControlLoopOperationManager(ControlLoopEvent onset, Policy policy, ControlLoopEventManager em) throws ControlLoopException, AAIException {
this.onset = onset;
this.policy = policy;
this.guardApprovalStatus = "NONE";
this.eventManager = em;
-
+ this.targetEntity = getTarget(policy);
+
//
// Let's make a sanity check
//
switch (policy.getActor()) {
case "APPC":
+ if ("ModifyConfig".equalsIgnoreCase(policy.getRecipe())) {
+ /*
+ * The target vnf-id may not be the same as the source vnf-id
+ * specified in the yaml, the target vnf-id is retrieved by
+ * a named query to A&AI.
+ */
+ String targetVnf = AppcLcmActorServiceProvider.vnfNamedQuery(
+ policy.getTarget().getResourceID(), this.targetEntity);
+ this.targetEntity = targetVnf;
+ }
break;
case "SO":
- break;
+ break;
case "VFC":
break;
default:
if ("ModifyConfig".equalsIgnoreCase(policy.getRecipe())) {
this.operationRequest = APPCActorServiceProvider.constructRequest((VirtualControlLoopEvent) onset,
- operation.operation, this.policy, eventManager.getVnfResponse());
+ operation.operation, this.policy, this.targetEntity);
}
else {
this.operationRequest = AppcLcmActorServiceProvider.constructRequest((VirtualControlLoopEvent) onset,
- operation.operation, this.policy, eventManager.getVnfResponse());
+ operation.operation, this.policy, this.targetEntity);
}
//
// Save the operation
newEntry.requestId = this.onset.requestID.toString();
newEntry.actor = this.currentOperation.operation.actor;
newEntry.operation = this.currentOperation.operation.operation;
- newEntry.target = this.eventManager.getTargetInstance(this.policy);
+ newEntry.target = this.targetEntity;
newEntry.starttime = Timestamp.from(this.currentOperation.operation.start);
newEntry.subrequestId = this.currentOperation.operation.subRequestId;
newEntry.endtime = new Timestamp(this.currentOperation.operation.end.toEpochMilli());
import org.onap.policy.controlloop.ControlLoopEventStatus;
import org.onap.policy.controlloop.VirtualControlLoopEvent;
import org.onap.policy.controlloop.ControlLoopException;
+import org.onap.policy.controlloop.ControlLoopTargetType;
import org.onap.policy.controlloop.Util;
import org.onap.policy.controlloop.policy.ControlLoopPolicy;
import org.onap.policy.controlloop.policy.PolicyResult;
onset = new VirtualControlLoopEvent();
onset.requestID = UUID.randomUUID();
onset.target = "generic-vnf.vnf-name";
+ onset.target_type = ControlLoopTargetType.VNF;
onset.closedLoopAlarmStart = Instant.now();
onset.AAI = new HashMap<>();
onset.AAI.put("generic-vnf.vnf-name", "testTriggerSource");
description:
actor: APPC
recipe: Restart
- target: VM
+ target:
+ type: VNF
retry: 1
timeout: 20
success: final_success
}
}
} catch (Exception e) {
- logger.warn("{}: {}: unexpected",
+ logger.warn("{}: {}: unexpected",
$params.getClosedLoopControlName(),
drools.getRule().getName(), e);
- //
- // TODO should we abort if we get an exception?
- //
+ VirtualControlLoopNotification notification = new VirtualControlLoopNotification($event);
+ notification.notification = ControlLoopNotificationType.FINAL_FAILURE;
+ notification.message = e.getMessage();
+ notification.from = "policy";
+ notification.policyName = drools.getRule().getName();
+ notification.policyScope = "${policyScope}";
+ notification.policyVersion = "${policyVersion}";
+
+ PolicyEngine.manager.deliver("POLICY-CL-MGT", notification);
+
+ retract($event);
+ retract($manager);
+ retract($clTimer);
}
end
$event.closedLoopControlName,
$operation.policy.getActor().toString(),
$operation.policy.getRecipe(),
- $manager.getTargetInstance($operation.policy),
- //$event.target,
+ $operation.getTargetEntity(),
$event.requestID.toString()
));
t.start();
LCMRequestWrapper dmaapRequest = (LCMRequestWrapper) obj;
LCMRequest appcRequest = dmaapRequest.getBody();
assertTrue(appcRequest.getCommonHeader().getSubRequestId().equals("1"));
+ assertNotNull(appcRequest.getActionIdentifiers().get("vnf-id"));
logger.debug("\n============ APPC received the request!!! ===========\n");
logger.debug("Rule Fired: " + notification.policyName);
if ("error".equals(notification.AAI.get("generic-vnf.vnf-name"))) {
assertEquals(ControlLoopNotificationType.FINAL_FAILURE, notification.notification);
- assertEquals("Exception in processing closed loop", notification.message);
+ assertEquals("Target vnf-id could not be found", notification.message);
}
else {
assertTrue(ControlLoopNotificationType.FINAL_SUCCESS.equals(notification.notification));
}
else if (obj instanceof Request) {
assertTrue(((Request)obj).getCommonHeader().SubRequestID.equals("1"));
+ assertNotNull(((Request)obj).getPayload().get("generic-vnf.vnf-id"));
logger.debug("\n============ APPC received the request!!! ===========\n");
actor: APPC
recipe: Restart
target:
- type: VM
+ type: VNF
retry: 3
timeout: 30
success: final_success