Class: VagrantDockerNetworksManager::NetworkBuilder

Inherits:
Object
  • Object
show all
Defined in:
lib/vagrant-docker-networks-manager/network_builder.rb

Constant Summary collapse

PLUGIN_LABEL =
"com.vagrant.plugin"
PLUGIN_NAME =
"docker_networks_manager"

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(config, machine_id: nil) ⇒ NetworkBuilder

Returns a new instance of NetworkBuilder.



10
11
12
13
# File 'lib/vagrant-docker-networks-manager/network_builder.rb', line 10

def initialize(config, machine_id: nil)
  @config     = config
  @machine_id = machine_id
end

Class Method Details

.create_args(name:, driver: nil, labels: {}, ipam: [], ipv6: false, attachable: false, parent: nil) ⇒ Array<String>

Builds arguments for docker network create.

Accepts both plugin config keys and Docker inspect-style IPAM keys so callers can create fresh networks or recreate existing networks from inspected state.

Parameters:

  • name (String)

    Docker network name.

  • driver (String, nil) (defaults to: nil)

    Docker network driver.

  • labels (Hash{String=>String}) (defaults to: {})

    Docker labels to attach to the network.

  • ipam (Array<Hash>) (defaults to: [])

    IPAM configuration hashes.

  • ipv6 (Boolean) (defaults to: false)

    Whether to enable IPv6.

  • attachable (Boolean) (defaults to: false)

    Whether standalone containers can attach.

  • parent (String, nil) (defaults to: nil)

    Parent interface for macvlan/ipvlan.

Returns:

  • (Array<String>)

    Arguments passed after docker.



55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
# File 'lib/vagrant-docker-networks-manager/network_builder.rb', line 55

def self.create_args(name:, driver: nil, labels: {}, ipam: [],
                     ipv6: false, attachable: false, parent: nil)
  args = ["network", "create"]

  labels.each { |k, v| args += ["--label", "#{k}=#{v}"] if k && v }
  args += ["--driver", driver] if present?(driver)

  Array(ipam).each do |c|
    subnet   = c[:subnet]   || c["Subnet"]
    gateway  = c[:gateway]  || c["Gateway"]
    ip_range = c[:ip_range] || c["IPRange"]
    args += ["--subnet",   subnet]   if present?(subnet)
    args += ["--gateway",  gateway]  if present?(gateway)
    args += ["--ip-range", ip_range] if present?(ip_range)
  end

  args << "--ipv6"       if ipv6
  args << "--attachable" if attachable
  args += ["--opt", "parent=#{parent}"] if %w[macvlan ipvlan].include?(driver.to_s) && present?(parent)

  args << name.to_s
  args
end

.present?(val) ⇒ Boolean

Returns:

  • (Boolean)


79
80
81
# File 'lib/vagrant-docker-networks-manager/network_builder.rb', line 79

def self.present?(val)
  !val.nil? && !(val.respond_to?(:empty?) && val.empty?)
end

Instance Method Details

#build_create_commandObject



37
38
39
# File 'lib/vagrant-docker-networks-manager/network_builder.rb', line 37

def build_create_command
  build_create_command_args.shelljoin
end

#build_create_command_argsArray<String>

Builds docker network create arguments from plugin configuration.

Labels are the ownership contract used later for safe adoption and cleanup.

Returns:

  • (Array<String>)

    Arguments passed after docker.



20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# File 'lib/vagrant-docker-networks-manager/network_builder.rb', line 20

def build_create_command_args
  labels = { PLUGIN_LABEL => PLUGIN_NAME }
  labels["com.vagrant.machine_id"] = @machine_id if @machine_id

  self.class.create_args(
    name: @config.network_name.to_s,
    driver: @config.network_type,
    labels: labels,
    ipam: [{ subnet: @config.network_subnet,
             gateway: @config.network_gateway,
             ip_range: @config.ip_range }],
    ipv6: truthy?(@config.enable_ipv6),
    attachable: truthy?(@config.network_attachable),
    parent: @config.network_parent
  )
end