wakame-dolphin 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (59) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +9 -0
  3. data/.rspec +4 -0
  4. data/.travis.yml +25 -0
  5. data/Gemfile +18 -0
  6. data/Makefile +56 -0
  7. data/README.md +77 -0
  8. data/Rakefile +67 -0
  9. data/bin/dolphin_server +98 -0
  10. data/config/db/cassandra_clear.txt +1 -0
  11. data/config/db/cassandra_schema.txt +14 -0
  12. data/config/db/sequel/migrations/0001_add_notification.rb +15 -0
  13. data/config/db/sequel/migrations/0002_add_event.rb +15 -0
  14. data/config/dolphin-mysql.conf.travis +26 -0
  15. data/config/dolphin.conf.example +26 -0
  16. data/lib/dolphin.rb +148 -0
  17. data/lib/dolphin/data_store.rb +55 -0
  18. data/lib/dolphin/data_stores/base_rdb.rb +57 -0
  19. data/lib/dolphin/data_stores/cassandra.rb +98 -0
  20. data/lib/dolphin/data_stores/mysql.rb +31 -0
  21. data/lib/dolphin/helpers/message/zabbix_helper.rb +16 -0
  22. data/lib/dolphin/helpers/request_helper.rb +72 -0
  23. data/lib/dolphin/mailer.rb +83 -0
  24. data/lib/dolphin/manager.rb +35 -0
  25. data/lib/dolphin/message_builder.rb +98 -0
  26. data/lib/dolphin/models/base.rb +8 -0
  27. data/lib/dolphin/models/cassandra/base.rb +11 -0
  28. data/lib/dolphin/models/cassandra/event.rb +42 -0
  29. data/lib/dolphin/models/cassandra/notification.rb +28 -0
  30. data/lib/dolphin/models/rdb/base.rb +12 -0
  31. data/lib/dolphin/models/rdb/event.rb +47 -0
  32. data/lib/dolphin/models/rdb/notification.rb +27 -0
  33. data/lib/dolphin/models/rdb/orm/base.rb +10 -0
  34. data/lib/dolphin/models/rdb/orm/event.rb +8 -0
  35. data/lib/dolphin/models/rdb/orm/notification.rb +8 -0
  36. data/lib/dolphin/query_processor.rb +50 -0
  37. data/lib/dolphin/request_handler.rb +150 -0
  38. data/lib/dolphin/sender.rb +47 -0
  39. data/lib/dolphin/util.rb +18 -0
  40. data/lib/dolphin/version.rb +3 -0
  41. data/lib/dolphin/worker.rb +149 -0
  42. data/script/console +13 -0
  43. data/spec/files/cassandra_models_spec.rb +127 -0
  44. data/spec/files/dolphin_spec.rb +110 -0
  45. data/spec/files/endpoint/event_spec.rb +123 -0
  46. data/spec/files/endpoint/notification_spec.rb +54 -0
  47. data/spec/files/message_builder_spec.rb +15 -0
  48. data/spec/helpers/test_helper.rb +21 -0
  49. data/spec/helpers/web_request_helper.rb +40 -0
  50. data/spec/spec_helper.rb +18 -0
  51. data/templates/email/alert_port.erb +24 -0
  52. data/templates/email/default.erb +3 -0
  53. data/tests/test_dolphin +10 -0
  54. data/tests/test_get_event +31 -0
  55. data/tests/test_get_notification +27 -0
  56. data/tests/test_post_event +37 -0
  57. data/tests/test_post_notification +43 -0
  58. data/wakame-dolphin.gemspec +40 -0
  59. metadata +311 -0
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 1083fcd12c989df0d9878212ca88dd1e9799d3a0
4
+ data.tar.gz: 064f9d4865ff443cb3d0a1abc6e7b687e8fcc9e8
5
+ SHA512:
6
+ metadata.gz: 0cc6b3984d0c446b8fe8acc8cbd8d8794c0142774f3a87e762616985e3ba50b80c1a6a17f9c99b7732da3366218b789844f4ad00be41efa25c30a440d60cc47c
7
+ data.tar.gz: 68faacea3a90b3b3277fb06251dcc8b69632bfef277d6c0cfd7c975277704bda759969c514072f4ce6831c74d7560cd3ed3c7db8a1ae4cdeb1b0b8febf0bffb8
@@ -0,0 +1,9 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ doc/
5
+ lib/bundler/man
6
+ pkg
7
+ rdoc
8
+ spec/reports
9
+ tmp
data/.rspec ADDED
@@ -0,0 +1,4 @@
1
+ --color
2
+ --format documentation
3
+ --backtrace
4
+ --default_path spec
@@ -0,0 +1,25 @@
1
+ language: ruby
2
+
3
+ env:
4
+ - DB=mysql CONFIG_FILE=dolphin-mysql.conf.travis
5
+
6
+ rvm:
7
+ - 1.9.3
8
+
9
+ before_install:
10
+ - gem update bundler
11
+
12
+ before_script:
13
+ - mysql -e 'create database dolphin;'
14
+ - bundle exec rake db:mysql:init
15
+ - bundle exec ./bin/dolphin_server -c "./config/${CONFIG_FILE}" &
16
+
17
+ script:
18
+ - bundle exec rspec ./spec/files/endpoint/
19
+
20
+ after_script:
21
+ - bundle exec rake db:mysql:drop
22
+
23
+ branches:
24
+ only:
25
+ - master
data/Gemfile ADDED
@@ -0,0 +1,18 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
4
+
5
+ group :mysql do
6
+ gem 'sequel', '3.48.0'
7
+ gem 'mysql2', '0.3.11'
8
+ end
9
+
10
+ group :cassandra do
11
+ gem 'cassandra', '0.17.0'
12
+ end
13
+
14
+ group :development, :test do
15
+ gem 'rspec', '2.13.0'
16
+ gem 'pry'
17
+ gem 'rb-readline'
18
+ end
@@ -0,0 +1,56 @@
1
+ CURDIR ?= $(PWD)
2
+ RUBYDIR = $(CURDIR)/ruby
3
+ DSTDIR ?= ""
4
+
5
+ define BUNDLE_CFG
6
+ ---
7
+ BUNDLE_PATH: vendor/bundle
8
+ BUNDLE_DISABLE_SHARED_GEMS: '1'
9
+ endef
10
+ # We're exporting this as a shell variable because otherwise Make can't echo multiline strings into a file
11
+ export BUNDLE_CFG
12
+
13
+ dev: build-ruby install-bundle-dev
14
+
15
+ build-ruby:
16
+ $(CURDIR)/deployment/rubybuild/build_ruby.sh
17
+
18
+ install-bundle-dev:
19
+ $(RUBYDIR)/bin/gem install bundler
20
+ (cd $(CURDIR); mkdir .bundle; echo "$$BUNDLE_CFG" > .bundle/config)
21
+ (cd $(CURDIR); $(RUBYDIR)/bin/bundle install)
22
+
23
+ install-bundle-with-cassandra:
24
+ $(RUBYDIR)/bin/gem install bundler
25
+ (cd $(CURDIR); mkdir .bundle; echo "$$BUNDLE_CFG" > .bundle/config)
26
+ (cd $(CURDIR); $(RUBYDIR)/bin/bundle install --without development test mysql)
27
+
28
+ install-bundle-with-mysql:
29
+ $(RUBYDIR)/bin/gem install bundler
30
+ (cd $(CURDIR); mkdir .bundle; echo "$$BUNDLE_CFG" > .bundle/config)
31
+ (cd $(CURDIR); $(RUBYDIR)/bin/bundle install --without development test cassandra)
32
+
33
+ install: update-config
34
+ mkdir -p $(DSTDIR)/opt/axsh/wakame-dolphin
35
+ mkdir -p $(DSTDIR)/etc/wakame-vdc
36
+ cp -r . $(DSTDIR)/opt/axsh/wakame-dolphin
37
+ cp -r deployment/conf_files/etc/default $(DSTDIR)/etc
38
+ cp -r deployment/conf_files/etc/init $(DSTDIR)/etc
39
+
40
+ uninstall:
41
+ rm -rf $(DSTDIR)/opt/axsh/wakame-dolphin
42
+ rm -rf $(DSTDIR)/tmp/log
43
+ rm -rf $(DSTDIR)/var/run/wakame-dolphin
44
+ rm $(DSTDIR)/etc/default/vdc-dolphin
45
+ rm $(DSTDIR)/etc/init/vdc-dolphin.conf
46
+
47
+ update-config:
48
+ cp -r deployment/conf_files/etc/wakame-vdc $(DSTDIR)/etc/
49
+
50
+ remove-config:
51
+ rm -rf $(DSTDIR)/etc/wakame-vdc/dolphin.conf
52
+
53
+ clean:
54
+ # rm -rf $(RUBYDIR)
55
+ rm -rf $(CURDIR)/vendor
56
+ rm -rf $(CURDIR)/.bundle
@@ -0,0 +1,77 @@
1
+ # Dolphin
2
+
3
+ Dolphin is notification service.
4
+
5
+ ### Install for production
6
+
7
+ Dolphin supported multi datastore are mysql and cassandra.
8
+
9
+ #### DataStore cassandra
10
+ ```
11
+ $ bundle install --without test development mysql
12
+ ```
13
+
14
+ #### DataStore mysql
15
+ ```
16
+ $ bundle install --without test development cassandra
17
+ ```
18
+
19
+ ### Copy Settings File
20
+
21
+ ```
22
+ $ cp -ip ./config/dolphin.conf.example ./config/dolphin.conf
23
+ ```
24
+
25
+ ### Edit config
26
+
27
+ ```
28
+ $ vi ./config/dolphin.conf
29
+ ```
30
+
31
+ ./config/dolphin.conf
32
+ ```
33
+ from=yourname@yourdomain
34
+ ```
35
+
36
+ ### Start Service
37
+
38
+ ```
39
+ $ ./bin/dolphin_server
40
+ ```
41
+
42
+ ```
43
+ I, [2013-03-12T14:41:17.533784 #27820] INFO -- : [11950120] [Dolphin::RequestHandler] Running on ruby 1.9.3 with selected Celluloid::TaskThread
44
+ I, [2013-03-12T14:41:17.533922 #27820] INFO -- : [11950120] [Dolphin::RequestHandler] Listening on http://127.0.0.1:9004
45
+ ```
46
+
47
+ ### Add Notification
48
+
49
+ ```
50
+ $ MAIL_TO=example@example.com ruby ./example/client/put_notification.rb
51
+ ```
52
+
53
+ ### Add Event
54
+
55
+ ```
56
+ $ ruby ./example/client/post_event.rb
57
+ ```
58
+
59
+ ### Tempolary mail
60
+
61
+ ```
62
+ $ ls ./tmp/mails
63
+ ```
64
+
65
+ ### Run Test Case
66
+
67
+ ```
68
+ $ bundle exec rake spec
69
+ ```
70
+
71
+ ### Code Status
72
+
73
+ [![Build Status](https://travis-ci.org/axsh/wakame-dolphin.png?branch=master)](https://travis-ci.org/axsh/wakame-dolphin)
74
+
75
+ ### License
76
+
77
+ Copyright (c) Axsh Co. Components are included distribution under LGPL 3.0 and Apache 2.0
@@ -0,0 +1,67 @@
1
+ #!/usr/bin/env ruby
2
+ # -*- coding: utf-8 -*-
3
+ require "rubygems"
4
+ require "bundler/setup"
5
+
6
+ require File.join(File.expand_path('../', __FILE__), 'lib/dolphin')
7
+
8
+ unless ENV['CONFIG_FILE'].blank?
9
+ Dolphin.settings(File.join(Dolphin.config_path, ENV['CONFIG_FILE']))
10
+ end
11
+
12
+ require "rspec/core/rake_task"
13
+ desc 'Run rspec'
14
+ RSpec::Core::RakeTask.new("spec") do |spec|
15
+ spec.pattern = FileList["spec/files/endpoint/*_spec.rb"]
16
+ end
17
+
18
+ task :default => :spec
19
+
20
+ namespace :db do
21
+ namespace :cassandra do
22
+
23
+ desc 'Clean cassandra'
24
+ task :clean do |tasks|
25
+ begin
26
+
27
+ db_config = Dolphin.settings['database']
28
+ @host = db_config['hosts'].split(',')[0]
29
+ @port = db_config['port']
30
+
31
+ @connect = Dolphin::DataStore::Cassandra.new({
32
+ :keyspace => Dolphin::DataStore::Cassandra::KEYSPACE,
33
+ :hosts => @host,
34
+ :port => @port
35
+ }).connect
36
+
37
+ @connect.drop_keyspace(Dolphin::DataStore::Cassandra::KEYSPACE)
38
+ rescue => e
39
+ puts "Doesn't exist #{Dolphin::DataStore::Cassandra::KEYSPACE} keyspace or dropped already"
40
+ exit
41
+ end
42
+ end
43
+
44
+ desc 'Migrate cassandra'
45
+ task :migrate do
46
+ filename = Dolphin.db_path + '/cassandra_schema.txt'
47
+ exec "/usr/bin/cassandra-cli -h #{@host} -p #{@port} -f #{filename}"
48
+ end
49
+ end
50
+
51
+ namespace :mysql do
52
+
53
+ desc 'Create all database tables'
54
+ task :init do
55
+ Dolphin::DataStore.current_store.connect
56
+ Sequel.extension :migration
57
+ Sequel::Migrator.apply(Sequel::DATABASES.first, File.expand_path('../config/db/sequel/migrations', __FILE__), 9999)
58
+ end
59
+
60
+ desc 'Drop all database tables'
61
+ task :drop do
62
+ Dolphin::DataStore.current_store.connect
63
+ Sequel.extension :migration
64
+ Sequel::Migrator.apply(Sequel::DATABASES.first, File.expand_path('../config/db/sequel/migrations', __FILE__), 0)
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,98 @@
1
+ #!/usr/bin/env ruby
2
+ # -*- coding: utf-8 -*-
3
+
4
+ # TODO: better loading libraries
5
+ setup_rb = File.expand_path('../../vendor/bundle/bundler/setup.rb', __FILE__)
6
+
7
+ begin
8
+ require 'rubygems'
9
+ if File.exists?(setup_rb)
10
+ load setup_rb
11
+ else
12
+ require 'bundler/setup'
13
+ end
14
+ rescue LoadError => e
15
+ end
16
+
17
+ require File.join(File.expand_path('../../', __FILE__), 'lib/dolphin')
18
+ require 'optparse'
19
+
20
+ options = {}
21
+ opt = OptionParser.new do |opt|
22
+ opt.on('-c [dolphin.conf]', "Dolphin configuration file") {|v| options[:config_file] = v }
23
+ opt.on('-h', "--help") {|v| puts opt.help(); Kernel.exit(true) }
24
+ opt.on('-v', "--version") {|v| puts Dolphin::VERSION; Kernel.exit(true) }
25
+ end
26
+
27
+ begin
28
+ opt.parse!(ARGV)
29
+ rescue => e
30
+ STDERR.puts e
31
+ exit!
32
+ end
33
+
34
+ require 'ltsv'
35
+ require 'celluloid'
36
+
37
+ module Dolphin
38
+
39
+ Celluloid.logger.datetime_format = "%Y-%m-%d %H:%M:%S"
40
+ Celluloid.logger.formatter = proc { |severity, datetime, progname, msg|
41
+ case settings['logger']['format']
42
+ when 'human_readable'
43
+ msg = "[#{msg[:thread_id]}] [#{msg[:classname]}] #{msg[:message]}" if msg.is_a?(Hash)
44
+ Logger::Formatter.new.call(severity, datetime, progname, msg)
45
+ when 'ltsv'
46
+ LTSV.dump({
47
+ :log_level => severity,
48
+ :time => datetime,
49
+ :thread_id => msg[:thread_id],
50
+ :classname => msg[:classname],
51
+ :message => msg[:message],
52
+ }) + "\n"
53
+ end
54
+ }
55
+
56
+ def self.run(options)
57
+
58
+ # init config_file
59
+ Dolphin.settings(options[:config_file])
60
+
61
+ if RUBY_VERSION.to_f >= 2
62
+ # Celluloid::TaskFiber by default
63
+ elsif RUBY_VERSION.to_f >= 1.9
64
+ Celluloid.task_class = Celluloid::TaskThread
65
+ else
66
+ raise "Doesn't support ruby version: #{RUBY_VERSION}"
67
+ exit!
68
+ end
69
+
70
+ # verify possible for to load Gem related database.
71
+ begin
72
+ Dolphin::Models::Base
73
+ rescue Gem::LoadError => e
74
+ raise e.message
75
+ exit!
76
+ end
77
+
78
+ manager = Manager.new
79
+ # manager.pool(Worker, :as => :workers, :size => 2)
80
+ # manager.pool(Sender::Mail, :as => :mail_senders, :size => 2)
81
+ # manager.pool(QueryProcessor, :as => :query_processors, :size => 2)
82
+
83
+ manager.add(Worker, :as => :workers)
84
+ manager.add(Sender::Mail, :as => :mail_senders)
85
+ manager.add(QueryProcessor, :as => :query_processors)
86
+
87
+ # TODO: RequestHandler link to Manager
88
+ # TODO: Chanage to rackup
89
+
90
+ server_settings = Dolphin.settings['server']
91
+ RequestHandler.new(server_settings['host'], server_settings['port'])
92
+
93
+ Manager.run
94
+ end
95
+ end
96
+
97
+ Dolphin.run(options)
98
+ sleep
@@ -0,0 +1 @@
1
+ drop keyspace dolphin;
@@ -0,0 +1,14 @@
1
+ create keyspace dolphin with
2
+ placement_strategy = 'org.apache.cassandra.locator.SimpleStrategy' AND
3
+ strategy_options = {replication_factor:1};
4
+
5
+ use dolphin;
6
+
7
+ create column family events with comparator = TimeUUIDType
8
+ AND key_validation_class = AsciiType
9
+ AND default_validation_class = UTF8Type;
10
+
11
+ create column family notifications with comparator = AsciiType
12
+ AND key_validation_class = AsciiType
13
+ AND default_validation_class = UTF8Type;
14
+
@@ -0,0 +1,15 @@
1
+ Sequel.migration do
2
+ up do
3
+ create_table(:notifications) do
4
+ primary_key :id, :type=>"int(11)"
5
+ column :uuid, "varchar(255)", :null=>false
6
+ column :value, "blob", :null=>false
7
+ column :timestamp, "datetime", :null=>false
8
+ index [:uuid], :unique=>true, :name=>:uuid
9
+ end
10
+ end
11
+
12
+ down do
13
+ drop_table(:notifications)
14
+ end
15
+ end
@@ -0,0 +1,15 @@
1
+ Sequel.migration do
2
+ up do
3
+ create_table(:events) do
4
+ primary_key :id, :type=>"int(11)"
5
+ column :uuid, "varchar(255)", :null=>false
6
+ column :value, "blob", :null=>false
7
+ column :timestamp, "datetime", :null=>false
8
+ index [:uuid], :unique=>true, :name=>:uuid
9
+ end
10
+ end
11
+
12
+ down do
13
+ drop_table(:events)
14
+ end
15
+ end
@@ -0,0 +1,26 @@
1
+ [server]
2
+ host = 0.0.0.0
3
+ port = 9004
4
+
5
+ [agent]
6
+ request_handler = 1
7
+ query_processor = 1
8
+ worker = 1
9
+ sender = 1
10
+
11
+ [database]
12
+ adapter = mysql
13
+ host = 127.0.0.1
14
+ port = 3306
15
+ user = root
16
+ pass =
17
+
18
+ [mail]
19
+ from = demo@example.com
20
+ # host = localhost
21
+ # port = 25
22
+ type = file
23
+
24
+ [logger]
25
+ format = human_readable
26
+ # format = ltsv