From 4bed6edde4b8ed4b94909eb79f5e9b3d24d7321c Mon Sep 17 00:00:00 2001 From: Scott Schneider Date: Mon, 1 Jun 2015 16:23:11 -0700 Subject: [PATCH 1/3] This implements regex-based tag filtering --- lib/vmpooler.rb | 6 ++++++ lib/vmpooler/api/v1.rb | 9 +++++++-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/lib/vmpooler.rb b/lib/vmpooler.rb index c7bf065..697a4c8 100644 --- a/lib/vmpooler.rb +++ b/lib/vmpooler.rb @@ -37,6 +37,12 @@ module Vmpooler parsed_config[:graphite]['prefix'] ||= 'vmpooler' end + if parsed_config[:tagfilter] + parsed_config[:tagfilter].keys.each do |tag| + parsed_config[:tagfilter][tag] = Regexp.new(parsed_config[:tagfilter][tag]) + end + end + parsed_config[:uptime] = Time.now parsed_config diff --git a/lib/vmpooler/api/v1.rb b/lib/vmpooler/api/v1.rb index d10bdc4..9bc2a37 100644 --- a/lib/vmpooler/api/v1.rb +++ b/lib/vmpooler/api/v1.rb @@ -542,8 +542,13 @@ module Vmpooler backend.hset('vmpooler__vm__' + params[:hostname], param, arg) when 'tags' arg.keys.each do |tag| - backend.hset('vmpooler__vm__' + params[:hostname], 'tag:' + tag, arg[tag]) - backend.hset('vmpooler__tag__' + Date.today.to_s, params[:hostname] + ':' + tag, arg[tag]) + if Vmpooler::API.settings.config[:tagfilter] and Vmpooler::API.settings.config[:tagfilter][tag] + filter = Vmpooler::API.settings.config[:tagfilter][tag] + arg[tag] = arg[tag].match(filter).captures.join + end + + backend.hset('vmpooler__vm__' + params[:hostname], 'tag:' + tag, arg[tag]) + backend.hset('vmpooler__tag__' + Date.today.to_s, params[:hostname] + ':' + tag, arg[tag]) end end end From 1ba1e0fc9b271df9fcc27ff21b2041ff10dd2346 Mon Sep 17 00:00:00 2001 From: Scott Schneider Date: Mon, 1 Jun 2015 17:52:21 -0700 Subject: [PATCH 2/3] Add example for tagfilter --- vmpooler.yaml.example | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/vmpooler.yaml.example b/vmpooler.yaml.example index 86d2047..dda99cc 100644 --- a/vmpooler.yaml.example +++ b/vmpooler.yaml.example @@ -106,6 +106,18 @@ base: 'ou=users,dc=company,dc=com' user_object: 'uid' +# :tagfilter: +# +# Filter tags by regular expression. + +# Example: +# +# This example demonstrates discarding everything after a '/' character for +# the 'url' tag, transforming 'foo.com/something.html' to 'foo.com'. + +:tagfilter: + url: '(.*)\/' + # :config: # # This section contains global configuration information. From 60819b9a7ef615188571448d7521c26d5c7366e1 Mon Sep 17 00:00:00 2001 From: Scott Schneider Date: Mon, 1 Jun 2015 18:09:04 -0700 Subject: [PATCH 3/3] Spec tests for tagfilter --- spec/vmpooler/api/v1_spec.rb | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/spec/vmpooler/api/v1_spec.rb b/spec/vmpooler/api/v1_spec.rb index 687c865..dfcea5f 100644 --- a/spec/vmpooler/api/v1_spec.rb +++ b/spec/vmpooler/api/v1_spec.rb @@ -332,6 +332,23 @@ describe Vmpooler::API::V1 do expect(last_response.status).to eq(400) end + context '(tagfilter configured)' do + let(:config) { { + tagfilter: { 'url' => '(.*)\/' }, + } } + + it 'correctly filters tags' do + expect(redis).to receive(:hset).with("vmpooler__vm__testhost", "tag:url", "foo.com") + + put "#{prefix}/vm/testhost", '{"tags":{"url":"foo.com/something.html"}}' + + expect(last_response).to be_ok + expect(last_response.header['Content-Type']).to eq('application/json') + expect(last_response.body).to eq(JSON.pretty_generate({'ok' => true})) + expect(last_response.status).to eq(200) + end + end + context '(auth not configured)' do let(:config) { { auth: false } }