cluster_management 0.5.2 → 0.6
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.
- data/Rakefile +2 -2
- data/lib/cluster_management.rb +26 -1
- data/lib/cluster_management/cluster.rb +56 -0
- data/lib/cluster_management/config.rb +10 -14
- data/lib/cluster_management/gems.rb +1 -0
- data/lib/cluster_management/integration/vfs.rb +4 -8
- data/lib/cluster_management/integration/vos.rb +58 -32
- data/lib/cluster_management/logger.rb +8 -8
- data/lib/cluster_management/service.rb +70 -52
- data/lib/cluster_management/support/exception.rb +36 -0
- metadata +55 -50
data/Rakefile
CHANGED
@@ -2,8 +2,8 @@ require 'rake_ext'
|
|
2
2
|
|
3
3
|
project(
|
4
4
|
name: "cluster_management",
|
5
|
-
version: "0.
|
6
|
-
summary: "Simple
|
5
|
+
version: "0.6",
|
6
|
+
summary: "Simple Cluster Management Tools",
|
7
7
|
|
8
8
|
author: "Alexey Petrushin",
|
9
9
|
homepage: "http://github.com/alexeypetrushin/cluster_management"
|
data/lib/cluster_management.rb
CHANGED
@@ -2,11 +2,36 @@ require 'ruby_ext'
|
|
2
2
|
require 'vos'
|
3
3
|
require 'yaml'
|
4
4
|
require 'tilt'
|
5
|
+
require 'class_loader'
|
6
|
+
# require 'micon'
|
7
|
+
# require 'micon/rad'
|
5
8
|
|
9
|
+
|
10
|
+
#
|
11
|
+
# Classes
|
12
|
+
#
|
6
13
|
%w(
|
14
|
+
support/exception
|
7
15
|
config
|
8
16
|
logger
|
9
17
|
service
|
10
18
|
integration/vfs
|
11
19
|
integration/vos
|
12
|
-
|
20
|
+
cluster
|
21
|
+
).each{|f| require "cluster_management/#{f}"}
|
22
|
+
|
23
|
+
|
24
|
+
#
|
25
|
+
# Cluster
|
26
|
+
#
|
27
|
+
CLUSTER = ClusterManagement::Cluster.new
|
28
|
+
def cluster; ::CLUSTER end
|
29
|
+
|
30
|
+
|
31
|
+
#
|
32
|
+
# Config & Logger
|
33
|
+
#
|
34
|
+
cluster.logger = ClusterManagement::CustomLogger.new STDOUT
|
35
|
+
cluster.logger.formatter = -> severity, datetime, progname, msg {msg}
|
36
|
+
|
37
|
+
cluster.config = ClusterManagement::Config.new
|
@@ -0,0 +1,56 @@
|
|
1
|
+
module ClusterManagement
|
2
|
+
class Cluster
|
3
|
+
attr_accessor :config, :logger
|
4
|
+
attr_reader :boxes
|
5
|
+
|
6
|
+
def services &b
|
7
|
+
b ? @services.instance_eval(&b) : @services
|
8
|
+
end
|
9
|
+
|
10
|
+
class Services < BasicObject
|
11
|
+
def initialize
|
12
|
+
@h = ::Hash.new do |h, service_name|
|
13
|
+
h[service_name] = ::ClusterManagement::Service.service_class(service_name).new
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def [] service_name
|
18
|
+
service_name.must_be.a ::Symbol
|
19
|
+
@h[service_name.to_sym]
|
20
|
+
end
|
21
|
+
|
22
|
+
protected
|
23
|
+
def p msg
|
24
|
+
::Object.send :p, msg
|
25
|
+
end
|
26
|
+
|
27
|
+
def method_missing m, *a, &b
|
28
|
+
super unless a.blank? and b.blank?
|
29
|
+
@h[m]
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def initialize
|
34
|
+
@services = Services.new
|
35
|
+
|
36
|
+
@boxes = Hash.new do |h, host|
|
37
|
+
box = config.ssh? ? Box.new(host.to_s, config.ssh.to_h) : Box.new(host.to_s)
|
38
|
+
box.open
|
39
|
+
h[host] = box
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def configure runtime_dir
|
44
|
+
config.merge_file! "#{runtime_dir}/config/config.yml"
|
45
|
+
config.set! :config_path, "#{runtime_dir}/config"
|
46
|
+
|
47
|
+
r = {}
|
48
|
+
config.boxes!.to_h.each do |box, tags|
|
49
|
+
tags.each do |tag|
|
50
|
+
(r[tag.to_sym] ||= []) << box
|
51
|
+
end
|
52
|
+
end
|
53
|
+
config.set! :tags, r
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
@@ -1,21 +1,17 @@
|
|
1
1
|
module ClusterManagement
|
2
2
|
class Config < SafeHash
|
3
|
-
def
|
3
|
+
def merge_file! file_path
|
4
4
|
raise("config file must have .yml extension (#{file_path})!") unless file_path.end_with? '.yml'
|
5
|
-
data = ::YAML.load_file file_path
|
5
|
+
data = ::YAML.load_file file_path
|
6
6
|
if data
|
7
|
-
data.must_be.a ::Hash
|
8
|
-
self.
|
7
|
+
data.must_be.a ::Hash
|
8
|
+
self.merge! data, override: true
|
9
9
|
end
|
10
10
|
end
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
@config
|
15
|
-
|
16
|
-
end
|
17
|
-
|
18
|
-
def self.config
|
19
|
-
@config || raise("config nod defined (use ClusterManagement.load_config to use config)!")
|
20
|
-
end
|
11
|
+
|
12
|
+
# def self.load file
|
13
|
+
# @config = Config.new
|
14
|
+
# @config.merge_file! file
|
15
|
+
# end
|
16
|
+
end
|
21
17
|
end
|
@@ -1,38 +1,64 @@
|
|
1
1
|
module Vos
|
2
|
-
class
|
3
|
-
|
4
|
-
@box, @class_namespace = box, class_namespace
|
5
|
-
end
|
2
|
+
class Box
|
3
|
+
include Helpers::Ubuntu
|
6
4
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
5
|
+
# alias_method :mark_without_service!, :mark!
|
6
|
+
# def mark! key
|
7
|
+
# key = key.respond_to(:marker) || key
|
8
|
+
# mark_without_service! key
|
9
|
+
# end
|
10
|
+
#
|
11
|
+
# alias_method :has_mark_without_service?, :has_mark?
|
12
|
+
# def has_mark? key
|
13
|
+
# key = key.respond_to(:marker) || key
|
14
|
+
# has_mark_without_service? key
|
15
|
+
# end
|
11
16
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
protected
|
20
|
-
def method_missing class_name
|
21
|
-
ServiceCallback.new(@box, @class_namespace, class_name)
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
class Box
|
26
|
-
def self.define_service_namespace class_namespace
|
27
|
-
define_method class_namespace do
|
28
|
-
ServicesHelper.new self, class_namespace
|
17
|
+
def apply_once key, &block
|
18
|
+
unless has_mark? key
|
19
|
+
block.call self
|
20
|
+
mark! key
|
29
21
|
end
|
30
|
-
end
|
31
|
-
define_service_namespace :services
|
32
|
-
define_service_namespace :projects
|
22
|
+
end
|
33
23
|
|
34
|
-
def already_required_services
|
35
|
-
@already_required_services ||= Set.new
|
36
|
-
end
|
37
24
|
end
|
38
|
-
end
|
25
|
+
end
|
26
|
+
|
27
|
+
# module Vos
|
28
|
+
# class ServicesHelper < BasicObject
|
29
|
+
# def initialize box, class_namespace
|
30
|
+
# @box, @class_namespace = box, class_namespace
|
31
|
+
# end
|
32
|
+
#
|
33
|
+
# class ServiceCallback < BasicObject
|
34
|
+
# def initialize box, class_namespace, class_name
|
35
|
+
# @box, @class_namespace, @class_name = box, class_namespace, class_name
|
36
|
+
# end
|
37
|
+
#
|
38
|
+
# protected
|
39
|
+
# def method_missing m, *a, &b
|
40
|
+
# klass = "::#{@class_namespace.to_s.camelize}::#{@class_name.to_s.camelize}".constantize
|
41
|
+
# klass.new(@box).send m, *a, &b
|
42
|
+
# end
|
43
|
+
# end
|
44
|
+
#
|
45
|
+
# protected
|
46
|
+
# def method_missing class_name
|
47
|
+
# ServiceCallback.new(@box, @class_namespace, class_name)
|
48
|
+
# end
|
49
|
+
# end
|
50
|
+
#
|
51
|
+
# # class Box
|
52
|
+
# # def self.define_service_namespace class_namespace
|
53
|
+
# # define_method class_namespace do
|
54
|
+
# # ServicesHelper.new self, class_namespace
|
55
|
+
# # end
|
56
|
+
# # end
|
57
|
+
# # define_service_namespace :services
|
58
|
+
# # define_service_namespace :projects
|
59
|
+
# #
|
60
|
+
# # def already_required_services
|
61
|
+
# # @already_required_services ||= Set.new
|
62
|
+
# # end
|
63
|
+
# # end
|
64
|
+
# end
|
@@ -15,12 +15,12 @@ module ClusterManagement
|
|
15
15
|
end
|
16
16
|
end
|
17
17
|
|
18
|
-
attr_writer :logger
|
19
|
-
def self.logger
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
end
|
18
|
+
# attr_writer :logger
|
19
|
+
# def self.logger
|
20
|
+
# unless @logger
|
21
|
+
# @logger = CustomLogger.new STDOUT
|
22
|
+
# @logger.formatter = -> severity, datetime, progname, msg {msg}
|
23
|
+
# end
|
24
|
+
# @logger
|
25
|
+
# end
|
26
26
|
end
|
@@ -1,55 +1,5 @@
|
|
1
1
|
module ClusterManagement
|
2
2
|
class Service
|
3
|
-
attr_reader :box
|
4
|
-
|
5
|
-
#
|
6
|
-
# Helpers
|
7
|
-
#
|
8
|
-
def logger; ClusterManagement.logger end
|
9
|
-
def config; ClusterManagement.config end
|
10
|
-
|
11
|
-
|
12
|
-
#
|
13
|
-
# Business Logic
|
14
|
-
#
|
15
|
-
def initialize box
|
16
|
-
@box = box
|
17
|
-
end
|
18
|
-
|
19
|
-
def mark! extra_mark = nil
|
20
|
-
box.mark! self.class.marker(extra_mark)
|
21
|
-
end
|
22
|
-
|
23
|
-
def has_mark? extra_mark = nil
|
24
|
-
box.has_mark? self.class.marker(extra_mark)
|
25
|
-
end
|
26
|
-
|
27
|
-
def apply_once extra_mark = nil, &block
|
28
|
-
unless has_mark? extra_mark
|
29
|
-
block.call
|
30
|
-
mark! extra_mark
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
def require *args
|
35
|
-
if args.size == 1 and args.first.is_a?(Hash)
|
36
|
-
services = args.first
|
37
|
-
elsif args.size == 2 and args.first.is_a?(Array)
|
38
|
-
services = {}
|
39
|
-
args.first.each{|klass| services[klass] = args.last}
|
40
|
-
else
|
41
|
-
raise 'invalid arguments'
|
42
|
-
end
|
43
|
-
|
44
|
-
services.each do |klass, method|
|
45
|
-
key = "#{klass}.#{method}"
|
46
|
-
unless box.already_required_services.include? key
|
47
|
-
klass.new(box).send method if klass.method_defined? method
|
48
|
-
box.already_required_services << key
|
49
|
-
end
|
50
|
-
end
|
51
|
-
end
|
52
|
-
|
53
3
|
class << self
|
54
4
|
def version version = nil
|
55
5
|
if version
|
@@ -58,10 +8,78 @@ module ClusterManagement
|
|
58
8
|
@version ||= 1
|
59
9
|
end
|
60
10
|
end
|
61
|
-
|
11
|
+
|
12
|
+
def tag tag = nil
|
13
|
+
if tag
|
14
|
+
@tag = tag
|
15
|
+
else
|
16
|
+
@tag || raise("service :#{service_name} not tagged!")
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
62
20
|
def marker extra_mark = nil
|
63
|
-
%(#{
|
21
|
+
%(#{service_name}:#{version}#{":#{extra_mark}" if extra_mark})
|
22
|
+
end
|
23
|
+
|
24
|
+
def service_class name
|
25
|
+
# dont'use constantize, it works wrong, and returns ::File instead of ::Services::File for example.
|
26
|
+
eval("::Services::#{name.to_s.camelize}", TOPLEVEL_BINDING, __FILE__, __LINE__)
|
64
27
|
end
|
28
|
+
cache_method_with_params :service_class
|
29
|
+
|
30
|
+
def service_name; name.split('::').last.underscore end
|
31
|
+
cache_method_with_params :service_name
|
65
32
|
end
|
33
|
+
|
34
|
+
protected
|
35
|
+
def config; cluster.config end
|
36
|
+
def logger; cluster.logger end
|
37
|
+
def services &b; cluster.services &b end
|
38
|
+
|
39
|
+
def service_name; self.class.service_name end
|
40
|
+
|
41
|
+
def apply_once key, &block
|
42
|
+
boxes{|box| box.apply_once self.class.marker(key), &block}
|
43
|
+
end
|
44
|
+
|
45
|
+
def boxes &b
|
46
|
+
if b
|
47
|
+
boxes.each &b
|
48
|
+
else
|
49
|
+
unless @boxes
|
50
|
+
hosts = config.tags!["#{self.class.tag}", nil] || []
|
51
|
+
@boxes = hosts.collect{|host| cluster.boxes[host]}
|
52
|
+
end
|
53
|
+
@boxes
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def single_box
|
58
|
+
boxes.size.must_be == 1
|
59
|
+
boxes.first
|
60
|
+
end
|
61
|
+
|
62
|
+
# def require options
|
63
|
+
# # if args.size == 1 and args.first.is_a?(Hash)
|
64
|
+
# # services = args.first
|
65
|
+
# # elsif args.size == 2 and args.first.is_a?(Array)
|
66
|
+
# # services = {}
|
67
|
+
# # args.first.each{|klass| services[klass] = args.last}
|
68
|
+
# # else
|
69
|
+
# # raise 'invalid arguments'
|
70
|
+
# # end
|
71
|
+
#
|
72
|
+
# options.each do |service_name, method|
|
73
|
+
# key = "#{service_name}.#{method}"
|
74
|
+
# unless box.already_required_services.include? key
|
75
|
+
# klass.new(box).send method if klass.method_defined? method
|
76
|
+
# box.already_required_services << key
|
77
|
+
# end
|
78
|
+
# end
|
79
|
+
# end
|
80
|
+
#
|
81
|
+
# def already_required_services
|
82
|
+
#
|
83
|
+
# end
|
66
84
|
end
|
67
85
|
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
warn 'stack trace filtering enabled'
|
2
|
+
|
3
|
+
Exception.metaclass_eval do
|
4
|
+
attr_accessor :filters
|
5
|
+
end
|
6
|
+
Exception.filters = [
|
7
|
+
"/gems/haml",
|
8
|
+
"/gems/tilt",
|
9
|
+
"/gems/facets",
|
10
|
+
"/gems/rspec",
|
11
|
+
|
12
|
+
"/timeout.rb",
|
13
|
+
|
14
|
+
'lib/fake_gem',
|
15
|
+
'rubygems/custom_require',
|
16
|
+
|
17
|
+
'lib/ruby_ext',
|
18
|
+
|
19
|
+
'lib/cluster_management',
|
20
|
+
|
21
|
+
'bin/rake',
|
22
|
+
'lib/rake',
|
23
|
+
|
24
|
+
"/monitor",
|
25
|
+
"/synchronize",
|
26
|
+
"/class_loader",
|
27
|
+
"/micon"
|
28
|
+
]
|
29
|
+
# Exception.filters = []
|
30
|
+
|
31
|
+
Exception.class_eval do
|
32
|
+
alias_method :set_backtrace_without_filter, :set_backtrace
|
33
|
+
def set_backtrace array
|
34
|
+
set_backtrace_without_filter array.sfilter(::Exception.filters)
|
35
|
+
end
|
36
|
+
end
|
metadata
CHANGED
@@ -1,96 +1,101 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: cluster_management
|
3
|
-
version: !ruby/object:Gem::Version
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: '0.6'
|
4
5
|
prerelease:
|
5
|
-
version: 0.5.2
|
6
6
|
platform: ruby
|
7
|
-
authors:
|
7
|
+
authors:
|
8
8
|
- Alexey Petrushin
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
|
13
|
-
date: 2011-02-16 00:00:00 +03:00
|
12
|
+
date: 2011-04-11 00:00:00.000000000 +04:00
|
14
13
|
default_executable:
|
15
|
-
dependencies:
|
16
|
-
- !ruby/object:Gem::Dependency
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
17
16
|
name: tilt
|
18
|
-
|
19
|
-
requirement: &id001 !ruby/object:Gem::Requirement
|
17
|
+
requirement: &3055160 !ruby/object:Gem::Requirement
|
20
18
|
none: false
|
21
|
-
requirements:
|
22
|
-
- -
|
23
|
-
- !ruby/object:Gem::Version
|
24
|
-
version:
|
19
|
+
requirements:
|
20
|
+
- - ! '>='
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: '0'
|
25
23
|
type: :runtime
|
26
|
-
version_requirements: *id001
|
27
|
-
- !ruby/object:Gem::Dependency
|
28
|
-
name: ruby_ext
|
29
24
|
prerelease: false
|
30
|
-
|
25
|
+
version_requirements: *3055160
|
26
|
+
- !ruby/object:Gem::Dependency
|
27
|
+
name: ruby_ext
|
28
|
+
requirement: &3054950 !ruby/object:Gem::Requirement
|
31
29
|
none: false
|
32
|
-
requirements:
|
33
|
-
- -
|
34
|
-
- !ruby/object:Gem::Version
|
35
|
-
version:
|
30
|
+
requirements:
|
31
|
+
- - ! '>='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
36
34
|
type: :runtime
|
37
|
-
|
38
|
-
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: *3054950
|
37
|
+
- !ruby/object:Gem::Dependency
|
39
38
|
name: vos
|
39
|
+
requirement: &3054750 !ruby/object:Gem::Requirement
|
40
|
+
none: false
|
41
|
+
requirements:
|
42
|
+
- - ! '>='
|
43
|
+
- !ruby/object:Gem::Version
|
44
|
+
version: '0'
|
45
|
+
type: :runtime
|
40
46
|
prerelease: false
|
41
|
-
|
47
|
+
version_requirements: *3054750
|
48
|
+
- !ruby/object:Gem::Dependency
|
49
|
+
name: class_loader
|
50
|
+
requirement: &3054550 !ruby/object:Gem::Requirement
|
42
51
|
none: false
|
43
|
-
requirements:
|
44
|
-
- -
|
45
|
-
- !ruby/object:Gem::Version
|
46
|
-
version:
|
52
|
+
requirements:
|
53
|
+
- - ! '>='
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: '0'
|
47
56
|
type: :runtime
|
48
|
-
|
57
|
+
prerelease: false
|
58
|
+
version_requirements: *3054550
|
49
59
|
description:
|
50
60
|
email:
|
51
61
|
executables: []
|
52
|
-
|
53
62
|
extensions: []
|
54
|
-
|
55
63
|
extra_rdoc_files: []
|
56
|
-
|
57
|
-
files:
|
64
|
+
files:
|
58
65
|
- Rakefile
|
59
66
|
- readme.md
|
67
|
+
- lib/cluster_management/cluster.rb
|
60
68
|
- lib/cluster_management/config.rb
|
61
69
|
- lib/cluster_management/gems.rb
|
62
70
|
- lib/cluster_management/integration/vfs.rb
|
63
71
|
- lib/cluster_management/integration/vos.rb
|
64
72
|
- lib/cluster_management/logger.rb
|
65
73
|
- lib/cluster_management/service.rb
|
74
|
+
- lib/cluster_management/support/exception.rb
|
66
75
|
- lib/cluster_management.rb
|
67
76
|
has_rdoc: true
|
68
77
|
homepage: http://github.com/alexeypetrushin/cluster_management
|
69
78
|
licenses: []
|
70
|
-
|
71
79
|
post_install_message:
|
72
80
|
rdoc_options: []
|
73
|
-
|
74
|
-
require_paths:
|
81
|
+
require_paths:
|
75
82
|
- lib
|
76
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
83
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
77
84
|
none: false
|
78
|
-
requirements:
|
79
|
-
- -
|
80
|
-
- !ruby/object:Gem::Version
|
81
|
-
version:
|
82
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
85
|
+
requirements:
|
86
|
+
- - ! '>='
|
87
|
+
- !ruby/object:Gem::Version
|
88
|
+
version: '0'
|
89
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
83
90
|
none: false
|
84
|
-
requirements:
|
85
|
-
- -
|
86
|
-
- !ruby/object:Gem::Version
|
87
|
-
version:
|
91
|
+
requirements:
|
92
|
+
- - ! '>='
|
93
|
+
- !ruby/object:Gem::Version
|
94
|
+
version: '0'
|
88
95
|
requirements: []
|
89
|
-
|
90
96
|
rubyforge_project:
|
91
97
|
rubygems_version: 1.5.1
|
92
98
|
signing_key:
|
93
99
|
specification_version: 3
|
94
|
-
summary: Simple
|
100
|
+
summary: Simple Cluster Management Tools
|
95
101
|
test_files: []
|
96
|
-
|