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,10 @@
1
+ $:.unshift File.join(File.dirname(__FILE__), "..", "lib")
2
+ require 'app_controller_client'
3
+
4
+ require 'test/unit'
5
+
6
+
7
+ class TestAppControllerClient < Test::Unit::TestCase
8
+ def test_nothing
9
+ end
10
+ end
@@ -0,0 +1,44 @@
1
+ $:.unshift File.join(File.dirname(__FILE__), "..", "lib")
2
+ require 'appscale_tools'
3
+
4
+
5
+ require 'rubygems'
6
+ require 'flexmock/test_unit'
7
+
8
+
9
+ class TestAppScaleAddKeypair < Test::Unit::TestCase
10
+ def setup
11
+ @options_no_auto = {}
12
+ @options_w_auto = {"auto" => "true"}
13
+ end
14
+
15
+ def test_not_having_ssh_copy_id_in_path
16
+ commonfunctions = flexmock(CommonFunctions)
17
+ commonfunctions.should_receive(:shell).with("which ssh-keygen").and_return("/usr/bin/ssh-keygen")
18
+ commonfunctions.should_receive(:shell).with("which ssh-copy-id").and_return("")
19
+
20
+ assert_raises(BadConfigurationException) {
21
+ AppScaleTools.add_keypair(@options_no_auto)
22
+ }
23
+ end
24
+
25
+ def test_not_having_expect_in_path
26
+ commonfunctions = flexmock(CommonFunctions)
27
+ commonfunctions.should_receive(:shell).with("which ssh-keygen").and_return("/usr/bin/ssh-keygen")
28
+ commonfunctions.should_receive(:shell).with("which ssh-copy-id").and_return("/usr/bin/ssh-copy-id")
29
+ commonfunctions.should_receive(:shell).with("which expect").and_return("")
30
+
31
+ assert_raises(BadConfigurationException) {
32
+ AppScaleTools.add_keypair(@options_w_auto)
33
+ }
34
+
35
+ # TODO(cgb) - add a test where auto isn't used - it shouldn't throw an error
36
+ end
37
+
38
+ def test_usage_is_up_to_date
39
+ AppScaleTools::ADD_KEYPAIR_FLAGS.each { |flag|
40
+ assert_equal(true, AppScaleTools::ADD_KEYPAIR_USAGE.include?("-#{flag}"),
41
+ "No usage text for #{flag}.")
42
+ }
43
+ end
44
+ end
@@ -0,0 +1,69 @@
1
+ $:.unshift File.join(File.dirname(__FILE__), "..", "lib")
2
+ require 'appscale_tools'
3
+
4
+
5
+ require 'rubygems'
6
+ require 'flexmock/test_unit'
7
+
8
+
9
+ class TestAppScaleDescribeInstances < Test::Unit::TestCase
10
+ def setup
11
+ kernel = flexmock(Kernel)
12
+ kernel.should_receive(:puts).and_return()
13
+
14
+ @key = "booscale"
15
+ @options = { "keyname" => @key }
16
+
17
+ # taken from the standard two node deployment
18
+ node1 = {
19
+ 'public_ip' => 'public_ip1',
20
+ 'private_ip' => 'private_ip1',
21
+ 'jobs' => ['load_balancer', 'shadow', 'db_master', 'zookeeper', 'login', 'memcache', 'rabbitmq_master'],
22
+ 'instance_id' => 'instance_id1',
23
+ 'cloud' => 'cloud1',
24
+ 'creation_time' => nil,
25
+ 'destruction_time' => nil
26
+ }
27
+
28
+ @role_info = [node1]
29
+
30
+ commonfunctions = flexmock(CommonFunctions)
31
+ commonfunctions.should_receive(:read_file).
32
+ with(File.expand_path("~/.appscale/locations-#{@key}.json")).
33
+ and_return(JSON.dump(@role_info))
34
+
35
+ # mocks for get_role_info, which will return the node's state
36
+ appcontroller = flexmock('appcontroller')
37
+ appcontroller.should_receive(:get_role_info).and_return(@role_info)
38
+ appcontroller.should_receive(:status).and_return("ALL OK")
39
+ flexmock(AppControllerClient).should_receive(:new).
40
+ and_return(appcontroller)
41
+
42
+ commonfunctions.should_receive(:write_file).with(
43
+ File.expand_path("~/.appscale/locations-#{@key}.json"),
44
+ JSON.dump(@role_info)).and_return()
45
+ end
46
+
47
+ def test_all_ok
48
+ commonfunctions = flexmock(CommonFunctions)
49
+ commonfunctions.should_receive(:get_secret_key).and_return("")
50
+ commonfunctions.should_receive(:get_head_node_ip).and_return("127.0.0.1")
51
+
52
+ flexmock(AppControllerClient).new_instances { |instance|
53
+ instance.should_receive(:get_all_public_ips).and_return(["127.0.0.1"])
54
+ instance.should_receive(:status).and_return("ALL OK")
55
+ }
56
+
57
+ instance_info = AppScaleTools.describe_instances(@options)
58
+ assert_equal(nil, instance_info[:error])
59
+ assert_equal(["ALL OK"], instance_info[:result])
60
+ end
61
+
62
+ def test_usage_is_up_to_date
63
+ AppScaleTools::DESCRIBE_INSTANCES_FLAGS.each { |flag|
64
+ assert_equal(true,
65
+ AppScaleTools::DESCRIBE_INSTANCES_USAGE.include?("-#{flag}"),
66
+ "No usage text for #{flag}.")
67
+ }
68
+ end
69
+ end
@@ -0,0 +1,128 @@
1
+ $:.unshift File.join(File.dirname(__FILE__), "..", "lib")
2
+ require 'appscale_tools'
3
+
4
+
5
+ require 'rubygems'
6
+ require 'flexmock/test_unit'
7
+
8
+
9
+ class TestAppScaleRemoveApp < Test::Unit::TestCase
10
+ def setup
11
+ @key = "appscale"
12
+ @options = {"appname" => "boo", "keyname" => @key}
13
+
14
+ @secret = "booooo"
15
+ @fake_yaml = {
16
+ :load_balancer => "127.0.0.1",
17
+ :shadow => "127.0.0.1",
18
+ :secret => @secret,
19
+ :db_master => "node-1",
20
+ :table => "cassandra",
21
+ :instance_id => "i-FOOBARZ"
22
+ }
23
+ yaml = flexmock(YAML)
24
+ yaml.should_receive(:load_file).and_return(@fake_yaml)
25
+
26
+ # taken from the standard two node deployment
27
+ node1 = {
28
+ 'public_ip' => 'public_ip1',
29
+ 'private_ip' => 'private_ip1',
30
+ 'jobs' => ['load_balancer', 'shadow', 'db_master', 'zookeeper', 'login', 'memcache', 'rabbitmq_master'],
31
+ 'instance_id' => 'instance_id1',
32
+ 'cloud' => 'cloud1',
33
+ 'creation_time' => nil,
34
+ 'destruction_time' => nil
35
+ }
36
+
37
+ node2 = {
38
+ 'public_ip' => 'public_ip2',
39
+ 'private_ip' => 'private_ip2',
40
+ 'jobs' => ['load_balancer', 'db_slave', 'memcache', 'rabbitmq_slave', 'appengine'],
41
+ 'instance_id' => 'instance_id2',
42
+ 'cloud' => 'cloud2',
43
+ 'creation_time' => nil,
44
+ 'destruction_time' => nil
45
+ }
46
+
47
+ @role_info = [node1, node2]
48
+
49
+ commonfunctions = flexmock(CommonFunctions)
50
+ commonfunctions.should_receive(:read_file).
51
+ with(File.expand_path("~/.appscale/locations-#{@key}.json")).
52
+ and_return(JSON.dump(@role_info))
53
+ commonfunctions.should_receive(:write_file).with(
54
+ File.expand_path("~/.appscale/locations-#{@key}.json"),
55
+ JSON.dump(@role_info)).and_return()
56
+
57
+ # mocks for get_role_info, which will return the node's state
58
+ appcontroller = flexmock('appcontroller')
59
+ appcontroller.should_receive(:get_role_info).and_return(@role_info)
60
+ appcontroller.should_receive(:get_userappserver_ip).and_return("127.0.0.1")
61
+ appcontroller.should_receive(:stop_app).and_return("true")
62
+ appcontroller.should_receive(:app_is_running?).and_return(true, false)
63
+ flexmock(AppControllerClient).should_receive(:new).
64
+ and_return(appcontroller)
65
+
66
+ kernel = flexmock(Kernel)
67
+ kernel.should_receive(:print).and_return()
68
+ kernel.should_receive(:puts).and_return()
69
+ kernel.should_receive(:sleep).and_return()
70
+ end
71
+
72
+ def test_no_appname_given
73
+ options = {"keyname" => @key}
74
+ assert_raises(AppScaleException) {
75
+ AppScaleTools.remove_app(options)
76
+ }
77
+ end
78
+
79
+ def test_user_cancels_removal
80
+ stdin = flexmock(STDIN)
81
+ stdin.should_receive(:gets).and_return("no\n")
82
+
83
+ assert_raises(AppScaleException) {
84
+ AppScaleTools.remove_app(@options)
85
+ }
86
+ end
87
+
88
+ def test_remove_app_that_doesnt_exist
89
+ stdin = flexmock(STDIN)
90
+ stdin.should_receive(:gets).and_return("yes\n")
91
+
92
+ file = flexmock(File)
93
+ file.should_receive(:exists?).and_return(true)
94
+
95
+ userappclient = flexmock(UserAppClient)
96
+ userappclient.new_instances { |instance|
97
+ instance.should_receive(:does_app_exist?).and_return(false)
98
+ }
99
+
100
+ assert_raises(AppEngineConfigException) {
101
+ AppScaleTools.remove_app(@options)
102
+ }
103
+ end
104
+
105
+ def test_remove_app_that_does_exist
106
+ stdin = flexmock(STDIN)
107
+ stdin.should_receive(:gets).and_return("yes\n")
108
+
109
+ file = flexmock(File)
110
+ file.should_receive(:exists?).and_return(true)
111
+
112
+ userappclient = flexmock(UserAppClient)
113
+ userappclient.new_instances { |instance|
114
+ instance.should_receive(:does_app_exist?).and_return(true)
115
+ }
116
+
117
+ assert_nothing_raised(Exception) {
118
+ AppScaleTools.remove_app(@options)
119
+ }
120
+ end
121
+
122
+ def test_usage_is_up_to_date
123
+ AppScaleTools::REMOVE_APP_FLAGS.each { |flag|
124
+ assert_equal(true, AppScaleTools::REMOVE_APP_USAGE.include?("-#{flag}"),
125
+ "No usage text for #{flag}.")
126
+ }
127
+ end
128
+ end
@@ -0,0 +1,156 @@
1
+ $:.unshift File.join(File.dirname(__FILE__), "..", "lib")
2
+ require 'appscale_tools'
3
+
4
+ require 'test/unit'
5
+
6
+
7
+ class TestAppScaleResetPassword < Test::Unit::TestCase
8
+ def setup
9
+ @keyname = "booscale"
10
+ @options = {"keyname" => @keyname}
11
+
12
+ kernel = flexmock(Kernel)
13
+ kernel.should_receive(:print).and_return()
14
+ kernel.should_receive(:puts).and_return()
15
+
16
+ stdout = flexmock(STDOUT)
17
+ stdout.should_receive(:flush).and_return()
18
+ end
19
+
20
+ def test_appscale_not_running
21
+ file = flexmock(File)
22
+ file.should_receive(:exists?).and_return(true)
23
+
24
+ @secret = "booooo"
25
+ @fake_yaml = {:load_balancer => "",
26
+ :shadow => "127.0.0.1",
27
+ :secret => @secret,
28
+ :db_master => "node-1",
29
+ :table => "cassandra",
30
+ :instance_id => "i-FOOBARZ"}
31
+ yaml = flexmock(YAML)
32
+ yaml.should_receive(:load_file).and_return(@fake_yaml)
33
+
34
+ # taken from the standard two node deployment
35
+ node1 = {
36
+ 'public_ip' => 'public_ip1',
37
+ 'private_ip' => 'private_ip1',
38
+ 'jobs' => ['shadow', 'db_master', 'zookeeper', 'login', 'memcache', 'rabbitmq_master'],
39
+ 'instance_id' => 'instance_id1',
40
+ 'cloud' => 'cloud1',
41
+ 'creation_time' => nil,
42
+ 'destruction_time' => nil
43
+ }
44
+
45
+ node2 = {
46
+ 'public_ip' => 'public_ip2',
47
+ 'private_ip' => 'private_ip2',
48
+ 'jobs' => ['db_slave', 'memcache', 'rabbitmq_slave', 'appengine'],
49
+ 'instance_id' => 'instance_id2',
50
+ 'cloud' => 'cloud2',
51
+ 'creation_time' => nil,
52
+ 'destruction_time' => nil
53
+ }
54
+
55
+ @role_info = [node1, node2]
56
+
57
+ appcontroller = flexmock('appcontroller')
58
+ appcontroller.should_receive(:get_role_info).and_return(@role_info)
59
+ flexmock(AppControllerClient).should_receive(:new).and_return(appcontroller)
60
+
61
+ commonfunctions = flexmock(CommonFunctions)
62
+ commonfunctions.should_receive(:read_file).
63
+ with(File.expand_path("~/.appscale/locations-#{@keyname}.json")).
64
+ and_return(JSON.dump(@role_info))
65
+ commonfunctions.should_receive(:write_file).with(
66
+ File.expand_path("~/.appscale/locations-#{@keyname}.json"),
67
+ JSON.dump(@role_info)).and_return()
68
+
69
+ assert_raises(BadConfigurationException) {
70
+ AppScaleTools.reset_password(@options)
71
+ }
72
+ end
73
+
74
+ def test_all_ok
75
+ file = flexmock(File)
76
+ file.should_receive(:exists?).and_return(true)
77
+
78
+ @secret = "booooo"
79
+ @fake_yaml = {:load_balancer => "127.0.0.1",
80
+ :shadow => "127.0.0.1",
81
+ :secret => @secret,
82
+ :db_master => "node-1",
83
+ :table => "cassandra",
84
+ :instance_id => "i-FOOBARZ"}
85
+ yaml = flexmock(YAML)
86
+ yaml.should_receive(:load_file).and_return(@fake_yaml)
87
+
88
+ # taken from the standard two node deployment
89
+ node1 = {
90
+ 'public_ip' => 'public_ip1',
91
+ 'private_ip' => 'private_ip1',
92
+ 'jobs' => ['load_balancer', 'shadow', 'db_master', 'zookeeper', 'login', 'memcache', 'rabbitmq_master'],
93
+ 'instance_id' => 'instance_id1',
94
+ 'cloud' => 'cloud1',
95
+ 'creation_time' => nil,
96
+ 'destruction_time' => nil
97
+ }
98
+
99
+ node2 = {
100
+ 'public_ip' => 'public_ip2',
101
+ 'private_ip' => 'private_ip2',
102
+ 'jobs' => ['load_balancer', 'db_slave', 'memcache', 'rabbitmq_slave', 'appengine'],
103
+ 'instance_id' => 'instance_id2',
104
+ 'cloud' => 'cloud2',
105
+ 'creation_time' => nil,
106
+ 'destruction_time' => nil
107
+ }
108
+
109
+ @role_info = [node1, node2]
110
+
111
+ commonfunctions = flexmock(CommonFunctions)
112
+ commonfunctions.should_receive(:read_file).
113
+ with(File.expand_path("~/.appscale/locations-#{@keyname}.json")).
114
+ and_return(JSON.dump(@role_info))
115
+
116
+ @user = "a@a.a"
117
+ @password = "aaaaaa"
118
+
119
+ stdin = flexmock(STDIN)
120
+ stdin.should_receive(:gets).and_return(@user + "\n", @password + "\n")
121
+
122
+ kernel = flexmock(Kernel)
123
+ kernel.should_receive(:system).with("stty -echo").and_return()
124
+ kernel.should_receive(:system).with("stty echo").and_return()
125
+
126
+ appcontroller = flexmock('appcontroller')
127
+ appcontroller.should_receive(:get_role_info).and_return(@role_info)
128
+ appcontroller.should_receive(:get_userappserver_ip).and_return("127.0.0.1")
129
+ flexmock(AppControllerClient).should_receive(:new).and_return(appcontroller)
130
+
131
+ commonfunctions = flexmock(CommonFunctions)
132
+ commonfunctions.should_receive(:read_file).
133
+ with(File.expand_path("~/.appscale/locations-#{@keyname}.json")).
134
+ and_return(JSON.dump(@role_info))
135
+ commonfunctions.should_receive(:write_file).with(
136
+ File.expand_path("~/.appscale/locations-#{@keyname}.json"),
137
+ JSON.dump(@role_info)).and_return()
138
+
139
+ userappclient = flexmock(UserAppClient)
140
+ userappclient.new_instances { |instance|
141
+ instance.should_receive(:change_password).and_return("OK")
142
+ }
143
+
144
+ assert_nothing_raised(Exception) {
145
+ AppScaleTools.reset_password(@options)
146
+ }
147
+ end
148
+
149
+ def test_usage_is_up_to_date
150
+ AppScaleTools::RESET_PASSWORD_FLAGS.each { |flag|
151
+ assert_equal(true,
152
+ AppScaleTools::RESET_PASSWORD_USAGE.include?("-#{flag}"),
153
+ "No usage text for #{flag}.")
154
+ }
155
+ end
156
+ end
@@ -0,0 +1,48 @@
1
+ $:.unshift File.join(File.dirname(__FILE__), "..", "lib")
2
+ require 'appscale_tools'
3
+
4
+ require 'test/unit'
5
+
6
+
7
+ class TestAppScaleRunInstances < Test::Unit::TestCase
8
+ def setup
9
+ EC2_ENVIRONMENT_VARIABLES.each { |var|
10
+ ENV[var] = "BOO"
11
+ }
12
+
13
+ file = flexmock(File)
14
+ file.should_receive(:exists?).and_return(true)
15
+ end
16
+
17
+ def test_machine_not_set_in_cloud_deployments
18
+ options = {
19
+ "infrastructure" => "euca"
20
+ }
21
+ assert_raises(BadConfigurationException) {
22
+ AppScaleTools.run_instances(options)
23
+ }
24
+ end
25
+
26
+ def test_environment_variables_not_set_in_cloud_deployments
27
+ options = {
28
+ "infrastructure" => "euca",
29
+ "machine" => "emi-ABCDEFG"
30
+ }
31
+
32
+ EC2_ENVIRONMENT_VARIABLES.each { |var|
33
+ ENV[var] = nil
34
+ }
35
+
36
+ assert_raises(BadConfigurationException) {
37
+ AppScaleTools.run_instances(options)
38
+ }
39
+ end
40
+
41
+ def test_usage_is_up_to_date
42
+ AppScaleTools::RUN_INSTANCES_FLAGS.each { |flag|
43
+ assert_equal(true,
44
+ AppScaleTools::RUN_INSTANCES_USAGE.include?("-#{flag}"),
45
+ "No usage text for #{flag}.")
46
+ }
47
+ end
48
+ end