int main (int argc, char *argv[]) { flux_t *h; flux_msg_t *msg; const char *topic; const char *reason; int flags; plan (NO_PLAN); if (!(h = loopback_create (0))) BAIL_OUT ("loopback_create failed"); /* Send request */ ok (flux_panic (h, 0, 0, "fubar") == 0, "flux_panic works"); /* Receive request on the loopback */ msg = flux_recv (h, FLUX_MATCH_ANY, 0); ok (msg != NULL, "flux_recv received message on loop"); ok (flux_request_unpack (msg, &topic, "{s:s s:i}", "reason", &reason, "flags", &flags) == 0, "flux_request_unpack worked on panic request"); ok (topic != NULL && !strcmp (topic, "cmb.panic"), "topic string is correct"); ok (!strcmp (reason, "fubar"), "reason is correct"); ok (flags == 0, "flags is correct"); flux_msg_destroy (msg); /* invalid arguments */ errno = 0; ok (flux_panic (NULL, 0, 0, "foo") < 0 && errno == EINVAL, "flux_panic h=NULL fails with EINVAL"); errno = 0; ok (flux_panic (h, 0, 1, "foo") < 0 && errno == EINVAL, "flux_panic flags=1 fails with EINVAL"); errno = 0; ok (flux_panic (h, 0, 0, NULL) < 0 && errno == EINVAL, "flux_panic reason=NULL fails with EINVAL"); flux_close (h); done_testing(); return (0); }
int main (int argc, char *argv[]) { flux_t h; int ch; uint32_t rank = FLUX_NODEID_ANY; /* local */ char *cmd; int e; log_init ("flux-comms"); while ((ch = getopt_long (argc, argv, OPTIONS, longopts, NULL)) != -1) { switch (ch) { case 'h': /* --help */ usage (); break; case 'r': /* --rank N */ rank = strtoul (optarg, NULL, 10); break; default: usage (); break; } } if (optind == argc) usage (); cmd = argv[optind++]; if (rank != FLUX_NODEID_ANY && (!strcmp (cmd, "recover-all") || !strcmp (cmd, "info"))) usage (); if (!(h = flux_open (NULL, 0))) log_err_exit ("flux_open"); if (!strcmp (cmd, "reparent")) { if (optind != argc - 1) usage (); if (flux_reparent (h, rank, argv[optind]) < 0) log_err_exit ("flux_reparent"); } else if (!strcmp (cmd, "idle")) { if (optind != argc) usage (); char *peers; if (!(peers = flux_lspeer (h, rank))) log_err_exit ("flux_peer"); printf ("%s\n", peers); free (peers); } else if (!strcmp (cmd, "panic")) { char *msg = NULL; size_t len = 0; if (optind < argc) { if ((e = argz_create (argv + optind, &msg, &len)) != 0) log_errn_exit (e, "argz_create"); argz_stringify (msg, len, ' '); } flux_panic (h, rank, msg); if (msg) free (msg); } else if (!strcmp (cmd, "failover")) { if (optind != argc) usage (); if (flux_failover (h, rank) < 0) log_err_exit ("flux_failover"); } else if (!strcmp (cmd, "recover")) { if (optind != argc) usage (); if (flux_recover (h, rank) < 0) log_err_exit ("flux_recover"); } else if (!strcmp (cmd, "recover-all")) { if (optind != argc) usage (); if (flux_recover_all (h) < 0) log_err_exit ("flux_recover_all"); } else if (!strcmp (cmd, "info")) { int arity; uint32_t rank, size; const char *s; if (flux_get_rank (h, &rank) < 0 || flux_get_size (h, &size) < 0) log_err_exit ("flux_get_rank/size"); if (!(s = flux_attr_get (h, "tbon.arity", NULL))) log_err_exit ("flux_attr_get tbon.arity"); arity = strtoul (s, NULL, 10); printf ("rank=%d\n", rank); printf ("size=%d\n", size); printf ("arity=%d\n", arity); } else usage (); flux_close (h); log_fini (); return 0; }