cloulu 0.0.0 → 0.1.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.
- data/bin/{cloulu → cl} +0 -0
- data/lib/cc_api_stub/applications.rb +53 -0
- data/lib/cc_api_stub/domains.rb +16 -0
- data/lib/cc_api_stub/frameworks.rb +22 -0
- data/lib/cc_api_stub/helper.rb +131 -0
- data/lib/cc_api_stub/login.rb +21 -0
- data/lib/cc_api_stub/organization_users.rb +21 -0
- data/lib/cc_api_stub/organizations.rb +70 -0
- data/lib/cc_api_stub/routes.rb +26 -0
- data/lib/cc_api_stub/runtimes.rb +22 -0
- data/lib/cc_api_stub/service_bindings.rb +22 -0
- data/lib/cc_api_stub/service_instances.rb +22 -0
- data/lib/cc_api_stub/services.rb +25 -0
- data/lib/cc_api_stub/spaces.rb +49 -0
- data/lib/cc_api_stub/users.rb +84 -0
- data/lib/cc_api_stub.rb +17 -0
- data/lib/cfoundry/auth_token.rb +63 -0
- data/lib/cfoundry/baseclient.rb +201 -0
- data/lib/cfoundry/chatty_hash.rb +46 -0
- data/lib/cfoundry/client.rb +46 -0
- data/lib/cfoundry/concerns/login_helpers.rb +13 -0
- data/lib/cfoundry/errors.rb +160 -0
- data/lib/cfoundry/rest_client.rb +299 -0
- data/lib/cfoundry/test_support.rb +3 -0
- data/lib/cfoundry/trace_helpers.rb +40 -0
- data/lib/cfoundry/uaaclient.rb +112 -0
- data/lib/cfoundry/upload_helpers.rb +187 -0
- data/lib/cfoundry/v1/app.rb +363 -0
- data/lib/cfoundry/v1/base.rb +72 -0
- data/lib/cfoundry/v1/client.rb +193 -0
- data/lib/cfoundry/v1/framework.rb +21 -0
- data/lib/cfoundry/v1/model.rb +178 -0
- data/lib/cfoundry/v1/model_magic.rb +129 -0
- data/lib/cfoundry/v1/runtime.rb +24 -0
- data/lib/cfoundry/v1/service.rb +39 -0
- data/lib/cfoundry/v1/service_instance.rb +32 -0
- data/lib/cfoundry/v1/service_plan.rb +19 -0
- data/lib/cfoundry/v1/user.rb +22 -0
- data/lib/cfoundry/v2/app.rb +392 -0
- data/lib/cfoundry/v2/base.rb +83 -0
- data/lib/cfoundry/v2/client.rb +138 -0
- data/lib/cfoundry/v2/domain.rb +11 -0
- data/lib/cfoundry/v2/framework.rb +14 -0
- data/lib/cfoundry/v2/model.rb +148 -0
- data/lib/cfoundry/v2/model_magic.rb +449 -0
- data/lib/cfoundry/v2/organization.rb +16 -0
- data/lib/cfoundry/v2/route.rb +15 -0
- data/lib/cfoundry/v2/runtime.rb +12 -0
- data/lib/cfoundry/v2/service.rb +19 -0
- data/lib/cfoundry/v2/service_auth_token.rb +9 -0
- data/lib/cfoundry/v2/service_binding.rb +10 -0
- data/lib/cfoundry/v2/service_instance.rb +14 -0
- data/lib/cfoundry/v2/service_plan.rb +12 -0
- data/lib/cfoundry/v2/space.rb +18 -0
- data/lib/cfoundry/v2/user.rb +64 -0
- data/lib/cfoundry/validator.rb +39 -0
- data/lib/cfoundry/version.rb +4 -0
- data/lib/cfoundry/zip.rb +56 -0
- data/lib/cfoundry.rb +2 -0
- data/lib/manifests-vmc-plugin/errors.rb +21 -0
- data/lib/manifests-vmc-plugin/loader/builder.rb +34 -0
- data/lib/manifests-vmc-plugin/loader/normalizer.rb +149 -0
- data/lib/manifests-vmc-plugin/loader/resolver.rb +79 -0
- data/lib/manifests-vmc-plugin/loader.rb +31 -0
- data/lib/manifests-vmc-plugin/plugin.rb +145 -0
- data/lib/manifests-vmc-plugin/version.rb +3 -0
- data/lib/manifests-vmc-plugin.rb +313 -0
- data/lib/mothership/base.rb +99 -0
- data/lib/mothership/callbacks.rb +85 -0
- data/lib/mothership/command.rb +146 -0
- data/lib/mothership/errors.rb +38 -0
- data/lib/mothership/help/commands.rb +53 -0
- data/lib/mothership/help/printer.rb +170 -0
- data/lib/mothership/help.rb +64 -0
- data/lib/mothership/inputs.rb +189 -0
- data/lib/mothership/parser.rb +182 -0
- data/lib/mothership/version.rb +3 -0
- data/lib/mothership.rb +64 -0
- data/lib/tunnel-vmc-plugin/plugin.rb +178 -0
- data/lib/tunnel-vmc-plugin/tunnel.rb +308 -0
- data/lib/tunnel-vmc-plugin/version.rb +3 -0
- data/lib/uaa/http.rb +168 -0
- data/lib/uaa/misc.rb +121 -0
- data/lib/uaa/scim.rb +292 -0
- data/lib/uaa/token_coder.rb +196 -0
- data/lib/uaa/token_issuer.rb +255 -0
- data/lib/uaa/util.rb +235 -0
- data/lib/uaa/version.rb +19 -0
- data/lib/uaa.rb +18 -0
- data/lib/vmc/cli/app/app.rb +45 -0
- data/lib/vmc/cli/app/apps.rb +99 -0
- data/lib/vmc/cli/app/base.rb +90 -0
- data/lib/vmc/cli/app/crashes.rb +42 -0
- data/lib/vmc/cli/app/delete.rb +95 -0
- data/lib/vmc/cli/app/deprecated.rb +11 -0
- data/lib/vmc/cli/app/env.rb +78 -0
- data/lib/vmc/cli/app/files.rb +137 -0
- data/lib/vmc/cli/app/health.rb +26 -0
- data/lib/vmc/cli/app/instances.rb +53 -0
- data/lib/vmc/cli/app/logs.rb +76 -0
- data/lib/vmc/cli/app/push/create.rb +165 -0
- data/lib/vmc/cli/app/push/interactions.rb +94 -0
- data/lib/vmc/cli/app/push/sync.rb +64 -0
- data/lib/vmc/cli/app/push.rb +109 -0
- data/lib/vmc/cli/app/rename.rb +35 -0
- data/lib/vmc/cli/app/restart.rb +20 -0
- data/lib/vmc/cli/app/scale.rb +71 -0
- data/lib/vmc/cli/app/start.rb +143 -0
- data/lib/vmc/cli/app/stats.rb +67 -0
- data/lib/vmc/cli/app/stop.rb +27 -0
- data/lib/vmc/cli/help.rb +11 -0
- data/lib/vmc/cli/interactive.rb +105 -0
- data/lib/vmc/cli/route/base.rb +12 -0
- data/lib/vmc/cli/route/map.rb +82 -0
- data/lib/vmc/cli/route/routes.rb +25 -0
- data/lib/vmc/cli/route/unmap.rb +94 -0
- data/lib/vmc/cli/service/base.rb +8 -0
- data/lib/vmc/cli/service/bind.rb +44 -0
- data/lib/vmc/cli/service/create.rb +126 -0
- data/lib/vmc/cli/service/delete.rb +86 -0
- data/lib/vmc/cli/service/rename.rb +35 -0
- data/lib/vmc/cli/service/service.rb +42 -0
- data/lib/vmc/cli/service/services.rb +114 -0
- data/lib/vmc/cli/service/unbind.rb +38 -0
- data/lib/vmc/cli/start/base.rb +94 -0
- data/lib/vmc/cli/start/colors.rb +13 -0
- data/lib/vmc/cli/start/info.rb +126 -0
- data/lib/vmc/cli/start/login.rb +97 -0
- data/lib/vmc/cli/start/logout.rb +17 -0
- data/lib/vmc/cli/start/target.rb +60 -0
- data/lib/vmc/cli/start/target_interactions.rb +37 -0
- data/lib/vmc/cli/start/targets.rb +16 -0
- data/lib/vmc/cli/user/base.rb +29 -0
- data/lib/vmc/cli/user/create.rb +39 -0
- data/lib/vmc/cli/user/delete.rb +27 -0
- data/lib/vmc/cli/user/passwd.rb +50 -0
- data/lib/vmc/cli/user/register.rb +42 -0
- data/lib/vmc/cli/user/users.rb +32 -0
- data/lib/vmc/cli/v2_check_cli.rb +16 -0
- data/lib/vmc/cli.rb +474 -0
- data/lib/vmc/constants.rb +13 -0
- data/lib/vmc/detect.rb +129 -0
- data/lib/vmc/errors.rb +19 -0
- data/lib/vmc/plugin.rb +56 -0
- data/lib/vmc/spacing.rb +89 -0
- data/lib/vmc/spec_helper.rb +1 -0
- data/lib/vmc/test_support.rb +6 -0
- data/lib/vmc/version.rb +3 -0
- data/lib/vmc.rb +8 -0
- data/vendor/errors/v1.yml +189 -0
- data/vendor/errors/v2.yml +360 -0
- metadata +303 -190
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
require "vmc/cli/service/base"
|
|
2
|
+
|
|
3
|
+
module VMC::Service
|
|
4
|
+
class Create < Base
|
|
5
|
+
offerings_from_label = proc { |label, offerings|
|
|
6
|
+
offerings.select { |s| s.label == label }
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
desc "Create a service"
|
|
10
|
+
group :services, :manage
|
|
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"),
|
|
16
|
+
:default => proc { |plans|
|
|
17
|
+
plans.find { |p| p.name == "D100" } ||
|
|
18
|
+
interact
|
|
19
|
+
}
|
|
20
|
+
input :provider, :desc => "Service provider"
|
|
21
|
+
input :version, :desc => "Service version"
|
|
22
|
+
input :app, :desc => "Application to immediately bind to",
|
|
23
|
+
:alias => "--bind", :from_given => by_name(:app)
|
|
24
|
+
def create_service
|
|
25
|
+
offerings = client.services
|
|
26
|
+
|
|
27
|
+
if input[:provider]
|
|
28
|
+
offerings.reject! { |s| s.provider != input[:provider] }
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
if input[:version]
|
|
32
|
+
offerings.reject! { |s| s.version != input[:version] }
|
|
33
|
+
elsif !v2?
|
|
34
|
+
offerings.reject!(&:deprecated?)
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
# filter the offerings based on a given plan value, which will be a
|
|
38
|
+
# string if the user provided it with a flag, or a ServicePlan if
|
|
39
|
+
# something invoked this command with a particular plan
|
|
40
|
+
if v2? && plan = input.direct(:plan)
|
|
41
|
+
offerings.reject! do |s|
|
|
42
|
+
if plan.is_a?(String)
|
|
43
|
+
s.service_plans.none? { |p| p.name == plan.upcase }
|
|
44
|
+
else
|
|
45
|
+
s.service_plans.include? plan
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
until offerings.size < 2
|
|
51
|
+
# cast to Array since it might be given as a Service with #invoke
|
|
52
|
+
offerings = Array(input[:offering, offerings.sort_by(&:label)])
|
|
53
|
+
input.forget(:offering)
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
if offerings.empty?
|
|
57
|
+
fail "Cannot find services matching the given criteria."
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
offering = offerings.first
|
|
61
|
+
|
|
62
|
+
service = client.service_instance
|
|
63
|
+
service.name = input[:name, offering]
|
|
64
|
+
|
|
65
|
+
if v2?
|
|
66
|
+
service.service_plan = input[:plan, offering.service_plans]
|
|
67
|
+
service.space = client.current_space
|
|
68
|
+
else
|
|
69
|
+
service.type = offering.type
|
|
70
|
+
service.vendor = offering.label
|
|
71
|
+
service.version = offering.version
|
|
72
|
+
service.tier = v1_service_tier(offering)
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
with_progress("Creating service #{c(service.name, :name)}") do
|
|
76
|
+
service.create!
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
if app = input[:app]
|
|
80
|
+
invoke :bind_service, :service => service, :app => app
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
service
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
private
|
|
87
|
+
|
|
88
|
+
def ask_offering(offerings)
|
|
89
|
+
[ask("What kind?", :choices => offerings.sort_by(&:label),
|
|
90
|
+
:display => proc { |s|
|
|
91
|
+
str = "#{c(s.label, :name)} #{s.version}"
|
|
92
|
+
if s.provider != "core"
|
|
93
|
+
str << ", via #{s.provider}"
|
|
94
|
+
end
|
|
95
|
+
str
|
|
96
|
+
},
|
|
97
|
+
:complete => proc { |s| "#{s.label} #{s.version}" })]
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
def ask_name(offering)
|
|
101
|
+
random = sprintf("%x", rand(1000000))
|
|
102
|
+
ask "Name?", :default => "#{offering.label}-#{random}"
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
def ask_plan(plans, default_plan = nil)
|
|
106
|
+
ask "Which plan?",
|
|
107
|
+
:choices => plans.sort_by(&:name),
|
|
108
|
+
:indexed => true,
|
|
109
|
+
:display => proc { |p| "#{p.name}: #{p.description || 'No description'}" },
|
|
110
|
+
:default => default_plan,
|
|
111
|
+
:complete => proc(&:name)
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
def v1_service_tier(service)
|
|
115
|
+
plans = service.service_plans
|
|
116
|
+
fail "No service plans" if plans.empty?
|
|
117
|
+
if plans.length == 1
|
|
118
|
+
plan = plans[0]
|
|
119
|
+
else
|
|
120
|
+
plan = ask_plan(plans, service.default_service_plan)
|
|
121
|
+
end
|
|
122
|
+
plan.name
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
end
|
|
126
|
+
end
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
require "vmc/cli/service/base"
|
|
2
|
+
|
|
3
|
+
module VMC::Service
|
|
4
|
+
class Delete < Base
|
|
5
|
+
desc "Delete a service"
|
|
6
|
+
group :services, :manage
|
|
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 }
|
|
14
|
+
def delete_service
|
|
15
|
+
if input[:all]
|
|
16
|
+
return unless input[:really, "ALL SERVICES", :bad]
|
|
17
|
+
|
|
18
|
+
client.service_instances.each do |i|
|
|
19
|
+
invoke :delete_service, :service => i, :really => true
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
return
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
service = input[:service]
|
|
26
|
+
|
|
27
|
+
return unless input[:really, service.name, :name]
|
|
28
|
+
|
|
29
|
+
bindings = []
|
|
30
|
+
|
|
31
|
+
if v2?
|
|
32
|
+
bindings = service.service_bindings
|
|
33
|
+
|
|
34
|
+
unless bindings.empty? || !input[:unbind, bindings.collect(&:app)]
|
|
35
|
+
bindings.each do |b|
|
|
36
|
+
invoke :unbind_service, :service => service, :app => b.app
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
bindings = []
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
with_progress("Deleting #{c(service.name, :name)}") do |s|
|
|
44
|
+
if bindings.empty?
|
|
45
|
+
service.delete!
|
|
46
|
+
else
|
|
47
|
+
s.skip do
|
|
48
|
+
apps = bindings.collect(&:app).collect { |a| b(a.name) }
|
|
49
|
+
err "Service is bound to #{human_list(apps)}."
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
private
|
|
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
|
+
|
|
75
|
+
def human_list(xs)
|
|
76
|
+
if xs.size == 1
|
|
77
|
+
xs.first
|
|
78
|
+
elsif xs.size == 2
|
|
79
|
+
"#{xs.first} and #{xs.last}"
|
|
80
|
+
else
|
|
81
|
+
last = xs.pop
|
|
82
|
+
xs.join(", ") + ", and #{last}"
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
end
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
require "vmc/cli/service/base"
|
|
2
|
+
|
|
3
|
+
module VMC::Service
|
|
4
|
+
class Rename < Base
|
|
5
|
+
desc "Rename a service"
|
|
6
|
+
group :services, :manage, :hidden => true
|
|
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
|
|
10
|
+
def rename_service
|
|
11
|
+
service = input[:service]
|
|
12
|
+
name = input[:name]
|
|
13
|
+
|
|
14
|
+
service.name = name
|
|
15
|
+
|
|
16
|
+
with_progress("Renaming to #{c(name, :name)}") do
|
|
17
|
+
service.update!
|
|
18
|
+
end
|
|
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
|
|
34
|
+
end
|
|
35
|
+
end
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
require "vmc/cli/service/base"
|
|
2
|
+
|
|
3
|
+
module VMC::Service
|
|
4
|
+
class Service < Base
|
|
5
|
+
desc "Show service information"
|
|
6
|
+
group :services
|
|
7
|
+
input :service, :desc => "Service to show", :argument => :required,
|
|
8
|
+
:from_given => by_name(:service_instance, :service)
|
|
9
|
+
def service
|
|
10
|
+
display_service(input[:service])
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
private
|
|
14
|
+
|
|
15
|
+
def display_service(i)
|
|
16
|
+
if quiet?
|
|
17
|
+
line i.name
|
|
18
|
+
elsif v2?
|
|
19
|
+
plan = i.service_plan
|
|
20
|
+
service = plan.service
|
|
21
|
+
|
|
22
|
+
apps = i.service_bindings.collect { |b|
|
|
23
|
+
c(b.app.name, :name)
|
|
24
|
+
}.join(", ")
|
|
25
|
+
|
|
26
|
+
line "#{c(i.name, :name)}: #{service.label} #{service.version}"
|
|
27
|
+
|
|
28
|
+
indented do
|
|
29
|
+
line "provider: #{c(service.provider, :name)}"
|
|
30
|
+
line "bound to: #{apps}" unless apps.empty?
|
|
31
|
+
line "plan: #{c(plan.name, :name)}"
|
|
32
|
+
|
|
33
|
+
indented do
|
|
34
|
+
line "description: #{plan.description}"
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
else
|
|
38
|
+
line "#{c(i.name, :name)}: #{i.vendor} #{i.version}"
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
require "vmc/cli/service/base"
|
|
2
|
+
|
|
3
|
+
module VMC::Service
|
|
4
|
+
class Services < Base
|
|
5
|
+
desc "List your service"
|
|
6
|
+
group :services
|
|
7
|
+
input :space, :desc => "Show services in given space",
|
|
8
|
+
:from_given => by_name(:space),
|
|
9
|
+
:default => proc { client.current_space }
|
|
10
|
+
input :name, :desc => "Filter by name"
|
|
11
|
+
input :service, :desc => "Filter by service type"
|
|
12
|
+
input :plan, :desc => "Filter by service plan"
|
|
13
|
+
input :provider, :desc => "Filter by service provider"
|
|
14
|
+
input :version, :desc => "Filter by service version"
|
|
15
|
+
input :app, :desc => "Limit to application's service bindings",
|
|
16
|
+
:from_given => by_name(:app)
|
|
17
|
+
input :full, :desc => "Verbose output format", :default => false
|
|
18
|
+
def services
|
|
19
|
+
msg =
|
|
20
|
+
if space = input[:space]
|
|
21
|
+
"Getting services in #{c(space.name, :name)}"
|
|
22
|
+
else
|
|
23
|
+
"Getting services"
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
services =
|
|
27
|
+
with_progress(msg) do
|
|
28
|
+
client.service_instances(:depth => 2)
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
line unless quiet?
|
|
32
|
+
|
|
33
|
+
if services.empty? and !quiet?
|
|
34
|
+
line "No services."
|
|
35
|
+
return
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
services.reject! do |i|
|
|
39
|
+
!service_matches(i, input)
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
if input[:full]
|
|
43
|
+
spaced(services) do |s|
|
|
44
|
+
invoke :service, :service => s
|
|
45
|
+
end
|
|
46
|
+
else
|
|
47
|
+
table(
|
|
48
|
+
["name", "service", "version", v2? && "plan", v2? && "bound apps"],
|
|
49
|
+
services.collect { |i|
|
|
50
|
+
if v2?
|
|
51
|
+
plan = i.service_plan
|
|
52
|
+
service = plan.service
|
|
53
|
+
|
|
54
|
+
label = service.label
|
|
55
|
+
version = service.version
|
|
56
|
+
apps = name_list(i.service_bindings.collect(&:app))
|
|
57
|
+
else
|
|
58
|
+
label = i.vendor
|
|
59
|
+
version = i.version
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
[ c(i.name, :name),
|
|
63
|
+
label,
|
|
64
|
+
version,
|
|
65
|
+
v2? && plan.name,
|
|
66
|
+
apps
|
|
67
|
+
]
|
|
68
|
+
})
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
private
|
|
73
|
+
|
|
74
|
+
def service_matches(i, options)
|
|
75
|
+
if app = options[:app]
|
|
76
|
+
return false unless app.services.include? i
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
if name = options[:name]
|
|
80
|
+
return false unless File.fnmatch(name, i.name)
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
plan = i.service_plan if v2?
|
|
84
|
+
|
|
85
|
+
if service = options[:service]
|
|
86
|
+
if v2?
|
|
87
|
+
return false unless File.fnmatch(service, plan.service.label)
|
|
88
|
+
else
|
|
89
|
+
return false unless File.fnmatch(service, i.vendor)
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
if plan = options[:plan]
|
|
94
|
+
fail "--plan is not supported on this target" unless v2?
|
|
95
|
+
return false unless File.fnmatch(plan.upcase, plan.name.upcase)
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
if provider = options[:provider]
|
|
99
|
+
fail "--provider is not supported on this target" unless v2?
|
|
100
|
+
return false unless File.fnmatch(provider, plan.service.provider)
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
if version = options[:version]
|
|
104
|
+
if v2?
|
|
105
|
+
return false unless File.fnmatch(version, plan.service.version)
|
|
106
|
+
else
|
|
107
|
+
return false unless File.fnmatch(version, i.version)
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
true
|
|
112
|
+
end
|
|
113
|
+
end
|
|
114
|
+
end
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
require "vmc/detect"
|
|
2
|
+
|
|
3
|
+
require "vmc/cli/service/base"
|
|
4
|
+
|
|
5
|
+
module VMC::Service
|
|
6
|
+
class Unbind < Base
|
|
7
|
+
desc "Unbind a service from an application"
|
|
8
|
+
group :services, :manage
|
|
9
|
+
input :service, :desc => "Service to unbind", :argument => :optional,
|
|
10
|
+
:from_given => by_name(:service_instance, :service)
|
|
11
|
+
input :app, :desc => "Application to unbind from", :argument => :optional,
|
|
12
|
+
:from_given => by_name(:app)
|
|
13
|
+
def unbind_service
|
|
14
|
+
app = input[:app]
|
|
15
|
+
service = input[:service, app]
|
|
16
|
+
|
|
17
|
+
with_progress(
|
|
18
|
+
"Unbinding #{c(service.name, :name)} from #{c(app.name, :name)}") do
|
|
19
|
+
app.unbind(service)
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
private
|
|
24
|
+
|
|
25
|
+
def ask_service(app)
|
|
26
|
+
services = app.services
|
|
27
|
+
fail "No bound services." if services.empty?
|
|
28
|
+
|
|
29
|
+
ask "Which service?", :choices => services,
|
|
30
|
+
:display => proc(&:name)
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def ask_app
|
|
34
|
+
ask "Which application?", :choices => client.apps,
|
|
35
|
+
:display => proc(&:name)
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
require "vmc/cli/v2_check_cli"
|
|
2
|
+
|
|
3
|
+
module VMC
|
|
4
|
+
module Start
|
|
5
|
+
class Base < V2CheckCLI
|
|
6
|
+
# Make sure we only show the target once
|
|
7
|
+
@@displayed_target = false
|
|
8
|
+
|
|
9
|
+
def displayed_target?
|
|
10
|
+
@@displayed_target
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
# These commands don't require authentication.
|
|
14
|
+
def precondition
|
|
15
|
+
fail_on_v2
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
private
|
|
19
|
+
|
|
20
|
+
def show_context
|
|
21
|
+
return if quiet? || displayed_target?
|
|
22
|
+
|
|
23
|
+
display_target
|
|
24
|
+
|
|
25
|
+
line
|
|
26
|
+
|
|
27
|
+
@@displayed_target = true
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def display_target
|
|
31
|
+
if quiet?
|
|
32
|
+
line client.target
|
|
33
|
+
else
|
|
34
|
+
line "target: #{c(client.target, :name)}"
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def select_org(input, info)
|
|
39
|
+
if input.has?(:organization) || !org_valid?(info[:organization])
|
|
40
|
+
org = input[:organization]
|
|
41
|
+
if org
|
|
42
|
+
with_progress("Switching to organization #{c(org.name, :name)}") {}
|
|
43
|
+
client.current_organization = org
|
|
44
|
+
end
|
|
45
|
+
info[:organization] = org ? org.guid : nil
|
|
46
|
+
!!org
|
|
47
|
+
else
|
|
48
|
+
info[:organization] = nil
|
|
49
|
+
client.current_organization = nil
|
|
50
|
+
false
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def select_space(input, info, changed_org)
|
|
55
|
+
if input.has?(:space) || !space_valid?(info[:space])
|
|
56
|
+
line if changed_org && !quiet?
|
|
57
|
+
space = input[:space, client.current_organization]
|
|
58
|
+
if space
|
|
59
|
+
with_progress("Switching to space #{c(space.name, :name)}") {}
|
|
60
|
+
client.current_space = space
|
|
61
|
+
end
|
|
62
|
+
info[:space] = space ? space.guid : nil
|
|
63
|
+
else
|
|
64
|
+
info[:space] = nil
|
|
65
|
+
client.current_space = nil
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def select_org_and_space(input, info)
|
|
70
|
+
changed_org = select_org(input, info)
|
|
71
|
+
if client.current_organization
|
|
72
|
+
select_space(input, info, changed_org)
|
|
73
|
+
else
|
|
74
|
+
info[:space] = nil
|
|
75
|
+
client.current_space = nil
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
def org_valid?(guid, user = client.current_user)
|
|
80
|
+
return false unless guid
|
|
81
|
+
client.organization(guid).users.include? user
|
|
82
|
+
rescue CFoundry::APIError
|
|
83
|
+
false
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
def space_valid?(guid, user = client.current_user)
|
|
87
|
+
return false unless guid
|
|
88
|
+
client.space(guid).developers.include? user
|
|
89
|
+
rescue CFoundry::APIError
|
|
90
|
+
false
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
end
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
require "vmc/cli/start/base"
|
|
2
|
+
|
|
3
|
+
module VMC::Start
|
|
4
|
+
class Info < Base
|
|
5
|
+
def precondition
|
|
6
|
+
check_target
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
desc "Display information on the current target, user, etc."
|
|
10
|
+
group :start
|
|
11
|
+
input :runtimes, :desc => "List supported runtimes", :alias => "-r",
|
|
12
|
+
:default => false
|
|
13
|
+
input :frameworks, :desc => "List supported frameworks", :alias => "-f",
|
|
14
|
+
:default => false
|
|
15
|
+
input :services, :desc => "List supported services", :alias => "-s",
|
|
16
|
+
:default => false
|
|
17
|
+
input :all, :desc => "Show all information", :alias => "-a",
|
|
18
|
+
:default => false
|
|
19
|
+
def info
|
|
20
|
+
all = input[:all]
|
|
21
|
+
|
|
22
|
+
if all || input[:runtimes]
|
|
23
|
+
runtimes =
|
|
24
|
+
with_progress("Getting runtimes") do
|
|
25
|
+
client.runtimes
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
if all || input[:frameworks]
|
|
30
|
+
frameworks =
|
|
31
|
+
with_progress("Getting frameworks") do
|
|
32
|
+
client.frameworks
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
if all || input[:services]
|
|
37
|
+
services =
|
|
38
|
+
with_progress("Getting services") do
|
|
39
|
+
client.services
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
showing_any = runtimes || services || frameworks
|
|
44
|
+
|
|
45
|
+
unless !all && showing_any
|
|
46
|
+
info = client.info
|
|
47
|
+
|
|
48
|
+
line if showing_any
|
|
49
|
+
line "\x1B[1m\x1B[31m" + info[:description] + "\x1B[00m"
|
|
50
|
+
line
|
|
51
|
+
line "target: #{b(client.target)}"
|
|
52
|
+
|
|
53
|
+
indented do
|
|
54
|
+
line "version: #{info[:version]}"
|
|
55
|
+
line "support: #{info[:support]}"
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
if user = client.current_user
|
|
59
|
+
line
|
|
60
|
+
line "user: #{b(user.email || user.guid)}"
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
if runtimes
|
|
65
|
+
line unless quiet?
|
|
66
|
+
|
|
67
|
+
if runtimes.empty? && !quiet?
|
|
68
|
+
line "#{d("none")}"
|
|
69
|
+
elsif input[:quiet]
|
|
70
|
+
runtimes.each do |r|
|
|
71
|
+
line r.name
|
|
72
|
+
end
|
|
73
|
+
else
|
|
74
|
+
table(
|
|
75
|
+
%w{runtime description},
|
|
76
|
+
runtimes.sort_by(&:name).collect { |r|
|
|
77
|
+
[c(r.name, :name), r.description]
|
|
78
|
+
})
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
if frameworks
|
|
83
|
+
line unless quiet?
|
|
84
|
+
|
|
85
|
+
if frameworks.empty? && !quiet?
|
|
86
|
+
line "#{d("none")}"
|
|
87
|
+
elsif input[:quiet]
|
|
88
|
+
frameworks.each do |f|
|
|
89
|
+
line f.name
|
|
90
|
+
end
|
|
91
|
+
else
|
|
92
|
+
table(
|
|
93
|
+
%w{framework description},
|
|
94
|
+
frameworks.sort_by(&:name).collect { |f|
|
|
95
|
+
[c(f.name, :name), f.description]
|
|
96
|
+
})
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
if services
|
|
101
|
+
line unless quiet?
|
|
102
|
+
|
|
103
|
+
if services.empty? && !quiet?
|
|
104
|
+
line "#{d("none")}"
|
|
105
|
+
elsif input[:quiet]
|
|
106
|
+
services.each do |s|
|
|
107
|
+
line s.label
|
|
108
|
+
end
|
|
109
|
+
else
|
|
110
|
+
table(
|
|
111
|
+
["service", "version", "provider", v2? && "plans", "description"],
|
|
112
|
+
services.sort_by(&:label).collect { |s|
|
|
113
|
+
next if !v2? && s.deprecated?
|
|
114
|
+
|
|
115
|
+
[c(s.label, :name),
|
|
116
|
+
s.version,
|
|
117
|
+
s.provider,
|
|
118
|
+
v2? && s.service_plans.collect(&:name).join(", "),
|
|
119
|
+
s.description
|
|
120
|
+
]
|
|
121
|
+
})
|
|
122
|
+
end
|
|
123
|
+
end
|
|
124
|
+
end
|
|
125
|
+
end
|
|
126
|
+
end
|