diff --git a/hitachi-vsp/.idea/hitachi-vsp.iml b/hitachi-vsp/.idea/hitachi-vsp.iml
index d0876a7..c444878 100644
--- a/hitachi-vsp/.idea/hitachi-vsp.iml
+++ b/hitachi-vsp/.idea/hitachi-vsp.iml
@@ -2,7 +2,7 @@
-
+
\ No newline at end of file
diff --git a/hitachi-vsp/agent_hitachivsp b/hitachi-vsp/agent_hitachivsp
index 9b54a7f..4e4d13f 100755
--- a/hitachi-vsp/agent_hitachivsp
+++ b/hitachi-vsp/agent_hitachivsp
@@ -24,11 +24,11 @@
# to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
# Boston, MA 02110-1301 USA.
-import re
import sys
import getopt
-import urllib3
-from requests.packages.urllib3.exceptions import InsecureRequestWarning
+import pprint
+import json
+#from requests.packages.urllib3.exceptions import InsecureRequestWarning
def usage():
@@ -45,8 +45,10 @@ OPTIONS:
""")
sys.exit(1)
+
short_options = "h"
-long_options = ["help", "username=", "password=", "address=", "demo", "no-cert-check"]
+long_options = ["help", "username=", "password=", "address=", "demo", "no-cert-check"]
+
try:
opts, args = getopt.getopt(sys.argv[1:], short_options, long_options)
@@ -55,10 +57,11 @@ except getopt.GetoptError as err:
sys.exit(1)
-opt_demo = False
+opt_demo = True
opt_cert = True
args_dict = {}
+
for o,a in opts:
if o in [ "--address" ]:
args_dict["address"] = a
@@ -77,162 +80,182 @@ for o,a in opts:
def query(url):
if opt_cert == False:
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
- response = requests.get(url, auth = (args_dict["username"], args_dict["password"]), verify=opt_cert)
- raw_xml = response.text
- # Remove namespace nonsense
- raw_xml = re.sub(' xmlns="[^"]+"', '', raw_xml, count=1)
-# raw_xml = re.sub(' http-equiv="[^"]+"', '', raw_xml, count=1)
- xml_instance = ET.fromstring(raw_xml)
- return xml_instance
+ response = requests.get(url, auth = (args_dict["username"], args_dict["password"]), verify=opt_cert)
+ raw_json = response.text
+ return raw_json
output_lines = []
def output(line):
if type(line) not in [str]:
- output_lines.append(pprint.pformat(line))
+ output_lines.append(pprint.pprint(line))
else:
output_lines.append(line)
-def process_cluster_info():
- output("<<>>")
- xml_instance = query_cluster_info()
- tbody = xml_instance.find("body").find("div").find("table").find("tbody")
- for child in tbody:
- name = child[0].text
- value = child[1].text
- output("%s\t%s" % (name, value))
-
-
-def query_cluster_info():
+def get_storage_info():
if opt_demo:
- raw_xml = re.sub(' xmlns="[^"]+"', '', cluster_xml, count=1)
- return ET.fromstring(raw_xml)
- url = "https://%(address)s/storeonceservices/cluster/" % args_dict
- return query(url)
-
-serviceset_ids = set()
-def process_servicesets():
- output("<<>>")
- xml_instance = query_servicesets()
- servicesets = xml_instance.find("body").find("div")
- for element in servicesets:
- tbody = element.find("table").find("tbody")
- serviceset_id = tbody[0][1].text
- serviceset_ids.add(serviceset_id)
- output("[%s]" % serviceset_id)
- for child in tbody:
- name = child[0].text
- value = child[1].text
- output("%s\t%s" % (name, value))
-
-
-def query_servicesets():
- if opt_demo:
- raw_xml = re.sub(' xmlns="[^"]+"', '', servicesets_xml, count=1)
- return ET.fromstring(raw_xml)
- url = "https://%(address)s/storeonceservices/cluster/servicesets/" % args_dict
+ raw_json = storage_info
+ return raw_json
+ url = "https://%(address)s/ConfigurationManager/v1/objects/storages/instance" % args_dict
return query(url)
-def process_stores_info():
- output("<<>>")
- for serviceset_id in serviceset_ids:
- xml_instance = query_stores_info(serviceset_id)
- stores = xml_instance.find("body").find("div")
- for element in stores:
- tbody = element.find("table").find("tbody")
- store_id = tbody[0][1].text
- output("[%s/%s]" % (serviceset_id, store_id))
- serviceset_ids.add(serviceset_id)
- for child in tbody:
- name = child[0].text
- value = child[1].text
- output("%s\t%s" % (name, value))
-
-
-def query_stores_info(serviceset_id):
+def get_storage_pools():
if opt_demo:
- raw_xml = re.sub(' xmlns="[^"]+"', '', stores_xml, count=1)
- return ET.fromstring(raw_xml)
-
- url = "https://%(address)s/storeonceservices/cluster/servicesets/" % args_dict + \
- "%s/services/cat/stores/" % serviceset_id
+ raw_json = storage_pools
+ return raw_json
+ url = "https://%(address)s/ConfigurationManager/v1/objects/pools" % args_dict
return query(url)
-serviceset_ids_teaming = set()
-def process_servicesets_teaming():
- output("<<>>")
- xml_instance = query_servicesets_teaming()
- servicesets_teaming = xml_instance.find("body").find("div")
- for element in servicesets_teaming:
- tbody = element.find("table").find("tbody")
- serviceset_id_teaming = tbody[0][1].text
- serviceset_ids_teaming.add(serviceset_id_teaming)
- output("[%s]" % serviceset_id_teaming)
- for child in tbody:
- name = child[0].text
- value = child[1].text
- output("%s\t%s" % (name, value))
-
-
-def query_servicesets_teaming():
- if opt_demo:
- raw_xml = re.sub(' xmlns="[^"]+"', '', servicesets_xml, count=1)
- return ET.fromstring(raw_xml)
- url = "https://%(address)s/storeonceservices/cluster/servicesets/1/teaming/services/cat/stores" % args_dict
- return query(url)
-
-
-def process_stores_info_teaming():
- output("<<>>")
- for serviceset_id_teaming in serviceset_ids_teaming:
- xml_instance = query_stores_info_teaming(serviceset_id_teaming)
- stores = xml_instance.find("body").find("div")
- for element in stores:
- tbody = element.find("table").find("tbody")
- store_id = tbody[0][1].text
- output("[%s/%s]" % (serviceset_id_teaming, store_id))
- serviceset_ids_teaming.add(serviceset_id_teaming)
- for child in tbody:
- name = child[0].text
- value = child[1].text
- output("%s\t%s" % (name, value))
-
-
-
-def query_stores_info_teaming(serviceset_id):
- if opt_demo:
- raw_xml = re.sub(' xmlns="[^"]+"', '', stores_xml_teaming, count=1)
- return ET.fromstring(raw_xml)
-
- url = "https://%(address)s/storeonceservices/cluster/servicesets/" % args_dict + \
- "1/teaming/services/cat/stores/%s" % serviceset_id
- return query(url)
-
-
+def process_storage_pools ():
+ output("<<>>")
+ raw_json = get_storage_pools()
+ full_data = json.loads(raw_json)
+ data = full_data["data"]
+ output("poolID\tpoolType\tpoolName\ttotalPhysicalCapacity\ttotalPoolCapacity\tavailableVolumeCapacity\tusedCapacityRate")
+ for pool in data:
+ if pool["poolType"] == "HTI":
+ output("%s\t%s\t%s\t%s\t%s\t%s\t%s" % (pool["poolId"], pool["poolType"], pool["poolName"], \
+ pool["totalPhysicalCapacity"], pool["totalPoolCapacity"], \
+ pool["availableVolumeCapacity"], pool["usedCapacityRate"]) )
+def process_storage_info():
+ output("<<>>")
+ raw_json = get_storage_info()
+ data = json.loads(raw_json)
+ output("%s\t%s\t%s\t%s" % (data["serialNumber"], data["storageDeviceId"], data["dkcMicroVersion"], data["model"]))
def main():
try:
- # Get cluster info
- process_cluster_info()
-
- # Get servicesets
- process_servicesets()
-
- # Get stores info
- process_stores_info()
-
- process_servicesets_teaming()
- process_stores_info_teaming()
+ process_storage_info()
+ process_storage_pools()
sys.stdout.write("\n".join(output_lines) + "\n")
except Exception as e:
sys.stderr.write("Connection error: %s" % e)
sys.exit(1)
+
+storage_info = """{
+ "storageDeviceId": "666666666666",
+ "model": "VSP G700",
+ "serialNumber": 666666,
+ "ctl1Ip": "192.168.223.69",
+ "ctl2Ip": "192.168.223.70",
+ "dkcMicroVersion": "88-04-03/00",
+ "communicationModes": [
+ {
+ "communicationMode": "lanConnectionMode"
+ }
+ ],
+ "isSecure": true
+}"""
+
+storage_pools = """
+{
+ "data" : [ {
+ "poolId" : 0,
+ "poolStatus" : "POLN",
+ "usedCapacityRate" : 47,
+ "usedPhysicalCapacityRate" : 47,
+ "poolName" : "RAID6_HDT_01",
+ "availableVolumeCapacity" : 208964826,
+ "availablePhysicalVolumeCapacity" : 208964826,
+ "totalPoolCapacity" : 397630296,
+ "totalPhysicalCapacity" : 397630296,
+ "numOfLdevs" : 136,
+ "firstLdevId" : 3,
+ "warningThreshold" : 80,
+ "depletionThreshold" : 90,
+ "virtualVolumeCapacityRate" : -1,
+ "isMainframe" : false,
+ "isShrinking" : true,
+ "locatedVolumeCount" : 242,
+ "totalLocatedCapacity" : 234976098,
+ "blockingMode" : "NB",
+ "totalReservedCapacity" : 0,
+ "reservedVolumeCount" : 0,
+ "poolActionMode" : "AUT",
+ "tierOperationStatus" : "MON",
+ "dat" : "VAL",
+ "poolType" : "RT",
+ "monitoringMode" : "CM",
+ "tiers" : [ {
+ "tierNumber" : 1,
+ "tierLevelRange" : "00000001",
+ "tierDeltaRange" : "00000005",
+ "tierUsedCapacity" : 31524696,
+ "tierTotalCapacity" : 37087848,
+ "tablespaceRate" : 10,
+ "performanceRate" : 4,
+ "progressOfReplacing" : 100,
+ "bufferRate" : 5
+ }, {
+ "tierNumber" : 2,
+ "tierLevelRange" : "00000000",
+ "tierDeltaRange" : "00000005",
+ "tierUsedCapacity" : 98679336,
+ "tierTotalCapacity" : 116093208,
+ "tablespaceRate" : 10,
+ "performanceRate" : 12,
+ "progressOfReplacing" : 100,
+ "bufferRate" : 5
+ }, {
+ "tierNumber" : 3,
+ "tierLevelRange" : "00000000",
+ "tierDeltaRange" : "00000000",
+ "tierUsedCapacity" : 58461480,
+ "tierTotalCapacity" : 244449240,
+ "tablespaceRate" : 10,
+ "performanceRate" : 62,
+ "progressOfReplacing" : 100,
+ "bufferRate" : 5
+ } ],
+ "dataReductionAccelerateCompCapacity" : 0,
+ "dataReductionAccelerateCompRate" : 0,
+ "compressionRate" : 0,
+ "dataReductionAccelerateCompIncludingSystemData" : {
+ "isReductionCapacityAvailable" : true,
+ "reductionCapacity" : 0,
+ "isReductionRateAvailable" : true,
+ "reductionRate" : 0
+ },
+ "capacitiesExcludingSystemData" : {
+ "usedVirtualVolumeCapacity" : 386386968576
+ }
+ }, {
+ "poolId" : 1,
+ "poolStatus" : "POLN",
+ "usedCapacityRate" : 0,
+ "usedPhysicalCapacityRate" : 0,
+ "snapshotCount" : 0,
+ "poolName" : "THIN_IMAGE_POOL",
+ "availableVolumeCapacity" : 46453344,
+ "availablePhysicalVolumeCapacity" : 46453344,
+ "totalPoolCapacity" : 46453344,
+ "totalPhysicalCapacity" : 46453344,
+ "numOfLdevs" : 16,
+ "firstLdevId" : 22,
+ "warningThreshold" : 80,
+ "virtualVolumeCapacityRate" : -1,
+ "isMainframe" : false,
+ "isShrinking" : false,
+ "poolType" : "HTI",
+ "dataReductionAccelerateCompCapacity" : 0,
+ "dataReductionAccelerateCompRate" : 0,
+ "compressionRate" : 0,
+ "dataReductionAccelerateCompIncludingSystemData" : {
+ "isReductionCapacityAvailable" : true,
+ "reductionCapacity" : 0,
+ "isReductionRateAvailable" : false
+ },
+ "capacitiesExcludingSystemData" : {
+ "usedVirtualVolumeCapacity" : 0
+ }
+ } ]
+}"""
+
if __name__ == "__main__":
main()
-