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.
Files changed (151) hide show
  1. data/LICENSE +1277 -24
  2. data/Rakefile +13 -0
  3. data/bin/jdc +12 -2
  4. data/lib/admin/README.md +15 -0
  5. data/lib/admin/curl.rb +60 -0
  6. data/lib/admin/guid.rb +89 -0
  7. data/lib/admin/plugin.rb +6 -0
  8. data/lib/admin/service_auth_token.rb +94 -0
  9. data/lib/admin/service_broker/add.rb +47 -0
  10. data/lib/admin/service_broker/service_brokers.rb +24 -0
  11. data/lib/admin/set_quota.rb +44 -0
  12. data/lib/console/README.md +8 -0
  13. data/lib/console/console.rb +187 -0
  14. data/lib/console/plugin.rb +33 -0
  15. data/lib/jdc.rb +15 -2
  16. data/lib/jdc/cli.rb +556 -0
  17. data/lib/jdc/cli/app/app.rb +43 -0
  18. data/lib/jdc/cli/app/apps.rb +87 -0
  19. data/lib/jdc/cli/app/base.rb +72 -0
  20. data/lib/jdc/cli/app/delete.rb +95 -0
  21. data/lib/jdc/cli/app/deprecated.rb +11 -0
  22. data/lib/jdc/cli/app/env.rb +78 -0
  23. data/lib/jdc/cli/app/events.rb +45 -0
  24. data/lib/jdc/cli/app/files.rb +137 -0
  25. data/lib/jdc/cli/app/health.rb +26 -0
  26. data/lib/jdc/cli/app/instances.rb +53 -0
  27. data/lib/jdc/cli/app/logs.rb +76 -0
  28. data/lib/jdc/cli/app/push.rb +103 -0
  29. data/lib/jdc/cli/app/push/create.rb +108 -0
  30. data/lib/jdc/cli/app/push/interactions.rb +86 -0
  31. data/lib/jdc/cli/app/push/sync.rb +57 -0
  32. data/lib/jdc/cli/app/rename.rb +35 -0
  33. data/lib/jdc/cli/app/restart.rb +31 -0
  34. data/lib/jdc/cli/app/scale.rb +63 -0
  35. data/lib/jdc/cli/app/start.rb +161 -0
  36. data/lib/jdc/cli/app/stats.rb +67 -0
  37. data/lib/jdc/cli/app/stop.rb +27 -0
  38. data/lib/jdc/cli/domain/base.rb +9 -0
  39. data/lib/jdc/cli/domain/domains.rb +40 -0
  40. data/lib/jdc/cli/domain/map.rb +55 -0
  41. data/lib/jdc/cli/domain/unmap.rb +56 -0
  42. data/lib/jdc/cli/help.rb +15 -0
  43. data/lib/jdc/cli/interactive.rb +105 -0
  44. data/lib/jdc/cli/login_requirements.rb +15 -0
  45. data/lib/jdc/cli/organization/base.rb +14 -0
  46. data/lib/jdc/cli/organization/create.rb +37 -0
  47. data/lib/jdc/cli/organization/delete.rb +63 -0
  48. data/lib/jdc/cli/organization/org.rb +45 -0
  49. data/lib/jdc/cli/organization/orgs.rb +30 -0
  50. data/lib/jdc/cli/organization/rename.rb +37 -0
  51. data/lib/jdc/cli/populators/base.rb +16 -0
  52. data/lib/jdc/cli/populators/organization.rb +32 -0
  53. data/lib/jdc/cli/populators/populator_methods.rb +64 -0
  54. data/lib/jdc/cli/populators/space.rb +33 -0
  55. data/lib/jdc/cli/populators/target.rb +13 -0
  56. data/lib/jdc/cli/route/base.rb +9 -0
  57. data/lib/jdc/cli/route/delete.rb +28 -0
  58. data/lib/jdc/cli/route/map.rb +68 -0
  59. data/lib/jdc/cli/route/routes.rb +26 -0
  60. data/lib/jdc/cli/route/unmap.rb +56 -0
  61. data/lib/jdc/cli/service/base.rb +9 -0
  62. data/lib/jdc/cli/service/bind.rb +44 -0
  63. data/lib/jdc/cli/service/create.rb +159 -0
  64. data/lib/jdc/cli/service/delete.rb +83 -0
  65. data/lib/jdc/cli/service/rename.rb +36 -0
  66. data/lib/jdc/cli/service/service.rb +42 -0
  67. data/lib/jdc/cli/service/service_instance_helper.rb +99 -0
  68. data/lib/jdc/cli/service/services.rb +111 -0
  69. data/lib/jdc/cli/service/unbind.rb +37 -0
  70. data/lib/jdc/cli/space/base.rb +29 -0
  71. data/lib/jdc/cli/space/create.rb +67 -0
  72. data/lib/jdc/cli/space/delete.rb +56 -0
  73. data/lib/jdc/cli/space/rename.rb +38 -0
  74. data/lib/jdc/cli/space/space.rb +66 -0
  75. data/lib/jdc/cli/space/spaces.rb +57 -0
  76. data/lib/jdc/cli/space/switch.rb +19 -0
  77. data/lib/jdc/cli/start/base.rb +41 -0
  78. data/lib/jdc/cli/start/colors.rb +13 -0
  79. data/lib/jdc/cli/start/target.rb +50 -0
  80. data/lib/jdc/cli/start/target_prettifier.rb +17 -0
  81. data/lib/jdc/cli/start/targets.rb +16 -0
  82. data/lib/jdc/cli/user/base.rb +30 -0
  83. data/lib/jdc/cli/user/create.rb +52 -0
  84. data/lib/jdc/cli/user/passwd.rb +37 -0
  85. data/lib/jdc/cli/user/register.rb +43 -0
  86. data/lib/jdc/cli/user/users.rb +32 -0
  87. data/lib/jdc/constants.rb +11 -0
  88. data/lib/jdc/errors.rb +19 -0
  89. data/lib/jdc/object_extensions.rb +15 -0
  90. data/lib/jdc/plugin.rb +56 -0
  91. data/lib/jdc/spacing.rb +89 -0
  92. data/lib/jdc/spec_helper.rb +1 -0
  93. data/lib/jdc/test_support.rb +6 -0
  94. data/lib/jdc/version.rb +3 -0
  95. data/lib/manifests/errors.rb +35 -0
  96. data/lib/manifests/loader.rb +31 -0
  97. data/lib/manifests/loader/builder.rb +39 -0
  98. data/lib/manifests/loader/normalizer.rb +145 -0
  99. data/lib/manifests/loader/resolver.rb +79 -0
  100. data/lib/manifests/manifests.rb +344 -0
  101. data/lib/manifests/plugin.rb +140 -0
  102. data/lib/micro/README.md +9 -0
  103. data/lib/micro/errors.rb +4 -0
  104. data/lib/{jdc → micro}/micro.rb +15 -15
  105. data/lib/micro/plugin.rb +197 -0
  106. data/lib/micro/switcher/base.rb +79 -0
  107. data/lib/{jdc/micro → micro}/switcher/darwin.rb +5 -3
  108. data/lib/{jdc/micro → micro}/switcher/dummy.rb +1 -1
  109. data/lib/micro/switcher/linux.rb +16 -0
  110. data/lib/{jdc/micro → micro}/switcher/windows.rb +5 -5
  111. data/lib/{jdc/micro → micro}/vmrun.rb +26 -19
  112. data/lib/tasks/gem_release.rake +42 -0
  113. data/lib/tunnel/README.md +29 -0
  114. data/{config → lib/tunnel/config}/clients.yml +2 -2
  115. data/lib/tunnel/helper-app/Gemfile +10 -0
  116. data/lib/tunnel/helper-app/Gemfile.lock +48 -0
  117. data/{caldecott_helper → lib/tunnel/helper-app}/server.rb +5 -5
  118. data/lib/tunnel/plugin.rb +183 -0
  119. data/lib/tunnel/tunnel.rb +295 -0
  120. metadata +371 -210
  121. data/README.md +0 -102
  122. data/config/micro/paths.yml +0 -22
  123. data/config/micro/refresh_ip.rb +0 -20
  124. data/lib/cli.rb +0 -53
  125. data/lib/cli/commands/admin.rb +0 -58
  126. data/lib/cli/commands/apps.rb +0 -1129
  127. data/lib/cli/commands/base.rb +0 -228
  128. data/lib/cli/commands/manifest.rb +0 -56
  129. data/lib/cli/commands/micro.rb +0 -115
  130. data/lib/cli/commands/misc.rb +0 -126
  131. data/lib/cli/commands/services.rb +0 -178
  132. data/lib/cli/commands/user.rb +0 -14
  133. data/lib/cli/config.rb +0 -173
  134. data/lib/cli/console_helper.rb +0 -170
  135. data/lib/cli/core_ext.rb +0 -122
  136. data/lib/cli/errors.rb +0 -19
  137. data/lib/cli/frameworks.rb +0 -265
  138. data/lib/cli/manifest_helper.rb +0 -300
  139. data/lib/cli/runner.rb +0 -505
  140. data/lib/cli/services_helper.rb +0 -84
  141. data/lib/cli/tunnel_helper.rb +0 -332
  142. data/lib/cli/usage.rb +0 -86
  143. data/lib/cli/version.rb +0 -7
  144. data/lib/cli/zip_util.rb +0 -77
  145. data/lib/jdc/client.rb +0 -457
  146. data/lib/jdc/const.rb +0 -25
  147. data/lib/jdc/micro/switcher/base.rb +0 -97
  148. data/lib/jdc/micro/switcher/linux.rb +0 -16
  149. data/lib/jdc/signature/version.rb +0 -27
  150. data/lib/jdc/signer.rb +0 -13
  151. 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