|
| 1 | +module Puppet::ResourceApi; end # rubocop:disable Style/Documentation |
| 2 | + |
| 3 | +# Remote target transport API |
| 4 | +module Puppet::ResourceApi::Transport |
| 5 | + def register(schema) |
| 6 | + raise Puppet::DevError, 'requires a hash as schema, not `%{other_type}`' % { other_type: schema.class } unless schema.is_a? Hash |
| 7 | + raise Puppet::DevError, 'requires a `:name`' unless schema.key? :name |
| 8 | + raise Puppet::DevError, 'requires `:desc`' unless schema.key? :desc |
| 9 | + raise Puppet::DevError, 'requires `:connection_info`' unless schema.key? :connection_info |
| 10 | + raise Puppet::DevError, '`:connection_info` must be a hash, not `%{other_type}`' % { other_type: schema[:connection_info].class } unless schema[:connection_info].is_a?(Hash) |
| 11 | + |
| 12 | + init_transports |
| 13 | + unless @transports[@environment][schema[:name]].nil? |
| 14 | + raise Puppet::DevError, 'Transport `%{name}` is already registered for `%{environment}`' % { |
| 15 | + name: schema[:name], |
| 16 | + environment: @environment, |
| 17 | + } |
| 18 | + end |
| 19 | + @transports[@environment][schema[:name]] = Puppet::ResourceApi::TransportSchemaDef.new(schema) |
| 20 | + end |
| 21 | + module_function :register # rubocop:disable Style/AccessModifierDeclarations |
| 22 | + |
| 23 | + # retrieve a Hash of transport schemas, keyed by their name. |
| 24 | + def list |
| 25 | + init_transports |
| 26 | + Marshal.load(Marshal.dump(@transports[@environment])) |
| 27 | + end |
| 28 | + module_function :list # rubocop:disable Style/AccessModifierDeclarations |
| 29 | + |
| 30 | + def connect(name, connection_info) |
| 31 | + validate(name, connection_info) |
| 32 | + require "puppet/transport/#{name}" |
| 33 | + class_name = name.split('_').map { |e| e.capitalize }.join |
| 34 | + Puppet::Transport.const_get(class_name).new(get_context(name), wrap_sensitive(name, connection_info)) |
| 35 | + end |
| 36 | + module_function :connect # rubocop:disable Style/AccessModifierDeclarations |
| 37 | + |
| 38 | + def inject_device(name, transport) |
| 39 | + transport_wrapper = Puppet::ResourceApi::Transport::Wrapper.new(name, transport) |
| 40 | + |
| 41 | + if Puppet::Util::NetworkDevice.respond_to?(:set_device) |
| 42 | + Puppet::Util::NetworkDevice.set_device(name, transport_wrapper) |
| 43 | + else |
| 44 | + Puppet::Util::NetworkDevice.instance_variable_set(:@current, transport_wrapper) |
| 45 | + end |
| 46 | + end |
| 47 | + module_function :inject_device # rubocop:disable Style/AccessModifierDeclarations |
| 48 | + |
| 49 | + def self.validate(name, connection_info) |
| 50 | + init_transports |
| 51 | + require "puppet/transport/schema/#{name}" unless @transports[@environment].key? name |
| 52 | + transport_schema = @transports[@environment][name] |
| 53 | + if transport_schema.nil? |
| 54 | + raise Puppet::DevError, 'Transport for `%{target}` not registered with `%{environment}`' % { |
| 55 | + target: name, |
| 56 | + environment: @environment, |
| 57 | + } |
| 58 | + end |
| 59 | + message_prefix = 'The connection info provided does not match the Transport Schema' |
| 60 | + transport_schema.check_schema(connection_info, message_prefix) |
| 61 | + transport_schema.validate(connection_info) |
| 62 | + end |
| 63 | + private_class_method :validate |
| 64 | + |
| 65 | + def self.get_context(name) |
| 66 | + require 'puppet/resource_api/puppet_context' |
| 67 | + Puppet::ResourceApi::PuppetContext.new(@transports[@environment][name]) |
| 68 | + end |
| 69 | + private_class_method :get_context |
| 70 | + |
| 71 | + def self.init_transports |
| 72 | + lookup = Puppet.lookup(:current_environment) if Puppet.respond_to? :lookup |
| 73 | + @environment = if lookup.nil? |
| 74 | + :transports_default |
| 75 | + else |
| 76 | + lookup.name |
| 77 | + end |
| 78 | + @transports ||= {} |
| 79 | + @transports[@environment] ||= {} |
| 80 | + end |
| 81 | + private_class_method :init_transports |
| 82 | + |
| 83 | + def self.wrap_sensitive(name, connection_info) |
| 84 | + transport_schema = @transports[@environment][name] |
| 85 | + if transport_schema |
| 86 | + transport_schema.definition[:connection_info].each do |attr_name, options| |
| 87 | + if options.key?(:sensitive) && (options[:sensitive] == true) |
| 88 | + connection_info[attr_name] = Puppet::Pops::Types::PSensitiveType::Sensitive.new(connection_info[attr_name]) |
| 89 | + end |
| 90 | + end |
| 91 | + end |
| 92 | + connection_info |
| 93 | + end |
| 94 | + private_class_method :wrap_sensitive |
| 95 | +end |
0 commit comments