aboutsummaryrefslogtreecommitdiffstats
path: root/appc-oam/appc-oam-bundle/src/main/java/org/openecomp/appc/oam/util/OperationHelper.java
diff options
context:
space:
mode:
Diffstat (limited to 'appc-oam/appc-oam-bundle/src/main/java/org/openecomp/appc/oam/util/OperationHelper.java')
-rw-r--r--appc-oam/appc-oam-bundle/src/main/java/org/openecomp/appc/oam/util/OperationHelper.java205
1 files changed, 205 insertions, 0 deletions
diff --git a/appc-oam/appc-oam-bundle/src/main/java/org/openecomp/appc/oam/util/OperationHelper.java b/appc-oam/appc-oam-bundle/src/main/java/org/openecomp/appc/oam/util/OperationHelper.java
new file mode 100644
index 000000000..0b20104f4
--- /dev/null
+++ b/appc-oam/appc-oam-bundle/src/main/java/org/openecomp/appc/oam/util/OperationHelper.java
@@ -0,0 +1,205 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP : APPC
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Copyright (C) 2017 Amdocs
+ * =============================================================================
+ * 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.
+ *
+ * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.appc.oam.util;
+
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+import org.opendaylight.yang.gen.v1.org.openecomp.appc.oam.rev170303.MaintenanceModeInput;
+import org.opendaylight.yang.gen.v1.org.openecomp.appc.oam.rev170303.RestartInput;
+import org.opendaylight.yang.gen.v1.org.openecomp.appc.oam.rev170303.StartInput;
+import org.opendaylight.yang.gen.v1.org.openecomp.appc.oam.rev170303.StopInput;
+import org.opendaylight.yang.gen.v1.org.openecomp.appc.oam.rev170303.common.header.CommonHeader;
+import org.opendaylight.yang.gen.v1.org.openecomp.appc.oam.rev170303.common.header.common.header.Flags;
+import org.opendaylight.yang.gen.v1.org.openecomp.appc.oam.rev170303.status.Status;
+import org.openecomp.appc.exceptions.APPCException;
+import org.openecomp.appc.exceptions.InvalidInputException;
+import org.openecomp.appc.exceptions.InvalidStateException;
+import org.openecomp.appc.lifecyclemanager.LifecycleManager;
+import org.openecomp.appc.lifecyclemanager.objects.LifecycleException;
+import org.openecomp.appc.lifecyclemanager.objects.NoTransitionDefinedException;
+import org.openecomp.appc.oam.AppcOam;
+import org.openecomp.appc.oam.messageadapter.MessageAdapter;
+import org.openecomp.appc.oam.messageadapter.OAMContext;
+import org.openecomp.appc.statemachine.impl.readers.AppcOamMetaDataReader;
+import org.openecomp.appc.statemachine.impl.readers.AppcOamStates;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.FrameworkUtil;
+import org.osgi.framework.ServiceReference;
+
+/**
+ * Utility class provides general operational helps.
+ */
+@SuppressWarnings("unchecked")
+public class OperationHelper {
+ final String MISSING_COMMON_HEADER_MESSAGE = "Missing common header";
+ final String MISSING_FIELD_MESSAGE = "Common header must have both originatorId and requestId";
+ final String NOT_SUPPORT_FLAG = "Flags is not supported by this operation";
+ final String NO_SERVICE_REF_FORMAT = "Using the BundleContext failed to get service reference for %s";
+
+ private final EELFLogger logger = EELFManager.getInstance().getLogger(OperationHelper.class);
+ private LifecycleManager lifecycleMgr;
+ private MessageAdapter messageAdapter;
+
+ public OperationHelper() {
+ // do nothing
+ }
+
+ /**
+ * This method is used to validate OAM REST API input due to the following ODL bugs results no validation : </tt>
+ * <p> - <a href="https://bugs.opendaylight.org/show_bug.cgi?id=8088">
+ * Bug 8088 - Mandatory attributes in RPC input are not honoured</a>
+ * <p> - <a href="https://bugs.opendaylight.org/show_bug.cgi?id=5830">
+ * Bug 5830 - Mandatory leaf enforcement is not correct with presence container</a>
+ *
+ * @param inputObject object from the OAM REST API input object
+ * @throws InvalidInputException is thrown when the commonHeader is invalid
+ */
+ public void isInputValid(final Object inputObject) throws InvalidInputException {
+ CommonHeader commonHeader = getCommonHeader(inputObject);
+ if (commonHeader == null) {
+ throw new InvalidInputException(MISSING_COMMON_HEADER_MESSAGE);
+ }
+
+ if (commonHeader.getOriginatorId() == null
+ || commonHeader.getRequestId() == null) {
+ throw new InvalidInputException(MISSING_FIELD_MESSAGE);
+ }
+
+ // check Flags
+ if (inputObject instanceof MaintenanceModeInput
+ && commonHeader.getFlags() != null) {
+ throw new InvalidInputException(NOT_SUPPORT_FLAG);
+ }
+ }
+
+ /**
+ * Get commonHead of the inputObject (expecting the inputObject of OAM REST API)
+ * @param inputObject the OAM REST API input object
+ * @return CommonHeader of the inputObject. If the inputObject is not a OAM REST API input, null is returned.
+ */
+ public CommonHeader getCommonHeader(final Object inputObject) {
+ if (inputObject instanceof StartInput) {
+ return ((StartInput)inputObject).getCommonHeader();
+ }
+ if (inputObject instanceof StopInput) {
+ return ((StopInput)inputObject).getCommonHeader();
+ }
+ if (inputObject instanceof MaintenanceModeInput) {
+ return ((MaintenanceModeInput)inputObject).getCommonHeader();
+ }
+ if (inputObject instanceof RestartInput) {
+ return ((RestartInput)inputObject).getCommonHeader();
+ }
+ return null;
+ }
+
+ public Integer getParamRequestTimeout(final Object inputObject) {
+ if (inputObject instanceof MaintenanceModeInput) {
+ // maintanence mode, we do not support request timeout
+ return 0;
+ }
+
+ CommonHeader commonHeader = getCommonHeader(inputObject);
+ if (commonHeader == null) {
+ return 0;
+ }
+
+ Flags inputFlags = commonHeader.getFlags();
+ if (inputFlags == null) {
+ return null;
+ }
+ return inputFlags.getRequestTimeout();
+ }
+ /**
+ * Get service instance using bundle context.
+ *
+ * @param _class of the expected service instance
+ * @param <T> of the expected service instance
+ * @return service instance of the expected
+ * @throws APPCException when cannot find service reference or service isntance
+ */
+ public <T> T getService(Class<T> _class) throws APPCException {
+ BundleContext bctx = FrameworkUtil.getBundle(_class).getBundleContext();
+ if (bctx != null) {
+ ServiceReference sref = bctx.getServiceReference(_class.getName());
+ if (sref != null) {
+ if (logger.isTraceEnabled()) {
+ logger.debug("Using the BundleContext got the service reference for " + _class.getName());
+ }
+ return (T) bctx.getService(sref);
+ }
+ }
+
+ throw new APPCException(String.format(NO_SERVICE_REF_FORMAT, _class.getName()));
+ }
+
+ /**
+ * Get next valid state from life cycle manager.
+ *
+ * @param operation of the AppcOperation for the state changes
+ * @param currentState of AppcOamStates
+ * @return next AppcOamStates based on the currentState and operation
+ * @throws APPCException If life cycle manager instance cannot be retrieved
+ * @throws InvalidStateException when the operation is not supported on the currentState
+ */
+ public AppcOamStates getNextState(AppcOamMetaDataReader.AppcOperation operation, AppcOamStates currentState)
+ throws APPCException, InvalidStateException {
+ if (lifecycleMgr == null) {
+ lifecycleMgr = getService(LifecycleManager.class);
+ }
+
+ try {
+ String nextState = lifecycleMgr.getNextState("APPC", currentState.name(), operation.toString());
+ if (nextState != null) {
+ return AppcOamStates.valueOf(nextState);
+ }
+ } catch (LifecycleException |NoTransitionDefinedException ex) {
+ logger.error("Invalid next state based on the current state and attempted Operation " + ex.getMessage());
+ }
+
+ throw new InvalidStateException(String.format(AppcOam.INVALID_STATE_MESSAGE_FORMAT, operation, "APPC", currentState));
+ }
+
+ /**
+ * Post notification through MessageAdapter.
+ *
+ * @param rpc of REST API RPC
+ * @param commonHeader of REST API request common header
+ * @param status of the to be post message
+ */
+ public void sendNotificationMessage(AppcOam.RPC rpc, CommonHeader commonHeader, Status status) {
+ if (messageAdapter == null) {
+ messageAdapter = new MessageAdapter();
+ messageAdapter.init();
+
+ }
+
+ OAMContext oamContext = new OAMContext();
+ oamContext.setRpcName(rpc);
+ oamContext.setCommonHeader(commonHeader);
+ oamContext.setStatus(status);
+ messageAdapter.post(oamContext);
+ }
+}