Esempio n. 1
0
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))
Esempio n. 2
0
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))
Esempio n. 3
0
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)
Esempio n. 4
0
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)
Esempio n. 5
0
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))
Esempio n. 6
0
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))
Esempio n. 7
0
    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)
Esempio n. 8
0
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_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)
Esempio n. 11
0
    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')
Esempio n. 12
0
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)
Esempio n. 13
0
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')
Esempio n. 15
0
 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}])
Esempio n. 17
0
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))
Esempio n. 18
0
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)
Esempio n. 19
0
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)