예제 #1
0
파일: lease.py 프로젝트: jakecoll/blazar
    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)
예제 #2
0
파일: lease.py 프로젝트: jakecoll/blazar
    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"))
예제 #3
0
파일: host.py 프로젝트: jakecoll/blazar
    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"))
예제 #4
0
파일: __init__.py 프로젝트: jakecoll/blazar
 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)
예제 #5
0
    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))
예제 #6
0
파일: service.py 프로젝트: jakecoll/blazar
    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)
예제 #7
0
파일: service.py 프로젝트: jakecoll/blazar
    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
예제 #8
0
 def test_error_msg(self):
     self.assertEqual(unicode(exceptions.ClimateException('test')),
                      'test')