File Manager

Path: /opt/chef.upgrade/embedded/lib/ruby/gems/2.3.0/gems/ohai-8.24.0/lib/ohai/plugins/

Viewing File: cloud.rb

#
# Author:: Cary Penniman (<cary@rightscale.com>)
# License:: Apache License, Version 2.0
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

Ohai.plugin(:Cloud) do
  provides "cloud"

  depends "ec2"
  depends "gce"
  depends "rackspace"
  depends "eucalyptus"
  depends "linode"
  depends "openstack"
  depends "azure"
  depends "digital_ocean"
  depends "softlayer"

  # Make top-level cloud hashes
  #
  def create_objects
    cloud Mash.new
    cloud[:public_ips] = Array.new
    cloud[:private_ips] = Array.new
  end
  #---------------------------------------
  # Google Compute Engine (gce)
  #--------------------------------------

  # Is current cloud gce?
  #
  # === Return
  # true:: If gce Hash is defined
  # false:: Otherwise
  def on_gce?
    gce != nil
  end

  # Fill cloud hash with gce values
  def get_gce_values
    cloud[:public_ipv4] = []
    cloud[:local_ipv4] = []

    public_ips = gce["instance"]["networkInterfaces"].collect do |interface|
      if interface.has_key?("accessConfigs")
        interface["accessConfigs"].collect { |ac| ac["externalIp"] }
      end
    end.flatten.compact

    private_ips = gce["instance"]["networkInterfaces"].collect do |interface|
      interface["ip"]
    end.compact

    cloud[:public_ips] += public_ips
    cloud[:private_ips] += private_ips
    cloud[:public_ipv4] += public_ips
    cloud[:public_hostname] = nil
    cloud[:local_ipv4] += private_ips
    cloud[:local_hostname] = gce["instance"]["hostname"]
    cloud[:provider] = "gce"
  end

  # ----------------------------------------
  # ec2
  # ----------------------------------------

  # Is current cloud ec2?
  #
  # === Return
  # true:: If ec2 Hash is defined
  # false:: Otherwise
  def on_ec2?
    ec2 != nil
  end

  # Fill cloud hash with ec2 values
  def get_ec2_values
    cloud[:public_ips] << ec2["public_ipv4"]
    cloud[:private_ips] << ec2["local_ipv4"]
    cloud[:public_ipv4] = ec2["public_ipv4"]
    cloud[:public_hostname] = ec2["public_hostname"]
    cloud[:local_ipv4] = ec2["local_ipv4"]
    cloud[:local_hostname] = ec2["local_hostname"]
    cloud[:provider] = "ec2"
  end

  # ----------------------------------------
  # rackspace
  # ----------------------------------------

  # Is current cloud rackspace?
  #
  # === Return
  # true:: If rackspace Hash is defined
  # false:: Otherwise
  def on_rackspace?
    rackspace != nil
  end

  # Fill cloud hash with rackspace values
  def get_rackspace_values
    cloud[:public_ips] << rackspace["public_ipv4"] if rackspace["public_ipv4"]
    cloud[:private_ips] << rackspace["local_ipv4"] if rackspace["local_ipv4"]
    cloud[:public_ipv4] = rackspace["public_ipv4"]
    cloud[:public_ipv6] = rackspace["public_ipv6"]
    cloud[:public_hostname] = rackspace["public_hostname"]
    cloud[:local_ipv4] = rackspace["local_ipv4"]
    cloud[:local_ipv6] = rackspace["local_ipv6"]
    cloud[:local_hostname] = rackspace["local_hostname"]
    cloud[:provider] = "rackspace"
  end

  # ----------------------------------------
  # linode
  # ----------------------------------------

  # Is current cloud linode?
  #
  # === Return
  # true:: If linode Hash is defined
  # false:: Otherwise
  def on_linode?
    linode != nil
  end

  # Fill cloud hash with linode values
  def get_linode_values
    cloud[:public_ips] << linode["public_ip"]
    cloud[:private_ips] << linode["private_ip"]
    cloud[:public_ipv4] = linode["public_ipv4"]
    cloud[:public_hostname] = linode["public_hostname"]
    cloud[:local_ipv4] = linode["local_ipv4"]
    cloud[:local_hostname] = linode["local_hostname"]
    cloud[:provider] = "linode"
  end

  # ----------------------------------------
  # eucalyptus
  # ----------------------------------------

  # Is current cloud eucalyptus?
  #
  # === Return
  # true:: If eucalyptus Hash is defined
  # false:: Otherwise
  def on_eucalyptus?
    eucalyptus != nil
  end

  def get_eucalyptus_values
    cloud[:public_ips] << eucalyptus["public_ipv4"]
    cloud[:private_ips] << eucalyptus["local_ipv4"]
    cloud[:public_ipv4] = eucalyptus["public_ipv4"]
    cloud[:public_hostname] = eucalyptus["public_hostname"]
    cloud[:local_ipv4] = eucalyptus["local_ipv4"]
    cloud[:local_hostname] = eucalyptus["local_hostname"]
    cloud[:provider] = "eucalyptus"
  end

  # ----------------------------------------
  # openstack
  # ----------------------------------------

  # Is current cloud openstack-based?
  #
  # === Return
  # true:: If openstack Hash is defined
  # false:: Otherwise
  def on_openstack?
    openstack != nil
  end

  # Fill cloud hash with openstack values
  def get_openstack_values
    cloud[:public_ips] << openstack["public_ipv4"]
    cloud[:private_ips] << openstack["local_ipv4"]
    cloud[:public_ipv4] = openstack["public_ipv4"]
    cloud[:public_hostname] = openstack["public_hostname"]
    cloud[:local_ipv4] = openstack["local_ipv4"]
    cloud[:local_hostname] = openstack["local_hostname"]
    cloud[:provider] = openstack["provider"]
  end

  # ----------------------------------------
  # azure
  # ----------------------------------------

  # Is current cloud azure?
  #
  # === Return
  # true:: If azure Hash is defined
  # false:: Otherwise
  def on_azure?
    azure != nil
  end

  # Fill cloud hash with azure values
  def get_azure_values
    cloud[:vm_name] = azure["vm_name"]
    cloud[:private_ips] << azure["private_ip"]
    cloud[:public_ips] << azure["public_ip"]
    cloud[:public_ipv4] = azure["public_ip"]
    cloud[:public_fqdn] = azure["public_fqdn"]
    cloud[:public_hostname] = azure["public_fqdn"]
    cloud[:public_ssh_port] = azure["public_ssh_port"] if azure["public_ssh_port"]
    cloud[:public_winrm_port] = azure["public_winrm_port"] if azure["public_winrm_port"]
    cloud[:provider] = "azure"
  end

  # ----------------------------------------
  # digital_ocean
  # ----------------------------------------

  # Is current cloud digital_ocean?
  #
  # === Return
  # true:: If digital_ocean Mash is defined
  # false:: Otherwise
  def on_digital_ocean?
    digital_ocean != nil
  end

  # Fill cloud hash with linode values
  def get_digital_ocean_values
    public_ipv4 = digital_ocean["networks"]["v4"].select { |address| address["type"] == "public" }
    private_ipv4 = digital_ocean["networks"]["v4"].select { |address| address["type"] == "private" }
    public_ipv6 = digital_ocean["networks"]["v6"].select { |address| address["type"] == "public" }
    private_ipv6 = digital_ocean["networks"]["v6"].select { |address| address["type"] == "private" }
    cloud[:public_ips].concat public_ipv4 + public_ipv6
    cloud[:private_ips].concat private_ipv4 + private_ipv6
    cloud[:public_ipv4] = public_ipv4.first
    cloud[:public_ipv6] = public_ipv6.first
    cloud[:local_ipv4] = private_ipv4.first
    cloud[:local_ipv6] = private_ipv6.first
    cloud[:public_hostname] = digital_ocean["name"]
    cloud[:provider] = "digital_ocean"
  end

  # ----------------------------------------
  # softlayer
  # ----------------------------------------

  # Is current cloud softlayer?
  #
  # === Return
  # true:: If softlayer Hash is defined
  # false:: Otherwise
  def on_softlayer?
    softlayer != nil
  end

  # Fill cloud hash with softlayer values
  def get_softlayer_values
    cloud[:public_ipv4] = softlayer["public_ipv4"]
    cloud[:local_ipv4] = softlayer["local_ipv4"]
    cloud[:public_ips] << softlayer["public_ipv4"] if softlayer["public_ipv4"]
    cloud[:private_ips] << softlayer["local_ipv4"] if softlayer["local_ipv4"]
    cloud[:public_hostname] = softlayer["public_fqdn"]
    cloud[:provider] = "softlayer"
  end

  collect_data do
    # setup gce cloud
    if on_gce?
      create_objects
      get_gce_values
    end

    # setup ec2 cloud
    if on_ec2?
      create_objects
      get_ec2_values
    end

    # setup rackspace cloud
    if on_rackspace?
      create_objects
      get_rackspace_values
    end

    # setup linode cloud data
    if on_linode?
      create_objects
      get_linode_values
    end

    if on_eucalyptus?
      create_objects
      get_eucalyptus_values
    end

    # setup openstack cloud
    if on_openstack?
      create_objects
      get_openstack_values
    end

    # setup azure cloud data
    if on_azure?
      create_objects
      get_azure_values
    end

    # setup digital_ocean cloud data
    if on_digital_ocean?
      create_objects
      get_digital_ocean_values
    end

    # setup softlayer cloud
    if on_softlayer?
      create_objects
      get_softlayer_values
    end
  end
end