gooddata 2.3.2 → 2.3.3
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 +4 -4
- data/.gdc-ii-config.yaml +1 -1
- data/.github/workflows/build.yml +2 -2
- data/.github/workflows/pre-merge.yml +1 -1
- data/CHANGELOG.md +3 -0
- data/Dockerfile +2 -2
- data/Dockerfile.jruby +1 -1
- data/DockerfileOldImage +88 -0
- data/SDK_VERSION +1 -1
- data/VERSION +1 -1
- data/bin/provision.sh +1 -1
- data/bin/release.sh +1 -1
- data/bin/rollout.sh +1 -1
- data/bin/user_filters.sh +1 -1
- data/bin/users.sh +1 -1
- data/ci/snowflake/pom.xml +11 -1
- data/gooddata.gemspec +21 -9
- data/lib/gooddata/cloud_resources/snowflake/snowflake_client.rb +54 -2
- data/lib/gooddata/lcm/actions/import_object_collections.rb +17 -0
- data/lib/gooddata/lcm/actions/synchronize_clients.rb +9 -1
- data/lib/gooddata/lcm/actions/synchronize_etls_in_segment.rb +3 -3
- data/lib/gooddata/models/model.rb +1 -1
- data/lib/gooddata/models/project.rb +2 -1
- data/lib/gooddata/models/segment.rb +3 -2
- data/lib/gooddata/models/user_filters/user_filter_builder.rb +1 -1
- data/lib/gooddata/rest/client.rb +6 -1
- data/lib/gooddata/rest/connection.rb +13 -4
- metadata +97 -96
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 97a2078c48e99110af448e18d393ef2050cb05aa8213bd67aa13db46cebee10d
|
4
|
+
data.tar.gz: 7971d50295257f236a1b6fc8ff82920f05aff00dcb35d14367ecfc56d8d0328d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c79314e9cce4926014aa703d55baee978b0d12935ed2ed1bc21d530425cd1232f37f975410fb13d78b1e9d96a936b7260f8b265e3e34d405f3e3dce84b0b556c
|
7
|
+
data.tar.gz: 5a313c6c0d7e7247d5f1d864612fb5c056029ed95cfcbb6f9c0c0c4f5fea5f29c26d2cd2d882c98a6f4aed4cf02f1bcbbe8c0b6298cf877054c040bcad8d3d79
|
data/.gdc-ii-config.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
microservices:
|
2
2
|
lcm-bricks:
|
3
3
|
docker:
|
4
|
-
dockerfile: './
|
4
|
+
dockerfile: './DockerfileOldImage'
|
5
5
|
# specifies whether promote image to M3 image tag when release LCM. Default always promote image. Don't remote
|
6
6
|
# image when promoteImage configure false
|
7
7
|
promoteImage: false
|
data/.github/workflows/build.yml
CHANGED
@@ -9,7 +9,7 @@ jobs:
|
|
9
9
|
- uses: actions/checkout@v4
|
10
10
|
- uses: ruby/setup-ruby@v1
|
11
11
|
with:
|
12
|
-
ruby-version: jruby-9.4.1
|
12
|
+
ruby-version: jruby-9.4.12.1
|
13
13
|
bundler-cache: true
|
14
14
|
- uses: actions/setup-java@v4
|
15
15
|
with:
|
@@ -41,7 +41,7 @@ jobs:
|
|
41
41
|
needs: [jruby-gem-release, rubygems-release]
|
42
42
|
strategy:
|
43
43
|
matrix:
|
44
|
-
ruby-version: [3.2.1, jruby-9.4.1]
|
44
|
+
ruby-version: [3.2.1, jruby-9.4.12.1]
|
45
45
|
steps:
|
46
46
|
- uses: actions/checkout@v4
|
47
47
|
- uses: ruby/setup-ruby@v1
|
@@ -9,7 +9,7 @@ jobs:
|
|
9
9
|
runs-on: ubuntu-22.04
|
10
10
|
strategy:
|
11
11
|
matrix:
|
12
|
-
ruby-version: [2.5, 2.6, 2.7.6, 3.2.1, jruby-9.2.21, jruby-9.3.14, jruby-9.4.1]
|
12
|
+
ruby-version: [2.5, 2.6, 2.7.6, 3.2.1, jruby-9.2.21, jruby-9.3.14, jruby-9.4.12.1]
|
13
13
|
steps:
|
14
14
|
- uses: actions/checkout@v4
|
15
15
|
- uses: ruby/setup-ruby@v1
|
data/CHANGELOG.md
CHANGED
data/Dockerfile
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
FROM 020413372491.dkr.ecr.us-east-1.amazonaws.com/tools/gdc-java-11-jre-centos9:202501070635.05b6a77
|
2
2
|
|
3
3
|
ARG RVM_VERSION=stable
|
4
|
-
ARG JRUBY_VERSION=9.4.1
|
4
|
+
ARG JRUBY_VERSION=9.4.12.1
|
5
5
|
|
6
6
|
LABEL image_name="GDC LCM Bricks"
|
7
7
|
LABEL maintainer="LCM <lcm@gooddata.com>"
|
@@ -9,7 +9,7 @@ LABEL git_repository_url="https://github.com/gooddata/gooddata-ruby/"
|
|
9
9
|
LABEL parent_image="020413372491.dkr.ecr.us-east-1.amazonaws.com/tools/gdc-java-11-jre-centos9:202501070635.05b6a77"
|
10
10
|
|
11
11
|
# which is required by RVM
|
12
|
-
RUN yum install -y which patch make unzip gnupg git maven procps gzip \
|
12
|
+
RUN yum install -y gcc gcc-c++ which patch make unzip gnupg git maven procps gzip \
|
13
13
|
&& yum clean all \
|
14
14
|
&& rm -rf /var/cache/yum
|
15
15
|
|
data/Dockerfile.jruby
CHANGED
data/DockerfileOldImage
ADDED
@@ -0,0 +1,88 @@
|
|
1
|
+
FROM 020413372491.dkr.ecr.us-east-1.amazonaws.com/tools/gdc-java-11-jre-centos9:202501070635.05b6a77
|
2
|
+
|
3
|
+
ARG RVM_VERSION=stable
|
4
|
+
ARG JRUBY_VERSION=9.2.20.0
|
5
|
+
|
6
|
+
LABEL image_name="GDC LCM Bricks"
|
7
|
+
LABEL maintainer="LCM <lcm@gooddata.com>"
|
8
|
+
LABEL git_repository_url="https://github.com/gooddata/gooddata-ruby/"
|
9
|
+
LABEL parent_image="020413372491.dkr.ecr.us-east-1.amazonaws.com/tools/gdc-java-11-jre-centos9:202501070635.05b6a77"
|
10
|
+
|
11
|
+
# which is required by RVM
|
12
|
+
RUN yum install -y gcc gcc-c++ diffutils curl-minimal which patch make git maven procps \
|
13
|
+
&& yum clean all \
|
14
|
+
&& rm -rf /var/cache/yum
|
15
|
+
|
16
|
+
# Install + verify RVM with gpg (https://rvm.io/rvm/security)
|
17
|
+
RUN curl -sSL https://rvm.io/mpapis.asc | gpg --import - \
|
18
|
+
&& curl -sSL https://rvm.io/pkuczynski.asc | gpg2 --import - \
|
19
|
+
&& curl -sSL https://get.rvm.io | bash -s ${RVM_VERSION} \
|
20
|
+
&& curl -sSL https://raw.githubusercontent.com/rvm/rvm/${RVM_VERSION}/binscripts/rvm-installer -o rvm-installer \
|
21
|
+
&& curl -sSL https://raw.githubusercontent.com/rvm/rvm/${RVM_VERSION}/binscripts/rvm-installer.asc -o rvm-installer.asc \
|
22
|
+
&& gpg2 --verify rvm-installer.asc rvm-installer \
|
23
|
+
&& bash rvm-installer \
|
24
|
+
&& rm rvm-installer rvm-installer.asc \
|
25
|
+
&& echo "bundler" >> /usr/local/rvm/gemsets/global.gems \
|
26
|
+
&& echo "rvm_silence_path_mismatch_check_flag=1" >> /etc/rvmrc \
|
27
|
+
&& echo "install: --no-document" > /etc/gemrc
|
28
|
+
|
29
|
+
# Switch to a bash login shell to allow simple 'rvm' in RUN commands
|
30
|
+
SHELL ["/bin/bash", "-l", "-c"]
|
31
|
+
|
32
|
+
RUN rvm install jruby-${JRUBY_VERSION} \
|
33
|
+
&& gem update --system 3.3.26 \
|
34
|
+
&& gem install bundler -v 2.3.27 \
|
35
|
+
&& gem install rake -v 11.3.0
|
36
|
+
|
37
|
+
WORKDIR /src
|
38
|
+
|
39
|
+
RUN groupadd -g 48 apache \
|
40
|
+
&& groupadd -g 65065 gdcshare \
|
41
|
+
&& useradd -u 48 -m --no-log-init -r -g apache -G rvm apache \
|
42
|
+
&& usermod -a -G gdcshare apache \
|
43
|
+
&& chown apache: /src
|
44
|
+
|
45
|
+
USER apache
|
46
|
+
|
47
|
+
ADD ./bin ./bin
|
48
|
+
ADD --chown=apache:apache ./ci ./ci
|
49
|
+
ADD --chown=apache:apache ./lib ./lib
|
50
|
+
ADD ./SDK_VERSION .
|
51
|
+
ADD ./VERSION .
|
52
|
+
ADD ./Gemfile .
|
53
|
+
ADD ./gooddata.gemspec .
|
54
|
+
|
55
|
+
#build redshift dependencies
|
56
|
+
RUN mvn -f ci/redshift/pom.xml clean install -P binary-packaging
|
57
|
+
RUN cp -rf ci/redshift/target/*.jar ./lib/gooddata/cloud_resources/redshift/drivers/
|
58
|
+
|
59
|
+
#build snowflake dependencies
|
60
|
+
RUN mvn -f ci/snowflake/pom.xml clean install -P binary-packaging
|
61
|
+
RUN cp -rf ci/snowflake/target/*.jar ./lib/gooddata/cloud_resources/snowflake/drivers/
|
62
|
+
|
63
|
+
#build bigquery dependencies
|
64
|
+
RUN mvn -f ci/bigquery/pom.xml clean install -P binary-packaging
|
65
|
+
RUN cp -rf ci/bigquery/target/*.jar ./lib/gooddata/cloud_resources/bigquery/drivers/
|
66
|
+
|
67
|
+
#build postgresql dependencies
|
68
|
+
RUN mvn -f ci/postgresql/pom.xml clean install -P binary-packaging
|
69
|
+
RUN cp -rf ci/postgresql/target/*.jar ./lib/gooddata/cloud_resources/postgresql/drivers/
|
70
|
+
|
71
|
+
#build mssql dependencies
|
72
|
+
RUN mvn -f ci/mssql/pom.xml clean install -P binary-packaging
|
73
|
+
RUN cp -rf ci/mssql/target/*.jar ./lib/gooddata/cloud_resources/mssql/drivers/
|
74
|
+
|
75
|
+
#build mysql dependencies
|
76
|
+
RUN mvn -f ci/mysql/pom.xml clean install -P binary-packaging
|
77
|
+
RUN cp -rf ci/mysql/target/*.jar ./lib/gooddata/cloud_resources/mysql/drivers/
|
78
|
+
|
79
|
+
RUN bundle install
|
80
|
+
|
81
|
+
ARG GIT_COMMIT=unspecified
|
82
|
+
ARG BRICKS_VERSION=unspecified
|
83
|
+
LABEL git_commit=$GIT_COMMIT
|
84
|
+
LABEL bricks_version=$BRICKS_VERSION
|
85
|
+
|
86
|
+
ENV GOODDATA_RUBY_COMMIT=$GIT_COMMIT
|
87
|
+
|
88
|
+
CMD [ "./bin/help.sh" ]
|
data/SDK_VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
2.3.
|
1
|
+
2.3.3
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
3.7.
|
1
|
+
3.7.95
|
data/bin/provision.sh
CHANGED
data/bin/release.sh
CHANGED
data/bin/rollout.sh
CHANGED
data/bin/user_filters.sh
CHANGED
data/bin/users.sh
CHANGED
data/ci/snowflake/pom.xml
CHANGED
@@ -12,13 +12,23 @@
|
|
12
12
|
<dependency>
|
13
13
|
<groupId>net.snowflake</groupId>
|
14
14
|
<artifactId>snowflake-jdbc</artifactId>
|
15
|
-
<version>3.
|
15
|
+
<version>3.24.2</version>
|
16
16
|
</dependency>
|
17
17
|
<dependency>
|
18
18
|
<groupId>org.slf4j</groupId>
|
19
19
|
<artifactId>slf4j-api</artifactId>
|
20
20
|
<version>1.7.2</version>
|
21
21
|
</dependency>
|
22
|
+
<dependency>
|
23
|
+
<groupId>org.bouncycastle</groupId>
|
24
|
+
<artifactId>bcprov-jdk18on</artifactId>
|
25
|
+
<version>1.80</version>
|
26
|
+
</dependency>
|
27
|
+
<dependency>
|
28
|
+
<groupId>org.bouncycastle</groupId>
|
29
|
+
<artifactId>bcpkix-jdk18on</artifactId>
|
30
|
+
<version>1.80</version>
|
31
|
+
</dependency>
|
22
32
|
</dependencies>
|
23
33
|
|
24
34
|
<profiles>
|
data/gooddata.gemspec
CHANGED
@@ -27,16 +27,33 @@ Gem::Specification.new do |s|
|
|
27
27
|
s.require_paths = ['lib']
|
28
28
|
# s.add_development_dependency 'bundler', "~> 1.14"
|
29
29
|
s.add_development_dependency 'license_finder', '~> 2.0'
|
30
|
-
s.add_development_dependency 'rake', '~> 13.0'
|
31
30
|
s.add_development_dependency 'redcarpet', '~> 3.1' if RUBY_PLATFORM != 'java'
|
32
|
-
s.add_development_dependency 'rspec', '~> 3.12.0'
|
33
|
-
s.add_development_dependency 'rspec-expectations', '~> 3.12'
|
34
|
-
s.add_development_dependency 'rspec_junit_formatter', '~> 0.6.0'
|
35
31
|
if RUBY_VERSION >= '2.6'
|
32
|
+
s.add_development_dependency 'rake', '~> 13.0'
|
36
33
|
s.add_development_dependency 'rubocop', '>= 1.28'
|
37
34
|
s.add_development_dependency 'rubocop-ast', '>= 1.24.1', '<= 1.42.0'
|
35
|
+
s.add_development_dependency 'rspec', '~> 3.12.0'
|
36
|
+
s.add_development_dependency 'rspec-expectations', '~> 3.12'
|
37
|
+
s.add_development_dependency 'rspec_junit_formatter', '~> 0.6.0'
|
38
|
+
|
39
|
+
s.add_dependency 'azure-storage-blob', '~> 2.0'
|
40
|
+
s.add_dependency 'nokogiri', '~> 1', '>= 1.10.8'
|
41
|
+
s.add_dependency 'json_pure', '~> 2.6'
|
42
|
+
s.add_dependency 'restforce', '>= 2.4'
|
43
|
+
s.add_dependency 'rubyzip'
|
38
44
|
else
|
45
|
+
s.add_development_dependency 'rake', '~> 11.1'
|
39
46
|
s.add_development_dependency 'rubocop', '~> 0.81'
|
47
|
+
s.add_development_dependency 'rspec', '~> 3.5.0'
|
48
|
+
s.add_development_dependency 'rspec-expectations', '~> 3.5'
|
49
|
+
s.add_development_dependency 'rspec_junit_formatter', '~> 0.3.0'
|
50
|
+
|
51
|
+
s.add_dependency 'azure-storage-blob', '~> 1.1.0'
|
52
|
+
s.add_dependency 'nokogiri', '~> 1.10.0'
|
53
|
+
s.add_dependency 'json_pure', '~> 1.8'
|
54
|
+
s.add_dependency 'restforce', '>= 2.4', '< 4.0'
|
55
|
+
s.add_dependency 'rubyzip', '~> 1.2', '>= 1.2.1'
|
56
|
+
s.add_dependency 'unf', '~> 0.1.4'
|
40
57
|
end
|
41
58
|
s.add_development_dependency 'simplecov', '~> 0.12'
|
42
59
|
s.add_development_dependency 'webmock', '~> 2.3.1'
|
@@ -75,21 +92,16 @@ Gem::Specification.new do |s|
|
|
75
92
|
else
|
76
93
|
s.add_dependency 'docile', '> 1.1', '< 1.4.0'
|
77
94
|
end
|
78
|
-
s.add_dependency 'azure-storage-blob', '~> 2.0'
|
79
|
-
s.add_dependency 'nokogiri', '~> 1', '>= 1.10.8'
|
80
95
|
s.add_dependency 'gli', '~> 2.15'
|
81
96
|
s.add_dependency 'gooddata_datawarehouse', '~> 0.0.12' if RUBY_PLATFORM == 'java'
|
82
97
|
s.add_dependency 'highline', '= 2.0.0.pre.develop.14'
|
83
|
-
s.add_dependency 'json_pure', '~> 2.6'
|
84
98
|
s.add_dependency 'multi_json', '~> 1.12'
|
85
99
|
s.add_dependency 'parseconfig', '~> 1.0'
|
86
100
|
s.add_dependency 'path_expander', '< 1.1.2'
|
87
101
|
s.add_dependency 'pmap', '~> 1.1'
|
88
102
|
s.add_dependency 'sequel', '< 5.72.0'
|
89
103
|
s.add_dependency 'remote_syslog_logger', '~> 1.0.3'
|
90
|
-
s.add_dependency 'restforce', '>= 2.4'
|
91
104
|
s.add_dependency 'rest-client', '~> 2.0'
|
92
|
-
s.add_dependency 'rubyzip'
|
93
105
|
s.add_dependency 'terminal-table', '~> 1.7'
|
94
106
|
s.add_dependency 'thread_safe'
|
95
107
|
s.add_dependency 'backports'
|
@@ -15,6 +15,14 @@ Dir.glob(base + 'drivers/*.jar').each do |file|
|
|
15
15
|
require file unless file.start_with?('lcm-snowflake-driver')
|
16
16
|
end
|
17
17
|
|
18
|
+
java_import 'java.io.StringReader'
|
19
|
+
java_import 'org.bouncycastle.openssl.PEMParser'
|
20
|
+
java_import 'org.bouncycastle.jce.provider.BouncyCastleProvider'
|
21
|
+
java_import 'org.bouncycastle.asn1.pkcs.PrivateKeyInfo'
|
22
|
+
java_import 'org.bouncycastle.pkcs.PKCS8EncryptedPrivateKeyInfo'
|
23
|
+
java_import 'org.bouncycastle.openssl.jcajce.JceOpenSSLPKCS8DecryptorProviderBuilder'
|
24
|
+
java_import 'org.bouncycastle.openssl.jcajce.JcaPEMKeyConverter'
|
25
|
+
|
18
26
|
module GoodData
|
19
27
|
module CloudResources
|
20
28
|
class SnowflakeClient < CloudResourceClient
|
@@ -75,11 +83,19 @@ module GoodData
|
|
75
83
|
GoodData.logger.info "Setting up connection to Snowflake #{@url}"
|
76
84
|
|
77
85
|
prop = java.util.Properties.new
|
78
|
-
prop.setProperty('user', @authentication['basic']['userName'])
|
79
|
-
prop.setProperty('password', @authentication['basic']['password'])
|
80
86
|
prop.setProperty('schema', @schema)
|
81
87
|
prop.setProperty('warehouse', @warehouse)
|
82
88
|
prop.setProperty('db', @database)
|
89
|
+
|
90
|
+
if @authentication['keyPair']
|
91
|
+
prop.setProperty('user', @authentication['keyPair']['userName'])
|
92
|
+
private_key_str = build_private_key(@authentication['keyPair']['privateKey'], @authentication['keyPair']['passPhrase'])
|
93
|
+
prop.setProperty('private_key_base64', private_key_str)
|
94
|
+
else
|
95
|
+
prop.setProperty('user', @authentication['basic']['userName'])
|
96
|
+
prop.setProperty('password', @authentication['basic']['password'])
|
97
|
+
end
|
98
|
+
|
83
99
|
# Add JDBC_QUERY_RESULT_FORMAT parameter to fix unsafe memory issue of Snowflake JDBC driver
|
84
100
|
prop.setProperty('JDBC_QUERY_RESULT_FORMAT', 'JSON')
|
85
101
|
|
@@ -99,6 +115,42 @@ module GoodData
|
|
99
115
|
|
100
116
|
url
|
101
117
|
end
|
118
|
+
|
119
|
+
private
|
120
|
+
|
121
|
+
def build_private_key(private_key_string, pass_phrase)
|
122
|
+
java.security.Security.removeProvider("BC")
|
123
|
+
java.security.Security.addProvider(BouncyCastleProvider.new)
|
124
|
+
|
125
|
+
begin
|
126
|
+
pem_parser = PEMParser.new(StringReader.new(private_key_string))
|
127
|
+
pem_object = pem_parser.readObject
|
128
|
+
|
129
|
+
if pem_object.is_a?(PKCS8EncryptedPrivateKeyInfo)
|
130
|
+
builder = JceOpenSSLPKCS8DecryptorProviderBuilder.new
|
131
|
+
decryptor = builder.build(pass_phrase.to_java.to_char_array)
|
132
|
+
private_key_info = pem_object.decryptPrivateKeyInfo(decryptor)
|
133
|
+
elsif pem_object.is_a?(PrivateKeyInfo)
|
134
|
+
private_key_info = pem_object
|
135
|
+
end
|
136
|
+
|
137
|
+
ensure
|
138
|
+
pem_parser&.close
|
139
|
+
end
|
140
|
+
|
141
|
+
converter = JcaPEMKeyConverter.new
|
142
|
+
private_key = converter.getPrivateKey(private_key_info)
|
143
|
+
pem_str = convert_private_key(private_key)
|
144
|
+
java.util.Base64.getEncoder.encodeToString(pem_str.encode('UTF-8').bytes)
|
145
|
+
end
|
146
|
+
|
147
|
+
def convert_private_key(private_key)
|
148
|
+
pem = "-----BEGIN PRIVATE KEY-----\n"
|
149
|
+
encoder = java.util.Base64.getMimeEncoder(64, "\n".to_java_bytes)
|
150
|
+
base64 = encoder.encodeToString(private_key.getEncoded)
|
151
|
+
"#{pem}#{base64}\n-----END PRIVATE KEY-----"
|
152
|
+
end
|
153
|
+
|
102
154
|
end
|
103
155
|
end
|
104
156
|
end
|
@@ -29,6 +29,7 @@ module GoodData
|
|
29
29
|
def call(params)
|
30
30
|
results = []
|
31
31
|
|
32
|
+
GoodData.logger.info 'Starting ImportObjectCollections action'
|
32
33
|
client = params.gdc_gd_client
|
33
34
|
development_client = params.development_client
|
34
35
|
number_of_threads = Integer(params.number_of_threads || '8')
|
@@ -45,7 +46,9 @@ module GoodData
|
|
45
46
|
to_project = client.projects(pid) || fail("Invalid 'to' project specified - '#{pid}'")
|
46
47
|
|
47
48
|
if transfer_uris.any?
|
49
|
+
logging_data(from, pid, transfer_uris, true)
|
48
50
|
from_project.partial_md_export(transfer_uris, project: to_project)
|
51
|
+
logging_data(from, pid, transfer_uris, false)
|
49
52
|
end
|
50
53
|
|
51
54
|
results << {
|
@@ -58,6 +61,20 @@ module GoodData
|
|
58
61
|
|
59
62
|
results
|
60
63
|
end
|
64
|
+
|
65
|
+
private
|
66
|
+
|
67
|
+
def logging_data(from_project, to_project, transfer_uris, start_action)
|
68
|
+
if start_action
|
69
|
+
# Logging to execution log
|
70
|
+
GoodData.logger.info "Starting import objects, from_project: #{from_project}, to_project: #{to_project}"
|
71
|
+
# Logging to Splunk log
|
72
|
+
GoodData.gd_logger.info "Starting import objects, action=objects_import, from_project=#{from_project}, to_project=#{to_project}, transfer_uris=#{transfer_uris}"
|
73
|
+
else
|
74
|
+
GoodData.logger.info "Success import objects, from_project: #{from_project}, to_project: #{to_project}"
|
75
|
+
GoodData.gd_logger.info "Success import objects, action=objects_import, from_project=#{from_project}, to_project=#{to_project}"
|
76
|
+
end
|
77
|
+
end
|
61
78
|
end
|
62
79
|
end
|
63
80
|
end
|
@@ -50,6 +50,9 @@ module GoodData
|
|
50
50
|
|
51
51
|
description 'Sync failed list'
|
52
52
|
param :sync_failed_list, instance_of(Type::HashType), required: false
|
53
|
+
|
54
|
+
description 'Synchronize clients time limit'
|
55
|
+
param :sync_clients_timeout, instance_of(Type::StringType), required: false
|
53
56
|
end
|
54
57
|
|
55
58
|
RESULT_HEADER = [
|
@@ -61,6 +64,7 @@ module GoodData
|
|
61
64
|
|
62
65
|
class << self
|
63
66
|
def call(params)
|
67
|
+
GoodData.logger.info 'Starting SynchronizeClients action'
|
64
68
|
client = params.gdc_gd_client
|
65
69
|
|
66
70
|
domain_name = params.organization || params.domain
|
@@ -69,6 +73,8 @@ module GoodData
|
|
69
73
|
data_product = params.data_product
|
70
74
|
domain_segments = domain.segments(:all, data_product)
|
71
75
|
keep_only_previous_masters_count = Integer(params.keep_only_previous_masters_count || "-1")
|
76
|
+
sync_clients_options = {}
|
77
|
+
sync_clients_options = sync_clients_options.merge(:time_limit => Integer(params.sync_clients_timeout)) if params.sync_clients_timeout
|
72
78
|
|
73
79
|
segments = params.segments.map do |seg|
|
74
80
|
domain_segments.find do |s|
|
@@ -91,7 +97,9 @@ module GoodData
|
|
91
97
|
segment.master_project = master
|
92
98
|
segment.save
|
93
99
|
|
94
|
-
|
100
|
+
GoodData.logger.info "Starting synchronize clients for segment: '#{segment.segment_id}' with master workspace: '#{current_master[:master_project_id]}'"
|
101
|
+
res = segment.synchronize_clients(sync_clients_options)
|
102
|
+
GoodData.logger.info "Finish synchronize clients for segment: '#{segment.segment_id}'"
|
95
103
|
|
96
104
|
sync_result = res.json['synchronizationResult']
|
97
105
|
failed_count = sync_result['failedClients']['count']
|
@@ -179,10 +179,10 @@ module GoodData
|
|
179
179
|
hidden_params_for_this_client_schedule_name = hidden_params_for_this_client[schedule_name]
|
180
180
|
|
181
181
|
schedule.update_params(schedule_additional_params) if schedule_additional_params
|
182
|
-
schedule.update_params(
|
183
|
-
schedule.update_params(
|
182
|
+
schedule.update_params(params_for_all_schedules_in_all_projects) if params_for_all_schedules_in_all_projects
|
183
|
+
schedule.update_params(params_for_all_projects_schedule_name) if params_for_all_projects_schedule_name
|
184
184
|
schedule.update_params(params_for_all_schedules_in_this_client) if params_for_all_schedules_in_this_client
|
185
|
-
schedule.update_params(
|
185
|
+
schedule.update_params(params_for_this_client_schedule_name) if params_for_this_client_schedule_name
|
186
186
|
|
187
187
|
schedule.update_hidden_params(schedule_additional_hidden_params) if schedule_additional_hidden_params
|
188
188
|
schedule.update_hidden_params(hidden_params_for_all_schedules_in_all_projects) if hidden_params_for_all_schedules_in_all_projects
|
@@ -166,7 +166,7 @@ module GoodData
|
|
166
166
|
|
167
167
|
dir = Dir.mktmpdir
|
168
168
|
begin
|
169
|
-
Zip::File.open("#{dir}/upload.zip",
|
169
|
+
Zip::File.open("#{dir}/upload.zip", create: true) do |zip|
|
170
170
|
# TODO: make sure schema columns match CSV column names
|
171
171
|
zip.get_output_stream('upload_info.json') { |f| f.puts JSON.pretty_generate(manifest) }
|
172
172
|
|
@@ -1437,7 +1437,8 @@ module GoodData
|
|
1437
1437
|
export_uri = "/gdc/md/#{pid}/maintenance/partialmdexport"
|
1438
1438
|
GoodData.gd_logger.info("Project export action=objects_export, project_id=#{pid}, uri=#{export_uri}, export_status=start, export_objs=#{export_payload}") if GoodData.gd_logger
|
1439
1439
|
|
1440
|
-
|
1440
|
+
# Export api will take time to finish So increasing timeout during calling the api
|
1441
|
+
result = client.post(export_uri, export_payload, :timeout => 10)
|
1441
1442
|
polling_url = result['partialMDArtifact']['status']['uri']
|
1442
1443
|
token = result['partialMDArtifact']['token']
|
1443
1444
|
GoodData.gd_logger.info("Project export action=objects_export, project_id=#{pid}, uri=#{polling_url}, export_status=polling") if GoodData.gd_logger
|
@@ -193,13 +193,14 @@ module GoodData
|
|
193
193
|
|
194
194
|
# Runs async process that walks through segments and provisions projects if necessary.
|
195
195
|
#
|
196
|
+
# @param options [Hash] Options
|
196
197
|
# @return [Array] Returns array of results
|
197
|
-
def synchronize_clients
|
198
|
+
def synchronize_clients(options = {})
|
198
199
|
sync_uri = SYNCHRONIZE_URI % [domain.obj_id, data_product.data_product_id, id]
|
199
200
|
res = client.post sync_uri, nil
|
200
201
|
|
201
202
|
# wait until the instance is created
|
202
|
-
res = client.poll_on_response(res['asyncTask']['links']['poll'], :sleep_interval => 1) do |r|
|
203
|
+
res = client.poll_on_response(res['asyncTask']['links']['poll'], options.merge(:sleep_interval => 1)) do |r|
|
203
204
|
r['synchronizationResult'].nil?
|
204
205
|
end
|
205
206
|
|
data/lib/gooddata/rest/client.rb
CHANGED
@@ -25,7 +25,7 @@ module GoodData
|
|
25
25
|
# Constants
|
26
26
|
#################################
|
27
27
|
DEFAULT_CONNECTION_IMPLEMENTATION = GoodData::Rest::Connection
|
28
|
-
DEFAULT_SLEEP_INTERVAL = 10
|
28
|
+
DEFAULT_SLEEP_INTERVAL = 10 # 10 seconds
|
29
29
|
DEFAULT_POLL_TIME_LIMIT = 5 * 60 * 60 # 5 hours
|
30
30
|
|
31
31
|
#################################
|
@@ -353,6 +353,11 @@ module GoodData
|
|
353
353
|
end
|
354
354
|
sleep retry_time
|
355
355
|
retry_time *= GoodData::Rest::Connection::RETRY_TIME_COEFFICIENT
|
356
|
+
# Polling response will wait result from calling APIs. So don't need wait a long time for each polling
|
357
|
+
if retry_time > DEFAULT_SLEEP_INTERVAL
|
358
|
+
retry_time = DEFAULT_SLEEP_INTERVAL
|
359
|
+
end
|
360
|
+
|
356
361
|
GoodData::Rest::Client.retryable(:tries => Helpers::GD_MAX_RETRY, :refresh_token => proc { connection.refresh_token }) do
|
357
362
|
response = get(link, process: process)
|
358
363
|
end
|
@@ -58,6 +58,8 @@ module GoodData
|
|
58
58
|
RETRYABLE_ERRORS = [
|
59
59
|
Net::HTTPBadResponse,
|
60
60
|
RestClient::InternalServerError,
|
61
|
+
RestClient::Exceptions::OpenTimeout,
|
62
|
+
RestClient::Exceptions::ReadTimeout,
|
61
63
|
RestClient::RequestTimeout,
|
62
64
|
RestClient::MethodNotAllowed,
|
63
65
|
SystemCallError,
|
@@ -110,30 +112,37 @@ module GoodData
|
|
110
112
|
raise e unless options[:refresh_token]
|
111
113
|
raise e if options[:dont_reauth]
|
112
114
|
|
115
|
+
logging_retry_error(e, retry_time)
|
113
116
|
options[:refresh_token].call # (dont_reauth: true)
|
114
117
|
if (retries -= 1) > 0
|
115
118
|
retry
|
116
119
|
else
|
117
|
-
|
120
|
+
fail e
|
118
121
|
end
|
119
122
|
rescue RestClient::TooManyRequests, RestClient::ServiceUnavailable, *retry_exception => e
|
123
|
+
logging_retry_error(e, retry_time)
|
120
124
|
sleep retry_time
|
125
|
+
if OpenSSL::SSL.const_defined?(:SSLErrorWaitReadable) && e.is_a?(OpenSSL::SSL::SSLErrorWaitReadable)
|
126
|
+
GoodData.gd_logger.warn "Refresh token status=start retry_time=#{retry_time}. Error: #{e.message}"
|
127
|
+
options[:refresh_token].call # (dont_reauth: true)
|
128
|
+
GoodData.gd_logger.warn "Refresh token status=success retry_time=#{retry_time}. Error: #{e.message}"
|
129
|
+
end
|
130
|
+
|
121
131
|
# Total 10 retry requests with 1.5 coefficent should take ~ 2 mins to finish
|
122
132
|
if (retries -= 1) > 0
|
123
133
|
retry_time *= RETRY_TIME_COEFFICIENT
|
124
134
|
retry
|
125
135
|
else
|
126
|
-
|
136
|
+
fail e
|
127
137
|
end
|
128
138
|
end
|
129
139
|
yield
|
130
140
|
end
|
131
141
|
|
132
|
-
def
|
142
|
+
def logging_retry_error(e, retry_time)
|
133
143
|
error_message = "#{e.message}, retrying in #{retry_time} seconds"
|
134
144
|
GoodData.logger.warn error_message
|
135
145
|
GoodData.gd_logger.warn error_message
|
136
|
-
fail e
|
137
146
|
end
|
138
147
|
end
|
139
148
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gooddata
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.3.
|
4
|
+
version: 2.3.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Pavel Kolesnikov
|
@@ -14,7 +14,7 @@ authors:
|
|
14
14
|
autorequire:
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
|
-
date: 2025-
|
17
|
+
date: 2025-08-06 00:00:00.000000000 Z
|
18
18
|
dependencies:
|
19
19
|
- !ruby/object:Gem::Dependency
|
20
20
|
name: license_finder
|
@@ -30,6 +30,20 @@ dependencies:
|
|
30
30
|
- - "~>"
|
31
31
|
- !ruby/object:Gem::Version
|
32
32
|
version: '2.0'
|
33
|
+
- !ruby/object:Gem::Dependency
|
34
|
+
name: redcarpet
|
35
|
+
requirement: !ruby/object:Gem::Requirement
|
36
|
+
requirements:
|
37
|
+
- - "~>"
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: '3.1'
|
40
|
+
type: :development
|
41
|
+
prerelease: false
|
42
|
+
version_requirements: !ruby/object:Gem::Requirement
|
43
|
+
requirements:
|
44
|
+
- - "~>"
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: '3.1'
|
33
47
|
- !ruby/object:Gem::Dependency
|
34
48
|
name: rake
|
35
49
|
requirement: !ruby/object:Gem::Requirement
|
@@ -45,19 +59,39 @@ dependencies:
|
|
45
59
|
- !ruby/object:Gem::Version
|
46
60
|
version: '13.0'
|
47
61
|
- !ruby/object:Gem::Dependency
|
48
|
-
name:
|
62
|
+
name: rubocop
|
49
63
|
requirement: !ruby/object:Gem::Requirement
|
50
64
|
requirements:
|
51
|
-
- - "
|
65
|
+
- - ">="
|
52
66
|
- !ruby/object:Gem::Version
|
53
|
-
version: '
|
67
|
+
version: '1.28'
|
54
68
|
type: :development
|
55
69
|
prerelease: false
|
56
70
|
version_requirements: !ruby/object:Gem::Requirement
|
57
71
|
requirements:
|
58
|
-
- - "
|
72
|
+
- - ">="
|
59
73
|
- !ruby/object:Gem::Version
|
60
|
-
version: '
|
74
|
+
version: '1.28'
|
75
|
+
- !ruby/object:Gem::Dependency
|
76
|
+
name: rubocop-ast
|
77
|
+
requirement: !ruby/object:Gem::Requirement
|
78
|
+
requirements:
|
79
|
+
- - ">="
|
80
|
+
- !ruby/object:Gem::Version
|
81
|
+
version: 1.24.1
|
82
|
+
- - "<="
|
83
|
+
- !ruby/object:Gem::Version
|
84
|
+
version: 1.42.0
|
85
|
+
type: :development
|
86
|
+
prerelease: false
|
87
|
+
version_requirements: !ruby/object:Gem::Requirement
|
88
|
+
requirements:
|
89
|
+
- - ">="
|
90
|
+
- !ruby/object:Gem::Version
|
91
|
+
version: 1.24.1
|
92
|
+
- - "<="
|
93
|
+
- !ruby/object:Gem::Version
|
94
|
+
version: 1.42.0
|
61
95
|
- !ruby/object:Gem::Dependency
|
62
96
|
name: rspec
|
63
97
|
requirement: !ruby/object:Gem::Requirement
|
@@ -101,39 +135,81 @@ dependencies:
|
|
101
135
|
- !ruby/object:Gem::Version
|
102
136
|
version: 0.6.0
|
103
137
|
- !ruby/object:Gem::Dependency
|
104
|
-
name:
|
138
|
+
name: azure-storage-blob
|
139
|
+
requirement: !ruby/object:Gem::Requirement
|
140
|
+
requirements:
|
141
|
+
- - "~>"
|
142
|
+
- !ruby/object:Gem::Version
|
143
|
+
version: '2.0'
|
144
|
+
type: :runtime
|
145
|
+
prerelease: false
|
146
|
+
version_requirements: !ruby/object:Gem::Requirement
|
147
|
+
requirements:
|
148
|
+
- - "~>"
|
149
|
+
- !ruby/object:Gem::Version
|
150
|
+
version: '2.0'
|
151
|
+
- !ruby/object:Gem::Dependency
|
152
|
+
name: nokogiri
|
105
153
|
requirement: !ruby/object:Gem::Requirement
|
106
154
|
requirements:
|
155
|
+
- - "~>"
|
156
|
+
- !ruby/object:Gem::Version
|
157
|
+
version: '1'
|
107
158
|
- - ">="
|
108
159
|
- !ruby/object:Gem::Version
|
109
|
-
version:
|
110
|
-
type: :
|
160
|
+
version: 1.10.8
|
161
|
+
type: :runtime
|
111
162
|
prerelease: false
|
112
163
|
version_requirements: !ruby/object:Gem::Requirement
|
113
164
|
requirements:
|
165
|
+
- - "~>"
|
166
|
+
- !ruby/object:Gem::Version
|
167
|
+
version: '1'
|
114
168
|
- - ">="
|
115
169
|
- !ruby/object:Gem::Version
|
116
|
-
version:
|
170
|
+
version: 1.10.8
|
117
171
|
- !ruby/object:Gem::Dependency
|
118
|
-
name:
|
172
|
+
name: json_pure
|
119
173
|
requirement: !ruby/object:Gem::Requirement
|
120
174
|
requirements:
|
121
|
-
- - "
|
175
|
+
- - "~>"
|
122
176
|
- !ruby/object:Gem::Version
|
123
|
-
version:
|
124
|
-
|
177
|
+
version: '2.6'
|
178
|
+
type: :runtime
|
179
|
+
prerelease: false
|
180
|
+
version_requirements: !ruby/object:Gem::Requirement
|
181
|
+
requirements:
|
182
|
+
- - "~>"
|
125
183
|
- !ruby/object:Gem::Version
|
126
|
-
version:
|
127
|
-
|
184
|
+
version: '2.6'
|
185
|
+
- !ruby/object:Gem::Dependency
|
186
|
+
name: restforce
|
187
|
+
requirement: !ruby/object:Gem::Requirement
|
188
|
+
requirements:
|
189
|
+
- - ">="
|
190
|
+
- !ruby/object:Gem::Version
|
191
|
+
version: '2.4'
|
192
|
+
type: :runtime
|
128
193
|
prerelease: false
|
129
194
|
version_requirements: !ruby/object:Gem::Requirement
|
130
195
|
requirements:
|
131
196
|
- - ">="
|
132
197
|
- !ruby/object:Gem::Version
|
133
|
-
version:
|
134
|
-
|
198
|
+
version: '2.4'
|
199
|
+
- !ruby/object:Gem::Dependency
|
200
|
+
name: rubyzip
|
201
|
+
requirement: !ruby/object:Gem::Requirement
|
202
|
+
requirements:
|
203
|
+
- - ">="
|
135
204
|
- !ruby/object:Gem::Version
|
136
|
-
version:
|
205
|
+
version: '0'
|
206
|
+
type: :runtime
|
207
|
+
prerelease: false
|
208
|
+
version_requirements: !ruby/object:Gem::Requirement
|
209
|
+
requirements:
|
210
|
+
- - ">="
|
211
|
+
- !ruby/object:Gem::Version
|
212
|
+
version: '0'
|
137
213
|
- !ruby/object:Gem::Dependency
|
138
214
|
name: simplecov
|
139
215
|
requirement: !ruby/object:Gem::Requirement
|
@@ -386,40 +462,6 @@ dependencies:
|
|
386
462
|
- - "~>"
|
387
463
|
- !ruby/object:Gem::Version
|
388
464
|
version: '1.1'
|
389
|
-
- !ruby/object:Gem::Dependency
|
390
|
-
name: azure-storage-blob
|
391
|
-
requirement: !ruby/object:Gem::Requirement
|
392
|
-
requirements:
|
393
|
-
- - "~>"
|
394
|
-
- !ruby/object:Gem::Version
|
395
|
-
version: '2.0'
|
396
|
-
type: :runtime
|
397
|
-
prerelease: false
|
398
|
-
version_requirements: !ruby/object:Gem::Requirement
|
399
|
-
requirements:
|
400
|
-
- - "~>"
|
401
|
-
- !ruby/object:Gem::Version
|
402
|
-
version: '2.0'
|
403
|
-
- !ruby/object:Gem::Dependency
|
404
|
-
name: nokogiri
|
405
|
-
requirement: !ruby/object:Gem::Requirement
|
406
|
-
requirements:
|
407
|
-
- - "~>"
|
408
|
-
- !ruby/object:Gem::Version
|
409
|
-
version: '1'
|
410
|
-
- - ">="
|
411
|
-
- !ruby/object:Gem::Version
|
412
|
-
version: 1.10.8
|
413
|
-
type: :runtime
|
414
|
-
prerelease: false
|
415
|
-
version_requirements: !ruby/object:Gem::Requirement
|
416
|
-
requirements:
|
417
|
-
- - "~>"
|
418
|
-
- !ruby/object:Gem::Version
|
419
|
-
version: '1'
|
420
|
-
- - ">="
|
421
|
-
- !ruby/object:Gem::Version
|
422
|
-
version: 1.10.8
|
423
465
|
- !ruby/object:Gem::Dependency
|
424
466
|
name: gli
|
425
467
|
requirement: !ruby/object:Gem::Requirement
|
@@ -448,20 +490,6 @@ dependencies:
|
|
448
490
|
- - '='
|
449
491
|
- !ruby/object:Gem::Version
|
450
492
|
version: 2.0.0.pre.develop.14
|
451
|
-
- !ruby/object:Gem::Dependency
|
452
|
-
name: json_pure
|
453
|
-
requirement: !ruby/object:Gem::Requirement
|
454
|
-
requirements:
|
455
|
-
- - "~>"
|
456
|
-
- !ruby/object:Gem::Version
|
457
|
-
version: '2.6'
|
458
|
-
type: :runtime
|
459
|
-
prerelease: false
|
460
|
-
version_requirements: !ruby/object:Gem::Requirement
|
461
|
-
requirements:
|
462
|
-
- - "~>"
|
463
|
-
- !ruby/object:Gem::Version
|
464
|
-
version: '2.6'
|
465
493
|
- !ruby/object:Gem::Dependency
|
466
494
|
name: multi_json
|
467
495
|
requirement: !ruby/object:Gem::Requirement
|
@@ -546,20 +574,6 @@ dependencies:
|
|
546
574
|
- - "~>"
|
547
575
|
- !ruby/object:Gem::Version
|
548
576
|
version: 1.0.3
|
549
|
-
- !ruby/object:Gem::Dependency
|
550
|
-
name: restforce
|
551
|
-
requirement: !ruby/object:Gem::Requirement
|
552
|
-
requirements:
|
553
|
-
- - ">="
|
554
|
-
- !ruby/object:Gem::Version
|
555
|
-
version: '2.4'
|
556
|
-
type: :runtime
|
557
|
-
prerelease: false
|
558
|
-
version_requirements: !ruby/object:Gem::Requirement
|
559
|
-
requirements:
|
560
|
-
- - ">="
|
561
|
-
- !ruby/object:Gem::Version
|
562
|
-
version: '2.4'
|
563
577
|
- !ruby/object:Gem::Dependency
|
564
578
|
name: rest-client
|
565
579
|
requirement: !ruby/object:Gem::Requirement
|
@@ -574,20 +588,6 @@ dependencies:
|
|
574
588
|
- - "~>"
|
575
589
|
- !ruby/object:Gem::Version
|
576
590
|
version: '2.0'
|
577
|
-
- !ruby/object:Gem::Dependency
|
578
|
-
name: rubyzip
|
579
|
-
requirement: !ruby/object:Gem::Requirement
|
580
|
-
requirements:
|
581
|
-
- - ">="
|
582
|
-
- !ruby/object:Gem::Version
|
583
|
-
version: '0'
|
584
|
-
type: :runtime
|
585
|
-
prerelease: false
|
586
|
-
version_requirements: !ruby/object:Gem::Requirement
|
587
|
-
requirements:
|
588
|
-
- - ">="
|
589
|
-
- !ruby/object:Gem::Version
|
590
|
-
version: '0'
|
591
591
|
- !ruby/object:Gem::Dependency
|
592
592
|
name: terminal-table
|
593
593
|
requirement: !ruby/object:Gem::Requirement
|
@@ -688,6 +688,7 @@ files:
|
|
688
688
|
- Dockerfile
|
689
689
|
- Dockerfile.jruby
|
690
690
|
- Dockerfile.ruby
|
691
|
+
- DockerfileOldImage
|
691
692
|
- Gemfile
|
692
693
|
- Guardfile
|
693
694
|
- Jenkinsfile
|