lib/cf/cli/service/create.rb in cf-5.0.0.rc1 vs lib/cf/cli/service/create.rb in cf-5.0.0.rc3
- old
+ new
@@ -1,8 +1,18 @@
require "cf/cli/service/base"
module CF::Service
+ USER_PROVIDED_OFFERING = "user-provided" # I'd rather move this to CFoundry
+
+ class UPDummy
+ def label
+ "user-provided"
+ end
+
+ attr_reader :version, :provider
+ end
+
class Create < Base
offerings_from_label = proc { |label, offerings|
offerings.select { |s| s.label == label }
}
@@ -44,60 +54,98 @@
end
end
end
finalize
+ offerings << UPDummy.new
+
selected_offerings = offerings.any? ? Array(input[:offering, offerings.sort_by(&:label)]) : []
finalize
if selected_offerings.empty?
fail "Cannot find services matching the given criteria."
end
offering = selected_offerings.first
- service = client.service_instance
- service.name = input[:name, offering]
- finalize
- plan = input[:plan, offering.service_plans]
- finalize
- service.service_plan = if plan.is_a?(String)
- offering.service_plans.find { |p| p.name.casecmp(plan) == 0 }
- else
- plan
- end
- service.space = client.current_space
+ if offering.label == CF::Service::USER_PROVIDED_OFFERING
+ service_instance = client.user_provided_service_instance
+ service_instance.name = input[:name, offering]
+ finalize
- with_progress("Creating service #{c(service.name, :name)}") do
- service.create!
+ # at this point there's no way input[:credentials] can work interactively...
+ service_instance.credentials = input[:credentials, nil] || ask_credentials
+ else
+ service_instance = client.managed_service_instance
+ service_instance.name = input[:name, offering]
+ finalize
+
+ plan = input[:plan, offering.service_plans]
+ finalize
+ service_instance.service_plan = if plan.is_a?(String)
+ offering.service_plans.find { |p| p.name.casecmp(plan) == 0 }
+ else
+ plan
+ end
end
+ service_instance.space = client.current_space
+
+ with_progress("Creating service #{c(service_instance.name, :name)}") do
+ service_instance.create!
+ end
+
app = input[:app]
finalize
if app
- invoke :bind_service, :service => service, :app => app
+ invoke :bind_service, :service => service_instance, :app => app
end
- service
+ service_instance
end
private
+ def ask_credentials
+ credentials = {}
+
+ 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)
+ if bad_key = keys.detect { |key| key !~ /^[-\w]+$/ }
+ line("'#{bad_key}' is not a valid key")
+ else
+ break
+ end
+ end
+ finalize
+ keys.each do |key|
+ value = ask(key)
+ finalize
+ credentials[key] = value
+ end
+
+ credentials
+ end
+
def ask_offering(offerings)
[ask("What kind?", :choices => offerings.sort_by(&:label),
- :display => proc { |s|
+ :display => proc do |s|
str = "#{c(s.label, :name)} #{s.version}"
if s.provider != "core"
str << ", via #{s.provider}"
end
str
- },
+ end,
:complete => proc { |s| "#{s.label} #{s.version}" })]
end
def ask_name(offering)
- random = sprintf("%x", rand(1000000))
- ask "Name?", :default => "#{offering.label}-#{random}"
+ default = nil
+ unless offering == CF::Service::USER_PROVIDED_OFFERING
+ random = sprintf("%x", rand(1000000))
+ default = "#{offering.label}-#{random}"
+ end
+
+ ask "Name?", :default => default
end
def ask_plan(plans)
ask "Which plan?",
:choices => plans.sort_by(&:name),