Convert DOS newlines to Unix newlines
Change-Id: If05dce63dadecd89de58350173fc000055e63ca5
This commit is contained in:
parent
c14aea8079
commit
888008676c
@ -1,56 +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
|
||||
# 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
|
||||
|
@ -1,221 +1,221 @@
|
||||
# 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 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 karborclient.common.apiclient import exceptions
|
||||
from karborclient.i18n import _
|
||||
from karborclient import utils
|
||||
|
||||
|
||||
def format_checkpoint(checkpoint_info):
|
||||
if 'protection_plan' in checkpoint_info:
|
||||
plan = checkpoint_info['protection_plan']
|
||||
checkpoint_info['protection_plan'] = "Name: %s\nId: %s" % (
|
||||
plan['name'], plan['id'])
|
||||
if 'resource_graph' in checkpoint_info:
|
||||
checkpoint_info['resource_graph'] = json.dumps(json.loads(
|
||||
checkpoint_info['resource_graph']), indent=2, sort_keys=True)
|
||||
checkpoint_info.pop("links", None)
|
||||
|
||||
|
||||
class ListCheckpoints(command.Lister):
|
||||
_description = _("List checkpoints.")
|
||||
|
||||
log = logging.getLogger(__name__ + ".ListCheckpoints")
|
||||
|
||||
def get_parser(self, prog_name):
|
||||
parser = super(ListCheckpoints, self).get_parser(prog_name)
|
||||
parser.add_argument(
|
||||
'provider_id',
|
||||
metavar='<provider_id>',
|
||||
help=_('ID of provider.'),
|
||||
)
|
||||
parser.add_argument(
|
||||
'--plan_id',
|
||||
metavar='<plan_id>',
|
||||
default=None,
|
||||
help=_('Filters results by a plan ID. Default=None.'),
|
||||
)
|
||||
parser.add_argument(
|
||||
'--start_date',
|
||||
type=str,
|
||||
metavar='<start_date>',
|
||||
default=None,
|
||||
help=_('Filters results by a start date("Y-m-d"). Default=None.'),
|
||||
)
|
||||
parser.add_argument(
|
||||
'--end_date',
|
||||
type=str,
|
||||
metavar='<end_date>',
|
||||
default=None,
|
||||
help=_('Filters results by a end date("Y-m-d"). Default=None.'),
|
||||
)
|
||||
parser.add_argument(
|
||||
'--project_id',
|
||||
metavar='<project_id>',
|
||||
default=None,
|
||||
help=_('Filters results by a project ID. Default=None.'),
|
||||
)
|
||||
parser.add_argument(
|
||||
'--marker',
|
||||
metavar='<checkpoint>',
|
||||
help=_('The last checkpoint ID of the previous page.'),
|
||||
)
|
||||
parser.add_argument(
|
||||
'--limit',
|
||||
type=int,
|
||||
metavar='<num-checkpoints>',
|
||||
help=_('Maximum number of checkpoints to display.'),
|
||||
)
|
||||
parser.add_argument(
|
||||
'--sort',
|
||||
metavar="<key>[:<direction>]",
|
||||
default=None,
|
||||
help=_("Sort output by selected keys and directions(asc or desc), "
|
||||
"multiple keys and directions can be "
|
||||
"specified separated by comma"),
|
||||
)
|
||||
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
|
||||
|
||||
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,
|
||||
}
|
||||
|
||||
data = data_protection_client.checkpoints.list(
|
||||
provider_id=parsed_args.provider_id, search_opts=search_opts,
|
||||
marker=parsed_args.marker, limit=parsed_args.limit,
|
||||
sort=parsed_args.sort)
|
||||
|
||||
column_headers = ['Id', 'Project id', 'Status', 'Protection plan',
|
||||
'Metadata', 'Created at']
|
||||
|
||||
def plan_formatter(plan):
|
||||
return "Name: %s\nId: %s" % (plan['name'],
|
||||
plan['id'])
|
||||
formatters = {"Protection plan": plan_formatter}
|
||||
return (column_headers,
|
||||
(osc_utils.get_item_properties(
|
||||
s, column_headers, formatters=formatters
|
||||
) for s in data))
|
||||
|
||||
|
||||
class ShowCheckpoint(command.ShowOne):
|
||||
_description = "Shows checkpoint details"
|
||||
|
||||
def get_parser(self, prog_name):
|
||||
parser = super(ShowCheckpoint, self).get_parser(prog_name)
|
||||
parser.add_argument(
|
||||
'provider_id',
|
||||
metavar="<provider_id>",
|
||||
help=_('Id of provider.')
|
||||
)
|
||||
parser.add_argument(
|
||||
'checkpoint_id',
|
||||
metavar="<checkpoint_id>",
|
||||
help=_('Id of checkpoint.')
|
||||
)
|
||||
return parser
|
||||
|
||||
def take_action(self, parsed_args):
|
||||
client = self.app.client_manager.data_protection
|
||||
checkpoint = client.checkpoints.get(parsed_args.provider_id,
|
||||
parsed_args.checkpoint_id)
|
||||
format_checkpoint(checkpoint._info)
|
||||
return zip(*sorted(checkpoint._info.items()))
|
||||
|
||||
|
||||
class CreateCheckpoint(command.ShowOne):
|
||||
_description = "Creates a checkpoint"
|
||||
|
||||
def get_parser(self, prog_name):
|
||||
parser = super(CreateCheckpoint, self).get_parser(prog_name)
|
||||
parser.add_argument(
|
||||
'provider_id',
|
||||
metavar='<provider_id>',
|
||||
help=_('ID of provider.')
|
||||
)
|
||||
parser.add_argument(
|
||||
'plan_id',
|
||||
metavar='<plan_id>',
|
||||
help=_('ID of plan.')
|
||||
)
|
||||
parser.add_argument(
|
||||
'--extra_info',
|
||||
type=str,
|
||||
nargs='*',
|
||||
metavar='<key=value>',
|
||||
default=None,
|
||||
help=_('The extra info of a checkpoint.')
|
||||
)
|
||||
return parser
|
||||
|
||||
def take_action(self, parsed_args):
|
||||
client = self.app.client_manager.data_protection
|
||||
checkpoint_extra_info = None
|
||||
if parsed_args.extra_info is not None:
|
||||
checkpoint_extra_info = utils.extract_extra_info(parsed_args)
|
||||
checkpoint = client.checkpoints.create(parsed_args.provider_id,
|
||||
parsed_args.plan_id,
|
||||
checkpoint_extra_info)
|
||||
format_checkpoint(checkpoint._info)
|
||||
return zip(*sorted(checkpoint._info.items()))
|
||||
|
||||
|
||||
class DeleteCheckpoint(command.Command):
|
||||
_description = "Delete checkpoint"
|
||||
|
||||
log = logging.getLogger(__name__ + ".DeleteCheckpoint")
|
||||
|
||||
def get_parser(self, prog_name):
|
||||
parser = super(DeleteCheckpoint, 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.')
|
||||
)
|
||||
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.delete(parsed_args.provider_id,
|
||||
checkpoint_id)
|
||||
except exceptions.NotFound:
|
||||
failure_count += 1
|
||||
self.log.error(
|
||||
"Failed to delete '{0}'; checkpoint not found".
|
||||
format(checkpoint_id))
|
||||
if failure_count == len(parsed_args.checkpoint):
|
||||
raise exceptions.CommandError(
|
||||
"Unable to find and delete any of the "
|
||||
"specified checkpoint.")
|
||||
# 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 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 karborclient.common.apiclient import exceptions
|
||||
from karborclient.i18n import _
|
||||
from karborclient import utils
|
||||
|
||||
|
||||
def format_checkpoint(checkpoint_info):
|
||||
if 'protection_plan' in checkpoint_info:
|
||||
plan = checkpoint_info['protection_plan']
|
||||
checkpoint_info['protection_plan'] = "Name: %s\nId: %s" % (
|
||||
plan['name'], plan['id'])
|
||||
if 'resource_graph' in checkpoint_info:
|
||||
checkpoint_info['resource_graph'] = json.dumps(json.loads(
|
||||
checkpoint_info['resource_graph']), indent=2, sort_keys=True)
|
||||
checkpoint_info.pop("links", None)
|
||||
|
||||
|
||||
class ListCheckpoints(command.Lister):
|
||||
_description = _("List checkpoints.")
|
||||
|
||||
log = logging.getLogger(__name__ + ".ListCheckpoints")
|
||||
|
||||
def get_parser(self, prog_name):
|
||||
parser = super(ListCheckpoints, self).get_parser(prog_name)
|
||||
parser.add_argument(
|
||||
'provider_id',
|
||||
metavar='<provider_id>',
|
||||
help=_('ID of provider.'),
|
||||
)
|
||||
parser.add_argument(
|
||||
'--plan_id',
|
||||
metavar='<plan_id>',
|
||||
default=None,
|
||||
help=_('Filters results by a plan ID. Default=None.'),
|
||||
)
|
||||
parser.add_argument(
|
||||
'--start_date',
|
||||
type=str,
|
||||
metavar='<start_date>',
|
||||
default=None,
|
||||
help=_('Filters results by a start date("Y-m-d"). Default=None.'),
|
||||
)
|
||||
parser.add_argument(
|
||||
'--end_date',
|
||||
type=str,
|
||||
metavar='<end_date>',
|
||||
default=None,
|
||||
help=_('Filters results by a end date("Y-m-d"). Default=None.'),
|
||||
)
|
||||
parser.add_argument(
|
||||
'--project_id',
|
||||
metavar='<project_id>',
|
||||
default=None,
|
||||
help=_('Filters results by a project ID. Default=None.'),
|
||||
)
|
||||
parser.add_argument(
|
||||
'--marker',
|
||||
metavar='<checkpoint>',
|
||||
help=_('The last checkpoint ID of the previous page.'),
|
||||
)
|
||||
parser.add_argument(
|
||||
'--limit',
|
||||
type=int,
|
||||
metavar='<num-checkpoints>',
|
||||
help=_('Maximum number of checkpoints to display.'),
|
||||
)
|
||||
parser.add_argument(
|
||||
'--sort',
|
||||
metavar="<key>[:<direction>]",
|
||||
default=None,
|
||||
help=_("Sort output by selected keys and directions(asc or desc), "
|
||||
"multiple keys and directions can be "
|
||||
"specified separated by comma"),
|
||||
)
|
||||
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
|
||||
|
||||
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,
|
||||
}
|
||||
|
||||
data = data_protection_client.checkpoints.list(
|
||||
provider_id=parsed_args.provider_id, search_opts=search_opts,
|
||||
marker=parsed_args.marker, limit=parsed_args.limit,
|
||||
sort=parsed_args.sort)
|
||||
|
||||
column_headers = ['Id', 'Project id', 'Status', 'Protection plan',
|
||||
'Metadata', 'Created at']
|
||||
|
||||
def plan_formatter(plan):
|
||||
return "Name: %s\nId: %s" % (plan['name'],
|
||||
plan['id'])
|
||||
formatters = {"Protection plan": plan_formatter}
|
||||
return (column_headers,
|
||||
(osc_utils.get_item_properties(
|
||||
s, column_headers, formatters=formatters
|
||||
) for s in data))
|
||||
|
||||
|
||||
class ShowCheckpoint(command.ShowOne):
|
||||
_description = "Shows checkpoint details"
|
||||
|
||||
def get_parser(self, prog_name):
|
||||
parser = super(ShowCheckpoint, self).get_parser(prog_name)
|
||||
parser.add_argument(
|
||||
'provider_id',
|
||||
metavar="<provider_id>",
|
||||
help=_('Id of provider.')
|
||||
)
|
||||
parser.add_argument(
|
||||
'checkpoint_id',
|
||||
metavar="<checkpoint_id>",
|
||||
help=_('Id of checkpoint.')
|
||||
)
|
||||
return parser
|
||||
|
||||
def take_action(self, parsed_args):
|
||||
client = self.app.client_manager.data_protection
|
||||
checkpoint = client.checkpoints.get(parsed_args.provider_id,
|
||||
parsed_args.checkpoint_id)
|
||||
format_checkpoint(checkpoint._info)
|
||||
return zip(*sorted(checkpoint._info.items()))
|
||||
|
||||
|
||||
class CreateCheckpoint(command.ShowOne):
|
||||
_description = "Creates a checkpoint"
|
||||
|
||||
def get_parser(self, prog_name):
|
||||
parser = super(CreateCheckpoint, self).get_parser(prog_name)
|
||||
parser.add_argument(
|
||||
'provider_id',
|
||||
metavar='<provider_id>',
|
||||
help=_('ID of provider.')
|
||||
)
|
||||
parser.add_argument(
|
||||
'plan_id',
|
||||
metavar='<plan_id>',
|
||||
help=_('ID of plan.')
|
||||
)
|
||||
parser.add_argument(
|
||||
'--extra_info',
|
||||
type=str,
|
||||
nargs='*',
|
||||
metavar='<key=value>',
|
||||
default=None,
|
||||
help=_('The extra info of a checkpoint.')
|
||||
)
|
||||
return parser
|
||||
|
||||
def take_action(self, parsed_args):
|
||||
client = self.app.client_manager.data_protection
|
||||
checkpoint_extra_info = None
|
||||
if parsed_args.extra_info is not None:
|
||||
checkpoint_extra_info = utils.extract_extra_info(parsed_args)
|
||||
checkpoint = client.checkpoints.create(parsed_args.provider_id,
|
||||
parsed_args.plan_id,
|
||||
checkpoint_extra_info)
|
||||
format_checkpoint(checkpoint._info)
|
||||
return zip(*sorted(checkpoint._info.items()))
|
||||
|
||||
|
||||
class DeleteCheckpoint(command.Command):
|
||||
_description = "Delete checkpoint"
|
||||
|
||||
log = logging.getLogger(__name__ + ".DeleteCheckpoint")
|
||||
|
||||
def get_parser(self, prog_name):
|
||||
parser = super(DeleteCheckpoint, 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.')
|
||||
)
|
||||
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.delete(parsed_args.provider_id,
|
||||
checkpoint_id)
|
||||
except exceptions.NotFound:
|
||||
failure_count += 1
|
||||
self.log.error(
|
||||
"Failed to delete '{0}'; checkpoint not found".
|
||||
format(checkpoint_id))
|
||||
if failure_count == len(parsed_args.checkpoint):
|
||||
raise exceptions.CommandError(
|
||||
"Unable to find and delete any of the "
|
||||
"specified checkpoint.")
|
||||
|
@ -1,111 +1,111 @@
|
||||
# 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 operation_log action implementations"""
|
||||
|
||||
from osc_lib.command import command
|
||||
from osc_lib import utils as osc_utils
|
||||
from oslo_log import log as logging
|
||||
|
||||
from karborclient.i18n import _
|
||||
|
||||
|
||||
class ListOperationLogs(command.Lister):
|
||||
_description = _("List operation_logs.")
|
||||
|
||||
log = logging.getLogger(__name__ + ".ListOperationLogs")
|
||||
|
||||
def get_parser(self, prog_name):
|
||||
parser = super(ListOperationLogs, self).get_parser(prog_name)
|
||||
parser.add_argument(
|
||||
'--all-projects',
|
||||
action='store_true',
|
||||
default=False,
|
||||
help=_('Include all projects (admin only)'),
|
||||
)
|
||||
parser.add_argument(
|
||||
'--status',
|
||||
metavar='<status>',
|
||||
help=_('Filter results by status'),
|
||||
)
|
||||
parser.add_argument(
|
||||
'--marker',
|
||||
metavar='<operation_log>',
|
||||
help=_('The last operation_log ID of the previous page'),
|
||||
)
|
||||
parser.add_argument(
|
||||
'--limit',
|
||||
type=int,
|
||||
metavar='<num-operation_logs>',
|
||||
help=_('Maximum number of operation_logs to display'),
|
||||
)
|
||||
parser.add_argument(
|
||||
'--sort',
|
||||
metavar="<key>[:<direction>]",
|
||||
default=None,
|
||||
help=_("Sort output by selected keys and directions(asc or desc), "
|
||||
"multiple keys and directions can be "
|
||||
"specified separated by comma"),
|
||||
)
|
||||
parser.add_argument(
|
||||
'--project',
|
||||
metavar='<project>',
|
||||
help=_('Filter results by a project(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.project) or parsed_args.all_projects
|
||||
|
||||
search_opts = {
|
||||
'all_tenants': all_projects,
|
||||
'project_id': parsed_args.project,
|
||||
'status': parsed_args.status,
|
||||
}
|
||||
|
||||
data = data_protection_client.operation_logs.list(
|
||||
search_opts=search_opts, marker=parsed_args.marker,
|
||||
limit=parsed_args.limit, sort=parsed_args.sort)
|
||||
|
||||
column_headers = ['Id', 'Operation Type', 'Checkpoint id',
|
||||
'Plan Id', 'Provider id', 'Restore Id',
|
||||
'Scheduled Operation Id', 'Status',
|
||||
'Started At', 'Ended At', 'Error Info',
|
||||
'Extra Info']
|
||||
|
||||
return (column_headers,
|
||||
(osc_utils.get_item_properties(
|
||||
s, column_headers
|
||||
) for s in data))
|
||||
|
||||
|
||||
class ShowOperationLog(command.ShowOne):
|
||||
_description = "Shows operation_log details"
|
||||
|
||||
def get_parser(self, prog_name):
|
||||
parser = super(ShowOperationLog, self).get_parser(prog_name)
|
||||
parser.add_argument(
|
||||
'operation_log',
|
||||
metavar="<operation_log>",
|
||||
help=_('The UUID of the operation_log.')
|
||||
)
|
||||
return parser
|
||||
|
||||
def take_action(self, parsed_args):
|
||||
client = self.app.client_manager.data_protection
|
||||
operation_log = osc_utils.find_resource(client.operation_logs,
|
||||
parsed_args.operation_log)
|
||||
|
||||
operation_log._info.pop("links", None)
|
||||
return zip(*sorted(operation_log._info.items()))
|
||||
# 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 operation_log action implementations"""
|
||||
|
||||
from osc_lib.command import command
|
||||
from osc_lib import utils as osc_utils
|
||||
from oslo_log import log as logging
|
||||
|
||||
from karborclient.i18n import _
|
||||
|
||||
|
||||
class ListOperationLogs(command.Lister):
|
||||
_description = _("List operation_logs.")
|
||||
|
||||
log = logging.getLogger(__name__ + ".ListOperationLogs")
|
||||
|
||||
def get_parser(self, prog_name):
|
||||
parser = super(ListOperationLogs, self).get_parser(prog_name)
|
||||
parser.add_argument(
|
||||
'--all-projects',
|
||||
action='store_true',
|
||||
default=False,
|
||||
help=_('Include all projects (admin only)'),
|
||||
)
|
||||
parser.add_argument(
|
||||
'--status',
|
||||
metavar='<status>',
|
||||
help=_('Filter results by status'),
|
||||
)
|
||||
parser.add_argument(
|
||||
'--marker',
|
||||
metavar='<operation_log>',
|
||||
help=_('The last operation_log ID of the previous page'),
|
||||
)
|
||||
parser.add_argument(
|
||||
'--limit',
|
||||
type=int,
|
||||
metavar='<num-operation_logs>',
|
||||
help=_('Maximum number of operation_logs to display'),
|
||||
)
|
||||
parser.add_argument(
|
||||
'--sort',
|
||||
metavar="<key>[:<direction>]",
|
||||
default=None,
|
||||
help=_("Sort output by selected keys and directions(asc or desc), "
|
||||
"multiple keys and directions can be "
|
||||
"specified separated by comma"),
|
||||
)
|
||||
parser.add_argument(
|
||||
'--project',
|
||||
metavar='<project>',
|
||||
help=_('Filter results by a project(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.project) or parsed_args.all_projects
|
||||
|
||||
search_opts = {
|
||||
'all_tenants': all_projects,
|
||||
'project_id': parsed_args.project,
|
||||
'status': parsed_args.status,
|
||||
}
|
||||
|
||||
data = data_protection_client.operation_logs.list(
|
||||
search_opts=search_opts, marker=parsed_args.marker,
|
||||
limit=parsed_args.limit, sort=parsed_args.sort)
|
||||
|
||||
column_headers = ['Id', 'Operation Type', 'Checkpoint id',
|
||||
'Plan Id', 'Provider id', 'Restore Id',
|
||||
'Scheduled Operation Id', 'Status',
|
||||
'Started At', 'Ended At', 'Error Info',
|
||||
'Extra Info']
|
||||
|
||||
return (column_headers,
|
||||
(osc_utils.get_item_properties(
|
||||
s, column_headers
|
||||
) for s in data))
|
||||
|
||||
|
||||
class ShowOperationLog(command.ShowOne):
|
||||
_description = "Shows operation_log details"
|
||||
|
||||
def get_parser(self, prog_name):
|
||||
parser = super(ShowOperationLog, self).get_parser(prog_name)
|
||||
parser.add_argument(
|
||||
'operation_log',
|
||||
metavar="<operation_log>",
|
||||
help=_('The UUID of the operation_log.')
|
||||
)
|
||||
return parser
|
||||
|
||||
def take_action(self, parsed_args):
|
||||
client = self.app.client_manager.data_protection
|
||||
operation_log = osc_utils.find_resource(client.operation_logs,
|
||||
parsed_args.operation_log)
|
||||
|
||||
operation_log._info.pop("links", None)
|
||||
return zip(*sorted(operation_log._info.items()))
|
||||
|
@ -1,274 +1,274 @@
|
||||
# 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"""
|
||||
|
||||
import json
|
||||
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 _
|
||||
from karborclient import utils
|
||||
|
||||
|
||||
def format_plan(plan_info):
|
||||
for key in ('resources', 'parameters'):
|
||||
if key not in plan_info:
|
||||
continue
|
||||
plan_info[key] = json.dumps(plan_info[key], indent=2, sort_keys=True)
|
||||
plan_info.pop("links", None)
|
||||
|
||||
|
||||
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(
|
||||
'--project',
|
||||
metavar='<project>',
|
||||
help=_('Filter results by a project(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.project) or parsed_args.all_projects
|
||||
|
||||
search_opts = {
|
||||
'all_tenants': all_projects,
|
||||
'project_id': parsed_args.project,
|
||||
'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,
|
||||
(osc_utils.get_item_properties(
|
||||
s, column_headers
|
||||
) for s in data))
|
||||
|
||||
|
||||
class ShowPlan(command.ShowOne):
|
||||
_description = "Shows plan details"
|
||||
|
||||
def get_parser(self, prog_name):
|
||||
parser = super(ShowPlan, self).get_parser(prog_name)
|
||||
parser.add_argument(
|
||||
'plan',
|
||||
metavar="<plan>",
|
||||
help=_('The UUID of the plan.')
|
||||
)
|
||||
return parser
|
||||
|
||||
def take_action(self, parsed_args):
|
||||
client = self.app.client_manager.data_protection
|
||||
plan = osc_utils.find_resource(client.plans, parsed_args.plan)
|
||||
|
||||
format_plan(plan._info)
|
||||
return zip(*sorted(plan._info.items()))
|
||||
|
||||
|
||||
class CreatePlan(command.ShowOne):
|
||||
_description = "Creates a plan"
|
||||
|
||||
def get_parser(self, prog_name):
|
||||
parser = super(CreatePlan, self).get_parser(prog_name)
|
||||
parser.add_argument(
|
||||
'name',
|
||||
metavar='<name>',
|
||||
help=_('The name of the plan.')
|
||||
)
|
||||
parser.add_argument(
|
||||
'provider_id',
|
||||
metavar='<provider_id>',
|
||||
help=_('The UUID of the provider.')
|
||||
)
|
||||
parser.add_argument(
|
||||
'resources',
|
||||
metavar='<id=type=name=extra_info,id=type=name=extra_info>',
|
||||
help=_('Resource in list must be a dict when creating'
|
||||
' a plan. The keys of resource are id ,type, name and '
|
||||
'extra_info. The extra_info field is optional.')
|
||||
)
|
||||
parser.add_argument(
|
||||
'--parameters-json',
|
||||
type=str,
|
||||
dest='parameters_json',
|
||||
metavar='<parameters>',
|
||||
default=None,
|
||||
help=_('Plan parameters in json format.')
|
||||
)
|
||||
parser.add_argument(
|
||||
'--parameters',
|
||||
action='append',
|
||||
metavar='resource_type=<type>[,resource_id=<id>,key=val,...]',
|
||||
default=[],
|
||||
help=_('Plan parameters, may be specified multiple times. '
|
||||
'resource_type: type of resource to apply parameters. '
|
||||
'resource_id: limit the parameters to a specific resource. '
|
||||
'Other keys and values: according to provider\'s protect '
|
||||
'schema.')
|
||||
)
|
||||
parser.add_argument(
|
||||
'--description',
|
||||
metavar='<description>',
|
||||
help=_('The description of the plan.')
|
||||
)
|
||||
return parser
|
||||
|
||||
def take_action(self, parsed_args):
|
||||
client = self.app.client_manager.data_protection
|
||||
if not uuidutils.is_uuid_like(parsed_args.provider_id):
|
||||
raise exceptions.CommandError(
|
||||
"Invalid provider id provided.")
|
||||
plan_resources = utils.extract_resources(parsed_args)
|
||||
utils.check_resources(client, plan_resources)
|
||||
plan_parameters = utils.extract_parameters(parsed_args)
|
||||
plan = client.plans.create(parsed_args.name, parsed_args.provider_id,
|
||||
plan_resources, plan_parameters,
|
||||
description=parsed_args.description)
|
||||
|
||||
format_plan(plan._info)
|
||||
return zip(*sorted(plan._info.items()))
|
||||
|
||||
|
||||
class UpdatePlan(command.ShowOne):
|
||||
_description = "Update a plan"
|
||||
|
||||
def get_parser(self, prog_name):
|
||||
parser = super(UpdatePlan, self).get_parser(prog_name)
|
||||
parser.add_argument(
|
||||
"plan_id",
|
||||
metavar="<PLAN ID>",
|
||||
help=_("Id of plan to update.")
|
||||
)
|
||||
parser.add_argument(
|
||||
"--name",
|
||||
metavar="<name>",
|
||||
help=_("A name to which the plan will be renamed.")
|
||||
)
|
||||
parser.add_argument(
|
||||
"--resources",
|
||||
metavar="<id=type=name,id=type=name>",
|
||||
help=_("Resources to which the plan will be updated.")
|
||||
)
|
||||
parser.add_argument(
|
||||
"--status",
|
||||
metavar="<suspended|started>",
|
||||
help=_("status to which the plan will be updated.")
|
||||
)
|
||||
return parser
|
||||
|
||||
def take_action(self, parsed_args):
|
||||
client = self.app.client_manager.data_protection
|
||||
data = {}
|
||||
if parsed_args.name is not None:
|
||||
data['name'] = parsed_args.name
|
||||
if parsed_args.resources is not None:
|
||||
plan_resources = utils.extract_resources(parsed_args)
|
||||
data['resources'] = plan_resources
|
||||
if parsed_args.status is not None:
|
||||
data['status'] = parsed_args.status
|
||||
try:
|
||||
plan = osc_utils.find_resource(client.plans,
|
||||
parsed_args.plan_id)
|
||||
plan = client.plans.update(plan.id, data)
|
||||
except exceptions.NotFound:
|
||||
raise exceptions.CommandError(
|
||||
"Plan %s not found" % parsed_args.plan_id)
|
||||
else:
|
||||
format_plan(plan._info)
|
||||
return zip(*sorted(plan._info.items()))
|
||||
|
||||
|
||||
class DeletePlan(command.Command):
|
||||
_description = "Delete plan"
|
||||
|
||||
def get_parser(self, prog_name):
|
||||
parser = super(DeletePlan, self).get_parser(prog_name)
|
||||
parser.add_argument(
|
||||
'plan',
|
||||
metavar='<plan>',
|
||||
nargs="+",
|
||||
help=_('ID of plan.')
|
||||
)
|
||||
return parser
|
||||
|
||||
def take_action(self, parsed_args):
|
||||
client = self.app.client_manager.data_protection
|
||||
failure_count = 0
|
||||
for plan_id in parsed_args.plan:
|
||||
try:
|
||||
plan = osc_utils.find_resource(client.plans, plan_id)
|
||||
client.plans.delete(plan.id)
|
||||
except exceptions.NotFound:
|
||||
failure_count += 1
|
||||
print("Failed to delete '{0}'; plan not "
|
||||
"found".format(plan_id))
|
||||
if failure_count == len(parsed_args.plan):
|
||||
raise exceptions.CommandError(
|
||||
"Unable to find and delete any of the "
|
||||
"specified plan.")
|
||||
# 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"""
|
||||
|
||||
import json
|
||||
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 _
|
||||
from karborclient import utils
|
||||
|
||||
|
||||
def format_plan(plan_info):
|
||||
for key in ('resources', 'parameters'):
|
||||
if key not in plan_info:
|
||||
continue
|
||||
plan_info[key] = json.dumps(plan_info[key], indent=2, sort_keys=True)
|
||||
plan_info.pop("links", None)
|
||||
|
||||
|
||||
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(
|
||||
'--project',
|
||||
metavar='<project>',
|
||||
help=_('Filter results by a project(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.project) or parsed_args.all_projects
|
||||
|
||||
search_opts = {
|
||||
'all_tenants': all_projects,
|
||||
'project_id': parsed_args.project,
|
||||
'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,
|
||||
(osc_utils.get_item_properties(
|
||||
s, column_headers
|
||||
) for s in data))
|
||||
|
||||
|
||||
class ShowPlan(command.ShowOne):
|
||||
_description = "Shows plan details"
|
||||
|
||||
def get_parser(self, prog_name):
|
||||
parser = super(ShowPlan, self).get_parser(prog_name)
|
||||
parser.add_argument(
|
||||
'plan',
|
||||
metavar="<plan>",
|
||||
help=_('The UUID of the plan.')
|
||||
)
|
||||
return parser
|
||||
|
||||
def take_action(self, parsed_args):
|
||||
client = self.app.client_manager.data_protection
|
||||
plan = osc_utils.find_resource(client.plans, parsed_args.plan)
|
||||
|
||||
format_plan(plan._info)
|
||||
return zip(*sorted(plan._info.items()))
|
||||
|
||||
|
||||
class CreatePlan(command.ShowOne):
|
||||
_description = "Creates a plan"
|
||||
|
||||
def get_parser(self, prog_name):
|
||||
parser = super(CreatePlan, self).get_parser(prog_name)
|
||||
parser.add_argument(
|
||||
'name',
|
||||
metavar='<name>',
|
||||
help=_('The name of the plan.')
|
||||
)
|
||||
parser.add_argument(
|
||||
'provider_id',
|
||||
metavar='<provider_id>',
|
||||
help=_('The UUID of the provider.')
|
||||
)
|
||||
parser.add_argument(
|
||||
'resources',
|
||||
metavar='<id=type=name=extra_info,id=type=name=extra_info>',
|
||||
help=_('Resource in list must be a dict when creating'
|
||||
' a plan. The keys of resource are id ,type, name and '
|
||||
'extra_info. The extra_info field is optional.')
|
||||
)
|
||||
parser.add_argument(
|
||||
'--parameters-json',
|
||||
type=str,
|
||||
dest='parameters_json',
|
||||
metavar='<parameters>',
|
||||
default=None,
|
||||
help=_('Plan parameters in json format.')
|
||||
)
|
||||
parser.add_argument(
|
||||
'--parameters',
|
||||
action='append',
|
||||
metavar='resource_type=<type>[,resource_id=<id>,key=val,...]',
|
||||
default=[],
|
||||
help=_('Plan parameters, may be specified multiple times. '
|
||||
'resource_type: type of resource to apply parameters. '
|
||||
'resource_id: limit the parameters to a specific resource. '
|
||||
'Other keys and values: according to provider\'s protect '
|
||||
'schema.')
|
||||
)
|
||||
parser.add_argument(
|
||||
'--description',
|
||||
metavar='<description>',
|
||||
help=_('The description of the plan.')
|
||||
)
|
||||
return parser
|
||||
|
||||
def take_action(self, parsed_args):
|
||||
client = self.app.client_manager.data_protection
|
||||
if not uuidutils.is_uuid_like(parsed_args.provider_id):
|
||||
raise exceptions.CommandError(
|
||||
"Invalid provider id provided.")
|
||||
plan_resources = utils.extract_resources(parsed_args)
|
||||
utils.check_resources(client, plan_resources)
|
||||
plan_parameters = utils.extract_parameters(parsed_args)
|
||||
plan = client.plans.create(parsed_args.name, parsed_args.provider_id,
|
||||
plan_resources, plan_parameters,
|
||||
description=parsed_args.description)
|
||||
|
||||
format_plan(plan._info)
|
||||
return zip(*sorted(plan._info.items()))
|
||||
|
||||
|
||||
class UpdatePlan(command.ShowOne):
|
||||
_description = "Update a plan"
|
||||
|
||||
def get_parser(self, prog_name):
|
||||
parser = super(UpdatePlan, self).get_parser(prog_name)
|
||||
parser.add_argument(
|
||||
"plan_id",
|
||||
metavar="<PLAN ID>",
|
||||
help=_("Id of plan to update.")
|
||||
)
|
||||
parser.add_argument(
|
||||
"--name",
|
||||
metavar="<name>",
|
||||
help=_("A name to which the plan will be renamed.")
|
||||
)
|
||||
parser.add_argument(
|
||||
"--resources",
|
||||
metavar="<id=type=name,id=type=name>",
|
||||
help=_("Resources to which the plan will be updated.")
|
||||
)
|
||||
parser.add_argument(
|
||||
"--status",
|
||||
metavar="<suspended|started>",
|
||||
help=_("status to which the plan will be updated.")
|
||||
)
|
||||
return parser
|
||||
|
||||
def take_action(self, parsed_args):
|
||||
client = self.app.client_manager.data_protection
|
||||
data = {}
|
||||
if parsed_args.name is not None:
|
||||
data['name'] = parsed_args.name
|
||||
if parsed_args.resources is not None:
|
||||
plan_resources = utils.extract_resources(parsed_args)
|
||||
data['resources'] = plan_resources
|
||||
if parsed_args.status is not None:
|
||||
data['status'] = parsed_args.status
|
||||
try:
|
||||
plan = osc_utils.find_resource(client.plans,
|
||||
parsed_args.plan_id)
|
||||
plan = client.plans.update(plan.id, data)
|
||||
except exceptions.NotFound:
|
||||
raise exceptions.CommandError(
|
||||
"Plan %s not found" % parsed_args.plan_id)
|
||||
else:
|
||||
format_plan(plan._info)
|
||||
return zip(*sorted(plan._info.items()))
|
||||
|
||||
|
||||
class DeletePlan(command.Command):
|
||||
_description = "Delete plan"
|
||||
|
||||
def get_parser(self, prog_name):
|
||||
parser = super(DeletePlan, self).get_parser(prog_name)
|
||||
parser.add_argument(
|
||||
'plan',
|
||||
metavar='<plan>',
|
||||
nargs="+",
|
||||
help=_('ID of plan.')
|
||||
)
|
||||
return parser
|
||||
|
||||
def take_action(self, parsed_args):
|
||||
client = self.app.client_manager.data_protection
|
||||
failure_count = 0
|
||||
for plan_id in parsed_args.plan:
|
||||
try:
|
||||
plan = osc_utils.find_resource(client.plans, plan_id)
|
||||
client.plans.delete(plan.id)
|
||||
except exceptions.NotFound:
|
||||
failure_count += 1
|
||||
print("Failed to delete '{0}'; plan not "
|
||||
"found".format(plan_id))
|
||||
if failure_count == len(parsed_args.plan):
|
||||
raise exceptions.CommandError(
|
||||
"Unable to find and delete any of the "
|
||||
"specified plan.")
|
||||
|
@ -1,193 +1,193 @@
|
||||
# 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 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 karborclient.i18n import _
|
||||
from karborclient import utils
|
||||
|
||||
|
||||
class ListProtectables(command.Lister):
|
||||
_description = _("List protectable types.")
|
||||
|
||||
log = logging.getLogger(__name__ + ".ListProtectables")
|
||||
|
||||
def get_parser(self, prog_name):
|
||||
parser = super(ListProtectables, self).get_parser(prog_name)
|
||||
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
|
||||
|
||||
data = data_protection_client.protectables.list()
|
||||
|
||||
column_headers = ['Protectable type']
|
||||
|
||||
return (column_headers,
|
||||
(osc_utils.get_item_properties(
|
||||
s, column_headers
|
||||
) for s in data))
|
||||
|
||||
|
||||
class ShowProtectable(command.ShowOne):
|
||||
_description = "Shows protectable type details"
|
||||
|
||||
def get_parser(self, prog_name):
|
||||
parser = super(ShowProtectable, self).get_parser(prog_name)
|
||||
parser.add_argument(
|
||||
'protectable_type',
|
||||
metavar="<protectable_type>",
|
||||
help=_('Protectable type.')
|
||||
)
|
||||
return parser
|
||||
|
||||
def take_action(self, parsed_args):
|
||||
client = self.app.client_manager.data_protection
|
||||
protectable = osc_utils.find_resource(client.protectables,
|
||||
parsed_args.protectable_type)
|
||||
|
||||
protectable._info.pop("links", None)
|
||||
return zip(*sorted(protectable._info.items()))
|
||||
|
||||
|
||||
class ListProtectableInstances(command.Lister):
|
||||
_description = _("List protectable instances.")
|
||||
|
||||
log = logging.getLogger(__name__ + ".ListProtectableInstances")
|
||||
|
||||
def get_parser(self, prog_name):
|
||||
parser = super(ListProtectableInstances, self).get_parser(prog_name)
|
||||
parser.add_argument(
|
||||
'protectable_type',
|
||||
metavar="<protectable_type>",
|
||||
help=_('Type of protectable.')
|
||||
)
|
||||
parser.add_argument(
|
||||
'--type',
|
||||
metavar="<type>",
|
||||
default=None,
|
||||
help=_('Filters results by protectable type. Default=None.')
|
||||
)
|
||||
parser.add_argument(
|
||||
'--marker',
|
||||
metavar="<protectable_instance>",
|
||||
default=None,
|
||||
help=_('The last protectable instance ID of the previous page.')
|
||||
)
|
||||
parser.add_argument(
|
||||
'--limit',
|
||||
metavar="<num-protectable_instances>",
|
||||
default=None,
|
||||
help=_('Maximum number of protectable instances to display.')
|
||||
)
|
||||
parser.add_argument(
|
||||
'--sort',
|
||||
metavar="<key>[:<direction>]",
|
||||
default=None,
|
||||
help=_("Sort output by selected keys and directions(asc or desc), "
|
||||
"multiple keys and directions can be "
|
||||
"specified separated by comma"),
|
||||
)
|
||||
parser.add_argument(
|
||||
'--parameters',
|
||||
type=str,
|
||||
nargs='*',
|
||||
metavar="<key=value>",
|
||||
default=None,
|
||||
help=_('List instances by parameters key and value pair. '
|
||||
'Default=None.')
|
||||
)
|
||||
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
|
||||
|
||||
search_opts = {
|
||||
'type': parsed_args.type,
|
||||
'parameters': (utils.extract_instances_parameters(parsed_args)
|
||||
if parsed_args.parameters else None),
|
||||
}
|
||||
|
||||
data = data_protection_client.protectables.list_instances(
|
||||
parsed_args.protectable_type, search_opts=search_opts,
|
||||
marker=parsed_args.marker, limit=parsed_args.limit,
|
||||
sort=parsed_args.sort)
|
||||
|
||||
column_headers = ['Id', 'Type', 'Name', 'Dependent resources',
|
||||
'Extra info']
|
||||
|
||||
json_dumps = functools.partial(json.dumps, indent=2, sort_keys=True)
|
||||
formatters = {
|
||||
"Extra info": json_dumps,
|
||||
"Dependent resources": json_dumps,
|
||||
}
|
||||
return (column_headers,
|
||||
(osc_utils.get_item_properties(
|
||||
s, column_headers, formatters=formatters,
|
||||
) for s in data))
|
||||
|
||||
|
||||
class ShowProtectableInstance(command.ShowOne):
|
||||
_description = "Shows protectable instance details"
|
||||
|
||||
def get_parser(self, prog_name):
|
||||
parser = super(ShowProtectableInstance, self).get_parser(prog_name)
|
||||
parser.add_argument(
|
||||
'protectable_type',
|
||||
metavar="<protectable_type>",
|
||||
help=_('Protectable type.')
|
||||
)
|
||||
parser.add_argument(
|
||||
'protectable_id',
|
||||
metavar="<protectable_id>",
|
||||
help=_('Protectable instance id.')
|
||||
)
|
||||
parser.add_argument(
|
||||
'--parameters',
|
||||
type=str,
|
||||
nargs='*',
|
||||
metavar="<key=value>",
|
||||
default=None,
|
||||
help=_('Show a instance by parameters key and value pair. '
|
||||
'Default=None.')
|
||||
)
|
||||
return parser
|
||||
|
||||
def take_action(self, parsed_args):
|
||||
client = self.app.client_manager.data_protection
|
||||
|
||||
search_opts = {
|
||||
'parameters': (utils.extract_instances_parameters(parsed_args)
|
||||
if parsed_args.parameters else None),
|
||||
}
|
||||
|
||||
instance = client.protectables.get_instance(
|
||||
parsed_args.protectable_type,
|
||||
parsed_args.protectable_id,
|
||||
search_opts=search_opts)
|
||||
|
||||
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:
|
||||
continue
|
||||
instance._info[key] = json_dumps(instance._info[key])
|
||||
|
||||
return zip(*sorted(instance._info.items()))
|
||||
# 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 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 karborclient.i18n import _
|
||||
from karborclient import utils
|
||||
|
||||
|
||||
class ListProtectables(command.Lister):
|
||||
_description = _("List protectable types.")
|
||||
|
||||
log = logging.getLogger(__name__ + ".ListProtectables")
|
||||
|
||||
def get_parser(self, prog_name):
|
||||
parser = super(ListProtectables, self).get_parser(prog_name)
|
||||
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
|
||||
|
||||
data = data_protection_client.protectables.list()
|
||||
|
||||
column_headers = ['Protectable type']
|
||||
|
||||
return (column_headers,
|
||||
(osc_utils.get_item_properties(
|
||||
s, column_headers
|
||||
) for s in data))
|
||||
|
||||
|
||||
class ShowProtectable(command.ShowOne):
|
||||
_description = "Shows protectable type details"
|
||||
|
||||
def get_parser(self, prog_name):
|
||||
parser = super(ShowProtectable, self).get_parser(prog_name)
|
||||
parser.add_argument(
|
||||
'protectable_type',
|
||||
metavar="<protectable_type>",
|
||||
help=_('Protectable type.')
|
||||
)
|
||||
return parser
|
||||
|
||||
def take_action(self, parsed_args):
|
||||
client = self.app.client_manager.data_protection
|
||||
protectable = osc_utils.find_resource(client.protectables,
|
||||
parsed_args.protectable_type)
|
||||
|
||||
protectable._info.pop("links", None)
|
||||
return zip(*sorted(protectable._info.items()))
|
||||
|
||||
|
||||
class ListProtectableInstances(command.Lister):
|
||||
_description = _("List protectable instances.")
|
||||
|
||||
log = logging.getLogger(__name__ + ".ListProtectableInstances")
|
||||
|
||||
def get_parser(self, prog_name):
|
||||
parser = super(ListProtectableInstances, self).get_parser(prog_name)
|
||||
parser.add_argument(
|
||||
'protectable_type',
|
||||
metavar="<protectable_type>",
|
||||
help=_('Type of protectable.')
|
||||
)
|
||||
parser.add_argument(
|
||||
'--type',
|
||||
metavar="<type>",
|
||||
default=None,
|
||||
help=_('Filters results by protectable type. Default=None.')
|
||||
)
|
||||
parser.add_argument(
|
||||
'--marker',
|
||||
metavar="<protectable_instance>",
|
||||
default=None,
|
||||
help=_('The last protectable instance ID of the previous page.')
|
||||
)
|
||||
parser.add_argument(
|
||||
'--limit',
|
||||
metavar="<num-protectable_instances>",
|
||||
default=None,
|
||||
help=_('Maximum number of protectable instances to display.')
|
||||
)
|
||||
parser.add_argument(
|
||||
'--sort',
|
||||
metavar="<key>[:<direction>]",
|
||||
default=None,
|
||||
help=_("Sort output by selected keys and directions(asc or desc), "
|
||||
"multiple keys and directions can be "
|
||||
"specified separated by comma"),
|
||||
)
|
||||
parser.add_argument(
|
||||
'--parameters',
|
||||
type=str,
|
||||
nargs='*',
|
||||
metavar="<key=value>",
|
||||
default=None,
|
||||
help=_('List instances by parameters key and value pair. '
|
||||
'Default=None.')
|
||||
)
|
||||
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
|
||||
|
||||
search_opts = {
|
||||
'type': parsed_args.type,
|
||||
'parameters': (utils.extract_instances_parameters(parsed_args)
|
||||
if parsed_args.parameters else None),
|
||||
}
|
||||
|
||||
data = data_protection_client.protectables.list_instances(
|
||||
parsed_args.protectable_type, search_opts=search_opts,
|
||||
marker=parsed_args.marker, limit=parsed_args.limit,
|
||||
sort=parsed_args.sort)
|
||||
|
||||
column_headers = ['Id', 'Type', 'Name', 'Dependent resources',
|
||||
'Extra info']
|
||||
|
||||
json_dumps = functools.partial(json.dumps, indent=2, sort_keys=True)
|
||||
formatters = {
|
||||
"Extra info": json_dumps,
|
||||
"Dependent resources": json_dumps,
|
||||
}
|
||||
return (column_headers,
|
||||
(osc_utils.get_item_properties(
|
||||
s, column_headers, formatters=formatters,
|
||||
) for s in data))
|
||||
|
||||
|
||||
class ShowProtectableInstance(command.ShowOne):
|
||||
_description = "Shows protectable instance details"
|
||||
|
||||
def get_parser(self, prog_name):
|
||||
parser = super(ShowProtectableInstance, self).get_parser(prog_name)
|
||||
parser.add_argument(
|
||||
'protectable_type',
|
||||
metavar="<protectable_type>",
|
||||
help=_('Protectable type.')
|
||||
)
|
||||
parser.add_argument(
|
||||
'protectable_id',
|
||||
metavar="<protectable_id>",
|
||||
help=_('Protectable instance id.')
|
||||
)
|
||||
parser.add_argument(
|
||||
'--parameters',
|
||||
type=str,
|
||||
nargs='*',
|
||||
metavar="<key=value>",
|
||||
default=None,
|
||||
help=_('Show a instance by parameters key and value pair. '
|
||||
'Default=None.')
|
||||
)
|
||||
return parser
|
||||
|
||||
def take_action(self, parsed_args):
|
||||
client = self.app.client_manager.data_protection
|
||||
|
||||
search_opts = {
|
||||
'parameters': (utils.extract_instances_parameters(parsed_args)
|
||||
if parsed_args.parameters else None),
|
||||
}
|
||||
|
||||
instance = client.protectables.get_instance(
|
||||
parsed_args.protectable_type,
|
||||
parsed_args.protectable_id,
|
||||
search_opts=search_opts)
|
||||
|
||||
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:
|
||||
continue
|
||||
instance._info[key] = json_dumps(instance._info[key])
|
||||
|
||||
return zip(*sorted(instance._info.items()))
|
||||
|
@ -1,99 +1,99 @@
|
||||
# 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 provider action implementations"""
|
||||
|
||||
from osc_lib.command import command
|
||||
from osc_lib import utils as osc_utils
|
||||
from oslo_log import log as logging
|
||||
|
||||
from karborclient.i18n import _
|
||||
|
||||
|
||||
class ListProviders(command.Lister):
|
||||
_description = _("List providers.")
|
||||
|
||||
log = logging.getLogger(__name__ + ".ListProviders")
|
||||
|
||||
def get_parser(self, prog_name):
|
||||
parser = super(ListProviders, self).get_parser(prog_name)
|
||||
parser.add_argument(
|
||||
'--name',
|
||||
metavar='<name>',
|
||||
help=_('Filters results by a name. Default=None.'),
|
||||
)
|
||||
parser.add_argument(
|
||||
'--description',
|
||||
metavar='<description>',
|
||||
help=_('Filters results by a description. Default=None.'),
|
||||
)
|
||||
parser.add_argument(
|
||||
'--marker',
|
||||
metavar='<provider>',
|
||||
help=_('The last provider ID of the previous page'),
|
||||
)
|
||||
parser.add_argument(
|
||||
'--limit',
|
||||
type=int,
|
||||
metavar='<num-providers>',
|
||||
help=_('Maximum number of providers 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"),
|
||||
)
|
||||
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
|
||||
|
||||
search_opts = {
|
||||
'name': parsed_args.name,
|
||||
'description': parsed_args.description,
|
||||
}
|
||||
|
||||
data = data_protection_client.providers.list(
|
||||
search_opts=search_opts, marker=parsed_args.marker,
|
||||
limit=parsed_args.limit, sort=parsed_args.sort)
|
||||
|
||||
column_headers = ['Id', 'Name', 'Description']
|
||||
|
||||
return (column_headers,
|
||||
(osc_utils.get_item_properties(
|
||||
s, column_headers
|
||||
) for s in data))
|
||||
|
||||
|
||||
class ShowProvider(command.ShowOne):
|
||||
_description = "Shows provider details"
|
||||
|
||||
def get_parser(self, prog_name):
|
||||
parser = super(ShowProvider, self).get_parser(prog_name)
|
||||
parser.add_argument(
|
||||
'provider',
|
||||
metavar="<provider>",
|
||||
help=_('The UUID of the provider.')
|
||||
)
|
||||
return parser
|
||||
|
||||
def take_action(self, parsed_args):
|
||||
client = self.app.client_manager.data_protection
|
||||
provider = osc_utils.find_resource(client.providers,
|
||||
parsed_args.provider)
|
||||
|
||||
provider._info.pop("links", None)
|
||||
return zip(*sorted(provider._info.items()))
|
||||
# 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 provider action implementations"""
|
||||
|
||||
from osc_lib.command import command
|
||||
from osc_lib import utils as osc_utils
|
||||
from oslo_log import log as logging
|
||||
|
||||
from karborclient.i18n import _
|
||||
|
||||
|
||||
class ListProviders(command.Lister):
|
||||
_description = _("List providers.")
|
||||
|
||||
log = logging.getLogger(__name__ + ".ListProviders")
|
||||
|
||||
def get_parser(self, prog_name):
|
||||
parser = super(ListProviders, self).get_parser(prog_name)
|
||||
parser.add_argument(
|
||||
'--name',
|
||||
metavar='<name>',
|
||||
help=_('Filters results by a name. Default=None.'),
|
||||
)
|
||||
parser.add_argument(
|
||||
'--description',
|
||||
metavar='<description>',
|
||||
help=_('Filters results by a description. Default=None.'),
|
||||
)
|
||||
parser.add_argument(
|
||||
'--marker',
|
||||
metavar='<provider>',
|
||||
help=_('The last provider ID of the previous page'),
|
||||
)
|
||||
parser.add_argument(
|
||||
'--limit',
|
||||
type=int,
|
||||
metavar='<num-providers>',
|
||||
help=_('Maximum number of providers 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"),
|
||||
)
|
||||
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
|
||||
|
||||
search_opts = {
|
||||
'name': parsed_args.name,
|
||||
'description': parsed_args.description,
|
||||
}
|
||||
|
||||
data = data_protection_client.providers.list(
|
||||
search_opts=search_opts, marker=parsed_args.marker,
|
||||
limit=parsed_args.limit, sort=parsed_args.sort)
|
||||
|
||||
column_headers = ['Id', 'Name', 'Description']
|
||||
|
||||
return (column_headers,
|
||||
(osc_utils.get_item_properties(
|
||||
s, column_headers
|
||||
) for s in data))
|
||||
|
||||
|
||||
class ShowProvider(command.ShowOne):
|
||||
_description = "Shows provider details"
|
||||
|
||||
def get_parser(self, prog_name):
|
||||
parser = super(ShowProvider, self).get_parser(prog_name)
|
||||
parser.add_argument(
|
||||
'provider',
|
||||
metavar="<provider>",
|
||||
help=_('The UUID of the provider.')
|
||||
)
|
||||
return parser
|
||||
|
||||
def take_action(self, parsed_args):
|
||||
client = self.app.client_manager.data_protection
|
||||
provider = osc_utils.find_resource(client.providers,
|
||||
parsed_args.provider)
|
||||
|
||||
provider._info.pop("links", None)
|
||||
return zip(*sorted(provider._info.items()))
|
||||
|
@ -1,195 +1,195 @@
|
||||
# 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 restore action implementations"""
|
||||
|
||||
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 _
|
||||
from karborclient import utils
|
||||
|
||||
|
||||
class ListRestores(command.Lister):
|
||||
_description = _("List restores.")
|
||||
|
||||
log = logging.getLogger(__name__ + ".ListRestores")
|
||||
|
||||
def get_parser(self, prog_name):
|
||||
parser = super(ListRestores, self).get_parser(prog_name)
|
||||
parser.add_argument(
|
||||
'--all-projects',
|
||||
action='store_true',
|
||||
default=False,
|
||||
help=_('Include all projects (admin only)'),
|
||||
)
|
||||
parser.add_argument(
|
||||
'--status',
|
||||
metavar='<status>',
|
||||
help=_('Filter results by status'),
|
||||
)
|
||||
parser.add_argument(
|
||||
'--marker',
|
||||
metavar='<restore>',
|
||||
help=_('The last restore ID of the previous page'),
|
||||
)
|
||||
parser.add_argument(
|
||||
'--limit',
|
||||
type=int,
|
||||
metavar='<num-restores>',
|
||||
help=_('Maximum number of restores to display'),
|
||||
)
|
||||
parser.add_argument(
|
||||
'--sort',
|
||||
metavar="<key>[:<direction>]",
|
||||
default=None,
|
||||
help=_("Sort output by selected keys and directions(asc or desc), "
|
||||
"multiple keys and directions can be "
|
||||
"specified separated by comma"),
|
||||
)
|
||||
parser.add_argument(
|
||||
'--project',
|
||||
metavar='<project>',
|
||||
help=_('Filter results by a project(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.project) or parsed_args.all_projects
|
||||
|
||||
search_opts = {
|
||||
'all_tenants': all_projects,
|
||||
'project_id': parsed_args.project,
|
||||
'status': parsed_args.status,
|
||||
}
|
||||
|
||||
data = data_protection_client.restores.list(
|
||||
search_opts=search_opts, marker=parsed_args.marker,
|
||||
limit=parsed_args.limit, sort=parsed_args.sort)
|
||||
|
||||
column_headers = ['Id', 'Project id', 'Provider id', 'Checkpoint id',
|
||||
'Restore target', 'Parameters', 'Status']
|
||||
|
||||
return (column_headers,
|
||||
(osc_utils.get_item_properties(
|
||||
s, column_headers
|
||||
) for s in data))
|
||||
|
||||
|
||||
class ShowRestore(command.ShowOne):
|
||||
_description = "Shows restore details"
|
||||
|
||||
def get_parser(self, prog_name):
|
||||
parser = super(ShowRestore, self).get_parser(prog_name)
|
||||
parser.add_argument(
|
||||
'restore',
|
||||
metavar="<restore>",
|
||||
help=_('The UUID of the restore.')
|
||||
)
|
||||
return parser
|
||||
|
||||
def take_action(self, parsed_args):
|
||||
client = self.app.client_manager.data_protection
|
||||
restore = osc_utils.find_resource(client.restores, parsed_args.restore)
|
||||
|
||||
restore._info.pop("links", None)
|
||||
return zip(*sorted(restore._info.items()))
|
||||
|
||||
|
||||
class CreateRestore(command.ShowOne):
|
||||
_description = "Creates a restore"
|
||||
|
||||
def get_parser(self, prog_name):
|
||||
parser = super(CreateRestore, self).get_parser(prog_name)
|
||||
parser.add_argument(
|
||||
'provider_id',
|
||||
metavar='<provider_id>',
|
||||
help=_('The UUID of the provider.')
|
||||
)
|
||||
parser.add_argument(
|
||||
'checkpoint_id',
|
||||
metavar='<checkpoint_id>',
|
||||
help=_('The UUID of the checkpoint.')
|
||||
)
|
||||
parser.add_argument(
|
||||
'--restore_target',
|
||||
metavar='<restore_target>',
|
||||
help=_('The target of the restore operation.')
|
||||
)
|
||||
parser.add_argument(
|
||||
'--restore_username',
|
||||
metavar='<restore_username>',
|
||||
default=None,
|
||||
help=_('Username to restore target.')
|
||||
)
|
||||
parser.add_argument(
|
||||
'--restore_password',
|
||||
metavar='<restore_password>',
|
||||
default=None,
|
||||
help=_('Password to restore target.')
|
||||
)
|
||||
parser.add_argument(
|
||||
'--parameters-json',
|
||||
type=str,
|
||||
dest='parameters_json',
|
||||
metavar='<parameters>',
|
||||
default=None,
|
||||
help=_('Restore parameters in json format.')
|
||||
)
|
||||
parser.add_argument(
|
||||
'--parameters',
|
||||
action='append',
|
||||
metavar='resource_type=<type>[,resource_id=<id>,key=val,...]',
|
||||
default=[],
|
||||
help=_("Restore parameters, may be specified multiple times. "
|
||||
"resource_type: type of resource to apply parameters. "
|
||||
"resource_id: limit the parameters to a specific resource. "
|
||||
"Other keys and values: according to provider\'s "
|
||||
"restore schema.")
|
||||
)
|
||||
return parser
|
||||
|
||||
def take_action(self, parsed_args):
|
||||
client = self.app.client_manager.data_protection
|
||||
if not uuidutils.is_uuid_like(parsed_args.provider_id):
|
||||
raise exceptions.CommandError(
|
||||
"Invalid provider id provided.")
|
||||
if not uuidutils.is_uuid_like(parsed_args.checkpoint_id):
|
||||
raise exceptions.CommandError(
|
||||
"Invalid checkpoint id provided.")
|
||||
|
||||
restore_parameters = utils.extract_parameters(parsed_args)
|
||||
restore_auth = None
|
||||
if parsed_args.restore_target is not None:
|
||||
if parsed_args.restore_username is None:
|
||||
raise exceptions.CommandError(
|
||||
"Must specify username for restore_target.")
|
||||
if parsed_args.restore_password is None:
|
||||
raise exceptions.CommandError(
|
||||
"Must specify password for restore_target.")
|
||||
restore_auth = {
|
||||
'type': 'password',
|
||||
'username': parsed_args.restore_username,
|
||||
'password': parsed_args.restore_password,
|
||||
}
|
||||
restore = client.restores.create(parsed_args.provider_id,
|
||||
parsed_args.checkpoint_id,
|
||||
parsed_args.restore_target,
|
||||
restore_parameters, restore_auth)
|
||||
restore._info.pop("links", None)
|
||||
return zip(*sorted(restore._info.items()))
|
||||
# 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 restore action implementations"""
|
||||
|
||||
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 _
|
||||
from karborclient import utils
|
||||
|
||||
|
||||
class ListRestores(command.Lister):
|
||||
_description = _("List restores.")
|
||||
|
||||
log = logging.getLogger(__name__ + ".ListRestores")
|
||||
|
||||
def get_parser(self, prog_name):
|
||||
parser = super(ListRestores, self).get_parser(prog_name)
|
||||
parser.add_argument(
|
||||
'--all-projects',
|
||||
action='store_true',
|
||||
default=False,
|
||||
help=_('Include all projects (admin only)'),
|
||||
)
|
||||
parser.add_argument(
|
||||
'--status',
|
||||
metavar='<status>',
|
||||
help=_('Filter results by status'),
|
||||
)
|
||||
parser.add_argument(
|
||||
'--marker',
|
||||
metavar='<restore>',
|
||||
help=_('The last restore ID of the previous page'),
|
||||
)
|
||||
parser.add_argument(
|
||||
'--limit',
|
||||
type=int,
|
||||
metavar='<num-restores>',
|
||||
help=_('Maximum number of restores to display'),
|
||||
)
|
||||
parser.add_argument(
|
||||
'--sort',
|
||||
metavar="<key>[:<direction>]",
|
||||
default=None,
|
||||
help=_("Sort output by selected keys and directions(asc or desc), "
|
||||
"multiple keys and directions can be "
|
||||
"specified separated by comma"),
|
||||
)
|
||||
parser.add_argument(
|
||||
'--project',
|
||||
metavar='<project>',
|
||||
help=_('Filter results by a project(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.project) or parsed_args.all_projects
|
||||
|
||||
search_opts = {
|
||||
'all_tenants': all_projects,
|
||||
'project_id': parsed_args.project,
|
||||
'status': parsed_args.status,
|
||||
}
|
||||
|
||||
data = data_protection_client.restores.list(
|
||||
search_opts=search_opts, marker=parsed_args.marker,
|
||||
limit=parsed_args.limit, sort=parsed_args.sort)
|
||||
|
||||
column_headers = ['Id', 'Project id', 'Provider id', 'Checkpoint id',
|
||||
'Restore target', 'Parameters', 'Status']
|
||||
|
||||
return (column_headers,
|
||||
(osc_utils.get_item_properties(
|
||||
s, column_headers
|
||||
) for s in data))
|
||||
|
||||
|
||||
class ShowRestore(command.ShowOne):
|
||||
_description = "Shows restore details"
|
||||
|
||||
def get_parser(self, prog_name):
|
||||
parser = super(ShowRestore, self).get_parser(prog_name)
|
||||
parser.add_argument(
|
||||
'restore',
|
||||
metavar="<restore>",
|
||||
help=_('The UUID of the restore.')
|
||||
)
|
||||
return parser
|
||||
|
||||
def take_action(self, parsed_args):
|
||||
client = self.app.client_manager.data_protection
|
||||
restore = osc_utils.find_resource(client.restores, parsed_args.restore)
|
||||
|
||||
restore._info.pop("links", None)
|
||||
return zip(*sorted(restore._info.items()))
|
||||
|
||||
|
||||
class CreateRestore(command.ShowOne):
|
||||
_description = "Creates a restore"
|
||||
|
||||
def get_parser(self, prog_name):
|
||||
parser = super(CreateRestore, self).get_parser(prog_name)
|
||||
parser.add_argument(
|
||||
'provider_id',
|
||||
metavar='<provider_id>',
|
||||
help=_('The UUID of the provider.')
|
||||
)
|
||||
parser.add_argument(
|
||||
'checkpoint_id',
|
||||
metavar='<checkpoint_id>',
|
||||
help=_('The UUID of the checkpoint.')
|
||||
)
|
||||
parser.add_argument(
|
||||
'--restore_target',
|
||||
metavar='<restore_target>',
|
||||
help=_('The target of the restore operation.')
|
||||
)
|
||||
parser.add_argument(
|
||||
'--restore_username',
|
||||
metavar='<restore_username>',
|
||||
default=None,
|
||||
help=_('Username to restore target.')
|
||||
)
|
||||
parser.add_argument(
|
||||
'--restore_password',
|
||||
metavar='<restore_password>',
|
||||
default=None,
|
||||
help=_('Password to restore target.')
|
||||
)
|
||||
parser.add_argument(
|
||||
'--parameters-json',
|
||||
type=str,
|
||||
dest='parameters_json',
|
||||
metavar='<parameters>',
|
||||
default=None,
|
||||
help=_('Restore parameters in json format.')
|
||||
)
|
||||
parser.add_argument(
|
||||
'--parameters',
|
||||
action='append',
|
||||
metavar='resource_type=<type>[,resource_id=<id>,key=val,...]',
|
||||
default=[],
|
||||
help=_("Restore parameters, may be specified multiple times. "
|
||||
"resource_type: type of resource to apply parameters. "
|
||||
"resource_id: limit the parameters to a specific resource. "
|
||||
"Other keys and values: according to provider\'s "
|
||||
"restore schema.")
|
||||
)
|
||||
return parser
|
||||
|
||||
def take_action(self, parsed_args):
|
||||
client = self.app.client_manager.data_protection
|
||||
if not uuidutils.is_uuid_like(parsed_args.provider_id):
|
||||
raise exceptions.CommandError(
|
||||
"Invalid provider id provided.")
|
||||
if not uuidutils.is_uuid_like(parsed_args.checkpoint_id):
|
||||
raise exceptions.CommandError(
|
||||
"Invalid checkpoint id provided.")
|
||||
|
||||
restore_parameters = utils.extract_parameters(parsed_args)
|
||||
restore_auth = None
|
||||
if parsed_args.restore_target is not None:
|
||||
if parsed_args.restore_username is None:
|
||||
raise exceptions.CommandError(
|
||||
"Must specify username for restore_target.")
|
||||
if parsed_args.restore_password is None:
|
||||
raise exceptions.CommandError(
|
||||
"Must specify password for restore_target.")
|
||||
restore_auth = {
|
||||
'type': 'password',
|
||||
'username': parsed_args.restore_username,
|
||||
'password': parsed_args.restore_password,
|
||||
}
|
||||
restore = client.restores.create(parsed_args.provider_id,
|
||||
parsed_args.checkpoint_id,
|
||||
parsed_args.restore_target,
|
||||
restore_parameters, restore_auth)
|
||||
restore._info.pop("links", None)
|
||||
return zip(*sorted(restore._info.items()))
|
||||
|
@ -1,208 +1,208 @@
|
||||
# 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 scheduled_operations action implementations"""
|
||||
|
||||
import six
|
||||
|
||||
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 _
|
||||
|
||||
|
||||
class ListScheduledOperations(command.Lister):
|
||||
_description = _("List scheduled_operations.")
|
||||
|
||||
log = logging.getLogger(__name__ + ".ListScheduledOperations")
|
||||
|
||||
def get_parser(self, prog_name):
|
||||
parser = super(ListScheduledOperations, self).get_parser(prog_name)
|
||||
parser.add_argument(
|
||||
'--all-projects',
|
||||
action='store_true',
|
||||
default=False,
|
||||
help=_('Shows details for all tenants. Admin only.'),
|
||||
)
|
||||
parser.add_argument(
|
||||
'--name',
|
||||
metavar='<name>',
|
||||
help=_('Filters results by a name. Default=None.'),
|
||||
)
|
||||
parser.add_argument(
|
||||
'--operation_type',
|
||||
metavar='<operation_type>',
|
||||
default=None,
|
||||
help=_('Filters results by a type. Default=None.'),
|
||||
)
|
||||
parser.add_argument(
|
||||
'--trigger_id',
|
||||
metavar='<trigger_id>',
|
||||
default=None,
|
||||
help=_('Filters results by a trigger id. Default=None.'),
|
||||
)
|
||||
parser.add_argument(
|
||||
'--operation_definition',
|
||||
metavar='<operation_definition>',
|
||||
default=None,
|
||||
help=_('Filters results by a operation definition. Default=None.'),
|
||||
)
|
||||
parser.add_argument(
|
||||
'--marker',
|
||||
metavar='<scheduled_operations>',
|
||||
help=_('The last scheduled_operations ID of the previous page'),
|
||||
)
|
||||
parser.add_argument(
|
||||
'--limit',
|
||||
type=int,
|
||||
metavar='<num-scheduled_operations>',
|
||||
help=_('Maximum number of scheduled_operations 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(
|
||||
'--project',
|
||||
metavar='<project>',
|
||||
help=_('Filter results by a project(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.project) or parsed_args.all_projects
|
||||
|
||||
search_opts = {
|
||||
'all_tenants': all_projects,
|
||||
'project_id': parsed_args.project,
|
||||
'name': parsed_args.name,
|
||||
'operation_type': parsed_args.operation_type,
|
||||
'trigger_id': parsed_args.trigger_id,
|
||||
'operation_definition': parsed_args.operation_definition,
|
||||
}
|
||||
|
||||
data = data_protection_client.scheduled_operations.list(
|
||||
search_opts=search_opts, marker=parsed_args.marker,
|
||||
limit=parsed_args.limit, sort=parsed_args.sort)
|
||||
|
||||
column_headers = ['Id', 'Name', 'OperationType', 'TriggerId',
|
||||
'OperationDefinition']
|
||||
|
||||
scheduled_operations = []
|
||||
for s in data:
|
||||
scheduled_operation = (s.id, s.name, s.operation_type,
|
||||
s.trigger_id, s.operation_definition)
|
||||
scheduled_operations.append(scheduled_operation)
|
||||
|
||||
return (column_headers, scheduled_operations)
|
||||
|
||||
|
||||
class ShowScheduledOperation(command.ShowOne):
|
||||
_description = "Shows scheduled_operation details"
|
||||
|
||||
def get_parser(self, prog_name):
|
||||
parser = super(ShowScheduledOperation, self).get_parser(prog_name)
|
||||
parser.add_argument(
|
||||
'scheduledoperation',
|
||||
metavar="<scheduledoperation>",
|
||||
help=_('The UUID of the scheduledoperation.')
|
||||
)
|
||||
return parser
|
||||
|
||||
def take_action(self, parsed_args):
|
||||
client = self.app.client_manager.data_protection
|
||||
so = osc_utils.find_resource(client.scheduled_operations,
|
||||
parsed_args.scheduledoperation)
|
||||
|
||||
so._info.pop("links", None)
|
||||
return zip(*sorted(six.iteritems(so._info)))
|
||||
|
||||
|
||||
class CreateScheduledOperation(command.ShowOne):
|
||||
_description = "Creates a scheduled operation"
|
||||
|
||||
def get_parser(self, prog_name):
|
||||
parser = super(CreateScheduledOperation, self).get_parser(prog_name)
|
||||
parser.add_argument(
|
||||
'name',
|
||||
metavar='<name>',
|
||||
help=_('The name of the scheduled operation.')
|
||||
)
|
||||
parser.add_argument(
|
||||
'operation_type',
|
||||
metavar='<operation_type>',
|
||||
help=_('Operation Type of scheduled operation.')
|
||||
)
|
||||
parser.add_argument(
|
||||
'trigger_id',
|
||||
metavar='<trigger_id>',
|
||||
help=_('Trigger id of scheduled operation.')
|
||||
)
|
||||
parser.add_argument(
|
||||
'operation_definition',
|
||||
metavar='<key=value,key=value>',
|
||||
help=_('Operation definition of scheduled operation.')
|
||||
)
|
||||
return parser
|
||||
|
||||
def take_action(self, parsed_args):
|
||||
client = self.app.client_manager.data_protection
|
||||
if not uuidutils.is_uuid_like(parsed_args.trigger_id):
|
||||
raise exceptions.CommandError(
|
||||
"Invalid trigger id provided.")
|
||||
so = client.scheduled_operations.create(
|
||||
parsed_args.name, parsed_args.operation_type,
|
||||
parsed_args.trigger_id, parsed_args.operation_definition)
|
||||
|
||||
so._info.pop("links", None)
|
||||
return zip(*sorted(six.iteritems(so._info)))
|
||||
|
||||
|
||||
class DeleteScheduledOperation(command.Command):
|
||||
_description = "Delete scheduled operation"
|
||||
|
||||
def get_parser(self, prog_name):
|
||||
parser = super(DeleteScheduledOperation, self).get_parser(prog_name)
|
||||
parser.add_argument(
|
||||
'scheduledoperation',
|
||||
metavar='<scheduledoperation>',
|
||||
nargs="+",
|
||||
help=_('ID of scheduled operation.')
|
||||
)
|
||||
return parser
|
||||
|
||||
def take_action(self, parsed_args):
|
||||
client = self.app.client_manager.data_protection
|
||||
failure_count = 0
|
||||
for so_id in parsed_args.scheduledoperation:
|
||||
try:
|
||||
so = osc_utils.find_resource(client.scheduled_operations,
|
||||
so_id)
|
||||
client.scheduled_operations.delete(so.id)
|
||||
except exceptions.NotFound:
|
||||
failure_count += 1
|
||||
print("Failed to delete '%s'; scheduled operation "
|
||||
"not found" % so_id)
|
||||
if failure_count == len(parsed_args.scheduledoperation):
|
||||
raise exceptions.CommandError(
|
||||
"Unable to find and delete any of the "
|
||||
"specified scheduled operation.")
|
||||
# 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 scheduled_operations action implementations"""
|
||||
|
||||
import six
|
||||
|
||||
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 _
|
||||
|
||||
|
||||
class ListScheduledOperations(command.Lister):
|
||||
_description = _("List scheduled_operations.")
|
||||
|
||||
log = logging.getLogger(__name__ + ".ListScheduledOperations")
|
||||
|
||||
def get_parser(self, prog_name):
|
||||
parser = super(ListScheduledOperations, self).get_parser(prog_name)
|
||||
parser.add_argument(
|
||||
'--all-projects',
|
||||
action='store_true',
|
||||
default=False,
|
||||
help=_('Shows details for all tenants. Admin only.'),
|
||||
)
|
||||
parser.add_argument(
|
||||
'--name',
|
||||
metavar='<name>',
|
||||
help=_('Filters results by a name. Default=None.'),
|
||||
)
|
||||
parser.add_argument(
|
||||
'--operation_type',
|
||||
metavar='<operation_type>',
|
||||
default=None,
|
||||
help=_('Filters results by a type. Default=None.'),
|
||||
)
|
||||
parser.add_argument(
|
||||
'--trigger_id',
|
||||
metavar='<trigger_id>',
|
||||
default=None,
|
||||
help=_('Filters results by a trigger id. Default=None.'),
|
||||
)
|
||||
parser.add_argument(
|
||||
'--operation_definition',
|
||||
metavar='<operation_definition>',
|
||||
default=None,
|
||||
help=_('Filters results by a operation definition. Default=None.'),
|
||||
)
|
||||
parser.add_argument(
|
||||
'--marker',
|
||||
metavar='<scheduled_operations>',
|
||||
help=_('The last scheduled_operations ID of the previous page'),
|
||||
)
|
||||
parser.add_argument(
|
||||
'--limit',
|
||||
type=int,
|
||||
metavar='<num-scheduled_operations>',
|
||||
help=_('Maximum number of scheduled_operations 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(
|
||||
'--project',
|
||||
metavar='<project>',
|
||||
help=_('Filter results by a project(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.project) or parsed_args.all_projects
|
||||
|
||||
search_opts = {
|
||||
'all_tenants': all_projects,
|
||||
'project_id': parsed_args.project,
|
||||
'name': parsed_args.name,
|
||||
'operation_type': parsed_args.operation_type,
|
||||
'trigger_id': parsed_args.trigger_id,
|
||||
'operation_definition': parsed_args.operation_definition,
|
||||
}
|
||||
|
||||
data = data_protection_client.scheduled_operations.list(
|
||||
search_opts=search_opts, marker=parsed_args.marker,
|
||||
limit=parsed_args.limit, sort=parsed_args.sort)
|
||||
|
||||
column_headers = ['Id', 'Name', 'OperationType', 'TriggerId',
|
||||
'OperationDefinition']
|
||||
|
||||
scheduled_operations = []
|
||||
for s in data:
|
||||
scheduled_operation = (s.id, s.name, s.operation_type,
|
||||
s.trigger_id, s.operation_definition)
|
||||
scheduled_operations.append(scheduled_operation)
|
||||
|
||||
return (column_headers, scheduled_operations)
|
||||
|
||||
|
||||
class ShowScheduledOperation(command.ShowOne):
|
||||
_description = "Shows scheduled_operation details"
|
||||
|
||||
def get_parser(self, prog_name):
|
||||
parser = super(ShowScheduledOperation, self).get_parser(prog_name)
|
||||
parser.add_argument(
|
||||
'scheduledoperation',
|
||||
metavar="<scheduledoperation>",
|
||||
help=_('The UUID of the scheduledoperation.')
|
||||
)
|
||||
return parser
|
||||
|
||||
def take_action(self, parsed_args):
|
||||
client = self.app.client_manager.data_protection
|
||||
so = osc_utils.find_resource(client.scheduled_operations,
|
||||
parsed_args.scheduledoperation)
|
||||
|
||||
so._info.pop("links", None)
|
||||
return zip(*sorted(six.iteritems(so._info)))
|
||||
|
||||
|
||||
class CreateScheduledOperation(command.ShowOne):
|
||||
_description = "Creates a scheduled operation"
|
||||
|
||||
def get_parser(self, prog_name):
|
||||
parser = super(CreateScheduledOperation, self).get_parser(prog_name)
|
||||
parser.add_argument(
|
||||
'name',
|
||||
metavar='<name>',
|
||||
help=_('The name of the scheduled operation.')
|
||||
)
|
||||
parser.add_argument(
|
||||
'operation_type',
|
||||
metavar='<operation_type>',
|
||||
help=_('Operation Type of scheduled operation.')
|
||||
)
|
||||
parser.add_argument(
|
||||
'trigger_id',
|
||||
metavar='<trigger_id>',
|
||||
help=_('Trigger id of scheduled operation.')
|
||||
)
|
||||
parser.add_argument(
|
||||
'operation_definition',
|
||||
metavar='<key=value,key=value>',
|
||||
help=_('Operation definition of scheduled operation.')
|
||||
)
|
||||
return parser
|
||||
|
||||
def take_action(self, parsed_args):
|
||||
client = self.app.client_manager.data_protection
|
||||
if not uuidutils.is_uuid_like(parsed_args.trigger_id):
|
||||
raise exceptions.CommandError(
|
||||
"Invalid trigger id provided.")
|
||||
so = client.scheduled_operations.create(
|
||||
parsed_args.name, parsed_args.operation_type,
|
||||
parsed_args.trigger_id, parsed_args.operation_definition)
|
||||
|
||||
so._info.pop("links", None)
|
||||
return zip(*sorted(six.iteritems(so._info)))
|
||||
|
||||
|
||||
class DeleteScheduledOperation(command.Command):
|
||||
_description = "Delete scheduled operation"
|
||||
|
||||
def get_parser(self, prog_name):
|
||||
parser = super(DeleteScheduledOperation, self).get_parser(prog_name)
|
||||
parser.add_argument(
|
||||
'scheduledoperation',
|
||||
metavar='<scheduledoperation>',
|
||||
nargs="+",
|
||||
help=_('ID of scheduled operation.')
|
||||
)
|
||||
return parser
|
||||
|
||||
def take_action(self, parsed_args):
|
||||
client = self.app.client_manager.data_protection
|
||||
failure_count = 0
|
||||
for so_id in parsed_args.scheduledoperation:
|
||||
try:
|
||||
so = osc_utils.find_resource(client.scheduled_operations,
|
||||
so_id)
|
||||
client.scheduled_operations.delete(so.id)
|
||||
except exceptions.NotFound:
|
||||
failure_count += 1
|
||||
print("Failed to delete '%s'; scheduled operation "
|
||||
"not found" % so_id)
|
||||
if failure_count == len(parsed_args.scheduledoperation):
|
||||
raise exceptions.CommandError(
|
||||
"Unable to find and delete any of the "
|
||||
"specified scheduled operation.")
|
||||
|
@ -1,229 +1,229 @@
|
||||
# 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 triggers action implementations"""
|
||||
|
||||
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 _
|
||||
from karborclient import utils
|
||||
|
||||
|
||||
class ListTriggers(command.Lister):
|
||||
_description = _("List triggers.")
|
||||
|
||||
log = logging.getLogger(__name__ + ".ListTriggers")
|
||||
|
||||
def get_parser(self, prog_name):
|
||||
parser = super(ListTriggers, self).get_parser(prog_name)
|
||||
parser.add_argument(
|
||||
'--all-projects',
|
||||
action='store_true',
|
||||
default=False,
|
||||
help=_('Shows details for all tenants. Admin only.'),
|
||||
)
|
||||
parser.add_argument(
|
||||
'--name',
|
||||
metavar='<name>',
|
||||
default=None,
|
||||
help=_('Filters results by a name. Default=None.'),
|
||||
)
|
||||
parser.add_argument(
|
||||
'--type',
|
||||
metavar='<type>',
|
||||
default=None,
|
||||
help=_('Filters results by a type. Default=None.'),
|
||||
)
|
||||
parser.add_argument(
|
||||
'--properties',
|
||||
metavar='<properties>',
|
||||
default=None,
|
||||
help=_('Filters results by a properties. Default=None.'),
|
||||
)
|
||||
parser.add_argument(
|
||||
'--marker',
|
||||
metavar='<trigger>',
|
||||
help=_('The last trigger ID of the previous page'),
|
||||
)
|
||||
parser.add_argument(
|
||||
'--limit',
|
||||
type=int,
|
||||
metavar='<num-triggers>',
|
||||
help=_('Maximum number of triggers 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(
|
||||
'--project',
|
||||
metavar='<project>',
|
||||
help=_('Display information from single 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.project) or parsed_args.all_projects
|
||||
|
||||
search_opts = {
|
||||
'all_tenants': all_projects,
|
||||
'project_id': parsed_args.project,
|
||||
'name': parsed_args.name,
|
||||
'type': parsed_args.type,
|
||||
'properties': parsed_args.properties,
|
||||
}
|
||||
|
||||
data = data_protection_client.triggers.list(
|
||||
search_opts=search_opts, marker=parsed_args.marker,
|
||||
limit=parsed_args.limit, sort=parsed_args.sort)
|
||||
|
||||
column_headers = ['Id', 'Name', 'Type', 'Properties']
|
||||
|
||||
return (column_headers,
|
||||
(osc_utils.get_item_properties(
|
||||
s, column_headers
|
||||
) for s in data))
|
||||
|
||||
|
||||
class ShowTrigger(command.ShowOne):
|
||||
_description = "Shows trigger details"
|
||||
|
||||
def get_parser(self, prog_name):
|
||||
parser = super(ShowTrigger, self).get_parser(prog_name)
|
||||
parser.add_argument(
|
||||
'trigger',
|
||||
metavar="<trigger>",
|
||||
help=_('The UUID of the trigger.')
|
||||
)
|
||||
return parser
|
||||
|
||||
def take_action(self, parsed_args):
|
||||
client = self.app.client_manager.data_protection
|
||||
trigger = osc_utils.find_resource(client.triggers, parsed_args.trigger)
|
||||
|
||||
trigger._info.pop("links", None)
|
||||
return zip(*sorted(trigger._info.items()))
|
||||
|
||||
|
||||
class CreateTrigger(command.ShowOne):
|
||||
_description = "Creates a trigger"
|
||||
|
||||
def get_parser(self, prog_name):
|
||||
parser = super(CreateTrigger, self).get_parser(prog_name)
|
||||
parser.add_argument(
|
||||
'name',
|
||||
metavar='<name>',
|
||||
help=_('The name of the trigger.')
|
||||
)
|
||||
parser.add_argument(
|
||||
'type',
|
||||
metavar='<type>',
|
||||
help=_('Type of trigger.')
|
||||
)
|
||||
parser.add_argument(
|
||||
'properties',
|
||||
metavar='<key=value,key=value>',
|
||||
help=_('Properties of trigger.')
|
||||
)
|
||||
return parser
|
||||
|
||||
def take_action(self, parsed_args):
|
||||
client = self.app.client_manager.data_protection
|
||||
trigger = client.triggers.create(parsed_args.name, parsed_args.type,
|
||||
parsed_args.properties)
|
||||
|
||||
trigger._info.pop("links", None)
|
||||
return zip(*sorted(trigger._info.items()))
|
||||
|
||||
|
||||
class UpdateTrigger(command.ShowOne):
|
||||
_description = "Update a trigger"
|
||||
|
||||
def get_parser(self, prog_name):
|
||||
parser = super(UpdateTrigger, self).get_parser(prog_name)
|
||||
parser.add_argument(
|
||||
"trigger_id",
|
||||
metavar="<TRIGGER ID>",
|
||||
help=_("Id of trigger to update.")
|
||||
)
|
||||
parser.add_argument(
|
||||
"--name",
|
||||
metavar="<name>",
|
||||
help=_("A name to which the trigger will be renamed.")
|
||||
)
|
||||
parser.add_argument(
|
||||
"--properties",
|
||||
metavar="<key=value,key=value>",
|
||||
help=_("Properties of trigger which will be updated.")
|
||||
)
|
||||
return parser
|
||||
|
||||
def take_action(self, parsed_args):
|
||||
client = self.app.client_manager.data_protection
|
||||
data = {}
|
||||
if parsed_args.name is not None:
|
||||
data['name'] = parsed_args.name
|
||||
if parsed_args.properties is not None:
|
||||
trigger_properties = utils.extract_properties(parsed_args)
|
||||
data['properties'] = trigger_properties
|
||||
try:
|
||||
trigger = osc_utils.find_resource(client.triggers,
|
||||
parsed_args.trigger_id)
|
||||
trigger = client.triggers.update(trigger.id, data)
|
||||
except exceptions.NotFound:
|
||||
raise exceptions.CommandError(
|
||||
"Trigger %s not found" % parsed_args.trigger_id)
|
||||
else:
|
||||
trigger._info.pop("links", None)
|
||||
return zip(*sorted(trigger._info.items()))
|
||||
|
||||
|
||||
class DeleteTrigger(command.Command):
|
||||
_description = "Delete trigger"
|
||||
|
||||
log = logging.getLogger(__name__ + ".DeleteTrigger")
|
||||
|
||||
def get_parser(self, prog_name):
|
||||
parser = super(DeleteTrigger, self).get_parser(prog_name)
|
||||
parser.add_argument(
|
||||
'trigger',
|
||||
metavar='<trigger>',
|
||||
nargs="+",
|
||||
help=_('ID of trigger.')
|
||||
)
|
||||
return parser
|
||||
|
||||
def take_action(self, parsed_args):
|
||||
client = self.app.client_manager.data_protection
|
||||
failure_count = 0
|
||||
for trigger_id in parsed_args.trigger:
|
||||
try:
|
||||
trigger = osc_utils.find_resource(client.triggers, trigger_id)
|
||||
client.triggers.delete(trigger.id)
|
||||
except exceptions.NotFound:
|
||||
failure_count += 1
|
||||
self.log.error(
|
||||
"Failed to delete '{0}'; trigger not found".
|
||||
format(trigger_id))
|
||||
if failure_count == len(parsed_args.trigger):
|
||||
raise exceptions.CommandError(
|
||||
"Unable to find and delete any of the "
|
||||
"specified trigger.")
|
||||
# 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 triggers action implementations"""
|
||||
|
||||
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 _
|
||||
from karborclient import utils
|
||||
|
||||
|
||||
class ListTriggers(command.Lister):
|
||||
_description = _("List triggers.")
|
||||
|
||||
log = logging.getLogger(__name__ + ".ListTriggers")
|
||||
|
||||
def get_parser(self, prog_name):
|
||||
parser = super(ListTriggers, self).get_parser(prog_name)
|
||||
parser.add_argument(
|
||||
'--all-projects',
|
||||
action='store_true',
|
||||
default=False,
|
||||
help=_('Shows details for all tenants. Admin only.'),
|
||||
)
|
||||
parser.add_argument(
|
||||
'--name',
|
||||
metavar='<name>',
|
||||
default=None,
|
||||
help=_('Filters results by a name. Default=None.'),
|
||||
)
|
||||
parser.add_argument(
|
||||
'--type',
|
||||
metavar='<type>',
|
||||
default=None,
|
||||
help=_('Filters results by a type. Default=None.'),
|
||||
)
|
||||
parser.add_argument(
|
||||
'--properties',
|
||||
metavar='<properties>',
|
||||
default=None,
|
||||
help=_('Filters results by a properties. Default=None.'),
|
||||
)
|
||||
parser.add_argument(
|
||||
'--marker',
|
||||
metavar='<trigger>',
|
||||
help=_('The last trigger ID of the previous page'),
|
||||
)
|
||||
parser.add_argument(
|
||||
'--limit',
|
||||
type=int,
|
||||
metavar='<num-triggers>',
|
||||
help=_('Maximum number of triggers 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(
|
||||
'--project',
|
||||
metavar='<project>',
|
||||
help=_('Display information from single 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.project) or parsed_args.all_projects
|
||||
|
||||
search_opts = {
|
||||
'all_tenants': all_projects,
|
||||
'project_id': parsed_args.project,
|
||||
'name': parsed_args.name,
|
||||
'type': parsed_args.type,
|
||||
'properties': parsed_args.properties,
|
||||
}
|
||||
|
||||
data = data_protection_client.triggers.list(
|
||||
search_opts=search_opts, marker=parsed_args.marker,
|
||||
limit=parsed_args.limit, sort=parsed_args.sort)
|
||||
|
||||
column_headers = ['Id', 'Name', 'Type', 'Properties']
|
||||
|
||||
return (column_headers,
|
||||
(osc_utils.get_item_properties(
|
||||
s, column_headers
|
||||
) for s in data))
|
||||
|
||||
|
||||
class ShowTrigger(command.ShowOne):
|
||||
_description = "Shows trigger details"
|
||||
|
||||
def get_parser(self, prog_name):
|
||||
parser = super(ShowTrigger, self).get_parser(prog_name)
|
||||
parser.add_argument(
|
||||
'trigger',
|
||||
metavar="<trigger>",
|
||||
help=_('The UUID of the trigger.')
|
||||
)
|
||||
return parser
|
||||
|
||||
def take_action(self, parsed_args):
|
||||
client = self.app.client_manager.data_protection
|
||||
trigger = osc_utils.find_resource(client.triggers, parsed_args.trigger)
|
||||
|
||||
trigger._info.pop("links", None)
|
||||
return zip(*sorted(trigger._info.items()))
|
||||
|
||||
|
||||
class CreateTrigger(command.ShowOne):
|
||||
_description = "Creates a trigger"
|
||||
|
||||
def get_parser(self, prog_name):
|
||||
parser = super(CreateTrigger, self).get_parser(prog_name)
|
||||
parser.add_argument(
|
||||
'name',
|
||||
metavar='<name>',
|
||||
help=_('The name of the trigger.')
|
||||
)
|
||||
parser.add_argument(
|
||||
'type',
|
||||
metavar='<type>',
|
||||
help=_('Type of trigger.')
|
||||
)
|
||||
parser.add_argument(
|
||||
'properties',
|
||||
metavar='<key=value,key=value>',
|
||||
help=_('Properties of trigger.')
|
||||
)
|
||||
return parser
|
||||
|
||||
def take_action(self, parsed_args):
|
||||
client = self.app.client_manager.data_protection
|
||||
trigger = client.triggers.create(parsed_args.name, parsed_args.type,
|
||||
parsed_args.properties)
|
||||
|
||||
trigger._info.pop("links", None)
|
||||
return zip(*sorted(trigger._info.items()))
|
||||
|
||||
|
||||
class UpdateTrigger(command.ShowOne):
|
||||
_description = "Update a trigger"
|
||||
|
||||
def get_parser(self, prog_name):
|
||||
parser = super(UpdateTrigger, self).get_parser(prog_name)
|
||||
parser.add_argument(
|
||||
"trigger_id",
|
||||
metavar="<TRIGGER ID>",
|
||||
help=_("Id of trigger to update.")
|
||||
)
|
||||
parser.add_argument(
|
||||
"--name",
|
||||
metavar="<name>",
|
||||
help=_("A name to which the trigger will be renamed.")
|
||||
)
|
||||
parser.add_argument(
|
||||
"--properties",
|
||||
metavar="<key=value,key=value>",
|
||||
help=_("Properties of trigger which will be updated.")
|
||||
)
|
||||
return parser
|
||||
|
||||
def take_action(self, parsed_args):
|
||||
client = self.app.client_manager.data_protection
|
||||
data = {}
|
||||
if parsed_args.name is not None:
|
||||
data['name'] = parsed_args.name
|
||||
if parsed_args.properties is not None:
|
||||
trigger_properties = utils.extract_properties(parsed_args)
|
||||
data['properties'] = trigger_properties
|
||||
try:
|
||||
trigger = osc_utils.find_resource(client.triggers,
|
||||
parsed_args.trigger_id)
|
||||
trigger = client.triggers.update(trigger.id, data)
|
||||
except exceptions.NotFound:
|
||||
raise exceptions.CommandError(
|
||||
"Trigger %s not found" % parsed_args.trigger_id)
|
||||
else:
|
||||
trigger._info.pop("links", None)
|
||||
return zip(*sorted(trigger._info.items()))
|
||||
|
||||
|
||||
class DeleteTrigger(command.Command):
|
||||
_description = "Delete trigger"
|
||||
|
||||
log = logging.getLogger(__name__ + ".DeleteTrigger")
|
||||
|
||||
def get_parser(self, prog_name):
|
||||
parser = super(DeleteTrigger, self).get_parser(prog_name)
|
||||
parser.add_argument(
|
||||
'trigger',
|
||||
metavar='<trigger>',
|
||||
nargs="+",
|
||||
help=_('ID of trigger.')
|
||||
)
|
||||
return parser
|
||||
|
||||
def take_action(self, parsed_args):
|
||||
client = self.app.client_manager.data_protection
|
||||
failure_count = 0
|
||||
for trigger_id in parsed_args.trigger:
|
||||
try:
|
||||
trigger = osc_utils.find_resource(client.triggers, trigger_id)
|
||||
client.triggers.delete(trigger.id)
|
||||
except exceptions.NotFound:
|
||||
failure_count += 1
|
||||
self.log.error(
|
||||
"Failed to delete '{0}'; trigger not found".
|
||||
format(trigger_id))
|
||||
if failure_count == len(parsed_args.trigger):
|
||||
raise exceptions.CommandError(
|
||||
"Unable to find and delete any of the "
|
||||
"specified trigger.")
|
||||
|
@ -1 +1 @@
|
||||
__author__ = 'c00179918'
|
||||
__author__ = 'c00179918'
|
||||
|
@ -1,29 +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()
|
||||
# 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()
|
||||
|
@ -1,146 +1,146 @@
|
||||
# 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 oslo_serialization import jsonutils
|
||||
from oslo_utils import uuidutils
|
||||
|
||||
from karborclient.common.apiclient import exceptions
|
||||
|
||||
|
||||
def extract_resources(args):
|
||||
resources = []
|
||||
for data in args.resources.split(','):
|
||||
if '=' in data and len(data.split('=')) in [3, 4]:
|
||||
resource = dict(zip(['id', 'type', 'name', 'extra_info'],
|
||||
data.split('=')))
|
||||
if resource.get('extra_info'):
|
||||
resource['extra_info'] = jsonutils.loads(
|
||||
resource.get('extra_info'))
|
||||
else:
|
||||
raise exceptions.CommandError(
|
||||
"Unable to parse parameter resources. "
|
||||
"The keys of resource are id , type, name and "
|
||||
"extra_info. The extra_info field is optional.")
|
||||
resources.append(resource)
|
||||
return resources
|
||||
|
||||
|
||||
def check_resources(cs, resources):
|
||||
# check the resource whether it is available
|
||||
for resource in resources:
|
||||
try:
|
||||
instance = cs.protectables.get_instance(
|
||||
resource["type"], resource["id"])
|
||||
except exceptions.NotFound:
|
||||
raise exceptions.CommandError(
|
||||
"The resource: %s can not be found." % resource["id"])
|
||||
else:
|
||||
if instance is None:
|
||||
raise exceptions.CommandError(
|
||||
"The resource: %s is invalid." % resource["id"])
|
||||
|
||||
|
||||
def extract_parameters(args):
|
||||
if all((args.parameters, args.parameters_json)):
|
||||
raise exceptions.CommandError(
|
||||
"Must provide parameters or parameters-json, not both")
|
||||
if not any((args.parameters, args.parameters_json)):
|
||||
return {}
|
||||
|
||||
if args.parameters_json:
|
||||
return jsonutils.loads(args.parameters_json)
|
||||
parameters = {}
|
||||
for resource_params in args.parameters:
|
||||
resource_type = None
|
||||
resource_id = None
|
||||
parameter = {}
|
||||
for param_kv in resource_params.split(','):
|
||||
try:
|
||||
key, value = param_kv.split('=')
|
||||
except Exception:
|
||||
raise exceptions.CommandError(
|
||||
'parameters must be in the form: key1=val1,key2=val2,...'
|
||||
)
|
||||
if key == "resource_type":
|
||||
resource_type = value
|
||||
elif key == "resource_id":
|
||||
if not uuidutils.is_uuid_like(value):
|
||||
raise exceptions.CommandError('resource_id must be a uuid')
|
||||
resource_id = value
|
||||
else:
|
||||
parameter[key] = value
|
||||
if resource_type is None:
|
||||
raise exceptions.CommandError(
|
||||
'Must specify resource_type for parameters'
|
||||
)
|
||||
if resource_id is None:
|
||||
resource_key = resource_type
|
||||
else:
|
||||
resource_key = "%s#%s" % (resource_type, resource_id)
|
||||
parameters[resource_key] = parameter
|
||||
|
||||
return parameters
|
||||
|
||||
|
||||
def extract_instances_parameters(args):
|
||||
parameters = {}
|
||||
for parameter in args.parameters:
|
||||
if '=' in parameter:
|
||||
(key, value) = parameter.split('=', 1)
|
||||
else:
|
||||
key = parameter
|
||||
value = None
|
||||
|
||||
parameters[key] = value
|
||||
return parameters
|
||||
|
||||
|
||||
def extract_extra_info(args):
|
||||
checkpoint_extra_info = {}
|
||||
for data in args.extra_info:
|
||||
# unset doesn't require a val, so we have the if/else
|
||||
if '=' in data:
|
||||
(key, value) = data.split('=', 1)
|
||||
else:
|
||||
key = data
|
||||
value = None
|
||||
|
||||
checkpoint_extra_info[key] = value
|
||||
return checkpoint_extra_info
|
||||
|
||||
|
||||
def extract_properties(args):
|
||||
properties = {}
|
||||
if args.properties is None:
|
||||
return properties
|
||||
for data in args.properties.split(','):
|
||||
if '=' in data:
|
||||
(resource_key, resource_value) = data.split('=', 1)
|
||||
else:
|
||||
raise exceptions.CommandError(
|
||||
"Unable to parse parameter properties.")
|
||||
|
||||
properties[resource_key] = resource_value
|
||||
return properties
|
||||
|
||||
|
||||
def extract_operation_definition(args):
|
||||
operation_definition = {}
|
||||
for data in args.operation_definition.split(','):
|
||||
if '=' in data:
|
||||
(resource_key, resource_value) = data.split('=', 1)
|
||||
else:
|
||||
raise exceptions.CommandError(
|
||||
"Unable to parse parameter operation_definition.")
|
||||
|
||||
operation_definition[resource_key] = resource_value
|
||||
return operation_definition
|
||||
# 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 oslo_serialization import jsonutils
|
||||
from oslo_utils import uuidutils
|
||||
|
||||
from karborclient.common.apiclient import exceptions
|
||||
|
||||
|
||||
def extract_resources(args):
|
||||
resources = []
|
||||
for data in args.resources.split(','):
|
||||
if '=' in data and len(data.split('=')) in [3, 4]:
|
||||
resource = dict(zip(['id', 'type', 'name', 'extra_info'],
|
||||
data.split('=')))
|
||||
if resource.get('extra_info'):
|
||||
resource['extra_info'] = jsonutils.loads(
|
||||
resource.get('extra_info'))
|
||||
else:
|
||||
raise exceptions.CommandError(
|
||||
"Unable to parse parameter resources. "
|
||||
"The keys of resource are id , type, name and "
|
||||
"extra_info. The extra_info field is optional.")
|
||||
resources.append(resource)
|
||||
return resources
|
||||
|
||||
|
||||
def check_resources(cs, resources):
|
||||
# check the resource whether it is available
|
||||
for resource in resources:
|
||||
try:
|
||||
instance = cs.protectables.get_instance(
|
||||
resource["type"], resource["id"])
|
||||
except exceptions.NotFound:
|
||||
raise exceptions.CommandError(
|
||||
"The resource: %s can not be found." % resource["id"])
|
||||
else:
|
||||
if instance is None:
|
||||
raise exceptions.CommandError(
|
||||
"The resource: %s is invalid." % resource["id"])
|
||||
|
||||
|
||||
def extract_parameters(args):
|
||||
if all((args.parameters, args.parameters_json)):
|
||||
raise exceptions.CommandError(
|
||||
"Must provide parameters or parameters-json, not both")
|
||||
if not any((args.parameters, args.parameters_json)):
|
||||
return {}
|
||||
|
||||
if args.parameters_json:
|
||||
return jsonutils.loads(args.parameters_json)
|
||||
parameters = {}
|
||||
for resource_params in args.parameters:
|
||||
resource_type = None
|
||||
resource_id = None
|
||||
parameter = {}
|
||||
for param_kv in resource_params.split(','):
|
||||
try:
|
||||
key, value = param_kv.split('=')
|
||||
except Exception:
|
||||
raise exceptions.CommandError(
|
||||
'parameters must be in the form: key1=val1,key2=val2,...'
|
||||
)
|
||||
if key == "resource_type":
|
||||
resource_type = value
|
||||
elif key == "resource_id":
|
||||
if not uuidutils.is_uuid_like(value):
|
||||
raise exceptions.CommandError('resource_id must be a uuid')
|
||||
resource_id = value
|
||||
else:
|
||||
parameter[key] = value
|
||||
if resource_type is None:
|
||||
raise exceptions.CommandError(
|
||||
'Must specify resource_type for parameters'
|
||||
)
|
||||
if resource_id is None:
|
||||
resource_key = resource_type
|
||||
else:
|
||||
resource_key = "%s#%s" % (resource_type, resource_id)
|
||||
parameters[resource_key] = parameter
|
||||
|
||||
return parameters
|
||||
|
||||
|
||||
def extract_instances_parameters(args):
|
||||
parameters = {}
|
||||
for parameter in args.parameters:
|
||||
if '=' in parameter:
|
||||
(key, value) = parameter.split('=', 1)
|
||||
else:
|
||||
key = parameter
|
||||
value = None
|
||||
|
||||
parameters[key] = value
|
||||
return parameters
|
||||
|
||||
|
||||
def extract_extra_info(args):
|
||||
checkpoint_extra_info = {}
|
||||
for data in args.extra_info:
|
||||
# unset doesn't require a val, so we have the if/else
|
||||
if '=' in data:
|
||||
(key, value) = data.split('=', 1)
|
||||
else:
|
||||
key = data
|
||||
value = None
|
||||
|
||||
checkpoint_extra_info[key] = value
|
||||
return checkpoint_extra_info
|
||||
|
||||
|
||||
def extract_properties(args):
|
||||
properties = {}
|
||||
if args.properties is None:
|
||||
return properties
|
||||
for data in args.properties.split(','):
|
||||
if '=' in data:
|
||||
(resource_key, resource_value) = data.split('=', 1)
|
||||
else:
|
||||
raise exceptions.CommandError(
|
||||
"Unable to parse parameter properties.")
|
||||
|
||||
properties[resource_key] = resource_value
|
||||
return properties
|
||||
|
||||
|
||||
def extract_operation_definition(args):
|
||||
operation_definition = {}
|
||||
for data in args.operation_definition.split(','):
|
||||
if '=' in data:
|
||||
(resource_key, resource_value) = data.split('=', 1)
|
||||
else:
|
||||
raise exceptions.CommandError(
|
||||
"Unable to parse parameter operation_definition.")
|
||||
|
||||
operation_definition[resource_key] = resource_value
|
||||
return operation_definition
|
||||
|
Loading…
Reference in New Issue
Block a user