gooddata 2.1.14-java → 2.2.0-java
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/.gdc-ii-config.yaml +1 -1
- data/.github/workflows/build.yml +66 -0
- data/.github/workflows/pre-merge.yml +72 -0
- data/.sonar.settings +4 -0
- data/.travis.yml +78 -12
- data/CHANGELOG.md +62 -0
- data/Dockerfile +25 -14
- data/LICENSE +4418 -17
- data/LICENSE.rb +1 -1
- data/README.md +3 -3
- data/Rakefile +8 -1
- data/SDK_VERSION +1 -1
- data/VERSION +1 -1
- data/bin/test_projects_cleanup.rb +45 -3
- data/ci/mssql/pom.xml +62 -0
- data/ci/mysql/pom.xml +57 -0
- data/ci/postgresql/pom.xml +57 -0
- data/ci/redshift/pom.xml +1 -1
- data/dev-gooddata-sso.pub.encrypted +40 -40
- data/gdc_fossa_ruby_sdk.yaml +1 -0
- data/gooddata.gemspec +10 -6
- data/k8s/charts/lcm-bricks/Chart.yaml +1 -1
- data/k8s/charts/lcm-bricks/templates/prometheus/alertingRules.yaml +11 -1
- data/lcm.rake +2 -2
- data/lib/gooddata/bricks/middleware/aws_middleware.rb +35 -9
- data/lib/gooddata/cloud_resources/blobstorage/blobstorage_client.rb +98 -0
- data/lib/gooddata/cloud_resources/{cloud_resouce_factory.rb → cloud_resource_factory.rb} +8 -0
- data/lib/gooddata/cloud_resources/cloud_resources.rb +1 -1
- data/lib/gooddata/cloud_resources/mssql/drivers/.gitkeepme +0 -0
- data/lib/gooddata/cloud_resources/mssql/mssql_client.rb +122 -0
- data/lib/gooddata/cloud_resources/mysql/drivers/.gitkeepme +0 -0
- data/lib/gooddata/cloud_resources/mysql/mysql_client.rb +111 -0
- data/lib/gooddata/cloud_resources/postgresql/drivers/.gitkeepme +0 -0
- data/lib/gooddata/cloud_resources/postgresql/postgresql_client.rb +106 -0
- data/lib/gooddata/cloud_resources/snowflake/snowflake_client.rb +18 -1
- data/lib/gooddata/commands/scaffold.rb +9 -10
- data/lib/gooddata/core/nil_logger.rb +3 -1
- data/lib/gooddata/helpers/data_helper.rb +9 -5
- data/lib/gooddata/helpers/global_helpers.rb +6 -5
- data/lib/gooddata/lcm/actions/associate_clients.rb +8 -2
- data/lib/gooddata/lcm/actions/base_action.rb +0 -2
- data/lib/gooddata/lcm/actions/collect_meta.rb +3 -1
- data/lib/gooddata/lcm/actions/migrate_gdc_date_dimension.rb +3 -2
- data/lib/gooddata/lcm/actions/provision_clients.rb +31 -10
- data/lib/gooddata/lcm/actions/synchronize_clients.rb +56 -7
- data/lib/gooddata/lcm/actions/synchronize_dataset_mappings.rb +64 -0
- data/lib/gooddata/lcm/actions/synchronize_ldm.rb +19 -8
- data/lib/gooddata/lcm/actions/synchronize_user_filters.rb +16 -9
- data/lib/gooddata/lcm/actions/synchronize_users.rb +7 -6
- data/lib/gooddata/lcm/actions/update_metric_formats.rb +185 -0
- data/lib/gooddata/lcm/data/delete_from_lcm_release.sql.erb +5 -0
- data/lib/gooddata/lcm/helpers/release_table_helper.rb +42 -8
- data/lib/gooddata/lcm/lcm2.rb +5 -2
- data/lib/gooddata/lcm/types/base_type.rb +0 -2
- data/lib/gooddata/mixins/md_object_query.rb +9 -6
- data/lib/gooddata/models/blueprint/project_blueprint.rb +0 -2
- data/lib/gooddata/models/client.rb +14 -12
- data/lib/gooddata/models/data_source.rb +668 -0
- data/lib/gooddata/models/dataset_mapping.rb +36 -0
- data/lib/gooddata/models/domain.rb +3 -2
- data/lib/gooddata/models/metadata/analytical_dashboard.rb +49 -0
- data/lib/gooddata/models/metadata/analytical_visualization_object.rb +30 -0
- data/lib/gooddata/models/metadata/label.rb +26 -27
- data/lib/gooddata/models/metadata/visualization_object.rb +50 -0
- data/lib/gooddata/models/project.rb +66 -19
- data/lib/gooddata/models/schedule.rb +13 -1
- data/lib/gooddata/models/user_filters/user_filter_builder.rb +58 -54
- data/lib/gooddata/models/user_group.rb +0 -1
- data/lib/gooddata/rest/connection.rb +6 -4
- data/lib/gooddata/rest/phmap.rb +2 -1
- data/lib/gooddata.rb +2 -0
- data/rubydev_public.gpg.encrypted +51 -51
- data/rubydev_secret_keys.gpg.encrypted +109 -109
- metadata +51 -27
- data/DEPENDENCIES.md +0 -880
- data/lib/gooddata/bricks/middleware/bulk_salesforce_middleware.rb +0 -37
- data/lib/gooddata/helpers/data_source_helpers.rb +0 -47
@@ -12,6 +12,21 @@ module GoodData
|
|
12
12
|
|
13
13
|
class << self
|
14
14
|
def latest_master_project_from_ads(release_table_name, ads_client, segment_id)
|
15
|
+
sorted = get_master_project_list_from_ads(release_table_name, ads_client, segment_id)
|
16
|
+
sorted.last
|
17
|
+
end
|
18
|
+
|
19
|
+
def latest_master_project_from_nfs(domain_id, data_product_id, segment_id)
|
20
|
+
file_path = path_to_release_table_file(domain_id, data_product_id, segment_id)
|
21
|
+
sorted = get_master_project_list_from_nfs(domain_id, data_product_id, segment_id)
|
22
|
+
latest_master_project = sorted.last
|
23
|
+
|
24
|
+
version_info = latest_master_project ? "master_pid=#{latest_master_project[:master_project_id]} version=#{latest_master_project[:version]}" : ""
|
25
|
+
GoodData.gd_logger.info "Getting latest master project: file=#{file_path} domain=#{domain_id} data_product=#{data_product_id} segment=#{segment_id} #{version_info}"
|
26
|
+
latest_master_project
|
27
|
+
end
|
28
|
+
|
29
|
+
def get_master_project_list_from_ads(release_table_name, ads_client, segment_id)
|
15
30
|
replacements = {
|
16
31
|
table_name: release_table_name || DEFAULT_TABLE_NAME,
|
17
32
|
segment_id: segment_id
|
@@ -22,18 +37,27 @@ module GoodData
|
|
22
37
|
|
23
38
|
res = ads_client.execute_select(query)
|
24
39
|
sorted = res.sort_by { |row| row[:version] }
|
25
|
-
sorted
|
40
|
+
sorted
|
26
41
|
end
|
27
42
|
|
28
|
-
def
|
43
|
+
def delete_master_project_from_ads(release_table_name, ads_client, segment_id, removal_master_project_ids)
|
44
|
+
replacements = {
|
45
|
+
table_name: release_table_name || DEFAULT_TABLE_NAME,
|
46
|
+
segment_id: segment_id,
|
47
|
+
master_project_ids: removal_master_project_ids.map { |x| "'#{x}'" } * ', '
|
48
|
+
}
|
49
|
+
|
50
|
+
path = File.expand_path('../data/delete_from_lcm_release.sql.erb', __dir__)
|
51
|
+
query = GoodData::Helpers::ErbHelper.template_file(path, replacements)
|
52
|
+
|
53
|
+
ads_client.execute(query)
|
54
|
+
end
|
55
|
+
|
56
|
+
def get_master_project_list_from_nfs(domain_id, data_product_id, segment_id)
|
29
57
|
file_path = path_to_release_table_file(domain_id, data_product_id, segment_id)
|
30
58
|
data = GoodData::Helpers::Csv.read_as_hash(file_path)
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
version_info = latest_master_project ? "master_pid=#{latest_master_project[:master_project_id]} version=#{latest_master_project[:version]}" : ""
|
35
|
-
GoodData.gd_logger.info "Getting latest master project: file=#{file_path} domain=#{domain_id} data_product=#{data_product_id} segment=#{segment_id} #{version_info}"
|
36
|
-
latest_master_project
|
59
|
+
sorted = data.sort_by { |master| master[:version] }
|
60
|
+
sorted
|
37
61
|
end
|
38
62
|
|
39
63
|
def update_latest_master_to_nfs(domain_id, data_product_id, segment_id, master_pid, version)
|
@@ -46,6 +70,16 @@ module GoodData
|
|
46
70
|
)
|
47
71
|
end
|
48
72
|
|
73
|
+
def update_master_project_to_nfs(domain_id, data_product_id, segment_id, data)
|
74
|
+
file_path = path_to_release_table_file(domain_id, data_product_id, segment_id)
|
75
|
+
FileUtils.mkpath(file_path.split('/')[0...-1].join('/'))
|
76
|
+
CSV.open(file_path, 'w', write_headers: true, headers: data.first.keys) do |csv|
|
77
|
+
data.each do |r|
|
78
|
+
csv << r.values
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
49
83
|
def path_to_release_table_file(domain_id, data_prod_id, segment_id)
|
50
84
|
nsf_directory = ENV['RELEASE_TABLE_NFS_DIRECTORY'] || DEFAULT_NFS_DIRECTORY
|
51
85
|
[nsf_directory, domain_id, data_prod_id + '-' + segment_id + '.csv'].join('/')
|
data/lib/gooddata/lcm/lcm2.rb
CHANGED
@@ -13,8 +13,6 @@ require 'gooddata/extensions/integer'
|
|
13
13
|
require 'gooddata/extensions/string'
|
14
14
|
require 'gooddata/extensions/nil'
|
15
15
|
|
16
|
-
require 'active_support/core_ext/hash/compact'
|
17
|
-
|
18
16
|
require_relative 'actions/actions'
|
19
17
|
require_relative 'dsl/dsl'
|
20
18
|
require_relative 'helpers/helpers'
|
@@ -98,6 +96,7 @@ module GoodData
|
|
98
96
|
CollectComputedAttributeMetrics,
|
99
97
|
ImportObjectCollections,
|
100
98
|
SynchronizeComputedAttributes,
|
99
|
+
SynchronizeDataSetMapping,
|
101
100
|
SynchronizeProcesses,
|
102
101
|
SynchronizeSchedules,
|
103
102
|
SynchronizeColorPalette,
|
@@ -124,9 +123,11 @@ module GoodData
|
|
124
123
|
AssociateClients,
|
125
124
|
RenameExistingClientProjects,
|
126
125
|
ProvisionClients,
|
126
|
+
UpdateMetricFormats,
|
127
127
|
EnsureTechnicalUsersDomain,
|
128
128
|
EnsureTechnicalUsersProject,
|
129
129
|
CollectDymanicScheduleParams,
|
130
|
+
SynchronizeDataSetMapping,
|
130
131
|
SynchronizeETLsInSegment
|
131
132
|
],
|
132
133
|
|
@@ -138,8 +139,10 @@ module GoodData
|
|
138
139
|
EnsureTechnicalUsersDomain,
|
139
140
|
EnsureTechnicalUsersProject,
|
140
141
|
SynchronizeLdm,
|
142
|
+
SynchronizeDataSetMapping,
|
141
143
|
MigrateGdcDateDimension,
|
142
144
|
SynchronizeClients,
|
145
|
+
UpdateMetricFormats,
|
143
146
|
SynchronizeComputedAttributes,
|
144
147
|
CollectDymanicScheduleParams,
|
145
148
|
SynchronizeETLsInSegment
|
@@ -1,12 +1,14 @@
|
|
1
1
|
# encoding: UTF-8
|
2
2
|
#
|
3
|
-
# Copyright (c) 2010-
|
3
|
+
# Copyright (c) 2010-2021 GoodData Corporation. All rights reserved.
|
4
4
|
# This source code is licensed under the BSD-style license found in the
|
5
5
|
# LICENSE file in the root directory of this source tree.
|
6
6
|
|
7
7
|
module GoodData
|
8
8
|
module Mixin
|
9
9
|
module MdObjectQuery
|
10
|
+
ERROR_MESSAGE_NO_PROJECT = 'No :project specified'
|
11
|
+
|
10
12
|
# Method intended to get all objects of that type in a specified project
|
11
13
|
#
|
12
14
|
# @param options [Hash] the options hash
|
@@ -38,7 +40,7 @@ module GoodData
|
|
38
40
|
fail ArgumentError, 'No :client specified' if client.nil?
|
39
41
|
|
40
42
|
p = options[:project]
|
41
|
-
fail ArgumentError,
|
43
|
+
fail ArgumentError, ERROR_MESSAGE_NO_PROJECT if p.nil?
|
42
44
|
|
43
45
|
project = GoodData::Project[p, options]
|
44
46
|
fail ArgumentError, 'Wrong :project specified' if project.nil?
|
@@ -52,6 +54,7 @@ module GoodData
|
|
52
54
|
y << (klass ? client.create(klass, item, project: project) : item)
|
53
55
|
end
|
54
56
|
break if result['objects']['paging']['count'] < page_limit
|
57
|
+
|
55
58
|
offset += page_limit
|
56
59
|
end
|
57
60
|
end
|
@@ -98,10 +101,10 @@ module GoodData
|
|
98
101
|
# Returns which objects uses this MD resource
|
99
102
|
def usedby(uri, key = nil, opts = { :client => GoodData.connection, :project => GoodData.project })
|
100
103
|
p = opts[:project]
|
101
|
-
fail ArgumentError,
|
104
|
+
fail ArgumentError, ERROR_MESSAGE_NO_PROJECT if p.nil?
|
102
105
|
|
103
106
|
project = GoodData::Project[p, opts]
|
104
|
-
fail ArgumentError,
|
107
|
+
fail ArgumentError, ERROR_MESSAGE_NO_PROJECT if project.nil?
|
105
108
|
|
106
109
|
dependency("#{project.md['usedby2']}/#{uri_obj_id(uri)}", key, opts)
|
107
110
|
end
|
@@ -111,10 +114,10 @@ module GoodData
|
|
111
114
|
# Returns which objects this MD resource uses
|
112
115
|
def using(uri, key = nil, opts = { :client => GoodData.connection, :project => GoodData.project })
|
113
116
|
p = opts[:project]
|
114
|
-
fail ArgumentError,
|
117
|
+
fail ArgumentError, ERROR_MESSAGE_NO_PROJECT if p.nil?
|
115
118
|
|
116
119
|
project = GoodData::Project[p, opts]
|
117
|
-
fail ArgumentError,
|
120
|
+
fail ArgumentError, ERROR_MESSAGE_NO_PROJECT if project.nil?
|
118
121
|
|
119
122
|
dependency("#{project.md['using2']}/#{uri_obj_id(uri)}", key, opts)
|
120
123
|
end
|
@@ -40,20 +40,22 @@ module GoodData
|
|
40
40
|
if id == :all
|
41
41
|
tenants_uri = base_uri(domain, data_product)
|
42
42
|
tenants_uri += "?segment=#{CGI.escape(segment.segment_id)}" if segment
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
url = res['clients']['paging']['next']
|
54
|
-
break unless url
|
43
|
+
|
44
|
+
all_clients = []
|
45
|
+
loop do
|
46
|
+
res = client.get tenants_uri
|
47
|
+
res['clients']['paging']['next']
|
48
|
+
res['clients']['items'].each do |i|
|
49
|
+
p = i['client']['project']
|
50
|
+
tenant = client.create(GoodData::Client, i.merge('domain' => domain))
|
51
|
+
tenant.project = p
|
52
|
+
all_clients << tenant
|
55
53
|
end
|
54
|
+
url = res['clients']['paging']['next']
|
55
|
+
break unless url
|
56
56
|
end
|
57
|
+
|
58
|
+
all_clients
|
57
59
|
else
|
58
60
|
id = id.respond_to?(:client_id) ? id.client_id : id
|
59
61
|
tenant_uri = base_uri(domain, data_product)
|