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 CHANGED
@@ -1,12 +1,9 @@
1
1
  CHANGELOG
2
2
  =========
3
3
 
4
- 0.2.0alpha1
5
- -----------
4
+ 0.3.0
5
+ -----
6
6
 
7
- * vagrant-hosts has been split out into an independent gem
8
- * Added Gemfile, gemspec.
9
- * Cleanup around validating and extracting the PE installer tarball
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.
@@ -1,17 +1,17 @@
1
-
2
1
  module Oscar
2
+ require 'oscar/version'
3
+ require 'oscar/plugin'
3
4
 
4
- def self.load!(directory)
5
- env = Oscar::Environment.new
6
- env.config.load! directory
7
- env.run!
5
+ def self.source_root
6
+ @source_root ||= File.expand_path('..', __FILE__)
7
+ end
8
8
 
9
- env
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
- require 'oscar/version'
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
@@ -0,0 +1,12 @@
1
+ require 'vagrant'
2
+
3
+ module Oscar
4
+ class Plugin < Vagrant.plugin('2')
5
+ name 'oscar'
6
+
7
+ command(:oscar) do
8
+ require_relative 'command'
9
+ Oscar::Command
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,13 @@
1
+
2
+ module Oscar
3
+ module Runner
4
+ def run(config_dir)
5
+ require 'vagrant-hosts'
6
+ require 'vagrant-pe_build'
7
+ require 'vagrant-auto_network'
8
+ require 'vagrant-config_builder'
9
+
10
+ ConfigBuilder.load(:yaml, :yamldir, config_dir)
11
+ end
12
+ end
13
+ end
@@ -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
@@ -1,3 +1,3 @@
1
1
  module Oscar
2
- VERSION = '0.2.0alpha5'
2
+ VERSION = '0.3.0'
3
3
  end
@@ -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', '~> 1.0.0'
21
- gem.add_dependency 'vagrant-hosts', '~> 0.0.1'
22
- gem.add_dependency 'vagrant-pe_build', '>= 0.0.1'
23
- gem.add_dependency 'kwalify', '~> 0.7.0'
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,4 @@
1
+ # -*- mode: ruby -*-
2
+ # vi: set ft=ruby :
3
+
4
+ Vagrant.configure('2', &Oscar.run(File.expand_path('../config', __FILE__)))
@@ -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.2.0alpha5
5
- prerelease: 5
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-04-18 00:00:00.000000000 Z
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: 0.0.1
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: 0.0.1
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.1
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.1
45
+ version: 0.3.0
62
46
  - !ruby/object:Gem::Dependency
63
- name: kwalify
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.7.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.7.0
61
+ version: 0.2.0
78
62
  - !ruby/object:Gem::Dependency
79
- name: ipaddress
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.8.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.8.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/config.rb
111
- - lib/oscar/environment.rb
112
- - lib/oscar/networking.rb
113
- - lib/oscar/node.rb
114
- - lib/oscar/schema.yaml
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: 1.3.1
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:
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
-
@@ -1,2 +0,0 @@
1
- require 'oscar'
2
- require 'pe_build'