Class: Bolt::Target

Inherits:
Object
  • Object
show all
Defined in:
lib/bolt/target.rb

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(uri, options = nil) ⇒ Target

URI can be passes as nil



163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
# File 'lib/bolt/target.rb', line 163

def initialize(uri, options = nil)
  # lazy-load expensive gem code
  require 'addressable/uri'

  @uri = uri
  @uri_obj = parse(uri)
  @options = options || {}
  @options.freeze

  if @options['user']
    @user = @options['user']
  end

  if @options['password']
    @password = @options['password']
  end

  if @options['port']
    @port = @options['port']
  end

  if @options['protocol']
    @protocol = @options['protocol']
  end

  if @options['host']
    @host = @options['host']
  end

  # WARNING: name should never be updated
  @name = @options['name'] || @uri
end

Instance Attribute Details

#inventoryObject

CODEREVIEW: this feels wrong. The altertative is threading inventory through the executor to the RemoteTransport



153
154
155
# File 'lib/bolt/target.rb', line 153

def inventory
  @inventory
end

#optionsObject (readonly)

Returns the value of attribute options.



150
151
152
# File 'lib/bolt/target.rb', line 150

def options
  @options
end

#uriObject

CODEREVIEW: this feels wrong. The altertative is threading inventory through the executor to the RemoteTransport



153
154
155
# File 'lib/bolt/target.rb', line 153

def uri
  @uri
end

Class Method Details

.from_asserted_hash(hash) ⇒ Object

Satisfies the Puppet datatypes API



158
159
160
# File 'lib/bolt/target.rb', line 158

def self.from_asserted_hash(hash)
  new(hash['uri'], hash['options'])
end

Instance Method Details

#detailObject



287
288
289
290
291
292
293
294
295
296
297
298
299
300
# File 'lib/bolt/target.rb', line 287

def detail
  {
    'name' => name,
    'alias' => target_alias,
    'config' => {
      'transport' => transport,
      transport => options
    },
    'vars' => vars,
    'facts' => facts,
    'features' => features.to_a,
    'plugin_hooks' => plugin_hooks
  }
end

#eql?(other) ⇒ Boolean Also known as: ==

TODO: WHAT does equality mean here? should we just compare names? is there something else that is meaninful?

Returns:

  • (Boolean)


257
258
259
260
261
262
263
# File 'lib/bolt/target.rb', line 257

def eql?(other)
  if self.class.equal?(other.class)
    @uri ? @uri == other.uri : @name == other.name
  else
    false
  end
end

#factsObject



247
248
249
# File 'lib/bolt/target.rb', line 247

def facts
  @inventory.facts(self)
end

#featuresObject Also known as: feature_set



226
227
228
229
230
231
232
# File 'lib/bolt/target.rb', line 226

def features
  if @inventory
    @inventory.features(self)
  else
    Set.new
  end
end

#hashObject



266
267
268
# File 'lib/bolt/target.rb', line 266

def hash
  @uri.hash ^ @options.hash
end

#hostObject Also known as: safe_name



302
303
304
# File 'lib/bolt/target.rb', line 302

def host
  @uri_obj&.hostname || @host
end

#nameObject



307
308
309
# File 'lib/bolt/target.rb', line 307

def name
  @name || @uri
end

#passwordObject



332
333
334
# File 'lib/bolt/target.rb', line 332

def password
  Addressable::URI.unencode_component(@uri_obj&.password) || @password
end

#plugin_hooksObject



235
236
237
238
239
240
241
# File 'lib/bolt/target.rb', line 235

def plugin_hooks
  if @inventory
    @inventory.plugin_hooks(self)
  else
    {}
  end
end

#portObject



315
316
317
# File 'lib/bolt/target.rb', line 315

def port
  @uri_obj&.port || @port
end

#protocolObject



324
325
326
# File 'lib/bolt/target.rb', line 324

def protocol
  @uri_obj&.scheme || @protocol
end

#remote?Boolean

Returns:

  • (Boolean)


311
312
313
# File 'lib/bolt/target.rb', line 311

def remote?
  @uri_obj&.scheme == 'remote' || @protocol == 'remote'
end

#target_aliasObject



251
252
253
# File 'lib/bolt/target.rb', line 251

def target_alias
  @inventory.target_alias(self)
end

#to_hObject



275
276
277
278
279
280
281
282
283
284
285
# File 'lib/bolt/target.rb', line 275

def to_h
  options.merge(
    'name' => name,
    'uri' => uri,
    'protocol' => protocol,
    'user' => user,
    'password' => password,
    'host' => host,
    'port' => port
  )
end

#to_sObject



270
271
272
273
# File 'lib/bolt/target.rb', line 270

def to_s
  opts = @options.select { |k, _| PRINT_OPTS.include? k }
  "Target('#{@uri}', #{opts})"
end

#transportObject

transport is separate from protocol for remote targets.



320
321
322
# File 'lib/bolt/target.rb', line 320

def transport
  remote? ? 'remote' : protocol
end

#update_conf(conf) ⇒ Object



196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
# File 'lib/bolt/target.rb', line 196

def update_conf(conf)
  @protocol = conf[:transport]

  t_conf = conf[:transports][transport.to_sym] || {}
  # Override url methods
  @user = t_conf['user']
  @password = t_conf['password']
  @port = t_conf['port']
  @host = t_conf['host']

  # Preserve everything in options so we can easily create copies of a Target.
  @options = t_conf.merge(@options)

  self
end

#userObject



328
329
330
# File 'lib/bolt/target.rb', line 328

def user
  Addressable::URI.unencode_component(@uri_obj&.user) || @user
end

#varsObject



243
244
245
# File 'lib/bolt/target.rb', line 243

def vars
  @inventory.vars(self)
end