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 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'