Skip to content

Commit f0c90e1

Browse files
author
gdgate
authored
Merge pull request #1682 from sangtm/FEATURE/TMA-1676-release-lcm-across-domain-merge-master
DC-1324: Bump sdk version to 2.1.13 Reviewed-by: Chien Minh Do https://github.com/chiendm
2 parents 8289a72 + 23cf623 commit f0c90e1

File tree

6 files changed

+120
-8
lines changed

6 files changed

+120
-8
lines changed

CHANGELOG.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,11 @@
11
# GoodData Ruby SDK Changelog
2+
## 2.1.13
3+
- FEATURE: TMA-1676 Support LCM release across domain
4+
- FEATURE: TMA-1672 Support sync process with generic datasource
5+
- FEATURE: MSF-17743 upgrade custom v2 for rollout brick
6+
- BUGFIX: MSF-17975 Introduce gdcshare to lcm bricks
7+
- BUGFIX: TMA-1673 Update params processing to accept dot and space
8+
29
## 2.1.12
310
- FEATURE: MSF-17621 Apply patched version for activesupport to fix vulnerable issue
411
- CONFIG: SETI-4379 Add gdc-fossa configuration for gooddata-ruby

SDK_VERSION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
2.1.12
1+
2.1.13

VERSION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
3.7.21
1+
3.7.22
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
# encoding: UTF-8
2+
# frozen_string_literal: true
3+
#
4+
# Copyright (c) 2010-2020 GoodData Corporation. All rights reserved.
5+
# This source code is licensed under the BSD-style license found in the
6+
# LICENSE file in the root directory of this source tree.
7+
# frozen_string_literal: false
8+
9+
module GoodData
10+
module Helpers
11+
class << self
12+
# Get a data source information from server by id
13+
#
14+
# @param [String] data_source_id The data source ID
15+
# @param [Object] client The Rest Client object
16+
# @return [Hash] Returns Data source
17+
def get_data_source_by_id(data_source_id, client)
18+
unless data_source_id.blank?
19+
uri = "/gdc/dataload/dataSources/#{data_source_id}"
20+
client.get(uri)
21+
end
22+
end
23+
24+
# Verify to see if the data source exists in the domain using its alias
25+
#
26+
# @param [String] ds_alias The data source's alias
27+
# @param [Object] client The Rest Client object
28+
# @return [String] Id of the data source or failed with the reason
29+
def verify_data_source_alias(ds_alias, client)
30+
domain = client.connection.server.url
31+
fail "The data source alias is empty, check your data source configuration." unless ds_alias
32+
33+
uri = "/gdc/dataload/dataSources/internal/availableAlias?alias=#{ds_alias[:alias]}"
34+
res = client.get(uri)
35+
fail "Unable to get information about the Data Source '#{ds_alias[:alias]}' in the domain '#{domain}'" unless res
36+
fail "Unable to find the #{ds_alias[:type]} Data Source '#{ds_alias[:alias]}' in the domain '#{domain}'" if res['availableAlias']['available']
37+
38+
ds_type = res['availableAlias']['existingDataSource']['type']
39+
if ds_type && ds_type != ds_alias[:type]
40+
fail "Wrong Data Source type - the '#{ds_type}' type is expected but the Data Source '#{ds_alias[:alias]}' in the domain '#{domain}' has the '#{ds_alias[:type]}' type"
41+
else
42+
res['availableAlias']['existingDataSource']['id']
43+
end
44+
end
45+
end
46+
end
47+
end

lib/gooddata/models/project.rb

Lines changed: 59 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -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

spec/unit/actions/synchronize_processes_spec.rb

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@
6767
allow(dest_project).to receive(:client).and_return(dest_client)
6868
allow(src_project).to receive(:add).and_return(add)
6969
allow(dest_project).to receive(:add).and_return(add)
70+
allow(src_project).to receive(:client).and_return(development_client)
7071

7172
allow(add).to receive(:output_stage).and_return(output_stage)
7273
allow(output_stage).to receive(:output_stage_prefix).and_return('prefix')
@@ -80,6 +81,8 @@
8081
allow(process).to receive(:path).and_return(nil)
8182
allow(process).to receive(:component).and_return(process_component)
8283
allow(process).to receive(:to_hash).and_return(process_hash)
84+
allow(process).to receive(:data).and_return(process_hash)
85+
allow(process).to receive(:data_sources).and_return([])
8386

8487
allow(process).to receive(:project).and_return(src_project)
8588
allow(process).to receive(:add_v2_component?).and_return(false)
@@ -93,7 +96,8 @@
9396
secretConfig: {
9497
key: 'val'
9598
}
96-
}
99+
},
100+
dataSources: []
97101
}
98102
},
99103
client: dest_client,

0 commit comments

Comments
 (0)