#ifndef __SGE_HROUPL_H
#define __SGE_HROUPL_H

/*___INFO__MARK_BEGIN__*/
/*************************************************************************
 * 
 *  The Contents of this file are made available subject to the terms of
 *  the Sun Industry Standards Source License Version 1.2
 * 
 *  Sun Microsystems Inc., March, 2001
 * 
 * 
 *  Sun Industry Standards Source License Version 1.2
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.2 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://gridengine.sunsource.net/Gridengine_SISSL_license.html
 * 
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 * 
 *   The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 * 
 *   Copyright: 2001 by Sun Microsystems, Inc.
 * 
 *   All Rights Reserved.
 * 
 ************************************************************************/
/*___INFO__MARK_END__*/

#include "sge_boundaries.h"
#include "cull.h"

#ifdef  __cplusplus
extern "C" {
#endif

/* *INDENT-OFF* */

/****** sgeobj/hgroup/--HGRP_Type *********************************************
*  NAME
*     HGRP_Type - CULL hostgroup element
*
*  ELEMENTS
*     SGE_HOST(HGRP_name)
*        Name of the hostgroup
*
*     SGE_LIST(HGRP_host_list)
*        List of hostnames and/or hostgroup names
*     
*  FUNCTION 
*
*     HGRP_Type elements are used to define groups of hosts. Each group
*     will be identified by a unique name.
*     Each hostgroup might refer to none, one or multiple hosts and/or
*     hostgroups. This object makes it possible to define a network of
*     hostgroups and hosts.
*
*     
*                       --------------                                 
*                       |            |
*                       V            | 0:x
*                 ------------- -----| 
*                 | HGRP_Type |               ------------
*                 ------------- ------------> | hostname |
*                                    0:x      ------------
*     
*     Example
*
*        Following diagram shows a network of 9 hostgroups (A; B; C; 
*        D; E; G; H; I). Each of those groups references one host 
*        (A -> a; B -> b; C -> c; ...). Additionally some of those 
*        hostgroups refer to one (A -> C; B -> C; C -> E; ...) or two 
*        hostgroups (E -> F,G; F -> H,I) The connections are all 
*        uni-directional, you have to read the diagram from the left
*        to the right.
*
*                 -----                           -----
*                 | A | -- a                      | H | -- h
*                 ----- \                       / -----
*                         -----           -----
*                         | C | -- c      | F | -- f
*                         -----         / -----
*                 ----- /       \ -----         \ -----
*                 | B | -- b      | E | -- e      | I | -- i
*                 -----           -----           -----
*                         ----- /       \ -----
*                         | D | -- d      | G | -- g
*                         -----           -----
*
*     Several functions exist to create such networks and to find
*     certain sets of hosts and hostgroups within such a network:
*
*     hgroup_find_references("E", &answer, master_list, &hosts, &groups)
*        hosts -> e 
*        groups -> F, G
* 
*     hgroup_find_all_references("E", &answer, master_list, &hosts, &groups)
*        hosts -> e, f, g, h, i
*        groups -> F, G, H, I
*
*     hgroup_find_referencees("E", &answer, master_list, &groups)
*        groups -> C, D
*
*     hgroup_find_all_referencees("E", &answer, master_list, &groups)
*        groups -> A, B, C, D
*
*  SEE ALSO
*     sgeobj/hgroup/hgroup_list_get_master_list()
*     sgeobj/hgroup/hgroup_list_locate()
*     sgeobj/hgroup/hgroup_create()
*     sgeobj/hgroup/hgroup_add_references()
*     sgeobj/hgroup/hgroup_find_all_references()
*     sgeobj/hgroup/hgroup_find_references()
*     sgeobj/hgroup/hgroup_find_all_referencees()
*     sgeobj/hgroup/hgroup_find_referencees()
*     sgeobj/hgroup/hgroup_list_exists()
*******************************************************************************/
enum {
   HGRP_name = HGRP_LOWERBOUND,
   HGRP_host_list,
   HGRP_cqueue_list
};

LISTDEF(HGRP_Type)
   JGDI_ROOT_OBJ(Hostgroup, SGE_HGRP_LIST, ADD | MODIFY | DELETE | GET | GET_LIST)
   JGDI_EVENT_OBJ(ADD(sgeE_HGROUP_ADD) | MODIFY(sgeE_HGROUP_MOD) | DELETE(sgeE_HGROUP_DEL) | GET_LIST(sgeE_HGROUP_LIST))
   SGE_HOST_D(HGRP_name, CULL_PRIMARY_KEY | CULL_HASH | CULL_UNIQUE | CULL_SPOOL | CULL_JGDI_CONF, "@template")
   SGE_LIST(HGRP_host_list, HR_Type, CULL_SPOOL | CULL_JGDI_CONF) 
   SGE_LIST(HGRP_cqueue_list, CQ_Type, CULL_DEFAULT | CULL_JGDI_HIDDEN) 
LISTEND

NAMEDEF(HGRPN)
   NAME("HGRP_name")
   NAME("HGRP_host_list")
   NAME("HGRP_cqueue_list")
NAMEEND

#define HGRPS sizeof(HGRPN)/sizeof(char*)

/* *INDENT-ON* */

#ifdef  __cplusplus
}
#endif

#endif /* __SGE_HGROUPL_H */
