buyerquest-opsgenie 0.1.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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 7770ed270998613b5497081250267d578a379d2353e0437238d6d6775bd6edef
4
+ data.tar.gz: 25913c9427c13b1f6059c6a626189618bec43fcb11d9c773de7cb301ebac7d51
5
+ SHA512:
6
+ metadata.gz: c3f804c32619e73883050936f33f6cfed8757c633c77eaddeb2e4f23b5afc801afcc17855b93a8ff1559491defec4cc170eb42452c6174e60c32917625bb1110
7
+ data.tar.gz: 6185e714b3c59f410a4aa82d20c5437be09cc6da7eefcf389c3e39c854d57d89415ac7100fb51c284a7679b334527460ace2753885e1213d3e524dd6a41ae08c
@@ -0,0 +1,13 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /_yardoc/
4
+ /coverage/
5
+ /doc/
6
+ /pkg/
7
+ /spec/reports/
8
+ /tmp/
9
+
10
+ # rspec failure tracking
11
+ .rspec_status
12
+ .idea
13
+ ./*.gem
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --format documentation
2
+ --color
3
+ --require spec_helper
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "https://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in buyerquest-opsgenie.gemspec
4
+ gemspec
@@ -0,0 +1,53 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ buyerquest-opsgenie (0.1.0)
5
+ rest-client (~> 2.0)
6
+
7
+ GEM
8
+ remote: https://rubygems.org/
9
+ specs:
10
+ diff-lcs (1.3)
11
+ domain_name (0.5.20190701)
12
+ unf (>= 0.0.5, < 1.0.0)
13
+ http-accept (1.7.0)
14
+ http-cookie (1.0.3)
15
+ domain_name (~> 0.5)
16
+ mime-types (3.3)
17
+ mime-types-data (~> 3.2015)
18
+ mime-types-data (3.2019.1009)
19
+ netrc (0.11.0)
20
+ rake (10.5.0)
21
+ rest-client (2.1.0)
22
+ http-accept (>= 1.7.0, < 2.0)
23
+ http-cookie (>= 1.0.2, < 2.0)
24
+ mime-types (>= 1.16, < 4.0)
25
+ netrc (~> 0.8)
26
+ rspec (3.9.0)
27
+ rspec-core (~> 3.9.0)
28
+ rspec-expectations (~> 3.9.0)
29
+ rspec-mocks (~> 3.9.0)
30
+ rspec-core (3.9.0)
31
+ rspec-support (~> 3.9.0)
32
+ rspec-expectations (3.9.0)
33
+ diff-lcs (>= 1.2.0, < 2.0)
34
+ rspec-support (~> 3.9.0)
35
+ rspec-mocks (3.9.0)
36
+ diff-lcs (>= 1.2.0, < 2.0)
37
+ rspec-support (~> 3.9.0)
38
+ rspec-support (3.9.0)
39
+ unf (0.1.4)
40
+ unf_ext
41
+ unf_ext (0.0.7.6)
42
+
43
+ PLATFORMS
44
+ ruby
45
+
46
+ DEPENDENCIES
47
+ bundler (~> 2.0)
48
+ buyerquest-opsgenie!
49
+ rake (~> 10.0)
50
+ rspec (~> 3.0)
51
+
52
+ BUNDLED WITH
53
+ 2.0.2
@@ -0,0 +1,64 @@
1
+ # Buyerquest Opsgenie Ruby gem
2
+
3
+ This gem provides opsgenie related functionality
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ ```ruby
10
+ gem 'buyerquest-opsgenie'
11
+ ```
12
+
13
+ And then execute:
14
+
15
+ ```shell
16
+ $ bundle install
17
+ ```
18
+
19
+ Or install it directly:
20
+
21
+ ```shell
22
+ $ gem install buyerquest-opsgenie
23
+ ```
24
+
25
+ ## Usage
26
+
27
+ ### Alert creation
28
+ Example:
29
+ ```ruby
30
+ require 'buyerquest/opsgenie'
31
+
32
+ # Initialise client singleton
33
+ Buyerquest::Opsgenie::Client.init 'your-api-key-here'
34
+ # alternatively export OPSG_API_KEY to the runtime environment and then call without any arguments:
35
+ # Buyerquest::Opsgenie::Client.init
36
+
37
+ # Prepare alert object instance
38
+ test_alert = Buyerquest::Opsgenie::Alert.new(message: "I'm an alert from the buyerquest-opsgenie gem",
39
+ alias: 'no-duplication',
40
+ description: 'buyerquest-opsgenie gem alert')
41
+
42
+ # Fire alert
43
+ test_alert.create
44
+ ```
45
+
46
+ ### Heartbeat usage
47
+ ```ruby
48
+ require 'buyerquest/opsgenie'
49
+
50
+ # Initialise client singleton
51
+ Buyerquest::Opsgenie::Client.init 'your-api-key-here'
52
+ # alternatively export OPSG_API_KEY to the runtime environment and then call without any arguments:
53
+ # Buyerquest::Opsgenie::Client.init
54
+
55
+ # Prepare alert object instance
56
+ test_heartbeat = Buyerquest::Opsgenie::Heartbeat.new(name: 'Test heartbeat')
57
+
58
+ # Start heartbeat
59
+ test_heartbeat.start
60
+ ```
61
+
62
+ ## Testing
63
+
64
+ Run `rake spec` to start the test suite.
@@ -0,0 +1,7 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task :default => :spec
7
+
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "buyerquest/opsgenie"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start(__FILE__)
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
@@ -0,0 +1,45 @@
1
+
2
+ lib = File.expand_path("../lib", __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require "buyerquest/opsgenie/version"
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "buyerquest-opsgenie"
8
+ spec.version = Buyerquest::Opsgenie::VERSION
9
+ spec.authors = ["Buyerquest DevOps Team"]
10
+ spec.email = ["devops@buyerquest.com"]
11
+
12
+ spec.summary = %q{BuyerQuest OpsGenie gem}
13
+ spec.description = %q{Allows to interact with OpsGenie api. Alerts and Heartbeat operations}
14
+ spec.homepage = "https://github.com/BuyerQuest/buyerquest-opsgenie"
15
+ spec.license = "MIT"
16
+
17
+ # Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
18
+ # to allow pushing to a single host or delete this section to allow pushing to any host.
19
+ if spec.respond_to?(:metadata)
20
+ # We are going to publish rubygems
21
+ #spec.metadata["allowed_push_host"] = ""
22
+
23
+ spec.metadata["homepage_uri"] = spec.homepage
24
+ spec.metadata["source_code_uri"] = "https://github.com/BuyerQuest/buyerquest-opsgenie"
25
+ spec.metadata["changelog_uri"] = "https://github.com/BuyerQuest/buyerquest-opsgenie"
26
+ else
27
+ raise "RubyGems 2.0 or newer is required to protect against " \
28
+ "public gem pushes."
29
+ end
30
+
31
+ # Specify which files should be added to the gem when it is released.
32
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
33
+ spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
34
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features|\.idea|\.gitignore)/}) }
35
+ end
36
+ spec.bindir = "exe"
37
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
38
+ spec.require_paths = ["lib"]
39
+
40
+ spec.add_development_dependency "bundler", "~> 2.0"
41
+ spec.add_development_dependency "rake", "~> 10.0"
42
+ spec.add_development_dependency "rspec", "~> 3.0"
43
+
44
+ spec.add_dependency('rest-client', '~> 2.0')
45
+ end
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "buyerquest/opsgenie"
4
+
5
+ puts "Not implemented for now"
@@ -0,0 +1,2 @@
1
+ # Alias for require
2
+ require 'buyerquest/opsgenie'
@@ -0,0 +1,14 @@
1
+ require 'rest-client'
2
+ require 'json'
3
+ require 'uri'
4
+ require 'buyerquest/opsgenie/version'
5
+ require 'buyerquest/opsgenie/client'
6
+ require 'buyerquest/opsgenie/heartbeat'
7
+ require 'buyerquest/opsgenie/alert'
8
+
9
+
10
+ module Buyerquest
11
+ module Opsgenie
12
+ class Error < StandardError; end
13
+ end
14
+ end
@@ -0,0 +1,32 @@
1
+ module Buyerquest
2
+ module Opsgenie
3
+ class Alert
4
+ # @param [Hash]
5
+ # @option opts [String] message
6
+ # @option opts [String] alias
7
+ # @option opts [String] description
8
+ # @option opts [Array] tags
9
+ # @option opts [Hash] details
10
+ def initialize(opts={})
11
+ @message = opts[:message]
12
+ @opts = opts
13
+ end
14
+
15
+ def create
16
+ opsg_request ={
17
+ :method => 'POST',
18
+ :uri => '/alerts',
19
+ :payload => {
20
+ :message => @message,
21
+ :alias => @opts[:alias],
22
+ :description => @opts[:description],
23
+ :tags => @opts[:tags],
24
+ :details => @opts[:details],
25
+ }
26
+ }
27
+
28
+ Buyerquest::Opsgenie::Client.execute opsg_request
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,40 @@
1
+ module Buyerquest
2
+ module Opsgenie
3
+ module Client
4
+ OPSGENIE_API_BASE_URL = 'https://api.opsgenie.com/v2'.freeze
5
+
6
+ def self.init(api_key = nil, opts={})
7
+ @api_key = api_key
8
+ @api_key ||= ENV['OPSG_API_KEY']
9
+ raise "[OpsGenie Error] No api key provided" if @api_key.nil?
10
+ end
11
+
12
+ def self.execute(opsgenie_request)
13
+ uri = URI::encode(opsgenie_request[:uri])
14
+ method = opsgenie_request[:method].upcase
15
+ payload = opsgenie_request[:payload]
16
+ raise "[OpsGenie Error] Unknown method" unless %w(GET POST PUT PATCH DELETE).include? method
17
+ request = {
18
+ :method => method,
19
+ :url => "#{OPSGENIE_API_BASE_URL}#{uri}",
20
+ :headers => get_headers(method)
21
+ }
22
+ request[:payload] = payload.to_json unless payload.nil?
23
+ begin
24
+ response = RestClient::Request.execute(request)
25
+ rescue RestClient::NotFound => err
26
+ return nil
27
+ end
28
+ JSON.parse(response)
29
+ end
30
+
31
+ def self.get_headers(http_method)
32
+ headers = {:Authorization => "GenieKey #{@api_key}"}
33
+ if %w(POST PATCH).include? http_method.upcase
34
+ headers[:content_type] = 'application/json'
35
+ end
36
+ headers
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,125 @@
1
+ module Buyerquest
2
+ module Opsgenie
3
+ class Heartbeat
4
+ attr_reader :name
5
+
6
+ def initialize(opts={})
7
+ @name = opts[:name]
8
+ @opts = opts
9
+ raise "[OpsGenie Error] No name provided" if @name.nil?
10
+ end
11
+
12
+ def start
13
+ self.update({}) unless self.add
14
+ self.enable
15
+ # Initial ping request
16
+ self.ping
17
+ end
18
+
19
+ def stop
20
+ self.disable
21
+ self.delete
22
+ end
23
+
24
+ def get_default_heartbeat_opts
25
+ {
26
+ :intervalUnit => "minutes",
27
+ :interval => 10,
28
+ :enabled => true,
29
+ :alertMessage => "Heartbeat [#{@name}] expired",
30
+ :alertPriority=> "P3"
31
+ }
32
+ end
33
+
34
+ def enable
35
+ raise "[OpsGenie Error] Can't enable non-existent heartbeat" unless exist?
36
+ opsg_request ={
37
+ :method => 'POST',
38
+ :uri => "/heartbeats/#{@name}/enable",
39
+ }
40
+ Buyerquest::Opsgenie::Client.execute opsg_request
41
+ end
42
+
43
+ def disable
44
+ raise "[OpsGenie Error] Can't enable non-existent heartbeat" unless exist?
45
+
46
+ opsg_request ={
47
+ :method => 'POST',
48
+ :uri => "/heartbeats/#{@name}/disable",
49
+ }
50
+ Buyerquest::Opsgenie::Client.execute opsg_request
51
+ end
52
+
53
+ def add
54
+ return false if exist?
55
+ default_opts = get_default_heartbeat_opts
56
+ payload = default_opts
57
+ payload = payload.merge @opts
58
+ payload[:name] = @name
59
+ opsg_request = {
60
+ :method => 'POST',
61
+ :uri => '/heartbeats',
62
+ :payload => payload
63
+ }
64
+ @exist_status = Buyerquest::Opsgenie::Client.execute opsg_request
65
+ true
66
+ end
67
+
68
+ def ping
69
+ raise "[OpsGenie Error] Can't ping non-existent heartbeat" unless exist?
70
+ opsg_request ={
71
+ :method => 'GET',
72
+ :uri => "/heartbeats/#{@name}/ping",
73
+ }
74
+ Buyerquest::Opsgenie::Client.execute opsg_request
75
+ end
76
+
77
+ def update (opts)
78
+ raise "[OpsGenie Error] Can't update non-existent heartbeat" unless exist?
79
+ @opts = @opts.merge opts
80
+ default_opts = get_default_heartbeat_opts
81
+ payload = default_opts
82
+ payload = payload.merge @opts
83
+ payload[:name] = @name
84
+
85
+ opsg_request = {
86
+ :method => 'PATCH',
87
+ :uri => "/heartbeats/#{@name}",
88
+ :payload => payload
89
+ }
90
+ @exist_status = Buyerquest::Opsgenie::Client.execute opsg_request
91
+ true
92
+ end
93
+
94
+ def delete
95
+ return false unless exist?
96
+ opsg_request ={
97
+ :method => 'DELETE',
98
+ :uri => "/heartbeats/#{@name}",
99
+ }
100
+ Buyerquest::Opsgenie::Client.execute opsg_request
101
+ @exist_status = nil
102
+ true
103
+ end
104
+
105
+ def get
106
+ opsg_request ={
107
+ :method => 'GET',
108
+ :uri => "/heartbeats/#{@name}",
109
+ }
110
+ Buyerquest::Opsgenie::Client.execute opsg_request
111
+ end
112
+
113
+ def exist?
114
+ if @exist_status.nil?
115
+ @exist_status = get
116
+ end
117
+ if @exist_status.nil?
118
+ false
119
+ else
120
+ true
121
+ end
122
+ end
123
+ end
124
+ end
125
+ end
@@ -0,0 +1,5 @@
1
+ module Buyerquest
2
+ module Opsgenie
3
+ VERSION = "0.1.0"
4
+ end
5
+ end
metadata ADDED
@@ -0,0 +1,119 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: buyerquest-opsgenie
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Buyerquest DevOps Team
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2019-10-30 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '2.0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '2.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '3.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '3.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rest-client
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '2.0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '2.0'
69
+ description: Allows to interact with OpsGenie api. Alerts and Heartbeat operations
70
+ email:
71
+ - devops@buyerquest.com
72
+ executables:
73
+ - opsgenie-client
74
+ extensions: []
75
+ extra_rdoc_files: []
76
+ files:
77
+ - ".gitignore"
78
+ - ".rspec"
79
+ - Gemfile
80
+ - Gemfile.lock
81
+ - README.md
82
+ - Rakefile
83
+ - bin/console
84
+ - bin/setup
85
+ - buyerquest-opsgenie.gemspec
86
+ - exe/opsgenie-client
87
+ - lib/buyerquest-opsgenie.rb
88
+ - lib/buyerquest/opsgenie.rb
89
+ - lib/buyerquest/opsgenie/alert.rb
90
+ - lib/buyerquest/opsgenie/client.rb
91
+ - lib/buyerquest/opsgenie/heartbeat.rb
92
+ - lib/buyerquest/opsgenie/version.rb
93
+ homepage: https://github.com/BuyerQuest/buyerquest-opsgenie
94
+ licenses:
95
+ - MIT
96
+ metadata:
97
+ homepage_uri: https://github.com/BuyerQuest/buyerquest-opsgenie
98
+ source_code_uri: https://github.com/BuyerQuest/buyerquest-opsgenie
99
+ changelog_uri: https://github.com/BuyerQuest/buyerquest-opsgenie
100
+ post_install_message:
101
+ rdoc_options: []
102
+ require_paths:
103
+ - lib
104
+ required_ruby_version: !ruby/object:Gem::Requirement
105
+ requirements:
106
+ - - ">="
107
+ - !ruby/object:Gem::Version
108
+ version: '0'
109
+ required_rubygems_version: !ruby/object:Gem::Requirement
110
+ requirements:
111
+ - - ">="
112
+ - !ruby/object:Gem::Version
113
+ version: '0'
114
+ requirements: []
115
+ rubygems_version: 3.0.3
116
+ signing_key:
117
+ specification_version: 4
118
+ summary: BuyerQuest OpsGenie gem
119
+ test_files: []