diff --git a/HISTORY.rst b/HISTORY.rst index 89b9714..21657e5 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -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) -------------------- diff --git a/cloudshell/rest/api.py b/cloudshell/rest/api.py index 7df3b8f..bdb7e24 100644 --- a/cloudshell/rest/api.py +++ b/cloudshell/rest/api.py @@ -76,7 +76,7 @@ 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 @@ -84,6 +84,23 @@ def get_installed_standards(self): 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') diff --git a/cloudshell/version.py b/cloudshell/version.py index 16f47bc..94786e7 100644 --- a/cloudshell/version.py +++ b/cloudshell/version.py @@ -1 +1 @@ -__version__ = '8.1.1.0' +__version__ = '8.2.0.0' diff --git a/setup.cfg b/setup.cfg index a4ae5fe..86c2220 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 8.1.1.0 +current_version = 8.2.0.0 commit = True tag = False parse = (?P\d+)\.(?P\d+)\.(?P\d+)\.(?P\d+) diff --git a/tests/test_packaging_rest_api_client.py b/tests/test_packaging_rest_api_client.py index c6575e8..5da9564 100644 --- a/tests/test_packaging_rest_api_client.py +++ b/tests/test_packaging_rest_api_client.py @@ -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')