forked from altcloud/fence-virt
Add metadata support to fence_xvm/fence_virt
Signed-off-by: Lon Hohberger <lon@users.sourceforge.net>
This commit is contained in:
parent
f38f9327d8
commit
d19a48a6b8
5
TODO
5
TODO
@ -2,11 +2,6 @@ High Priority / Blockers for v1.0;
|
|||||||
|
|
||||||
* pacemaker backend
|
* pacemaker backend
|
||||||
|
|
||||||
* metadata function
|
|
||||||
|
|
||||||
* allow use of IPs w/ multicast listener as the "source"
|
|
||||||
VMs for management layer permissions mappings
|
|
||||||
|
|
||||||
Future Stuff:
|
Future Stuff:
|
||||||
|
|
||||||
* oVirt backend
|
* oVirt backend
|
||||||
|
@ -99,7 +99,8 @@ main(int argc, char **argv)
|
|||||||
|
|
||||||
/* Additional validation here */
|
/* Additional validation here */
|
||||||
if (!args.domain && (args.op != FENCE_DEVSTATUS &&
|
if (!args.domain && (args.op != FENCE_DEVSTATUS &&
|
||||||
args.op != FENCE_HOSTLIST)) {
|
args.op != FENCE_HOSTLIST &&
|
||||||
|
args.op != FENCE_METADATA)) {
|
||||||
printf("No domain specified!\n");
|
printf("No domain specified!\n");
|
||||||
args.flags |= F_ERR;
|
args.flags |= F_ERR;
|
||||||
}
|
}
|
||||||
@ -109,6 +110,11 @@ main(int argc, char **argv)
|
|||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (args.op == FENCE_METADATA) {
|
||||||
|
args_metadata(argv[0], my_options);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
switch(args.mode) {
|
switch(args.mode) {
|
||||||
case MODE_MULTICAST:
|
case MODE_MULTICAST:
|
||||||
ret = mcast_fence_virt(&args);
|
ret = mcast_fence_virt(&args);
|
||||||
|
@ -203,6 +203,8 @@ assign_op(fence_virt_args_t *args, struct arg_info *arg, char *value)
|
|||||||
args->op = FENCE_DEVSTATUS;
|
args->op = FENCE_DEVSTATUS;
|
||||||
} else if (!strcasecmp(value, "hostlist")) {
|
} else if (!strcasecmp(value, "hostlist")) {
|
||||||
args->op = FENCE_HOSTLIST;
|
args->op = FENCE_HOSTLIST;
|
||||||
|
} else if (!strcasecmp(value, "metadata")) {
|
||||||
|
args->op = FENCE_METADATA;
|
||||||
} else {
|
} else {
|
||||||
printf("Unsupported operation: %s\n", value);
|
printf("Unsupported operation: %s\n", value);
|
||||||
args->flags |= F_ERR;
|
args->flags |= F_ERR;
|
||||||
@ -301,108 +303,151 @@ assign_uri(fence_virt_args_t *args, struct arg_info *arg, char *value)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void
|
||||||
|
print_desc_xml(const char *desc)
|
||||||
|
{
|
||||||
|
const char *d;
|
||||||
|
|
||||||
|
for (d = desc; *d; d++) {
|
||||||
|
switch (*d) {
|
||||||
|
case '<':
|
||||||
|
printf("<");
|
||||||
|
break;
|
||||||
|
case '>':
|
||||||
|
printf(">");
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
printf("%c", *d);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/** ALL valid command line and stdin arguments for this fencing agent */
|
/** ALL valid command line and stdin arguments for this fencing agent */
|
||||||
static struct arg_info _arg_info[] = {
|
static struct arg_info _arg_info[] = {
|
||||||
{ '\xff', NULL, "agent",
|
{ '\xff', NULL, "agent",
|
||||||
|
0, "string", NULL,
|
||||||
"Not user serviceable",
|
"Not user serviceable",
|
||||||
NULL },
|
NULL },
|
||||||
|
|
||||||
{ '\xff', NULL, "self",
|
{ '\xff', NULL, "self",
|
||||||
|
0, "string", NULL,
|
||||||
"Not user serviceable",
|
"Not user serviceable",
|
||||||
NULL },
|
NULL },
|
||||||
|
|
||||||
{ '\xff', NULL, "nodename",
|
{ '\xff', NULL, "nodename",
|
||||||
|
0, "string", NULL,
|
||||||
"Not user serviceable",
|
"Not user serviceable",
|
||||||
NULL },
|
NULL },
|
||||||
|
|
||||||
{ 'd', "-d", "debug",
|
{ 'd', "-d", "debug",
|
||||||
|
0, "boolean", NULL,
|
||||||
"Specify (stdin) or increment (command line) debug level",
|
"Specify (stdin) or increment (command line) debug level",
|
||||||
assign_debug },
|
assign_debug },
|
||||||
|
|
||||||
{ 'i', "-i <family>", "ip_family",
|
{ 'i', "-i <family>", "ip_family",
|
||||||
|
0, "string", "auto",
|
||||||
"IP Family ([auto], ipv4, ipv6)",
|
"IP Family ([auto], ipv4, ipv6)",
|
||||||
assign_family },
|
assign_family },
|
||||||
|
|
||||||
{ 'a', "-a <address>", "multicast_address",
|
{ 'a', "-a <address>", "multicast_address",
|
||||||
|
0, "string", NULL,
|
||||||
"Multicast address (default=" IPV4_MCAST_DEFAULT " / " IPV6_MCAST_DEFAULT ")",
|
"Multicast address (default=" IPV4_MCAST_DEFAULT " / " IPV6_MCAST_DEFAULT ")",
|
||||||
assign_address },
|
assign_address },
|
||||||
|
|
||||||
{ 'A', "-A <address>", "channel_address",
|
{ 'A', "-A <address>", "channel_address",
|
||||||
|
0, "string", "10.0.2.179",
|
||||||
"VM Channel IP address (default=" DEFAULT_CHANNEL_IP ")",
|
"VM Channel IP address (default=" DEFAULT_CHANNEL_IP ")",
|
||||||
assign_channel_address },
|
assign_channel_address },
|
||||||
|
|
||||||
{ 'p', "-p <port>", "port",
|
{ 'p', "-p <port>", "port",
|
||||||
|
0, "string", "1229",
|
||||||
"Multicast or VMChannel IP port (default=1229)",
|
"Multicast or VMChannel IP port (default=1229)",
|
||||||
assign_port },
|
assign_port },
|
||||||
|
|
||||||
{ 'I', "-I <interface>", "interface",
|
{ 'I', "-I <interface>", "interface",
|
||||||
|
0, "string", NULL,
|
||||||
"Network interface name to listen on",
|
"Network interface name to listen on",
|
||||||
assign_interface },
|
assign_interface },
|
||||||
|
|
||||||
{ 'r', "-r <retrans>", "retrans",
|
{ 'r', "-r <retrans>", "retrans",
|
||||||
|
0, "string", "20",
|
||||||
"Multicast retransmit time (in 1/10sec; default=20)",
|
"Multicast retransmit time (in 1/10sec; default=20)",
|
||||||
assign_retrans },
|
assign_retrans },
|
||||||
|
|
||||||
{ 'c', "-c <hash>", "hash",
|
{ 'c', "-c <hash>", "hash",
|
||||||
|
0, "string", "sha256",
|
||||||
"Packet hash strength (none, sha1, [sha256], sha512)",
|
"Packet hash strength (none, sha1, [sha256], sha512)",
|
||||||
assign_hash },
|
assign_hash },
|
||||||
|
|
||||||
{ 'C', "-C <auth>", "auth",
|
{ 'C', "-C <auth>", "auth",
|
||||||
|
0, "string", "sha256",
|
||||||
"Authentication (none, sha1, [sha256], sha512)",
|
"Authentication (none, sha1, [sha256], sha512)",
|
||||||
assign_auth },
|
assign_auth },
|
||||||
|
|
||||||
{ 'k', "-k <file>", "key_file",
|
{ 'k', "-k <file>", "key_file",
|
||||||
|
0, "string", DEFAULT_KEY_FILE,
|
||||||
"Shared key file (default=" DEFAULT_KEY_FILE ")",
|
"Shared key file (default=" DEFAULT_KEY_FILE ")",
|
||||||
assign_key },
|
assign_key },
|
||||||
|
|
||||||
{ 'D', "-D <device>", "serial_device",
|
{ 'D', "-D <device>", "serial_device",
|
||||||
|
0, "string", NULL,
|
||||||
"Serial device (default=" DEFAULT_SERIAL_DEVICE ")",
|
"Serial device (default=" DEFAULT_SERIAL_DEVICE ")",
|
||||||
assign_device },
|
assign_device },
|
||||||
|
|
||||||
{ 'P', "-P <param>", "serial_params",
|
{ 'P', "-P <param>", "serial_params",
|
||||||
|
0, "string", DEFAULT_SERIAL_SPEED,
|
||||||
"Serial Parameters (default=" DEFAULT_SERIAL_SPEED ")",
|
"Serial Parameters (default=" DEFAULT_SERIAL_SPEED ")",
|
||||||
assign_params },
|
assign_params },
|
||||||
|
|
||||||
{ '\xff', NULL, "option",
|
{ '\xff', NULL, "option",
|
||||||
/* Deprecated */
|
/* Deprecated */
|
||||||
|
0, "string", "reboot",
|
||||||
"Fencing option (null, off, on, [reboot], status, hostlist, devstatus)",
|
"Fencing option (null, off, on, [reboot], status, hostlist, devstatus)",
|
||||||
assign_op },
|
assign_op },
|
||||||
|
|
||||||
{ 'o', "-o <operation>", "action",
|
{ 'o', "-o <operation>", "action",
|
||||||
|
0, "string", "reboot",
|
||||||
"Fencing action (null, off, on, [reboot], status, hostlist, devstatus)",
|
"Fencing action (null, off, on, [reboot], status, hostlist, devstatus)",
|
||||||
assign_op },
|
assign_op },
|
||||||
|
|
||||||
{ 'H', "-H <domain>", "domain",
|
{ 'H', "-H <domain>", "domain",
|
||||||
|
0, "string", NULL,
|
||||||
"Virtual Machine (domain name) to fence",
|
"Virtual Machine (domain name) to fence",
|
||||||
assign_domain },
|
assign_domain },
|
||||||
|
|
||||||
{ 'u', "-u", "use_uuid",
|
{ 'u', "-u", "use_uuid",
|
||||||
|
0, "string", "0",
|
||||||
"Treat <domain> as UUID instead of domain name. This is provided for compatibility with older fence_xvmd installations.",
|
"Treat <domain> as UUID instead of domain name. This is provided for compatibility with older fence_xvmd installations.",
|
||||||
assign_uuid_lookup },
|
assign_uuid_lookup },
|
||||||
|
|
||||||
{ 't', "-t <timeout>", "timeout",
|
{ 't', "-t <timeout>", "timeout",
|
||||||
|
0, "string", "30",
|
||||||
"Fencing timeout (in seconds; default=30)",
|
"Fencing timeout (in seconds; default=30)",
|
||||||
assign_timeout },
|
assign_timeout },
|
||||||
|
|
||||||
{ 'h', "-h", NULL,
|
{ 'h', "-h", NULL,
|
||||||
|
0, "boolean", "0",
|
||||||
"Help",
|
"Help",
|
||||||
assign_help },
|
assign_help },
|
||||||
|
|
||||||
{ '?', "-?", NULL,
|
{ '?', "-?", NULL,
|
||||||
|
0, "boolean", "0",
|
||||||
"Help (alternate)",
|
"Help (alternate)",
|
||||||
assign_help },
|
assign_help },
|
||||||
|
|
||||||
{ 'U', "-U", "uri",
|
{ 'U', "-U", "uri",
|
||||||
|
0, "boolean", "qemu:///system",
|
||||||
"URI for Hypervisor (default: auto detect)",
|
"URI for Hypervisor (default: auto detect)",
|
||||||
assign_uri },
|
assign_uri },
|
||||||
|
|
||||||
{ 'V', "-V", NULL,
|
{ 'V', "-V", NULL,
|
||||||
|
0, "boolean", "0",
|
||||||
"Display version and exit",
|
"Display version and exit",
|
||||||
assign_version },
|
assign_version },
|
||||||
|
|
||||||
/* Terminator */
|
/* Terminator */
|
||||||
{ 0, NULL, NULL, NULL, NULL }
|
{ 0, NULL, NULL, 0, NULL, NULL, NULL, NULL }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -588,6 +633,53 @@ args_usage(char *progname, const char *optstr, int print_stdin)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
args_metadata(char *progname, const char *optstr)
|
||||||
|
{
|
||||||
|
int x;
|
||||||
|
struct arg_info *arg;
|
||||||
|
|
||||||
|
printf("<?xml version=\"1.0\" ?>\n");
|
||||||
|
printf("<resource-agent name=\"%s\" shortdesc=\"Fence agent for virtual machines\">\n", basename(progname));
|
||||||
|
printf("<longdesc>%s is an I/O Fencing agent which can be used with"
|
||||||
|
"virtual machines.</longdesc>\n", basename(progname));
|
||||||
|
printf("<parameters>\n");
|
||||||
|
|
||||||
|
for (x = 0; x < strlen(optstr); x++) {
|
||||||
|
arg = find_arg_by_char(optstr[x]);
|
||||||
|
if (!arg)
|
||||||
|
continue;
|
||||||
|
if (!arg->stdin_opt)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
printf("\t<parameter name=\"%s\">\n",arg->stdin_opt);
|
||||||
|
printf("\t\t<getopt mixed=\"-%c\" />\n",arg->opt);
|
||||||
|
if (arg->default_value) {
|
||||||
|
printf("\t\t<content type=\"%s\" default=\"%s\" />\n", arg->content_type, arg->default_value);
|
||||||
|
} else {
|
||||||
|
printf("\t\t<content type=\"%s\" />\n", arg->content_type);
|
||||||
|
}
|
||||||
|
printf("\t\t<shortdesc lang=\"en\">");
|
||||||
|
print_desc_xml(arg->desc);
|
||||||
|
printf("</shortdesc>\n");
|
||||||
|
printf("\t</parameter>\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("</parameters>\n");
|
||||||
|
printf("<actions>\n");
|
||||||
|
printf("\t<action name=\"null\" />\n");
|
||||||
|
printf("\t<action name=\"on\" />\n");
|
||||||
|
printf("\t<action name=\"off\" />\n");
|
||||||
|
printf("\t<action name=\"reboot\" />\n");
|
||||||
|
printf("\t<action name=\"metadata\" />\n");
|
||||||
|
printf("\t<action name=\"status\" />\n");
|
||||||
|
printf("\t<action name=\"devstatus\" />\n");
|
||||||
|
printf("\t<action name=\"hostlist\" />\n");
|
||||||
|
printf("</actions>\n");
|
||||||
|
printf("</resource-agent>\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Remove leading and trailing whitespace from a line of text.
|
Remove leading and trailing whitespace from a line of text.
|
||||||
|
|
||||||
|
@ -69,6 +69,9 @@ struct arg_info {
|
|||||||
char opt;
|
char opt;
|
||||||
char *opt_desc;
|
char *opt_desc;
|
||||||
char *stdin_opt;
|
char *stdin_opt;
|
||||||
|
int eh;
|
||||||
|
char *content_type;
|
||||||
|
char *default_value;
|
||||||
char *desc;
|
char *desc;
|
||||||
void (*assign)(fence_virt_args_t *, struct arg_info *, char *);
|
void (*assign)(fence_virt_args_t *, struct arg_info *, char *);
|
||||||
};
|
};
|
||||||
@ -84,5 +87,6 @@ void args_get_stdin(const char *optstr, fence_virt_args_t *args);
|
|||||||
void args_get_ccs(const char *optstr, fence_virt_args_t *args);
|
void args_get_ccs(const char *optstr, fence_virt_args_t *args);
|
||||||
void args_usage(char *progname, const char *optstr, int print_stdin);
|
void args_usage(char *progname, const char *optstr, int print_stdin);
|
||||||
void args_print(fence_virt_args_t *args);
|
void args_print(fence_virt_args_t *args);
|
||||||
|
void args_metadata(char *progname, const char *optstr);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -56,7 +56,8 @@ typedef enum {
|
|||||||
FENCE_ON = 0x3, /* Turn the VM on */
|
FENCE_ON = 0x3, /* Turn the VM on */
|
||||||
FENCE_STATUS = 0x4, /* virtual machine status (off/on) */
|
FENCE_STATUS = 0x4, /* virtual machine status (off/on) */
|
||||||
FENCE_DEVSTATUS = 0x5, /* Status of the fencing device */
|
FENCE_DEVSTATUS = 0x5, /* Status of the fencing device */
|
||||||
FENCE_HOSTLIST = 0x6 /* List VMs controllable */
|
FENCE_HOSTLIST = 0x6, /* List VMs controllable */
|
||||||
|
FENCE_METADATA = 0x7
|
||||||
} fence_cmd_t;
|
} fence_cmd_t;
|
||||||
|
|
||||||
#define DEFAULT_TTL 4
|
#define DEFAULT_TTL 4
|
||||||
|
Loading…
Reference in New Issue
Block a user