Пример #1
0
END_TEST

START_TEST(send_job_over_network_test)
  {
  bool timeout = false;
  char *jobid = strdup("1.napali");
  char *destin = strdup("bob");
  bool attempt_to_queue = true;
  bool c = true;
  tlist_head h;
  int my_err;
  int mom_err;

  CLEAR_HEAD(h);

  fail_unless(send_job_over_network(strdup("2.napali"), 5, destin, h, attempt_to_queue, c, timeout, "script", true, false, 10, strdup("/out"), strdup("/err"), strdup("/chkpt"), MOVE_TYPE_Exec, &my_err,&mom_err) == LOCUTION_FAIL);

  CLEAR_HEAD(h);

  fail_unless(send_job_over_network(jobid, 5, destin, h, attempt_to_queue, c, timeout, "script", true, false, 10, strdup("/out"), strdup("/err"), strdup("/chkpt"), MOVE_TYPE_Exec, &my_err,&mom_err) == PBSE_NONE);
  fail_unless(attempt_to_queue == false);

  fprintf(stderr,"%p %s\n",(void *)destin,destin);
  CLEAR_HEAD(h);

  rdycommit_fail = true;
  fail_unless(send_job_over_network(jobid, 5, destin, h, attempt_to_queue, c, timeout, "script", true, false, 10, strdup("/out"), strdup("/err"), strdup("/chkpt"), MOVE_TYPE_Exec, &my_err,&mom_err) == LOCUTION_RETRY);
  rdycommit_fail = false;

  }
Пример #2
0
END_TEST


START_TEST(add_node_attribute_to_list_test)
  {
  char  line[1024];
  char *ptr;
  tlist_head th;
  int ret;
  svrattrl *sattr;

  CLEAR_HEAD(th);

  // this should work and create the attribute np with the value of 100
  snprintf(line, sizeof(line), "100");
  ptr = line;

  ret = add_node_attribute_to_list(strdup("np"), &ptr, &th, 1);
  fail_unless(ret == PBSE_NONE);
  sattr = (svrattrl *)GET_NEXT(th); 
  fail_unless(strcmp(sattr->al_name, "np") == 0);
  fail_unless(strcmp(sattr->al_value, "100") == 0);
  attrlist_free();
  attrname.clear();
  attrval.clear();
  CLEAR_HEAD(th);

  // this is invalid syntax
  snprintf(line, sizeof(line), "100=");
  ptr = line;
  fail_unless(add_node_attribute_to_list(strdup("np"), &ptr, &th, 1) != PBSE_NONE);

  CLEAR_HEAD(th);
  // run over the two special cases
  snprintf(line, sizeof(line), "100");
  ptr = line;
  fail_unless(add_node_attribute_to_list(strdup("TTL"), &ptr, &th, 1) == PBSE_NONE);
  sattr = (svrattrl *)GET_NEXT(th); 
  fail_unless(strcmp(sattr->al_name, "TTL") == 0);
  fail_unless(strcmp(sattr->al_value, "100") == 0);
  attrlist_free();
  attrname.clear();
  attrval.clear();

  CLEAR_HEAD(th);
  snprintf(line, sizeof(line), "bob,tom");
  ptr = line;
  fail_unless(add_node_attribute_to_list(strdup("acl"), &ptr, &th, 1) == PBSE_NONE);
  sattr = (svrattrl *)GET_NEXT(th); 
  fail_unless(strcmp(sattr->al_name, "acl") == 0);
  fail_unless(strcmp(sattr->al_value, "bob,tom") == 0);
  attrlist_free();
  attrname.clear();
  attrval.clear();
  }
Пример #3
0
/**
 * @brief
 * 		status_sched - Build the status reply for single scheduler
 *
 * @param[in]	psched	-	ptr to sched receiving status query
 * @param[in]	preq	-	ptr to the decoded request
 * @param[out]	pstathd	-	head of list to append status to
 *
 * @return	int
 * @retval	0	: success
 * @retval	!0	: PBSE error code
 */
static int
status_sched(pbs_sched *psched, struct batch_request *preq, pbs_list_head *pstathd)
{
	int		   rc = 0;
	struct brp_status *pstat;
	svrattrl	  *pal;

	pstat = (struct brp_status *)malloc(sizeof(struct brp_status));
	if (pstat == NULL)
		return (PBSE_SYSTEM);

	pstat->brp_objtype = MGR_OBJ_SCHED;
	(void)strncpy(pstat->brp_objname, psched->sc_name, (PBS_MAXSVRJOBID > PBS_MAXDEST ?
			PBS_MAXSVRJOBID : PBS_MAXDEST) -1);
	pstat->brp_objname[(PBS_MAXSVRJOBID > PBS_MAXDEST ? PBS_MAXSVRJOBID : PBS_MAXDEST) - 1] = '\0';

	CLEAR_LINK(pstat->brp_stlink);
	CLEAR_HEAD(pstat->brp_attr);
	append_link(pstathd, &pstat->brp_stlink, pstat);


	bad = 0;
	pal = (svrattrl *)GET_NEXT(preq->rq_ind.rq_status.rq_attr);
	if (status_attrib(pal, sched_attr_def, psched->sch_attr, SCHED_ATR_LAST,
		preq->rq_perm, &pstat->brp_attr, &bad))
		reply_badattr(PBSE_NOATTR, bad, pal, preq);

	return (rc);
}
Пример #4
0
void clear_attr(

    pbs_attribute *pattr, /* O */
    attribute_def *pdef)  /* I */

  {
#ifndef NDEBUG

  if (pdef == NULL)
    {
    fprintf(stderr, "Assertion failed, bad pdef in clear_attr\n");

    abort();
    }

#endif /* NDEBUG */

  memset(pattr, 0, sizeof(pbs_attribute));

  pattr->at_type = pdef->at_type;

  if ((pattr->at_type == ATR_TYPE_RESC) ||
      (pattr->at_type == ATR_TYPE_LIST))
    {
    CLEAR_HEAD(pattr->at_val.at_list);
    }

  return;
  }
Пример #5
0
END_TEST

START_TEST(tm_spawn_request_test)
  {
  struct tcp_chan test_chan;
  struct job test_job;
  struct hnodent test_hnodent;
  char *test_cookie = strdup("cookie");
  int reply = 0;
  int ret = 0;
  int result = 0;

  memset(&test_chan, 0, sizeof(test_chan));
  memset(&test_job, 0, sizeof(test_job));
  memset(&test_hnodent, 0, sizeof(test_hnodent));

  test_job.ji_vnods = (vnodent *)calloc(3, sizeof(vnodent));
  CLEAR_HEAD(test_job.ji_tasks);

  result = tm_spawn_request(&test_chan,
                            &test_job,
                            0,
                            0,
                            (char *)test_cookie,
                            &reply,
                            &ret,
                            0,
                            &test_hnodent,
                            0);

  fail_unless(result == TM_DONE, "tm_spawn_request fail: %d", result);
  }
Пример #6
0
int status_job(

  job                  *pjob,    /* ptr to job to status */
  struct batch_request *preq,
  svrattrl             *pal,     /* specific attributes to status */
  tlist_head           *pstathd, /* RETURN: head of list to append status to */
  int                  *bad)     /* RETURN: index of first bad pbs_attribute */

  {
  struct brp_status *pstat;
  int                IsOwner = 0;
  long               query_others = 0;

  /* see if the client is authorized to status this job */
  if (svr_authorize_jobreq(preq, pjob) == 0)
    IsOwner = 1;

  get_svr_attr_l(SRV_ATR_query_others, &query_others);
  if (!query_others)
    {
    if (IsOwner == 0)
      {
      return(PBSE_PERM);
      }
    }

  /* allocate reply structure and fill in header portion */
  if ((pstat = calloc(1, sizeof(struct brp_status))) == NULL)
    {
    return(PBSE_SYSTEM);
    }

  CLEAR_LINK(pstat->brp_stlink);

  pstat->brp_objtype = MGR_OBJ_JOB;

  strcpy(pstat->brp_objname, pjob->ji_qs.ji_jobid);

  CLEAR_HEAD(pstat->brp_attr);

  append_link(pstathd, &pstat->brp_stlink, pstat);

  /* add attributes to the status reply */
  *bad = 0;

  if (status_attrib(
        pal,
        job_attr_def,
        pjob->ji_wattr,
        JOB_ATR_LAST,
        preq->rq_perm,
        &pstat->brp_attr,
        bad,
        IsOwner))
    {
    return(PBSE_NOATTR);
    }

  return (0);
  }  /* END status_job() */
Пример #7
0
int
decode_unkn(struct attribute *patr, char *name, char *rescn, char *value)
{
	svrattrl *entry;
	size_t	     valln;


	if (patr == NULL)
		return (PBSE_INTERNAL);

	if (!(patr->at_flags & ATR_VFLAG_SET))
		CLEAR_HEAD(patr->at_val.at_list);

	if (name == NULL)
		return (PBSE_INTERNAL);

	if (value == NULL)
		valln = 0;
	else
		valln = strlen(value) + 1;

	entry = attrlist_create(name, rescn, valln);
	if (entry == NULL)
		return (PBSE_SYSTEM);

	if (valln)
		memcpy(entry->al_value, value, valln);

	append_link(&patr->at_val.at_list, &entry->al_link, entry);
	patr->at_flags |= ATR_VFLAG_SET | ATR_VFLAG_MODIFY | ATR_VFLAG_MODCACHE;
	return (0);
}
END_TEST



START_TEST(clear_depend_test)
  {
  struct depend pd;

  i = 1;
  clear_depend(&pd, 0, 0);

  fail_unless(pd.dp_type == 0, "type not set");
  fail_unless(pd.dp_numexp == 0, "attr not set correctly");
  fail_unless(pd.dp_numreg == 0, "attr not set correctly");
  fail_unless(pd.dp_released == 0, "attr not set correctly");
  
  i = 1;
  memset(&pd, 0, sizeof(pd));
  CLEAR_HEAD(pd.dp_jobs);

  make_dependjob(&pd, job1, host);
  make_dependjob(&pd, job2, host);
  clear_depend(&pd, 0, 1);
  fail_unless(pd.dp_type == 0, "type not set");
  fail_unless(pd.dp_numexp == 0, "attr not set correctly");
  fail_unless(pd.dp_numreg == 0, "attr not set correctly");
  fail_unless(pd.dp_released == 0, "attr not set correctly");
  }
Пример #9
0
END_TEST


START_TEST(record_node_property_list_test)
  {
  tlist_head th;
  std::string props("bigmem fast");
  std::string empty;

  attrname.clear();
  attrval.clear();
  CLEAR_HEAD(th);

  // empty list should do nothing
  fail_unless(record_node_property_list(empty, &th) == PBSE_NONE);
  fail_unless(attrname.size() == 0);
  fail_unless(attrval.size() == 0);
  attrlist_free();
  attrname.clear();
  attrval.clear();

/*  fail_unless(record_node_property_list(props, &th) == PBSE_NONE);
  fail_unless(attrname == ATTR_NODE_properties);
  fail_unless(attrval == props);
  attrlist_free();
  attrname.clear();
  attrval.clear();*/

  }
Пример #10
0
job *job_alloc(void)

  {
  job *pj;

  pj = (job *)calloc(1, sizeof(job));

  if (pj == NULL)
    {
    log_err(errno, "job_alloc", (char *)"no memory");

    return(NULL);
    }

  pj->ji_qs.qs_version = PBS_QS_VERSION;

  CLEAR_LINK(pj->ji_alljobs);
  CLEAR_LINK(pj->ji_jobque);

  CLEAR_HEAD(pj->ji_tasks);
  pj->ji_taskid = TM_NULL_TASK + 1;
  pj->ji_obit = TM_NULL_EVENT;
  pj->ji_nodekill = TM_ERROR_NODE;

  pj->ji_momhandle = -1;  /* mark mom connection invalid */

  /* set the working attributes to "unspecified" */
  job_init_wattr(pj);

  return(pj);
  }  /* END job_alloc() */
Пример #11
0
pbs_queue *
que_alloc(char *name)
{
	int        i;
	pbs_queue *pq;


	pq = (pbs_queue *)malloc(sizeof(pbs_queue));
	if (pq == (pbs_queue *)0) {
		log_err(errno, "que_alloc", "no memory");
		return ((pbs_queue *)0);
	}
	(void)memset((char *)pq, (int)0, (size_t)sizeof(pbs_queue));
	pq->qu_qs.qu_type = QTYPE_Unset;
	CLEAR_HEAD(pq->qu_jobs);
	CLEAR_LINK(pq->qu_link);

	strncpy(pq->qu_qs.qu_name, name, PBS_MAXQUEUENAME);
	append_link(&svr_queues, &pq->qu_link, pq);
	server.sv_qs.sv_numque++;

	/* set the working attributes to "unspecified" */

	for (i=0; i<(int)QA_ATR_LAST; i++) {
		clear_attr(&pq->qu_attr[i], &que_attr_def[i]);
	}

	return (pq);
}
Пример #12
0
void
req_stat_svr(struct batch_request *preq)
{
	svrattrl	   *pal;
	struct batch_reply *preply;
	struct brp_status  *pstat;


	/* update count and state counts from sv_numjobs and sv_jobstates */

	server.sv_attr[(int)SRV_ATR_TotalJobs].at_val.at_long = server.sv_qs.sv_numjobs;
	server.sv_attr[(int)SRV_ATR_TotalJobs].at_flags |= ATR_VFLAG_SET|ATR_VFLAG_MODCACHE;
	update_state_ct(&server.sv_attr[(int)SRV_ATR_JobsByState],
		server.sv_jobstates,
		server.sv_jobstbuf);

	update_license_ct(&server.sv_attr[(int)SRV_ATR_license_count],
		server.sv_license_ct_buf);

	/* allocate a reply structure and a status sub-structure */

	preply = &preq->rq_reply;
	preply->brp_choice = BATCH_REPLY_CHOICE_Status;
	CLEAR_HEAD(preply->brp_un.brp_status);

	pstat = (struct brp_status *)malloc(sizeof(struct brp_status));
	if (pstat == NULL) {
		reply_free(preply);
		req_reject(PBSE_SYSTEM, 0, preq);
		return;
	}
	CLEAR_LINK(pstat->brp_stlink);
	(void)strcpy(pstat->brp_objname, server_name);
	pstat->brp_objtype = MGR_OBJ_SERVER;
	CLEAR_HEAD(pstat->brp_attr);
	append_link(&preply->brp_un.brp_status, &pstat->brp_stlink, pstat);

	/* add attributes to the status reply */

	bad = 0;
	pal = (svrattrl *)GET_NEXT(preq->rq_ind.rq_status.rq_attr);
	if (status_attrib(pal, svr_attr_def, server.sv_attr, SRV_ATR_LAST,
		preq->rq_perm, &pstat->brp_attr, &bad))
		reply_badattr(PBSE_NOATTR, bad, pal, preq);
	else
		(void)reply_send(preq);
}
Пример #13
0
int add_encoded_attributes(

  xmlNodePtr *attr_node,   /* M attribute node */ 
  pbs_attribute  *pattr)   /* M ptr to pbs_attribute value array */

  {
  tlist_head  lhead;
  int         i;
  int         resc_access_perm = ATR_DFLAG_ACCESS;
  svrattrl   *pal;
  int         rc = PBSE_NONE;
  xmlNodePtr  attributeNode = *attr_node;
  char        buf[BUFSIZE];
  xmlNodePtr  pal_xmlNode;

  CLEAR_HEAD(lhead);
  xmlNodePtr  resource_list_head_node = NULL;
  xmlNodePtr  resource_used_head_node = NULL;

  for (i = 0; ((i < JOB_ATR_LAST) && (rc >= 0)); i++)
    {
    if (job_attr_def[i].at_type != ATR_TYPE_ACL)
      if ((pattr + i)->at_flags & ATR_VFLAG_SET)
        {
        rc = job_attr_def[i].at_encode(
        pattr + i,
        &lhead,
        job_attr_def[i].at_name,
        NULL,
        ATR_ENCODE_SAVE,
        resc_access_perm);

        (pattr + i)->at_flags &= ~ATR_VFLAG_MODIFY;
        if (rc < 0)
          return -1;

        while ((pal = (svrattrl *)GET_NEXT(lhead)) != NULL)
          {
          if (!strcmp(ATTR_l, pal->al_atopl.name)) 
            pal_xmlNode = add_resouce_list_attribute(ATTR_l, attr_node, &resource_list_head_node, pal);
          else if (!strcmp(ATTR_used, pal->al_atopl.name)) 
            pal_xmlNode = add_resouce_list_attribute(ATTR_used, attr_node, &resource_used_head_node, pal);
          else 
            pal_xmlNode = xmlNewChild(attributeNode, NULL, (xmlChar *)pal->al_atopl.name, (xmlChar *)pal->al_atopl.value);

            if (pal_xmlNode)
              {
              snprintf(buf, sizeof(buf), "%u", (unsigned int)pal->al_flags);
              xmlSetProp(pal_xmlNode, (const xmlChar *)AL_FLAGS_ATTR, (const xmlChar *)buf);
              }
            delete_link(&pal->al_link);
            free(pal);
            if (!pal_xmlNode)
              rc = -1;
          }
        }
    }
  return (0);
  } /* END add_encoded_attributes */
END_TEST




START_TEST(del_depend_test)
  {
  struct depend    *pdep = calloc(1, sizeof(struct depend));

  CLEAR_HEAD(pdep->dp_jobs);
  CLEAR_HEAD(pdep->dp_link);

  make_dependjob(pdep, job1, host);
  make_dependjob(pdep, job2, host);

  del_depend(pdep);
  }
Пример #15
0
void initialize_depend_attr(

  pbs_attribute *pattr)

  {
  memset(pattr, 0, sizeof(pbs_attribute));
  CLEAR_HEAD(pattr->at_val.at_list);
  } /* END initialize_depend_attr() */
Пример #16
0
void
req_stat_que(struct batch_request *preq)
{
	char		   *name;
	pbs_queue	   *pque;
	struct batch_reply *preply;
	int		    rc   = 0;
	int		    type = 0;

	/*
	 * first, validate the name of the requested object, either
	 * a queue, or null for all queues
	 */

	name = preq->rq_ind.rq_status.rq_id;

	if ((*name == '\0') || (*name =='@'))
		type = 1;
	else {
		pque = find_queuebyname(name);
#ifdef NAS /* localmod 075 */
		if (pque == NULL)
			pque = find_resvqueuebyname(name);
#endif /* localmod 075 */
		if (pque == NULL) {
			req_reject(PBSE_UNKQUE, 0, preq);
			return;
		}
	}

	preply = &preq->rq_reply;
	preply->brp_choice = BATCH_REPLY_CHOICE_Status;
	CLEAR_HEAD(preply->brp_un.brp_status);

	if (type == 0) {	/* get status of the one named queue */
		rc = status_que(pque, preq, &preply->brp_un.brp_status);

	} else {	/* get status of queues */

		pque = (pbs_queue *)GET_NEXT(svr_queues);
		while (pque) {
			rc = status_que(pque, preq, &preply->brp_un.brp_status);
			if (rc != 0) {
				if (rc == PBSE_PERM)
					rc = 0;
				else
					break;
			}
			pque = (pbs_queue *)GET_NEXT(pque->qu_link);
		}
	}
	if (rc) {
		(void)reply_free(preply);
		req_reject(rc, bad, preq);
	} else {
		(void)reply_send(preq);
	}
}
Пример #17
0
int release_array_range(

  job_array            *pa,
  struct batch_request *preq,
  char                 *range_str)

  {
  tlist_head tl;
  int i;
  int rc;

  array_request_node *rn;
  array_request_node *to_free;
  
  char *range = strchr(range_str,'=');
  if (range == NULL)
    return(PBSE_IVALREQ);

  range++; /* move past the '=' */
  
  CLEAR_HEAD(tl);
  
  if (parse_array_request(range,&tl) > 0)
    {
    /* don't hold the jobs if range error */
    
    return(PBSE_IVALREQ);
    }
  
  /* hold just that range from the array */
  rn = (array_request_node*)GET_NEXT(tl);
  
  while (rn != NULL)
    {
    for (i = rn->start; i <= rn->end; i++)
      {
      if (pa->jobs[i] == NULL)
        continue;
      
      /* don't stomp on other memory */
      if (i >= pa->ai_qs.array_size)
        continue;
      
      if ((rc = release_job(preq,pa->jobs[i])))
        return(rc);
      }
    
    /* release mem */
    to_free = rn;
    rn = (array_request_node*)GET_NEXT(rn->request_tokens_link);
    free(to_free);
    }

  return(0);

  } /* END release_array_range() */
Пример #18
0
/*
 * hold_array_range()
 * 
 * holds just a specified range from an array
 * @param pa - the array to be acted on
 * @param range_str - string specifying the range 
 */
int hold_array_range(

  job_array *pa,         /* O */
  char      *range_str,  /* I */
  attribute *temphold)   /* I */

  {
  tlist_head tl;
  int i;

  array_request_node *rn;
  array_request_node *to_free;
  
  char *range = strchr(range_str,'=');
  if (range == NULL)
    return(PBSE_IVALREQ);

  range++; /* move past the '=' */
  
  CLEAR_HEAD(tl);
  
  if (parse_array_request(range,&tl) > 0)
    {
    /* don't hold the jobs if range error */
    
    return(PBSE_IVALREQ);
    }
  else 
    {
    /* hold just that range from the array */
    rn = (array_request_node*)GET_NEXT(tl);
    
    while (rn != NULL)
      {
      for (i = rn->start; i <= rn->end; i++)
        {
        if (pa->jobs[i] == NULL)
          continue;
        
        /* don't stomp on other memory */
        if (i >= pa->ai_qs.array_size)
          continue;
        
        hold_job(temphold,pa->jobs[i]);
        }
      
      /* release mem */
      to_free = rn;
      rn = (array_request_node*)GET_NEXT(rn->request_tokens_link);
      free(to_free);
      }
    }

  return(0);
  } /* END hold_array_range() */
Пример #19
0
void
req_stat_resv(struct batch_request * preq)
{
	char		   *name;
	struct batch_reply *preply;
	resc_resv	   *presv = NULL;
	int		    rc   = 0;
	int		    type = 0;

	/*
	 * first, validate the name sent in the request.
	 * This is either the ID of a specific reservation
	 * or a '\0' or "@..." for all reservations.
	 */

	name = preq->rq_ind.rq_status.rq_id;

	if ((*name == '\0') || (*name =='@'))
		type = 1;
	else {
		presv = find_resv(name);
		if (presv == NULL) {
			req_reject(PBSE_UNKRESVID, 0, preq);
			return;
		}
	}

	preply = &preq->rq_reply;
	preply->brp_choice = BATCH_REPLY_CHOICE_Status;
	CLEAR_HEAD(preply->brp_un.brp_status);

	if (type == 0) {
		/* get status of the specifically named reservation */
		rc = status_resv(presv, preq, &preply->brp_un.brp_status);

	} else {
		/* get status of all the reservations */

		presv = (resc_resv *)GET_NEXT(svr_allresvs);
		while (presv) {
			rc = status_resv(presv, preq, &preply->brp_un.brp_status);
			if (rc == PBSE_PERM)
				rc = 0;
			if (rc)
				break;
			presv = (resc_resv *)GET_NEXT(presv->ri_allresvs);
		}
	}

	if (rc == 0)
		(void)reply_send(preq);
	else
		req_reject(rc, bad, preq);
}
Пример #20
0
void clear_attr(pbs_attribute *pattr, attribute_def *pdef)
  {
  memset(pattr, 0, sizeof(pbs_attribute));

  pattr->at_type = pdef->at_type;

  if ((pattr->at_type == ATR_TYPE_RESC) ||
      (pattr->at_type == ATR_TYPE_LIST))
    {
    CLEAR_HEAD(pattr->at_val.at_list);
    }
  }
Пример #21
0
int
decode_DIS_QueueJob(int sock, struct batch_request *preq)
{
	int rc;

	CLEAR_HEAD(preq->rq_ind.rq_queuejob.rq_attr);
	rc = disrfst(sock, PBS_MAXSVRJOBID+1, preq->rq_ind.rq_queuejob.rq_jid);
	if (rc) return rc;

	rc = disrfst(sock, PBS_MAXSVRJOBID+1, preq->rq_ind.rq_queuejob.rq_destin);
	if (rc) return rc;

	return (decode_DIS_svrattrl(sock, &preq->rq_ind.rq_queuejob.rq_attr));
}
Пример #22
0
END_TEST

START_TEST(pbs_task_create_test)
  {
  job *pjob = (job *)calloc(1, sizeof(job));

  /* Check ranning into reserved task IDs */
  pjob->ji_taskid = TM_ADOPTED_TASKID_BASE + 1;
  CLEAR_HEAD(pjob->ji_tasks);
  fail_unless(pbs_task_create(pjob, TM_NULL_TASK) == NULL, "Reserved task");

  /* Success */
  pjob->ji_taskid = TM_NULL_TASK;
  fail_unless(pbs_task_create(pjob, TM_NULL_TASK) != NULL);
  }
Пример #23
0
int
decode_DIS_Status(int sock, struct batch_request *preq)
  {
  int rc;

  CLEAR_HEAD(preq->rq_ind.rq_status.rq_attr);
  rc = disrfst(sock,
               (PBS_MAXSVRJOBID > PBS_MAXDEST ? PBS_MAXSVRJOBID : PBS_MAXDEST) + 1,
               preq->rq_ind.rq_status.rq_id);

  if (rc) return rc;

  rc = decode_DIS_svrattrl(sock, &preq->rq_ind.rq_status.rq_attr);

  return rc;
  }
Пример #24
0
END_TEST


START_TEST(set_array_depend_holds_test)
  {
  batch_request *preq = (batch_request *)calloc(1, sizeof(batch_request));
  job_array     *pa = (job_array *)calloc(1, sizeof(job_array));

  strcpy(preq->rq_ind.rq_register.rq_child, job1);
  strcpy(preq->rq_ind.rq_register.rq_svr, host);

  CLEAR_HEAD(pa->ai_qs.deps);
  fail_unless(register_array_depend(pa, preq, JOB_DEPEND_TYPE_AFTEROKARRAY, 10) == PBSE_NONE);
  pa->ai_qs.num_successful = 12;
  fail_unless(set_array_depend_holds(pa) == true);
  }
Пример #25
0
int
shutdown_preempt_chkpt(job *pjob)
{
	struct batch_request *phold;
	attribute temp;
	void (*func)(struct work_task *);

	long *hold_val = NULL;
	long old_hold = 0;

	phold = alloc_br(PBS_BATCH_HoldJob);
	if (phold == NULL)
		return (PBSE_SYSTEM);

	temp.at_flags = ATR_VFLAG_SET;
	temp.at_type  = job_attr_def[(int)JOB_ATR_hold].at_type;
	temp.at_user_encoded = NULL;
	temp.at_priv_encoded = NULL;
	temp.at_val.at_long = HOLD_s;

	phold->rq_perm = ATR_DFLAG_MGRD | ATR_DFLAG_MGWR;
	(void)strcpy(phold->rq_ind.rq_hold.rq_orig.rq_objname, pjob->ji_qs.ji_jobid);
	CLEAR_HEAD(phold->rq_ind.rq_hold.rq_orig.rq_attr);
	if (job_attr_def[(int)JOB_ATR_hold].at_encode(&temp,
		&phold->rq_ind.rq_hold.rq_orig.rq_attr,
		job_attr_def[(int)JOB_ATR_hold].at_name,
		NULL,
		ATR_ENCODE_CLIENT, NULL) < 0)
		return (PBSE_SYSTEM);

	phold->rq_extra = pjob;
	func = post_chkpt;

	if (relay_to_mom(pjob, phold, func) == 0) {

		if (pjob->ji_qs.ji_state == JOB_STATE_TRANSIT)
			svr_setjobstate(pjob, JOB_STATE_RUNNING, JOB_SUBSTATE_RUNNING);
		pjob->ji_qs.ji_svrflags |= (JOB_SVFLG_HASRUN | JOB_SVFLG_CHKPT | JOB_SVFLG_HASHOLD);
		pjob->ji_modified = 1;
		(void)job_save(pjob, SAVEJOB_QUICK);
		return (0);
	} else {
		*hold_val = old_hold;	/* reset to the old value */
		return (-1);
	}
}
END_TEST




START_TEST(dup_depend_test)
  {
  struct depend      pdep;
  pbs_attribute      pattr;

  initialize_depend_attr(&pattr);
  memset(&pdep, 0, sizeof(pdep));
  CLEAR_HEAD(pdep.dp_jobs);

  make_dependjob(&pdep, job1, host);
  make_dependjob(&pdep, job2, host);
  fail_unless(dup_depend(&pattr, &pdep) == PBSE_NONE, "didn't work");
  }
Пример #27
0
job *svr_find_job(char *jobid, int get_subjob)
  {
  job *pjob = (job *)calloc(1, sizeof(job));
  strcpy(pjob->ji_qs.ji_jobid, jobid);
  CLEAR_HEAD(pjob->ji_wattr[JOB_ATR_depend].at_val.at_list);

  if (!strcmp(jobid, "1.napali"))
    {
    return(pjob);
    }
  else if (!strcmp(jobid, "2.napali"))
    {
    pjob->ji_qs.ji_state = JOB_STATE_COMPLETE;
    return(pjob);
    }
  else
    return(NULL);
  }
END_TEST




START_TEST(register_sync_test)
  {
  struct depend  pdep;

  memset(&pdep, 0, sizeof(pdep));
  CLEAR_HEAD(pdep.dp_jobs);

  fail_unless(register_sync(&pdep, job1, host, 1) == PBSE_NONE, "didn't register");
  fail_unless(register_sync(&pdep, job1, host, 1) == PBSE_NONE, "second register");
  pdep.dp_numexp = -10;
  fail_unless(register_sync(&pdep, job2, host, 1) == PBSE_IVALREQ, "too many registered");

  }
Пример #29
0
static int
status_que(pbs_queue *pque, struct batch_request *preq, pbs_list_head *pstathd)
{
	struct brp_status *pstat;
	svrattrl	  *pal;

	if ((preq->rq_perm & ATR_DFLAG_RDACC) == 0)
		return (PBSE_PERM);

	/* ok going to do status, update count and state counts from qu_qs */

	if (!svr_chk_history_conf()) {
		pque->qu_attr[(int)QA_ATR_TotalJobs].at_val.at_long = pque->qu_numjobs;
	} else {
		pque->qu_attr[(int)QA_ATR_TotalJobs].at_val.at_long = pque->qu_numjobs -
			(pque->qu_njstate[JOB_STATE_MOVED] + pque->qu_njstate[JOB_STATE_FINISHED]);
	}
	pque->qu_attr[(int)QA_ATR_TotalJobs].at_flags |= ATR_VFLAG_SET|ATR_VFLAG_MODCACHE;

	update_state_ct(&pque->qu_attr[(int)QA_ATR_JobsByState],
		pque->qu_njstate,
		pque->qu_jobstbuf);

	/* allocate status sub-structure and fill in header portion */

	pstat = (struct brp_status *)malloc(sizeof(struct brp_status));
	if (pstat == NULL)
		return (PBSE_SYSTEM);
	pstat->brp_objtype = MGR_OBJ_QUEUE;
	(void)strcpy(pstat->brp_objname, pque->qu_qs.qu_name);
	CLEAR_LINK(pstat->brp_stlink);
	CLEAR_HEAD(pstat->brp_attr);
	append_link(pstathd, &pstat->brp_stlink, pstat);

	/* add attributes to the status reply */

	bad = 0;
	pal = (svrattrl *)GET_NEXT(preq->rq_ind.rq_status.rq_attr);
	if (status_attrib(pal, que_attr_def, pque->qu_attr, QA_ATR_LAST,
		preq->rq_perm, &pstat->brp_attr, &bad))
		return (PBSE_NOATTR);

	return (0);
}
Пример #30
0
job *job_alloc(void)

  {
  job *pj;

  pj = (job *)calloc(1, sizeof(job));

  if (pj == NULL)
    {
    log_err(errno, "job_alloc", "no memory");

    return(NULL);
    }

  pj->ji_qs.qs_version = PBS_QS_VERSION;

  CLEAR_LINK(pj->ji_alljobs);
  CLEAR_LINK(pj->ji_jobque);

  CLEAR_HEAD(pj->ji_tasks);
  pj->ji_taskid = TM_NULL_TASK + 1;
  pj->ji_numnodes = 0;
  pj->ji_numvnod  = 0;
  pj->ji_hosts = NULL;
  pj->ji_vnods = NULL;
  pj->ji_resources = NULL;
  pj->ji_obit = TM_NULL_EVENT;
  pj->ji_preq = NULL;
  pj->ji_nodekill = TM_ERROR_NODE;
  pj->ji_flags = 0;
  pj->ji_globid = NULL;
  pj->ji_stdout = 0;
  pj->ji_stderr = 0;
  pj->ji_qs.ji_un.ji_momt.ji_exitstat = 0;
  pj->ji_job_is_being_rerun = 0;

  pj->ji_momhandle = -1;  /* mark mom connection invalid */

  /* set the working attributes to "unspecified" */
  job_init_wattr(pj);

  return(pj);
  }  /* END job_alloc() */