def api_introspection(node_id): utils.check_auth(flask.request) if flask.request.method == 'POST': new_ipmi_password = flask.request.args.get('new_ipmi_password', type=str, default=None) if new_ipmi_password: new_ipmi_username = flask.request.args.get('new_ipmi_username', type=str, default=None) new_ipmi_credentials = (new_ipmi_username, new_ipmi_password) else: new_ipmi_credentials = None if new_ipmi_credentials and _get_version() >= (1, 9): return _('Setting IPMI credentials is deprecated and not allowed ' 'starting with API version 1.9'), 400 introspect.introspect(node_id, new_ipmi_credentials=new_ipmi_credentials, token=flask.request.headers.get('X-Auth-Token')) return '', 202 else: node_info = node_cache.get_node(node_id) return flask.json.jsonify(generate_introspection_status(node_info))
def api_introspection(uuid): utils.check_auth(flask.request) if not uuidutils.is_uuid_like(uuid): raise utils.Error(_('Invalid UUID value'), code=400) if flask.request.method == 'POST': new_ipmi_password = flask.request.args.get('new_ipmi_password', type=str, default=None) if new_ipmi_password: new_ipmi_username = flask.request.args.get('new_ipmi_username', type=str, default=None) new_ipmi_credentials = (new_ipmi_username, new_ipmi_password) else: new_ipmi_credentials = None introspect.introspect(uuid, new_ipmi_credentials=new_ipmi_credentials, token=flask.request.headers.get('X-Auth-Token')) return '', 202 else: node_info = node_cache.get_node(uuid) return flask.json.jsonify(finished=bool(node_info.finished_at), error=node_info.error or None)
def api_introspection(node_id): if flask.request.method == 'POST': args = flask.request.args manage_boot = args.get('manage_boot', 'True') try: manage_boot = strutils.bool_from_string(manage_boot, strict=True) except ValueError: raise utils.Error(_('Invalid boolean value for manage_boot: %s') % manage_boot, code=400) if manage_boot and not CONF.can_manage_boot: raise utils.Error(_('Managed boot is requested, but this ' 'installation cannot manage boot (' '(can_manage_boot set to False)'), code=400) client = rpc.get_client() client.call({}, 'do_introspection', node_id=node_id, manage_boot=manage_boot, token=flask.request.headers.get('X-Auth-Token')) return '', 202 else: node_info = node_cache.get_node(node_id) return flask.json.jsonify(generate_introspection_status(node_info))
def api_introspection(node_id): if flask.request.method == 'POST': introspect.introspect(node_id, token=flask.request.headers.get('X-Auth-Token')) return '', 202 else: node_info = node_cache.get_node(node_id) return flask.json.jsonify(generate_introspection_status(node_info))
def test_ok(self): started_at = time.time() - 42 session = db.get_session() with session.begin(): db.Node(uuid=self.uuid, started_at=started_at).save(session) info = node_cache.get_node(self.uuid) self.assertEqual(self.uuid, info.uuid) self.assertEqual(started_at, info.started_at) self.assertIsNone(info.finished_at) self.assertIsNone(info.error)
def api_introspection(node_id): if flask.request.method == 'POST': client = rpc.get_client() client.call({}, 'do_introspection', node_id=node_id, token=flask.request.headers.get('X-Auth-Token')) return '', 202 else: node_info = node_cache.get_node(node_id) return flask.json.jsonify(generate_introspection_status(node_info))
def test_locked(self): started_at = (datetime.datetime.utcnow() - datetime.timedelta(seconds=42)) session = db.get_session() with session.begin(): db.Node(uuid=self.uuid, state=istate.States.starting, started_at=started_at).save(session) info = node_cache.get_node(self.uuid, locked=True) self.assertEqual(self.uuid, info.uuid) self.assertEqual(started_at, info.started_at) self.assertIsNone(info.finished_at) self.assertIsNone(info.error) self.assertTrue(info._locked)
def test_with_name(self): started_at = time.time() - 42 session = db.get_session() with session.begin(): db.Node(uuid=self.uuid, started_at=started_at).save(session) ironic = mock.Mock() ironic.node.get.return_value = self.node info = node_cache.get_node('name', ironic=ironic) self.assertEqual(self.uuid, info.uuid) self.assertEqual(started_at, info.started_at) self.assertIsNone(info.finished_at) self.assertIsNone(info.error) self.assertFalse(info._locked) ironic.node.get.assert_called_once_with('name')
def abort(node_id, token=None): """Abort running introspection. :param node_id: node UUID or name :param token: authentication token :raises: Error """ LOG.debug('Aborting introspection for node %s', node_id) ironic = ir_utils.get_client(token) node_info = node_cache.get_node(node_id, ironic=ironic) # check pending operations locked = node_info.acquire_lock(blocking=False) if not locked: # Node busy --- cannot abort atm raise utils.Error(_('Node is locked, please, retry later'), node_info=node_info, code=409) utils.executor().submit(_abort, node_info, ironic)
def abort(uuid, token=None): """Abort running introspection. :param uuid: node uuid :param token: authentication token :raises: Error """ LOG.debug('Aborting introspection for node %s', uuid) ironic = ir_utils.get_client(token) node_info = node_cache.get_node(uuid, ironic=ironic, locked=False) # check pending operations locked = node_info.acquire_lock(blocking=False) if not locked: # Node busy --- cannot abort atm raise utils.Error(_('Node is locked, please, retry later'), node_info=node_info, code=409) utils.executor().submit(_abort, node_info, ironic)
def test_with_name(self): started_at = (datetime.datetime.utcnow() - datetime.timedelta(seconds=42)) session = db.get_session() with session.begin(): db.Node(uuid=self.uuid, state=istate.States.starting, started_at=started_at).save(session) ironic = mock.Mock() ironic.node.get.return_value = self.node info = node_cache.get_node('name', ironic=ironic) self.assertEqual(self.uuid, info.uuid) self.assertEqual(started_at, info.started_at) self.assertIsNone(info.finished_at) self.assertIsNone(info.error) self.assertFalse(info._locked) ironic.node.get.assert_called_once_with('name')
def save(self, node_uuid, data, processed=True): suffix = None if processed else _UNPROCESSED_DATA_STORE_SUFFIX swift_object_name = swift.store_introspection_data( _filter_data_excluded_keys(data), node_uuid, suffix=suffix) LOG.info( 'Introspection data was stored for node %(node)s in Swift ' 'object %(obj_name)s', { 'node': node_uuid, 'obj_name': swift_object_name }) if CONF.processing.store_data_location: node_info = node_cache.get_node(node_uuid) # TODO(kaifeng) node_info is not synced back, while we are not # using extra in the processing logic, it looks fine at the moment, # but we should consider refactor in a later time. node_info.patch([{ 'op': 'add', 'path': '/extra/%s' % CONF.processing.store_data_location, 'value': swift_object_name }])
def save(self, node_uuid, data, processed=True): suffix = None if processed else _UNPROCESSED_DATA_STORE_SUFFIX swift_object_name = swift.store_introspection_data( _filter_data_excluded_keys(data), node_uuid, suffix=suffix ) LOG.info('Introspection data was stored for node %(node)s in Swift ' 'object %(obj_name)s', {'node': node_uuid, 'obj_name': swift_object_name}) # TODO(kaifeng) Remove the deprecated store_data_location at Train # cycle. if CONF.processing.store_data_location: node_info = node_cache.get_node(node_uuid) # NOTE(kaifeng) node_info is not synced back, while we are not # using extra in the processing logic, it looks fine at the moment, # but we should consider refactor in a later time. node_info.patch([{'op': 'add', 'path': '/extra/%s' % CONF.processing.store_data_location, 'value': swift_object_name}])
def api_introspection(node_id): utils.check_auth(flask.request) if flask.request.method == 'POST': new_ipmi_password = flask.request.args.get('new_ipmi_password', type=str, default=None) if new_ipmi_password: new_ipmi_username = flask.request.args.get('new_ipmi_username', type=str, default=None) new_ipmi_credentials = (new_ipmi_username, new_ipmi_password) else: new_ipmi_credentials = None introspect.introspect(node_id, new_ipmi_credentials=new_ipmi_credentials, token=flask.request.headers.get('X-Auth-Token')) return '', 202 else: node_info = node_cache.get_node(node_id) return flask.json.jsonify(generate_introspection_status(node_info))
def reapply(node_ident): """Re-apply introspection steps. Re-apply preprocessing, postprocessing and introspection rules on stored data. :param node_ident: node UUID or name :raises: utils.Error """ LOG.debug('Processing re-apply introspection request for node ' 'UUID: %s', node_ident) node_info = node_cache.get_node(node_ident, locked=False) if not node_info.acquire_lock(blocking=False): # Note (mkovacik): it should be sufficient to check data # presence & locking. If either introspection didn't start # yet, was in waiting state or didn't finish yet, either data # won't be available or locking would fail raise utils.Error(_('Node locked, please, try again later'), node_info=node_info, code=409) utils.executor().submit(_reapply, node_info)
def reapply(uuid): """Re-apply introspection steps. Re-apply preprocessing, postprocessing and introspection rules on stored data. :param uuid: node uuid to use :raises: utils.Error """ LOG.debug('Processing re-apply introspection request for node ' 'UUID: %s', uuid) node_info = node_cache.get_node(uuid, locked=False) if not node_info.acquire_lock(blocking=False): # Note (mkovacik): it should be sufficient to check data # presence & locking. If either introspection didn't start # yet, was in waiting state or didn't finish yet, either data # won't be available or locking would fail raise utils.Error(_('Node locked, please, try again later'), node_info=node_info, code=409) utils.executor().submit(_reapply, node_info)