class Bosh::Director::DeploymentPlan::RuntimeManifestParser

Public Class Methods

new(logger, deployment=nil) click to toggle source
# File lib/bosh/director/deployment_plan/runtime_manifest_parser.rb, line 6
def initialize(logger, deployment=nil)
  @deployment = deployment
  @logger = logger
end

Public Instance Methods

parse(runtime_manifest) click to toggle source
# File lib/bosh/director/deployment_plan/runtime_manifest_parser.rb, line 11
def parse(runtime_manifest)
  parse_releases(runtime_manifest)
  parse_addons(runtime_manifest)
end

Private Instance Methods

merge_addon(job, addon_jobs, properties) click to toggle source
# File lib/bosh/director/deployment_plan/runtime_manifest_parser.rb, line 129
def merge_addon(job, addon_jobs, properties)
  # iterate through deployment plan instance group jobs and see if any of them are the
  # same name as the addon_job, if they are throw an error, otherwise add to instance group
  if job.templates
    job.templates.each do |job_template|
      addon_jobs.each do |addon_job_template|
        if addon_job_template.name == job_template.name
          raise "Colocated job '#{addon_job_template.name}' is already added to the instance group '#{job.name}'."
        end
      end
    end
    job.templates.concat(addon_jobs)
  else
    job.templates = addon_jobs
  end

  if properties
    if job.all_properties
      job.all_properties.merge!(properties)
    else
      job.all_properties = properties
    end
  end
end
parse_addons(runtime_manifest) click to toggle source
# File lib/bosh/director/deployment_plan/runtime_manifest_parser.rb, line 60
def parse_addons(runtime_manifest)
  addons = safe_property(runtime_manifest, 'addons', :class => Array, :default => [])
  addons.each do |addon_spec|
    deployment_plan_templates = []

    addon_jobs = safe_property(addon_spec, 'jobs', :class => Array, :default => [])

    addon_jobs.each do |addon_job|
      if !@release_specs.find { |release_spec| release_spec['name'] == addon_job['release'] }
        raise RuntimeReleaseNotListedInReleases,
              "Runtime manifest specifies job '#{addon_job['name']}' which is defined in '#{addon_job['release']}', but '#{addon_job['release']}' is not listed in the releases section."
      end

      if @deployment
        valid_release_versions = @deployment.releases.map {|r| r.name }
        deployment_release_ids = Models::Release.where(:name => valid_release_versions).map {|r| r.id}
        deployment_jobs = @deployment.instance_groups

        templates_from_model = Models::Template.where(:name => addon_job['name'], :release_id => deployment_release_ids)
        if templates_from_model == nil
          raise "Job '#{addon_job['name']}' not found in Template table"
        end

        release = @deployment.release(addon_job['release'])
        release.bind_model

        template = DeploymentPlan::Template.new(release, addon_job['name'])

        deployment_jobs.each do |j|
          templates_from_model.each do |template_from_model|
            if template_from_model.consumes != nil
              template_from_model.consumes.each do |consumes|
                template.add_link_from_release(j.name, 'consumes', consumes["name"], consumes)
              end
            end
            if template_from_model.provides != nil
              template_from_model.provides.each do |provides|
                template.add_link_from_release(j.name, 'provides', provides["name"], provides)
              end
            end
          end

          provides_links = safe_property(addon_job, 'provides', class: Hash, optional: true)
          provides_links.to_a.each do |link_name, source|
            template.add_link_from_manifest(j.name, "provides", link_name, source)
          end

          consumes_links = safe_property(addon_job, 'consumes', class: Hash, optional: true)
          consumes_links.to_a.each do |link_name, source|
            template.add_link_from_manifest(j.name, 'consumes', link_name, source)
          end

          if addon_job.has_key?('properties')
            template.add_template_scoped_properties(addon_job['properties'], j.name)
          end
        end

        template.bind_models
        deployment_plan_templates.push(template)

        deployment_jobs.each do |job|
          merge_addon(job, deployment_plan_templates, addon_spec['properties'])
        end

      end
    end
  end
end
parse_releases(runtime_manifest) click to toggle source
# File lib/bosh/director/deployment_plan/runtime_manifest_parser.rb, line 18
def parse_releases(runtime_manifest)
  @release_specs = []

  if runtime_manifest['release']
    if runtime_manifest['releases']
      raise RuntimeAmbiguousReleaseSpec,
            "Runtime manifest contains both 'release' and 'releases' " +
                'sections, please use one of the two.'
    end
    @release_specs << runtime_manifest['release']
  else
    safe_property(runtime_manifest, 'releases', :class => Array).each do |release|
      @release_specs << release
    end
  end

  @release_specs.each do |release_spec|
    if release_spec['version'] =~ /(^|[\._])latest$/
      raise RuntimeInvalidReleaseVersion,
            "Runtime manifest contains the release '#{release_spec['name']}' with version as '#{release_spec['version']}'. " +
                "Please specify the actual version string."
    end

    if @deployment
      deployment_release = @deployment.release(release_spec["name"])
      if deployment_release
        if deployment_release.version != release_spec["version"].to_s
          raise RuntimeInvalidDeploymentRelease, "Runtime manifest specifies release '#{release_spec["name"]}' with version as '#{release_spec["version"]}'. " +
                "This conflicts with version '#{deployment_release.version}' specified in the deployment manifest."
        else
          next
        end
      end

      release_version = DeploymentPlan::ReleaseVersion.new(@deployment.model, release_spec)
      release_version.bind_model

      @deployment.add_release(release_version)
    end
  end
end