/****** 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; }
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; } } } }