/*-------------------------------------------------------------------------*/ static void qmonSelectCkpt(Widget w, XtPointer cld, XtPointer cad) { XmListCallbackStruct *cbs = (XmListCallbackStruct*) cad; char *ckpt_name; lListElem *ep; DENTER(GUI_LAYER, "qmonSelectCkpt"); if (! XmStringGetLtoR(cbs->item, XmFONTLIST_DEFAULT_TAG, &ckpt_name)) { fprintf(stderr, "XmStringGetLtoR failed\n"); DEXIT; return; } ep = ckpt_list_locate(qmonMirrorList(SGE_CK_LIST), ckpt_name); XtFree((char*) ckpt_name); qmonCkptFillConf(ckpt_conf_list, ep); DEXIT; }
/*-------------------------------------------------------------------------*/ static void qmonCkptModify(Widget w, XtPointer cld, XtPointer cad) { XmString *ckptnames; Cardinal ckptnum; String ckptstr; lListElem *ckp = NULL; DENTER(GUI_LAYER, "qmonCkptModify"); /* ** on ockptning the dialog fill in the old values */ XtVaGetValues( ckpt_names, XmNselectedItems, &ckptnames, XmNselectedItemCount, &ckptnum, NULL); if (ckptnum == 1 && XmStringGetLtoR(ckptnames[0], XmFONTLIST_DEFAULT_TAG, &ckptstr)) { XmtInputFieldSetString(ckpt_name_w, ckptstr); XtVaSetValues( ckpt_name_w, XmNeditable, False, NULL); ckp = ckpt_list_locate(qmonMirrorList(SGE_CK_LIST), ckptstr); XtFree((char*)ckptstr); if (ckp) { add_mode = 0; qmonCkptSetAsk(ckp); XtManageChild(ckpt_ask_layout); } } XtManageChild(ckpt_ask_layout); DEXIT; }
/****** qmaster/ckpt/sge_del_ckpt() ******************************************* * * NAME * sge_del_ckpt -- delete ckpt object in Master_Ckpt_List * * SYNOPSIS * int sge_del_ckpt(lListElem *ep, lList **alpp, char *ruser, char *rhost); * * FUNCTION * This function will be called from the framework which will * add/modify/delete generic gdi objects. * The purpose of this function is it to delete ckpt objects. * * * INPUTS * ep - element which should be deleted * alpp - reference to an answer list. * ruser - username of person who invoked this gdi request * rhost - hostname of the host where someone initiated an gdi call * * RESULT * [alpp] - error messages will be added to this list * 0 - success * STATUS_EUNKNOWN - an error occured ******************************************************************************/ int sge_del_ckpt(sge_gdi_ctx_class_t *ctx, lListElem *ep, lList **alpp, char *ruser, char *rhost) { lListElem *found; int pos; const char *ckpt_name; lList **lpp = object_type_get_master_list(SGE_TYPE_CKPT); DENTER(TOP_LAYER, "sge_del_ckpt"); if ( !ep || !ruser || !rhost ) { CRITICAL((SGE_EVENT, MSG_SGETEXT_NULLPTRPASSED_S, SGE_FUNC)); answer_list_add(alpp, SGE_EVENT, STATUS_EUNKNOWN, ANSWER_QUALITY_ERROR); DEXIT; return STATUS_EUNKNOWN; } /* ep is no ckpt element, if ep has no CK_name */ if ((pos = lGetPosViaElem(ep, CK_name, SGE_NO_ABORT)) < 0) { CRITICAL((SGE_EVENT, MSG_SGETEXT_MISSINGCULLFIELD_SS, lNm2Str(CK_name), SGE_FUNC)); answer_list_add(alpp, SGE_EVENT, STATUS_EUNKNOWN, ANSWER_QUALITY_ERROR); DEXIT; return STATUS_EUNKNOWN; } ckpt_name = lGetPosString(ep, pos); if (!ckpt_name) { CRITICAL((SGE_EVENT, MSG_SGETEXT_NULLPTRPASSED_S, SGE_FUNC)); answer_list_add(alpp, SGE_EVENT, STATUS_EUNKNOWN, ANSWER_QUALITY_ERROR); DEXIT; return STATUS_EUNKNOWN; } found = ckpt_list_locate(*lpp, ckpt_name); if (!found) { ERROR((SGE_EVENT, MSG_SGETEXT_DOESNOTEXIST_SS, MSG_OBJ_CKPT, ckpt_name)); answer_list_add(alpp, SGE_EVENT, STATUS_EEXIST, ANSWER_QUALITY_ERROR); DEXIT; return STATUS_EEXIST; } /* * Try to find references in other objects */ { lList *local_answer_list = NULL; if (ckpt_is_referenced(found, &local_answer_list, *(object_type_get_master_list(SGE_TYPE_JOB)), *(object_type_get_master_list(SGE_TYPE_CQUEUE)))) { lListElem *answer = lFirst(local_answer_list); ERROR((SGE_EVENT, "denied: %s", lGetString(answer, AN_text))); answer_list_add(alpp, SGE_EVENT, STATUS_EUNKNOWN, ANSWER_QUALITY_ERROR); lFreeList(&local_answer_list); DEXIT; return STATUS_EUNKNOWN; } } /* remove ckpt file 1st */ if (!sge_event_spool(ctx, alpp, 0, sgeE_CKPT_DEL, 0, 0, ckpt_name, NULL, NULL, NULL, NULL, NULL, true, true)) { ERROR((SGE_EVENT, MSG_CANTSPOOL_SS, MSG_OBJ_CKPT, ckpt_name)); answer_list_add(alpp, SGE_EVENT, STATUS_EEXIST, ANSWER_QUALITY_ERROR); DEXIT; return STATUS_EDISK; } /* now we can remove the element */ lRemoveElem(*lpp, &found); INFO((SGE_EVENT, MSG_SGETEXT_REMOVEDFROMLIST_SSSS, ruser, rhost, ckpt_name, MSG_OBJ_CKPT)); answer_list_add(alpp, SGE_EVENT, STATUS_OK, ANSWER_QUALITY_INFO); DEXIT; return STATUS_OK; }
/****** sge_advance_reservation/ar_validate() ********************************** * NAME * ar_validate() -- validate a advance reservation * * SYNOPSIS * bool ar_validate(lListElem *ar, lList **alpp, bool in_master) * * FUNCTION * Ensures a new ar has valid start and end times * * INPUTS * lListElem *ar - the ar to check * lList **alpp - answer list pointer * bool in_master - are we in qmaster? * bool is_spool - do we validate for spooling? * * RESULT * bool - true if OK, else false * * NOTES * MT-NOTE: ar_validate() is MT safe *******************************************************************************/ bool ar_validate(lListElem *ar, lList **alpp, bool in_master, bool is_spool) { u_long32 start_time; u_long32 end_time; u_long32 duration; u_long32 now = sge_get_gmt(); object_description *object_base = object_type_get_object_description(); DENTER(TOP_LAYER, "ar_validate"); /* AR_start_time, SGE_ULONG */ if ((start_time = lGetUlong(ar, AR_start_time)) == 0) { start_time = now; lSetUlong(ar, AR_start_time, start_time); } /* AR_end_time, SGE_ULONG */ end_time = lGetUlong(ar, AR_end_time); duration = lGetUlong(ar, AR_duration); if (end_time == 0 && duration == 0) { answer_list_add_sprintf(alpp, STATUS_EEXIST, ANSWER_QUALITY_ERROR, MSG_AR_MISSING_VALUE_S, "end time or duration"); goto ERROR; } else if (end_time == 0) { end_time = duration_add_offset(start_time, duration); duration = end_time - start_time; lSetUlong(ar, AR_end_time, end_time); lSetUlong(ar, AR_duration, duration); } else if (duration == 0) { duration = end_time - start_time; lSetUlong(ar, AR_duration, duration); } if ((end_time - start_time) != duration) { answer_list_add_sprintf(alpp, STATUS_EEXIST, ANSWER_QUALITY_ERROR, MSG_AR_START_END_DURATION_INVALID); goto ERROR; } if (start_time > end_time) { answer_list_add_sprintf(alpp, STATUS_EEXIST, ANSWER_QUALITY_ERROR, MSG_AR_START_LATER_THAN_END); goto ERROR; } if (!is_spool) { if (start_time < now) { answer_list_add_sprintf(alpp, STATUS_EEXIST, ANSWER_QUALITY_ERROR, MSG_AR_START_IN_PAST); goto ERROR; } } /* AR_owner, SGE_STRING */ if (in_master) { /* AR_name, SGE_STRING */ NULL_OUT_NONE(ar, AR_name); if (object_verify_name(ar, alpp, AR_name, SGE_OBJ_AR)) { goto ERROR; } /* AR_account, SGE_STRING */ NULL_OUT_NONE(ar, AR_account); if (!lGetString(ar, AR_account)) { lSetString(ar, AR_account, DEFAULT_ACCOUNT); } else { if (verify_str_key(alpp, lGetString(ar, AR_account), MAX_VERIFY_STRING, "account string", QSUB_TABLE) != STATUS_OK) { goto ERROR; } } /* AR_verify, SGE_ULONG just verify the reservation or final case */ /* AR_error_handling, SGE_ULONG how to deal with soft and hard exceptions */ /* AR_checkpoint_name, SGE_STRING Named checkpoint */ NULL_OUT_NONE(ar, AR_checkpoint_name); { /* request for non existing ckpt object will be refused */ const char *ckpt_name = NULL; ckpt_name = lGetString(ar, AR_checkpoint_name); if (ckpt_name != NULL) { lList *master_ckpt_list = *object_base[SGE_TYPE_CKPT].list; lListElem *ckpt_ep = ckpt_list_locate(master_ckpt_list, ckpt_name); if (!ckpt_ep) { ERROR((SGE_EVENT, MSG_JOB_CKPTUNKNOWN_S, ckpt_name)); answer_list_add(alpp, SGE_EVENT, STATUS_EUNKNOWN, ANSWER_QUALITY_ERROR); goto ERROR; } } } /* AR_resource_list, SGE_LIST */ { lList *master_centry_list = *object_base[SGE_TYPE_CENTRY].list; if (centry_list_fill_request(lGetList(ar, AR_resource_list), alpp, master_centry_list, false, true, false)) { goto ERROR; } if (compress_ressources(alpp, lGetList(ar, AR_resource_list), SGE_OBJ_AR)) { goto ERROR; } if (!centry_list_is_correct(lGetList(ar, AR_resource_list), alpp)) { goto ERROR; } } /* AR_queue_list, SGE_LIST */ if (!qref_list_is_valid(lGetList(ar, AR_queue_list), alpp)) { goto ERROR; } /* AR_mail_options, SGE_ULONG */ /* AR_mail_list, SGE_LIST */ /* AR_master_queue_list -masterq wc_queue_list, SGE_LIST bind master task to queue(s) */ if (!qref_list_is_valid(lGetList(ar, AR_master_queue_list), alpp)) { goto ERROR; } /* AR_pe, SGE_STRING, AR_pe_range, SGE_LIST */ NULL_OUT_NONE(ar, AR_pe); { const char *pe_name = NULL; lList *pe_range = NULL; pe_name = lGetString(ar, AR_pe); if (pe_name) { const lListElem *pep; pep = pe_list_find_matching(*object_base[SGE_TYPE_PE].list, pe_name); if (!pep) { ERROR((SGE_EVENT, MSG_JOB_PEUNKNOWN_S, pe_name)); answer_list_add(alpp, SGE_EVENT, STATUS_EUNKNOWN, ANSWER_QUALITY_ERROR); goto ERROR; } /* check pe_range */ pe_range = lGetList(ar, AR_pe_range); if (object_verify_pe_range(alpp, pe_name, pe_range, SGE_OBJ_AR)!=STATUS_OK) { goto ERROR; } } } /* AR_acl_list, SGE_LIST */ if (userset_list_validate_access(lGetList(ar, AR_acl_list), ARA_name, alpp) != STATUS_OK) { goto ERROR; } /* AR_xacl_list, SGE_LIST */ if (userset_list_validate_access(lGetList(ar, AR_xacl_list), ARA_name, alpp) != STATUS_OK) { goto ERROR; } if (is_spool) { lListElem *jg; dstring cqueue_buffer = DSTRING_INIT; dstring hostname_buffer = DSTRING_INIT; for_each(jg, lGetList(ar, AR_granted_slots)){ const char *hostname = NULL; const char *qname = lGetString(jg, JG_qname); bool has_hostname = false; bool has_domain = false; cqueue_name_split(qname, &cqueue_buffer, &hostname_buffer, &has_hostname, &has_domain); hostname = sge_dstring_get_string(&hostname_buffer); lSetHost(jg, JG_qhostname, hostname); } sge_dstring_free(&cqueue_buffer); sge_dstring_free(&hostname_buffer); } /* AR_type, SGE_ULONG */ /* AR_state, SGE_ULONG state of the AR */ if(lGetUlong(ar, AR_state) == ARL_UNKNOWN){ lSetUlong(ar, AR_state, ARL_CREATION); } } DRETURN(true); ERROR: DRETURN(false); }