BryanDavis has uploaded a new change for review.

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

Change subject: Add command line tool to manage hiera settings
......................................................................

Add command line tool to manage hiera settings

Make managing hiera settings easier by providing a vagrant command to
add and delete settings in the vagrant-managed.yaml hiera file.

Change-Id: I2cf01b68897dbc9780fb92c8c8b13e4e32262920
---
M lib/mediawiki-vagrant.rb
M lib/mediawiki-vagrant/environment.rb
A lib/mediawiki-vagrant/hiera.rb
M lib/mediawiki-vagrant/version.rb
M puppet/hiera.yaml
5 files changed, 101 insertions(+), 13 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/mediawiki/vagrant 
refs/changes/05/157705/1

diff --git a/lib/mediawiki-vagrant.rb b/lib/mediawiki-vagrant.rb
index a0c7da2..3e06ce1 100644
--- a/lib/mediawiki-vagrant.rb
+++ b/lib/mediawiki-vagrant.rb
@@ -52,6 +52,11 @@
             ImportDump
         end
 
+        command 'hiera' do
+            require 'mediawiki-vagrant/hiera'
+            Hiera
+        end
+
         action_hook(self::ALL_ACTIONS) do |hook|
             require 'mediawiki-vagrant/middleware'
             hook.before(Vagrant::Action::Builtin::Provision, Middleware)
diff --git a/lib/mediawiki-vagrant/environment.rb 
b/lib/mediawiki-vagrant/environment.rb
index 051ffa9..ac96fa8 100644
--- a/lib/mediawiki-vagrant/environment.rb
+++ b/lib/mediawiki-vagrant/environment.rb
@@ -55,9 +55,10 @@
         #
         def roles_enabled
             migrate_roles
-            return [] unless hiera_data.exist?
 
-            hiera = hiera_data.open('r') { |io| YAML.load(io) }
+            hiera = hiera_load
+            return [] unless hiera.key?('classes')
+
             roles = hiera['classes'].map do |r|
                 r.match(/^role::(\S+)/) { |m| m[1] }
             end
@@ -67,17 +68,10 @@
         # Updates the enabled Puppet roles to the given set.
         #
         def update_roles(roles)
-            if hiera_data.exist?
-                hiera = hiera_data.open('r') { |io| YAML.load(io) }
-            else
-                hiera = {'classes' => []}
-            end
-            hiera['classes'] = roles.sort.uniq.map do |r|
+            classes = roles.sort.uniq.map do |r|
                 "role::#{r.sub(/^role::/, '')}"
             end
-
-            yaml = YAML.dump(hiera)
-            hiera_data.open('w') { |f| f.write(yaml) }
+            hiera_set('classes', classes)
         end
 
         # If it has been a week or more since remote commits have been fetched,
@@ -104,6 +98,26 @@
             FileUtils.rm_r Dir[path('settings.d/wikis')]
         end
 
+        def hiera_get(key)
+          hiera_load.key(key)
+        end
+
+        def hiera_set(key, value)
+            hiera = hiera_load
+            hiera[key] = value
+            hiera_save(hiera)
+        end
+
+        def hiera_delete(key)
+            if hiera_data.exist?
+                hiera = hiera_load
+                if hiera.key?(key)
+                    hiera.delete(key)
+                    hiera_save(hiera)
+                end
+            end
+        end
+
         private
 
         def module_path(*subpaths)
@@ -114,6 +128,15 @@
             path('puppet/hieradata/vagrant-managed.yaml')
         end
 
+        def hiera_load
+            return {} unless hiera_data.exist?
+            hiera_data.open('r') { |io| YAML.load(io) }
+        end
+
+        def hiera_save(data)
+            hiera_data.open('w') { |f| f.write(YAML.dump(data)) }
+        end
+
         def stale_head?
             head = path('.git/FETCH_HEAD')
             head.exist? && (Time.now - head.mtime) > STALENESS
diff --git a/lib/mediawiki-vagrant/hiera.rb b/lib/mediawiki-vagrant/hiera.rb
new file mode 100644
index 0000000..e37f040
--- /dev/null
+++ b/lib/mediawiki-vagrant/hiera.rb
@@ -0,0 +1,60 @@
+require "mediawiki-vagrant/plugin_environment"
+require "optparse"
+
+module MediaWikiVagrant
+    # Provides a command-line interface for configuration of hiera settings.
+    #
+    class Hiera < Vagrant.plugin(2, :command)
+        include PluginEnvironment
+
+        def self.synopsis
+            "configures hiera settings"
+        end
+
+        def execute
+            options = {
+                unset: [],
+            }
+
+            opts = OptionParser.new do |o|
+                o.banner = "Usage: vagrant hiera [options] [key] [value]"
+                o.separator ""
+                o.separator "Options:"
+                o.separator ""
+
+                o.on("--unset NAME", "Remove a configured key") do |name|
+                    options[:unset] << name
+                end
+            end
+
+            argv = parse_options(opts)
+            return if !argv
+
+            if options[:unset].any?
+                unset_key(options[:unset])
+            elsif argv.length == 2
+                set_key(*argv)
+            else
+                @env.ui.error opts
+                return 1
+            end
+
+            0
+        end
+
+        private
+
+        # Configures the given key with the given value.
+        #
+        def set_key(name, value)
+          @mwv.hiera_set(name, value)
+        end
+
+        # Unsets the given keys.
+        #
+        def unset_key(names)
+          names.each { |name| @mwv.hiera_delete(name) }
+        end
+    end
+end
+
diff --git a/lib/mediawiki-vagrant/version.rb b/lib/mediawiki-vagrant/version.rb
index 7975f6e..6c62800 100644
--- a/lib/mediawiki-vagrant/version.rb
+++ b/lib/mediawiki-vagrant/version.rb
@@ -1,3 +1,3 @@
 module MediaWikiVagrant
-    VERSION = '0.1.2'
+    VERSION = '0.1.3'
 end
diff --git a/puppet/hiera.yaml b/puppet/hiera.yaml
index ac28abd..974c96f 100644
--- a/puppet/hiera.yaml
+++ b/puppet/hiera.yaml
@@ -5,7 +5,7 @@
   :datadir: /vagrant/puppet/hieradata
 :hierarchy:
   - local
-  - "environment/%{::environment}"
   - vagrant-managed
+  - "environment/%{::environment}"
   - common
 :logger: console

-- 
To view, visit https://gerrit.wikimedia.org/r/157705
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I2cf01b68897dbc9780fb92c8c8b13e4e32262920
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/vagrant
Gerrit-Branch: master
Gerrit-Owner: BryanDavis <bda...@wikimedia.org>

_______________________________________________
MediaWiki-commits mailing list
MediaWiki-commits@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to