oscar 0.2.0alpha5 → 0.3.0
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/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