appscale-tools 1.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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
+