brpm_module_brpm 0.1.10

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 (45) hide show
  1. checksums.yaml +15 -0
  2. data/.gitignore +38 -0
  3. data/.ruby-version +1 -0
  4. data/.travis.yml +18 -0
  5. data/Gemfile +3 -0
  6. data/LICENSE +21 -0
  7. data/README.md +7 -0
  8. data/Rakefile +24 -0
  9. data/automations/create_release_from_excel.rb +34 -0
  10. data/automations/create_release_from_excel.txt +5 -0
  11. data/automations/create_release_request.rb +100 -0
  12. data/automations/create_release_request.txt +5 -0
  13. data/automations/create_request.rb +73 -0
  14. data/automations/create_request.txt +23 -0
  15. data/automations/promote_request.rb +197 -0
  16. data/automations/promote_request.txt +24 -0
  17. data/automations/select_application_version.rb +22 -0
  18. data/automations/select_application_version.txt +17 -0
  19. data/automations/select_component_version.rb +12 -0
  20. data/automations/select_component_version.txt +5 -0
  21. data/automations/select_request_template.rb +6 -0
  22. data/automations/select_request_template.txt +13 -0
  23. data/automations/wait_for_step_in_other_request.rb +11 -0
  24. data/automations/wait_for_step_in_other_request.txt +13 -0
  25. data/automations/wait_till_promoted_request_is_completed.rb +9 -0
  26. data/automations/wait_till_promoted_request_is_completed.txt +5 -0
  27. data/bin/create_release_request +23 -0
  28. data/brpm_module_brpm.gemspec +39 -0
  29. data/config.yml +11 -0
  30. data/lib/brpm_request.rb +207 -0
  31. data/lib/brpm_rest.rb +312 -0
  32. data/lib/brpm_rest_client.rb +1501 -0
  33. data/resource_automations/select_application.rb +16 -0
  34. data/resource_automations/select_application.txt +5 -0
  35. data/resource_automations/select_environment.rb +14 -0
  36. data/resource_automations/select_environment.txt +5 -0
  37. data/resource_automations/select_request_template.rb +16 -0
  38. data/resource_automations/select_request_template.txt +5 -0
  39. data/resource_automations/select_step_in_request.rb +33 -0
  40. data/resource_automations/select_step_in_request.txt +5 -0
  41. data/tests/create_release_request_spec.rb +66 -0
  42. data/tests/create_request_spec.rb +84 -0
  43. data/tests/select_application_version_spec.rb +47 -0
  44. data/tests/spec_helper.rb +71 -0
  45. metadata +131 -0
@@ -0,0 +1,1501 @@
1
+ class BrpmRestClient
2
+ def initialize(brpm_url = BrpmAuto.params.brpm_url, brpm_api_token= BrpmAuto.params.brpm_api_token)
3
+ @brpm_url = brpm_url
4
+ @brpm_api_token = brpm_api_token
5
+ end
6
+
7
+ # Performs a get on the passed model
8
+ #
9
+ # ==== Attributes
10
+ #
11
+ # * +model_name+ - rpm model [requests, plans, steps, version_tags, etc]
12
+ # * +model_id+ - id of a specific item in the model (optional)
13
+ # * +options+ - hash of options includes
14
+ # +filters+ - string of the filter text: filters[BrpmAuto.login]=bbyrd
15
+ # includes all the Rest.rest_call options
16
+ #
17
+ # ==== Returns
18
+ #
19
+ # * hash of http response
20
+ def get(model_name, model_id = nil, options = {})
21
+ url = get_brpm_url(model_name, model_id) if get_option(options, "filters") == ""
22
+ url = get_brpm_url(model_name, nil, options["filters"]) if get_option(options, "filters") != ""
23
+ result = Rest.get(url, options)
24
+
25
+ result = brpm_get "v1/#{model_name}#{model_id == nil ? "" : "/#{model_id}" }"
26
+ end
27
+
28
+ # Performs a put on the passed model
29
+ # use this to update a single record
30
+ # ==== Attributes
31
+ #
32
+ # * +model_name+ - rpm model [requests, plans, steps, version_tags, etc]
33
+ # * +model_id+ - id of a specific item in the model (optional)
34
+ # * +data+ - hash of the put data
35
+ # * +options+ - hash of options includes
36
+ # includes all the Rest.rest_call options
37
+ #
38
+ # ==== Returns
39
+ #
40
+ # * hash of http response
41
+ def update(model_name, model_id, data, options = {})
42
+ url = get_brpm_url(model_name, model_id)
43
+ options["data"] = data
44
+ result = Rest.put(url, options)
45
+ result
46
+ end
47
+
48
+ # Performs a post on the passed model
49
+ # use this to create a new record
50
+ # ==== Attributes
51
+ #
52
+ # * +model_name+ - rpm model [requests, plans, steps, version_tags, etc]
53
+ # * +data+ - hash of the put data
54
+ # * +options+ - hash of options includes
55
+ # includes all the Rest.rest_call options
56
+ #
57
+ # ==== Returns
58
+ #
59
+ # * hash of http response
60
+ def create(model_name, data, options = {})
61
+ options["data"] = data
62
+ url = get_brpm_url(model_name)
63
+ result = Rest.post(url, options)
64
+ result
65
+ end
66
+
67
+ def get_user_by_id(user_id)
68
+ result = brpm_get "v1/users/#{user_id}"
69
+
70
+ if result["status"] == "success"
71
+ result_hash = result["response"]
72
+ else
73
+ raise "Error searching for user #{user_id}: #{result["error_message"]}"
74
+ end
75
+
76
+ result_hash
77
+ end
78
+
79
+ def get_user_by_name(first_name, last_name)
80
+ result = brpm_get "v1/users?filters[first_name]=#{first_name}&filters[last_name]=#{last_name}"
81
+
82
+ if result["status"] == "success"
83
+ result_hash = result["response"].first
84
+ else
85
+ if result["code"] == 404
86
+ result_hash=nil
87
+ else
88
+ raise "Could not find user #{first_name} #{last_name}: #{result["error_message"]}"
89
+ end
90
+ end
91
+
92
+ result_hash
93
+ end
94
+
95
+ def get_group_by_name(name)
96
+ result = brpm_get "v1/groups?filters[name]=#{name}"
97
+
98
+ if result["status"] == "success"
99
+ result_hash = result["response"].first
100
+ else
101
+ if result["code"] == 404
102
+ result_hash=nil
103
+ else
104
+ raise "Could not find group #{name}: #{result["error_message"]}"
105
+ end
106
+ end
107
+
108
+ result_hash
109
+ end
110
+
111
+ def get_property_by_name(property_name)
112
+ result = brpm_get "v1/properties?filters[name]=#{property_name}"
113
+
114
+ if result["status"] == "success"
115
+ result_hash = result["response"].first
116
+ else
117
+ if result["code"] == 404
118
+ result_hash=nil
119
+ else
120
+ raise "Could not find property #{property_name}: #{result["error_message"]}"
121
+ end
122
+ end
123
+
124
+ result_hash
125
+ end
126
+
127
+ def create_server(server_name, dns = nil, environment_ids = nil, ip_address = nil, os_platform = nil, property_ids = nil)
128
+ server={}
129
+ server["name"] = server_name
130
+ server["environment_ids"] = environment_ids unless environment_ids.nil?
131
+ server["ip_address"] = ip_address unless ip_address.nil?
132
+ server["os_platform"] = os_platform unless os_platform.nil?
133
+ server["property_ids"] = property_ids unless property_ids.nil?
134
+
135
+ result = brpm_post "v1/servers", { :server => server }
136
+
137
+ if result["status"] == "success"
138
+ result_hash = result["response"]
139
+ else
140
+ if Rest.already_exists_error(result)
141
+ BrpmAuto.log "This server already exists."
142
+ result_hash = get_server_by_name(server_name)
143
+ existing_environment_ids = result_hash["environments"].map { |env| env["id"] }
144
+
145
+ environment_ids ||= []
146
+
147
+ (environment_ids - existing_environment_ids).each do |environment_id|
148
+ link_environment_to_server(environment_id, server_name)
149
+ end
150
+ else
151
+ raise "Could not create server: #{result["error_message"]}"
152
+ end
153
+ end
154
+
155
+ result_hash
156
+ end
157
+
158
+ def get_server_by_name(server_name)
159
+ result = brpm_get "v1/servers?filters[name]=#{server_name}"
160
+
161
+ if result["status"] == "success"
162
+ result_hash = result["response"].first
163
+ else
164
+ if result["code"] == 404
165
+ result_hash=nil
166
+ else
167
+ raise "Could not find server #{server_name}: #{result["error_message"]}"
168
+ end
169
+ end
170
+
171
+ result_hash
172
+ end
173
+
174
+ def get_request_templates_by_app(app_name)
175
+ app = get_app_by_name(app_name)
176
+
177
+ result = brpm_get "v1/request_templates?filters[app_id]=#{app["id"]}"
178
+
179
+ if result["status"] == "success"
180
+ result_hash = result["response"]
181
+ else
182
+ if result["code"] == 404
183
+ result_hash={}
184
+ else
185
+ raise "Could not find request templates for app #{app_name}: #{result["error_message"]}"
186
+ end
187
+ end
188
+
189
+ result_hash
190
+ end
191
+
192
+ def get_apps
193
+ result = brpm_get "v1/apps"
194
+
195
+ if result["status"] == "success"
196
+ result_hash = result["response"]
197
+ else
198
+ if result["code"] == 404
199
+ result_hash = {}
200
+ else
201
+ raise "Error getting apps: #{result["error_message"]}"
202
+ end
203
+ end
204
+
205
+ result_hash
206
+ end
207
+
208
+ def get_app_by_id(app_id)
209
+ result = brpm_get "v1/apps/#{app_id}"
210
+
211
+ if result["status"] == "success"
212
+ result_hash = result["response"]
213
+ else
214
+ raise "Error searching for application #{app_id}: #{result["error_message"]}"
215
+ end
216
+
217
+ result_hash
218
+ end
219
+
220
+ def get_app_by_name(app_name)
221
+ result = brpm_get "v1/apps?filters[name]=#{app_name}"
222
+
223
+ if result["status"] == "success"
224
+ result_hash = result["response"].first
225
+ else
226
+ if result["code"] == 404
227
+ result_hash=nil
228
+ else
229
+ raise "Could not find application #{app_name}: #{result["error_message"]}"
230
+ end
231
+ end
232
+
233
+ result_hash
234
+ end
235
+
236
+ def get_component_by_id(component_id)
237
+ result = brpm_get "v1/components/#{component_id}"
238
+
239
+ if result["status"] == "success"
240
+ result_hash = result["response"]
241
+ else
242
+ raise "Error searching for component #{component_id}: #{result["error_message"]}"
243
+ end
244
+
245
+ result_hash
246
+ end
247
+
248
+ def get_environments_of_application(app_name)
249
+ app = get_app_by_name(app_name)
250
+ app["environments"]
251
+ end
252
+
253
+ def get_environment_by_id(environment_id)
254
+ result = brpm_get "v1/environments/#{environment_id}"
255
+
256
+ if result["status"] == "success"
257
+ result_hash = result["response"]
258
+ else
259
+ raise "Error searching for environment #{environment_id}: #{result["error_message"]}"
260
+ end
261
+
262
+ result_hash
263
+ end
264
+
265
+ def get_environment_by_name(environment_name)
266
+ result = brpm_get "v1/environments?filters[name]=#{environment_name}"
267
+
268
+ if result["status"] == "success"
269
+ result_hash = result["response"].first
270
+ else
271
+ if result["code"] == 404
272
+ result_hash=nil
273
+ else
274
+ raise "Error searching for environment #{environment_name}: #{result["error_message"]}"
275
+ end
276
+ end
277
+
278
+ result_hash
279
+ end
280
+
281
+ def create_environment(environment_name)
282
+ environment={}
283
+ environment["name"]=environment_name
284
+
285
+ result = brpm_post "v1/environments", { :environment => environment }
286
+
287
+ if result["status"] == "success"
288
+ result_hash = result["response"]
289
+ else
290
+ if Rest.already_exists_error(result)
291
+ BrpmAuto.log "This environment already exists. Continuing ..."
292
+ result_hash = get_environment_by_name(environment_name)
293
+ else
294
+ raise "Could not create environment: #{result["error_message"]}"
295
+ end
296
+ end
297
+
298
+ result_hash
299
+ end
300
+
301
+ def rename_environment(environment_id, environment_name)
302
+ environment={}
303
+ environment["name"]="#{Time.now.strftime("%Y%m%d%H%M%S")} #{environment_name}"
304
+
305
+ result = brpm_put "v1/environments/#{environment_id}", { :environment => environment }
306
+
307
+ unless result["status"] == "success"
308
+ raise "Could not rename environment: #{result["error_message"]}"
309
+ end
310
+ end
311
+
312
+ def delete_environment(environment_name)
313
+ environment = get_environment_by_name(environment_name)
314
+
315
+ if environment.nil?
316
+ BrpmAuto.log "This environment doesn't exist. Continuing ..."
317
+ return
318
+ end
319
+
320
+ rename_environment(environment["id"], environment_name)
321
+
322
+ result = brpm_delete "v1/environments/#{environment["id"]}"
323
+
324
+ unless result["status"] == "success"
325
+ raise "Could not delete environment: #{result["error_message"]}"
326
+ end
327
+ end
328
+
329
+ def link_environment_to_server(environment_id, server_name)
330
+ server = get_server_by_name(server_name)
331
+
332
+ server_to_update={}
333
+ server_to_update["environment_ids"] = server["environments"].map{|f| f["id"]}
334
+
335
+ if server_to_update["environment_ids"].include?(environment_id)
336
+ BrpmAuto.log "This server is already linked to the application. Continuing..."
337
+ return
338
+ end
339
+
340
+ server_to_update["environment_ids"].push(environment_id)
341
+
342
+ result = brpm_put "v1/servers/#{server["id"]}", { :server => server_to_update }
343
+
344
+ unless result["status"] == "success"
345
+ raise "Could not link environment to server: #{result["error_message"]}"
346
+ end
347
+ end
348
+
349
+ def unlink_environment_from_server(environment_name, server_name)
350
+ server = get_server_by_name(server_name)
351
+
352
+ if server.nil?
353
+ BrpmAuto.log "This server doesn't exist. Continuing ..."
354
+ return
355
+ end
356
+
357
+ environment = get_environment_by_name(environment_name)
358
+
359
+ if environment.nil?
360
+ BrpmAuto.log "This environment doesn't exist. Continuing ..."
361
+ return
362
+ end
363
+
364
+ server_to_update={}
365
+ server_to_update["environment_ids"] = server["environments"].map{|f| f["id"]}
366
+
367
+ unless server_to_update["environment_ids"].include?(environment["id"])
368
+ BrpmAuto.log "This environment is not linked to the server. Continuing ..."
369
+ return
370
+ end
371
+
372
+ server_to_update["environment_ids"].delete(environment["id"])
373
+
374
+ result = brpm_put "v1/servers/#{server["id"]}", { :server => server_to_update}
375
+
376
+ unless result["status"] == "success"
377
+ raise "Could not unlink environment from server: #{result["error_message"]}"
378
+ end
379
+ end
380
+
381
+ def link_environment_to_app(environment_id, app_name)
382
+ app = get_app_by_name(app_name)
383
+
384
+ app_to_update={}
385
+ app_to_update["environment_ids"] = app["environments"].map{|f| f["id"]}
386
+
387
+ if app_to_update["environment_ids"].include?(environment_id)
388
+ BrpmAuto.log "This environment is already linked to the application. Continuing..."
389
+ return
390
+ end
391
+
392
+ app_to_update["environment_ids"].push(environment_id)
393
+
394
+ result = brpm_put "v1/apps/#{app["id"]}", { :app => app_to_update}
395
+
396
+ unless result["status"] == "success"
397
+ raise "Could not link environment to app: #{result["error_message"]}"
398
+ end
399
+ end
400
+
401
+ def unlink_environment_from_app(environment_name, app_name)
402
+ app = get_app_by_name(app_name)
403
+
404
+ if app.nil?
405
+ BrpmAuto.log "This application doesn't exist. Continuing ..."
406
+ return
407
+ end
408
+
409
+ environment = get_environment_by_name(environment_name)
410
+
411
+ if environment.nil?
412
+ BrpmAuto.log "This environment doesn't exist. Continuing ..."
413
+ return
414
+ end
415
+
416
+ app_to_update={}
417
+ app_to_update["environment_ids"] = app["environments"].map{|f| f["id"]}
418
+
419
+ unless app_to_update["environment_ids"].include?(environment["id"])
420
+ BrpmAuto.log "This environment is not linked to the app. Continuing ..."
421
+ return
422
+ end
423
+
424
+ app_to_update["environment_ids"].delete(environment["id"])
425
+
426
+ result = brpm_put "v1/apps/#{app["id"]}", { :app => app_to_update}
427
+
428
+ unless result["status"] == "success"
429
+ raise "Could not unlink environment from app: #{result["error_message"]}"
430
+ end
431
+ end
432
+
433
+ def get_installed_component_by_id(component_id)
434
+ result = brpm_get "v1/installed_components/#{component_id}"
435
+
436
+ if result["status"] == "success"
437
+ result_hash = result["response"]
438
+ else
439
+ raise "Error searching for installed component #{component_id}: #{result["error_message"]}"
440
+ end
441
+
442
+ result_hash
443
+ end
444
+
445
+ def get_installed_component(component_name, environment_name)
446
+ result = brpm_get "v1/installed_components?filters[component_name]=#{component_name}&filters[environment_name]=#{environment_name}"
447
+
448
+ if result["status"] == "success"
449
+ result_hash = result["response"].first
450
+ else
451
+ if result["code"] == 404
452
+ result_hash=nil
453
+ else
454
+ raise "Error searching for installed component #{component_name} / #{environment_name} #{result["error_message"]}"
455
+ end
456
+ end
457
+
458
+ result_hash
459
+ end
460
+
461
+ def get_installed_components_by(filter)
462
+ filter_string = "?"
463
+ filter.each do |key, value|
464
+ filter_string += "filters[#{key}]=#{value}&"
465
+ end
466
+ filter_string = filter_string[0..-1]
467
+
468
+ result = brpm_get "v1/installed_components#{filter_string}"
469
+
470
+ if result["status"] == "success"
471
+ result_hash = result["response"]
472
+ else
473
+ if result["code"] == 404
474
+ result_hash = {}
475
+ else
476
+ raise "Error searching for installed_components by #{filter_string}: #{result["error_message"]}"
477
+ end
478
+ end
479
+
480
+ result_hash
481
+ end
482
+
483
+ def create_installed_component(component_name, component_version, environment_name, app_name, server_name)
484
+ installed_comp = {}
485
+ installed_comp["app_name"] = app_name
486
+ installed_comp["component_name"] = component_name
487
+ installed_comp["environment_name"] = environment_name
488
+ installed_comp["version"]= component_version
489
+ installed_comp["server_names"] = [ server_name ]
490
+
491
+ result = brpm_post "v1/installed_components", { :installed_component => installed_comp }
492
+
493
+ if result["status"] == "success"
494
+ result_hash = result["response"]
495
+ else
496
+ if Rest.already_exists_error(result)
497
+ BrpmAuto.log "This installed component already exists."
498
+ result_hash = get_installed_component(component_name, environment_name)
499
+ result_hash = get_installed_component_by_id(result_hash["id"])
500
+
501
+ servers = result_hash["servers"].map { |server| server["name"] }
502
+
503
+ BrpmAuto.log "Verifying if the existing installed component is already linked to the server ..."
504
+ if servers.include?(server_name)
505
+ BrpmAuto.log "The existing installed component is already linked to the server. Continuing ..."
506
+ else
507
+ BrpmAuto.log "The existing installed component is not yet linked to the server, doing it now ..."
508
+ servers.push server_name
509
+ set_servers_of_installed_component(result_hash["id"], servers)
510
+ end
511
+ else
512
+ raise "Could not create installed component: #{result["error_message"]}"
513
+ end
514
+ end
515
+
516
+ BrpmAuto.log "Copying the version tags from environment [default] to environment #{environment_name} ..."
517
+ copy_version_tags_of_app_and_comp_from_env_to_env(app_name, component_name, "[default]", environment_name)
518
+
519
+ result_hash
520
+ end
521
+
522
+ def set_property_of_installed_component(installed_component_id, property, value)
523
+ installed_comp= {}
524
+ installed_comp["properties_with_values"] = {}
525
+ installed_comp["properties_with_values"][property] = value
526
+
527
+ result = brpm_put "v1/installed_components/#{installed_component_id}", { :installed_component => installed_comp }
528
+
529
+ unless result["status"] == "success"
530
+ raise "Could not set properties on installed component: #{result["error_message"]}"
531
+ end
532
+ end
533
+
534
+ def get_server_group_from_step_id(step_id)
535
+ step = get_step_by_id(step_id)
536
+
537
+ installed_component = get_installed_component_by_id(step["installed_component"]["id"])
538
+
539
+ return nil unless installed_component["server_group"]
540
+
541
+ installed_component["server_group"]["name"]
542
+ end
543
+
544
+ def set_servers_of_installed_component(installed_component_id, server_names)
545
+ installed_comp= {}
546
+ installed_comp["server_names"] = server_names
547
+
548
+ result = brpm_put "v1/installed_components/#{installed_component_id}", { :installed_component => installed_comp }
549
+
550
+ unless result["status"] == "success"
551
+ raise "Could not set servers on installed component: #{result["error_message"]}"
552
+ end
553
+ end
554
+
555
+ def set_property_of_server(server_id, property_id, value)
556
+ property = {}
557
+ property["property_values_with_holders"] = {}
558
+ property["property_values_with_holders"]["value_holder_type"] = "Server"
559
+ property["property_values_with_holders"]["value_holder_id"] = server_id
560
+ property["property_values_with_holders"]["value"] = value
561
+
562
+ result = brpm_put "v1/properties/#{property_id}", { :property => property }
563
+
564
+ unless result["status"] == "success"
565
+ raise "Could not set property on server: #{result["error_message"]}"
566
+ end
567
+ end
568
+
569
+ def create_version_tag(app_name, component_name, environment, version_tag_name)
570
+ version_tag={}
571
+ version_tag["name"] = version_tag_name
572
+ version_tag["find_application"] = app_name
573
+ version_tag["find_component"] = component_name
574
+ version_tag["find_environment"] = environment
575
+ version_tag["active"] = true
576
+
577
+ result = brpm_post "v1/version_tags", { :version_tag => version_tag }
578
+
579
+ if result["status"] == "success"
580
+ result_hash = result["response"]
581
+ else
582
+ if Rest.already_exists_error(result)
583
+ BrpmAuto.log "This version tag already exists. Continuing ..."
584
+ result_hash = get_version_tag(app_name, component_name, environment, version_tag_name)
585
+ else
586
+ raise "Could not create version tag: #{result["error_message"]}"
587
+ end
588
+ end
589
+
590
+ result_hash
591
+ end
592
+
593
+ def delete_version_tag(version_tag_id)
594
+ result = brpm_delete "v1/version_tags/#{version_tag_id}"
595
+
596
+ unless result["status"] == "success"
597
+ raise "Could not delete version tag: #{result["error_message"]}"
598
+ end
599
+ end
600
+
601
+ def get_version_tag(app_name, component_name, environment_name, version_tag_name)
602
+ result = brpm_get "v1/version_tags?filters[app_name]=#{app_name}&filters[component_name]=#{component_name}&filters[environment_name]=#{environment_name}&filters[name]=#{version_tag_name}"
603
+
604
+ if result["status"] == "success"
605
+ result_hash = result["response"].first
606
+ else
607
+ if result["code"] == 404
608
+ result_hash=nil
609
+ else
610
+ raise "Could not find application #{app_name}: #{result["error_message"]}"
611
+ end
612
+ end
613
+
614
+ result_hash
615
+ end
616
+
617
+ def get_version_tags_by_app_and_comp_and_env(app_name, component_name, environment_name)
618
+ result = brpm_get "v1/version_tags?filters[app_name]=#{app_name}&filters[component_name]=#{component_name}&filters[environment_name]=#{environment_name}"
619
+
620
+ if result["status"] == "success"
621
+ result_hash = result["response"]
622
+ else
623
+ if result["code"] == 404
624
+ result_hash = {}
625
+ else
626
+ raise "Could not find version tags for app #{app_name}, component #{component_name}, environment #{environment_name}: #{result["error_message"]}"
627
+ end
628
+ end
629
+
630
+ result_hash
631
+ end
632
+
633
+ def get_version_tags_by(filter)
634
+ filter_string = "?"
635
+ filter.each do |key, value|
636
+ filter_string += "filters[#{key}]=#{value}&"
637
+ end
638
+ filter_string = filter_string[0..-1]
639
+
640
+ result = brpm_get "v1/version_tags#{filter_string}"
641
+
642
+ if result["status"] == "success"
643
+ result_hash = result["response"]
644
+ else
645
+ if result["code"] == 404
646
+ result_hash = {}
647
+ else
648
+ raise "Error searching for version_tags by #{filter_string}: #{result["error_message"]}"
649
+ end
650
+ end
651
+
652
+ result_hash
653
+ end
654
+
655
+ def copy_version_tags_of_app_and_comp_from_env_to_env(app_name, component_name, source_env, target_env)
656
+ source_version_tags = get_version_tags_by_app_and_comp_and_env(app_name, component_name, source_env)
657
+
658
+ source_version_tags.each do |source_version_tag|
659
+ create_version_tag(app_name, component_name, target_env, source_version_tag["name"])
660
+ end
661
+ end
662
+
663
+ def get_plan_template_by_name(plan_template_name)
664
+ result = brpm_get "v1/plan_templates?filters[name]=#{plan_template_name}"
665
+
666
+ if result["status"] == "success"
667
+ result_hash = result["response"].first
668
+ else
669
+ if result["code"] == 404
670
+ result_hash=nil
671
+ else
672
+ raise "Error searching for plan template #{plan_template_name}: #{result["error_message"]}"
673
+ end
674
+ end
675
+
676
+ result_hash
677
+ end
678
+
679
+ def create_plan(template_name, plan_name, date = nil)
680
+ plan = {}
681
+ plan["plan_template_name"] = template_name
682
+ plan["name"] = plan_name
683
+ plan["release_date"] = date.utc if date
684
+
685
+ result = brpm_post "v1/plans", { :plan => plan }
686
+
687
+ if result["status"] == "success"
688
+ result_hash = result["response"]
689
+ else
690
+ if Rest.already_exists_error(result)
691
+ BrpmAuto.log "This plan already exists. Continuing ..."
692
+ result_hash = get_plan_by_name(plan_name)
693
+ else
694
+ raise "Could not create plan: #{result["error_message"]}"
695
+ end
696
+ end
697
+
698
+ result_hash
699
+ end
700
+
701
+ def delete_plan(plan_id)
702
+ result = brpm_delete "v1/plans/#{plan_id}"
703
+
704
+ unless result["status"] == "success"
705
+ raise "Could not delete plan: #{result["error_message"]}"
706
+ end
707
+ end
708
+
709
+ def plan_plan(plan_id)
710
+ plan = {}
711
+ plan["aasm_event"] = "plan_it"
712
+
713
+ result = brpm_put "v1/plans/#{plan_id}", { :plan => plan}
714
+
715
+ unless result["status"] == "success"
716
+ raise "Could not plan plan: #{result["error_message"]}"
717
+ end
718
+ end
719
+
720
+ def start_plan(plan_id)
721
+ plan = {}
722
+ plan["aasm_event"] = "start"
723
+
724
+ result = brpm_put "v1/plans/#{plan_id}", { :plan => plan}
725
+
726
+ unless result["status"] == "success"
727
+ raise "Could not start plan: #{result["error_message"]}"
728
+ end
729
+ end
730
+
731
+ def cancel_plan(plan_id)
732
+ plan = {}
733
+ plan["aasm_event"] = "cancel"
734
+
735
+ result = brpm_put "v1/plans/#{plan_id}", { :plan => plan}
736
+
737
+ unless result["status"] == "success"
738
+ raise "Could not cancel plan: #{result["error_message"]}"
739
+ end
740
+ end
741
+
742
+ def get_plan_by_id(plan_id)
743
+ result = brpm_get "v1/plans/#{plan_id}"
744
+
745
+ if result["status"] == "success"
746
+ result_hash = result["response"]
747
+ else
748
+ raise "Error searching for plan #{plan_id}: #{result["error_message"]}"
749
+ end
750
+
751
+ result_hash
752
+ end
753
+
754
+ def get_plan_by_name(plan_name)
755
+ result = brpm_get "v1/plans?filters[name]=#{plan_name}"
756
+
757
+ if result["status"] == "success"
758
+ result_hash = result["response"].first
759
+ else
760
+ if result["code"] == 404
761
+ result_hash=nil
762
+ else
763
+ raise "Error searching for plan #{plan_name}: #{result["error_message"]}"
764
+ end
765
+ end
766
+
767
+ result_hash
768
+ end
769
+
770
+ def get_plans_by(filter)
771
+ filter_string = "?"
772
+ filter.each do |key, value|
773
+ filter_string += "filters[#{key}]=#{value}&"
774
+ end
775
+ filter_string = filter_string[0..-1]
776
+
777
+ result = brpm_get "v1/plans#{filter_string}"
778
+
779
+ if result["status"] == "success"
780
+ result_hash = result["response"]
781
+ else
782
+ if result["code"] == 404
783
+ result_hash = {}
784
+ else
785
+ raise "Error searching for plans by #{filter_string}: #{result["error_message"]}"
786
+ end
787
+ end
788
+
789
+ result_hash
790
+ end
791
+
792
+ def get_plan_stage_id(plan_id, stage_name)
793
+ plan = get_plan_by_id(plan_id)
794
+
795
+ plan["plan_template"]["stages"].each do |stage|
796
+ return stage["id"].to_i if stage["name"] == stage_name
797
+ end
798
+
799
+ raise "Could not find a stage named #{stage_name} for plan #{plan_id}"
800
+ end
801
+
802
+ def get_plan_stage_by_id(plan_stage_id)
803
+ result = brpm_get "v1/plan_stages/#{plan_stage_id}"
804
+
805
+ if result["status"] == "success"
806
+ result_hash = result["response"]
807
+ else
808
+ raise "Error searching for plan stage #{plan_stage_id}: #{result["error_message"]}"
809
+ end
810
+
811
+ result_hash
812
+ end
813
+
814
+ def get_route_by_id(route_id)
815
+ result = brpm_get "v1/routes/#{route_id}"
816
+
817
+ if result["status"] == "success"
818
+ result_hash = result["response"]
819
+ else
820
+ raise "Error searching for route #{route_id}: #{result["error_message"]}"
821
+ end
822
+
823
+ result_hash
824
+ end
825
+
826
+ def get_constraints
827
+ result = brpm_get "v1/constraints"
828
+
829
+ if result["status"] == "success"
830
+ result_hash = result["response"]
831
+ else
832
+ if result["code"] == 404
833
+ result_hash = {}
834
+ else
835
+ raise "Error searching for constraints: #{result["error_message"]}"
836
+ end
837
+ end
838
+
839
+ result_hash
840
+ end
841
+
842
+ def get_plan_route_by_plan_and_app(plan_id, app_id)
843
+ result = brpm_get "v1/plan_routes?filters[plan_id]=#{plan_id}&filters[app_id]=#{app_id}"
844
+
845
+ if result["status"] == "success"
846
+ result_hash = result["response"].first
847
+ else
848
+ if result["code"] == 404
849
+ result_hash=nil
850
+ else
851
+ raise "Error searching for plan route for plan id #{plan_id} and app id #{app_id}: #{result["error_message"]}"
852
+ end
853
+ end
854
+
855
+ result_hash
856
+ end
857
+
858
+ def get_route_gate_by_id(route_gate_id)
859
+ result = brpm_get "v1/route_gates/#{route_gate_id}"
860
+
861
+ if result["status"] == "success"
862
+ result_hash = result["response"]
863
+ else
864
+ raise "Error searching for route gate #{route_gate_id}: #{result["error_message"]}"
865
+ end
866
+
867
+ result_hash
868
+ end
869
+
870
+ def get_first_environment_of_route_for_plan_and_app(plan_id, app_id)
871
+ BrpmAuto.log "Getting the plan route..."
872
+ plan_route = get_plan_route_by_plan_and_app(plan_id, app_id)
873
+
874
+ unless plan_route
875
+ BrpmAuto.log "No plan route found for plan id #{plan_id} and app id #{app_id}."
876
+ return nil
877
+ end
878
+
879
+ BrpmAuto.log "Getting the route..."
880
+ route = get_route_by_id(plan_route["route"]["id"])
881
+
882
+ route_gate = route["route_gates"].find { |route_gate| route_gate["position"] == 1 }
883
+
884
+ return route_gate["environment"]["name"]
885
+ end
886
+
887
+ def create_request(template_name, name, environment, execute_now, data = {})
888
+ request = {}
889
+ request["template_name"] = template_name
890
+ request["name"] = name
891
+ request["environment"] = environment
892
+ request["execute_now"] = execute_now
893
+ request["data"] = data
894
+
895
+ result = brpm_post "v1/requests", { :request => request }
896
+
897
+ unless result["status"] == "success"
898
+ raise "Could not create the request: #{result["error_message"]}"
899
+ end
900
+
901
+ result["response"]
902
+ end
903
+
904
+ def create_request_from_hash(request)
905
+ result = brpm_post "v1/requests", { :request => request }
906
+
907
+ unless result["status"] == "success"
908
+ raise "Could not create the request: #{result["error_message"]}"
909
+ end
910
+
911
+ result["response"]
912
+ end
913
+
914
+ def create_request_for_plan(plan_id, stage_name, name, requestor_id, app_name, env_name, execute_now, data = nil)
915
+ plan_stage_id = get_plan_stage_id(plan_id, stage_name)
916
+
917
+ request = {}
918
+ request["plan_member_attributes"] = { "plan_id" => plan_id, "plan_stage_id" => plan_stage_id }
919
+ request["name"] = name
920
+ request["requestor_id"] = requestor_id
921
+ request["deployment_coordinator_id"] = requestor_id
922
+ request["app_ids"] = [ get_app_by_name(app_name)["id"] ]
923
+ request["environment"] = env_name
924
+ request["execute_now"] = execute_now
925
+ request["data"] = data
926
+
927
+ result = brpm_post "v1/requests", { :request => request }
928
+
929
+ unless result["status"] == "success"
930
+ raise "Could not create the request: #{result["error_message"]}"
931
+ end
932
+
933
+ result["response"]
934
+ end
935
+
936
+ def create_request_for_plan_from_template(plan_id, stage_name, template_name, name, env_name, execute_now, data = {})
937
+ plan_stage_id = get_plan_stage_id(plan_id, stage_name)
938
+
939
+ request = {}
940
+ request["plan_member_attributes"] = { "plan_id" => plan_id, "plan_stage_id" => plan_stage_id }
941
+ request["template_name"] = template_name
942
+ request["name"] = name
943
+ request["environment"] = env_name
944
+ request["execute_now"] = execute_now
945
+ request["data"] = data
946
+
947
+ result = brpm_post "v1/requests", { :request => request }
948
+
949
+ unless result["status"] == "success"
950
+ raise "Could not create the request: #{result["error_message"]}"
951
+ end
952
+
953
+ result["response"]
954
+ end
955
+
956
+ def delete_request(request_id)
957
+ result = brpm_delete "v1/requests/#{request_id}"
958
+
959
+ unless result["status"] == "success"
960
+ raise "Could not delete request: #{result["error_message"]}"
961
+ end
962
+ end
963
+
964
+ def move_request_to_plan_and_stage(request_id, plan_id, stage_name)
965
+ plan_stage_id = get_plan_stage_id(plan_id, stage_name)
966
+
967
+ request = {}
968
+ request["plan_member_attributes"] = { "plan_id" => plan_id, "plan_stage_id" => plan_stage_id }
969
+
970
+ result = brpm_put "v1/requests/#{request_id}", { :request => request }
971
+
972
+ unless result["status"] == "success"
973
+ raise "Could not create the request: #{result["error_message"]}"
974
+ end
975
+
976
+ result["response"]
977
+ end
978
+
979
+ def plan_request(request_id)
980
+ request = {}
981
+ request["aasm_event"] = "plan_it"
982
+
983
+ result = brpm_put "v1/requests/#{request_id}", { :request => request}
984
+
985
+ unless result["status"] == "success"
986
+ raise "Could not plan request: #{result["error_message"]}"
987
+ end
988
+ end
989
+
990
+ def start_request(request_id)
991
+ request = {}
992
+ request["aasm_event"] = "start"
993
+
994
+ result = brpm_put "v1/requests/#{request_id}", { :request => request}
995
+
996
+ unless result["status"] == "success"
997
+ raise "Could not start request: #{result["error_message"]}"
998
+ end
999
+ end
1000
+
1001
+ def get_request_by_id(request_id)
1002
+ result = brpm_get "v1/requests/#{request_id}"
1003
+
1004
+ if result["status"] == "success"
1005
+ result_hash = result["response"]
1006
+ else
1007
+ raise "Error searching for request #{request_id}: #{result["error_message"]}"
1008
+ end
1009
+
1010
+ result_hash
1011
+ end
1012
+
1013
+ def get_requests_by_name(request_name)
1014
+ result = brpm_get "v1/requests?filters[name]=#{request_name}"
1015
+
1016
+ if result["status"] == "success"
1017
+ result_hash = result["response"]
1018
+ else
1019
+ if result["code"] == 404
1020
+ result_hash=nil
1021
+ else
1022
+ raise "Error searching for request #{request_name}: #{result["error_message"]}"
1023
+ end
1024
+ end
1025
+
1026
+ result_hash
1027
+ end
1028
+
1029
+ def get_requests_by(filter)
1030
+ filter_string = "?"
1031
+ filter.each do |key, value|
1032
+ filter_string += "filters[#{key}]=#{value}&"
1033
+ end
1034
+ filter_string = filter_string[0..-1]
1035
+
1036
+ result = brpm_get "v1/requests#{filter_string}"
1037
+
1038
+ if result["status"] == "success"
1039
+ result_hash = result["response"]
1040
+ else
1041
+ if result["code"] == 404
1042
+ result_hash = {}
1043
+ else
1044
+ raise "Error searching for request by #{filter_string}: #{result["error_message"]}"
1045
+ end
1046
+ end
1047
+
1048
+ result_hash
1049
+ end
1050
+
1051
+ def get_requests_by_name_and_plan_and_stage(request_name, plan_name, stage_name)
1052
+ result = brpm_get "v1/requests?filters[name]=#{request_name}"
1053
+
1054
+ if result["status"] == "success"
1055
+ result_hash = result["response"].select { |request| request["plan_member"]["plan"]["name"] == plan_name and request["plan_member"]["stage"]["name"] == stage_name }
1056
+ else
1057
+ if result["code"] == 404
1058
+ result_hash = {}
1059
+ else
1060
+ raise "Error searching for request #{request_name}: #{result["error_message"]}"
1061
+ end
1062
+ end
1063
+
1064
+ result_hash
1065
+ end
1066
+
1067
+ def get_requests_by_plan_id_and_stage_name(plan_id, stage_name)
1068
+ result = brpm_get "v1/plans/#{plan_id}"
1069
+
1070
+ if result["status"] == "success"
1071
+ members_in_plan = result["response"]["members"]
1072
+ members_in_stage = members_in_plan.select { |member| member["stage"]["name"] == stage_name and member.has_key?("request") }
1073
+ result_hash = members_in_stage.map { |member| { "id" => member["request"]["number"].to_i - 1000, "number" => member["request"]["number"], "name" => member["request"]["name"] } }
1074
+ else
1075
+ if result["code"] == 404
1076
+ result_hash = {}
1077
+ else
1078
+ raise "Error searching for requests by plan id #{plan_id} and stage name #{stage_name}: #{result["error_message"]}"
1079
+ end
1080
+ end
1081
+
1082
+ result_hash
1083
+ end
1084
+
1085
+ def get_requests_by_plan_id_and_stage_name_and_app_name(plan_id, stage_name, app_name)
1086
+ requests_by_plan_and_stage = get_requests_by_plan_id_and_stage_name(plan_id, stage_name)
1087
+ request_ids_1 = requests_by_plan_and_stage.map { |request| request["id"] }
1088
+
1089
+ requests_by_app = get_requests_by({ "app_id" => get_app_by_name(app_name)["id"] })
1090
+ request_ids_2 = requests_by_app.map { |request| request["id"] }
1091
+
1092
+ request_ids_1 & request_ids_2
1093
+ end
1094
+
1095
+ def update_request_from_hash(request)
1096
+ result = brpm_put "v1/requests/#{request["id"]}", { :request => request }
1097
+
1098
+ unless result["status"] == "success"
1099
+ raise "Could not update the request: #{result["error_message"]}"
1100
+ end
1101
+
1102
+ result["response"]
1103
+ end
1104
+
1105
+ def monitor_request(request_id, options = {})
1106
+ target_status = "complete"
1107
+
1108
+ max_time = 15*60 # seconds
1109
+ max_time = 60 * options[:max_time].to_i if options.has_key?(:max_time) and !options[:max_time].nil?
1110
+
1111
+ monitor_step_name = (options.has_key?(:monitor_step_name) and !options[:monitor_step_name].nil?) ? options[:monitor_step_name] : "none"
1112
+ monitor_step_id = (options.has_key?(:monitor_step_id) and !options[:monitor_step_id].nil?) ? options[:monitor_step_id] : "none"
1113
+
1114
+ checking_interval = 15 #seconds
1115
+ checking_interval = options[:checking_interval].to_i if options.has_key?(:checking_interval) and !options[:checking_interval].nil?
1116
+
1117
+ req_status = "none"
1118
+ start_time = Time.now
1119
+ elapsed = 0
1120
+ BrpmAuto.log "Starting the monitoring loop for request #{request_id} with an interval of #{checking_interval} seconds and a maximum time of #{max_time} seconds ..."
1121
+ until (elapsed > max_time || req_status == target_status)
1122
+ request = get_request_by_id(request_id)
1123
+
1124
+ if monitor_step_name == "none" and monitor_step_id == "none"
1125
+ req_status = request["aasm_state"]
1126
+ else
1127
+ found = false
1128
+ request["steps"].each do |step|
1129
+ if (monitor_step_name != "none" and step["name"] == monitor_step_name) or
1130
+ (monitor_step_id != "none" and step["id"] == monitor_step_id)
1131
+ req_status = step["aasm_state"]
1132
+ found = true
1133
+ break
1134
+ end
1135
+ end
1136
+ unless found
1137
+ raise "Step #{monitor_step_name} not found in request #{request_id}"
1138
+ end
1139
+ end
1140
+
1141
+ if req_status == target_status
1142
+ BrpmAuto.log "Found request in #{target_status} status! Returning."
1143
+ break
1144
+ end
1145
+
1146
+ if req_status == "problem"
1147
+ raise "Found request #{request_id} in problem state."
1148
+ end
1149
+
1150
+ BrpmAuto.log "\tWaiting(#{elapsed.floor.to_s}) - Current status: #{req_status}"
1151
+ sleep(checking_interval)
1152
+ elapsed = Time.now - start_time
1153
+ end
1154
+
1155
+ if elapsed > max_time
1156
+ raise "Maximum time: #{max_time}(secs) reached. Status is: #{req_status}, looking for: #{target_status}"
1157
+ end
1158
+ end
1159
+
1160
+ def create_step_from_hash(step)
1161
+ result = brpm_post "v1/steps", { :step => step }
1162
+
1163
+ unless result["status"] == "success"
1164
+ raise "Could not create the step: #{result["error_message"]}"
1165
+ end
1166
+
1167
+ result["response"]
1168
+ end
1169
+
1170
+ def create_step(request_id, name, owner_type, owner_id)
1171
+ step = {}
1172
+ step["request_id"] = request_id
1173
+ step["name"] = name
1174
+ step["owner_type"] = owner_type
1175
+ step["owner_id"] = owner_id
1176
+
1177
+ result = brpm_post "v1/steps", { :step => step }
1178
+
1179
+ unless result["status"] == "success"
1180
+ raise "Could not create the step: #{result["error_message"]}"
1181
+ end
1182
+
1183
+ result["response"]
1184
+ end
1185
+
1186
+ def get_step_by_id(step_id)
1187
+ result = brpm_get "v1/steps/#{step_id}"
1188
+
1189
+ if result["status"] == "success"
1190
+ result_hash = result["response"]
1191
+ else
1192
+ raise "Error searching for step #{step_id}: #{result["error_message"]}"
1193
+ end
1194
+
1195
+ result_hash
1196
+ end
1197
+
1198
+ def update_step_from_hash(step)
1199
+ result = brpm_put "v1/steps/#{step["id"]}", { :step => step }
1200
+
1201
+ unless result["status"] == "success"
1202
+ raise "Could not update the step: #{result["error_message"]}"
1203
+ end
1204
+
1205
+ result["response"]
1206
+ end
1207
+
1208
+ def get_steps_by(filter)
1209
+ filter_string = "?"
1210
+ filter.each do |key, value|
1211
+ filter_string += "filters[#{key}]=#{value}&"
1212
+ end
1213
+ filter_string = filter_string[0..-1]
1214
+
1215
+ result = brpm_get "v1/steps#{filter_string}"
1216
+
1217
+ if result["status"] == "success"
1218
+ result_hash = result["response"]
1219
+ else
1220
+ if result["code"] == 404
1221
+ result_hash = {}
1222
+ else
1223
+ raise "Error searching for steps by #{filter_string}: #{result["error_message"]}"
1224
+ end
1225
+ end
1226
+
1227
+ result_hash
1228
+ end
1229
+
1230
+ def get_run_by_id(run_id)
1231
+ result = brpm_get "v1/runs/#{run_id}"
1232
+
1233
+ if result["status"] == "success"
1234
+ result_hash = result["response"]
1235
+ else
1236
+ raise "Error searching for run #{run_id}: #{result["error_message"]}"
1237
+ end
1238
+
1239
+ result_hash
1240
+ end
1241
+
1242
+ def set_version_tag_of_steps_for_component(request, component_name, version_tag_name)
1243
+ steps_for_component = request["steps"].select{ |step| step["component_name"] == component_name}
1244
+
1245
+ return if steps_for_component.count == 0
1246
+
1247
+ version_tag = get_version_tag(request["apps"].first["name"], component_name, request["environment"]["name"], version_tag_name)
1248
+
1249
+ if version_tag.nil?
1250
+ raise "No version tag found for app #{request["apps"].first["name"]}, component #{component_name}, environment #{request["environment"]["name"]}, version tag name #{version_tag_name}"
1251
+ end
1252
+
1253
+ steps_for_component.each do |step|
1254
+ step_data = {}
1255
+ step_data["version_tag_id"] = version_tag["id"]
1256
+ step_data["component_version"] = version_tag_name
1257
+
1258
+ result = brpm_put "v1/steps/#{step["id"]}", { :step => step_data}
1259
+
1260
+ unless result["status"] == "success"
1261
+ raise "Could not set the version tag of the step: #{result["error_message"]}"
1262
+ end
1263
+ end
1264
+ end
1265
+
1266
+ def set_version_of_steps_for_component(request, component_name, version)
1267
+ steps_for_component = request["steps"].select{ |step| step["component_name"] == component_name}
1268
+ steps_for_component.each do |step|
1269
+ step_data = {}
1270
+ step_data["component_version"] = version
1271
+
1272
+ result = brpm_put "v1/steps/#{step["id"]}", { :step => step_data}
1273
+
1274
+ unless result["status"] == "success"
1275
+ raise "Could not set the version of the step: #{result["error_message"]}"
1276
+ end
1277
+ end
1278
+ end
1279
+
1280
+ def get_ticket_by_foreign_id(ticket_foreign_id)
1281
+ result = brpm_get "v1/tickets?filters[foreign_id]=#{ticket_foreign_id}"
1282
+
1283
+ if result["status"] == "success"
1284
+ result_hash = result["response"].first
1285
+ else
1286
+ if result["code"] == 404
1287
+ result_hash = nil
1288
+ else
1289
+ raise "Could not find ticket #{ticket_foreign_id}: #{result["error_message"]}"
1290
+ end
1291
+ end
1292
+
1293
+ result_hash
1294
+ end
1295
+
1296
+ def get_tickets_by_request_id(request_id)
1297
+ result = brpm_get "v1/tickets?filters[request_id]=#{request_id}"
1298
+
1299
+ if result["status"] == "success"
1300
+ result_hash = result["response"]
1301
+ else
1302
+ if result["code"] == 404
1303
+ result_hash = {}
1304
+ else
1305
+ raise "Error searching for tickets by rquest id #{request_id}: #{result["error_message"]}"
1306
+ end
1307
+ end
1308
+
1309
+ result_hash
1310
+ end
1311
+
1312
+ def get_tickets_by_run_id_and_request_state(run_id, state)
1313
+ BrpmAuto.log "Getting the requests that are part of run #{run_id} and have state #{state}..."
1314
+ run = get_run_by_id(run_id)
1315
+ request_ids = run["plan_members"].select { |member| member.has_key?("request") and member["request"]["aasm_state"] == state }.map { |member| member["request"]["id"] }
1316
+ BrpmAuto.log "Found #{request_ids.count} requests."
1317
+
1318
+ BrpmAuto.log "Getting the tickets that are linked to each of the found requests..."
1319
+ tickets = []
1320
+ request_ids.each do |request_id|
1321
+ tickets_for_request = get_tickets_by_request_id(request_id)
1322
+ tickets = tickets.merge(tickets_for_request)
1323
+ end
1324
+ BrpmAuto.log "Found #{tickets.count} tickets in total."
1325
+
1326
+ tickets
1327
+ end
1328
+
1329
+ def get_tickets_by(filter)
1330
+ filter_string = "?"
1331
+ filter.each do |key, value|
1332
+ filter_string += "filters[#{key}]=#{value}&"
1333
+ end
1334
+ filter_string = filter_string[0..-1]
1335
+
1336
+ result = brpm_get "v1/tickets#{filter_string}"
1337
+
1338
+ if result["status"] == "success"
1339
+ result_hash = result["response"]
1340
+ else
1341
+ if result["code"] == 404
1342
+ result_hash = {}
1343
+ else
1344
+ raise "Error searching for tickets by #{filter_string}: #{result["error_message"]}"
1345
+ end
1346
+ end
1347
+
1348
+ result_hash
1349
+ end
1350
+
1351
+ def create_ticket_from_hash(ticket)
1352
+ result = brpm_post "v1/tickets", { :ticket => ticket }
1353
+
1354
+ unless result["status"] == "success"
1355
+ raise "Could not create the ticket: #{result["error_message"]}"
1356
+ end
1357
+
1358
+ result["response"]
1359
+ end
1360
+
1361
+ def update_ticket_from_hash(ticket)
1362
+ result = brpm_put "v1/tickets/#{ticket["id"]}", { :ticket => ticket }
1363
+
1364
+ unless result["status"] == "success"
1365
+ raise "Could not update the ticket: #{result["error_message"]}"
1366
+ end
1367
+
1368
+ result["response"]
1369
+ end
1370
+
1371
+ def create_or_update_ticket(ticket)
1372
+ BrpmAuto.log "Checking if the corresponding ticket already exists ..."
1373
+ existing_ticket = get_ticket_by_foreign_id ticket["foreign_id"]
1374
+
1375
+ if existing_ticket.nil?
1376
+ BrpmAuto.log "Ticket doesn't exist yet."
1377
+ ticket_already_exists=false
1378
+ else
1379
+ BrpmAuto.log "Ticket already exists."
1380
+ ticket_already_exists=true
1381
+
1382
+ ticket["id"] = existing_ticket["id"].to_s
1383
+ ticket["extended_attributes_attributes"] = sync_attributes(existing_ticket["extended_attributes"], ticket["extended_attributes_attributes"])
1384
+ end
1385
+
1386
+ now = Time.now.to_s
1387
+ sync_attribute "first received", now, ticket["extended_attributes_attributes"] unless ticket_already_exists
1388
+ sync_attribute "last updated", now, ticket["extended_attributes_attributes"]
1389
+
1390
+ # Create/update the ticket
1391
+ data = {}
1392
+ data["ticket"] = ticket
1393
+
1394
+ if ticket_already_exists
1395
+ BrpmAuto.log "Updating the ticket ..."
1396
+ update_ticket_from_hash(ticket)
1397
+ BrpmAuto.log "Ticket is updated."
1398
+ else
1399
+ BrpmAuto.log "Creating the ticket ..."
1400
+ create_ticket_from_hash(ticket)
1401
+ BrpmAuto.log "Ticket is created."
1402
+ end
1403
+ end
1404
+
1405
+ def sync_attributes(existing_attributes, updated_attributes)
1406
+ existing_attributes ||= []
1407
+ updated_attributes ||= []
1408
+
1409
+ updated_attributes.each do |updated_attribute|
1410
+ existing_attribute = existing_attributes.find { |existing_attribute| existing_attribute["name"] == updated_attribute["name"] }
1411
+ if existing_attribute.nil?
1412
+ existing_attributes.push(updated_attribute)
1413
+ else
1414
+ existing_attribute["value_text"] = updated_attribute["value_text"]
1415
+ end
1416
+ end
1417
+ existing_attributes
1418
+ end
1419
+
1420
+ def get_attribute_value name, attributes
1421
+ attribute = attributes.find { |attribute| attribute["name"] == name }
1422
+
1423
+ return attribute["value_text"] unless attribute.nil?
1424
+ end
1425
+
1426
+ def sync_attribute name, value, attributes
1427
+ attribute = attributes.find { |attribute| attribute["name"] == name }
1428
+
1429
+ if attribute.nil?
1430
+ attribute = {}
1431
+ attribute["name"] = name
1432
+ attributes.push(attribute)
1433
+ end
1434
+
1435
+ attribute["value_text"] = value
1436
+ end
1437
+
1438
+ def get_work_task_by_name(name)
1439
+ result = brpm_get "v1/work_tasks?filters[name]=#{name}"
1440
+
1441
+ if result["status"] == "success"
1442
+ result_hash = result["response"].first
1443
+ else
1444
+ if result["code"] == 404
1445
+ result_hash = nil
1446
+ else
1447
+ raise "Could not find work_task #{name}: #{result["error_message"]}"
1448
+ end
1449
+ end
1450
+
1451
+ result_hash
1452
+ end
1453
+
1454
+ # Sends an email based on step recipients
1455
+ #
1456
+ # ==== Attributes
1457
+ #
1458
+ # * +subject+ - text of email subject
1459
+ # * +body+ - text of email body
1460
+ #
1461
+ # ==== Returns
1462
+ #
1463
+ # * empty string
1464
+ def notify(body, subject = "Mail from automation", recipients = nil, step_id = BrpmAuto.params.step_id)
1465
+ data = { "filters" => { "notify" => { "body" => body, "subject" => subject } } }
1466
+ data["filters"]["notify"]["recipients"] = recipients unless recipients.nil?
1467
+
1468
+ result = brpm_get "v1/steps/#{step_id}/notify", { :data => data } # a REST GET with a request body???
1469
+ end
1470
+
1471
+ private
1472
+
1473
+ def add_token(path)
1474
+ path + (path.include?("?") ? "&" : "?") + "token=#{@brpm_api_token}"
1475
+ end
1476
+
1477
+ def get_brpm_url(model_name, id = nil, filters = nil)
1478
+ url = "#{@brpm_url}/v1/#{model_name}#{id == nil ? "" : "/#{id}" }"
1479
+ url += "?#{filters}" if filters
1480
+
1481
+ add_token(url)
1482
+ end
1483
+
1484
+ def brpm_get(path, options = {})
1485
+ Rest.get("#{@brpm_url}/#{add_token(path)}", options)
1486
+ end
1487
+
1488
+ def brpm_post(path, data, options = {})
1489
+ Rest.post("#{@brpm_url}/#{add_token(path)}", data, options)
1490
+ end
1491
+
1492
+ def brpm_put(path, data, options = {})
1493
+ Rest.put("#{@brpm_url}/#{add_token(path)}", data, options)
1494
+ end
1495
+
1496
+ def brpm_delete(path, options = {})
1497
+ Rest.delete("#{@brpm_url}/#{add_token(path)}", options)
1498
+ end
1499
+ end
1500
+
1501
+