trucker-cli 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (294) hide show
  1. checksums.yaml +15 -0
  2. data/LICENSE +1277 -0
  3. data/Rakefile +13 -0
  4. data/bin/truck +18 -0
  5. data/lib/admin/README.md +30 -0
  6. data/lib/admin/curl.rb +59 -0
  7. data/lib/admin/guid.rb +89 -0
  8. data/lib/admin/plugin.rb +8 -0
  9. data/lib/admin/service_auth_token.rb +93 -0
  10. data/lib/admin/service_broker/add.rb +54 -0
  11. data/lib/admin/service_broker/remove.rb +33 -0
  12. data/lib/admin/service_broker/service_brokers.rb +29 -0
  13. data/lib/admin/service_broker/update.rb +60 -0
  14. data/lib/admin/set_quota.rb +44 -0
  15. data/lib/cf.rb +14 -0
  16. data/lib/cf/cli.rb +495 -0
  17. data/lib/cf/cli/app/app.rb +43 -0
  18. data/lib/cf/cli/app/apps.rb +87 -0
  19. data/lib/cf/cli/app/base.rb +72 -0
  20. data/lib/cf/cli/app/delete.rb +95 -0
  21. data/lib/cf/cli/app/deprecated.rb +11 -0
  22. data/lib/cf/cli/app/env.rb +99 -0
  23. data/lib/cf/cli/app/events.rb +45 -0
  24. data/lib/cf/cli/app/files.rb +137 -0
  25. data/lib/cf/cli/app/health.rb +26 -0
  26. data/lib/cf/cli/app/instances.rb +53 -0
  27. data/lib/cf/cli/app/logs.rb +76 -0
  28. data/lib/cf/cli/app/push.rb +104 -0
  29. data/lib/cf/cli/app/push/create.rb +108 -0
  30. data/lib/cf/cli/app/push/interactions.rb +90 -0
  31. data/lib/cf/cli/app/push/sync.rb +57 -0
  32. data/lib/cf/cli/app/rename.rb +35 -0
  33. data/lib/cf/cli/app/restart.rb +31 -0
  34. data/lib/cf/cli/app/scale.rb +63 -0
  35. data/lib/cf/cli/app/start.rb +175 -0
  36. data/lib/cf/cli/app/stats.rb +66 -0
  37. data/lib/cf/cli/app/stop.rb +27 -0
  38. data/lib/cf/cli/domain/base.rb +9 -0
  39. data/lib/cf/cli/domain/domains.rb +40 -0
  40. data/lib/cf/cli/domain/map.rb +55 -0
  41. data/lib/cf/cli/domain/unmap.rb +56 -0
  42. data/lib/cf/cli/help.rb +15 -0
  43. data/lib/cf/cli/interactive.rb +104 -0
  44. data/lib/cf/cli/login_requirements.rb +13 -0
  45. data/lib/cf/cli/organization/base.rb +12 -0
  46. data/lib/cf/cli/organization/create.rb +36 -0
  47. data/lib/cf/cli/organization/delete.rb +61 -0
  48. data/lib/cf/cli/organization/org.rb +45 -0
  49. data/lib/cf/cli/organization/orgs.rb +30 -0
  50. data/lib/cf/cli/organization/rename.rb +36 -0
  51. data/lib/cf/cli/populators/base.rb +16 -0
  52. data/lib/cf/cli/populators/organization.rb +32 -0
  53. data/lib/cf/cli/populators/populator_methods.rb +64 -0
  54. data/lib/cf/cli/populators/space.rb +33 -0
  55. data/lib/cf/cli/populators/target.rb +14 -0
  56. data/lib/cf/cli/route/base.rb +9 -0
  57. data/lib/cf/cli/route/delete.rb +28 -0
  58. data/lib/cf/cli/route/map.rb +68 -0
  59. data/lib/cf/cli/route/routes.rb +26 -0
  60. data/lib/cf/cli/route/unmap.rb +56 -0
  61. data/lib/cf/cli/service/base.rb +9 -0
  62. data/lib/cf/cli/service/bind.rb +43 -0
  63. data/lib/cf/cli/service/create.rb +158 -0
  64. data/lib/cf/cli/service/delete.rb +82 -0
  65. data/lib/cf/cli/service/rename.rb +35 -0
  66. data/lib/cf/cli/service/service.rb +40 -0
  67. data/lib/cf/cli/service/service_helper.rb +25 -0
  68. data/lib/cf/cli/service/service_instance_helper.rb +100 -0
  69. data/lib/cf/cli/service/services.rb +110 -0
  70. data/lib/cf/cli/service/unbind.rb +36 -0
  71. data/lib/cf/cli/space/base.rb +27 -0
  72. data/lib/cf/cli/space/create.rb +66 -0
  73. data/lib/cf/cli/space/delete.rb +55 -0
  74. data/lib/cf/cli/space/rename.rb +38 -0
  75. data/lib/cf/cli/space/space.rb +66 -0
  76. data/lib/cf/cli/space/spaces.rb +57 -0
  77. data/lib/cf/cli/space/switch.rb +18 -0
  78. data/lib/cf/cli/start/base.rb +35 -0
  79. data/lib/cf/cli/start/colors.rb +13 -0
  80. data/lib/cf/cli/start/login.rb +104 -0
  81. data/lib/cf/cli/start/logout.rb +17 -0
  82. data/lib/cf/cli/start/target.rb +50 -0
  83. data/lib/cf/cli/start/target_prettifier.rb +35 -0
  84. data/lib/cf/cli/start/targets.rb +16 -0
  85. data/lib/cf/cli/user/base.rb +29 -0
  86. data/lib/cf/cli/user/create.rb +51 -0
  87. data/lib/cf/cli/user/passwd.rb +36 -0
  88. data/lib/cf/cli/user/register.rb +42 -0
  89. data/lib/cf/cli/user/users.rb +32 -0
  90. data/lib/cf/constants.rb +10 -0
  91. data/lib/cf/errors.rb +19 -0
  92. data/lib/cf/plugin.rb +56 -0
  93. data/lib/cf/spacing.rb +89 -0
  94. data/lib/cf/spec_helper.rb +1 -0
  95. data/lib/cf/test_support.rb +6 -0
  96. data/lib/cf/version.rb +3 -0
  97. data/lib/console/README.md +16 -0
  98. data/lib/console/console.rb +187 -0
  99. data/lib/console/plugin.rb +32 -0
  100. data/lib/manifests/errors.rb +35 -0
  101. data/lib/manifests/loader.rb +31 -0
  102. data/lib/manifests/loader/builder.rb +39 -0
  103. data/lib/manifests/loader/normalizer.rb +145 -0
  104. data/lib/manifests/loader/resolver.rb +79 -0
  105. data/lib/manifests/manifests.rb +343 -0
  106. data/lib/manifests/plugin.rb +140 -0
  107. data/lib/micro/README.md +25 -0
  108. data/lib/micro/errors.rb +4 -0
  109. data/lib/micro/micro.rb +56 -0
  110. data/lib/micro/plugin.rb +197 -0
  111. data/lib/micro/switcher/base.rb +79 -0
  112. data/lib/micro/switcher/darwin.rb +21 -0
  113. data/lib/micro/switcher/dummy.rb +15 -0
  114. data/lib/micro/switcher/linux.rb +16 -0
  115. data/lib/micro/switcher/windows.rb +31 -0
  116. data/lib/micro/vmrun.rb +175 -0
  117. data/lib/tasks/gem_release.rake +56 -0
  118. data/lib/tasks/windows_build.rake +14 -0
  119. data/lib/tunnel/README.md +29 -0
  120. data/lib/tunnel/config/clients.yml +17 -0
  121. data/lib/tunnel/helper-app/Gemfile +10 -0
  122. data/lib/tunnel/helper-app/Gemfile.lock +48 -0
  123. data/lib/tunnel/helper-app/server.rb +43 -0
  124. data/lib/tunnel/plugin.rb +183 -0
  125. data/lib/tunnel/tunnel.rb +295 -0
  126. data/spec/admin/curl_spec.rb +52 -0
  127. data/spec/admin/guid_spec.rb +85 -0
  128. data/spec/admin/service_broker/add_spec.rb +64 -0
  129. data/spec/admin/service_broker/remove_spec.rb +46 -0
  130. data/spec/admin/service_broker/service_brokers_spec.rb +34 -0
  131. data/spec/admin/service_broker/update_spec.rb +51 -0
  132. data/spec/admin/set_quota_spec.rb +89 -0
  133. data/spec/assets/env/Gemfile +4 -0
  134. data/spec/assets/env/Gemfile.lock +20 -0
  135. data/spec/assets/env/env_test.rb +58 -0
  136. data/spec/assets/hello-sinatra/Gemfile +3 -0
  137. data/spec/assets/hello-sinatra/Gemfile.lock +17 -0
  138. data/spec/assets/hello-sinatra/config.ru +3 -0
  139. data/spec/assets/hello-sinatra/fat-cat-makes-app-larger.png +0 -0
  140. data/spec/assets/hello-sinatra/main.rb +8 -0
  141. data/spec/assets/rails328_ruby187_app/Gemfile +39 -0
  142. data/spec/assets/rails328_ruby187_app/README.rdoc +261 -0
  143. data/spec/assets/rails328_ruby187_app/Rakefile +7 -0
  144. data/spec/assets/rails328_ruby187_app/app/assets/images/rails.png +0 -0
  145. data/spec/assets/rails328_ruby187_app/app/assets/javascripts/application.js +15 -0
  146. data/spec/assets/rails328_ruby187_app/app/assets/stylesheets/application.css +13 -0
  147. data/spec/assets/rails328_ruby187_app/app/controllers/application_controller.rb +3 -0
  148. data/spec/assets/rails328_ruby187_app/app/helpers/application_helper.rb +2 -0
  149. data/spec/assets/rails328_ruby187_app/app/views/layouts/application.html.erb +14 -0
  150. data/spec/assets/rails328_ruby187_app/config.ru +4 -0
  151. data/spec/assets/rails328_ruby187_app/config/application.rb +62 -0
  152. data/spec/assets/rails328_ruby187_app/config/boot.rb +6 -0
  153. data/spec/assets/rails328_ruby187_app/config/database.yml +25 -0
  154. data/spec/assets/rails328_ruby187_app/config/environment.rb +5 -0
  155. data/spec/assets/rails328_ruby187_app/config/environments/development.rb +37 -0
  156. data/spec/assets/rails328_ruby187_app/config/environments/production.rb +67 -0
  157. data/spec/assets/rails328_ruby187_app/config/environments/test.rb +37 -0
  158. data/spec/assets/rails328_ruby187_app/config/initializers/backtrace_silencers.rb +7 -0
  159. data/spec/assets/rails328_ruby187_app/config/initializers/inflections.rb +15 -0
  160. data/spec/assets/rails328_ruby187_app/config/initializers/mime_types.rb +5 -0
  161. data/spec/assets/rails328_ruby187_app/config/initializers/secret_token.rb +7 -0
  162. data/spec/assets/rails328_ruby187_app/config/initializers/session_store.rb +8 -0
  163. data/spec/assets/rails328_ruby187_app/config/initializers/wrap_parameters.rb +14 -0
  164. data/spec/assets/rails328_ruby187_app/config/locales/en.yml +5 -0
  165. data/spec/assets/rails328_ruby187_app/config/routes.rb +58 -0
  166. data/spec/assets/rails328_ruby187_app/db/seeds.rb +7 -0
  167. data/spec/assets/rails328_ruby187_app/doc/README_FOR_APP +2 -0
  168. data/spec/assets/rails328_ruby187_app/manifest.yml +7 -0
  169. data/spec/assets/rails328_ruby187_app/public/404.html +26 -0
  170. data/spec/assets/rails328_ruby187_app/public/422.html +26 -0
  171. data/spec/assets/rails328_ruby187_app/public/500.html +25 -0
  172. data/spec/assets/rails328_ruby187_app/public/assets/application-7270767b2a9e9fff880aa5de378ca791.css +0 -0
  173. data/spec/assets/rails328_ruby187_app/public/assets/application-7270767b2a9e9fff880aa5de378ca791.css.gz +0 -0
  174. data/spec/assets/rails328_ruby187_app/public/assets/application-ccab98dc1abdf097c0af693e20aed861.js +17 -0
  175. data/spec/assets/rails328_ruby187_app/public/assets/application-ccab98dc1abdf097c0af693e20aed861.js.gz +0 -0
  176. data/spec/assets/rails328_ruby187_app/public/assets/application.css +0 -0
  177. data/spec/assets/rails328_ruby187_app/public/assets/application.css.gz +0 -0
  178. data/spec/assets/rails328_ruby187_app/public/assets/application.js +17 -0
  179. data/spec/assets/rails328_ruby187_app/public/assets/application.js.gz +0 -0
  180. data/spec/assets/rails328_ruby187_app/public/assets/manifest.yml +4 -0
  181. data/spec/assets/rails328_ruby187_app/public/assets/rails-be8732dac73d845ac5b142c8fb5f9fb0.png +0 -0
  182. data/spec/assets/rails328_ruby187_app/public/assets/rails.png +0 -0
  183. data/spec/assets/rails328_ruby187_app/public/favicon.ico +0 -0
  184. data/spec/assets/rails328_ruby187_app/public/index.html +241 -0
  185. data/spec/assets/rails328_ruby187_app/public/robots.txt +5 -0
  186. data/spec/assets/rails328_ruby187_app/script/rails +6 -0
  187. data/spec/assets/rails328_ruby187_app/test/performance/browsing_test.rb +12 -0
  188. data/spec/assets/rails328_ruby187_app/test/test_helper.rb +13 -0
  189. data/spec/cf/cli/app/base_spec.rb +17 -0
  190. data/spec/cf/cli/app/delete_spec.rb +197 -0
  191. data/spec/cf/cli/app/env_spec.rb +261 -0
  192. data/spec/cf/cli/app/events_spec.rb +72 -0
  193. data/spec/cf/cli/app/help_spec.rb +39 -0
  194. data/spec/cf/cli/app/instances_spec.rb +69 -0
  195. data/spec/cf/cli/app/push/create_spec.rb +444 -0
  196. data/spec/cf/cli/app/push/interactions_spec.rb +32 -0
  197. data/spec/cf/cli/app/push_spec.rb +332 -0
  198. data/spec/cf/cli/app/rename_spec.rb +108 -0
  199. data/spec/cf/cli/app/restart_spec.rb +47 -0
  200. data/spec/cf/cli/app/scale_spec.rb +63 -0
  201. data/spec/cf/cli/app/start_spec.rb +255 -0
  202. data/spec/cf/cli/app/stats_spec.rb +66 -0
  203. data/spec/cf/cli/domain/help_spec.rb +39 -0
  204. data/spec/cf/cli/domain/map_spec.rb +140 -0
  205. data/spec/cf/cli/domain/unmap_spec.rb +77 -0
  206. data/spec/cf/cli/help_spec.rb +21 -0
  207. data/spec/cf/cli/organization/create_spec.rb +121 -0
  208. data/spec/cf/cli/organization/delete_spec.rb +105 -0
  209. data/spec/cf/cli/organization/help_spec.rb +39 -0
  210. data/spec/cf/cli/organization/orgs_spec.rb +116 -0
  211. data/spec/cf/cli/organization/rename_spec.rb +116 -0
  212. data/spec/cf/cli/populators/organization_spec.rb +179 -0
  213. data/spec/cf/cli/populators/space_spec.rb +156 -0
  214. data/spec/cf/cli/populators/target_spec.rb +39 -0
  215. data/spec/cf/cli/route/delete_spec.rb +92 -0
  216. data/spec/cf/cli/route/help_spec.rb +32 -0
  217. data/spec/cf/cli/route/map_spec.rb +148 -0
  218. data/spec/cf/cli/route/unmap_spec.rb +114 -0
  219. data/spec/cf/cli/service/bind_spec.rb +25 -0
  220. data/spec/cf/cli/service/create_spec.rb +147 -0
  221. data/spec/cf/cli/service/delete_spec.rb +22 -0
  222. data/spec/cf/cli/service/help_spec.rb +39 -0
  223. data/spec/cf/cli/service/rename_spec.rb +103 -0
  224. data/spec/cf/cli/service/service_helper_spec.rb +66 -0
  225. data/spec/cf/cli/service/service_instance_helper_spec.rb +155 -0
  226. data/spec/cf/cli/service/service_spec.rb +23 -0
  227. data/spec/cf/cli/service/services_spec.rb +156 -0
  228. data/spec/cf/cli/service/unbind_spec.rb +25 -0
  229. data/spec/cf/cli/space/base_spec.rb +49 -0
  230. data/spec/cf/cli/space/create_spec.rb +144 -0
  231. data/spec/cf/cli/space/delete_spec.rb +109 -0
  232. data/spec/cf/cli/space/help_spec.rb +39 -0
  233. data/spec/cf/cli/space/rename_spec.rb +110 -0
  234. data/spec/cf/cli/space/space_spec.rb +80 -0
  235. data/spec/cf/cli/space/spaces_spec.rb +107 -0
  236. data/spec/cf/cli/space/switch_space_spec.rb +57 -0
  237. data/spec/cf/cli/start/help_spec.rb +39 -0
  238. data/spec/cf/cli/start/login_spec.rb +142 -0
  239. data/spec/cf/cli/start/logout_spec.rb +49 -0
  240. data/spec/cf/cli/start/target_prettifier_spec.rb +78 -0
  241. data/spec/cf/cli/start/target_spec.rb +123 -0
  242. data/spec/cf/cli/user/create_spec.rb +98 -0
  243. data/spec/cf/cli/user/help_spec.rb +32 -0
  244. data/spec/cf/cli/user/passwd_spec.rb +94 -0
  245. data/spec/cf/cli/user/register_spec.rb +145 -0
  246. data/spec/cf/cli_spec.rb +474 -0
  247. data/spec/console/console_spec.rb +189 -0
  248. data/spec/factories/cfoundry/v2/apps_factory.rb +12 -0
  249. data/spec/factories/cfoundry/v2/clients_factory.rb +7 -0
  250. data/spec/factories/cfoundry/v2/domains_factory.rb +8 -0
  251. data/spec/factories/cfoundry/v2/managed_service_instances_factory.rb +13 -0
  252. data/spec/factories/cfoundry/v2/organizations_factory.rb +14 -0
  253. data/spec/factories/cfoundry/v2/quota_definitions.rb +13 -0
  254. data/spec/factories/cfoundry/v2/routes_factory.rb +8 -0
  255. data/spec/factories/cfoundry/v2/service_bindings_factory.rb +11 -0
  256. data/spec/factories/cfoundry/v2/service_brokers_factory.rb +11 -0
  257. data/spec/factories/cfoundry/v2/service_plans_factory.rb +17 -0
  258. data/spec/factories/cfoundry/v2/services_factory.rb +14 -0
  259. data/spec/factories/cfoundry/v2/spaces_factory.rb +13 -0
  260. data/spec/factories/cfoundry/v2/stacks_factory.rb +11 -0
  261. data/spec/factories/cfoundry/v2/user_provided_service_instances_factory.rb +12 -0
  262. data/spec/factories/cfoundry/v2/users_factory.rb +7 -0
  263. data/spec/features/backspace_spec.rb +46 -0
  264. data/spec/features/create_user_spec.rb +74 -0
  265. data/spec/features/delete_orphaned_service_spec.rb +64 -0
  266. data/spec/features/login_spec.rb +65 -0
  267. data/spec/features/manifests_spec.rb +86 -0
  268. data/spec/features/org_spec.rb +50 -0
  269. data/spec/features/push_flow_spec.rb +169 -0
  270. data/spec/features/service_brokers_spec.rb +173 -0
  271. data/spec/features/services_spec.rb +122 -0
  272. data/spec/features/space_spec.rb +107 -0
  273. data/spec/features/switching_targets_spec.rb +70 -0
  274. data/spec/manifests/errors_spec.rb +43 -0
  275. data/spec/manifests/loader/builder_spec.rb +80 -0
  276. data/spec/manifests/loader/normalizer_spec.rb +158 -0
  277. data/spec/manifests/manifests_spec.rb +335 -0
  278. data/spec/manifests/plugin_spec.rb +410 -0
  279. data/spec/micro/plugin_spec.rb +64 -0
  280. data/spec/spec_helper.rb +69 -0
  281. data/spec/support/cli_helper.rb +87 -0
  282. data/spec/support/config_helper.rb +15 -0
  283. data/spec/support/factory_girl.rb +6 -0
  284. data/spec/support/fake_home_dir.rb +55 -0
  285. data/spec/support/features_helper.rb +99 -0
  286. data/spec/support/interact_helper.rb +27 -0
  287. data/spec/support/matchers.rb +16 -0
  288. data/spec/support/mock_commands/mock_restart.rb +16 -0
  289. data/spec/support/mock_commands/mock_start.rb +17 -0
  290. data/spec/support/shared_examples/errors.rb +40 -0
  291. data/spec/support/shared_examples/input.rb +14 -0
  292. data/spec/tunnel/plugin_spec.rb +31 -0
  293. data/spec/tunnel/tunnel_spec.rb +54 -0
  294. metadata +814 -0
@@ -0,0 +1,44 @@
1
+ require "cf/cli"
2
+
3
+ module CFAdmin
4
+ class SetQuota < CF::CLI
5
+ def precondition
6
+ check_target
7
+ end
8
+
9
+ desc "Change the quota definition for the given (or current) organization."
10
+ group :admin
11
+ input :quota_definition, :argument => :optional,
12
+ :from_given => by_name(:quota_definition),
13
+ :desc => "Quota definition to set on the organization"
14
+ input :organization, :aliases => %w(org o), :argument => :optional,
15
+ :from_given => by_name(:organization),
16
+ :default => proc { client.current_organization || interact },
17
+ :desc => "Organization to update"
18
+ def set_quota
19
+ org = input[:organization]
20
+ quota = input[:quota_definition]
21
+
22
+ with_progress(<<MESSAGE.chomp) do
23
+ Setting quota of #{c(org.name, :name)} to #{c(quota.name, :name)}
24
+ MESSAGE
25
+ org.quota_definition = quota
26
+ org.update!
27
+ end
28
+ end
29
+
30
+ private
31
+
32
+ def ask_quota_definition
33
+ ask("Quota",
34
+ :choices => client.quota_definitions,
35
+ :display => proc(&:name))
36
+ end
37
+
38
+ def ask_organization
39
+ ask("Organization",
40
+ :choices => client.organizations,
41
+ :display => proc(&:name))
42
+ end
43
+ end
44
+ end
data/lib/cf.rb ADDED
@@ -0,0 +1,14 @@
1
+ require "cf/version"
2
+
3
+ require "cf/cli"
4
+
5
+ command_files = "../cf/cli/{app,route,domain,organization,space,service,start,user}/*.rb"
6
+ Dir[File.expand_path(command_files, __FILE__)].each do |file|
7
+ require file unless File.basename(file) == 'base.rb'
8
+ end
9
+
10
+ require "manifests/plugin"
11
+ require "admin/plugin"
12
+ require "console/plugin"
13
+ require "tunnel/plugin"
14
+ require "micro/plugin"
data/lib/cf/cli.rb ADDED
@@ -0,0 +1,495 @@
1
+ require "yaml"
2
+ require "socket"
3
+ require "net/http"
4
+ require "json/ext"
5
+ require "multi_json"
6
+ require "multi_json/adapters/json_gem"
7
+ require "fileutils"
8
+ require "mothership"
9
+
10
+ require "cfoundry"
11
+
12
+ require "cf/constants"
13
+ require "cf/errors"
14
+ require "cf/spacing"
15
+
16
+ require "cf/cli/help"
17
+ require "cf/cli/interactive"
18
+ require "cf/cli/login_requirements"
19
+
20
+
21
+ $cf_asked_auth = false
22
+
23
+ module CF
24
+ class CLI < Mothership
25
+ include CF::Interactive
26
+ include CF::Spacing
27
+
28
+ option :help, :desc => "Show command usage", :alias => "-h",
29
+ :default => false
30
+
31
+ option :http_proxy, :desc => "Connect with an http proxy server", :alias => "--http-proxy",
32
+ :value => :http_proxy
33
+
34
+ option :https_proxy, :desc => "Connect with an https proxy server", :alias => "--https-proxy",
35
+ :value => :https_proxy
36
+
37
+ option :version, :desc => "Print version number", :alias => "-v",
38
+ :default => false
39
+
40
+ option :verbose, :desc => "Print extra information", :alias => "-V",
41
+ :default => false
42
+
43
+ option :force, :desc => "Skip interaction when possible", :alias => "-f",
44
+ :type => :boolean, :default => proc { input[:script] }
45
+
46
+ option :debug, :desc => "Print full stack trace (instead of crash log)",
47
+ :type => :boolean, :default => false
48
+
49
+ option :quiet, :desc => "Simplify output format", :alias => "-q",
50
+ :type => :boolean, :default => proc { input[:script] }
51
+
52
+ option :script, :desc => "Shortcut for --quiet and --force",
53
+ :type => :boolean, :default => proc { !$stdout.tty? }
54
+
55
+ option :color, :desc => "Use colorful output",
56
+ :type => :boolean, :default => proc { !input[:quiet] }
57
+
58
+ option :trace, :desc => "Show API traffic", :alias => "-t",
59
+ :default => false
60
+
61
+
62
+ def default_action
63
+ if input[:version]
64
+ line "cf #{VERSION}"
65
+ else
66
+ super
67
+ end
68
+ end
69
+
70
+ def check_target
71
+ unless client && client.target
72
+ fail "Please select a target with 'truck target'."
73
+ end
74
+ end
75
+
76
+ def check_logged_in
77
+ check_target
78
+ unless client.logged_in?
79
+ if force?
80
+ fail "Please log in with 'truck login'."
81
+ else
82
+ line c("Please log in first to proceed.", :warning)
83
+ line
84
+ invoke :login
85
+ invalidate_client
86
+ end
87
+ end
88
+ end
89
+
90
+ desc "Help!"
91
+ input :command, :argument => :optional
92
+ def help
93
+ if name = input[:command]
94
+ if cmd = @@commands[name.gsub("-", "_").to_sym]
95
+ Mothership::Help.command_help(cmd)
96
+ else
97
+ unknown_command(name)
98
+ end
99
+ elsif Help.has_groups?
100
+ puts "#{help_header}"
101
+
102
+ Mothership::Help.print_help_groups(@@global, true)
103
+ else
104
+ Mothership::Help.basic_help(@@commands, @@global)
105
+ end
106
+ end
107
+
108
+ def help_header
109
+ <<EOS
110
+ Cloud Foundry Command Line Interface, version [#{CF::VERSION}]
111
+ Use 'truck help [command]' for command details.
112
+ For docs and support visit http://support.cloudfoundry.com
113
+
114
+ USAGE EXAMPLES
115
+ $ cf target api.trucker.io <-- sets the CF instance target where your app will be pushed
116
+ $ cf push <-- deploys app to current app space on current target
117
+ $ cf target -s staging <-- changes currently targeted app space to 'staging'
118
+
119
+ EOS
120
+ end
121
+
122
+ def wrap_errors
123
+ yield
124
+ rescue CFoundry::Timeout => e
125
+ err(e.message)
126
+ rescue Interrupt
127
+ exit_status 130
128
+ rescue Mothership::Error
129
+ raise
130
+ rescue UserError => e
131
+ log_error(e)
132
+ err e.message
133
+ rescue SystemExit
134
+ raise
135
+ rescue UserFriendlyError => e
136
+ err e.message
137
+ rescue CFoundry::InvalidAuthToken => e
138
+ line
139
+ line c("Invalid authentication token. Try logging in again with 'truck login'. If problems continue, please contact your Cloud Operator.", :warning)
140
+ rescue CFoundry::Forbidden => e
141
+ if !$cf_asked_auth
142
+ $cf_asked_auth = true
143
+
144
+ line
145
+ line c("Not authenticated! Try logging in:", :warning)
146
+
147
+ # TODO: there's no color here; global flags not being passed
148
+ # through (mothership bug?)
149
+ invoke :login
150
+
151
+ retry
152
+ end
153
+
154
+ log_error(e)
155
+
156
+ err "Denied: #{e.description}"
157
+ rescue CFoundry::StagingError => e
158
+ message = "Application failed to stage"
159
+ formatted_exception_output(e, message)
160
+ rescue CFoundry::APIError => e
161
+ formatted_exception_output(e, add_exception_name_to_msg(e))
162
+ rescue Exception => e
163
+ log_error_and_dump_crashlog(e)
164
+ end
165
+
166
+ def log_error_and_dump_crashlog(e)
167
+ log_error(e)
168
+ err File.open(File.expand_path(CF::CRASH_FILE)).readlines.join("")
169
+
170
+ raise if debug?
171
+ end
172
+
173
+ def formatted_exception_output(e, msg)
174
+ log_error(e)
175
+ err msg
176
+
177
+ raise if debug?
178
+ end
179
+
180
+ def add_exception_name_to_msg(e)
181
+ msg = e.class.name
182
+ msg << ": #{e}" unless e.to_s.empty?
183
+ msg
184
+ end
185
+
186
+ def execute(cmd, argv, global = {})
187
+ if input[:help]
188
+ invoke :help, :command => cmd.name.to_s
189
+ else
190
+ wrap_errors do
191
+ @command = cmd
192
+ precondition if respond_to? :precondition
193
+
194
+ save_token_if_it_changes do
195
+ super
196
+ end
197
+ end
198
+ end
199
+ end
200
+
201
+ def save_token_if_it_changes
202
+ return yield unless client && client.token
203
+
204
+ before_token = client.token
205
+
206
+ yield
207
+
208
+ after_token = client.token
209
+
210
+ return unless after_token
211
+
212
+ if before_token != after_token
213
+ info = target_info
214
+ info[:token] = after_token.auth_header
215
+ save_target_info(info)
216
+ end
217
+ end
218
+
219
+ def log_error(e)
220
+ ensure_config_dir
221
+
222
+ msg = e.class.name
223
+ msg << ": #{e}" unless e.to_s.empty?
224
+
225
+ crash_file = File.expand_path(CF::CRASH_FILE)
226
+
227
+ FileUtils.mkdir_p(File.dirname(crash_file))
228
+
229
+ File.open(crash_file, "w") do |f|
230
+ f.puts "Time of crash:"
231
+ f.puts " #{Time.now}"
232
+ f.puts ""
233
+ f.puts msg
234
+ f.puts ""
235
+
236
+ if e.respond_to?(:request_trace)
237
+ f.puts "<<<"
238
+ f.puts e.request_trace
239
+ end
240
+
241
+ if e.respond_to?(:response_trace)
242
+ f.puts e.response_trace
243
+ f.puts ">>>"
244
+ f.puts ""
245
+ end
246
+
247
+ cf_dir = File.expand_path("../../../..", __FILE__) + "/"
248
+ e.backtrace.each do |loc|
249
+ if loc =~ /\/gems\//
250
+ f.puts loc.sub(/.*\/gems\//, "")
251
+ else
252
+ f.puts loc.sub(cf_dir, "")
253
+ end
254
+ end
255
+ end
256
+ end
257
+
258
+ def quiet?
259
+ input[:quiet]
260
+ end
261
+
262
+ def force?
263
+ input[:force]
264
+ end
265
+
266
+ def debug?
267
+ !!input[:debug]
268
+ end
269
+
270
+ def color_enabled?
271
+ input[:color]
272
+ end
273
+
274
+ def verbose?
275
+ input[:verbose]
276
+ end
277
+
278
+ def user_colors
279
+ return @user_colors if @user_colors
280
+
281
+ colors = File.expand_path(COLORS_FILE)
282
+
283
+ @user_colors = super.dup
284
+
285
+ # most terminal schemes are stupid, so use cyan instead
286
+ @user_colors.each do |k, v|
287
+ if v == :blue
288
+ @user_colors[k] = :cyan
289
+ end
290
+ end
291
+
292
+ if File.exists?(colors)
293
+ YAML.load_file(colors).each do |k, v|
294
+ @user_colors[k.to_sym] = v.to_sym
295
+ end
296
+ end
297
+
298
+ @user_colors
299
+ end
300
+
301
+ def err(msg, status = 1)
302
+ $stderr.puts c(msg, :error)
303
+ exit_status status
304
+ end
305
+
306
+ def fail(msg)
307
+ raise UserError, msg
308
+ end
309
+
310
+ def table(headers, rows)
311
+ tabular(
312
+ !quiet? && headers.collect { |h| h && b(h) },
313
+ *rows)
314
+ end
315
+
316
+ def name_list(xs)
317
+ if xs.empty?
318
+ d("none")
319
+ else
320
+ xs.collect { |x| c(x.name, :name) }.join(", ")
321
+ end
322
+ end
323
+
324
+ def sane_target_url(url)
325
+ url = "https://#{url}" if url !~ /^http/
326
+ url.gsub(/\/$/, "")
327
+ end
328
+
329
+ def one_of(*paths)
330
+ paths.each do |p|
331
+ exp = File.expand_path(p)
332
+ return exp if File.exist? exp
333
+ end
334
+
335
+ File.expand_path(paths.first)
336
+ end
337
+
338
+ def client_target
339
+ return File.read(target_file).chomp if File.exists?(target_file)
340
+ end
341
+
342
+ def ensure_config_dir
343
+ config = File.expand_path(CF::CONFIG_DIR)
344
+ FileUtils.mkdir_p(config) unless File.exist? config
345
+ end
346
+
347
+ def set_target(url)
348
+ ensure_config_dir
349
+
350
+ File.open(File.expand_path(CF::TARGET_FILE), "w") do |f|
351
+ f.write(url)
352
+ end
353
+
354
+ invalidate_client
355
+ end
356
+
357
+ def targets_info
358
+ new_toks = File.expand_path(CF::TOKENS_FILE)
359
+
360
+ info =
361
+ if File.exist? new_toks
362
+ YAML.load_file(new_toks)
363
+ end
364
+
365
+ info ||= {}
366
+
367
+ normalize_targets_info(info)
368
+ end
369
+
370
+ def normalize_targets_info(info_by_url)
371
+ info_by_url.reduce({}) do |hash, pair|
372
+ key, value = pair
373
+ hash[key] = value.is_a?(String) ? { :token => value } : value
374
+ hash
375
+ end
376
+ end
377
+
378
+ def target_info(target = client_target)
379
+ targets_info[target] || {}
380
+ end
381
+
382
+ def save_targets(ts)
383
+ ensure_config_dir
384
+
385
+ File.open(File.expand_path(CF::TOKENS_FILE), "w") do |io|
386
+ YAML.dump(ts, io)
387
+ end
388
+ end
389
+
390
+ def save_target_info(info, target = client_target)
391
+ ts = targets_info
392
+ ts[target] = info
393
+ save_targets(ts)
394
+ end
395
+
396
+ def remove_target_info(target = client_target)
397
+ ts = targets_info
398
+ ts.delete target
399
+ save_targets(ts)
400
+ end
401
+
402
+ def invalidate_client
403
+ @@client = nil
404
+ client
405
+ end
406
+
407
+ def client(target = client_target)
408
+ return @@client if defined?(@@client) && @@client
409
+ return unless target
410
+
411
+ info = target_info(target)
412
+ token = info[:token] && CFoundry::AuthToken.from_hash(info)
413
+
414
+ fail "V1 targets are no longer supported." if info[:version] == 1
415
+
416
+ @@client = build_client(target, token)
417
+
418
+ @@client.trace = input[:trace]
419
+
420
+ uri = URI.parse(target)
421
+ @@client.log = File.expand_path("#{LOGS_DIR}/#{uri.host}.log")
422
+
423
+ unless info.key? :version
424
+ info[:version] = @@client.version
425
+ save_target_info(info, target)
426
+ end
427
+
428
+ @@client.current_organization = @@client.organization(info[:organization]) if info[:organization]
429
+ @@client.current_space = @@client.space(info[:space]) if info[:space]
430
+
431
+ @@client
432
+ rescue CFoundry::InvalidTarget
433
+ end
434
+
435
+ def build_client(target, token = nil)
436
+ client = CFoundry::V2::Client.new(target, token)
437
+ client.http_proxy = input[:http_proxy] || ENV['HTTP_PROXY'] || ENV['http_proxy']
438
+ client.https_proxy = input[:https_proxy] || ENV['HTTPS_PROXY'] || ENV['https_proxy']
439
+ client
440
+ end
441
+
442
+ def fail_unknown(display, name)
443
+ fail("Unknown #{display} '#{name}'.")
444
+ end
445
+
446
+ class << self
447
+ def client
448
+ @@client
449
+ end
450
+
451
+ def client=(c)
452
+ @@client = c
453
+ end
454
+
455
+ private
456
+
457
+ def find_by_name(display, &blk)
458
+ proc { |name, *args|
459
+ choices, _ = args
460
+ choices ||= instance_exec(&blk) if block_given?
461
+
462
+ choices.find { |c| c.name == name } ||
463
+ fail_unknown(display, name)
464
+ }
465
+ end
466
+
467
+ def by_name(what, display = what)
468
+ proc { |name, *_|
469
+ client.send(:"#{what}_by_name", name) ||
470
+ fail_unknown(display, name)
471
+ }
472
+ end
473
+
474
+ def find_by_name_insensitive(display, &blk)
475
+ proc { |name, *args|
476
+ choices, _ = args
477
+ choices ||= instance_exec(&blk) if block_given?
478
+
479
+ choices.find { |c| c.name.upcase == name.upcase } ||
480
+ fail_unknown(display, name)
481
+ }
482
+ end
483
+ end
484
+
485
+ private
486
+
487
+ def target_file
488
+ File.expand_path(CF::TARGET_FILE)
489
+ end
490
+
491
+ def tokens_file
492
+ File.expand_path(CF::TOKENS_FILE)
493
+ end
494
+ end
495
+ end