oscar 0.2.0alpha5 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +5 -8
- data/lib/oscar.rb +11 -11
- data/lib/oscar/command.rb +38 -0
- data/lib/oscar/command/helpers.rb +35 -0
- data/lib/oscar/command/init.rb +38 -0
- data/lib/oscar/command/init_vms.rb +91 -0
- data/lib/oscar/plugin.rb +12 -0
- data/lib/oscar/runner.rb +13 -0
- data/lib/oscar/skeleton.rb +32 -0
- data/lib/oscar/version.rb +1 -1
- data/oscar.gemspec +4 -5
- data/templates/locales/en.yml +9 -0
- data/templates/oscar-init-skeleton/Vagrantfile +4 -0
- data/templates/oscar-init-skeleton/virtualbox/boxes.yaml +12 -0
- data/templates/oscar-init-skeleton/virtualbox/roles.yaml +19 -0
- metadata +33 -44
- data/lib/oscar/config.rb +0 -99
- data/lib/oscar/environment.rb +0 -28
- data/lib/oscar/networking.rb +0 -39
- data/lib/oscar/node.rb +0 -89
- data/lib/oscar/schema.yaml +0 -73
- data/lib/vagrant_init.rb +0 -2
data/CHANGELOG
CHANGED
@@ -1,12 +1,9 @@
|
|
1
1
|
CHANGELOG
|
2
2
|
=========
|
3
3
|
|
4
|
-
0.
|
5
|
-
|
4
|
+
0.3.0
|
5
|
+
-----
|
6
6
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
* Add support for autogenerated answers files.
|
11
|
-
* Perform the GRAND RENAMING from SoupKitchen to Oscar. It's the last
|
12
|
-
rename, I promise.
|
7
|
+
2013-08-18
|
8
|
+
|
9
|
+
First stable release of Oscar. All other releases are lies and deceit.
|
data/lib/oscar.rb
CHANGED
@@ -1,17 +1,17 @@
|
|
1
|
-
|
2
1
|
module Oscar
|
2
|
+
require 'oscar/version'
|
3
|
+
require 'oscar/plugin'
|
3
4
|
|
4
|
-
def self.
|
5
|
-
|
6
|
-
|
7
|
-
env.run!
|
5
|
+
def self.source_root
|
6
|
+
@source_root ||= File.expand_path('..', __FILE__)
|
7
|
+
end
|
8
8
|
|
9
|
-
|
9
|
+
def self.template_root
|
10
|
+
@template_root ||= File.expand_path('../templates', source_root)
|
10
11
|
end
|
12
|
+
|
13
|
+
require 'oscar/runner'
|
14
|
+
extend Oscar::Runner
|
11
15
|
end
|
12
16
|
|
13
|
-
|
14
|
-
require 'oscar/config'
|
15
|
-
require 'oscar/environment'
|
16
|
-
require 'oscar/networking'
|
17
|
-
require 'oscar/node'
|
17
|
+
I18n.load_path << File.join(Oscar.template_root, 'locales/en.yml')
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require 'vagrant'
|
2
|
+
module Oscar
|
3
|
+
class Command < Vagrant.plugin('2', :command)
|
4
|
+
|
5
|
+
require 'oscar/command/helpers'
|
6
|
+
include Oscar::Command::Helpers
|
7
|
+
|
8
|
+
require 'oscar/command/init'
|
9
|
+
require 'oscar/command/init_vms'
|
10
|
+
|
11
|
+
def initialize(argv, env)
|
12
|
+
@argv = argv
|
13
|
+
@env = env
|
14
|
+
@cmd_name = 'oscar'
|
15
|
+
|
16
|
+
split_argv
|
17
|
+
register_subcommands
|
18
|
+
end
|
19
|
+
|
20
|
+
def execute
|
21
|
+
invoke_subcommand
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
def register_subcommands
|
27
|
+
@subcommands = Vagrant::Registry.new
|
28
|
+
|
29
|
+
@subcommands.register('init') do
|
30
|
+
Oscar::Command::Init
|
31
|
+
end
|
32
|
+
|
33
|
+
@subcommands.register('init-vms') do
|
34
|
+
Oscar::Command::InitVMs
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module Oscar::Command::Helpers
|
2
|
+
|
3
|
+
private
|
4
|
+
|
5
|
+
def split_argv
|
6
|
+
@main_args, @subcommand, @sub_args = split_main_and_subcommand(@argv)
|
7
|
+
end
|
8
|
+
|
9
|
+
def invoke_subcommand
|
10
|
+
if @subcommand and (klass = @subcommands.get(@subcommand))
|
11
|
+
klass.new(@argv, @env).execute
|
12
|
+
elsif @subcommand
|
13
|
+
@env.ui.error "Unrecognized subcommand: #{@subcommand}"
|
14
|
+
print_subcommand_help(:error)
|
15
|
+
else
|
16
|
+
print_subcommand_help
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def print_subcommand_help(output = :info)
|
21
|
+
msg = []
|
22
|
+
msg << "Usage: vagrant #{@cmd_name} <command> [<args>]"
|
23
|
+
msg << ''
|
24
|
+
msg << 'Available subcommands:'
|
25
|
+
|
26
|
+
keys = []
|
27
|
+
@subcommands.each { |(key, _)| keys << key }
|
28
|
+
msg += keys.sort.map { |key| " #{key}" }
|
29
|
+
|
30
|
+
msg << ''
|
31
|
+
msg << "For help on any individual command run `vagrant #{@cmd_name} <command> -h`"
|
32
|
+
|
33
|
+
@env.ui.send(output, msg.join("\n"))
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require 'oscar/skeleton'
|
2
|
+
|
3
|
+
class Oscar::Command::Init < Vagrant.plugin('2', :command)
|
4
|
+
|
5
|
+
include Oscar::Command::Helpers
|
6
|
+
|
7
|
+
def initialize(argv, env)
|
8
|
+
@argv = argv
|
9
|
+
@env = env
|
10
|
+
@cmd_name = 'oscar init'
|
11
|
+
|
12
|
+
@provider = nil
|
13
|
+
|
14
|
+
split_argv
|
15
|
+
end
|
16
|
+
|
17
|
+
def execute
|
18
|
+
argv = parse_options(parser)
|
19
|
+
|
20
|
+
skeleton = Oscar::Skeleton.new(@env, @provider)
|
21
|
+
skeleton.generate
|
22
|
+
|
23
|
+
@env.ui.info I18n.t('oscar.command.init.default')
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
def parser
|
29
|
+
OptionParser.new do |o|
|
30
|
+
o.banner = "Usage: vagrant #{@cmd_name} [<args>]"
|
31
|
+
o.separator ''
|
32
|
+
|
33
|
+
o.on('-p', '--provider=val', String, 'The Vagrant provider type to template') do |val|
|
34
|
+
@provider = val
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,91 @@
|
|
1
|
+
require 'yaml'
|
2
|
+
|
3
|
+
class Oscar::Command::InitVMs < Vagrant.plugin('2', :command)
|
4
|
+
|
5
|
+
include Oscar::Command::Helpers
|
6
|
+
|
7
|
+
def initialize(argv, env)
|
8
|
+
@argv = argv
|
9
|
+
@env = env
|
10
|
+
@cmd_name = 'oscar init-vms'
|
11
|
+
|
12
|
+
|
13
|
+
@masters = []
|
14
|
+
@agents = []
|
15
|
+
@pe_version = '3.0.0' # @todo remove thingy
|
16
|
+
|
17
|
+
split_argv
|
18
|
+
end
|
19
|
+
|
20
|
+
def execute
|
21
|
+
argv = parse_options(parser)
|
22
|
+
|
23
|
+
config_dir = Pathname.new(File.join(Dir.getwd, 'config'))
|
24
|
+
|
25
|
+
vm_config_file = config_dir + 'vms.yaml'
|
26
|
+
pe_config_file = config_dir + 'pe_build.yaml'
|
27
|
+
|
28
|
+
config_dir.mkpath unless config_dir.exist?
|
29
|
+
|
30
|
+
vm_config_file.open('w') do |fh|
|
31
|
+
yaml = YAML.dump vms
|
32
|
+
fh.write(yaml)
|
33
|
+
end
|
34
|
+
|
35
|
+
pe_config_file.open('w') do |fh|
|
36
|
+
yaml = YAML.dump pe_build
|
37
|
+
fh.write(yaml)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
private
|
42
|
+
|
43
|
+
def parser
|
44
|
+
OptionParser.new do |o|
|
45
|
+
o.banner = "Usage: vagrant #{@cmd_name} [<args>]"
|
46
|
+
o.separator ''
|
47
|
+
|
48
|
+
o.on('-m', '--master=val', String, 'The name and basebox for a Puppet master') do |val|
|
49
|
+
name, box = val.split('=')
|
50
|
+
@masters << [name, box]
|
51
|
+
end
|
52
|
+
|
53
|
+
o.on('-a', '--agent=val', String, 'The name and basebox for a Puppet agent') do |val|
|
54
|
+
name, box = val.split('=')
|
55
|
+
@agents << [name, box]
|
56
|
+
end
|
57
|
+
|
58
|
+
o.on('-p', '--pe-version=val', String, 'The PE version to install on the VMs') do |val|
|
59
|
+
@pe_version = val
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
def vms
|
65
|
+
vm_list = []
|
66
|
+
|
67
|
+
|
68
|
+
|
69
|
+
vm_list += @masters.map do |(name, box)|
|
70
|
+
{
|
71
|
+
'name' => name,
|
72
|
+
'box' => box,
|
73
|
+
'roles' => ['pe-puppet-master']
|
74
|
+
}
|
75
|
+
end
|
76
|
+
|
77
|
+
vm_list += @agents.map do |(name, box)|
|
78
|
+
{
|
79
|
+
'name' => name,
|
80
|
+
'box' => box,
|
81
|
+
'roles' => ['pe-puppet-agent']
|
82
|
+
}
|
83
|
+
end
|
84
|
+
|
85
|
+
{'vms' => vm_list}
|
86
|
+
end
|
87
|
+
|
88
|
+
def pe_build
|
89
|
+
{'pe_build' => {'version' => @pe_version}}
|
90
|
+
end
|
91
|
+
end
|
data/lib/oscar/plugin.rb
ADDED
data/lib/oscar/runner.rb
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
|
3
|
+
module Oscar
|
4
|
+
class Skeleton
|
5
|
+
|
6
|
+
# @!attribute [r] provider
|
7
|
+
# @return [Symbol] The provider for the generated configuration
|
8
|
+
attr_reader :provider
|
9
|
+
|
10
|
+
# @!attribute [r]
|
11
|
+
# @return [Pathname] The path to the destination directory
|
12
|
+
attr_reader :dest_dir
|
13
|
+
|
14
|
+
# @param env [Vagrant::Environment]
|
15
|
+
# @param provider [Symbol]
|
16
|
+
def initialize(env, provider = nil)
|
17
|
+
@env = env
|
18
|
+
@provider = (provider || @env.default_provider)
|
19
|
+
@dest_dir = Pathname.new(Dir.getwd)
|
20
|
+
|
21
|
+
@template_root = File.join(Oscar.template_root, 'oscar-init-skeleton')
|
22
|
+
end
|
23
|
+
|
24
|
+
def generate
|
25
|
+
vagrantfile = File.join(@template_root, 'Vagrantfile')
|
26
|
+
config_dir = File.join(@template_root, @provider.to_s, '.')
|
27
|
+
|
28
|
+
FileUtils.cp vagrantfile, @dest_dir
|
29
|
+
FileUtils.cp_r config_dir, File.join(@dest_dir, 'config')
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
data/lib/oscar/version.rb
CHANGED
data/oscar.gemspec
CHANGED
@@ -17,11 +17,10 @@ Gem::Specification.new do |gem|
|
|
17
17
|
gem.email = 'adrien@somethingsinistral.net'
|
18
18
|
gem.homepage = 'https://github.com/adrienthebo/oscar'
|
19
19
|
|
20
|
-
gem.add_dependency 'vagrant', '
|
21
|
-
gem.add_dependency 'vagrant-
|
22
|
-
gem.add_dependency 'vagrant-
|
23
|
-
gem.add_dependency '
|
24
|
-
gem.add_dependency 'ipaddress', '~> 0.8.0'
|
20
|
+
gem.add_dependency 'vagrant-hosts', '>= 1.1.2'
|
21
|
+
gem.add_dependency 'vagrant-pe_build', '>= 0.3.0'
|
22
|
+
gem.add_dependency 'vagrant-auto_network', '>= 0.2.0'
|
23
|
+
gem.add_dependency 'vagrant-config_builder', '>= 0.1.0'
|
25
24
|
|
26
25
|
gem.files = %x{git ls-files -z}.split("\0")
|
27
26
|
gem.require_path = 'lib'
|
@@ -0,0 +1,9 @@
|
|
1
|
+
---
|
2
|
+
en:
|
3
|
+
oscar:
|
4
|
+
command:
|
5
|
+
init:
|
6
|
+
default: |-
|
7
|
+
A stub Vagrantfile has been placed in this directory and default configurations
|
8
|
+
have been placed into the `config` directory. You can now run `vagrant up` to start
|
9
|
+
your Oscar built environment, courtesy of Vagrant.
|
@@ -0,0 +1,12 @@
|
|
1
|
+
---
|
2
|
+
# Boxes from http://puppet-vagrant-boxes.puppetlabs.com/
|
3
|
+
# Updated: 2013-08-08
|
4
|
+
boxes:
|
5
|
+
'fedora-18-x64-vbox4210-nocm': 'http://puppet-vagrant-boxes.puppetlabs.com/fedora-18-x64-vbox4210-nocm.box'
|
6
|
+
'centos-64-x64-vbox4210-nocm': 'http://puppet-vagrant-boxes.puppetlabs.com/centos-64-x64-vbox4210-nocm.box'
|
7
|
+
'centos-59-x64-vbox4210-nocm': 'http://puppet-vagrant-boxes.puppetlabs.com/centos-59-x64-vbox4210-nocm.box'
|
8
|
+
'debian-607-x64-vbox4210-nocm': 'http://puppet-vagrant-boxes.puppetlabs.com/debian-607-x64-vbox4210-nocm.box'
|
9
|
+
'debian-70rc1-x64-vbox4210-nocm': 'http://puppet-vagrant-boxes.puppetlabs.com/debian-70rc1-x64-vbox4210-nocm.box'
|
10
|
+
'sles-11sp1-x64-vbox4210-nocm': 'http://puppet-vagrant-boxes.puppetlabs.com/sles-11sp1-x64-vbox4210-nocm.box'
|
11
|
+
'ubuntu-server-10044-x64-vbox4210-nocm': 'http://puppet-vagrant-boxes.puppetlabs.com/ubuntu-server-10044-x64-vbox4210-nocm.box'
|
12
|
+
'ubuntu-server-12042-x64-vbox4210-nocm': 'http://puppet-vagrant-boxes.puppetlabs.com/ubuntu-server-12042-x64-vbox4210-nocm.box'
|
@@ -0,0 +1,19 @@
|
|
1
|
+
---
|
2
|
+
roles:
|
3
|
+
pe-puppet-master:
|
4
|
+
private_networks:
|
5
|
+
- {auto_network: true}
|
6
|
+
provider:
|
7
|
+
type: virtualbox
|
8
|
+
customize:
|
9
|
+
- [modifyvm, !ruby/sym id, '--memory', 1024]
|
10
|
+
provisioners:
|
11
|
+
- {type: hosts}
|
12
|
+
- {type: pe_bootstrap, role: !ruby/sym master}
|
13
|
+
|
14
|
+
pe-puppet-agent:
|
15
|
+
private_networks:
|
16
|
+
- {auto_network: true}
|
17
|
+
provisioners:
|
18
|
+
- {type: hosts}
|
19
|
+
- {type: pe_bootstrap}
|
metadata
CHANGED
@@ -1,48 +1,32 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: oscar
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
5
|
-
prerelease:
|
4
|
+
version: 0.3.0
|
5
|
+
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Adrien Thebo
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-
|
12
|
+
date: 2013-08-18 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
|
-
- !ruby/object:Gem::Dependency
|
15
|
-
name: vagrant
|
16
|
-
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
|
-
requirements:
|
19
|
-
- - ~>
|
20
|
-
- !ruby/object:Gem::Version
|
21
|
-
version: 1.0.0
|
22
|
-
type: :runtime
|
23
|
-
prerelease: false
|
24
|
-
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
|
-
requirements:
|
27
|
-
- - ~>
|
28
|
-
- !ruby/object:Gem::Version
|
29
|
-
version: 1.0.0
|
30
14
|
- !ruby/object:Gem::Dependency
|
31
15
|
name: vagrant-hosts
|
32
16
|
requirement: !ruby/object:Gem::Requirement
|
33
17
|
none: false
|
34
18
|
requirements:
|
35
|
-
- -
|
19
|
+
- - ! '>='
|
36
20
|
- !ruby/object:Gem::Version
|
37
|
-
version:
|
21
|
+
version: 1.1.2
|
38
22
|
type: :runtime
|
39
23
|
prerelease: false
|
40
24
|
version_requirements: !ruby/object:Gem::Requirement
|
41
25
|
none: false
|
42
26
|
requirements:
|
43
|
-
- -
|
27
|
+
- - ! '>='
|
44
28
|
- !ruby/object:Gem::Version
|
45
|
-
version:
|
29
|
+
version: 1.1.2
|
46
30
|
- !ruby/object:Gem::Dependency
|
47
31
|
name: vagrant-pe_build
|
48
32
|
requirement: !ruby/object:Gem::Requirement
|
@@ -50,7 +34,7 @@ dependencies:
|
|
50
34
|
requirements:
|
51
35
|
- - ! '>='
|
52
36
|
- !ruby/object:Gem::Version
|
53
|
-
version: 0.0
|
37
|
+
version: 0.3.0
|
54
38
|
type: :runtime
|
55
39
|
prerelease: false
|
56
40
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -58,39 +42,39 @@ dependencies:
|
|
58
42
|
requirements:
|
59
43
|
- - ! '>='
|
60
44
|
- !ruby/object:Gem::Version
|
61
|
-
version: 0.0
|
45
|
+
version: 0.3.0
|
62
46
|
- !ruby/object:Gem::Dependency
|
63
|
-
name:
|
47
|
+
name: vagrant-auto_network
|
64
48
|
requirement: !ruby/object:Gem::Requirement
|
65
49
|
none: false
|
66
50
|
requirements:
|
67
|
-
- -
|
51
|
+
- - ! '>='
|
68
52
|
- !ruby/object:Gem::Version
|
69
|
-
version: 0.
|
53
|
+
version: 0.2.0
|
70
54
|
type: :runtime
|
71
55
|
prerelease: false
|
72
56
|
version_requirements: !ruby/object:Gem::Requirement
|
73
57
|
none: false
|
74
58
|
requirements:
|
75
|
-
- -
|
59
|
+
- - ! '>='
|
76
60
|
- !ruby/object:Gem::Version
|
77
|
-
version: 0.
|
61
|
+
version: 0.2.0
|
78
62
|
- !ruby/object:Gem::Dependency
|
79
|
-
name:
|
63
|
+
name: vagrant-config_builder
|
80
64
|
requirement: !ruby/object:Gem::Requirement
|
81
65
|
none: false
|
82
66
|
requirements:
|
83
|
-
- -
|
67
|
+
- - ! '>='
|
84
68
|
- !ruby/object:Gem::Version
|
85
|
-
version: 0.
|
69
|
+
version: 0.1.0
|
86
70
|
type: :runtime
|
87
71
|
prerelease: false
|
88
72
|
version_requirements: !ruby/object:Gem::Requirement
|
89
73
|
none: false
|
90
74
|
requirements:
|
91
|
-
- -
|
75
|
+
- - ! '>='
|
92
76
|
- !ruby/object:Gem::Version
|
93
|
-
version: 0.
|
77
|
+
version: 0.1.0
|
94
78
|
description: ! " Oscar is a series of extensions to simplify building out a Puppet
|
95
79
|
Enterprise\n environment. It handles networking configuration and fetching/installing\n
|
96
80
|
\ Puppet Enterprise.\n"
|
@@ -105,16 +89,20 @@ files:
|
|
105
89
|
- LICENSE
|
106
90
|
- README.markdown
|
107
91
|
- config/.gitignore
|
108
|
-
- config/roles.yaml.dist
|
109
92
|
- lib/oscar.rb
|
110
|
-
- lib/oscar/
|
111
|
-
- lib/oscar/
|
112
|
-
- lib/oscar/
|
113
|
-
- lib/oscar/
|
114
|
-
- lib/oscar/
|
93
|
+
- lib/oscar/command.rb
|
94
|
+
- lib/oscar/command/helpers.rb
|
95
|
+
- lib/oscar/command/init.rb
|
96
|
+
- lib/oscar/command/init_vms.rb
|
97
|
+
- lib/oscar/plugin.rb
|
98
|
+
- lib/oscar/runner.rb
|
99
|
+
- lib/oscar/skeleton.rb
|
115
100
|
- lib/oscar/version.rb
|
116
|
-
- lib/vagrant_init.rb
|
117
101
|
- oscar.gemspec
|
102
|
+
- templates/locales/en.yml
|
103
|
+
- templates/oscar-init-skeleton/Vagrantfile
|
104
|
+
- templates/oscar-init-skeleton/virtualbox/boxes.yaml
|
105
|
+
- templates/oscar-init-skeleton/virtualbox/roles.yaml
|
118
106
|
homepage: https://github.com/adrienthebo/oscar
|
119
107
|
licenses: []
|
120
108
|
post_install_message:
|
@@ -130,9 +118,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
130
118
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
131
119
|
none: false
|
132
120
|
requirements:
|
133
|
-
- - ! '
|
121
|
+
- - ! '>='
|
134
122
|
- !ruby/object:Gem::Version
|
135
|
-
version:
|
123
|
+
version: '0'
|
136
124
|
requirements: []
|
137
125
|
rubyforge_project:
|
138
126
|
rubygems_version: 1.8.23
|
@@ -140,3 +128,4 @@ signing_key:
|
|
140
128
|
specification_version: 3
|
141
129
|
summary: Easy mode Puppet Enterprise provisioning
|
142
130
|
test_files: []
|
131
|
+
has_rdoc:
|
data/lib/oscar/config.rb
DELETED
@@ -1,99 +0,0 @@
|
|
1
|
-
require 'oscar'
|
2
|
-
require 'yaml'
|
3
|
-
require 'kwalify'
|
4
|
-
|
5
|
-
class Oscar::Config
|
6
|
-
|
7
|
-
attr_reader :data
|
8
|
-
|
9
|
-
def initialize
|
10
|
-
@data = {}
|
11
|
-
|
12
|
-
schema_path = File.expand_path(File.join(File.dirname(__FILE__), 'schema.yaml'))
|
13
|
-
schema = YAML.load_file schema_path
|
14
|
-
validator = Kwalify::Validator.new(schema)
|
15
|
-
@parser = Kwalify::Yaml::Parser.new(validator)
|
16
|
-
end
|
17
|
-
|
18
|
-
def load!(searchpath)
|
19
|
-
files = ['config.yaml', 'config'].map { |m| "#{searchpath}/#{m}" }
|
20
|
-
load_all files
|
21
|
-
|
22
|
-
raise "No configuration loaded" if @data.nil? or @data.empty?
|
23
|
-
end
|
24
|
-
|
25
|
-
# Recursively load any YAML files contained in the given paths.
|
26
|
-
def load_all(*paths)
|
27
|
-
paths.flatten.each do |path|
|
28
|
-
if File.file?(path) and path.match /\.yaml$/
|
29
|
-
load_file(path)
|
30
|
-
elsif File.directory? path
|
31
|
-
load_all Dir["#{path}/*"]
|
32
|
-
#else
|
33
|
-
# warn "#{path} is neither a YAML file nor a directory, ignoring it."
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
# Load YAML from a file and merge it into the aggregated YAML
|
39
|
-
#
|
40
|
-
# @raise [TypeError] If the YAML in a given file does not match the configuration schema
|
41
|
-
def load_file(filename)
|
42
|
-
localdata = @parser.parse_file(filename)
|
43
|
-
errors = @parser.errors
|
44
|
-
|
45
|
-
if (errors and not errors.empty?)
|
46
|
-
errors.each do |err|
|
47
|
-
puts "#{filename} line #{err.linenum}, column #{err.column}, [kwalify path #{err.path}] #{err.message}"
|
48
|
-
end
|
49
|
-
raise TypeError
|
50
|
-
else
|
51
|
-
@data.merge!(localdata)
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
|
-
# Collects all node configuration as an array of the node structured data.
|
56
|
-
#
|
57
|
-
# @return [Array<Hash<String, String>>]
|
58
|
-
def all_node_configs
|
59
|
-
names = @data["nodes"].map { |h| h['name'] }
|
60
|
-
names.map { |n| node_config(n) }
|
61
|
-
end
|
62
|
-
|
63
|
-
# Provides the structured data representation of a node.
|
64
|
-
#
|
65
|
-
# Configuration priority is 'profile' -> 'role' -> 'node'
|
66
|
-
#
|
67
|
-
# @param [String] name The name of the node to fetch
|
68
|
-
#
|
69
|
-
# @return [Hash<String, String>]
|
70
|
-
def node_config(node_name)
|
71
|
-
config = {}
|
72
|
-
|
73
|
-
unless (node_hash = @data['nodes'].find { |h| h['name'] == node_name })
|
74
|
-
raise "Node configuration for #{node_name} not found"
|
75
|
-
end
|
76
|
-
|
77
|
-
# Check to see if the node has a profile or role. If one of those values
|
78
|
-
# do exist, try to lookup that data and merge it into the config hash.
|
79
|
-
['profile', 'role'].each do |type|
|
80
|
-
plural_type = "#{type}s"
|
81
|
-
|
82
|
-
type_name = node_hash[type] # Check to see if we have the requested type
|
83
|
-
if (type_name and type_hash = @data[plural_type].find { |t| t['name'] == type_name })
|
84
|
-
# The requested type exists in the node hash, and we were able to lookup
|
85
|
-
# the related configuration.
|
86
|
-
config.merge! type_hash
|
87
|
-
else
|
88
|
-
# The requested type exists in the node hash, but we were not able to
|
89
|
-
# lookup the related configuraion; die messily.
|
90
|
-
raise %{#{type.capitalize} configuration "#{type}" for #{node_name} not found}
|
91
|
-
end
|
92
|
-
end
|
93
|
-
|
94
|
-
# Merge the node hash last so that it takes precedence
|
95
|
-
config.merge! node_hash
|
96
|
-
|
97
|
-
config
|
98
|
-
end
|
99
|
-
end
|
data/lib/oscar/environment.rb
DELETED
@@ -1,28 +0,0 @@
|
|
1
|
-
require 'oscar'
|
2
|
-
|
3
|
-
class Oscar::Environment
|
4
|
-
attr_reader :networking
|
5
|
-
attr_reader :config
|
6
|
-
|
7
|
-
def initialize
|
8
|
-
@config = Oscar::Config.new
|
9
|
-
@nodes = []
|
10
|
-
end
|
11
|
-
|
12
|
-
def run!
|
13
|
-
@networking = Oscar::Networking.new(@config.data["networking"])
|
14
|
-
nodes = @config.all_node_configs
|
15
|
-
|
16
|
-
# TODO make sure that the master is provisioned before any agents.
|
17
|
-
nodes.each do |node_attrs|
|
18
|
-
node = Oscar::Node.new(node_attrs)
|
19
|
-
@networking.register(node)
|
20
|
-
|
21
|
-
@nodes << node
|
22
|
-
end
|
23
|
-
|
24
|
-
Vagrant::Config.run do |config|
|
25
|
-
@nodes.each { |node| node.define(config) }
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
data/lib/oscar/networking.rb
DELETED
@@ -1,39 +0,0 @@
|
|
1
|
-
require 'oscar'
|
2
|
-
require 'ipaddress'
|
3
|
-
|
4
|
-
class Oscar::Networking
|
5
|
-
|
6
|
-
def initialize(yaml_config)
|
7
|
-
|
8
|
-
range = yaml_config["pool"]
|
9
|
-
@domainname = yaml_config["domainname"]
|
10
|
-
@network = IPAddress.parse(range)
|
11
|
-
|
12
|
-
@pool = []
|
13
|
-
@nodes = {}
|
14
|
-
|
15
|
-
@network.each_host { |h| @pool << h }
|
16
|
-
@iterator = @pool.each
|
17
|
-
|
18
|
-
end
|
19
|
-
|
20
|
-
def register(node)
|
21
|
-
next_addr = @iterator.next.to_s
|
22
|
-
|
23
|
-
node.networking = self
|
24
|
-
node.address = next_addr
|
25
|
-
|
26
|
-
@nodes[next_addr] = node
|
27
|
-
end
|
28
|
-
|
29
|
-
def hosts_for(node)
|
30
|
-
arr = []
|
31
|
-
|
32
|
-
arr << ['127.0.0.1', ['localhost']]
|
33
|
-
arr << ['127.0.1.1', ["#{node.name}.#{@domainname}", node.name]]
|
34
|
-
|
35
|
-
@nodes.each_pair { |address, n| arr << [address, [n.name, "#{n.name}.#{@domainname}"]] }
|
36
|
-
|
37
|
-
arr
|
38
|
-
end
|
39
|
-
end
|
data/lib/oscar/node.rb
DELETED
@@ -1,89 +0,0 @@
|
|
1
|
-
require 'oscar'
|
2
|
-
require 'vagrant'
|
3
|
-
|
4
|
-
require 'vagrant-hosts'
|
5
|
-
|
6
|
-
class Oscar::Node
|
7
|
-
|
8
|
-
class << self
|
9
|
-
def addrole(name, &block)
|
10
|
-
@roles ||= {}
|
11
|
-
@roles[name] = block
|
12
|
-
end
|
13
|
-
|
14
|
-
def getrole(name)
|
15
|
-
@roles[name] if @roles
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
addrole(:base) do |node|
|
20
|
-
node.vm.box = @boxname
|
21
|
-
|
22
|
-
if @forwards
|
23
|
-
@forwards.each { |h| node.vm.forward_port h["source"], h["dest"] }
|
24
|
-
end
|
25
|
-
|
26
|
-
node.vm.network :hostonly, @address
|
27
|
-
# Add in optional per-node configuration
|
28
|
-
node.vm.box_url = @boxurl if @boxurl
|
29
|
-
node.vm.boot_mode = @gui if @gui
|
30
|
-
|
31
|
-
host_entries = @networking.hosts_for(self)
|
32
|
-
|
33
|
-
node.vm.provision :hosts do |provisioner|
|
34
|
-
host_entries.each { |(address, aliases)| provisioner.add_host address, aliases }
|
35
|
-
provisioner.add_ipv6_multicast
|
36
|
-
end
|
37
|
-
|
38
|
-
node.vm.provision :puppet_enterprise_bootstrap do |pe|
|
39
|
-
pe.role = @role if @role
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
addrole(:master) do |node|
|
44
|
-
# Manifests and modules need to be mounted on the master via shared folders,
|
45
|
-
# but the default /vagrant mount has permissions and ownership that conflicts
|
46
|
-
# with the master and pe-puppet. We mount these folders separately with
|
47
|
-
# loosened permissions.
|
48
|
-
node.vm.share_folder 'manifests', '/manifests', './manifests', :extra => 'fmode=644,dmode=755,fmask=022,dmask=022'
|
49
|
-
node.vm.share_folder 'modules', '/modules', './modules', :extra => 'fmode=644,dmode=755,fmask=022,dmask=022'
|
50
|
-
|
51
|
-
# Boost RAM for the master so that activemq doesn't asplode
|
52
|
-
node.vm.customize([ "modifyvm", :id, "--memory", "1024" ])
|
53
|
-
end
|
54
|
-
|
55
|
-
attr_accessor :address
|
56
|
-
attr_writer :networking # Callback attribute for retrieving hosts
|
57
|
-
|
58
|
-
attr_reader :name, :boxname, :boxurl, :role
|
59
|
-
attr_reader :forwards # really?
|
60
|
-
|
61
|
-
def initialize(yaml_attrs)
|
62
|
-
@attrs = yaml_attrs
|
63
|
-
|
64
|
-
@name = @attrs["name"]
|
65
|
-
@address = @attrs["address"]
|
66
|
-
@role = @attrs["role"].intern if @attrs["role"]
|
67
|
-
|
68
|
-
@boxurl = @attrs["boxurl"]
|
69
|
-
@boxname = @attrs["boxname"]
|
70
|
-
@forwards = @attrs["forwards"]
|
71
|
-
@gui = @attrs["gui"]
|
72
|
-
end
|
73
|
-
|
74
|
-
def define(config)
|
75
|
-
|
76
|
-
blk = lambda do |config|
|
77
|
-
config.vm.define @name do |node|
|
78
|
-
|
79
|
-
instance_exec(node, &(self.class.getrole(:base)))
|
80
|
-
|
81
|
-
if (blk = self.class.getrole(@role))
|
82
|
-
instance_exec(node, &blk)
|
83
|
-
end
|
84
|
-
end
|
85
|
-
end
|
86
|
-
|
87
|
-
blk.call(config)
|
88
|
-
end
|
89
|
-
end
|
data/lib/oscar/schema.yaml
DELETED
@@ -1,73 +0,0 @@
|
|
1
|
-
---
|
2
|
-
# Oscar kwalify schema
|
3
|
-
|
4
|
-
type: map
|
5
|
-
mapping:
|
6
|
-
|
7
|
-
"nodes":
|
8
|
-
type: seq
|
9
|
-
sequence:
|
10
|
-
-
|
11
|
-
type: map
|
12
|
-
mapping:
|
13
|
-
"name": { required: true }
|
14
|
-
"address": { required: false }
|
15
|
-
|
16
|
-
"boxname": &boxname
|
17
|
-
type: str
|
18
|
-
"boxurl": &boxurl
|
19
|
-
type: str
|
20
|
-
"role":
|
21
|
-
desc: "A node can have a role, that adds specific configuration for how it is going to be used."
|
22
|
-
type: str
|
23
|
-
enum: ["master", "console", "agent"]
|
24
|
-
default: "agent"
|
25
|
-
|
26
|
-
"profile":
|
27
|
-
desc: "A node can have a profile, which describes where the box came from."
|
28
|
-
type: str
|
29
|
-
"forwards": &forwards
|
30
|
-
type: seq
|
31
|
-
sequence:
|
32
|
-
-
|
33
|
-
type: map
|
34
|
-
mapping:
|
35
|
-
"source":
|
36
|
-
type: int
|
37
|
-
required: true
|
38
|
-
"dest":
|
39
|
-
type: int
|
40
|
-
required: true
|
41
|
-
|
42
|
-
"profiles":
|
43
|
-
desc: "A profile describes a box type, so what name it is and where to retrieve it from."
|
44
|
-
type: seq
|
45
|
-
sequence:
|
46
|
-
-
|
47
|
-
type: map
|
48
|
-
mapping:
|
49
|
-
"name":
|
50
|
-
required: true
|
51
|
-
"boxname": *boxname
|
52
|
-
"boxurl": *boxurl
|
53
|
-
|
54
|
-
|
55
|
-
"roles":
|
56
|
-
desc: "A role is the configuration needed for a node to do a specific role."
|
57
|
-
type: seq
|
58
|
-
sequence:
|
59
|
-
-
|
60
|
-
type: map
|
61
|
-
mapping:
|
62
|
-
name: { required: true }
|
63
|
-
"forwards": *forwards
|
64
|
-
|
65
|
-
# Network configuration for oscar, not applicable to any node.
|
66
|
-
"networking":
|
67
|
-
type: map
|
68
|
-
mapping:
|
69
|
-
"pool":
|
70
|
-
required: true
|
71
|
-
"domainname":
|
72
|
-
required: true
|
73
|
-
|
data/lib/vagrant_init.rb
DELETED