class GoodData::LCM2::CreateSegmentMasters

Constants

DESCRIPTION
PARAMS

Public Class Methods

call(params) click to toggle source
# File lib/gooddata/lcm/actions/create_segment_masters.rb, line 50
def call(params)
  results = []

  client = params.gdc_gd_client
  development_client = params.development_client

  domain_name = params.organization || params.domain
  fail "Either organisation or domain has to be specified in params" unless domain_name
  domain = client.domain(domain_name) || fail("Invalid domain name specified - #{domain_name}")
  data_product = params.data_product
  domain_segments = domain.segments(:all, data_product)

  # TODO: Support for 'per segment' provisioning
  segments = params.segments

  synchronize_projects = segments.map do |segment_in| # rubocop:disable Metrics/BlockLength
    segment_id = segment_in.segment_id
    development_pid = segment_in.development_pid
    driver = segment_in.driver.downcase
    token = params.tokens[driver.to_sym] || fail("Token for driver '#{driver}' was not specified")
    ads_output_stage_uri = segment_in.ads_output_stage_uri
    ads_output_stage_prefix = segment_in.ads_output_stage_prefix

    # Create master project Postgres
    version = get_project_version(params, domain_name, data_product, segment_id) + 1

    master_name = segment_in.master_name.gsub('#{version}', version.to_s)

    # Get project instance based on PID. Fail if invalid one was specified.
    # TODO: Use development client for getting project
    development_client.projects(development_pid) || fail("Invalid Development PID specified - #{development_pid}")
    segment = domain_segments.find do |ds|
      ds.segment_id == segment_id
    end

    # Create new master project
    params.gdc_logger.info "Creating master project - name: '#{master_name}' development_project: '#{development_pid}', segment: '#{segment_id}', driver: '#{driver}'"
    project = client.create_project(title: master_name, auth_token: token, driver: driver == 'vertica' ? 'vertica' : 'Pg', environment: params.project_environment)

    # Does segment exists? If not, create new one and set initial master
    if segment
      segment_in[:is_new] = false
      status = 'untouched'
    else
      params.gdc_logger.info "Creating segment #{segment_id}, master #{project.pid}"
      segment = data_product.create_segment(segment_id: segment_id, master_project: project)
      segment.synchronize_clients
      segment_in[:is_new] = true
      status = 'created'
    end

    master_project = nil

    begin
      master_project = segment.master_project
    rescue => e
      GoodData.logger.warn "Unable to get segment master, reason: #{e.message}"
    end

    if master_project.nil? || master_project.deleted?
      segment.master_project = project
      segment.save
      segment_in[:is_new] = true
      status = 'modified'
    end

    segment_in[:data_product_id] = data_product.data_product_id
    segment_in[:master_pid] = project.pid
    segment_in[:version] = version
    segment_in[:timestamp] = Time.now.utc.iso8601

    # Show new project
    params.gdc_logger.info JSON.pretty_generate(project.json)

    # Add new segment master project with additional info into output results
    results << {
      segment_id: segment_id,
      name: master_name,
      development_pid: development_pid,
      master_pid: project.pid,
      ads_output_stage_uri: ads_output_stage_uri,
      ads_output_stage_prefix: ads_output_stage_prefix,
      driver: driver,
      status: status
    }

    {
      segment: segment_id,
      from: development_pid,
      to: [{ pid: project.pid }],
      ads_output_stage_uri: ads_output_stage_uri,
      ads_output_stage_prefix: ads_output_stage_prefix
    }
  end

  # Return results
  {
    results: results,
    params: {
      synchronize: synchronize_projects
    }
  }
end
get_project_version(params, domain_name, data_product, segment_id) click to toggle source
# File lib/gooddata/lcm/actions/create_segment_masters.rb, line 154
def get_project_version(params, domain_name, data_product, segment_id)
  if params.ads_client
    current_master = GoodData::LCM2::Helpers.latest_master_project_from_ads(
      params.release_table_name,
      params.ads_client,
      segment_id
    )
  else
    data_product_id = data_product.data_product_id # data_product was populated by CollectDataProduct action already
    current_master = GoodData::LCM2::Helpers.latest_master_project_from_nfs(domain_name, data_product_id, segment_id)
  end
  return 0 unless current_master
  current_master[:version].to_i
end