jenkins-bot has submitted this change and it was merged.
Change subject: Add Vagrant sub-commands for role management
......................................................................
Add Vagrant sub-commands for role management
This patch adds four new sub-commands to Vagrant for enabling,
disabling, and enumerating roles. They are:
$ vagrant list-roles -- list available & enabled roles.
$ vagrant enable-role -- enables a role.
$ vagrant disable-role -- disables a role.
$ vagrant reset-roles -- disable all roles.
Roles are managed using puppet/manifests/manifests.d/vagrant-managed.pp,
which is automatically generated (and re-generated) in response to the
sub-commands listed above.
I think that this approach is generally superior to using a YAML
manifest in conjunction with a node classifier, because it avoids
introducing another file format and configuration management subsystem
to the stack. The sub-commands for role management simply update a
Puppet file in manifests.d, which means that custom manifests in
manifests.d/ is the one canonical way of customizing the VM, and it is
up to the user to do so using the vagrant sub-commands or by manually
manipulating files in that directory.
Bug: 51271
Change-Id: I5598f93ac703976b9780f7575307a057a872aa51
---
M Vagrantfile
M lib/mediawiki-vagrant.rb
M lib/mediawiki-vagrant/helpers.rb
R lib/mediawiki-vagrant/paste-puppet.rb
D lib/mediawiki-vagrant/plugin.rb
A lib/mediawiki-vagrant/roles.rb
R lib/mediawiki-vagrant/run-tests.rb
M puppet/manifests/base.pp
8 files changed, 131 insertions(+), 21 deletions(-)
Approvals:
Ori.livneh: Looks good to me, approved
jenkins-bot: Verified
diff --git a/Vagrantfile b/Vagrantfile
index 8abaee6..f676e29 100644
--- a/Vagrantfile
+++ b/Vagrantfile
@@ -77,8 +77,6 @@
puppet.options = [
'--templatedir', '/vagrant/puppet/templates',
- '--node_terminus', 'exec',
- '--external_nodes', '/vagrant/puppet/extra/puppet-classifier',
'--verbose',
'--config_version', '/vagrant/puppet/extra/config-version',
'--logdest',
"/vagrant/logs/puppet/puppet.#{commit||'unknown'}.log",
diff --git a/lib/mediawiki-vagrant.rb b/lib/mediawiki-vagrant.rb
index 6c11c47..bc12241 100644
--- a/lib/mediawiki-vagrant.rb
+++ b/lib/mediawiki-vagrant.rb
@@ -1,2 +1,38 @@
require 'mediawiki-vagrant/helpers'
-require 'mediawiki-vagrant/plugin'
+
+module MediaWikiVagrant
+ class Plugin < Vagrant.plugin('2')
+ name 'MediaWiki-Vagrant'
+
+ command 'paste-puppet' do
+ require 'mediawiki-vagrant/paste-puppet'
+ PastePuppet
+ end
+
+ command 'run-tests' do
+ require 'mediawiki-vagrant/run-tests'
+ RunTests
+ end
+
+ command 'list-roles' do
+ require 'mediawiki-vagrant/roles'
+ ListRoles
+ end
+
+ command 'reset-roles' do
+ require 'mediawiki-vagrant/roles'
+ ResetRoles
+ end
+
+ command 'enable-role' do
+ require 'mediawiki-vagrant/roles'
+ EnableRole
+ end
+
+ command 'disable-role' do
+ require 'mediawiki-vagrant/roles'
+ DisableRole
+ end
+
+ end
+end
diff --git a/lib/mediawiki-vagrant/helpers.rb b/lib/mediawiki-vagrant/helpers.rb
index db4fb18..059aa1a 100644
--- a/lib/mediawiki-vagrant/helpers.rb
+++ b/lib/mediawiki-vagrant/helpers.rb
@@ -25,3 +25,28 @@
system('git fetch origin') if Time.now -
File.mtime("#{$DIR}/.git/FETCH_HEAD") > 604800 rescue nil
end
end
+
+
+$manifest_path = File.join $DIR, 'puppet/manifests'
+
+def roles_available
+ IO.readlines(File.join $manifest_path, 'roles.pp').map { |line|
+ /^[^#]*role::(\S+)/.match(line) and $1.tr(':', '#')
+ }.compact.sort.uniq - ['generic', 'mediawiki']
+end
+
+def roles_enabled
+ IO.readlines(File.join $manifest_path,
'manifests.d/vagrant-managed.pp').map { |line|
+ /^[^#]*include role::(\S+)/.match(line) and $1.tr(':', '#')
+ }.compact.sort.uniq rescue []
+end
+
+def update_roles(roles)
+ File.open(File.join($manifest_path, 'manifests.d/vagrant-managed.pp'),
'w') { |f|
+ f.puts '# This file is managed by Vagrant. Do not edit.'
+ f.puts '# Use "vagrant list-roles / enable-role / disable-role"
instead.'
+ f.puts roles.sort.uniq.map { |r|
+ "include role::#{r.gsub(/^role::/, '')}"
+ }.join("\n")
+ }
+end
diff --git a/lib/mediawiki-vagrant/commands/paste-puppet.rb
b/lib/mediawiki-vagrant/paste-puppet.rb
similarity index 100%
rename from lib/mediawiki-vagrant/commands/paste-puppet.rb
rename to lib/mediawiki-vagrant/paste-puppet.rb
diff --git a/lib/mediawiki-vagrant/plugin.rb b/lib/mediawiki-vagrant/plugin.rb
deleted file mode 100644
index 6989a97..0000000
--- a/lib/mediawiki-vagrant/plugin.rb
+++ /dev/null
@@ -1,13 +0,0 @@
-class MediaWikiVagrant < Vagrant.plugin('2')
- name 'MediaWiki-Vagrant'
-
- command 'paste-puppet' do
- require 'mediawiki-vagrant/commands/paste-puppet'
- PastePuppet
- end
-
- command 'run-tests' do
- require 'mediawiki-vagrant/commands/run-tests'
- RunTests
- end
-end
diff --git a/lib/mediawiki-vagrant/roles.rb b/lib/mediawiki-vagrant/roles.rb
new file mode 100644
index 0000000..2dd3aa4
--- /dev/null
+++ b/lib/mediawiki-vagrant/roles.rb
@@ -0,0 +1,69 @@
+module MediaWikiVagrant
+ class ListRoles < Vagrant.plugin(2, :command)
+ def execute
+ @env.ui.info "Available roles:\n\n"
+ enabled = roles_enabled
+ roles_available.each { |role|
+ prefix = enabled.include?(role) ? '*' : ' '
+ @env.ui.info "#{prefix} #{role}"
+ }
+ @env.ui.info "\nRoles marked with '*' are enabled."
+ @env.ui.info 'Use "vagrant enable-role" & "vagrant disable-role"
to customize.'
+ return 0
+ end
+ end
+
+ class EnableRole < Vagrant.plugin(2, :command)
+ def execute
+ if @argv.empty? or ['-h', '--help'].include? @argv.first
+ @env.ui.info 'Enable an optional role (run "vagrant
list-roles" for a list).'
+ @env.ui.info 'USAGE: vagrant enable-role ROLE'
+ return 0
+ end
+ avail = roles_available
+ @argv.each do |r|
+ if not avail.include? r
+ @env.ui.error "'#{r}' is not a valid role."
+ return 1
+ end
+ end
+ update_roles(roles_enabled + @argv)
+ @env.ui.info "Ok. Run 'vagrant provision' to commit your changes."
+ return 0
+ end
+ end
+
+ class DisableRole < Vagrant.plugin(2, :command)
+ def execute
+ if @argv.empty? or ['-h', '--help'].include? @argv.first
+ @env.ui.info 'Disable one or more optional roles.'
+ @env.ui.info 'USAGE: vagrant disable-role ROLE'
+ return 0
+ end
+ enabled = roles_enabled
+ @argv.each do |r|
+ if not enabled.include? r
+ @env.ui.error "'#{r}' is not enabled."
+ return 1
+ end
+ end
+ update_roles(enabled - @argv)
+ @env.ui.info "Ok."
+ return 0
+ end
+ end
+
+ class ResetRoles < Vagrant.plugin(2, :command)
+ def execute
+ if not @argv.empty? or ['-h', '--help'].include? @argv.first
+ @env.ui.info 'Disable all optional roles.'
+ @env.ui.info 'USAGE: vagrant reset-roles'
+ return 0
+ end
+ update_roles []
+ @env.ui.warn "All roles were disabled."
+ return 0
+ end
+ end
+
+end
diff --git a/lib/mediawiki-vagrant/commands/run-tests.rb
b/lib/mediawiki-vagrant/run-tests.rb
similarity index 100%
rename from lib/mediawiki-vagrant/commands/run-tests.rb
rename to lib/mediawiki-vagrant/run-tests.rb
diff --git a/puppet/manifests/base.pp b/puppet/manifests/base.pp
index 4d397f0..008b9db 100644
--- a/puppet/manifests/base.pp
+++ b/puppet/manifests/base.pp
@@ -50,9 +50,4 @@
ensure => present,
}
-exec { 'generate roles file':
- command => '/vagrant/puppet/extra/enumerate-roles > /vagrant/Roles',
- creates => '/vagrant/Roles',
-}
-
Package['python-pip'] -> Package <| provider == pip |>
--
To view, visit https://gerrit.wikimedia.org/r/76625
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: merged
Gerrit-Change-Id: I5598f93ac703976b9780f7575307a057a872aa51
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/vagrant
Gerrit-Branch: master
Gerrit-Owner: Ori.livneh <[email protected]>
Gerrit-Reviewer: Mattflaschen <[email protected]>
Gerrit-Reviewer: Ori.livneh <[email protected]>
Gerrit-Reviewer: Zaran <[email protected]>
Gerrit-Reviewer: jenkins-bot
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits