lib/vmc/cli/service/services.rb
require "vmc/cli/service/base"
module VMC::Service
class Services < Base
desc "List your service"
group :services
input :space, :desc => "Show services in given space",
:from_given => by_name(:space),
:default => proc { client.current_space }
input :name, :desc => "Filter by name"
input :service, :desc => "Filter by service type"
input :plan, :desc => "Filter by service plan"
input :provider, :desc => "Filter by service provider"
input :version, :desc => "Filter by service version"
input :app, :desc => "Limit to application's service bindings",
:from_given => by_name(:app)
input :full, :desc => "Verbose output format", :default => false
def services
msg =
if space = input[:space]
"Getting services in #{c(space.name, :name)}"
else
"Getting services"
end
services =
with_progress(msg) do
client.service_instances(:depth => 2)
end
line unless quiet?
if services.empty? and !quiet?
line "No services."
return
end
services.reject! do |i|
!service_matches(i, input)
end
if input[:full]
spaced(services) do |s|
invoke :service, :service => s
end
else
table(
["name", "service", "version", v2? && "plan", v2? && "bound apps"],
services.collect { |i|
if v2?
plan = i.service_plan
service = plan.service
label = service.label
version = service.version
apps = name_list(i.service_bindings.collect(&:app))
else
label = i.vendor
version = i.version
end
[ c(i.name, :name),
label,
version,
v2? && plan.name,
apps
]
})
end
end
private
def service_matches(i, options)
if app = options[:app]
return false unless app.services.include? i
end
if name = options[:name]
return false unless File.fnmatch(name, i.name)
end
plan = i.service_plan if v2?
if service = options[:service]
if v2?
return false unless File.fnmatch(service, plan.service.label)
else
return false unless File.fnmatch(service, i.vendor)
end
end
if plan = options[:plan]
fail "--plan is not supported on this target" unless v2?
return false unless File.fnmatch(plan.upcase, plan.name.upcase)
end
if provider = options[:provider]
fail "--provider is not supported on this target" unless v2?
return false unless File.fnmatch(provider, plan.service.provider)
end
if version = options[:version]
if v2?
return false unless File.fnmatch(version, plan.service.version)
else
return false unless File.fnmatch(version, i.version)
end
end
true
end
end
end