aboutsummaryrefslogtreecommitdiffstats
path: root/core/core-deployment/src/main/java/org/onap/policy/apex/core/deployment/BatchDeployer.java
blob: 499644fd9092d266fac9323859615a79304d21f1 (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
/*-
 * ============LICENSE_START=======================================================
 *  Copyright (C) 2016-2018 Ericsson. 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.
 *
 * SPDX-License-Identifier: Apache-2.0
 * ============LICENSE_END=========================================================
 */

package org.onap.policy.apex.core.deployment;

import java.io.IOException;
import java.util.Arrays;

import org.onap.policy.apex.model.basicmodel.concepts.ApexException;
import org.onap.policy.apex.model.basicmodel.concepts.AxArtifactKey;
import org.onap.policy.apex.model.policymodel.concepts.AxPolicyModel;
import org.slf4j.ext.XLogger;
import org.slf4j.ext.XLoggerFactory;

/**
 * The Class {@link BatchDeployer} deploys an Apex model held as an XML or Json file onto an Apex engine. It uses the
 * EngDep protocol to communicate with the engine, with the EngDep protocol being carried on Java web sockets.
 *
 * This deployer is a simple command line deployer that reads the communication parameters and the location of the Apex
 * model file as arguments.
 *
 * @author Liam Fallon (liam.fallon@ericsson.com)
 */
public class BatchDeployer {
    private static final int NUM_ARGUMENTS = 3;

    // Get a reference to the logger
    private static final XLogger LOGGER = XLoggerFactory.getXLogger(BatchDeployer.class);

    // The facade that is handling messaging to the engine service
    private EngineServiceFacade engineServiceFacade = null;

    /**
     * The main method, reads the Apex server host address, port and location of the Apex model file from the command
     * line arguments.
     *
     * @param args the arguments that specify the Apex engine and the Apex model file
     */
    public static void main(final String[] args) {
        if (args.length != NUM_ARGUMENTS) {
            LOGGER.error("invalid arguments: " + Arrays.toString(args));
            LOGGER.error("usage: Deployer <server address> <port address> <Apex Model file location>");
            return;
        }

        BatchDeployer deployer = null;
        try {
            // Use a Deployer object to handle model deployment
            deployer = new BatchDeployer(args[0], Integer.parseInt(args[1]));
            deployer.init();
            deployer.deployModel(args[2], false, false);
            deployer.startEngines();
        } catch (final ApexException | IOException e) {
            LOGGER.error("model deployment failed on parameters {}", args, e);
        } finally {
            if (deployer != null) {
                deployer.close();
            }
        }
    }

    /**
     * Instantiates a new deployer.
     *
     * @param hostName the host name of the host running the Apex Engine
     * @param port the port to use for EngDep communication with the Apex engine
     */
    public BatchDeployer(final String hostName, final int port) {
        engineServiceFacade = new EngineServiceFacade(hostName, port);
    }

    /**
     * Initializes the deployer, opens an EngDep communication session with the Apex engine.
     *
     * @throws ApexDeploymentException thrown on deployment and communication errors
     */
    public void init() throws ApexDeploymentException {
        engineServiceFacade.init();
    }

    /**
     * Close the EngDep connection to the Apex server.
     */
    public void close() {
        engineServiceFacade.close();
    }

    /**
     * Deploy an Apex model on the Apex server.
     *
     * @param modelFileName the name of the model file containing the model to deploy
     * @param ignoreConflicts true if conflicts between context in polices is to be ignored
     * @param force true if the model is to be applied even if it is incompatible with the existing model
     * @throws ApexException on Apex errors
     * @throws IOException on IO exceptions from the operating system
     */
    public void deployModel(final String modelFileName, final boolean ignoreConflicts, final boolean force)
            throws ApexException, IOException {
        engineServiceFacade.deployModel(modelFileName, ignoreConflicts, force);
    }

    /**
     * Deploy an Apex model on the Apex server.
     *
     * @param policyModel the model to deploy
     * @param ignoreConflicts true if conflicts between context in polices is to be ignored
     * @param force true if the model is to be applied even if it is incompatible with the existing model
     * @throws ApexException on Apex errors
     * @throws IOException on IO exceptions from the operating system
     */
    public void deployModel(final AxPolicyModel policyModel, final boolean ignoreConflicts, final boolean force)
            throws ApexException, IOException {
        engineServiceFacade.deployModel(policyModel, ignoreConflicts, force);
    }

    /**
     * Start the Apex engines on the engine service.
     *
     * @throws ApexDeploymentException on messaging errors
     */
    public void startEngines() throws ApexDeploymentException {
        for (final AxArtifactKey engineKey : engineServiceFacade.getEngineKeyArray()) {
            engineServiceFacade.startEngine(engineKey);
        }
    }

    /**
     * Stop the Apex engines on the engine service.
     *
     * @throws ApexDeploymentException on messaging errors
     */
    public void stopEngines() throws ApexDeploymentException {
        for (final AxArtifactKey engineKey : engineServiceFacade.getEngineKeyArray()) {
            engineServiceFacade.stopEngine(engineKey);
        }
    }
}