apollo_commons_ruby_cli 1.0.0

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.
Files changed (66) hide show
  1. checksums.yaml +7 -0
  2. data/.DS_Store +0 -0
  3. data/.gitignore +9 -0
  4. data/CODE_OF_CONDUCT.md +74 -0
  5. data/Gemfile +6 -0
  6. data/Gemfile.lock +19 -0
  7. data/README.md +40 -0
  8. data/Rakefile +2 -0
  9. data/apollo_commons_ruby.gemspec +26 -0
  10. data/bin/console +14 -0
  11. data/bin/setup +8 -0
  12. data/lib/apollo_commons_ruby/AtroposSubscription.rb +88 -0
  13. data/lib/apollo_commons_ruby/BackfillSampleData.rb +41 -0
  14. data/lib/apollo_commons_ruby/DomainEvent.rb +181 -0
  15. data/lib/apollo_commons_ruby/ExecuteCommand.rb +20 -0
  16. data/lib/apollo_commons_ruby/FileUtils.rb +136 -0
  17. data/lib/apollo_commons_ruby/MarioConfigsStability.rb +181 -0
  18. data/lib/apollo_commons_ruby/MarioEvent.rb +45 -0
  19. data/lib/apollo_commons_ruby/NetworkUtils.rb +188 -0
  20. data/lib/apollo_commons_ruby/Operation.rb +5 -0
  21. data/lib/apollo_commons_ruby/Permission.rb +51 -0
  22. data/lib/apollo_commons_ruby/RequestDataUtils.rb +28 -0
  23. data/lib/apollo_commons_ruby/ResolveTemplate.rb +40 -0
  24. data/lib/apollo_commons_ruby/SecretConfig.rb +65 -0
  25. data/lib/apollo_commons_ruby/ShopHook.rb +79 -0
  26. data/lib/apollo_commons_ruby/TemplateDebug.rb +207 -0
  27. data/lib/apollo_commons_ruby/TemplatePusher.rb +159 -0
  28. data/lib/apollo_commons_ruby/TemplatesHelper.rb +808 -0
  29. data/lib/apollo_commons_ruby/TemplatesRakefile.rb +864 -0
  30. data/lib/apollo_commons_ruby/TenantInfo.rb +26 -0
  31. data/lib/apollo_commons_ruby/TenantTokenCreator.rb +16 -0
  32. data/lib/apollo_commons_ruby/VerifyMarioConfig.rb +220 -0
  33. data/lib/apollo_commons_ruby/ViewGroup.rb +64 -0
  34. data/lib/apollo_commons_ruby/ViewGroupComponent.rb +73 -0
  35. data/lib/apollo_commons_ruby/ViewGroupDefinition.rb +68 -0
  36. data/lib/apollo_commons_ruby/WebhookReporting.rb +13 -0
  37. data/lib/apollo_commons_ruby/Zebugger.rb +125 -0
  38. data/lib/apollo_commons_ruby.rb +60 -0
  39. data/lib/jar/v1_atroposDevTools.jar +0 -0
  40. data/lib/tasks/add_translations.rake +9 -0
  41. data/lib/tasks/backfill_sample_data.rake +7 -0
  42. data/lib/tasks/checkValidJson.rake +17 -0
  43. data/lib/tasks/delete_domain_event.rake +7 -0
  44. data/lib/tasks/delete_view_group.rake +7 -0
  45. data/lib/tasks/delete_view_group_component.rake +21 -0
  46. data/lib/tasks/delete_view_group_definition.rake +26 -0
  47. data/lib/tasks/deploy_all_templates.rake +7 -0
  48. data/lib/tasks/deploy_permissions.rake +6 -0
  49. data/lib/tasks/deploy_shophooks.rake +6 -0
  50. data/lib/tasks/display_on_zebugger.rake +19 -0
  51. data/lib/tasks/get_tenant_token.rake +6 -0
  52. data/lib/tasks/runTests.rake +27 -0
  53. data/lib/tasks/template_debug.rake +32 -0
  54. data/lib/tasks/update_all.rake +36 -0
  55. data/lib/tasks/update_all_domain_events.rake +24 -0
  56. data/lib/tasks/update_all_view_group_components.rake +18 -0
  57. data/lib/tasks/update_domain_event.rake +12 -0
  58. data/lib/tasks/update_one_template.rake +42 -0
  59. data/lib/tasks/update_translations.rake +24 -0
  60. data/lib/tasks/update_view_group_component.rake +9 -0
  61. data/lib/tasks/update_view_group_definition.rake +7 -0
  62. data/lib/tasks/update_view_group_for_user_0.rake +36 -0
  63. data/lib/tasks/validate_mario_configs.rake +10 -0
  64. data/lib/tasks/verify_mario_config.rake +15 -0
  65. data/lib/version.rb +3 -0
  66. metadata +109 -0
@@ -0,0 +1,136 @@
1
+ require 'fileutils'
2
+ require 'json'
3
+ require 'pp'
4
+ require_relative './SecretConfig'
5
+
6
+ def load_environment_properties_file(environment, tenantId, projectId)
7
+ if file_exists?("./.apollo/#{environment}.json")
8
+ apolloEnvFile = File.read("./.apollo/#{environment}.json")
9
+
10
+ if file_exists?("./environments/#{environment}.json")
11
+ tenantEnvFile = File.read("./environments/#{environment}.json")
12
+ end
13
+
14
+ if apolloEnvFile != nil && tenantEnvFile != nil
15
+ $environmentProperties = JSON.parse(tenantEnvFile).merge(JSON.parse(apolloEnvFile))
16
+ elsif tenantEnvFile != nil
17
+ $environmentProperties = JSON.parse tenantEnvFile
18
+ else
19
+ $environmentProperties = JSON.parse apolloEnvFile
20
+ end
21
+ else
22
+ if (environment == 'PreProd')
23
+ environment = 'Preprod'
24
+ end
25
+ envFile = "./environments/" + environment + "/env_" + tenantId + "_" + projectId + ".json"
26
+ if tenantId != nil && projectId != nil && file_exists?(envFile)
27
+ environmentFile = File.read(envFile)
28
+ else
29
+ environmentFile = File.read("./environments/" + environment + "/env.json")
30
+ end
31
+
32
+ $environmentProperties = JSON.parse environmentFile
33
+ end
34
+ end
35
+
36
+ def load_environment_properties(environment, tenantId, projectId)
37
+ load_environment_properties_file(environment, tenantId, projectId)
38
+ load_secret_config_file(environment)
39
+ end
40
+
41
+ def load_secret_config_file(environment)
42
+ begin
43
+ $secretConfig = SecretConfig.new(environment)
44
+ rescue
45
+ print "Running in local. If on jenkins check secret config file"
46
+ end
47
+ end
48
+
49
+ def load_environment_properties_for_debug(environment, tenantId, projectId)
50
+ if(tenantId != nil && projectId != nil)
51
+ load_environment_properties_file(environment, tenantId, projectId)
52
+ if (environment == 'PreProd')
53
+ environment = 'Preprod'
54
+ end
55
+ end
56
+ $secretConfig = DebugSecretConfig.new(environment)
57
+ end
58
+
59
+ def replace_environment_based_config_in_string(body, environment)
60
+ environment.each do |key, value|
61
+ substring_key = "<<" + key + ">>"
62
+ if body.include? substring_key
63
+ puts "Replacing " + substring_key
64
+ body.gsub! substring_key, value
65
+ end
66
+ end
67
+ if body.include? "\\n"
68
+ puts "Replacing " + "\\n"
69
+ body.gsub! "\\n", ""
70
+ end
71
+ return body
72
+ end
73
+
74
+ def reverse_replace_environment_based_config_in_string(body, environment)
75
+ environment.each do |key, value|
76
+ substring_key = "<<" + key + ">>"
77
+ if body.include? value
78
+ puts "Replacing " + value
79
+ body.gsub! value, substring_key
80
+ end
81
+ end
82
+ return body
83
+ end
84
+
85
+ def replace_single_quote(body)
86
+ if body.include? "'"
87
+ puts "Replacing " + "'"
88
+ body.gsub! "'", "\\\""
89
+ end
90
+ return body
91
+ end
92
+
93
+ def replace_double_quote_with_single_quote(body)
94
+ if body.include? "\\\""
95
+ body.gsub! "\\\"", "$$q$$"
96
+ end
97
+ if body.include? "\""
98
+ puts "Replacing \" with '"
99
+ body.gsub! "\"", "'"
100
+ end
101
+ if body.include? "$$q$$"
102
+ body.gsub! "$$q$$", "\\\”"
103
+ end
104
+ return body
105
+ end
106
+
107
+ def raise_exception_if_string_empty(string, identifier)
108
+ if string == nil || string.empty?
109
+ raise "Empty " + identifier
110
+ end
111
+ end
112
+
113
+ def write_to_file(output_file, data)
114
+ File.new(output_file, 'w+')
115
+ File.open(output_file, 'w') {|file| file.truncate(0) }
116
+ File.open(output_file, "w") do |f|
117
+ f.write(data)
118
+ end
119
+ end
120
+
121
+ def read_data_from_file_path(file_path)
122
+ file_data = {}
123
+ begin
124
+ if (file_exists?(file_path))
125
+ in_file = File.read(file_path)
126
+ return if in_file == nil
127
+ file_data = in_file
128
+ else
129
+ file_data = {}
130
+ end
131
+ rescue Exception => e
132
+ puts "Reading from #{file_path} failed with error: #{e}"
133
+ file_data = {}
134
+ end
135
+ return file_data
136
+ end
@@ -0,0 +1,181 @@
1
+ require_relative './ExecuteCommand'
2
+ require_relative './SecretConfig'
3
+ require_relative './FileUtils'
4
+ require 'json'
5
+ require_relative './NetworkUtils'
6
+ require_relative 'VerifyMarioConfig'
7
+ require_relative 'WebhookReporting'
8
+ require_relative 'DomainEvent'
9
+ require_relative 'RequestDataUtils'
10
+ require_relative 'TenantInfo'
11
+
12
+ $environmentProperties = nil
13
+ def validate_mario_configs(env)
14
+ environment = env['environment']
15
+ env["is_local"] = "false"
16
+ load_environment_properties(env['environment'], env['tenant_id'], env['project_id'])
17
+ tenant_info = get_tenant_info(env)
18
+ tenant_info = JSON.parse(tenant_info)
19
+ if tenant_info['isEnabled'] == false
20
+ puts "TENANT IS DISABLED. NOT PROCEEDING"
21
+ return
22
+ end
23
+ all_domain_events = get_all_domain_events(env)
24
+ if all_domain_events == nil
25
+ puts "DOMAIN EVENT DATA IS NULL. COULD NOT PROCEED"
26
+ return
27
+ end
28
+ all_domain_events = JSON.parse(all_domain_events)
29
+ all_domain_events.each do |domainEventData|
30
+ domain_event_data_json = JSON.parse(domainEventData.to_json)
31
+ viewGroupDefinition = domain_event_data_json['viewGroupDefinition']
32
+ component = domain_event_data_json['component']
33
+ domainEventName = domain_event_data_json['domainEventName']
34
+ topic = domain_event_data_json['topic']
35
+ atroposTransformer = nil
36
+ atroposTransformer = replace_double_quote_with_single_quote(domain_event_data_json['subscriptionInfo']['transformer'])
37
+ next if domain_event_data_json['attrs'] == nil || domain_event_data_json['attrs']['sampleData'] == nil || domain_event_data_json['attrs']['sampleData'].size == 0
38
+ sampleData = domain_event_data_json['attrs']['sampleData'][0]
39
+ task = Hash.new
40
+ task['environment'] = env['environment']
41
+ task['view_group_definition'] = viewGroupDefinition
42
+ task['view_group_component'] = component
43
+ task['topic'] = topic
44
+ task['event_name'] = domainEventName
45
+ task['tenant_id'] = env['tenant_id']
46
+ task['project_id'] = env['project_id']
47
+ task['request_data_file'] = "sampleData"
48
+ begin
49
+ base_location = Dir.pwd + "/temp/configs/" + task["view_group_definition"] + "/" + task["view_group_component"] + "/" + task["topic"] + "/" + task["event_name"]
50
+ create_dir_at_path(Dir.pwd + "/temp")
51
+ create_dir_at_path(Dir.pwd + "/temp/configs")
52
+ create_dir_at_path(Dir.pwd + "/temp/configs/" + task["view_group_definition"])
53
+ create_dir_at_path(Dir.pwd + "/temp/configs/" + task["view_group_definition"] + "/" + task["view_group_component"])
54
+ create_dir_at_path(Dir.pwd + "/temp/configs/" + task["view_group_definition"] + "/" + task["view_group_component"] + "/" + task["topic"])
55
+ create_dir_at_path(Dir.pwd + "/temp/configs/" + task["view_group_definition"] + "/" + task["view_group_component"] + "/" + task["topic"] + "/" + task["event_name"])
56
+ create_dir_at_path(Dir.pwd + "/temp/configs/" + task["view_group_definition"] + "/" + task["view_group_component"] + "/" + task["topic"] + "/" + task["event_name"] + "/sampleData")
57
+ create_dir_at_path(Dir.pwd + "/temp/configs/" + task["view_group_definition"] + "/" + task["view_group_component"] + "/" + task["topic"] + "/" + task["event_name"] + "/sampleData/" + env['environment'])
58
+ atropos_transformer_location_temp = base_location + "/atropos_subscription_transformer.js"
59
+ sample_data_location_temp = base_location + "/sampleData/" + env['environment'] + "/sampleData.json"
60
+ write_to_file(atropos_transformer_location_temp, atroposTransformer)
61
+ write_to_file(sample_data_location_temp, sampleData.to_json)
62
+ requestData = validate_atropos_transformer_and_get_output(task, sample_data_location_temp, atropos_transformer_location_temp)
63
+ if requestData == nil
64
+ send_webhook_message(task, compose_message(task, "Invalid Atropos Subscription Transformer"))
65
+ else
66
+ debug_api_response = handle_mario_debugger(task, "sampleData", requestData, false, false)
67
+ if JSON.parse(debug_api_response)["status"] == 'failure' || JSON.parse(debug_api_response)["status"] == nil
68
+ stringified_response = JSON.pretty_generate(JSON.parse(debug_api_response))
69
+ send_webhook_message(task, compose_message(task, stringified_response))
70
+ end
71
+ end
72
+ rescue => exception
73
+ puts exception
74
+ send_webhook_message(task, compose_message(task, "Invalid Configuration"))
75
+ end
76
+ begin
77
+ delete_dir_at_path("/temp")
78
+ rescue => exception
79
+ puts "Unable to delete temp directory"
80
+ end
81
+ end
82
+ end
83
+
84
+ def validate_local_configs(env)
85
+ environment = env["environment"]
86
+ tenantId = env["tenant_id"]
87
+ projectId = env["project_id"]
88
+
89
+ Dir.foreach('./configs') do |viewGroupDefinition|
90
+ next if viewGroupDefinition == '.' || viewGroupDefinition == '..' || viewGroupDefinition == '.DS_Store'
91
+ Dir.foreach('./configs/' + viewGroupDefinition) do |viewGroupComponent|
92
+ next if viewGroupComponent == '.' || viewGroupComponent == '..' || viewGroupComponent == 'view_group_definition_properties.json' || viewGroupComponent == '.DS_Store'
93
+ Dir.foreach('./configs/' + viewGroupDefinition + "/" + viewGroupComponent) do |topic|
94
+ next if topic == '.' || topic == '..' || topic == 'view_group_component_properties.json' || topic == '.DS_Store'
95
+ Dir.foreach('./configs/' + viewGroupDefinition + "/" + viewGroupComponent + "/" + topic) do |eventName|
96
+ next if eventName == '.' || eventName == '..' || eventName == '.DS_Store'
97
+ puts "Debugging domain event for topic " + topic + " and eventName = " + eventName + " and viewGroupDefinition = " + viewGroupDefinition + " and component = " + viewGroupComponent
98
+ task = Hash.new
99
+ task['environment'] = env['environment']
100
+ task['view_group_definition'] = viewGroupDefinition
101
+ task['view_group_component'] = viewGroupComponent
102
+ task['topic'] = topic
103
+ task['event_name'] = eventName
104
+ task['tenant_id'] = env['tenant_id']
105
+ task['project_id'] = env['project_id']
106
+ begin
107
+ task['request_data_file'] = get_sample_data_path_from_directory_name(task)
108
+ begin
109
+ validate_local_domain_event(task)
110
+ rescue => exception
111
+ puts "Unable to validate mario config"
112
+ puts exception.backtrace
113
+ end
114
+ rescue => exception
115
+ puts "Sample Data not present"
116
+ end
117
+ end
118
+ end
119
+ end
120
+ end
121
+ end
122
+
123
+ def validate_local_domain_event(env)
124
+ atropos_transformer_js_validation_jar_output_data = validate_atropos_transformer_and_get_output(env, nil)
125
+ if atropos_transformer_js_validation_jar_output_data == nil
126
+ puts "Invalid Atropos Subscription Transformer"
127
+ raise "Invalid Atropos Subscription Transformer"
128
+ end
129
+ status = validate_mario_config(env, env['request_data_file'], atropos_transformer_js_validation_jar_output_data, true, true)
130
+ if status == false
131
+ raise "Invalid Configuration"
132
+ end
133
+ end
134
+
135
+ # Migrate away from flock terminologies in webhook message
136
+ def compose_message(env, message)
137
+ # to get the current repo
138
+ repo_url = `git config --get remote.origin.url`
139
+ #current_branch = `git branch --show-current`
140
+
141
+ if repo_url.include? "@"
142
+ repo_url = repo_url.gsub(":","/")
143
+ first_part = repo_url.split("@")[0]
144
+ second_part = repo_url.split("@")[1].split(".git")[0] + "/src/master"
145
+ first_part = "https://"
146
+ repo_url = first_part.concat(second_part)
147
+ else
148
+ repo_url = repo_url.split(".git")[0] + "/src/master"
149
+ end
150
+
151
+
152
+ str = "<br/> <flockml><span style='color:#4CB659'><b> REPO URL = <a href=\'"+ repo_url +"\'>"+ repo_url+"</a></b></span></flockml><br/>TENANT ID = " + env["tenant_id"] + "<br/>PROJECT ID = " + env["project_id"] + "<br/>VIEW GROUP DEFINITION = " + env["view_group_definition"] +
153
+ + "<br/>VIEW GROUP COMPONENT = " + env["view_group_component"] + "<br/>TOPIC = " + env["topic"].gsub("<","&lt;").gsub(">","&gt;") +
154
+ + " <br/>EVENT NAME = " + env["event_name"] + "<br/>REQUEST DATA FILE = " + env["request_data_file"] + "<br/><br/><br/>"
155
+ line = "<br/>================================================= ";
156
+
157
+ if(message.include? "logs")
158
+ if JSON.parse(message)["status"] == 'failure'
159
+ return str.concat("<flockml><span style='color:#dd3416'><b>").concat((JSON.parse(message)["logs"].last).to_json).concat("</b></span></flockml>").concat(line)
160
+ end
161
+ elsif(message.include? "INVALID PATH")
162
+ puts message.gsub("&lt;","<").gsub("&gt;",">").red
163
+ last_element_in_the_path = message.split("/").last
164
+ path = message.split(":")[1].gsub(Dir.pwd,"").gsub(last_element_in_the_path,"")
165
+ return str.gsub(repo_url,repo_url+path).concat("<flockml><span style='color:#dd3416'><b>").concat(message).concat(":</b></span></flockml>").concat(line)
166
+ elsif(message.include? "RuntimeException")
167
+ error_log = "PLEASE CHECK ATROPOS SUBSCRIPTION FILE, THERE IS A RUNTIME EXCEPTION" +
168
+ + "<br/><br/>" + message
169
+ puts error_log.red
170
+ return str.gsub(repo_url,repo_url).concat("<flockml><span style='color:#dd3416'><b>").concat(error_log).concat(":</b></span></flockml>").concat(line)
171
+ elsif (message.include? "data")
172
+ if (JSON.parse(message)["data"] == nil)
173
+ message = "PLEASE CHECK ATROPOS SUBSCRIPTION FILE, AFTER VALIDATION OF ATROPOS SUBSCRIPTION FILE, THE RESULTANT TRANSFORMED PAYLOAD IS NULL" +
174
+ + "<br/><br/> "
175
+ puts message.red
176
+ return str.gsub(repo_url,repo_url).concat("<flockml><span style='color:#dd3416'><b>").concat(message).concat(":</b></span></flockml>").concat(line)
177
+ end
178
+ else
179
+ return str.gsub(repo_url, repo_url).concat("<flockml><span style='color:#dd3416'><b>").concat(line).concat(message).concat(":</b></span></flockml>")
180
+ end
181
+ end
@@ -0,0 +1,45 @@
1
+ require 'fileutils'
2
+ require 'json'
3
+ require 'pp'
4
+ require_relative './NetworkUtils'
5
+ require_relative './FileUtils'
6
+ require_relative './Operation'
7
+ require_relative './SecretConfig'
8
+
9
+ $environmentProperties = nil
10
+ $mario_event = nil
11
+ $secretConfig = nil
12
+
13
+ class MarioEvent
14
+ attr_reader :tenantId
15
+ attr_reader :projectId
16
+ attr_reader :viewGroupDefinition
17
+ attr_reader :viewGroupComponent
18
+ attr_reader :topic
19
+ attr_reader :eventName
20
+ attr_reader :requestBody
21
+
22
+ def initialize(configuration_json, view_group_definition, view_group_component, topic, event_name, request_body)
23
+ @tenantId = configuration_json["tenantId"]
24
+ @projectId = configuration_json["projectId"]
25
+ @viewGroupDefinition = view_group_definition
26
+ @viewGroupComponent = view_group_component
27
+ @topic = topic
28
+ @eventName = event_name
29
+ @requestBody = request_body
30
+ end
31
+ end
32
+
33
+ def handle_mario_event(viewGroupDefinitionName, environment, tenantId, projectId, component, topic, eventName, requestBody)
34
+ load_environment_properties(environment, tenantId, projectId)
35
+ $mario_event = MarioEvent.new($environmentProperties, viewGroupDefinitionName, component, topic, eventName, requestBody)
36
+ perform_mario_event_operation
37
+ end
38
+
39
+ def perform_mario_event_operation
40
+ baseMarioUrl = $environmentProperties["apolloMarioBaseUrl"]
41
+ authToken = $secretConfig.authToken
42
+ marioUrl = baseMarioUrl + "/apollo-mario/1.0/tenants/" + $mario_event.tenantId + "/projects/" + $mario_event.projectId + "/view-group-definitions/" + $mario_event.viewGroupDefinition + "/components/" + $mario_event.viewGroupComponent + "/topics/" + $mario_event.topic + "/events/" + $mario_event.eventName + "/subscription"
43
+ replace_environment_based_config_in_string(marioUrl, $environmentProperties)
44
+ make_POST_request(marioUrl,replace_environment_based_config_in_string(JSON.generate(JSON.parse $mario_event.requestBody), $environmentProperties), authToken)
45
+ end
@@ -0,0 +1,188 @@
1
+ require 'json'
2
+ require 'net/http'
3
+ require 'uri'
4
+ require 'openssl'
5
+ require 'base64'
6
+
7
+ def make_PUT_request (url, body, authtoken, query_params = nil, should_log = true)
8
+ if authtoken == nil
9
+ authtoken = ""
10
+ end
11
+ uri = URI.parse(url)
12
+ uri.query = URI.encode_www_form(query_params) if query_params != nil
13
+ http = Net::HTTP.new(uri.host, uri.port)
14
+ http.use_ssl = true
15
+ request = Net::HTTP::Put.new(uri.request_uri,
16
+ initheader = {
17
+ 'Content-Type' =>'application/json',
18
+ 'X-Zeta-AuthToken' => authtoken,
19
+ 'Authorization' => 'Bearer ' + authtoken
20
+ })
21
+ request.body = body
22
+
23
+ puts "#{uri}\n\n" if should_log
24
+ puts "#{request.body}\n\n" if should_log
25
+ response = http.request(request)
26
+ puts "#{response.body}\n\n" if should_log
27
+ return response.body
28
+ end
29
+
30
+ def make_POST_request (url, body, authtoken, query_params = nil, should_log = true)
31
+ if authtoken == nil
32
+ authtoken = ""
33
+ end
34
+ uri = URI.parse(url)
35
+ uri.query = URI.encode_www_form(query_params) if query_params != nil
36
+ http = Net::HTTP.new(uri.host, uri.port)
37
+ http.use_ssl = true
38
+ request = Net::HTTP::Post.new(uri.request_uri,
39
+ initheader = {
40
+ 'Content-Type' =>'application/json',
41
+ 'X-Zeta-AuthToken' => authtoken,
42
+ 'Authorization' => 'Bearer ' + authtoken
43
+ })
44
+ request.body = body
45
+
46
+ puts "#{uri}\n\n" if should_log
47
+ puts "#{request.body}\n\n" if should_log
48
+ response = http.request(request)
49
+ puts "#{response.body}\n\n" if should_log
50
+ return response.body
51
+ end
52
+
53
+
54
+ def make_DELETE_request (url, body = nil, authToken = nil, query_params = nil, should_log = true)
55
+ uri = URI.parse(url)
56
+ uri.query = URI.encode_www_form(query_params) if query_params != nil
57
+
58
+ http = Net::HTTP.new(uri.host, uri.port)
59
+ http.use_ssl = true
60
+ request = Net::HTTP::Delete.new(uri.request_uri,
61
+ initheader = {
62
+ 'Content-Type' =>'application/json',
63
+ 'X-Zeta-AuthToken' => authToken,
64
+ 'Authorization' => 'Bearer ' + authToken
65
+ })
66
+ if body != nil
67
+ request.body = body
68
+ end
69
+
70
+ puts "#{uri}\n\n" if should_log
71
+ puts "#{request.body}\n\n" if should_log
72
+ response = http.request(request)
73
+ puts "#{response.body}\n\n" if should_log
74
+ return response.body
75
+ end
76
+
77
+ def make_GET_request (url, authToken, query_params = nil, should_log = true)
78
+ uri = URI.parse(url)
79
+ uri.query = URI.encode_www_form(query_params) if query_params != nil
80
+
81
+ http = Net::HTTP.new(uri.host, uri.port)
82
+ http.use_ssl = true
83
+ request = Net::HTTP::Get.new(uri.request_uri,
84
+ initheader = {
85
+ 'X-Zeta-AuthToken' => authToken,
86
+ 'Authorization' => 'Bearer ' + authToken
87
+ })
88
+
89
+ puts "#{uri}\n\n" if should_log
90
+ puts "#{request.body}\n\n" if should_log
91
+ response = http.request(request)
92
+ puts "#{response.body}\n\n" if should_log
93
+ return response.code, response.body
94
+ end
95
+
96
+ def get_hera_token_and_make_request(type, environment, tenantId, projectId, url, body = nil, query_params = nil, should_log = true)
97
+ return get_token_and_make_request(type, environment, tenantId, projectId, url, body, query_params, should_log, false)
98
+ end
99
+
100
+ def get_tenant_token_and_make_request(type, environment, tenantId, projectId, url, body = nil, query_params = nil, should_log = true)
101
+ return get_token_and_make_request(type, environment, tenantId, projectId, url, body, query_params, should_log, true)
102
+ end
103
+
104
+ def get_token_and_make_request(type, environment, tenantId, projectId, url, body = nil, query_params = nil, should_log = true, use_tenant_token = true)
105
+ if file_exists?("./.apollo/#{environment}.json")
106
+ conf_file = File.read(File.expand_path("./.apollo/#{environment}.json"))
107
+ conf = JSON.parse conf_file
108
+ if use_tenant_token
109
+ authToken = conf["tenantAuthToken"]
110
+ else
111
+ authToken = conf["heraAuthToken"]
112
+ end
113
+
114
+ else
115
+ raise_exception_if_string_empty(environment, "environment")
116
+ raise_exception_if_string_empty(tenantId, "tenantId")
117
+ raise_exception_if_string_empty(projectId, "projectId")
118
+
119
+ tenantTokenCacheKey = "tenantToken_#{environment}_#{tenantId}"
120
+ if(ENV[tenantTokenCacheKey] == nil)
121
+ puts "Making api call to get tenant token"
122
+ load_environment_properties(environment, tenantId, projectId)
123
+ raise_exception_if_string_empty($environmentProperties["apolloAppBaseUrl"], "apolloAppBaseUrl")
124
+
125
+ authToken = get_token(tenantId, use_tenant_token)
126
+ ENV[tenantTokenCacheKey] = authToken
127
+ else
128
+ puts "Using cached tenant token"
129
+ authToken = ENV[tenantTokenCacheKey]
130
+ end
131
+ end
132
+
133
+ if (authToken == nil)
134
+ raise "Failed to get authToken"
135
+ return
136
+ end
137
+
138
+ if type == HTTP::GET
139
+ code, response = make_GET_request(url, authToken, query_params, true)
140
+ return response
141
+ elsif type == HTTP::POST
142
+ response = make_POST_request(url, body, authToken, query_params, true)
143
+ elsif type == HTTP::DELETE
144
+ response = make_DELETE_request(url, body, authToken, query_params, true)
145
+ elsif type == HTTP::PUT
146
+ response = make_PUT_request(url, body, authToken, query_params, true)
147
+ end
148
+ end
149
+
150
+ def get_token(tenantId, use_tenant_token)
151
+ if use_tenant_token
152
+ get_tenant_token($environmentProperties["apolloAppBaseUrl"], tenantId, $secretConfig.heraAuthToken)
153
+ else
154
+ $secretConfig.heraAuthToken
155
+ end
156
+ end
157
+
158
+ def get_tenant_token(apolloAppBaseUrl, tenantId, heraAuthToken)
159
+ puts "getting tenant auth token from apollo app"
160
+
161
+ apolloAppUrl = apolloAppBaseUrl + "/apollo-app/1.0/tenants/#{tenantId}/access-token"
162
+ code, response = make_GET_request(apolloAppUrl, heraAuthToken, nil, false)
163
+
164
+ jsonResponse = JSON.parse(response)
165
+ tenantAuthToken = jsonResponse["access_token"]
166
+
167
+ if (tenantAuthToken == nil)
168
+ raise "Failed to get tenantAuthToken from apollo-app"
169
+ return nil
170
+ end
171
+
172
+ return tenantAuthToken
173
+ end
174
+
175
+ def invoke_API(environment, url, type, query_params = nil, body = nil, authToken = nil)
176
+ secretConfig = SecretConfig.new(environment);
177
+ query_params = query_params == nil ? {} : query_params
178
+ if type == HTTP::GET
179
+ code, response = make_GET_request(url, authToken == nil ? secretConfig.authToken : authToken, query_params, true)
180
+ elsif type == HTTP::POST
181
+ response = make_POST_request(url, body, authToken == nil ? secretConfig.authToken : authToken, query_params, true)
182
+ elsif type == HTTP::DELETE
183
+ response = make_DELETE_request(url, body, authToken == nil ? secretConfig.authToken : authToken, query_params, true)
184
+ end
185
+ if response
186
+ JSON.parse response
187
+ end
188
+ end
@@ -0,0 +1,5 @@
1
+ module Operation
2
+ PUT = 1
3
+ DELETE = 2
4
+ DEBUG = 3
5
+ end
@@ -0,0 +1,51 @@
1
+ require 'fileutils'
2
+ require 'json'
3
+ require 'pp'
4
+ require_relative './NetworkUtils'
5
+ require_relative './FileUtils'
6
+ require_relative './SecretConfig'
7
+
8
+ $environmentProperties = nil
9
+ $secretConfig = nil
10
+
11
+ def deploy_permissions(env)
12
+ environment = env["environment"]
13
+ tenantId = env["tenantId"]
14
+ projectId = env["projectId"]
15
+ itemId = env["itemId"]
16
+
17
+ raise_exception_if_string_empty(environment, "environment")
18
+ raise_exception_if_string_empty(tenantId, "tenantId")
19
+ raise_exception_if_string_empty(projectId, "projectId")
20
+
21
+ load_environment_properties(environment, tenantId, projectId)
22
+
23
+ permissionConfigCollectionId = "scopeID." + projectId + ".permission_config@collections.zeta.in"
24
+
25
+ if itemId == nil || itemId.empty?
26
+ files = Dir["./permissions/*.json"]
27
+ files.each do |path|
28
+ itemId = File.basename(path, ".json")
29
+ puts "Deploying permission " + itemId
30
+ deploy_one_permission(environment, tenantId, projectId, permissionConfigCollectionId, itemId)
31
+ end
32
+ else
33
+ puts "Deploying permission " + itemId
34
+ deploy_one_permission(environment, tenantId, projectId, permissionConfigCollectionId, itemId)
35
+ end
36
+ end
37
+
38
+ def deploy_one_permission(environment, tenantId, projectId, permissionConfigCollectionId, itemId)
39
+ permissionConfig = read_data_from_file_path("./permissions/" + itemId + ".json")
40
+
41
+ permissionConfig = JSON.pretty_generate(JSON.parse(permissionConfig)).gsub("\n", '').gsub("\t", '')
42
+
43
+ request_payload = {
44
+ :itemID => itemId,
45
+ :data => permissionConfig
46
+ }
47
+
48
+ url = $environmentProperties["omsBaseUrl"] + "/zeta.in/collections/1.0/setCollectionItem2?to=#{permissionConfigCollectionId}"
49
+
50
+ get_token_and_make_request(HTTP::POST, environment, tenantId, projectId, url, request_payload.to_json)
51
+ end
@@ -0,0 +1,28 @@
1
+ require_relative './FileUtils'
2
+ require 'fileutils'
3
+
4
+ def get_sample_data_path_from_directory(env)
5
+ sampleDataLocation = Dir.pwd + "/configs/" + env["view_group_definition"] + "/" + env["view_group_component"] + "/" + env["topic"] + "/" + env["event_name"] + "/sampleData/" + env['environment']
6
+ Dir.entries(sampleDataLocation).sort.each do |sampleData|
7
+ next if sampleData == '.' || sampleData == '..' || sampleData == '.DS_Store'
8
+ return sampleDataLocation + "/" + sampleData
9
+ end
10
+ return nil
11
+ end
12
+
13
+ def get_sample_data_path_from_directory_name(env)
14
+ sampleDataLocation = Dir.pwd + "/configs/" + env["view_group_definition"] + "/" + env["view_group_component"] + "/" + env["topic"] + "/" + env["event_name"] + "/sampleData/" + env['environment']
15
+ Dir.entries(sampleDataLocation).sort.each do |sampleData|
16
+ next if sampleData == '.' || sampleData == '..' || sampleData == '.DS_Store'
17
+ return sampleData.split(".")[0]
18
+ end
19
+ return nil
20
+ end
21
+
22
+ def create_dir_at_path(path)
23
+ FileUtils.mkdir_p (path)
24
+ end
25
+
26
+ def delete_dir_at_path(path)
27
+ FileUtils.rm_rf(Dir.pwd + path)
28
+ end