source: trunk/FACT++/scripts/CheckStates.js@ 16357

Last change on this file since 16357 was 15070, checked in by tbretz, 12 years ago
Fixed a problem with overwriting of an existing variable name in case of failure.
File size: 6.9 KB
Line 
1'use strict';
2
3/**
4 *
5 * Waits for the timeout (in ms) for the given servers to be online
6 * and in one of the provided states.
7 *
8 * Returns true if MAGIC_WEATHER is online, FTM_CONTROL is in Idle
9 * and LID_CONTROL is either in Open or Closed.
10 *
11 * Returns false if all given servers are online, but at least one is
12 * not in the expected state.
13 *
14 * Throws an exception if not all provided servers are online after
15 * the given timeout.
16 *
17 * If you want to wait infinitely: CheckStates(table, null)
18 * If the timeout is negative (e.g. -500 means 500ms) or zero,
19 * no exception is thrown but false is returned.
20 *
21 * @param table
22 *
23 * @param {Integer} [timeout=5000]
24 * timeout in milliseconds
25 *
26 * @returns
27 *
28 * @throws
29 *
30 * @example
31 * var table =
32 * [
33 * [ "MAGIC_WEATHER" ],
34 * [ "FTM_CONTROL", [ "Idle" ] ],
35 * [ "LID_CONTROL", [ "Open", "Closed" ] ],
36 * ];
37 *
38 * checkStates(table);
39 *
40 *
41 */
42function checkStates(table, timeout)
43{
44 if (timeout===undefined)
45 timeout = 5000;
46
47 var states = [];
48
49 var time = new Date();
50 while (1)
51 {
52 // Get states of all servers in question
53 states = [];
54 for (var i=0; i<table.length; i++)
55 {
56 var state = dim.state(table[i][0]);
57 states[i] = state ? state.name : undefined;
58 }
59
60 // Check if they are all valid
61 if (states.indexOf(undefined)<0)
62 {
63 // If they are all valid, check them against the
64 // state lists provided for each server
65 var rc = true;
66 for (var i=0; i<table.length; i++)
67 {
68 if (!table[i][1] || table[i][1].indexOf(states[i])>=0)
69 continue;
70
71 console.out(table[i][0]+" in ["+states[i]+"] not as it ought to be ["+table[i][1]+"]");
72 rc = false;
73 }
74
75 return rc;
76 }
77
78 if ((new Date())-time>=Math.abs(timeout))
79 break;
80
81 v8.sleep();
82 }
83
84 if (timeout<0)
85 return false;
86
87 // Create a list of all servers which do not have valid states yet
88 var servers = [];
89 for (var i=0; i<table.length; i++)
90 if (!states[i])
91 servers.push(table[i][0]);
92
93 // If all servers do not yet have valid states, it is obsolete to
94 // print all their names
95 if (servers.length==table.length && servers.length>1)
96 servers = [ "servers." ];
97
98 throw new Error("Timeout waiting for access to named states of "+servers.join(", "));
99}
100
101function checkSend(servers, timeout)
102{
103 if (timeout===undefined)
104 timeout = 5000;
105
106 var states = [];
107
108 var time = new Date();
109 while (1)
110 {
111 // Get states of all servers in question
112 states = [];
113 for (var i=0; i<servers.length; i++)
114 states[i] = dim.send(servers[i]);
115
116 // Check if they are all valid
117 if (states.indexOf(false)<0)
118 return true;
119
120 if ((new Date())-time>=Math.abs(timeout))
121 break;
122
123 v8.sleep();
124 }
125
126 if (timeout<0)
127 return false;
128
129 // Create a list of all servers which do not have valid states yet
130 var missing = [];
131 for (var i=0; i<servers.length; i++)
132 if (!states[i])
133 missing.push(servers[i]);
134
135 throw new Error("Timeout waiting for send-ready of "+missing.join(", "));
136}
137
138function Wait(server,states,timeout1,timeout2)
139{
140 if (typeof(states)=="string")
141 states = [ states ];
142
143 // If timeout2 is defined and >0 wait first for the
144 // server to come online. If it does not come online
145 // in time, an exception is thrown.
146 if (timout2>0 && CheckStates([ server ], timeout2))
147 return true;
148
149 var time = new Date();
150 while (1)
151 {
152 // If a server disconnects now while checking for the
153 // states, an exception will be thrown, too.
154 if (CheckStates([ server, states ], 0))
155 return true;
156
157 if (Date()-time>=abs(timeout1))
158 break;
159
160 v8.sleep();
161 }
162
163 if (timeout1<0)
164 throw new Error("Timeout waiting for Server "+server+" to be in ["+states+"]");
165
166 return false;
167}
168
169// Wait 5s for the FAD_CONTROL to get to the states
170// return false if FAD_CONTROL is not online
171// return false if state is not
172// Wait("FAD_CONTROL", [ "COnnected", "Disconnected" ], 5000);
173
174function dimwait(server, state, timeout)
175{
176 if (!timeout)
177 timeout = 5000;
178
179 var time = new Date();
180 while (1)
181 {
182 var s = dim.state(server);
183 if (s.index===state || s.name===state)
184 return true;
185
186 //if (s.index==undefined)
187 // throw "Server "+server+" not connected waiting for "+state+".";
188
189 if (Date()-time>=timeout)
190 break;
191
192 v8.sleep();
193 }
194
195 if (timeout>0)
196 throw new Error("Timeout waiting for ["+states+"] of "+server+".");
197
198 return false;
199
200
201 /*
202 if (!timeout)
203 timeout = 5000;
204
205 var time = new Date();
206 while (timeout<0 || new Date()-time<timeout)
207 {
208 var s = dim.state(server);
209 if (s.index===state || s.name===state)
210 return true;
211
212 if (s.index==undefined)
213 throw "Server "+server+" not connected waiting for "+state+".";
214
215 v8.sleep();
216 }
217
218 return false;
219*/
220}
221
222function Sleep(timeout)
223{
224 if (!timeout)
225 timeout = 5000;
226
227 var time = new Date();
228 while (Date()-time<timeout)
229 v8.sleep();
230}
231
232function Timer()
233{
234 this.date = new Date();
235
236 this.reset = function() { this.date = new Date(); }
237 this.print = function(id)
238 {
239 var diff = Date()-this.date;
240 if (id)
241 console.out("Time["+id+"]: "+diff+"ms");
242 else
243 console.out("Time: "+diff+"ms");
244 }
245}
246
247function WaitStates(server, states, timeout, func)
248{
249 var save = dim.onchange[server];
250
251 function inner()
252 {
253 dim.onchange[server] = function(arg)
254 {
255 if (!this.states)
256 this.states = states instanceof Array ? states : [ states ];
257
258 var comp = this.states[0];
259 if (arg.index===comp || arg.name===comp || comp=='*')
260 this.states.shift();
261
262 //console.out(JSON.stringify(arg), this.states, comp, arg.name, "");
263
264 if (save instanceof Function)
265 save();
266
267 if (this.states.length==0)
268 delete dim.onchange[server];
269
270 }
271
272 if (func instanceof Function)
273 func();
274
275 var time = new Date();
276 while (1)
277 {
278 if (!dim.onchange[server])
279 return true;
280
281 if (new Date()-time>=timeout)
282 break;
283
284 v8.sleep();
285 }
286
287 delete dim.onchange[server];
288
289 if (timeout>0)
290 throw new Error("Timeout waiting for ["+states+"] of "+server+".");
291
292 return false;
293 }
294
295 var rc = inner();
296 dim.onchang
297 e[server] = save;
298 return rc;
299}
Note: See TracBrowser for help on using the repository browser.