/*
 * sga-daemon.idl
 *
 * $Author: fpina $
 * $Revision: 157256 $ - $Date: 2014-10-16 15:14:34 -0300 (Qui, 16 Out 2014) $
 */

#ifndef _SGA_DAEMON_IDL
#define _SGA_DAEMON_IDL

#include "sga-manager.idl"
#include "sga-common.idl"

/**
 * \brief Interfaces entre SGA Daemon e SGA Manager para gerência da execução
 * remota de algoritmos.
 */
module sgaidl {

   /**
    * \brief Estados de um processo.
    */
   enum ProcessState {
     RUNNING,
     SLEEPING,
     WAITING,
     FINISHED
   };

   /**
    * \brief Informações para monitoração de um comando. A execução de um
    * comando pode gerar um ou mais processos, portanto são fornecidas as
    * informações de todos os processos que compõem o comando.
    */
   struct RunningCommandInfo {
     sequence<Dictionary> processData;
     Dictionary executionData;
   };

   /**
    * \brief Representa um endereço de rede. É composto por um nome (hostname)
    * e uma porta.
    */
   struct Address {
     string host;
     long port;
   };

   /**
    * \brief Estrutura que representa um path em um SGA.
    */
   struct SGAPath {
     string path;
     double sizeKB;
     boolean isDir;
     boolean isSymbolicLink;
     string linkPath;
     boolean readable;
     boolean writable;
     boolean executable;
     boolean exists;
   };

   enum JobControlAction {
     /** \brief Suspende a execução do job. */
      SUSPEND,
     /** \brief (Re)inicia o job. */
      RESUME,
     /** \brief Coloca o job no estado on-hold. */
      HOLD,
     /** \brief Retira o job do estado on-hold. */
      RELEASE,
     /** \brief Termina o job. */
      TERMINATE
   };

   enum SGAControlAction {
     /** \brief Termina a execução do SGA. */
      SHUTDOWN,
      /** brief Reinicia a execução do SGA. */
      RESTART
   };

   typedef sequence<SGAPath> SGAPaths;

   /** \brief Indica que o caminho informado é inválido. */
   exception InvalidPathException {};
   /**
    * \brief Indica que os parâmetros obrigatórios listados não foram
    * informados.
    */
   exception MissingParameterException { StringList parameters; };
   /** \brief Indica que o caminho informado não existe. */
   exception PathNotFoundException {};

   exception ActionNotSupportedException {};
   exception InvalidActionException {};
   exception InvalidTransitionException {};
   exception SystemException {};

   interface SGADaemon;

   /**
    * \brief Interface do gerenciador de um comando. Para cada comando executado
    * pelo SGA é criado um gerenciador de comando.
    */
   interface SGACommand {
      /**
       * \brief Fornece as informações de monitoração de um comando.
       *
       * \return Informações de monitoração de todos os processos.
       * que compõem o comando.
       */
      RunningCommandInfo getRunningCommandInfo();

      /**
       * \brief Altera o estado de um comando ou de um job filho do comando.
       *
       * \param action Ação que será feita.
       *
       * \param childJobId Identificador do job filho do comando ou nulo se a
       * ação deve ser realizada no próprio comando.
       */
      void control(in JobControlAction action, in string childJobId)
      raises (ActionNotSupportedException,
        InvalidActionException,
        InvalidTransitionException);
   };

   /**
    * \brief Interface do SGA.
    */
   interface SGADaemon {

      /**
       * \brief Verifica se o SGA está ativo
       */
      void ping();

      void setDefaultConfigKeys(in StringList keys);

      void setDefaultInfoKeys(in StringList keys);

      /**
       * \brief Solicita a desativação ou reinício do daemon.
       *
       * \param action A ação.
       */
      // @TODO Permitir outras acões além de desativar e reiniciar (CSBASE-3574)
      oneway void control(in SGAControlAction action);

      /**
       * \brief Requisição de execução de um comando.
       *
       * \param command Comando a ser executado
       * \param cmdid Identificador do comando a ser executado
       * \param extraParams Parâmetros extras para execução do comando
       *
       * \return Referência para o comando
       *
       * \exception SystemException Caso ocorra algum erro ao tentar executar o
       * comando.
       * \exception MissingParameterException Caso algum parametro obrigatório
       * esteja faltando.
       */
      SGACommand executeCommand(in string command,
        in string cmdid,
        in Dictionary extraParams)
      raises (SystemException,
        MissingParameterException);

      /**
       * \brief Retorna a informação de um arquivo ou diretório dado seu path.
       *
       * \param path o caminho para um arquivo ou diretório.
       *
       * \return a informação correspondente ao caminho informado.
       *
       * \exception InvalidPathException caso o path informado seja inválido
       * \exception PathNotFoundException caso o path informado não exista
       */
      SGAPath getPath(in string path)
      raises (InvalidPathException,
        PathNotFoundException);

      /**
       * Retorna uma lista de paths filhos de um path.
       *
       * \param root o caminho da raiz
       *
       * \return a lista com as informações dos filhos do caminho raiz informado
       *
       * \exception InvalidPathException caso o path informado seja inválido
       * \exception PathNotFoundException caso o path informado não exista
       */
      SGAPaths getPaths(in string root)
      raises (InvalidPathException,
        PathNotFoundException);
   };
};

#endif
