Ori.livneh has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/76625


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(-)


  git pull ssh://gerrit.wikimedia.org:29418/mediawiki/vagrant 
refs/changes/25/76625/1

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: newchange
Gerrit-Change-Id: I5598f93ac703976b9780f7575307a057a872aa51
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/vagrant
Gerrit-Branch: master
Gerrit-Owner: Ori.livneh <[email protected]>

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to