Module: Unix::Pkg

Includes:
Beaker::CommandFactory
Included in:
Host
Defined in:
lib/beaker/host/unix/pkg.rb

Constant Summary collapse

DEBIAN_PLATFORM_CODENAMES =

Debian repositories contain packages for all architectures, so we need to map to an architecturless name for each platform

{
  'debian-6-amd64'     => 'squeeze',
  'debian-6-i386'      => 'squeeze',
  'debian-7-amd64'     => 'wheezy',
  'debian-7-i386'      => 'wheezy',
  'ubuntu-10.04-amd64' => 'lucid',
  'ubuntu-10.04-i386'  => 'lucid',
  'ubuntu-12.04-amd64' => 'precise',
  'ubuntu-12.04-i386'  => 'precise',
}

Instance Attribute Summary

Attributes included from Beaker::CommandFactory

#assertions

Instance Method Summary collapse

Methods included from Beaker::CommandFactory

#execute, #fail_test

Instance Method Details

#check_for_command(name) ⇒ Object



10
11
12
13
14
15
16
17
18
# File 'lib/beaker/host/unix/pkg.rb', line 10

def check_for_command(name)
  result = exec(Beaker::Command.new("which #{name}"), :accept_all_exit_codes => true)
  case self['platform']
  when /solaris-10/
    result.stdout =~ %r|/.*/#{name}|
  else
    result.exit_code == 0
  end
end

#check_for_package(name, opts = {}) ⇒ Object



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
# File 'lib/beaker/host/unix/pkg.rb', line 20

def check_for_package(name, opts = {})
  opts = {:accept_all_exit_codes => true}.merge(opts)
  case self['platform']
    when /sles-10/
      result = execute("zypper se -i --match-exact #{name}", opts) { |result| result }
      result.stdout =~ /No packages found/ ? (return false) : (return result.exit_code == 0)
    when /sles-/
      result = execute("zypper se -i --match-exact #{name}", opts) { |result| result }
    when /el-4/
      @logger.debug("Package query not supported on rhel4")
      return false
    when /cisco|fedora|centos|eos|el-/
      result = execute("rpm -q #{name}", opts) { |result| result }
    when /ubuntu|debian|cumulus/
      result = execute("dpkg -s #{name}", opts) { |result| result }
    when /solaris-11/
      result = execute("pkg info #{name}", opts) { |result| result }
    when /solaris-10/
      result = execute("pkginfo #{name}", opts) { |result| result }
    when /freebsd-9/
      result = execute("pkg_info #{name}", opts) { |result| result }
    when /freebsd-10/
      result = execute("pkg info #{name}", opts) { |result| result }
    when /openbsd/
      result = execute("pkg_info #{name}", opts) { |result| result }
    else
      raise "Package #{name} cannot be queried on #{self}"
  end
  result.exit_code == 0
end

#deploy_apt_repo(path, name, version) ⇒ Object

Note:

Due to the debian use of codenames in repos, the DEBIAN_PLATFORM_CODENAMES map must be kept up-to-date as support for new versions is added.

Deploy apt configuration generated by the packaging tooling



183
184
185
186
187
188
189
190
191
192
193
# File 'lib/beaker/host/unix/pkg.rb', line 183

def deploy_apt_repo(path, name, version)
  codename = DEBIAN_PLATFORM_CODENAMES[self['platform']]
  if codename.nil?
    @logger.warning "Could not determine codename for debian platform #{self['platform']}. Skipping deployment of repo #{name}"
    return
  end

  repo_file = "#{path}/deb/pl-#{name}-#{version}-#{codename}.list"
  do_scp_to repo_file, "/etc/apt/sources.list.d/#{name}.list", {}
  @apt_needs_update = true
end

#deploy_package_repo(path, name, version) ⇒ Object

Deploy configuration generated by the packaging tooling to this host.

This method calls one of #deploy_apt_repo, #deploy_yum_repo, or #deploy_zyp_repo depending on the platform of this Host.



223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
# File 'lib/beaker/host/unix/pkg.rb', line 223

def deploy_package_repo(path, name, version)
  if not File.exists? path
    @logger.warning "Was asked to deploy package repository from #{path}, but it doesn't exist!"
    return
  end

  case self['platform']
    when /el-4/
      @logger.debug("Package repo deploy is not supported on rhel4")
    when /fedora|centos|eos|el-/
      deploy_yum_repo(path, name, version)
    when /ubuntu|debian|cumulus/
      deploy_apt_repo(path, name, version)
    when /sles/
      deploy_zyp_repo(path, name, version)
    else
      # solaris, windows
      raise "Package repo cannot be deployed on #{self}; the platform is not supported"
  end
end

#deploy_yum_repo(path, name, version) ⇒ Object

Deploy yum configuration generated by the packaging tooling



199
200
201
202
# File 'lib/beaker/host/unix/pkg.rb', line 199

def deploy_yum_repo(path, name, version)
  repo_file = "#{path}/rpm/pl-#{name}-#{version}-repos-pe-#{self['platform']}.repo"
  do_scp_to repo_file, "/etc/yum.repos.d/#{name}.repo", {}
end

#deploy_zyp_repo(path, name, version) ⇒ Object

Deploy zypper repo configuration generated by the packaging tooling



208
209
210
211
212
213
214
# File 'lib/beaker/host/unix/pkg.rb', line 208

def deploy_zyp_repo(path, name, version)
  repo_file = "#{path}/rpm/pl-#{name}-#{version}-repos-pe-#{self['platform']}.repo"
  repo = IniFile.load(repo_file)
  repo_name = repo.sections[0]
  repo_url = repo[repo_name]["baseurl"]
  execute("zypper ar -t YUM #{repo_url} #{repo_name}")
end

#determine_if_x86_64 ⇒ Boolean

Examine the host system to determine the architecture

Returns:

  • (Boolean) —

    true if x86_64, false otherwise



246
247
248
249
250
251
252
253
254
# File 'lib/beaker/host/unix/pkg.rb', line 246

def determine_if_x86_64
  if self[:platform] =~ /solaris/
    result = exec(Beaker::Command.new("uname -a | grep x86_64"), :accept_all_exit_codes => true)
      result.exit_code == 0
  else
    result = exec(Beaker::Command.new("arch | grep x86_64"), :accept_all_exit_codes => true)
    result.exit_code == 0
  end
end

#install_package(name, cmdline_args = '', version = nil, opts = {}) ⇒ Object



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
# File 'lib/beaker/host/unix/pkg.rb', line 62

def install_package(name, cmdline_args = '', version = nil, opts = {})
  case self['platform']
    when /sles-/
      execute("zypper --non-interactive in #{name}", opts)
    when /el-4/
      @logger.debug("Package installation not supported on rhel4")
    when /cisco|fedora|centos|eos|el-/
      if version
        name = "#{name}-#{version}"
      end
      execute("yum -y #{cmdline_args} install #{name}", opts)
    when /ubuntu|debian|cumulus/
      if version
        name = "#{name}=#{version}"
      end
      update_apt_if_needed
      execute("apt-get install --force-yes #{cmdline_args} -y #{name}", opts)
    when /solaris-11/
      execute("pkg #{cmdline_args} install #{name}", opts)
    when /solaris-10/
      execute("pkgutil -i -y #{cmdline_args} #{name}", opts)
    when /freebsd-9/
      execute("pkg_add -fr #{cmdline_args} #{name}", opts)
    when /freebsd-10/
      execute("pkg #{cmdline_args} install #{name}", opts)
    when /openbsd/
      begin
        execute("pkg_add -I #{cmdline_args} #{name}", opts) do |command|
          # Handles where there are multiple rubies, installs the latest one
          if command.stderr =~ /^Ambiguous: #{name} could be (.+)$/
            name = $1.chomp.split(' ').collect { |x|
              x =~ /-(\d[^-p]+)/
              [x, $1]
            }.select { |x|
              # Blacklist Ruby 2.2.0+ for the sake of Puppet 3.x
              Gem::Version.new(x[1]) < Gem::Version.new('2.2.0')
            }.sort { |a,b|
              Gem::Version.new(b[1]) <=> Gem::Version.new(a[1])
            }.collect { |x|
              x[0]
            }.first
            raise ArgumentException
          end
          # If the package advises symlinks to be created, do it
          command.stdout.split(/\n/).select { |x| x =~ /^\s+ln\s/ }.each do |ln|
            execute(ln, opts)
          end
        end
      rescue
        retry
      end
    else
      raise "Package #{name} cannot be installed on #{self}"
  end
end

#pkg_initialize ⇒ Object

This method overrides Beaker::Host#pkg_initialize to provide unix-specific package management setup



6
7
8
# File 'lib/beaker/host/unix/pkg.rb', line 6

def pkg_initialize
  @apt_needs_update = true
end

#uninstall_package(name, cmdline_args = '', opts = {}) ⇒ Object



118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
# File 'lib/beaker/host/unix/pkg.rb', line 118

def uninstall_package(name, cmdline_args = '', opts = {})
  case self['platform']
    when /sles-/
      execute("zypper --non-interactive rm #{name}", opts)
    when /el-4/
      @logger.debug("Package uninstallation not supported on rhel4")
    when /cisco|fedora|centos|eos|el-/
      execute("yum -y #{cmdline_args} remove #{name}", opts)
    when /ubuntu|debian|cumulus/
      execute("apt-get purge #{cmdline_args} -y #{name}", opts)
    when /solaris-11/
      execute("pkg #{cmdline_args} uninstall #{name}", opts)
    when /solaris-10/
      execute("pkgutil -r -y #{cmdline_args} #{name}", opts)
    else
      raise "Package #{name} cannot be installed on #{self}"
  end
end

#update_apt_if_needed ⇒ Object

If apt has not been updated since the last repo deployment it is updated. Otherwise this is a noop



53
54
55
56
57
58
59
60
# File 'lib/beaker/host/unix/pkg.rb', line 53

def update_apt_if_needed
  if self['platform'] =~ /debian|ubuntu|cumulus/
    if @apt_needs_update
      execute("apt-get update")
      @apt_needs_update = false
    end
  end
end

#upgrade_package(name, cmdline_args = '', opts = {}) ⇒ Object

Upgrade an installed package to the latest available version

Parameters:

  • name (String) —

    The name of the package to update

  • cmdline_args (String) (defaults to: '') —

    Additional command line arguments for the package manager



142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
# File 'lib/beaker/host/unix/pkg.rb', line 142

def upgrade_package(name, cmdline_args = '', opts = {})
  case self['platform']
    when /sles-/
      execute("zypper --non-interactive --no-gpg-checks up #{name}", opts)
    when /el-4/
      @logger.debug("Package upgrade is not supported on rhel4")
    when /cisco|fedora|centos|eos|el-/
      execute("yum -y #{cmdline_args} update #{name}", opts)
    when /ubuntu|debian|cumulus/
      update_apt_if_needed
      execute("apt-get install -o Dpkg::Options::='--force-confold' #{cmdline_args} -y --force-yes #{name}", opts)
    when /solaris-11/
      execute("pkg #{cmdline_args} update #{name}", opts)
    when /solaris-10/
      execute("pkgutil -u -y #{cmdline_args} ${name}", opts)
    else
      raise "Package #{name} cannot be upgraded on #{self}"
  end
end