@@ -261,20 +261,25 @@ def transfer_etl(client, from_project, to_project)
261261 # @option ads_output_stage_uri Uri of the source output stage. It must be in the same domain as the target project.
262262 def transfer_processes ( from_project , to_project , options = { } )
263263 options = GoodData ::Helpers . symbolize_keys ( options )
264+ aliases = { }
264265 to_project_processes = to_project . processes
265266 additional_hidden_params = options [ :additional_hidden_params ] || { }
266267 result = from_project . processes . uniq ( &:name ) . map do |process |
267- fail "The process name #{ process . name } must be unique in transfered project #{ to_project } " if to_project_processes . count { |p | p . name == process . name } > 1
268+ fail "The process name #{ process . name } must be unique in transferred project #{ to_project } " if to_project_processes . count { |p | p . name == process . name } > 1
268269 next if process . type == :dataload || process . add_v2_component?
270+ collect_process_aliases ( process . data , from_project . client , aliases )
269271
270272 to_process = to_project_processes . find { |p | p . name == process . name }
271273
274+ data_sources = GoodData ::Helpers . symbolize_keys_recursively! ( process . data_sources )
275+ data_sources = replace_data_source_ids ( data_sources , to_project . client , aliases )
272276 to_process = if process . path
273277 to_process . delete if to_process
274- Process . deploy_from_appstore ( process . path , name : process . name , client : to_project . client , project : to_project , data_sources : process . data_sources )
278+ Process . deploy_from_appstore ( process . path , name : process . name , client : to_project . client , project : to_project , data_sources : data_sources )
275279 elsif process . component
276280 to_process . delete if to_process
277281 process_hash = GoodData ::Helpers ::DeepMergeableHash [ GoodData ::Helpers . symbolize_keys ( process . to_hash ) ] . deep_merge ( additional_hidden_params )
282+ process_hash = replace_process_data_source_ids ( process_hash , to_project . client , aliases )
278283 Process . deploy_component ( process_hash , project : to_project , client : to_project . client )
279284 else
280285 Dir . mktmpdir ( 'etl_transfer' ) do |dir |
@@ -283,11 +288,10 @@ def transfer_processes(from_project, to_project, options = {})
283288 File . open ( filename , 'w' ) do |f |
284289 f << process . download
285290 end
286-
287291 if to_process
288- to_process . deploy ( filename , type : process . type , name : process . name , data_sources : process . data_sources )
292+ to_process . deploy ( filename , type : process . type , name : process . name , data_sources : data_sources )
289293 else
290- to_project . deploy_process ( filename , type : process . type , name : process . name , data_sources : process . data_sources )
294+ to_project . deploy_process ( filename , type : process . type , name : process . name , data_sources : data_sources )
291295 end
292296 end
293297 end
@@ -318,6 +322,56 @@ def transfer_processes(from_project, to_project, options = {})
318322 result . compact
319323 end
320324
325+ def collect_process_aliases ( process_data , client , aliases )
326+ data_sources = process_data . dig ( 'process' , 'dataSources' )
327+ unless data_sources . blank?
328+ data_sources . map do |data_source |
329+ get_data_source_alias ( data_source [ 'id' ] , client , aliases )
330+ end
331+ end
332+ component = process_data . dig ( 'process' , 'component' )
333+ get_data_source_alias ( component [ 'configLocation' ] [ 'dataSourceConfig' ] [ 'id' ] , client , aliases ) if component &.dig ( 'configLocation' , 'dataSourceConfig' )
334+ aliases
335+ end
336+
337+ def get_data_source_alias ( data_source_id , client , aliases )
338+ unless aliases [ data_source_id ]
339+ data_source = GoodData ::Helpers . get_data_source_by_id ( data_source_id , client )
340+ if data_source &.dig ( 'dataSource' , 'alias' )
341+ aliases [ data_source_id ] = {
342+ :type => get_data_source_type ( data_source ) ,
343+ :alias => data_source [ 'dataSource' ] [ 'alias' ]
344+ }
345+ end
346+ end
347+ aliases [ data_source_id ]
348+ end
349+
350+ def get_data_source_type ( data_source_data )
351+ data_source_data &.dig ( 'dataSource' , 'connectionInfo' ) ? data_source_data [ 'dataSource' ] [ 'connectionInfo' ] . first [ 0 ] . upcase : ""
352+ end
353+
354+ def replace_process_data_source_ids ( process_data , client , aliases )
355+ component = process_data . dig ( :process , :component )
356+ if component &.dig ( :configLocation , :dataSourceConfig )
357+ the_alias = aliases [ component [ :configLocation ] [ :dataSourceConfig ] [ :id ] ]
358+ process_data [ :process ] [ :component ] [ :configLocation ] [ :dataSourceConfig ] [ :id ] = GoodData ::Helpers . verify_data_source_alias ( the_alias , client )
359+ end
360+ process_data [ :process ] [ :dataSources ] = replace_data_source_ids ( process_data [ :process ] [ :dataSources ] , client , aliases )
361+ process_data
362+ end
363+
364+ def replace_data_source_ids ( data_sources , client , aliases )
365+ array_data_sources = [ ]
366+ if data_sources && !data_sources . empty?
367+ data_sources . map do |data_source |
368+ new_id = GoodData ::Helpers . verify_data_source_alias ( aliases [ data_source [ :id ] ] , client )
369+ array_data_sources . push ( :id => new_id )
370+ end
371+ end
372+ array_data_sources
373+ end
374+
321375 def transfer_user_groups ( from_project , to_project )
322376 from_project . user_groups . map do |ug |
323377 # migrate groups
0 commit comments