Esempio n. 1
0
/****** sgeobj/href/href_list_find_effective_diff() ***************************
*  NAME
*     href_list_find_effective_diff() -- Resolves groups and creates diff
*
*  SYNOPSIS
*     bool href_list_find_effective_diff(lList **answer_list, 
*                                        const lList *add_groups, 
*                                        const lList *rem_groups, 
*                                        const lList *master_list, 
*                                        lList **add_hosts, lList **rem_hosts) 
*
*  FUNCTION
*     Resolves host names of all groups contained in "add_groups"
*     and "rem_groups". Hostnames not part of both resulting hostgroup
*     sets will be stored in "add_hosts" and "rem_hosts".
*
*  INPUTS
*     lList **answer_list      - AN_Type list 
*     const lList *add_groups  - HR_Type list1 (hgroups)
*     const lList *rem_groups  - HR_Type list2 (hgroups)
*     const lList *master_list - HGRP_Type list of all hgroups
*     lList **add_hosts        - resolved "add_groups" hosts not part
*                                of "rem_groups" 
*     lList **rem_hosts        - resolved "rem_groups" hosts not part
*                                of "add_hosts"
*
*  RESULT
*     bool - error state
*        true  - Success
*        false - Error
******************************************************************************/
bool
href_list_find_effective_diff(lList **answer_list, const lList *add_groups, 
                              const lList *rem_groups, const lList *master_list,
                              lList **add_hosts, lList **rem_hosts)
{
   bool ret = true;

   DENTER(HOSTREF_LAYER, "href_list_find_effective_diff");
   if (ret && add_groups != NULL) {
      ret &= href_list_find_all_references(add_groups, answer_list,
                                           master_list, add_hosts, NULL);
   }
   if (ret && rem_groups != NULL) {
      ret &= href_list_find_all_references(rem_groups, answer_list,
                                           master_list, rem_hosts, NULL);
   }
   if (ret && add_hosts != NULL && *add_hosts != NULL &&
       rem_hosts != NULL && *rem_hosts != NULL) {
      lList *tmp_rem_hosts = NULL;
      lList *tmp_add_hosts = NULL;

      ret &= href_list_find_diff(*add_hosts, answer_list,
                                 *rem_hosts, &tmp_add_hosts,
                                 &tmp_rem_hosts, NULL, NULL);
      if (ret) {
         lFreeList(add_hosts);
         lFreeList(rem_hosts);
         *add_hosts = tmp_add_hosts;
         *rem_hosts = tmp_rem_hosts;
         tmp_add_hosts = NULL;
         tmp_rem_hosts = NULL;
      }
   }
   DEXIT;
   return ret;
}
Esempio n. 2
0
static bool
hgroup_mod_hostlist(lListElem *hgroup, lList **answer_list,
                    lListElem *reduced_elem, int sub_command,
                    lList **add_hosts, lList **rem_hosts,
                    lList **occupant_groups)
{
    bool ret = true;

    DENTER(TOP_LAYER, "hgroup_mod_hostlist");
    if (hgroup != NULL && reduced_elem != NULL) {
        int pos = lGetPosViaElem(reduced_elem, HGRP_host_list, SGE_NO_ABORT);

        if (pos >= 0) {
            lList *list = lGetPosList(reduced_elem, pos);
            lList *old_href_list = lCopyList("", lGetList(hgroup, HGRP_host_list));
            lList *master_list = *(hgroup_list_get_master_list());
            lList *href_list = NULL;
            lList *add_groups = NULL;
            lList *rem_groups = NULL;

            if (ret) {
                ret &= href_list_resolve_hostnames(list, answer_list, true);
            }
            if (ret) {
                attr_mod_sub_list(answer_list, hgroup, HGRP_host_list, HR_name,
                                  reduced_elem, sub_command, SGE_ATTR_HOSTLIST,
                                  SGE_OBJ_HGROUP, 0);
                href_list = lGetList(hgroup, HGRP_host_list);
            }
            if (ret) {
                ret &= href_list_find_diff(href_list, answer_list, old_href_list,
                                           add_hosts, rem_hosts, &add_groups,
                                           &rem_groups);
            }
            if (ret && add_groups != NULL) {
                ret &= hgroup_list_exists(master_list, answer_list, add_groups);
            }
            if (ret) {
                ret &= href_list_find_effective_diff(answer_list, add_groups,
                                                     rem_groups, master_list,
                                                     add_hosts, rem_hosts);
            }
            if (ret) {
                ret &= href_list_resolve_hostnames(*add_hosts, answer_list, false);
            }

            /*
             * Try to find cycles in the definition
             */
            if (ret) {
                ret &= hgroup_find_all_referencees(hgroup, answer_list,
                                                   master_list, occupant_groups);
                ret &= href_list_add(occupant_groups, answer_list,
                                     lGetHost(hgroup, HGRP_name));
                if (ret) {
                    if (*occupant_groups != NULL && add_groups != NULL) {
                        lListElem *add_group = NULL;

                        for_each(add_group, add_groups) {
                            const char *name = lGetHost(add_group, HR_name);

                            if (href_list_has_member(*occupant_groups, name)) {
                                break;
                            }
                        }
                        if (add_group == NULL) {
                            /*
                             * No cycle found => success
                             */
                            ;
                        } else {
                            SGE_ADD_MSG_ID(sprintf(SGE_EVENT, MSG_HGROUP_CYCLEINDEF_SS,
                                                   lGetHost(add_group, HR_name),
                                                   lGetHost(hgroup, HGRP_name)));
                            answer_list_add(answer_list, SGE_EVENT, STATUS_ESYNTAX,
                                            ANSWER_QUALITY_ERROR);
                            ret = false;
                        }
                    }
                }
            }