mirror of
https://github.com/valitydev/salt.git
synced 2024-11-07 17:09:03 +00:00
FEAT: first short at installing .pkg/.mpkg on OS X.
This commit is contained in:
parent
71bba6c676
commit
236ec08250
68
salt/modules/darwin_pkgutil.py
Normal file
68
salt/modules/darwin_pkgutil.py
Normal file
@ -0,0 +1,68 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
'''
|
||||
Installer support for OS X.
|
||||
|
||||
Installer is the native .pkg/.mpkg package manager for OS X.
|
||||
'''
|
||||
import os.path
|
||||
|
||||
from salt.ext.six.moves import urllib
|
||||
|
||||
|
||||
PKGUTIL = "/usr/sbin/pkgutil"
|
||||
|
||||
|
||||
def __virtual__():
|
||||
'''
|
||||
Set the virtual pkg module if the os is Solaris
|
||||
'''
|
||||
if __grains__['os'] == 'MacOS':
|
||||
return 'darwin_pkgutil'
|
||||
return False
|
||||
|
||||
|
||||
def list():
|
||||
'''
|
||||
List the installed packages.
|
||||
'''
|
||||
cmd = PKGUTIL + ' --pkgs'
|
||||
return __salt__['cmd.run_stdout'](cmd)
|
||||
|
||||
|
||||
def is_installed(package_id):
|
||||
'''
|
||||
Returns whether a given package id is installed.
|
||||
'''
|
||||
def has_package_id(lines):
|
||||
for line in lines:
|
||||
if line == package_id:
|
||||
return True
|
||||
return False
|
||||
|
||||
cmd = PKGUTIL + ' --pkgs'
|
||||
out = __salt__['cmd.run_stdout'](cmd)
|
||||
return has_package_id(out.splitlines())
|
||||
|
||||
|
||||
def _install_from_path(path):
|
||||
if not os.path.exists(path):
|
||||
msg = "Path {0!r} does not exist, cannot install".format(path)
|
||||
raise ValueError(msg)
|
||||
else:
|
||||
cmd = 'installer -pkg "{0}" -target /'.format(path)
|
||||
return __salt__['cmd.retcode'](cmd)
|
||||
|
||||
|
||||
def install(source, package_id=None):
|
||||
'''
|
||||
Install a .pkg from an URI or an absolute path.
|
||||
'''
|
||||
if package_id is not None and is_installed(package_id):
|
||||
return ''
|
||||
|
||||
uri = urllib.parse.urlparse(source)
|
||||
if uri.scheme == "":
|
||||
return _install_from_path(source)
|
||||
else:
|
||||
msg = "Unsupported scheme for source uri: {0!r}".format(uri.scheme)
|
||||
raise ValueError(msg)
|
85
tests/unit/modules/darwin_pkgutil_test.py
Normal file
85
tests/unit/modules/darwin_pkgutil_test.py
Normal file
@ -0,0 +1,85 @@
|
||||
from salt.modules import darwin_pkgutil
|
||||
|
||||
from salttesting import TestCase, skipIf
|
||||
from salttesting.mock import NO_MOCK, NO_MOCK_REASON, MagicMock, patch
|
||||
|
||||
|
||||
darwin_pkgutil.__salt__ = {}
|
||||
|
||||
|
||||
@skipIf(NO_MOCK, NO_MOCK_REASON)
|
||||
class DarwingPkgutilTestCase(TestCase):
|
||||
def test_list_installed_command(self):
|
||||
# Given
|
||||
r_output = "com.apple.pkg.iTunes"
|
||||
|
||||
# When
|
||||
mock_cmd = MagicMock(return_value=r_output)
|
||||
with patch.dict(darwin_pkgutil.__salt__, {'cmd.run_stdout': mock_cmd}):
|
||||
output = darwin_pkgutil.list()
|
||||
|
||||
# Then
|
||||
mock_cmd.assert_called_with("/usr/sbin/pkgutil --pkgs")
|
||||
|
||||
def test_list_installed_output(self):
|
||||
# Given
|
||||
r_output = "com.apple.pkg.iTunes"
|
||||
|
||||
# When
|
||||
mock_cmd = MagicMock(return_value=r_output)
|
||||
with patch.dict(darwin_pkgutil.__salt__, {'cmd.run_stdout': mock_cmd}):
|
||||
output = darwin_pkgutil.list()
|
||||
|
||||
# Then
|
||||
self.assertEqual(output, r_output)
|
||||
|
||||
def test_is_installed(self):
|
||||
# Given
|
||||
r_output = "com.apple.pkg.iTunes"
|
||||
|
||||
# When
|
||||
mock_cmd = MagicMock(return_value=r_output)
|
||||
with patch.dict(darwin_pkgutil.__salt__, {'cmd.run_stdout': mock_cmd}):
|
||||
ret = darwin_pkgutil.is_installed("com.apple.pkg.iTunes")
|
||||
|
||||
# Then
|
||||
self.assertTrue(ret)
|
||||
|
||||
# When
|
||||
with patch.dict(darwin_pkgutil.__salt__, {'cmd.run_stdout': mock_cmd}):
|
||||
ret = darwin_pkgutil.is_installed("com.apple.pkg.Safari")
|
||||
|
||||
# Then
|
||||
self.assertFalse(ret)
|
||||
|
||||
def test_install(self):
|
||||
# Given
|
||||
source = "/foo/bar/fubar.pkg"
|
||||
package_id = "com.foo.fubar.pkg"
|
||||
|
||||
# When
|
||||
mock_cmd = MagicMock(return_value=True)
|
||||
with patch("salt.modules.darwin_pkgutil.is_installed",
|
||||
return_value=False) as is_installed:
|
||||
with patch("salt.modules.darwin_pkgutil._install_from_path",
|
||||
return_value=True) as _install_from_path:
|
||||
ret = darwin_pkgutil.install(source, package_id)
|
||||
|
||||
# Then
|
||||
_install_from_path.assert_called_with(source)
|
||||
|
||||
def test_install_already_there(self):
|
||||
# Given
|
||||
source = "/foo/bar/fubar.pkg"
|
||||
package_id = "com.foo.fubar.pkg"
|
||||
|
||||
# When
|
||||
mock_cmd = MagicMock(return_value=True)
|
||||
with patch("salt.modules.darwin_pkgutil.is_installed",
|
||||
return_value=True) as is_installed:
|
||||
with patch("salt.modules.darwin_pkgutil._install_from_path",
|
||||
return_value=True) as _install_from_path:
|
||||
ret = darwin_pkgutil.install(source, package_id)
|
||||
|
||||
# Then
|
||||
self.assertEqual(_install_from_path.called, 0)
|
Loading…
Reference in New Issue
Block a user