Ejemplo n.º 1
0
 def test_service_disabled_on_create_based_on_flag(self):
     self.flags(enable_new_services=False)
     host = 'foo'
     binary = 'smaug-fake'
     app = service.Service.create(host=host, binary=binary)
     app.start()
     app.stop()
     ref = db.service_get(context.get_admin_context(), app.service_id)
     db.service_destroy(context.get_admin_context(), app.service_id)
     self.assertTrue(ref['disabled'])
Ejemplo n.º 2
0
 def test_service_disabled_on_create_based_on_flag(self):
     self.flags(enable_new_services=False)
     host = 'foo'
     binary = 'smaug-fake'
     app = service.Service.create(host=host, binary=binary)
     app.start()
     app.stop()
     ref = db.service_get(context.get_admin_context(), app.service_id)
     db.service_destroy(context.get_admin_context(), app.service_id)
     self.assertTrue(ref['disabled'])
    def _run_operation(self, operation_id, param):

        self._update_operation_state(
            operation_id,
            {'state': constants.OPERATION_STATE_RUNNING})

        try:
            check_item = [self._CHECK_ITEMS['is_canceled']]
            if self._check_operation(operation_id, check_item):
                return

            try:
                operation = objects.ScheduledOperation.get_by_id(
                    context.get_admin_context(), operation_id)
            except Exception:
                LOG.exception(_LE("Run operation(%s), get operation failed"),
                              operation_id)
                return

            try:
                self._operation_manager.run_operation(
                    operation.operation_type, operation.project_id,
                    operation.operation_definition,
                    param=param)
            except Exception:
                LOG.exception(_LE("Run operation(%s) failed"), operation_id)

        finally:
            self._update_operation_state(
                operation_id,
                {'state': constants.OPERATION_STATE_REGISTERED})
Ejemplo n.º 4
0
    def _restore_operations(self):
        limit = 100
        marker = None
        filters = {"service_id": self._service_id,
                   "state": [scheduled_operation_state.REGISTERED,
                             scheduled_operation_state.TRIGGERED,
                             scheduled_operation_state.RUNNING]}
        columns_to_join = ['operation']
        ctxt = context.get_admin_context()
        resume_states = [scheduled_operation_state.TRIGGERED,
                         scheduled_operation_state.RUNNING]
        while True:
            states = objects.ScheduledOperationStateList.get_by_filters(
                ctxt, filters, limit, marker, columns_to_join=columns_to_join)
            if not states:
                break

            for state in states:
                resume = (state.state in resume_states)
                self._trigger_manager.register_operation(
                    state.operation.trigger_id, state.operation.id,
                    resume=resume, end_time_for_run=state.end_time_for_run)

            if len(states) < limit:
                break
            marker = states[-1].id
Ejemplo n.º 5
0
 def kill(self):
     """Destroy the service object in the datastore."""
     self.stop()
     try:
         db.service_destroy(context.get_admin_context(), self.service_id)
     except exception.NotFound:
         LOG.warning(_LW('Service killed that has no database entry'))
Ejemplo n.º 6
0
    def _run_operation(self, operation_id, param):

        self._update_operation_state(
            operation_id, {'state': constants.OPERATION_STATE_RUNNING})

        try:
            check_item = [self._CHECK_ITEMS['is_canceled']]
            if self._check_operation(operation_id, check_item):
                return

            try:
                operation = objects.ScheduledOperation.get_by_id(
                    context.get_admin_context(), operation_id)
            except Exception:
                LOG.exception(_LE("Run operation(%s), get operation failed"),
                              operation_id)
                return

            try:
                self._operation_manager.run_operation(
                    operation.operation_type,
                    operation.project_id,
                    operation.operation_definition,
                    param=param)
            except Exception:
                LOG.exception(_LE("Run operation(%s) failed"), operation_id)

        finally:
            self._update_operation_state(
                operation_id, {'state': constants.OPERATION_STATE_REGISTERED})
Ejemplo n.º 7
0
    def _restore_operations(self):
        limit = 100
        marker = None
        filters = {
            "service_id":
            self._service_id,
            "state": [
                constants.OPERATION_STATE_REGISTERED,
                constants.OPERATION_STATE_TRIGGERED,
                constants.OPERATION_STATE_RUNNING
            ]
        }
        columns_to_join = ['operation']
        ctxt = smaug_context.get_admin_context()
        resume_states = [
            constants.OPERATION_STATE_TRIGGERED,
            constants.OPERATION_STATE_RUNNING
        ]
        while True:
            states = objects.ScheduledOperationStateList.get_by_filters(
                ctxt, filters, limit, marker, columns_to_join=columns_to_join)
            if not states:
                break

            for state in states:
                resume = (state.state in resume_states)
                self._trigger_manager.register_operation(
                    state.operation.trigger_id,
                    state.operation.id,
                    resume=resume,
                    end_time_for_run=state.end_time_for_run)

            if len(states) < limit:
                break
            marker = states[-1].id
Ejemplo n.º 8
0
    def setUp(self):
        super(OperationEngineManagerTestCase, self).setUp()

        self.manager = service_manager.OperationEngineManager()
        self.manager._service_id = 0
        self.manager._trigger_manager = FakeTriggerManager()

        self.ctxt = context.get_admin_context()
        self._trigger = self._create_one_trigger()
        self._operation = self._create_scheduled_operation(self._trigger.id)
Ejemplo n.º 9
0
    def setUp(self):
        super(OperationEngineManagerTestCase, self).setUp()

        self.manager = service_manager.OperationEngineManager()
        self.manager._service_id = 0
        self.manager._trigger_manager = FakeTriggerManager()

        self.ctxt = context.get_admin_context()
        self._trigger = self._create_one_trigger()
        self._operation = self._create_scheduled_operation(self._trigger.id)
Ejemplo n.º 10
0
    def _update_operation_state(self, operation_id, updates):

        ctxt = context.get_admin_context()
        try:
            state_ref = objects.ScheduledOperationState.get_by_operation_id(
                ctxt, operation_id)
            for item, value in six.iteritems(updates):
                setattr(state_ref, item, value)
            state_ref.save()
        except Exception:
            LOG.exception(_LE("Execute operation(%s), update state failed"),
                          operation_id)
            return False
        return True
Ejemplo n.º 11
0
    def _update_operation_state(self, operation_id, updates):

        ctxt = context.get_admin_context()
        try:
            state_ref = objects.ScheduledOperationState.get_by_operation_id(
                ctxt, operation_id)
            for item, value in six.iteritems(updates):
                setattr(state_ref, item, value)
            state_ref.save()
        except Exception:
            LOG.exception(_LE("Execute operation(%s), update state failed"),
                          operation_id)
            return False
        return True
Ejemplo n.º 12
0
    def report_state(self):
        """Update the state of this service in the datastore."""
        if not self.manager.is_working():
            # NOTE(dulek): If manager reports a problem we're not sending
            # heartbeats - to indicate that service is actually down.
            LOG.error(_LE('Manager for service %(binary)s %(host)s is '
                          'reporting problems, not sending heartbeat. '
                          'Service will appear "down".'),
                      {'binary': self.binary,
                       'host': self.host})
            return

        ctxt = context.get_admin_context()
        state_catalog = {}
        try:
            try:
                service_ref = db.service_get(ctxt, self.service_id)
            except exception.NotFound:
                LOG.debug('The service database object disappeared, '
                          'recreating it.')
                self._create_service_ref(ctxt)
                service_ref = db.service_get(ctxt, self.service_id)

            state_catalog['report_count'] = service_ref['report_count'] + 1

            db.service_update(ctxt,
                              self.service_id, state_catalog)

            # TODO(termie): make this pattern be more elegant.
            if getattr(self, 'model_disconnected', False):
                self.model_disconnected = False
                LOG.error(_LE('Recovered model server connection!'))

        except db_exc.DBConnectionError:
            if not getattr(self, 'model_disconnected', False):
                self.model_disconnected = True
                LOG.exception(_LE('model server went away'))

        # NOTE(jsbryant) Other DB errors can happen in HA configurations.
        # such errors shouldn't kill this thread, so we handle them here.
        except db_exc.DBError:
            if not getattr(self, 'model_disconnected', False):
                self.model_disconnected = True
                LOG.exception(_LE('DBError encountered: '))

        except Exception:
            if not getattr(self, 'model_disconnected', False):
                self.model_disconnected = True
                LOG.exception(_LE('Exception encountered: '))
Ejemplo n.º 13
0
    def _restore_triggers(self):
        limit = 100
        marker = None
        filters = {}
        ctxt = smaug_context.get_admin_context()
        while True:
            triggers = objects.TriggerList.get_by_filters(
                ctxt, filters, limit, marker)
            if not triggers:
                break

            for trigger in triggers:
                self._trigger_manager.add_trigger(trigger.id, trigger.type,
                                                  trigger.properties)
            if len(triggers) < limit:
                break
            marker = triggers[-1].id
Ejemplo n.º 14
0
    def _restore_triggers(self):
        limit = 100
        marker = None
        filters = {}
        ctxt = context.get_admin_context()
        while True:
            triggers = objects.TriggerList.get_by_filters(
                ctxt, filters, limit, marker)
            if not triggers:
                break

            for trigger in triggers:
                self._trigger_manager.add_trigger(trigger.id, trigger.type,
                                                  trigger.properties)
            if len(triggers) < limit:
                break
            marker = triggers[-1].id
Ejemplo n.º 15
0
    def start(self):
        version_string = version.version_string()
        LOG.info(_LI('Starting %(topic)s node (version %(version_string)s)'),
                 {'topic': self.topic, 'version_string': version_string})
        self.model_disconnected = False
        ctxt = context.get_admin_context()
        try:
            service_ref = db.service_get_by_args(ctxt,
                                                 self.host,
                                                 self.binary)
            self.service_id = service_ref['id']
        except exception.NotFound:
            self._create_service_ref(ctxt)

        self.manager.init_host(service_id=self.service_id)

        LOG.debug("Creating RPC server for service %s", self.topic)

        target = messaging.Target(topic=self.topic, server=self.host)
        endpoints = [self.manager]
        endpoints.extend(self.manager.additional_endpoints)
        serializer = objects_base.SmaugObjectSerializer()
        self.rpcserver = rpc.get_server(target, endpoints, serializer)
        self.rpcserver.start()

        self.manager.init_host_with_rpc()

        if self.report_interval:
            pulse = loopingcall.FixedIntervalLoopingCall(
                self.report_state)
            pulse.start(interval=self.report_interval,
                        initial_delay=self.report_interval)
            self.timers.append(pulse)

        if self.periodic_interval:
            if self.periodic_fuzzy_delay:
                initial_delay = random.randint(0, self.periodic_fuzzy_delay)
            else:
                initial_delay = None

            periodic = loopingcall.FixedIntervalLoopingCall(
                self.periodic_tasks)
            periodic.start(interval=self.periodic_interval,
                           initial_delay=initial_delay)
            self.timers.append(periodic)
Ejemplo n.º 16
0
    def list(self):
        """Show a list of all smaug services."""

        ctxt = context.get_admin_context()
        services = db.service_get_all(ctxt)
        print_format = "%-16s %-36s %-10s %-5s %-10s"
        print(print_format % (_('Binary'),
                              _('Host'),
                              _('Status'),
                              _('State'),
                              _('Updated At')))
        for svc in services:
            alive = utils.service_is_up(svc)
            art = ":-)" if alive else "XXX"
            status = 'enabled'
            if svc['disabled']:
                status = 'disabled'
            print(print_format % (svc['binary'], svc['host'].partition('.')[0],
                                  status, art,
                                  svc['updated_at']))
Ejemplo n.º 17
0
 def setUp(self):
     super(TestScheduledOperationStateList, self).setUp()
     self.context = context.get_admin_context()
Ejemplo n.º 18
0
 def periodic_tasks(self, raise_on_error=False):
     """Tasks to be run at a periodic interval."""
     ctxt = context.get_admin_context()
     self.manager.periodic_tasks(ctxt, raise_on_error=raise_on_error)
Ejemplo n.º 19
0
    def setUp(self):
        super(ThreadPoolExecutorTestCase, self).setUp()

        self._executor = thread_pool_executor.ThreadPoolExecutor()
        self.context = context.get_admin_context()
 def setUp(self):
     super(TestScheduledOperationStateList, self).setUp()
     self.context = context.get_admin_context()
Ejemplo n.º 21
0
 def setUp(self):
     super(RestoreDbTestCase, self).setUp()
     self.ctxt = context.get_admin_context()
Ejemplo n.º 22
0
 def setUp(self):
     super(OperationLogTestCase, self).setUp()
     self.ctxt = context.get_admin_context()
Ejemplo n.º 23
0
 def setUp(self):
     super(ScheduledOperationLogTestCase, self).setUp()
     self.ctxt = context.get_admin_context()
     self.operation_id = '0354ca9ddcd046b693340d78759fd274'
Ejemplo n.º 24
0
 def setUp(self):
     super(ScheduledOperationStateTestCase, self).setUp()
     self.ctxt = context.get_admin_context()
Ejemplo n.º 25
0
 def setUp(self):
     super(ScheduledOperationLogTestCase, self).setUp()
     self.ctxt = context.get_admin_context()
     self.operation_id = '0354ca9ddcd046b693340d78759fd274'
Ejemplo n.º 26
0
 def setUp(self):
     super(OperationLogTestCase, self).setUp()
     self.ctxt = context.get_admin_context()
Ejemplo n.º 27
0
 def setUp(self):
     super(RestoreDbTestCase, self).setUp()
     self.ctxt = context.get_admin_context()
Ejemplo n.º 28
0
    def setUp(self):
        super(ThreadPoolExecutorTestCase, self).setUp()

        self._executor = thread_pool_executor.ThreadPoolExecutor()
        self.context = context.get_admin_context()
Ejemplo n.º 29
0
 def setUp(self):
     super(ScheduledOperationStateTestCase, self).setUp()
     self.ctxt = context.get_admin_context()