vmc 0.4.7 → 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 (73) hide show
  1. data/lib/vmc.rb +1 -2
  2. data/lib/vmc/cli.rb +33 -31
  3. data/lib/vmc/cli/app/app.rb +2 -2
  4. data/lib/vmc/cli/app/apps.rb +4 -5
  5. data/lib/vmc/cli/app/crashes.rb +2 -3
  6. data/lib/vmc/cli/app/delete.rb +28 -25
  7. data/lib/vmc/cli/app/env.rb +11 -19
  8. data/lib/vmc/cli/app/files.rb +11 -15
  9. data/lib/vmc/cli/app/health.rb +2 -3
  10. data/lib/vmc/cli/app/instances.rb +3 -3
  11. data/lib/vmc/cli/app/logs.rb +7 -10
  12. data/lib/vmc/cli/app/push.rb +17 -89
  13. data/lib/vmc/cli/app/push/create.rb +2 -0
  14. data/lib/vmc/cli/app/rename.rb +17 -13
  15. data/lib/vmc/cli/app/restart.rb +4 -7
  16. data/lib/vmc/cli/app/routes.rb +14 -11
  17. data/lib/vmc/cli/app/scale.rb +17 -15
  18. data/lib/vmc/cli/app/start.rb +4 -7
  19. data/lib/vmc/cli/app/stats.rb +2 -3
  20. data/lib/vmc/cli/app/stop.rb +3 -5
  21. data/lib/vmc/cli/domain/add_domain.rb +3 -5
  22. data/lib/vmc/cli/domain/create_domain.rb +5 -8
  23. data/lib/vmc/cli/domain/delete_domain.rb +23 -18
  24. data/lib/vmc/cli/domain/domains.rb +4 -7
  25. data/lib/vmc/cli/domain/remove_domain.rb +12 -10
  26. data/lib/vmc/cli/organization/org.rb +6 -7
  27. data/lib/vmc/cli/organization/orgs.rb +19 -19
  28. data/lib/vmc/cli/organization/rename.rb +18 -14
  29. data/lib/vmc/cli/route/create_route.rb +20 -13
  30. data/lib/vmc/cli/route/{delete_route.rb → delete.rb} +22 -17
  31. data/lib/vmc/cli/service/bind.rb +2 -2
  32. data/lib/vmc/cli/service/create.rb +57 -53
  33. data/lib/vmc/cli/service/delete.rb +33 -31
  34. data/lib/vmc/cli/service/rename.rb +17 -14
  35. data/lib/vmc/cli/service/service.rb +5 -8
  36. data/lib/vmc/cli/service/services.rb +14 -18
  37. data/lib/vmc/cli/service/unbind.rb +4 -4
  38. data/lib/vmc/cli/space/create.rb +16 -17
  39. data/lib/vmc/cli/space/delete.rb +34 -31
  40. data/lib/vmc/cli/space/rename.rb +20 -17
  41. data/lib/vmc/cli/space/space.rb +11 -14
  42. data/lib/vmc/cli/space/spaces.rb +14 -16
  43. data/lib/vmc/cli/space/take.rb +1 -3
  44. data/lib/vmc/cli/start/base.rb +2 -0
  45. data/lib/vmc/cli/start/colors.rb +0 -1
  46. data/lib/vmc/cli/start/info.rb +8 -10
  47. data/lib/vmc/cli/start/login.rb +11 -40
  48. data/lib/vmc/cli/start/logout.rb +0 -1
  49. data/lib/vmc/cli/start/register.rb +18 -12
  50. data/lib/vmc/cli/start/target.rb +7 -36
  51. data/lib/vmc/cli/start/target_interactions.rb +3 -1
  52. data/lib/vmc/cli/start/targets.rb +0 -1
  53. data/lib/vmc/cli/user/create.rb +4 -2
  54. data/lib/vmc/version.rb +1 -1
  55. data/spec/factories/organization_factory.rb +5 -0
  56. data/spec/factories/space_factory.rb +15 -0
  57. data/spec/spec_helper.rb +16 -0
  58. data/spec/vmc/cli/app/push/create_spec.rb +2 -1
  59. data/spec/vmc/cli/app/push_spec.rb +1 -1
  60. data/spec/vmc/cli/organization/orgs_spec.rb +119 -0
  61. data/spec/vmc/cli/route/delete_route_spec.rb +3 -3
  62. data/spec/vmc/cli/service/bind_spec.rb +34 -0
  63. data/spec/vmc/cli/service/delete_spec.rb +32 -0
  64. data/spec/vmc/cli/service/service_spec.rb +32 -0
  65. data/spec/vmc/cli/service/unbind_spec.rb +34 -0
  66. data/spec/vmc/cli/space/spaces_spec.rb +120 -0
  67. data/spec/vmc/cli/start/info_spec.rb +38 -0
  68. data/spec/vmc/cli/start/login_spec.rb +40 -0
  69. metadata +127 -113
  70. data/lib/vmc/cli/organization/create_org.rb +0 -28
  71. data/lib/vmc/cli/organization/delete_org.rb +0 -65
  72. data/lib/vmc/cli/service/binding.rb +0 -66
  73. data/lib/vmc/cli/user.rb +0 -118
@@ -4,24 +4,17 @@ module VMC::Route
4
4
  class CreateRoute < Base
5
5
  desc "Create a route"
6
6
  group :routes
7
- input :url, :argument => :optional,
8
- :desc => "Full route in URL form"
9
- input(:host, :desc => "Host name") {
10
- ask "Host name?"
11
- }
12
- input(:domain, :desc => "Domain to add the route to",
13
- :from_given => find_by_name("domain")) { |domains|
14
- ask "Which domain?", :choices => domains,
15
- :display => proc(&:name)
16
- }
17
-
7
+ input :url, :desc => "Full route in URL form", :argument => :optional
8
+ input :host, :desc => "Host name"
9
+ input :domain, :desc => "Domain to add the route to",
10
+ :from_given => by_name(:domain)
18
11
  def create_route
19
12
  if url = input[:url]
20
13
  host, domain_name = url.split(".", 2)
21
14
  return invoke :create_route, {}, :host => host, :domain => domain_name
22
15
  end
23
16
 
24
- domain = input[:domain, client.current_organization.domains]
17
+ domain = input[:domain]
25
18
  host = input[:host]
26
19
 
27
20
  route = client.route
@@ -38,5 +31,19 @@ module VMC::Route
38
31
  input.forget(:host)
39
32
  retry
40
33
  end
34
+
35
+ private
36
+
37
+ def ask_host
38
+ ask("Host name?")
39
+ end
40
+
41
+ def ask_domain
42
+ domains = client.current_organization.domains
43
+ fail "No domains!" if domains.empty?
44
+
45
+ ask "Which domain?", :choices => domains,
46
+ :display => proc(&:name)
47
+ end
41
48
  end
42
- end
49
+ end
@@ -1,21 +1,15 @@
1
1
  require "vmc/cli/route/base"
2
2
 
3
3
  module VMC::Route
4
- class DeleteRoute < Base
4
+ class Delete < Base
5
5
  desc "Delete a route"
6
6
  group :routes
7
- input(:route, :argument => :optional,
8
- :from_given => find_by_name("route"),
9
- :desc => "Route to delete") { |routes|
10
- ask "Which route?", :choices => routes.sort_by(&:name),
11
- :display => proc(&:name)
12
- }
13
- input(:really, :type => :boolean, :forget => true, :hidden => true,
14
- :default => proc { force? || interact }) { |name, color|
15
- ask("Really delete #{c(name, color)}?", :default => false)
16
- }
17
- input :all, :type => :boolean, :default => false,
18
- :desc => "Delete all routes"
7
+ input :route, :desc => "Route to delete", :argument => :optional,
8
+ :from_given => find_by_name("route") { client.routes },
9
+ :default => proc { force? || interact }
10
+ input :all, :desc => "Delete all routes", :default => false
11
+ input :really, :type => :boolean, :forget => true, :hidden => true,
12
+ :default => proc { force? || interact }
19
13
  def delete_route
20
14
  if input[:all]
21
15
  return unless input[:really, "ALL ROUTES", :bad]
@@ -27,10 +21,7 @@ module VMC::Route
27
21
  return
28
22
  end
29
23
 
30
- routes = client.routes
31
- fail "No routes." if routes.empty?
32
-
33
- route = input[:route, client.routes]
24
+ route = input[:route]
34
25
 
35
26
  return unless input[:really, route.name, :name]
36
27
 
@@ -38,5 +29,19 @@ module VMC::Route
38
29
  route.delete!
39
30
  end
40
31
  end
32
+
33
+ private
34
+
35
+ def ask_route
36
+ routes = client.routes
37
+ fail "No routes." if routes.empty?
38
+
39
+ ask "Which route?", :choices => routes.sort_by(&:name),
40
+ :display => proc(&:name)
41
+ end
42
+
43
+ def ask_really(name, color)
44
+ ask("Really delete #{c(name, color)}?", :default => false)
45
+ end
41
46
  end
42
47
  end
@@ -6,9 +6,9 @@ module VMC::Service
6
6
  class Bind < Base
7
7
  desc "Bind a service to an application"
8
8
  group :services, :manage
9
- input :service, :desc => "Service to bind", :argument => true,
9
+ input :service, :desc => "Service to bind", :argument => :optional,
10
10
  :from_given => by_name(:service_instance, "service")
11
- input :app, :desc => "Application to bind to", :argument => true,
11
+ input :app, :desc => "Application to bind to", :argument => :optional,
12
12
  :from_given => by_name(:app)
13
13
  def bind_service
14
14
  app = input[:app]
@@ -1,62 +1,41 @@
1
- require "vmc/detect"
2
-
3
1
  require "vmc/cli/service/base"
4
2
 
5
3
  module VMC::Service
6
4
  class Create < Base
7
- services_from_label = proc { |label, services|
8
- services.select { |s| s.label == label }
5
+ offerings_from_label = proc { |label, offerings|
6
+ offerings.select { |s| s.label == label }
9
7
  }
10
8
 
11
9
  desc "Create a service"
12
10
  group :services, :manage
13
- input(:service, :argument => true,
14
- :desc => "What kind of service (e.g. redis, mysql)",
15
- :from_given => services_from_label) { |services|
16
- [ask("What kind?", :choices => services.sort_by(&:label),
17
- :display => proc { |s|
18
- str = "#{c(s.label, :name)} #{s.version}"
19
- if s.provider != "core"
20
- str << ", via #{s.provider}"
21
- end
22
- str
23
- },
24
- :complete => proc { |s| "#{s.label} #{s.version}" })]
25
- }
26
- input(:name, :argument => true,
27
- :desc => "Name for your instance") { |service|
28
- random = sprintf("%x", rand(1000000))
29
- ask "Name?", :default => "#{service.label}-#{random}"
30
- }
31
- input(:plan, :desc => "Service plan",
11
+ input :offering, :desc => "What kind of service (e.g. redis, mysql)",
12
+ :argument => :optional, :from_given => offerings_from_label
13
+ input :name, :desc => "Name for your service", :argument => :optional
14
+ input :plan, :desc => "Service plan",
15
+ :from_given => find_by_name_insensitive("plan"),
32
16
  :default => proc { |plans|
33
17
  plans.find { |p| p.name == "D100" } ||
34
18
  interact
35
- },
36
- :from_given => find_by_name_insensitive("plan")) { |plans|
37
- ask "Which plan?", :choices => plans.sort_by(&:name),
38
- :display => proc { |p| "#{p.name}: #{p.description}" },
39
- :complete => proc(&:name)
40
- }
19
+ }
41
20
  input :provider, :desc => "Service provider"
42
21
  input :version, :desc => "Service version"
43
- input :app, :alias => "--bind", :from_given => by_name("app"),
44
- :desc => "Application to immediately bind to"
22
+ input :app, :desc => "Application to immediately bind to",
23
+ :alias => "--bind", :from_given => by_name(:app)
45
24
  def create_service
46
- services = client.services
25
+ offerings = client.services
47
26
 
48
27
  if input[:provider]
49
- services.reject! { |s| s.provider != input[:provider] }
28
+ offerings.reject! { |s| s.provider != input[:provider] }
50
29
  end
51
30
 
52
31
  if input[:version]
53
- services.reject! { |s| s.version != input[:version] }
32
+ offerings.reject! { |s| s.version != input[:version] }
54
33
  elsif !v2?
55
- services.reject!(&:deprecated?)
34
+ offerings.reject!(&:deprecated?)
56
35
  end
57
36
 
58
37
  if v2? && plan = input.given(:plan)
59
- services.reject! do |s|
38
+ offerings.reject! do |s|
60
39
  if plan.is_a?(String)
61
40
  s.service_plans.none? { |p| p.name == plan.upcase }
62
41
  else
@@ -65,40 +44,65 @@ module VMC::Service
65
44
  end
66
45
  end
67
46
 
68
- until services.size < 2
47
+ until offerings.size < 2
69
48
  # cast to Array since it might be given as a Service with #invoke
70
- services = Array(input[:service, services.sort_by(&:label)])
71
- input.forget(:service)
49
+ offerings = Array(input[:offering, offerings.sort_by(&:label)])
50
+ input.forget(:offering)
72
51
  end
73
52
 
74
- if services.empty?
53
+ if offerings.empty?
75
54
  fail "Cannot find services matching the given criteria."
76
55
  end
77
56
 
78
- service = services.first
57
+ offering = offerings.first
79
58
 
80
- instance = client.service_instance
81
- instance.name = input[:name, service]
59
+ service = client.service_instance
60
+ service.name = input[:name, offering]
82
61
 
83
62
  if v2?
84
- instance.service_plan = input[:plan, service.service_plans]
85
- instance.space = client.current_space
63
+ service.service_plan = input[:plan, offering.service_plans]
64
+ service.space = client.current_space
86
65
  else
87
- instance.type = service.type
88
- instance.vendor = service.label
89
- instance.version = service.version
90
- instance.tier = "free"
66
+ service.type = offering.type
67
+ service.vendor = offering.label
68
+ service.version = offering.version
69
+ service.tier = "free"
91
70
  end
92
71
 
93
- with_progress("Creating service #{c(instance.name, :name)}") do
94
- instance.create!
72
+ with_progress("Creating service #{c(service.name, :name)}") do
73
+ service.create!
95
74
  end
96
75
 
97
76
  if app = input[:app]
98
- invoke :bind_service, :instance => instance, :app => app
77
+ invoke :bind_service, :service => service, :app => app
99
78
  end
100
79
 
101
- instance
80
+ service
81
+ end
82
+
83
+ private
84
+
85
+ def ask_offering(offerings)
86
+ [ask("What kind?", :choices => offerings.sort_by(&:label),
87
+ :display => proc { |s|
88
+ str = "#{c(s.label, :name)} #{s.version}"
89
+ if s.provider != "core"
90
+ str << ", via #{s.provider}"
91
+ end
92
+ str
93
+ },
94
+ :complete => proc { |s| "#{s.label} #{s.version}" })]
95
+ end
96
+
97
+ def ask_name(offering)
98
+ random = sprintf("%x", rand(1000000))
99
+ ask "Name?", :default => "#{offering.label}-#{random}"
100
+ end
101
+
102
+ def ask_plan(plans)
103
+ ask "Which plan?", :choices => plans.sort_by(&:name),
104
+ :display => proc { |p| "#{p.name}: #{p.description}" },
105
+ :complete => proc(&:name)
102
106
  end
103
107
  end
104
108
  end
@@ -1,68 +1,52 @@
1
- require "vmc/detect"
2
-
3
1
  require "vmc/cli/service/base"
4
2
 
5
3
  module VMC::Service
6
4
  class Delete < Base
7
5
  desc "Delete a service"
8
6
  group :services, :manage
9
- input(:instance, :argument => true,
10
- :from_given => by_name("service instance", :service_instance),
11
- :desc => "Service to bind") {
12
- instances = client.service_instances
13
- fail "No services." if instances.empty?
14
-
15
- ask "Which service instance?", :choices => instances,
16
- :display => proc(&:name)
17
- }
18
- input(:really, :type => :boolean, :forget => true,
19
- :default => proc { force? || interact }) { |name, color|
20
- ask("Really delete #{c(name, color)}?", :default => false)
21
- }
22
- input(:unbind, :type => :boolean, :forget => true,
23
- :default => proc { force? || interact }) { |apps|
24
- names = human_list(apps.collect { |a| c(a.name, :name) })
25
-
26
- ask("Unbind from #{names} before deleting?", :default => true)
27
- }
28
- input :all, :type => :boolean, :default => false,
29
- :desc => "Delete all services"
7
+ input :service, :desc => "Service to bind", :argument => :optional,
8
+ :from_given => by_name(:service_instance, :service)
9
+ input :unbind, :desc => "Unbind from applications before deleting?",
10
+ :type => :boolean, :default => proc { force? || interact }
11
+ input :all, :desc => "Delete all services", :default => false
12
+ input :really, :type => :boolean, :forget => true, :hidden => true,
13
+ :default => proc { force? || interact }
30
14
  def delete_service
31
15
  if input[:all]
32
16
  return unless input[:really, "ALL SERVICES", :bad]
33
17
 
34
18
  client.service_instances.each do |i|
35
- invoke :delete_service, :instance => i, :really => true
19
+ invoke :delete_service, :service => i, :really => true
36
20
  end
37
21
 
38
22
  return
39
23
  end
40
24
 
41
- instance = input[:instance]
25
+ service = input[:service]
42
26
 
43
- return unless input[:really, instance.name, :name]
27
+ return unless input[:really, service.name, :name]
44
28
 
45
29
  bindings = []
46
30
 
47
31
  if v2?
48
- bindings = instance.service_bindings
32
+ bindings = service.service_bindings
49
33
 
50
34
  unless bindings.empty? || !input[:unbind, bindings.collect(&:app)]
51
35
  bindings.each do |b|
52
- invoke :unbind_service, :instance => instance, :app => b.app
36
+ invoke :unbind_service, :service => service, :app => b.app
53
37
  end
54
38
 
55
39
  bindings = []
56
40
  end
57
41
  end
58
42
 
59
- with_progress("Deleting #{c(instance.name, :name)}") do |s|
43
+ with_progress("Deleting #{c(service.name, :name)}") do |s|
60
44
  if bindings.empty?
61
- instance.delete!
45
+ service.delete!
62
46
  else
63
47
  s.skip do
64
48
  apps = bindings.collect(&:app).collect { |a| b(a.name) }
65
- err "Service instance is bound to #{human_list(apps)}."
49
+ err "Service is bound to #{human_list(apps)}."
66
50
  end
67
51
  end
68
52
  end
@@ -70,6 +54,24 @@ module VMC::Service
70
54
 
71
55
  private
72
56
 
57
+ def ask_service
58
+ services = client.service_instances
59
+ fail "No services." if services.empty?
60
+
61
+ ask "Which service?", :choices => services,
62
+ :display => proc(&:name)
63
+ end
64
+
65
+ def ask_unbind(apps)
66
+ names = human_list(apps.collect { |a| c(a.name, :name) })
67
+
68
+ ask("Unbind from #{names} before deleting?", :default => true)
69
+ end
70
+
71
+ def ask_really(name, color)
72
+ ask("Really delete #{c(name, color)}?", :default => false)
73
+ end
74
+
73
75
  def human_list(xs)
74
76
  if xs.size == 1
75
77
  xs.first
@@ -1,23 +1,12 @@
1
- require "vmc/detect"
2
-
3
1
  require "vmc/cli/service/base"
4
2
 
5
3
  module VMC::Service
6
4
  class Rename < Base
7
5
  desc "Rename a service"
8
6
  group :services, :manage, :hidden => true
9
- input(:service, :aliases => ["--org", "-o"],
10
- :argument => :optional, :desc => "service to rename",
11
- :from_given => by_name("service", :service_instance)) {
12
- services = client.service_instances
13
- fail "No services." if services.empty?
14
-
15
- ask("Rename which service?", :choices => services.sort_by(&:name),
16
- :display => proc(&:name))
17
- }
18
- input(:name, :argument => :optional, :desc => "New service name") {
19
- ask("New name")
20
- }
7
+ input :service, :desc => "Service to rename", :argument => :optional,
8
+ :from_given => by_name(:service_instance, :service)
9
+ input :name, :desc => "New service name", :argument => :optional
21
10
  def rename_service
22
11
  service = input[:service]
23
12
  name = input[:name]
@@ -28,5 +17,19 @@ module VMC::Service
28
17
  service.update!
29
18
  end
30
19
  end
20
+
21
+ private
22
+
23
+ def ask_service
24
+ services = client.service_instances
25
+ fail "No services." if services.empty?
26
+
27
+ ask("Rename which service?", :choices => services.sort_by(&:name),
28
+ :display => proc(&:name))
29
+ end
30
+
31
+ def ask_name
32
+ ask("New name")
33
+ end
31
34
  end
32
35
  end
@@ -1,21 +1,18 @@
1
- require "vmc/detect"
2
-
3
1
  require "vmc/cli/service/base"
4
2
 
5
3
  module VMC::Service
6
4
  class Service < Base
7
- desc "Show service instance information"
5
+ desc "Show service information"
8
6
  group :services
9
- input :instance, :argument => :required,
10
- :from_given => by_name("service instance", :service_instance),
11
- :desc => "Service instance to show"
7
+ input :service, :desc => "Service to show", :argument => :required,
8
+ :from_given => by_name(:service_instance, :service)
12
9
  def service
13
- display_service_instance(input[:instance])
10
+ display_service(input[:service])
14
11
  end
15
12
 
16
13
  private
17
14
 
18
- def display_service_instance(i)
15
+ def display_service(i)
19
16
  if quiet?
20
17
  line i.name
21
18
  elsif v2?