gooddata 1.0.2-java → 1.1.0-java

Sign up to get free protection for your applications and to get access to all the features.
Files changed (149) hide show
  1. checksums.yaml +5 -5
  2. data/.gitignore +1 -0
  3. data/CONTRIBUTING.md +12 -0
  4. data/README.md +5 -2
  5. data/Rakefile +0 -1
  6. data/dev-gooddata-sso.pub.encrypted +40 -0
  7. data/gooddata.gemspec +3 -3
  8. data/lib/gooddata/connection.rb +23 -13
  9. data/lib/gooddata/helpers/data_helper.rb +0 -1
  10. data/lib/gooddata/lcm/actions/apply_custom_maql.rb +8 -1
  11. data/lib/gooddata/lcm/actions/associate_clients.rb +8 -1
  12. data/lib/gooddata/lcm/actions/base_action.rb +10 -0
  13. data/lib/gooddata/lcm/actions/collect_ca_metrics.rb +7 -1
  14. data/lib/gooddata/lcm/actions/collect_client_projects.rb +3 -0
  15. data/lib/gooddata/lcm/actions/collect_clients.rb +3 -1
  16. data/lib/gooddata/lcm/actions/collect_data_product.rb +10 -2
  17. data/lib/gooddata/lcm/actions/collect_dynamic_schedule_params.rb +12 -1
  18. data/lib/gooddata/lcm/actions/collect_ldm_objects.rb +6 -2
  19. data/lib/gooddata/lcm/actions/collect_meta.rb +1 -1
  20. data/lib/gooddata/lcm/actions/collect_segment_clients.rb +8 -1
  21. data/lib/gooddata/lcm/actions/collect_segments.rb +6 -5
  22. data/lib/gooddata/lcm/actions/collect_tagged_objects.rb +1 -1
  23. data/lib/gooddata/lcm/actions/collect_users_brick_users.rb +10 -4
  24. data/lib/gooddata/lcm/actions/create_segment_masters.rb +12 -2
  25. data/lib/gooddata/lcm/actions/ensure_data_product.rb +10 -0
  26. data/lib/gooddata/lcm/actions/ensure_technical_users_domain.rb +5 -1
  27. data/lib/gooddata/lcm/actions/ensure_technical_users_project.rb +3 -0
  28. data/lib/gooddata/lcm/actions/execute_schedules.rb +10 -0
  29. data/lib/gooddata/lcm/actions/import_object_collections.rb +1 -1
  30. data/lib/gooddata/lcm/actions/provision_clients.rb +12 -2
  31. data/lib/gooddata/lcm/actions/purge_clients.rb +2 -0
  32. data/lib/gooddata/lcm/actions/rename_existing_client_projects.rb +3 -0
  33. data/lib/gooddata/lcm/actions/synchronize_attribute_drillpaths.rb +4 -1
  34. data/lib/gooddata/lcm/actions/synchronize_cas.rb +7 -1
  35. data/lib/gooddata/lcm/actions/synchronize_clients.rb +11 -1
  36. data/lib/gooddata/lcm/actions/synchronize_color_palette.rb +7 -1
  37. data/lib/gooddata/lcm/actions/synchronize_etls_in_segment.rb +12 -7
  38. data/lib/gooddata/lcm/actions/synchronize_label_types.rb +4 -1
  39. data/lib/gooddata/lcm/actions/synchronize_ldm.rb +18 -7
  40. data/lib/gooddata/lcm/actions/synchronize_meta.rb +9 -0
  41. data/lib/gooddata/lcm/actions/synchronize_new_segments.rb +11 -1
  42. data/lib/gooddata/lcm/actions/synchronize_processes.rb +7 -1
  43. data/lib/gooddata/lcm/actions/synchronize_schedules.rb +4 -1
  44. data/lib/gooddata/lcm/actions/synchronize_tag_objects.rb +6 -0
  45. data/lib/gooddata/lcm/actions/synchronize_user_filters.rb +60 -15
  46. data/lib/gooddata/lcm/actions/synchronize_user_groups.rb +7 -1
  47. data/lib/gooddata/lcm/actions/synchronize_users.rb +106 -3
  48. data/lib/gooddata/lcm/actions/update_release_table.rb +19 -0
  49. data/lib/gooddata/lcm/helpers/check_helper.rb +21 -6
  50. data/lib/gooddata/lcm/lcm2.rb +35 -22
  51. data/lib/gooddata/lcm/types/class/gd_logger.rb +23 -0
  52. data/lib/gooddata/lcm/types/class/gd_product.rb +23 -0
  53. data/lib/gooddata/lcm/types/class/gd_project.rb +23 -0
  54. data/lib/gooddata/lcm/types/class/smart_hash.rb +23 -0
  55. data/lib/gooddata/lcm/types/complex/segment.rb +1 -1
  56. data/lib/gooddata/lcm/types/scalar/integer.rb +2 -2
  57. data/lib/gooddata/lcm/types/special/any.rb +18 -0
  58. data/lib/gooddata/models/blueprint/dataset_blueprint.rb +1 -1
  59. data/lib/gooddata/models/blueprint/to_manifest.rb +1 -3
  60. data/lib/gooddata/models/blueprint/to_wire.rb +2 -1
  61. data/lib/gooddata/models/from_wire.rb +13 -1
  62. data/lib/gooddata/models/metadata/folder.rb +22 -0
  63. data/lib/gooddata/models/metadata/metric.rb +5 -8
  64. data/lib/gooddata/models/model.rb +1 -1
  65. data/lib/gooddata/models/process.rb +42 -32
  66. data/lib/gooddata/models/project.rb +19 -36
  67. data/lib/gooddata/models/project_creator.rb +3 -1
  68. data/lib/gooddata/models/project_role.rb +3 -4
  69. data/lib/gooddata/models/schedule.rb +0 -2
  70. data/lib/gooddata/models/user_filters/mandatory_user_filter.rb +9 -1
  71. data/lib/gooddata/models/user_filters/user_filter.rb +1 -2
  72. data/lib/gooddata/models/user_filters/user_filter_builder.rb +18 -6
  73. data/lib/gooddata/rest/client.rb +1 -2
  74. data/lib/gooddata/rest/connection.rb +12 -46
  75. data/lib/gooddata/rest/phmap.rb +101 -56
  76. data/lib/gooddata/version.rb +1 -1
  77. data/rubydev_public.gpg.encrypted +51 -0
  78. data/rubydev_secret_keys.gpg.encrypted +109 -0
  79. data/spec/data/user_filters.csv +2 -0
  80. data/spec/environment/default.rb +2 -2
  81. data/spec/environment/development.rb +1 -1
  82. data/spec/environment/staging.rb +2 -3
  83. data/spec/environment/testing.rb +4 -4
  84. data/spec/integration/connection_spec.rb +37 -0
  85. data/spec/integration/core/connection_spec.rb +1 -1
  86. data/spec/integration/core/logging_spec.rb +8 -6
  87. data/spec/integration/core/project_spec.rb +1 -1
  88. data/spec/integration/mandatory_user_filter_spec.rb +53 -0
  89. data/spec/integration/mixins/id_to_uri_spec.rb +17 -5
  90. data/spec/integration/models/label_spec.rb +9 -0
  91. data/spec/integration/models/metric_spec.rb +24 -0
  92. data/spec/integration/models/process_spec.rb +35 -0
  93. data/spec/integration/models/project_role_spec.rb +1 -1
  94. data/spec/integration/models/schedule_spec.rb +0 -8
  95. data/spec/integration/schedule_spec.rb +4 -6
  96. data/spec/integration/user_filters_spec.rb +20 -16
  97. data/spec/integration/user_group_spec.rb +1 -1
  98. data/spec/integration/vcr_cassettes/GoodData_-_logging/_logger/can_assign_a_custom_logger.yml +2287 -0
  99. data/spec/integration/vcr_cassettes/GoodData_-_logging/_logger/client_logs_when_given_custom_message.yml +2287 -0
  100. data/spec/integration/vcr_cassettes/GoodData_-_logging/_logger/has_the_request_id_logged_when_I_passed_it.yml +2287 -0
  101. data/spec/integration/vcr_cassettes/GoodData_-_logging/_logging_off/Disables_logging.yml +2287 -0
  102. data/spec/integration/vcr_cassettes/GoodData_-_logging/_logging_on/Enables_logging.yml +2287 -0
  103. data/spec/integration/vcr_cassettes/GoodData_-_project/_project/Returns_project_assigned.yml +354 -0
  104. data/spec/integration/vcr_cassettes/GoodData_-_project/_project_/Assigns_nil.yml +299 -0
  105. data/spec/integration/vcr_cassettes/GoodData_-_project/_project_/Assigns_project_directly.yml +354 -0
  106. data/spec/integration/vcr_cassettes/GoodData_-_project/_project_/Assigns_project_using_project_ID.yml +354 -0
  107. data/spec/integration/vcr_cassettes/GoodData_-_project/_project_/Assigns_project_using_project_URL.yml +354 -0
  108. data/spec/integration/vcr_cassettes/GoodData_-_project/_with_project/Uses_project_specified.yml +354 -0
  109. data/spec/integration/vcr_cassettes/GoodData_Metric/all.yml +2065 -0
  110. data/spec/integration/vcr_cassettes/GoodData_Metric/should_be_able_to_update_folders.yml +119 -0
  111. data/spec/integration/vcr_cassettes/GoodData_Mixin_MdIdToUri/all.yml +9812 -0
  112. data/spec/integration/vcr_cassettes/GoodData_Mixin_MdIdToUri/should_get_json_containing_correct_id.yml +174 -0
  113. data/spec/integration/vcr_cassettes/GoodData_Mixin_MdIdToUri/should_return_nil_for_unknown_id.yml +58 -0
  114. data/spec/integration/vcr_cassettes/GoodData_Mixin_MdIdToUri/should_throw_BadRequest_for_-1.yml +63 -0
  115. data/spec/integration/vcr_cassettes/GoodData_Rest_Connection/_connect/Connects_using_username_and_password.yml +299 -0
  116. data/spec/integration/vcr_cassettes/GoodData_Rest_Connection/_disconnect/Connects_using_username_and_password.yml +299 -0
  117. data/spec/integration/vcr_cassettes/GoodData_Rest_Connection/_generate_request_id/Generates_a_non-empty_string.yml +2287 -0
  118. data/spec/integration/vcr_cassettes/GoodData_UserGroup/_/Should_list_user_groups_as_Array.yml +56 -0
  119. data/spec/integration/vcr_cassettes/GoodData_UserGroup/_add_members/Should_add_member.yml +315 -0
  120. data/spec/integration/vcr_cassettes/GoodData_UserGroup/_members/Should_return_members_as_array.yml +54 -0
  121. data/spec/integration/vcr_cassettes/GoodData_UserGroup/_remove_members/Should_remove_existing_members.yml +258 -0
  122. data/spec/integration/vcr_cassettes/GoodData_UserGroup/_save/updates_existing_group.yml +159 -0
  123. data/spec/integration/vcr_cassettes/GoodData_UserGroup/_set_members/Should_set_new_members.yml +158 -0
  124. data/spec/integration/vcr_cassettes/GoodData_UserGroup/all.yml +809 -0
  125. data/spec/spec_helper.rb +46 -2
  126. data/spec/unit/actions/associate_clients_spec.rb +2 -1
  127. data/spec/unit/actions/collect_data_product_spec.rb +3 -1
  128. data/spec/unit/actions/collect_segment_clients_spec.rb +1 -0
  129. data/spec/unit/actions/create_segment_masters_spec.rb +1 -0
  130. data/spec/unit/actions/ensure_data_product_spec.rb +1 -0
  131. data/spec/unit/actions/ensure_technical_users_domain_spec.rb +2 -0
  132. data/spec/unit/actions/ensure_technical_users_project_spec.rb +4 -0
  133. data/spec/unit/actions/provision_clients_spec.rb +2 -1
  134. data/spec/unit/actions/synchronize_etls_in_segment_spec.rb +0 -6
  135. data/spec/unit/actions/synchronize_ldm_spec.rb +20 -7
  136. data/spec/unit/actions/synchronize_user_filters_spec.rb +21 -0
  137. data/spec/unit/helpers/check_helper_production_spec.rb +34 -0
  138. data/spec/unit/helpers/check_helper_spec.rb +97 -9
  139. data/spec/unit/lcm/lcm2_spec.rb +67 -3
  140. data/spec/unit/models/blueprint/to_wire_spec.rb +1 -0
  141. data/spec/unit/models/dataset_blueprint.rb +14 -0
  142. data/spec/unit/models/from_wire_spec.rb +20 -0
  143. data/spec/unit/models/model_spec.rb +10 -0
  144. data/spec/unit/models/to_manifest_spec.rb +29 -0
  145. data/spec/unit/models/user_filters/user_filter_builder_spec.rb +44 -6
  146. data/spec/unit/rest/phmap_spec.rb +117 -0
  147. data/spec/vcr_configurer.rb +63 -0
  148. metadata +283 -24
  149. data/lib/gooddata/lcm/actions/ensure_segments.rb +0 -32
@@ -14,6 +14,15 @@ 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 'Client used to connecting to development domain'
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
23
+
24
+ description 'Additional Hidden Parameters'
25
+ param :additional_hidden_params, instance_of(Type::HashType), required: false
17
26
  end
18
27
 
19
28
  class << self
@@ -15,11 +15,20 @@ 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 'DataProduct to manage'
19
+ param :data_product, instance_of(Type::GDDataProductType), required: false
20
+
18
21
  description 'Organization Name'
19
- param :organization, instance_of(Type::StringType), required: true
22
+ param :organization, instance_of(Type::StringType), required: false
23
+
24
+ description 'Domain'
25
+ param :domain, instance_of(Type::StringType), required: false
20
26
 
21
27
  description 'Segments to manage'
22
28
  param :segments, array_of(instance_of(Type::SegmentType)), required: true
29
+
30
+ description 'Additional Hidden Parameters'
31
+ param :additional_hidden_params, instance_of(Type::HashType), required: false
23
32
  end
24
33
 
25
34
  class << self
@@ -27,6 +36,7 @@ module GoodData
27
36
  client = params.gdc_gd_client
28
37
 
29
38
  domain_name = params.organization || params.domain
39
+ fail "Either organisation or domain has to be specified in params" unless domain_name
30
40
  domain = client.domain(domain_name) || fail("Invalid domain name specified - #{domain_name}")
31
41
  data_product = params.data_product
32
42
  domain_segments = domain.segments(:all, data_product)
@@ -15,11 +15,17 @@ 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'
18
+ description 'Client used to connecting to development domain'
19
19
  param :development_client, instance_of(Type::GdClientType), required: true
20
20
 
21
21
  description 'Synchronization Info'
22
22
  param :synchronize, array_of(instance_of(Type::SynchronizationInfoType)), required: true, generated: true
23
+
24
+ description 'Logger'
25
+ param :gdc_logger, instance_of(Type::GdLogger), required: true
26
+
27
+ description 'Additional Hidden Parameters'
28
+ param :additional_hidden_params, instance_of(Type::HashType), required: false
23
29
  end
24
30
 
25
31
  RESULT_HEADER = [
@@ -15,7 +15,7 @@ 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'
18
+ description 'Client used to connecting to development domain'
19
19
  param :development_client, instance_of(Type::GdClientType), required: true
20
20
 
21
21
  description 'Synchronization Info'
@@ -26,6 +26,9 @@ module GoodData
26
26
 
27
27
  description 'Schedule Additional Secure Parameters'
28
28
  param :additional_hidden_params, instance_of(Type::HashType), required: false
29
+
30
+ description 'Logger'
31
+ param :gdc_logger, instance_of(Type::GdLogger), required: true
29
32
  end
30
33
 
31
34
  RESULT_HEADER = [
@@ -16,6 +16,9 @@ module GoodData
16
16
  description 'Client Used for Connecting to GD'
17
17
  param :gdc_gd_client, instance_of(Type::GdClientType), required: true
18
18
 
19
+ description 'Client used to connecting to development domain'
20
+ param :development_client, instance_of(Type::GdClientType), required: true
21
+
19
22
  description 'Synchronization Info'
20
23
  param :synchronize, array_of(instance_of(Type::SynchronizationInfoType)), required: true, generated: true
21
24
 
@@ -24,6 +27,9 @@ module GoodData
24
27
 
25
28
  description 'Production Tag Names'
26
29
  param :production_tag, instance_of(Type::StringType), required: false, deprecated: true, replacement: :production_tags
30
+
31
+ description 'Additional Hidden Parameters'
32
+ param :additional_hidden_params, instance_of(Type::HashType), required: false
27
33
  end
28
34
 
29
35
  class << self
@@ -42,8 +42,32 @@ module GoodData
42
42
  description 'Restricts synchronization to specified segments'
43
43
  param :segments_filter, array_of(instance_of(Type::StringType)), required: false
44
44
 
45
- # gdc_project/gdc_project_id, required: true
46
- # organization/domain, required: true
45
+ description 'Organization Name'
46
+ param :organization, instance_of(Type::StringType), required: false
47
+
48
+ description 'Domain'
49
+ param :domain, instance_of(Type::StringType), required: false
50
+
51
+ description 'DataProduct to manage'
52
+ param :data_product, instance_of(Type::GDDataProductType), required: true
53
+
54
+ description 'Segments to manage'
55
+ param :segments, array_of(instance_of(Type::SegmentType)), required: false
56
+
57
+ description 'Logger'
58
+ param :gdc_logger, instance_of(Type::GdLogger), required: true
59
+
60
+ description 'GDC Project'
61
+ param :gdc_project, instance_of(Type::GdProjectType), required: false
62
+
63
+ description 'GDC Project Id'
64
+ param :gdc_project_id, instance_of(Type::StringType), required: false
65
+
66
+ description 'User brick users'
67
+ param :users_brick_users, instance_of(Type::ObjectType), required: false
68
+
69
+ description 'Makes the brick run without altering user filters'
70
+ param :dry_run, instance_of(Type::StringType), required: false, default: false
47
71
  end
48
72
 
49
73
  class << self
@@ -61,8 +85,10 @@ module GoodData
61
85
  def call(params)
62
86
  client = params.gdc_gd_client
63
87
  domain_name = params.organization || params.domain
88
+ fail "Either organisation or domain has to be specified in params" unless domain_name
64
89
  domain = client.domain(domain_name) if domain_name
65
90
  project = client.projects(params.gdc_project) || client.projects(params.gdc_project_id)
91
+ fail "Either project or project_id has to be specified in params" unless project
66
92
  data_product = params.data_product
67
93
 
68
94
  data_source = GoodData::Helpers::DataSource.new(params.input_source)
@@ -101,29 +127,39 @@ module GoodData
101
127
  ignore_missing_values: params.ignore_missing_values == 'true',
102
128
  do_not_touch_filters_that_are_not_mentioned: params.do_not_touch_filters_that_are_not_mentioned == 'true',
103
129
  domain: domain,
104
- dry_run: false,
130
+ dry_run: params[:dry_run],
105
131
  users_brick_input: params.users_brick_users
106
132
  }
107
133
 
108
134
  puts "Synchronizing in mode \"#{mode}\""
109
135
  case mode
110
136
  when 'sync_project'
111
- CSV.foreach(File.open(data_source.realize(params), 'r:UTF-8'), headers: csv_with_headers, return_headers: false, encoding: 'utf-8') do |row|
112
- filters << row
137
+ without_check(PARAMS, params) do
138
+ CSV.foreach(File.open(data_source.realize(params), 'r:UTF-8'), headers: csv_with_headers, return_headers: false, encoding: 'utf-8') do |row|
139
+ filters << row
140
+ end
113
141
  end
114
142
  filters_to_load = GoodData::UserFilterBuilder.get_filters(filters, symbolized_config)
115
143
  puts "Synchronizing #{filters_to_load.count} filters"
116
144
  project.add_data_permissions(filters_to_load, run_params)
117
145
  when 'sync_one_project_based_on_pid'
118
- CSV.foreach(File.open(data_source.realize(params), 'r:UTF-8'), headers: csv_with_headers, return_headers: false, encoding: 'utf-8') do |row|
119
- filters << row if row[multiple_projects_column] == project.pid
146
+ without_check(PARAMS, params) do
147
+ CSV.foreach(File.open(data_source.realize(params), 'r:UTF-8'), headers: csv_with_headers, return_headers: false, encoding: 'utf-8') do |row|
148
+ filters << row if row[multiple_projects_column] == project.pid
149
+ end
120
150
  end
121
151
  filters_to_load = GoodData::UserFilterBuilder.get_filters(filters, symbolized_config)
122
152
  puts "Synchronizing #{filters_to_load.count} filters"
123
153
  project.add_data_permissions(filters_to_load, run_params)
124
154
  when 'sync_multiple_projects_based_on_pid'
125
- CSV.foreach(File.open(data_source.realize(params), 'r:UTF-8'), headers: csv_with_headers, return_headers: false, encoding: 'utf-8') do |row|
126
- filters << row.to_hash
155
+ without_check(PARAMS, params) do
156
+ CSV.foreach(File.open(data_source.realize(params), 'r:UTF-8'), headers: csv_with_headers, return_headers: false, encoding: 'utf-8') do |row|
157
+ filters << row.to_hash
158
+ end
159
+ end
160
+ if filters.empty?
161
+ fail 'The filter set can not be empty when using sync_multiple_projects_* mode as the filters contain \
162
+ the project ids in which the permissions should be changed'
127
163
  end
128
164
  filters.group_by { |u| u[multiple_projects_column] }.flat_map do |project_id, new_filters|
129
165
  fail "Project id cannot be empty" if project_id.blank?
@@ -135,7 +171,9 @@ module GoodData
135
171
  when 'sync_one_project_based_on_custom_id'
136
172
  filter_value = UserBricksHelper.resolve_client_id(domain, project, data_product)
137
173
 
138
- filepath = File.open(data_source.realize(params), 'r:UTF-8')
174
+ filepath = without_check(PARAMS, params) do
175
+ File.open(data_source.realize(params), 'r:UTF-8')
176
+ end
139
177
  CSV.foreach(filepath, headers: csv_with_headers, return_headers: false, encoding: 'utf-8') do |row|
140
178
  client_id = row[multiple_projects_column].to_s
141
179
  filters << row if client_id == filter_value
@@ -150,10 +188,15 @@ module GoodData
150
188
  puts "Synchronizing #{filters_to_load.count} filters"
151
189
  project.add_data_permissions(filters_to_load, run_params)
152
190
  when 'sync_multiple_projects_based_on_custom_id'
153
- CSV.foreach(File.open(data_source.realize(params), 'r:UTF-8'), headers: csv_with_headers, return_headers: false, encoding: 'utf-8') do |row|
154
- filters << row.to_hash
191
+ without_check(PARAMS, params) do
192
+ CSV.foreach(File.open(data_source.realize(params), 'r:UTF-8'), headers: csv_with_headers, return_headers: false, encoding: 'utf-8') do |row|
193
+ filters << row.to_hash
194
+ end
195
+ end
196
+ if filters.empty?
197
+ fail 'The filter set can not be empty when using sync_multiple_projects_* mode as the filters contain \
198
+ the project ids in which the permissions should be changed'
155
199
  end
156
- fail 'The filter set can not be empty when using sync_multiple_projects_based_on_custom_id mode' if filters.empty?
157
200
  filters.group_by { |u| u[multiple_projects_column] }.flat_map do |client_id, new_filters|
158
201
  fail "Client id cannot be empty" if client_id.blank?
159
202
  project = domain.clients(client_id, data_product).project
@@ -163,8 +206,10 @@ module GoodData
163
206
  project.add_data_permissions(filters_to_load, run_params)
164
207
  end
165
208
  when 'sync_domain_client_workspaces'
166
- CSV.foreach(File.open(data_source.realize(params), 'r:UTF-8'), headers: csv_with_headers, return_headers: false, encoding: 'utf-8') do |row|
167
- filters << row.to_hash
209
+ without_check(PARAMS, params) do
210
+ CSV.foreach(File.open(data_source.realize(params), 'r:UTF-8'), headers: csv_with_headers, return_headers: false, encoding: 'utf-8') do |row|
211
+ filters << row.to_hash
212
+ end
168
213
  end
169
214
 
170
215
  domain_clients = domain.clients(:all, data_product)
@@ -16,11 +16,17 @@ module GoodData
16
16
  description 'Client Used for Connecting to GD'
17
17
  param :gdc_gd_client, instance_of(Type::GdClientType), required: true
18
18
 
19
- description 'Development Client Used for Connecting to GD'
19
+ description 'Client used to connecting to development domain'
20
20
  param :development_client, instance_of(Type::GdClientType), required: true
21
21
 
22
22
  description 'Synchronization Info'
23
23
  param :synchronize, array_of(instance_of(Type::SynchronizationInfoType)), required: true, generated: true
24
+
25
+ description 'Logger'
26
+ param :gdc_logger, instance_of(Type::GdLogger), required: true
27
+
28
+ description 'Additional Hidden Parameters'
29
+ param :additional_hidden_params, instance_of(Type::HashType), required: false
24
30
  end
25
31
 
26
32
  class << self
@@ -25,13 +25,107 @@ module GoodData
25
25
  description 'Column That Contains Target Project IDs'
26
26
  param :multiple_projects_column, instance_of(Type::StringType), required: false
27
27
 
28
- # gdc_project/gdc_project_id, required: true
29
- # organization/domain, required: true
28
+ description 'DataProduct to manage'
29
+ param :data_product, instance_of(Type::GDDataProductType), required: false
30
+
31
+ description 'Organization Name'
32
+ param :organization, instance_of(Type::StringType), required: false
33
+
34
+ description 'Domain'
35
+ param :domain, instance_of(Type::StringType), required: false
36
+
37
+ description 'Logger'
38
+ param :gdc_logger, instance_of(Type::GdLogger), required: true
39
+
40
+ description 'GDC Project'
41
+ param :gdc_project, instance_of(Type::GdProjectType), required: false
42
+
43
+ description 'GDC Project Id'
44
+ param :gdc_project_id, instance_of(Type::StringType), required: false
45
+
46
+ description 'Segments to manage'
47
+ param :segments, array_of(instance_of(Type::SegmentType)), required: false
48
+
49
+ description 'Additional Hidden Parameters'
50
+ param :additional_hidden_params, instance_of(Type::HashType), required: false
51
+
52
+ description 'Whitelists'
53
+ param :whitelists, array_of(instance_of(Type::StringType)), required: false
54
+
55
+ description 'Regular expresion whitelists'
56
+ param :regexp_whitelists, array_of(instance_of(Type::StringType)), required: false
57
+
58
+ description 'Ignore Failures Flag'
59
+ param :ignore_failures, instance_of(Type::BooleanType), required: false, default: false
60
+
61
+ description 'Remove users from project flag'
62
+ param :remove_users_from_project, instance_of(Type::BooleanType), required: false, default: false
63
+
64
+ description 'Do not touch users that are not mentioned flag'
65
+ param :do_not_touch_users_that_are_not_mentioned, instance_of(Type::BooleanType), required: false, default: false
66
+
67
+ description 'Create non existing user groups flag'
68
+ param :create_non_existing_user_groups, instance_of(Type::BooleanType), required: false, default: true
69
+
70
+ description 'Single sign on provider'
71
+ param :sso_provider, instance_of(Type::StringType), required: false
72
+
73
+ description 'ADS client'
74
+ param :ads_client, instance_of(Type::AdsClientType), required: false
75
+
76
+ description 'Authentication modes'
77
+ param :authentication_modes, instance_of(Type::StringType), required: false
78
+
79
+ description 'First name column'
80
+ param :first_name_column, instance_of(Type::StringType), required: false
81
+
82
+ description 'Last name column'
83
+ param :last_name_column, instance_of(Type::StringType), required: false
84
+
85
+ description 'Login column'
86
+ param :login_column, instance_of(Type::StringType), required: false
87
+
88
+ description 'Password column'
89
+ param :password_column, instance_of(Type::StringType), required: false
90
+
91
+ description 'Email column'
92
+ param :email_column, instance_of(Type::StringType), required: false
93
+
94
+ description 'Role column'
95
+ param :role_column, instance_of(Type::StringType), required: false
96
+
97
+ description 'Sso provider column'
98
+ param :sso_provider_column, instance_of(Type::StringType), required: false
99
+
100
+ description 'Authentication modes column'
101
+ param :authentication_modes_column, instance_of(Type::StringType), required: false
102
+
103
+ description 'User groups column'
104
+ param :user_groups_column, instance_of(Type::StringType), required: false
105
+
106
+ description 'Language column'
107
+ param :language_column, instance_of(Type::StringType), required: false
108
+
109
+ description 'Company column'
110
+ param :company_column, instance_of(Type::StringType), required: false
111
+
112
+ description 'Position column'
113
+ param :position_column, instance_of(Type::StringType), required: false
114
+
115
+ description 'Country column'
116
+ param :country_column, instance_of(Type::StringType), required: false
117
+
118
+ description 'Phone column'
119
+ param :phone_column, instance_of(Type::StringType), required: false
120
+
121
+ description 'Ip whitelist column'
122
+ param :ip_whitelist_column, instance_of(Type::StringType), required: false
30
123
  end
31
124
 
32
125
  class << self
33
126
  MODES = %w(
34
127
  add_to_organization
128
+ remove_from_organization
35
129
  sync_project
36
130
  sync_domain_and_project
37
131
  sync_multiple_projects_based_on_pid
@@ -48,7 +142,9 @@ module GoodData
48
142
  def call(params)
49
143
  client = params.gdc_gd_client
50
144
  domain_name = params.organization || params.domain
145
+ fail "Either organisation or domain has to be specified in params" unless domain_name
51
146
  project = client.projects(params.gdc_project) || client.projects(params.gdc_project_id)
147
+ fail "Either project or project_id has to be specified in params" unless project
52
148
  data_source = GoodData::Helpers::DataSource.new(params.input_source)
53
149
  data_product = params.data_product
54
150
  mode = params.sync_mode
@@ -88,6 +184,11 @@ module GoodData
88
184
  results = case mode
89
185
  when 'add_to_organization'
90
186
  domain.create_users(new_users.uniq { |u| u[:login] || u[:email] })
187
+ when 'remove_from_organization'
188
+ user_ids = new_users.uniq { |u| u[:login] || u[:email] }.map { |u| u[:login] || u[:email] }
189
+ users = user_ids.map { |u| domain.users(u, client: client) }
190
+ params.gdc_logger.warn "Deleting #{users.count} users from domain #{domain_name}"
191
+ users.map(&:delete)
91
192
  when 'sync_project'
92
193
  project.import_users(new_users,
93
194
  domain: domain,
@@ -289,7 +390,9 @@ module GoodData
289
390
  if dwh
290
391
  data = dwh.execute_select(params.input_source.query)
291
392
  else
292
- tmp = File.open(data_source.realize(params), 'r:UTF-8')
393
+ tmp = without_check(PARAMS, params) do
394
+ File.open(data_source.realize(params), 'r:UTF-8')
395
+ end
293
396
  data = CSV.read(tmp, headers: true)
294
397
  end
295
398
 
@@ -14,6 +14,24 @@ module GoodData
14
14
  PARAMS = define_params(self) do
15
15
  description 'ADS Client'
16
16
  param :ads_client, instance_of(Type::AdsClientType), required: true
17
+
18
+ description 'Client Used for Connecting to GD'
19
+ param :gdc_gd_client, instance_of(Type::GdClientType), required: true
20
+
21
+ description 'Organization Name'
22
+ param :organization, instance_of(Type::StringType), required: false
23
+
24
+ description 'Domain'
25
+ param :domain, instance_of(Type::StringType), required: false
26
+
27
+ description 'Segments to manage'
28
+ param :segments, array_of(instance_of(Type::SegmentType)), required: true
29
+
30
+ description 'Table Name'
31
+ param :release_table_name, instance_of(Type::StringType), required: false
32
+
33
+ description 'Query'
34
+ param :query, instance_of(Type::GdSmartHashType), required: false
17
35
  end
18
36
 
19
37
  DEFAULT_TABLE_NAME = 'LCM_RELEASE'
@@ -23,6 +41,7 @@ module GoodData
23
41
  client = params.gdc_gd_client
24
42
 
25
43
  domain_name = params.organization || params.domain
44
+ fail "Either organisation or domain has to be specified in params" unless domain_name
26
45
  client.domain(domain_name) || fail("Invalid domain name specified - #{domain_name}")
27
46
 
28
47
  params.segments.map do |segment_in|
@@ -16,22 +16,37 @@ module GoodData
16
16
  type = specification[param_name][:type]
17
17
  if value.nil? || (value.is_a?(String) && value.empty?)
18
18
  if specification[param_name][:opts][:default]
19
- params[param_name] = specification[param_name][:opts][:default]
19
+ if specification.select { |x| specification[x][:opts][:replacement] == param_name }.first.nil?
20
+ params[param_name] = specification[param_name][:opts][:default]
21
+ else
22
+ GoodData.logger.warn "WARNING: Default value for parameter '#{param_name}' was not filled because deprecated parameter is used instead."
23
+ end
20
24
  elsif specification[param_name][:opts][:required]
21
- fail("Mandatory parameter '#{param_name}' of type '#{type}' is not specified")
25
+ if ENV['RSPEC_ENV'] == 'test'
26
+ fail "Mandatory parameter '#{param_name}' of type '#{type}' is not specified"
27
+ else
28
+ GoodData.logger.error("Mandatory parameter '#{param_name}' of type '#{type}' is not specified")
29
+ end
22
30
  end
23
31
  else
24
32
  if type.class.const_get(:CATEGORY) == :complex && !value.is_a?(Hash)
25
- puts JSON.pretty_generate(params)
26
- fail "Expected parameter '#{param_name}' to be kind of '#{type}', got '#{value.class.name}'"
33
+ if ENV['RSPEC_ENV'] == 'test'
34
+ fail "Expected parameter '#{param_name}' to be kind of '#{type}', got '#{value.class.name}'"
35
+ else
36
+ GoodData.logger.error("Expected parameter '#{param_name}' to be kind of '#{type}', got '#{value.class.name}'")
37
+ end
27
38
  end
28
39
 
29
40
  if specification[param_name][:opts][:deprecated]
30
- puts "WARNING: Parameter '#{param_name}' is deprecated. Please use '#{specification[param_name][:opts][:replacement]}' instead."
41
+ GoodData.logger.warn("WARNING: Parameter '#{param_name}' is deprecated. Please use '#{specification[param_name][:opts][:replacement]}' instead.")
31
42
  end
32
43
 
33
44
  unless type.check(value)
34
- fail "Parameter '#{param_name}' has invalid type, expected: #{type}"
45
+ if ENV['RSPEC_ENV'] == 'test'
46
+ fail "Parameter '#{param_name}' has invalid type, expected: #{type}, got #{value.class}"
47
+ else
48
+ GoodData.logger.error("Parameter '#{param_name}' has invalid type, expected: #{type}, got #{value.class}")
49
+ end
35
50
  end
36
51
  end
37
52
  end