def put(self, id, sublease): """Update an existing lease. :param id: UUID of a lease. :param lease: a subset of a Lease containing values to update. """ sublease_dct = sublease.as_dict() new_name = sublease_dct.pop('name', None) end_date = sublease_dct.pop('end_date', None) start_date = sublease_dct.pop('start_date', None) before_end_notification = sublease_dct.pop('before_end_notification', None) if sublease_dct != {}: raise exceptions.ClimateException('Only name changing, ' 'dates and before end ' 'notifications may be ' 'proceeded.') if new_name: sublease_dct['name'] = new_name if end_date: sublease_dct['end_date'] = end_date if start_date: sublease_dct['start_date'] = start_date if before_end_notification: sublease_dct['before_end_notification'] = before_end_notification lease = pecan.request.rpcapi.update_lease(id, sublease_dct) if lease is None: raise exceptions.NotFound(object={'lease_id': id}) return Lease.convert(lease)
def post(self, lease): """Creates a new lease. :param lease: a lease within the request body. """ # FIXME(sbauza): DB exceptions are currently catched and return a lease # equal to None instead of being sent to the API lease_dct = lease.as_dict() lease = pecan.request.rpcapi.create_lease(lease_dct) if lease is not None: return Lease.convert(lease) else: raise exceptions.ClimateException(_("Lease can't be created"))
def post(self, host): """Creates a new host. :param host: a host within the request body. """ # here API should go to Keystone API v3 and create trust host_dct = host.as_dict() # FIXME(sbauza): DB exceptions are currently catched and return a lease # equal to None instead of being sent to the API host = pecan.request.hosts_rpcapi.create_computehost(host_dct) if host is not None: return Host.convert(host) else: raise exceptions.ClimateException(_("Host can't be created"))
def replacement_start_response(status, headers, exc_info=None): """Overrides the default response to make errors parsable.""" try: status_code = int(status.split(' ')[0]) except (ValueError, TypeError): # pragma: nocover raise exceptions.ClimateException( _('Status {0} was unexpected').format(status)) else: if status_code >= 400: # Remove some headers so we can replace them later # when we have the full error message and can # compute the length. headers = [(h, v) for (h, v) in headers if h.lower() != 'content-length'] # Save the headers as we need to modify them. state['status_code'] = status_code state['headers'] = headers state['exc_info'] = exc_info return start_response(status, headers, exc_info)
def __init__(self): extensions = [] self.extension_manager = enabled.EnabledExtensionManager( check_func=lambda ext: ext.name in CONF.api.api_v2_controllers, namespace='climate.api.v2.controllers.extensions', invoke_on_load=True) self._log_missing_plugins(CONF.api.api_v2_controllers) for ext in self.extension_manager.extensions: try: setattr(self, ext.obj.name, ext.obj) except TypeError: raise exceptions.ClimateException( _("API name must be specified for " "extension {0}").format(ext.name)) self._routes.update(ext.obj.extra_routes) extensions.append(ext.obj.name) LOG.debug(_("Loaded extensions: {0}").format(extensions))
def update_lease(self, lease_id, data): """Update lease. Only name changing and prolonging may be proceeded. :param lease_id: ID of the lease in Climate DB. :type lease_id: str :param data: New lease characteristics. :type data: dict """ new_name = data.pop('name', None) end_date = data.pop('end_date', None) start_date = data.pop('start_date', None) if data: raise exceptions.ClimateException('Only name changing and ' 'dates changing may be ' 'proceeded.') data = {} if new_name: data['name'] = new_name if end_date: data['end_date'] = end_date if start_date: data['start_date'] = start_date return self.manager_rpcapi.update_lease(lease_id, data)
def update_lease(self, lease_id, values): if not values: return db_api.lease_get(lease_id) if len(values) == 1 and 'name' in values: db_api.lease_update(lease_id, values) return db_api.lease_get(lease_id) lease = db_api.lease_get(lease_id) start_date = values.get( 'start_date', datetime.datetime.strftime(lease['start_date'], LEASE_DATE_FORMAT)) end_date = values.get( 'end_date', datetime.datetime.strftime(lease['end_date'], LEASE_DATE_FORMAT)) before_end_date = values.get('before_end_notification', None) now = datetime.datetime.utcnow() now = datetime.datetime(now.year, now.month, now.day, now.hour, now.minute) if start_date == 'now': start_date = now else: start_date = self._date_from_string(start_date) end_date = self._date_from_string(end_date) values['start_date'] = start_date values['end_date'] = end_date if (lease['start_date'] < now and values['start_date'] != lease['start_date']): raise common_ex.NotAuthorized( 'Cannot modify the start date of already started leases') if (lease['start_date'] > now and values['start_date'] < now): raise common_ex.NotAuthorized( 'Start date must later than current date') if lease['end_date'] < now: raise common_ex.NotAuthorized( 'Terminated leases can only be renamed') if (values['end_date'] < now or values['end_date'] < values['start_date']): raise common_ex.NotAuthorized( 'End date must be later than current and start date') with trusts.create_ctx_from_trust(lease['trust_id']): if before_end_date: try: before_end_date = self._date_from_string(before_end_date) self._check_date_within_lease_limits(before_end_date, values) except common_ex.ClimateException as e: LOG.error("Invalid before_end_date param. %s" % e.message) raise e # TODO(frossigneux) rollback if an exception is raised for reservation in ( db_api.reservation_get_all_by_lease_id(lease_id)): reservation['start_date'] = values['start_date'] reservation['end_date'] = values['end_date'] resource_type = reservation['resource_type'] self.plugins[resource_type].update_reservation( reservation['id'], reservation) event = db_api.event_get_first_sorted_by_filters( 'lease_id', 'asc', { 'lease_id': lease_id, 'event_type': 'start_lease' } ) if not event: raise common_ex.ClimateException( 'Start lease event not found') db_api.event_update(event['id'], {'time': values['start_date']}) event = db_api.event_get_first_sorted_by_filters( 'lease_id', 'asc', { 'lease_id': lease_id, 'event_type': 'end_lease' } ) if not event: raise common_ex.ClimateException( 'End lease event not found') db_api.event_update(event['id'], {'time': values['end_date']}) notifications = ['update'] self._update_before_end_event(lease, values, notifications, before_end_date) db_api.lease_update(lease_id, values) lease_state = states.LeaseState(id=lease_id, action=states.lease.UPDATE, status=states.lease.COMPLETE, status_reason="Successfully updated lease") lease_state.save() lease = db_api.lease_get(lease_id) with trusts.create_ctx_from_trust(lease['trust_id']) as ctx: self._send_notification(lease, ctx, events=notifications) return lease
def test_error_msg(self): self.assertEqual(unicode(exceptions.ClimateException('test')), 'test')