Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions HISTORY.rst
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,11 @@
History
=======

8.2.0.0 (2017-09-19)
--------------------

* newest addition to rest-api. please welcome get_shell - returns a requested shell information

8.1.1.0 (2017-08-27)
--------------------

Expand Down
19 changes: 18 additions & 1 deletion cloudshell/rest/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -76,14 +76,31 @@ def get_installed_standards(self):
response = get(url,
headers={'Authorization': 'Basic ' + self.token})

if response.status_code == 404: # Feature unavailable (probably due to cloudshell version smaller than 8.1)
if response.status_code == 404: # Feature unavailable (probably due to cloudshell version below 8.1)
raise FeatureUnavailable()

if response.status_code != 200: # Ok
raise Exception(response.text)

return response.json()

def get_shell(self, shell_name):
url = 'http://{0}:{1}/API/Shells/{2}'.format(self.ip, self.port, shell_name)
response = get(url,
headers={'Authorization': 'Basic ' + self.token})

if response.status_code == 404: # Feature unavailable (probably due to cloudshell version below 8.2)
raise FeatureUnavailable()

if response.status_code == 400: # means shell not found
raise ShellNotFoundException()

if response.status_code != 200:
raise Exception(response.text)

return response.json()


@staticmethod
def _urlencode(s):
return s.replace('+', '%2B').replace('/', '%2F').replace('=', '%3D')
Expand Down
2 changes: 1 addition & 1 deletion cloudshell/version.py
Original file line number Diff line number Diff line change
@@ -1 +1 @@
__version__ = '8.1.1.0'
__version__ = '8.2.0.0'
2 changes: 1 addition & 1 deletion setup.cfg
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
[bumpversion]
current_version = 8.1.1.0
current_version = 8.2.0.0
commit = True
tag = False
parse = (?P<major>\d+)\.(?P<minor>\d+)\.(?P<patch>\d+)\.(?P<build>\d+)
Expand Down
74 changes: 74 additions & 0 deletions tests/test_packaging_rest_api_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -145,3 +145,77 @@ def test_get_installed_standards_feature_not_install_error_thrown(self, mock_get

# Act Assert
self.assertRaises(FeatureUnavailable, client.get_installed_standards)

@patch('cloudshell.rest.api.urllib2.build_opener')
@patch('cloudshell.rest.api.get')
def test_get_shell_success(self, mock_get, mock_build_opener):
# Arrange
mock_url = Mock()
mock_url.read = Mock(return_value='TOKEN')
mock_opener = Mock()
mock_opener.open = Mock(return_value=mock_url)
mock_build_opener.return_value = mock_opener
mock_get.return_value = Response()
mock_get.return_value._content = "[]" # hack - empty response content
mock_get.return_value.status_code = 200 # Ok

# Act
client = PackagingRestApiClient('SERVER', 9000, 'USER', 'PASS', 'Global')
client.get_shell('shell')

# Assert
self.assertTrue(mock_get.called, 'Get should be called')
self.assertEqual(mock_get.call_args[0][0], 'http://SERVER:9000/API/Shells/shell')
self.assertEqual(mock_get.call_args[1]['headers']['Authorization'], 'Basic TOKEN')

@patch('cloudshell.rest.api.urllib2.build_opener')
@patch('cloudshell.rest.api.get')
def test_get_shell_feature_unavailable_raises_error(self, mock_get, mock_build_opener):
# Arrange
mock_url = Mock()
mock_url.read = Mock(return_value='TOKEN')
mock_opener = Mock()
mock_opener.open = Mock(return_value=mock_url)
mock_build_opener.return_value = mock_opener
mock_get.return_value = Response()
mock_get.return_value.status_code = 404 # Not Found

# Act Assert
client = PackagingRestApiClient('SERVER', 9000, 'USER', 'PASS', 'Global')
self.assertRaises(FeatureUnavailable, client.get_shell, 'shell')

@patch('cloudshell.rest.api.urllib2.build_opener')
@patch('cloudshell.rest.api.get')
def test_get_shell_shell_not_found_raises_error(self, mock_get, mock_build_opener):
# Arrange
mock_url = Mock()
mock_url.read = Mock(return_value='TOKEN')
mock_opener = Mock()
mock_opener.open = Mock(return_value=mock_url)
mock_build_opener.return_value = mock_opener
mock_get.return_value = Response()
mock_get.return_value.status_code = 400 # Bad Request

# Act Assert
client = PackagingRestApiClient('SERVER', 9000, 'USER', 'PASS', 'Global')
self.assertRaises(ShellNotFoundException, client.get_shell, 'shell')

@patch('cloudshell.rest.api.urllib2.build_opener')
@patch('cloudshell.rest.api.get')
def test_get_shell_unexpected_error_raises_error(self, mock_get, mock_build_opener):
# Arrange
mock_url = Mock()
mock_url.read = Mock(return_value='TOKEN')
mock_opener = Mock()
mock_opener.open = Mock(return_value=mock_url)
mock_build_opener.return_value = mock_opener
response_obj = type('', (Response,), {"text": 'amazing error'})()
mock_get.return_value = response_obj
mock_get.return_value.status_code = 405 # Method Not Allowed

# Act Assert
client = PackagingRestApiClient('SERVER', 9000, 'USER', 'PASS', 'Global')
try:
client.get_shell('shell')
except Exception as e:
self.assertEqual(e.message, 'amazing error')