Class: Train::Transports::Azure::Connection

Inherits:
BaseConnection
  • Object
show all
Defined in:
lib/train/transports/azure.rb

Constant Summary collapse

DEFAULT_FILE =
::File.join(Dir.home, ".azure", "credentials")

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(options) ⇒ Connection

Returns a new instance of Connection.



33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
# File 'lib/train/transports/azure.rb', line 33

def initialize(options)
  warn("Azure Connection with Train will be deprecated from Train 4")
  @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

Instance Attribute Details

#optionsObject (readonly)

Returns the value of attribute options.



29
30
31
# File 'lib/train/transports/azure.rb', line 29

def options
  @options
end

Instance Method Details

#azure_client(klass = ::Azure::Resources::Profiles::Latest::Mgmt::Client, opts = {}) ⇒ Object



63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
# File 'lib/train/transports/azure.rb', line 63

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

#connectObject



84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
# File 'lib/train/transports/azure.rb', line 84

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) ⇒ Object

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.

Parameters:

  • string

    resource_type The resource type for which the API is required

  • hash

    options Options have that have been passed to the resource during the test.

  • opts (Hash)

    a customizable set of options

Returns:

  • string API Version of the specified resource type



128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
# File 'lib/train/transports/azure.rb', line 128

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?Boolean

Returns:

  • (Boolean)


159
160
161
# File 'lib/train/transports/azure.rb', line 159

def msi_auth?
  @options[:client_id].nil? && @options[:client_secret].nil? && port_open?(@options[:msi_port])
end

#platformObject



59
60
61
# File 'lib/train/transports/azure.rb', line 59

def platform
  force_platform!("azure", @platform_details)
end

#unique_identifierObject



155
156
157
# File 'lib/train/transports/azure.rb', line 155

def unique_identifier
  options[:subscription_id] || options[:tenant_id]
end

#uriObject



106
107
108
# File 'lib/train/transports/azure.rb', line 106

def uri
  "azure://#{@options[:subscription_id]}"
end