aboutsummaryrefslogtreecommitdiffstats
path: root/ONAP-ControlloopPolicy/src/main/java/org/onap/policy/controlloop/policy/builder
diff options
context:
space:
mode:
Diffstat (limited to 'ONAP-ControlloopPolicy/src/main/java/org/onap/policy/controlloop/policy/builder')
-rw-r--r--ONAP-ControlloopPolicy/src/main/java/org/onap/policy/controlloop/policy/builder/BuilderException.java31
-rw-r--r--ONAP-ControlloopPolicy/src/main/java/org/onap/policy/controlloop/policy/builder/ControlLoopPolicyBuilder.java287
-rw-r--r--ONAP-ControlloopPolicy/src/main/java/org/onap/policy/controlloop/policy/builder/Message.java29
-rw-r--r--ONAP-ControlloopPolicy/src/main/java/org/onap/policy/controlloop/policy/builder/MessageLevel.java29
-rw-r--r--ONAP-ControlloopPolicy/src/main/java/org/onap/policy/controlloop/policy/builder/Results.java33
-rw-r--r--ONAP-ControlloopPolicy/src/main/java/org/onap/policy/controlloop/policy/builder/impl/ControlLoopPolicyBuilderImpl.java496
-rw-r--r--ONAP-ControlloopPolicy/src/main/java/org/onap/policy/controlloop/policy/builder/impl/MessageImpl.java46
-rw-r--r--ONAP-ControlloopPolicy/src/main/java/org/onap/policy/controlloop/policy/builder/impl/ResultsImpl.java55
8 files changed, 1006 insertions, 0 deletions
diff --git a/ONAP-ControlloopPolicy/src/main/java/org/onap/policy/controlloop/policy/builder/BuilderException.java b/ONAP-ControlloopPolicy/src/main/java/org/onap/policy/controlloop/policy/builder/BuilderException.java
new file mode 100644
index 000000000..7cf2f4900
--- /dev/null
+++ b/ONAP-ControlloopPolicy/src/main/java/org/onap/policy/controlloop/policy/builder/BuilderException.java
@@ -0,0 +1,31 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP Policy Engine
+ * ================================================================================
+ * Copyright (C) 2017 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.policy.builder;
+
+public class BuilderException extends Exception {
+
+ private static final long serialVersionUID = 610064813684337895L;
+
+ public BuilderException(String string) {
+ super(string);
+ }
+
+}
diff --git a/ONAP-ControlloopPolicy/src/main/java/org/onap/policy/controlloop/policy/builder/ControlLoopPolicyBuilder.java b/ONAP-ControlloopPolicy/src/main/java/org/onap/policy/controlloop/policy/builder/ControlLoopPolicyBuilder.java
new file mode 100644
index 000000000..93ecbc62e
--- /dev/null
+++ b/ONAP-ControlloopPolicy/src/main/java/org/onap/policy/controlloop/policy/builder/ControlLoopPolicyBuilder.java
@@ -0,0 +1,287 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP Policy Engine
+ * ================================================================================
+ * Copyright (C) 2017 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.policy.builder;
+
+import java.util.Map;
+
+import org.onap.policy.asdc.Resource;
+import org.onap.policy.asdc.Service;
+import org.onap.policy.controlloop.policy.ControlLoop;
+import org.onap.policy.controlloop.policy.OperationsAccumulateParams;
+import org.onap.policy.controlloop.policy.Policy;
+import org.onap.policy.controlloop.policy.PolicyResult;
+import org.onap.policy.controlloop.policy.Target;
+import org.onap.policy.controlloop.policy.builder.impl.ControlLoopPolicyBuilderImpl;
+
+public interface ControlLoopPolicyBuilder {
+
+ /**
+ * Adds one or more services to the ControlLoop
+ *
+ *
+ * @param service
+ * @return
+ * @throws BuilderException
+ */
+ public ControlLoopPolicyBuilder addService(Service... services) throws BuilderException;
+
+ /**
+ * @param services
+ * @return
+ * @throws BuilderException
+ */
+ public ControlLoopPolicyBuilder removeService(Service... services) throws BuilderException;
+
+ /**
+ * @return
+ * @throws BuilderException
+ */
+ public ControlLoopPolicyBuilder removeAllServices() throws BuilderException;
+
+ /**
+ * Adds one or more resources to the ControlLoop
+ *
+ *
+ * @param resource
+ * @return
+ * @throws BuilderException
+ */
+ public ControlLoopPolicyBuilder addResource(Resource... resources) throws BuilderException;
+
+ /**
+ * @param resources
+ * @return
+ * @throws BuilderException
+ */
+ public ControlLoopPolicyBuilder removeResource(Resource... resources) throws BuilderException;
+
+ /**
+ * @return
+ * @throws BuilderException
+ */
+ public ControlLoopPolicyBuilder removeAllResources() throws BuilderException;
+
+ /**
+ * @param abatement
+ * @return
+ * @throws BuilderException
+ */
+ public ControlLoopPolicyBuilder setAbatement(Boolean abatement) throws BuilderException;
+
+
+ /**
+ * Sets the overall timeout value for the Control Loop. If any operational policies have retries and timeouts,
+ * then this overall timeout value should exceed all those values.
+ *
+ * @param timeout
+ * @return
+ * @throws BuilderException
+ */
+ public ControlLoopPolicyBuilder setTimeout(Integer timeout) throws BuilderException;
+
+ /**
+ * Scans the operational policies and calculate an minimum overall timeout for the Control Loop.
+ *
+ *
+ * @return Integer
+ */
+ public Integer calculateTimeout();
+
+ /**
+ * Sets the initial trigger policy when a DCAE Closed Loop Event arrives in the ONAP Policy Platform.
+ *
+ *
+ * @param name
+ * @param description
+ * @param actor
+ * @param target
+ * @param recipe
+ * @param retries
+ * @param timeout
+ * @return Policy
+ * @throws BuilderException
+ */
+ public Policy setTriggerPolicy(String name, String description, String actor, Target target, String recipe, Map<String, String> payload, Integer retries, Integer timeout) throws BuilderException;
+
+ /**
+ *
+ * Changes the trigger policy to point to another existing Policy.
+ *
+ *
+ * @param id
+ * @return ControlLoop
+ * @throws BuilderException
+ */
+ public ControlLoop setTriggerPolicy(String id) throws BuilderException;
+
+ /**
+ * @return
+ */
+ public boolean isOpenLoop();
+
+ /**
+ * @return
+ * @throws BuilderException
+ */
+ public Policy getTriggerPolicy() throws BuilderException;
+
+ /**
+ * Simply returns a copy of the ControlLoop information.
+ *
+ *
+ * @return ControlLoop
+ */
+ public ControlLoop getControlLoop();
+
+ /**
+ * Creates a policy that is chained to the result of another Policy.
+ *
+ *
+ * @param name
+ * @param description
+ * @param actor
+ * @param target
+ * @param recipe
+ * @param retries
+ * @param timeout
+ * @param policyID
+ * @param results
+ * @return
+ * @throws BuilderException
+ */
+ public Policy setPolicyForPolicyResult(String name, String description, String actor,
+ Target target, String recipe, Map<String, String> payload, Integer retries, Integer timeout, String policyID, PolicyResult... results) throws BuilderException;
+
+
+ /**
+ * Sets the policy result(s) to an existing Operational Policy.
+ *
+ *
+ * @param policyResultID
+ * @param policyID
+ * @param results
+ * @return
+ * @throws BuilderException
+ */
+ public Policy setPolicyForPolicyResult(String policyResultID, String policyID, PolicyResult... results) throws BuilderException;
+
+ /**
+ * Removes an Operational Policy. Be mindful that if any other Operational Policies have results that point to this policy, any
+ * policies that have results pointing to this policy will have their result reset to the appropriate default FINAL_* result.
+ *
+ *
+ * @param policyID
+ * @return
+ * @throws BuilderException
+ */
+ public boolean removePolicy(String policyID) throws BuilderException;
+
+ /**
+ * Resets a policy's results to defualt FINAL_* codes.
+ *
+ *
+ * @return Policy
+ * @throws BuilderException - Policy does not exist
+ */
+ public Policy resetPolicyResults(String policyID) throws BuilderException;
+
+ /**
+ * Removes all existing Operational Policies and reverts back to an Open Loop.
+ *
+ * @return
+ */
+ public ControlLoopPolicyBuilder removeAllPolicies();
+
+ /**
+ * Adds an operationsAccumulateParams to an existing operational policy
+ *
+ * @return Policy
+ * @throws BuilderException - Policy does not exist
+ */
+ public Policy addOperationsAccumulateParams(String policyID, OperationsAccumulateParams operationsAccumulateParams) throws BuilderException;
+
+ /**
+ * This will compile and build the YAML specification for the Control Loop Policy. Please iterate the Results object for details.
+ * The Results object will contains warnings and errors. If the specification compiled successfully, you will be able to retrieve the
+ * YAML.
+ *
+ * @return Results
+ */
+ public Results buildSpecification();
+
+ /**
+ * The Factory is used to build a ControlLoopPolicyBuilder implementation.
+ *
+ * @author pameladragosh
+ *
+ */
+ public static class Factory {
+ private Factory(){
+ // Private Constructor.
+ }
+
+ /**
+ * Builds a basic Control Loop with an overall timeout. Use this method if you wish to create an OpenLoop, or if you
+ * want to interactively build a Closed Loop.
+ *
+ * @param controlLoopName - Per Closed Loop AID v1.0, unique string for the closed loop.
+ * @param timeout - Overall timeout for the Closed Loop to execute.
+ * @return ControlLoopPolicyBuilder object
+ * @throws BuilderException
+ */
+ public static ControlLoopPolicyBuilder buildControlLoop (String controlLoopName, Integer timeout) throws BuilderException {
+ return new ControlLoopPolicyBuilderImpl(controlLoopName, timeout);
+ }
+
+ /**
+ * Build a Control Loop for a resource and services associated with the resource.
+ *
+ * @param controlLoopName - Per Closed Loop AID v1.0, unique string for the closed loop.
+ * @param timeout - Overall timeout for the Closed Loop to execute.
+ * @param resource - Resource this closed loop is for. Should come from ASDC, but if not available use resourceName to distinguish.
+ * @param services - Zero or more services associated with this resource. Should come from ASDC, but if not available use serviceName to distinguish.
+ * @return ControlLoopPolicyBuilder object
+ * @throws BuilderException
+ */
+ public static ControlLoopPolicyBuilder buildControlLoop (String controlLoopName, Integer timeout, Resource resource, Service... services) throws BuilderException {
+
+ ControlLoopPolicyBuilder builder = new ControlLoopPolicyBuilderImpl(controlLoopName, timeout, resource, services);
+
+ return builder;
+ }
+
+ /**
+ * @param controlLoopName
+ * @param timeout
+ * @param service
+ * @param resources
+ * @return
+ * @throws BuilderException
+ */
+ public static ControlLoopPolicyBuilder buildControlLoop (String controlLoopName, Integer timeout, Service service, Resource... resources) throws BuilderException {
+
+ ControlLoopPolicyBuilder builder = new ControlLoopPolicyBuilderImpl(controlLoopName, timeout, service, resources);
+
+ return builder;
+ }
+ }
+
+}
diff --git a/ONAP-ControlloopPolicy/src/main/java/org/onap/policy/controlloop/policy/builder/Message.java b/ONAP-ControlloopPolicy/src/main/java/org/onap/policy/controlloop/policy/builder/Message.java
new file mode 100644
index 000000000..4bf2665b3
--- /dev/null
+++ b/ONAP-ControlloopPolicy/src/main/java/org/onap/policy/controlloop/policy/builder/Message.java
@@ -0,0 +1,29 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP Policy Engine
+ * ================================================================================
+ * Copyright (C) 2017 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.policy.builder;
+
+public interface Message {
+
+ public String getMessage();
+
+ public MessageLevel getLevel();
+
+}
diff --git a/ONAP-ControlloopPolicy/src/main/java/org/onap/policy/controlloop/policy/builder/MessageLevel.java b/ONAP-ControlloopPolicy/src/main/java/org/onap/policy/controlloop/policy/builder/MessageLevel.java
new file mode 100644
index 000000000..37ecfa17c
--- /dev/null
+++ b/ONAP-ControlloopPolicy/src/main/java/org/onap/policy/controlloop/policy/builder/MessageLevel.java
@@ -0,0 +1,29 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP Policy Engine
+ * ================================================================================
+ * Copyright (C) 2017 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.policy.builder;
+
+public enum MessageLevel {
+ INFO,
+ WARNING,
+ ERROR,
+ EXCEPTION
+ ;
+
+}
diff --git a/ONAP-ControlloopPolicy/src/main/java/org/onap/policy/controlloop/policy/builder/Results.java b/ONAP-ControlloopPolicy/src/main/java/org/onap/policy/controlloop/policy/builder/Results.java
new file mode 100644
index 000000000..37bd93215
--- /dev/null
+++ b/ONAP-ControlloopPolicy/src/main/java/org/onap/policy/controlloop/policy/builder/Results.java
@@ -0,0 +1,33 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP Policy Engine
+ * ================================================================================
+ * Copyright (C) 2017 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.policy.builder;
+
+import java.util.List;
+
+public interface Results {
+
+ public List<Message> getMessages();
+
+ public String getSpecification();
+
+ public boolean isValid();
+
+}
diff --git a/ONAP-ControlloopPolicy/src/main/java/org/onap/policy/controlloop/policy/builder/impl/ControlLoopPolicyBuilderImpl.java b/ONAP-ControlloopPolicy/src/main/java/org/onap/policy/controlloop/policy/builder/impl/ControlLoopPolicyBuilderImpl.java
new file mode 100644
index 000000000..dae56f32c
--- /dev/null
+++ b/ONAP-ControlloopPolicy/src/main/java/org/onap/policy/controlloop/policy/builder/impl/ControlLoopPolicyBuilderImpl.java
@@ -0,0 +1,496 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP Policy Engine
+ * ================================================================================
+ * Copyright (C) 2017 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.policy.builder.impl;
+
+import java.util.LinkedList;
+import java.util.Map;
+import java.util.UUID;
+
+import org.onap.policy.asdc.Resource;
+import org.onap.policy.asdc.Service;
+import org.onap.policy.common.logging.flexlogger.FlexLogger;
+import org.onap.policy.common.logging.flexlogger.Logger;
+import org.onap.policy.controlloop.compiler.CompilerException;
+import org.onap.policy.controlloop.compiler.ControlLoopCompiler;
+import org.onap.policy.controlloop.compiler.ControlLoopCompilerCallback;
+import org.onap.policy.controlloop.policy.ControlLoop;
+import org.onap.policy.controlloop.policy.ControlLoopPolicy;
+import org.onap.policy.controlloop.policy.FinalResult;
+import org.onap.policy.controlloop.policy.OperationsAccumulateParams;
+import org.onap.policy.controlloop.policy.Policy;
+import org.onap.policy.controlloop.policy.PolicyResult;
+import org.onap.policy.controlloop.policy.Target;
+import org.onap.policy.controlloop.policy.builder.BuilderException;
+import org.onap.policy.controlloop.policy.builder.ControlLoopPolicyBuilder;
+import org.onap.policy.controlloop.policy.builder.MessageLevel;
+import org.onap.policy.controlloop.policy.builder.Results;
+import org.yaml.snakeyaml.DumperOptions;
+import org.yaml.snakeyaml.DumperOptions.FlowStyle;
+import org.yaml.snakeyaml.Yaml;
+
+public class ControlLoopPolicyBuilderImpl implements ControlLoopPolicyBuilder {
+ private static Logger logger = FlexLogger.getLogger(ControlLoopPolicyBuilderImpl.class.getName());
+ private ControlLoopPolicy policy;
+
+ public ControlLoopPolicyBuilderImpl(String controlLoopName, Integer timeout) throws BuilderException {
+ policy = new ControlLoopPolicy();
+ ControlLoop controlLoop = new ControlLoop();
+ controlLoop.setControlLoopName(controlLoopName);
+ controlLoop.setTimeout(timeout);
+ policy.setControlLoop(controlLoop);
+ }
+
+ public ControlLoopPolicyBuilderImpl(String controlLoopName, Integer timeout, Resource resource, Service... services) throws BuilderException {
+ this(controlLoopName, timeout);
+ this.addResource(resource);
+ this.addService(services);
+ }
+
+ public ControlLoopPolicyBuilderImpl(String controlLoopName, Integer timeout, Service service, Resource[] resources) throws BuilderException {
+ this(controlLoopName, timeout);
+ this.addService(service);
+ this.addResource(resources);
+ }
+
+ @Override
+ public ControlLoopPolicyBuilder addService(Service... services) throws BuilderException {
+ if (services == null) {
+ throw new BuilderException("Service must not be null");
+ }
+ for (Service service : services) {
+ if (service.getServiceUUID() == null) {
+ if (service.getServiceName() == null || service.getServiceName().length() < 1) {
+ throw new BuilderException("Invalid service - need either a serviceUUID or serviceName");
+ }
+ if(policy.getControlLoop().getServices()==null){
+ policy.getControlLoop().setServices(new LinkedList<>());
+ }
+ policy.getControlLoop().getServices().add(service);
+ }
+ }
+ return this;
+ }
+
+ @Override
+ public ControlLoopPolicyBuilder removeService(Service... services) throws BuilderException {
+ if (services == null) {
+ throw new BuilderException("Service must not be null");
+ }
+ if (policy.getControlLoop().getServices() == null) {
+ throw new BuilderException("No existing services to remove");
+ }
+ for (Service service : services) {
+ if (service.getServiceUUID() == null) {
+ if (service.getServiceName() == null || service.getServiceName().length() < 1) {
+ throw new BuilderException("Invalid service - need either a serviceUUID or serviceName");
+ }
+ }
+ boolean removed = policy.getControlLoop().getServices().remove(service);
+ if (!removed) {
+ throw new BuilderException("Unknown service " + service.getServiceName());
+ }
+ }
+ return this;
+ }
+
+ @Override
+ public ControlLoopPolicyBuilder removeAllServices() throws BuilderException {
+ policy.getControlLoop().getServices().clear();
+ return this;
+ }
+
+
+ @Override
+ public ControlLoopPolicyBuilder addResource(Resource... resources) throws BuilderException {
+ if (resources == null) {
+ throw new BuilderException("resources must not be null");
+ }
+ for (Resource resource : resources) {
+ if (resource.getResourceUUID() == null) {
+ if (resource.getResourceName() == null || resource.getResourceName().length() <= 0) {
+ throw new BuilderException("Invalid resource - need either resourceUUID or resourceName");
+ }
+ }
+ if(policy.getControlLoop().getResources()==null){
+ policy.getControlLoop().setResources(new LinkedList<>());
+ }
+ policy.getControlLoop().getResources().add(resource);
+ }
+ return this;
+ }
+
+ @Override
+ public ControlLoopPolicyBuilder setAbatement(Boolean abatement) throws BuilderException{
+ if (abatement == null) {
+ throw new BuilderException("abatement must not be null");
+ }
+ policy.getControlLoop().setAbatement(abatement);
+ return this;
+ }
+
+ @Override
+ public ControlLoopPolicyBuilder setTimeout(Integer timeout) {
+ policy.getControlLoop().setTimeout(timeout);
+ return this;
+ }
+
+ @Override
+ public Policy setTriggerPolicy(String name, String description, String actor, Target target, String recipe,
+ Map<String, String> payload, Integer retries, Integer timeout) throws BuilderException {
+
+ Policy trigger = new Policy(UUID.randomUUID().toString(), name, description, actor, payload, target, recipe, retries, timeout);
+
+ policy.getControlLoop().setTrigger_policy(trigger.getId());
+
+ this.addNewPolicy(trigger);
+ //
+ // Return a copy of the policy
+ //
+ return new Policy(trigger);
+ }
+
+ @Override
+ public Policy setPolicyForPolicyResult(String name, String description, String actor,
+ Target target, String recipe, Map<String, String> payload, Integer retries, Integer timeout, String policyID, PolicyResult... results) throws BuilderException {
+ //
+ // Find the existing policy
+ //
+ Policy existingPolicy = this.findPolicy(policyID);
+ if (existingPolicy == null) {
+ throw new BuilderException("Unknown policy " + policyID);
+ }
+ //
+ // Create the new Policy
+ //
+ Policy newPolicy = new Policy(UUID.randomUUID().toString(), name, description, actor, payload, target, recipe, retries, timeout);
+ //
+ // Connect the results
+ //
+ for (PolicyResult result : results) {
+ switch (result) {
+ case FAILURE:
+ existingPolicy.setFailure(newPolicy.getId());
+ break;
+ case FAILURE_EXCEPTION:
+ existingPolicy.setFailure_exception(newPolicy.getId());
+ break;
+ case FAILURE_RETRIES:
+ existingPolicy.setFailure_retries(newPolicy.getId());
+ break;
+ case FAILURE_TIMEOUT:
+ existingPolicy.setFailure_timeout(newPolicy.getId());
+ break;
+ case FAILURE_GUARD:
+ existingPolicy.setFailure_guard(newPolicy.getId());
+ break;
+ case SUCCESS:
+ existingPolicy.setSuccess(newPolicy.getId());
+ break;
+ default:
+ throw new BuilderException("Invalid PolicyResult " + result);
+ }
+ }
+ //
+ // Add it to our list
+ //
+ this.policy.getPolicies().add(newPolicy);
+ //
+ // Return a policy to them
+ //
+ return new Policy(newPolicy);
+ }
+
+ private class BuilderCompilerCallback implements ControlLoopCompilerCallback {
+
+ private ResultsImpl results = new ResultsImpl();
+
+ @Override
+ public boolean onWarning(String message) {
+ results.addMessage(new MessageImpl(message, MessageLevel.WARNING));
+ return false;
+ }
+
+ @Override
+ public boolean onError(String message) {
+ results.addMessage(new MessageImpl(message, MessageLevel.ERROR));
+ return false;
+ }
+ }
+
+ @Override
+ public Results buildSpecification() {
+ //
+ // Dump the specification
+ //
+ DumperOptions options = new DumperOptions();
+ options.setDefaultFlowStyle(FlowStyle.BLOCK);
+ options.setPrettyFlow(true);
+ Yaml yaml = new Yaml(options);
+ String dumpedYaml = yaml.dump(policy);
+ //
+ // This is our callback class for our compiler
+ //
+ BuilderCompilerCallback callback = new BuilderCompilerCallback();
+ //
+ // Compile it
+ //
+ try {
+ ControlLoopCompiler.compile(policy, callback);
+ } catch (CompilerException e) {
+ logger.error(e.getMessage() + e);
+ callback.results.addMessage(new MessageImpl(e.getMessage(), MessageLevel.EXCEPTION));
+ }
+ //
+ // Save the spec
+ //
+ callback.results.setSpecification(dumpedYaml);
+ return callback.results;
+ }
+
+ private void addNewPolicy(Policy policy) {
+ if (this.policy.getPolicies() == null) {
+ this.policy.setPolicies(new LinkedList<>());
+ }
+ this.policy.getPolicies().add(policy);
+ }
+
+ private Policy findPolicy(String id) {
+ for (Policy policy : this.policy.getPolicies()) {
+ if (policy.getId().equals(id)) {
+ return policy;
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public ControlLoopPolicyBuilder removeResource(Resource... resources) throws BuilderException {
+ if (resources == null) {
+ throw new BuilderException("Resource must not be null");
+ }
+ if (policy.getControlLoop().getResources() == null) {
+ throw new BuilderException("No existing resources to remove");
+ }
+ for (Resource resource : resources) {
+ if (resource.getResourceUUID() == null) {
+ if (resource.getResourceName() == null || resource.getResourceName().length() < 1) {
+ throw new BuilderException("Invalid resource - need either a resourceUUID or resourceName");
+ }
+ }
+ boolean removed = policy.getControlLoop().getResources().remove(resource);
+ if (!removed) {
+ throw new BuilderException("Unknown resource " + resource.getResourceName());
+ }
+ }
+ return this;
+ }
+
+ @Override
+ public ControlLoopPolicyBuilder removeAllResources() throws BuilderException {
+ policy.getControlLoop().getResources().clear();
+ return this;
+ }
+
+ @Override
+ public Integer calculateTimeout() {
+ int sum = 0;
+ for (Policy policy : this.policy.getPolicies()) {
+ sum += policy.getTimeout().intValue();
+ }
+ return new Integer(sum);
+ }
+
+ @Override
+ public ControlLoop setTriggerPolicy(String id) throws BuilderException {
+ if (id == null) {
+ throw new BuilderException("Id must not be null");
+ }
+ Policy trigger = this.findPolicy(id);
+ if (trigger == null) {
+ throw new BuilderException("Unknown policy " + id);
+ }
+ else {
+ this.policy.getControlLoop().setTrigger_policy(id);
+ }
+ return new ControlLoop(this.policy.getControlLoop());
+ }
+
+ @Override
+ public boolean isOpenLoop() {
+ if (this.policy.getControlLoop().getTrigger_policy().equals(FinalResult.FINAL_OPENLOOP.toString())) {
+ return true;
+ }
+ else {
+ return false;
+ }
+ }
+
+ @Override
+ public Policy getTriggerPolicy() throws BuilderException {
+ if (this.policy.getControlLoop().getTrigger_policy().equals(FinalResult.FINAL_OPENLOOP.toString())) {
+ return null;
+ }
+ else {
+ Policy trigger = new Policy(this.findPolicy(this.policy.getControlLoop().getTrigger_policy()));
+ return trigger;
+ }
+ }
+
+ @Override
+ public ControlLoop getControlLoop() {
+ ControlLoop loop = new ControlLoop(this.policy.getControlLoop());
+ return loop;
+ }
+
+ @Override
+ public Policy setPolicyForPolicyResult(String policyResultID, String policyID, PolicyResult... results)
+ throws BuilderException {
+ //
+ // Find the existing policy
+ //
+ Policy existingPolicy = this.findPolicy(policyID);
+ if (existingPolicy == null) {
+ throw new BuilderException(policyID + " does not exist");
+ }
+ if (this.findPolicy(policyResultID) == null) {
+ throw new BuilderException("Operational policy " + policyResultID + " does not exist");
+ }
+ //
+ // Connect the results
+ //
+ for (PolicyResult result : results) {
+ switch (result) {
+ case FAILURE:
+ existingPolicy.setFailure(policyResultID);
+ break;
+ case FAILURE_EXCEPTION:
+ existingPolicy.setFailure_exception(policyResultID);
+ break;
+ case FAILURE_RETRIES:
+ existingPolicy.setFailure_retries(policyResultID);
+ break;
+ case FAILURE_TIMEOUT:
+ existingPolicy.setFailure_timeout(policyResultID);
+ break;
+ case FAILURE_GUARD:
+ existingPolicy.setFailure_guard(policyResultID);
+ break;
+ case SUCCESS:
+ existingPolicy.setSuccess(policyResultID);
+ break;
+ default:
+ throw new BuilderException("Invalid PolicyResult " + result);
+ }
+ }
+ return new Policy(this.findPolicy(policyResultID));
+ }
+
+ @Override
+ public boolean removePolicy(String policyID) throws BuilderException {
+ Policy existingPolicy = this.findPolicy(policyID);
+ if (existingPolicy == null) {
+ throw new BuilderException("Unknown policy " + policyID);
+ }
+ //
+ // Check if the policy to remove is trigger_policy
+ //
+ if (this.policy.getControlLoop().getTrigger_policy().equals(policyID)) {
+ this.policy.getControlLoop().setTrigger_policy(FinalResult.FINAL_OPENLOOP.toString());
+ }
+ else {
+ //
+ // Update policies
+ //
+ for (Policy policy : this.policy.getPolicies()) {
+ int index = this.policy.getPolicies().indexOf(policy);
+ if (policy.getSuccess().equals(policyID)) {
+ policy.setSuccess(FinalResult.FINAL_SUCCESS.toString());
+ }
+ if (policy.getFailure().equals(policyID)) {
+ policy.setFailure(FinalResult.FINAL_FAILURE.toString());
+ }
+ if (policy.getFailure_retries().equals(policyID)) {
+ policy.setFailure_retries(FinalResult.FINAL_FAILURE_RETRIES.toString());
+ }
+ if (policy.getFailure_timeout().equals(policyID)) {
+ policy.setFailure_timeout(FinalResult.FINAL_FAILURE_TIMEOUT.toString());
+ }
+ if (policy.getFailure_exception().equals(policyID)) {
+ policy.setFailure_exception(FinalResult.FINAL_FAILURE_EXCEPTION.toString());
+ }
+ if (policy.getFailure_guard().equals(policyID)) {
+ policy.setFailure_guard(FinalResult.FINAL_FAILURE_GUARD.toString());
+ }
+ this.policy.getPolicies().set(index, policy);
+ }
+ }
+ //
+ // remove the policy
+ //
+ boolean removed = this.policy.getPolicies().remove(existingPolicy);
+ return removed;
+ }
+
+ @Override
+ public Policy resetPolicyResults(String policyID) throws BuilderException {
+ Policy existingPolicy = this.findPolicy(policyID);
+ if (existingPolicy == null) {
+ throw new BuilderException("Unknown policy " + policyID);
+ }
+ //
+ // reset policy results
+ //
+ existingPolicy.setSuccess(FinalResult.FINAL_SUCCESS.toString());
+ existingPolicy.setFailure(FinalResult.FINAL_FAILURE.toString());
+ existingPolicy.setFailure_retries(FinalResult.FINAL_FAILURE_RETRIES.toString());
+ existingPolicy.setFailure_timeout(FinalResult.FINAL_FAILURE_TIMEOUT.toString());
+ existingPolicy.setFailure_exception(FinalResult.FINAL_FAILURE_EXCEPTION.toString());
+ existingPolicy.setFailure_guard(FinalResult.FINAL_FAILURE_GUARD.toString());
+ return new Policy(existingPolicy);
+ }
+
+ @Override
+ public ControlLoopPolicyBuilder removeAllPolicies() {
+ //
+ // Remove all existing operational policies
+ //
+ this.policy.getPolicies().clear();
+ //
+ // Revert controlLoop back to an open loop
+ //
+ this.policy.getControlLoop().setTrigger_policy(FinalResult.FINAL_OPENLOOP.toString());
+ return this;
+ }
+
+ @Override
+ public Policy addOperationsAccumulateParams(String policyID, OperationsAccumulateParams operationsAccumulateParams) throws BuilderException {
+ Policy existingPolicy = this.findPolicy(policyID);
+ if (existingPolicy == null) {
+ throw new BuilderException("Unknown policy " + policyID);
+ }
+ //
+ // Add operationsAccumulateParams to existingPolicy
+ //
+ existingPolicy.setOperationsAccumulateParams(operationsAccumulateParams);
+ return new Policy(existingPolicy);
+ }
+
+}
diff --git a/ONAP-ControlloopPolicy/src/main/java/org/onap/policy/controlloop/policy/builder/impl/MessageImpl.java b/ONAP-ControlloopPolicy/src/main/java/org/onap/policy/controlloop/policy/builder/impl/MessageImpl.java
new file mode 100644
index 000000000..4d3aa7091
--- /dev/null
+++ b/ONAP-ControlloopPolicy/src/main/java/org/onap/policy/controlloop/policy/builder/impl/MessageImpl.java
@@ -0,0 +1,46 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP Policy Engine
+ * ================================================================================
+ * Copyright (C) 2017 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.policy.builder.impl;
+
+import org.onap.policy.controlloop.policy.builder.Message;
+import org.onap.policy.controlloop.policy.builder.MessageLevel;
+
+public class MessageImpl implements Message {
+
+ private String message;
+ private MessageLevel level;
+
+ public MessageImpl(String message, MessageLevel level) {
+ this.message = message;
+ this.level = level;
+ }
+
+ @Override
+ public String getMessage() {
+ return message;
+ }
+
+ @Override
+ public MessageLevel getLevel() {
+ return level;
+ }
+
+}
diff --git a/ONAP-ControlloopPolicy/src/main/java/org/onap/policy/controlloop/policy/builder/impl/ResultsImpl.java b/ONAP-ControlloopPolicy/src/main/java/org/onap/policy/controlloop/policy/builder/impl/ResultsImpl.java
new file mode 100644
index 000000000..18732f414
--- /dev/null
+++ b/ONAP-ControlloopPolicy/src/main/java/org/onap/policy/controlloop/policy/builder/impl/ResultsImpl.java
@@ -0,0 +1,55 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP Policy Engine
+ * ================================================================================
+ * Copyright (C) 2017 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.policy.builder.impl;
+
+import java.util.LinkedList;
+import java.util.List;
+
+import org.onap.policy.controlloop.policy.builder.Message;
+import org.onap.policy.controlloop.policy.builder.Results;
+
+public class ResultsImpl implements Results {
+
+ private String specification;
+ private List<Message> messages = new LinkedList<>();
+
+ @Override
+ public List<Message> getMessages() {
+ return messages;
+ }
+
+ @Override
+ public String getSpecification() {
+ return specification;
+ }
+
+ @Override
+ public boolean isValid() {
+ return this.specification != null;
+ }
+
+ public void addMessage(Message message) {
+ this.messages.add(message);
+ }
+
+ public void setSpecification(String spec) {
+ this.specification = spec;
+ }
+}