Ejemplo n.º 1
0
def do_save() -> Dict[str, Any]:
    """
    Call the service that will save the statification as an archive and rename the logfile by the archive's sha.
    Need an X-Forwarded-User in the request

    If an error happen during the process the error will be caught and a python dict will be returned with a specific
    error code like the following example :

      -- In the case an error happen with the subprocess operation :
    {
        'success': False,
        'operation': 'subprocess'
    }

      -- If everything goes smoothly the following dict will be returned :
    {
        'success': True,
    }

    When the success python dict will be returned the process of sha will still be running, information about it's
    state will be given by the status background file

    @return a python dict as specified above
    """
    try:
        # test if the lock file is unlocked
        if is_access_locked():
            # the lock file was locked
            raise RuntimeError('route_access')

        # block the route for other users
        lock_access()

        current_app.logger.info('> Starting sha operations')

        # get the request parameter
        # get the user forwarded by kerberos
        s_user = request.headers.get('X-Forwarded-User')

        # if no process is running we authorize to sha
        if current_app.statifProcess.is_running():
            raise RuntimeError('process_running')

        current_app.logger.info('> Starting sha operations')

        # sha and push the statification to the git repository
        return service_do_save(s_user)

    except RuntimeError as e:
        # in case of error unlock the route
        # if there is no error the route will be unlocked when the background task has been finished
        unlock_access(current_app.config['LOCKFILE'])
        # return an ajax error code
        return {'success': False, 'error': str(e)}
Ejemplo n.º 2
0
def do_start_statif() -> Dict[str, Any]:
    """
    Do the following :
        - Check if the operation is locked by another process, if that's the case it will return an error
        - Get the lock, so other user can't do anything that would interfere with the operation
        - Initialize and start a statification

    If an error happen during the process the error will be caught and a python dict will be returned with a specific
    error code like the following example :

      -- In the case an error happen with the subprocess operation :
        {
            'success': False,
            'operation': 'subprocess'
        }

      -- If everything goes smoothly the following dict will be returned :
        {
            'success': True,
        }
    """
    # Get the request parameters
    s_designation = request.get_json()['designation']

    try:
        s_description = request.get_json()['description']
    except KeyError:
        s_description = ''

    s_user = request.headers.get('X-Forwarded-User')

    try:
        # test if the lock file is unlocked
        if is_access_locked():
            # the lock file was locked
            raise RuntimeError('route_access')

        # block the lock file for other users
        lock_access()

        current_app.logger.info('> Starting statification process')

        return service_do_start_statif(s_user, s_designation, s_description)

    except RuntimeError as e:
        # in case of error unlock the route
        # if there is no error the route will be unlocked when the background task has been finished
        unlock_access(current_app.config['LOCKFILE'])
        # return an ajax error code
        return {'success': False, 'error': str(e)}
Ejemplo n.º 3
0
def do_apply_prod() -> Dict[str, Any]:
    """
    Push the desired statification (sha) in production.

    If an error happen during the process the error will be caught and a python dict will be returned with a specific
    error code like the following example :

      -- In the case an error happen with the subprocess operation :
    {
        'success': False,
        'operation': 'subprocess'
    }

      -- If everything goes smoothly the following dict will be returned :
    {
        'success': True,
    }

    @return a python dict as described above
    """
    try:
        # test if the lock file is unlocked
        if is_access_locked():
            # the lock file was locked
            raise RuntimeError('route_access')

        # block the route for other users
        lock_access()

        # get the request parameters
        s_archive_sha = request.values.get('sha')
        # get the user forwarded by kerberos
        s_user = request.headers.get('X-Forwarded-User')

        current_app.logger.info('> Starting push to prod operations')

        # push the statification to the production server
        return service_do_apply_prod(s_user, s_archive_sha)
    except RuntimeError as e:
        # in case of error unlock the route
        # if there is no error the route will be unlocked when the background task has been finished
        unlock_access(current_app.config['LOCKFILE'])
        # return an ajax error code
        return {'success': False, 'error': str(e)}
Ejemplo n.º 4
0
def statification_status() -> Dict[str, Any]:
    """
    Check the status of the api. The following information will be returned in a python dict :
    - isRunning         :   a boolean that indicate if a statification Process is running
    - sha            :   a string that contain the sha of the last statification,
                          if the last is a new and unsaved statification it will be empty
    - designation       :   the designation of the last statification, or empty
    - description       :   the description of the last statification, or empty
    - status            :   the status of the last statification :  CREATED = 0
                                                                    STATIFIED = 1
                                                                    SAVED = 2
                                                                    PRODUCTION = 3
                                                                    VISUALIZED = 4
                            Default status will be 3, if there is no statification in the database the user will still
                            be able to create a new one, if there are ongoing statification to be push to prod it still
                            give the hand to the user that have saved it.
    - i_nb_item_to_crawl :  the number of item that have been crawled during the last statification, it will be used
                            as a reference of the number of items to crawl to the next statification. If there is no
                            statification in the database it will be set to 100 by default.
    @return a python dict containing all the above information :
            **Example**:

              The default status when launching the api for the first time should be this one.
              .. code-block:: dict

                    {
                        'isRunning': false,
                        'sha': '',
                        'designation': '',
                        'description': '',
                        'currentNbItemCrawled': 0,
                        'nbItemToCrawl': 100,
                        'status': 3,
                        'isLocked': false,
                        'statusBackground': {}
                    }
    """
    # check if process is running
    b_is_running = current_app.statifProcess.is_running()

    # initialize the nb of item crawled and the number of item to crawl to 0
    i_current_nb_item_crawled = 0

    # get the number of page crawled if a statificationProcess is running
    if b_is_running:
        i_current_nb_item_crawled = get_nb_page_crawled()

    # get the last statification informations
    last_statif_infos = service_get_last_statif_infos()

    sha = last_statif_infos['sha']
    designation = last_statif_infos['designation']
    description = last_statif_infos['description']
    status = last_statif_infos['status']
    i_nb_item_to_crawl = last_statif_infos['i_nb_item_to_crawl']

    # if i_current_nb_item_crawled is raising higher than i_nb_item_to_crawl, then raise i_nb_item_to_crawl
    # we don't want i_nb_item_to_crawl be lower than i_current_nb_item_crawled
    if i_current_nb_item_crawled >= i_nb_item_to_crawl:
        i_nb_item_to_crawl = i_current_nb_item_crawled + 100

    # read the status background file and extract the json from it
    json_status_background = get_background_status_file_content()

    return {
        'isRunning': b_is_running,
        'sha': sha,
        'designation': designation,
        'description': description,
        'currentNbItemCrawled': i_current_nb_item_crawled,
        'nbItemToCrawl': i_nb_item_to_crawl,
        'status': status,
        'isLocked': is_access_locked(),
        'statusBackground': json_status_background
    }