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
|
simplejson>=2.2.0 # MIT
|
||||||
Babel!=2.4.0,>=2.3.4 # BSD
|
Babel!=2.4.0,>=2.3.4 # BSD
|
||||||
six>=1.9.0 # MIT
|
six>=1.9.0 # MIT
|
||||||
|
osc-lib>=1.5.1 # Apache-2.0
|
||||||
oslo.utils>=3.20.0 # Apache-2.0
|
oslo.utils>=3.20.0 # Apache-2.0
|
||||||
oslo.log>=3.22.0 # Apache-2.0
|
oslo.log>=3.22.0 # Apache-2.0
|
||||||
oslo.i18n>=2.1.0 # Apache-2.0
|
oslo.i18n>=2.1.0 # Apache-2.0
|
||||||
|
|||||||
@@ -30,6 +30,12 @@ packages =
|
|||||||
console_scripts =
|
console_scripts =
|
||||||
karbor = karborclient.shell:main
|
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]
|
[build_sphinx]
|
||||||
source-dir = doc/source
|
source-dir = doc/source
|
||||||
build-dir = doc/build
|
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
|
sphinx!=1.6.1,>=1.5.1 # BSD
|
||||||
oslosphinx>=4.7.0 # Apache-2.0
|
oslosphinx>=4.7.0 # Apache-2.0
|
||||||
oslotest>=1.10.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
|
testrepository>=0.0.18 # Apache-2.0/BSD
|
||||||
testscenarios>=0.4 # Apache-2.0/BSD
|
testscenarios>=0.4 # Apache-2.0/BSD
|
||||||
testtools>=1.4.0 # MIT
|
testtools>=1.4.0 # MIT
|
||||||
|
|||||||
Reference in New Issue
Block a user