Commit 464dc67b authored by Cristian A Sanchez's avatar Cristian A Sanchez

Add the option defer-by to postpone start_date

Climate client adds an argument --defer-by to the command 'update'
to change the start date of a lease by postponing it. This works
similar to prolong-for and reduce-by, as it receives an amount
of time like in seconds, minutes, hours and days

Closes-Bug: #1311266
Change-Id: Ia8843b9baf9773e6e019f5ed5f1e4f13887f4537
parent c4ba4f04
......@@ -29,6 +29,9 @@ UUID_PATTERN = '-'.join([HEX_ELEM + '{8}', HEX_ELEM + '{4}',
HEX_ELEM + '{12}'])
ELAPSED_TIME_REGEX = '^(\d+)([s|m|h|d])$'
LEASE_DATE_FORMAT = '%Y-%m-%dT%H:%M:%S.%f'
API_DATE_FORMAT = '%Y-%m-%d %H:%M'
def env(*args, **kwargs):
"""Returns the first environment variable set.
......@@ -139,9 +142,12 @@ def _find_resource_id_by_name(client, resource, name):
def from_elapsed_time_to_seconds(elapsed_time):
"""Return the amount of seconds based on the time_option parameter
:param: time_option: a string that matches ELAPSED_TIME_REGEX
def from_elapsed_time_to_seconds(elapsed_time, pos_sign=True):
"""Return the positive or negative amount of seconds based on the
elapsed_time parameter with a sign depending on the sign parameter.
:param: elapsed_time: a string that matches ELAPSED_TIME_REGEX
:param: sign: if pos_sign is True, the returned value will be positive.
Otherwise it will be positive.
is_elapsed_time = re.match(ELAPSED_TIME_REGEX, elapsed_time)
if is_elapsed_time is None:
......@@ -161,4 +167,17 @@ def from_elapsed_time_to_seconds(elapsed_time):
# the above code returns a "float"
return int(seconds)
if pos_sign:
return int(seconds)
return int(seconds) * -1
def from_elapsed_time_to_delta(elapsed_time, pos_sign=True):
"""Return the positive or negative delta time based on the
elapsed_time parameter.
:param: elapsed_time: a string that matches ELAPSED_TIME_REGEX
:param: sign: if sign is True, the returned value will be negative.
Otherwise it will be positive.
seconds = from_elapsed_time_to_seconds(elapsed_time, pos_sign=pos_sign)
return datetime.timedelta(seconds=seconds)
......@@ -13,10 +13,9 @@
# See the License for the specific language governing permissions and
# limitations under the License.
import datetime
from climateclient import base
from climateclient.openstack.common.gettextutils import _ # noqa
from climateclient.openstack.common import timeutils
from climateclient import utils
......@@ -36,26 +35,30 @@ class LeaseClientManager(base.BaseClientManager):
return self._get('/leases/%s' % lease_id, 'lease')
def update(self, lease_id, name=None, prolong_for=None, reduce_by=None):
def update(self, lease_id, name=None, prolong_for=None, reduce_by=None,
"""Update attributes of the lease."""
values = {}
if name:
values['name'] = name
lease_length_option = prolong_for or reduce_by
if lease_length_option:
seconds = utils.from_elapsed_time_to_seconds(lease_length_option)
seconds = seconds * (1 if prolong_for else -1)
delta_sec = datetime.timedelta(seconds=seconds)
lease_end_date_change = prolong_for or reduce_by
lease_start_date_change = defer_by
lease = None
if lease_end_date_change:
lease = self.get(lease_id)
cur_end_date = datetime.datetime.strptime(lease['end_date'],
new_end_date = cur_end_date + delta_sec
values['end_date'] = datetime.datetime.strftime(
new_end_date, '%Y-%m-%d %H:%M'
self._add_lease_date(values, lease, 'end_date',
prolong_for is not None)
if lease_start_date_change:
if lease is None:
lease = self.get(lease_id)
self._add_lease_date(values, lease, 'start_date',
if not values:
return _('No values to update passed.')
return self._update('/leases/%s' % lease_id, values,
......@@ -71,3 +74,12 @@ class LeaseClientManager(base.BaseClientManager):
if sort_by:
leases = sorted(leases, key=lambda l: l[sort_by])
return leases
def _add_lease_date(self, values, lease, key, delta_date, positive_delta):
delta_sec = utils.from_elapsed_time_to_delta(
date = timeutils.parse_strtime(lease[key],
values[key] = timeutils.strtime(date + delta_sec,
......@@ -250,6 +250,15 @@ class UpdateLease(command.UpdateCommand):
help='Time to reduce lease by',
#defer-by and a 'future' advance-by are mutually exclusive
group = parser.add_mutually_exclusive_group()
help='Time to defer the lease start',
return parser
def args2body(self, parsed_args):
......@@ -260,6 +269,8 @@ class UpdateLease(command.UpdateCommand):
params['prolong_for'] = parsed_args.prolong_for
if parsed_args.reduce_by:
params['reduce_by'] = parsed_args.reduce_by
if parsed_args.defer_by:
params['defer_by'] = parsed_args.defer_by
return params
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment