lita-pagerduty 0.2.0 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (61) hide show
  1. checksums.yaml +4 -4
  2. data/.rspec +1 -1
  3. data/.rubocop.yml +6 -5
  4. data/README.md +11 -9
  5. data/Rakefile +4 -2
  6. data/lib/exceptions.rb +11 -0
  7. data/lib/lita-pagerduty.rb +7 -29
  8. data/lib/lita/commands/ack.rb +15 -0
  9. data/lib/lita/commands/ack_all.rb +21 -0
  10. data/lib/lita/commands/ack_mine.rb +26 -0
  11. data/lib/lita/commands/base.rb +75 -0
  12. data/lib/lita/commands/forget.rb +13 -0
  13. data/lib/lita/commands/identify.rb +13 -0
  14. data/lib/lita/commands/incident.rb +13 -0
  15. data/lib/lita/commands/incidents_all.rb +18 -0
  16. data/lib/lita/commands/incidents_mine.rb +23 -0
  17. data/lib/lita/commands/notes.rb +15 -0
  18. data/lib/lita/commands/on_call_list.rb +13 -0
  19. data/lib/lita/commands/on_call_lookup.rb +41 -0
  20. data/lib/lita/commands/pager_me.rb +48 -0
  21. data/lib/lita/commands/resolve.rb +15 -0
  22. data/lib/lita/commands/resolve_all.rb +21 -0
  23. data/lib/lita/commands/resolve_mine.rb +26 -0
  24. data/lib/lita/handlers/commands.yml +30 -0
  25. data/lib/lita/handlers/pagerduty.rb +57 -0
  26. data/lib/pagerduty.rb +94 -0
  27. data/lib/store.rb +20 -0
  28. data/lita-pagerduty.gemspec +1 -2
  29. data/locales/en.yml +2 -2
  30. data/spec/lita/handlers/ack_all_spec.rb +26 -0
  31. data/spec/lita/handlers/ack_id_spec.rb +23 -0
  32. data/spec/lita/handlers/ack_mine_spec.rb +38 -0
  33. data/spec/lita/handlers/forget_spec.rb +22 -0
  34. data/spec/lita/handlers/identify_email_spec.rb +22 -0
  35. data/spec/lita/handlers/incident_id_spec.rb +23 -0
  36. data/spec/lita/handlers/incidents_all_spec.rb +31 -0
  37. data/spec/lita/handlers/incidents_mine_spec.rb +35 -0
  38. data/spec/lita/handlers/notes_spec.rb +29 -0
  39. data/spec/lita/handlers/on_call_list_spec.rb +21 -0
  40. data/spec/lita/handlers/on_call_lookup_spec.rb +29 -0
  41. data/spec/lita/handlers/pager_me_spec.rb +56 -0
  42. data/spec/lita/handlers/resolve_all_spec.rb +26 -0
  43. data/spec/lita/handlers/resolve_id_spec.rb +21 -0
  44. data/spec/lita/handlers/resolve_mine_spec.rb +38 -0
  45. data/spec/pagerduty_spec.rb +106 -0
  46. data/spec/spec_helper.rb +3 -189
  47. data/templates/.gitkeep +0 -0
  48. metadata +57 -35
  49. data/lib/lita/handlers/pagerduty_ack.rb +0 -77
  50. data/lib/lita/handlers/pagerduty_incident.rb +0 -68
  51. data/lib/lita/handlers/pagerduty_note.rb +0 -50
  52. data/lib/lita/handlers/pagerduty_resolve.rb +0 -77
  53. data/lib/lita/handlers/pagerduty_utility.rb +0 -136
  54. data/lib/pagerduty_helper/incident.rb +0 -64
  55. data/lib/pagerduty_helper/regex.rb +0 -8
  56. data/lib/pagerduty_helper/utility.rb +0 -43
  57. data/spec/lita/handlers/pagerduty_ack_spec.rb +0 -95
  58. data/spec/lita/handlers/pagerduty_incident_spec.rb +0 -103
  59. data/spec/lita/handlers/pagerduty_note_spec.rb +0 -43
  60. data/spec/lita/handlers/pagerduty_resolve_spec.rb +0 -95
  61. data/spec/lita/handlers/pagerduty_utility_spec.rb +0 -59
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 9c9ba4c8271e94b9c23d22f707845a00386f969e
4
- data.tar.gz: ecd72110e2cf05de53a053d0fd37d966021a2cf6
3
+ metadata.gz: 1fa275bada173401c6fdac456b713176375ae8f5
4
+ data.tar.gz: 410ca4278874a6cd332f9e134d982a3f7830c80a
5
5
  SHA512:
6
- metadata.gz: 8f33eaa15bb597dc5ec5ccfebd0e0f8bcb8d4df069651790ee873c5e6b9e0fbdf93917b2380dc7611f09c4967b08e69fc25b204dd256062d7d310e6460e9dae2
7
- data.tar.gz: 76f1d1a750a73c00002f61255be2c5e3ac313cc11f5bda026e2cd838dc2a423aac6d2ba3c8f49a027624554d7b87733175f1fcf7de0ae57c0b81e1c883df2609
6
+ metadata.gz: af72dc0772235f9202fc14ebabe43594a56bd2782a4e432b92424e2984383d083cf77e9aa84dd2d561f7716d8a63f7d34e96df9f93877baa9f6ba51beb548727
7
+ data.tar.gz: f65a55fb1c4802f2ec3420b0e3af35ee4ed24bd779849f6107f53826fbface9241d2b7b6f0b46807c190bf11f2cd39d2709939b52ca50a2659dc0298bec223ee
data/.rspec CHANGED
@@ -1 +1 @@
1
- --color --profile 5
1
+ --color
@@ -1,6 +1,7 @@
1
- FileName:
1
+ AllCops:
2
2
  Exclude:
3
- - lib/lita-pagerduty.rb
4
-
5
- LineLength:
6
- Max: 130
3
+ - spec/**/*
4
+ Documentation:
5
+ Enabled: false
6
+ Style/FileName:
7
+ Enabled: false
data/README.md CHANGED
@@ -19,15 +19,24 @@ gem "lita-pagerduty"
19
19
 
20
20
  ## Configuration
21
21
 
22
+ Create a PagerDuty api Key(v1 legacy) You will need to give it FullAccess to update incidents
23
+
22
24
  Add the following variables to your Lita config file:
23
25
 
24
26
  ``` ruby
25
- config.handlers.pagerduty.api_key = ''
26
- config.handlers.pagerduty.subdomain = ''
27
+ config.handlers.pagerduty.api_key = ''
28
+ config.handlers.pagerduty.email = ''
27
29
  ```
28
30
 
29
31
  ## Usage
30
32
 
33
+ ### Misc
34
+
35
+ ```
36
+ pager identify <email address> - Associate your chat user with your email address
37
+ pager forget - Remove your chat user / email association
38
+ ```
39
+
31
40
  ### Specific incidents
32
41
 
33
42
  ```
@@ -65,13 +74,6 @@ pager oncall - List available schedules
65
74
  pager oncall <schedule> - Show who is on call for the given schedule
66
75
  ```
67
76
 
68
- ### Misc
69
-
70
- ```
71
- pager identify <email address> - Associate your chat user with your email address
72
- pager forget - Remove your chat user / email association
73
- ```
74
-
75
77
  ## License
76
78
 
77
79
  [MIT](http://opensource.org/licenses/MIT)
data/Rakefile CHANGED
@@ -3,6 +3,8 @@ require 'rspec/core/rake_task'
3
3
  require 'rubocop/rake_task'
4
4
 
5
5
  RSpec::Core::RakeTask.new(:spec)
6
- RuboCop::RakeTask.new(:rubocop)
6
+ RuboCop::RakeTask.new(:rubocop) do |t|
7
+ t.options = ['./lib']
8
+ end
7
9
 
8
- task default: [:spec, :rubocop]
10
+ task default: %i[spec rubocop]
@@ -0,0 +1,11 @@
1
+ module Exceptions
2
+ class SchedulesEmptyList < StandardError; end
3
+ class IncidentsEmptyList < StandardError; end
4
+ class UsersEmptyList < StandardError; end
5
+ class NotesEmptyList < StandardError; end
6
+ class IncidentManageUnsuccess < StandardError; end
7
+ class OverrideUnsuccess < StandardError; end
8
+ class IncidentNotFound < StandardError; end
9
+ class UserNotIdentified < StandardError; end
10
+ class NoOncallUser < StandardError; end
11
+ end
@@ -1,37 +1,15 @@
1
1
  require 'lita'
2
+ require 'exceptions'
3
+ require 'pagerduty'
4
+ require 'store'
5
+ require 'lita/handlers/pagerduty'
6
+ require 'lita/commands/base'
7
+ Dir[File.join(__dir__, 'lita', 'commands', '*.rb')].each { |file| require file }
2
8
 
3
9
  Lita.load_locales Dir[File.expand_path(
4
10
  File.join('..', '..', 'locales', '*.yml'), __FILE__
5
11
  )]
6
12
 
7
- require 'pagerduty'
8
-
9
- require 'pagerduty_helper/incident'
10
- require 'pagerduty_helper/regex'
11
- require 'pagerduty_helper/utility'
12
-
13
- require 'lita/handlers/pagerduty_ack'
14
- require 'lita/handlers/pagerduty_incident'
15
- require 'lita/handlers/pagerduty_note'
16
- require 'lita/handlers/pagerduty_resolve'
17
- require 'lita/handlers/pagerduty_utility'
18
-
19
- Lita::Handlers::PagerdutyAck.template_root File.expand_path(
20
- File.join('..', '..', 'templates'), __FILE__
21
- )
22
-
23
- Lita::Handlers::PagerdutyIncident.template_root File.expand_path(
24
- File.join('..', '..', 'templates'), __FILE__
25
- )
26
-
27
- Lita::Handlers::PagerdutyNote.template_root File.expand_path(
28
- File.join('..', '..', 'templates'), __FILE__
29
- )
30
-
31
- Lita::Handlers::PagerdutyResolve.template_root File.expand_path(
32
- File.join('..', '..', 'templates'), __FILE__
33
- )
34
-
35
- Lita::Handlers::PagerdutyUtility.template_root File.expand_path(
13
+ Lita::Handlers::Pagerduty.template_root File.expand_path(
36
14
  File.join('..', '..', 'templates'), __FILE__
37
15
  )
@@ -0,0 +1,15 @@
1
+ module Commands
2
+ class Ack
3
+ include Base
4
+
5
+ def call
6
+ incident_id = message.match_data['incident_id']
7
+ return if incident_id =~ /\A(all|mine)\z/i
8
+
9
+ pagerduty.manage_incidents(:acknowledge, [incident_id])
10
+ response message: 'all.acknowledged', params: { list: incident_id.to_s }
11
+ rescue Exceptions::IncidentManageUnsuccess
12
+ nil
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,21 @@
1
+ module Commands
2
+ class AckAll
3
+ include Base
4
+
5
+ def call
6
+ ids = pagerduty.get_incidents(query_params).map { |i| i[:id] }
7
+ pagerduty.manage_incidents(:acknowledge, ids)
8
+ response message: 'all.acknowledged', params: { list: ids.join(', ') }
9
+ rescue Exceptions::IncidentsEmptyList
10
+ response message: 'incident.none'
11
+ rescue Exceptions::IncidentManageUnsuccess
12
+ nil
13
+ end
14
+
15
+ private
16
+
17
+ def query_params
18
+ { statuses: %w[triggered acknowledged] }
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,26 @@
1
+ module Commands
2
+ class AckMine
3
+ include Base
4
+
5
+ def call
6
+ ids = pagerduty.get_incidents(query_params).map { |i| i[:id] }
7
+ pagerduty.manage_incidents(:acknowledge, ids)
8
+ response message: 'all.acknowledged', params: { list: ids.join(', ') }
9
+ rescue Exceptions::UserNotIdentified
10
+ response message: 'incident.none_mine'
11
+ rescue Exceptions::IncidentsEmptyList
12
+ response message: 'incident.none_mine'
13
+ rescue Exceptions::IncidentManageUnsuccess
14
+ nil
15
+ end
16
+
17
+ private
18
+
19
+ def query_params
20
+ {
21
+ statuses: %w[triggered acknowledged],
22
+ 'user_ids[]' => current_user[:id]
23
+ }
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,75 @@
1
+ module Commands
2
+ module Base
3
+ def self.included(base)
4
+ base.class_eval do
5
+ extend ClassMethods
6
+ attr_reader :message
7
+ attr_reader :data
8
+ attr_reader :pagerduty
9
+ attr_reader :store
10
+ end
11
+ end
12
+
13
+ module ClassMethods
14
+ def call(message, pagerduty, store)
15
+ new(message, pagerduty, store).tap(&:call).data
16
+ end
17
+ end
18
+
19
+ def initialize(message, pagerduty, store)
20
+ @message = message
21
+ @pagerduty = pagerduty
22
+ @store = store
23
+ @data = nil
24
+ end
25
+
26
+ def response(obj)
27
+ @data = obj
28
+ end
29
+
30
+ def format_notes(notes, incident_id)
31
+ notes.map { |note| format_note(note, incident_id) }
32
+ end
33
+
34
+ def format_note(note, incident_id)
35
+ {
36
+ message: 'note.show',
37
+ params: {
38
+ id: incident_id,
39
+ content: note[:content],
40
+ user: note[:user][:summary]
41
+ }
42
+ }
43
+ end
44
+
45
+ def format_incidents(incidents)
46
+ incidents.map { |incident| format_incident(incident) }
47
+ end
48
+
49
+ def format_incident(incident)
50
+ assignee = (incident.fetch(:assignments, []).first || {})
51
+ .fetch(:assignee, {})
52
+ .fetch(:summary, 'none')
53
+ {
54
+ message: 'incident.info',
55
+ params: {
56
+ id: incident[:id], subject: incident[:title],
57
+ assigned: assignee.inspect, url: incident[:html_url]
58
+ }
59
+ }
60
+ end
61
+
62
+ def current_user
63
+ @current_user ||= pagerduty.get_users(query: store.get_user(message))
64
+ .first
65
+ end
66
+
67
+ def pagerduty
68
+ @pagerduty ||= ::Pagerduty.new(http, config.api_key, config.email)
69
+ end
70
+
71
+ def store
72
+ @store ||= Store.new(redis)
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,13 @@
1
+ module Commands
2
+ class Forget
3
+ include Base
4
+
5
+ def call
6
+ store.get_user message
7
+ store.forget_user message
8
+ response message: 'forget.complete'
9
+ rescue Exceptions::UserNotIdentified
10
+ response message: 'forget.unknown'
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ module Commands
2
+ class Identify
3
+ include Base
4
+
5
+ def call
6
+ store.get_user message
7
+ response message: 'identify.already'
8
+ rescue Exceptions::UserNotIdentified
9
+ store.remember_user message
10
+ response message: 'identify.complete'
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ module Commands
2
+ class Incident
3
+ include Base
4
+
5
+ def call
6
+ incident_id = message.match_data['incident_id']
7
+ incident = pagerduty.get_incident(incident_id)
8
+ response format_incidents([incident])
9
+ rescue Exceptions::IncidentNotFound
10
+ response message: 'incident.not_found', params: { id: incident_id }
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,18 @@
1
+ module Commands
2
+ class IncidentsAll
3
+ include Base
4
+
5
+ def call
6
+ incidents = pagerduty.get_incidents(query_params)
7
+ response format_incidents(incidents)
8
+ rescue Exceptions::IncidentsEmptyList
9
+ response message: 'incident.none'
10
+ end
11
+
12
+ private
13
+
14
+ def query_params
15
+ { statuses: %w[triggered acknowledged] }
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,23 @@
1
+ module Commands
2
+ class IncidentsMine
3
+ include Base
4
+
5
+ def call
6
+ incidents = pagerduty.get_incidents(query_params)
7
+ response format_incidents(incidents)
8
+ rescue Exceptions::IncidentsEmptyList
9
+ response message: 'incident.none'
10
+ rescue Exceptions::UserNotIdentified
11
+ response message: 'incident.none_mine'
12
+ end
13
+
14
+ private
15
+
16
+ def query_params
17
+ {
18
+ statuses: %w[triggered acknowledged],
19
+ 'user_ids[]' => current_user[:id]
20
+ }
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,15 @@
1
+ module Commands
2
+ class Notes
3
+ include Base
4
+
5
+ def call
6
+ incident_id = message.match_data['incident_id']
7
+ notes = pagerduty.get_notes_by_incident_id(incident_id)
8
+ response format_notes(notes, incident_id)
9
+ rescue Exceptions::IncidentNotFound
10
+ response message: 'incident.not_found', params: { id: incident_id }
11
+ rescue Exceptions::NotesEmptyList
12
+ response "#{incident_id}: No notes"
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,13 @@
1
+ module Commands
2
+ class OnCallList
3
+ include Base
4
+
5
+ def call
6
+ schedules = pagerduty.get_schedules.map { |i| i[:name] }.join("\n")
7
+ response message: 'on_call_list.response',
8
+ params: { schedules: schedules }
9
+ rescue Exceptions::SchedulesEmptyList
10
+ response message: 'on_call_list.no_schedules_found'
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,41 @@
1
+ module Commands
2
+ class OnCallLookup
3
+ include Base
4
+
5
+ def call
6
+ response message: 'on_call_lookup.response', params: success_params
7
+ rescue Exceptions::SchedulesEmptyList
8
+ response message: 'on_call_lookup.no_matching_schedule',
9
+ params: { schedule_name: schedule_name }
10
+ rescue Exceptions::NoOncallUser
11
+ response message: 'on_call_lookup.no_one_on_call',
12
+ params: { schedule_name: schedule_name }
13
+ end
14
+
15
+ private
16
+
17
+ def schedule
18
+ @schedule ||= pagerduty.get_schedules(query: schedule_name).first
19
+ end
20
+
21
+ def schedule_name
22
+ @schedule_name ||= message.match_data[1].strip
23
+ end
24
+
25
+ def oncall_user_params
26
+ { 'schedule_ids[]' => schedule[:id], 'include[]' => 'users' }
27
+ end
28
+
29
+ def success_params
30
+ {
31
+ name: user[:summary],
32
+ email: user[:email],
33
+ schedule_name: schedule[:name]
34
+ }
35
+ end
36
+
37
+ def user
38
+ @user ||= pagerduty.get_oncall_user oncall_user_params
39
+ end
40
+ end
41
+ end