Compare commits

..

4 Commits

Author SHA1 Message Date
OpenDev Sysadmins
bce6f76f24 OpenDev Migration Patch
This commit was bulk generated and pushed by the OpenDev sysadmins
as a part of the Git hosting and code review systems migration
detailed in these mailing list posts:

http://lists.openstack.org/pipermail/openstack-discuss/2019-March/003603.html
http://lists.openstack.org/pipermail/openstack-discuss/2019-April/004920.html

Attempts have been made to correct repository namespaces and
hostnames based on simple pattern matching, but it's possible some
were updated incorrectly or missed entirely. Please reach out to us
via the contact information listed at https://opendev.org/ with any
questions you may have.
2019-04-19 19:41:49 +00:00
Nguyen Hai
f70ab4f6c3 import zuul job settings from project-config
This is a mechanically generated patch to complete step 1 of moving
the zuul job settings out of project-config and into each project
repository.

Because there will be a separate patch on each branch, the branch
specifiers for branch-specific jobs have been removed.

Because this patch is generated by a script, there may be some
cosmetic changes to the layout of the YAML file(s) as the contents are
normalized.

See the python3-first goal document for details:
https://governance.openstack.org/tc/goals/stein/python3-first.html

Change-Id: I846e41f9e8a505c40ed7c544cb51374802bdaf0a
Story: #2002586
Task: #24303
2018-08-22 15:09:14 +09:00
05236a4a8f Update UPPER_CONSTRAINTS_FILE for stable/rocky
The new stable upper-constraints file is only available
after the openstack/requirements repository is branched.
This will happen around the RC1 timeframe.

Recheck and merge this change once the requirements
repository has been branched.

The CI system will work with this patch before the requirements
repository is branched because zuul configues the job to run
with a local copy of the file and defaults to the master branch.
However, accepting the patch will break the test configuration
on developers' local systems, so please wait until after the
requirements repository is branched to merge the patch.

Change-Id: Iad073974b8aea540e9771b82825a5266027da7d1
2018-08-13 15:43:25 +00:00
08a33bdc3d Update .gitreview for stable/rocky
Change-Id: I0530795bf5b57ebddfdea81175e05c6c41a3b14a
2018-08-13 15:43:23 +00:00
31 changed files with 111 additions and 608 deletions

View File

@@ -2,3 +2,4 @@
host=review.opendev.org
port=29418
project=openstack/python-karborclient.git
defaultbranch=stable/rocky

View File

@@ -1,9 +1,16 @@
- project:
templates:
- check-requirements
- openstack-cover-jobs
- openstack-lower-constraints-jobs
- openstack-python-jobs
- openstack-python3-train-jobs
- openstack-python35-jobs
- check-requirements
- publish-openstack-sphinx-docs
- openstackclient-plugin-jobs
- publish-openstack-docs-pti
check:
jobs:
- openstack-tox-lower-constraints
- openstack-tox-cover:
voting: false
gate:
jobs:
- openstack-tox-lower-constraints

View File

@@ -15,6 +15,10 @@ Karbor
:target: https://pypi.org/project/python-karborclient/
:alt: Latest Version
.. image:: https://img.shields.io/pypi/dm/python-karborclient.svg
:target: https://pypi.org/project/python-karborclient/
:alt: Downloads
Karbor Mission Statement
@@ -36,7 +40,7 @@ Karbor Mission Statement
.. _Launchpad project: https://launchpad.net/python-karborclient
.. _Blueprints: https://blueprints.launchpad.net/python-karborclient
.. _Bugs: https://bugs.launchpad.net/python-karborclient
.. _Source: https://opendev.org/openstack/python-karborclient
.. _Source: https://git.openstack.org/cgit/openstack/python-karborclient
.. _Specs: https://docs.openstack.org/karbor/latest/specs/index.html
.. _How to Contribute: https://docs.openstack.org/infra/manual/developers.html

View File

@@ -25,10 +25,14 @@ OpenStack Client interface. Handles the REST calls and responses.
# E0202: An attribute inherited from %s hide this method
# pylint: disable=E0202
try:
import simplejson as json
except ImportError:
import json
import time
from oslo_log import log as logging
from oslo_serialization import jsonutils
from oslo_utils import importutils
import requests
@@ -128,7 +132,7 @@ class HTTPClient(object):
def serialize(self, kwargs):
if kwargs.get('json') is not None:
kwargs['headers']['Content-Type'] = 'application/json'
kwargs['data'] = jsonutils.dumps(kwargs['json'])
kwargs['data'] = json.dumps(kwargs['json'])
try:
del kwargs['json']
except KeyError:

View File

@@ -24,7 +24,7 @@ places where actual behavior differs from the spec.
# W0102: Dangerous default value %s as argument
# pylint: disable=W0102
from oslo_serialization import jsonutils
import json
import requests
import six
@@ -58,7 +58,7 @@ class TestResponse(requests.Response):
# Fake the text attribute to streamline Response creation
text = data.get('text', "")
if isinstance(text, (dict, list)):
self._content = jsonutils.dumps(text)
self._content = json.dumps(text)
default_headers = {
"Content-Type": "application/json",
}

View File

@@ -12,13 +12,13 @@
from __future__ import print_function
import json
import os
import sys
import six
import uuid
from oslo_serialization import jsonutils
from oslo_utils import encodeutils
import prettytable
@@ -138,7 +138,7 @@ def dict_prettyprint(val):
:param val: dict.
:return: formatted json string.
"""
return jsonutils.dumps(val, indent=2, sort_keys=True)
return json.dumps(val, indent=2, sort_keys=True)
def json_prettyprint(val):
@@ -147,8 +147,7 @@ def json_prettyprint(val):
:param val: json string.
:return: formatted json string.
"""
return val and jsonutils.dumps(jsonutils.loads(val),
indent=2, sort_keys=True)
return val and json.dumps(json.loads(val), indent=2, sort_keys=True)
def find_resource(manager, name_or_id, *args, **kwargs):

View File

@@ -12,10 +12,10 @@
"""Data protection V1 checkpoint action implementations"""
import json
from osc_lib.command import command
from osc_lib import utils as osc_utils
from oslo_log import log as logging
from oslo_serialization import jsonutils
from karborclient.common.apiclient import exceptions
from karborclient.i18n import _
@@ -28,7 +28,7 @@ def format_checkpoint(checkpoint_info):
checkpoint_info['protection_plan'] = "Name: %s\nId: %s" % (
plan['name'], plan['id'])
if 'resource_graph' in checkpoint_info:
checkpoint_info['resource_graph'] = jsonutils.dumps(jsonutils.loads(
checkpoint_info['resource_graph'] = json.dumps(json.loads(
checkpoint_info['resource_graph']), indent=2, sort_keys=True)
checkpoint_info.pop("links", None)
@@ -45,12 +45,6 @@ class ListCheckpoints(command.Lister):
metavar='<provider_id>',
help=_('ID of provider.'),
)
parser.add_argument(
'--all-projects',
action='store_true',
default=False,
help=_('Include all projects (admin only)'),
)
parser.add_argument(
'--plan_id',
metavar='<plan_id>',
@@ -101,13 +95,12 @@ class ListCheckpoints(command.Lister):
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.project_id) or parsed_args.all_projects
search_opts = {
'plan_id': parsed_args.plan_id,
'start_date': parsed_args.start_date,
'end_date': parsed_args.end_date,
'project_id': parsed_args.project_id,
'all_tenants': all_projects
}
data = data_protection_client.checkpoints.list(
@@ -226,58 +219,3 @@ class DeleteCheckpoint(command.Command):
raise exceptions.CommandError(
"Unable to find and delete any of the "
"specified checkpoint.")
class ResetCheckpointState(command.Command):
_description = "Reset checkpoint state"
log = logging.getLogger(__name__ + ".ResetCheckpointState")
def get_parser(self, prog_name):
parser = super(ResetCheckpointState, self).get_parser(prog_name)
parser.add_argument(
'provider_id',
metavar='<provider_id>',
help=_('Id of provider.')
)
parser.add_argument(
'checkpoint',
metavar='<checkpoint>',
nargs="+",
help=_('Id of checkpoint.')
)
parser.add_argument(
'--available',
action='store_const', dest='state',
default='error', const='available',
help=_('Request the checkpoint be reset to "available" state '
'instead of "error" state(the default).'),
)
return parser
def take_action(self, parsed_args):
client = self.app.client_manager.data_protection
failure_count = 0
for checkpoint_id in parsed_args.checkpoint:
try:
client.checkpoints.reset_state(
parsed_args.provider_id, checkpoint_id, parsed_args.state)
except exceptions.NotFound:
failure_count += 1
self.log.error(
"Failed to reset state of '{0}'; checkpoint "
"not found".format(checkpoint_id))
except exceptions.Forbidden:
failure_count += 1
self.log.error(
"Failed to reset state of '{0}'; not "
"allowed".format(checkpoint_id))
except exceptions.BadRequest:
failure_count += 1
self.log.error(
"Failed to reset state of '{0}'; invalid input or "
"current checkpoint state".format(checkpoint_id))
if failure_count == len(parsed_args.checkpoint):
raise exceptions.CommandError(
"Unable to find or reset any of the specified "
"checkpoint's state.")

View File

@@ -12,7 +12,7 @@
"""Data protection V1 plan action implementations"""
from oslo_serialization import jsonutils
import json
from oslo_utils import uuidutils
from osc_lib.command import command
@@ -28,8 +28,7 @@ def format_plan(plan_info):
for key in ('resources', 'parameters'):
if key not in plan_info:
continue
plan_info[key] = jsonutils.dumps(plan_info[key],
indent=2, sort_keys=True)
plan_info[key] = json.dumps(plan_info[key], indent=2, sort_keys=True)
plan_info.pop("links", None)
@@ -211,11 +210,6 @@ class UpdatePlan(command.ShowOne):
metavar="<name>",
help=_("A name to which the plan will be renamed.")
)
parser.add_argument(
"--description",
metavar="<description>",
help=_("Description to which the plan will be updated.")
)
parser.add_argument(
"--resources",
metavar="<id=type=name,id=type=name>",
@@ -233,8 +227,6 @@ class UpdatePlan(command.ShowOne):
data = {}
if parsed_args.name is not None:
data['name'] = parsed_args.name
if parsed_args.description is not None:
data['description'] = parsed_args.description
if parsed_args.resources is not None:
plan_resources = utils.extract_resources(parsed_args)
data['resources'] = plan_resources

View File

@@ -13,10 +13,10 @@
"""Data protection V1 protectables action implementations"""
import functools
import json
from osc_lib.command import command
from osc_lib import utils as osc_utils
from oslo_log import log as logging
from oslo_serialization import jsonutils
from karborclient.i18n import _
from karborclient import utils
@@ -136,8 +136,7 @@ class ListProtectableInstances(command.Lister):
column_headers = ['Id', 'Type', 'Name', 'Dependent resources',
'Extra info']
json_dumps = functools.partial(jsonutils.dumps,
indent=2, sort_keys=True)
json_dumps = functools.partial(json.dumps, indent=2, sort_keys=True)
formatters = {
"Extra info": json_dumps,
"Dependent resources": json_dumps,
@@ -187,8 +186,7 @@ class ShowProtectableInstance(command.ShowOne):
parsed_args.protectable_id,
search_opts=search_opts)
json_dumps = functools.partial(jsonutils.dumps,
indent=2, sort_keys=True)
json_dumps = functools.partial(json.dumps, indent=2, sort_keys=True)
instance._info.pop("links", None)
for key in ('extra_info', 'dependent_resources'):
if key not in instance._info:

View File

@@ -13,10 +13,10 @@
"""Data protection V1 provider action implementations"""
import functools
import json
from osc_lib.command import command
from osc_lib import utils as osc_utils
from oslo_log import log as logging
from oslo_serialization import jsonutils
from karborclient.i18n import _
@@ -96,8 +96,7 @@ class ShowProvider(command.ShowOne):
client = self.app.client_manager.data_protection
provider = osc_utils.find_resource(client.providers,
parsed_args.provider)
json_dumps = functools.partial(jsonutils.dumps,
indent=2, sort_keys=True)
json_dumps = functools.partial(json.dumps, indent=2, sort_keys=True)
provider._info.pop("links", None)
if 'extended_info_schema' in provider._info:
provider._info['extended_info_schema'] = json_dumps(

View File

@@ -13,8 +13,8 @@
"""Data protection V1 restore action implementations"""
import functools
import json
from oslo_serialization import jsonutils
from oslo_utils import uuidutils
from osc_lib.command import command
@@ -31,8 +31,8 @@ def format_restore(restore_info):
'resources_reason'):
if key not in restore_info:
continue
restore_info[key] = jsonutils.dumps(restore_info[key],
indent=2, sort_keys=True)
restore_info[key] = json.dumps(restore_info[key],
indent=2, sort_keys=True)
restore_info.pop("links", None)
@@ -98,9 +98,7 @@ class ListRestores(command.Lister):
column_headers = ['Id', 'Project id', 'Provider id', 'Checkpoint id',
'Restore target', 'Parameters', 'Status']
json_dumps = functools.partial(jsonutils.dumps,
indent=2,
sort_keys=True)
json_dumps = functools.partial(json.dumps, indent=2, sort_keys=True)
formatters = {
"Parameters": json_dumps,
}

View File

@@ -13,9 +13,9 @@
"""Data protection V1 scheduled_operations action implementations"""
import functools
import json
import six
from oslo_serialization import jsonutils
from oslo_utils import uuidutils
from osc_lib.command import command
@@ -30,8 +30,8 @@ def format_scheduledoperation(scheduledoperation_info):
for key in ('operation_definition', ):
if key not in scheduledoperation_info:
continue
scheduledoperation_info[key] = jsonutils.dumps(
scheduledoperation_info[key], indent=2, sort_keys=True)
scheduledoperation_info[key] = json.dumps(scheduledoperation_info[key],
indent=2, sort_keys=True)
scheduledoperation_info.pop("links", None)
@@ -118,9 +118,7 @@ class ListScheduledOperations(command.Lister):
column_headers = ['Id', 'Name', 'Operation Type', 'Trigger Id',
'Operation Definition']
json_dumps = functools.partial(jsonutils.dumps,
indent=2,
sort_keys=True)
json_dumps = functools.partial(json.dumps, indent=2, sort_keys=True)
formatters = {
"Operation Definition": json_dumps,
}

View File

@@ -13,13 +13,13 @@
"""Data protection V1 verification action implementations"""
import functools
import json
from oslo_log import log as logging
from oslo_serialization import jsonutils
from oslo_utils import uuidutils
from osc_lib.command import command
from osc_lib import utils as osc_utils
from oslo_log import log as logging
from karborclient.common.apiclient import exceptions
from karborclient.i18n import _
@@ -31,8 +31,8 @@ def format_verification(verification_info):
'resources_reason'):
if key not in verification_info:
continue
verification_info[key] = jsonutils.dumps(verification_info[key],
indent=2, sort_keys=True)
verification_info[key] = json.dumps(verification_info[key],
indent=2, sort_keys=True)
verification_info.pop("links", None)
@@ -98,9 +98,7 @@ class ListVerifications(command.Lister):
column_headers = ['Id', 'Project id', 'Provider id', 'Checkpoint id',
'Parameters', 'Status']
json_dumps = functools.partial(jsonutils.dumps,
indent=2,
sort_keys=True)
json_dumps = functools.partial(json.dumps, indent=2, sort_keys=True)
formatters = {
"Parameters": json_dumps,
}

View File

@@ -400,9 +400,9 @@ class KarborShell(object):
if args.api_timeout:
kwargs['timeout'] = args.api_timeout
self.cs = karbor_client.Client(api_version, endpoint, **kwargs)
client = karbor_client.Client(api_version, endpoint, **kwargs)
args.func(self.cs, args)
args.func(client, args)
def do_bash_completion(self, args):
"""Prints all of the commands and options to stdout."""

View File

@@ -12,8 +12,7 @@
# limitations under the License.
import copy
from oslo_serialization import jsonutils
import json
from karborclient.osc.v1 import checkpoints as osc_checkpoints
from karborclient.tests.unit.osc.v1 import fakes
@@ -33,27 +32,7 @@ CHECKPOINT_INFO = {
"type": "OS::Glance::Image",
"name": "cirros-0.3.4-x86_64-uec"}]
},
"resource_graph": jsonutils.dumps(
"[{'0x0': ['OS::Glance::Image', "
"'99777fdd-8a5b-45ab-ba2c-52420008103f', "
"'cirros-0.3.4-x86_64-uec']}, [[['0x0']]]]"
),
}
CHECKPOINT_INFO_2 = {
"id": "a6fd95fe-0892-43b2-ad3c-e56f3a1b86b8",
"project_id": "79b35e99a6a541b3bcede40f590d6878",
"status": "available",
"protection_plan": {
"id": "3b47fd5d-21f9-4e63-8409-0acb1bffc038",
"name": "My application",
"provider_id": "cf56bd3e-97a7-4078-b6d5-f36246333fd9",
"resources": [{
"id": "99777fdd-8a5b-45ab-ba2c-52420008103f",
"type": "OS::Glance::Image",
"name": "cirros-0.3.4-x86_64-uec"}]
},
"resource_graph": jsonutils.dumps(
"resource_graph": json.dumps(
"[{'0x0': ['OS::Glance::Image', "
"'99777fdd-8a5b-45ab-ba2c-52420008103f', "
"'cirros-0.3.4-x86_64-uec']}, [[['0x0']]]]"
@@ -72,13 +51,13 @@ class TestCheckpoints(fakes.TestDataProtection):
class TestListCheckpoints(TestCheckpoints):
def setUp(self):
super(TestListCheckpoints, self).setUp()
self.checkpoints_mock.list.return_value = [checkpoints.Checkpoint(
None, copy.deepcopy(CHECKPOINT_INFO))]
# Command to test
self.cmd = osc_checkpoints.ListCheckpoints(self.app, None)
def test_checkpoints_list(self):
self.checkpoints_mock.list.return_value = [checkpoints.Checkpoint(
None, copy.deepcopy(CHECKPOINT_INFO))]
arglist = ['cf56bd3e-97a7-4078-b6d5-f36246333fd9']
verifylist = [('provider_id', 'cf56bd3e-97a7-4078-b6d5-f36246333fd9')]
@@ -105,44 +84,6 @@ class TestListCheckpoints(TestCheckpoints):
'')]
self.assertEqual(expected_data, list(data))
def test_checkpoints_list_with_all_projects(self):
self.checkpoints_mock.list.return_value = [checkpoints.Checkpoint(
None, copy.deepcopy(CHECKPOINT_INFO)), checkpoints.Checkpoint(
None, copy.deepcopy(CHECKPOINT_INFO_2))]
arglist = ['cf56bd3e-97a7-4078-b6d5-f36246333fd9', '--all-projects']
verifylist = [('provider_id', 'cf56bd3e-97a7-4078-b6d5-f36246333fd9'),
('all_projects', True)]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
columns, data = self.cmd.take_action(parsed_args)
expected_columns = (
['Id', 'Project id', 'Status', 'Protection plan', 'Metadata',
'Created at'])
self.assertEqual(expected_columns, columns)
expected_data = [(
"dcb20606-ad71-40a3-80e4-ef0fafdad0c3",
"e486a2f49695423ca9c47e589b948108",
"available",
"Name: %(name)s\nId: %(id)s" % {
"id": "3523a271-68aa-42f5-b9ba-56e5200a2ebb",
"name": "My application",
},
'',
''), (
"a6fd95fe-0892-43b2-ad3c-e56f3a1b86b8",
"79b35e99a6a541b3bcede40f590d6878",
"available",
"Name: %(name)s\nId: %(id)s" % {
"id": "3b47fd5d-21f9-4e63-8409-0acb1bffc038",
"name": "My application",
},
'',
'')
]
self.assertEqual(expected_data, list(data))
class TestCreateCheckpoint(TestCheckpoints):
def setUp(self):
@@ -217,38 +158,3 @@ class TestDeleteCheckpoint(TestCheckpoints):
self.checkpoints_mock.delete.assert_called_once_with(
'cf56bd3e-97a7-4078-b6d5-f36246333fd9',
'dcb20606-ad71-40a3-80e4-ef0fafdad0c3')
class TestResetCheckpointState(TestCheckpoints):
def setUp(self):
super(TestResetCheckpointState, self).setUp()
self.cmd = osc_checkpoints.ResetCheckpointState(self.app, None)
def test_reset_checkpoint_with_default_state(self):
arglist = ['cf56bd3e-97a7-4078-b6d5-f36246333fd9',
'dcb20606-ad71-40a3-80e4-ef0fafdad0c3']
verifylist = [('provider_id', 'cf56bd3e-97a7-4078-b6d5-f36246333fd9'),
('checkpoint',
['dcb20606-ad71-40a3-80e4-ef0fafdad0c3']),
('state', 'error')]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
self.cmd.take_action(parsed_args)
self.checkpoints_mock.reset_state.assert_called_once_with(
'cf56bd3e-97a7-4078-b6d5-f36246333fd9',
'dcb20606-ad71-40a3-80e4-ef0fafdad0c3',
'error')
def test_reset_checkpoint(self):
arglist = ['cf56bd3e-97a7-4078-b6d5-f36246333fd9',
'dcb20606-ad71-40a3-80e4-ef0fafdad0c3',
'--available']
verifylist = [('provider_id', 'cf56bd3e-97a7-4078-b6d5-f36246333fd9'),
('checkpoint',
['dcb20606-ad71-40a3-80e4-ef0fafdad0c3']),
('state', 'available')]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
self.cmd.take_action(parsed_args)
self.checkpoints_mock.reset_state.assert_called_once_with(
'cf56bd3e-97a7-4078-b6d5-f36246333fd9',
'dcb20606-ad71-40a3-80e4-ef0fafdad0c3',
'available')

View File

@@ -12,8 +12,7 @@
# limitations under the License.
import copy
from oslo_serialization import jsonutils
import json
from karborclient.osc.v1 import restores as osc_restores
from karborclient.tests.unit.osc.v1 import fakes
@@ -70,7 +69,7 @@ class TestListRestores(TestRestores):
"cf56bd3e-97a7-4078-b6d5-f36246333fd9",
"dcb20606-ad71-40a3-80e4-ef0fafdad0c3",
"",
jsonutils.dumps({}),
json.dumps({}),
"success")]
self.assertEqual(expected_data, list(data))

View File

@@ -12,8 +12,7 @@
# limitations under the License.
import copy
from oslo_serialization import jsonutils
import json
from karborclient.osc.v1 import verifications as osc_verifications
from karborclient.tests.unit.osc.v1 import fakes
@@ -68,7 +67,7 @@ class TestListVerifications(TestVerifications):
"e486a2f49695423ca9c47e589b948108",
"cf56bd3e-97a7-4078-b6d5-f36246333fd9",
"dcb20606-ad71-40a3-80e4-ef0fafdad0c3",
jsonutils.dumps({}),
json.dumps({}),
"success")]
self.assertEqual(expected_data, list(data))

View File

@@ -37,13 +37,12 @@ class FakeClient(fakes.FakeClient, client.Client):
'project_id': PROJECT_ID,
}
client.Client.__init__(self, 'http://endpoint', **kwargs)
self.client = self.http_client
self.client = FakeHTTPClient(**kwargs)
class FakeHTTPClient(base_client.HTTPClient):
def __init__(self, endpoint, **kwargs):
super(FakeHTTPClient, self)
def __init__(self, **kwargs):
self.username = 'username'
self.password = 'password'
self.auth_url = 'auth_url'
@@ -51,9 +50,6 @@ class FakeHTTPClient(base_client.HTTPClient):
self.management_url = 'http://10.0.2.15:8776/v1/fake'
self.osapi_max_limit = 1000
self.marker = None
self.project_id = 'project_id'
self.auth_token = 'auth_token'
self.region_name = 'region_name'
def _cs_request(self, url, method, **kwargs):
# Check that certain things are called correctly
@@ -96,27 +92,3 @@ class FakeHTTPClient(base_client.HTTPClient):
"headers": headers,
})
return r, body
def json_request(self, method, url, **kwargs):
return self._cs_request(url, method, **kwargs)
def get_providers_1234_checkpoints(self, **kwargs):
return 200, {}, {"checkpoints": []}
def get_plans(self, **kwargs):
return 200, {}, {"plans": []}
def get_operation_logs(self, **kwargs):
return 200, {}, {"operation_logs": []}
def get_restores(self, **kwargs):
return 200, {}, {"restores": []}
def get_scheduled_operations(self, **kwargs):
return 200, {}, {"operations": []}
def get_triggers(self, **kwargs):
return 200, {}, {"triggers": []}
def get_verifications(self, **kwargs):
return 200, {}, {"verifications": []}

View File

@@ -20,7 +20,6 @@ mock_request_return = ({}, {'checkpoint': {}})
FAKE_PROVIDER_ID = "2220f8b1-975d-4621-a872-fa9afb43cb6c"
FAKE_PLAN_ID = "3330f8b1-975d-4621-a872-fa9afb43cb6c"
FAKE_CHECKPOINT_ID = "e4381b1a-905e-4fec-8104-b4419ccaf963"
class CheckpointsTest(base.TestCaseShell):
@@ -34,16 +33,6 @@ class CheckpointsTest(base.TestCaseShell):
'/providers/{provider_id}/checkpoints'.format(
provider_id=FAKE_PROVIDER_ID), headers={})
@mock.patch('karborclient.common.http.HTTPClient.json_request')
def test_list_checkpoints_with_all_tenants(self, mock_request):
mock_request.return_value = mock_request_return
cs.checkpoints.list(provider_id=FAKE_PROVIDER_ID,
search_opts={'all_tenants': 1})
mock_request.assert_called_with(
'GET',
'/providers/{provider_id}/checkpoints?all_tenants=1'.format(
provider_id=FAKE_PROVIDER_ID), headers={})
@mock.patch('karborclient.common.http.HTTPClient.json_request')
def test_get_checkpoint(self, mock_request):
mock_request.return_value = mock_request_return
@@ -101,17 +90,3 @@ class CheckpointsTest(base.TestCaseShell):
data={
'checkpoint': {'plan_id': FAKE_PLAN_ID, 'extra-info': None}},
headers={})
@mock.patch('karborclient.common.http.HTTPClient.json_request')
def test_reset_checkpoint_state(self, mock_request):
mock_request.return_value = ({}, {})
cs.checkpoints.reset_state(
FAKE_PROVIDER_ID, FAKE_CHECKPOINT_ID, 'error')
mock_request.assert_called_with(
'PUT',
'/providers/{provider_id}/checkpoints/{checkpoint_id}'.format(
provider_id=FAKE_PROVIDER_ID,
checkpoint_id=FAKE_CHECKPOINT_ID
),
data={'os-resetState': {'state': 'error'}},
headers={})

View File

@@ -21,22 +21,6 @@ mock_request_return = ({}, {'operation_log': {}})
class OperationLogsTest(base.TestCaseShell):
@mock.patch('karborclient.common.http.HTTPClient.json_request')
def test_list_operation_logs(self, mock_request):
mock_request.return_value = mock_request_return
cs.operation_logs.list()
mock_request.assert_called_with(
'GET',
'/operation_logs', headers={})
@mock.patch('karborclient.common.http.HTTPClient.json_request')
def test_list_operation_logs_with_all_tenants(self, mock_request):
mock_request.return_value = mock_request_return
cs.operation_logs.list(search_opts={'all_tenants': 1})
mock_request.assert_called_with(
'GET',
'/operation_logs?all_tenants=1', headers={})
@mock.patch('karborclient.common.http.HTTPClient.json_request')
def test_list_operation_logs_with_marker_limit(self, mock_request):
mock_request.return_value = mock_request_return

View File

@@ -30,15 +30,6 @@ class QuotaClassesTest(base.TestCaseShell):
'/quota_classes/default',
data={'quota_class': {'plans': 50}}, headers={})
@mock.patch('karborclient.common.http.HTTPClient.json_request')
def test_quota_class_update_with_none(self, mock_request):
mock_request.return_value = mock_request_return
cs.quota_classes.update('default', {'plans': None})
mock_request.assert_called_with(
'PUT',
'/quota_classes/default',
data={'quota_class': {'plans': 50}}, headers={})
@mock.patch('karborclient.common.http.HTTPClient.json_request')
def test_show_quota_class(self, mock_request):
mock_request.return_value = mock_request_return
@@ -47,12 +38,3 @@ class QuotaClassesTest(base.TestCaseShell):
'GET',
'/quota_classes/default',
headers={})
@mock.patch('karborclient.common.http.HTTPClient.json_request')
def test_show_quota_class_with_headers(self, mock_request):
mock_request.return_value = mock_request_return
cs.quota_classes.get('default', session_id='fake_session_id')
mock_request.assert_called_with(
'GET',
'/quota_classes/default',
headers={'X-Configuration-Session': 'fake_session_id'})

View File

@@ -30,15 +30,6 @@ class QuotasTest(base.TestCaseShell):
'/quotas/{project_id}'.format(project_id=fakes.PROJECT_ID),
data={'quota': {'plans': 50}}, headers={})
@mock.patch('karborclient.common.http.HTTPClient.json_request')
def test_quota_update_with_none(self, mock_request):
mock_request.return_value = mock_request_return
cs.quotas.update(fakes.PROJECT_ID, {'plans': None})
mock_request.assert_called_with(
'PUT',
'/quotas/{project_id}'.format(project_id=fakes.PROJECT_ID),
data={'quota': {'plans': 50}}, headers={})
@mock.patch('karborclient.common.http.HTTPClient.json_request')
def test_show_quota(self, mock_request):
mock_request.return_value = mock_request_return
@@ -48,15 +39,6 @@ class QuotasTest(base.TestCaseShell):
'/quotas/{project_id}'.format(project_id=fakes.PROJECT_ID),
headers={})
@mock.patch('karborclient.common.http.HTTPClient.json_request')
def test_show_quota_with_headers(self, mock_request):
mock_request.return_value = mock_request_return
cs.quotas.get(fakes.PROJECT_ID, False, session_id='fake_session_id')
mock_request.assert_called_with(
'GET',
'/quotas/{project_id}'.format(project_id=fakes.PROJECT_ID),
headers={'X-Configuration-Session': 'fake_session_id'})
@mock.patch('karborclient.common.http.HTTPClient.json_request')
def test_show_quota_with_detail(self, mock_request):
mock_request.return_value = mock_request_return
@@ -76,13 +58,3 @@ class QuotasTest(base.TestCaseShell):
'/quotas/{project_id}/defaults'.format(
project_id=fakes.PROJECT_ID),
headers={})
@mock.patch('karborclient.common.http.HTTPClient.json_request')
def test_show_quota_default_with_headers(self, mock_request):
mock_request.return_value = mock_request_return
cs.quotas.defaults(fakes.PROJECT_ID, session_id='fake_session_id')
mock_request.assert_called_with(
'GET',
'/quotas/{project_id}/defaults'.format(
project_id=fakes.PROJECT_ID),
headers={'X-Configuration-Session': 'fake_session_id'})

View File

@@ -1,137 +0,0 @@
# 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 fixtures
import mock
from karborclient import shell
from karborclient.tests.unit import base
from karborclient.tests.unit.v1 import fakes
FAKE_PROVIDER_ID = '1234'
FAKE_ENDPOINT = 'http://127.0.0.1/identity'
class ShellFixture(fixtures.Fixture):
def setUp(self):
super(ShellFixture, self).setUp()
self.shell = shell.KarborShell()
def tearDown(self):
# For some method like test_image_meta_bad_action we are
# testing a SystemExit to be thrown and object self.shell has
# no time to get instantiated which is OK in this case, so
# we make sure the method is there before launching it.
if hasattr(self.shell, 'cs'):
self.shell.cs.clear_callstack()
super(ShellFixture, self).tearDown()
class ShellTest(base.TestCaseShell):
FAKE_ENV = {
'OS_USERNAME': 'username',
'OS_PASSWORD': 'password',
'OS_TENANT_NAME': 'project_id',
'OS_AUTH_URL': 'http://no.where/v2.0',
'OS_AUTH_TOKEN': 'fake_token'
}
def setUp(self):
"""Run before each test."""
super(ShellTest, self).setUp()
for var in self.FAKE_ENV:
self.useFixture(fixtures.EnvironmentVariable(
var, self.FAKE_ENV[var]))
self.shell = self.useFixture(ShellFixture()).shell
get_endpoint = mock.MagicMock()
get_endpoint.return_value = FAKE_ENDPOINT
self.useFixture(fixtures.MonkeyPatch(
'keystoneauth1.identity.generic.token.Token.get_endpoint',
get_endpoint))
self.useFixture(fixtures.MonkeyPatch('karborclient.client.Client',
fakes.FakeClient))
self.useFixture(fixtures.MonkeyPatch(
'karborclient.common.http._construct_http_client',
fakes.FakeHTTPClient))
def run_command(self, cmd):
if not isinstance(cmd, list):
cmd = cmd.split()
self.shell.main(cmd)
def assert_called(self, method, url, body=None, **kwargs):
return self.shell.cs.assert_called(method, url, body, **kwargs)
def test_checkpoint_list_with_all_tenants(self):
self.run_command(
'checkpoint-list ' + FAKE_PROVIDER_ID + ' --all-tenants 1')
self.assert_called('GET',
'/providers/1234/'
'checkpoints?all_tenants=1')
def test_checkpoint_list_with_all(self):
self.run_command(
'checkpoint-list ' + FAKE_PROVIDER_ID + ' --all')
self.assert_called('GET',
'/providers/1234/'
'checkpoints?all_tenants=1')
def test_plan_list_with_all_tenants(self):
self.run_command('plan-list --all-tenants 1')
self.assert_called('GET', '/plans?all_tenants=1')
def test_plan_list_with_all(self):
self.run_command('plan-list --all')
self.assert_called('GET', '/plans?all_tenants=1')
def test_resotre_list_with_all_tenants(self):
self.run_command('restore-list --all-tenants 1')
self.assert_called('GET', '/restores?all_tenants=1')
def test_resotre_list_with_all(self):
self.run_command('restore-list --all')
self.assert_called('GET', '/restores?all_tenants=1')
def test_verification_list_with_all_tenants(self):
self.run_command('verification-list --all-tenants 1')
self.assert_called('GET', '/verifications?all_tenants=1')
def test_verification_list_with_all(self):
self.run_command('verification-list --all')
self.assert_called('GET', '/verifications?all_tenants=1')
def test_trigger_list_with_all_tenants(self):
self.run_command('trigger-list --all-tenants 1')
self.assert_called('GET', '/triggers?all_tenants=1')
def test_trigger_list_with_all(self):
self.run_command('trigger-list --all')
self.assert_called('GET', '/triggers?all_tenants=1')
def test_scheduledoperation_list_with_all_tenants(self):
self.run_command('scheduledoperation-list --all-tenants 1')
self.assert_called('GET', '/scheduled_operations?all_tenants=1')
def test_scheduledoperation_list_with_all(self):
self.run_command('scheduledoperation-list --all')
self.assert_called('GET', '/scheduled_operations?all_tenants=1')
def test_operationlog_list_with_all_tenants(self):
self.run_command('operationlog-list --all-tenants 1')
self.assert_called('GET', '/operation_logs?all_tenants=1')
def test_operationlog_list_with_all(self):
self.run_command('operationlog-list --all')
self.assert_called('GET', '/operation_logs?all_tenants=1')

View File

@@ -12,7 +12,6 @@
import mock
from karborclient.common.apiclient import exceptions
from karborclient.tests.unit import base
from karborclient.tests.unit.v1 import fakes
@@ -22,22 +21,6 @@ mock_request_return = ({}, {'trigger_info': {'name': 'fake_name'}})
class TriggersTest(base.TestCaseShell):
@mock.patch('karborclient.common.http.HTTPClient.json_request')
def test_list_triggers(self, mock_request):
mock_request.return_value = mock_request_return
cs.triggers.list()
mock_request.assert_called_with(
'GET',
'/triggers', headers={})
@mock.patch('karborclient.common.http.HTTPClient.json_request')
def test_list_triggers_with_all_tenants(self, mock_request):
mock_request.return_value = mock_request_return
cs.triggers.list(search_opts={'all_tenants': 1})
mock_request.assert_called_with(
'GET',
'/triggers?all_tenants=1', headers={})
@mock.patch('karborclient.common.http.HTTPClient.json_request')
def test_list_triggers_with_marker_limit(self, mock_request):
mock_request.return_value = mock_request_return
@@ -63,21 +46,16 @@ class TriggersTest(base.TestCaseShell):
@mock.patch('karborclient.common.http.HTTPClient.json_request')
def test_create_trigger(self, mock_request):
mock_request.return_value = mock_request_return
cs.triggers.create('name', 'time', {})
cs.triggers.create('name', 'time', 'properties')
mock_request.assert_called_with(
'POST',
'/triggers',
data={
'trigger_info': {'name': 'name',
'type': 'time',
'properties': {}}},
'properties': 'properties'}},
headers={})
def test_create_trigger_with_invalid_window(self):
self.assertRaises(exceptions.CommandError,
cs.triggers.create,
'name', 'time', {'window': 'fake'})
@mock.patch('karborclient.common.http.HTTPClient.raw_request')
def test_delete_trigger(self, mock_request):
mock_request.return_value = mock_request_return
@@ -119,9 +97,3 @@ class TriggersTest(base.TestCaseShell):
data=body,
headers={}
)
def test_update_trigger_with_invalid_window(self):
trigger_id = '123'
self.assertRaises(exceptions.CommandError,
cs.triggers.update,
trigger_id, {'properties': {'window': 'fake'}})

View File

@@ -43,15 +43,6 @@ class CheckpointManager(base.ManagerWithFind):
"checkpoints" .format(provider_id=provider_id)
return self._create(url, body, 'checkpoint')
def reset_state(self, provider_id, checkpoint_id, state):
body = {'os-resetState': {'state': state}}
return self.update(provider_id, checkpoint_id, body)
def update(self, provider_id, checkpoint_id, values):
url = '/providers/{provider_id}/checkpoints/{checkpoint_id}'.format(
provider_id=provider_id, checkpoint_id=checkpoint_id)
return self._update(url, values)
def delete(self, provider_id, checkpoint_id):
path = '/providers/{provider_id}/checkpoints/' \
'{checkpoint_id}'.format(provider_id=provider_id,

View File

@@ -26,9 +26,6 @@ class QuotaClassManager(base.ManagerWithFind):
def update(self, class_name, data):
if "plans" in data and data["plans"] is None:
data["plans"] = 50
body = {"quota_class": data}
return self._update('/quota_classes/{class_name}'

View File

@@ -26,9 +26,6 @@ class QuotaManager(base.ManagerWithFind):
def update(self, project_id, data):
if "plans" in data and data["plans"] is None:
data["plans"] = 50
body = {"quota": data}
return self._update('/quotas/{project_id}'

View File

@@ -11,10 +11,10 @@
# under the License.
import argparse
import json
import os
from datetime import datetime
from oslo_serialization import jsonutils
from oslo_utils import uuidutils
from karborclient.common.apiclient import exceptions
@@ -31,6 +31,11 @@ from karborclient import utils as arg_utils
const=1,
default=0,
help='Shows details for all tenants. Admin only.')
@utils.arg('--all_tenants',
nargs='?',
type=int,
const=1,
help=argparse.SUPPRESS)
@utils.arg('--name',
metavar='<name>',
default=None,
@@ -183,8 +188,6 @@ def do_plan_delete(cs, args):
help="Id of plan to update.")
@utils.arg("--name", metavar="<name>",
help="A name to which the plan will be renamed.")
@utils.arg("--description", metavar="<description>",
help="Description to which the plan will be updated.")
@utils.arg("--resources", metavar="<id=type=name,id=type=name>",
help="Resources to which the plan will be updated.")
@utils.arg("--status", metavar="<suspended|started>",
@@ -194,8 +197,6 @@ def do_plan_update(cs, args):
data = {}
if args.name is not None:
data['name'] = args.name
if args.description is not None:
data['description'] = args.description
if args.resources is not None:
plan_resources = arg_utils.extract_resources(args)
data['resources'] = plan_resources
@@ -281,6 +282,11 @@ def do_restore_create(cs, args):
const=1,
default=0,
help='Shows details for all tenants. Admin only.')
@utils.arg('--all_tenants',
nargs='?',
type=int,
const=1,
help=argparse.SUPPRESS)
@utils.arg('--status',
metavar='<status>',
default=None,
@@ -343,7 +349,7 @@ def do_restore_list(cs, args):
sortby_index = None
else:
sortby_index = 0
formatters = {"Parameters": lambda obj: jsonutils.dumps(
formatters = {"Parameters": lambda obj: json.dumps(
obj.parameters, indent=2, sort_keys=True)}
utils.print_list(restores, key_list, exclude_unavailable=True,
sortby_index=sortby_index, formatters=formatters)
@@ -406,6 +412,11 @@ def do_verification_create(cs, args):
const=1,
default=0,
help='Shows details for all tenants. Admin only.')
@utils.arg('--all_tenants',
nargs='?',
type=int,
const=1,
help=argparse.SUPPRESS)
@utils.arg('--status',
metavar='<status>',
default=None,
@@ -471,7 +482,7 @@ def do_verification_list(cs, args):
sortby_index = None
else:
sortby_index = 0
formatters = {"Parameters": lambda obj: jsonutils.dumps(
formatters = {"Parameters": lambda obj: json.dumps(
obj.parameters, indent=2, sort_keys=True)}
utils.print_list(verifications, key_list, exclude_unavailable=True,
sortby_index=sortby_index, formatters=formatters)
@@ -599,7 +610,7 @@ def do_protectable_list_instances(cs, args):
else:
sortby_index = 0
formatters = {"Dependent resources": lambda obj: jsonutils.dumps(
formatters = {"Dependent resources": lambda obj: json.dumps(
obj.dependent_resources, indent=2, sort_keys=True)}
utils.print_list(instances, key_list, exclude_unavailable=True,
sortby_index=sortby_index, formatters=formatters)
@@ -701,14 +712,6 @@ def do_checkpoint_create(cs, args):
json_format_list=json_format_list)
@utils.arg('--all-tenants',
dest='all_tenants',
metavar='<0|1>',
nargs='?',
type=int,
const=1,
default=0,
help='Shows details for all tenants. Admin only.')
@utils.arg('provider_id',
metavar='<provider_id>',
help='ID of provider.')
@@ -782,7 +785,6 @@ def do_checkpoint_list(cs, args):
'start_date': args.start_date,
'end_date': args.end_date,
'project_id': args.project_id,
'all_tenants': args.all_tenants
}
if args.sort and (args.sort_key or args.sort_dir):
@@ -850,45 +852,6 @@ def do_checkpoint_delete(cs, args):
"specified checkpoint.")
@utils.arg('provider_id',
metavar='<provider_id>',
help='Id of provider.')
@utils.arg('checkpoint',
metavar='<checkpoint>',
nargs="+",
help='ID of checkpoint.')
@utils.arg('--available',
action='store_const',
dest='state',
default='error',
const='available',
help='Request the checkpoint be reset to "available" state instead '
'of "error" state(the default).')
def do_checkpoint_reset_state(cs, args):
"""Reset state of a checkpoint."""
failure_count = 0
for checkpoint_id in args.checkpoint:
try:
cs.checkpoints.reset_state(args.provider_id, checkpoint_id,
args.state)
except exceptions.NotFound:
failure_count += 1
print("Failed to reset state of '{0}'; checkpoint not found".
format(checkpoint_id))
except exceptions.Forbidden:
failure_count += 1
print("Failed to reset state of '{0}'; not allowed".
format(checkpoint_id))
except exceptions.BadRequest:
failure_count += 1
print("Failed to reset state of '{0}'; invalid input or "
"current checkpoint state".format(checkpoint_id))
if failure_count == len(args.checkpoint):
raise exceptions.CommandError("Unable to find or reset any of the "
"specified checkpoint's state.")
@utils.arg('--all-tenants',
dest='all_tenants',
metavar='<0|1>',
@@ -897,6 +860,11 @@ def do_checkpoint_reset_state(cs, args):
const=1,
default=0,
help='Shows details for all tenants. Admin only.')
@utils.arg('--all_tenants',
nargs='?',
type=int,
const=1,
help=argparse.SUPPRESS)
@utils.arg('--name',
metavar='<name>',
default=None,
@@ -969,7 +937,7 @@ def do_trigger_list(cs, args):
else:
sortby_index = 0
formatters = {"Properties": lambda obj: jsonutils.dumps(
formatters = {"Properties": lambda obj: json.dumps(
obj.properties, indent=2, sort_keys=True)}
utils.print_list(triggers, key_list, exclude_unavailable=True,
sortby_index=sortby_index, formatters=formatters)
@@ -1002,8 +970,7 @@ def do_trigger_update(cs, args):
"""Update a trigger."""
trigger_info = {}
trigger_properties = arg_utils.extract_properties(args)
if args.name:
trigger_info['name'] = args.name
trigger_info['name'] = args.name
trigger_info['properties'] = trigger_properties
trigger = cs.triggers.update(args.trigger_id, trigger_info)
dict_format_list = {"properties"}
@@ -1048,6 +1015,11 @@ def do_trigger_delete(cs, args):
const=1,
default=0,
help='Shows details for all tenants. Admin only.')
@utils.arg('--all_tenants',
nargs='?',
type=int,
const=1,
help=argparse.SUPPRESS)
@utils.arg('--name',
metavar='<name>',
default=None,
@@ -1134,9 +1106,7 @@ def do_scheduledoperation_list(cs, args):
help='Trigger name.')
@utils.arg('operation_type',
metavar='<operation_type>',
choices=['protect', 'retention_protect'],
help='Operation Type of scheduled operation. Valid values are '
'"protect" or "retention_protect."')
help='Operation Type of scheduled operation.')
@utils.arg('trigger_id',
metavar='<trigger_id>',
help='Trigger id of scheduled operation.')
@@ -1195,6 +1165,11 @@ def do_scheduledoperation_delete(cs, args):
const=1,
default=0,
help='Shows details for all tenants. Admin only.')
@utils.arg('--all_tenants',
nargs='?',
type=int,
const=1,
help=argparse.SUPPRESS)
@utils.arg('--status',
metavar='<status>',
default=None,
@@ -1357,7 +1332,7 @@ def _quota_set_pretty_show(quotas):
metavar='<plans>',
type=int,
default=None,
help='New value for the "plans" quota. The default value is 50.')
help='New value for the "plans" quota.')
def do_quota_update(cs, args):
"""Update the quotas for a project (Admin only)."""
project_id = args.tenant
@@ -1400,7 +1375,7 @@ def do_quota_class_show(cs, args):
metavar='<plans>',
type=int,
default=None,
help='New value for the "plans" quota. The default value is 50.')
help='New value for the "plans" quota.')
def do_quota_class_update(cs, args):
"""Update the quotas for a quota class (Admin only)."""
class_name = args.class_name

View File

@@ -10,7 +10,6 @@
# License for the specific language governing permissions and limitations
# under the License.
from karborclient.common.apiclient import exceptions
from karborclient.common import base
@@ -23,12 +22,6 @@ class TriggerManager(base.ManagerWithFind):
resource_class = Trigger
def create(self, name, type, properties):
if properties.get('window', None):
try:
properties['window'] = int(properties['window'])
except Exception:
msg = 'The trigger window is not integer'
raise exceptions.CommandError(msg)
body = {'trigger_info': {'name': name,
'type': type,
'properties': properties,
@@ -52,14 +45,8 @@ class TriggerManager(base.ManagerWithFind):
def update(self, trigger_id, data):
if data['properties'].get('window', None):
try:
data['properties']['window'] = int(
data['properties']['window'])
except Exception:
msg = 'The trigger window is not integer'
raise exceptions.CommandError(msg)
body = {"trigger_info": data}
return self._update('/triggers/{trigger_id}'
.format(trigger_id=trigger_id),
body, "trigger_info")

View File

@@ -4,7 +4,7 @@ summary = Python client library for Karbor API
description-file =
README.rst
author = OpenStack
author-email = openstack-discuss@lists.openstack.org
author-email = openstack-dev@lists.openstack.org
home-page = https://docs.openstack.org/python-karborclient/latest/
classifier =
Environment :: OpenStack
@@ -16,8 +16,7 @@ classifier =
Programming Language :: Python :: 2
Programming Language :: Python :: 2.7
Programming Language :: Python :: 3
Programming Language :: Python :: 3.6
Programming Language :: Python :: 3.7
Programming Language :: Python :: 3.5
[global]
setup-hooks =
@@ -58,7 +57,6 @@ openstack.data_protection.v1 =
data_protection_checkpoint_show = karborclient.osc.v1.checkpoints:ShowCheckpoint
data_protection_checkpoint_create = karborclient.osc.v1.checkpoints:CreateCheckpoint
data_protection_checkpoint_delete = karborclient.osc.v1.checkpoints:DeleteCheckpoint
data_protection_checkpoint_reset_state = karborclient.osc.v1.checkpoints:ResetCheckpointState
data_protection_scheduledoperation_list = karborclient.osc.v1.scheduled_operations:ListScheduledOperations
data_protection_scheduledoperation_show = karborclient.osc.v1.scheduled_operations:ShowScheduledOperation
data_protection_scheduledoperation_create = karborclient.osc.v1.scheduled_operations:CreateScheduledOperation

View File

@@ -1,6 +1,6 @@
[tox]
minversion = 2.0
envlist = py27,py37,pypy,pep8
envlist = py35,py27,pypy,pep8
skipsdist = True
[testenv]
@@ -10,7 +10,7 @@ setenv =
VIRTUAL_ENV={envdir}
PYTHONWARNINGS=default::DeprecationWarning
deps =
-c{env:UPPER_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/master}
-c{env:UPPER_CONSTRAINTS_FILE:https://git.openstack.org/cgit/openstack/requirements/plain/upper-constraints.txt?h=stable/rocky}
-r{toxinidir}/requirements.txt
-r{toxinidir}/test-requirements.txt
whitelist_externals = rm
@@ -34,9 +34,7 @@ commands =
[testenv:docs]
basepython = python3
deps =
-c{env:UPPER_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/master}
-r{toxinidir}/doc/requirements.txt
deps = -r{toxinidir}/doc/requirements.txt
commands = sphinx-build -W -b html doc/source doc/build/html
[testenv:debug]