class Bosh::Director::DeploymentPlan::JobNetworksParser

Public Class Methods

new(properties_that_require_defaults) click to toggle source
# File lib/bosh/director/deployment_plan/job_network_parser.rb, line 9
def initialize(properties_that_require_defaults)
  @properties_that_require_defaults = properties_that_require_defaults
end

Public Instance Methods

parse(job_spec, job_name, manifest_networks) click to toggle source
# File lib/bosh/director/deployment_plan/job_network_parser.rb, line 13
def parse(job_spec, job_name, manifest_networks)
  networks = parse_networks(job_spec, job_name, manifest_networks)
  networks.each do |network|
    validate_default_properties(network, job_name)
  end

  validate_default_networks(networks, job_name)

  networks
end

Private Instance Methods

default_networks_for_properties(networks) click to toggle source
# File lib/bosh/director/deployment_plan/job_network_parser.rb, line 111
def default_networks_for_properties(networks)
  @properties_that_require_defaults.inject({}) do |defaults, property|
    defaults.merge(property => networks.select { |network| network.default_for?(property) })
  end
end
look_up_deployment_network(manifest_networks, job_name, network_name) click to toggle source
# File lib/bosh/director/deployment_plan/job_network_parser.rb, line 43
def look_up_deployment_network(manifest_networks, job_name, network_name)
  deployment_network = manifest_networks.find{ |network| network.name == network_name }
  if deployment_network.nil?
    raise JobUnknownNetwork, "Instance group '#{job_name}' references an unknown network '#{network_name}'"
  end
  deployment_network
end
parse_networks(job_spec, job_name, manifest_networks) click to toggle source
# File lib/bosh/director/deployment_plan/job_network_parser.rb, line 26
def parse_networks(job_spec, job_name, manifest_networks)
  network_specs = safe_property(job_spec, "networks", :class => Array)
  if network_specs.empty?
    raise JobMissingNetwork, "Instance group '#{job_name}' must specify at least one network"
  end
  network_specs.map do |network_spec|
    network_name = safe_property(network_spec, "name", :class => String)
    default_for = safe_property(network_spec, "default", :class => Array, :default => [])
    static_ips = parse_static_ips(network_spec['static_ips'], job_name)

    deployment_network = look_up_deployment_network(manifest_networks, job_name, network_name)
    deployment_network.validate_reference_from_job!(network_spec, job_name)

    JobNetwork.new(network_name, static_ips, default_for, deployment_network)
  end
end
parse_static_ips(static_ips_raw, job_name) click to toggle source
# File lib/bosh/director/deployment_plan/job_network_parser.rb, line 51
def parse_static_ips(static_ips_raw, job_name)
  static_ips = nil
  if static_ips_raw
    static_ips = []
    each_ip(static_ips_raw) do |ip|
      if static_ips.include?(ip)
        raise JobInvalidStaticIPs, "Instance group '#{job_name}' specifies static IP '#{format_ip(ip)}' more than once"
      end

      static_ips.push(ip)
    end
  end
  static_ips
end
validate_default_network_for_each_property(default_networks_for_properties, job_name) click to toggle source
# File lib/bosh/director/deployment_plan/job_network_parser.rb, line 84
def validate_default_network_for_each_property(default_networks_for_properties, job_name)
  missing_default_properties = default_networks_for_properties.select { |_, networks|
    networks.empty?
  }.map { |property, _|
    property
  }
  unless missing_default_properties.empty?
    raise JobNetworkMissingDefault,
      "Instance group '#{job_name}' must specify which network is default for " +
        missing_default_properties.sort.join(", ") + ", since it has more than one network configured"
  end
end
validate_default_networks(networks, job_name) click to toggle source
# File lib/bosh/director/deployment_plan/job_network_parser.rb, line 76
def validate_default_networks(networks, job_name)
  networks.first.make_default_for(@properties_that_require_defaults) if networks.count == 1

  default_networks_for_properties = default_networks_for_properties(networks)
  validate_only_one_default_network(default_networks_for_properties, job_name)
  validate_default_network_for_each_property(default_networks_for_properties, job_name)
end
validate_default_properties(network, job_name) click to toggle source
# File lib/bosh/director/deployment_plan/job_network_parser.rb, line 66
def validate_default_properties(network, job_name)
  network.properties_for_which_the_network_is_the_default.each do |property|
    unless @properties_that_require_defaults.include?(property)
      raise JobNetworkInvalidDefault,
        "Instance group '#{job_name}' specified an invalid default network property '#{property}', " +
          "valid properties are: " + @properties_that_require_defaults.join(", ")
    end
  end
end
validate_only_one_default_network(default_networks_for_properties, job_name) click to toggle source
# File lib/bosh/director/deployment_plan/job_network_parser.rb, line 97
def validate_only_one_default_network(default_networks_for_properties, job_name)
  multiple_defaults = default_networks_for_properties.select { |_, networks|
    networks.count > 1
  }
  unless multiple_defaults.empty?
    message_for_each_property = multiple_defaults.map do |property, networks|
      quoted_network_names = networks.map { |network| "'#{network.name}'" }.join(', ')
      "'#{property}' has default networks: #{quoted_network_names}."
    end
    raise JobNetworkMultipleDefaults,
      "Instance group '#{job_name}' specified more than one network to contain default. #{message_for_each_property.join(' ')}"
  end
end