jdc 0.2.1 → 0.2.2.pre
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/LICENSE +1277 -24
- data/Rakefile +13 -0
- data/bin/jdc +12 -2
- data/lib/admin/README.md +15 -0
- data/lib/admin/curl.rb +60 -0
- data/lib/admin/guid.rb +89 -0
- data/lib/admin/plugin.rb +6 -0
- data/lib/admin/service_auth_token.rb +94 -0
- data/lib/admin/service_broker/add.rb +47 -0
- data/lib/admin/service_broker/service_brokers.rb +24 -0
- data/lib/admin/set_quota.rb +44 -0
- data/lib/console/README.md +8 -0
- data/lib/console/console.rb +187 -0
- data/lib/console/plugin.rb +33 -0
- data/lib/jdc.rb +15 -2
- data/lib/jdc/cli.rb +556 -0
- data/lib/jdc/cli/app/app.rb +43 -0
- data/lib/jdc/cli/app/apps.rb +87 -0
- data/lib/jdc/cli/app/base.rb +72 -0
- data/lib/jdc/cli/app/delete.rb +95 -0
- data/lib/jdc/cli/app/deprecated.rb +11 -0
- data/lib/jdc/cli/app/env.rb +78 -0
- data/lib/jdc/cli/app/events.rb +45 -0
- data/lib/jdc/cli/app/files.rb +137 -0
- data/lib/jdc/cli/app/health.rb +26 -0
- data/lib/jdc/cli/app/instances.rb +53 -0
- data/lib/jdc/cli/app/logs.rb +76 -0
- data/lib/jdc/cli/app/push.rb +103 -0
- data/lib/jdc/cli/app/push/create.rb +108 -0
- data/lib/jdc/cli/app/push/interactions.rb +86 -0
- data/lib/jdc/cli/app/push/sync.rb +57 -0
- data/lib/jdc/cli/app/rename.rb +35 -0
- data/lib/jdc/cli/app/restart.rb +31 -0
- data/lib/jdc/cli/app/scale.rb +63 -0
- data/lib/jdc/cli/app/start.rb +161 -0
- data/lib/jdc/cli/app/stats.rb +67 -0
- data/lib/jdc/cli/app/stop.rb +27 -0
- data/lib/jdc/cli/domain/base.rb +9 -0
- data/lib/jdc/cli/domain/domains.rb +40 -0
- data/lib/jdc/cli/domain/map.rb +55 -0
- data/lib/jdc/cli/domain/unmap.rb +56 -0
- data/lib/jdc/cli/help.rb +15 -0
- data/lib/jdc/cli/interactive.rb +105 -0
- data/lib/jdc/cli/login_requirements.rb +15 -0
- data/lib/jdc/cli/organization/base.rb +14 -0
- data/lib/jdc/cli/organization/create.rb +37 -0
- data/lib/jdc/cli/organization/delete.rb +63 -0
- data/lib/jdc/cli/organization/org.rb +45 -0
- data/lib/jdc/cli/organization/orgs.rb +30 -0
- data/lib/jdc/cli/organization/rename.rb +37 -0
- data/lib/jdc/cli/populators/base.rb +16 -0
- data/lib/jdc/cli/populators/organization.rb +32 -0
- data/lib/jdc/cli/populators/populator_methods.rb +64 -0
- data/lib/jdc/cli/populators/space.rb +33 -0
- data/lib/jdc/cli/populators/target.rb +13 -0
- data/lib/jdc/cli/route/base.rb +9 -0
- data/lib/jdc/cli/route/delete.rb +28 -0
- data/lib/jdc/cli/route/map.rb +68 -0
- data/lib/jdc/cli/route/routes.rb +26 -0
- data/lib/jdc/cli/route/unmap.rb +56 -0
- data/lib/jdc/cli/service/base.rb +9 -0
- data/lib/jdc/cli/service/bind.rb +44 -0
- data/lib/jdc/cli/service/create.rb +159 -0
- data/lib/jdc/cli/service/delete.rb +83 -0
- data/lib/jdc/cli/service/rename.rb +36 -0
- data/lib/jdc/cli/service/service.rb +42 -0
- data/lib/jdc/cli/service/service_instance_helper.rb +99 -0
- data/lib/jdc/cli/service/services.rb +111 -0
- data/lib/jdc/cli/service/unbind.rb +37 -0
- data/lib/jdc/cli/space/base.rb +29 -0
- data/lib/jdc/cli/space/create.rb +67 -0
- data/lib/jdc/cli/space/delete.rb +56 -0
- data/lib/jdc/cli/space/rename.rb +38 -0
- data/lib/jdc/cli/space/space.rb +66 -0
- data/lib/jdc/cli/space/spaces.rb +57 -0
- data/lib/jdc/cli/space/switch.rb +19 -0
- data/lib/jdc/cli/start/base.rb +41 -0
- data/lib/jdc/cli/start/colors.rb +13 -0
- data/lib/jdc/cli/start/target.rb +50 -0
- data/lib/jdc/cli/start/target_prettifier.rb +17 -0
- data/lib/jdc/cli/start/targets.rb +16 -0
- data/lib/jdc/cli/user/base.rb +30 -0
- data/lib/jdc/cli/user/create.rb +52 -0
- data/lib/jdc/cli/user/passwd.rb +37 -0
- data/lib/jdc/cli/user/register.rb +43 -0
- data/lib/jdc/cli/user/users.rb +32 -0
- data/lib/jdc/constants.rb +11 -0
- data/lib/jdc/errors.rb +19 -0
- data/lib/jdc/object_extensions.rb +15 -0
- data/lib/jdc/plugin.rb +56 -0
- data/lib/jdc/spacing.rb +89 -0
- data/lib/jdc/spec_helper.rb +1 -0
- data/lib/jdc/test_support.rb +6 -0
- data/lib/jdc/version.rb +3 -0
- data/lib/manifests/errors.rb +35 -0
- data/lib/manifests/loader.rb +31 -0
- data/lib/manifests/loader/builder.rb +39 -0
- data/lib/manifests/loader/normalizer.rb +145 -0
- data/lib/manifests/loader/resolver.rb +79 -0
- data/lib/manifests/manifests.rb +344 -0
- data/lib/manifests/plugin.rb +140 -0
- data/lib/micro/README.md +9 -0
- data/lib/micro/errors.rb +4 -0
- data/lib/{jdc → micro}/micro.rb +15 -15
- data/lib/micro/plugin.rb +197 -0
- data/lib/micro/switcher/base.rb +79 -0
- data/lib/{jdc/micro → micro}/switcher/darwin.rb +5 -3
- data/lib/{jdc/micro → micro}/switcher/dummy.rb +1 -1
- data/lib/micro/switcher/linux.rb +16 -0
- data/lib/{jdc/micro → micro}/switcher/windows.rb +5 -5
- data/lib/{jdc/micro → micro}/vmrun.rb +26 -19
- data/lib/tasks/gem_release.rake +42 -0
- data/lib/tunnel/README.md +29 -0
- data/{config → lib/tunnel/config}/clients.yml +2 -2
- data/lib/tunnel/helper-app/Gemfile +10 -0
- data/lib/tunnel/helper-app/Gemfile.lock +48 -0
- data/{caldecott_helper → lib/tunnel/helper-app}/server.rb +5 -5
- data/lib/tunnel/plugin.rb +183 -0
- data/lib/tunnel/tunnel.rb +295 -0
- metadata +371 -210
- data/README.md +0 -102
- data/config/micro/paths.yml +0 -22
- data/config/micro/refresh_ip.rb +0 -20
- data/lib/cli.rb +0 -53
- data/lib/cli/commands/admin.rb +0 -58
- data/lib/cli/commands/apps.rb +0 -1129
- data/lib/cli/commands/base.rb +0 -228
- data/lib/cli/commands/manifest.rb +0 -56
- data/lib/cli/commands/micro.rb +0 -115
- data/lib/cli/commands/misc.rb +0 -126
- data/lib/cli/commands/services.rb +0 -178
- data/lib/cli/commands/user.rb +0 -14
- data/lib/cli/config.rb +0 -173
- data/lib/cli/console_helper.rb +0 -170
- data/lib/cli/core_ext.rb +0 -122
- data/lib/cli/errors.rb +0 -19
- data/lib/cli/frameworks.rb +0 -265
- data/lib/cli/manifest_helper.rb +0 -300
- data/lib/cli/runner.rb +0 -505
- data/lib/cli/services_helper.rb +0 -84
- data/lib/cli/tunnel_helper.rb +0 -332
- data/lib/cli/usage.rb +0 -86
- data/lib/cli/version.rb +0 -7
- data/lib/cli/zip_util.rb +0 -77
- data/lib/jdc/client.rb +0 -457
- data/lib/jdc/const.rb +0 -25
- data/lib/jdc/micro/switcher/base.rb +0 -97
- data/lib/jdc/micro/switcher/linux.rb +0 -16
- data/lib/jdc/signature/version.rb +0 -27
- data/lib/jdc/signer.rb +0 -13
- data/lib/jdc/timer.rb +0 -12
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
require "jdc/cli/service/base"
|
|
2
|
+
=begin
|
|
3
|
+
module JDC::Service
|
|
4
|
+
USER_PROVIDED_OFFERING = "user-provided" # I'd rather move this to JFoundry
|
|
5
|
+
|
|
6
|
+
class UPDummy
|
|
7
|
+
def label
|
|
8
|
+
"user-provided"
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
attr_reader :version, :provider
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
class Create < Base
|
|
15
|
+
offerings_from_label = proc { |label, offerings|
|
|
16
|
+
offerings.select { |s| s.label == label }
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
desc "Create a service"
|
|
20
|
+
group :services, :manage
|
|
21
|
+
input :offering, :desc => "What kind of service (e.g. redis, mysql)",
|
|
22
|
+
:argument => :optional, :from_given => offerings_from_label
|
|
23
|
+
input :name, :desc => "Name for your service", :argument => :optional
|
|
24
|
+
input :plan, :desc => "Service plan",
|
|
25
|
+
:from_given => find_by_name_insensitive("plan"),
|
|
26
|
+
:default => proc {
|
|
27
|
+
interact
|
|
28
|
+
}
|
|
29
|
+
input :provider, :desc => "Service provider"
|
|
30
|
+
input :version, :desc => "Service version"
|
|
31
|
+
input :app, :desc => "Application to immediately bind to",
|
|
32
|
+
:alias => "--bind", :from_given => by_name(:app)
|
|
33
|
+
|
|
34
|
+
def create_service
|
|
35
|
+
offerings = client.services
|
|
36
|
+
|
|
37
|
+
if input[:provider]
|
|
38
|
+
offerings.reject! { |s| s.provider != input[:provider] }
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
if input[:version]
|
|
42
|
+
offerings.reject! { |s| s.version != input[:version] }
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
# filter the offerings based on a given plan value, which will be a
|
|
46
|
+
# string if the user provided it with a flag, or a ServicePlan if
|
|
47
|
+
# something invoked this command with a particular plan
|
|
48
|
+
if plan = input.direct(:plan)
|
|
49
|
+
offerings.reject! do |s|
|
|
50
|
+
if plan.is_a?(String)
|
|
51
|
+
s.service_plans.none? { |p| p.name.casecmp(plan) == 0 }
|
|
52
|
+
else
|
|
53
|
+
!s.service_plans.include? plan
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
finalize
|
|
58
|
+
|
|
59
|
+
offerings << UPDummy.new
|
|
60
|
+
|
|
61
|
+
selected_offerings = offerings.any? ? Array(input[:offering, offerings.sort_by(&:label)]) : []
|
|
62
|
+
finalize
|
|
63
|
+
|
|
64
|
+
if selected_offerings.empty?
|
|
65
|
+
fail "Cannot find services matching the given criteria."
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
offering = selected_offerings.first
|
|
69
|
+
|
|
70
|
+
if offering.label == JDC::Service::USER_PROVIDED_OFFERING
|
|
71
|
+
service_instance = client.user_provided_service_instance
|
|
72
|
+
service_instance.name = input[:name, offering]
|
|
73
|
+
finalize
|
|
74
|
+
|
|
75
|
+
# at this point there's no way input[:credentials] can work interactively...
|
|
76
|
+
service_instance.credentials = input[:credentials, nil] || ask_credentials
|
|
77
|
+
else
|
|
78
|
+
service_instance = client.managed_service_instance
|
|
79
|
+
service_instance.name = input[:name, offering]
|
|
80
|
+
finalize
|
|
81
|
+
|
|
82
|
+
plan = input[:plan, offering.service_plans]
|
|
83
|
+
finalize
|
|
84
|
+
service_instance.service_plan = if plan.is_a?(String)
|
|
85
|
+
offering.service_plans.find { |p| p.name.casecmp(plan) == 0 }
|
|
86
|
+
else
|
|
87
|
+
plan
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
service_instance.space = client.current_space
|
|
92
|
+
|
|
93
|
+
with_progress("Creating service #{c(service_instance.name, :name)}") do
|
|
94
|
+
service_instance.create!
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
app = input[:app]
|
|
98
|
+
finalize
|
|
99
|
+
|
|
100
|
+
if app
|
|
101
|
+
invoke :bind_service, :service => service_instance, :app => app
|
|
102
|
+
end
|
|
103
|
+
service_instance
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
private
|
|
107
|
+
|
|
108
|
+
def ask_credentials
|
|
109
|
+
credentials = {}
|
|
110
|
+
|
|
111
|
+
while keys = ask("What credential parameters should applications use to connect to this service instance?\n(e.g. hostname, port, password)").split(/\s*,\s*/).map(&:strip)
|
|
112
|
+
if bad_key = keys.detect { |key| key !~ /^[-\w]+$/ }
|
|
113
|
+
line("'#{bad_key}' is not a valid key")
|
|
114
|
+
else
|
|
115
|
+
break
|
|
116
|
+
end
|
|
117
|
+
end
|
|
118
|
+
finalize
|
|
119
|
+
keys.each do |key|
|
|
120
|
+
value = ask(key)
|
|
121
|
+
finalize
|
|
122
|
+
credentials[key] = value
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
credentials
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
def ask_offering(offerings)
|
|
129
|
+
[ask("What kind?", :choices => offerings.sort_by(&:label),
|
|
130
|
+
:display => proc do |s|
|
|
131
|
+
str = "#{c(s.label, :name)} #{s.version}"
|
|
132
|
+
if s.provider != "core"
|
|
133
|
+
str << ", via #{s.provider}"
|
|
134
|
+
end
|
|
135
|
+
str
|
|
136
|
+
end,
|
|
137
|
+
:complete => proc { |s| "#{s.label} #{s.version}" })]
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
def ask_name(offering)
|
|
141
|
+
default = nil
|
|
142
|
+
unless offering == JDC::Service::USER_PROVIDED_OFFERING
|
|
143
|
+
random = sprintf("%x", rand(1000000))
|
|
144
|
+
default = "#{offering.label}-#{random}"
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
ask "Name?", :default => default
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
def ask_plan(plans)
|
|
151
|
+
ask "Which plan?",
|
|
152
|
+
:choices => plans.sort_by(&:name),
|
|
153
|
+
:indexed => true,
|
|
154
|
+
:display => proc { |p| "#{p.name}: #{p.description || 'No description'}" },
|
|
155
|
+
:complete => proc(&:name)
|
|
156
|
+
end
|
|
157
|
+
end
|
|
158
|
+
end
|
|
159
|
+
=end
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
require "jdc/cli/service/base"
|
|
2
|
+
=begin
|
|
3
|
+
module JDC::Service
|
|
4
|
+
class Delete < Base
|
|
5
|
+
desc "Delete a service"
|
|
6
|
+
group :services, :manage
|
|
7
|
+
input :service, :desc => "Service to delete", :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 = service.service_bindings
|
|
30
|
+
|
|
31
|
+
unless bindings.empty? || !input[:unbind, bindings.collect(&:app)]
|
|
32
|
+
bindings.each do |b|
|
|
33
|
+
invoke :unbind_service, :service => service, :app => b.app
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
bindings = []
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
with_progress("Deleting #{c(service.name, :name)}") do |s|
|
|
40
|
+
if bindings.empty?
|
|
41
|
+
service.delete!
|
|
42
|
+
else
|
|
43
|
+
s.skip do
|
|
44
|
+
apps = bindings.collect(&:app).collect { |a| b(a.name) }
|
|
45
|
+
err "Service is bound to #{human_list(apps)}."
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
private
|
|
52
|
+
|
|
53
|
+
def ask_service
|
|
54
|
+
services = client.service_instances
|
|
55
|
+
fail "No services." if services.empty?
|
|
56
|
+
|
|
57
|
+
ask "Which service?", :choices => services,
|
|
58
|
+
:display => proc(&:name)
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def ask_unbind(apps)
|
|
62
|
+
names = human_list(apps.collect { |a| c(a.name, :name) })
|
|
63
|
+
|
|
64
|
+
ask("Unbind from #{names} before deleting?", :default => true)
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def ask_really(name, color)
|
|
68
|
+
ask("Really delete #{c(name, color)}?", :default => false)
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def human_list(xs)
|
|
72
|
+
if xs.size == 1
|
|
73
|
+
xs.first
|
|
74
|
+
elsif xs.size == 2
|
|
75
|
+
"#{xs.first} and #{xs.last}"
|
|
76
|
+
else
|
|
77
|
+
last = xs.pop
|
|
78
|
+
xs.join(", ") + ", and #{last}"
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
=end
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
require "jdc/cli/service/base"
|
|
2
|
+
=begin
|
|
3
|
+
module JDC::Service
|
|
4
|
+
class Rename < Base
|
|
5
|
+
desc "Rename a service"
|
|
6
|
+
group :services, :manage
|
|
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
|
|
36
|
+
=end
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
require "jdc/cli/service/base"
|
|
2
|
+
|
|
3
|
+
=begin
|
|
4
|
+
module JDC::Service
|
|
5
|
+
class Service < Base
|
|
6
|
+
desc "Show service information"
|
|
7
|
+
group :services
|
|
8
|
+
input :service, :desc => "Service to show", :argument => :required,
|
|
9
|
+
:from_given => by_name(:service_instance, :service)
|
|
10
|
+
def service
|
|
11
|
+
display_service(input[:service])
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
private
|
|
15
|
+
|
|
16
|
+
def display_service(i)
|
|
17
|
+
if quiet?
|
|
18
|
+
line i.name
|
|
19
|
+
else
|
|
20
|
+
plan = i.service_plan
|
|
21
|
+
service = plan.service
|
|
22
|
+
|
|
23
|
+
apps = i.service_bindings.collect { |b|
|
|
24
|
+
c(b.app.name, :name)
|
|
25
|
+
}.join(", ")
|
|
26
|
+
|
|
27
|
+
line "#{c(i.name, :name)}: #{service.label} #{service.version}"
|
|
28
|
+
|
|
29
|
+
indented do
|
|
30
|
+
line "provider: #{c(service.provider, :name)}"
|
|
31
|
+
line "bound to: #{apps}" unless apps.empty?
|
|
32
|
+
line "plan: #{c(plan.name, :name)}"
|
|
33
|
+
|
|
34
|
+
indented do
|
|
35
|
+
line "description: #{plan.description}"
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
=end
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
class ServiceInstanceHelper
|
|
2
|
+
def self.new(instance)
|
|
3
|
+
"#{instance.class.name.demodulize}Helper".constantize.new(instance)
|
|
4
|
+
end
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
class UserProvidedServiceInstanceHelper
|
|
8
|
+
def initialize(instance)
|
|
9
|
+
@instance = instance
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def service_label
|
|
13
|
+
"user-provided"
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def service_provider
|
|
17
|
+
"n/a"
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def version
|
|
21
|
+
"n/a"
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def plan_name
|
|
25
|
+
"n/a"
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def matches(opts = {})
|
|
29
|
+
label = opts[:service]
|
|
30
|
+
if label
|
|
31
|
+
return label == service_label
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
true
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def name
|
|
38
|
+
@instance.name
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def service_bindings
|
|
42
|
+
@instance.service_bindings
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
class ManagedServiceInstanceHelper
|
|
47
|
+
def initialize(service_instance)
|
|
48
|
+
@instance = service_instance
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def service_label
|
|
52
|
+
@instance.service_plan.service.label
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def service_provider
|
|
56
|
+
@instance.service_plan.service.provider
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def version
|
|
60
|
+
@instance.service_plan.service.version
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def plan_name
|
|
64
|
+
@instance.service_plan.name
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def service_bindings
|
|
68
|
+
@instance.service_bindings
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def name
|
|
72
|
+
@instance.name
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def matches(opts = {})
|
|
76
|
+
service = opts[:service]
|
|
77
|
+
plan = opts[:plan]
|
|
78
|
+
provider = opts[:provider]
|
|
79
|
+
version = opts[:version]
|
|
80
|
+
|
|
81
|
+
if service
|
|
82
|
+
return false unless File.fnmatch(service, service_label)
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
if plan
|
|
86
|
+
return false unless File.fnmatch(plan.upcase, plan_name.upcase)
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
if provider
|
|
90
|
+
return false unless File.fnmatch(provider, service_provider)
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
if version
|
|
94
|
+
return false unless File.fnmatch(version, self.version)
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
true
|
|
98
|
+
end
|
|
99
|
+
end
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
require "jdc/cli/service/base"
|
|
2
|
+
|
|
3
|
+
=begin
|
|
4
|
+
module JDC::Service
|
|
5
|
+
class Services < Base
|
|
6
|
+
desc "List your services"
|
|
7
|
+
group :services
|
|
8
|
+
input :space, :desc => "Show services in given space",
|
|
9
|
+
:from_given => by_name(:space),
|
|
10
|
+
:default => proc { client.current_space }
|
|
11
|
+
input :name, :desc => "Filter by name"
|
|
12
|
+
input :service, :desc => "Filter by service type"
|
|
13
|
+
input :plan, :desc => "Filter by service plan"
|
|
14
|
+
input :provider, :desc => "Filter by service provider"
|
|
15
|
+
input :version, :desc => "Filter by service version"
|
|
16
|
+
input :app, :desc => "Limit to application's service bindings",
|
|
17
|
+
:from_given => by_name(:app)
|
|
18
|
+
input :full, :desc => "Verbose output format", :default => false
|
|
19
|
+
input :marketplace, :desc => "List supported services", :default => false, :alias => "-m"
|
|
20
|
+
|
|
21
|
+
def services
|
|
22
|
+
return show_marketplace if input[:marketplace]
|
|
23
|
+
|
|
24
|
+
set_services
|
|
25
|
+
return show_full if input[:full]
|
|
26
|
+
return show_services_table
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
private
|
|
30
|
+
|
|
31
|
+
def set_services
|
|
32
|
+
@services =
|
|
33
|
+
with_progress(services_msg) do
|
|
34
|
+
client.service_instances(:depth => 2)
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
line unless quiet?
|
|
38
|
+
|
|
39
|
+
if @services.empty? and !quiet?
|
|
40
|
+
line "No services."
|
|
41
|
+
return
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
@services.reject! do |i|
|
|
45
|
+
!service_matches(i, input)
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def show_marketplace
|
|
50
|
+
services = with_progress("Getting services") { client.services }
|
|
51
|
+
|
|
52
|
+
line unless quiet?
|
|
53
|
+
|
|
54
|
+
table(
|
|
55
|
+
["service", "version", "provider", "plans", "description"],
|
|
56
|
+
services.sort_by(&:label).collect { |s|
|
|
57
|
+
[c(s.label, :name),
|
|
58
|
+
s.version,
|
|
59
|
+
s.provider,
|
|
60
|
+
s.service_plans.collect(&:name).join(", "),
|
|
61
|
+
s.description
|
|
62
|
+
]
|
|
63
|
+
})
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def show_full
|
|
67
|
+
spaced(@services) do |s|
|
|
68
|
+
invoke :service, :service => s
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def show_services_table
|
|
73
|
+
table(
|
|
74
|
+
["name", "service", "provider", "version", "plan", "bound apps"],
|
|
75
|
+
@services.collect { |instance|
|
|
76
|
+
presenter = ServiceInstanceHelper.new(instance)
|
|
77
|
+
apps = name_list(presenter.service_bindings.collect(&:app))
|
|
78
|
+
|
|
79
|
+
label = presenter.service_label
|
|
80
|
+
provider = presenter.service_provider
|
|
81
|
+
version = presenter.version
|
|
82
|
+
plan_name = presenter.plan_name
|
|
83
|
+
|
|
84
|
+
[ c(presenter.name, :name), label, provider, version, plan_name, apps]
|
|
85
|
+
})
|
|
86
|
+
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
def services_msg
|
|
90
|
+
if space = input[:space]
|
|
91
|
+
"Getting services in #{c(space.name, :name)}"
|
|
92
|
+
else
|
|
93
|
+
"Getting services"
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
def service_matches(i, options)
|
|
98
|
+
if app = options[:app]
|
|
99
|
+
return false unless app.services.include? i
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
if name = options[:name]
|
|
103
|
+
return false unless File.fnmatch(name, i.name)
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
helper = ServiceInstanceHelper.new(i)
|
|
107
|
+
return helper.matches(options)
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
end
|
|
111
|
+
=end
|