wakame-dolphin 0.0.2
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.
- checksums.yaml +7 -0
- data/.gitignore +9 -0
- data/.rspec +4 -0
- data/.travis.yml +25 -0
- data/Gemfile +18 -0
- data/Makefile +56 -0
- data/README.md +77 -0
- data/Rakefile +67 -0
- data/bin/dolphin_server +98 -0
- data/config/db/cassandra_clear.txt +1 -0
- data/config/db/cassandra_schema.txt +14 -0
- data/config/db/sequel/migrations/0001_add_notification.rb +15 -0
- data/config/db/sequel/migrations/0002_add_event.rb +15 -0
- data/config/dolphin-mysql.conf.travis +26 -0
- data/config/dolphin.conf.example +26 -0
- data/lib/dolphin.rb +148 -0
- data/lib/dolphin/data_store.rb +55 -0
- data/lib/dolphin/data_stores/base_rdb.rb +57 -0
- data/lib/dolphin/data_stores/cassandra.rb +98 -0
- data/lib/dolphin/data_stores/mysql.rb +31 -0
- data/lib/dolphin/helpers/message/zabbix_helper.rb +16 -0
- data/lib/dolphin/helpers/request_helper.rb +72 -0
- data/lib/dolphin/mailer.rb +83 -0
- data/lib/dolphin/manager.rb +35 -0
- data/lib/dolphin/message_builder.rb +98 -0
- data/lib/dolphin/models/base.rb +8 -0
- data/lib/dolphin/models/cassandra/base.rb +11 -0
- data/lib/dolphin/models/cassandra/event.rb +42 -0
- data/lib/dolphin/models/cassandra/notification.rb +28 -0
- data/lib/dolphin/models/rdb/base.rb +12 -0
- data/lib/dolphin/models/rdb/event.rb +47 -0
- data/lib/dolphin/models/rdb/notification.rb +27 -0
- data/lib/dolphin/models/rdb/orm/base.rb +10 -0
- data/lib/dolphin/models/rdb/orm/event.rb +8 -0
- data/lib/dolphin/models/rdb/orm/notification.rb +8 -0
- data/lib/dolphin/query_processor.rb +50 -0
- data/lib/dolphin/request_handler.rb +150 -0
- data/lib/dolphin/sender.rb +47 -0
- data/lib/dolphin/util.rb +18 -0
- data/lib/dolphin/version.rb +3 -0
- data/lib/dolphin/worker.rb +149 -0
- data/script/console +13 -0
- data/spec/files/cassandra_models_spec.rb +127 -0
- data/spec/files/dolphin_spec.rb +110 -0
- data/spec/files/endpoint/event_spec.rb +123 -0
- data/spec/files/endpoint/notification_spec.rb +54 -0
- data/spec/files/message_builder_spec.rb +15 -0
- data/spec/helpers/test_helper.rb +21 -0
- data/spec/helpers/web_request_helper.rb +40 -0
- data/spec/spec_helper.rb +18 -0
- data/templates/email/alert_port.erb +24 -0
- data/templates/email/default.erb +3 -0
- data/tests/test_dolphin +10 -0
- data/tests/test_get_event +31 -0
- data/tests/test_get_notification +27 -0
- data/tests/test_post_event +37 -0
- data/tests/test_post_notification +43 -0
- data/wakame-dolphin.gemspec +40 -0
- metadata +311 -0
@@ -0,0 +1,110 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
require 'rubygems'
|
4
|
+
require 'spec_helper'
|
5
|
+
require 'net/http'
|
6
|
+
|
7
|
+
require File.join(File.expand_path('../../../', __FILE__), 'lib/dolphin')
|
8
|
+
|
9
|
+
describe 'Notification Service' do
|
10
|
+
|
11
|
+
describe Dolphin::RequestHandler do
|
12
|
+
context "リクエストパラメータを入力したとき" do
|
13
|
+
it "リクエストに成功すること" do
|
14
|
+
end
|
15
|
+
|
16
|
+
describe "リクエストに失敗すること" do
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
describe Dolphin::Manager do
|
22
|
+
it "開始できること" do
|
23
|
+
end
|
24
|
+
|
25
|
+
it "停止できること" do
|
26
|
+
end
|
27
|
+
|
28
|
+
it "Workerを起動できること" do
|
29
|
+
end
|
30
|
+
|
31
|
+
it "Workerを停止できること" do
|
32
|
+
end
|
33
|
+
|
34
|
+
it "RequestHandlerを起動できること" do
|
35
|
+
end
|
36
|
+
|
37
|
+
it "RequestHandlerを停止できること" do
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
41
|
+
|
42
|
+
describe Dolphin::Worker do
|
43
|
+
|
44
|
+
context "EventObjectを入力したとき" do
|
45
|
+
it "Senderにメッセージが送れること" do
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
describe Dolphin::QueryProcessor do
|
51
|
+
|
52
|
+
it "宛先情報を取得できること" do
|
53
|
+
end
|
54
|
+
|
55
|
+
it "イベントを記録できること" do
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
describe Dolphin::Sender do
|
60
|
+
|
61
|
+
context "ファイル出力を選択したとき" do
|
62
|
+
it "ファイルに保存できること" do
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
context "メールサーバーが設定されているとき", :smtp => true do
|
67
|
+
it "送信できること" do
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
end
|
72
|
+
|
73
|
+
describe Dolphin::DataBase do
|
74
|
+
|
75
|
+
context "設定ファイルを入力したとき" do
|
76
|
+
it "Cassandraデータベースに接続できること" do
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
context "Cassandraデータベースに接続できたとき" do
|
81
|
+
|
82
|
+
it "Eventを保存できること" do
|
83
|
+
end
|
84
|
+
|
85
|
+
it "Eventを取得できること" do
|
86
|
+
end
|
87
|
+
|
88
|
+
it "Notificationを保存できること" do
|
89
|
+
end
|
90
|
+
|
91
|
+
it "Notificationを取得できること" do
|
92
|
+
end
|
93
|
+
|
94
|
+
end
|
95
|
+
|
96
|
+
end
|
97
|
+
|
98
|
+
describe Dolphin::Util do
|
99
|
+
context "ログタイプにstdoutを選択したとき" do
|
100
|
+
it "ログが書き込めること" do
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
context "ログタイプにltsvを選択したとき" do
|
105
|
+
it "ログが書き込めること" do
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
end
|
@@ -0,0 +1,123 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe 'Event API' do
|
6
|
+
|
7
|
+
before(:all) do
|
8
|
+
|
9
|
+
# Mail Setting
|
10
|
+
output_mail_file_location = '/var/tmp/'
|
11
|
+
|
12
|
+
@mail_to = "test_to@example.com"
|
13
|
+
@temporary_mail = "#{output_mail_file_location}#{@mail_to}"
|
14
|
+
|
15
|
+
@connection = Dolphin::DataStore.current_store
|
16
|
+
@connection.connect
|
17
|
+
|
18
|
+
if @connection.closed?
|
19
|
+
pending "Failed cannect to database"
|
20
|
+
else
|
21
|
+
@notification_id = 'system'
|
22
|
+
@notification_values = {
|
23
|
+
"email"=> {
|
24
|
+
"to" => @mail_to,
|
25
|
+
}
|
26
|
+
}
|
27
|
+
@notification_id = 'test'
|
28
|
+
@connection.put_notification(@notification_id, @notification_values)
|
29
|
+
|
30
|
+
@message_type = "default"
|
31
|
+
@event_values = {
|
32
|
+
'notification_id' => @notification_id,
|
33
|
+
'message_type' => @message_type,
|
34
|
+
'messages' => {
|
35
|
+
"message"=>"Alert!!!!"
|
36
|
+
}
|
37
|
+
}
|
38
|
+
|
39
|
+
@connection.put_event({:messages => @event_values})
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
it 'expect to get events' do
|
44
|
+
res = get('/events', :headers => {
|
45
|
+
'Content-Type' =>'application/json',
|
46
|
+
})
|
47
|
+
expect(res['message']).to eql 'OK'
|
48
|
+
end
|
49
|
+
|
50
|
+
it 'expect to get last event' do
|
51
|
+
events = get('/events', :headers => {
|
52
|
+
'Content-Type' =>'application/json',
|
53
|
+
})
|
54
|
+
last_event = events['results'][-1]
|
55
|
+
last_event_id = last_event['id']
|
56
|
+
|
57
|
+
query_string = '?' + [
|
58
|
+
"count=1",
|
59
|
+
"start_id=#{SimpleUUID::UUID.new(last_event_id).to_guid}"
|
60
|
+
].join('&')
|
61
|
+
|
62
|
+
res = get('/events' + query_string, :headers => {
|
63
|
+
'Content-Type' =>'application/json',
|
64
|
+
})['results'][0]
|
65
|
+
expect(res['id']).to eql last_event_id
|
66
|
+
end
|
67
|
+
|
68
|
+
it 'expect to post event and send email' do
|
69
|
+
message_subject = 'subject'
|
70
|
+
message_body = 'body'
|
71
|
+
res = post('/events',
|
72
|
+
:headers => {
|
73
|
+
'Content-Type' =>'application/json',
|
74
|
+
'X-Notification-Id' => @notification_id,
|
75
|
+
'X-Message-Type' => @message_type
|
76
|
+
},
|
77
|
+
:body => {
|
78
|
+
'subject' => message_subject,
|
79
|
+
'body' => message_body,
|
80
|
+
'message' => 'Alert!!!!'
|
81
|
+
}.to_json)
|
82
|
+
|
83
|
+
expect(res['message']).to eql 'OK'
|
84
|
+
|
85
|
+
wait_for_sending_mail_to_be_ready {
|
86
|
+
break if File.exists?(@temporary_mail)
|
87
|
+
}
|
88
|
+
|
89
|
+
mb = Dolphin::MessageBuilder::Mail.new
|
90
|
+
template = mb.build(@message_type, {
|
91
|
+
'messages' => {
|
92
|
+
'subject' => message_subject,
|
93
|
+
'body' => message_body,
|
94
|
+
},
|
95
|
+
'mail' => {
|
96
|
+
'from' => Dolphin.settings['mail']['from']
|
97
|
+
},
|
98
|
+
'to' => @mail_to
|
99
|
+
})
|
100
|
+
|
101
|
+
mail = Dolphin::Mailer.read_iso2022_jp_mail(@temporary_mail)
|
102
|
+
expect(mail[:from]).to eql Dolphin.settings['mail']['from']
|
103
|
+
expect(mail[:to]).to eql @mail_to
|
104
|
+
expect(mail[:subject]).to eql template.subject
|
105
|
+
expect(mail[:body]).to eql template.body
|
106
|
+
end
|
107
|
+
|
108
|
+
it 'expect to post event only' do
|
109
|
+
res = post('/events',
|
110
|
+
:headers => {
|
111
|
+
'Content-Type' =>'application/json',
|
112
|
+
},
|
113
|
+
:body => {
|
114
|
+
'message' => 'Alert!!!!'
|
115
|
+
}.to_json)
|
116
|
+
|
117
|
+
expect(res['message']).to eql 'OK'
|
118
|
+
end
|
119
|
+
|
120
|
+
before(:all) do
|
121
|
+
FileUtils.rm(@temporary_mail) if File.exists?(@temporary_mail)
|
122
|
+
end
|
123
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe 'Notification API' do
|
6
|
+
before(:all) do
|
7
|
+
|
8
|
+
@connection = Dolphin::DataStore.current_store
|
9
|
+
@connection.connect
|
10
|
+
if @connection.closed?
|
11
|
+
pending "Failed cannect to database"
|
12
|
+
else
|
13
|
+
@notification_values = {
|
14
|
+
"email"=> {
|
15
|
+
"to" => "foo@example.com,bar@example.com",
|
16
|
+
"cc" => "foo@example.com,bar@example.com",
|
17
|
+
"bcc" =>"foofoo@example.com,barbar@example.com"
|
18
|
+
}
|
19
|
+
}
|
20
|
+
@notification_id = 'system'
|
21
|
+
@connection.put_notification(@notification_id, @notification_values)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
it 'expect to get notifications' do
|
26
|
+
res = get('/notifications', :headers => {
|
27
|
+
'Content-Type' =>'application/json',
|
28
|
+
'X-Notification-Id' => @notification_id,
|
29
|
+
})
|
30
|
+
|
31
|
+
expect(res['results']).to eql @notification_values
|
32
|
+
expect(res['message']).to eql 'OK'
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'expect to post notification' do
|
36
|
+
res = post('/notifications',
|
37
|
+
:headers => {
|
38
|
+
'Content-Type' =>'application/json',
|
39
|
+
'X-Notification-Id' => @notification_id
|
40
|
+
},
|
41
|
+
:body => @notification_values.to_json
|
42
|
+
)
|
43
|
+
expect(res['message']).to eql 'OK'
|
44
|
+
end
|
45
|
+
|
46
|
+
it 'expect to delete notification' do
|
47
|
+
res = delete('/notifications', :headers => {
|
48
|
+
'Content-Type' =>'application/json',
|
49
|
+
'X-Notification-Id' => @notification_id,
|
50
|
+
})
|
51
|
+
expect(res['message']).to eql 'OK'
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe Dolphin::TemplateBuilder do
|
6
|
+
describe ".build" do
|
7
|
+
it 'expect to build template' do
|
8
|
+
tb = Dolphin::TemplateBuilder.new
|
9
|
+
|
10
|
+
template_str = 'hello <%= @foo %>'
|
11
|
+
bind_params = {:foo => 'world'}
|
12
|
+
expect(tb.build(template_str, bind_params)).to eql 'hello world'
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module TestHelper
|
2
|
+
def wait_for_sending_mail_to_be_ready(timeout = 5, sleep_time = 1, &block)
|
3
|
+
if block_given? &block
|
4
|
+
waiting_count = 0
|
5
|
+
loop do
|
6
|
+
block.call
|
7
|
+
|
8
|
+
if waiting_count > timeout
|
9
|
+
puts "wait timeout #{timeout}"
|
10
|
+
break
|
11
|
+
end
|
12
|
+
|
13
|
+
puts "sleep #{sleep_time} wait..#{waiting_count}"
|
14
|
+
sleep sleep_time
|
15
|
+
waiting_count +=1
|
16
|
+
end
|
17
|
+
else
|
18
|
+
sleep sleep_time
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require "net/http"
|
2
|
+
require "uri"
|
3
|
+
|
4
|
+
module WebRequestHelper
|
5
|
+
def get(path, params)
|
6
|
+
uri = build_uri(path)
|
7
|
+
net = Net::HTTP::Get.new(uri.request_uri, params[:headers])
|
8
|
+
request(net, uri)
|
9
|
+
end
|
10
|
+
|
11
|
+
def post(path, params)
|
12
|
+
uri = build_uri(path)
|
13
|
+
net = Net::HTTP::Post.new(uri.request_uri, params[:headers])
|
14
|
+
net.body = params[:body]
|
15
|
+
request(net, uri)
|
16
|
+
end
|
17
|
+
|
18
|
+
def delete(path, params)
|
19
|
+
uri = build_uri(path)
|
20
|
+
net = Net::HTTP::Delete.new(uri.request_uri, params[:headers])
|
21
|
+
request(net, uri)
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
def build_uri(path)
|
27
|
+
server = Dolphin.settings['server']
|
28
|
+
endpoint = "http://#{server['host']}:#{server['port']}"
|
29
|
+
URI.parse(endpoint + path)
|
30
|
+
end
|
31
|
+
|
32
|
+
def request(net, uri)
|
33
|
+
http = Net::HTTP.new(uri.host, uri.port)
|
34
|
+
# http.set_debug_output $stderr
|
35
|
+
http.start do |h|
|
36
|
+
response = h.request(net)
|
37
|
+
JSON.parse(response.body)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
require 'rubygems'
|
4
|
+
require 'rspec'
|
5
|
+
require File.join(File.expand_path('../../', __FILE__), 'lib/dolphin')
|
6
|
+
|
7
|
+
# Setup Bundler
|
8
|
+
ENV['BUNDLE_GEMFILE'] ||= File.expand_path(File.dirname(__FILE__) + '/Gemfile')
|
9
|
+
require 'bundler/setup' if File.exists?(ENV['BUNDLE_GEMFILE'])
|
10
|
+
Bundler.require :default if defined?(Bundler)
|
11
|
+
|
12
|
+
# Load helper files
|
13
|
+
Dir.glob('./spec/helpers/*_helper.rb').each {|f| require File.expand_path(f) }
|
14
|
+
|
15
|
+
RSpec.configure do |c|
|
16
|
+
c.include WebRequestHelper
|
17
|
+
c.include TestHelper
|
18
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
監視アラート
|
2
|
+
----------------------------------------
|
3
|
+
|
4
|
+
監視アラート
|
5
|
+
|
6
|
+
<%= @message %>
|
7
|
+
|
8
|
+
【コンポーネントID】
|
9
|
+
<%= @instance_name %>(<%= @instance_id %>)
|
10
|
+
|
11
|
+
【IPアドレス】
|
12
|
+
<%= @instance_ip %>
|
13
|
+
|
14
|
+
【ステータス】
|
15
|
+
異常
|
16
|
+
|
17
|
+
【検知日時】
|
18
|
+
<%= @event_datetime %>
|
19
|
+
|
20
|
+
【補足】
|
21
|
+
監視概要:監視間隔5分、応答待ち時間30秒、リトライ回数2回
|
22
|
+
|
23
|
+
※このメールは送信専用アドレスから送信されています。
|
24
|
+
本メールにご返信いただいてもお答えできませんのでご了承下ください。
|
data/tests/test_dolphin
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# -*- coding: utf-8 -*-
|
3
|
+
|
4
|
+
require 'net/http'
|
5
|
+
require 'uri'
|
6
|
+
require 'json'
|
7
|
+
require 'time'
|
8
|
+
|
9
|
+
start_time = URI.encode((Time.now - 60).iso8601)
|
10
|
+
|
11
|
+
host = ENV['DOLPHIN_HOST'] || '127.0.0.1'
|
12
|
+
port = ENV['DOLPHIN_PORT'] || 9004
|
13
|
+
|
14
|
+
path = "http://#{host}:#{port}/events"
|
15
|
+
# path = "http://#{host}:#{port}/events?limit=10&start_time=#{start_time}"
|
16
|
+
# path = 'http://#{host}:#{port}/events?start_id=12174a14-87c1-11e2-927c-31035db8d436'
|
17
|
+
|
18
|
+
uri = URI.parse(path)
|
19
|
+
|
20
|
+
headers = {
|
21
|
+
'Content-Type' =>'application/json',
|
22
|
+
}
|
23
|
+
|
24
|
+
request = Net::HTTP::Get.new(uri.request_uri, headers)
|
25
|
+
http = Net::HTTP.new(uri.host, uri.port)
|
26
|
+
http.set_debug_output $stderr
|
27
|
+
http.start do |h|
|
28
|
+
response = h.request(request)
|
29
|
+
res = JSON.parse(response.body)
|
30
|
+
p res
|
31
|
+
end
|