af 0.3.22 → 0.5.0.beta.1

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 (157) hide show
  1. checksums.yaml +14 -6
  2. data/LICENSE +1277 -24
  3. data/Rakefile +24 -87
  4. data/bin/af +7 -2
  5. data/lib/af/version.rb +3 -0
  6. data/lib/vmc.rb +7 -2
  7. data/lib/vmc/cli.rb +475 -0
  8. data/lib/vmc/cli/app/app.rb +45 -0
  9. data/lib/vmc/cli/app/apps.rb +105 -0
  10. data/lib/vmc/cli/app/base.rb +82 -0
  11. data/lib/vmc/cli/app/crashes.rb +46 -0
  12. data/lib/vmc/cli/app/delete.rb +95 -0
  13. data/lib/vmc/cli/app/deprecated.rb +11 -0
  14. data/lib/vmc/cli/app/env.rb +78 -0
  15. data/lib/vmc/cli/app/files.rb +137 -0
  16. data/lib/vmc/cli/app/health.rb +26 -0
  17. data/lib/vmc/cli/app/instances.rb +53 -0
  18. data/lib/vmc/cli/app/logs.rb +76 -0
  19. data/lib/vmc/cli/app/push.rb +107 -0
  20. data/lib/vmc/cli/app/push/create.rb +150 -0
  21. data/lib/vmc/cli/app/push/interactions.rb +100 -0
  22. data/lib/vmc/cli/app/push/sync.rb +64 -0
  23. data/lib/vmc/cli/app/rename.rb +39 -0
  24. data/lib/vmc/cli/app/restart.rb +20 -0
  25. data/lib/vmc/cli/app/scale.rb +71 -0
  26. data/lib/vmc/cli/app/start.rb +93 -0
  27. data/lib/vmc/cli/app/stats.rb +67 -0
  28. data/lib/vmc/cli/app/stop.rb +27 -0
  29. data/lib/vmc/cli/domain/base.rb +12 -0
  30. data/lib/vmc/cli/domain/domains.rb +40 -0
  31. data/lib/vmc/cli/domain/map.rb +55 -0
  32. data/lib/vmc/cli/domain/unmap.rb +56 -0
  33. data/lib/vmc/cli/help.rb +16 -0
  34. data/lib/vmc/cli/interactive.rb +105 -0
  35. data/lib/vmc/cli/organization/base.rb +14 -0
  36. data/lib/vmc/cli/organization/create.rb +32 -0
  37. data/lib/vmc/cli/organization/delete.rb +73 -0
  38. data/lib/vmc/cli/organization/org.rb +45 -0
  39. data/lib/vmc/cli/organization/orgs.rb +35 -0
  40. data/lib/vmc/cli/organization/rename.rb +36 -0
  41. data/lib/vmc/cli/route/base.rb +12 -0
  42. data/lib/vmc/cli/route/map.rb +80 -0
  43. data/lib/vmc/cli/route/routes.rb +26 -0
  44. data/lib/vmc/cli/route/unmap.rb +94 -0
  45. data/lib/vmc/cli/service/base.rb +8 -0
  46. data/lib/vmc/cli/service/bind.rb +44 -0
  47. data/lib/vmc/cli/service/create.rb +126 -0
  48. data/lib/vmc/cli/service/delete.rb +86 -0
  49. data/lib/vmc/cli/service/rename.rb +35 -0
  50. data/lib/vmc/cli/service/service.rb +42 -0
  51. data/lib/vmc/cli/service/services.rb +115 -0
  52. data/lib/vmc/cli/service/unbind.rb +38 -0
  53. data/lib/vmc/cli/space/base.rb +21 -0
  54. data/lib/vmc/cli/space/create.rb +56 -0
  55. data/lib/vmc/cli/space/delete.rb +95 -0
  56. data/lib/vmc/cli/space/rename.rb +39 -0
  57. data/lib/vmc/cli/space/space.rb +64 -0
  58. data/lib/vmc/cli/space/spaces.rb +55 -0
  59. data/lib/vmc/cli/space/take.rb +16 -0
  60. data/lib/vmc/cli/start/base.rb +80 -0
  61. data/lib/vmc/cli/start/colors.rb +13 -0
  62. data/lib/vmc/cli/start/info.rb +122 -0
  63. data/lib/vmc/cli/start/login.rb +92 -0
  64. data/lib/vmc/cli/start/logout.rb +13 -0
  65. data/lib/vmc/cli/start/target.rb +64 -0
  66. data/lib/vmc/cli/start/target_interactions.rb +37 -0
  67. data/lib/vmc/cli/start/targets.rb +16 -0
  68. data/lib/vmc/cli/user/base.rb +29 -0
  69. data/lib/vmc/cli/user/create.rb +39 -0
  70. data/lib/vmc/cli/user/delete.rb +25 -0
  71. data/lib/vmc/cli/user/passwd.rb +50 -0
  72. data/lib/vmc/cli/user/register.rb +42 -0
  73. data/lib/vmc/cli/user/users.rb +32 -0
  74. data/lib/vmc/constants.rb +13 -0
  75. data/lib/vmc/detect.rb +134 -0
  76. data/lib/vmc/errors.rb +17 -0
  77. data/lib/vmc/plugin.rb +56 -0
  78. data/lib/vmc/spacing.rb +89 -0
  79. data/lib/vmc/spec_helper.rb +1 -0
  80. data/lib/vmc/test_support.rb +4 -0
  81. data/lib/vmc/test_support/command_helper.rb +32 -0
  82. data/lib/vmc/test_support/common_input_examples.rb +14 -0
  83. data/lib/vmc/test_support/fake_home_dir.rb +16 -0
  84. data/lib/vmc/test_support/interact_helper.rb +29 -0
  85. data/lib/vmc/version.rb +3 -0
  86. data/spec/assets/hello-sinatra/Gemfile +3 -0
  87. data/spec/assets/hello-sinatra/main.rb +6 -0
  88. data/spec/features/new_user_flow_spec.rb +71 -0
  89. data/spec/spec_helper.rb +63 -0
  90. data/spec/vmc/cli/app/base_spec.rb +17 -0
  91. data/spec/vmc/cli/app/delete_spec.rb +188 -0
  92. data/spec/vmc/cli/app/instances_spec.rb +65 -0
  93. data/spec/vmc/cli/app/push/create_spec.rb +571 -0
  94. data/spec/vmc/cli/app/push_spec.rb +369 -0
  95. data/spec/vmc/cli/app/rename_spec.rb +104 -0
  96. data/spec/vmc/cli/app/scale_spec.rb +81 -0
  97. data/spec/vmc/cli/app/stats_spec.rb +62 -0
  98. data/spec/vmc/cli/domain/map_spec.rb +140 -0
  99. data/spec/vmc/cli/domain/unmap_spec.rb +73 -0
  100. data/spec/vmc/cli/organization/orgs_spec.rb +108 -0
  101. data/spec/vmc/cli/organization/rename_spec.rb +113 -0
  102. data/spec/vmc/cli/route/map_spec.rb +138 -0
  103. data/spec/vmc/cli/route/unmap_spec.rb +215 -0
  104. data/spec/vmc/cli/service/bind_spec.rb +25 -0
  105. data/spec/vmc/cli/service/delete_spec.rb +22 -0
  106. data/spec/vmc/cli/service/rename_spec.rb +105 -0
  107. data/spec/vmc/cli/service/service_spec.rb +23 -0
  108. data/spec/vmc/cli/service/unbind_spec.rb +25 -0
  109. data/spec/vmc/cli/space/rename_spec.rb +102 -0
  110. data/spec/vmc/cli/space/spaces_spec.rb +104 -0
  111. data/spec/vmc/cli/start/info_spec.rb +153 -0
  112. data/spec/vmc/cli/start/login_spec.rb +71 -0
  113. data/spec/vmc/cli/user/create_spec.rb +54 -0
  114. data/spec/vmc/cli/user/passwd_spec.rb +102 -0
  115. data/spec/vmc/cli/user/register_spec.rb +148 -0
  116. data/spec/vmc/cli_spec.rb +448 -0
  117. data/spec/vmc/detect_spec.rb +54 -0
  118. metadata +231 -124
  119. data/README.md +0 -155
  120. data/caldecott_helper/Gemfile +0 -10
  121. data/caldecott_helper/Gemfile.lock +0 -48
  122. data/caldecott_helper/server.rb +0 -43
  123. data/config/clients.yml +0 -17
  124. data/config/micro/offline.conf +0 -2
  125. data/config/micro/paths.yml +0 -22
  126. data/config/micro/refresh_ip.rb +0 -20
  127. data/lib/cli.rb +0 -48
  128. data/lib/cli/commands/admin.rb +0 -81
  129. data/lib/cli/commands/apps.rb +0 -1358
  130. data/lib/cli/commands/base.rb +0 -233
  131. data/lib/cli/commands/manifest.rb +0 -56
  132. data/lib/cli/commands/micro.rb +0 -115
  133. data/lib/cli/commands/misc.rb +0 -147
  134. data/lib/cli/commands/services.rb +0 -217
  135. data/lib/cli/commands/user.rb +0 -70
  136. data/lib/cli/config.rb +0 -176
  137. data/lib/cli/console_helper.rb +0 -163
  138. data/lib/cli/core_ext.rb +0 -122
  139. data/lib/cli/errors.rb +0 -19
  140. data/lib/cli/file_helper.rb +0 -123
  141. data/lib/cli/frameworks.rb +0 -265
  142. data/lib/cli/manifest_helper.rb +0 -316
  143. data/lib/cli/runner.rb +0 -633
  144. data/lib/cli/services_helper.rb +0 -104
  145. data/lib/cli/tunnel_helper.rb +0 -336
  146. data/lib/cli/usage.rb +0 -129
  147. data/lib/cli/version.rb +0 -7
  148. data/lib/cli/zip_util.rb +0 -102
  149. data/lib/vmc/client.rb +0 -574
  150. data/lib/vmc/const.rb +0 -27
  151. data/lib/vmc/micro.rb +0 -56
  152. data/lib/vmc/micro/switcher/base.rb +0 -97
  153. data/lib/vmc/micro/switcher/darwin.rb +0 -19
  154. data/lib/vmc/micro/switcher/dummy.rb +0 -15
  155. data/lib/vmc/micro/switcher/linux.rb +0 -16
  156. data/lib/vmc/micro/switcher/windows.rb +0 -31
  157. data/lib/vmc/micro/vmrun.rb +0 -158
@@ -0,0 +1,100 @@
1
+ module VMC::App
2
+ module PushInteractions
3
+ def ask_name
4
+ ask("Name")
5
+ end
6
+
7
+ def ask_host(name)
8
+ ask "Subdomain", :choices => [name, "none"],
9
+ :default => name,
10
+ :allow_other => true
11
+ end
12
+
13
+ def ask_domain(app)
14
+ choices = v2? ? app.space.domains : ["#{app.name}.#{target_base}"]
15
+ # =======
16
+ # def ask_url(name, infra)
17
+ # choices = url_choices(name, infra)
18
+ # >>>>>>> Added infra to url domain
19
+
20
+ options = {
21
+ :choices => choices + ["none"],
22
+ :display => proc { |d| d.is_a?(String) ? d : d.name },
23
+ :allow_other => true
24
+ }
25
+
26
+ options[:default] = choices.first if choices.size == 1
27
+
28
+ ask "Domain", options
29
+ end
30
+
31
+ def ask_memory(default)
32
+ ask("Memory Limit",
33
+ :choices => memory_choices,
34
+ :allow_other => true,
35
+ :default => default || "64M")
36
+ end
37
+
38
+ def ask_instances
39
+ ask("Instances", :default => 1)
40
+ end
41
+
42
+ def ask_framework(choices, default, other)
43
+ ask_with_other("Framework", client.frameworks, choices, default, other)
44
+ end
45
+
46
+ def ask_infra(choices, default, other)
47
+ ask_with_other("Infrastructure", client.infras, choices, default, other)
48
+ end
49
+
50
+ def ask_runtime(choices, default, other)
51
+ ask_with_other("Runtime", client.runtimes, choices, default, other)
52
+ end
53
+
54
+ def ask_command
55
+ if ask("Use custom startup command?", :default => false)
56
+ ask("Startup command")
57
+ end
58
+ end
59
+
60
+ def ask_create_services
61
+ line unless quiet?
62
+ ask "Create services for application?", :default => false
63
+ end
64
+
65
+ def ask_bind_services
66
+ return if all_instances.empty?
67
+
68
+ ask "Bind other services to application?", :default => false
69
+ end
70
+
71
+ private
72
+
73
+ def ask_with_other(message, all, choices, default, other)
74
+ choices = choices.sort_by(&:name)
75
+ choices << other if other
76
+
77
+ opts = {
78
+ :choices => choices,
79
+ :display => proc { |x|
80
+ if other && x == other
81
+ "other"
82
+ else
83
+ x.name
84
+ end
85
+ }
86
+ }
87
+
88
+ opts[:default] = default if default
89
+
90
+ res = ask(message, opts)
91
+
92
+ if other && res == other
93
+ opts[:choices] = all
94
+ res = ask(message, opts)
95
+ end
96
+
97
+ res
98
+ end
99
+ end
100
+ end
@@ -0,0 +1,64 @@
1
+ module VMC::App
2
+ module Sync
3
+ def apply_changes(app)
4
+ app.memory = megabytes(input[:memory]) if input.has?(:memory)
5
+ app.total_instances = input[:instances] if input.has?(:instances)
6
+ app.command = input[:command] if input.has?(:command)
7
+ app.production = input[:plan].upcase.start_with?("P") if input.has?(:plan)
8
+ app.framework = input[:framework] if input.has?(:framework)
9
+ app.runtime = input[:runtime] if input.has?(:runtime)
10
+ app.buildpack = input[:buildpack] if input.has?(:buildpack)
11
+ end
12
+
13
+ def display_changes(app)
14
+ return unless app.changed?
15
+
16
+ line "Changes:"
17
+
18
+ indented do
19
+ app.changes.each do |attr, (old, new)|
20
+ line "#{c(attr, :name)}: #{diff_str(attr, old)} -> #{diff_str(attr, new)}"
21
+ end
22
+ end
23
+ end
24
+
25
+ def commit_changes(app)
26
+ if app.changed?
27
+ with_progress("Updating #{c(app.name, :name)}") do
28
+ wrap_message_format_errors do
29
+ app.update!
30
+ end
31
+ end
32
+ end
33
+
34
+ if input[:restart] && app.started?
35
+ invoke :restart, :app => app
36
+ end
37
+ end
38
+
39
+ private
40
+
41
+ def diff_str(attr, val)
42
+ case attr
43
+ when :memory
44
+ human_mb(val)
45
+ when :framework, :runtime
46
+ val.name
47
+ when :command, :buildpack
48
+ "'#{val}'"
49
+ when :production
50
+ bool(val)
51
+ else
52
+ val
53
+ end
54
+ end
55
+
56
+ def bool(b)
57
+ if b
58
+ c("true", :yes)
59
+ else
60
+ c("false", :no)
61
+ end
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,39 @@
1
+ require "vmc/cli/app/base"
2
+
3
+ module VMC::App
4
+ class Rename < Base
5
+ desc "Rename an application"
6
+ group :apps, :manage
7
+ input :app, :desc => "Application to rename", :argument => :optional,
8
+ :from_given => by_name(:app)
9
+ input :name, :desc => "New application name", :argument => :optional
10
+ def rename
11
+ app = input[:app]
12
+ name = input[:name]
13
+
14
+ original_name = app.guid
15
+ app.name = name
16
+ app.class.guid_name = "hack" # allows the guid to set to original name
17
+ app.guid = original_name
18
+ app.class.guid_name = "name" # restore guid name
19
+
20
+ with_progress("Renaming to #{c(name, :name)}") do
21
+ app.update!
22
+ end
23
+ end
24
+
25
+ private
26
+
27
+ def ask_app
28
+ apps = client.apps
29
+ fail "No applications." if apps.empty?
30
+
31
+ ask("Rename which application?", :choices => apps.sort_by(&:name),
32
+ :display => proc(&:name))
33
+ end
34
+
35
+ def ask_name
36
+ ask("New name")
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,20 @@
1
+ require "vmc/cli/app/base"
2
+
3
+ module VMC::App
4
+ class Restart < Base
5
+ desc "Stop and start an application"
6
+ group :apps, :manage
7
+ input :apps, :desc => "Applications to start", :argument => :splat,
8
+ :singular => :app, :from_given => by_name(:app)
9
+ input :debug_mode, :desc => "Debug mode to start in", :aliases => "-d"
10
+ input :all, :desc => "Restart all applications", :default => false
11
+ def restart
12
+ invoke :stop, :all => input[:all], :apps => input[:apps]
13
+
14
+ line unless quiet?
15
+
16
+ invoke :start, :all => input[:all], :apps => input[:apps],
17
+ :debug_mode => input[:debug_mode]
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,71 @@
1
+ require "vmc/cli/app/base"
2
+
3
+ module VMC::App
4
+ class Scale < Base
5
+ desc "Update the instances/memory limit for an application"
6
+ group :apps, :info, :hidden => true
7
+ input :app, :desc => "Application to update", :argument => true,
8
+ :from_given => by_name(:app)
9
+ input :instances, :desc => "Number of instances to run",
10
+ :type => :numeric
11
+ input :memory, :desc => "Memory limit"
12
+ input :disk, :desc => "Disk quota"
13
+ input :plan, :desc => "Application plan", :default => "D100"
14
+ input :restart, :desc => "Restart app after updating?", :default => true
15
+ def scale
16
+ app = input[:app]
17
+
18
+ if input.has?(:instances)
19
+ instances = input[:instances, app.total_instances]
20
+ end
21
+
22
+ if input.has?(:memory)
23
+ memory = input[:memory, app.memory]
24
+ end
25
+
26
+ if input.has?(:disk)
27
+ disk = input[:disk, human_mb(app.disk_quota)]
28
+ end
29
+
30
+ if input.has?(:plan)
31
+ fail "Plans not supported on target cloud." unless v2?
32
+
33
+ plan_name = input[:plan]
34
+ production = !!(plan_name =~ /^p/i)
35
+ end
36
+
37
+ unless instances || memory || disk || plan_name
38
+ instances = input[:instances, app.total_instances]
39
+ memory = input[:memory, app.memory]
40
+ end
41
+
42
+ app.total_instances = instances if input.has?(:instances)
43
+ app.memory = megabytes(memory) if input.has?(:memory)
44
+ app.disk_quota = megabytes(disk) if input.has?(:disk)
45
+ app.production = production if input.has?(:plan)
46
+
47
+ fail "No changes!" unless app.changed?
48
+
49
+ with_progress("Scaling #{c(app.name, :name)}") do
50
+ app.update!
51
+ end
52
+
53
+ needs_restart = app.changes.key?(:memory) || app.changes.key?(:disk_quota)
54
+
55
+ if needs_restart && app.started? && input[:restart]
56
+ invoke :restart, :app => app
57
+ end
58
+ end
59
+
60
+ private
61
+
62
+ def ask_instances(default)
63
+ ask("Instances", :default => default)
64
+ end
65
+
66
+ def ask_memory(default)
67
+ ask("Memory Limit", :choices => memory_choices(default),
68
+ :default => human_mb(default), :allow_other => true)
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,93 @@
1
+ require "vmc/cli/app/base"
2
+
3
+ module VMC::App
4
+ class Start < Base
5
+ APP_CHECK_LIMIT = 60
6
+
7
+ desc "Start an application"
8
+ group :apps, :manage
9
+ input :apps, :desc => "Applications to start", :argument => :splat,
10
+ :singular => :app, :from_given => by_name(:app)
11
+ input :debug_mode, :desc => "Debug mode to start in", :aliases => "-d"
12
+ input :all, :desc => "Start all applications", :default => false
13
+ def start
14
+ apps = input[:all] ? client.apps : input[:apps]
15
+ fail "No applications given." if apps.empty?
16
+
17
+ spaced(apps) do |app|
18
+ app = filter(:start_app, app)
19
+
20
+ switch_mode(app, input[:debug_mode])
21
+
22
+ with_progress("Starting #{c(app.name, :name)}") do |s|
23
+ if app.started?
24
+ s.skip do
25
+ err "Already started."
26
+ end
27
+ end
28
+
29
+ app.start!
30
+ end
31
+
32
+ check_application(app)
33
+
34
+ if app.debug_mode && !quiet?
35
+ line
36
+ invoke :instances, :app => app
37
+ end
38
+ end
39
+ end
40
+
41
+ # set app debug mode, ensuring it's valid, and shutting it down
42
+ def switch_mode(app, mode)
43
+ mode = nil if mode == "none"
44
+ mode = "run" if mode == "debug_mode" # no value given
45
+
46
+ return false if app.debug_mode == mode
47
+
48
+ if mode.nil?
49
+ with_progress("Removing debug mode") do
50
+ app.debug_mode = nil
51
+ app.stop! if app.started?
52
+ end
53
+
54
+ return true
55
+ end
56
+
57
+ with_progress("Switching mode to #{c(mode, :name)}") do |s|
58
+ runtime = client.runtimes.find { |r| r.name == app.runtime.name }
59
+ modes = runtime.debug_modes
60
+
61
+ if modes.include?(mode)
62
+ app.debug_mode = mode
63
+ app.stop! if app.started?
64
+ else
65
+ fail "Unknown mode '#{mode}'; available: #{modes.join ", "}"
66
+ end
67
+ end
68
+ end
69
+
70
+ def check_application(app)
71
+ with_progress("Checking #{c(app.name, :name)}") do |s|
72
+ if app.debug_mode == "suspend"
73
+ s.skip do
74
+ line "Application is in suspended debugging mode."
75
+ line "It will wait for you to attach to it before starting."
76
+ end
77
+ end
78
+
79
+ seconds = 0
80
+ until app.healthy?
81
+ sleep 1
82
+ seconds += 1
83
+ if seconds == APP_CHECK_LIMIT
84
+ s.give_up do
85
+ err "Application failed to start."
86
+ # TODO: print logs
87
+ end
88
+ end
89
+ end
90
+ end
91
+ end
92
+ end
93
+ end
@@ -0,0 +1,67 @@
1
+ require "vmc/cli/app/base"
2
+
3
+ module VMC::App
4
+ class Stats < Base
5
+ desc "Display application instance status"
6
+ group :apps, :info, :hidden => true
7
+ input :app, :desc => "Application to get the stats for",
8
+ :argument => true, :from_given => by_name(:app)
9
+ def stats
10
+ app = input[:app]
11
+
12
+ stats =
13
+ with_progress("Getting stats for #{c(app.name, :name)}") do |s|
14
+ begin
15
+ app.stats
16
+ rescue CFoundry::StatsError
17
+ s.fail do
18
+ err "Application #{b(app.name)} is not running."
19
+ return
20
+ end
21
+ end
22
+ end
23
+
24
+ line unless quiet?
25
+
26
+ table(
27
+ %w{instance cpu memory disk},
28
+ stats.sort_by { |idx, _| idx.to_i }.collect { |idx, info|
29
+ idx = c("\##{idx}", :instance)
30
+
31
+ if info[:state] == "DOWN"
32
+ [idx, c("down", :bad)]
33
+ else
34
+ stats = info[:stats]
35
+ usage = stats[:usage]
36
+
37
+ if usage
38
+ [ idx,
39
+ "#{percentage(usage[:cpu])}",
40
+ "#{usage(usage[:mem], stats[:mem_quota])}",
41
+ "#{usage(usage[:disk], stats[:disk_quota])}"
42
+ ]
43
+ else
44
+ [idx, c("n/a", :neutral)]
45
+ end
46
+ end
47
+ })
48
+ end
49
+
50
+ def percentage(num, low = 50, mid = 70)
51
+ color =
52
+ if num <= low
53
+ :good
54
+ elsif num <= mid
55
+ :warning
56
+ else
57
+ :bad
58
+ end
59
+
60
+ c(format("%.1f\%", num), color)
61
+ end
62
+
63
+ def usage(used, limit)
64
+ "#{b(human_size(used))} of #{b(human_size(limit, 0))}"
65
+ end
66
+ end
67
+ end