Skip to content

Commit 4794ff2

Browse files
committed
Adding sudo to execute CLI with paramiko ssh backend
- added tests for sudo in paramiko - added .gitignore file - remove `--use-mirrors` in travis.yml as it has been removed via https://pip.pypa.io/en/stable/news/ and 7.0.0 (2015-05-21) section
1 parent 0aaef17 commit 4794ff2

File tree

5 files changed

+56
-12
lines changed

5 files changed

+56
-12
lines changed

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
.env/
2+
*.egg-info/
3+
*.pyc

.travis.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@ python:
33
- 2.7
44
- 3.4
55
install:
6-
- pip install . --use-mirrors
7-
- pip install -r test_requirements.txt --use-mirrors
6+
- pip install .
7+
- pip install -r test_requirements.txt
88
script:
99
- nosetests --with-coverage --cover-erase --cover-branches --cover-package=proxmoxer -w tests
1010
after_success:

proxmoxer/backends/ssh_paramiko.py

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,15 @@ def __init__(self, host,
2020
password=None,
2121
private_key_file=None,
2222
port=22,
23-
timeout=5):
23+
timeout=5,
24+
sudo=False):
2425
self.host = host
2526
self.username = username
2627
self.password = password
2728
self.private_key_file = private_key_file
2829
self.port = port
2930
self.timeout = timeout
31+
self.sudo = sudo
3032
self.ssh_client = self._connect()
3133

3234
def _connect(self):
@@ -50,6 +52,8 @@ def _connect(self):
5052
return ssh_client
5153

5254
def _exec(self, cmd):
55+
if self.sudo:
56+
cmd = 'sudo ' + cmd
5357
session = self.ssh_client.get_transport().open_session()
5458
session.exec_command(cmd)
5559
stdout = ''.join(session.makefile('rb', -1))
@@ -64,11 +68,12 @@ def upload_file_obj(self, file_obj, remote_path):
6468

6569

6670
class Backend(BaseBackend):
67-
def __init__(self, host, user, password=None, private_key_file=None, port=22, timeout=5):
71+
def __init__(self, host, user, password=None, private_key_file=None, port=22, timeout=5, sudo=False):
6872
self.session = ProxmoxParamikoSession(host, user,
6973
password=password,
7074
private_key_file=private_key_file,
7175
port=port,
72-
timeout=timeout)
76+
timeout=timeout,
77+
sudo=sudo)
7378

7479

tests/base/base_ssh_suite.py

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,16 +12,25 @@
1212
from nose.tools import eq_, ok_
1313

1414

15-
class BaseSSHSuite():
15+
class BaseSSHSuite(object):
1616
proxmox = None
1717
client = None
1818
session = None
1919

20+
def __init__(self, sudo=False):
21+
self.sudo = sudo
22+
2023
def _split_cmd(self, cmd):
2124
splitted = cmd.split()
22-
eq_(splitted[0], 'pvesh')
25+
if not self.sudo:
26+
eq_(splitted[0], 'pvesh')
27+
else:
28+
eq_(splitted[0], 'sudo')
29+
eq_(splitted[1], 'pvesh')
30+
splitted.pop(0)
2331
options_set = set((' '.join((k, v)) for k, v in
24-
zip(islice(splitted, 3, None, 2), islice(splitted, 4, None, 2))))
32+
zip(islice(splitted, 3, None, 2),
33+
islice(splitted, 4, None, 2))))
2534
return ' '.join(splitted[1:3]), options_set
2635

2736
def _get_called_cmd(self):
@@ -53,7 +62,7 @@ def test_get(self):
5362
}
5463
]""")
5564
result = self.proxmox.nodes('proxmox').storage('local').get()
56-
eq_(self._get_called_cmd(), 'pvesh get /nodes/proxmox/storage/local')
65+
eq_(self._get_called_cmd(), self._called_cmd('pvesh get /nodes/proxmox/storage/local'))
5766
eq_(result[0]['subdir'], 'status')
5867
eq_(result[1]['subdir'], 'content')
5968
eq_(result[2]['subdir'], 'upload')
@@ -62,11 +71,11 @@ def test_get(self):
6271

6372
def test_delete(self):
6473
self.proxmox.nodes('proxmox').openvz(100).delete()
65-
eq_(self._get_called_cmd(), 'pvesh delete /nodes/proxmox/openvz/100')
74+
eq_(self._get_called_cmd(), self._called_cmd('pvesh delete /nodes/proxmox/openvz/100'))
6675
self.proxmox.nodes('proxmox').openvz('101').delete()
67-
eq_(self._get_called_cmd(), 'pvesh delete /nodes/proxmox/openvz/101')
76+
eq_(self._get_called_cmd(), self._called_cmd('pvesh delete /nodes/proxmox/openvz/101'))
6877
self.proxmox.nodes('proxmox').openvz.delete('102')
69-
eq_(self._get_called_cmd(), 'pvesh delete /nodes/proxmox/openvz/102')
78+
eq_(self._get_called_cmd(), self._called_cmd('pvesh delete /nodes/proxmox/openvz/102'))
7079

7180
def test_post(self):
7281
node = self.proxmox.nodes('proxmox')
@@ -135,3 +144,9 @@ def test_put(self):
135144
ok_('-ip_address 10.0.100.200' in options)
136145
ok_('-onboot False' in options)
137146
ok_('-cpus 2' in options)
147+
148+
def _called_cmd(self, cmd):
149+
called_cmd = cmd
150+
if self.sudo:
151+
called_cmd = 'sudo ' + cmd
152+
return called_cmd

tests/paramiko_tests.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,3 +42,24 @@ def _set_stdout(self, stdout):
4242
def _set_stderr(self, stderr):
4343
self.session.makefile_stderr.return_value = [stderr]
4444

45+
46+
class TestParamikoSuiteWithSudo(BaseSSHSuite):
47+
48+
# noinspection PyMethodOverriding
49+
@patch('paramiko.SSHClient')
50+
def setUp(self, _):
51+
super(TestParamikoSuiteWithSudo, self).__init__(sudo=True)
52+
self.proxmox = ProxmoxAPI('proxmox', user='root', backend='ssh_paramiko', port=123, sudo=True)
53+
self.client = self.proxmox._store['session'].ssh_client
54+
self.session = self.client.get_transport().open_session()
55+
self._set_stderr('200 OK')
56+
self._set_stdout('')
57+
58+
def _get_called_cmd(self):
59+
return self.session.exec_command.call_args[0][0]
60+
61+
def _set_stdout(self, stdout):
62+
self.session.makefile.return_value = [stdout]
63+
64+
def _set_stderr(self, stderr):
65+
self.session.makefile_stderr.return_value = [stderr]

0 commit comments

Comments
 (0)