appscale-tools 1.6.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (114) hide show
  1. data/LICENSE +37 -0
  2. data/README +17 -0
  3. data/bin/appscale-add-keypair +15 -0
  4. data/bin/appscale-describe-instances +16 -0
  5. data/bin/appscale-remove-app +13 -0
  6. data/bin/appscale-reset-pwd +13 -0
  7. data/bin/appscale-run-instances +15 -0
  8. data/bin/appscale-terminate-instances +14 -0
  9. data/bin/appscale-upload-app +13 -0
  10. data/doc/AdvancedNode.html +163 -0
  11. data/doc/AppControllerClient.html +831 -0
  12. data/doc/AppEngineConfigException.html +165 -0
  13. data/doc/AppScaleException.html +165 -0
  14. data/doc/AppScaleTools.html +768 -0
  15. data/doc/BadCommandLineArgException.html +166 -0
  16. data/doc/BadConfigurationException.html +166 -0
  17. data/doc/CommonFunctions.html +2559 -0
  18. data/doc/EncryptionHelper.html +332 -0
  19. data/doc/GodInterface.html +443 -0
  20. data/doc/InfrastructureException.html +166 -0
  21. data/doc/Node.html +470 -0
  22. data/doc/NodeLayout.html +1297 -0
  23. data/doc/Object.html +539 -0
  24. data/doc/ParseArgs.html +268 -0
  25. data/doc/RemoteLogging.html +268 -0
  26. data/doc/SimpleNode.html +163 -0
  27. data/doc/UsageText.html +1204 -0
  28. data/doc/UserAppClient.html +993 -0
  29. data/doc/VMTools.html +1365 -0
  30. data/doc/bin/appscale-add-keypair.html +56 -0
  31. data/doc/bin/appscale-describe-instances.html +56 -0
  32. data/doc/bin/appscale-remove-app.html +56 -0
  33. data/doc/bin/appscale-reset-pwd.html +56 -0
  34. data/doc/bin/appscale-run-instances.html +56 -0
  35. data/doc/bin/appscale-terminate-instances.html +56 -0
  36. data/doc/bin/appscale-upload-app.html +56 -0
  37. data/doc/created.rid +21 -0
  38. data/doc/images/add.png +0 -0
  39. data/doc/images/brick.png +0 -0
  40. data/doc/images/brick_link.png +0 -0
  41. data/doc/images/bug.png +0 -0
  42. data/doc/images/bullet_black.png +0 -0
  43. data/doc/images/bullet_toggle_minus.png +0 -0
  44. data/doc/images/bullet_toggle_plus.png +0 -0
  45. data/doc/images/date.png +0 -0
  46. data/doc/images/delete.png +0 -0
  47. data/doc/images/find.png +0 -0
  48. data/doc/images/loadingAnimation.gif +0 -0
  49. data/doc/images/macFFBgHack.png +0 -0
  50. data/doc/images/package.png +0 -0
  51. data/doc/images/page_green.png +0 -0
  52. data/doc/images/page_white_text.png +0 -0
  53. data/doc/images/page_white_width.png +0 -0
  54. data/doc/images/plugin.png +0 -0
  55. data/doc/images/ruby.png +0 -0
  56. data/doc/images/tag_blue.png +0 -0
  57. data/doc/images/tag_green.png +0 -0
  58. data/doc/images/transparent.png +0 -0
  59. data/doc/images/wrench.png +0 -0
  60. data/doc/images/wrench_orange.png +0 -0
  61. data/doc/images/zoom.png +0 -0
  62. data/doc/index.html +116 -0
  63. data/doc/js/darkfish.js +153 -0
  64. data/doc/js/jquery.js +18 -0
  65. data/doc/js/navigation.js +142 -0
  66. data/doc/js/quicksearch.js +114 -0
  67. data/doc/js/search.js +94 -0
  68. data/doc/js/search_index.js +1 -0
  69. data/doc/js/searcher.js +228 -0
  70. data/doc/js/thickbox-compressed.js +10 -0
  71. data/doc/lib/app_controller_client_rb.html +60 -0
  72. data/doc/lib/appscale_tools_rb.html +88 -0
  73. data/doc/lib/common_functions_rb.html +78 -0
  74. data/doc/lib/custom_exceptions_rb.html +54 -0
  75. data/doc/lib/encryption_helper_rb.html +60 -0
  76. data/doc/lib/godinterface_rb.html +52 -0
  77. data/doc/lib/node_layout_rb.html +55 -0
  78. data/doc/lib/parse_args_rb.html +58 -0
  79. data/doc/lib/remote_log_rb.html +58 -0
  80. data/doc/lib/sshcopyid.html +174 -0
  81. data/doc/lib/usage_text_rb.html +58 -0
  82. data/doc/lib/user_app_client_rb.html +62 -0
  83. data/doc/lib/vm_tools_rb.html +62 -0
  84. data/doc/table_of_contents.html +496 -0
  85. data/lib/app_controller_client.rb +181 -0
  86. data/lib/appscale_tools.rb +403 -0
  87. data/lib/common_functions.rb +1467 -0
  88. data/lib/custom_exceptions.rb +25 -0
  89. data/lib/encryption_helper.rb +86 -0
  90. data/lib/godinterface.rb +152 -0
  91. data/lib/node_layout.rb +665 -0
  92. data/lib/parse_args.rb +415 -0
  93. data/lib/remote_log.rb +46 -0
  94. data/lib/sshcopyid +65 -0
  95. data/lib/usage_text.rb +144 -0
  96. data/lib/user_app_client.rb +245 -0
  97. data/lib/vm_tools.rb +549 -0
  98. data/test/tc_app_controller_client.rb +10 -0
  99. data/test/tc_appscale_add_keypair.rb +44 -0
  100. data/test/tc_appscale_describe_instances.rb +69 -0
  101. data/test/tc_appscale_remove_app.rb +128 -0
  102. data/test/tc_appscale_reset_pwd.rb +156 -0
  103. data/test/tc_appscale_run_instances.rb +48 -0
  104. data/test/tc_appscale_terminate_instances.rb +104 -0
  105. data/test/tc_appscale_upload_app.rb +166 -0
  106. data/test/tc_common_functions.rb +56 -0
  107. data/test/tc_encryption_helper.rb +10 -0
  108. data/test/tc_god_interface.rb +10 -0
  109. data/test/tc_node_layout.rb +93 -0
  110. data/test/tc_parse_args.rb +160 -0
  111. data/test/tc_user_app_client.rb +10 -0
  112. data/test/tc_vm_tools.rb +10 -0
  113. data/test/ts_all.rb +20 -0
  114. metadata +211 -0
@@ -0,0 +1,1297 @@
1
+ <!DOCTYPE html>
2
+
3
+ <html>
4
+ <head>
5
+ <meta content="text/html; charset=UTF-8" http-equiv="Content-Type">
6
+
7
+ <title>class NodeLayout - RDoc Documentation</title>
8
+
9
+ <link type="text/css" media="screen" href="./rdoc.css" rel="stylesheet">
10
+
11
+ <script type="text/javascript">
12
+ var rdoc_rel_prefix = "./";
13
+ </script>
14
+
15
+ <script type="text/javascript" charset="utf-8" src="./js/jquery.js"></script>
16
+ <script type="text/javascript" charset="utf-8" src="./js/navigation.js"></script>
17
+ <script type="text/javascript" charset="utf-8" src="./js/search_index.js"></script>
18
+ <script type="text/javascript" charset="utf-8" src="./js/search.js"></script>
19
+ <script type="text/javascript" charset="utf-8" src="./js/searcher.js"></script>
20
+ <script type="text/javascript" charset="utf-8" src="./js/darkfish.js"></script>
21
+
22
+
23
+ <body id="top" class="class">
24
+ <nav id="metadata">
25
+ <nav id="home-section" class="section">
26
+ <h3 class="section-header">
27
+ <a href="./index.html">Home</a>
28
+ <a href="./table_of_contents.html#classes">Classes</a>
29
+ <a href="./table_of_contents.html#methods">Methods</a>
30
+ </h3>
31
+ </nav>
32
+
33
+
34
+ <nav id="search-section" class="section project-section" class="initially-hidden">
35
+ <form action="#" method="get" accept-charset="utf-8">
36
+ <h3 class="section-header">
37
+ <input type="text" name="search" placeholder="Search" id="search-field"
38
+ title="Type to search, Up and Down to navigate, Enter to load">
39
+ </h3>
40
+ </form>
41
+
42
+ <ul id="search-results" class="initially-hidden"></ul>
43
+ </nav>
44
+
45
+
46
+ <div id="file-metadata">
47
+ <nav id="file-list-section" class="section">
48
+ <h3 class="section-header">Defined In</h3>
49
+ <ul>
50
+ <li>lib/node_layout.rb
51
+ </ul>
52
+ </nav>
53
+
54
+
55
+ </div>
56
+
57
+ <div id="class-metadata">
58
+
59
+ <nav id="parent-class-section" class="section">
60
+ <h3 class="section-header">Parent</h3>
61
+
62
+ <p class="link"><a href="Object.html">Object</a>
63
+
64
+ </nav>
65
+
66
+
67
+ <!-- Method Quickref -->
68
+ <nav id="method-list-section" class="section">
69
+ <h3 class="section-header">Methods</h3>
70
+
71
+ <ul class="link-list">
72
+
73
+ <li><a href="#method-c-new">::new</a>
74
+
75
+ <li><a href="#method-i-db_master">#db_master</a>
76
+
77
+ <li><a href="#method-i-errors">#errors</a>
78
+
79
+ <li><a href="#method-i-generate_cloud_layout">#generate_cloud_layout</a>
80
+
81
+ <li><a href="#method-i-head_node">#head_node</a>
82
+
83
+ <li><a href="#method-i-is_advanced_format-3F">#is_advanced_format?</a>
84
+
85
+ <li><a href="#method-i-is_simple_format-3F">#is_simple_format?</a>
86
+
87
+ <li><a href="#method-i-login_node">#login_node</a>
88
+
89
+ <li><a href="#method-i-max_images">#max_images</a>
90
+
91
+ <li><a href="#method-i-min_images">#min_images</a>
92
+
93
+ <li><a href="#method-i-nodes">#nodes</a>
94
+
95
+ <li><a href="#method-i-other_nodes">#other_nodes</a>
96
+
97
+ <li><a href="#method-i-parse_ip">#parse_ip</a>
98
+
99
+ <li><a href="#method-i-read_factor">#read_factor</a>
100
+
101
+ <li><a href="#method-i-replication_factor">#replication_factor</a>
102
+
103
+ <li><a href="#method-i-to_hash">#to_hash</a>
104
+
105
+ <li><a href="#method-i-valid-3F">#valid?</a>
106
+
107
+ <li><a href="#method-i-valid_advanced_format-3F">#valid_advanced_format?</a>
108
+
109
+ <li><a href="#method-i-valid_database_replication-3F">#valid_database_replication?</a>
110
+
111
+ <li><a href="#method-i-valid_simple_format-3F">#valid_simple_format?</a>
112
+
113
+ <li><a href="#method-i-write_factor">#write_factor</a>
114
+
115
+ </ul>
116
+ </nav>
117
+
118
+ </div>
119
+
120
+ <div id="project-metadata">
121
+ <nav id="fileindex-section" class="section project-section">
122
+ <h3 class="section-header">Pages</h3>
123
+
124
+ <ul>
125
+
126
+ <li class="file"><a href="./lib/sshcopyid.html">sshcopyid</a>
127
+
128
+ </ul>
129
+ </nav>
130
+
131
+ <nav id="classindex-section" class="section project-section">
132
+ <h3 class="section-header">Class and Module Index</h3>
133
+
134
+ <ul class="link-list">
135
+
136
+ <li><a href="./AdvancedNode.html">AdvancedNode</a>
137
+
138
+ <li><a href="./AppControllerClient.html">AppControllerClient</a>
139
+
140
+ <li><a href="./AppEngineConfigException.html">AppEngineConfigException</a>
141
+
142
+ <li><a href="./AppScaleException.html">AppScaleException</a>
143
+
144
+ <li><a href="./AppScaleTools.html">AppScaleTools</a>
145
+
146
+ <li><a href="./BadCommandLineArgException.html">BadCommandLineArgException</a>
147
+
148
+ <li><a href="./BadConfigurationException.html">BadConfigurationException</a>
149
+
150
+ <li><a href="./CommonFunctions.html">CommonFunctions</a>
151
+
152
+ <li><a href="./EncryptionHelper.html">EncryptionHelper</a>
153
+
154
+ <li><a href="./GodInterface.html">GodInterface</a>
155
+
156
+ <li><a href="./InfrastructureException.html">InfrastructureException</a>
157
+
158
+ <li><a href="./Node.html">Node</a>
159
+
160
+ <li><a href="./NodeLayout.html">NodeLayout</a>
161
+
162
+ <li><a href="./Object.html">Object</a>
163
+
164
+ <li><a href="./ParseArgs.html">ParseArgs</a>
165
+
166
+ <li><a href="./RemoteLogging.html">RemoteLogging</a>
167
+
168
+ <li><a href="./SimpleNode.html">SimpleNode</a>
169
+
170
+ <li><a href="./UsageText.html">UsageText</a>
171
+
172
+ <li><a href="./UserAppClient.html">UserAppClient</a>
173
+
174
+ <li><a href="./VMTools.html">VMTools</a>
175
+
176
+ </ul>
177
+ </nav>
178
+
179
+ </div>
180
+ </nav>
181
+
182
+ <div id="documentation">
183
+ <h1 class="class">class NodeLayout</h1>
184
+
185
+ <div id="description" class="description">
186
+
187
+ </div><!-- description -->
188
+
189
+
190
+
191
+
192
+ <section id="5Buntitled-5D" class="documentation-section">
193
+
194
+
195
+
196
+
197
+
198
+ <!-- Constants -->
199
+ <section id="constants-list" class="section">
200
+ <h3 class="section-header">Constants</h3>
201
+ <dl>
202
+
203
+ <dt id="ADVANCED_FORMAT_KEYS">ADVANCED_FORMAT_KEYS
204
+
205
+ <dd class="description">
206
+
207
+
208
+ <dt id="SIMPLE_FORMAT_KEYS">SIMPLE_FORMAT_KEYS
209
+
210
+ <dd class="description">
211
+
212
+
213
+ </dl>
214
+ </section>
215
+
216
+
217
+
218
+
219
+ <!-- Methods -->
220
+
221
+ <section id="public-instance-5Buntitled-5D-method-details" class="method-section section">
222
+ <h3 class="section-header">Public Instance Methods</h3>
223
+
224
+
225
+ <div id="method-i-db_master" class="method-detail ">
226
+
227
+ <div class="method-heading">
228
+ <span class="method-name">db_master</span><span
229
+ class="method-args">()</span>
230
+ <span class="method-click-advice">click to toggle source</span>
231
+ </div>
232
+
233
+
234
+ <div class="method-description">
235
+
236
+
237
+
238
+
239
+
240
+ <div class="method-source-code" id="db_master-source">
241
+ <pre><span class="ruby-comment"># File lib/node_layout.rb, line 517</span>
242
+ <span class="ruby-keyword">def</span> <span class="ruby-identifier">db_master</span>
243
+ <span class="ruby-keyword">return</span> <span class="ruby-keyword">nil</span> <span class="ruby-keyword">unless</span> <span class="ruby-identifier">valid?</span>
244
+
245
+ <span class="ruby-identifier">db_master</span> = <span class="ruby-ivar">@nodes</span>.<span class="ruby-identifier">select</span> { <span class="ruby-operator">|</span><span class="ruby-identifier">n</span><span class="ruby-operator">|</span> <span class="ruby-identifier">n</span>.<span class="ruby-identifier">is_db_master?</span> }.<span class="ruby-identifier">compact</span>
246
+
247
+ <span class="ruby-identifier">db_master</span>.<span class="ruby-identifier">empty?</span> <span class="ruby-operator">?</span> <span class="ruby-keyword">nil</span> <span class="ruby-operator">:</span> <span class="ruby-identifier">db_master</span>[<span class="ruby-value">0</span>]
248
+ <span class="ruby-keyword">end</span></pre>
249
+ </div><!-- db_master-source -->
250
+
251
+ </div>
252
+
253
+
254
+
255
+
256
+ </div><!-- db_master-method -->
257
+
258
+
259
+ <div id="method-i-errors" class="method-detail ">
260
+
261
+ <div class="method-heading">
262
+ <span class="method-name">errors</span><span
263
+ class="method-args">()</span>
264
+ <span class="method-click-advice">click to toggle source</span>
265
+ </div>
266
+
267
+
268
+ <div class="method-description">
269
+
270
+
271
+
272
+
273
+
274
+ <div class="method-source-code" id="errors-source">
275
+ <pre><span class="ruby-comment"># File lib/node_layout.rb, line 56</span>
276
+ <span class="ruby-keyword">def</span> <span class="ruby-identifier">errors</span>
277
+ <span class="ruby-keyword">return</span> [] <span class="ruby-keyword">if</span> <span class="ruby-identifier">valid?</span>
278
+
279
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">is_simple_format?</span>
280
+ <span class="ruby-identifier">valid_simple_format?</span>[<span class="ruby-value">:message</span>]
281
+ <span class="ruby-keyword">elsif</span> <span class="ruby-identifier">is_advanced_format?</span>
282
+ <span class="ruby-identifier">valid_advanced_format?</span>[<span class="ruby-value">:message</span>]
283
+ <span class="ruby-keyword">elsif</span> <span class="ruby-ivar">@input_yaml</span>.<span class="ruby-identifier">nil?</span>
284
+ [<span class="ruby-constant">INPUT_YAML_REQUIRED</span>]
285
+ <span class="ruby-keyword">else</span>
286
+ <span class="ruby-identifier">keys</span> = <span class="ruby-ivar">@input_yaml</span>.<span class="ruby-identifier">keys</span>
287
+
288
+ <span class="ruby-identifier">keys</span>.<span class="ruby-identifier">each</span> { <span class="ruby-operator">|</span><span class="ruby-identifier">key</span><span class="ruby-operator">|</span>
289
+ <span class="ruby-keyword">if</span> <span class="ruby-operator">!</span>(<span class="ruby-constant">SIMPLE_FORMAT_KEYS</span>.<span class="ruby-identifier">include?</span>(<span class="ruby-identifier">key</span>) <span class="ruby-operator">||</span> <span class="ruby-constant">ADVANCED_FORMAT_KEYS</span>.<span class="ruby-identifier">include?</span>(<span class="ruby-identifier">key</span>))
290
+ <span class="ruby-keyword">return</span> [<span class="ruby-node">&quot;The flag #{key} is not a supported flag&quot;</span>]
291
+ <span class="ruby-keyword">end</span>
292
+ }
293
+
294
+ <span class="ruby-keyword">return</span> [<span class="ruby-constant">USED_SIMPLE_AND_ADVANCED_KEYS</span>]
295
+ <span class="ruby-keyword">end</span>
296
+ <span class="ruby-keyword">end</span></pre>
297
+ </div><!-- errors-source -->
298
+
299
+ </div>
300
+
301
+
302
+
303
+
304
+ </div><!-- errors-method -->
305
+
306
+
307
+ <div id="method-i-generate_cloud_layout" class="method-detail ">
308
+
309
+ <div class="method-heading">
310
+ <span class="method-name">generate_cloud_layout</span><span
311
+ class="method-args">()</span>
312
+ <span class="method-click-advice">click to toggle source</span>
313
+ </div>
314
+
315
+
316
+ <div class="method-description">
317
+
318
+ <p>Generates an yaml file for non-hybrid cloud layouts which don’t have them</p>
319
+
320
+
321
+
322
+ <div class="method-source-code" id="generate_cloud_layout-source">
323
+ <pre><span class="ruby-comment"># File lib/node_layout.rb, line 447</span>
324
+ <span class="ruby-keyword">def</span> <span class="ruby-identifier">generate_cloud_layout</span>
325
+ <span class="ruby-identifier">layout</span> = {<span class="ruby-value">:controller</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-string">&quot;node-0&quot;</span>}
326
+ <span class="ruby-identifier">servers</span> = []
327
+ <span class="ruby-identifier">num_slaves</span> = <span class="ruby-ivar">@min_images</span> <span class="ruby-operator">-</span> <span class="ruby-value">1</span>
328
+ <span class="ruby-identifier">num_slaves</span>.<span class="ruby-identifier">times</span> <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">i</span><span class="ruby-operator">|</span>
329
+ <span class="ruby-identifier">servers</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-node">&quot;node-#{i+1}&quot;</span>
330
+ <span class="ruby-keyword">end</span>
331
+
332
+ <span class="ruby-identifier">layout</span>[<span class="ruby-value">:servers</span>] = <span class="ruby-identifier">servers</span>
333
+ <span class="ruby-constant">YAML</span>.<span class="ruby-identifier">load</span>(<span class="ruby-identifier">layout</span>.<span class="ruby-identifier">to_yaml</span>)
334
+ <span class="ruby-keyword">end</span></pre>
335
+ </div><!-- generate_cloud_layout-source -->
336
+
337
+ </div>
338
+
339
+
340
+
341
+
342
+ </div><!-- generate_cloud_layout-method -->
343
+
344
+
345
+ <div id="method-i-head_node" class="method-detail ">
346
+
347
+ <div class="method-heading">
348
+ <span class="method-name">head_node</span><span
349
+ class="method-args">()</span>
350
+ <span class="method-click-advice">click to toggle source</span>
351
+ </div>
352
+
353
+
354
+ <div class="method-description">
355
+
356
+ <p>head node -&gt; shadow</p>
357
+
358
+
359
+
360
+ <div class="method-source-code" id="head_node-source">
361
+ <pre><span class="ruby-comment"># File lib/node_layout.rb, line 500</span>
362
+ <span class="ruby-keyword">def</span> <span class="ruby-identifier">head_node</span>
363
+ <span class="ruby-keyword">return</span> <span class="ruby-keyword">nil</span> <span class="ruby-keyword">unless</span> <span class="ruby-identifier">valid?</span>
364
+
365
+ <span class="ruby-identifier">head_node</span> = <span class="ruby-ivar">@nodes</span>.<span class="ruby-identifier">select</span> { <span class="ruby-operator">|</span><span class="ruby-identifier">n</span><span class="ruby-operator">|</span> <span class="ruby-identifier">n</span>.<span class="ruby-identifier">is_shadow?</span> }.<span class="ruby-identifier">compact</span>
366
+
367
+ <span class="ruby-comment"># TODO: is the last guard necessary?</span>
368
+ <span class="ruby-identifier">head_node</span>.<span class="ruby-identifier">empty?</span> <span class="ruby-operator">?</span> <span class="ruby-keyword">nil</span> <span class="ruby-operator">:</span> <span class="ruby-identifier">head_node</span>[<span class="ruby-value">0</span>]
369
+ <span class="ruby-keyword">end</span></pre>
370
+ </div><!-- head_node-source -->
371
+
372
+ </div>
373
+
374
+
375
+
376
+
377
+ </div><!-- head_node-method -->
378
+
379
+
380
+ <div id="method-i-is_advanced_format-3F" class="method-detail ">
381
+
382
+ <div class="method-heading">
383
+ <span class="method-name">is_advanced_format?</span><span
384
+ class="method-args">()</span>
385
+ <span class="method-click-advice">click to toggle source</span>
386
+ </div>
387
+
388
+
389
+ <div class="method-description">
390
+
391
+
392
+
393
+
394
+
395
+ <div class="method-source-code" id="is_advanced_format-3F-source">
396
+ <pre><span class="ruby-comment"># File lib/node_layout.rb, line 97</span>
397
+ <span class="ruby-keyword">def</span> <span class="ruby-identifier">is_advanced_format?</span>
398
+ <span class="ruby-keyword">return</span> <span class="ruby-keyword">false</span> <span class="ruby-keyword">if</span> <span class="ruby-ivar">@input_yaml</span>.<span class="ruby-identifier">nil?</span>
399
+
400
+ <span class="ruby-ivar">@input_yaml</span>.<span class="ruby-identifier">keys</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">key</span><span class="ruby-operator">|</span>
401
+ <span class="ruby-keyword">return</span> <span class="ruby-keyword">false</span> <span class="ruby-keyword">if</span> <span class="ruby-operator">!</span><span class="ruby-constant">ADVANCED_FORMAT_KEYS</span>.<span class="ruby-identifier">include?</span>(<span class="ruby-identifier">key</span>)
402
+ <span class="ruby-keyword">end</span>
403
+
404
+ <span class="ruby-keyword">true</span>
405
+ <span class="ruby-keyword">end</span></pre>
406
+ </div><!-- is_advanced_format-3F-source -->
407
+
408
+ </div>
409
+
410
+
411
+
412
+
413
+ </div><!-- is_advanced_format-3F-method -->
414
+
415
+
416
+ <div id="method-i-is_simple_format-3F" class="method-detail ">
417
+
418
+ <div class="method-heading">
419
+ <span class="method-name">is_simple_format?</span><span
420
+ class="method-args">()</span>
421
+ <span class="method-click-advice">click to toggle source</span>
422
+ </div>
423
+
424
+
425
+ <div class="method-description">
426
+
427
+
428
+
429
+
430
+
431
+ <div class="method-source-code" id="is_simple_format-3F-source">
432
+ <pre><span class="ruby-comment"># File lib/node_layout.rb, line 78</span>
433
+ <span class="ruby-keyword">def</span> <span class="ruby-identifier">is_simple_format?</span>
434
+ <span class="ruby-keyword">if</span> <span class="ruby-ivar">@input_yaml</span>.<span class="ruby-identifier">nil?</span>
435
+ <span class="ruby-keyword">if</span> <span class="ruby-constant">VALID_CLOUD_TYPES</span>.<span class="ruby-identifier">include?</span>(<span class="ruby-ivar">@infrastructure</span>) <span class="ruby-keyword">and</span> <span class="ruby-ivar">@infrastructure</span> <span class="ruby-operator">!=</span> <span class="ruby-string">&quot;hybrid&quot;</span>
436
+ <span class="ruby-comment"># When used with the cloud, the simple format doesn't require a yaml</span>
437
+ <span class="ruby-comment"># Note this is not so in the hybrid model - a yaml is required in</span>
438
+ <span class="ruby-comment"># that scenario.</span>
439
+ <span class="ruby-keyword">return</span> <span class="ruby-keyword">true</span>
440
+ <span class="ruby-keyword">else</span>
441
+ <span class="ruby-keyword">return</span> <span class="ruby-keyword">false</span>
442
+ <span class="ruby-keyword">end</span>
443
+ <span class="ruby-keyword">end</span>
444
+
445
+ <span class="ruby-ivar">@input_yaml</span>.<span class="ruby-identifier">keys</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">key</span><span class="ruby-operator">|</span>
446
+ <span class="ruby-keyword">return</span> <span class="ruby-keyword">false</span> <span class="ruby-keyword">if</span> <span class="ruby-operator">!</span><span class="ruby-constant">SIMPLE_FORMAT_KEYS</span>.<span class="ruby-identifier">include?</span>(<span class="ruby-identifier">key</span>)
447
+ <span class="ruby-keyword">end</span>
448
+
449
+ <span class="ruby-keyword">true</span>
450
+ <span class="ruby-keyword">end</span></pre>
451
+ </div><!-- is_simple_format-3F-source -->
452
+
453
+ </div>
454
+
455
+
456
+
457
+
458
+ </div><!-- is_simple_format-3F-method -->
459
+
460
+
461
+ <div id="method-i-login_node" class="method-detail ">
462
+
463
+ <div class="method-heading">
464
+ <span class="method-name">login_node</span><span
465
+ class="method-args">()</span>
466
+ <span class="method-click-advice">click to toggle source</span>
467
+ </div>
468
+
469
+
470
+ <div class="method-description">
471
+
472
+
473
+
474
+
475
+
476
+ <div class="method-source-code" id="login_node-source">
477
+ <pre><span class="ruby-comment"># File lib/node_layout.rb, line 525</span>
478
+ <span class="ruby-keyword">def</span> <span class="ruby-identifier">login_node</span>
479
+ <span class="ruby-keyword">return</span> <span class="ruby-keyword">nil</span> <span class="ruby-keyword">unless</span> <span class="ruby-identifier">valid?</span>
480
+
481
+ <span class="ruby-identifier">login</span> = <span class="ruby-ivar">@nodes</span>.<span class="ruby-identifier">select</span> { <span class="ruby-operator">|</span><span class="ruby-identifier">n</span><span class="ruby-operator">|</span> <span class="ruby-identifier">n</span>.<span class="ruby-identifier">is_login?</span> }.<span class="ruby-identifier">compact</span>
482
+
483
+ <span class="ruby-identifier">login</span>.<span class="ruby-identifier">empty?</span> <span class="ruby-operator">?</span> <span class="ruby-keyword">nil</span> <span class="ruby-operator">:</span> <span class="ruby-identifier">login</span>[<span class="ruby-value">0</span>]
484
+ <span class="ruby-keyword">end</span></pre>
485
+ </div><!-- login_node-source -->
486
+
487
+ </div>
488
+
489
+
490
+
491
+
492
+ </div><!-- login_node-method -->
493
+
494
+
495
+ <div id="method-i-max_images" class="method-detail ">
496
+
497
+ <div class="method-heading">
498
+ <span class="method-name">max_images</span><span
499
+ class="method-args">()</span>
500
+ <span class="method-click-advice">click to toggle source</span>
501
+ </div>
502
+
503
+
504
+ <div class="method-description">
505
+
506
+
507
+
508
+
509
+
510
+ <div class="method-source-code" id="max_images-source">
511
+ <pre><span class="ruby-comment"># File lib/node_layout.rb, line 486</span>
512
+ <span class="ruby-keyword">def</span> <span class="ruby-identifier">max_images</span>
513
+ <span class="ruby-keyword">return</span> <span class="ruby-keyword">nil</span> <span class="ruby-keyword">unless</span> <span class="ruby-identifier">valid?</span>
514
+
515
+ <span class="ruby-ivar">@max_images</span>
516
+ <span class="ruby-keyword">end</span></pre>
517
+ </div><!-- max_images-source -->
518
+
519
+ </div>
520
+
521
+
522
+
523
+
524
+ </div><!-- max_images-method -->
525
+
526
+
527
+ <div id="method-i-min_images" class="method-detail ">
528
+
529
+ <div class="method-heading">
530
+ <span class="method-name">min_images</span><span
531
+ class="method-args">()</span>
532
+ <span class="method-click-advice">click to toggle source</span>
533
+ </div>
534
+
535
+
536
+ <div class="method-description">
537
+
538
+
539
+
540
+
541
+
542
+ <div class="method-source-code" id="min_images-source">
543
+ <pre><span class="ruby-comment"># File lib/node_layout.rb, line 480</span>
544
+ <span class="ruby-keyword">def</span> <span class="ruby-identifier">min_images</span>
545
+ <span class="ruby-keyword">return</span> <span class="ruby-keyword">nil</span> <span class="ruby-keyword">unless</span> <span class="ruby-identifier">valid?</span>
546
+
547
+ <span class="ruby-ivar">@min_images</span>
548
+ <span class="ruby-keyword">end</span></pre>
549
+ </div><!-- min_images-source -->
550
+
551
+ </div>
552
+
553
+
554
+
555
+
556
+ </div><!-- min_images-method -->
557
+
558
+
559
+ <div id="method-i-nodes" class="method-detail ">
560
+
561
+ <div class="method-heading">
562
+ <span class="method-name">nodes</span><span
563
+ class="method-args">()</span>
564
+ <span class="method-click-advice">click to toggle source</span>
565
+ </div>
566
+
567
+
568
+ <div class="method-description">
569
+
570
+
571
+
572
+
573
+
574
+ <div class="method-source-code" id="nodes-source">
575
+ <pre><span class="ruby-comment"># File lib/node_layout.rb, line 492</span>
576
+ <span class="ruby-keyword">def</span> <span class="ruby-identifier">nodes</span>
577
+ <span class="ruby-keyword">return</span> [] <span class="ruby-keyword">unless</span> <span class="ruby-identifier">valid?</span>
578
+
579
+ <span class="ruby-comment"># Since the valid? check has succeded @nodes has been initialized</span>
580
+ <span class="ruby-ivar">@nodes</span>
581
+ <span class="ruby-keyword">end</span></pre>
582
+ </div><!-- nodes-source -->
583
+
584
+ </div>
585
+
586
+
587
+
588
+
589
+ </div><!-- nodes-method -->
590
+
591
+
592
+ <div id="method-i-other_nodes" class="method-detail ">
593
+
594
+ <div class="method-heading">
595
+ <span class="method-name">other_nodes</span><span
596
+ class="method-args">()</span>
597
+ <span class="method-click-advice">click to toggle source</span>
598
+ </div>
599
+
600
+
601
+ <div class="method-description">
602
+
603
+
604
+
605
+
606
+
607
+ <div class="method-source-code" id="other_nodes-source">
608
+ <pre><span class="ruby-comment"># File lib/node_layout.rb, line 509</span>
609
+ <span class="ruby-keyword">def</span> <span class="ruby-identifier">other_nodes</span>
610
+ <span class="ruby-keyword">return</span> [] <span class="ruby-keyword">unless</span> <span class="ruby-identifier">valid?</span>
611
+
612
+ <span class="ruby-identifier">other_nodes</span> = <span class="ruby-ivar">@nodes</span>.<span class="ruby-identifier">select</span> { <span class="ruby-operator">|</span><span class="ruby-identifier">n</span><span class="ruby-operator">|</span> <span class="ruby-operator">!</span><span class="ruby-identifier">n</span>.<span class="ruby-identifier">is_shadow?</span> }.<span class="ruby-identifier">compact</span>
613
+
614
+ <span class="ruby-identifier">other_nodes</span>.<span class="ruby-identifier">empty?</span> <span class="ruby-operator">?</span> [] <span class="ruby-operator">:</span> <span class="ruby-identifier">other_nodes</span>
615
+ <span class="ruby-keyword">end</span></pre>
616
+ </div><!-- other_nodes-source -->
617
+
618
+ </div>
619
+
620
+
621
+
622
+
623
+ </div><!-- other_nodes-method -->
624
+
625
+
626
+ <div id="method-i-parse_ip" class="method-detail ">
627
+
628
+ <div class="method-heading">
629
+ <span class="method-name">parse_ip</span><span
630
+ class="method-args">(ip)</span>
631
+ <span class="method-click-advice">click to toggle source</span>
632
+ </div>
633
+
634
+
635
+ <div class="method-description">
636
+
637
+
638
+
639
+
640
+
641
+ <div class="method-source-code" id="parse_ip-source">
642
+ <pre><span class="ruby-comment"># File lib/node_layout.rb, line 107</span>
643
+ <span class="ruby-keyword">def</span> <span class="ruby-identifier">parse_ip</span>(<span class="ruby-identifier">ip</span>)
644
+ <span class="ruby-identifier">id</span>, <span class="ruby-identifier">cloud</span> = <span class="ruby-keyword">nil</span>, <span class="ruby-keyword">nil</span>
645
+
646
+ <span class="ruby-identifier">match</span> = <span class="ruby-constant">NODE_ID_REGEX</span>.<span class="ruby-identifier">match</span>(<span class="ruby-identifier">ip</span>)
647
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">match</span>.<span class="ruby-identifier">nil?</span>
648
+ <span class="ruby-identifier">id</span> = <span class="ruby-identifier">ip</span>
649
+ <span class="ruby-identifier">cloud</span> = <span class="ruby-string">&quot;not-cloud&quot;</span>
650
+ <span class="ruby-keyword">else</span>
651
+ <span class="ruby-identifier">id</span> = <span class="ruby-identifier">match</span>[<span class="ruby-value">0</span>]
652
+ <span class="ruby-identifier">cloud</span> = <span class="ruby-identifier">match</span>[<span class="ruby-value">1</span>]
653
+ <span class="ruby-keyword">end</span>
654
+
655
+ <span class="ruby-keyword">return</span> <span class="ruby-identifier">id</span>, <span class="ruby-identifier">cloud</span>
656
+ <span class="ruby-keyword">end</span></pre>
657
+ </div><!-- parse_ip-source -->
658
+
659
+ </div>
660
+
661
+
662
+
663
+
664
+ </div><!-- parse_ip-method -->
665
+
666
+
667
+ <div id="method-i-read_factor" class="method-detail ">
668
+
669
+ <div class="method-heading">
670
+ <span class="method-name">read_factor</span><span
671
+ class="method-args">()</span>
672
+ <span class="method-click-advice">click to toggle source</span>
673
+ </div>
674
+
675
+
676
+ <div class="method-description">
677
+
678
+ <p>TODO: can we just replace the if w/ unless and change ! to = ? or does that
679
+ not exactly work due to the || ?</p>
680
+
681
+
682
+
683
+ <div class="method-source-code" id="read_factor-source">
684
+ <pre><span class="ruby-comment"># File lib/node_layout.rb, line 468</span>
685
+ <span class="ruby-keyword">def</span> <span class="ruby-identifier">read_factor</span>
686
+ <span class="ruby-keyword">return</span> <span class="ruby-keyword">nil</span> <span class="ruby-keyword">if</span> <span class="ruby-operator">!</span><span class="ruby-identifier">valid?</span> <span class="ruby-operator">||</span> <span class="ruby-ivar">@database_type</span> <span class="ruby-operator">!=</span> <span class="ruby-value">:voldemort</span>
687
+
688
+ <span class="ruby-ivar">@read_factor</span>
689
+ <span class="ruby-keyword">end</span></pre>
690
+ </div><!-- read_factor-source -->
691
+
692
+ </div>
693
+
694
+
695
+
696
+
697
+ </div><!-- read_factor-method -->
698
+
699
+
700
+ <div id="method-i-replication_factor" class="method-detail ">
701
+
702
+ <div class="method-heading">
703
+ <span class="method-name">replication_factor</span><span
704
+ class="method-args">()</span>
705
+ <span class="method-click-advice">click to toggle source</span>
706
+ </div>
707
+
708
+
709
+ <div class="method-description">
710
+
711
+
712
+
713
+
714
+
715
+ <div class="method-source-code" id="replication_factor-source">
716
+ <pre><span class="ruby-comment"># File lib/node_layout.rb, line 459</span>
717
+ <span class="ruby-keyword">def</span> <span class="ruby-identifier">replication_factor</span>
718
+ <span class="ruby-keyword">return</span> <span class="ruby-keyword">nil</span> <span class="ruby-keyword">unless</span> <span class="ruby-identifier">valid?</span>
719
+
720
+ <span class="ruby-ivar">@replication</span>
721
+ <span class="ruby-keyword">end</span></pre>
722
+ </div><!-- replication_factor-source -->
723
+
724
+ </div>
725
+
726
+
727
+
728
+
729
+ </div><!-- replication_factor-method -->
730
+
731
+
732
+ <div id="method-i-to_hash" class="method-detail ">
733
+
734
+ <div class="method-heading">
735
+ <span class="method-name">to_hash</span><span
736
+ class="method-args">()</span>
737
+ <span class="method-click-advice">click to toggle source</span>
738
+ </div>
739
+
740
+
741
+ <div class="method-description">
742
+
743
+
744
+
745
+
746
+
747
+ <div class="method-source-code" id="to_hash-source">
748
+ <pre><span class="ruby-comment"># File lib/node_layout.rb, line 534</span>
749
+ <span class="ruby-keyword">def</span> <span class="ruby-identifier">to_hash</span>
750
+ <span class="ruby-identifier">result</span> = {}
751
+ <span class="ruby-comment"># Put all nodes except the head node in the hash</span>
752
+ <span class="ruby-identifier">other_nodes</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">node</span><span class="ruby-operator">|</span>
753
+ <span class="ruby-identifier">result</span>[<span class="ruby-identifier">node</span>.<span class="ruby-identifier">id</span>] = <span class="ruby-identifier">node</span>.<span class="ruby-identifier">roles</span>.<span class="ruby-identifier">join</span>(<span class="ruby-string">&quot;:&quot;</span>)
754
+ <span class="ruby-keyword">end</span>
755
+ <span class="ruby-identifier">result</span>
756
+ <span class="ruby-keyword">end</span></pre>
757
+ </div><!-- to_hash-source -->
758
+
759
+ </div>
760
+
761
+
762
+
763
+
764
+ </div><!-- to_hash-method -->
765
+
766
+
767
+ <div id="method-i-valid-3F" class="method-detail ">
768
+
769
+ <div class="method-heading">
770
+ <span class="method-name">valid?</span><span
771
+ class="method-args">()</span>
772
+ <span class="method-click-advice">click to toggle source</span>
773
+ </div>
774
+
775
+
776
+ <div class="method-description">
777
+
778
+
779
+
780
+
781
+
782
+ <div class="method-source-code" id="valid-3F-source">
783
+ <pre><span class="ruby-comment"># File lib/node_layout.rb, line 46</span>
784
+ <span class="ruby-keyword">def</span> <span class="ruby-identifier">valid?</span>
785
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">is_simple_format?</span>
786
+ <span class="ruby-identifier">valid_simple_format?</span>[<span class="ruby-value">:result</span>]
787
+ <span class="ruby-keyword">elsif</span> <span class="ruby-identifier">is_advanced_format?</span>
788
+ <span class="ruby-identifier">valid_advanced_format?</span>[<span class="ruby-value">:result</span>]
789
+ <span class="ruby-keyword">else</span>
790
+ <span class="ruby-keyword">false</span>
791
+ <span class="ruby-keyword">end</span>
792
+ <span class="ruby-keyword">end</span></pre>
793
+ </div><!-- valid-3F-source -->
794
+
795
+ </div>
796
+
797
+
798
+
799
+
800
+ </div><!-- valid-3F-method -->
801
+
802
+
803
+ <div id="method-i-valid_advanced_format-3F" class="method-detail ">
804
+
805
+ <div class="method-heading">
806
+ <span class="method-name">valid_advanced_format?</span><span
807
+ class="method-args">()</span>
808
+ <span class="method-click-advice">click to toggle source</span>
809
+ </div>
810
+
811
+
812
+ <div class="method-description">
813
+
814
+
815
+
816
+
817
+
818
+ <div class="method-source-code" id="valid_advanced_format-3F-source">
819
+ <pre><span class="ruby-comment"># File lib/node_layout.rb, line 227</span>
820
+ <span class="ruby-keyword">def</span> <span class="ruby-identifier">valid_advanced_format?</span>
821
+ <span class="ruby-comment"># We already computed the nodes, its valid</span>
822
+ <span class="ruby-keyword">return</span> <span class="ruby-identifier">valid</span> <span class="ruby-keyword">if</span> <span class="ruby-operator">!</span><span class="ruby-ivar">@nodes</span>.<span class="ruby-identifier">empty?</span>
823
+
824
+ <span class="ruby-identifier">node_hash</span> = {}
825
+ <span class="ruby-ivar">@input_yaml</span>.<span class="ruby-identifier">each_pair</span> <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">role</span>, <span class="ruby-identifier">ips</span><span class="ruby-operator">|</span>
826
+
827
+ <span class="ruby-identifier">ips</span>.<span class="ruby-identifier">each_with_index</span> <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">ip</span>, <span class="ruby-identifier">index</span><span class="ruby-operator">|</span>
828
+ <span class="ruby-identifier">node</span> = <span class="ruby-keyword">nil</span>
829
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">node_hash</span>[<span class="ruby-identifier">ip</span>].<span class="ruby-identifier">nil?</span>
830
+ <span class="ruby-identifier">id</span>, <span class="ruby-identifier">cloud</span> = <span class="ruby-identifier">parse_ip</span>(<span class="ruby-identifier">ip</span>)
831
+ <span class="ruby-identifier">node</span> = <span class="ruby-constant">AdvancedNode</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">id</span>, <span class="ruby-identifier">cloud</span>)
832
+ <span class="ruby-keyword">else</span>
833
+ <span class="ruby-identifier">node</span> = <span class="ruby-identifier">node_hash</span>[<span class="ruby-identifier">ip</span>]
834
+ <span class="ruby-keyword">end</span>
835
+
836
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">role</span>.<span class="ruby-identifier">to_sym</span> <span class="ruby-operator">==</span> <span class="ruby-value">:database</span>
837
+ <span class="ruby-comment"># The first database node is the master</span>
838
+ <span class="ruby-identifier">is_master</span> = <span class="ruby-identifier">index</span>.<span class="ruby-identifier">zero?</span>
839
+ <span class="ruby-identifier">node</span>.<span class="ruby-identifier">add_db_role</span> <span class="ruby-ivar">@database_type</span>, <span class="ruby-identifier">is_master</span>
840
+ <span class="ruby-keyword">elsif</span> <span class="ruby-identifier">role</span>.<span class="ruby-identifier">to_sym</span> <span class="ruby-operator">==</span> <span class="ruby-value">:db_master</span>
841
+ <span class="ruby-identifier">node</span>.<span class="ruby-identifier">add_role</span> <span class="ruby-value">:zookeeper</span>
842
+ <span class="ruby-identifier">node</span>.<span class="ruby-identifier">add_role</span> <span class="ruby-identifier">role</span>
843
+ <span class="ruby-keyword">elsif</span> <span class="ruby-identifier">role</span>.<span class="ruby-identifier">to_sym</span> <span class="ruby-operator">==</span> <span class="ruby-value">:rabbitmq</span>
844
+ <span class="ruby-comment"># Like the database, the first rabbitmq node is the master</span>
845
+ <span class="ruby-identifier">is_master</span> = <span class="ruby-identifier">index</span>.<span class="ruby-identifier">zero?</span>
846
+ <span class="ruby-identifier">node</span>.<span class="ruby-identifier">add_role</span> <span class="ruby-value">:rabbitmq</span>
847
+ <span class="ruby-identifier">node</span>.<span class="ruby-identifier">add_rabbitmq_role</span> <span class="ruby-identifier">is_master</span>
848
+ <span class="ruby-keyword">else</span>
849
+ <span class="ruby-identifier">node</span>.<span class="ruby-identifier">add_role</span> <span class="ruby-identifier">role</span>
850
+ <span class="ruby-keyword">end</span>
851
+
852
+ <span class="ruby-identifier">node_hash</span>[<span class="ruby-identifier">ip</span>] = <span class="ruby-identifier">node</span>
853
+ <span class="ruby-keyword">end</span>
854
+ <span class="ruby-keyword">end</span>
855
+
856
+ <span class="ruby-comment"># Dont need the hash any more, make a nodes list</span>
857
+ <span class="ruby-identifier">nodes</span> = <span class="ruby-identifier">node_hash</span>.<span class="ruby-identifier">values</span>
858
+
859
+ <span class="ruby-identifier">nodes</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">node</span><span class="ruby-operator">|</span>
860
+ <span class="ruby-keyword">return</span> <span class="ruby-identifier">invalid</span>(<span class="ruby-identifier">node</span>.<span class="ruby-identifier">errors</span>.<span class="ruby-identifier">join</span>(<span class="ruby-string">&quot;,&quot;</span>)) <span class="ruby-keyword">unless</span> <span class="ruby-identifier">node</span>.<span class="ruby-identifier">valid?</span>
861
+
862
+ <span class="ruby-keyword">if</span> <span class="ruby-constant">VALID_CLOUD_TYPES</span>.<span class="ruby-identifier">include?</span>(<span class="ruby-ivar">@infrastructure</span>)
863
+ <span class="ruby-identifier">error_message</span> = <span class="ruby-node">&quot;Invalid cloud node ID: #{node.id} \n&quot;</span> <span class="ruby-operator">+</span>
864
+ <span class="ruby-string">&quot;Cloud node ID must be in the format 'node-{IDNUMBER}'&quot;</span> <span class="ruby-operator">+</span>
865
+ <span class="ruby-string">&quot;\nor of the form cloud{CLOUDNUMBER}-{IDNUMBER} for hybrid deployments&quot;</span>
866
+ <span class="ruby-keyword">return</span> <span class="ruby-identifier">invalid</span>(<span class="ruby-identifier">error_message</span>) <span class="ruby-keyword">if</span> <span class="ruby-constant">NODE_ID_REGEX</span>.<span class="ruby-identifier">match</span>(<span class="ruby-identifier">node</span>.<span class="ruby-identifier">id</span>.<span class="ruby-identifier">to_s</span>).<span class="ruby-identifier">nil?</span>
867
+ <span class="ruby-keyword">else</span>
868
+ <span class="ruby-comment"># Xen/KVM should be using the ip address as the node id</span>
869
+ <span class="ruby-identifier">error_message</span> = <span class="ruby-node">&quot;Invalid virtualized node ID: #{node.id} \n&quot;</span> <span class="ruby-operator">+</span>
870
+ <span class="ruby-string">&quot;Virtualized node IDs must be a valid IP address&quot;</span>
871
+ <span class="ruby-keyword">return</span> <span class="ruby-identifier">invalid</span>(<span class="ruby-identifier">error_message</span>) <span class="ruby-keyword">if</span> <span class="ruby-constant">IP_REGEX</span>.<span class="ruby-identifier">match</span>(<span class="ruby-identifier">node</span>.<span class="ruby-identifier">id</span>.<span class="ruby-identifier">to_s</span>).<span class="ruby-identifier">nil?</span>
872
+ <span class="ruby-keyword">end</span>
873
+ <span class="ruby-keyword">end</span>
874
+
875
+ <span class="ruby-identifier">master_nodes</span> = <span class="ruby-identifier">nodes</span>.<span class="ruby-identifier">select</span> { <span class="ruby-operator">|</span><span class="ruby-identifier">node</span><span class="ruby-operator">|</span> <span class="ruby-identifier">node</span>.<span class="ruby-identifier">is_shadow?</span> }.<span class="ruby-identifier">compact</span>
876
+
877
+ <span class="ruby-comment"># need exactly one master</span>
878
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">master_nodes</span>.<span class="ruby-identifier">length</span> <span class="ruby-operator">==</span> <span class="ruby-value">0</span>
879
+ <span class="ruby-keyword">return</span> <span class="ruby-identifier">invalid</span>(<span class="ruby-string">&quot;No master was specified&quot;</span>)
880
+ <span class="ruby-keyword">elsif</span> <span class="ruby-identifier">master_nodes</span>.<span class="ruby-identifier">length</span> <span class="ruby-operator">&gt;</span> <span class="ruby-value">1</span>
881
+ <span class="ruby-keyword">return</span> <span class="ruby-identifier">invalid</span>(<span class="ruby-string">&quot;Only one master is allowed&quot;</span>)
882
+ <span class="ruby-keyword">end</span>
883
+
884
+ <span class="ruby-identifier">master_node</span> = <span class="ruby-identifier">master_nodes</span>.<span class="ruby-identifier">first</span>
885
+
886
+ <span class="ruby-identifier">login_node</span> = <span class="ruby-identifier">nodes</span>.<span class="ruby-identifier">select</span> { <span class="ruby-operator">|</span><span class="ruby-identifier">node</span><span class="ruby-operator">|</span> <span class="ruby-identifier">node</span>.<span class="ruby-identifier">is_login?</span> }.<span class="ruby-identifier">compact</span>
887
+ <span class="ruby-comment"># If a login node was not specified, make the master into the login node</span>
888
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">login_node</span>.<span class="ruby-identifier">empty?</span>
889
+ <span class="ruby-identifier">master_node</span>.<span class="ruby-identifier">add_role</span> <span class="ruby-value">:login</span>
890
+ <span class="ruby-keyword">end</span>
891
+
892
+ <span class="ruby-identifier">appengine_count</span> = <span class="ruby-value">0</span>
893
+ <span class="ruby-identifier">nodes</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">node</span><span class="ruby-operator">|</span>
894
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">node</span>.<span class="ruby-identifier">is_appengine?</span>
895
+ <span class="ruby-identifier">appengine_count</span> <span class="ruby-operator">+=</span> <span class="ruby-value">1</span>
896
+ <span class="ruby-keyword">end</span>
897
+ <span class="ruby-keyword">end</span>
898
+
899
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">appengine_count</span> <span class="ruby-operator">&lt;</span> <span class="ruby-value">1</span>
900
+ <span class="ruby-keyword">return</span> <span class="ruby-identifier">invalid</span>(<span class="ruby-string">&quot;Not enough appengine nodes were provided.&quot;</span>)
901
+ <span class="ruby-keyword">end</span>
902
+
903
+ <span class="ruby-identifier">memcache_count</span> = <span class="ruby-value">0</span>
904
+ <span class="ruby-identifier">nodes</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">node</span><span class="ruby-operator">|</span>
905
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">node</span>.<span class="ruby-identifier">is_memcache?</span>
906
+ <span class="ruby-identifier">memcache_count</span> <span class="ruby-operator">+=</span> <span class="ruby-value">1</span>
907
+ <span class="ruby-keyword">end</span>
908
+ <span class="ruby-keyword">end</span>
909
+
910
+ <span class="ruby-comment"># if no memcache nodes were specified, make all appengine nodes</span>
911
+ <span class="ruby-comment"># into memcache nodes</span>
912
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">memcache_count</span> <span class="ruby-operator">&lt;</span> <span class="ruby-value">1</span>
913
+ <span class="ruby-identifier">nodes</span>.<span class="ruby-identifier">each</span> { <span class="ruby-operator">|</span><span class="ruby-identifier">node</span><span class="ruby-operator">|</span>
914
+ <span class="ruby-identifier">node</span>.<span class="ruby-identifier">add_role</span> <span class="ruby-value">:memcache</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">node</span>.<span class="ruby-identifier">is_appengine?</span>
915
+ }
916
+ <span class="ruby-keyword">end</span>
917
+
918
+ <span class="ruby-keyword">if</span> <span class="ruby-constant">VALID_CLOUD_TYPES</span>.<span class="ruby-identifier">include?</span>(<span class="ruby-ivar">@infrastructure</span>)
919
+ <span class="ruby-comment"># If min and max aren't specified, they default to the number of nodes in the system</span>
920
+ <span class="ruby-ivar">@min_images</span> <span class="ruby-operator">||=</span> <span class="ruby-identifier">nodes</span>.<span class="ruby-identifier">length</span>
921
+ <span class="ruby-ivar">@max_images</span> <span class="ruby-operator">||=</span> <span class="ruby-identifier">nodes</span>.<span class="ruby-identifier">length</span>
922
+
923
+ <span class="ruby-comment"># TODO: look into if that first guard is really necessary with the preceding lines</span>
924
+
925
+ <span class="ruby-keyword">if</span> <span class="ruby-ivar">@min_images</span> <span class="ruby-operator">&amp;&amp;</span> <span class="ruby-identifier">nodes</span>.<span class="ruby-identifier">length</span> <span class="ruby-operator">&lt;</span> <span class="ruby-ivar">@min_images</span>
926
+ <span class="ruby-keyword">return</span> <span class="ruby-identifier">invalid</span>(<span class="ruby-node">&quot;Too few nodes were provided, #{nodes.length} were specified but #{@min_images} was the minimum&quot;</span>)
927
+ <span class="ruby-keyword">end</span>
928
+
929
+ <span class="ruby-keyword">if</span> <span class="ruby-ivar">@max_images</span> <span class="ruby-operator">&amp;&amp;</span> <span class="ruby-identifier">nodes</span>.<span class="ruby-identifier">length</span> <span class="ruby-operator">&gt;</span> <span class="ruby-ivar">@max_images</span>
930
+ <span class="ruby-keyword">return</span> <span class="ruby-identifier">invalid</span>(<span class="ruby-node">&quot;Too many nodes were provided, #{nodes.length} were specified but #{@max_images} was the maximum&quot;</span>)
931
+ <span class="ruby-keyword">end</span>
932
+ <span class="ruby-keyword">end</span>
933
+
934
+ <span class="ruby-identifier">zookeeper_count</span> = <span class="ruby-value">0</span>
935
+ <span class="ruby-identifier">nodes</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">node</span><span class="ruby-operator">|</span>
936
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">node</span>.<span class="ruby-identifier">is_zookeeper?</span>
937
+ <span class="ruby-identifier">zookeeper_count</span> <span class="ruby-operator">+=</span> <span class="ruby-value">1</span>
938
+ <span class="ruby-keyword">end</span>
939
+ <span class="ruby-keyword">end</span>
940
+ <span class="ruby-identifier">master_node</span>.<span class="ruby-identifier">add_role</span> <span class="ruby-value">:zookeeper</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">zookeeper_count</span>.<span class="ruby-identifier">zero?</span>
941
+
942
+ <span class="ruby-comment"># If no rabbitmq nodes are specified, make the shadow the rabbitmq_master</span>
943
+ <span class="ruby-identifier">rabbitmq_count</span> = <span class="ruby-value">0</span>
944
+ <span class="ruby-identifier">nodes</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">node</span><span class="ruby-operator">|</span>
945
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">node</span>.<span class="ruby-identifier">is_rabbitmq?</span>
946
+ <span class="ruby-identifier">rabbitmq_count</span> <span class="ruby-operator">+=</span> <span class="ruby-value">1</span>
947
+ <span class="ruby-keyword">end</span>
948
+ <span class="ruby-keyword">end</span>
949
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">rabbitmq_count</span>.<span class="ruby-identifier">zero?</span>
950
+ <span class="ruby-identifier">master_node</span>.<span class="ruby-identifier">add_role</span> <span class="ruby-value">:rabbitmq</span>
951
+ <span class="ruby-identifier">master_node</span>.<span class="ruby-identifier">add_role</span> <span class="ruby-value">:rabbitmq_master</span>
952
+ <span class="ruby-keyword">end</span>
953
+
954
+ <span class="ruby-comment"># Any node that runs appengine needs rabbitmq to dispatch task requests to</span>
955
+ <span class="ruby-comment"># It's safe to add the slave role since we ensure above that somebody</span>
956
+ <span class="ruby-comment"># already has the master role</span>
957
+ <span class="ruby-identifier">nodes</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">node</span><span class="ruby-operator">|</span>
958
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">node</span>.<span class="ruby-identifier">is_appengine?</span> <span class="ruby-keyword">and</span> <span class="ruby-operator">!</span><span class="ruby-identifier">node</span>.<span class="ruby-identifier">is_rabbitmq?</span>
959
+ <span class="ruby-identifier">node</span>.<span class="ruby-identifier">add_role</span> <span class="ruby-value">:rabbitmq_slave</span>
960
+ <span class="ruby-keyword">end</span>
961
+ <span class="ruby-keyword">end</span>
962
+
963
+ <span class="ruby-identifier">database_count</span> = <span class="ruby-value">0</span>
964
+ <span class="ruby-identifier">nodes</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">node</span><span class="ruby-operator">|</span>
965
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">node</span>.<span class="ruby-identifier">is_database?</span>
966
+ <span class="ruby-identifier">database_count</span> <span class="ruby-operator">+=</span> <span class="ruby-value">1</span>
967
+ <span class="ruby-keyword">end</span>
968
+ <span class="ruby-keyword">end</span>
969
+
970
+ <span class="ruby-keyword">if</span> <span class="ruby-ivar">@skip_replication</span>
971
+ <span class="ruby-ivar">@nodes</span> = <span class="ruby-identifier">nodes</span>
972
+ <span class="ruby-keyword">return</span> <span class="ruby-identifier">valid</span>
973
+ <span class="ruby-keyword">end</span>
974
+
975
+ <span class="ruby-identifier">rep</span> = <span class="ruby-identifier">valid_database_replication?</span> <span class="ruby-identifier">nodes</span>
976
+ <span class="ruby-keyword">return</span> <span class="ruby-identifier">rep</span> <span class="ruby-keyword">unless</span> <span class="ruby-identifier">rep</span>[<span class="ruby-value">:result</span>]
977
+
978
+ <span class="ruby-comment"># Wait until it is validated to assign it</span>
979
+ <span class="ruby-ivar">@nodes</span> = <span class="ruby-identifier">nodes</span>
980
+
981
+ <span class="ruby-keyword">return</span> <span class="ruby-identifier">valid</span>
982
+ <span class="ruby-keyword">end</span></pre>
983
+ </div><!-- valid_advanced_format-3F-source -->
984
+
985
+ </div>
986
+
987
+
988
+
989
+
990
+ </div><!-- valid_advanced_format-3F-method -->
991
+
992
+
993
+ <div id="method-i-valid_database_replication-3F" class="method-detail ">
994
+
995
+ <div class="method-heading">
996
+ <span class="method-name">valid_database_replication?</span><span
997
+ class="method-args">(nodes)</span>
998
+ <span class="method-click-advice">click to toggle source</span>
999
+ </div>
1000
+
1001
+
1002
+ <div class="method-description">
1003
+
1004
+
1005
+
1006
+
1007
+
1008
+ <div class="method-source-code" id="valid_database_replication-3F-source">
1009
+ <pre><span class="ruby-comment"># File lib/node_layout.rb, line 391</span>
1010
+ <span class="ruby-keyword">def</span> <span class="ruby-identifier">valid_database_replication?</span> <span class="ruby-identifier">nodes</span>
1011
+ <span class="ruby-identifier">database_node_count</span> = <span class="ruby-value">0</span>
1012
+ <span class="ruby-identifier">nodes</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">node</span><span class="ruby-operator">|</span>
1013
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">node</span>.<span class="ruby-identifier">is_database?</span> <span class="ruby-keyword">or</span> <span class="ruby-identifier">node</span>.<span class="ruby-identifier">is_db_master?</span>
1014
+ <span class="ruby-identifier">database_node_count</span> <span class="ruby-operator">+=</span> <span class="ruby-value">1</span>
1015
+ <span class="ruby-keyword">end</span>
1016
+ <span class="ruby-keyword">end</span>
1017
+
1018
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">database_node_count</span>.<span class="ruby-identifier">zero?</span>
1019
+ <span class="ruby-keyword">return</span> <span class="ruby-identifier">invalid</span>(<span class="ruby-string">&quot;At least one database node must be provided.&quot;</span>)
1020
+ <span class="ruby-keyword">end</span>
1021
+
1022
+ <span class="ruby-keyword">if</span> <span class="ruby-ivar">@replication</span>.<span class="ruby-identifier">nil?</span>
1023
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">database_node_count</span> <span class="ruby-operator">&gt;</span> <span class="ruby-value">3</span>
1024
+ <span class="ruby-comment"># If there are a lot of database nodes, we default to 3x replication</span>
1025
+ <span class="ruby-ivar">@replication</span> = <span class="ruby-value">3</span>
1026
+ <span class="ruby-keyword">else</span>
1027
+ <span class="ruby-comment"># If there are only a few nodes, replicate to each one of the nodes</span>
1028
+ <span class="ruby-ivar">@replication</span> = <span class="ruby-identifier">database_node_count</span>
1029
+ <span class="ruby-keyword">end</span>
1030
+ <span class="ruby-keyword">end</span>
1031
+
1032
+ <span class="ruby-keyword">if</span> <span class="ruby-ivar">@replication</span> <span class="ruby-operator">&gt;</span> <span class="ruby-identifier">database_node_count</span>
1033
+ <span class="ruby-keyword">return</span> <span class="ruby-identifier">invalid</span>(<span class="ruby-string">&quot;The provided replication factor is too high. The replication factor (-n flag) cannot be greater than the number of database nodes.&quot;</span>)
1034
+ <span class="ruby-keyword">end</span>
1035
+
1036
+ <span class="ruby-comment"># Perform all the database specific checks here</span>
1037
+ <span class="ruby-keyword">if</span> <span class="ruby-ivar">@database_type</span> <span class="ruby-operator">==</span> <span class="ruby-value">:mysql</span> <span class="ruby-operator">&amp;&amp;</span> <span class="ruby-identifier">database_node_count</span> <span class="ruby-operator">%</span> <span class="ruby-ivar">@replication</span> <span class="ruby-operator">!=</span> <span class="ruby-value">0</span>
1038
+ <span class="ruby-keyword">return</span> <span class="ruby-identifier">invalid</span>(<span class="ruby-node">&quot;MySQL requires that the amount of replication be divisible by the number of nodes (e.g. with 6 nodes, 2 or 3 times replication). You specified #{database_node_count} database nodes which is not divisible by #{@replication} times replication.&quot;</span>)
1039
+ <span class="ruby-keyword">end</span>
1040
+
1041
+ <span class="ruby-keyword">if</span> <span class="ruby-ivar">@database_type</span> <span class="ruby-operator">==</span> <span class="ruby-value">:voldemort</span>
1042
+ <span class="ruby-ivar">@read_factor</span> <span class="ruby-operator">||=</span> <span class="ruby-ivar">@replication</span>
1043
+ <span class="ruby-ivar">@write_factor</span> <span class="ruby-operator">||=</span> <span class="ruby-ivar">@replication</span>
1044
+
1045
+ <span class="ruby-keyword">if</span> <span class="ruby-ivar">@read_factor</span> <span class="ruby-operator">&gt;</span> <span class="ruby-ivar">@replication</span>
1046
+ <span class="ruby-keyword">return</span> <span class="ruby-identifier">invalid</span>(<span class="ruby-string">&quot;The provided read factor is too high. The read factor (-r flag) cannot be greater than the replication factor.&quot;</span>)
1047
+ <span class="ruby-keyword">elsif</span> <span class="ruby-ivar">@write_factor</span> <span class="ruby-operator">&gt;</span> <span class="ruby-ivar">@replication</span>
1048
+ <span class="ruby-keyword">return</span> <span class="ruby-identifier">invalid</span>(<span class="ruby-string">&quot;The provided write factor is too high. The write factor (-w flag) cannot be greater than the replication factor.&quot;</span>)
1049
+ <span class="ruby-keyword">end</span>
1050
+ <span class="ruby-keyword">end</span>
1051
+
1052
+ <span class="ruby-keyword">if</span> <span class="ruby-ivar">@database_type</span> <span class="ruby-operator">==</span> <span class="ruby-value">:simpledb</span>
1053
+ <span class="ruby-keyword">if</span> <span class="ruby-constant">ENV</span>[<span class="ruby-string">'SIMPLEDB_ACCESS_KEY'</span>].<span class="ruby-identifier">nil?</span>
1054
+ <span class="ruby-keyword">return</span> <span class="ruby-identifier">invalid</span>(<span class="ruby-string">&quot;SimpleDB deployments require that the environment variable SIMPLEDB_ACCESS_KEY be set to your AWS access key.&quot;</span>)
1055
+ <span class="ruby-keyword">end</span>
1056
+
1057
+ <span class="ruby-keyword">if</span> <span class="ruby-constant">ENV</span>[<span class="ruby-string">'SIMPLEDB_SECRET_KEY'</span>].<span class="ruby-identifier">nil?</span>
1058
+ <span class="ruby-keyword">return</span> <span class="ruby-identifier">invalid</span>(<span class="ruby-string">&quot;SimpleDB deployments require that the environment variable SIMPLEDB_SECRET_KEY be set to your AWS secret key.&quot;</span>)
1059
+ <span class="ruby-keyword">end</span>
1060
+ <span class="ruby-keyword">end</span>
1061
+
1062
+ <span class="ruby-identifier">valid</span>
1063
+ <span class="ruby-keyword">end</span></pre>
1064
+ </div><!-- valid_database_replication-3F-source -->
1065
+
1066
+ </div>
1067
+
1068
+
1069
+
1070
+
1071
+ </div><!-- valid_database_replication-3F-method -->
1072
+
1073
+
1074
+ <div id="method-i-valid_simple_format-3F" class="method-detail ">
1075
+
1076
+ <div class="method-heading">
1077
+ <span class="method-name">valid_simple_format?</span><span
1078
+ class="method-args">()</span>
1079
+ <span class="method-click-advice">click to toggle source</span>
1080
+ </div>
1081
+
1082
+
1083
+ <div class="method-description">
1084
+
1085
+
1086
+
1087
+
1088
+
1089
+ <div class="method-source-code" id="valid_simple_format-3F-source">
1090
+ <pre><span class="ruby-comment"># File lib/node_layout.rb, line 122</span>
1091
+ <span class="ruby-keyword">def</span> <span class="ruby-identifier">valid_simple_format?</span>
1092
+ <span class="ruby-comment"># We already computed the nodes, its valid</span>
1093
+ <span class="ruby-comment"># cgb: an optimization to ensure we don't keep calling this</span>
1094
+ <span class="ruby-comment"># when it always returns the same thing anyways</span>
1095
+ <span class="ruby-keyword">return</span> <span class="ruby-identifier">valid</span> <span class="ruby-keyword">if</span> <span class="ruby-operator">!</span><span class="ruby-ivar">@nodes</span>.<span class="ruby-identifier">empty?</span>
1096
+
1097
+ <span class="ruby-keyword">if</span> <span class="ruby-ivar">@input_yaml</span>.<span class="ruby-identifier">nil?</span>
1098
+ <span class="ruby-keyword">if</span> <span class="ruby-constant">VALID_CLOUD_TYPES</span>.<span class="ruby-identifier">include?</span>(<span class="ruby-ivar">@infrastructure</span>) <span class="ruby-keyword">and</span> <span class="ruby-ivar">@infrastructure</span> <span class="ruby-operator">!=</span> <span class="ruby-string">&quot;hybrid&quot;</span>
1099
+ <span class="ruby-keyword">if</span> <span class="ruby-ivar">@min_images</span>.<span class="ruby-identifier">nil?</span>
1100
+ <span class="ruby-keyword">return</span> <span class="ruby-identifier">invalid</span>(<span class="ruby-constant">NO_INPUT_YAML_REQUIRES_MIN_IMAGES</span>)
1101
+ <span class="ruby-keyword">end</span>
1102
+
1103
+ <span class="ruby-keyword">if</span> <span class="ruby-ivar">@max_images</span>.<span class="ruby-identifier">nil?</span>
1104
+ <span class="ruby-keyword">return</span> <span class="ruby-identifier">invalid</span>(<span class="ruby-constant">NO_INPUT_YAML_REQUIRES_MAX_IMAGES</span>)
1105
+ <span class="ruby-keyword">end</span>
1106
+
1107
+ <span class="ruby-comment"># No yaml was created so we will create a generic one and then allow it to be validated</span>
1108
+ <span class="ruby-ivar">@input_yaml</span> = <span class="ruby-identifier">generate_cloud_layout</span>
1109
+ <span class="ruby-keyword">else</span>
1110
+ <span class="ruby-keyword">return</span> <span class="ruby-identifier">invalid</span>(<span class="ruby-constant">INPUT_YAML_REQUIRED</span>)
1111
+ <span class="ruby-keyword">end</span>
1112
+ <span class="ruby-keyword">end</span>
1113
+
1114
+ <span class="ruby-identifier">nodes</span> = []
1115
+ <span class="ruby-ivar">@input_yaml</span>.<span class="ruby-identifier">each_pair</span> <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">role</span>, <span class="ruby-identifier">ips</span><span class="ruby-operator">|</span>
1116
+ <span class="ruby-keyword">next</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">ips</span>.<span class="ruby-identifier">nil?</span>
1117
+
1118
+ <span class="ruby-identifier">ips</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">ip</span><span class="ruby-operator">|</span>
1119
+ <span class="ruby-identifier">id</span>, <span class="ruby-identifier">cloud</span> = <span class="ruby-identifier">parse_ip</span>(<span class="ruby-identifier">ip</span>)
1120
+ <span class="ruby-identifier">node</span> = <span class="ruby-constant">SimpleNode</span>.<span class="ruby-identifier">new</span> <span class="ruby-identifier">id</span>, <span class="ruby-identifier">cloud</span>, [<span class="ruby-identifier">role</span>]
1121
+
1122
+ <span class="ruby-comment"># In simple deployments the db master and rabbitmq master is always on</span>
1123
+ <span class="ruby-comment"># the shadow node, and db slave / rabbitmq slave is always on the other</span>
1124
+ <span class="ruby-comment"># nodes</span>
1125
+ <span class="ruby-identifier">is_master</span> = <span class="ruby-identifier">node</span>.<span class="ruby-identifier">is_shadow?</span>
1126
+ <span class="ruby-identifier">node</span>.<span class="ruby-identifier">add_db_role</span> <span class="ruby-ivar">@database_type</span>, <span class="ruby-identifier">is_master</span>
1127
+ <span class="ruby-identifier">node</span>.<span class="ruby-identifier">add_rabbitmq_role</span> <span class="ruby-identifier">is_master</span>
1128
+
1129
+ <span class="ruby-keyword">return</span> <span class="ruby-identifier">invalid</span>(<span class="ruby-identifier">node</span>.<span class="ruby-identifier">errors</span>.<span class="ruby-identifier">join</span>(<span class="ruby-string">&quot;,&quot;</span>)) <span class="ruby-keyword">if</span> <span class="ruby-operator">!</span><span class="ruby-identifier">node</span>.<span class="ruby-identifier">valid?</span>
1130
+
1131
+ <span class="ruby-keyword">if</span> <span class="ruby-constant">VALID_CLOUD_TYPES</span>.<span class="ruby-identifier">include?</span>(<span class="ruby-ivar">@infrastructure</span>)
1132
+ <span class="ruby-identifier">error_message</span> = <span class="ruby-node">&quot;Invalid cloud node ID: #{node.id} \n&quot;</span> <span class="ruby-operator">+</span>
1133
+ <span class="ruby-string">&quot;Cloud node IDs must be in the format 'node-{IDNUMBER}'&quot;</span> <span class="ruby-operator">+</span>
1134
+ <span class="ruby-string">&quot;\nor of the form cloud{CLOUDNUMBER}-{IDNUMBER} for hybrid deployments&quot;</span>
1135
+ <span class="ruby-keyword">return</span> <span class="ruby-identifier">invalid</span>(<span class="ruby-identifier">error_message</span>) <span class="ruby-keyword">if</span> <span class="ruby-constant">NODE_ID_REGEX</span>.<span class="ruby-identifier">match</span>(<span class="ruby-identifier">node</span>.<span class="ruby-identifier">id</span>.<span class="ruby-identifier">to_s</span>).<span class="ruby-identifier">nil?</span>
1136
+ <span class="ruby-keyword">else</span>
1137
+ <span class="ruby-comment"># Xen/KVM should be using the ip address as the node id</span>
1138
+ <span class="ruby-identifier">error_message</span> = <span class="ruby-node">&quot;Invalid virtualized node ID: #{node.id} \n&quot;</span> <span class="ruby-operator">+</span>
1139
+ <span class="ruby-string">&quot;Virtualized node IDs must be a valid IP address&quot;</span>
1140
+ <span class="ruby-keyword">return</span> <span class="ruby-identifier">invalid</span>(<span class="ruby-identifier">error_message</span>) <span class="ruby-keyword">if</span> <span class="ruby-constant">IP_REGEX</span>.<span class="ruby-identifier">match</span>(<span class="ruby-identifier">node</span>.<span class="ruby-identifier">id</span>.<span class="ruby-identifier">to_s</span>).<span class="ruby-identifier">nil?</span>
1141
+ <span class="ruby-keyword">end</span>
1142
+
1143
+ <span class="ruby-identifier">nodes</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">node</span>
1144
+ <span class="ruby-keyword">end</span>
1145
+ <span class="ruby-keyword">end</span>
1146
+
1147
+ <span class="ruby-comment"># make sure that the user hasn't erroneously specified the same ip</span>
1148
+ <span class="ruby-comment"># address more than once</span>
1149
+ <span class="ruby-identifier">all_ips</span> = <span class="ruby-ivar">@input_yaml</span>.<span class="ruby-identifier">values</span>.<span class="ruby-identifier">flatten</span>
1150
+ <span class="ruby-identifier">duplicate_ips</span> = <span class="ruby-identifier">all_ips</span>.<span class="ruby-identifier">length</span> <span class="ruby-operator">-</span> <span class="ruby-identifier">all_ips</span>.<span class="ruby-identifier">uniq</span>.<span class="ruby-identifier">length</span>
1151
+
1152
+ <span class="ruby-keyword">unless</span> <span class="ruby-identifier">duplicate_ips</span>.<span class="ruby-identifier">zero?</span>
1153
+ <span class="ruby-keyword">return</span> <span class="ruby-identifier">invalid</span>(<span class="ruby-constant">DUPLICATE_IPS</span>)
1154
+ <span class="ruby-keyword">end</span>
1155
+
1156
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">nodes</span>.<span class="ruby-identifier">length</span> <span class="ruby-operator">==</span> <span class="ruby-value">1</span>
1157
+ <span class="ruby-comment"># Singleton node should be master and app engine</span>
1158
+ <span class="ruby-identifier">nodes</span>.<span class="ruby-identifier">first</span>.<span class="ruby-identifier">add_role</span> <span class="ruby-value">:appengine</span>
1159
+ <span class="ruby-identifier">nodes</span>.<span class="ruby-identifier">first</span>.<span class="ruby-identifier">add_role</span> <span class="ruby-value">:memcache</span>
1160
+ <span class="ruby-keyword">end</span>
1161
+
1162
+ <span class="ruby-comment"># controller -&gt; shadow</span>
1163
+ <span class="ruby-identifier">controller_count</span> = <span class="ruby-value">0</span>
1164
+ <span class="ruby-identifier">nodes</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">node</span><span class="ruby-operator">|</span>
1165
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">node</span>.<span class="ruby-identifier">is_shadow?</span>
1166
+ <span class="ruby-identifier">controller_count</span> <span class="ruby-operator">+=</span> <span class="ruby-value">1</span>
1167
+ <span class="ruby-keyword">end</span>
1168
+ <span class="ruby-keyword">end</span>
1169
+
1170
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">controller_count</span> <span class="ruby-operator">==</span> <span class="ruby-value">0</span>
1171
+ <span class="ruby-keyword">return</span> <span class="ruby-identifier">invalid</span>(<span class="ruby-constant">NO_CONTROLLER</span>)
1172
+ <span class="ruby-keyword">elsif</span> <span class="ruby-identifier">controller_count</span> <span class="ruby-operator">&gt;</span> <span class="ruby-value">1</span>
1173
+ <span class="ruby-keyword">return</span> <span class="ruby-identifier">invalid</span>(<span class="ruby-constant">ONLY_ONE_CONTROLLER</span>)
1174
+ <span class="ruby-keyword">end</span>
1175
+
1176
+ <span class="ruby-identifier">database_count</span> = <span class="ruby-value">0</span>
1177
+ <span class="ruby-identifier">nodes</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">node</span><span class="ruby-operator">|</span>
1178
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">node</span>.<span class="ruby-identifier">is_database?</span>
1179
+ <span class="ruby-identifier">database_count</span> <span class="ruby-operator">+=</span> <span class="ruby-value">1</span>
1180
+ <span class="ruby-keyword">end</span>
1181
+ <span class="ruby-keyword">end</span>
1182
+
1183
+ <span class="ruby-keyword">if</span> <span class="ruby-ivar">@skip_replication</span>
1184
+ <span class="ruby-ivar">@nodes</span> = <span class="ruby-identifier">nodes</span>
1185
+ <span class="ruby-keyword">return</span> <span class="ruby-identifier">valid</span>
1186
+ <span class="ruby-keyword">end</span>
1187
+
1188
+ <span class="ruby-identifier">rep</span> = <span class="ruby-identifier">valid_database_replication?</span> <span class="ruby-identifier">nodes</span>
1189
+ <span class="ruby-keyword">return</span> <span class="ruby-identifier">rep</span> <span class="ruby-keyword">unless</span> <span class="ruby-identifier">rep</span>[<span class="ruby-value">:result</span>]
1190
+
1191
+ <span class="ruby-comment"># Wait until it is validated to assign it</span>
1192
+ <span class="ruby-ivar">@nodes</span> = <span class="ruby-identifier">nodes</span>
1193
+ <span class="ruby-identifier">valid</span>
1194
+ <span class="ruby-keyword">end</span></pre>
1195
+ </div><!-- valid_simple_format-3F-source -->
1196
+
1197
+ </div>
1198
+
1199
+
1200
+
1201
+
1202
+ </div><!-- valid_simple_format-3F-method -->
1203
+
1204
+
1205
+ <div id="method-i-write_factor" class="method-detail ">
1206
+
1207
+ <div class="method-heading">
1208
+ <span class="method-name">write_factor</span><span
1209
+ class="method-args">()</span>
1210
+ <span class="method-click-advice">click to toggle source</span>
1211
+ </div>
1212
+
1213
+
1214
+ <div class="method-description">
1215
+
1216
+
1217
+
1218
+
1219
+
1220
+ <div class="method-source-code" id="write_factor-source">
1221
+ <pre><span class="ruby-comment"># File lib/node_layout.rb, line 474</span>
1222
+ <span class="ruby-keyword">def</span> <span class="ruby-identifier">write_factor</span>
1223
+ <span class="ruby-keyword">return</span> <span class="ruby-keyword">nil</span> <span class="ruby-keyword">if</span> <span class="ruby-operator">!</span><span class="ruby-identifier">valid?</span> <span class="ruby-operator">||</span> <span class="ruby-ivar">@database_type</span> <span class="ruby-operator">!=</span> <span class="ruby-value">:voldemort</span>
1224
+
1225
+ <span class="ruby-ivar">@write_factor</span>
1226
+ <span class="ruby-keyword">end</span></pre>
1227
+ </div><!-- write_factor-source -->
1228
+
1229
+ </div>
1230
+
1231
+
1232
+
1233
+
1234
+ </div><!-- write_factor-method -->
1235
+
1236
+
1237
+ </section><!-- public-instance-method-details -->
1238
+
1239
+ <section id="public-class-5Buntitled-5D-method-details" class="method-section section">
1240
+ <h3 class="section-header">Public Class Methods</h3>
1241
+
1242
+
1243
+ <div id="method-c-new" class="method-detail ">
1244
+
1245
+ <div class="method-heading">
1246
+ <span class="method-name">new</span><span
1247
+ class="method-args">(input_yaml, options, skip_replication=false)</span>
1248
+ <span class="method-click-advice">click to toggle source</span>
1249
+ </div>
1250
+
1251
+
1252
+ <div class="method-description">
1253
+
1254
+ <p>Required options are: database_type</p>
1255
+
1256
+
1257
+
1258
+ <div class="method-source-code" id="new-source">
1259
+ <pre><span class="ruby-comment"># File lib/node_layout.rb, line 30</span>
1260
+ <span class="ruby-keyword">def</span> <span class="ruby-identifier">initialize</span>(<span class="ruby-identifier">input_yaml</span>, <span class="ruby-identifier">options</span>, <span class="ruby-identifier">skip_replication</span>=<span class="ruby-keyword">false</span>)
1261
+ <span class="ruby-ivar">@input_yaml</span> = (<span class="ruby-identifier">input_yaml</span>.<span class="ruby-identifier">kind_of?</span>(<span class="ruby-constant">String</span>) <span class="ruby-operator">?</span> <span class="ruby-constant">YAML</span>.<span class="ruby-identifier">load</span>(<span class="ruby-identifier">input_yaml</span>) <span class="ruby-operator">:</span> <span class="ruby-identifier">input_yaml</span>)
1262
+
1263
+ <span class="ruby-ivar">@infrastructure</span> = <span class="ruby-identifier">options</span>[<span class="ruby-value">:infrastructure</span>]
1264
+ <span class="ruby-ivar">@database_type</span> = <span class="ruby-identifier">options</span>[<span class="ruby-value">:database</span>]
1265
+ <span class="ruby-ivar">@database_type</span> = <span class="ruby-ivar">@database_type</span>.<span class="ruby-identifier">to_sym</span> <span class="ruby-keyword">if</span> <span class="ruby-operator">!</span><span class="ruby-ivar">@database_type</span>.<span class="ruby-identifier">nil?</span>
1266
+ <span class="ruby-ivar">@min_images</span> = <span class="ruby-identifier">options</span>[<span class="ruby-value">:min_images</span>]
1267
+ <span class="ruby-ivar">@max_images</span> = <span class="ruby-identifier">options</span>[<span class="ruby-value">:max_images</span>]
1268
+ <span class="ruby-ivar">@replication</span> = <span class="ruby-identifier">options</span>[<span class="ruby-value">:replication</span>]
1269
+ <span class="ruby-ivar">@read_factor</span> = <span class="ruby-identifier">options</span>[<span class="ruby-value">:read_factor</span>]
1270
+ <span class="ruby-ivar">@write_factor</span> = <span class="ruby-identifier">options</span>[<span class="ruby-value">:write_factor</span>]
1271
+
1272
+ <span class="ruby-ivar">@nodes</span> = []
1273
+ <span class="ruby-ivar">@skip_replication</span> = <span class="ruby-identifier">skip_replication</span>
1274
+ <span class="ruby-keyword">end</span></pre>
1275
+ </div><!-- new-source -->
1276
+
1277
+ </div>
1278
+
1279
+
1280
+
1281
+
1282
+ </div><!-- new-method -->
1283
+
1284
+
1285
+ </section><!-- public-class-method-details -->
1286
+
1287
+ </section><!-- 5Buntitled-5D -->
1288
+
1289
+ </div><!-- documentation -->
1290
+
1291
+
1292
+ <footer id="validator-badges">
1293
+ <p><a href="http://validator.w3.org/check/referer">[Validate]</a>
1294
+ <p>Generated by <a href="https://github.com/rdoc/rdoc">RDoc</a> 3.12.
1295
+ <p>Generated with the <a href="http://deveiate.org/projects/Darkfish-Rdoc/">Darkfish Rdoc Generator</a> 3.
1296
+ </footer>
1297
+