1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158
|
require 'spec_helper'
describe Puppet::Type.type(:package).provider(:aix) do
before(:each) do
# Create a mock resource
@resource = Puppet::Type.type(:package).new(:name => 'mypackage', :ensure => :installed, :source => 'mysource', :provider => :aix)
@provider = @resource.provider
end
[:install, :uninstall, :latest, :query, :update].each do |method|
it "should have a #{method} method" do
expect(@provider).to respond_to(method)
end
end
it "should uninstall a package" do
expect(@provider).to receive(:installp).with('-gu', 'mypackage')
expect(@provider.class).to receive(:pkglist).with({:pkgname => 'mypackage'}).and_return(nil)
@provider.uninstall
end
context "when installing" do
it "should install a package" do
allow(@provider).to receive(:query).and_return({:name => 'mypackage', :ensure => 'present', :status => :committed})
expect(@provider).to receive(:installp).with('-acgwXY', '-d', 'mysource', 'mypackage')
@provider.install
end
it "should install a specific package version" do
allow(@resource).to receive(:should).with(:ensure).and_return("1.2.3.4")
allow(@provider).to receive(:query).and_return({:name => 'mypackage', :ensure => '1.2.3.4', :status => :committed})
expect(@provider).to receive(:installp).with('-acgwXY', '-d', 'mysource', 'mypackage 1.2.3.4')
@provider.install
end
[:broken, :inconsistent].each do |state|
it "should fail if the installation resulted in a '#{state}' state" do
allow(@provider).to receive(:query).and_return({:name => 'mypackage', :ensure => 'present', :status => state})
expect(@provider).to receive(:installp).with('-acgwXY', '-d', 'mysource', 'mypackage')
expect { @provider.install }.to raise_error(Puppet::Error, "Package 'mypackage' is in a #{state} state and requires manual intervention")
end
end
it "should fail if the specified version is superseded" do
@resource[:ensure] = '1.2.3.3'
allow(@provider).to receive(:installp).and_return(<<-OUTPUT)
+-----------------------------------------------------------------------------+
Pre-installation Verification...
+-----------------------------------------------------------------------------+
Verifying selections...done
Verifying requisites...done
Results...
WARNINGS
--------
Problems described in this section are not likely to be the source of any
immediate or serious failures, but further actions may be necessary or
desired.
Already Installed
-----------------
The number of selected filesets that are either already installed
or effectively installed through superseding filesets is 1. See
the summaries at the end of this installation for details.
NOTE: Base level filesets may be reinstalled using the "Force"
option (-F flag), or they may be removed, using the deinstall or
"Remove Software Products" facility (-u flag), and then reinstalled.
<< End of Warning Section >>
+-----------------------------------------------------------------------------+
BUILDDATE Verification ...
+-----------------------------------------------------------------------------+
Verifying build dates...done
FILESET STATISTICS
------------------
1 Selected to be installed, of which:
1 Already installed (directly or via superseding filesets)
----
0 Total to be installed
Pre-installation Failure/Warning Summary
----------------------------------------
Name Level Pre-installation Failure/Warning
-------------------------------------------------------------------------------
mypackage 1.2.3.3 Already superseded by 1.2.3.4
OUTPUT
expect { @provider.install }.to raise_error(Puppet::Error, "aix package provider is unable to downgrade packages")
end
end
context "when finding the latest version" do
it "should return the current version when no later version is present" do
allow(@provider).to receive(:latest_info).and_return(nil)
allow(@provider).to receive(:properties).and_return({ :ensure => "1.2.3.4" })
expect(@provider.latest).to eq("1.2.3.4")
end
it "should return the latest version of a package" do
allow(@provider).to receive(:latest_info).and_return({ :version => "1.2.3.5" })
expect(@provider.latest).to eq("1.2.3.5")
end
it "should prefetch the right values" do
allow(Process).to receive(:euid).and_return(0)
resource = Puppet::Type.type(:package).
new(:name => 'sudo.rte', :ensure => :latest,
:source => 'mysource', :provider => :aix)
allow(resource).to receive(:should).with(:ensure).and_return(:latest)
resource.should(:ensure)
allow(resource.provider.class).to receive(:execute).and_return(<<-END.chomp)
sudo:sudo.rte:1.7.10.4::I:C:::::N:Configurable super-user privileges runtime::::0::
sudo:sudo.rte:1.8.6.4::I:T:::::N:Configurable super-user privileges runtime::::0::
END
resource.provider.class.prefetch('sudo.rte' => resource)
expect(resource.provider.latest).to eq('1.8.6.4')
end
end
it "update should install a package" do
expect(@provider).to receive(:install).with(false)
@provider.update
end
it "should prefetch when some packages lack sources" do
latest = Puppet::Type.type(:package).new(:name => 'mypackage', :ensure => :latest, :source => 'mysource', :provider => :aix)
absent = Puppet::Type.type(:package).new(:name => 'otherpackage', :ensure => :absent, :provider => :aix)
allow(Process).to receive(:euid).and_return(0)
expect(described_class).to receive(:execute).and_return('mypackage:mypackage.rte:1.8.6.4::I:T:::::N:A Super Cool Package::::0::\n')
described_class.prefetch({ 'mypackage' => latest, 'otherpackage' => absent })
end
context "when querying instances" do
before(:each) do
allow(described_class).to receive(:execute).and_return(<<-END.chomp)
sysmgt.cim.providers:sysmgt.cim.providers.metrics:2.12.1.1: : :B: :Metrics Providers for AIX OS: : : : : : :1:0:/:
sysmgt.cim.providers:sysmgt.cim.providers.osbase:2.12.1.1: : :C: :Base Providers for AIX OS: : : : : : :1:0:/:
openssl.base:openssl.base:1.0.2.1800: : :?: :Open Secure Socket Layer: : : : : : :0:0:/:
END
end
it "should treat installed packages in broken and inconsistent state as absent" do
installed_packages = described_class.instances.map { |package| package.properties }
expected_packages = [{:name => 'sysmgt.cim.providers.metrics', :ensure => :absent, :status => :broken, :provider => :aix},
{:name => 'sysmgt.cim.providers.osbase', :ensure => '2.12.1.1', :status => :committed, :provider => :aix},
{:name => 'openssl.base', :ensure => :absent, :status => :inconsistent, :provider => :aix}]
expect(installed_packages).to eql(expected_packages)
end
end
end
|