OW2 Consortium elastic-grid

Rev

Rev 469 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
27 jeje 1
/**
335 dennisreedy 2
 * Elastic Grid
530 jeje 3
 * Copyright (C) 2008-2010 Elastic Grid, LLC.
341 dennisreedy 4
 *
335 dennisreedy 5
 * This program is free software: you can redistribute it and/or modify
6
 * it under the terms of the GNU Affero General Public License as
7
 * published by the Free Software Foundation, either version 3 of the
8
 * License, or (at your option) any later version.
341 dennisreedy 9
 *
335 dennisreedy 10
 * This program is distributed in the hope that it will be useful,
11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
 * GNU Affero General Public License for more details.
341 dennisreedy 14
 *
335 dennisreedy 15
 * You should have received a copy of the GNU Affero General Public License
182 jeje 16
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
27 jeje 17
 */
18
package com.elasticgrid.tools.cli;
19
 
469 jeje 20
import com.elasticgrid.model.Cluster;
21
import com.elasticgrid.model.ClusterAlreadyRunningException;
22
import com.elasticgrid.model.Node;
23
import com.elasticgrid.model.NodeProfile;
24
import com.elasticgrid.model.NodeProfileInfo;
27 jeje 25
import org.rioproject.tools.cli.OptionHandler;
469 jeje 26
import java.io.BufferedReader;
27
import java.io.File;
28
import java.io.IOException;
29
import java.io.InputStreamReader;
30
import java.io.PrintStream;
31
import java.util.ArrayList;
32
import java.util.List;
33
import java.util.Set;
34
import java.util.StringTokenizer;
335 dennisreedy 35
 
469 jeje 36
public class StartClusterHandler extends AbstractClusterHandler implements OptionHandler {
27 jeje 37
 
38
    /**
39
     * Process the option.
40
     *
41
     * @param input Parameters for the option, may be null
42
     * @param br An optional BufferdReader, used if the option requires input.
341 dennisreedy 43
     * if this is null, the option handler may create a BufferedReader to handle
44
     * the input
45
     * @param out The PrintStream to use if the option prints results or choices
46
     * for the user. Must not be null
27 jeje 47
     * @return The result of the action.
48
     */
383 dennisreedy 49
    @SuppressWarnings("unchecked")
27 jeje 50
    public String process(String input, BufferedReader br, PrintStream out) {
357 dennisreedy 51
        File overridesDir = null;
27 jeje 52
        StringTokenizer tok = new StringTokenizer(input);
335 dennisreedy 53
        // first token is "start-cluster"
54
        tok.nextToken();
55
        // second token is cluster name
56
        String clusterName = null;
341 dennisreedy 57
        if (tok.hasMoreTokens())
335 dennisreedy 58
            clusterName = tok.nextToken();
357 dennisreedy 59
        List<NodeProfileInfo> nodeProfileInfo = new ArrayList<NodeProfileInfo>();
341 dennisreedy 60
        if (clusterName == null) {
27 jeje 61
            try {
335 dennisreedy 62
                clusterName = getClusterName(br, out);
341 dennisreedy 63
            } catch (IOException e) {
335 dennisreedy 64
                e.printStackTrace();
65
                return "unexpected parsing exception, check log";
66
            }
341 dennisreedy 67
            if (clusterName == null) {
335 dennisreedy 68
                out.println("Cluster name not provided, start-cluster cancelled");
69
                return "";
70
            }
357 dennisreedy 71
            nodeProfileInfo.addAll(interactiveClusterSetup(br, out));
341 dennisreedy 72
        } else if (!tok.hasMoreTokens()) {
357 dennisreedy 73
            nodeProfileInfo.addAll(interactiveClusterSetup(br, out));
335 dennisreedy 74
        } else {
357 dennisreedy 75
 
341 dennisreedy 76
            while (tok.hasMoreTokens()) {
335 dennisreedy 77
                String value = tok.nextToken();
341 dennisreedy 78
                if (value.startsWith("mon:")) {
79
                    if (!processOption(value.substring(4),
357 dennisreedy 80
                                       nodeProfileInfo,
341 dennisreedy 81
                                       NodeProfile.MONITOR,
82
                                       out))
335 dennisreedy 83
                        return getUsage();
84
 
341 dennisreedy 85
                } else if (value.startsWith("agent:")) {
86
                    if (!processOption(value.substring(6),
357 dennisreedy 87
                                       nodeProfileInfo,
341 dennisreedy 88
                                       NodeProfile.AGENT,
89
                                       out))
335 dennisreedy 90
                        return getUsage();
341 dennisreedy 91
                } else if (value.startsWith("monAgent:")) {
92
                    if (!processOption(value.substring(9),
357 dennisreedy 93
                                       nodeProfileInfo,
341 dennisreedy 94
                                       NodeProfile.MONITOR_AND_AGENT,
95
                                       out))
335 dennisreedy 96
                        return getUsage();
97
                } else {
357 dennisreedy 98
                    /* process overrides*/
99
                    if(value.startsWith("~")) {
100
                        value = System.getProperty("user.home")+value.substring(1);
101
                    }
102
 
103
                    overridesDir = new File(value);
104
                    if(!overridesDir.exists() || !overridesDir.isDirectory())
105
                        return ("The ["+value+"] directory does not exist, or " +
106
                                "is not a directory. Please provide a valid " +
107
                                "location for cluster configuration overrides");
108
                    /* Check for groovy override configuration files */
109
 
110
                    for(String s : overridesDir.list()) {
111
                        if(s.equals(AGENT_OVERRIDE_FILE_NAME)) {
112
                            setHasOverride(NodeProfile.AGENT, nodeProfileInfo);
113
                            setHasOverride(NodeProfile.MONITOR_AND_AGENT, nodeProfileInfo);
114
                        }
115
                        if(s.equals(MONITOR_OVERRIDE_FILE_NAME)) {
116
                            setHasOverride(NodeProfile.MONITOR, nodeProfileInfo);
117
                            setHasOverride(NodeProfile.MONITOR_AND_AGENT, nodeProfileInfo);
118
                        }
119
                    }
120
                    //out.println("Unknown option " + value);
121
                    //return getUsage();
335 dennisreedy 122
                }
123
            }
124
        }
125
 
341 dennisreedy 126
        if (clusterName.length() == 0)
335 dennisreedy 127
            return ("Cluster must have a name, start-cluster cancelled");
357 dennisreedy 128
        int numMonitors = countMonitors(nodeProfileInfo);
129
        int numAgents = countAgents(nodeProfileInfo);
130
        int numMonitorAgents = countMonitorAgents(nodeProfileInfo);
341 dennisreedy 131
        if (numMonitors > 0 || numAgents > 0 || numMonitorAgents > 0) {
335 dennisreedy 132
            try {
357 dennisreedy 133
                if(overridesDir!=null) {
134
                    uploadOverrides(overridesDir, clusterName, out);
135
                }
341 dennisreedy 136
                out.println("\nStarting cluster [" + clusterName + "] ...");
357 dennisreedy 137
                getClusterManager().startCluster(clusterName, nodeProfileInfo);
383 dennisreedy 138
                StringBuilder sb = new StringBuilder();
469 jeje 139
                sb.append("Cluster [").append(clusterName).append("] started with:");
383 dennisreedy 140
                Cluster c = getClusterManager().cluster(clusterName);
141
                Set<Node> nodes = c.getNodes();
142
                for(Node node : nodes) {
143
                    sb.append("\n");
144
                    sb.append("\t");
145
                    NodeProfile profile = node.getProfile();
146
                    if (profile.equals(NodeProfile.MONITOR)) {
147
                        sb.append("Monitor");
148
                    } else if (profile.equals(NodeProfile.MONITOR_AND_AGENT)) {
149
                        sb.append("Monitor+Agent");
150
                    } else if (profile.equals(NodeProfile.AGENT)) {
151
                        sb.append("Agent");
152
                    } else {
153
                        sb.append("Unknown");
154
                    }
469 jeje 155
                    sb.append("\t on ").append(node.getAddress());
383 dennisreedy 156
                }
157
                return sb.toString();
358 dennisreedy 158
            } catch (ClusterAlreadyRunningException e) {
159
                return "cluster already running!";
27 jeje 160
            } catch (Exception e) {
161
                e.printStackTrace(out);
118 jeje 162
                return "unexpected cluster exception";
27 jeje 163
            }
164
        } else {
341 dennisreedy 165
            return ("Cluster [" + clusterName + "] has no configured cluster " +
335 dennisreedy 166
                    "services, start-cluster cancelled");
27 jeje 167
        }
335 dennisreedy 168
 
27 jeje 169
    }
170
 
171
    /**
172
     * Get the usage of the command
173
     *
174
     * @return Command usage
175
     */
176
    public String getUsage() {
341 dennisreedy 177
        return ("usage: start-cluster [clusterName " +
178
                "[mon:count[:s|m|l|xl]] " +
179
                "[agent:count[:s|m|l|xl]] " +
357 dennisreedy 180
                "[monAgent:count[:s|m|l|xl]] [overrides-dir] ]\n");
27 jeje 181
    }
182
 
341 dennisreedy 183
    private List<NodeProfileInfo> interactiveClusterSetup(BufferedReader br,
184
                                                          PrintStream out) {
185
        List<NodeProfileInfo> list = new ArrayList<NodeProfileInfo>();
335 dennisreedy 186
        try {
341 dennisreedy 187
            if (br == null)
335 dennisreedy 188
                br = new BufferedReader(new InputStreamReader(System.in));
189
 
190
            int numMonitors =
191
                getIntegerResponse("Number of Monitors: ", br, out);
192
 
193
            String[] types = {"s", "m", "l", "xl", ""};
341 dennisreedy 194
            if (numMonitors > 0) {
335 dennisreedy 195
                String monType =
196
                    getValidResponse("Monitor Machine type [s,m,l,xl] (s): ",
197
                                     types,
198
                                     "s",
199
                                     br,
200
                                     out);
341 dennisreedy 201
                list.add(new NodeProfileInfo(NodeProfile.MONITOR,
202
                                             translateToNodeType(monType),
203
                                             numMonitors));
335 dennisreedy 204
            }
205
 
206
            int numAgents =
207
                getIntegerResponse("Number of Agents: ", br, out);
341 dennisreedy 208
            if (numAgents > 0) {
335 dennisreedy 209
                String agentType =
210
                    getValidResponse("Agent Machine type [s,m,l,xl] (s): ",
211
                                     types,
212
                                     "s",
213
                                     br,
214
                                     out);
341 dennisreedy 215
                list.add(new NodeProfileInfo(NodeProfile.AGENT,
216
                                             translateToNodeType(agentType),
217
                                             numAgents));
335 dennisreedy 218
            }
219
 
220
            int numMonAgents =
221
                getIntegerResponse("Number of Monitor Agents: ", br, out);
341 dennisreedy 222
            if (numMonAgents > 0) {
335 dennisreedy 223
                String monAgentType =
224
                    getValidResponse("Monitor Agent Machine type [s,m,l,xl] (s): ",
225
                                     types,
226
                                     "s",
227
                                     br,
228
                                     out);
341 dennisreedy 229
                list.add(new NodeProfileInfo(NodeProfile.MONITOR_AND_AGENT,
230
                                             translateToNodeType(monAgentType),
231
                                             numMonAgents));
335 dennisreedy 232
            }
233
 
341 dennisreedy 234
        } catch (IOException e) {
335 dennisreedy 235
            e.printStackTrace();
236
        }
237
 
238
        return list;
239
    }
27 jeje 240
}