[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH V5 29/32] xl: use "libxl-json" format
Before this change, xl stores domain configuration in "xl" format, which is in fact a verbatim copy of user supplied domain config. As now libxl is able to handle domain configuration with "libxl-json" format, use that wherever possible. Tests done so far (xl.{new,old} denotes xl with{,out} "xl_json" support): 1. xl.new create then xl.new save, hexdump saved file: domain config saved in JSON format 2. xl.new create, xl.new save then xl.old restore: failed on mandatory flag check 3. xl.new create, xl.new save then xl.new restore: succeeded 4. xl.old create, xl.old save then xl.new restore: succeeded 5. xl.new create then local migrate, receiving end xl.new: succeeded 6. xl.old create then local migrate, receiving end xl.new: succeeded Signed-off-by: Wei Liu <wei.liu2@xxxxxxxxxx> --- tools/libxl/xl_cmdimpl.c | 141 ++++++++++++++++++++++++++++------------------ 1 file changed, 87 insertions(+), 54 deletions(-) diff --git a/tools/libxl/xl_cmdimpl.c b/tools/libxl/xl_cmdimpl.c index a6dd437..db1ba18 100644 --- a/tools/libxl/xl_cmdimpl.c +++ b/tools/libxl/xl_cmdimpl.c @@ -107,6 +107,8 @@ static const char migrate_report[]= * from target to source */ +#define XL_MANDATORY_FLAG_JSON (1U << 0) /* config data is in JSON format */ +#define XL_MANDATORY_FLAG_ALL (XL_MANDATORY_FLAG_JSON) struct save_file_header { char magic[32]; /* savefileheader_magic */ /* All uint32_ts are in domain's byte order. */ @@ -1706,30 +1708,11 @@ skip_vfb: xlu_cfg_destroy(config); } -static void reload_domain_config(uint32_t domid, - uint8_t **config_data, int *config_len) -{ - uint8_t *t_data; - int ret, t_len; - - ret = libxl_userdata_retrieve(ctx, domid, "xl", &t_data, &t_len); - if (ret) { - LOG("failed to retrieve guest configuration (rc=%d). " - "reusing old configuration", ret); - return; - } - - free(*config_data); - *config_data = t_data; - *config_len = t_len; -} - /* Returns 1 if domain should be restarted, * 2 if domain should be renamed then restarted, or 0 * Can update r_domid if domain is destroyed etc */ static int handle_domain_death(uint32_t *r_domid, libxl_event *event, - uint8_t **config_data, int *config_len, libxl_domain_config *d_config) { @@ -1787,13 +1770,10 @@ static int handle_domain_death(uint32_t *r_domid, break; case LIBXL_ACTION_ON_SHUTDOWN_RESTART_RENAME: - reload_domain_config(*r_domid, config_data, config_len); restart = 2; break; case LIBXL_ACTION_ON_SHUTDOWN_RESTART: - reload_domain_config(*r_domid, config_data, config_len); - restart = 1; /* fall-through */ case LIBXL_ACTION_ON_SHUTDOWN_DESTROY: @@ -1990,6 +1970,7 @@ static uint32_t create_domain(struct domain_create *dom_info) const char *config_source = NULL; const char *restore_source = NULL; int migrate_fd = dom_info->migrate_fd; + bool config_in_json; int i; int need_daemon = daemonize; @@ -2044,7 +2025,7 @@ static uint32_t create_domain(struct domain_create *dom_info) restore_source, hdr.mandatory_flags, hdr.optional_flags, hdr.optional_data_len); - badflags = hdr.mandatory_flags & ~( 0 /* none understood yet */ ); + badflags = hdr.mandatory_flags & ~XL_MANDATORY_FLAG_ALL; if (badflags) { fprintf(stderr, "Savefile has mandatory flag(s) 0x%"PRIx32" " "which are not supported; need newer xl\n", @@ -2072,7 +2053,9 @@ static uint32_t create_domain(struct domain_create *dom_info) optdata_here = optdata_begin; if (OPTDATA_LEFT) { - fprintf(stderr, " Savefile contains xl domain config\n"); + fprintf(stderr, " Savefile contains xl domain config%s\n", + !!(hdr.mandatory_flags & XL_MANDATORY_FLAG_JSON) + ? " in JSON format" : ""); WITH_OPTDATA(4, { memcpy(u32buf.b, optdata_here, 4); config_len = u32buf.u32; @@ -2112,6 +2095,7 @@ static uint32_t create_domain(struct domain_create *dom_info) extra_config); } config_source=config_file; + config_in_json = false; } else { if (!config_data) { fprintf(stderr, "Config file not specified and" @@ -2119,12 +2103,23 @@ static uint32_t create_domain(struct domain_create *dom_info) return ERROR_INVAL; } config_source = "<saved>"; + config_in_json = !!(hdr.mandatory_flags & XL_MANDATORY_FLAG_JSON); } if (!dom_info->quiet) printf("Parsing config from %s\n", config_source); - parse_config_data(config_source, config_data, config_len, &d_config); + if (config_in_json) { + char *config_c = config_data; + if (config_c[config_len-1] != '\0') { + config_c = xrealloc(config_c, config_len + 1); + config_c[config_len] = '\0'; + } + libxl_domain_config_from_json(ctx, &d_config, + (const char *)config_data); + } else { + parse_config_data(config_source, config_data, config_len, &d_config); + } if (migrate_fd >= 0) { if (d_config.c_info.name) { @@ -2192,12 +2187,35 @@ start: if ( ret ) goto error_out; - ret = libxl_userdata_store(ctx, domid, "xl", - config_data, config_len); - if (ret) { - perror("cannot save config file"); - ret = ERROR_FAIL; - goto error_out; + /* If we're doing migration, the domain name was appended with + * "--incoming" a few lines above. So we need to remove that + * suffix in the stored configuration. + */ + if (migrate_fd >= 0) { + libxl_domain_config d; + int xlen = strlen("--incoming"); + int orig_len; + + ret = libxl_load_domain_configuration(ctx, domid, &d); + if (ret) { + perror("cannot load config data"); + ret = ERROR_FAIL; + goto error_out; + } + + orig_len = strlen(d.c_info.name); + d.c_info.name = xrealloc(d.c_info.name, orig_len - xlen); + d.c_info.name[orig_len - xlen] = 0; + + ret = libxl_store_domain_configuration(ctx, domid, &d); + if (ret) { + perror("cannot store config data"); + libxl_domain_config_dispose(&d); + ret = ERROR_FAIL; + goto error_out; + } + + libxl_domain_config_dispose(&d); } release_lock(); @@ -2256,9 +2274,7 @@ start: LOG("Domain %d has shut down, reason code %d 0x%x", domid, event->u.domain_shutdown.shutdown_reason, event->u.domain_shutdown.shutdown_reason); - switch (handle_domain_death(&domid, event, - (uint8_t **)&config_data, &config_len, - &d_config)) { + switch (handle_domain_death(&domid, event, &d_config)) { case 2: if (!preserve_domain(&domid, event, &d_config)) { /* If we fail then exit leaving the old domain in place. */ @@ -2295,11 +2311,14 @@ start: d_config.c_info.name = strdup(common_domname); } - /* Reparse the configuration in case it has changed */ + /* Load latest domain configuration */ libxl_domain_config_dispose(&d_config); - libxl_domain_config_init(&d_config); - parse_config_data(config_source, config_data, config_len, - &d_config); + ret = libxl_load_domain_configuration(ctx, domid, &d_config); + if (ret) { + LOG("Failed to load domain configuration (rc=%d)", ret); + ret = -1; + goto out; + } /* * XXX FIXME: If this sleep is not there then domain @@ -3079,9 +3098,7 @@ static void list_domains_details(const libxl_dominfo *info, int nb_domain) { libxl_domain_config d_config; - char *config_source; - uint8_t *data; - int i, len, rc; + int i, rc; yajl_gen hand = NULL; yajl_gen_status s; @@ -3102,22 +3119,18 @@ static void list_domains_details(const libxl_dominfo *info, int nb_domain) s = yajl_gen_status_ok; for (i = 0; i < nb_domain; i++) { + libxl_domain_config_init(&d_config); /* no detailed info available on dom0 */ if (info[i].domid == 0) continue; - rc = libxl_userdata_retrieve(ctx, info[i].domid, "xl", &data, &len); + rc = libxl_load_domain_configuration(ctx, info[i].domid, &d_config); if (rc) continue; - CHK_SYSCALL(asprintf(&config_source, "<domid %d data>", info[i].domid)); - libxl_domain_config_init(&d_config); - parse_config_data(config_source, (char *)data, len, &d_config); if (default_output_format == OUTPUT_FORMAT_JSON) s = printf_info_one_json(hand, info[i].domid, &d_config); else printf_info_sexp(info[i].domid, &d_config); libxl_domain_config_dispose(&d_config); - free(data); - free(config_source); if (s != yajl_gen_status_ok) goto out; } @@ -3302,22 +3315,41 @@ static void save_domain_core_begin(uint32_t domid, int *config_len_r) { int rc; + libxl_domain_config d_config; + char *config_c = 0; /* configuration file in optional data: */ + libxl_domain_config_init(&d_config); + if (override_config_file) { void *config_v = 0; rc = libxl_read_file_contents(ctx, override_config_file, &config_v, config_len_r); - *config_data_r = config_v; + if (rc) { + fprintf(stderr, "unable to read overridden config file\n"); + exit(2); + } + parse_config_data(override_config_file, config_v, *config_len_r, + &d_config); + free(config_v); } else { - rc = libxl_userdata_retrieve(ctx, domid, "xl", - config_data_r, config_len_r); + rc = libxl_load_domain_configuration(ctx, domid, &d_config); + if (rc) { + fprintf(stderr, "unable to load domain configuration\n"); + exit(2); + } } - if (rc) { - fputs("Unable to get config file\n",stderr); + + config_c = libxl_domain_config_to_json(ctx, &d_config); + if (!config_c) { + fprintf(stderr, "unable to parse overridden config file\n"); exit(2); } + *config_data_r = (uint8_t *)config_c; + *config_len_r = strlen(config_c); + + libxl_domain_config_dispose(&d_config); } static void save_domain_core_writeconfig(int fd, const char *source, @@ -3345,6 +3377,8 @@ static void save_domain_core_writeconfig(int fd, const char *source, u32buf.u32 = config_len; ADD_OPTDATA(u32buf.b, 4); ADD_OPTDATA(config_data, config_len); + if (config_len) + hdr.mandatory_flags |= XL_MANDATORY_FLAG_JSON; /* that's the optional data */ @@ -4418,8 +4452,7 @@ int main_config_update(int argc, char **argv) if (!dryrun_only) { fprintf(stderr, "setting dom%d configuration\n", domid); - rc = libxl_userdata_store(ctx, domid, "xl", - config_data, config_len); + rc = libxl_store_domain_configuration(ctx, domid, &d_config); if (rc) { fprintf(stderr, "failed to update configuration\n"); exit(1); -- 1.7.10.4 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |