Introduce reprocessing task API in the CLI
Change-Id: Ieab5df4deb9cbf5eddfc8eca3b028942f6303abd
This commit is contained in:
parent
de6c8b22c5
commit
277b47779f
@ -16,6 +16,7 @@
|
|||||||
from cloudkittyclient.v1 import client
|
from cloudkittyclient.v1 import client
|
||||||
from cloudkittyclient.v2 import dataframes
|
from cloudkittyclient.v2 import dataframes
|
||||||
from cloudkittyclient.v2.rating import modules
|
from cloudkittyclient.v2.rating import modules
|
||||||
|
from cloudkittyclient.v2 import reprocessing
|
||||||
from cloudkittyclient.v2 import scope
|
from cloudkittyclient.v2 import scope
|
||||||
from cloudkittyclient.v2 import summary
|
from cloudkittyclient.v2 import summary
|
||||||
|
|
||||||
@ -42,3 +43,4 @@ class Client(client.Client):
|
|||||||
self.scope = scope.ScopeManager(self.api_client)
|
self.scope = scope.ScopeManager(self.api_client)
|
||||||
self.summary = summary.SummaryManager(self.api_client)
|
self.summary = summary.SummaryManager(self.api_client)
|
||||||
self.rating = modules.RatingManager(self.api_client)
|
self.rating = modules.RatingManager(self.api_client)
|
||||||
|
self.reprocessing = reprocessing.ReprocessingManager(self.api_client)
|
||||||
|
78
cloudkittyclient/v2/reprocessing.py
Normal file
78
cloudkittyclient/v2/reprocessing.py
Normal file
@ -0,0 +1,78 @@
|
|||||||
|
# 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 cloudkittyclient.common import base
|
||||||
|
from cloudkittyclient import exc
|
||||||
|
|
||||||
|
|
||||||
|
class ReprocessingManager(base.BaseManager):
|
||||||
|
"""Class used to handle /v2/task/reprocesses endpoint"""
|
||||||
|
|
||||||
|
url = '/v2/task/reprocesses'
|
||||||
|
|
||||||
|
url_to_post = '/v2/task/reprocess'
|
||||||
|
|
||||||
|
def get_reprocessing_tasks(self, offset=0, limit=100, scope_ids=[],
|
||||||
|
order="DESC", **kwargs):
|
||||||
|
"""Returns a paginated list of reprocessing tasks.
|
||||||
|
|
||||||
|
Some optional filters can be provided.
|
||||||
|
|
||||||
|
:param offset: Index of the first reprocessing task
|
||||||
|
that should be returned.
|
||||||
|
:type offset: int
|
||||||
|
:param limit: Maximal number of reprocessing task to return.
|
||||||
|
:type limit: int
|
||||||
|
:param scope_ids: Optional scope_ids to filter on.
|
||||||
|
:type scope_ids: list of str
|
||||||
|
:param order: Optional order (asc/desc) to sort tasks.
|
||||||
|
:type order: str
|
||||||
|
"""
|
||||||
|
kwargs = kwargs or {}
|
||||||
|
kwargs['order'] = order
|
||||||
|
kwargs['offset'] = offset
|
||||||
|
kwargs['limit'] = limit
|
||||||
|
|
||||||
|
authorized_args = ['offset', 'limit', 'order']
|
||||||
|
url = self.get_url(None, kwargs, authorized_args=authorized_args)
|
||||||
|
|
||||||
|
if scope_ids:
|
||||||
|
url += "&scope_ids=%s" % (",".join(scope_ids))
|
||||||
|
return self.api_client.get(url).json()
|
||||||
|
|
||||||
|
def post_reprocessing_task(self, scope_ids=[], start=None, end=None,
|
||||||
|
reason=None, **kwargs):
|
||||||
|
"""Creates a reprocessing task
|
||||||
|
|
||||||
|
:param start: The start date of the reprocessing task
|
||||||
|
:type start: timeutils.parse_isotime
|
||||||
|
:param end: The end date of the reprocessing task
|
||||||
|
:type end: timeutils.parse_isotime
|
||||||
|
:param scope_ids: The scope IDs to create the reprocessing task to
|
||||||
|
:type scope_ids: list of str
|
||||||
|
:param reason: The reason for the reprocessing task
|
||||||
|
:type reason: str
|
||||||
|
"""
|
||||||
|
|
||||||
|
if not scope_ids:
|
||||||
|
raise exc.ArgumentRequired("'scope-id' argument is required")
|
||||||
|
|
||||||
|
body = dict(
|
||||||
|
scope_ids=scope_ids,
|
||||||
|
start_reprocess_time=start,
|
||||||
|
end_reprocess_time=end,
|
||||||
|
reason=reason
|
||||||
|
)
|
||||||
|
|
||||||
|
body = dict(filter(lambda elem: bool(elem[1]), body.items()))
|
||||||
|
|
||||||
|
return self.api_client.post(self.url_to_post, json=body).json()
|
95
cloudkittyclient/v2/reprocessing_cli.py
Normal file
95
cloudkittyclient/v2/reprocessing_cli.py
Normal file
@ -0,0 +1,95 @@
|
|||||||
|
# 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 cliff import lister
|
||||||
|
from oslo_utils import timeutils
|
||||||
|
|
||||||
|
from cloudkittyclient import utils
|
||||||
|
|
||||||
|
|
||||||
|
class CliReprocessingTasksGet(lister.Lister):
|
||||||
|
"""Get reprocessing tasks."""
|
||||||
|
|
||||||
|
result_columns = [
|
||||||
|
('scope_id', 'Scope ID'),
|
||||||
|
('reason', 'Reason'),
|
||||||
|
('start_reprocess_time', 'Start reprocessing time'),
|
||||||
|
('end_reprocess_time', 'End reprocessing time'),
|
||||||
|
('current_reprocess_time', 'Current reprocessing time'),
|
||||||
|
]
|
||||||
|
|
||||||
|
def get_parser(self, prog_name):
|
||||||
|
parser = super(CliReprocessingTasksGet, self).get_parser(prog_name)
|
||||||
|
|
||||||
|
parser.add_argument('--scope-id', type=str, default=[],
|
||||||
|
action='append', help='Optional filter on scope '
|
||||||
|
'IDs. This filter can be '
|
||||||
|
'used multiple times.')
|
||||||
|
|
||||||
|
parser.add_argument('--offset', type=int, default=0,
|
||||||
|
help='Index of the first scope. '
|
||||||
|
'The default value is 0.')
|
||||||
|
parser.add_argument('--limit', type=int, default=100,
|
||||||
|
help='Maximal number of scopes. '
|
||||||
|
'The default value is 100.')
|
||||||
|
parser.add_argument('--order', type=str, default="DESC",
|
||||||
|
help='The order to sort the reprocessing tasks '
|
||||||
|
'(ASC or DESC).')
|
||||||
|
|
||||||
|
return parser
|
||||||
|
|
||||||
|
def take_action(self, parsed_args):
|
||||||
|
resp = utils.get_client_from_osc(
|
||||||
|
self).reprocessing.get_reprocessing_tasks(
|
||||||
|
scope_ids=parsed_args.scope_id, offset=parsed_args.offset,
|
||||||
|
limit=parsed_args.limit, order=parsed_args.order
|
||||||
|
)
|
||||||
|
|
||||||
|
values = utils.list_to_cols(resp['results'], self.result_columns)
|
||||||
|
return [col[1] for col in self.result_columns], values
|
||||||
|
|
||||||
|
|
||||||
|
class CliReprocessingTasksPost(lister.Lister):
|
||||||
|
"""Create a reprocessing task."""
|
||||||
|
|
||||||
|
def get_parser(self, prog_name):
|
||||||
|
parser = super(CliReprocessingTasksPost, self).get_parser(prog_name)
|
||||||
|
|
||||||
|
parser.add_argument('--scope-id', type=str, default=[],
|
||||||
|
action='append',
|
||||||
|
help='The scope IDs to reprocess. This option can '
|
||||||
|
'be used multiple times to execute the same '
|
||||||
|
'reprocessing task for different scope IDs.')
|
||||||
|
|
||||||
|
parser.add_argument('--start-reprocess-time',
|
||||||
|
type=timeutils.parse_isotime,
|
||||||
|
help="Start of the period to reprocess in ISO8601 "
|
||||||
|
"format. Example: '2022-04-22T00:00:00Z.'")
|
||||||
|
|
||||||
|
parser.add_argument('--end-reprocess-time',
|
||||||
|
type=timeutils.parse_isotime,
|
||||||
|
help="End of the period to reprocess in ISO8601 "
|
||||||
|
"format. Example: '2022-04-22T00:00:00Z.'")
|
||||||
|
|
||||||
|
parser.add_argument('--reason', type=str,
|
||||||
|
help="The reason to create the reprocessing task.")
|
||||||
|
|
||||||
|
return parser
|
||||||
|
|
||||||
|
def take_action(self, parsed_args):
|
||||||
|
return ["Result"], utils.get_client_from_osc(
|
||||||
|
self).reprocessing.post_reprocessing_task(
|
||||||
|
scope_ids=parsed_args.scope_id,
|
||||||
|
start=parsed_args.start_reprocess_time,
|
||||||
|
end=parsed_args.end_reprocess_time,
|
||||||
|
reason=parsed_args.reason
|
||||||
|
)
|
@ -0,0 +1,10 @@
|
|||||||
|
---
|
||||||
|
features:
|
||||||
|
- |
|
||||||
|
Introduce reprocessing task API in the CLI. The following new commands
|
||||||
|
are added to the OpenStack CLI "rating tasks reprocessing get" and
|
||||||
|
"rating tasks reprocessing create". For CloudKitty CLI, we added the
|
||||||
|
following new commands "tasks reprocessing get" and "tasks reprocessing
|
||||||
|
create". Both command sets work in a similar fashion, but one is
|
||||||
|
targetting the OpenStack CLI integration, whereas the other is
|
||||||
|
targetting CloudKitty client only.
|
@ -89,6 +89,9 @@ openstack.rating.v1 =
|
|||||||
rating_pyscript_delete = cloudkittyclient.v1.rating.pyscripts_cli:CliDeleteScript
|
rating_pyscript_delete = cloudkittyclient.v1.rating.pyscripts_cli:CliDeleteScript
|
||||||
|
|
||||||
openstack.rating.v2 =
|
openstack.rating.v2 =
|
||||||
|
rating_tasks_reprocessing_get = cloudkittyclient.v2.reprocessing_cli:CliReprocessingTasksGet
|
||||||
|
rating_tasks_reprocessing_create = cloudkittyclient.v2.reprocessing_cli:CliReprocessingTasksPost
|
||||||
|
|
||||||
rating_dataframes_get = cloudkittyclient.v2.dataframes_cli:CliDataframesGet
|
rating_dataframes_get = cloudkittyclient.v2.dataframes_cli:CliDataframesGet
|
||||||
rating_dataframes_add = cloudkittyclient.v2.dataframes_cli:CliDataframesAdd
|
rating_dataframes_add = cloudkittyclient.v2.dataframes_cli:CliDataframesAdd
|
||||||
|
|
||||||
@ -205,6 +208,9 @@ cloudkittyclient_v1 =
|
|||||||
pyscript_delete = cloudkittyclient.v1.rating.pyscripts_cli:CliDeleteScript
|
pyscript_delete = cloudkittyclient.v1.rating.pyscripts_cli:CliDeleteScript
|
||||||
|
|
||||||
cloudkittyclient_v2 =
|
cloudkittyclient_v2 =
|
||||||
|
tasks_reprocessing_get = cloudkittyclient.v2.reprocessing_cli:CliReprocessingTasksGet
|
||||||
|
tasks_reprocessing_create = cloudkittyclient.v2.reprocessing_cli:CliReprocessingTasksPost
|
||||||
|
|
||||||
dataframes_add = cloudkittyclient.v2.dataframes_cli:CliDataframesAdd
|
dataframes_add = cloudkittyclient.v2.dataframes_cli:CliDataframesAdd
|
||||||
dataframes_get = cloudkittyclient.v2.dataframes_cli:CliDataframesGet
|
dataframes_get = cloudkittyclient.v2.dataframes_cli:CliDataframesGet
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user