diff options
-rw-r--r-- | cli/src/cli-xml-output.c | 281 | ||||
-rw-r--r-- | cli/src/cli.h | 13 |
2 files changed, 266 insertions, 28 deletions
diff --git a/cli/src/cli-xml-output.c b/cli/src/cli-xml-output.c index 3ad7250397b..6167adbc73c 100644 --- a/cli/src/cli-xml-output.c +++ b/cli/src/cli-xml-output.c @@ -2559,6 +2559,27 @@ cli_xml_output_vol_info (cli_local_t *local, dict_t *dict) int j = 1; char *caps = NULL; int k __attribute__((unused)) = 0; + int index = 1; + int vol_type = -1; + int tier_vol_type = 0; + /*hot disperse count, redundancy count and dist count are always + * zero so need for them to be included in the array.*/ + int hot_disperse_count = 0; + int hot_dist_count = 0; + int hot_redundancy_count = 0; + values c = 0; + char *keys[30] = { + [COLD_BRICK_COUNT] = "volume%d.cold_brick_count", + [COLD_TYPE] = "volume%d.cold_type", + [COLD_DIST_COUNT] = "volume%d.cold_dist_count", + [COLD_REPLICA_COUNT] = "volume%d.cold_replica_count", + [COLD_DISPERSE_COUNT] = "volume%d.cold_disperse_count", + [COLD_REDUNDANCY_COUNT] = "volume%d.cold_redundancy_count", + [HOT_BRICK_COUNT] = "volume%d.hot_brick_count", + [HOT_TYPE] = "volume%d.hot_type", + [HOT_REPLICA_COUNT] = "volume%d.hot_replica_count"}; + int value[9] = {}; + ret = dict_get_int32 (dict, "count", &count); if (ret) @@ -2758,46 +2779,250 @@ cli_xml_output_vol_info (cli_local_t *local, dict_t *dict) ret = xmlTextWriterStartElement (local->writer, (xmlChar *)"bricks"); XML_RET_CHECK_AND_GOTO (ret, out); - while (j <= brick_count) { - ret = xmlTextWriterStartElement - (local->writer, (xmlChar *)"brick"); - XML_RET_CHECK_AND_GOTO (ret, out); - memset (key, 0, sizeof (key)); - snprintf (key, sizeof (key), "volume%d.brick%d.uuid", - i, j); - ret = dict_get_str (dict, key, &uuid); - if (ret) - goto out; - ret = xmlTextWriterWriteFormatAttribute - (local->writer, (xmlChar *)"uuid", "%s", - uuid); - XML_RET_CHECK_AND_GOTO (ret, out); + if (type == GF_CLUSTER_TYPE_TIER) { + /*the values for hot stripe, disperse and redundancy + * should not be looped in here as they are zero + * always */ + for (c = COLD_BRICK_COUNT; c < MAX; c++) { - memset (key, 0, sizeof (key)); - snprintf (key, sizeof (key), "volume%d.brick%d", i, j); - ret = dict_get_str (dict, key, &brick); - if (ret) - goto out; - ret = xmlTextWriterWriteFormatString - (local->writer, "%s", brick); + memset (key, 0, sizeof (key)); + snprintf (key, 256, keys[c], i); + ret = dict_get_int32 (dict, key, &value[c]); + if (ret) + goto out; + } + + tier_vol_type = value[HOT_TYPE]; + value[hot_dist_count] = (value[HOT_REPLICA_COUNT] ? + value[HOT_REPLICA_COUNT] : 1); + if ((value[HOT_TYPE] != GF_CLUSTER_TYPE_TIER) && + (value[HOT_TYPE] > 0) && + (value[hot_dist_count] < value[HOT_BRICK_COUNT])) + tier_vol_type = value[HOT_TYPE] + + GF_CLUSTER_TYPE_MAX - 1; + + ret = xmlTextWriterStartElement (local->writer, + (xmlChar *) + "hotBricks"); XML_RET_CHECK_AND_GOTO (ret, out); ret = xmlTextWriterWriteFormatElement - (local->writer, (xmlChar *)"name", "%s", - brick); + (local->writer, (xmlChar *)"hotBrickType", + "%s", cli_vol_type_str[tier_vol_type]); + + if (value[HOT_TYPE] == GF_CLUSTER_TYPE_NONE || + value[HOT_TYPE] == + GF_CLUSTER_TYPE_TIER) { + ret = xmlTextWriterWriteFormatElement + (local->writer, + (xmlChar *)"numberOfBricks", + "%d", value[HOT_BRICK_COUNT]); + XML_RET_CHECK_AND_GOTO (ret, out); + } else if (value[HOT_TYPE] == + GF_CLUSTER_TYPE_DISPERSE) { + ret = xmlTextWriterWriteFormatElement + (local->writer, + (xmlChar *)"numberOfBricks", + "%d x (%d + %d) = %d", + (value[HOT_BRICK_COUNT] / + value[hot_dist_count]), + hot_disperse_count - + hot_redundancy_count, + hot_redundancy_count, + value[HOT_BRICK_COUNT]); + } else { + ret = xmlTextWriterWriteFormatElement + (local->writer, + (xmlChar *)"numberOfBricks", + "%d x %d = %d", + (value[HOT_BRICK_COUNT] / + value[hot_dist_count]), + value[hot_dist_count], + value[HOT_BRICK_COUNT]); + } + + while (index <= value[HOT_BRICK_COUNT]) { + snprintf (key, 1024, "volume%d.brick%d", i, + index); + ret = dict_get_str (dict, key, &brick); + if (ret) + goto out; + + ret = xmlTextWriterStartElement + (local->writer, (xmlChar *)"brick"); + XML_RET_CHECK_AND_GOTO (ret, out); + + memset (key, 0, sizeof (key)); + snprintf (key, sizeof (key), + "volume%d.brick%d.uuid", i, j); + ret = dict_get_str (dict, key, &uuid); + if (ret) + goto out; + ret = xmlTextWriterWriteFormatAttribute + (local->writer, (xmlChar *)"uuid", "%s", + uuid); + XML_RET_CHECK_AND_GOTO (ret, out); + + ret = xmlTextWriterWriteFormatString + (local->writer, "%s", brick); + XML_RET_CHECK_AND_GOTO (ret, out); + + ret = xmlTextWriterWriteFormatElement + (local->writer, (xmlChar *)"name", "%s", + brick); + XML_RET_CHECK_AND_GOTO (ret, out); + + ret = xmlTextWriterWriteFormatElement + (local->writer, (xmlChar *)"hostUuid", + "%s", uuid); + XML_RET_CHECK_AND_GOTO (ret, out); + + ret = xmlTextWriterEndElement (local->writer); + XML_RET_CHECK_AND_GOTO (ret, out); + + index++; + } + ret = xmlTextWriterEndElement (local->writer); XML_RET_CHECK_AND_GOTO (ret, out); - ret = xmlTextWriterWriteFormatElement - (local->writer, (xmlChar *)"hostUuid", "%s", - uuid); + tier_vol_type = value[COLD_TYPE]; + if ((value[COLD_TYPE] != GF_CLUSTER_TYPE_TIER) && + (value[COLD_TYPE] > 0) && + (value[COLD_DIST_COUNT] < value[COLD_BRICK_COUNT])) + tier_vol_type = value[COLD_TYPE] + + GF_CLUSTER_TYPE_MAX - 1; + + + ret = xmlTextWriterStartElement (local->writer, + (xmlChar *) + "coldBricks"); XML_RET_CHECK_AND_GOTO (ret, out); - /* </brick> */ + ret = xmlTextWriterWriteFormatElement + (local->writer, (xmlChar *)"coldBrickType", + "%s", cli_vol_type_str[tier_vol_type]); + + if (value[COLD_TYPE] == GF_CLUSTER_TYPE_NONE || + value[COLD_TYPE] == + GF_CLUSTER_TYPE_TIER) { + ret = xmlTextWriterWriteFormatElement + (local->writer, + (xmlChar *)"numberOfBricks", + "%d", value[COLD_BRICK_COUNT]); + XML_RET_CHECK_AND_GOTO (ret, out); + } else if (value[COLD_TYPE] == + GF_CLUSTER_TYPE_DISPERSE) { + ret = xmlTextWriterWriteFormatElement + (local->writer, + (xmlChar *)"numberOfBricks", + " %d x (%d + %d) = %d", + (value[COLD_BRICK_COUNT] / + value[COLD_DIST_COUNT]), + value[COLD_DISPERSE_COUNT] - + value[COLD_REDUNDANCY_COUNT], + value[COLD_REDUNDANCY_COUNT], + value[COLD_BRICK_COUNT]); + } else { + ret = xmlTextWriterWriteFormatElement + (local->writer, + (xmlChar *)"numberOfBricks", + "%d x %d = %d", + (value[COLD_BRICK_COUNT] / + value[COLD_DIST_COUNT]), + value[COLD_DIST_COUNT], + value[COLD_BRICK_COUNT]); + } + + index = value[HOT_BRICK_COUNT] + 1; + + while (index <= brick_count) { + snprintf (key, 1024, "volume%d.brick%d", i, + index); + ret = dict_get_str (dict, key, &brick); + if (ret) + goto out; + + ret = xmlTextWriterStartElement + (local->writer, (xmlChar *)"brick"); + XML_RET_CHECK_AND_GOTO (ret, out); + + memset (key, 0, sizeof (key)); + snprintf (key, sizeof (key), + "volume%d.brick%d.uuid", i, j); + ret = dict_get_str (dict, key, &uuid); + if (ret) + goto out; + ret = xmlTextWriterWriteFormatAttribute + (local->writer, (xmlChar *)"uuid", "%s", + uuid); + XML_RET_CHECK_AND_GOTO (ret, out); + + ret = xmlTextWriterWriteFormatString + (local->writer, "%s", brick); + XML_RET_CHECK_AND_GOTO (ret, out); + + ret = xmlTextWriterWriteFormatElement + (local->writer, (xmlChar *)"name", "%s", + brick); + XML_RET_CHECK_AND_GOTO (ret, out); + + ret = xmlTextWriterWriteFormatElement + (local->writer, (xmlChar *)"hostUuid", + "%s", uuid); + XML_RET_CHECK_AND_GOTO (ret, out); + + ret = xmlTextWriterEndElement (local->writer); + XML_RET_CHECK_AND_GOTO (ret, out); + + index++; + } ret = xmlTextWriterEndElement (local->writer); XML_RET_CHECK_AND_GOTO (ret, out); - j++; + } else { + while (j <= brick_count) { + ret = xmlTextWriterStartElement + (local->writer, (xmlChar *)"brick"); + XML_RET_CHECK_AND_GOTO (ret, out); + + memset (key, 0, sizeof (key)); + snprintf (key, sizeof (key), + "volume%d.brick%d.uuid", i, j); + ret = dict_get_str (dict, key, &uuid); + if (ret) + goto out; + ret = xmlTextWriterWriteFormatAttribute + (local->writer, (xmlChar *)"uuid", "%s", + uuid); + XML_RET_CHECK_AND_GOTO (ret, out); + + memset (key, 0, sizeof (key)); + snprintf (key, sizeof (key), + "volume%d.brick%d", i, j); + ret = dict_get_str (dict, key, &brick); + if (ret) + goto out; + ret = xmlTextWriterWriteFormatString + (local->writer, "%s", brick); + XML_RET_CHECK_AND_GOTO (ret, out); + + ret = xmlTextWriterWriteFormatElement + (local->writer, (xmlChar *)"name", "%s", + brick); + XML_RET_CHECK_AND_GOTO (ret, out); + + ret = xmlTextWriterWriteFormatElement + (local->writer, (xmlChar *)"hostUuid", + "%s", uuid); + XML_RET_CHECK_AND_GOTO (ret, out); + + /* </brick> */ + ret = xmlTextWriterEndElement (local->writer); + XML_RET_CHECK_AND_GOTO (ret, out); + + j++; + } } /* </bricks> */ ret = xmlTextWriterEndElement (local->writer); diff --git a/cli/src/cli.h b/cli/src/cli.h index f5441c07ec0..5671f64ae93 100644 --- a/cli/src/cli.h +++ b/cli/src/cli.h @@ -42,6 +42,19 @@ enum argp_option_keys { ARGP_PORT_KEY = 'p', }; +typedef enum { + COLD_BRICK_COUNT, + COLD_TYPE, + COLD_DIST_COUNT, + COLD_REPLICA_COUNT, + COLD_DISPERSE_COUNT, + COLD_REDUNDANCY_COUNT, + HOT_BRICK_COUNT, + HOT_TYPE, + HOT_REPLICA_COUNT, + MAX +} values; + #define GLUSTER_MODE_SCRIPT (1 << 0) #define GLUSTER_MODE_ERR_FATAL (1 << 1) #define GLUSTER_MODE_XML (1 << 2) |