class Hula::CloudFoundry

Attributes

api_url[R]
command_runner[R]
current_organization[R]
current_space[R]
domain[R]
logger[R]

Public Class Methods

new(args) click to toggle source
# File lib/hula/cloud_foundry.rb, line 23
def initialize(args)
  @domain = args.fetch(:domain)
  @api_url = args.fetch(:api_url)
  @logger = args.fetch(:logger, default_logger)
  @command_runner = args.fetch(:command_runner, default_command_runner)

  target_and_login = args.fetch(:target_and_login, true)
  if target_and_login
    target(api_url)
    login(args.fetch(:username), args.fetch(:password))
  end
end

Public Instance Methods

add_public_service_broker(service_name, _service_label, url, username, password) click to toggle source
# File lib/hula/cloud_foundry.rb, line 138
def add_public_service_broker(service_name, _service_label, url, username, password)
  cf("create-service-broker #{service_name} #{username} #{password} #{url}")

  service_plans = JSON.parse(cf('curl /v2/service_plans -X GET'))
  guids = service_plans['resources'].map do |resource|
    resource['metadata']['guid']
  end

  guids.each do |guid|
    cf(%(curl /v2/service_plans/#{guid} -X PUT -d '{"public":true}'))
  end
end
app_env(app_name) click to toggle source
# File lib/hula/cloud_foundry.rb, line 257
def app_env(app_name)
  cf("env #{app_name}")
end
app_vcap_services(app_name) click to toggle source
# File lib/hula/cloud_foundry.rb, line 48
def app_vcap_services(app_name)
  app_environment(app_name)["VCAP_SERVICES"]
end
assert_broker_is_in_marketplace(type) click to toggle source
# File lib/hula/cloud_foundry.rb, line 156
def assert_broker_is_in_marketplace(type)
  output = marketplace
  unless output.include?(type)
    fail "Broker #{type} not found in marketplace"
  end
end
assert_instance_is_in_services_list(service_name) click to toggle source
# File lib/hula/cloud_foundry.rb, line 189
def assert_instance_is_in_services_list(service_name)
  output = cf('services')
  unless output.include?(service_name)
    fail "Instance #{service_name} not found in services list"
  end
end
auth_token() click to toggle source
# File lib/hula/cloud_foundry.rb, line 36
def auth_token
  cf("oauth-token").lines.last.strip!
end
bind_app_to_service(app_name, service_name) click to toggle source
# File lib/hula/cloud_foundry.rb, line 214
def bind_app_to_service(app_name, service_name)
  cf("bind-service #{app_name} #{service_name}")
end
cf(command, options = {}) click to toggle source
# File lib/hula/cloud_foundry.rb, line 287
def cf(command, options = {})
  allow_failure = options.fetch(:allow_failure, false)
  cf_command = "cf #{command}"

  logger.info(cf_command)

  command_runner.run(cf_command, allow_failure: allow_failure)
end
create_and_target_org(name) click to toggle source
# File lib/hula/cloud_foundry.rb, line 69
def create_and_target_org(name)
  create_org(name)
  sleep 1
  target_org(name)
end
create_and_target_space(name) click to toggle source
# File lib/hula/cloud_foundry.rb, line 84
def create_and_target_space(name)
  create_space(name)
  target_space(name)
end
create_org(name) click to toggle source
# File lib/hula/cloud_foundry.rb, line 75
def create_org(name)
  cf("create-org #{name}")
end
create_service_instance(type, name, plan) click to toggle source
# File lib/hula/cloud_foundry.rb, line 167
def create_service_instance(type, name, plan)
  cf("create-service #{type} #{plan} #{name}")
end
create_service_key(service_instance_name, key_name) click to toggle source
# File lib/hula/cloud_foundry.rb, line 226
def create_service_key(service_instance_name, key_name)
  cf("create-service-key #{service_instance_name} #{key_name}")
end
create_space(name) click to toggle source
# File lib/hula/cloud_foundry.rb, line 89
def create_space(name)
  cf("create-space #{name}")
end
create_user(username, password) click to toggle source
# File lib/hula/cloud_foundry.rb, line 261
def create_user(username, password)
  cf("create-user #{username} #{password}")
end
delete_app(name, options = {}) click to toggle source
# File lib/hula/cloud_foundry.rb, line 209
def delete_app(name, options = {})
  allow_failure = options.fetch(:allow_failure, true)
  cf("delete #{name} -f", allow_failure: allow_failure)
end
delete_org(name, options = {}) click to toggle source
# File lib/hula/cloud_foundry.rb, line 131
def delete_org(name, options = {})
  allow_failure = options.fetch(:allow_failure, true)
  cf("delete-org #{name} -f", allow_failure: allow_failure)
end
Also aliased as: reset!
delete_service_instance_and_unbind(name, options = {}) click to toggle source
# File lib/hula/cloud_foundry.rb, line 171
def delete_service_instance_and_unbind(name, options = {})
  allow_failure = options.fetch(:allow_failure, true)
  cf("delete-service -f #{name}", allow_failure: allow_failure)
end
delete_service_key(service_instance_name, key_name) click to toggle source
# File lib/hula/cloud_foundry.rb, line 230
def delete_service_key(service_instance_name, key_name)
  cf("delete-service-key #{service_instance_name} #{key_name} -f")
end
delete_space(name, options = {}) click to toggle source
# File lib/hula/cloud_foundry.rb, line 126
def delete_space(name, options = {})
  allow_failure = options.fetch(:allow_failure, true)
  cf("delete-space #{name} -f", allow_failure: allow_failure)
end
delete_user(username) click to toggle source
# File lib/hula/cloud_foundry.rb, line 265
def delete_user(username)
  cf("delete-user -f #{username}")
end
enable_diego_for_app(name) click to toggle source
# File lib/hula/cloud_foundry.rb, line 205
def enable_diego_for_app(name)
  cf("enable-diego #{name}")
end
get_service_status(service_name, options = {}) click to toggle source
# File lib/hula/cloud_foundry.rb, line 176
def get_service_status(service_name, options = {})
  allow_failure = options.fetch(:allow_failure, false)

  output = cf("service #{service_name}", allow_failure: allow_failure)

  missing_instance_message = "Service instance #{service_name} not found"
  if output.include? missing_instance_message
    missing_instance_message
  else
    output[/^Status: .*$/i].gsub(/Status:\s+/i, '')
  end
end
info() click to toggle source
# File lib/hula/cloud_foundry.rb, line 282
def info
  output = cf("curl /v2/info")
  JSON.parse(output)
end
list_service_keys(service_instance_name) click to toggle source
# File lib/hula/cloud_foundry.rb, line 222
def list_service_keys(service_instance_name)
  cf("service-keys #{service_instance_name}")
end
login(username, password, allow_failure = true) click to toggle source
# File lib/hula/cloud_foundry.rb, line 52
def login(username, password, allow_failure = true)
  cf("auth #{username} #{password}", allow_failure: allow_failure)
end
marketplace() click to toggle source
# File lib/hula/cloud_foundry.rb, line 163
def marketplace
  cf('marketplace')
end
org_exists?(name) click to toggle source
# File lib/hula/cloud_foundry.rb, line 103
def org_exists?(name)
  orgs = cf('orgs').lines[3..-1]
  orgs.map(&:strip).include?(name)
end
push_app(app_path, name) click to toggle source
# File lib/hula/cloud_foundry.rb, line 201
def push_app(app_path, name)
  cf("push #{name} -p #{app_path} -n #{name} -d #{domain} --no-start")
end
push_app_and_start(app_path, name) click to toggle source
# File lib/hula/cloud_foundry.rb, line 196
def push_app_and_start(app_path, name)
  push_app(app_path, name)
  start_app(name)
end
remove_service_broker(service_name, options = {}) click to toggle source
# File lib/hula/cloud_foundry.rb, line 151
def remove_service_broker(service_name, options = {})
  allow_failure = options.fetch(:allow_failure, true)
  cf("delete-service-broker #{service_name} -f", allow_failure: allow_failure)
end
reset!(name, options = {})
Alias for: delete_org
restart_app(name) click to toggle source
# File lib/hula/cloud_foundry.rb, line 238
def restart_app(name)
  stop_app(name)
  start_app(name)
end
service_brokers() click to toggle source
# File lib/hula/cloud_foundry.rb, line 56
def service_brokers
  output = cf('service-brokers')

  if output.include?('No service brokers found')
    []
  else
    output.split("\n").drop(3).map do |row|
      name, url = row.split(/\s+/)
      ServiceBroker.new(name: name, url: url)
    end
  end
end
service_key(service_instance_name, key_name) click to toggle source
# File lib/hula/cloud_foundry.rb, line 234
def service_key(service_instance_name, key_name)
  cf("service-key #{service_instance_name} #{key_name}")
end
set_org_role(username, org, role) click to toggle source
# File lib/hula/cloud_foundry.rb, line 274
def set_org_role(username, org, role)
  cf("set-org-role #{username} #{org} #{role}")
end
setup_permissive_security_group(org, space) click to toggle source
# File lib/hula/cloud_foundry.rb, line 108
def setup_permissive_security_group(org, space)
  rules = [{
    'destination' => '0.0.0.0-255.255.255.255',
    'protocol' => 'all'
  }]

  rule_file = Tempfile.new('default_security_group.json')
  rule_file.write(rules.to_json)
  rule_file.close

  cf("create-security-group prof-test #{rule_file.path}")
  cf("bind-security-group prof-test #{org} #{space}")
  cf('bind-staging-security-group prof-test')
  cf('bind-running-security-group prof-test')

  rule_file.unlink
end
space_exists?(name) click to toggle source
# File lib/hula/cloud_foundry.rb, line 98
def space_exists?(name)
  spaces = cf('spaces').lines[3..-1]
  spaces.map(&:strip).include?(name)
end
start_app(name) click to toggle source
# File lib/hula/cloud_foundry.rb, line 243
def start_app(name)
  cf("start #{name}")
rescue => start_exception
  begin
    cf("logs --recent #{name}")
  ensure
    raise start_exception
  end
end
stop_app(name) click to toggle source
# File lib/hula/cloud_foundry.rb, line 253
def stop_app(name)
  cf("stop #{name}")
end
target(cloud_controller_url) click to toggle source
# File lib/hula/cloud_foundry.rb, line 44
def target(cloud_controller_url)
  cf("api #{cloud_controller_url} --skip-ssl-validation")
end
target_org(name) click to toggle source
# File lib/hula/cloud_foundry.rb, line 79
def target_org(name)
  cf("target -o #{name}")
  @current_organization = name
end
target_space(name) click to toggle source
# File lib/hula/cloud_foundry.rb, line 93
def target_space(name)
  cf("target -s #{name}")
  @current_space = name
end
unbind_app_from_service(app_name, service_name) click to toggle source
# File lib/hula/cloud_foundry.rb, line 218
def unbind_app_from_service(app_name, service_name)
  cf("unbind-service #{app_name} #{service_name}")
end
url_for_app(app_name) click to toggle source
# File lib/hula/cloud_foundry.rb, line 40
def url_for_app(app_name)
  "https://#{app_name}.#{domain}"
end
user_exists?(username, org) click to toggle source
# File lib/hula/cloud_foundry.rb, line 269
def user_exists?(username, org)
  output = cf("org-users #{org}")
  output.lines.select { |l| l.start_with? '  ' }.map(&:strip).uniq.include?(username)
end
version() click to toggle source
# File lib/hula/cloud_foundry.rb, line 278
def version
  cf('-v')
end

Private Instance Methods

app_environment(app_name) click to toggle source
# File lib/hula/cloud_foundry.rb, line 300
def app_environment(app_name)
  env_output = cf("env #{app_name}")
  response = env_output[/^\{.*}$/m].split(/^\n/)
  response = response.map { |json| JSON.parse(json) }
  response.inject({}) { |result, current| result.merge(current) }
end
clean_path() click to toggle source
# File lib/hula/cloud_foundry.rb, line 326
def clean_path
  '/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin/:sbin'
end
default_command_runner() click to toggle source
# File lib/hula/cloud_foundry.rb, line 315
def default_command_runner
  @default_command_runner ||= CommandRunner.new(environment: env)
end
default_logger() click to toggle source
# File lib/hula/cloud_foundry.rb, line 307
def default_logger
  @default_logger ||= begin
    STDOUT.sync = true
    require 'logger'
    Logger.new(STDOUT)
  end
end
env() click to toggle source
# File lib/hula/cloud_foundry.rb, line 319
def env
  @env ||= ENV.to_hash.merge(
    'PATH'    => clean_path,
    'CF_HOME' => Dir.mktmpdir('cf-home')
  )
end