module Nucleus::Adapters::V1::CloudFoundryV2::Application

Public Instance Methods

application(application_name_or_id) click to toggle source

@see Stub#application

# File lib/nucleus/adapters/v1/cloud_foundry_v2/application.rb, line 17
def application(application_name_or_id)
  app_guid = app_guid(application_name_or_id)
  get_response = get("/v2/apps/#{app_guid}")
  to_nucleus_app(get_response.body)
end
applications() click to toggle source

@see Stub#applications

# File lib/nucleus/adapters/v1/cloud_foundry_v2/application.rb, line 7
def applications
  response = get('/v2/apps')
  apps = []
  response.body[:resources].each do |application_resource|
    apps << to_nucleus_app(application_resource)
  end
  apps
end
create_application(application) click to toggle source

@see Stub#create_application

# File lib/nucleus/adapters/v1/cloud_foundry_v2/application.rb, line 24
def create_application(application)
  if application.key? :region
    unless application[:region].casecmp('default') == 0
      raise Errors::SemanticAdapterRequestError,
            "Region '#{application[:region]}' does not exist at the endpoint. "\
            'Please check which regions are actually available on this endpoint.'
    end
    # there is no region in Cloud Foundry --> remove from request
    application.delete :region
  end

  apply_buildpack(application)

  # apply default values, if not overridden by custom params
  default_params = { space_guid: user_space_guid }
  application = default_params.merge(application)

  # WORKAROUND: requires numeric input, but rack-test provides characters :/
  application['memory'] = application['memory'].to_i if application.key?('memory')

  response = post('/v2/apps', body: application).body

  # now create the default route (similar to when using an UI, e.g. Pivotal, Stackato or Bluemix) == web_url
  create_cf_domain(response[:metadata][:guid], @endpoint_app_domain, response[:metadata][:guid])

  # finally build the application response
  application(response[:metadata][:guid])
end
delete_application(application_name_or_id) click to toggle source

@see Stub#delete_application

# File lib/nucleus/adapters/v1/cloud_foundry_v2/application.rb, line 63
def delete_application(application_name_or_id)
  app_guid = app_guid(application_name_or_id)
  # first delete all service bindings
  remove_all_services(app_guid)
  # then delete the default route (otherwise it would remain as orphaned route)
  routes = get("/v2/apps/#{app_guid}/routes?q=host:#{app_guid}&inline-relations-depth=1").body[:resources]
  default_route = routes.find { |route| route[:entity][:domain][:entity][:name] == @endpoint_app_domain }
  delete("/v2/routes/#{default_route[:metadata][:guid]}") if default_route
  # and finally delete the app
  delete("/v2/apps/#{app_guid}")
end
update_application(application_name_or_id, application_form) click to toggle source

@see Stub#update_application

# File lib/nucleus/adapters/v1/cloud_foundry_v2/application.rb, line 54
def update_application(application_name_or_id, application_form)
  app_guid = app_guid(application_name_or_id)
  apply_buildpack(application_form)
  # update by guid
  update_response = put("/v2/apps/#{app_guid}", body: application_form)
  to_nucleus_app(update_response.body)
end

Private Instance Methods

apply_buildpack(application) click to toggle source
# File lib/nucleus/adapters/v1/cloud_foundry_v2/application.rb, line 77
def apply_buildpack(application)
  # handle desired runtime(s)
  runtimes = application.delete(:runtimes)
  return unless runtimes
  fail_with(:only_one_runtime) if runtimes.length > 1

  buildpack = find_runtime(runtimes[0])
  # use the translated buildpack name if available, otherwise pass on the given runtime name
  application[:buildpack] = buildpack ? buildpack : runtimes[0]
end
to_nucleus_app(app_resource) click to toggle source
# File lib/nucleus/adapters/v1/cloud_foundry_v2/application.rb, line 88
def to_nucleus_app(app_resource)
  metadata = app_resource[:metadata]
  app = app_resource[:entity]

  app[:id] = metadata[:guid]
  app[:created_at] = metadata[:created_at]
  app[:updated_at] = metadata[:updated_at] || metadata[:created_at]
  app[:state] = application_state(app_resource)
  app[:web_url] = "http://#{app_web_url(metadata[:guid])}"
  # route could have been deleted by the user
  app[:web_url] = nil unless domain?(metadata[:guid], app[:web_url])
  # Stackato does support autoscaling
  app[:autoscaled] = app.delete(:autoscale_enabled) || false
  app[:region] = 'default'
  app[:active_runtime] = app[:detected_buildpack]
  app[:runtimes] = app[:buildpack] ? [app[:buildpack]] : []
  app[:release_version] = app.delete(:version)
  app
end