class Cyoi::Cli::AutoDetection::AutoDetectionFog

Public Instance Methods

auto_detection_choices() click to toggle source

Displays a prompt for known IaaS that are configured within .fog config file if found.

If no ~/.fog file found or user chooses “Alternate credentials” then no changes are made to settings.

For example:

  1. AWS (default)

  2. AWS (bosh)

  3. Alternate credentials

Choose infrastructure: 1

If .fog config only contains one provider, do not prompt.

fog config file looks like: :default:

:aws_access_key_id: PERSONAL_ACCESS_KEY
:aws_secret_access_key: PERSONAL_SECRET

:bosh:

:aws_access_key_id: SPECIAL_IAM_ACCESS_KEY
:aws_secret_access_key: SPECIAL_IAM_SECRET_KEY

Convert this into: { “AWS (default)” => {:aws_access_key_id => …}, “AWS (bosh)” => {…} }

Then display options to user to choose.

Currently detects following fog providers:

  • AWS

  • OpenStack

If “Alternate credentials” is selected, then user is prompted for fog credentials:

  • provider?

  • access keys?

  • API URI or region?

Sets (unless ‘Alternate credentials’ is chosen)

  • settings.provider.name

  • settings.provider.credentials

For AWS, the latter has keys:

{:aws_access_key_id, :aws_secret_access_key}

For OpenStack, the latter has keys:

{:openstack_username, :openstack_api_key, :openstack_tenant
   :openstack_auth_url, :openstack_region }
# File lib/cyoi/cli/auto_detection/auto_detection_fog.rb, line 52
def auto_detection_choices
  fog_choices = {}
  # Prepare menu options:
  # each provider/profile name gets a menu choice option
  fog_config.inject({}) do |iaas_options, fog_profile|
    profile_name, profile = fog_profile
    if profile[:aws_access_key_id]
      fog_choices["AWS (#{profile_name})"] = {
        "name" => "aws",
        "provider" => "AWS",
        "aws_access_key_id" => profile[:aws_access_key_id],
        "aws_secret_access_key" => profile[:aws_secret_access_key]
      }
    end
    if profile[:openstack_username]
      choice = {
        "name" => "openstack",
        "provider" => "OpenStack",
        "openstack_username" => profile[:openstack_username],
        "openstack_api_key" => profile[:openstack_api_key],
        "openstack_tenant" => profile[:openstack_tenant],
        "openstack_auth_url" => profile[:openstack_auth_url],
      }
      choice["openstack_region"] = profile[:openstack_region] if profile[:openstack_region]
      fog_choices["OpenStack (#{profile_name})"] = choice
    end
    if profile[:vsphere_username]
      fog_choices["vSphere (#{profile_name})"] = {
        "name" => "vsphere",
        "provider" => "vSphere",
        "vsphere_username" => profile[:vsphere_username],
        "vsphere_password" => profile[:vsphere_password],
        "vsphere_server"   => profile[:vsphere_server],
        "vsphere_expected_pubkey_hash" => profile[:vsphere_expected_pubkey_hash]
      }
    end
  end
  fog_choices
end
fog_config() click to toggle source
# File lib/cyoi/cli/auto_detection/auto_detection_fog.rb, line 92
def fog_config
  @fog_config ||= begin
    if File.exists?(File.expand_path(fog_config_path))
      puts "Auto-detected infrastructure API credentials at #{fog_config_path} (override with $FOG)"
      YAML.load_file(File.expand_path(fog_config_path))
    else
      {}
    end
  end
end
fog_config_path() click to toggle source
# File lib/cyoi/cli/auto_detection/auto_detection_fog.rb, line 103
def fog_config_path
  ENV['FOG'] || "~/.fog"
end