Merge "Add OpenStackClient plugin and plan list"
This commit is contained in:
		
							
								
								
									
										0
									
								
								karborclient/osc/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								karborclient/osc/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
								
								
									
										56
									
								
								karborclient/osc/plugin.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										56
									
								
								karborclient/osc/plugin.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,56 @@ | ||||
| #   Licensed under the Apache License, Version 2.0 (the "License"); you may | ||||
| #   not use this file except in compliance with the License. You may obtain | ||||
| #   a copy of the License at | ||||
| # | ||||
| #        http://www.apache.org/licenses/LICENSE-2.0 | ||||
| # | ||||
| #   Unless required by applicable law or agreed to in writing, software | ||||
| #   distributed under the License is distributed on an "AS IS" BASIS, WITHOUT | ||||
| #   WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the | ||||
| #   License for the specific language governing permissions and limitations | ||||
| #   under the License. | ||||
| # | ||||
|  | ||||
| import logging | ||||
|  | ||||
| from osc_lib import utils | ||||
|  | ||||
| LOG = logging.getLogger(__name__) | ||||
|  | ||||
| DEFAULT_DATA_PROTECTION_API_VERSION = '1' | ||||
| API_VERSION_OPTION = 'os_data_protection_api_version' | ||||
| API_NAME = 'data_protection' | ||||
| API_VERSIONS = { | ||||
|     '1': 'karborclient.v1.client.Client', | ||||
| } | ||||
|  | ||||
|  | ||||
| def make_client(instance): | ||||
|     """Returns a data protection service client""" | ||||
|     data_protection_client = utils.get_client_class( | ||||
|         API_NAME, | ||||
|         instance._api_version[API_NAME], | ||||
|         API_VERSIONS) | ||||
|     LOG.debug('Instantiating data protection client: %s', | ||||
|               data_protection_client) | ||||
|     client = data_protection_client( | ||||
|         auth=instance.auth, | ||||
|         session=instance.session, | ||||
|         service_type="data-protect" | ||||
|     ) | ||||
|  | ||||
|     return client | ||||
|  | ||||
|  | ||||
| def build_option_parser(parser): | ||||
|     """Hook to add global options""" | ||||
|     parser.add_argument( | ||||
|         '--os-data-protection-api-version', | ||||
|         metavar='<data-protection-api-version>', | ||||
|         default=utils.env( | ||||
|             'OS_DATA_PROTECTION_API_VERSION', | ||||
|             default=DEFAULT_DATA_PROTECTION_API_VERSION), | ||||
|         help='Data protection API version, default=' + | ||||
|              DEFAULT_DATA_PROTECTION_API_VERSION + | ||||
|              ' (Env: OS_DATA_PROTECTION_API_VERSION)') | ||||
|     return parser | ||||
							
								
								
									
										0
									
								
								karborclient/osc/v1/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								karborclient/osc/v1/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
								
								
									
										98
									
								
								karborclient/osc/v1/plans.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										98
									
								
								karborclient/osc/v1/plans.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,98 @@ | ||||
| #    Licensed under the Apache License, Version 2.0 (the "License"); you may | ||||
| #    not use this file except in compliance with the License. You may obtain | ||||
| #    a copy of the License at | ||||
| # | ||||
| #         http://www.apache.org/licenses/LICENSE-2.0 | ||||
| # | ||||
| #    Unless required by applicable law or agreed to in writing, software | ||||
| #    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT | ||||
| #    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the | ||||
| #    License for the specific language governing permissions and limitations | ||||
| #    under the License. | ||||
|  | ||||
| """Data protection V1 plan action implementations""" | ||||
|  | ||||
| from osc_lib.command import command | ||||
| from osc_lib import utils | ||||
| from oslo_log import log as logging | ||||
|  | ||||
| from karborclient.i18n import _ | ||||
|  | ||||
|  | ||||
| class ListPlans(command.Lister): | ||||
|     _description = _("List plans.") | ||||
|  | ||||
|     log = logging.getLogger(__name__ + ".ListPlans") | ||||
|  | ||||
|     def get_parser(self, prog_name): | ||||
|         parser = super(ListPlans, self).get_parser(prog_name) | ||||
|         parser.add_argument( | ||||
|             '--all-projects', | ||||
|             action='store_true', | ||||
|             default=False, | ||||
|             help=_('Include all projects (admin only)'), | ||||
|         ) | ||||
|         parser.add_argument( | ||||
|             '--name', | ||||
|             metavar='<name>', | ||||
|             help=_('Filter results by plan name'), | ||||
|         ) | ||||
|         parser.add_argument( | ||||
|             '--description', | ||||
|             metavar='<description>', | ||||
|             help=_('Filter results by plan description'), | ||||
|         ) | ||||
|         parser.add_argument( | ||||
|             '--status', | ||||
|             metavar='<status>', | ||||
|             help=_('Filter results by status'), | ||||
|         ) | ||||
|         parser.add_argument( | ||||
|             '--marker', | ||||
|             metavar='<plan>', | ||||
|             help=_('The last plan ID of the previous page'), | ||||
|         ) | ||||
|         parser.add_argument( | ||||
|             '--limit', | ||||
|             type=int, | ||||
|             metavar='<num-plans>', | ||||
|             help=_('Maximum number of plans to display'), | ||||
|         ) | ||||
|         parser.add_argument( | ||||
|             '--sort', | ||||
|             metavar="<key>[:<direction>]", | ||||
|             default=None, | ||||
|             help=_("Sort output by selected keys and directions(asc or desc) " | ||||
|                    "(default: name:asc), multiple keys and directions can be " | ||||
|                    "specified separated by comma"), | ||||
|         ) | ||||
|         parser.add_argument( | ||||
|             '--tenant', | ||||
|             metavar='<tenant>', | ||||
|             help=_('Filter results by a tenant(admin only)') | ||||
|         ) | ||||
|         return parser | ||||
|  | ||||
|     def take_action(self, parsed_args): | ||||
|         self.log.debug("take_action(%s)", parsed_args) | ||||
|         data_protection_client = self.app.client_manager.data_protection | ||||
|         all_projects = bool(parsed_args.tenant) or parsed_args.all_projects | ||||
|  | ||||
|         search_opts = { | ||||
|             'all_tenants': all_projects, | ||||
|             'project_id': parsed_args.tenant, | ||||
|             'name': parsed_args.name, | ||||
|             'description': parsed_args.description, | ||||
|             'status': parsed_args.status, | ||||
|         } | ||||
|  | ||||
|         data = data_protection_client.plans.list( | ||||
|             search_opts=search_opts, marker=parsed_args.marker, | ||||
|             limit=parsed_args.limit, sort=parsed_args.sort) | ||||
|  | ||||
|         column_headers = ['Id', 'Name', 'Description', 'Provider id', 'Status'] | ||||
|  | ||||
|         return (column_headers, | ||||
|                 (utils.get_item_properties( | ||||
|                     s, column_headers | ||||
|                 ) for s in data)) | ||||
							
								
								
									
										0
									
								
								karborclient/tests/unit/osc/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								karborclient/tests/unit/osc/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
								
								
									
										1
									
								
								karborclient/tests/unit/osc/v1/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								karborclient/tests/unit/osc/v1/__init__.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1 @@ | ||||
| __author__ = 'c00179918' | ||||
							
								
								
									
										29
									
								
								karborclient/tests/unit/osc/v1/fakes.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								karborclient/tests/unit/osc/v1/fakes.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,29 @@ | ||||
| # Copyright (c) 2015 Mirantis Inc. | ||||
| # | ||||
| # Licensed under the Apache License, Version 2.0 (the "License"); | ||||
| # you may not use this file except in compliance with the License. | ||||
| # You may obtain a copy of the License at | ||||
| # | ||||
| #    http://www.apache.org/licenses/LICENSE-2.0 | ||||
| # | ||||
| # Unless required by applicable law or agreed to in writing, software | ||||
| # distributed under the License is distributed on an "AS IS" BASIS, | ||||
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or | ||||
| # implied. | ||||
| # See the License for the specific language governing permissions and | ||||
| # limitations under the License. | ||||
|  | ||||
|  | ||||
| import mock | ||||
| from osc_lib.tests import utils | ||||
|  | ||||
|  | ||||
| class TestDataProtection(utils.TestCommand): | ||||
|  | ||||
|     def setUp(self): | ||||
|         super(TestDataProtection, self).setUp() | ||||
|  | ||||
|         self.app.client_manager.data_protection = mock.Mock() | ||||
|         self.app.client_manager.network = mock.Mock() | ||||
|         self.app.client_manager.compute = mock.Mock() | ||||
|         self.app.client_manager.volume = mock.Mock() | ||||
							
								
								
									
										65
									
								
								karborclient/tests/unit/osc/v1/test_plans.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										65
									
								
								karborclient/tests/unit/osc/v1/test_plans.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,65 @@ | ||||
| # Licensed under the Apache License, Version 2.0 (the "License"); | ||||
| # you may not use this file except in compliance with the License. | ||||
| # You may obtain a copy of the License at | ||||
| # | ||||
| #    http://www.apache.org/licenses/LICENSE-2.0 | ||||
| # | ||||
| # Unless required by applicable law or agreed to in writing, software | ||||
| # distributed under the License is distributed on an "AS IS" BASIS, | ||||
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or | ||||
| # implied. | ||||
| # See the License for the specific language governing permissions and | ||||
| # limitations under the License. | ||||
|  | ||||
| from karborclient.osc.v1 import plans as osc_plans | ||||
| from karborclient.tests.unit.osc.v1 import fakes | ||||
| from karborclient.v1 import plans | ||||
|  | ||||
|  | ||||
| PLAN_INFO = { | ||||
|     "status": "suspended", | ||||
|     "provider_id": "cf56bd3e-97a7-4078-b6d5-f36246333fd9", | ||||
|     "description": "", | ||||
|     "parameters": {}, | ||||
|     "id": "204c825e-eb2f-4609-95ab-70b3caa43ac8", | ||||
|     "resources": [], | ||||
|     "name": "OS Volume protection plan." | ||||
| } | ||||
|  | ||||
|  | ||||
| class TestPlans(fakes.TestDataProtection): | ||||
|     def setUp(self): | ||||
|         super(TestPlans, self).setUp() | ||||
|         self.plans_mock = self.app.client_manager.data_protection.plans | ||||
|         self.plans_mock.reset_mock() | ||||
|  | ||||
|  | ||||
| class TestListPlans(TestPlans): | ||||
|     def setUp(self): | ||||
|         super(TestListPlans, self).setUp() | ||||
|         self.plans_mock.list.return_value = [plans.Plan( | ||||
|             None, PLAN_INFO)] | ||||
|  | ||||
|         # Command to test | ||||
|         self.cmd = osc_plans.ListPlans(self.app, None) | ||||
|  | ||||
|     def test_plans_list(self): | ||||
|         arglist = ['--status', 'suspended'] | ||||
|         verifylist = [('status', 'suspended')] | ||||
|  | ||||
|         parsed_args = self.check_parser(self.cmd, arglist, verifylist) | ||||
|  | ||||
|         columns, data = self.cmd.take_action(parsed_args) | ||||
|  | ||||
|         # Check that columns are correct | ||||
|         expected_columns = ( | ||||
|             ['Id', 'Name', 'Description', 'Provider id', 'Status']) | ||||
|         self.assertEqual(expected_columns, columns) | ||||
|  | ||||
|         # Check that data is correct | ||||
|         expected_data = [("204c825e-eb2f-4609-95ab-70b3caa43ac8", | ||||
|                           "OS Volume protection plan.", | ||||
|                           "", | ||||
|                           "cf56bd3e-97a7-4078-b6d5-f36246333fd9", | ||||
|                           "suspended")] | ||||
|         self.assertEqual(expected_data, list(data)) | ||||
| @@ -8,6 +8,7 @@ requests!=2.12.2,!=2.13.0,>=2.10.0 # Apache-2.0 | ||||
| simplejson>=2.2.0 # MIT | ||||
| Babel!=2.4.0,>=2.3.4 # BSD | ||||
| six>=1.9.0 # MIT | ||||
| osc-lib>=1.5.1 # Apache-2.0 | ||||
| oslo.utils>=3.20.0 # Apache-2.0 | ||||
| oslo.log>=3.22.0 # Apache-2.0 | ||||
| oslo.i18n>=2.1.0 # Apache-2.0 | ||||
|   | ||||
| @@ -30,6 +30,12 @@ packages = | ||||
| console_scripts = | ||||
|     karbor = karborclient.shell:main | ||||
|  | ||||
| openstack.cli.extension = | ||||
|     data_protection = karborclient.osc.plugin | ||||
|  | ||||
| openstack.data_protection.v1 = | ||||
|     dataprotection_plan_list = karborclient.osc.v1.plans:ListPlans | ||||
|  | ||||
| [build_sphinx] | ||||
| source-dir = doc/source | ||||
| build-dir = doc/build | ||||
|   | ||||
| @@ -10,6 +10,8 @@ docutils>=0.11 # OSI-Approved Open Source, Public Domain | ||||
| sphinx!=1.6.1,>=1.5.1 # BSD | ||||
| oslosphinx>=4.7.0 # Apache-2.0 | ||||
| oslotest>=1.10.0 # Apache-2.0 | ||||
| python-openstackclient!=3.10.0,>=3.3.0 # Apache-2.0 | ||||
| requests-mock>=1.1 # Apache-2.0 | ||||
| testrepository>=0.0.18 # Apache-2.0/BSD | ||||
| testscenarios>=0.4 # Apache-2.0/BSD | ||||
| testtools>=1.4.0 # MIT | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Jenkins
					Jenkins