diff --git a/lib/puppet/provider/docker_network/ruby.rb b/lib/puppet/provider/docker_network/ruby.rb index e861095..a1bf071 100644 --- a/lib/puppet/provider/docker_network/ruby.rb +++ b/lib/puppet/provider/docker_network/ruby.rb @@ -1,88 +1,93 @@ # frozen_string_literal: true require 'json' Puppet::Type.type(:docker_network).provide(:ruby) do desc 'Support for Docker Networking' mk_resource_methods commands docker: 'docker' def network_conf flags = ['network', 'create'] multi_flags = ->(values, format) { filtered = [values].flatten.compact filtered.map { |val| format % val } } [ ['--driver=%s', :driver], ['--subnet=%s', :subnet], ['--gateway=%s', :gateway], ['--ip-range=%s', :ip_range], ['--ipam-driver=%s', :ipam_driver], ['--aux-address=%s', :aux_address], ['--opt=%s', :options], - ['%s', :additional_flags], ].each do |(format, key)| values = resource[key] new_flags = multi_flags.call(values, format) flags.concat(new_flags) end + if resource[:additional_flags].is_a?(String) + additional_flags = resource[:additional_flags].split + additional_flags.each do |additional_flag| + flags << additional_flag + end + end flags << resource[:name] end def self.instances output = docker(['network', 'ls']) lines = output.split("\n") lines.shift # remove header row lines.map do |line| _, name, driver = line.split(' ') inspect = docker(['network', 'inspect', name]) obj = JSON.parse(inspect).first ipam_driver = unless obj['IPAM']['Driver'].nil? obj['IPAM']['Driver'] end subnet = unless obj['IPAM']['Config'].nil? || obj['IPAM']['Config'].empty? if obj['IPAM']['Config'].first.key? 'Subnet' obj['IPAM']['Config'].first['Subnet'] end end new( name: name, id: obj['Id'], ipam_driver: ipam_driver, subnet: subnet, ensure: :present, driver: driver, ) end end def self.prefetch(resources) instances.each do |prov| if resource = resources[prov.name] # rubocop:disable Lint/AssignmentInCondition resource.provider = prov end end end def flush raise Puppet::Error, _('Docker network does not support mutating existing networks') if !@property_hash.empty? && @property_hash[:ensure] != :absent end def exists? Puppet.info("Checking if docker network #{name} exists") @property_hash[:ensure] == :present end def create Puppet.info("Creating docker network #{name}") docker(network_conf) end def destroy Puppet.info("Removing docker network #{name}") docker(['network', 'rm', name]) end end diff --git a/spec/unit/lib/puppet/type/docker_network_spec.rb b/spec/unit/lib/puppet/type/docker_network_spec.rb index ed8444b..ed99582 100644 --- a/spec/unit/lib/puppet/type/docker_network_spec.rb +++ b/spec/unit/lib/puppet/type/docker_network_spec.rb @@ -1,38 +1,39 @@ require 'spec_helper' network = Puppet::Type.type(:docker_network) describe network do let :params do [ :name, :provider, :subnet, :gateway, :ip_range, :aux_address, :options, + :additional_flags, ] end let :properties do [ :ensure, :driver, :ipam_driver, :id, ] end it 'has expected properties' do properties.each do |property| expect(network.properties.map(&:name)).to be_include(property) end end it 'has expected parameters' do params.each do |param| expect(network.parameters).to be_include(param) end end end