CA Service Management

  • 1.  Insert task from action macro

    Posted Aug 03, 2018 08:37 AM

    Hello Community. 

     

    I have a question. is it possible to Insert task workflow classic from action macro?.

     

    For example.

     

    I want to execute a action macro in pending status task that It insert a workflow task in "35" sequence, "APP" task type , "technical expert" group and "testing done" description.

     

    is it possible?

     

    Thanks you very much

     

    Regards.



  • 2.  Re: Insert task from action macro

    Broadcom Employee
    Posted Aug 06, 2018 11:16 AM

    Hi Joaquin,

     

    I don't believe it is possible to insert an additional task in sequence via a macro. The sequence can't be dynamically modified once its already in a pending status.

     

    Thanks,

    Scott



  • 3.  Re: Insert task from action macro

    Posted Aug 07, 2018 02:10 AM

    Hi,

    for task inserting purposes i'm using one of my old scripts, hope it helps. It should automatically push sequences to make space for new tasks.

     

    //     FileName:
    //          z_new_wf_task.spl
    //
    //     ------------------------------------------------
    //                              2015-12-08                                   
    //                    z_new_wf_task.spl rebuild                    
    //     ------------------------------------------------
    //
    //     Package:
    //          int z_get_valid_seq
    //          void z_task_pusher
    //          void z_new_wf_task
    //
    //     ------------------------------------------------
    //
    //     Exapmle:
    //          wf::z_new_wf_task((int)chg.id,     // change id - required
    //                                   "APP",           // task type - requried
    //                                   // optional attrs as "key", "value"
    //                                   // goes here:
    //                                   "assignee", (uuid)"1234567890ABCDEF1234567890ABCDEF",
    //                                   "group", (uuid)"1234567890ABCDEF1234567890ABCDEF",
    //                                   "group_task", 1
    //                              );
    //

    int wf::z_get_valid_seq(int new_seq, int new_interval, int chgid) {
         int valid_seq, zcount, i;
         object seqobj;
         valid_seq = (int)(new_seq+new_interval);
         send_wait(0, top_object(), "call_attr", "wf", "sync_fetch", "STATIC", format("chg=%d AND sequence=%d", chgid, valid_seq), -1, 0);
         if (msg_error()) {
              for (i=0;i<msg_length();i++) {
                   logf(ERROR, "msg[%d]: %s", i, msg[i]);
              }
              return 0;
         }
         zcount = msg[1];
         if (zcount > 0) {
              int zseq, top_seq, low_seq;
              valid_seq = 0;
              low_seq = 0;
              top_seq = 0;
         
              send_wait(0, top_object(), "call_attr", "wf", "sync_fetch", "MLIST_STATIC", format("chg=%d AND status='WAIT'", chgid), -1, 0);
              if (msg_error()) {
                   for (i=0;i<msg_length();i++) {
                        logf(ERROR, "msg[%d]: %s", i, msg[i]);
                   }
                   return 0;
              }
              if (msg[1] > 0) {
                   send_wait(0, msg[0], "dob_by_index", "DEFAULT", 0, 0);
                   if (msg_error()) {
                        for (i=0;i<msg_length();i++) {
                             logf(ERROR, "msg[%d]: %s", i, msg[i]);
                        }
                        return 0;
                   }
                   seqobj = msg[0];
                   top_seq = seqobj.sequence - 1;
              }
              send_wait(0, top_object(), "call_attr", "wf", "sync_fetch", "MLIST_STATIC", format("chg=%d AND status!='WAIT'", chgid), -1, 0);
              if (msg_error()) {
                   for (i=0;i<msg_length();i++) {
                        logf(ERROR, "msg[%d]: %s", i, msg[i]);
                   }
                   return 0;
              }
              if (msg[1] > 0) {
                   send_wait(0, msg[0], "dob_by_index", "DEFAULT", (int)(msg[1]-1), (int)(msg[1]-1));
                   if (msg_error()) {
                        for (i=0;i<msg_length();i++) {
                             logf(ERROR, "msg[%d]: %s", i, msg[i]);
                        }
                        return 0;
                   }
                   seqobj = msg[0];
                   low_seq = seqobj.sequence + 1;
              }
              
              if ( (low_seq > 0) && (top_seq > 0) ) {
                   valid_seq = ((low_seq + top_seq) / 2);
                   if (!(wf::check_for_seq(chg.id, valid_seq))) {
                        valid_seq = 0;
                   } else {
                        logf(SIGNIFICANT, "valid_seq = %d", valid_seq);
                   }
              } else if ( (low_seq > 0) && (top_seq == 0) ) {
                   valid_seq = low_seq + 27;
                   if (!(wf::check_for_seq(chg.id, valid_seq))) {
                        valid_seq = 0;
                   } else {
                        logf(SIGNIFICANT, "valid_seq = %d", valid_seq);
                   }
              } else if ( (low_seq == 0) && (top_seq > 0) ) {
                   valid_seq = top_seq + 27;
                   if (!(wf::check_for_seq(chg.id, valid_seq))) {
                        valid_seq = 0;
                   } else {
                        logf(SIGNIFICANT, "valid_seq = %d", valid_seq);
                   }
              }
              
              if (valid_seq == 0) {
                   for (zseq=top_seq;zseq>low_seq;zseq--) {
                        if (valid_seq == 0) {
                             if (wf::check_for_seq(chg.id, zseq)) {
                                  valid_seq = zseq;
                             }
                        }
                   }
              }
         }
         logf(SIGNIFICANT, "%s > valid_seq = %d", persistent_id, valid_seq);
         return valid_seq;
    }

    wf::z_task_pusher(int chgid, int push, ...) {
         object gl, wfobj, zfound;
         int zcount, i, curseq;
         
         if (argc > 2) {
              curseq = argv[2];
         }

         send_wait(0, top_object(), "get_co_group");
         if (msg_error()) {
              for (i=0;i<msg_length();i++) {
                   logf(ERROR, "msg[%d]: %s", i, msg[i]);
              }
              return;
         }
         gl = msg[0];
         send_wait(0, top_object(), "call_attr", "wf", "sync_fetch", "MLIST_STATIC", format("chg=%d AND status='WAIT' AND sequence != %d", chgid, curseq), -1, 0);
         if (msg_error()) {
              for (i=0;i<msg_length();i++) {
                   logf(ERROR, "msg[%d]: %s", i, msg[i]);
              }
              return;
         }
         zcount = msg[1];
         if (zcount > 0) {
              zfound = msg[0];
              for (i = 0; i < zcount; i++) {
                   send_wait(0, zfound, "dob_by_index", "DEFAULT", (int)(zcount-i-1), (int)(zcount-i-1));
                   if (msg_error()) {
                        for (i=0;i<msg_length();i++) {
                             logf(ERROR, "msg[%d]: %s", i, msg[i]);
                        }
                   } else {
                        wfobj = msg[0];
                        logf(SIGNIFICANT, "%s > trying to push: %s @ %s", persistent_id, wfobj.task, wfobj.sequence);
                        if (!macro::z_checkout(gl, wfobj, 3, 3)) {
                             send_wait(0, wfobj, "call_attr", "sequence", "set_val", (int)(wfobj.sequence+push), "SURE_SET");
                             if (macro::z_checkin(gl, 3, 3)) {
                                  send_wait(0, gl, "uncheck");
                             }
                        }
                   }
              }
         }
    }

    string wf::z_new_wf_task(int new_chg_id, string new_type, ...) {
         logf(SIGNIFICANT,  "Inserting task. Change: %d. ARGC: %d", new_chg_id, argc);
         object gl, wfobj, zfound, pastobj, wftplobj;
         int zcount, i, new_interval, valid_seq, wftpl_id, new_seq;
         string wc;

         send_wait(0, top_object(), "get_co_group");
         if (msg_error()) {
              for (i=0;i<msg_length();i++) {
                   logf(ERROR, "msg[%d]: %s", i, msg[i]);
              }
              return;
         }
         gl = msg[0];

         send_wait(0, top_object(), "call_attr", "wf", "get_new_dob", NULL, NULL, gl);
         if (msg_error()) {
              for (i=0;i<msg_length();i++) {
                   logf(ERROR, "msg[%d]: %s", i, msg[i]);
              }
              return;
         }
         wfobj = msg[0];

         new_seq = 0;
         new_interval = 15;
         wftpl_id = 0;

         send_wait(0, wfobj, "call_attr", "chg", "set_val", new_chg_id, "SURE_SET");
         send_wait(0, wfobj, "call_attr", "task", "set_val", new_type, "SURE_SET");
         send_wait(0, wfobj, "call_attr", "object_type", "set_val", "chg", "SURE_SET");
         for (i=2;i<argc-1;i=i+2) {
              logf(SIGNIFICANT, "%s = '%s'", argv[i], argv[i+1]);
              if ( ((string)argv[i] == "sequence") || ((string)argv[i] == "new_seq") ) {
                   new_seq = argv[i+1];
              } else if ((string)argv[i] == "new_interval") {
                   new_interval = argv[i+1];
              } else if ((string)argv[i] == "wftpl") {
                   wftpl_id = argv[i+1];
              } else {
                   send_wait(0, wfobj, "call_attr", argv[i], "set_val", argv[i+1], "SURE_SET");
              }
         }
         if (wftpl_id > 0) {
              send_wait(0, top_object(), "call_attr", "wftpl", "dob_by_persid", 0, format("wftpl:%d", wftpl_id));
              if (!msg_error()) {
                   logf(SIGNIFICANT, "WFTPLOBJ > %d", wftpl_id);
                   wftplobj = msg[0];
              }
         }
         if (is_null(wftplobj)) {
              send_wait(0, top_object(), "call_attr", "wf", "sync_fetch", "MLIST_STATIC", format("chg=%d AND task='%s' AND z_dop_wf=0 AND creator is NULL", new_chg_id, new_type), -1, 0);
              zcount = msg[1];
              logf(SIGNIFICANT, "PASTOBJ > [count:%d] chg=%d AND task='%s' AND z_dop_wf=0 AND creator is NULL", zcount, new_chg_id, new_type);
              if (zcount > 0) {
                   zfound = msg[0];
                   send_wait(0, zfound, "dob_by_index", "DEFAULT", (int)(zcount-1), (int)(zcount-1));
                   pastobj = msg[0];
              }
         }
         if (!is_null(wftplobj)) {
              send_wait(0, wfobj, "call_attr", "wf_template", "set_val", wftplobj.id, "SURE_SET");
              if (is_null(wfobj.group)) {
                   send_wait(0, wfobj, "call_attr", "group", "set_val", wftplobj.group, "SURE_SET");
              }
              if (is_null(wfobj.assignee)) {
                   send_wait(0, wfobj, "call_attr", "assignee", "set_val", wftplobj.assignee, "SURE_SET");
              }
         } else if (!is_null(pastobj)) {
              send_wait(0, wfobj, "call_attr", "wf_template", "set_val", pastobj.wf_template, "SURE_SET");
              if (is_null(wfobj.group)) {
                   send_wait(0, wfobj, "call_attr", "group", "set_val", pastobj.group, "SURE_SET");
              }
              if (is_null(wfobj.assignee)) {
                   send_wait(0, wfobj, "call_attr", "assignee", "set_val", pastobj.assignee, "SURE_SET");
              }
         }
         if (wfobj.assignee.delete_flag == 1) {
              send_wait(0, wfobj, "call_attr", "comments", "set_val", "Deleted assignee detected!", "SURE_SET");
              send_wait(0, wfobj, "call_attr", "assignee", "set_val", NULL, "SURE_SET");
         }
         wf::z_task_pusher(new_chg_id, 30, new_seq);
         valid_seq = wf::z_get_valid_seq(new_seq, new_interval, new_chg_id);
         if (valid_seq == 0) {
              logf(SIGNIFICANT, "%s > Invalid sequence", chg.persistent_id);
              set_return_data(format("Invalid sequence. Task:%d. Change:%d", id, chg.id));
              set_error(1);
              return;
         } else {
              send_wait(0, wfobj, "call_attr", "sequence", "set_val", valid_seq, "SURE_SET");
         }

         logf(SIGNIFICANT, "new_assignee = '%s' new_group = '%s' new_wftpl = '%s'", wfobj.assignee, wfobj.group, wfobj.wf_template);
         send_wait(0, gl, "checkin");
         if (msg_error()) {
              for (i=0;i<msg_length();i++) {
                   logf(ERROR, "msg[%d]: %s", i, msg[i]);
              }
              send_wait(0, gl, "uncheck");
              return;
         }

         return wfobj.persistent_id;
    }