classify_cluster 0.0.1

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/.gitignore ADDED
@@ -0,0 +1,3 @@
1
+ pkg/*
2
+ *.gem
3
+ .bundle
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in classify_cluster.gemspec
4
+ gemspec
data/README ADDED
@@ -0,0 +1,5 @@
1
+ Classify Cluster
2
+
3
+ Useful if your wanting to have one location for specifying your capistrano and puppet configuration.
4
+
5
+ This is still extremely alpha, do not recommend use on production systems. More on documentation coming soon.
data/Rakefile ADDED
@@ -0,0 +1,2 @@
1
+ require 'bundler'
2
+ Bundler::GemHelper.install_tasks
data/bin/classify ADDED
@@ -0,0 +1,23 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "classify_cluster"
4
+ require "classify_cluster/version"
5
+ require "commander/import"
6
+ require 'yaml'
7
+
8
+ program :name, "Classify Cluster"
9
+ program :version, ClassifyCluster::VERSION
10
+ program :description, 'Generates configurations for different aspects of the cluster based off of one configuration.'
11
+ default_command :puppet
12
+
13
+ command :puppet do |c|
14
+ c.syntax = 'classify puppet <clustername> [options]'
15
+ c.description = 'Returns on STDOUT YAML dump of the clusters puppet config'
16
+ c.option '--config STRING', String, 'Location to config file.'
17
+ c.option '--export STRING', String, 'Location to output puppet cluster config'
18
+ c.action do |args, options|
19
+ options.default :config => ClassifyCluster::Base.default_config_file, :export => ENV['HOME']
20
+ ClassifyCluster::Writers::Puppet.export!(options.export, :cluster => args[0], :config_file => options.config)
21
+ say("Success!")
22
+ end
23
+ end
@@ -0,0 +1,23 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "classify_cluster/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "classify_cluster"
7
+ s.version = ClassifyCluster::VERSION
8
+ s.platform = Gem::Platform::RUBY
9
+ s.authors = ["Sean Cashin"]
10
+ s.email = ["sean@socialcast.com"]
11
+ s.homepage = "http://rubygems.org/gems/classify_cluster"
12
+ s.summary = %q{Contains several binaries for generating capistrano and puppet configurations}
13
+ s.description = %q{Reading from a YAML file will allow for consistent configuration between capistrano and puppet}
14
+ s.add_dependency(%q<commander>, ["= 4.0.3"])
15
+ s.add_dependency(%q<activesupport>, [">= 2.3.5"])
16
+
17
+ s.rubyforge_project = "classify_cluster"
18
+
19
+ s.files = `git ls-files`.split("\n")
20
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
21
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
22
+ s.require_paths = ["lib"]
23
+ end
@@ -0,0 +1,7 @@
1
+ module ClassifyCluster
2
+ class Base
3
+ def self.default_config_file
4
+ File.join('/etc', 'cluster.rb')
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,103 @@
1
+ module ClassifyCluster
2
+ module Configurator
3
+ class Configuration
4
+ attr_reader :clusters
5
+ def initialize(config_path)
6
+ @clusters = {}
7
+ eval File.open(config_path).read
8
+ end
9
+
10
+ def cluster(cluster_name, &block)
11
+ @clusters[cluster_name] = ClassifyCluster::Configurator::Cluster.new(cluster_name, &block)
12
+ end
13
+ end
14
+ class Cluster
15
+ attr_reader :nodes, :name
16
+ def initialize(*args, &block)
17
+ @nodes = {}
18
+ @name = args.first
19
+ block.call self
20
+ end
21
+ def name(value=nil)
22
+ return @name unless value
23
+ @name = value
24
+ end
25
+ def node(node_name, &block)
26
+ @nodes[node_name] = ClassifyCluster::Configurator::Node.new(node_name, &block)
27
+ end
28
+ end
29
+ class Node
30
+ attr_reader :fqdn, :variables, :resources, :classes, :public_ip, :private_ip, :roles, :default
31
+ def initialize(*args, &block)
32
+ @variables = {}
33
+ @resources = []
34
+ @classes = []
35
+ @roles = []
36
+ @fqdn = (args.first.to_s == 'default' ? '' : args.first)
37
+ @default = args.first.to_s == 'default'
38
+ block.call self
39
+ end
40
+ def default?
41
+ return @default
42
+ end
43
+ def fqdn(value=nil)
44
+ return @fqdn unless value
45
+ @fqdn = value
46
+ end
47
+ def public_ip(value = nil)
48
+ return @public_ip unless value
49
+ @public_ip = value
50
+ end
51
+ def private_ip(value = nil)
52
+ return @private_ip unless value
53
+ @private_ip = value
54
+ end
55
+ def role(&block)
56
+ @roles << ClassifyCluster::Configurator::Role.new(&block)
57
+ end
58
+ def variable(name, value)
59
+ @variables[name] = value
60
+ end
61
+ def resource(&block)
62
+ @resources << ClassifyCluster::Configurator::Resource.new(&block)
63
+ end
64
+ def klass(name)
65
+ @classes << name
66
+ end
67
+ end
68
+ class Resource
69
+ attr_reader :type, :name, :options
70
+ def initialize(*args, &block)
71
+ @options = {}
72
+ block.call self
73
+ end
74
+ def type(value = nil)
75
+ return @type unless value
76
+ @type = value
77
+ end
78
+ def name(value = nil)
79
+ return @name unless value
80
+ @name = value
81
+ end
82
+ def options(value = nil)
83
+ return @options unless value
84
+ @options = value
85
+ end
86
+ end
87
+ class Role
88
+ attr_reader :type, :options
89
+ def initialize(*args, &block)
90
+ @options = {}
91
+ block.call self
92
+ end
93
+ def type(value = nil)
94
+ return @type unless value
95
+ @type = value
96
+ end
97
+ def options(value = nil)
98
+ return @options unless value
99
+ @options = value
100
+ end
101
+ end
102
+ end
103
+ end
@@ -0,0 +1,3 @@
1
+ module ClassifyCluster
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,16 @@
1
+ module ClassifyCluster
2
+ module Writers
3
+ class Capistrano
4
+ def self.export!(capistrano_configurator, cluster, config_file=ClassifyCluster::Base.default_config_file)
5
+ config = ClassifyCluster::Configurator::Configuration.new(config_file).clusters[cluster]
6
+ config.nodes.each_pair do |name, node|
7
+ roles = node.roles
8
+ next if roles.empty?
9
+ roles.each do |role|
10
+ capistrano_configurator.role(role.type, node.public_ip, role.options)
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,39 @@
1
+ module ClassifyCluster
2
+ module Writers
3
+ class Puppet
4
+ def self.export!(export_to_folder, options={})
5
+ options.reverse_merge! :config_file => ClassifyCluster::Base.default_config_file
6
+ config = ClassifyCluster::Configurator::Configuration.new(options[:config_file])
7
+ config.clusters.each_pair do |name, cluster|
8
+ next if options[:cluster] && !(options[:cluster] == cluster.name.to_s)
9
+ File.open(File.join(export_to_folder, "#{cluster.name}.pp"), 'w') do |file|
10
+ cluster.nodes.each_pair do |fqdn, node|
11
+ file.write(output(%Q%node "#{node.default? ? 'default' : node.fqdn}" {%))
12
+ node.variables.each_pair do |key, value|
13
+ file.write(output("$#{key}=#{value.inspect}", :indent => 1))
14
+ end
15
+ node.resources.each do |resource|
16
+ file.write(output("#{resource.type} { #{resource.name.inspect}:", :indent => 1))
17
+ count = 0
18
+ resource.options.each_pair do |key, value|
19
+ file.write(output("#{key} => #{value.inspect}#{"," if count >= resource.options.size}", :indent => 2))
20
+ count += 1
21
+ end
22
+ file.write(output("}", :indent => 1))
23
+ end
24
+ node.classes.each do |klass|
25
+ file.write(output("include #{klass}", :indent => 1))
26
+ end
27
+ end
28
+ file.write(output("}"))
29
+ end
30
+ end; nil
31
+ end
32
+ private
33
+ def self.output(string, options={})
34
+ options.reverse_merge! :indent => 0
35
+ %Q%#{("\s" * 2) * options[:indent]}#{string}\n%
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,2 @@
1
+ require 'classify_cluster/writers/capistrano'
2
+ require 'classify_cluster/writers/puppet'
@@ -0,0 +1,5 @@
1
+ require 'yaml'
2
+ require 'active_support'
3
+ require 'classify_cluster/base'
4
+ require 'classify_cluster/configurator'
5
+ require 'classify_cluster/writers'
metadata ADDED
@@ -0,0 +1,111 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: classify_cluster
3
+ version: !ruby/object:Gem::Version
4
+ hash: 29
5
+ prerelease: false
6
+ segments:
7
+ - 0
8
+ - 0
9
+ - 1
10
+ version: 0.0.1
11
+ platform: ruby
12
+ authors:
13
+ - Sean Cashin
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2010-10-22 00:00:00 -07:00
19
+ default_executable:
20
+ dependencies:
21
+ - !ruby/object:Gem::Dependency
22
+ name: commander
23
+ prerelease: false
24
+ requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - "="
28
+ - !ruby/object:Gem::Version
29
+ hash: 57
30
+ segments:
31
+ - 4
32
+ - 0
33
+ - 3
34
+ version: 4.0.3
35
+ type: :runtime
36
+ version_requirements: *id001
37
+ - !ruby/object:Gem::Dependency
38
+ name: activesupport
39
+ prerelease: false
40
+ requirement: &id002 !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ">="
44
+ - !ruby/object:Gem::Version
45
+ hash: 9
46
+ segments:
47
+ - 2
48
+ - 3
49
+ - 5
50
+ version: 2.3.5
51
+ type: :runtime
52
+ version_requirements: *id002
53
+ description: Reading from a YAML file will allow for consistent configuration between capistrano and puppet
54
+ email:
55
+ - sean@socialcast.com
56
+ executables:
57
+ - classify
58
+ extensions: []
59
+
60
+ extra_rdoc_files: []
61
+
62
+ files:
63
+ - .gitignore
64
+ - Gemfile
65
+ - README
66
+ - Rakefile
67
+ - bin/classify
68
+ - classify_cluster.gemspec
69
+ - lib/classify_cluster.rb
70
+ - lib/classify_cluster/base.rb
71
+ - lib/classify_cluster/configurator.rb
72
+ - lib/classify_cluster/version.rb
73
+ - lib/classify_cluster/writers.rb
74
+ - lib/classify_cluster/writers/capistrano.rb
75
+ - lib/classify_cluster/writers/puppet.rb
76
+ has_rdoc: true
77
+ homepage: http://rubygems.org/gems/classify_cluster
78
+ licenses: []
79
+
80
+ post_install_message:
81
+ rdoc_options: []
82
+
83
+ require_paths:
84
+ - lib
85
+ required_ruby_version: !ruby/object:Gem::Requirement
86
+ none: false
87
+ requirements:
88
+ - - ">="
89
+ - !ruby/object:Gem::Version
90
+ hash: 3
91
+ segments:
92
+ - 0
93
+ version: "0"
94
+ required_rubygems_version: !ruby/object:Gem::Requirement
95
+ none: false
96
+ requirements:
97
+ - - ">="
98
+ - !ruby/object:Gem::Version
99
+ hash: 3
100
+ segments:
101
+ - 0
102
+ version: "0"
103
+ requirements: []
104
+
105
+ rubyforge_project: classify_cluster
106
+ rubygems_version: 1.3.7
107
+ signing_key:
108
+ specification_version: 3
109
+ summary: Contains several binaries for generating capistrano and puppet configurations
110
+ test_files: []
111
+