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