lib/vmc/cli/service/delete.rb
require "vmc/cli/service/base"
module VMC::Service
class Delete < Base
desc "Delete a service"
group :services, :manage
input :service, :desc => "Service to bind", :argument => :optional,
:from_given => by_name(:service_instance, :service)
input :unbind, :desc => "Unbind from applications before deleting?",
:type => :boolean, :default => proc { force? || interact }
input :all, :desc => "Delete all services", :default => false
input :really, :type => :boolean, :forget => true, :hidden => true,
:default => proc { force? || interact }
def delete_service
if input[:all]
return unless input[:really, "ALL SERVICES", :bad]
client.service_instances.each do |i|
invoke :delete_service, :service => i, :really => true
end
return
end
service = input[:service]
return unless input[:really, service.name, :name]
bindings = []
if v2?
bindings = service.service_bindings
unless bindings.empty? || !input[:unbind, bindings.collect(&:app)]
bindings.each do |b|
invoke :unbind_service, :service => service, :app => b.app
end
bindings = []
end
end
with_progress("Deleting #{c(service.name, :name)}") do |s|
if bindings.empty?
service.delete!
else
s.skip do
apps = bindings.collect(&:app).collect { |a| b(a.name) }
err "Service is bound to #{human_list(apps)}."
end
end
end
end
private
def ask_service
services = client.service_instances
fail "No services." if services.empty?
ask "Which service?", :choices => services,
:display => proc(&:name)
end
def ask_unbind(apps)
names = human_list(apps.collect { |a| c(a.name, :name) })
ask("Unbind from #{names} before deleting?", :default => true)
end
def ask_really(name, color)
ask("Really delete #{c(name, color)}?", :default => false)
end
def human_list(xs)
if xs.size == 1
xs.first
elsif xs.size == 2
"#{xs.first} and #{xs.last}"
else
last = xs.pop
xs.join(", ") + ", and #{last}"
end
end
end
end