gooddata 0.6.51 → 0.6.52
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +1 -1
- data/CHANGELOG.md +13 -1
- data/CONTRIBUTING.md +25 -0
- data/PULL_REQUEST_TEMPLATE.md +5 -0
- data/README.md +7 -4
- data/gooddata.gemspec +2 -3
- data/lib/gooddata.rb +1 -0
- data/lib/gooddata/bricks/base_downloader.rb +6 -6
- data/lib/gooddata/bricks/middleware/aws_middleware.rb +15 -5
- data/lib/gooddata/bricks/middleware/dwh_middleware.rb +15 -3
- data/lib/gooddata/bricks/middleware/gooddata_middleware.rb +13 -4
- data/lib/gooddata/bricks/middleware/logger_middleware.rb +3 -0
- data/lib/gooddata/exceptions/no_project_error.rb +5 -1
- data/lib/gooddata/goodzilla/goodzilla.rb +7 -6
- data/lib/gooddata/helpers/data_helper.rb +4 -4
- data/lib/gooddata/helpers/global_helpers_params.rb +61 -39
- data/lib/gooddata/lcm/actions/apply_custom_maql.rb +9 -0
- data/lib/gooddata/lcm/actions/associate_clients.rb +23 -4
- data/lib/gooddata/lcm/actions/collect_attrs.rb +56 -0
- data/lib/gooddata/lcm/actions/collect_ca_metrics.rb +53 -0
- data/lib/gooddata/lcm/actions/collect_clients.rb +25 -3
- data/lib/gooddata/lcm/actions/collect_meta.rb +83 -0
- data/lib/gooddata/lcm/actions/collect_segment_clients.rb +12 -4
- data/lib/gooddata/lcm/actions/collect_segments.rb +4 -4
- data/lib/gooddata/lcm/actions/collect_tagged_objects.rb +74 -0
- data/lib/gooddata/lcm/actions/create_segment_masters.rb +16 -30
- data/lib/gooddata/lcm/actions/ensure_release_table.rb +0 -3
- data/lib/gooddata/lcm/actions/ensure_segments.rb +1 -4
- data/lib/gooddata/lcm/actions/ensure_technical_users_domain.rb +5 -5
- data/lib/gooddata/lcm/actions/ensure_technical_users_project.rb +8 -5
- data/lib/gooddata/lcm/actions/hello_world.rb +0 -3
- data/lib/gooddata/lcm/actions/import_object_collections.rb +60 -0
- data/lib/gooddata/lcm/actions/print_actions.rb +0 -3
- data/lib/gooddata/lcm/actions/print_modes.rb +0 -3
- data/lib/gooddata/lcm/actions/print_types.rb +1 -4
- data/lib/gooddata/lcm/actions/provision_clients.rb +5 -5
- data/lib/gooddata/lcm/actions/purge_clients.rb +4 -10
- data/lib/gooddata/lcm/actions/segments_filter.rb +0 -6
- data/lib/gooddata/lcm/actions/synchronize_attribute_drillpaths.rb +8 -4
- data/lib/gooddata/lcm/actions/synchronize_cas.rb +61 -0
- data/lib/gooddata/lcm/actions/synchronize_clients.rb +9 -3
- data/lib/gooddata/lcm/actions/synchronize_color_palette.rb +13 -5
- data/lib/gooddata/lcm/actions/synchronize_etls_in_segment.rb +71 -17
- data/lib/gooddata/lcm/actions/synchronize_label_types.rb +8 -5
- data/lib/gooddata/lcm/actions/synchronize_ldm.rb +17 -8
- data/lib/gooddata/lcm/actions/synchronize_meta.rb +0 -3
- data/lib/gooddata/lcm/actions/synchronize_new_segments.rb +9 -4
- data/lib/gooddata/lcm/actions/synchronize_processes.rb +9 -5
- data/lib/gooddata/lcm/actions/synchronize_schedules.rb +15 -5
- data/lib/gooddata/lcm/actions/synchronize_tag_objects.rb +61 -0
- data/lib/gooddata/lcm/actions/update_release_table.rb +0 -3
- data/lib/gooddata/lcm/helpers/tags_helper.rb +35 -0
- data/lib/gooddata/lcm/lcm.rb +22 -4
- data/lib/gooddata/lcm/lcm2.rb +66 -13
- data/lib/gooddata/lcm/types/complex/update_preference.rb +1 -1
- data/lib/gooddata/mixins/md_finders.rb +4 -2
- data/lib/gooddata/mixins/md_object_indexer.rb +13 -3
- data/lib/gooddata/mixins/md_object_query.rb +8 -2
- data/lib/gooddata/models/blueprint/date_dimension.rb +6 -0
- data/lib/gooddata/models/blueprint/project_blueprint.rb +41 -11
- data/lib/gooddata/models/blueprint/project_builder.rb +20 -0
- data/lib/gooddata/models/blueprint/to_wire.rb +7 -0
- data/lib/gooddata/models/client.rb +6 -0
- data/lib/gooddata/models/domain.rb +6 -6
- data/lib/gooddata/models/from_wire.rb +5 -1
- data/lib/gooddata/models/metadata.rb +55 -9
- data/lib/gooddata/models/metadata/attribute.rb +19 -4
- data/lib/gooddata/models/metadata/dashboard.rb +15 -3
- data/lib/gooddata/models/metadata/dataset.rb +5 -2
- data/lib/gooddata/models/metadata/dimension.rb +4 -1
- data/lib/gooddata/models/metadata/fact.rb +9 -2
- data/lib/gooddata/models/metadata/folder.rb +4 -1
- data/lib/gooddata/models/metadata/metric.rb +11 -3
- data/lib/gooddata/models/metadata/report.rb +7 -2
- data/lib/gooddata/models/metadata/report_definition.rb +11 -4
- data/lib/gooddata/models/metadata/scheduled_mail.rb +4 -1
- data/lib/gooddata/models/metadata/variable.rb +7 -2
- data/lib/gooddata/models/model.rb +14 -3
- data/lib/gooddata/models/process.rb +10 -9
- data/lib/gooddata/models/project.rb +134 -36
- data/lib/gooddata/models/project_creator.rb +43 -20
- data/lib/gooddata/models/report_data_result.rb +6 -2
- data/lib/gooddata/models/schedule.rb +6 -3
- data/lib/gooddata/models/subscription.rb +8 -1
- data/lib/gooddata/models/user_filters/user_filter.rb +1 -0
- data/lib/gooddata/models/user_filters/user_filter_builder.rb +18 -4
- data/lib/gooddata/models/user_filters/variable_user_filter.rb +3 -1
- data/lib/gooddata/rest/client.rb +4 -6
- data/lib/gooddata/rest/connection.rb +10 -2
- data/lib/gooddata/version.rb +1 -1
- data/spec/data/blueprints/test_blueprint.json +1 -0
- data/spec/data/wire_models/test_blueprint.json +3 -0
- data/spec/data/workspace_table.csv +3 -0
- data/spec/environment/development.rb +4 -1
- data/spec/environment/environment.rb +1 -1
- data/spec/environment/staging.rb +5 -1
- data/spec/environment/testing.rb +5 -2
- data/spec/integration/blueprint_with_ca_spec.rb +56 -0
- data/spec/integration/clients_spec.rb +21 -0
- data/spec/integration/command_datawarehouse_spec.rb +7 -1
- data/spec/integration/create_from_template_spec.rb +9 -3
- data/spec/integration/project_spec.rb +7 -0
- data/spec/integration/segments_spec.rb +0 -53
- data/spec/integration/subscription_spec.rb +29 -4
- data/spec/integration/urn_date_dim_spec.rb +53 -0
- data/spec/integration/user_filters_spec.rb +6 -0
- data/spec/integration/variables_spec.rb +1 -2
- data/spec/spec_helper.rb +5 -30
- data/spec/unit/actions/collect_clients_spec.rb +38 -0
- data/spec/unit/actions/collect_meta_spec.rb +87 -0
- data/spec/unit/actions/collect_segment_clients_spec.rb +40 -0
- data/spec/unit/actions/collect_tagged_objects_spec.rb +110 -0
- data/spec/unit/actions/synchronize_etls_in_segment_spec.rb +51 -0
- data/spec/unit/bricks/middleware/aws_middelware_spec.rb +55 -1
- data/spec/unit/bricks/middleware/logger_middleware_spec.rb +15 -0
- data/spec/unit/helpers/data_helper_spec.rb +3 -5
- data/spec/unit/helpers/global_helpers_spec.rb +29 -0
- data/spec/unit/helpers_spec.rb +18 -1
- data/spec/unit/models/blueprint/project_blueprint_spec.rb +1 -23
- data/spec/unit/models/domain_spec.rb +19 -0
- data/spec/unit/models/metadata_spec.rb +34 -0
- data/spec/unit/models/schedule_spec.rb +31 -0
- data/spec/unit/models/to_manifest_spec.rb +10 -2
- data/spec/unit/models/unit_project_spec.rb +6 -1
- data/spec/unit/rest/polling_spec.rb +13 -1
- metadata +49 -31
@@ -15,29 +15,29 @@ module GoodData
|
|
15
15
|
description 'Client Used for Connecting to GD'
|
16
16
|
param :gdc_gd_client, instance_of(Type::GdClientType), required: true
|
17
17
|
|
18
|
+
description 'Development Client Used for Connecting to GD'
|
19
|
+
param :development_client, instance_of(Type::GdClientType), required: true
|
20
|
+
|
18
21
|
description 'Organization Name'
|
19
22
|
param :organization, instance_of(Type::StringType), required: true
|
20
23
|
|
21
24
|
description 'ADS Client'
|
22
25
|
param :ads_client, instance_of(Type::AdsClientType), required: true
|
23
26
|
|
24
|
-
# description 'Queries Used'
|
25
|
-
# param :query, instance_of(Type::ReleaseQueryType), required: false
|
26
|
-
|
27
27
|
description 'Segments to manage'
|
28
28
|
param :segments, array_of(instance_of(Type::SegmentType)), required: true
|
29
29
|
|
30
30
|
description 'Tokens'
|
31
31
|
param :tokens, instance_of(Type::TokensType), required: true
|
32
|
+
|
33
|
+
description 'Table Name'
|
34
|
+
param :release_table_name, instance_of(Type::StringType), required: false
|
32
35
|
end
|
33
36
|
|
34
37
|
DEFAULT_TABLE_NAME = 'LCM_RELEASE'
|
35
38
|
|
36
39
|
class << self
|
37
40
|
def call(params)
|
38
|
-
# Check if all required parameters were passed
|
39
|
-
BaseAction.check_params(PARAMS, params)
|
40
|
-
|
41
41
|
results = []
|
42
42
|
|
43
43
|
client = params.gdc_gd_client
|
@@ -50,10 +50,7 @@ module GoodData
|
|
50
50
|
# TODO: Support for 'per segment' provisioning
|
51
51
|
segments = params.segments
|
52
52
|
|
53
|
-
|
54
|
-
synchronize_projects = []
|
55
|
-
|
56
|
-
segments.map do |segment_in| # rubocop:disable Metrics/BlockLength
|
53
|
+
synchronize_projects = segments.map do |segment_in| # rubocop:disable Metrics/BlockLength
|
57
54
|
segment_id = segment_in.segment_id
|
58
55
|
development_pid = segment_in.development_pid
|
59
56
|
driver = segment_in.driver.downcase
|
@@ -75,32 +72,16 @@ module GoodData
|
|
75
72
|
params.gdc_logger.info "Creating master project - name: '#{master_name}' development_project: '#{development_pid}', segment: '#{segment_id}', driver: '#{driver}'"
|
76
73
|
project = client.create_project(title: master_name, auth_token: token, driver: driver == 'vertica' ? 'vertica' : 'Pg')
|
77
74
|
|
78
|
-
# Do we have hash with synchronization info for current development project?
|
79
|
-
synchronize_info = synchronize_projects.find do |info|
|
80
|
-
info[:from] == development_pid
|
81
|
-
end
|
82
|
-
|
83
|
-
# If not, create new one
|
84
|
-
unless synchronize_info
|
85
|
-
synchronize_info = {
|
86
|
-
segment: segment_id,
|
87
|
-
from: development_pid,
|
88
|
-
to: []
|
89
|
-
}
|
90
|
-
synchronize_projects << synchronize_info
|
91
|
-
end
|
92
|
-
|
93
|
-
# Add target project (new master for segment) into synchronization info
|
94
|
-
synchronize_info[:to] << { pid: project.pid }
|
95
|
-
|
96
75
|
# Does segment exists? If not, create new one and set initial master
|
97
76
|
if segment
|
98
77
|
segment_in[:is_new] = false
|
78
|
+
status = 'untouched'
|
99
79
|
else
|
100
80
|
params.gdc_logger.info "Creating segment #{segment_id}, master #{project.pid}"
|
101
81
|
segment = domain.create_segment(segment_id: segment_id, master_project: project)
|
102
82
|
segment.synchronize_clients
|
103
83
|
segment_in[:is_new] = true
|
84
|
+
status = 'created'
|
104
85
|
end
|
105
86
|
|
106
87
|
master_project = nil
|
@@ -115,6 +96,7 @@ module GoodData
|
|
115
96
|
segment.master_project = project
|
116
97
|
segment.save
|
117
98
|
segment_in[:is_new] = true
|
99
|
+
status = 'modified'
|
118
100
|
end
|
119
101
|
|
120
102
|
segment_in[:master_pid] = project.pid
|
@@ -131,10 +113,14 @@ module GoodData
|
|
131
113
|
development_pid: development_pid,
|
132
114
|
master_pid: project.pid,
|
133
115
|
driver: driver,
|
134
|
-
status:
|
116
|
+
status: status
|
135
117
|
}
|
136
118
|
|
137
|
-
|
119
|
+
{
|
120
|
+
segment: segment_id,
|
121
|
+
from: development_pid,
|
122
|
+
to: [{ pid: project.pid }]
|
123
|
+
}
|
138
124
|
end
|
139
125
|
|
140
126
|
# Return results
|
@@ -17,6 +17,9 @@ module GoodData
|
|
17
17
|
|
18
18
|
description 'Organization Name'
|
19
19
|
param :organization, instance_of(Type::StringType), required: true
|
20
|
+
|
21
|
+
description 'Technical users'
|
22
|
+
param :technical_user, array_of(instance_of(Type::StringType)), required: false
|
20
23
|
end
|
21
24
|
|
22
25
|
RESULT_HEADER = [
|
@@ -28,16 +31,13 @@ module GoodData
|
|
28
31
|
|
29
32
|
class << self
|
30
33
|
def call(params)
|
31
|
-
# Check if all required parameters were passed
|
32
|
-
BaseAction.check_params(PARAMS, params)
|
33
|
-
|
34
34
|
client = params.gdc_gd_client
|
35
35
|
|
36
36
|
domain_name = params.organization || params.domain
|
37
37
|
domain = client.domain(domain_name) || fail("Invalid domain name specified - #{domain_name}")
|
38
38
|
|
39
|
-
technical_users = params.technical_user || []
|
40
|
-
technical_users.
|
39
|
+
technical_users = (params.technical_user || []).uniq
|
40
|
+
technical_users.pmap do |technical_user|
|
41
41
|
domain_user = domain.users.find do |du|
|
42
42
|
du.login == technical_user
|
43
43
|
end
|
@@ -14,6 +14,12 @@ module GoodData
|
|
14
14
|
PARAMS = define_params(self) do
|
15
15
|
description 'Client Used for Connecting to GD'
|
16
16
|
param :gdc_gd_client, instance_of(Type::GdClientType), required: true
|
17
|
+
|
18
|
+
description 'Technical users'
|
19
|
+
param :technical_user, array_of(instance_of(Type::StringType)), required: false
|
20
|
+
|
21
|
+
description 'Synchronization Info'
|
22
|
+
param :synchronize, array_of(instance_of(Type::SynchronizationInfoType)), required: true, generated: true
|
17
23
|
end
|
18
24
|
|
19
25
|
RESULT_HEADER = [
|
@@ -28,9 +34,6 @@ module GoodData
|
|
28
34
|
|
29
35
|
class << self
|
30
36
|
def call(params)
|
31
|
-
# Check if all required parameters were passed
|
32
|
-
BaseAction.check_params(PARAMS, params)
|
33
|
-
|
34
37
|
client = params.gdc_gd_client
|
35
38
|
|
36
39
|
technical_users = params.technical_user || []
|
@@ -41,8 +44,8 @@ module GoodData
|
|
41
44
|
}
|
42
45
|
end
|
43
46
|
|
44
|
-
results = params.synchronize.
|
45
|
-
synchronize_info[:to].
|
47
|
+
results = params.synchronize.pmap do |synchronize_info|
|
48
|
+
synchronize_info[:to].pmap do |entry|
|
46
49
|
project = client.projects(entry[:pid])
|
47
50
|
res = project.create_users(new_users)
|
48
51
|
|
@@ -0,0 +1,60 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
#
|
3
|
+
# Copyright (c) 2010-2017 GoodData Corporation. All rights reserved.
|
4
|
+
# This source code is licensed under the BSD-style license found in the
|
5
|
+
# LICENSE file in the root directory of this source tree.
|
6
|
+
|
7
|
+
require_relative 'base_action'
|
8
|
+
|
9
|
+
module GoodData
|
10
|
+
module LCM2
|
11
|
+
class ImportObjectCollections < BaseAction
|
12
|
+
DESCRIPTION = 'Import all objects in CollectXXX action to master projects'
|
13
|
+
|
14
|
+
PARAMS = define_params(self) do
|
15
|
+
description 'Client Used for Connecting to GD'
|
16
|
+
param :gdc_gd_client, instance_of(Type::GdClientType), required: true
|
17
|
+
|
18
|
+
description 'Development Client Used for Connecting to GD'
|
19
|
+
param :development_client, instance_of(Type::GdClientType), required: true
|
20
|
+
|
21
|
+
description 'Synchronization Info'
|
22
|
+
param :synchronize, array_of(instance_of(Type::SynchronizationInfoType)), required: true, generated: true
|
23
|
+
end
|
24
|
+
|
25
|
+
class << self
|
26
|
+
def call(params)
|
27
|
+
results = []
|
28
|
+
|
29
|
+
client = params.gdc_gd_client
|
30
|
+
development_client = params.development_client
|
31
|
+
|
32
|
+
params.synchronize.peach do |info|
|
33
|
+
from = info.from
|
34
|
+
to_projects = info.to
|
35
|
+
transfer_uris = info.transfer_uris
|
36
|
+
|
37
|
+
from_project = development_client.projects(from) || fail("Invalid 'from' project specified - '#{from}'")
|
38
|
+
|
39
|
+
to_projects.peach do |entry|
|
40
|
+
pid = entry[:pid]
|
41
|
+
to_project = client.projects(pid) || fail("Invalid 'to' project specified - '#{pid}'")
|
42
|
+
|
43
|
+
if transfer_uris.any?
|
44
|
+
from_project.partial_md_export(transfer_uris, project: to_project)
|
45
|
+
end
|
46
|
+
|
47
|
+
results << {
|
48
|
+
from: from,
|
49
|
+
to: pid,
|
50
|
+
status: 'ok'
|
51
|
+
}
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
results
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
@@ -16,9 +16,6 @@ module GoodData
|
|
16
16
|
|
17
17
|
class << self
|
18
18
|
def call(params)
|
19
|
-
# Check if all required parameters were passed
|
20
|
-
BaseAction.check_params(PARAMS, params)
|
21
|
-
|
22
19
|
results = []
|
23
20
|
GoodData::LCM2::MODES.keys.each_with_index do |mode, index|
|
24
21
|
actions = GoodData::LCM2::MODES[mode]
|
@@ -32,17 +32,14 @@ module GoodData
|
|
32
32
|
|
33
33
|
class << self
|
34
34
|
def call(params)
|
35
|
-
# Check if all required parameters were passed
|
36
|
-
BaseAction.check_params(PARAMS, params)
|
37
|
-
|
38
35
|
client = params.gdc_gd_client
|
39
36
|
|
40
37
|
domain_name = params.organization || params.domain
|
41
38
|
domain = client.domain(domain_name) || fail("Invalid domain name specified - #{domain_name}")
|
42
39
|
|
43
40
|
synchronize_projects = []
|
44
|
-
results = params.segments.
|
45
|
-
tmp = domain.provision_client_projects(segment.segment_id).
|
41
|
+
results = params.segments.pmap do |segment|
|
42
|
+
tmp = domain.provision_client_projects(segment.segment_id).pmap do |m|
|
46
43
|
Hash[m.each_pair.to_a].merge(type: :provision_result)
|
47
44
|
end
|
48
45
|
|
@@ -51,6 +48,9 @@ module GoodData
|
|
51
48
|
segment_id: segment.segment_id,
|
52
49
|
from: segment.development_pid,
|
53
50
|
to: tmp.map do |entry|
|
51
|
+
unless entry[:project_uri]
|
52
|
+
raise "Provisioning project for client id #{entry[:id]} has error: #{entry[:error]}"
|
53
|
+
end
|
54
54
|
{
|
55
55
|
pid: entry[:project_uri].split('/').last,
|
56
56
|
client_id: entry[:id]
|
@@ -12,17 +12,14 @@ module GoodData
|
|
12
12
|
DESCRIPTION = 'Purge LCM Clients'
|
13
13
|
|
14
14
|
PARAMS = define_params(self) do
|
15
|
+
description 'Client Used for Connecting to GD'
|
16
|
+
param :gdc_gd_client, instance_of(Type::GdClientType), required: true
|
17
|
+
|
15
18
|
description 'Organization Name'
|
16
19
|
param :organization, instance_of(Type::StringType), required: true
|
17
20
|
|
18
21
|
description 'Segments to manage'
|
19
22
|
param :segments, array_of(instance_of(Type::SegmentType)), required: true
|
20
|
-
|
21
|
-
description 'Delete Extra Clients'
|
22
|
-
param :delete_extra, instance_of(Type::BooleanType), required: false, default: false
|
23
|
-
|
24
|
-
description 'Physically Delete Client Projects'
|
25
|
-
param :delete_projects, instance_of(Type::BooleanType), required: false, default: false
|
26
23
|
end
|
27
24
|
|
28
25
|
RESULT_HEADER = [
|
@@ -33,9 +30,6 @@ module GoodData
|
|
33
30
|
|
34
31
|
class << self
|
35
32
|
def call(params)
|
36
|
-
# Check if all required parameters were passed
|
37
|
-
BaseAction.check_params(PARAMS, params)
|
38
|
-
|
39
33
|
client = params.gdc_gd_client
|
40
34
|
|
41
35
|
domain_name = params.organization || params.domain
|
@@ -50,7 +44,7 @@ module GoodData
|
|
50
44
|
segment_names.include?(segment.segment_id.downcase)
|
51
45
|
end
|
52
46
|
|
53
|
-
results = segments.
|
47
|
+
results = segments.pmap do |segment|
|
54
48
|
segment.clients.map do |segment_client|
|
55
49
|
project = segment_client.project
|
56
50
|
res = {
|
@@ -12,9 +12,6 @@ module GoodData
|
|
12
12
|
DESCRIPTION = 'Filter Segments'
|
13
13
|
|
14
14
|
PARAMS = define_params(self) do
|
15
|
-
description 'Client Used for Connecting to GD'
|
16
|
-
param :gdc_gd_client, instance_of(Type::GdClientType), required: true
|
17
|
-
|
18
15
|
description 'Segments to manage'
|
19
16
|
param :segments, array_of(instance_of(Type::SegmentType)), required: true
|
20
17
|
|
@@ -24,9 +21,6 @@ module GoodData
|
|
24
21
|
|
25
22
|
class << self
|
26
23
|
def call(params)
|
27
|
-
# Check if all required parameters were passed
|
28
|
-
BaseAction.check_params(PARAMS, params)
|
29
|
-
|
30
24
|
filtered_segments = params.segments
|
31
25
|
if params.segments_filter
|
32
26
|
segments_filter = params.segments_filter.map(&:downcase)
|
@@ -14,6 +14,12 @@ module GoodData
|
|
14
14
|
PARAMS = define_params(self) do
|
15
15
|
description 'Client Used for Connecting to GD'
|
16
16
|
param :gdc_gd_client, instance_of(Type::GdClientType), required: true
|
17
|
+
|
18
|
+
description 'Development Client Used for Connecting to GD'
|
19
|
+
param :development_client, instance_of(Type::GdClientType), required: true
|
20
|
+
|
21
|
+
description 'Synchronization Info'
|
22
|
+
param :synchronize, array_of(instance_of(Type::SynchronizationInfoType)), required: true, generated: true
|
17
23
|
end
|
18
24
|
|
19
25
|
RESULT_HEADER = [
|
@@ -24,19 +30,17 @@ module GoodData
|
|
24
30
|
|
25
31
|
class << self
|
26
32
|
def call(params)
|
27
|
-
BaseAction.check_params(PARAMS, params)
|
28
|
-
|
29
33
|
results = []
|
30
34
|
|
31
35
|
client = params.gdc_gd_client
|
32
36
|
development_client = params.development_client
|
33
37
|
|
34
|
-
params.synchronize.
|
38
|
+
params.synchronize.peach do |info|
|
35
39
|
from = info.from
|
36
40
|
to = info.to
|
37
41
|
|
38
42
|
from_project = development_client.projects(from) || fail("Invalid 'from' project specified - '#{from}'")
|
39
|
-
to_projects = to.
|
43
|
+
to_projects = to.pmap do |entry|
|
40
44
|
pid = entry[:pid]
|
41
45
|
client.projects(pid) || fail("Invalid 'to' project specified - '#{pid}'")
|
42
46
|
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
#
|
3
|
+
# Copyright (c) 2010-2017 GoodData Corporation. All rights reserved.
|
4
|
+
# This source code is licensed under the BSD-style license found in the
|
5
|
+
# LICENSE file in the root directory of this source tree.
|
6
|
+
|
7
|
+
require_relative 'base_action'
|
8
|
+
|
9
|
+
module GoodData
|
10
|
+
module LCM2
|
11
|
+
class SynchronizeComputedAttributes < BaseAction
|
12
|
+
DESCRIPTION = 'Synchronize Computed Attributes'
|
13
|
+
|
14
|
+
PARAMS = define_params(self) do
|
15
|
+
description 'Client Used for Connecting to GD'
|
16
|
+
param :gdc_gd_client, instance_of(Type::GdClientType), required: true
|
17
|
+
|
18
|
+
description 'Synchronization Info'
|
19
|
+
param :synchronize, array_of(instance_of(Type::SynchronizationInfoType)), required: true, generated: true
|
20
|
+
end
|
21
|
+
|
22
|
+
class << self
|
23
|
+
def call(params)
|
24
|
+
results = []
|
25
|
+
client = params.gdc_gd_client
|
26
|
+
|
27
|
+
params.synchronize.each do |info|
|
28
|
+
from = info.from
|
29
|
+
to_projects = info.to
|
30
|
+
|
31
|
+
params.gdc_logger.info "Synchronize Computed Attributes from project pid: #{from}"
|
32
|
+
|
33
|
+
to_projects.peach do |entry|
|
34
|
+
ca_scripts = entry[:ca_scripts]
|
35
|
+
next unless ca_scripts
|
36
|
+
|
37
|
+
pid = entry[:pid]
|
38
|
+
ca_chunks = ca_scripts['maqlDdlChunks']
|
39
|
+
to_project = client.projects(pid) || fail("Invalid 'to' project specified - '#{pid}'")
|
40
|
+
params.gdc_logger.info "Synchronizing Computed Attributes to project: '#{to_project.title}', PID: #{pid}"
|
41
|
+
|
42
|
+
begin
|
43
|
+
ca_chunks.each { |chunk| to_project.execute_maql(chunk) }
|
44
|
+
rescue => e
|
45
|
+
raise "Error occured when executing MAQL, project: \"#{to_project.title}\" reason: \"#{e.message}\", chunks: #{ca_chunks.inspect}"
|
46
|
+
end
|
47
|
+
|
48
|
+
results << {
|
49
|
+
from: from,
|
50
|
+
to: pid,
|
51
|
+
status: 'ok'
|
52
|
+
}
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
results
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|