class Train::Transports::Azure::Connection

Constants

DEFAULT_FILE

Attributes

options[R]

Public Class Methods

new(options) click to toggle source
Calls superclass method
# File lib/train/transports/azure.rb, line 33
def initialize(options)
  @apis = {}

  # Override for any cli options
  # azure://subscription_id
  options[:subscription_id] = options[:host] || options[:subscription_id]
  super(options)

  @cache_enabled[:api_call] = true
  @cache[:api_call] = {}

  if @options[:client_secret].nil? && @options[:client_id].nil?
    options[:credentials_file] = DEFAULT_FILE if options[:credentials_file].nil?
    @options.merge!(Helpers::Azure::FileCredentials.parse(**@options))
  end

  @options[:msi_port] = @options[:msi_port].to_i unless @options[:msi_port].nil?

  # additional platform details
  release = Gem.loaded_specs["azure_mgmt_resources"].version
  @platform_details = { release: "azure_mgmt_resources-v#{release}" }

  connect
end

Public Instance Methods

azure_client(klass = ::Azure::Resources::Profiles::Latest::Mgmt::Client, opts = {}) click to toggle source
# File lib/train/transports/azure.rb, line 62
def azure_client(klass = ::Azure::Resources::Profiles::Latest::Mgmt::Client, opts = {})
  if cache_enabled?(:api_call)
    return @cache[:api_call][klass.to_s.to_sym] unless @cache[:api_call][klass.to_s.to_sym].nil?
  end

  if klass == ::Azure::Resources::Profiles::Latest::Mgmt::Client
    @credentials[:base_url] = MsRestAzure::AzureEnvironments::AzureCloud.resource_manager_endpoint_url
  elsif klass == ::Azure::GraphRbac::Profiles::Latest::Client
    client = GraphRbac.client(@credentials)
  elsif klass == ::Azure::KeyVault::Profiles::Latest::Mgmt::Client
    client = Vault.client(opts[:vault_name], @credentials)
  end

  client ||= klass.new(@credentials)

  # Cache if enabled
  @cache[:api_call][klass.to_s.to_sym] ||= client if cache_enabled?(:api_call)

  client
end
connect() click to toggle source
# File lib/train/transports/azure.rb, line 83
def connect
  if msi_auth?
    # this needs set for azure cloud to authenticate
    ENV["MSI_VM"] = "true"
    provider = ::MsRestAzure::MSITokenProvider.new(@options[:msi_port])
  else
    provider = ::MsRestAzure::ApplicationTokenProvider.new(
      @options[:tenant_id],
      @options[:client_id],
      @options[:client_secret]
    )
  end

  @credentials = {
    credentials: ::MsRest::TokenCredentials.new(provider),
    subscription_id: @options[:subscription_id],
    tenant_id: @options[:tenant_id],
  }
  @credentials[:client_id] = @options[:client_id] unless @options[:client_id].nil?
  @credentials[:client_secret] = @options[:client_secret] unless @options[:client_secret].nil?
end
get_api_version(resource_type, options) click to toggle source

Returns the api version for the specified resource type

If an api version has been specified in the options then the apis version table is updated with that value and it is returned

However if it is not specified, or multiple types are being interrogated then this method will interrogate Azure for each of the types versions and pick the latest one. This is added to the apis table so that it can be retrieved quickly again of another one of those resources is encountered again in the resource collection.

@param string resource_type The resource type for which the API is required @param hash options Options have that have been passed to the resource during the test. @option opts [String] :group_name Resource group name @option opts [String] :type Azure resource type @option opts [String] :name Name of specific resource to look for @option opts [String] :apiversion If looking for a specific item or type specify the api version to use

@return string API Version of the specified resource type

# File lib/train/transports/azure.rb, line 127
def get_api_version(resource_type, options)
  # if an api version has been set in the options, add to the apis hashtable with
  # the resource type
  if options[:apiversion]
    @apis[resource_type] = options[:apiversion]
  else
    # only attempt to get the api version from Azure if the resource type
    # is not present in the apis hashtable
    unless @apis.key?(resource_type)

      # determine the namespace for the resource type
      namespace, type = resource_type.split(%r{/})

      client = azure_client(::Azure::Resources::Profiles::Latest::Mgmt::Client)
      provider = client.providers.get(namespace)

      # get the latest API version for the type
      # assuming that this is the first one in the list
      api_versions = (provider.resource_types.find { |v| v.resource_type == type }).api_versions
      @apis[resource_type] = api_versions[0]
    end
  end

  # return the api version for the type
  @apis[resource_type]
end
msi_auth?() click to toggle source
# File lib/train/transports/azure.rb, line 158
def msi_auth?
  @options[:client_id].nil? && @options[:client_secret].nil? && port_open?(@options[:msi_port])
end
platform() click to toggle source
# File lib/train/transports/azure.rb, line 58
def platform
  force_platform!("azure", @platform_details)
end
unique_identifier() click to toggle source
# File lib/train/transports/azure.rb, line 154
def unique_identifier
  options[:subscription_id] || options[:tenant_id]
end
uri() click to toggle source
# File lib/train/transports/azure.rb, line 105
def uri
  "azure://#{@options[:subscription_id]}"
end

Private Instance Methods

port_open?(port, seconds = 3) click to toggle source
# File lib/train/transports/azure.rb, line 164
def port_open?(port, seconds = 3)
  Timeout.timeout(seconds) do
    TCPSocket.new("localhost", port).close
    true
  rescue SystemCallError
    false
  end
rescue Timeout::Error
  false
end