aboutsummaryrefslogtreecommitdiffstats
path: root/appc-oam/appc-oam-bundle/src/main/java/org/openecomp/appc/oam/processor/OamMmodeProcessor.java
blob: d0d946aed970d6e7391aca155d12d0136eaee41e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
/*-
 * ============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.processor;

import com.att.eelf.configuration.EELFLogger;
import org.openecomp.appc.exceptions.APPCException;
import org.openecomp.appc.exceptions.InvalidInputException;
import org.openecomp.appc.exceptions.InvalidStateException;
import org.openecomp.appc.i18n.Msg;
import org.openecomp.appc.oam.AppcOam;
import org.openecomp.appc.oam.OAMCommandStatus;
import org.openecomp.appc.oam.util.AsyncTaskHelper;
import org.openecomp.appc.oam.util.ConfigurationHelper;
import org.openecomp.appc.oam.util.OperationHelper;
import org.openecomp.appc.oam.util.StateHelper;
import org.openecomp.appc.requesthandler.LCMStateManager;
import org.openecomp.appc.requesthandler.RequestHandler;
import org.openecomp.appc.statemachine.impl.readers.AppcOamStates;

/**
 * Processor to handle maintenance mode OAM API.
 */
public class OamMmodeProcessor extends BaseProcessor {
    /**
     * Constructor
     *
     * @param eelfLogger          for logging
     * @param configurationHelper for property reading
     * @param stateHelper         for APP-C OAM state checking
     * @param asyncTaskHelper     for scheduling async task
     * @param operationHelper     for operational helper
     */
    public OamMmodeProcessor(EELFLogger eelfLogger,
                             ConfigurationHelper configurationHelper,
                             StateHelper stateHelper,
                             AsyncTaskHelper asyncTaskHelper,
                             OperationHelper operationHelper) {
        super(eelfLogger, configurationHelper, stateHelper, asyncTaskHelper, operationHelper);

        rpc = AppcOam.RPC.maintenance_mode;
        auditMsg = Msg.OAM_OPERATION_ENTERING_MAINTENANCE_MODE;
    }

    @Override
    protected void preProcess(final Object requestInput)
            throws InvalidInputException, InvalidStateException, APPCException {
        super.preProcess(requestInput);

        //Close the gate so that no more new LCM request will be excepted.
        LCMStateManager lcmStateManager = operationHelper.getService(LCMStateManager.class);
        lcmStateManager.disableLCMOperations();
    }

    @Override
    protected void scheduleAsyncTask() {
        runnable = new MyRunnable(this);
        super.scheduleAsyncTask();
    }

    /**
     * This runnable does the async handling for the maintenance mode REST API, and will be scheduled to run
     * until terminating condition reaches.
     *
     * <p>The runnable will conintue run if: <br>
     *   - the runnable is not canceled outside <br>
     *   - the in progress LCM request count is not zero<br>
     * <p> When LCM request count reaches to zero, this runnable will: <br>
     *     - post message through operatonHelper <br>
     *     - set APP-C OAM state to maintenance mode <br>
     *     - audit log the state <br>
     *     - terminate this runnable itself <br>
     */
    class MyRunnable extends BaseActionRunnable {
        private int inprogressRequestCount;

        MyRunnable(BaseProcessor parent) {
            super(parent);

            actionName = "OAM Maintanence mode";
            auditMsg = Msg.OAM_OPERATION_MAINTENANCE_MODE;
            finalState = AppcOamStates.MaintenanceMode;
        }

        @Override
        boolean doAction() {
            // always return true, so that we can check the LCM request count
            return true;
        }

        @Override
        boolean checkState() {
            logDebug(String.format("Executing %s task", actionName));

            if (!myParent.isSameAsyncTask()) {
                // cancel myself if I am not the current backgroundOamTask
                myParent.cancelAsyncTask();
                logDebug(String.format("Finished %s task due to task removed", actionName));
                return true;
            }

            boolean hasError = false;
            try {
                inprogressRequestCount = getInprogressLCMRequestCount();
                if (inprogressRequestCount > 0) {
                    // if there are still LCM request in progress, keep waiting
                    return false;
                }

                setStatus(OAMCommandStatus.SUCCESS);
            } catch (Throwable t) {
                setErrorStatus(t);
                hasError = true;
            }

            postAction(hasError ? AppcOamStates.Error : finalState);
            return true;
        }

        /**
         * Get in progress LCM request count through RequestHandler.
         * @return thecount of in progress LCM request
         * @throws APPCException if RequestHandler throws it.
         */
        private int getInprogressLCMRequestCount() throws APPCException {
            RequestHandler requestHandler = operationHelper.getService(RequestHandler.class);

            if (requestHandler == null) {
                return 0;
            }

            return requestHandler.getInprogressRequestCount();
        }

        @Override
        void keepWaiting() {
            logDebug("The application '%s' has '%s' outstanding LCM request to complete" +
                            " before coming to a complete maintenance_mode.",
                    configurationHelper.getAppcName(), inprogressRequestCount);
        }
    }
}