/* HEADER */

/* NOTE:  requires library 'msu' and include file 'msu.h' */

#if !defined(__G2_H) 
#define __G2_H

#define MG2_VERSION "4.2.0p0"

#if defined(__MTEST)
#define SUEMLog fprintf
#endif /* __MTEST */


/* sync w/MG2MCList[] */

enum MG2MCListEnum {
  mg2mclNONE = 0,
  mg2mclHostList,
  mg2mclState,
  mg2mclSJID };


enum G2MetaCmdEnum {
  g2mcNONE = 0,
  g2mcInitialize,
  g2mcCommit,
  g2mcList,
  g2mcRsvCreate,
  g2mcRemove,
  g2mcQuery,
  g2mcSubmit,
  g2mcModify,
  g2mcResetStats,
  g2mcRegister };

/* Callback types (sync w/MG2CBType,MG2DEF_CBMASK) */

enum MG2CallBackEnum {
  mg2cbNONE = 0,
  mg2cbRsvCreate,
  mg2cbRsvStart,
  mg2cbRsvEnd,
  mg2cbRsvDestroy,
  mg2cbJobCreate,
  mg2cbJobStart,
  mg2cbJobEnd,
  mg2cbJobDestroy };

#if !defined(__G2INTERNAL_H)

#include "msu.h" 

enum { g2ptNONE = 0, g2ptMoab, g2ptSilver };

enum { g2isNONE = 0, g2isFile };

#define __MINTERFACE /* FIXME */

#ifdef __MINTERFACE
#if !defined(__MX)
#define __MX
#endif /* __MX */

#include "moab.h"
#include "moab-proto.h"

typedef struct
  {
  char        *Name;

  mpar_t      *MPar;
  mnode_t    **MNode;
  msched_t    *Sched;
  mfsc_t      *FS;
  mjob_t     **Job;
  mres_t     **Res;
  mlog_t      *dlog;
  mrange_t    *MRange;
  mrm_t       *MRM;
  mam_t       *AM;
  mattrlist_t *AttrList;
  long        *CREndTime;
  char        *CurrentHostName;
  mulong      *PresentTime;

  int         (*G2RsvFind)();
  int         (*G2ResSetAttr)();
  int         (*G2AcctFind)();
  int         (*G2JobFind)();
  int         (*G2JobAddCreds)();
  int         (*G2JobGetResourceAvailability)();
  int         (*G2ReservationCancel)();
  int         (*G2RMJobCancel)();
  int         (*G2WikiJobLoad)();
  int         (*G2JobAllocateNodes)();
  int         (*G2JobDistributeTasks)();
  int         (*G2JobNameAdjust)();
  int         (*G2ReservationCreate)();
  int         (*G2SimJobSubmit)();
  int         (*G2RMJobSubmit)();
  } m_base_t;

#else /* __MINTERFACE */

typdef struct
  {
  char       *Name;
  } m_base_t;

#endif /* __MINTERFACE */


enum G2OEnum {
  g2oNONE,
  g2oAccount,
  g2oClass,
  g2oGroup,
  g2oJob,
  g2oNode,
  g2oQOS,
  g2oReq,
  g2oRes,
  g2oSystem,
  g2oUser };

/* suballocation policies */

enum {
  G2sapNONE = 0,
  G2sapFirstFit,
  G2sapBestFit,
  G2sapWorstFit,
  G2sapBestCRFit,
  G2sapWorstCRFit,
  G2sapBalanceAFit,
  G2sapBalanceCFit,
  G2sapBalanceARFit,
  G2sapBalanceARRFit,
  G2sapBalanceARSFit };

typedef struct
  {
  int            Type;
  int            ChargeType;
 
  unsigned long  Flags;
 
  double HourOfDayChargeFactor[24];
  double DayOfWeekChargeFactor[7];
  double QOSChargeFactor[100];
  double NodeTypeChargeFactor[100];
  } g2am_t;

typedef struct {
  su_t *su;

  m_base_t *m;

  int     SubAllocPolicy;          
  int     RMShowErrMsg;
  int     RMMaxNMThreadCount;

  g2am_t *AM;
 
  sufilebuf_t *GlobalCfgFBuf;
  sufilebuf_t *PrivateCfgFBuf;

  int   MetaUseAccountMasq;
  char  MetaAccountMasqBaseName[MAX_SUNAME];
  int   MetaAccountMasqCount;
  } G2_t;

typedef struct {
  char *UserName;
  char *GroupName;
  char *AccountName;
  } g2cred_t;

typedef struct {
  char *Arch;
  char *Features;
  int   NodeMem;
  char  NodeMemCmp;
  int   NodeProcs;
  char  NodeProcsCmp;
  char *OS;
  } g2rspec_t;

typedef struct {
  int   Disk;
  int   Mem;
  char *Network;
  int   Procs;
  int   Swap;
  } g2rreq_t;

typedef struct {
  int       Count;
  int       TPN;
  int       TPNCmp;
  g2rspec_t ResSpec;
  g2rreq_t  ResReq;
  } g2task_t;

typedef struct {
  char       *Name;
  char       *Class;
  g2cred_t    Cred;
  char       *QOSRequested;
  long        WallTime;

  int         TaskCount;
  g2task_t   *Task[16];
  suattr_t  **JobAttr;

  char       *SystemID;
  char       *SubmitScript;
  } g2job_t;

typedef struct {
  char *Name;
  } g2qos_t;

typedef struct 
  {
  char *Name;
  } g2rm_t;
 
typedef struct 
  {
  char *Name;
  } g2ocfg_t;

typedef struct
  {
  char *Name;
  } g2res_t;

typedef struct
  {
  char *Name;
  } g2tcon_t;

#define MAX_G2ACL                32

#define MAX_G2RANGE_PER_RESOURCE 32

#define MAX_G2XMLATTR  64
#define DEFAULT_G2XMLICCOUNT   16

typedef struct g2xml_s {
  char *Name;
  char *Val;

  int   ACount;
  int   ASize;

  int   CCount;
  int   CSize;

  char **AName;
  char **AVal;
 
  struct g2xml_s **C;
  } g2xml_t;


/* silver structure attributes */

/* sync w/enum SResAttr (mg2-internal.h) */

enum SResAttrEnum {
  sraNONE = 0,
  sraArchList,
  sraAttr,
  sraBandwidth,
  sraCfgNodeCount,
  sraCfgProcCount,
  sraClassList,
  sraDataDir,
  sraDataServer,
  sraDirectJobStageEnabled,
  sraFeature,
  sraFlags,
  sraFullName,
  sraKey,
  sraLocalTime,
  sraNetList,
  sraOSList,
  sraRsvOverlap,
  sraRM,
  sraSource,
  sraTimeout };



/* G2 parameter keywords */

#define G2_SUBALLOC_KEYWORD   "G2SUBALLOCPOLICY"

#endif /* !__G2INTERNAL_H */
#endif /* !__G2_H */

/* END G2.h */