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,166 @@
1
+ <!DOCTYPE html>
2
+
3
+ <html>
4
+ <head>
5
+ <meta content="text/html; charset=UTF-8" http-equiv="Content-Type">
6
+
7
+ <title>class BadCommandLineArgException - 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/custom_exceptions.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="AppScaleException.html">AppScaleException</a>
63
+
64
+ </nav>
65
+
66
+
67
+
68
+ </div>
69
+
70
+ <div id="project-metadata">
71
+ <nav id="fileindex-section" class="section project-section">
72
+ <h3 class="section-header">Pages</h3>
73
+
74
+ <ul>
75
+
76
+ <li class="file"><a href="./lib/sshcopyid.html">sshcopyid</a>
77
+
78
+ </ul>
79
+ </nav>
80
+
81
+ <nav id="classindex-section" class="section project-section">
82
+ <h3 class="section-header">Class and Module Index</h3>
83
+
84
+ <ul class="link-list">
85
+
86
+ <li><a href="./AdvancedNode.html">AdvancedNode</a>
87
+
88
+ <li><a href="./AppControllerClient.html">AppControllerClient</a>
89
+
90
+ <li><a href="./AppEngineConfigException.html">AppEngineConfigException</a>
91
+
92
+ <li><a href="./AppScaleException.html">AppScaleException</a>
93
+
94
+ <li><a href="./AppScaleTools.html">AppScaleTools</a>
95
+
96
+ <li><a href="./BadCommandLineArgException.html">BadCommandLineArgException</a>
97
+
98
+ <li><a href="./BadConfigurationException.html">BadConfigurationException</a>
99
+
100
+ <li><a href="./CommonFunctions.html">CommonFunctions</a>
101
+
102
+ <li><a href="./EncryptionHelper.html">EncryptionHelper</a>
103
+
104
+ <li><a href="./GodInterface.html">GodInterface</a>
105
+
106
+ <li><a href="./InfrastructureException.html">InfrastructureException</a>
107
+
108
+ <li><a href="./Node.html">Node</a>
109
+
110
+ <li><a href="./NodeLayout.html">NodeLayout</a>
111
+
112
+ <li><a href="./Object.html">Object</a>
113
+
114
+ <li><a href="./ParseArgs.html">ParseArgs</a>
115
+
116
+ <li><a href="./RemoteLogging.html">RemoteLogging</a>
117
+
118
+ <li><a href="./SimpleNode.html">SimpleNode</a>
119
+
120
+ <li><a href="./UsageText.html">UsageText</a>
121
+
122
+ <li><a href="./UserAppClient.html">UserAppClient</a>
123
+
124
+ <li><a href="./VMTools.html">VMTools</a>
125
+
126
+ </ul>
127
+ </nav>
128
+
129
+ </div>
130
+ </nav>
131
+
132
+ <div id="documentation">
133
+ <h1 class="class">class BadCommandLineArgException</h1>
134
+
135
+ <div id="description" class="description">
136
+
137
+ <p>a class representing exceptions related to bad command line arguments (see
138
+ lib/parse_args)</p>
139
+
140
+ </div><!-- description -->
141
+
142
+
143
+
144
+
145
+ <section id="5Buntitled-5D" class="documentation-section">
146
+
147
+
148
+
149
+
150
+
151
+
152
+
153
+
154
+ <!-- Methods -->
155
+
156
+ </section><!-- 5Buntitled-5D -->
157
+
158
+ </div><!-- documentation -->
159
+
160
+
161
+ <footer id="validator-badges">
162
+ <p><a href="http://validator.w3.org/check/referer">[Validate]</a>
163
+ <p>Generated by <a href="https://github.com/rdoc/rdoc">RDoc</a> 3.12.
164
+ <p>Generated with the <a href="http://deveiate.org/projects/Darkfish-Rdoc/">Darkfish Rdoc Generator</a> 3.
165
+ </footer>
166
+
@@ -0,0 +1,166 @@
1
+ <!DOCTYPE html>
2
+
3
+ <html>
4
+ <head>
5
+ <meta content="text/html; charset=UTF-8" http-equiv="Content-Type">
6
+
7
+ <title>class BadConfigurationException - 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/custom_exceptions.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="AppScaleException.html">AppScaleException</a>
63
+
64
+ </nav>
65
+
66
+
67
+
68
+ </div>
69
+
70
+ <div id="project-metadata">
71
+ <nav id="fileindex-section" class="section project-section">
72
+ <h3 class="section-header">Pages</h3>
73
+
74
+ <ul>
75
+
76
+ <li class="file"><a href="./lib/sshcopyid.html">sshcopyid</a>
77
+
78
+ </ul>
79
+ </nav>
80
+
81
+ <nav id="classindex-section" class="section project-section">
82
+ <h3 class="section-header">Class and Module Index</h3>
83
+
84
+ <ul class="link-list">
85
+
86
+ <li><a href="./AdvancedNode.html">AdvancedNode</a>
87
+
88
+ <li><a href="./AppControllerClient.html">AppControllerClient</a>
89
+
90
+ <li><a href="./AppEngineConfigException.html">AppEngineConfigException</a>
91
+
92
+ <li><a href="./AppScaleException.html">AppScaleException</a>
93
+
94
+ <li><a href="./AppScaleTools.html">AppScaleTools</a>
95
+
96
+ <li><a href="./BadCommandLineArgException.html">BadCommandLineArgException</a>
97
+
98
+ <li><a href="./BadConfigurationException.html">BadConfigurationException</a>
99
+
100
+ <li><a href="./CommonFunctions.html">CommonFunctions</a>
101
+
102
+ <li><a href="./EncryptionHelper.html">EncryptionHelper</a>
103
+
104
+ <li><a href="./GodInterface.html">GodInterface</a>
105
+
106
+ <li><a href="./InfrastructureException.html">InfrastructureException</a>
107
+
108
+ <li><a href="./Node.html">Node</a>
109
+
110
+ <li><a href="./NodeLayout.html">NodeLayout</a>
111
+
112
+ <li><a href="./Object.html">Object</a>
113
+
114
+ <li><a href="./ParseArgs.html">ParseArgs</a>
115
+
116
+ <li><a href="./RemoteLogging.html">RemoteLogging</a>
117
+
118
+ <li><a href="./SimpleNode.html">SimpleNode</a>
119
+
120
+ <li><a href="./UsageText.html">UsageText</a>
121
+
122
+ <li><a href="./UserAppClient.html">UserAppClient</a>
123
+
124
+ <li><a href="./VMTools.html">VMTools</a>
125
+
126
+ </ul>
127
+ </nav>
128
+
129
+ </div>
130
+ </nav>
131
+
132
+ <div id="documentation">
133
+ <h1 class="class">class BadConfigurationException</h1>
134
+
135
+ <div id="description" class="description">
136
+
137
+ <p>a class representing exceptions related to incorrectly configured AppScale
138
+ deployments</p>
139
+
140
+ </div><!-- description -->
141
+
142
+
143
+
144
+
145
+ <section id="5Buntitled-5D" class="documentation-section">
146
+
147
+
148
+
149
+
150
+
151
+
152
+
153
+
154
+ <!-- Methods -->
155
+
156
+ </section><!-- 5Buntitled-5D -->
157
+
158
+ </div><!-- documentation -->
159
+
160
+
161
+ <footer id="validator-badges">
162
+ <p><a href="http://validator.w3.org/check/referer">[Validate]</a>
163
+ <p>Generated by <a href="https://github.com/rdoc/rdoc">RDoc</a> 3.12.
164
+ <p>Generated with the <a href="http://deveiate.org/projects/Darkfish-Rdoc/">Darkfish Rdoc Generator</a> 3.
165
+ </footer>
166
+
@@ -0,0 +1,2559 @@
1
+ <!DOCTYPE html>
2
+
3
+ <html>
4
+ <head>
5
+ <meta content="text/html; charset=UTF-8" http-equiv="Content-Type">
6
+
7
+ <title>module CommonFunctions - 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="module">
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/common_functions.rb
51
+ </ul>
52
+ </nav>
53
+
54
+
55
+ </div>
56
+
57
+ <div id="class-metadata">
58
+
59
+
60
+
61
+ <!-- Method Quickref -->
62
+ <nav id="method-list-section" class="section">
63
+ <h3 class="section-header">Methods</h3>
64
+
65
+ <ul class="link-list">
66
+
67
+ <li><a href="#method-c-clear_app">::clear_app</a>
68
+
69
+ <li><a href="#method-c-convert_fqdn_to_ip">::convert_fqdn_to_ip</a>
70
+
71
+ <li><a href="#method-c-create_user">::create_user</a>
72
+
73
+ <li><a href="#method-c-encrypt_password">::encrypt_password</a>
74
+
75
+ <li><a href="#method-c-find_real_ssh_key">::find_real_ssh_key</a>
76
+
77
+ <li><a href="#method-c-get_all_public_ips">::get_all_public_ips</a>
78
+
79
+ <li><a href="#method-c-get_app_info">::get_app_info</a>
80
+
81
+ <li><a href="#method-c-get_app_info_from_options">::get_app_info_from_options</a>
82
+
83
+ <li><a href="#method-c-get_app_name_from_tar">::get_app_name_from_tar</a>
84
+
85
+ <li><a href="#method-c-get_app_name_via_xml">::get_app_name_via_xml</a>
86
+
87
+ <li><a href="#method-c-get_app_name_via_yaml">::get_app_name_via_yaml</a>
88
+
89
+ <li><a href="#method-c-get_credentials">::get_credentials</a>
90
+
91
+ <li><a href="#method-c-get_db_master_ip">::get_db_master_ip</a>
92
+
93
+ <li><a href="#method-c-get_email">::get_email</a>
94
+
95
+ <li><a href="#method-c-get_from_yaml">::get_from_yaml</a>
96
+
97
+ <li><a href="#method-c-get_head_node_ip">::get_head_node_ip</a>
98
+
99
+ <li><a href="#method-c-get_infrastructure">::get_infrastructure</a>
100
+
101
+ <li><a href="#method-c-get_ips_from_yaml">::get_ips_from_yaml</a>
102
+
103
+ <li><a href="#method-c-get_line_from_stdin_no_echo">::get_line_from_stdin_no_echo</a>
104
+
105
+ <li><a href="#method-c-get_load_balancer_id">::get_load_balancer_id</a>
106
+
107
+ <li><a href="#method-c-get_load_balancer_ip">::get_load_balancer_ip</a>
108
+
109
+ <li><a href="#method-c-get_login_ip">::get_login_ip</a>
110
+
111
+ <li><a href="#method-c-get_password">::get_password</a>
112
+
113
+ <li><a href="#method-c-get_random_alphanumeric">::get_random_alphanumeric</a>
114
+
115
+ <li><a href="#method-c-get_remote_appscale_home">::get_remote_appscale_home</a>
116
+
117
+ <li><a href="#method-c-get_role_from_nodes">::get_role_from_nodes</a>
118
+
119
+ <li><a href="#method-c-get_secret_key">::get_secret_key</a>
120
+
121
+ <li><a href="#method-c-get_table">::get_table</a>
122
+
123
+ <li><a href="#method-c-get_username_from_options">::get_username_from_options</a>
124
+
125
+ <li><a href="#method-c-is_port_open-3F">::is_port_open?</a>
126
+
127
+ <li><a href="#method-c-make_appscale_directory">::make_appscale_directory</a>
128
+
129
+ <li><a href="#method-c-move_app">::move_app</a>
130
+
131
+ <li><a href="#method-c-read_file">::read_file</a>
132
+
133
+ <li><a href="#method-c-read_nodes_json">::read_nodes_json</a>
134
+
135
+ <li><a href="#method-c-require_commands">::require_commands</a>
136
+
137
+ <li><a href="#method-c-rsync_files">::rsync_files</a>
138
+
139
+ <li><a href="#method-c-run_remote_command">::run_remote_command</a>
140
+
141
+ <li><a href="#method-c-scp_app_to_ip">::scp_app_to_ip</a>
142
+
143
+ <li><a href="#method-c-scp_file">::scp_file</a>
144
+
145
+ <li><a href="#method-c-shell">::shell</a>
146
+
147
+ <li><a href="#method-c-sleep_until_port_is_closed">::sleep_until_port_is_closed</a>
148
+
149
+ <li><a href="#method-c-sleep_until_port_is_open">::sleep_until_port_is_open</a>
150
+
151
+ <li><a href="#method-c-start_head_node">::start_head_node</a>
152
+
153
+ <li><a href="#method-c-update_appcontroller">::update_appcontroller</a>
154
+
155
+ <li><a href="#method-c-update_locations_file">::update_locations_file</a>
156
+
157
+ <li><a href="#method-c-user_has_cmd-3F">::user_has_cmd?</a>
158
+
159
+ <li><a href="#method-c-validate_app_name">::validate_app_name</a>
160
+
161
+ <li><a href="#method-c-wait_for_app_to_start">::wait_for_app_to_start</a>
162
+
163
+ <li><a href="#method-c-wait_for_nodes_to_load">::wait_for_nodes_to_load</a>
164
+
165
+ <li><a href="#method-c-wait_until_redirect">::wait_until_redirect</a>
166
+
167
+ <li><a href="#method-c-warn_on_large_app_size">::warn_on_large_app_size</a>
168
+
169
+ <li><a href="#method-c-write_and_copy_node_file">::write_and_copy_node_file</a>
170
+
171
+ <li><a href="#method-c-write_file">::write_file</a>
172
+
173
+ <li><a href="#method-c-write_node_file">::write_node_file</a>
174
+
175
+ <li><a href="#method-c-write_nodes_json">::write_nodes_json</a>
176
+
177
+ </ul>
178
+ </nav>
179
+
180
+ </div>
181
+
182
+ <div id="project-metadata">
183
+ <nav id="fileindex-section" class="section project-section">
184
+ <h3 class="section-header">Pages</h3>
185
+
186
+ <ul>
187
+
188
+ <li class="file"><a href="./lib/sshcopyid.html">sshcopyid</a>
189
+
190
+ </ul>
191
+ </nav>
192
+
193
+ <nav id="classindex-section" class="section project-section">
194
+ <h3 class="section-header">Class and Module Index</h3>
195
+
196
+ <ul class="link-list">
197
+
198
+ <li><a href="./AdvancedNode.html">AdvancedNode</a>
199
+
200
+ <li><a href="./AppControllerClient.html">AppControllerClient</a>
201
+
202
+ <li><a href="./AppEngineConfigException.html">AppEngineConfigException</a>
203
+
204
+ <li><a href="./AppScaleException.html">AppScaleException</a>
205
+
206
+ <li><a href="./AppScaleTools.html">AppScaleTools</a>
207
+
208
+ <li><a href="./BadCommandLineArgException.html">BadCommandLineArgException</a>
209
+
210
+ <li><a href="./BadConfigurationException.html">BadConfigurationException</a>
211
+
212
+ <li><a href="./CommonFunctions.html">CommonFunctions</a>
213
+
214
+ <li><a href="./EncryptionHelper.html">EncryptionHelper</a>
215
+
216
+ <li><a href="./GodInterface.html">GodInterface</a>
217
+
218
+ <li><a href="./InfrastructureException.html">InfrastructureException</a>
219
+
220
+ <li><a href="./Node.html">Node</a>
221
+
222
+ <li><a href="./NodeLayout.html">NodeLayout</a>
223
+
224
+ <li><a href="./Object.html">Object</a>
225
+
226
+ <li><a href="./ParseArgs.html">ParseArgs</a>
227
+
228
+ <li><a href="./RemoteLogging.html">RemoteLogging</a>
229
+
230
+ <li><a href="./SimpleNode.html">SimpleNode</a>
231
+
232
+ <li><a href="./UsageText.html">UsageText</a>
233
+
234
+ <li><a href="./UserAppClient.html">UserAppClient</a>
235
+
236
+ <li><a href="./VMTools.html">VMTools</a>
237
+
238
+ </ul>
239
+ </nav>
240
+
241
+ </div>
242
+ </nav>
243
+
244
+ <div id="documentation">
245
+ <h1 class="module">module CommonFunctions</h1>
246
+
247
+ <div id="description" class="description">
248
+
249
+ </div><!-- description -->
250
+
251
+
252
+
253
+
254
+ <section id="5Buntitled-5D" class="documentation-section">
255
+
256
+
257
+
258
+
259
+
260
+
261
+
262
+
263
+ <!-- Methods -->
264
+
265
+ <section id="public-class-5Buntitled-5D-method-details" class="method-section section">
266
+ <h3 class="section-header">Public Class Methods</h3>
267
+
268
+
269
+ <div id="method-c-clear_app" class="method-detail ">
270
+
271
+ <div class="method-heading">
272
+ <span class="method-name">clear_app</span><span
273
+ class="method-args">(app_path, force=false)</span>
274
+ <span class="method-click-advice">click to toggle source</span>
275
+ </div>
276
+
277
+
278
+ <div class="method-description">
279
+
280
+
281
+
282
+
283
+
284
+ <div class="method-source-code" id="clear_app-source">
285
+ <pre><span class="ruby-comment"># File lib/common_functions.rb, line 191</span>
286
+ <span class="ruby-keyword">def</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier">clear_app</span>(<span class="ruby-identifier">app_path</span>, <span class="ruby-identifier">force</span>=<span class="ruby-keyword">false</span>)
287
+ <span class="ruby-keyword">return</span> <span class="ruby-keyword">if</span> <span class="ruby-operator">!</span><span class="ruby-constant">File</span>.<span class="ruby-identifier">exists?</span>(<span class="ruby-identifier">app_path</span>)
288
+ <span class="ruby-keyword">return</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">app_path</span> <span class="ruby-operator">!~</span> <span class="ruby-regexp">%r\A\/tmp/</span> <span class="ruby-keyword">and</span> <span class="ruby-operator">!</span><span class="ruby-identifier">force</span>
289
+ <span class="ruby-identifier">path_to_remove</span> = <span class="ruby-constant">File</span>.<span class="ruby-identifier">dirname</span>(<span class="ruby-identifier">app_path</span>)
290
+ <span class="ruby-constant">FileUtils</span>.<span class="ruby-identifier">rm_f</span>(<span class="ruby-identifier">path_to_remove</span>)
291
+ <span class="ruby-keyword">end</span></pre>
292
+ </div><!-- clear_app-source -->
293
+
294
+ </div>
295
+
296
+
297
+
298
+
299
+ </div><!-- clear_app-method -->
300
+
301
+
302
+ <div id="method-c-convert_fqdn_to_ip" class="method-detail ">
303
+
304
+ <div class="method-heading">
305
+ <span class="method-name">convert_fqdn_to_ip</span><span
306
+ class="method-args">(host)</span>
307
+ <span class="method-click-advice">click to toggle source</span>
308
+ </div>
309
+
310
+
311
+ <div class="method-description">
312
+
313
+
314
+
315
+
316
+
317
+ <div class="method-source-code" id="convert_fqdn_to_ip-source">
318
+ <pre><span class="ruby-comment"># File lib/common_functions.rb, line 380</span>
319
+ <span class="ruby-keyword">def</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier">convert_fqdn_to_ip</span>(<span class="ruby-identifier">host</span>)
320
+ <span class="ruby-identifier">nslookup</span> = <span class="ruby-constant">CommonFunctions</span>.<span class="ruby-identifier">shell</span>(<span class="ruby-node">&quot;nslookup #{host}&quot;</span>)
321
+ <span class="ruby-identifier">ip</span> = <span class="ruby-identifier">nslookup</span>.<span class="ruby-identifier">scan</span>(<span class="ruby-node">%r#{host}\nAddress:\s+(#{IP_REGEX})/</span>).<span class="ruby-identifier">flatten</span>.<span class="ruby-identifier">to_s</span>
322
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">ip</span>.<span class="ruby-identifier">nil?</span> <span class="ruby-keyword">or</span> <span class="ruby-identifier">ip</span>.<span class="ruby-identifier">empty?</span>
323
+ <span class="ruby-identifier">raise</span> <span class="ruby-constant">AppScaleException</span>.<span class="ruby-identifier">new</span>(<span class="ruby-node">&quot;Couldn't convert #{host} to an IP &quot;</span> <span class="ruby-operator">+</span>
324
+ <span class="ruby-node">&quot;address. Result of nslookup was \n#{nslookup}&quot;</span>)
325
+ <span class="ruby-keyword">end</span>
326
+ <span class="ruby-keyword">return</span> <span class="ruby-identifier">ip</span>
327
+ <span class="ruby-keyword">end</span></pre>
328
+ </div><!-- convert_fqdn_to_ip-source -->
329
+
330
+ </div>
331
+
332
+
333
+
334
+
335
+ </div><!-- convert_fqdn_to_ip-method -->
336
+
337
+
338
+ <div id="method-c-create_user" class="method-detail ">
339
+
340
+ <div class="method-heading">
341
+ <span class="method-name">create_user</span><span
342
+ class="method-args">(user, test, head_node_ip, secret_key, uac, pass=nil)</span>
343
+ <span class="method-click-advice">click to toggle source</span>
344
+ </div>
345
+
346
+
347
+ <div class="method-description">
348
+
349
+
350
+
351
+
352
+
353
+ <div class="method-source-code" id="create_user-source">
354
+ <pre><span class="ruby-comment"># File lib/common_functions.rb, line 248</span>
355
+ <span class="ruby-keyword">def</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier">create_user</span>(<span class="ruby-identifier">user</span>, <span class="ruby-identifier">test</span>, <span class="ruby-identifier">head_node_ip</span>, <span class="ruby-identifier">secret_key</span>, <span class="ruby-identifier">uac</span>, <span class="ruby-identifier">pass</span>=<span class="ruby-keyword">nil</span>)
356
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">pass</span>
357
+ <span class="ruby-identifier">pass</span> = <span class="ruby-identifier">pass</span> <span class="ruby-comment"># TODO - can we just remove this?</span>
358
+ <span class="ruby-keyword">elsif</span> <span class="ruby-identifier">test</span>
359
+ <span class="ruby-identifier">pass</span> = <span class="ruby-string">&quot;aaaaaa&quot;</span>
360
+ <span class="ruby-keyword">else</span>
361
+ <span class="ruby-identifier">pass</span> = <span class="ruby-constant">CommonFunctions</span>.<span class="ruby-identifier">get_password</span>
362
+ <span class="ruby-keyword">end</span>
363
+
364
+ <span class="ruby-identifier">encrypted_pass</span> = <span class="ruby-constant">CommonFunctions</span>.<span class="ruby-identifier">encrypt_password</span>(<span class="ruby-identifier">user</span>, <span class="ruby-identifier">pass</span>)
365
+ <span class="ruby-identifier">uac</span>.<span class="ruby-identifier">commit_new_user</span>(<span class="ruby-identifier">user</span>, <span class="ruby-identifier">encrypted_pass</span>)
366
+
367
+ <span class="ruby-identifier">login_ip</span> = <span class="ruby-constant">CommonFunctions</span>.<span class="ruby-identifier">get_login_ip</span>(<span class="ruby-identifier">head_node_ip</span>, <span class="ruby-identifier">secret_key</span>)
368
+
369
+ <span class="ruby-comment"># create xmpp account</span>
370
+ <span class="ruby-comment"># for user a@a.a, this translates to a@login_ip</span>
371
+
372
+ <span class="ruby-identifier">pre</span> = <span class="ruby-identifier">user</span>.<span class="ruby-identifier">scan</span>(<span class="ruby-regexp">%r\A(.*)@/</span>).<span class="ruby-identifier">flatten</span>.<span class="ruby-identifier">to_s</span>
373
+ <span class="ruby-identifier">xmpp_user</span> = <span class="ruby-node">&quot;#{pre}@#{login_ip}&quot;</span>
374
+ <span class="ruby-identifier">xmpp_pass</span> = <span class="ruby-constant">CommonFunctions</span>.<span class="ruby-identifier">encrypt_password</span>(<span class="ruby-identifier">xmpp_user</span>, <span class="ruby-identifier">pass</span>)
375
+ <span class="ruby-identifier">uac</span>.<span class="ruby-identifier">commit_new_user</span>(<span class="ruby-identifier">xmpp_user</span>, <span class="ruby-identifier">xmpp_pass</span>)
376
+ <span class="ruby-constant">Kernel</span>.<span class="ruby-identifier">puts</span> <span class="ruby-node">&quot;Your XMPP username is #{xmpp_user}&quot;</span>
377
+ <span class="ruby-keyword">end</span></pre>
378
+ </div><!-- create_user-source -->
379
+
380
+ </div>
381
+
382
+
383
+
384
+
385
+ </div><!-- create_user-method -->
386
+
387
+
388
+ <div id="method-c-encrypt_password" class="method-detail ">
389
+
390
+ <div class="method-heading">
391
+ <span class="method-name">encrypt_password</span><span
392
+ class="method-args">(user, pass)</span>
393
+ <span class="method-click-advice">click to toggle source</span>
394
+ </div>
395
+
396
+
397
+ <div class="method-description">
398
+
399
+
400
+
401
+
402
+
403
+ <div class="method-source-code" id="encrypt_password-source">
404
+ <pre><span class="ruby-comment"># File lib/common_functions.rb, line 391</span>
405
+ <span class="ruby-keyword">def</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier">encrypt_password</span>(<span class="ruby-identifier">user</span>, <span class="ruby-identifier">pass</span>)
406
+ <span class="ruby-constant">Digest</span><span class="ruby-operator">::</span><span class="ruby-constant">SHA1</span>.<span class="ruby-identifier">hexdigest</span>(<span class="ruby-identifier">user</span> <span class="ruby-operator">+</span> <span class="ruby-identifier">pass</span>)
407
+ <span class="ruby-keyword">end</span></pre>
408
+ </div><!-- encrypt_password-source -->
409
+
410
+ </div>
411
+
412
+
413
+
414
+
415
+ </div><!-- encrypt_password-method -->
416
+
417
+
418
+ <div id="method-c-find_real_ssh_key" class="method-detail ">
419
+
420
+ <div class="method-heading">
421
+ <span class="method-name">find_real_ssh_key</span><span
422
+ class="method-args">(ssh_keys, host)</span>
423
+ <span class="method-click-advice">click to toggle source</span>
424
+ </div>
425
+
426
+
427
+ <div class="method-description">
428
+
429
+
430
+
431
+
432
+
433
+ <div class="method-source-code" id="find_real_ssh_key-source">
434
+ <pre><span class="ruby-comment"># File lib/common_functions.rb, line 561</span>
435
+ <span class="ruby-keyword">def</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier">find_real_ssh_key</span>(<span class="ruby-identifier">ssh_keys</span>, <span class="ruby-identifier">host</span>)
436
+ <span class="ruby-identifier">ssh_keys</span>.<span class="ruby-identifier">each</span> { <span class="ruby-operator">|</span><span class="ruby-identifier">key</span><span class="ruby-operator">|</span>
437
+ <span class="ruby-identifier">key</span> = <span class="ruby-constant">File</span>.<span class="ruby-identifier">expand_path</span>(<span class="ruby-identifier">key</span>)
438
+ <span class="ruby-identifier">return_value</span> = <span class="ruby-constant">CommonFunctions</span>.<span class="ruby-identifier">shell</span>(<span class="ruby-node">&quot;ssh -i #{key} #{SSH_OPTIONS} 2&gt;&amp;1 root@#{host} 'touch /tmp/foo'; echo $? &quot;</span>).<span class="ruby-identifier">chomp</span>
439
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">return_value</span> <span class="ruby-operator">==</span> <span class="ruby-string">&quot;0&quot;</span>
440
+ <span class="ruby-keyword">return</span> <span class="ruby-identifier">key</span>
441
+ <span class="ruby-keyword">end</span>
442
+ }
443
+
444
+ <span class="ruby-identifier">raise</span> <span class="ruby-constant">AppScaleException</span>.<span class="ruby-identifier">new</span>(<span class="ruby-constant">NO_SSH_KEY_FOUND</span>)
445
+ <span class="ruby-keyword">end</span></pre>
446
+ </div><!-- find_real_ssh_key-source -->
447
+
448
+ </div>
449
+
450
+
451
+
452
+
453
+ </div><!-- find_real_ssh_key-method -->
454
+
455
+
456
+ <div id="method-c-get_all_public_ips" class="method-detail ">
457
+
458
+ <div class="method-heading">
459
+ <span class="method-name">get_all_public_ips</span><span
460
+ class="method-args">(keyname, required=true)</span>
461
+ <span class="method-click-advice">click to toggle source</span>
462
+ </div>
463
+
464
+
465
+ <div class="method-description">
466
+
467
+
468
+
469
+
470
+
471
+ <div class="method-source-code" id="get_all_public_ips-source">
472
+ <pre><span class="ruby-comment"># File lib/common_functions.rb, line 755</span>
473
+ <span class="ruby-keyword">def</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier">get_all_public_ips</span>(<span class="ruby-identifier">keyname</span>, <span class="ruby-identifier">required</span>=<span class="ruby-keyword">true</span>)
474
+ <span class="ruby-identifier">ips</span> = []
475
+ <span class="ruby-identifier">nodes</span> = <span class="ruby-keyword">self</span>.<span class="ruby-identifier">read_nodes_json</span>(<span class="ruby-identifier">keyname</span>)
476
+ <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>
477
+ <span class="ruby-identifier">ips</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">node</span>[<span class="ruby-string">'public_ip'</span>]
478
+ }
479
+ <span class="ruby-keyword">return</span> <span class="ruby-identifier">ips</span>
480
+ <span class="ruby-keyword">end</span></pre>
481
+ </div><!-- get_all_public_ips-source -->
482
+
483
+ </div>
484
+
485
+
486
+
487
+
488
+ </div><!-- get_all_public_ips-method -->
489
+
490
+
491
+ <div id="method-c-get_app_info" class="method-detail ">
492
+
493
+ <div class="method-heading">
494
+ <span class="method-name">get_app_info</span><span
495
+ class="method-args">(fullpath, app_file)</span>
496
+ <span class="method-click-advice">click to toggle source</span>
497
+ </div>
498
+
499
+
500
+ <div class="method-description">
501
+
502
+
503
+
504
+
505
+
506
+ <div class="method-source-code" id="get_app_info-source">
507
+ <pre><span class="ruby-comment"># File lib/common_functions.rb, line 911</span>
508
+ <span class="ruby-keyword">def</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier">get_app_info</span>(<span class="ruby-identifier">fullpath</span>, <span class="ruby-identifier">app_file</span>)
509
+ <span class="ruby-keyword">if</span> <span class="ruby-operator">!</span><span class="ruby-constant">File</span>.<span class="ruby-identifier">exists?</span>(<span class="ruby-identifier">fullpath</span>)
510
+ <span class="ruby-identifier">raise</span> <span class="ruby-constant">AppEngineConfigException</span>.<span class="ruby-identifier">new</span>(<span class="ruby-string">&quot;AppEngine file not found&quot;</span>)
511
+ <span class="ruby-keyword">end</span>
512
+ <span class="ruby-identifier">filename</span> = <span class="ruby-identifier">fullpath</span>.<span class="ruby-identifier">scan</span>(<span class="ruby-regexp">%r\/?([\w\.]+\Z)/</span>).<span class="ruby-identifier">flatten</span>.<span class="ruby-identifier">to_s</span>
513
+
514
+ <span class="ruby-identifier">temp_dir</span> = <span class="ruby-constant">CommonFunctions</span>.<span class="ruby-identifier">get_random_alphanumeric</span>
515
+ <span class="ruby-constant">FileUtils</span>.<span class="ruby-identifier">rm_rf</span>(<span class="ruby-node">&quot;/tmp/#{temp_dir}&quot;</span>, <span class="ruby-value">:secure</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-keyword">true</span>)
516
+ <span class="ruby-constant">FileUtils</span>.<span class="ruby-identifier">mkdir_p</span>(<span class="ruby-node">&quot;/tmp/#{temp_dir}&quot;</span>)
517
+
518
+ <span class="ruby-constant">CommonFunctions</span>.<span class="ruby-identifier">move_app</span>(<span class="ruby-identifier">temp_dir</span>, <span class="ruby-identifier">filename</span>, <span class="ruby-identifier">app_file</span>, <span class="ruby-identifier">fullpath</span>)
519
+ <span class="ruby-identifier">app_yaml_loc</span> = <span class="ruby-identifier">app_file</span>
520
+ <span class="ruby-keyword">if</span> <span class="ruby-operator">!</span><span class="ruby-constant">File</span>.<span class="ruby-identifier">exists?</span>(<span class="ruby-node">&quot;/tmp/#{temp_dir}/#{app_file}&quot;</span>)
521
+ <span class="ruby-constant">FileUtils</span>.<span class="ruby-identifier">rm_rf</span>(<span class="ruby-node">&quot;/tmp/#{temp_dir}&quot;</span>, <span class="ruby-value">:secure</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-keyword">true</span>)
522
+ <span class="ruby-keyword">return</span> <span class="ruby-keyword">nil</span>, <span class="ruby-keyword">nil</span>, <span class="ruby-keyword">nil</span>
523
+ <span class="ruby-keyword">end</span>
524
+
525
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">app_file</span> <span class="ruby-operator">==</span> <span class="ruby-constant">PYTHON_CONFIG</span>
526
+ <span class="ruby-identifier">app_name</span> = <span class="ruby-constant">CommonFunctions</span>.<span class="ruby-identifier">get_app_name_via_yaml</span>(<span class="ruby-identifier">temp_dir</span>, <span class="ruby-identifier">app_yaml_loc</span>)
527
+ <span class="ruby-identifier">language</span> = <span class="ruby-string">&quot;python&quot;</span>
528
+ <span class="ruby-keyword">if</span> <span class="ruby-constant">File</span>.<span class="ruby-identifier">directory?</span>(<span class="ruby-identifier">fullpath</span>)
529
+ <span class="ruby-identifier">temp_dir2</span> = <span class="ruby-constant">CommonFunctions</span>.<span class="ruby-identifier">get_random_alphanumeric</span>
530
+ <span class="ruby-constant">FileUtils</span>.<span class="ruby-identifier">rm_rf</span>(<span class="ruby-node">&quot;/tmp/#{temp_dir2}&quot;</span>, <span class="ruby-value">:secure</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-keyword">true</span>)
531
+ <span class="ruby-constant">FileUtils</span>.<span class="ruby-identifier">mkdir_p</span>(<span class="ruby-node">&quot;/tmp/#{temp_dir2}&quot;</span>)
532
+ <span class="ruby-constant">CommonFunctions</span>.<span class="ruby-identifier">shell</span>(<span class="ruby-node">&quot;cd /tmp/#{temp_dir}; tar -czf ../#{temp_dir2}/#{app_name}.tar.gz .&quot;</span>)
533
+ <span class="ruby-identifier">file</span> = <span class="ruby-node">&quot;/tmp/#{temp_dir2}/#{app_name}.tar.gz&quot;</span>
534
+ <span class="ruby-keyword">else</span>
535
+ <span class="ruby-identifier">file</span> = <span class="ruby-identifier">fullpath</span>
536
+ <span class="ruby-keyword">end</span>
537
+ <span class="ruby-keyword">elsif</span> <span class="ruby-identifier">app_file</span> <span class="ruby-operator">==</span> <span class="ruby-constant">JAVA_CONFIG</span>
538
+ <span class="ruby-identifier">app_name</span> = <span class="ruby-constant">CommonFunctions</span>.<span class="ruby-identifier">get_app_name_via_xml</span>(<span class="ruby-identifier">temp_dir</span>, <span class="ruby-identifier">app_yaml_loc</span>)
539
+ <span class="ruby-identifier">language</span> = <span class="ruby-string">&quot;java&quot;</span>
540
+ <span class="ruby-comment"># don't remove user's jar files, they may have their own jars in it</span>
541
+ <span class="ruby-comment">#FileUtils.rm_rf(&quot;/tmp/#{temp_dir}/war/WEB-INF/lib/&quot;, :secure =&gt; true)</span>
542
+ <span class="ruby-constant">FileUtils</span>.<span class="ruby-identifier">mkdir_p</span>(<span class="ruby-node">&quot;/tmp/#{temp_dir}/war/WEB-INF/lib&quot;</span>)
543
+ <span class="ruby-identifier">temp_dir2</span> = <span class="ruby-constant">CommonFunctions</span>.<span class="ruby-identifier">get_random_alphanumeric</span>
544
+ <span class="ruby-constant">FileUtils</span>.<span class="ruby-identifier">rm_rf</span>(<span class="ruby-node">&quot;/tmp/#{temp_dir2}&quot;</span>, <span class="ruby-value">:secure</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-keyword">true</span>)
545
+ <span class="ruby-constant">FileUtils</span>.<span class="ruby-identifier">mkdir_p</span>(<span class="ruby-node">&quot;/tmp/#{temp_dir2}&quot;</span>)
546
+ <span class="ruby-constant">FileUtils</span>.<span class="ruby-identifier">rm_f</span>(<span class="ruby-node">&quot;/tmp/#{temp_dir}/#{filename}&quot;</span>)
547
+ <span class="ruby-constant">CommonFunctions</span>.<span class="ruby-identifier">shell</span>(<span class="ruby-node">&quot;cd /tmp/#{temp_dir}; tar -czf ../#{temp_dir2}/#{app_name}.tar.gz .&quot;</span>)
548
+ <span class="ruby-identifier">file</span> = <span class="ruby-node">&quot;/tmp/#{temp_dir2}/#{app_name}.tar.gz&quot;</span>
549
+ <span class="ruby-keyword">else</span>
550
+ <span class="ruby-constant">FileUtils</span>.<span class="ruby-identifier">rm_rf</span>(<span class="ruby-node">&quot;/tmp/#{temp_dir}&quot;</span>, <span class="ruby-value">:secure</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-keyword">true</span>)
551
+ <span class="ruby-identifier">raise</span> <span class="ruby-constant">AppEngineConfigException</span>.<span class="ruby-identifier">new</span>(<span class="ruby-node">&quot;app_name was #{app_file}, &quot;</span> <span class="ruby-operator">+</span>
552
+ <span class="ruby-string">&quot;which was not a recognized value.&quot;</span>)
553
+ <span class="ruby-keyword">end</span>
554
+
555
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">app_name</span>.<span class="ruby-identifier">nil?</span>
556
+ <span class="ruby-constant">FileUtils</span>.<span class="ruby-identifier">rm_rf</span>(<span class="ruby-node">&quot;/tmp/#{temp_dir}&quot;</span>, <span class="ruby-value">:secure</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-keyword">true</span>)
557
+ <span class="ruby-identifier">raise</span> <span class="ruby-constant">AppEngineConfigException</span>.<span class="ruby-identifier">new</span>(<span class="ruby-string">&quot;AppEngine tar file is invalid - &quot;</span> <span class="ruby-operator">+</span>
558
+ <span class="ruby-node">&quot;Doesn't have an app name in #{app_file}&quot;</span>)
559
+ <span class="ruby-keyword">end</span>
560
+
561
+ <span class="ruby-constant">FileUtils</span>.<span class="ruby-identifier">rm_rf</span>(<span class="ruby-node">&quot;/tmp/#{temp_dir}&quot;</span>, <span class="ruby-value">:secure</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-keyword">true</span>)
562
+ <span class="ruby-constant">CommonFunctions</span>.<span class="ruby-identifier">warn_on_large_app_size</span>(<span class="ruby-identifier">file</span>)
563
+ <span class="ruby-keyword">return</span> <span class="ruby-identifier">app_name</span>, <span class="ruby-identifier">file</span>, <span class="ruby-identifier">language</span>
564
+ <span class="ruby-keyword">end</span></pre>
565
+ </div><!-- get_app_info-source -->
566
+
567
+ </div>
568
+
569
+
570
+
571
+
572
+ </div><!-- get_app_info-method -->
573
+
574
+
575
+ <div id="method-c-get_app_info_from_options" class="method-detail ">
576
+
577
+ <div class="method-heading">
578
+ <span class="method-name">get_app_info_from_options</span><span
579
+ class="method-args">(options)</span>
580
+ <span class="method-click-advice">click to toggle source</span>
581
+ </div>
582
+
583
+
584
+ <div class="method-description">
585
+
586
+
587
+
588
+
589
+
590
+ <div class="method-source-code" id="get_app_info_from_options-source">
591
+ <pre><span class="ruby-comment"># File lib/common_functions.rb, line 856</span>
592
+ <span class="ruby-keyword">def</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier">get_app_info_from_options</span>(<span class="ruby-identifier">options</span>)
593
+ <span class="ruby-identifier">file_location</span> = <span class="ruby-identifier">options</span>[<span class="ruby-string">'file_location'</span>]
594
+ <span class="ruby-identifier">table</span> = <span class="ruby-identifier">options</span>[<span class="ruby-string">'table'</span>]
595
+
596
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">file_location</span>.<span class="ruby-identifier">nil?</span>
597
+ <span class="ruby-identifier">apps_to_start</span> = [<span class="ruby-string">&quot;none&quot;</span>]
598
+ <span class="ruby-keyword">return</span> <span class="ruby-identifier">apps_to_start</span>, {}
599
+ <span class="ruby-keyword">else</span>
600
+ <span class="ruby-identifier">app_info</span> = <span class="ruby-constant">CommonFunctions</span>.<span class="ruby-identifier">get_app_name_from_tar</span>(<span class="ruby-identifier">file_location</span>)
601
+ <span class="ruby-identifier">apps_to_start</span> = [<span class="ruby-constant">CommonFunctions</span>.<span class="ruby-identifier">validate_app_name</span>(<span class="ruby-identifier">app_info</span>[<span class="ruby-value">:app_name</span>], <span class="ruby-identifier">table</span>)]
602
+ <span class="ruby-keyword">return</span> <span class="ruby-identifier">apps_to_start</span>, <span class="ruby-identifier">app_info</span>
603
+ <span class="ruby-keyword">end</span>
604
+ <span class="ruby-keyword">end</span></pre>
605
+ </div><!-- get_app_info_from_options-source -->
606
+
607
+ </div>
608
+
609
+
610
+
611
+
612
+ </div><!-- get_app_info_from_options-method -->
613
+
614
+
615
+ <div id="method-c-get_app_name_from_tar" class="method-detail ">
616
+
617
+ <div class="method-heading">
618
+ <span class="method-name">get_app_name_from_tar</span><span
619
+ class="method-args">(fullpath)</span>
620
+ <span class="method-click-advice">click to toggle source</span>
621
+ </div>
622
+
623
+
624
+ <div class="method-description">
625
+
626
+
627
+
628
+
629
+
630
+ <div class="method-source-code" id="get_app_name_from_tar-source">
631
+ <pre><span class="ruby-comment"># File lib/common_functions.rb, line 871</span>
632
+ <span class="ruby-keyword">def</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier">get_app_name_from_tar</span>(<span class="ruby-identifier">fullpath</span>)
633
+ <span class="ruby-identifier">app_name</span>, <span class="ruby-identifier">file</span>, <span class="ruby-identifier">language</span> = <span class="ruby-constant">CommonFunctions</span>.<span class="ruby-identifier">get_app_info</span>(<span class="ruby-identifier">fullpath</span>, <span class="ruby-constant">PYTHON_CONFIG</span>)
634
+
635
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">app_name</span>.<span class="ruby-identifier">nil?</span> <span class="ruby-keyword">or</span> <span class="ruby-identifier">file</span>.<span class="ruby-identifier">nil?</span> <span class="ruby-keyword">or</span> <span class="ruby-identifier">language</span>.<span class="ruby-identifier">nil?</span>
636
+ <span class="ruby-identifier">app_name</span>, <span class="ruby-identifier">file</span>, <span class="ruby-identifier">language</span> = <span class="ruby-constant">CommonFunctions</span>.<span class="ruby-identifier">get_app_info</span>(<span class="ruby-identifier">fullpath</span>, <span class="ruby-constant">JAVA_CONFIG</span>)
637
+ <span class="ruby-keyword">end</span>
638
+
639
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">app_name</span>.<span class="ruby-identifier">nil?</span> <span class="ruby-keyword">or</span> <span class="ruby-identifier">file</span>.<span class="ruby-identifier">nil?</span> <span class="ruby-keyword">or</span> <span class="ruby-identifier">language</span>.<span class="ruby-identifier">nil?</span>
640
+ <span class="ruby-identifier">raise</span> <span class="ruby-constant">AppScaleException</span>.<span class="ruby-identifier">new</span>(<span class="ruby-constant">NO_CONFIG_FILE</span>)
641
+ <span class="ruby-keyword">end</span>
642
+
643
+ <span class="ruby-keyword">return</span> {<span class="ruby-value">:app_name</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">app_name</span>, <span class="ruby-value">:file</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">file</span>, <span class="ruby-value">:language</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">language</span>}
644
+ <span class="ruby-keyword">end</span></pre>
645
+ </div><!-- get_app_name_from_tar-source -->
646
+
647
+ </div>
648
+
649
+
650
+
651
+
652
+ </div><!-- get_app_name_from_tar-method -->
653
+
654
+
655
+ <div id="method-c-get_app_name_via_xml" class="method-detail ">
656
+
657
+ <div class="method-heading">
658
+ <span class="method-name">get_app_name_via_xml</span><span
659
+ class="method-args">(temp_dir, xml_loc)</span>
660
+ <span class="method-click-advice">click to toggle source</span>
661
+ </div>
662
+
663
+
664
+ <div class="method-description">
665
+
666
+
667
+
668
+
669
+
670
+ <div class="method-source-code" id="get_app_name_via_xml-source">
671
+ <pre><span class="ruby-comment"># File lib/common_functions.rb, line 984</span>
672
+ <span class="ruby-keyword">def</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier">get_app_name_via_xml</span>(<span class="ruby-identifier">temp_dir</span>, <span class="ruby-identifier">xml_loc</span>)
673
+ <span class="ruby-identifier">xml_loc</span> = <span class="ruby-string">&quot;/tmp/&quot;</span> <span class="ruby-operator">+</span> <span class="ruby-identifier">temp_dir</span> <span class="ruby-operator">+</span> <span class="ruby-string">&quot;/&quot;</span> <span class="ruby-operator">+</span> <span class="ruby-identifier">xml_loc</span>
674
+ <span class="ruby-identifier">web_xml_contents</span> = (<span class="ruby-constant">File</span>.<span class="ruby-identifier">open</span>(<span class="ruby-identifier">xml_loc</span>) { <span class="ruby-operator">|</span><span class="ruby-identifier">f</span><span class="ruby-operator">|</span> <span class="ruby-identifier">f</span>.<span class="ruby-identifier">read</span> }).<span class="ruby-identifier">chomp</span>
675
+ <span class="ruby-identifier">app_name</span> = <span class="ruby-identifier">web_xml_contents</span>.<span class="ruby-identifier">scan</span>(<span class="ruby-regexp">%r&lt;application&gt;([\w\d-]+)&lt;\/application&gt;/</span>).<span class="ruby-identifier">flatten</span>.<span class="ruby-identifier">to_s</span>
676
+ <span class="ruby-identifier">app_name</span> = <span class="ruby-keyword">nil</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">app_name</span> <span class="ruby-operator">==</span> <span class="ruby-string">&quot;&quot;</span>
677
+ <span class="ruby-keyword">return</span> <span class="ruby-identifier">app_name</span>
678
+ <span class="ruby-keyword">end</span></pre>
679
+ </div><!-- get_app_name_via_xml-source -->
680
+
681
+ </div>
682
+
683
+
684
+
685
+
686
+ </div><!-- get_app_name_via_xml-method -->
687
+
688
+
689
+ <div id="method-c-get_app_name_via_yaml" class="method-detail ">
690
+
691
+ <div class="method-heading">
692
+ <span class="method-name">get_app_name_via_yaml</span><span
693
+ class="method-args">(temp_dir, app_yaml_loc)</span>
694
+ <span class="method-click-advice">click to toggle source</span>
695
+ </div>
696
+
697
+
698
+ <div class="method-description">
699
+
700
+
701
+
702
+
703
+
704
+ <div class="method-source-code" id="get_app_name_via_yaml-source">
705
+ <pre><span class="ruby-comment"># File lib/common_functions.rb, line 970</span>
706
+ <span class="ruby-keyword">def</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier">get_app_name_via_yaml</span>(<span class="ruby-identifier">temp_dir</span>, <span class="ruby-identifier">app_yaml_loc</span>)
707
+ <span class="ruby-identifier">app_yaml_loc</span> = <span class="ruby-string">&quot;/tmp/&quot;</span> <span class="ruby-operator">+</span> <span class="ruby-identifier">temp_dir</span> <span class="ruby-operator">+</span> <span class="ruby-string">&quot;/&quot;</span> <span class="ruby-operator">+</span> <span class="ruby-identifier">app_yaml_loc</span>
708
+
709
+ <span class="ruby-keyword">begin</span>
710
+ <span class="ruby-identifier">tree</span> = <span class="ruby-constant">YAML</span>.<span class="ruby-identifier">load_file</span>(<span class="ruby-identifier">app_yaml_loc</span>.<span class="ruby-identifier">chomp</span>)
711
+ <span class="ruby-keyword">rescue</span> <span class="ruby-constant">ArgumentError</span>
712
+ <span class="ruby-identifier">raise</span> <span class="ruby-constant">AppScaleException</span>.<span class="ruby-identifier">new</span>(<span class="ruby-constant">MALFORMED_YAML</span>)
713
+ <span class="ruby-keyword">end</span>
714
+
715
+ <span class="ruby-identifier">app_name</span> = <span class="ruby-constant">String</span>(<span class="ruby-identifier">tree</span>[<span class="ruby-string">&quot;application&quot;</span>])
716
+ <span class="ruby-keyword">return</span> <span class="ruby-identifier">app_name</span>
717
+ <span class="ruby-keyword">end</span></pre>
718
+ </div><!-- get_app_name_via_yaml-source -->
719
+
720
+ </div>
721
+
722
+
723
+
724
+
725
+ </div><!-- get_app_name_via_yaml-method -->
726
+
727
+
728
+ <div id="method-c-get_credentials" class="method-detail ">
729
+
730
+ <div class="method-heading">
731
+ <span class="method-name">get_credentials</span><span
732
+ class="method-args">(testing)</span>
733
+ <span class="method-click-advice">click to toggle source</span>
734
+ </div>
735
+
736
+
737
+ <div class="method-description">
738
+
739
+
740
+
741
+
742
+
743
+ <div class="method-source-code" id="get_credentials-source">
744
+ <pre><span class="ruby-comment"># File lib/common_functions.rb, line 239</span>
745
+ <span class="ruby-keyword">def</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier">get_credentials</span>(<span class="ruby-identifier">testing</span>)
746
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">testing</span>
747
+ <span class="ruby-keyword">return</span> <span class="ruby-constant">DEFAULT_USERNAME</span>, <span class="ruby-constant">DEFAULT_PASSWORD</span>
748
+ <span class="ruby-keyword">else</span>
749
+ <span class="ruby-keyword">return</span> <span class="ruby-constant">CommonFunctions</span>.<span class="ruby-identifier">get_email</span>, <span class="ruby-constant">CommonFunctions</span>.<span class="ruby-identifier">get_password</span>
750
+ <span class="ruby-keyword">end</span>
751
+ <span class="ruby-keyword">end</span></pre>
752
+ </div><!-- get_credentials-source -->
753
+
754
+ </div>
755
+
756
+
757
+
758
+
759
+ </div><!-- get_credentials-method -->
760
+
761
+
762
+ <div id="method-c-get_db_master_ip" class="method-detail ">
763
+
764
+ <div class="method-heading">
765
+ <span class="method-name">get_db_master_ip</span><span
766
+ class="method-args">(keyname, required=true)</span>
767
+ <span class="method-click-advice">click to toggle source</span>
768
+ </div>
769
+
770
+
771
+ <div class="method-description">
772
+
773
+
774
+
775
+
776
+
777
+ <div class="method-source-code" id="get_db_master_ip-source">
778
+ <pre><span class="ruby-comment"># File lib/common_functions.rb, line 765</span>
779
+ <span class="ruby-keyword">def</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier">get_db_master_ip</span>(<span class="ruby-identifier">keyname</span>, <span class="ruby-identifier">required</span>=<span class="ruby-keyword">true</span>)
780
+ <span class="ruby-keyword">return</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier">get_role_from_nodes</span>(<span class="ruby-identifier">keyname</span>, <span class="ruby-string">'db_master'</span>)
781
+ <span class="ruby-keyword">end</span></pre>
782
+ </div><!-- get_db_master_ip-source -->
783
+
784
+ </div>
785
+
786
+
787
+
788
+
789
+ </div><!-- get_db_master_ip-method -->
790
+
791
+
792
+ <div id="method-c-get_email" class="method-detail ">
793
+
794
+ <div class="method-heading">
795
+ <span class="method-name">get_email</span><span
796
+ class="method-args">()</span>
797
+ <span class="method-click-advice">click to toggle source</span>
798
+ </div>
799
+
800
+
801
+ <div class="method-description">
802
+
803
+
804
+
805
+
806
+
807
+ <div class="method-source-code" id="get_email-source">
808
+ <pre><span class="ruby-comment"># File lib/common_functions.rb, line 638</span>
809
+ <span class="ruby-keyword">def</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier">get_email</span>
810
+ <span class="ruby-identifier">email</span> = <span class="ruby-keyword">nil</span>
811
+ <span class="ruby-constant">Kernel</span>.<span class="ruby-identifier">puts</span> <span class="ruby-string">&quot;\nThis AppScale instance is linked to an e-mail address giving it administrator privileges.&quot;</span>
812
+
813
+ <span class="ruby-identifier">loop</span> {
814
+ <span class="ruby-constant">Kernel</span>.<span class="ruby-identifier">print</span> <span class="ruby-string">&quot;Enter your desired administrator e-mail address: &quot;</span>
815
+ <span class="ruby-constant">STDOUT</span>.<span class="ruby-identifier">flush</span>
816
+ <span class="ruby-identifier">email</span> = <span class="ruby-constant">STDIN</span>.<span class="ruby-identifier">gets</span>.<span class="ruby-identifier">chomp</span>
817
+
818
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">email</span> <span class="ruby-operator">=~</span> <span class="ruby-constant">EMAIL_REGEX</span>
819
+ <span class="ruby-keyword">break</span>
820
+ <span class="ruby-keyword">else</span>
821
+ <span class="ruby-constant">Kernel</span>.<span class="ruby-identifier">puts</span> <span class="ruby-string">&quot;The response you typed in was not an e-mail address. Please try again.\n\n&quot;</span>
822
+ <span class="ruby-keyword">end</span>
823
+ }
824
+
825
+ <span class="ruby-keyword">return</span> <span class="ruby-identifier">email</span>
826
+ <span class="ruby-keyword">end</span></pre>
827
+ </div><!-- get_email-source -->
828
+
829
+ </div>
830
+
831
+
832
+
833
+
834
+ </div><!-- get_email-method -->
835
+
836
+
837
+ <div id="method-c-get_from_yaml" class="method-detail ">
838
+
839
+ <div class="method-heading">
840
+ <span class="method-name">get_from_yaml</span><span
841
+ class="method-args">(keyname, tag, required=true)</span>
842
+ <span class="method-click-advice">click to toggle source</span>
843
+ </div>
844
+
845
+
846
+ <div class="method-description">
847
+
848
+
849
+
850
+
851
+
852
+ <div class="method-source-code" id="get_from_yaml-source">
853
+ <pre><span class="ruby-comment"># File lib/common_functions.rb, line 696</span>
854
+ <span class="ruby-keyword">def</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier">get_from_yaml</span>(<span class="ruby-identifier">keyname</span>, <span class="ruby-identifier">tag</span>, <span class="ruby-identifier">required</span>=<span class="ruby-keyword">true</span>)
855
+ <span class="ruby-identifier">location_file</span> = <span class="ruby-constant">File</span>.<span class="ruby-identifier">expand_path</span>(<span class="ruby-node">&quot;~/.appscale/locations-#{keyname}.yaml&quot;</span>)
856
+
857
+ <span class="ruby-keyword">if</span> <span class="ruby-operator">!</span><span class="ruby-constant">File</span>.<span class="ruby-identifier">exists?</span>(<span class="ruby-identifier">location_file</span>)
858
+ <span class="ruby-identifier">raise</span> <span class="ruby-constant">AppScaleException</span>.<span class="ruby-identifier">new</span>(<span class="ruby-string">&quot;An AppScale instance is not currently &quot;</span> <span class="ruby-operator">+</span>
859
+ <span class="ruby-node">&quot;running with the provided keyname, \&quot;#{keyname}\&quot;.&quot;</span>)
860
+ <span class="ruby-keyword">end</span>
861
+
862
+ <span class="ruby-keyword">begin</span>
863
+ <span class="ruby-identifier">tree</span> = <span class="ruby-constant">YAML</span>.<span class="ruby-identifier">load_file</span>(<span class="ruby-identifier">location_file</span>)
864
+ <span class="ruby-keyword">rescue</span> <span class="ruby-constant">ArgumentError</span>
865
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">required</span>
866
+ <span class="ruby-identifier">raise</span> <span class="ruby-constant">AppScaleException</span>.<span class="ruby-identifier">new</span>(<span class="ruby-constant">MALFORMED_YAML</span>)
867
+ <span class="ruby-keyword">else</span>
868
+ <span class="ruby-keyword">return</span> <span class="ruby-keyword">nil</span>
869
+ <span class="ruby-keyword">end</span>
870
+ <span class="ruby-keyword">end</span>
871
+
872
+ <span class="ruby-keyword">if</span> <span class="ruby-operator">!</span><span class="ruby-identifier">tree</span>
873
+ <span class="ruby-identifier">raise</span> <span class="ruby-constant">AppScaleException</span>.<span class="ruby-identifier">new</span>(<span class="ruby-string">&quot;The location file is in the wrong format.&quot;</span>)
874
+ <span class="ruby-keyword">end</span>
875
+
876
+ <span class="ruby-identifier">value</span> = <span class="ruby-identifier">tree</span>[<span class="ruby-identifier">tag</span>]
877
+
878
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">value</span>.<span class="ruby-identifier">nil?</span> <span class="ruby-keyword">and</span> <span class="ruby-identifier">required</span>
879
+ <span class="ruby-identifier">raise</span> <span class="ruby-constant">AppScaleException</span>.<span class="ruby-identifier">new</span>(<span class="ruby-node">&quot;The location file did not contain a #{tag} tag.&quot;</span>)
880
+ <span class="ruby-keyword">end</span>
881
+
882
+ <span class="ruby-keyword">return</span> <span class="ruby-identifier">value</span>
883
+ <span class="ruby-keyword">end</span></pre>
884
+ </div><!-- get_from_yaml-source -->
885
+
886
+ </div>
887
+
888
+
889
+
890
+
891
+ </div><!-- get_from_yaml-method -->
892
+
893
+
894
+ <div id="method-c-get_head_node_ip" class="method-detail ">
895
+
896
+ <div class="method-heading">
897
+ <span class="method-name">get_head_node_ip</span><span
898
+ class="method-args">(keyname, required=true)</span>
899
+ <span class="method-click-advice">click to toggle source</span>
900
+ </div>
901
+
902
+
903
+ <div class="method-description">
904
+
905
+
906
+
907
+
908
+
909
+ <div class="method-source-code" id="get_head_node_ip-source">
910
+ <pre><span class="ruby-comment"># File lib/common_functions.rb, line 770</span>
911
+ <span class="ruby-keyword">def</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier">get_head_node_ip</span>(<span class="ruby-identifier">keyname</span>, <span class="ruby-identifier">required</span>=<span class="ruby-keyword">true</span>)
912
+ <span class="ruby-keyword">return</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier">get_role_from_nodes</span>(<span class="ruby-identifier">keyname</span>, <span class="ruby-string">'shadow'</span>)
913
+ <span class="ruby-keyword">end</span></pre>
914
+ </div><!-- get_head_node_ip-source -->
915
+
916
+ </div>
917
+
918
+
919
+
920
+
921
+ </div><!-- get_head_node_ip-method -->
922
+
923
+
924
+ <div id="method-c-get_infrastructure" class="method-detail ">
925
+
926
+ <div class="method-heading">
927
+ <span class="method-name">get_infrastructure</span><span
928
+ class="method-args">(keyname, required=true)</span>
929
+ <span class="method-click-advice">click to toggle source</span>
930
+ </div>
931
+
932
+
933
+ <div class="method-description">
934
+
935
+
936
+
937
+
938
+
939
+ <div class="method-source-code" id="get_infrastructure-source">
940
+ <pre><span class="ruby-comment"># File lib/common_functions.rb, line 780</span>
941
+ <span class="ruby-keyword">def</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier">get_infrastructure</span>(<span class="ruby-identifier">keyname</span>, <span class="ruby-identifier">required</span>=<span class="ruby-keyword">true</span>)
942
+ <span class="ruby-constant">CommonFunctions</span>.<span class="ruby-identifier">get_from_yaml</span>(<span class="ruby-identifier">keyname</span>, <span class="ruby-value">:infrastructure</span>)
943
+ <span class="ruby-keyword">end</span></pre>
944
+ </div><!-- get_infrastructure-source -->
945
+
946
+ </div>
947
+
948
+
949
+
950
+
951
+ </div><!-- get_infrastructure-method -->
952
+
953
+
954
+ <div id="method-c-get_ips_from_yaml" class="method-detail ">
955
+
956
+ <div class="method-heading">
957
+ <span class="method-name">get_ips_from_yaml</span><span
958
+ class="method-args">(ips)</span>
959
+ <span class="method-click-advice">click to toggle source</span>
960
+ </div>
961
+
962
+
963
+ <div class="method-description">
964
+
965
+
966
+
967
+
968
+
969
+ <div class="method-source-code" id="get_ips_from_yaml-source">
970
+ <pre><span class="ruby-comment"># File lib/common_functions.rb, line 220</span>
971
+ <span class="ruby-keyword">def</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier">get_ips_from_yaml</span>(<span class="ruby-identifier">ips</span>)
972
+ <span class="ruby-keyword">return</span> <span class="ruby-string">&quot;using_tools&quot;</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">ips</span>.<span class="ruby-identifier">nil?</span>
973
+
974
+ <span class="ruby-identifier">ips_to_use</span> = []
975
+ <span class="ruby-keyword">if</span> <span class="ruby-operator">!</span><span class="ruby-identifier">ips</span>[<span class="ruby-value">:servers</span>].<span class="ruby-identifier">nil?</span>
976
+ <span class="ruby-identifier">ips</span>[<span class="ruby-value">:servers</span>].<span class="ruby-identifier">each</span> { <span class="ruby-operator">|</span><span class="ruby-identifier">ip</span><span class="ruby-operator">|</span>
977
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">ip</span> <span class="ruby-operator">=~</span> <span class="ruby-constant">IP_REGEX</span>
978
+ <span class="ruby-identifier">ips_to_use</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">ip</span>
979
+ <span class="ruby-keyword">else</span>
980
+ <span class="ruby-identifier">ips_to_use</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-constant">CommonFunctions</span>.<span class="ruby-identifier">convert_fqdn_to_ip</span>(<span class="ruby-identifier">ip</span>)
981
+ <span class="ruby-keyword">end</span>
982
+ }
983
+ <span class="ruby-identifier">ips_to_use</span> = <span class="ruby-identifier">ips_to_use</span>.<span class="ruby-identifier">join</span>(<span class="ruby-string">&quot;:&quot;</span>)
984
+ <span class="ruby-keyword">end</span>
985
+
986
+ <span class="ruby-keyword">return</span> <span class="ruby-identifier">ips_to_use</span>
987
+ <span class="ruby-keyword">end</span></pre>
988
+ </div><!-- get_ips_from_yaml-source -->
989
+
990
+ </div>
991
+
992
+
993
+
994
+
995
+ </div><!-- get_ips_from_yaml-method -->
996
+
997
+
998
+ <div id="method-c-get_line_from_stdin_no_echo" class="method-detail ">
999
+
1000
+ <div class="method-heading">
1001
+ <span class="method-name">get_line_from_stdin_no_echo</span><span
1002
+ class="method-args">()</span>
1003
+ <span class="method-click-advice">click to toggle source</span>
1004
+ </div>
1005
+
1006
+
1007
+ <div class="method-description">
1008
+
1009
+
1010
+
1011
+
1012
+
1013
+ <div class="method-source-code" id="get_line_from_stdin_no_echo-source">
1014
+ <pre><span class="ruby-comment"># File lib/common_functions.rb, line 686</span>
1015
+ <span class="ruby-keyword">def</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier">get_line_from_stdin_no_echo</span>
1016
+ <span class="ruby-identifier">state</span> = <span class="ruby-constant">CommonFunctions</span>.<span class="ruby-identifier">shell</span>(<span class="ruby-string">&quot;stty -g&quot;</span>)
1017
+ <span class="ruby-identifier">system</span> <span class="ruby-string">&quot;stty -echo&quot;</span> <span class="ruby-comment"># Turn off character echoing</span>
1018
+ <span class="ruby-constant">STDOUT</span>.<span class="ruby-identifier">flush</span>
1019
+ <span class="ruby-identifier">line</span> = <span class="ruby-constant">STDIN</span>.<span class="ruby-identifier">gets</span>.<span class="ruby-identifier">chomp</span>
1020
+ <span class="ruby-identifier">system</span> <span class="ruby-node">&quot;stty #{state}&quot;</span>
1021
+ <span class="ruby-keyword">return</span> <span class="ruby-identifier">line</span>
1022
+ <span class="ruby-keyword">end</span></pre>
1023
+ </div><!-- get_line_from_stdin_no_echo-source -->
1024
+
1025
+ </div>
1026
+
1027
+
1028
+
1029
+
1030
+ </div><!-- get_line_from_stdin_no_echo-method -->
1031
+
1032
+
1033
+ <div id="method-c-get_load_balancer_id" class="method-detail ">
1034
+
1035
+ <div class="method-heading">
1036
+ <span class="method-name">get_load_balancer_id</span><span
1037
+ class="method-args">(keyname, required=true)</span>
1038
+ <span class="method-click-advice">click to toggle source</span>
1039
+ </div>
1040
+
1041
+
1042
+ <div class="method-description">
1043
+
1044
+
1045
+
1046
+
1047
+
1048
+ <div class="method-source-code" id="get_load_balancer_id-source">
1049
+ <pre><span class="ruby-comment"># File lib/common_functions.rb, line 745</span>
1050
+ <span class="ruby-keyword">def</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier">get_load_balancer_id</span>(<span class="ruby-identifier">keyname</span>, <span class="ruby-identifier">required</span>=<span class="ruby-keyword">true</span>)
1051
+ <span class="ruby-keyword">return</span> <span class="ruby-constant">CommonFunctions</span>.<span class="ruby-identifier">get_from_yaml</span>(<span class="ruby-identifier">keyname</span>, <span class="ruby-value">:instance_id</span>)
1052
+ <span class="ruby-keyword">end</span></pre>
1053
+ </div><!-- get_load_balancer_id-source -->
1054
+
1055
+ </div>
1056
+
1057
+
1058
+
1059
+
1060
+ </div><!-- get_load_balancer_id-method -->
1061
+
1062
+
1063
+ <div id="method-c-get_load_balancer_ip" class="method-detail ">
1064
+
1065
+ <div class="method-heading">
1066
+ <span class="method-name">get_load_balancer_ip</span><span
1067
+ class="method-args">(keyname, required=true)</span>
1068
+ <span class="method-click-advice">click to toggle source</span>
1069
+ </div>
1070
+
1071
+
1072
+ <div class="method-description">
1073
+
1074
+
1075
+
1076
+
1077
+
1078
+ <div class="method-source-code" id="get_load_balancer_ip-source">
1079
+ <pre><span class="ruby-comment"># File lib/common_functions.rb, line 740</span>
1080
+ <span class="ruby-keyword">def</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier">get_load_balancer_ip</span>(<span class="ruby-identifier">keyname</span>, <span class="ruby-identifier">required</span>=<span class="ruby-keyword">true</span>)
1081
+ <span class="ruby-keyword">return</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier">get_role_from_nodes</span>(<span class="ruby-identifier">keyname</span>, <span class="ruby-string">'load_balancer'</span>)
1082
+ <span class="ruby-keyword">end</span></pre>
1083
+ </div><!-- get_load_balancer_ip-source -->
1084
+
1085
+ </div>
1086
+
1087
+
1088
+
1089
+
1090
+ </div><!-- get_load_balancer_ip-method -->
1091
+
1092
+
1093
+ <div id="method-c-get_login_ip" class="method-detail ">
1094
+
1095
+ <div class="method-heading">
1096
+ <span class="method-name">get_login_ip</span><span
1097
+ class="method-args">(head_node_ip, secret_key)</span>
1098
+ <span class="method-click-advice">click to toggle source</span>
1099
+ </div>
1100
+
1101
+
1102
+ <div class="method-description">
1103
+
1104
+
1105
+
1106
+
1107
+
1108
+ <div class="method-source-code" id="get_login_ip-source">
1109
+ <pre><span class="ruby-comment"># File lib/common_functions.rb, line 177</span>
1110
+ <span class="ruby-keyword">def</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier">get_login_ip</span>(<span class="ruby-identifier">head_node_ip</span>, <span class="ruby-identifier">secret_key</span>)
1111
+ <span class="ruby-identifier">acc</span> = <span class="ruby-constant">AppControllerClient</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">head_node_ip</span>, <span class="ruby-identifier">secret_key</span>)
1112
+ <span class="ruby-identifier">all_nodes</span> = <span class="ruby-identifier">acc</span>.<span class="ruby-identifier">get_all_public_ips</span>()
1113
+
1114
+ <span class="ruby-identifier">all_nodes</span>.<span class="ruby-identifier">each</span> { <span class="ruby-operator">|</span><span class="ruby-identifier">node</span><span class="ruby-operator">|</span>
1115
+ <span class="ruby-identifier">acc_new</span> = <span class="ruby-constant">AppControllerClient</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">node</span>, <span class="ruby-identifier">secret_key</span>)
1116
+ <span class="ruby-identifier">roles</span> = <span class="ruby-identifier">acc_new</span>.<span class="ruby-identifier">status</span>()
1117
+ <span class="ruby-keyword">return</span> <span class="ruby-identifier">node</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">roles</span>.<span class="ruby-identifier">match</span>(<span class="ruby-regexp">%rIs currently:(.*)login/</span>)
1118
+ }
1119
+
1120
+ <span class="ruby-identifier">raise</span> <span class="ruby-constant">AppScaleException</span>.<span class="ruby-identifier">new</span>(<span class="ruby-string">&quot;Unable to find login ip address!&quot;</span>)
1121
+ <span class="ruby-keyword">end</span></pre>
1122
+ </div><!-- get_login_ip-source -->
1123
+
1124
+ </div>
1125
+
1126
+
1127
+
1128
+
1129
+ </div><!-- get_login_ip-method -->
1130
+
1131
+
1132
+ <div id="method-c-get_password" class="method-detail ">
1133
+
1134
+ <div class="method-heading">
1135
+ <span class="method-name">get_password</span><span
1136
+ class="method-args">()</span>
1137
+ <span class="method-click-advice">click to toggle source</span>
1138
+ </div>
1139
+
1140
+
1141
+ <div class="method-description">
1142
+
1143
+
1144
+
1145
+
1146
+
1147
+ <div class="method-source-code" id="get_password-source">
1148
+ <pre><span class="ruby-comment"># File lib/common_functions.rb, line 658</span>
1149
+ <span class="ruby-keyword">def</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier">get_password</span>()
1150
+ <span class="ruby-identifier">pass</span> = <span class="ruby-keyword">nil</span>
1151
+ <span class="ruby-constant">Kernel</span>.<span class="ruby-identifier">puts</span> <span class="ruby-string">&quot;\nThe new administrator password must be at least six characters long and can include non-alphanumeric characters.&quot;</span>
1152
+
1153
+ <span class="ruby-identifier">loop</span> {
1154
+ <span class="ruby-constant">Kernel</span>.<span class="ruby-identifier">print</span> <span class="ruby-string">&quot;Enter your new password: &quot;</span>
1155
+ <span class="ruby-identifier">new_pass</span> = <span class="ruby-keyword">self</span>.<span class="ruby-identifier">get_line_from_stdin_no_echo</span>()
1156
+ <span class="ruby-constant">Kernel</span>.<span class="ruby-identifier">print</span> <span class="ruby-string">&quot;\nEnter again to verify: &quot;</span>
1157
+ <span class="ruby-identifier">verify_pass</span> = <span class="ruby-keyword">self</span>.<span class="ruby-identifier">get_line_from_stdin_no_echo</span>()
1158
+ <span class="ruby-constant">Kernel</span>.<span class="ruby-identifier">print</span> <span class="ruby-string">&quot;\n&quot;</span>
1159
+
1160
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">new_pass</span> <span class="ruby-operator">==</span> <span class="ruby-identifier">verify_pass</span>
1161
+ <span class="ruby-identifier">pass</span> = <span class="ruby-identifier">new_pass</span>
1162
+
1163
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">pass</span> <span class="ruby-operator">=~</span> <span class="ruby-constant">PASSWORD_REGEX</span>
1164
+ <span class="ruby-keyword">break</span>
1165
+ <span class="ruby-keyword">else</span>
1166
+ <span class="ruby-constant">Kernel</span>.<span class="ruby-identifier">puts</span> <span class="ruby-string">&quot;\n\nThe password you typed in was not at least six characters long. Please try again.\n\n&quot;</span>
1167
+ <span class="ruby-keyword">end</span>
1168
+ <span class="ruby-keyword">else</span>
1169
+ <span class="ruby-constant">Kernel</span>.<span class="ruby-identifier">puts</span> <span class="ruby-string">&quot;\n\nPasswords entered do not match. Please try again.\n\n&quot;</span>
1170
+ <span class="ruby-keyword">end</span>
1171
+ }
1172
+
1173
+ <span class="ruby-keyword">return</span> <span class="ruby-identifier">pass</span>
1174
+ <span class="ruby-keyword">end</span></pre>
1175
+ </div><!-- get_password-source -->
1176
+
1177
+ </div>
1178
+
1179
+
1180
+
1181
+
1182
+ </div><!-- get_password-method -->
1183
+
1184
+
1185
+ <div id="method-c-get_random_alphanumeric" class="method-detail ">
1186
+
1187
+ <div class="method-heading">
1188
+ <span class="method-name">get_random_alphanumeric</span><span
1189
+ class="method-args">(length=10)</span>
1190
+ <span class="method-click-advice">click to toggle source</span>
1191
+ </div>
1192
+
1193
+
1194
+ <div class="method-description">
1195
+
1196
+
1197
+
1198
+
1199
+
1200
+ <div class="method-source-code" id="get_random_alphanumeric-source">
1201
+ <pre><span class="ruby-comment"># File lib/common_functions.rb, line 843</span>
1202
+ <span class="ruby-keyword">def</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier">get_random_alphanumeric</span>(<span class="ruby-identifier">length</span>=<span class="ruby-value">10</span>)
1203
+ <span class="ruby-identifier">random</span> = <span class="ruby-string">&quot;&quot;</span>
1204
+ <span class="ruby-identifier">possible</span> = <span class="ruby-string">&quot;0123456789abcdefghijklmnopqrstuvxwyzABCDEFGHIJKLMNOPQRSTUVWXYZ&quot;</span>
1205
+ <span class="ruby-identifier">possibleLength</span> = <span class="ruby-identifier">possible</span>.<span class="ruby-identifier">length</span>
1206
+
1207
+ <span class="ruby-identifier">length</span>.<span class="ruby-identifier">times</span> { <span class="ruby-operator">|</span><span class="ruby-identifier">index</span><span class="ruby-operator">|</span>
1208
+ <span class="ruby-identifier">random</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">possible</span>[<span class="ruby-identifier">rand</span>(<span class="ruby-identifier">possibleLength</span>)]
1209
+ }
1210
+
1211
+ <span class="ruby-keyword">return</span> <span class="ruby-identifier">random</span>
1212
+ <span class="ruby-keyword">end</span></pre>
1213
+ </div><!-- get_random_alphanumeric-source -->
1214
+
1215
+ </div>
1216
+
1217
+
1218
+
1219
+
1220
+ </div><!-- get_random_alphanumeric-method -->
1221
+
1222
+
1223
+ <div id="method-c-get_remote_appscale_home" class="method-detail ">
1224
+
1225
+ <div class="method-heading">
1226
+ <span class="method-name">get_remote_appscale_home</span><span
1227
+ class="method-args">(ip, key)</span>
1228
+ <span class="method-click-advice">click to toggle source</span>
1229
+ </div>
1230
+
1231
+
1232
+ <div class="method-description">
1233
+
1234
+
1235
+
1236
+
1237
+
1238
+ <div class="method-source-code" id="get_remote_appscale_home-source">
1239
+ <pre><span class="ruby-comment"># File lib/common_functions.rb, line 462</span>
1240
+ <span class="ruby-keyword">def</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier">get_remote_appscale_home</span>(<span class="ruby-identifier">ip</span>, <span class="ruby-identifier">key</span>)
1241
+ <span class="ruby-identifier">cat</span> = <span class="ruby-string">&quot;cat /etc/appscale/home&quot;</span>
1242
+ <span class="ruby-identifier">remote_cmd</span> = <span class="ruby-node">&quot;ssh -i #{key} #{SSH_OPTIONS} 2&gt;&amp;1 root@#{ip} '#{cat}'&quot;</span>
1243
+ <span class="ruby-identifier">possible_home</span> = <span class="ruby-constant">CommonFunctions</span>.<span class="ruby-identifier">shell</span>(<span class="ruby-node">&quot;#{remote_cmd}&quot;</span>).<span class="ruby-identifier">chomp</span>
1244
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">possible_home</span>.<span class="ruby-identifier">nil?</span> <span class="ruby-keyword">or</span> <span class="ruby-identifier">possible_home</span>.<span class="ruby-identifier">empty?</span>
1245
+ <span class="ruby-keyword">return</span> <span class="ruby-string">&quot;/root/appscale/&quot;</span>
1246
+ <span class="ruby-keyword">else</span>
1247
+ <span class="ruby-keyword">return</span> <span class="ruby-identifier">possible_home</span>
1248
+ <span class="ruby-keyword">end</span>
1249
+ <span class="ruby-keyword">end</span></pre>
1250
+ </div><!-- get_remote_appscale_home-source -->
1251
+
1252
+ </div>
1253
+
1254
+
1255
+
1256
+
1257
+ </div><!-- get_remote_appscale_home-method -->
1258
+
1259
+
1260
+ <div id="method-c-get_role_from_nodes" class="method-detail ">
1261
+
1262
+ <div class="method-heading">
1263
+ <span class="method-name">get_role_from_nodes</span><span
1264
+ class="method-args">(keyname, role)</span>
1265
+ <span class="method-click-advice">click to toggle source</span>
1266
+ </div>
1267
+
1268
+
1269
+ <div class="method-description">
1270
+
1271
+
1272
+
1273
+
1274
+
1275
+ <div class="method-source-code" id="get_role_from_nodes-source">
1276
+ <pre><span class="ruby-comment"># File lib/common_functions.rb, line 728</span>
1277
+ <span class="ruby-keyword">def</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier">get_role_from_nodes</span>(<span class="ruby-identifier">keyname</span>, <span class="ruby-identifier">role</span>)
1278
+ <span class="ruby-identifier">nodes</span> = <span class="ruby-keyword">self</span>.<span class="ruby-identifier">read_nodes_json</span>(<span class="ruby-identifier">keyname</span>)
1279
+ <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>
1280
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">node</span>[<span class="ruby-string">'jobs'</span>].<span class="ruby-identifier">include?</span>(<span class="ruby-identifier">role</span>)
1281
+ <span class="ruby-keyword">return</span> <span class="ruby-identifier">node</span>[<span class="ruby-string">'public_ip'</span>]
1282
+ <span class="ruby-keyword">end</span>
1283
+ }
1284
+
1285
+ <span class="ruby-keyword">return</span> <span class="ruby-string">&quot;&quot;</span>
1286
+ <span class="ruby-keyword">end</span></pre>
1287
+ </div><!-- get_role_from_nodes-source -->
1288
+
1289
+ </div>
1290
+
1291
+
1292
+
1293
+
1294
+ </div><!-- get_role_from_nodes-method -->
1295
+
1296
+
1297
+ <div id="method-c-get_secret_key" class="method-detail ">
1298
+
1299
+ <div class="method-heading">
1300
+ <span class="method-name">get_secret_key</span><span
1301
+ class="method-args">(keyname, required=true)</span>
1302
+ <span class="method-click-advice">click to toggle source</span>
1303
+ </div>
1304
+
1305
+
1306
+ <div class="method-description">
1307
+
1308
+
1309
+
1310
+
1311
+
1312
+ <div class="method-source-code" id="get_secret_key-source">
1313
+ <pre><span class="ruby-comment"># File lib/common_functions.rb, line 775</span>
1314
+ <span class="ruby-keyword">def</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier">get_secret_key</span>(<span class="ruby-identifier">keyname</span>, <span class="ruby-identifier">required</span>=<span class="ruby-keyword">true</span>)
1315
+ <span class="ruby-constant">CommonFunctions</span>.<span class="ruby-identifier">get_from_yaml</span>(<span class="ruby-identifier">keyname</span>, <span class="ruby-value">:secret</span>)
1316
+ <span class="ruby-keyword">end</span></pre>
1317
+ </div><!-- get_secret_key-source -->
1318
+
1319
+ </div>
1320
+
1321
+
1322
+
1323
+
1324
+ </div><!-- get_secret_key-method -->
1325
+
1326
+
1327
+ <div id="method-c-get_table" class="method-detail ">
1328
+
1329
+ <div class="method-heading">
1330
+ <span class="method-name">get_table</span><span
1331
+ class="method-args">(keyname, required=true)</span>
1332
+ <span class="method-click-advice">click to toggle source</span>
1333
+ </div>
1334
+
1335
+
1336
+ <div class="method-description">
1337
+
1338
+
1339
+
1340
+
1341
+
1342
+ <div class="method-source-code" id="get_table-source">
1343
+ <pre><span class="ruby-comment"># File lib/common_functions.rb, line 750</span>
1344
+ <span class="ruby-keyword">def</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier">get_table</span>(<span class="ruby-identifier">keyname</span>, <span class="ruby-identifier">required</span>=<span class="ruby-keyword">true</span>)
1345
+ <span class="ruby-keyword">return</span> <span class="ruby-constant">CommonFunctions</span>.<span class="ruby-identifier">get_from_yaml</span>(<span class="ruby-identifier">keyname</span>, <span class="ruby-value">:table</span>, <span class="ruby-identifier">required</span>)
1346
+ <span class="ruby-keyword">end</span></pre>
1347
+ </div><!-- get_table-source -->
1348
+
1349
+ </div>
1350
+
1351
+
1352
+
1353
+
1354
+ </div><!-- get_table-method -->
1355
+
1356
+
1357
+ <div id="method-c-get_username_from_options" class="method-detail ">
1358
+
1359
+ <div class="method-heading">
1360
+ <span class="method-name">get_username_from_options</span><span
1361
+ class="method-args">(options)</span>
1362
+ <span class="method-click-advice">click to toggle source</span>
1363
+ </div>
1364
+
1365
+
1366
+ <div class="method-description">
1367
+
1368
+
1369
+
1370
+
1371
+
1372
+ <div class="method-source-code" id="get_username_from_options-source">
1373
+ <pre><span class="ruby-comment"># File lib/common_functions.rb, line 627</span>
1374
+ <span class="ruby-keyword">def</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier">get_username_from_options</span>(<span class="ruby-identifier">options</span>)
1375
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">options</span>[<span class="ruby-string">'test'</span>]
1376
+ <span class="ruby-keyword">return</span> <span class="ruby-constant">DEFAULT_USERNAME</span>
1377
+ <span class="ruby-keyword">elsif</span> <span class="ruby-identifier">options</span>[<span class="ruby-string">'email'</span>]
1378
+ <span class="ruby-keyword">return</span> <span class="ruby-identifier">options</span>[<span class="ruby-string">'email'</span>]
1379
+ <span class="ruby-keyword">else</span>
1380
+ <span class="ruby-keyword">return</span> <span class="ruby-constant">CommonFunctions</span>.<span class="ruby-identifier">get_email</span>
1381
+ <span class="ruby-keyword">end</span>
1382
+ <span class="ruby-keyword">end</span></pre>
1383
+ </div><!-- get_username_from_options-source -->
1384
+
1385
+ </div>
1386
+
1387
+
1388
+
1389
+
1390
+ </div><!-- get_username_from_options-method -->
1391
+
1392
+
1393
+ <div id="method-c-is_port_open-3F" class="method-detail ">
1394
+
1395
+ <div class="method-heading">
1396
+ <span class="method-name">is_port_open?</span><span
1397
+ class="method-args">(ip, port, use_ssl=false)</span>
1398
+ <span class="method-click-advice">click to toggle source</span>
1399
+ </div>
1400
+
1401
+
1402
+ <div class="method-description">
1403
+
1404
+
1405
+
1406
+
1407
+
1408
+ <div class="method-source-code" id="is_port_open-3F-source">
1409
+ <pre><span class="ruby-comment"># File lib/common_functions.rb, line 412</span>
1410
+ <span class="ruby-keyword">def</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier">is_port_open?</span>(<span class="ruby-identifier">ip</span>, <span class="ruby-identifier">port</span>, <span class="ruby-identifier">use_ssl</span>=<span class="ruby-keyword">false</span>)
1411
+ <span class="ruby-keyword">begin</span>
1412
+ <span class="ruby-constant">Timeout</span><span class="ruby-operator">::</span><span class="ruby-identifier">timeout</span>(<span class="ruby-value">1</span>) <span class="ruby-keyword">do</span>
1413
+ <span class="ruby-keyword">begin</span>
1414
+ <span class="ruby-identifier">sock</span> = <span class="ruby-constant">TCPSocket</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">ip</span>, <span class="ruby-identifier">port</span>)
1415
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">use_ssl</span>
1416
+ <span class="ruby-identifier">ssl_context</span> = <span class="ruby-constant">OpenSSL</span><span class="ruby-operator">::</span><span class="ruby-constant">SSL</span><span class="ruby-operator">::</span><span class="ruby-constant">SSLContext</span>.<span class="ruby-identifier">new</span>()
1417
+ <span class="ruby-keyword">unless</span> <span class="ruby-identifier">ssl_context</span>.<span class="ruby-identifier">verify_mode</span>
1418
+ <span class="ruby-identifier">ssl_context</span>.<span class="ruby-identifier">verify_mode</span> = <span class="ruby-constant">OpenSSL</span><span class="ruby-operator">::</span><span class="ruby-constant">SSL</span><span class="ruby-operator">::</span><span class="ruby-constant">VERIFY_NONE</span>
1419
+ <span class="ruby-keyword">end</span>
1420
+ <span class="ruby-identifier">sslsocket</span> = <span class="ruby-constant">OpenSSL</span><span class="ruby-operator">::</span><span class="ruby-constant">SSL</span><span class="ruby-operator">::</span><span class="ruby-constant">SSLSocket</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">sock</span>, <span class="ruby-identifier">ssl_context</span>)
1421
+ <span class="ruby-identifier">sslsocket</span>.<span class="ruby-identifier">sync_close</span> = <span class="ruby-keyword">true</span>
1422
+ <span class="ruby-identifier">sslsocket</span>.<span class="ruby-identifier">connect</span>
1423
+ <span class="ruby-keyword">end</span>
1424
+ <span class="ruby-identifier">sock</span>.<span class="ruby-identifier">close</span>
1425
+ <span class="ruby-keyword">return</span> <span class="ruby-keyword">true</span>
1426
+ <span class="ruby-keyword">rescue</span> <span class="ruby-constant">Exception</span>
1427
+ <span class="ruby-keyword">return</span> <span class="ruby-keyword">false</span>
1428
+ <span class="ruby-keyword">end</span>
1429
+ <span class="ruby-keyword">end</span>
1430
+ <span class="ruby-keyword">rescue</span> <span class="ruby-constant">Timeout</span><span class="ruby-operator">::</span><span class="ruby-constant">Error</span>
1431
+ <span class="ruby-keyword">end</span>
1432
+
1433
+ <span class="ruby-keyword">return</span> <span class="ruby-keyword">false</span>
1434
+ <span class="ruby-keyword">end</span></pre>
1435
+ </div><!-- is_port_open-3F-source -->
1436
+
1437
+ </div>
1438
+
1439
+
1440
+
1441
+
1442
+ </div><!-- is_port_open-3F-method -->
1443
+
1444
+
1445
+ <div id="method-c-make_appscale_directory" class="method-detail ">
1446
+
1447
+ <div class="method-heading">
1448
+ <span class="method-name">make_appscale_directory</span><span
1449
+ class="method-args">()</span>
1450
+ <span class="method-click-advice">click to toggle source</span>
1451
+ </div>
1452
+
1453
+
1454
+ <div class="method-description">
1455
+
1456
+
1457
+
1458
+
1459
+
1460
+ <div class="method-source-code" id="make_appscale_directory-source">
1461
+ <pre><span class="ruby-comment"># File lib/common_functions.rb, line 785</span>
1462
+ <span class="ruby-keyword">def</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier">make_appscale_directory</span>()
1463
+ <span class="ruby-comment"># AppScale generates private keys for each cloud that machines are </span>
1464
+ <span class="ruby-comment"># running in. It stores this data (and a YAML file detailing IP address </span>
1465
+ <span class="ruby-comment"># mappings) in ~/.appscale - create this location if it doesn't exist.</span>
1466
+ <span class="ruby-identifier">appscale_path</span> = <span class="ruby-constant">File</span>.<span class="ruby-identifier">expand_path</span>(<span class="ruby-string">&quot;~/.appscale&quot;</span>)
1467
+ <span class="ruby-keyword">if</span> <span class="ruby-operator">!</span><span class="ruby-constant">File</span>.<span class="ruby-identifier">exists?</span>(<span class="ruby-identifier">appscale_path</span>)
1468
+ <span class="ruby-constant">FileUtils</span>.<span class="ruby-identifier">mkdir</span>(<span class="ruby-identifier">appscale_path</span>)
1469
+ <span class="ruby-keyword">end</span>
1470
+ <span class="ruby-keyword">end</span></pre>
1471
+ </div><!-- make_appscale_directory-source -->
1472
+
1473
+ </div>
1474
+
1475
+
1476
+
1477
+
1478
+ </div><!-- make_appscale_directory-method -->
1479
+
1480
+
1481
+ <div id="method-c-move_app" class="method-detail ">
1482
+
1483
+ <div class="method-heading">
1484
+ <span class="method-name">move_app</span><span
1485
+ class="method-args">(temp_dir, filename, app_file, fullpath)</span>
1486
+ <span class="method-click-advice">click to toggle source</span>
1487
+ </div>
1488
+
1489
+
1490
+ <div class="method-description">
1491
+
1492
+
1493
+
1494
+
1495
+
1496
+ <div class="method-source-code" id="move_app-source">
1497
+ <pre><span class="ruby-comment"># File lib/common_functions.rb, line 886</span>
1498
+ <span class="ruby-keyword">def</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier">move_app</span>(<span class="ruby-identifier">temp_dir</span>, <span class="ruby-identifier">filename</span>, <span class="ruby-identifier">app_file</span>, <span class="ruby-identifier">fullpath</span>)
1499
+ <span class="ruby-keyword">if</span> <span class="ruby-constant">File</span>.<span class="ruby-identifier">directory?</span>(<span class="ruby-identifier">fullpath</span>)
1500
+ <span class="ruby-constant">CommonFunctions</span>.<span class="ruby-identifier">shell</span>(<span class="ruby-node">&quot;cp -r #{fullpath}/* /tmp/#{temp_dir}/&quot;</span>)
1501
+ <span class="ruby-keyword">return</span>
1502
+ <span class="ruby-keyword">else</span>
1503
+ <span class="ruby-constant">FileUtils</span>.<span class="ruby-identifier">cp</span>(<span class="ruby-identifier">fullpath</span>, <span class="ruby-node">&quot;/tmp/#{temp_dir}/#{filename}&quot;</span>)
1504
+ <span class="ruby-constant">FileUtils</span>.<span class="ruby-identifier">rm_f</span>(<span class="ruby-node">&quot;/tmp/#{temp_dir}/#{app_file}&quot;</span>)
1505
+ <span class="ruby-identifier">tar_file</span> = <span class="ruby-constant">CommonFunctions</span>.<span class="ruby-identifier">shell</span>(<span class="ruby-node">&quot;cd /tmp/#{temp_dir}; tar zxvfm #{filename} 2&gt;&amp;1; echo $?&quot;</span>).<span class="ruby-identifier">chomp</span>
1506
+ <span class="ruby-identifier">tar_ret_val</span> = <span class="ruby-identifier">tar_file</span>.<span class="ruby-identifier">scan</span>(<span class="ruby-regexp">%r\d+\Z/</span>).<span class="ruby-identifier">to_s</span>
1507
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">tar_ret_val</span> <span class="ruby-operator">!=</span> <span class="ruby-string">&quot;0&quot;</span>
1508
+ <span class="ruby-identifier">raise</span> <span class="ruby-constant">AppScaleException</span>.<span class="ruby-identifier">new</span>(<span class="ruby-string">&quot;Untar'ing the given tar file in /tmp failed&quot;</span>)
1509
+ <span class="ruby-keyword">end</span>
1510
+ <span class="ruby-keyword">end</span>
1511
+ <span class="ruby-keyword">return</span>
1512
+ <span class="ruby-keyword">end</span></pre>
1513
+ </div><!-- move_app-source -->
1514
+
1515
+ </div>
1516
+
1517
+
1518
+
1519
+
1520
+ </div><!-- move_app-method -->
1521
+
1522
+
1523
+ <div id="method-c-read_file" class="method-detail ">
1524
+
1525
+ <div class="method-heading">
1526
+ <span class="method-name">read_file</span><span
1527
+ class="method-args">(location, chomp=true)</span>
1528
+ <span class="method-click-advice">click to toggle source</span>
1529
+ </div>
1530
+
1531
+
1532
+ <div class="method-description">
1533
+
1534
+ <p>A convenience function that returns a file’s contents as a string.</p>
1535
+
1536
+
1537
+
1538
+ <div class="method-source-code" id="read_file-source">
1539
+ <pre><span class="ruby-comment"># File lib/common_functions.rb, line 91</span>
1540
+ <span class="ruby-keyword">def</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier">read_file</span>(<span class="ruby-identifier">location</span>, <span class="ruby-identifier">chomp</span>=<span class="ruby-keyword">true</span>)
1541
+ <span class="ruby-identifier">file</span> = <span class="ruby-constant">File</span>.<span class="ruby-identifier">open</span>(<span class="ruby-identifier">location</span>) { <span class="ruby-operator">|</span><span class="ruby-identifier">f</span><span class="ruby-operator">|</span> <span class="ruby-identifier">f</span>.<span class="ruby-identifier">read</span> }
1542
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">chomp</span>
1543
+ <span class="ruby-keyword">return</span> <span class="ruby-identifier">file</span>.<span class="ruby-identifier">chomp</span>
1544
+ <span class="ruby-keyword">else</span>
1545
+ <span class="ruby-keyword">return</span> <span class="ruby-identifier">file</span>
1546
+ <span class="ruby-keyword">end</span>
1547
+ <span class="ruby-keyword">end</span></pre>
1548
+ </div><!-- read_file-source -->
1549
+
1550
+ </div>
1551
+
1552
+
1553
+
1554
+
1555
+ </div><!-- read_file-method -->
1556
+
1557
+
1558
+ <div id="method-c-read_nodes_json" class="method-detail ">
1559
+
1560
+ <div class="method-heading">
1561
+ <span class="method-name">read_nodes_json</span><span
1562
+ class="method-args">(keyname)</span>
1563
+ <span class="method-click-advice">click to toggle source</span>
1564
+ </div>
1565
+
1566
+
1567
+ <div class="method-description">
1568
+
1569
+ <p>Reads the JSON file that stores information about which roles run on which
1570
+ nodes.</p>
1571
+
1572
+
1573
+
1574
+ <div class="method-source-code" id="read_nodes_json-source">
1575
+ <pre><span class="ruby-comment"># File lib/common_functions.rb, line 798</span>
1576
+ <span class="ruby-keyword">def</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier">read_nodes_json</span>(<span class="ruby-identifier">keyname</span>)
1577
+ <span class="ruby-identifier">filename</span> = <span class="ruby-constant">File</span>.<span class="ruby-identifier">expand_path</span>(<span class="ruby-node">&quot;~/.appscale/locations-#{keyname}.json&quot;</span>)
1578
+ <span class="ruby-keyword">return</span> <span class="ruby-constant">JSON</span>.<span class="ruby-identifier">load</span>(<span class="ruby-keyword">self</span>.<span class="ruby-identifier">read_file</span>(<span class="ruby-identifier">filename</span>))
1579
+ <span class="ruby-keyword">end</span></pre>
1580
+ </div><!-- read_nodes_json-source -->
1581
+
1582
+ </div>
1583
+
1584
+
1585
+
1586
+
1587
+ </div><!-- read_nodes_json-method -->
1588
+
1589
+
1590
+ <div id="method-c-require_commands" class="method-detail ">
1591
+
1592
+ <div class="method-heading">
1593
+ <span class="method-name">require_commands</span><span
1594
+ class="method-args">(commands)</span>
1595
+ <span class="method-click-advice">click to toggle source</span>
1596
+ </div>
1597
+
1598
+
1599
+ <div class="method-description">
1600
+
1601
+
1602
+
1603
+
1604
+
1605
+ <div class="method-source-code" id="require_commands-source">
1606
+ <pre><span class="ruby-comment"># File lib/common_functions.rb, line 369</span>
1607
+ <span class="ruby-keyword">def</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier">require_commands</span>(<span class="ruby-identifier">commands</span>)
1608
+ <span class="ruby-identifier">commands</span>.<span class="ruby-identifier">each</span> { <span class="ruby-operator">|</span><span class="ruby-identifier">cmd</span><span class="ruby-operator">|</span>
1609
+ <span class="ruby-keyword">if</span> <span class="ruby-operator">!</span><span class="ruby-constant">CommonFunctions</span>.<span class="ruby-identifier">user_has_cmd?</span>(<span class="ruby-identifier">cmd</span>)
1610
+ <span class="ruby-identifier">raise</span> <span class="ruby-constant">BadConfigurationException</span>.<span class="ruby-identifier">new</span>(<span class="ruby-node">&quot;You do not have the '#{cmd}' &quot;</span> <span class="ruby-operator">+</span>
1611
+ <span class="ruby-string">&quot;command in your PATH. Please ensure that it is in your path and &quot;</span> <span class="ruby-operator">+</span>
1612
+ <span class="ruby-string">&quot;try again.&quot;</span>)
1613
+ <span class="ruby-keyword">end</span>
1614
+ }
1615
+ <span class="ruby-keyword">end</span></pre>
1616
+ </div><!-- require_commands-source -->
1617
+
1618
+ </div>
1619
+
1620
+
1621
+
1622
+
1623
+ </div><!-- require_commands-method -->
1624
+
1625
+
1626
+ <div id="method-c-rsync_files" class="method-detail ">
1627
+
1628
+ <div class="method-heading">
1629
+ <span class="method-name">rsync_files</span><span
1630
+ class="method-args">(dest_ip, ssh_key, local)</span>
1631
+ <span class="method-click-advice">click to toggle source</span>
1632
+ </div>
1633
+
1634
+
1635
+ <div class="method-description">
1636
+
1637
+ <p>Uses rsync to copy over a copy of the AppScale main codebase (e.g., not the
1638
+ AppScale Tools) from this machine to a remote machine. TODO(cgb): This
1639
+ function doesn’t copy files in the main directory, like the firewall
1640
+ rules. It should be changed accordingly.</p>
1641
+
1642
+
1643
+
1644
+ <div class="method-source-code" id="rsync_files-source">
1645
+ <pre><span class="ruby-comment"># File lib/common_functions.rb, line 113</span>
1646
+ <span class="ruby-keyword">def</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier">rsync_files</span>(<span class="ruby-identifier">dest_ip</span>, <span class="ruby-identifier">ssh_key</span>, <span class="ruby-identifier">local</span>)
1647
+ <span class="ruby-identifier">local</span> = <span class="ruby-constant">File</span>.<span class="ruby-identifier">expand_path</span>(<span class="ruby-identifier">local</span>)
1648
+ <span class="ruby-identifier">controller</span> = <span class="ruby-node">&quot;#{local}/AppController&quot;</span>
1649
+ <span class="ruby-identifier">server</span> = <span class="ruby-node">&quot;#{local}/AppServer&quot;</span>
1650
+ <span class="ruby-identifier">loadbalancer</span> = <span class="ruby-node">&quot;#{local}/AppLoadBalancer&quot;</span>
1651
+ <span class="ruby-identifier">monitoring</span> = <span class="ruby-node">&quot;#{local}/AppMonitoring&quot;</span>
1652
+ <span class="ruby-identifier">appdb</span> = <span class="ruby-node">&quot;#{local}/AppDB&quot;</span>
1653
+ <span class="ruby-identifier">neptune</span> = <span class="ruby-node">&quot;#{local}/Neptune&quot;</span>
1654
+ <span class="ruby-identifier">loki</span> = <span class="ruby-node">&quot;#{local}/Loki&quot;</span>
1655
+ <span class="ruby-identifier">iaas_manager</span> = <span class="ruby-node">&quot;#{local}/InfrastructureManager&quot;</span>
1656
+
1657
+ <span class="ruby-keyword">if</span> <span class="ruby-operator">!</span><span class="ruby-constant">File</span>.<span class="ruby-identifier">exists?</span>(<span class="ruby-identifier">controller</span>)
1658
+ <span class="ruby-identifier">raise</span> <span class="ruby-constant">BadConfigurationException</span>.<span class="ruby-identifier">new</span>(<span class="ruby-string">&quot;The location you &quot;</span> <span class="ruby-operator">+</span>
1659
+ <span class="ruby-node">&quot;specified to rsync from, #{local}, doesn't exist or contain &quot;</span> <span class="ruby-operator">+</span>
1660
+ <span class="ruby-string">&quot;AppScale data.&quot;</span>)
1661
+ <span class="ruby-keyword">end</span>
1662
+
1663
+ <span class="ruby-keyword">self</span>.<span class="ruby-identifier">shell</span>(<span class="ruby-node">&quot;rsync -e 'ssh -i #{ssh_key}' -arv #{controller}/* root@#{dest_ip}:/root/appscale/AppController&quot;</span>)
1664
+ <span class="ruby-keyword">self</span>.<span class="ruby-identifier">shell</span>(<span class="ruby-node">&quot;rsync -e 'ssh -i #{ssh_key}' -arv #{server}/* root@#{dest_ip}:/root/appscale/AppServer&quot;</span>)
1665
+ <span class="ruby-keyword">self</span>.<span class="ruby-identifier">shell</span>(<span class="ruby-node">&quot;rsync -e 'ssh -i #{ssh_key}' -arv #{loadbalancer}/* root@#{dest_ip}:/root/appscale/AppLoadBalancer&quot;</span>)
1666
+ <span class="ruby-keyword">self</span>.<span class="ruby-identifier">shell</span>(<span class="ruby-node">&quot;rsync -e 'ssh -i #{ssh_key}' -arv #{monitoring}/* root@#{dest_ip}:/root/appscale/AppMonitoring&quot;</span>)
1667
+ <span class="ruby-keyword">self</span>.<span class="ruby-identifier">shell</span>(<span class="ruby-node">&quot;rsync -e 'ssh -i #{ssh_key}' -arv --exclude='logs/*' --exclude='hadoop-*' --exclude='hbase/hbase-*' --exclude='voldemort/voldemort/*' --exclude='cassandra/cassandra/*' #{appdb}/* root@#{dest_ip}:/root/appscale/AppDB&quot;</span>)
1668
+ <span class="ruby-keyword">self</span>.<span class="ruby-identifier">shell</span>(<span class="ruby-node">&quot;rsync -e 'ssh -i #{ssh_key}' -arv #{neptune}/* root@#{dest_ip}:/root/appscale/Neptune&quot;</span>)
1669
+ <span class="ruby-comment">#self.shell(&quot;rsync -e 'ssh -i #{ssh_key}' -arv #{loki}/* root@#{dest_ip}:/root/appscale/Loki&quot;)</span>
1670
+ <span class="ruby-keyword">self</span>.<span class="ruby-identifier">shell</span>(<span class="ruby-node">&quot;rsync -e 'ssh -i #{ssh_key}' -arv #{iaas_manager}/* root@#{dest_ip}:/root/appscale/InfrastructureManager&quot;</span>)
1671
+ <span class="ruby-keyword">end</span></pre>
1672
+ </div><!-- rsync_files-source -->
1673
+
1674
+ </div>
1675
+
1676
+
1677
+
1678
+
1679
+ </div><!-- rsync_files-method -->
1680
+
1681
+
1682
+ <div id="method-c-run_remote_command" class="method-detail ">
1683
+
1684
+ <div class="method-heading">
1685
+ <span class="method-name">run_remote_command</span><span
1686
+ class="method-args">(ip, command, public_key_loc, want_output)</span>
1687
+ <span class="method-click-advice">click to toggle source</span>
1688
+ </div>
1689
+
1690
+
1691
+ <div class="method-description">
1692
+
1693
+
1694
+
1695
+
1696
+
1697
+ <div class="method-source-code" id="run_remote_command-source">
1698
+ <pre><span class="ruby-comment"># File lib/common_functions.rb, line 439</span>
1699
+ <span class="ruby-keyword">def</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier">run_remote_command</span>(<span class="ruby-identifier">ip</span>, <span class="ruby-identifier">command</span>, <span class="ruby-identifier">public_key_loc</span>, <span class="ruby-identifier">want_output</span>)
1700
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">public_key_loc</span>.<span class="ruby-identifier">class</span> <span class="ruby-operator">==</span> <span class="ruby-constant">Array</span>
1701
+ <span class="ruby-identifier">public_key_loc</span>.<span class="ruby-identifier">each</span> { <span class="ruby-operator">|</span><span class="ruby-identifier">key</span><span class="ruby-operator">|</span>
1702
+ <span class="ruby-identifier">key</span> = <span class="ruby-constant">File</span>.<span class="ruby-identifier">expand_path</span>(<span class="ruby-identifier">key</span>)
1703
+ }
1704
+
1705
+ <span class="ruby-identifier">remote_cmd</span> = <span class="ruby-node">&quot;ssh -i #{public_key_loc.join(' -i ')} #{SSH_OPTIONS} 2&gt;&amp;1 root@#{ip} '#{command}&quot;</span>
1706
+ <span class="ruby-keyword">else</span>
1707
+ <span class="ruby-identifier">public_key_loc</span> = <span class="ruby-constant">File</span>.<span class="ruby-identifier">expand_path</span>(<span class="ruby-identifier">public_key_loc</span>)
1708
+ <span class="ruby-identifier">remote_cmd</span> = <span class="ruby-node">&quot;ssh -i #{public_key_loc} #{SSH_OPTIONS} root@#{ip} '#{command} &quot;</span>
1709
+ <span class="ruby-keyword">end</span>
1710
+
1711
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">want_output</span>
1712
+ <span class="ruby-identifier">remote_cmd</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-node">&quot;&gt; /tmp/#{ip}.log 2&gt;&amp;1 &amp;' &amp;&quot;</span>
1713
+ <span class="ruby-keyword">else</span>
1714
+ <span class="ruby-identifier">remote_cmd</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-string">&quot;&gt; /dev/null 2&gt;&amp;1 &amp;' &amp;&quot;</span>
1715
+ <span class="ruby-keyword">end</span>
1716
+
1717
+ <span class="ruby-constant">Kernel</span>.<span class="ruby-identifier">system</span> <span class="ruby-identifier">remote_cmd</span>
1718
+ <span class="ruby-keyword">return</span> <span class="ruby-identifier">remote_cmd</span>
1719
+ <span class="ruby-keyword">end</span></pre>
1720
+ </div><!-- run_remote_command-source -->
1721
+
1722
+ </div>
1723
+
1724
+
1725
+
1726
+
1727
+ </div><!-- run_remote_command-method -->
1728
+
1729
+
1730
+ <div id="method-c-scp_app_to_ip" class="method-detail ">
1731
+
1732
+ <div class="method-heading">
1733
+ <span class="method-name">scp_app_to_ip</span><span
1734
+ class="method-args">(app_name, user, language, keyname, head_node_ip, file_location, uac)</span>
1735
+ <span class="method-click-advice">click to toggle source</span>
1736
+ </div>
1737
+
1738
+
1739
+ <div class="method-description">
1740
+
1741
+
1742
+
1743
+
1744
+
1745
+ <div class="method-source-code" id="scp_app_to_ip-source">
1746
+ <pre><span class="ruby-comment"># File lib/common_functions.rb, line 273</span>
1747
+ <span class="ruby-keyword">def</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier">scp_app_to_ip</span>(<span class="ruby-identifier">app_name</span>, <span class="ruby-identifier">user</span>, <span class="ruby-identifier">language</span>, <span class="ruby-identifier">keyname</span>, <span class="ruby-identifier">head_node_ip</span>,
1748
+ <span class="ruby-identifier">file_location</span>, <span class="ruby-identifier">uac</span>)
1749
+
1750
+ <span class="ruby-constant">Kernel</span>.<span class="ruby-identifier">puts</span> <span class="ruby-node">&quot;Uploading #{app_name}...&quot;</span>
1751
+ <span class="ruby-identifier">uac</span>.<span class="ruby-identifier">commit_new_app_name</span>(<span class="ruby-identifier">user</span>, <span class="ruby-identifier">app_name</span>, <span class="ruby-identifier">language</span>)
1752
+
1753
+ <span class="ruby-identifier">local_file_path</span> = <span class="ruby-constant">File</span>.<span class="ruby-identifier">expand_path</span>(<span class="ruby-identifier">file_location</span>)
1754
+
1755
+ <span class="ruby-identifier">app_dir</span> = <span class="ruby-node">&quot;/var/apps/#{app_name}/app&quot;</span>
1756
+ <span class="ruby-identifier">remote_file_path</span> = <span class="ruby-node">&quot;#{app_dir}/#{app_name}.tar.gz&quot;</span>
1757
+ <span class="ruby-identifier">make_app_dir</span> = <span class="ruby-node">&quot;mkdir -p #{app_dir}&quot;</span>
1758
+ <span class="ruby-identifier">true_key</span> = <span class="ruby-constant">File</span>.<span class="ruby-identifier">expand_path</span>(<span class="ruby-node">&quot;~/.appscale/#{keyname}.key&quot;</span>)
1759
+
1760
+ <span class="ruby-constant">Kernel</span>.<span class="ruby-identifier">puts</span> <span class="ruby-string">&quot;Creating remote directory to copy app into&quot;</span>
1761
+ <span class="ruby-constant">CommonFunctions</span>.<span class="ruby-identifier">run_remote_command</span>(<span class="ruby-identifier">head_node_ip</span>,
1762
+ <span class="ruby-identifier">make_app_dir</span>, <span class="ruby-identifier">true_key</span>, <span class="ruby-keyword">false</span>)
1763
+ <span class="ruby-constant">Kernel</span>.<span class="ruby-identifier">sleep</span>(<span class="ruby-value">1</span>)
1764
+ <span class="ruby-constant">Kernel</span>.<span class="ruby-identifier">puts</span> <span class="ruby-string">&quot;Copying over app&quot;</span>
1765
+ <span class="ruby-constant">CommonFunctions</span>.<span class="ruby-identifier">scp_file</span>(<span class="ruby-identifier">local_file_path</span>, <span class="ruby-identifier">remote_file_path</span>,
1766
+ <span class="ruby-identifier">head_node_ip</span>, <span class="ruby-identifier">true_key</span>)
1767
+
1768
+ <span class="ruby-keyword">return</span> <span class="ruby-identifier">remote_file_path</span>
1769
+ <span class="ruby-keyword">end</span></pre>
1770
+ </div><!-- scp_app_to_ip-source -->
1771
+
1772
+ </div>
1773
+
1774
+
1775
+
1776
+
1777
+ </div><!-- scp_app_to_ip-method -->
1778
+
1779
+
1780
+ <div id="method-c-scp_file" class="method-detail ">
1781
+
1782
+ <div class="method-heading">
1783
+ <span class="method-name">scp_file</span><span
1784
+ class="method-args">(local_file_loc, remote_file_loc, target_ip, public_key_loc)</span>
1785
+ <span class="method-click-advice">click to toggle source</span>
1786
+ </div>
1787
+
1788
+
1789
+ <div class="method-description">
1790
+
1791
+
1792
+
1793
+
1794
+
1795
+ <div class="method-source-code" id="scp_file-source">
1796
+ <pre><span class="ruby-comment"># File lib/common_functions.rb, line 574</span>
1797
+ <span class="ruby-keyword">def</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier">scp_file</span>(<span class="ruby-identifier">local_file_loc</span>, <span class="ruby-identifier">remote_file_loc</span>, <span class="ruby-identifier">target_ip</span>, <span class="ruby-identifier">public_key_loc</span>)
1798
+ <span class="ruby-identifier">cmd</span> = <span class="ruby-string">&quot;&quot;</span>
1799
+ <span class="ruby-identifier">local_file_loc</span> = <span class="ruby-constant">File</span>.<span class="ruby-identifier">expand_path</span>(<span class="ruby-identifier">local_file_loc</span>)
1800
+ <span class="ruby-identifier">retval_file</span> = <span class="ruby-constant">File</span>.<span class="ruby-identifier">expand_path</span>(<span class="ruby-node">&quot;~/.appscale/retval-#{rand()}&quot;</span>)
1801
+
1802
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">public_key_loc</span>.<span class="ruby-identifier">class</span> <span class="ruby-operator">==</span> <span class="ruby-constant">Array</span>
1803
+ <span class="ruby-identifier">public_key_loc</span>.<span class="ruby-identifier">each</span> { <span class="ruby-operator">|</span><span class="ruby-identifier">key</span><span class="ruby-operator">|</span>
1804
+ <span class="ruby-identifier">key</span> = <span class="ruby-constant">File</span>.<span class="ruby-identifier">expand_path</span>(<span class="ruby-identifier">key</span>)
1805
+ }
1806
+
1807
+ <span class="ruby-identifier">cmd</span> = <span class="ruby-node">&quot;scp -i #{public_key_loc.join(' -i ')} #{SSH_OPTIONS} 2&gt;&amp;1 #{local_file_loc} root@#{target_ip}:#{remote_file_loc}&quot;</span>
1808
+ <span class="ruby-keyword">else</span>
1809
+ <span class="ruby-identifier">public_key_loc</span> = <span class="ruby-constant">File</span>.<span class="ruby-identifier">expand_path</span>(<span class="ruby-identifier">public_key_loc</span>)
1810
+ <span class="ruby-identifier">cmd</span> = <span class="ruby-node">&quot;scp -i #{public_key_loc} #{SSH_OPTIONS} 2&gt;&amp;1 #{local_file_loc} root@#{target_ip}:#{remote_file_loc}&quot;</span>
1811
+ <span class="ruby-keyword">end</span>
1812
+
1813
+ <span class="ruby-identifier">cmd</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-node">&quot;; echo $? &gt; #{retval_file}&quot;</span>
1814
+
1815
+ <span class="ruby-constant">FileUtils</span>.<span class="ruby-identifier">rm_f</span>(<span class="ruby-identifier">retval_file</span>)
1816
+
1817
+ <span class="ruby-keyword">begin</span>
1818
+ <span class="ruby-constant">Timeout</span><span class="ruby-operator">::</span><span class="ruby-identifier">timeout</span>(<span class="ruby-constant">INFINITY</span>) { <span class="ruby-constant">CommonFunctions</span>.<span class="ruby-identifier">shell</span>(<span class="ruby-node">&quot;#{cmd}&quot;</span>) }
1819
+ <span class="ruby-keyword">rescue</span> <span class="ruby-constant">Timeout</span><span class="ruby-operator">::</span><span class="ruby-constant">Error</span>
1820
+ <span class="ruby-identifier">raise</span> <span class="ruby-constant">AppScaleException</span>.<span class="ruby-identifier">new</span>(<span class="ruby-string">&quot;Remotely copying over files failed. Is &quot;</span> <span class="ruby-operator">+</span>
1821
+ <span class="ruby-string">&quot;the destination machine on and reachable from this computer? We &quot;</span> <span class="ruby-operator">+</span>
1822
+ <span class="ruby-node">&quot;tried the following command:\n\n#{cmd}&quot;</span>)
1823
+ <span class="ruby-keyword">end</span>
1824
+
1825
+ <span class="ruby-identifier">loop</span> {
1826
+ <span class="ruby-keyword">break</span> <span class="ruby-keyword">if</span> <span class="ruby-constant">File</span>.<span class="ruby-identifier">exists?</span>(<span class="ruby-identifier">retval_file</span>)
1827
+ <span class="ruby-constant">Kernel</span>.<span class="ruby-identifier">sleep</span>(<span class="ruby-value">5</span>)
1828
+ }
1829
+
1830
+ <span class="ruby-identifier">retval</span> = (<span class="ruby-constant">File</span>.<span class="ruby-identifier">open</span>(<span class="ruby-identifier">retval_file</span>) { <span class="ruby-operator">|</span><span class="ruby-identifier">f</span><span class="ruby-operator">|</span> <span class="ruby-identifier">f</span>.<span class="ruby-identifier">read</span> }).<span class="ruby-identifier">chomp</span>
1831
+
1832
+ <span class="ruby-identifier">fails</span> = <span class="ruby-value">0</span>
1833
+ <span class="ruby-identifier">loop</span> {
1834
+ <span class="ruby-keyword">break</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">retval</span> <span class="ruby-operator">==</span> <span class="ruby-string">&quot;0&quot;</span>
1835
+ <span class="ruby-constant">Kernel</span>.<span class="ruby-identifier">puts</span> <span class="ruby-node">&quot;\n\n[#{cmd}] returned #{retval} instead of 0 as expected. Will try to copy again momentarily...&quot;</span>
1836
+ <span class="ruby-identifier">fails</span> <span class="ruby-operator">+=</span> <span class="ruby-value">1</span>
1837
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">fails</span> <span class="ruby-operator">&gt;=</span> <span class="ruby-value">5</span>
1838
+ <span class="ruby-identifier">raise</span> <span class="ruby-constant">AppScaleException</span>.<span class="ruby-identifier">new</span>(<span class="ruby-string">&quot;SCP failed&quot;</span>)
1839
+ <span class="ruby-keyword">end</span>
1840
+ <span class="ruby-constant">Kernel</span>.<span class="ruby-identifier">sleep</span>(<span class="ruby-value">1</span>)
1841
+ <span class="ruby-constant">CommonFunctions</span>.<span class="ruby-identifier">shell</span>(<span class="ruby-node">&quot;#{cmd}&quot;</span>)
1842
+ <span class="ruby-identifier">retval</span> = (<span class="ruby-constant">File</span>.<span class="ruby-identifier">open</span>(<span class="ruby-identifier">retval_file</span>) { <span class="ruby-operator">|</span><span class="ruby-identifier">f</span><span class="ruby-operator">|</span> <span class="ruby-identifier">f</span>.<span class="ruby-identifier">read</span> }).<span class="ruby-identifier">chomp</span>
1843
+ }
1844
+
1845
+ <span class="ruby-constant">FileUtils</span>.<span class="ruby-identifier">rm_f</span>(<span class="ruby-identifier">retval_file</span>)
1846
+ <span class="ruby-keyword">return</span> <span class="ruby-identifier">cmd</span>
1847
+ <span class="ruby-keyword">end</span></pre>
1848
+ </div><!-- scp_file-source -->
1849
+
1850
+ </div>
1851
+
1852
+
1853
+
1854
+
1855
+ </div><!-- scp_file-method -->
1856
+
1857
+
1858
+ <div id="method-c-shell" class="method-detail ">
1859
+
1860
+ <div class="method-heading">
1861
+ <span class="method-name">shell</span><span
1862
+ class="method-args">(command)</span>
1863
+ <span class="method-click-advice">click to toggle source</span>
1864
+ </div>
1865
+
1866
+
1867
+ <div class="method-description">
1868
+
1869
+ <p>cgb: added in shell function for backticks so that we can unit test it
1870
+ Flexmock doesn’t like backticks since its name is non-alphanumeric e.g.,
1871
+ its name is Kernel:`</p>
1872
+
1873
+
1874
+
1875
+ <div class="method-source-code" id="shell-source">
1876
+ <pre><span class="ruby-comment"># File lib/common_functions.rb, line 104</span>
1877
+ <span class="ruby-keyword">def</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier">shell</span>(<span class="ruby-identifier">command</span>)
1878
+ <span class="ruby-node">%x#{command}`</span>
1879
+ <span class="ruby-keyword">end</span></pre>
1880
+ </div><!-- shell-source -->
1881
+
1882
+ </div>
1883
+
1884
+
1885
+
1886
+
1887
+ </div><!-- shell-method -->
1888
+
1889
+
1890
+ <div id="method-c-sleep_until_port_is_closed" class="method-detail ">
1891
+
1892
+ <div class="method-heading">
1893
+ <span class="method-name">sleep_until_port_is_closed</span><span
1894
+ class="method-args">(ip, port, use_ssl=false)</span>
1895
+ <span class="method-click-advice">click to toggle source</span>
1896
+ </div>
1897
+
1898
+
1899
+ <div class="method-description">
1900
+
1901
+
1902
+
1903
+
1904
+
1905
+ <div class="method-source-code" id="sleep_until_port_is_closed-source">
1906
+ <pre><span class="ruby-comment"># File lib/common_functions.rb, line 404</span>
1907
+ <span class="ruby-keyword">def</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier">sleep_until_port_is_closed</span>(<span class="ruby-identifier">ip</span>, <span class="ruby-identifier">port</span>, <span class="ruby-identifier">use_ssl</span>=<span class="ruby-keyword">false</span>)
1908
+ <span class="ruby-identifier">loop</span> {
1909
+ <span class="ruby-keyword">return</span> <span class="ruby-keyword">unless</span> <span class="ruby-constant">CommonFunctions</span>.<span class="ruby-identifier">is_port_open?</span>(<span class="ruby-identifier">ip</span>, <span class="ruby-identifier">port</span>, <span class="ruby-identifier">use_ssl</span>)
1910
+ <span class="ruby-constant">Kernel</span>.<span class="ruby-identifier">sleep</span>(<span class="ruby-value">1</span>)
1911
+ }
1912
+ <span class="ruby-keyword">end</span></pre>
1913
+ </div><!-- sleep_until_port_is_closed-source -->
1914
+
1915
+ </div>
1916
+
1917
+
1918
+
1919
+
1920
+ </div><!-- sleep_until_port_is_closed-method -->
1921
+
1922
+
1923
+ <div id="method-c-sleep_until_port_is_open" class="method-detail ">
1924
+
1925
+ <div class="method-heading">
1926
+ <span class="method-name">sleep_until_port_is_open</span><span
1927
+ class="method-args">(ip, port, use_ssl=false)</span>
1928
+ <span class="method-click-advice">click to toggle source</span>
1929
+ </div>
1930
+
1931
+
1932
+ <div class="method-description">
1933
+
1934
+
1935
+
1936
+
1937
+
1938
+ <div class="method-source-code" id="sleep_until_port_is_open-source">
1939
+ <pre><span class="ruby-comment"># File lib/common_functions.rb, line 396</span>
1940
+ <span class="ruby-keyword">def</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier">sleep_until_port_is_open</span>(<span class="ruby-identifier">ip</span>, <span class="ruby-identifier">port</span>, <span class="ruby-identifier">use_ssl</span>=<span class="ruby-keyword">false</span>)
1941
+ <span class="ruby-identifier">loop</span> {
1942
+ <span class="ruby-keyword">return</span> <span class="ruby-keyword">if</span> <span class="ruby-constant">CommonFunctions</span>.<span class="ruby-identifier">is_port_open?</span>(<span class="ruby-identifier">ip</span>, <span class="ruby-identifier">port</span>, <span class="ruby-identifier">use_ssl</span>)
1943
+ <span class="ruby-constant">Kernel</span>.<span class="ruby-identifier">sleep</span>(<span class="ruby-value">1</span>)
1944
+ }
1945
+ <span class="ruby-keyword">end</span></pre>
1946
+ </div><!-- sleep_until_port_is_open-source -->
1947
+
1948
+ </div>
1949
+
1950
+
1951
+
1952
+
1953
+ </div><!-- sleep_until_port_is_open-method -->
1954
+
1955
+
1956
+ <div id="method-c-start_head_node" class="method-detail ">
1957
+
1958
+ <div class="method-heading">
1959
+ <span class="method-name">start_head_node</span><span
1960
+ class="method-args">(options, node_layout, apps_to_start)</span>
1961
+ <span class="method-click-advice">click to toggle source</span>
1962
+ </div>
1963
+
1964
+
1965
+ <div class="method-description">
1966
+
1967
+
1968
+
1969
+
1970
+
1971
+ <div class="method-source-code" id="start_head_node-source">
1972
+ <pre><span class="ruby-comment"># File lib/common_functions.rb, line 474</span>
1973
+ <span class="ruby-keyword">def</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier">start_head_node</span>(<span class="ruby-identifier">options</span>, <span class="ruby-identifier">node_layout</span>, <span class="ruby-identifier">apps_to_start</span>)
1974
+ <span class="ruby-comment"># since we changed the key's name sometimes it works with storing the key</span>
1975
+ <span class="ruby-comment"># in ssh.key and sometimes it needs to be in keyname.key{.private}</span>
1976
+ <span class="ruby-comment"># always do both just in case</span>
1977
+
1978
+ <span class="ruby-comment"># TODO: check here to make sure that if hybrid, the keyname is free</span>
1979
+ <span class="ruby-comment"># in all clouds specified</span>
1980
+
1981
+ <span class="ruby-identifier">keyname</span> = <span class="ruby-identifier">options</span>[<span class="ruby-string">'keyname'</span>]
1982
+ <span class="ruby-identifier">named_key_loc</span> = <span class="ruby-node">&quot;~/.appscale/#{keyname}.key&quot;</span>
1983
+ <span class="ruby-identifier">named_backup_key_loc</span> = <span class="ruby-node">&quot;~/.appscale/#{keyname}.private&quot;</span>
1984
+ <span class="ruby-identifier">ssh_key_location</span> = <span class="ruby-identifier">named_key_loc</span>
1985
+ <span class="ruby-identifier">ssh_keys</span> = [<span class="ruby-identifier">ssh_key_location</span>, <span class="ruby-identifier">named_key_loc</span>, <span class="ruby-identifier">named_backup_key_loc</span>]
1986
+ <span class="ruby-identifier">secret_key</span>, <span class="ruby-identifier">secret_key_location</span> = <span class="ruby-constant">EncryptionHelper</span>.<span class="ruby-identifier">generate_secret_key</span>(<span class="ruby-identifier">keyname</span>)
1987
+ <span class="ruby-keyword">self</span>.<span class="ruby-identifier">verbose</span>(<span class="ruby-node">&quot;New secret key is #{CommonFunctions.obscure_string(secret_key)}&quot;</span>, <span class="ruby-identifier">options</span>[<span class="ruby-string">'verbose'</span>])
1988
+
1989
+ <span class="ruby-comment"># TODO: serialize via json instead of this hacky way</span>
1990
+ <span class="ruby-identifier">ips_hash</span> = <span class="ruby-identifier">node_layout</span>.<span class="ruby-identifier">to_hash</span>
1991
+ <span class="ruby-identifier">ips_to_use</span> = <span class="ruby-identifier">ips_hash</span>.<span class="ruby-identifier">map</span> { <span class="ruby-operator">|</span><span class="ruby-identifier">node</span>,<span class="ruby-identifier">roles</span><span class="ruby-operator">|</span> <span class="ruby-node">&quot;#{node}--#{roles}&quot;</span> }.<span class="ruby-identifier">join</span>(<span class="ruby-string">&quot;..&quot;</span>)
1992
+
1993
+ <span class="ruby-identifier">head_node</span> = <span class="ruby-identifier">node_layout</span>.<span class="ruby-identifier">head_node</span>
1994
+ <span class="ruby-identifier">infrastructure</span> = <span class="ruby-identifier">options</span>[<span class="ruby-string">'infrastructure'</span>]
1995
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">infrastructure</span> <span class="ruby-operator">==</span> <span class="ruby-string">&quot;hybrid&quot;</span>
1996
+ <span class="ruby-identifier">head_node_infra</span> = <span class="ruby-constant">VMTools</span>.<span class="ruby-identifier">lookup_cloud_env</span>(<span class="ruby-identifier">head_node</span>.<span class="ruby-identifier">cloud</span>)
1997
+ <span class="ruby-constant">VMTools</span>.<span class="ruby-identifier">set_hybrid_creds</span>(<span class="ruby-identifier">node_layout</span>)
1998
+ <span class="ruby-identifier">machine</span> = <span class="ruby-constant">VMTools</span>.<span class="ruby-identifier">get_hybrid_machine</span>(<span class="ruby-identifier">head_node_infra</span>, <span class="ruby-string">&quot;1&quot;</span>)
1999
+ <span class="ruby-keyword">else</span>
2000
+ <span class="ruby-identifier">head_node_infra</span> = <span class="ruby-identifier">infrastructure</span>
2001
+ <span class="ruby-identifier">machine</span> = <span class="ruby-identifier">options</span>[<span class="ruby-string">'machine'</span>]
2002
+ <span class="ruby-keyword">end</span>
2003
+
2004
+ <span class="ruby-identifier">locations</span> = <span class="ruby-constant">VMTools</span>.<span class="ruby-identifier">spawn_head_node</span>(<span class="ruby-identifier">head_node</span>, <span class="ruby-identifier">head_node_infra</span>, <span class="ruby-identifier">keyname</span>,
2005
+ <span class="ruby-identifier">ssh_key_location</span>, <span class="ruby-identifier">ssh_keys</span>, <span class="ruby-identifier">options</span>[<span class="ruby-string">'force'</span>], <span class="ruby-identifier">machine</span>,
2006
+ <span class="ruby-identifier">options</span>[<span class="ruby-string">'instance_type'</span>], <span class="ruby-identifier">options</span>[<span class="ruby-string">'group'</span>], <span class="ruby-identifier">options</span>[<span class="ruby-string">'verbose'</span>])
2007
+
2008
+ <span class="ruby-identifier">head_node_ip</span> = <span class="ruby-identifier">locations</span>.<span class="ruby-identifier">split</span>(<span class="ruby-string">&quot;:&quot;</span>)[<span class="ruby-value">0</span>]
2009
+ <span class="ruby-identifier">instance_id</span> = <span class="ruby-identifier">locations</span>.<span class="ruby-identifier">scan</span>(<span class="ruby-regexp">%ri-\w+/</span>).<span class="ruby-identifier">flatten</span>.<span class="ruby-identifier">to_s</span>
2010
+ <span class="ruby-identifier">locations</span> = [<span class="ruby-identifier">locations</span>]
2011
+
2012
+ <span class="ruby-identifier">true_key</span> = <span class="ruby-constant">CommonFunctions</span>.<span class="ruby-identifier">find_real_ssh_key</span>(<span class="ruby-identifier">ssh_keys</span>, <span class="ruby-identifier">head_node_ip</span>)
2013
+
2014
+ <span class="ruby-keyword">self</span>.<span class="ruby-identifier">verbose</span>(<span class="ruby-node">&quot;Log in to your head node: ssh -i #{true_key} &quot;</span> <span class="ruby-operator">+</span>
2015
+ <span class="ruby-node">&quot;root@#{head_node_ip}&quot;</span>, <span class="ruby-identifier">options</span>[<span class="ruby-string">'verbose'</span>])
2016
+
2017
+ <span class="ruby-constant">CommonFunctions</span>.<span class="ruby-identifier">ensure_image_is_appscale</span>(<span class="ruby-identifier">head_node_ip</span>, <span class="ruby-identifier">true_key</span>)
2018
+ <span class="ruby-constant">CommonFunctions</span>.<span class="ruby-identifier">ensure_db_is_supported</span>(<span class="ruby-identifier">head_node_ip</span>, <span class="ruby-identifier">options</span>[<span class="ruby-string">'table'</span>],
2019
+ <span class="ruby-identifier">true_key</span>)
2020
+
2021
+ <span class="ruby-identifier">scp</span> = <span class="ruby-identifier">options</span>[<span class="ruby-string">'scp'</span>]
2022
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">scp</span>
2023
+ <span class="ruby-constant">Kernel</span>.<span class="ruby-identifier">puts</span> <span class="ruby-node">&quot;Copying over local copy of AppScale from #{scp}&quot;</span>
2024
+ <span class="ruby-constant">CommonFunctions</span>.<span class="ruby-identifier">rsync_files</span>(<span class="ruby-identifier">head_node_ip</span>, <span class="ruby-identifier">true_key</span>, <span class="ruby-identifier">scp</span>)
2025
+ <span class="ruby-keyword">end</span>
2026
+
2027
+ <span class="ruby-identifier">keypath</span> = <span class="ruby-identifier">true_key</span>.<span class="ruby-identifier">scan</span>(<span class="ruby-regexp">%r([\d|\w|\.]+)\Z/</span>).<span class="ruby-identifier">flatten</span>.<span class="ruby-identifier">to_s</span>
2028
+ <span class="ruby-identifier">remote_key_location</span> = <span class="ruby-node">&quot;/root/.appscale/#{keyname}.key&quot;</span>
2029
+ <span class="ruby-constant">CommonFunctions</span>.<span class="ruby-identifier">scp_file</span>(<span class="ruby-identifier">true_key</span>, <span class="ruby-identifier">remote_key_location</span>, <span class="ruby-identifier">head_node_ip</span>, <span class="ruby-identifier">true_key</span>)
2030
+
2031
+ <span class="ruby-identifier">creds</span> = <span class="ruby-constant">CommonFunctions</span>.<span class="ruby-identifier">generate_appscale_credentials</span>(<span class="ruby-identifier">options</span>, <span class="ruby-identifier">node_layout</span>,
2032
+ <span class="ruby-identifier">head_node_ip</span>, <span class="ruby-identifier">ips_to_use</span>, <span class="ruby-identifier">true_key</span>)
2033
+ <span class="ruby-keyword">self</span>.<span class="ruby-identifier">verbose</span>(<span class="ruby-constant">CommonFunctions</span>.<span class="ruby-identifier">obscure_creds</span>(<span class="ruby-identifier">creds</span>).<span class="ruby-identifier">inspect</span>, <span class="ruby-identifier">options</span>[<span class="ruby-string">'verbose'</span>])
2034
+
2035
+ <span class="ruby-constant">Kernel</span>.<span class="ruby-identifier">puts</span> <span class="ruby-node">&quot;Head node successfully created at #{head_node_ip}. It is now &quot;</span> <span class="ruby-operator">+</span>
2036
+ <span class="ruby-node">&quot;starting up #{options['table']} via the command line arguments given.&quot;</span>
2037
+
2038
+ <span class="ruby-constant">RemoteLogging</span>.<span class="ruby-identifier">remote_post</span>(<span class="ruby-identifier">options</span>[<span class="ruby-string">'max_images'</span>], <span class="ruby-identifier">options</span>[<span class="ruby-string">'table'</span>],
2039
+ <span class="ruby-identifier">infrastructure</span>, <span class="ruby-string">&quot;started headnode&quot;</span>, <span class="ruby-string">&quot;success&quot;</span>)
2040
+
2041
+ <span class="ruby-constant">Kernel</span>.<span class="ruby-identifier">sleep</span>(<span class="ruby-value">10</span>) <span class="ruby-comment"># sometimes this helps out with ec2 / euca deployments</span>
2042
+ <span class="ruby-comment"># gives them an extra moment to come up and accept scp requests</span>
2043
+
2044
+ <span class="ruby-constant">CommonFunctions</span>.<span class="ruby-identifier">copy_keys</span>(<span class="ruby-identifier">secret_key_location</span>, <span class="ruby-identifier">head_node_ip</span>, <span class="ruby-identifier">true_key</span>,
2045
+ <span class="ruby-identifier">options</span>)
2046
+
2047
+ <span class="ruby-constant">CommonFunctions</span>.<span class="ruby-identifier">start_appcontroller</span>(<span class="ruby-identifier">head_node_ip</span>, <span class="ruby-identifier">true_key</span>,
2048
+ <span class="ruby-identifier">options</span>[<span class="ruby-string">'verbose'</span>])
2049
+
2050
+ <span class="ruby-identifier">acc</span> = <span class="ruby-constant">AppControllerClient</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">head_node_ip</span>, <span class="ruby-identifier">secret_key</span>)
2051
+ <span class="ruby-identifier">creds</span> = <span class="ruby-identifier">creds</span>.<span class="ruby-identifier">to_a</span>.<span class="ruby-identifier">flatten</span>
2052
+ <span class="ruby-identifier">acc</span>.<span class="ruby-identifier">set_parameters</span>(<span class="ruby-identifier">locations</span>, <span class="ruby-identifier">creds</span>, <span class="ruby-identifier">apps_to_start</span>)
2053
+
2054
+ <span class="ruby-keyword">return</span> {<span class="ruby-value">:acc</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">acc</span>, <span class="ruby-value">:head_node_ip</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">head_node_ip</span>,
2055
+ <span class="ruby-value">:instance_id</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">instance_id</span>, <span class="ruby-value">:true_key</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">true_key</span>,
2056
+ <span class="ruby-value">:secret_key</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">secret_key</span>}
2057
+ <span class="ruby-keyword">end</span></pre>
2058
+ </div><!-- start_head_node-source -->
2059
+
2060
+ </div>
2061
+
2062
+
2063
+
2064
+
2065
+ </div><!-- start_head_node-method -->
2066
+
2067
+
2068
+ <div id="method-c-update_appcontroller" class="method-detail ">
2069
+
2070
+ <div class="method-heading">
2071
+ <span class="method-name">update_appcontroller</span><span
2072
+ class="method-args">(head_node_ip, secret, app_name, remote_file_path)</span>
2073
+ <span class="method-click-advice">click to toggle source</span>
2074
+ </div>
2075
+
2076
+
2077
+ <div class="method-description">
2078
+
2079
+
2080
+
2081
+
2082
+
2083
+ <div class="method-source-code" id="update_appcontroller-source">
2084
+ <pre><span class="ruby-comment"># File lib/common_functions.rb, line 298</span>
2085
+ <span class="ruby-keyword">def</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier">update_appcontroller</span>(<span class="ruby-identifier">head_node_ip</span>, <span class="ruby-identifier">secret</span>, <span class="ruby-identifier">app_name</span>,
2086
+ <span class="ruby-identifier">remote_file_path</span>)
2087
+
2088
+ <span class="ruby-identifier">acc</span> = <span class="ruby-constant">AppControllerClient</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">head_node_ip</span>, <span class="ruby-identifier">secret</span>)
2089
+ <span class="ruby-identifier">acc</span>.<span class="ruby-identifier">done_uploading</span>(<span class="ruby-identifier">app_name</span>, <span class="ruby-identifier">remote_file_path</span>)
2090
+ <span class="ruby-constant">Kernel</span>.<span class="ruby-identifier">puts</span> <span class="ruby-string">&quot;Updating AppController&quot;</span>
2091
+ <span class="ruby-identifier">acc</span>.<span class="ruby-identifier">update</span>([<span class="ruby-identifier">app_name</span>])
2092
+ <span class="ruby-keyword">end</span></pre>
2093
+ </div><!-- update_appcontroller-source -->
2094
+
2095
+ </div>
2096
+
2097
+
2098
+
2099
+
2100
+ </div><!-- update_appcontroller-method -->
2101
+
2102
+
2103
+ <div id="method-c-update_locations_file" class="method-detail ">
2104
+
2105
+ <div class="method-heading">
2106
+ <span class="method-name">update_locations_file</span><span
2107
+ class="method-args">(keyname, ips=nil)</span>
2108
+ <span class="method-click-advice">click to toggle source</span>
2109
+ </div>
2110
+
2111
+
2112
+ <div class="method-description">
2113
+
2114
+ <p>This function tries to contact a node in the AppScale deployment to get the
2115
+ most up-to-date information on the current state of the deployment (as the
2116
+ number of nodes could change, or the roles that nodes have taken on).</p>
2117
+
2118
+
2119
+
2120
+ <div class="method-source-code" id="update_locations_file-source">
2121
+ <pre><span class="ruby-comment"># File lib/common_functions.rb, line 145</span>
2122
+ <span class="ruby-keyword">def</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier">update_locations_file</span>(<span class="ruby-identifier">keyname</span>, <span class="ruby-identifier">ips</span>=<span class="ruby-keyword">nil</span>)
2123
+ <span class="ruby-identifier">secret</span> = <span class="ruby-keyword">self</span>.<span class="ruby-identifier">get_secret_key</span>(<span class="ruby-identifier">keyname</span>)
2124
+
2125
+ <span class="ruby-comment"># Don't worry about prioritizing the Shadow over any other nodes,</span>
2126
+ <span class="ruby-comment"># as all nodes should be checking ZooKeeper and keeping themselves</span>
2127
+ <span class="ruby-comment"># up-to-date already.</span>
2128
+ <span class="ruby-identifier">new_role_info</span> = <span class="ruby-keyword">nil</span>
2129
+
2130
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">ips</span>
2131
+ <span class="ruby-identifier">all_ips</span> = <span class="ruby-identifier">ips</span>
2132
+ <span class="ruby-keyword">else</span>
2133
+ <span class="ruby-identifier">all_ips</span> = <span class="ruby-keyword">self</span>.<span class="ruby-identifier">get_all_public_ips</span>(<span class="ruby-identifier">keyname</span>)
2134
+ <span class="ruby-keyword">end</span>
2135
+
2136
+ <span class="ruby-identifier">all_ips</span>.<span class="ruby-identifier">each</span> { <span class="ruby-operator">|</span><span class="ruby-identifier">ip</span><span class="ruby-operator">|</span>
2137
+ <span class="ruby-keyword">begin</span>
2138
+ <span class="ruby-identifier">acc</span> = <span class="ruby-constant">AppControllerClient</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">ip</span>, <span class="ruby-identifier">secret</span>)
2139
+ <span class="ruby-identifier">new_role_info</span> = <span class="ruby-identifier">acc</span>.<span class="ruby-identifier">get_role_info</span>()
2140
+ <span class="ruby-keyword">break</span>
2141
+ <span class="ruby-keyword">rescue</span> <span class="ruby-constant">Exception</span>
2142
+ <span class="ruby-constant">Kernel</span>.<span class="ruby-identifier">puts</span>(<span class="ruby-node">&quot;Couldn't contact AppController at #{ip}, skipping...&quot;</span>)
2143
+ <span class="ruby-keyword">end</span>
2144
+ }
2145
+
2146
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">new_role_info</span>.<span class="ruby-identifier">nil?</span>
2147
+ <span class="ruby-identifier">abort</span>(<span class="ruby-string">&quot;Couldn't contact any AppControllers - is AppScale running?&quot;</span>)
2148
+ <span class="ruby-keyword">end</span>
2149
+
2150
+ <span class="ruby-constant">CommonFunctions</span>.<span class="ruby-identifier">write_nodes_json</span>(<span class="ruby-identifier">new_role_info</span>, <span class="ruby-identifier">keyname</span>)
2151
+ <span class="ruby-keyword">end</span></pre>
2152
+ </div><!-- update_locations_file-source -->
2153
+
2154
+ </div>
2155
+
2156
+
2157
+
2158
+
2159
+ </div><!-- update_locations_file-method -->
2160
+
2161
+
2162
+ <div id="method-c-user_has_cmd-3F" class="method-detail ">
2163
+
2164
+ <div class="method-heading">
2165
+ <span class="method-name">user_has_cmd?</span><span
2166
+ class="method-args">(command)</span>
2167
+ <span class="method-click-advice">click to toggle source</span>
2168
+ </div>
2169
+
2170
+
2171
+ <div class="method-description">
2172
+
2173
+
2174
+
2175
+
2176
+
2177
+ <div class="method-source-code" id="user_has_cmd-3F-source">
2178
+ <pre><span class="ruby-comment"># File lib/common_functions.rb, line 359</span>
2179
+ <span class="ruby-keyword">def</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier">user_has_cmd?</span>(<span class="ruby-identifier">command</span>)
2180
+ <span class="ruby-identifier">output</span> = <span class="ruby-constant">CommonFunctions</span>.<span class="ruby-identifier">shell</span>(<span class="ruby-node">&quot;which #{command}&quot;</span>)
2181
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">output</span>.<span class="ruby-identifier">empty?</span>
2182
+ <span class="ruby-keyword">return</span> <span class="ruby-keyword">false</span>
2183
+ <span class="ruby-keyword">else</span>
2184
+ <span class="ruby-keyword">return</span> <span class="ruby-keyword">true</span>
2185
+ <span class="ruby-keyword">end</span>
2186
+ <span class="ruby-keyword">end</span></pre>
2187
+ </div><!-- user_has_cmd-3F-source -->
2188
+
2189
+ </div>
2190
+
2191
+
2192
+
2193
+
2194
+ </div><!-- user_has_cmd-3F-method -->
2195
+
2196
+
2197
+ <div id="method-c-validate_app_name" class="method-detail ">
2198
+
2199
+ <div class="method-heading">
2200
+ <span class="method-name">validate_app_name</span><span
2201
+ class="method-args">(app_name, database)</span>
2202
+ <span class="method-click-advice">click to toggle source</span>
2203
+ </div>
2204
+
2205
+
2206
+ <div class="method-description">
2207
+
2208
+
2209
+
2210
+
2211
+
2212
+ <div class="method-source-code" id="validate_app_name-source">
2213
+ <pre><span class="ruby-comment"># File lib/common_functions.rb, line 199</span>
2214
+ <span class="ruby-keyword">def</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier">validate_app_name</span>(<span class="ruby-identifier">app_name</span>, <span class="ruby-identifier">database</span>)
2215
+ <span class="ruby-identifier">disallowed</span> = [<span class="ruby-string">&quot;none&quot;</span>, <span class="ruby-string">&quot;auth&quot;</span>, <span class="ruby-string">&quot;login&quot;</span>, <span class="ruby-string">&quot;new_user&quot;</span>, <span class="ruby-string">&quot;load_balancer&quot;</span>]
2216
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">disallowed</span>.<span class="ruby-identifier">include?</span>(<span class="ruby-identifier">app_name</span>)
2217
+ <span class="ruby-identifier">raise</span> <span class="ruby-constant">AppEngineConfigException</span>.<span class="ruby-identifier">new</span>(<span class="ruby-string">&quot;App cannot be called &quot;</span> <span class="ruby-operator">+</span>
2218
+ <span class="ruby-node">&quot;'#{not_allowed}' - this is a reserved name.&quot;</span>)
2219
+ <span class="ruby-keyword">end</span>
2220
+
2221
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">app_name</span> <span class="ruby-operator">=~</span> <span class="ruby-regexp">%r[^[a-z]-]/</span>
2222
+ <span class="ruby-identifier">raise</span> <span class="ruby-constant">AppEngineConfigException</span>.<span class="ruby-identifier">new</span>(<span class="ruby-string">&quot;App name can only contain &quot;</span> <span class="ruby-operator">+</span>
2223
+ <span class="ruby-string">&quot;numeric and lowercase alphabetical characters.&quot;</span>)
2224
+ <span class="ruby-keyword">end</span>
2225
+
2226
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">app_name</span>.<span class="ruby-identifier">include?</span>(<span class="ruby-string">&quot;-&quot;</span>) <span class="ruby-keyword">and</span> <span class="ruby-identifier">database</span> <span class="ruby-operator">==</span> <span class="ruby-string">&quot;hypertable&quot;</span>
2227
+ <span class="ruby-identifier">raise</span> <span class="ruby-constant">AppEngineConfigException</span>.<span class="ruby-identifier">new</span>(<span class="ruby-string">&quot;App name cannot contain &quot;</span> <span class="ruby-operator">+</span>
2228
+ <span class="ruby-string">&quot;dashes when Hypertable is the underlying database.&quot;</span>)
2229
+ <span class="ruby-keyword">end</span>
2230
+
2231
+ <span class="ruby-keyword">return</span> <span class="ruby-identifier">app_name</span>
2232
+ <span class="ruby-keyword">end</span></pre>
2233
+ </div><!-- validate_app_name-source -->
2234
+
2235
+ </div>
2236
+
2237
+
2238
+
2239
+
2240
+ </div><!-- validate_app_name-method -->
2241
+
2242
+
2243
+ <div id="method-c-wait_for_app_to_start" class="method-detail ">
2244
+
2245
+ <div class="method-heading">
2246
+ <span class="method-name">wait_for_app_to_start</span><span
2247
+ class="method-args">(head_node_ip, secret, app_name)</span>
2248
+ <span class="method-click-advice">click to toggle source</span>
2249
+ </div>
2250
+
2251
+
2252
+ <div class="method-description">
2253
+
2254
+
2255
+
2256
+
2257
+
2258
+ <div class="method-source-code" id="wait_for_app_to_start-source">
2259
+ <pre><span class="ruby-comment"># File lib/common_functions.rb, line 325</span>
2260
+ <span class="ruby-keyword">def</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier">wait_for_app_to_start</span>(<span class="ruby-identifier">head_node_ip</span>, <span class="ruby-identifier">secret</span>, <span class="ruby-identifier">app_name</span>)
2261
+ <span class="ruby-identifier">acc</span> = <span class="ruby-constant">AppControllerClient</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">head_node_ip</span>, <span class="ruby-identifier">secret</span>)
2262
+
2263
+ <span class="ruby-constant">Kernel</span>.<span class="ruby-identifier">puts</span> <span class="ruby-string">&quot;Please wait for your app to start up.&quot;</span>
2264
+ <span class="ruby-identifier">loop</span> {
2265
+ <span class="ruby-keyword">break</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">acc</span>.<span class="ruby-identifier">app_is_running?</span>(<span class="ruby-identifier">app_name</span>)
2266
+ <span class="ruby-constant">Kernel</span>.<span class="ruby-identifier">sleep</span>(<span class="ruby-value">5</span>)
2267
+ }
2268
+
2269
+ <span class="ruby-identifier">url_suffix</span> = <span class="ruby-node">&quot;/apps/#{app_name}&quot;</span>
2270
+ <span class="ruby-identifier">url</span> = <span class="ruby-node">&quot;http://#{head_node_ip}#{url_suffix}&quot;</span>
2271
+ <span class="ruby-constant">Kernel</span>.<span class="ruby-identifier">puts</span> <span class="ruby-node">&quot;\nYour app can be reached at the following URL: #{url}&quot;</span>
2272
+ <span class="ruby-keyword">end</span></pre>
2273
+ </div><!-- wait_for_app_to_start-source -->
2274
+
2275
+ </div>
2276
+
2277
+
2278
+
2279
+
2280
+ </div><!-- wait_for_app_to_start-method -->
2281
+
2282
+
2283
+ <div id="method-c-wait_for_nodes_to_load" class="method-detail ">
2284
+
2285
+ <div class="method-heading">
2286
+ <span class="method-name">wait_for_nodes_to_load</span><span
2287
+ class="method-args">(head_node_ip, secret)</span>
2288
+ <span class="method-click-advice">click to toggle source</span>
2289
+ </div>
2290
+
2291
+
2292
+ <div class="method-description">
2293
+
2294
+
2295
+
2296
+
2297
+
2298
+ <div class="method-source-code" id="wait_for_nodes_to_load-source">
2299
+ <pre><span class="ruby-comment"># File lib/common_functions.rb, line 307</span>
2300
+ <span class="ruby-keyword">def</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier">wait_for_nodes_to_load</span>(<span class="ruby-identifier">head_node_ip</span>, <span class="ruby-identifier">secret</span>)
2301
+ <span class="ruby-identifier">head_acc</span> = <span class="ruby-constant">AppControllerClient</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">head_node_ip</span>, <span class="ruby-identifier">secret</span>)
2302
+
2303
+ <span class="ruby-constant">Kernel</span>.<span class="ruby-identifier">puts</span> <span class="ruby-string">&quot;Please wait for AppScale to finish starting up.&quot;</span>
2304
+ <span class="ruby-identifier">all_ips</span> = <span class="ruby-identifier">head_acc</span>.<span class="ruby-identifier">get_all_public_ips</span>()
2305
+ <span class="ruby-identifier">loop</span> {
2306
+ <span class="ruby-identifier">done_starting</span> = <span class="ruby-keyword">true</span>
2307
+ <span class="ruby-identifier">all_ips</span>.<span class="ruby-identifier">each</span> { <span class="ruby-operator">|</span><span class="ruby-identifier">ip</span><span class="ruby-operator">|</span>
2308
+ <span class="ruby-identifier">acc</span> = <span class="ruby-constant">AppControllerClient</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">ip</span>, <span class="ruby-identifier">secret</span>)
2309
+ <span class="ruby-keyword">if</span> <span class="ruby-operator">!</span><span class="ruby-identifier">acc</span>.<span class="ruby-identifier">is_done_initializing?</span>
2310
+ <span class="ruby-identifier">done_starting</span> = <span class="ruby-keyword">false</span>
2311
+ <span class="ruby-keyword">end</span>
2312
+ }
2313
+ <span class="ruby-keyword">break</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">done_starting</span>
2314
+ <span class="ruby-constant">Kernel</span>.<span class="ruby-identifier">sleep</span>(<span class="ruby-value">5</span>)
2315
+ }
2316
+ <span class="ruby-keyword">end</span></pre>
2317
+ </div><!-- wait_for_nodes_to_load-source -->
2318
+
2319
+ </div>
2320
+
2321
+
2322
+
2323
+
2324
+ </div><!-- wait_for_nodes_to_load-method -->
2325
+
2326
+
2327
+ <div id="method-c-wait_until_redirect" class="method-detail ">
2328
+
2329
+ <div class="method-heading">
2330
+ <span class="method-name">wait_until_redirect</span><span
2331
+ class="method-args">(host, url_suffix)</span>
2332
+ <span class="method-click-advice">click to toggle source</span>
2333
+ </div>
2334
+
2335
+
2336
+ <div class="method-description">
2337
+
2338
+
2339
+
2340
+
2341
+
2342
+ <div class="method-source-code" id="wait_until_redirect-source">
2343
+ <pre><span class="ruby-comment"># File lib/common_functions.rb, line 340</span>
2344
+ <span class="ruby-keyword">def</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier">wait_until_redirect</span>(<span class="ruby-identifier">host</span>, <span class="ruby-identifier">url_suffix</span>)
2345
+ <span class="ruby-identifier">uri</span> = <span class="ruby-node">&quot;http://#{host}#{url_suffix}&quot;</span>
2346
+ <span class="ruby-identifier">loop</span> {
2347
+ <span class="ruby-identifier">response</span> = <span class="ruby-string">&quot;&quot;</span>
2348
+ <span class="ruby-keyword">begin</span>
2349
+ <span class="ruby-identifier">response</span> = <span class="ruby-constant">Net</span><span class="ruby-operator">::</span><span class="ruby-constant">HTTP</span>.<span class="ruby-identifier">get_response</span>(<span class="ruby-constant">URI</span>.<span class="ruby-identifier">parse</span>(<span class="ruby-identifier">uri</span>))
2350
+ <span class="ruby-keyword">rescue</span> <span class="ruby-constant">Errno</span><span class="ruby-operator">::</span><span class="ruby-constant">ECONNREFUSED</span>, <span class="ruby-constant">EOFError</span>
2351
+ <span class="ruby-constant">Kernel</span>.<span class="ruby-identifier">sleep</span>(<span class="ruby-value">1</span>)
2352
+ <span class="ruby-keyword">next</span>
2353
+ <span class="ruby-keyword">rescue</span> <span class="ruby-constant">Exception</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">e</span>
2354
+ <span class="ruby-identifier">raise</span> <span class="ruby-identifier">e</span>
2355
+ <span class="ruby-keyword">end</span>
2356
+
2357
+ <span class="ruby-keyword">return</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">response</span>[<span class="ruby-string">'location'</span>] <span class="ruby-operator">!=</span> <span class="ruby-node">&quot;http://#{host}/status&quot;</span>
2358
+ <span class="ruby-constant">Kernel</span>.<span class="ruby-identifier">sleep</span>(<span class="ruby-value">1</span>)
2359
+ }
2360
+ <span class="ruby-keyword">end</span></pre>
2361
+ </div><!-- wait_until_redirect-source -->
2362
+
2363
+ </div>
2364
+
2365
+
2366
+
2367
+
2368
+ </div><!-- wait_until_redirect-method -->
2369
+
2370
+
2371
+ <div id="method-c-warn_on_large_app_size" class="method-detail ">
2372
+
2373
+ <div class="method-heading">
2374
+ <span class="method-name">warn_on_large_app_size</span><span
2375
+ class="method-args">(fullpath)</span>
2376
+ <span class="method-click-advice">click to toggle source</span>
2377
+ </div>
2378
+
2379
+
2380
+ <div class="method-description">
2381
+
2382
+
2383
+
2384
+
2385
+
2386
+ <div class="method-source-code" id="warn_on_large_app_size-source">
2387
+ <pre><span class="ruby-comment"># File lib/common_functions.rb, line 903</span>
2388
+ <span class="ruby-keyword">def</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier">warn_on_large_app_size</span>(<span class="ruby-identifier">fullpath</span>)
2389
+ <span class="ruby-identifier">size</span> = <span class="ruby-constant">File</span>.<span class="ruby-identifier">size</span>(<span class="ruby-identifier">fullpath</span>)
2390
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">size</span> <span class="ruby-operator">&gt;</span> <span class="ruby-constant">MAX_FILE_SIZE</span>
2391
+ <span class="ruby-constant">Kernel</span>.<span class="ruby-identifier">puts</span> <span class="ruby-string">&quot;Warning: Your application is large enough that it may take a while to upload.&quot;</span>
2392
+ <span class="ruby-keyword">end</span>
2393
+ <span class="ruby-keyword">end</span></pre>
2394
+ </div><!-- warn_on_large_app_size-source -->
2395
+
2396
+ </div>
2397
+
2398
+
2399
+
2400
+
2401
+ </div><!-- warn_on_large_app_size-method -->
2402
+
2403
+
2404
+ <div id="method-c-write_and_copy_node_file" class="method-detail ">
2405
+
2406
+ <div class="method-heading">
2407
+ <span class="method-name">write_and_copy_node_file</span><span
2408
+ class="method-args">(options, node_layout, head_node_result)</span>
2409
+ <span class="method-click-advice">click to toggle source</span>
2410
+ </div>
2411
+
2412
+
2413
+ <div class="method-description">
2414
+
2415
+
2416
+
2417
+
2418
+
2419
+ <div class="method-source-code" id="write_and_copy_node_file-source">
2420
+ <pre><span class="ruby-comment"># File lib/common_functions.rb, line 812</span>
2421
+ <span class="ruby-keyword">def</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier">write_and_copy_node_file</span>(<span class="ruby-identifier">options</span>, <span class="ruby-identifier">node_layout</span>, <span class="ruby-identifier">head_node_result</span>)
2422
+ <span class="ruby-identifier">keyname</span> = <span class="ruby-identifier">options</span>[<span class="ruby-string">'keyname'</span>]
2423
+ <span class="ruby-identifier">head_node_ip</span> = <span class="ruby-identifier">head_node_result</span>[<span class="ruby-value">:head_node_ip</span>]
2424
+
2425
+ <span class="ruby-identifier">all_ips</span> = <span class="ruby-identifier">head_node_result</span>[<span class="ruby-value">:acc</span>].<span class="ruby-identifier">get_all_public_ips</span>()
2426
+ <span class="ruby-identifier">db_master_ip</span> = <span class="ruby-identifier">node_layout</span>.<span class="ruby-identifier">db_master</span>.<span class="ruby-identifier">id</span>
2427
+
2428
+ <span class="ruby-identifier">locations_yaml</span> = <span class="ruby-constant">File</span>.<span class="ruby-identifier">expand_path</span>(<span class="ruby-node">&quot;~/.appscale/locations-#{keyname}.yaml&quot;</span>)
2429
+ <span class="ruby-constant">CommonFunctions</span>.<span class="ruby-identifier">write_node_file</span>(<span class="ruby-identifier">head_node_ip</span>,
2430
+ <span class="ruby-identifier">head_node_result</span>[<span class="ruby-value">:instance_id</span>], <span class="ruby-identifier">options</span>[<span class="ruby-string">'table'</span>],
2431
+ <span class="ruby-identifier">head_node_result</span>[<span class="ruby-value">:secret_key</span>], <span class="ruby-identifier">db_master_ip</span>, <span class="ruby-identifier">all_ips</span>,
2432
+ <span class="ruby-identifier">options</span>[<span class="ruby-string">'infrastructure'</span>], <span class="ruby-identifier">locations_yaml</span>)
2433
+ <span class="ruby-identifier">remote_locations_file</span> = <span class="ruby-node">&quot;/root/.appscale/locations-#{keyname}.yaml&quot;</span>
2434
+ <span class="ruby-constant">CommonFunctions</span>.<span class="ruby-identifier">scp_file</span>(<span class="ruby-identifier">locations_yaml</span>, <span class="ruby-identifier">remote_locations_file</span>,
2435
+ <span class="ruby-identifier">head_node_ip</span>, <span class="ruby-identifier">head_node_result</span>[<span class="ruby-value">:true_key</span>])
2436
+ <span class="ruby-keyword">end</span></pre>
2437
+ </div><!-- write_and_copy_node_file-source -->
2438
+
2439
+ </div>
2440
+
2441
+
2442
+
2443
+
2444
+ </div><!-- write_and_copy_node_file-method -->
2445
+
2446
+
2447
+ <div id="method-c-write_file" class="method-detail ">
2448
+
2449
+ <div class="method-heading">
2450
+ <span class="method-name">write_file</span><span
2451
+ class="method-args">(location, contents)</span>
2452
+ <span class="method-click-advice">click to toggle source</span>
2453
+ </div>
2454
+
2455
+
2456
+ <div class="method-description">
2457
+
2458
+ <p>A convenience function that can be used to write a string to a file.</p>
2459
+
2460
+
2461
+
2462
+ <div class="method-source-code" id="write_file-source">
2463
+ <pre><span class="ruby-comment"># File lib/common_functions.rb, line 85</span>
2464
+ <span class="ruby-keyword">def</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier">write_file</span>(<span class="ruby-identifier">location</span>, <span class="ruby-identifier">contents</span>)
2465
+ <span class="ruby-constant">File</span>.<span class="ruby-identifier">open</span>(<span class="ruby-identifier">location</span>, <span class="ruby-string">&quot;w+&quot;</span>) { <span class="ruby-operator">|</span><span class="ruby-identifier">file</span><span class="ruby-operator">|</span> <span class="ruby-identifier">file</span>.<span class="ruby-identifier">write</span>(<span class="ruby-identifier">contents</span>) }
2466
+ <span class="ruby-keyword">end</span></pre>
2467
+ </div><!-- write_file-source -->
2468
+
2469
+ </div>
2470
+
2471
+
2472
+
2473
+
2474
+ </div><!-- write_file-method -->
2475
+
2476
+
2477
+ <div id="method-c-write_node_file" class="method-detail ">
2478
+
2479
+ <div class="method-heading">
2480
+ <span class="method-name">write_node_file</span><span
2481
+ class="method-args">(head_node_ip, instance_id, table, secret, db_master, ips, infrastructure, locations_yaml)</span>
2482
+ <span class="method-click-advice">click to toggle source</span>
2483
+ </div>
2484
+
2485
+
2486
+ <div class="method-description">
2487
+
2488
+
2489
+
2490
+
2491
+
2492
+ <div class="method-source-code" id="write_node_file-source">
2493
+ <pre><span class="ruby-comment"># File lib/common_functions.rb, line 830</span>
2494
+ <span class="ruby-keyword">def</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier">write_node_file</span>(<span class="ruby-identifier">head_node_ip</span>, <span class="ruby-identifier">instance_id</span>, <span class="ruby-identifier">table</span>, <span class="ruby-identifier">secret</span>, <span class="ruby-identifier">db_master</span>,
2495
+ <span class="ruby-identifier">ips</span>, <span class="ruby-identifier">infrastructure</span>, <span class="ruby-identifier">locations_yaml</span>)
2496
+
2497
+ <span class="ruby-identifier">infrastructure</span> <span class="ruby-operator">||=</span> <span class="ruby-string">&quot;xen&quot;</span>
2498
+ <span class="ruby-identifier">tree</span> = { <span class="ruby-value">:load_balancer</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">head_node_ip</span>, <span class="ruby-value">:instance_id</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">instance_id</span> ,
2499
+ <span class="ruby-value">:table</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">table</span>, <span class="ruby-value">:shadow</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">head_node_ip</span>,
2500
+ <span class="ruby-value">:secret</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">secret</span> , <span class="ruby-value">:db_master</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">db_master</span>,
2501
+ <span class="ruby-value">:ips</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">ips</span> , <span class="ruby-value">:infrastructure</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">infrastructure</span> }
2502
+ <span class="ruby-identifier">loc_path</span> = <span class="ruby-constant">File</span>.<span class="ruby-identifier">expand_path</span>(<span class="ruby-identifier">locations_yaml</span>)
2503
+ <span class="ruby-constant">File</span>.<span class="ruby-identifier">open</span>(<span class="ruby-identifier">loc_path</span>, <span class="ruby-string">&quot;w&quot;</span>) {<span class="ruby-operator">|</span><span class="ruby-identifier">file</span><span class="ruby-operator">|</span> <span class="ruby-constant">YAML</span>.<span class="ruby-identifier">dump</span>(<span class="ruby-identifier">tree</span>, <span class="ruby-identifier">file</span>)}
2504
+ <span class="ruby-keyword">end</span></pre>
2505
+ </div><!-- write_node_file-source -->
2506
+
2507
+ </div>
2508
+
2509
+
2510
+
2511
+
2512
+ </div><!-- write_node_file-method -->
2513
+
2514
+
2515
+ <div id="method-c-write_nodes_json" class="method-detail ">
2516
+
2517
+ <div class="method-heading">
2518
+ <span class="method-name">write_nodes_json</span><span
2519
+ class="method-args">(new_role_info, keyname)</span>
2520
+ <span class="method-click-advice">click to toggle source</span>
2521
+ </div>
2522
+
2523
+
2524
+ <div class="method-description">
2525
+
2526
+ <p>Writes the given JSON to the ~/.appscale directory so that we can read it
2527
+ later and determine what nodes run what services.</p>
2528
+
2529
+
2530
+
2531
+ <div class="method-source-code" id="write_nodes_json-source">
2532
+ <pre><span class="ruby-comment"># File lib/common_functions.rb, line 806</span>
2533
+ <span class="ruby-keyword">def</span> <span class="ruby-keyword">self</span>.<span class="ruby-identifier">write_nodes_json</span>(<span class="ruby-identifier">new_role_info</span>, <span class="ruby-identifier">keyname</span>)
2534
+ <span class="ruby-identifier">filename</span> = <span class="ruby-constant">File</span>.<span class="ruby-identifier">expand_path</span>(<span class="ruby-node">&quot;~/.appscale/locations-#{keyname}.json&quot;</span>)
2535
+ <span class="ruby-keyword">self</span>.<span class="ruby-identifier">write_file</span>(<span class="ruby-identifier">filename</span>, <span class="ruby-constant">JSON</span>.<span class="ruby-identifier">dump</span>(<span class="ruby-identifier">new_role_info</span>))
2536
+ <span class="ruby-keyword">end</span></pre>
2537
+ </div><!-- write_nodes_json-source -->
2538
+
2539
+ </div>
2540
+
2541
+
2542
+
2543
+
2544
+ </div><!-- write_nodes_json-method -->
2545
+
2546
+
2547
+ </section><!-- public-class-method-details -->
2548
+
2549
+ </section><!-- 5Buntitled-5D -->
2550
+
2551
+ </div><!-- documentation -->
2552
+
2553
+
2554
+ <footer id="validator-badges">
2555
+ <p><a href="http://validator.w3.org/check/referer">[Validate]</a>
2556
+ <p>Generated by <a href="https://github.com/rdoc/rdoc">RDoc</a> 3.12.
2557
+ <p>Generated with the <a href="http://deveiate.org/projects/Darkfish-Rdoc/">Darkfish Rdoc Generator</a> 3.
2558
+ </footer>
2559
+