kinetic_sdk 0.1.1 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.yardoc-includes/yard-helpers.rb +14 -0
- data/.yardopts +7 -0
- data/CHANGELOG.md +41 -0
- data/GettingStarted.md +6 -12
- data/README.md +85 -37
- data/Rakefile +13 -0
- data/kinetic_sdk.gemspec +33 -0
- data/lib/kinetic_sdk/agent/agent-sdk.rb +90 -0
- data/lib/kinetic_sdk/agent/lib/bridges.rb +92 -0
- data/lib/kinetic_sdk/agent/lib/filestores.rb +91 -0
- data/lib/kinetic_sdk/agent/lib/handler.rb +91 -0
- data/lib/kinetic_sdk/bridgehub/bridgehub-sdk.rb +11 -3
- data/lib/kinetic_sdk/bridgehub/lib/access_keys.rb +5 -5
- data/lib/kinetic_sdk/bridgehub/lib/bridge.rb +5 -5
- data/lib/kinetic_sdk/{request_ce/request-ce-sdk.rb → core/core-sdk.rb} +30 -16
- data/lib/kinetic_sdk/core/lib/attribute_definitions.rb +500 -0
- data/lib/kinetic_sdk/core/lib/bridges.rb +141 -0
- data/lib/kinetic_sdk/{request_ce → core}/lib/categories.rb +3 -3
- data/lib/kinetic_sdk/{request_ce → core}/lib/datastore_form.rb +8 -8
- data/lib/kinetic_sdk/{request_ce → core}/lib/datastore_submissions.rb +20 -9
- data/lib/kinetic_sdk/{request_ce → core}/lib/form.rb +7 -7
- data/lib/kinetic_sdk/{request_ce → core}/lib/form_types.rb +4 -4
- data/lib/kinetic_sdk/{request_ce → core}/lib/jwt.rb +4 -4
- data/lib/kinetic_sdk/{request_ce → core}/lib/kapp.rb +7 -7
- data/lib/kinetic_sdk/{request_ce → core}/lib/meta.rb +3 -3
- data/lib/kinetic_sdk/{request_ce → core}/lib/oauth.rb +4 -4
- data/lib/kinetic_sdk/{request_ce → core}/lib/security_policy_definitions.rb +11 -11
- data/lib/kinetic_sdk/core/lib/space.rb +156 -0
- data/lib/kinetic_sdk/{request_ce → core}/lib/submissions.rb +11 -11
- data/lib/kinetic_sdk/{request_ce → core}/lib/system_api.rb +19 -7
- data/lib/kinetic_sdk/{request_ce → core}/lib/teams.rb +9 -9
- data/lib/kinetic_sdk/{request_ce → core}/lib/users.rb +15 -15
- data/lib/kinetic_sdk/{request_ce → core}/lib/webhook_jobs.rb +5 -5
- data/lib/kinetic_sdk/{request_ce → core}/lib/webhooks.rb +9 -9
- data/lib/kinetic_sdk/discussions/discussions-sdk.rb +12 -4
- data/lib/kinetic_sdk/discussions/lib/discussions.rb +8 -8
- data/lib/kinetic_sdk/discussions/lib/invitations.rb +9 -9
- data/lib/kinetic_sdk/discussions/lib/messages.rb +8 -8
- data/lib/kinetic_sdk/discussions/lib/meta.rb +1 -1
- data/lib/kinetic_sdk/discussions/lib/participants.rb +5 -5
- data/lib/kinetic_sdk/discussions/lib/related_items.rb +4 -4
- data/lib/kinetic_sdk/discussions/lib/websockets.rb +9 -9
- data/lib/kinetic_sdk/filehub/filehub-sdk.rb +11 -3
- data/lib/kinetic_sdk/filehub/lib/access_keys.rb +5 -5
- data/lib/kinetic_sdk/filehub/lib/filestores.rb +5 -5
- data/lib/kinetic_sdk/task/lib/access_keys.rb +35 -7
- data/lib/kinetic_sdk/task/lib/categories.rb +30 -17
- data/lib/kinetic_sdk/task/lib/config.rb +14 -14
- data/lib/kinetic_sdk/task/lib/engine.rb +1 -1
- data/lib/kinetic_sdk/task/lib/errors.rb +10 -10
- data/lib/kinetic_sdk/task/lib/export.rb +32 -0
- data/lib/kinetic_sdk/task/lib/groups.rb +23 -10
- data/lib/kinetic_sdk/task/lib/handlers.rb +27 -11
- data/lib/kinetic_sdk/task/lib/health.rb +11 -3
- data/lib/kinetic_sdk/task/lib/license.rb +4 -4
- data/lib/kinetic_sdk/task/lib/policy_rules.rb +25 -12
- data/lib/kinetic_sdk/task/lib/runs.rb +43 -0
- data/lib/kinetic_sdk/task/lib/setup.rb +2 -2
- data/lib/kinetic_sdk/task/lib/sources.rb +39 -8
- data/lib/kinetic_sdk/task/lib/tasks.rb +1 -1
- data/lib/kinetic_sdk/task/lib/trees.rb +84 -28
- data/lib/kinetic_sdk/task/lib/users.rb +6 -6
- data/lib/kinetic_sdk/task/task-sdk.rb +16 -4
- data/lib/kinetic_sdk/utils/kinetic-export-utils.rb +157 -0
- data/lib/kinetic_sdk/utils/kinetic-http.rb +388 -98
- data/lib/kinetic_sdk/utils/logger.rb +82 -46
- data/lib/kinetic_sdk/utils/prettier-xml-formatter.rb +60 -0
- data/lib/kinetic_sdk/version.rb +1 -1
- data/lib/kinetic_sdk.rb +5 -2
- metadata +41 -27
- data/lib/kinetic_sdk/request_ce/lib/attribute_definitions.rb +0 -153
- data/lib/kinetic_sdk/request_ce/lib/bridges.rb +0 -66
- data/lib/kinetic_sdk/request_ce/lib/space.rb +0 -89
@@ -0,0 +1,43 @@
|
|
1
|
+
module KineticSdk
|
2
|
+
class Task
|
3
|
+
|
4
|
+
# Delete a Run.
|
5
|
+
#
|
6
|
+
# @param id the id of the run to delete
|
7
|
+
# @param headers [Hash] hash of headers to send, default is basic authentication
|
8
|
+
# @return [KineticSdk::Utils::KineticHttpResponse] object, with +code+, +message+, +content_string+, and +content+ properties
|
9
|
+
#
|
10
|
+
# Example
|
11
|
+
#
|
12
|
+
# delete_run(24548)
|
13
|
+
#
|
14
|
+
def delete_run(id, headers=header_basic_auth)
|
15
|
+
@logger.info("Deleting run \"#{id}\"")
|
16
|
+
delete("#{@api_url}/runs/#{id}", headers)
|
17
|
+
end
|
18
|
+
|
19
|
+
# Find runs.
|
20
|
+
#
|
21
|
+
# @param params [Hash] Query parameters that are added to the URL, such as +include+
|
22
|
+
# @param headers [Hash] hash of headers to send, default is basic authentication
|
23
|
+
# @return [KineticSdk::Utils::KineticHttpResponse] object, with +code+, +message+, +content_string+, and +content+ properties
|
24
|
+
#
|
25
|
+
# Example
|
26
|
+
#
|
27
|
+
# find_runs({ "source" => "Kinetic Request CE" })
|
28
|
+
#
|
29
|
+
# Example
|
30
|
+
#
|
31
|
+
# find_runs({ "include" => "details" })
|
32
|
+
#
|
33
|
+
# Example
|
34
|
+
#
|
35
|
+
# find_runs({ "source" => "Kinetic Request CE", "include" => "details" })
|
36
|
+
#
|
37
|
+
def find_runs(params={}, headers=header_basic_auth)
|
38
|
+
@logger.info("Finding Runs")
|
39
|
+
get("#{@api_url}/runs", params, headers)
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
43
|
+
end
|
@@ -21,7 +21,7 @@ module KineticSdk
|
|
21
21
|
# }
|
22
22
|
#
|
23
23
|
def test_db_connection(db={}, headers=default_headers)
|
24
|
-
info("Testing database connection")
|
24
|
+
@logger.info("Testing database connection")
|
25
25
|
response = post("#{@api_url}/setup/db/test", db, headers)
|
26
26
|
response.content
|
27
27
|
end
|
@@ -47,7 +47,7 @@ module KineticSdk
|
|
47
47
|
# }
|
48
48
|
#
|
49
49
|
def migrate_db(db={}, headers=default_headers)
|
50
|
-
info("Running database migrations")
|
50
|
+
@logger.info("Running database migrations")
|
51
51
|
response = post("#{@api_url}/setup/db/migrate", db, headers)
|
52
52
|
response.content
|
53
53
|
end
|
@@ -29,7 +29,7 @@ module KineticSdk
|
|
29
29
|
#
|
30
30
|
def add_source(source, headers=default_headers)
|
31
31
|
name = source['name']
|
32
|
-
info("Adding the #{name} source")
|
32
|
+
@logger.info("Adding the #{name} source")
|
33
33
|
post("#{@api_url}/sources", source, headers)
|
34
34
|
end
|
35
35
|
|
@@ -39,7 +39,7 @@ module KineticSdk
|
|
39
39
|
# @param headers [Hash] hash of headers to send, default is basic authentication
|
40
40
|
# @return [KineticSdk::Utils::KineticHttpResponse] object, with +code+, +message+, +content_string+, and +content+ properties
|
41
41
|
def delete_source(name, headers=header_basic_auth)
|
42
|
-
info("Deleting Source \"#{name}\"")
|
42
|
+
@logger.info("Deleting Source \"#{name}\"")
|
43
43
|
delete("#{@api_url}/sources/#{encode(name)}", headers)
|
44
44
|
end
|
45
45
|
|
@@ -48,19 +48,50 @@ module KineticSdk
|
|
48
48
|
# @param headers [Hash] hash of headers to send, default is basic authentication
|
49
49
|
# @return [KineticSdk::Utils::KineticHttpResponse] object, with +code+, +message+, +content_string+, and +content+ properties
|
50
50
|
def delete_sources(headers=header_basic_auth)
|
51
|
-
info("Deleting all sources")
|
51
|
+
@logger.info("Deleting all sources")
|
52
52
|
(find_sources(headers).content['sources'] || []).each do |source|
|
53
53
|
delete("#{@api_url}/sources/#{encode(source['name'])}", headers)
|
54
54
|
end
|
55
55
|
end
|
56
56
|
|
57
|
+
# Export all sources to :source-slug.json file in export_directory/sources
|
58
|
+
#
|
59
|
+
# @param headers [Hash] hash of headers to send, default is basic authentication
|
60
|
+
# @return nil
|
61
|
+
def export_sources(headers=header_basic_auth)
|
62
|
+
raise StandardError.new "An export directory must be defined to export sources." if @options[:export_directory].nil?
|
63
|
+
response = find_sources({"include" => "policyRules"})
|
64
|
+
(response.content["sourceRoots"] || []).each do |source|
|
65
|
+
# determine which directory to write the file to
|
66
|
+
if source['name'] != "-"
|
67
|
+
# create the directory if it doesn't yet exist
|
68
|
+
sources_dir = FileUtils::mkdir_p(File.join(@options[:export_directory], "sources"))
|
69
|
+
source_file = File.join(sources_dir, "#{source['name'].slugify}.json")
|
70
|
+
write_object_to_file(source_file, source)
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
# Import all sources from :source-slug.json file in export_directory/sources
|
76
|
+
#
|
77
|
+
# @param headers [Hash] hash of headers to send, default is basic authentication
|
78
|
+
# @return nil
|
79
|
+
def import_sources(headers=default_headers)
|
80
|
+
raise StandardError.new "An export directory must be defined to import sources." if @options[:export_directory].nil?
|
81
|
+
@logger.info("Importing all Sources in Export Directory")
|
82
|
+
Dir["#{@options[:export_directory]}/sources/*.json"].sort.each do |file|
|
83
|
+
source = JSON.parse(File.read(file))
|
84
|
+
add_source(source, headers)
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
57
88
|
# Find all sources
|
58
89
|
#
|
59
90
|
# @param params [Hash] Query parameters that are added to the URL, such as +include+
|
60
91
|
# @param headers [Hash] hash of headers to send, default is basic authentication
|
61
92
|
# @return [KineticSdk::Utils::KineticHttpResponse] object, with +code+, +message+, +content_string+, and +content+ properties
|
62
93
|
def find_sources(params={}, headers=header_basic_auth)
|
63
|
-
info("Finding all sources")
|
94
|
+
@logger.info("Finding all sources")
|
64
95
|
get("#{@api_url}/sources", params, headers)
|
65
96
|
end
|
66
97
|
|
@@ -71,7 +102,7 @@ module KineticSdk
|
|
71
102
|
# @param headers [Hash] hash of headers to send, default is basic authentication
|
72
103
|
# @return [KineticSdk::Utils::KineticHttpResponse] object, with +code+, +message+, +content_string+, and +content+ properties
|
73
104
|
def find_source(name, params={}, headers=header_basic_auth)
|
74
|
-
info("Finding source named \"#{name}\"")
|
105
|
+
@logger.info("Finding source named \"#{name}\"")
|
75
106
|
get("#{@api_url}/sources/#{encode(name)}", params, headers)
|
76
107
|
end
|
77
108
|
|
@@ -101,7 +132,7 @@ module KineticSdk
|
|
101
132
|
# )
|
102
133
|
#
|
103
134
|
def update_source(source, body={}, headers=default_headers)
|
104
|
-
info("Updating the \"#{source['name']}\" Source")
|
135
|
+
@logger.info("Updating the \"#{source['name']}\" Source")
|
105
136
|
put("#{@api_url}/sources/#{encode(source['name'])}", body, headers)
|
106
137
|
end
|
107
138
|
|
@@ -114,7 +145,7 @@ module KineticSdk
|
|
114
145
|
# @return [KineticSdk::Utils::KineticHttpResponse] object, with +code+, +message+, +content_string+, and +content+ properties
|
115
146
|
def add_policy_rule_to_source(policy_rule_type, policy_rule_name, source_name, headers=default_headers)
|
116
147
|
body = { "type" => policy_rule_type, "name" => policy_rule_name }
|
117
|
-
info("Adding policy rule \"#{policy_rule_type} - #{policy_rule_name}\" to source \"#{source_name}\"")
|
148
|
+
@logger.info("Adding policy rule \"#{policy_rule_type} - #{policy_rule_name}\" to source \"#{source_name}\"")
|
118
149
|
post("#{@api_url}/sources/#{encode(source_name)}/policyRules", body, headers)
|
119
150
|
end
|
120
151
|
|
@@ -126,7 +157,7 @@ module KineticSdk
|
|
126
157
|
# @param headers [Hash] hash of headers to send, default is basic authentication and accept JSON content type
|
127
158
|
# @return [KineticSdk::Utils::KineticHttpResponse] object, with +code+, +message+, +content_string+, and +content+ properties
|
128
159
|
def remove_policy_rule_from_source(policy_rule_type, policy_rule_name, source_name, headers=default_headers)
|
129
|
-
info("Removing policy rule \"#{policy_rule_type} - #{policy_rule_name}\" from source \"#{source_name}\"")
|
160
|
+
@logger.info("Removing policy rule \"#{policy_rule_type} - #{policy_rule_name}\" from source \"#{source_name}\"")
|
130
161
|
delete("#{@api_url}/sources/#{encode(source_name)}/policyRules/#{encode(policy_rule_type)}/#{encode(policy_rule_name)}", headers)
|
131
162
|
end
|
132
163
|
|
@@ -9,7 +9,7 @@ module KineticSdk
|
|
9
9
|
# @param headers [Hash] hash of headers to send, default is basic authentication and accept JSON content type
|
10
10
|
# @return [KineticSdk::Utils::KineticHttpResponse] object, with +code+, +message+, +content_string+, and +content+ properties
|
11
11
|
def complete_deferred_task(source_name, body, headers=default_headers)
|
12
|
-
info("Completing deferred task for the \"#{source_name}\" Source.")
|
12
|
+
@logger.info("Completing deferred task for the \"#{source_name}\" Source.")
|
13
13
|
post("#{@api_v1_url}/complete-deferred-task/#{encode(source_name)}", body, headers)
|
14
14
|
end
|
15
15
|
|
@@ -25,7 +25,7 @@ module KineticSdk
|
|
25
25
|
else
|
26
26
|
title = "#{tree.to_s}"
|
27
27
|
end
|
28
|
-
info("Deleting Tree \"#{title}\"")
|
28
|
+
@logger.info("Deleting Tree \"#{title}\"")
|
29
29
|
delete("#{@api_url}/trees/#{encode(title)}", headers)
|
30
30
|
end
|
31
31
|
|
@@ -44,15 +44,15 @@ module KineticSdk
|
|
44
44
|
#
|
45
45
|
def delete_trees(source_name=nil, headers=header_basic_auth)
|
46
46
|
if source_name.nil?
|
47
|
-
info("Deleting all trees")
|
47
|
+
@logger.info("Deleting all trees")
|
48
48
|
params = {}
|
49
49
|
else
|
50
|
-
info("Deleting trees for Source \"#{source_name}\"")
|
50
|
+
@logger.info("Deleting trees for Source \"#{source_name}\"")
|
51
51
|
params = { "source" => source_name }
|
52
52
|
end
|
53
53
|
|
54
54
|
(find_trees(params, headers).content['trees'] || []).each do |tree|
|
55
|
-
info("Deleting tree \"#{tree['title']}\"")
|
55
|
+
@logger.info("Deleting tree \"#{tree['title']}\"")
|
56
56
|
delete("#{@api_url}/trees/#{encode(tree['title'])}", headers)
|
57
57
|
end
|
58
58
|
end
|
@@ -69,7 +69,7 @@ module KineticSdk
|
|
69
69
|
# find_trees({ "source" => "Kinetic Request CE" })
|
70
70
|
#
|
71
71
|
# Example
|
72
|
-
#
|
72
|
+
#
|
73
73
|
# find_trees({ "include" => "details" })
|
74
74
|
#
|
75
75
|
# Example
|
@@ -77,7 +77,7 @@ module KineticSdk
|
|
77
77
|
# find_trees({ "source" => "Kinetic Request CE", "include" => "details" })
|
78
78
|
#
|
79
79
|
def find_trees(params={}, headers=header_basic_auth)
|
80
|
-
info("Finding Trees")
|
80
|
+
@logger.info("Finding Trees")
|
81
81
|
get("#{@api_url}/trees", params, headers)
|
82
82
|
end
|
83
83
|
|
@@ -100,7 +100,7 @@ module KineticSdk
|
|
100
100
|
# find_routines({ "source" => "Kinetic Request CE", "include" => "details" })
|
101
101
|
#
|
102
102
|
def find_routines(params={}, headers=header_basic_auth)
|
103
|
-
info("Finding Routines")
|
103
|
+
@logger.info("Finding Routines")
|
104
104
|
response = get("#{@api_url}/trees", params, headers)
|
105
105
|
|
106
106
|
routines = []
|
@@ -127,10 +127,30 @@ module KineticSdk
|
|
127
127
|
# @return [KineticSdk::Utils::KineticHttpResponse] object, with +code+, +message+, +content_string+, and +content+ properties
|
128
128
|
def import_tree(tree, force_overwrite=false, headers=header_basic_auth)
|
129
129
|
body = { "content" => tree }
|
130
|
-
info("Importing Tree #{File.basename(tree)}")
|
130
|
+
@logger.info("Importing Tree #{File.basename(tree)}")
|
131
131
|
post_multipart("#{@api_url}/trees?force=#{force_overwrite}", body, headers)
|
132
132
|
end
|
133
133
|
|
134
|
+
# Import trees
|
135
|
+
#
|
136
|
+
# If the trees already exists on the server, this will fail unless forced
|
137
|
+
# to overwrite.
|
138
|
+
#
|
139
|
+
# The source named in the trees content must also exist on the server, or
|
140
|
+
# the import will fail.
|
141
|
+
#
|
142
|
+
# @param force_overwrite [Boolean] whether to overwrite a tree if it exists, default is false
|
143
|
+
# @param headers [Hash] hash of headers to send, default is basic authentication
|
144
|
+
# @return nil
|
145
|
+
def import_trees(force_overwrite=false, headers=header_basic_auth)
|
146
|
+
raise StandardError.new "An export directory must be defined to import trees from." if @options[:export_directory].nil?
|
147
|
+
@logger.info("Importing all Trees from Export Directory")
|
148
|
+
Dir["#{@options[:export_directory]}/sources/**/*.xml"].sort.each do |file|
|
149
|
+
tree_file = File.new(file, "rb")
|
150
|
+
import_tree(tree_file, force_overwrite, headers)
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
134
154
|
# Import a routine
|
135
155
|
#
|
136
156
|
# If the routine already exists on the server, this will fail unless
|
@@ -142,10 +162,27 @@ module KineticSdk
|
|
142
162
|
# @return [KineticSdk::Utils::KineticHttpResponse] object, with +code+, +message+, +content_string+, and +content+ properties
|
143
163
|
def import_routine(routine, force_overwrite=false, headers=header_basic_auth)
|
144
164
|
body = { "content" => routine }
|
145
|
-
info("Importing Routine #{File.basename(routine)}")
|
165
|
+
@logger.info("Importing Routine #{File.basename(routine)}")
|
146
166
|
post_multipart("#{@api_url}/trees?force=#{force_overwrite}", body, headers)
|
147
167
|
end
|
148
168
|
|
169
|
+
# Import routines
|
170
|
+
#
|
171
|
+
# If the routines already exists on the server, this will fail unless forced
|
172
|
+
# to overwrite.
|
173
|
+
#
|
174
|
+
# @param force_overwrite [Boolean] whether to overwrite routines if they exist, default is false
|
175
|
+
# @param headers [Hash] hash of headers to send, default is basic authentication
|
176
|
+
# @return nil
|
177
|
+
def import_routines(force_overwrite=false, headers=header_basic_auth)
|
178
|
+
raise StandardError.new "An export directory must be defined to import trees from." if @options[:export_directory].nil?
|
179
|
+
@logger.info("Importing all Routines from Export Directory")
|
180
|
+
Dir["#{@options[:export_directory]}/routines/*.xml"].sort.each do |file|
|
181
|
+
routine_file = File.new(file, "rb")
|
182
|
+
import_routine(routine_file, force_overwrite, headers)
|
183
|
+
end
|
184
|
+
end
|
185
|
+
|
149
186
|
# Find a single tree by title (Source Name :: Group Name :: Tree Name)
|
150
187
|
#
|
151
188
|
# @param title [String] The tree title
|
@@ -161,7 +198,7 @@ module KineticSdk
|
|
161
198
|
# )
|
162
199
|
#
|
163
200
|
def find_tree(title, params={}, headers=header_basic_auth)
|
164
|
-
info("Finding the \"#{title}\" Tree")
|
201
|
+
@logger.info("Finding the \"#{title}\" Tree")
|
165
202
|
get("#{@api_url}/trees/#{encode(title)}", params, headers)
|
166
203
|
end
|
167
204
|
|
@@ -169,11 +206,11 @@ module KineticSdk
|
|
169
206
|
#
|
170
207
|
# @param title [String] the title of the tree or routine
|
171
208
|
# @param headers [Hash] hash of headers to send, default is basic authentication
|
172
|
-
# @return
|
209
|
+
# @return nil
|
173
210
|
#
|
174
211
|
def export_tree(title, headers=header_basic_auth)
|
175
212
|
raise StandardError.new "An export directory must be defined to export a tree." if @options[:export_directory].nil?
|
176
|
-
info("Exporting tree \"#{title}\" to #{@options[:export_directory]}.")
|
213
|
+
@logger.info("Exporting tree \"#{title}\" to #{@options[:export_directory]}.")
|
177
214
|
# Get the tree
|
178
215
|
response = find_tree(title, { "include" => "export" })
|
179
216
|
# Parse the response and export the tree
|
@@ -186,12 +223,21 @@ module KineticSdk
|
|
186
223
|
tree_file = File.join(routine_dir, "#{tree['name'].slugify}.xml")
|
187
224
|
else
|
188
225
|
# Create the directory if it doesn't yet exist
|
189
|
-
tree_dir = FileUtils::mkdir_p(File.join(@options[:export_directory],
|
190
|
-
tree_file = File.join(tree_dir, "#{tree['
|
226
|
+
tree_dir = FileUtils::mkdir_p(File.join(@options[:export_directory],"sources", tree['sourceName'].slugify , "trees"))
|
227
|
+
tree_file = File.join(tree_dir, "#{tree['sourceGroup'].slugify}.#{tree['name'].slugify}.xml")
|
191
228
|
end
|
229
|
+
|
192
230
|
# write the file
|
193
|
-
|
194
|
-
|
231
|
+
server_version = server_info(headers).content["version"]
|
232
|
+
if server_version > "04.03.0z"
|
233
|
+
File.write(tree_file, tree['export'])
|
234
|
+
else
|
235
|
+
xml_doc = REXML::Document.new(tree["export"])
|
236
|
+
xml_doc.context[:attribute_quote] = :quote
|
237
|
+
xml_formatter = Prettier.new
|
238
|
+
xml_formatter.write(xml_doc, File.open(tree_file, "w"))
|
239
|
+
end
|
240
|
+
@logger.info("Exported #{tree['type']}: #{tree['title']} to #{tree_file}")
|
195
241
|
end
|
196
242
|
|
197
243
|
# Export all trees and local routines for a source, and global routines
|
@@ -200,19 +246,20 @@ module KineticSdk
|
|
200
246
|
# - Leave blank or pass nil to export all trees and global routines
|
201
247
|
# - Pass "-" to export only global routines
|
202
248
|
# @param headers [Hash] hash of headers to send, default is basic authentication
|
203
|
-
# @return
|
249
|
+
# @return nil
|
204
250
|
def export_trees(source_name=nil, headers=header_basic_auth)
|
205
251
|
raise StandardError.new "An export directory must be defined to export trees." if @options[:export_directory].nil?
|
206
252
|
if source_name.nil?
|
207
|
-
info("Exporting all trees and routines to #{@options[:export_directory]}.")
|
208
|
-
(
|
253
|
+
@logger.info("Exporting all trees and routines to #{@options[:export_directory]}.")
|
254
|
+
export_routines(headers)
|
255
|
+
(find_sources({}, headers).content["sourceRoots"] || []).each do |sourceRoot|
|
209
256
|
export_trees(sourceRoot['name'])
|
210
257
|
end
|
211
258
|
return
|
212
259
|
elsif source_name == "-"
|
213
|
-
info("Exporting global routines to #{@options[:export_directory]}.")
|
260
|
+
@logger.info("Exporting global routines to #{@options[:export_directory]}.")
|
214
261
|
else
|
215
|
-
info("Exporting trees and routines for source \"#{source_name}\" to #{@options[:export_directory]}.")
|
262
|
+
@logger.info("Exporting trees and routines for source \"#{source_name}\" to #{@options[:export_directory]}.")
|
216
263
|
end
|
217
264
|
|
218
265
|
# Get all the trees and routines for the source
|
@@ -226,12 +273,21 @@ module KineticSdk
|
|
226
273
|
tree_file = File.join(routine_dir, "#{tree['name'].slugify}.xml")
|
227
274
|
else
|
228
275
|
# create the directory if it doesn't yet exist
|
229
|
-
tree_dir = FileUtils::mkdir_p(File.join(@options[:export_directory], "
|
230
|
-
tree_file = File.join(tree_dir, "#{
|
276
|
+
tree_dir = FileUtils::mkdir_p(File.join(@options[:export_directory], "sources", source_name.slugify ,"trees"))
|
277
|
+
tree_file = File.join(tree_dir, "#{tree['sourceGroup'].slugify}.#{tree['name'].slugify}.xml")
|
231
278
|
end
|
279
|
+
|
232
280
|
# write the file
|
233
|
-
|
234
|
-
|
281
|
+
server_version = server_info(headers).content["version"]
|
282
|
+
if server_version > "04.03.0z"
|
283
|
+
File.write(tree_file, tree['export'])
|
284
|
+
else
|
285
|
+
xml_doc = REXML::Document.new(tree["export"])
|
286
|
+
xml_doc.context[:attribute_quote] = :quote
|
287
|
+
xml_formatter = Prettier.new
|
288
|
+
xml_formatter.write(xml_doc, File.open(tree_file, "w"))
|
289
|
+
end
|
290
|
+
@logger.info("Exported #{tree['type']}: #{tree['title']} to #{tree_file}")
|
235
291
|
end
|
236
292
|
end
|
237
293
|
|
@@ -239,7 +295,7 @@ module KineticSdk
|
|
239
295
|
# Export all global routines
|
240
296
|
#
|
241
297
|
# @param headers [Hash] hash of headers to send, default is basic authentication
|
242
|
-
# @return
|
298
|
+
# @return nil
|
243
299
|
def export_routines(headers=header_basic_auth)
|
244
300
|
export_trees("-", headers)
|
245
301
|
end
|
@@ -252,7 +308,7 @@ module KineticSdk
|
|
252
308
|
# @param headers [Hash] hash of headers to send, default is basic authentication and accept JSON content type
|
253
309
|
# @return [KineticSdk::Utils::KineticHttpResponse] object, with +code+, +message+, +content_string+, and +content+ properties
|
254
310
|
def run_tree(title, body={}, headers=default_headers)
|
255
|
-
info("Running tree #{title}")
|
311
|
+
@logger.info("Running tree #{title}")
|
256
312
|
parts = title.split(" :: ")
|
257
313
|
raise StandardError.new "Title is invalid: #{title}" if parts.size != 3
|
258
314
|
url = "#{@api_v1_url}/run-tree/#{encode(parts[0])}/#{encode(parts[1])}/#{encode(parts[2])}"
|
@@ -266,7 +322,7 @@ module KineticSdk
|
|
266
322
|
# @param headers [Hash] hash of headers to send, default is basic authentication and accept JSON content type
|
267
323
|
# @return [KineticSdk::Utils::KineticHttpResponse] object, with +code+, +message+, +content_string+, and +content+ properties
|
268
324
|
def update_tree(title, body={}, headers=default_headers)
|
269
|
-
info("Updating the \"#{title}\" Tree")
|
325
|
+
@logger.info("Updating the \"#{title}\" Tree")
|
270
326
|
put("#{@api_url}/trees/#{encode(title)}", body, headers)
|
271
327
|
end
|
272
328
|
|
@@ -16,7 +16,7 @@ module KineticSdk
|
|
16
16
|
# })
|
17
17
|
#
|
18
18
|
def add_user(user, headers=default_headers)
|
19
|
-
info("Add user \"#{user['loginId']}\"")
|
19
|
+
@logger.info("Add user \"#{user['loginId']}\"")
|
20
20
|
post("#{@api_url}/users", user, headers)
|
21
21
|
end
|
22
22
|
|
@@ -26,7 +26,7 @@ module KineticSdk
|
|
26
26
|
# @param headers [Hash] hash of headers to send, default is basic authentication
|
27
27
|
# @return [KineticSdk::Utils::KineticHttpResponse] object, with +code+, +message+, +content_string+, and +content+ properties
|
28
28
|
def delete_user(login_id, headers=header_basic_auth)
|
29
|
-
info("Deleting User \"#{login_id}\"")
|
29
|
+
@logger.info("Deleting User \"#{login_id}\"")
|
30
30
|
delete("#{@api_url}/users/#{encode(login_id)}", headers)
|
31
31
|
end
|
32
32
|
|
@@ -35,9 +35,9 @@ module KineticSdk
|
|
35
35
|
# @param headers [Hash] hash of headers to send, default is basic authentication
|
36
36
|
# @return [KineticSdk::Utils::KineticHttpResponse] object, with +code+, +message+, +content_string+, and +content+ properties
|
37
37
|
def delete_users(headers=header_basic_auth)
|
38
|
-
info("Deleting all users")
|
38
|
+
@logger.info("Deleting all users")
|
39
39
|
(find_users(headers).content["users"] || []).each do |user|
|
40
|
-
|
40
|
+
delete_user(user['loginId'], headers)
|
41
41
|
end
|
42
42
|
end
|
43
43
|
|
@@ -47,7 +47,7 @@ module KineticSdk
|
|
47
47
|
# @param headers [Hash] hash of headers to send, default is basic authentication
|
48
48
|
# @return [KineticSdk::Utils::KineticHttpResponse] object, with +code+, +message+, +content_string+, and +content+ properties
|
49
49
|
def find_users(params={}, headers=header_basic_auth)
|
50
|
-
info("Finding all users")
|
50
|
+
@logger.info("Finding all users")
|
51
51
|
get("#{@api_url}/users", params, headers)
|
52
52
|
end
|
53
53
|
|
@@ -67,7 +67,7 @@ module KineticSdk
|
|
67
67
|
# })
|
68
68
|
#
|
69
69
|
def update_user(login_id, user, headers=default_headers)
|
70
|
-
info("Updating user \"#{login_id}\"")
|
70
|
+
@logger.info("Updating user \"#{login_id}\"")
|
71
71
|
put("#{@api_url}/users/#{encode(login_id)}", user, headers)
|
72
72
|
end
|
73
73
|
|
@@ -10,7 +10,11 @@ module KineticSdk
|
|
10
10
|
# Include the KineticHttpUtils module
|
11
11
|
include KineticSdk::Utils::KineticHttpUtils
|
12
12
|
|
13
|
-
|
13
|
+
# Include the KineticExportUtils module
|
14
|
+
include KineticSdk::Utils::KineticExportUtils
|
15
|
+
|
16
|
+
attr_reader :api_url, :api_v1_url, :config_user, :options, :server,
|
17
|
+
:version, :username, :password, :logger
|
14
18
|
|
15
19
|
# Initalize the Task SDK with the web server URL and user credentials,
|
16
20
|
# along with any custom option values.
|
@@ -28,9 +32,12 @@ module KineticSdk
|
|
28
32
|
# @option opts [String] :password the password for the user
|
29
33
|
# @option opts [Hash<Symbol, Object>] :options ({}) optional settings
|
30
34
|
#
|
31
|
-
# * :export_directory (String) (_example: /opt/exports/kinetic-
|
32
|
-
# * :
|
33
|
-
# * :
|
35
|
+
# * :export_directory (String) (_example: /opt/exports/kinetic-task_) directory to write files when exporting,
|
36
|
+
# * :gateway_retry_limit (FixNum) (_defaults to: 5_) max number of times to retry a bad gateway
|
37
|
+
# * :gateway_retry_delay (Float) (_defaults to: 1.0_) number of seconds to delay before retrying a bad gateway
|
38
|
+
# * :log_level (String) (_defaults to: off_) level of logging - off | error | warn | info | debug
|
39
|
+
# * :log_output (String) (_defaults to: STDOUT_) where to send output - STDOUT | STDERR
|
40
|
+
# * :max_redirects (Fixnum) (_defaults to: 5_) maximum number of redirects to follow
|
34
41
|
# * :ssl_ca_file (String) full path to PEM certificate used to verify the server
|
35
42
|
# * :ssl_verify_mode (String) (_defaults to: none_) - none | peer
|
36
43
|
#
|
@@ -73,6 +80,11 @@ module KineticSdk
|
|
73
80
|
|
74
81
|
# process any individual options
|
75
82
|
@options = options.delete(:options) || {}
|
83
|
+
# setup logging
|
84
|
+
log_level = @options[:log_level] || @options["log_level"]
|
85
|
+
log_output = @options[:log_output] || @options["log_output"]
|
86
|
+
@logger = KineticSdk::Utils::KLogger.new(log_level, log_output)
|
87
|
+
|
76
88
|
@config_user[:username] = options[:username]
|
77
89
|
@config_user[:password] = options[:password]
|
78
90
|
@server = options[:app_server_url].chomp('/')
|
@@ -0,0 +1,157 @@
|
|
1
|
+
module KineticSdk
|
2
|
+
module Utils
|
3
|
+
|
4
|
+
# The KineticExportUtils module provides methods to simplify exporting
|
5
|
+
# objects and writing to the local file system.
|
6
|
+
module KineticExportUtils
|
7
|
+
|
8
|
+
# Builds the tree structure of the export including the arguments
|
9
|
+
#
|
10
|
+
# @param args [Array] list of property names to include in the export:
|
11
|
+
# (i.e. slug, name, etc)
|
12
|
+
# @return [Hash] struture of the shape to be exported
|
13
|
+
def prepare_shape(*args)
|
14
|
+
shape = {}
|
15
|
+
args.each do |arg|
|
16
|
+
segments = arg.split('.')
|
17
|
+
pointer = shape
|
18
|
+
segments.each do |segment|
|
19
|
+
if segment =~ /\{(.*)\}/
|
20
|
+
pointer[:variable] ||= $1
|
21
|
+
pointer[$1] ||= {}
|
22
|
+
pointer = pointer[$1]
|
23
|
+
else
|
24
|
+
pointer[segment] ||= {}
|
25
|
+
pointer = pointer[segment]
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
shape
|
30
|
+
end
|
31
|
+
|
32
|
+
# Determines if the current path should be extracted further
|
33
|
+
#
|
34
|
+
# @param export_path [String] the path in which to determine if further extraction should occur
|
35
|
+
# @param export_shape [Hash] the directory and file structure of how the data should be written
|
36
|
+
# @return [Boolean] true if the path should be extracted further, otherwise false
|
37
|
+
def should_extract(export_path, export_shape)
|
38
|
+
# Prepare the metadata
|
39
|
+
export_path_segments = export_path.split('.')
|
40
|
+
pointer = export_shape
|
41
|
+
result = true
|
42
|
+
# Walk the export path
|
43
|
+
export_path_segments.each do |export_path_segment|
|
44
|
+
# If the object path corresponds to a "variable"
|
45
|
+
if pointer.has_key?(:variable)
|
46
|
+
pointer = pointer[pointer[:variable]]
|
47
|
+
# If the object path corresponds to a static property
|
48
|
+
else
|
49
|
+
pointer = pointer[export_path_segment]
|
50
|
+
end
|
51
|
+
# If the pointer is null (indicating that the property should not be extracted)
|
52
|
+
if pointer.nil?
|
53
|
+
# Break out of the loop
|
54
|
+
result = false
|
55
|
+
break
|
56
|
+
end
|
57
|
+
end
|
58
|
+
# Return the result
|
59
|
+
result
|
60
|
+
end
|
61
|
+
|
62
|
+
# Fetches the variable property of a given path (ie slug, name, etc)
|
63
|
+
#
|
64
|
+
# @param export_shape [Hash] the directory and file structure of how the data should be written
|
65
|
+
# @param object_path [String] the path in which to get the variable property from
|
66
|
+
# @return [String] the value of the variable property, or nil if it doesn't exist
|
67
|
+
def get_variable_property(export_shape, object_path)
|
68
|
+
# Prepare the metadata
|
69
|
+
object_path_segments = object_path.split('.')
|
70
|
+
pointer = export_shape
|
71
|
+
# Walk the object path
|
72
|
+
object_path_segments.each do |object_path_segment|
|
73
|
+
# If the object path corresponds to a "variable"
|
74
|
+
if pointer.has_key?(:variable)
|
75
|
+
pointer = pointer[pointer[:variable]]
|
76
|
+
# If the object path corresponds to a static property
|
77
|
+
else
|
78
|
+
pointer = pointer[object_path_segment]
|
79
|
+
end
|
80
|
+
# If the pointer is null (indicating that the property should not be extracted)
|
81
|
+
break if pointer.nil?
|
82
|
+
end
|
83
|
+
# Return the result
|
84
|
+
pointer.nil? ? nil : pointer[:variable]
|
85
|
+
end
|
86
|
+
|
87
|
+
# Creates directory structure and writes file
|
88
|
+
#
|
89
|
+
# @param filename [String] the full path and name of the file to be written
|
90
|
+
# @param file_contents [String] the content of the file to be written
|
91
|
+
# @return nil
|
92
|
+
def write_object_to_file(filename, file_contents)
|
93
|
+
# Create Folder if not exists
|
94
|
+
dir_path = File.dirname(filename)
|
95
|
+
FileUtils.mkdir_p(dir_path, :mode => 0700)
|
96
|
+
# Write File
|
97
|
+
File.open(filename, 'w') { |file| file.write(JSON.pretty_generate(file_contents)) }
|
98
|
+
end
|
99
|
+
|
100
|
+
# Processes and writes data exported from the core service
|
101
|
+
#
|
102
|
+
# @param core_path [String] the root folder path to write the data to
|
103
|
+
# @param export_shape [Hash] the directory and file structure of how the data should be written
|
104
|
+
# @param object [Hash] the object being processed
|
105
|
+
# @param object_path [String] the path of the object being processed (used recursively)
|
106
|
+
# @return nil
|
107
|
+
def process_export(core_path, export_shape, object, object_path='')
|
108
|
+
# Prepare metadata
|
109
|
+
child_objects = {}
|
110
|
+
file_contents = {}
|
111
|
+
if object.kind_of?(Array)
|
112
|
+
file_contents = object
|
113
|
+
else
|
114
|
+
# For each of the object properties
|
115
|
+
object.each do |key, value|
|
116
|
+
# Build child object path
|
117
|
+
child_object_path = object_path.empty? ? key : "#{object_path}.#{key}"
|
118
|
+
|
119
|
+
# If the property should be extracted into its own folder/file
|
120
|
+
if should_extract(child_object_path, export_shape)
|
121
|
+
if value.kind_of?(Array)
|
122
|
+
variable = get_variable_property(export_shape, child_object_path)
|
123
|
+
if variable.nil?
|
124
|
+
child_objects[child_object_path] = value
|
125
|
+
else
|
126
|
+
value.each do |item|
|
127
|
+
child_objects["#{child_object_path}.#{item[variable]}"] = item
|
128
|
+
end
|
129
|
+
end
|
130
|
+
else
|
131
|
+
child_objects[child_object_path] = value
|
132
|
+
end
|
133
|
+
# If the property does not need to be extracted
|
134
|
+
else
|
135
|
+
# Add the property to the file contents
|
136
|
+
file_contents[key] = value
|
137
|
+
end
|
138
|
+
end
|
139
|
+
end
|
140
|
+
|
141
|
+
# If this is not the "root" object
|
142
|
+
if object_path != '' && !file_contents.empty?
|
143
|
+
# Write the file_contents based upon the
|
144
|
+
filename = "#{core_path}/#{object_path.gsub('.', '/')}.json"
|
145
|
+
write_object_to_file(filename, file_contents)
|
146
|
+
end
|
147
|
+
|
148
|
+
# For each of the child objects
|
149
|
+
child_objects.each do |key, child_object|
|
150
|
+
# Process the export for that object (recursively)
|
151
|
+
process_export(core_path, export_shape, child_object, key)
|
152
|
+
end
|
153
|
+
end
|
154
|
+
|
155
|
+
end
|
156
|
+
end
|
157
|
+
end
|