From 27e46c1f2cd010810899abeb12d58a87a6cc8985 Mon Sep 17 00:00:00 2001 From: tphoney Date: Tue, 3 Oct 2017 18:16:59 +0100 Subject: [PATCH] FM-6474 Adding an Apt task. --- CHANGELOG.md | 8 +++++ README.md | 5 ++++ metadata.json | 2 +- spec/acceptance/init_task_spec.rb | 11 +++++++ spec/spec_helper_acceptance.rb | 50 +++++++++++++++++++++++++++++++ tasks/init.json | 10 +++++++ tasks/init.rb | 24 +++++++++++++++ 7 files changed, 109 insertions(+), 1 deletion(-) create mode 100644 spec/acceptance/init_task_spec.rb create mode 100644 tasks/init.json create mode 100755 tasks/init.rb diff --git a/CHANGELOG.md b/CHANGELOG.md index b23cd91..202e70a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](http://semver.org). +## Supported Release [4.3.0] +### Summary + +This release is adding Tasks to the apt module. + +#### Added +- Add a task that allows apt-get update and upgrade + ## Supported Release [4.2.0] ### Summary diff --git a/README.md b/README.md index efea963..7c7a7b3 100644 --- a/README.md +++ b/README.md @@ -20,6 +20,7 @@ * [Defined Types](#defined-types) * [Types](#types) * [Facts](#facts) + * [Tasks](#tasks) 6. [Limitations - OS compatibility, etc.](#limitations) 7. [Development - Guide for contributing to the module](#development) @@ -264,6 +265,10 @@ apt::source { "archive.ubuntu.com-${lsbdistcodename}-backports": * `apt_reboot_required`: Determines if a reboot is necessary after updates have been installed. +### Tasks + +The Apt module has an example task that allows a user to run apt-get update or upgrade. Please refer to to the [PE documentation](https://puppet.com/docs/pe/2017.3/orchestrator/running_tasks.html) or [Bolt documentation](https://puppet.com/docs/bolt/latest/bolt.html) on how to execute a task. + #### Class: `apt` Main class, includes all other classes. diff --git a/metadata.json b/metadata.json index 19faaba..85854dd 100644 --- a/metadata.json +++ b/metadata.json @@ -1,6 +1,6 @@ { "name": "puppetlabs-apt", - "version": "4.2.0", + "version": "4.3.0", "author": "Puppet Labs", "summary": "Provides an interface for managing Apt source, key, and definitions with Puppet", "license": "Apache-2.0", diff --git a/spec/acceptance/init_task_spec.rb b/spec/acceptance/init_task_spec.rb new file mode 100644 index 0000000..72b68ad --- /dev/null +++ b/spec/acceptance/init_task_spec.rb @@ -0,0 +1,11 @@ +# run a test task +require 'spec_helper_acceptance' + +describe 'apt tasks' do + describe 'update and upgrade', if: pe_install? && puppet_version =~ %r{(5\.\d\.\d)} do + it 'execute arbitary sql' do + result = run_task(task_name: 'apt', params: 'action=update') + expect_multiple_regexes(result: result, regexes: [%r{Reading package lists}, %r{Job completed. 1/1 nodes succeeded}]) + end + end +end diff --git a/spec/spec_helper_acceptance.rb b/spec/spec_helper_acceptance.rb index 30eccbf..7391d21 100644 --- a/spec/spec_helper_acceptance.rb +++ b/spec/spec_helper_acceptance.rb @@ -2,12 +2,57 @@ require 'beaker-rspec' require 'beaker/puppet_install_helper' require 'beaker/module_install_helper' +def install_bolt_on(hosts) + on(hosts, "/opt/puppetlabs/puppet/bin/gem install --source http://rubygems.delivery.puppetlabs.net bolt -v '> 0.0.1'", acceptable_exit_codes: [0, 1]).stdout +end + +def pe_install? + ENV['PUPPET_INSTALL_TYPE'] =~ %r{pe}i +end + run_puppet_install_helper +install_bolt_on(hosts) unless pe_install? install_module_on(hosts) install_module_dependencies_on(hosts) UNSUPPORTED_PLATFORMS = ['RedHat','Suse','windows','AIX','Solaris'] +DEFAULT_PASSWORD = if default[:hypervisor] == 'vagrant' + 'vagrant' + elsif default[:hypervisor] == 'vcloud' + 'Qu@lity!' + end + +def puppet_version + (on default, puppet('--version')).output.chomp +end + +def run_puppet_access_login(user:, password: '~!@#$%^*-/ aZ', lifetime: '5y') + on(master, puppet('access', 'login', '--username', user, '--lifetime', lifetime), stdin: password) +end + +def run_task(task_name:, params: nil, password: DEFAULT_PASSWORD) + if pe_install? + run_puppet_task(task_name: task_name, params: params) + else + run_bolt_task(task_name: task_name, params: params, password: password) + end +end + +def run_bolt_task(task_name:, params: nil, password: DEFAULT_PASSWORD) + on(master, "/opt/puppetlabs/puppet/bin/bolt task run #{task_name} --modules /etc/puppetlabs/code/modules/service --nodes localhost --password #{password} #{params}", acceptable_exit_codes: [0, 1]).stdout # rubocop:disable Metrics/LineLength +end + +def run_puppet_task(task_name:, params: nil) + on(master, puppet('task', 'run', task_name, '--nodes', fact_on(master, 'fqdn'), params.to_s), acceptable_exit_codes: [0, 1]).stdout +end + +def expect_multiple_regexes(result:, regexes:) + regexes.each do |regex| + expect(result).to match(regex) + end +end + # This method allows a block to be passed in and if an exception is raised # that matches the 'error_matcher' matcher, the block will wait a set number # of seconds before retrying. @@ -40,4 +85,9 @@ RSpec.configure do |c| # Readable test descriptions c.formatter = :documentation + + # Configure all nodes in nodeset + c.before :suite do + run_puppet_access_login(user: 'admin') if pe_install? + end end diff --git a/tasks/init.json b/tasks/init.json new file mode 100644 index 0000000..2020005 --- /dev/null +++ b/tasks/init.json @@ -0,0 +1,10 @@ +{ + "description": "Allows you to perform apt functions", + "input_method": "stdin", + "parameters": { + "action": { + "description": "Action to perform ", + "type": "Enum[update, upgrade]" + } + } +} diff --git a/tasks/init.rb b/tasks/init.rb new file mode 100755 index 0000000..5db86eb --- /dev/null +++ b/tasks/init.rb @@ -0,0 +1,24 @@ +#!/opt/puppetlabs/puppet/bin/ruby +require 'json' +require 'open3' +require 'puppet' + +def apt_get(action) + cmd_string = "apt-get #{action}" + cmd_string << ' -y' if action == 'upgrade' + stdout, stderr, status = Open3.capture3(cmd_string) + raise Puppet::Error, stderr if status != 0 + { status: stdout.strip } +end + +params = JSON.parse(STDIN.read) +action = params['action'] + +begin + result = apt_get(action) + puts result.to_json + exit 0 +rescue Puppet::Error => e + puts({ status: 'failure', error: e.message }.to_json) + exit 1 +end -- 2.32.3