void test_user_policy_on_exit_remove_yes(void) { int val; int action; char buf[4096]; ClassAd *result; ClassAd *jad = new ClassAd; if (jad == NULL) { printf("Out of memory!\n"); exit(EXIT_FAILURE); } printf("==========================================\n"); printf("Testing User Policy on On Exit Remove: YES\n"); /* set up the classad */ sprintf(buf, "%s = %d", ATTR_ON_EXIT_CODE, 0); jad->Insert(buf); sprintf(buf, "%s = 42", ATTR_TOTAL_SUSPENSIONS); jad->Insert(buf); sprintf(buf, "%s = FALSE", ATTR_PERIODIC_HOLD_CHECK); jad->Insert(buf); sprintf(buf, "%s = FALSE", ATTR_PERIODIC_REMOVE_CHECK); jad->Insert(buf); sprintf(buf, "%s = FALSE", ATTR_ON_EXIT_HOLD_CHECK); jad->Insert(buf); sprintf(buf, "%s = TotalSuspensions == 42", ATTR_ON_EXIT_REMOVE_CHECK); jad->Insert(buf); result = user_job_policy(jad); result->EvalBool(ATTR_USER_POLICY_ERROR, result, val); if(val == true) { printf("An error happened\n"); delete result; return; } result->EvalBool(ATTR_TAKE_ACTION, result, val); if (val == true) { printf("%s was true.\n", ATTR_TAKE_ACTION); result->LookupInteger(ATTR_USER_POLICY_ACTION, action); printf("Action is: %s\n", action==REMOVE_JOB?"REMOVE_JOB":action==HOLD_JOB?"HOLD_JOB": "UNKNOWN"); result->LookupString(ATTR_USER_POLICY_FIRING_EXPR, buf); printf("Reason for action: %s\n", buf); } else { printf("Something went wrong. I should have had an action to take.\n"); } }
void test_user_policy_on_exit_remove_no(void) { int val; char buf[4096]; ClassAd *result; ClassAd *jad = new ClassAd; if (jad == NULL) { printf("Out of memory!\n"); exit(EXIT_FAILURE); } printf("========================================\n"); printf("Testing User Policy on On Exit Remove: NO\n"); /* set up the classad */ sprintf(buf, "%s = %d", ATTR_ON_EXIT_CODE, 0); jad->Insert(buf); sprintf(buf, "%s = 40", ATTR_TOTAL_SUSPENSIONS); jad->Insert(buf); sprintf(buf, "%s = FALSE", ATTR_PERIODIC_HOLD_CHECK); jad->Insert(buf); sprintf(buf, "%s = FALSE", ATTR_PERIODIC_REMOVE_CHECK); jad->Insert(buf); sprintf(buf, "%s = FALSE", ATTR_ON_EXIT_HOLD_CHECK); jad->Insert(buf); sprintf(buf, "%s = TotalSuspensions == 42", ATTR_ON_EXIT_REMOVE_CHECK); jad->Insert(buf); result = user_job_policy(jad); result->EvalBool(ATTR_USER_POLICY_ERROR, result, val); if(val == true) { printf("An error happened\n"); delete result; return; } result->EvalBool(ATTR_TAKE_ACTION, result, val); if (val == true) { printf("Something went wrong. I should not have had an action.\n"); } else { printf("Ignoring correctly.\n"); } }
void test_oldstyle_with_exit(void) { int val; int action; char buf[4096]; ClassAd *result; ClassAd *jad = new ClassAd; if (jad == NULL) { printf("Out of memory!\n"); exit(EXIT_FAILURE); } printf("==================================================\n"); printf("Testing OldStyle job where it is marked as exited.\n"); /* An oldstyle classad would have this */ sprintf(buf, "%s = %d", ATTR_COMPLETION_DATE, 10); /* non zero */ jad->Insert(buf); result = user_job_policy(jad); result->EvalBool(ATTR_USER_POLICY_ERROR, result, val); if(val == true) { printf("An error happened\n"); delete result; return; } result->EvalBool(ATTR_TAKE_ACTION, result, val); if (val == true) { printf("%s was true.\n", ATTR_TAKE_ACTION); result->LookupInteger(ATTR_USER_POLICY_ACTION, action); printf("Action is: %s\n", action==REMOVE_JOB?"REMOVE_JOB":action==HOLD_JOB?"HOLD_JOB": "UNKNOWN"); result->LookupString(ATTR_USER_POLICY_FIRING_EXPR, buf); printf("Reason for action: %s\n", buf); } else { printf("Something went wrong. I should have had an action to take.\n"); } }
void test_oldstyle_with_no_exit(void) { int val; char buf[4096]; ClassAd *result; ClassAd *jad = new ClassAd; if (jad == NULL) { printf("Out of memory!\n"); exit(EXIT_FAILURE); } printf("======================================================\n"); printf("Testing OldStyle job where it is NOT marked as exited.\n"); /* An oldstyle classad would have this */ sprintf(buf, "%s = %d", ATTR_COMPLETION_DATE, 0); jad->Insert(buf); result = user_job_policy(jad); result->EvalBool(ATTR_USER_POLICY_ERROR, result, val); if(val == true) { printf("An error happened\n"); delete result; return; } result->EvalBool(ATTR_TAKE_ACTION, result, val); if (val == true) { printf("Something went wrong. I should not have had an action.\n"); } else { printf("Ignoring correctly.\n"); } delete result; }
/* After the job exits, look into the classad to see if certain things are true or not */ void static_policy(void) { ClassAd *result; int val; int action; char buf[4096]; char buf2[4096]; /* See what the user job policy has in store for me. */ result = user_job_policy(JobAd); result->EvalBool(ATTR_USER_POLICY_ERROR, result, val); if (val == 1) { dprintf(D_ALWAYS, "There was an error in the static policy\n"); delete result; return; } result->EvalBool(ATTR_TAKE_ACTION, result, val); if (val == 1) { result->LookupString(ATTR_USER_POLICY_FIRING_EXPR, buf, sizeof(buf)); result->LookupInteger(ATTR_USER_POLICY_ACTION, action); switch(action) { case REMOVE_JOB: dprintf(D_ALWAYS, "Static Policy: removing job because %s has " "become true\n", buf); /* do nothing, the nasty old shadow logic takes it from here. */ delete result; return; break; case HOLD_JOB: dprintf(D_ALWAYS, "Static Policy: holding job because %s has " "become true\n", buf); delete result; sprintf(buf, "Your job has been held because %s has become " "true\n", ATTR_PERIODIC_HOLD_CHECK); sprintf(buf2, "Your job has been held because %s has become " "true", ATTR_PERIODIC_HOLD_CHECK); /* This exits */ HoldJob(buf, buf2, CONDOR_HOLD_CODE_JobPolicy, 0); return; break; default: dprintf(D_ALWAYS, "WARNING! Ignoring unknown action type in " "periodic_policy()\n"); delete result; return; break; } } delete result; dprintf( D_ALWAYS, "Static policy: don't remove on exit\n" ); EXCEPT( "Job didn't exit under conditions specifed in %s", ATTR_ON_EXIT_REMOVE_CHECK ); }
/* evaluate various periodic checks during the running of the shadow and perform actions based upon what special attributes evaluate to. */ bool periodic_policy(void) { ClassAd *result; int val; int action; char buf[4096]; char buf2[4096]; /* See what the user job policy has in store for me. */ result = user_job_policy(JobAd); result->EvalBool(ATTR_USER_POLICY_ERROR, result, val); if (val == 1) { dprintf(D_ALWAYS, "There was an error in the periodic policy\n"); delete result; return false; } result->EvalBool(ATTR_TAKE_ACTION, result, val); if (val == 1) { result->LookupString(ATTR_USER_POLICY_FIRING_EXPR, buf, sizeof(buf)); result->LookupInteger(ATTR_USER_POLICY_ACTION, action); switch(action) { case REMOVE_JOB: dprintf(D_ALWAYS, "Periodic Policy: removing job because %s " "has become true\n", buf); /* set some yucky global variables */ JobStatus = 0; JobExitStatus = 0; delete result; return true; break; case HOLD_JOB: sprintf(buf, "Periodic Policy: holding job because %s has " "become true\n", buf); sprintf(buf, "Your job has been held because %s has become " "true\n", ATTR_PERIODIC_HOLD_CHECK); sprintf(buf2, "Your job has been held because %s has become " "true", ATTR_PERIODIC_HOLD_CHECK); delete result; /* This exits */ HoldJob(buf, buf2, CONDOR_HOLD_CODE_JobPolicy, 0); break; default: dprintf(D_ALWAYS, "WARNING! Ignoring unknown action type in " "periodic_policy()\n"); delete result; return false; break; } } delete result; return false; }
void test_user_policy_on_exit_hold_no(void) { int val; int action; char buf[4096]; ClassAd *result; ClassAd *jad = new ClassAd; if (jad == NULL) { printf("Out of memory!\n"); exit(EXIT_FAILURE); } printf("=======================================\n"); printf("Testing User Policy on On Exit Hold: NO\n"); /* set up the classad */ sprintf(buf, "%s = %d", ATTR_ON_EXIT_CODE, 0); jad->Insert(buf); sprintf(buf, "%s = 40", ATTR_TOTAL_SUSPENSIONS); jad->Insert(buf); sprintf(buf, "%s = FALSE", ATTR_PERIODIC_HOLD_CHECK); jad->Insert(buf); sprintf(buf, "%s = FALSE", ATTR_PERIODIC_REMOVE_CHECK); jad->Insert(buf); sprintf(buf, "%s = TotalSuspensions == 42", ATTR_ON_EXIT_HOLD_CHECK); jad->Insert(buf); sprintf(buf, "%s = TRUE", ATTR_ON_EXIT_REMOVE_CHECK); jad->Insert(buf); result = user_job_policy(jad); result->EvalBool(ATTR_USER_POLICY_ERROR, result, val); if(val == true) { printf("An error happened\n"); delete result; return; } result->EvalBool(ATTR_TAKE_ACTION, result, val); if (val == true) { printf("%s was true.\n", ATTR_TAKE_ACTION); result->LookupInteger(ATTR_USER_POLICY_ACTION, action); printf("Action is: %s\n", action==REMOVE_JOB?"REMOVE_JOB":action==HOLD_JOB?"HOLD_JOB": "UNKNOWN"); result->LookupString(ATTR_USER_POLICY_FIRING_EXPR, buf); printf("Reason for action: %s\n", buf); if (strcmp(ATTR_USER_POLICY_FIRING_EXPR, ATTR_ON_EXIT_HOLD_CHECK) == 0) { printf("Failed. I got removed because exit_hold was true.\n"); } else { printf("Success. I was removed because of %s, not because of %s\n", ATTR_ON_EXIT_REMOVE_CHECK, ATTR_ON_EXIT_HOLD_CHECK); } } else { printf("Ignoring correctly.\n"); } }