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)
segments = params.segments
synchronize_projects = segments.map do |segment_in|
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
version = get_project_version(params, domain_name, data_product, segment_id) + 1
master_name = segment_in.master_name.gsub('#{version}', version.to_s)
development_client.projects(development_pid) || fail("Invalid Development PID specified - #{development_pid}")
segment = domain_segments.find do |ds|
ds.segment_id == segment_id
end
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)
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
params.gdc_logger.info JSON.pretty_generate(project.json)
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
{
results: results,
params: {
synchronize: synchronize_projects
}
}
end