Skip to content

Commit

Permalink
Merge pull request #49720 from cstarke/2018.3
Browse files Browse the repository at this point in the history
Seperate prlctl and prlsrvctl checks into each requiring function
  • Loading branch information
Nicole Thomas committed Sep 21, 2018
2 parents f745e43 + b0be6aa commit e7bbb83
Show file tree
Hide file tree
Showing 2 changed files with 67 additions and 74 deletions.
22 changes: 10 additions & 12 deletions salt/modules/parallels.py
Expand Up @@ -6,6 +6,9 @@
see the `Parallels Desktop Reference Guide
<http://download.parallels.com/desktop/v9/ga/docs/en_US/Parallels%20Command%20Line%20Reference%20Guide.pdf>`_.
This module requires the prlctl binary to be installed to run most functions.
To run parallels.prlsrvctl, the prlsrvctl binary is required.
What has not been implemented yet can be accessed through ``parallels.prlctl``
and ``parallels.prlsrvctl`` (note the preceding double dash ``--`` as
necessary):
Expand All @@ -29,7 +32,7 @@
import salt.utils.locales
import salt.utils.path
import salt.utils.yaml
from salt.exceptions import SaltInvocationError
from salt.exceptions import SaltInvocationError, CommandExecutionError

# Import 3rd party libs
from salt.ext import six
Expand All @@ -43,17 +46,6 @@
GUID_REGEX = re.compile(r'{?([0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12})}?', re.I)


def __virtual__():
'''
Load this module if prlctl is available
'''
if not salt.utils.path.which('prlctl'):
return (False, 'prlctl utility not available')
if not salt.utils.path.which('prlsrvctl'):
return (False, 'prlsrvctl utility not available')
return __virtualname__


def _normalize_args(args):
'''
Return args as a list of strings
Expand Down Expand Up @@ -111,6 +103,9 @@ def prlsrvctl(sub_cmd, args=None, runas=None):
salt '*' parallels.prlsrvctl usb list runas=macdev
salt -- '*' parallels.prlsrvctl set '--mem-limit auto' runas=macdev
'''
if not salt.utils.path.which('prlsrvctl'):
raise CommandExecutionError('prlsrvctl utility not available')

# Construct command
cmd = ['prlsrvctl', sub_cmd]
if args:
Expand Down Expand Up @@ -141,6 +136,9 @@ def prlctl(sub_cmd, args=None, runas=None):
salt '*' parallels.prlctl exec 'macvm uname' runas=macdev
salt -- '*' parallels.prlctl capture 'macvm --file macvm.display.png' runas=macdev
'''
if not salt.utils.path.which('prlctl'):
raise CommandExecutionError('prlctl utility not available')

# Construct command
cmd = ['prlctl', sub_cmd]
if args:
Expand Down
119 changes: 57 additions & 62 deletions tests/unit/modules/test_parallels.py
Expand Up @@ -6,7 +6,7 @@

# Import Salt Libs
import salt.modules.parallels as parallels
from salt.exceptions import SaltInvocationError
from salt.exceptions import SaltInvocationError, CommandExecutionError

# Import Salt Testing Libs
from tests.support.mixins import LoaderModuleMockMixin
Expand All @@ -25,27 +25,6 @@ class ParallelsTestCase(TestCase, LoaderModuleMockMixin):
def setup_loader_modules(self):
return {parallels: {}}

def test___virtual__(self):
'''
Test parallels.__virtual__
'''
mock_true = MagicMock(return_value=True)
mock_false = MagicMock(return_value=False)

# Validate false return
with patch('salt.utils.path.which', mock_false):
ret = parallels.__virtual__()
self.assertTrue(isinstance(ret, tuple))
self.assertEqual(len(ret), 2)
self.assertFalse(ret[0])
self.assertTrue(isinstance(ret[1], six.string_types))

# Validate true return
with patch('salt.utils.path.which', mock_true):
ret = parallels.__virtual__()
self.assertTrue(ret)
self.assertEqual(ret, 'parallels')

def test__normalize_args(self):
'''
Test parallels._normalize_args
Expand Down Expand Up @@ -94,53 +73,69 @@ def test_prlsrvctl(self):
'''
runas = 'macdev'

# Validate 'prlsrvctl info'
info_cmd = ['prlsrvctl', 'info']
info_fcn = MagicMock()
with patch.dict(parallels.__salt__, {'cmd.run': info_fcn}):
parallels.prlsrvctl('info', runas=runas)
info_fcn.assert_called_once_with(info_cmd, runas=runas)

# Validate 'prlsrvctl usb list'
usb_cmd = ['prlsrvctl', 'usb', 'list']
usb_fcn = MagicMock()
with patch.dict(parallels.__salt__, {'cmd.run': usb_fcn}):
parallels.prlsrvctl('usb', 'list', runas=runas)
usb_fcn.assert_called_once_with(usb_cmd, runas=runas)

# Validate 'prlsrvctl set "--mem-limit auto"'
set_cmd = ['prlsrvctl', 'set', '--mem-limit', 'auto']
set_fcn = MagicMock()
with patch.dict(parallels.__salt__, {'cmd.run': set_fcn}):
parallels.prlsrvctl('set', '--mem-limit auto', runas=runas)
set_fcn.assert_called_once_with(set_cmd, runas=runas)
# Test missing prlsrvctl binary
with patch('salt.utils.path.which', MagicMock(return_value=False)):
with self.assertRaises(CommandExecutionError):
parallels.prlsrvctl('info', runas=runas)

# Simulate the existence of prlsrvctl
with patch('salt.utils.path.which', MagicMock(return_value="/usr/bin/prlsrvctl")):

# Validate 'prlsrvctl info'
info_cmd = ['prlsrvctl', 'info']
info_fcn = MagicMock()
with patch.dict(parallels.__salt__, {'cmd.run': info_fcn}):
parallels.prlsrvctl('info', runas=runas)
info_fcn.assert_called_once_with(info_cmd, runas=runas)

# Validate 'prlsrvctl usb list'
usb_cmd = ['prlsrvctl', 'usb', 'list']
usb_fcn = MagicMock()
with patch.dict(parallels.__salt__, {'cmd.run': usb_fcn}):
parallels.prlsrvctl('usb', 'list', runas=runas)
usb_fcn.assert_called_once_with(usb_cmd, runas=runas)

# Validate 'prlsrvctl set "--mem-limit auto"'
set_cmd = ['prlsrvctl', 'set', '--mem-limit', 'auto']
set_fcn = MagicMock()
with patch.dict(parallels.__salt__, {'cmd.run': set_fcn}):
parallels.prlsrvctl('set', '--mem-limit auto', runas=runas)
set_fcn.assert_called_once_with(set_cmd, runas=runas)

def test_prlctl(self):
'''
Test parallels.prlctl
'''
runas = 'macdev'

# Validate 'prlctl user list'
user_cmd = ['prlctl', 'user', 'list']
user_fcn = MagicMock()
with patch.dict(parallels.__salt__, {'cmd.run': user_fcn}):
parallels.prlctl('user', 'list', runas=runas)
user_fcn.assert_called_once_with(user_cmd, runas=runas)

# Validate 'prlctl exec "macvm uname"'
exec_cmd = ['prlctl', 'exec', 'macvm', 'uname']
exec_fcn = MagicMock()
with patch.dict(parallels.__salt__, {'cmd.run': exec_fcn}):
parallels.prlctl('exec', 'macvm uname', runas=runas)
exec_fcn.assert_called_once_with(exec_cmd, runas=runas)

# Validate 'prlctl capture "macvm --file macvm.display.png"'
cap_cmd = ['prlctl', 'capture', 'macvm', '--file', 'macvm.display.png']
cap_fcn = MagicMock()
with patch.dict(parallels.__salt__, {'cmd.run': cap_fcn}):
parallels.prlctl('capture', 'macvm --file macvm.display.png', runas=runas)
cap_fcn.assert_called_once_with(cap_cmd, runas=runas)
# Test missing prlctl binary
with patch('salt.utils.path.which', MagicMock(return_value=False)):
with self.assertRaises(CommandExecutionError):
parallels.prlctl('info', runas=runas)

# Simulate the existence of prlctl
with patch('salt.utils.path.which', MagicMock(return_value="/usr/bin/prlctl")):

# Validate 'prlctl user list'
user_cmd = ['prlctl', 'user', 'list']
user_fcn = MagicMock()
with patch.dict(parallels.__salt__, {'cmd.run': user_fcn}):
parallels.prlctl('user', 'list', runas=runas)
user_fcn.assert_called_once_with(user_cmd, runas=runas)

# Validate 'prlctl exec "macvm uname"'
exec_cmd = ['prlctl', 'exec', 'macvm', 'uname']
exec_fcn = MagicMock()
with patch.dict(parallels.__salt__, {'cmd.run': exec_fcn}):
parallels.prlctl('exec', 'macvm uname', runas=runas)
exec_fcn.assert_called_once_with(exec_cmd, runas=runas)

# Validate 'prlctl capture "macvm --file macvm.display.png"'
cap_cmd = ['prlctl', 'capture', 'macvm', '--file', 'macvm.display.png']
cap_fcn = MagicMock()
with patch.dict(parallels.__salt__, {'cmd.run': cap_fcn}):
parallels.prlctl('capture', 'macvm --file macvm.display.png', runas=runas)
cap_fcn.assert_called_once_with(cap_cmd, runas=runas)

def test_list_vms(self):
'''
Expand Down

0 comments on commit e7bbb83

Please sign in to comment.