class GoodData::LCM2::SynchronizeClients

Constants

DESCRIPTION
PARAMS
RESULT_HEADER

Public Class Methods

call(params) click to toggle source
# File lib/gooddata/lcm/actions/synchronize_clients.rb, line 63
def call(params)
  client = params.gdc_gd_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)
  keep_only_previous_masters_count = Integer(params.keep_only_previous_masters_count || "-1")

  segments = params.segments.map do |seg|
    domain_segments.find do |s|
      s.segment_id == seg.segment_id
    end
  end

  results = segments.map do |segment|
    next if sync_failed_segment(segment.segment_id, params)

    if params.ads_client
      master_projects = GoodData::LCM2::Helpers.get_master_project_list_from_ads(params.release_table_name, params.ads_client, segment.segment_id)
    else
      master_projects = GoodData::LCM2::Helpers.get_master_project_list_from_nfs(domain_name, data_product.data_product_id, segment.segment_id)
    end

    current_master = master_projects.last
    # TODO: Check res.first.nil? || res.first[:master_project_id].nil?
    master = client.projects(current_master[:master_project_id])
    segment.master_project = master
    segment.save

    res = segment.synchronize_clients

    sync_result = res.json['synchronizationResult']
    failed_count = sync_result['failedClients']['count']

    if failed_count.to_i > 0
      error_handle(segment, res, collect_synced_status(params), params)
    end

    if keep_only_previous_masters_count >= 0
      number_of_deleted_projects = master_projects.count - (keep_only_previous_masters_count + 1)

      if number_of_deleted_projects.positive?
        begin
          removal_master_project_ids = remove_multiple_workspace(params, segment.segment_id, master_projects, number_of_deleted_projects)
          remove_old_workspaces_from_release_table(params, domain_name, data_product.data_product_id, segment.segment_id, master_projects, removal_master_project_ids)
        rescue Exception => e # rubocop:disable RescueException
          GoodData.logger.error "Problem occurs when removing old master workspace, reason: #{e.message}"
        end
      end
    end

    {
      segment: segment.id,
      master_pid: master.nil? ? '' : master.pid,
      master_name: master.nil? ? '' : master.title,
      successful_count: sync_result['successfulClients']['count']
    }
  end

  # Return results
  results
end
remove_multiple_workspace(params, segment_id, master_projects, number_of_deleted_projects) click to toggle source
# File lib/gooddata/lcm/actions/synchronize_clients.rb, line 128
def remove_multiple_workspace(params, segment_id, master_projects, number_of_deleted_projects)
  removal_master_project_ids = []
  need_to_delete_projects = master_projects.take(number_of_deleted_projects)

  need_to_delete_projects.each do |project_wrapper|
    master_project_id = project_wrapper[:master_project_id]
    next if master_project_id.to_s.empty?

    begin
      project = params.gdc_gd_client.projects(master_project_id)
      if project && !%w[deleted archived].include?(project.state.to_s)
        GoodData.logger.info "Segment #{segment_id}: Deleting old master workspace, project: '#{project.title}', PID: (#{project.pid})."
        project.delete
      end
      removal_master_project_ids << master_project_id
      master_projects.delete_if { |p| p[:master_project_id] == master_project_id }
    rescue Exception => ex # rubocop:disable RescueException
      GoodData.logger.error "Unable to remove master workspace: '#{master_project_id}', Error: #{ex.message}"
    end
  end
  removal_master_project_ids
end
remove_old_workspaces_from_release_table(params, domain_id, data_product_id, segment_id, master_projects, removal_master_project_ids) click to toggle source

rubocop:disable Metrics/ParameterLists

# File lib/gooddata/lcm/actions/synchronize_clients.rb, line 152
def remove_old_workspaces_from_release_table(params, domain_id, data_product_id, segment_id, master_projects, removal_master_project_ids)
  unless removal_master_project_ids.empty?
    if params.ads_client
      GoodData::LCM2::Helpers.delete_master_project_from_ads(params.release_table_name, params.ads_client, segment_id, removal_master_project_ids)
    else
      data = master_projects.sort_by { |master| master[:version] }
      GoodData::LCM2::Helpers.update_master_project_to_nfs(domain_id, data_product_id, segment_id, data)
    end
  end
end

Private Class Methods

error_handle(segment, error_result, continue_on_error, params) click to toggle source

rubocop:enable Metrics/ParameterLists

# File lib/gooddata/lcm/actions/synchronize_clients.rb, line 166
def error_handle(segment, error_result, continue_on_error, params)
  sync_result = error_result.json['synchronizationResult']
  success_count = sync_result['successfulClients']['count'].to_i
  failed_count = sync_result['failedClients']['count'].to_i

  # Synchronize failure for all clients in segment
  if continue_on_error && success_count.zero? && failed_count.positive?
    segment_warning_message = "Failed to synchronize clients for #{segment.segment_id} segment. Details: #{sync_result['links']['details']}"
    add_failed_segment(segment.segment_id, segment_warning_message, short_name, params)
    return
  end

  summary_error_message = "#{failed_count} clients failed to synchronize. Details: #{sync_result['links']['details']}"
  fail(summary_error_message) unless continue_on_error

  GoodData.logger.warn summary_error_message
  if error_result.details # rubocop:disable Style/SafeNavigation
    error_result.details.items.each do |item|
      next if item['status'] == 'OK'

      error_client_id = item['id']
      error_message = error_message(item, segment)
      add_failed_client(error_client_id, error_message, short_name, params)
    end
  end
end
error_message(error_item, segment) click to toggle source
# File lib/gooddata/lcm/actions/synchronize_clients.rb, line 193
def error_message(error_item, segment)
  error_client_id = error_item['id']
  error_message = "Failed to synchronize #{error_client_id} client in #{segment.segment_id} segment."
  error_message = "#{error_message}. Detail: #{error_item['error']['message']}" if error_item['error'] && error_item['error']['message']

  error_message = "#{error_message}. Error items: #{error_item['error']['parameters']}" if error_item['error'] && error_item['error']['parameters']

  error_message
end