aboutsummaryrefslogtreecommitdiffstats
path: root/controlloop/common/eventmanager/src/main/java/org/onap/policy/controlloop/eventmanager/EventManagerServices.java
blob: d8668e47d9813d8429bf72d958b0dccafda1fb03 (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
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
/*-
 * ============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.controlloop.eventmanager;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.Map;
import java.util.Properties;
import lombok.Getter;
import org.onap.policy.common.parameters.ValidationResult;
import org.onap.policy.common.utils.resources.ResourceUtils;
import org.onap.policy.controlloop.actor.guard.GuardActorServiceProvider;
import org.onap.policy.controlloop.actor.guard.GuardConfig;
import org.onap.policy.controlloop.actor.guard.GuardOperation;
import org.onap.policy.controlloop.actor.guard.GuardOperator;
import org.onap.policy.controlloop.actorserviceprovider.ActorService;
import org.onap.policy.controlloop.actorserviceprovider.Util;
import org.onap.policy.controlloop.ophistory.OperationHistoryDataManager;
import org.onap.policy.controlloop.ophistory.OperationHistoryDataManagerImpl;
import org.onap.policy.controlloop.ophistory.OperationHistoryDataManagerParams;
import org.onap.policy.controlloop.ophistory.OperationHistoryDataManagerStub;
import org.onap.policy.controlloop.utils.ControlLoopUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * Services used by the ControlLoopEventManager.
 */
@Getter
public class EventManagerServices {
    public static final Logger logger = LoggerFactory.getLogger(EventManagerServices.class);
    public static final String ACTOR_SERVICE_PROPERTIES = "actor.service";
    public static final String DATA_MANAGER_PROPERTIES = "operation.history";

    public final ActorService actorService = new ActorService();

    // assume we're using a stub until proven otherwise
    public final OperationHistoryDataManager dataManager;

    /**
     * Constructs the object. Configures and starts the actor service. Initializes
     * {@link #dataManager}, to a "real" data manager, if guards are enabled.
     *
     * @param configFileName configuration file name
     */
    public EventManagerServices(String configFileName) {
        // configure and start actor services
        Properties props = startActorService(configFileName);

        if (isGuardEnabled()) {
            // guards are enabled - use a real data manager
            dataManager = makeDataManager(props);
        } else {
            // guards are disabled - use a stub data manager
            dataManager = new OperationHistoryDataManagerStub();
        }
    }

    /**
     * Configures and starts the actor service.
     *
     * @param configFileName configuration file name
     * @return the properties that were loaded from the configuration file
     */
    public Properties startActorService(String configFileName) {
        try (InputStream inpstr = openConfigFile(configFileName)) {
            Properties props = new Properties();
            props.load(inpstr);

            Map<String, Object> parameters = ControlLoopUtils.toObject(props, ACTOR_SERVICE_PROPERTIES);
            ControlLoopUtils.compressLists(parameters);

            actorService.configure(parameters);
            actorService.start();

            return props;

        } catch (RuntimeException | IOException e) {
            logger.error("cannot configure/start actor service");
            throw new IllegalStateException(e);
        }
    }

    /**
     * Opens the config file.
     *
     * @param configFileName configuration file name
     * @return the file's input stream
     * @throws FileNotFoundException if the file cannot be found
     */
    private InputStream openConfigFile(String configFileName) throws FileNotFoundException {
        InputStream inpstr = ResourceUtils.getResourceAsStream(configFileName);
        if (inpstr == null) {
            throw new FileNotFoundException(configFileName);
        }

        return inpstr;
    }

    /**
     * Determines if guards are enabled.
     *
     * @return {@code true} if guards are enabled, {@code false} otherwise
     */
    public boolean isGuardEnabled() {
        try {
            GuardOperator guard = (GuardOperator) getActorService().getActor(GuardActorServiceProvider.NAME)
                            .getOperator(GuardOperation.NAME);
            if (!guard.isConfigured()) {
                logger.warn("cannot check 'disabled' property in GUARD actor - assuming disabled");
                return false;
            }

            GuardConfig config = (GuardConfig) guard.getCurrentConfig();
            if (config.isDisabled()) {
                logger.warn("guard disabled");
                return false;
            }

            if (!guard.isAlive()) {
                logger.warn("guard actor is not running");
                return false;
            }

            return true;

        } catch (RuntimeException e) {
            logger.warn("cannot check 'disabled' property in GUARD actor - assuming disabled", e);
            return false;
        }
    }

    /**
     * Makes and starts the data manager.
     *
     * @param props properties with which to configure the data manager
     * @return a new data manager
     */
    public OperationHistoryDataManagerImpl makeDataManager(Properties props) {
        try {
            Map<String, Object> parameters = ControlLoopUtils.toObject(props, DATA_MANAGER_PROPERTIES);
            OperationHistoryDataManagerParams params = Util.translate(DATA_MANAGER_PROPERTIES, parameters,
                            OperationHistoryDataManagerParams.class);
            ValidationResult result = params.validate(DATA_MANAGER_PROPERTIES);
            if (!result.isValid()) {
                throw new IllegalArgumentException("invalid data manager properties:\n" + result.getResult());
            }

            OperationHistoryDataManagerImpl mgr = new OperationHistoryDataManagerImpl(params);
            mgr.start();

            return mgr;

        } catch (RuntimeException e) {
            logger.error("cannot start operation history data manager");
            actorService.stop();
            throw e;
        }
    }
}