/* * Copyright (c) 2012-2015 iWave Software LLC * All Rights Reserved */ package com.iwave.ext.netappc; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; import org.apache.log4j.Logger; import netapp.manage.NaElement; import netapp.manage.NaServer; import com.google.common.collect.Maps; import com.google.common.collect.Sets; import com.iwave.ext.netapp.AggregateInfo; public class NetAppCAggregate { private Logger log = Logger.getLogger(getClass()); private String name = ""; private NaServer server = null; public NetAppCAggregate(NaServer server, String name) { this.name = name; this.server = server; } public List<AggregateInfo> listAllAggregates(boolean listAll) { ArrayList<AggregateInfo> aggrs = new ArrayList<AggregateInfo>(); NaElement result = null; List aggrList = null; Iterator iter = null; String tag = null; /* * list disks, so we can add the disk-type to AggregateInfo */ NaElement elem = new NaElement("storage-disk-get-iter"); NaElement diskAttributes = null; List storageDiskList = null; Iterator storageDiskIter = null; Map<String, Set<String>> aggrDiskTypes = Maps.newHashMap(); Map<String, Set<String>> aggrDiskSpeeds = Maps.newHashMap(); try { do { NaElement results = server.invokeElem(elem); tag = results.getChildContent("next-tag"); diskAttributes = results.getChildByName("attributes-list"); if (diskAttributes != null) { storageDiskList = diskAttributes.getChildren(); storageDiskIter = storageDiskList.iterator(); while (storageDiskIter.hasNext()) { NaElement storageDisk = (NaElement) storageDiskIter.next(); NaElement raidInfo = storageDisk.getChildByName("disk-raid-info"); NaElement inventoryInfo = storageDisk.getChildByName("disk-inventory-info"); String diskType = inventoryInfo.getChildContent("disk-type"); String serialNumber = inventoryInfo.getChildContent("serial-number"); int rpmNumber = inventoryInfo.getChildIntValue("rpm", 0); // Prettify the RPM String rpm = formatRPMs(rpmNumber); String uid = storageDisk.getChildContent("disk-uid"); String name = storageDisk.getChildContent("disk-name"); String containerType = raidInfo.getChildContent("container-type"); NaElement diskAggrInfo = raidInfo.getChildByName("disk-aggregate-info"); if (diskAggrInfo != null) { String aggregate = diskAggrInfo.getChildContent("aggregate-name"); System.out.println("Aggregate Name : " + aggregate); Set<String> diskTypes = aggrDiskTypes.get(aggregate); if (diskTypes == null) { diskTypes = Sets.newLinkedHashSet(); aggrDiskTypes.put(aggregate, diskTypes); } Set<String> diskSpeeds = aggrDiskSpeeds.get(aggregate); if (diskSpeeds == null) { diskSpeeds = Sets.newLinkedHashSet(); aggrDiskSpeeds.put(aggregate, diskSpeeds); } diskTypes.add(diskType); diskSpeeds.add(rpm); } } } if (tag != null && !tag.isEmpty()) { elem = new NaElement("storage-disk-get-iter"); elem.addNewChild("tag", tag); } } while (tag != null && !tag.isEmpty()); } catch (Exception e) { String msg = "Failed to get disk list info."; log.error(msg); throw new NetAppCException(msg, e); } elem = new NaElement("aggr-get-iter"); if (!listAll) { elem.addNewChild("aggregate", name); } try { do { NaElement results = server.invokeElem(elem); if (results.getChildIntValue("num-records", 0) == 0) { return aggrs; } tag = results.getChildContent("next-tag"); result = results.getChildByName("attributes-list"); if (result != null) { aggrList = result.getChildren(); iter = aggrList.iterator(); while (iter.hasNext()) { NaElement aggr = (NaElement) iter.next(); NaElement aggrSizeAttrs = aggr.getChildByName("aggr-space-attributes"); NaElement aggrRaidAttrs = aggr.getChildByName("aggr-raid-attributes"); NaElement aggrVolumeCountAttrs = aggr.getChildByName("aggr-volume-count-attributes"); AggregateInfo info = new AggregateInfo(); info.setName(aggr.getChildContent("aggregate-name")); info.setSizeAvailable(aggrSizeAttrs.getChildLongValue("size-available", -1)); info.setSizeTotal(aggrSizeAttrs.getChildLongValue("size-total", -1)); info.setSizeUsed(aggrSizeAttrs.getChildLongValue("size-used", -1)); info.setDiskCount(aggrRaidAttrs.getChildIntValue("disk-count", -1)); info.setRaidStatus(aggrRaidAttrs.getChildContent("raid-status")); info.setState(aggrRaidAttrs.getChildContent("state")); info.setVolumeCount(aggrVolumeCountAttrs.getChildIntValue("flexvol-count", -1)); info.setDiskTypes(aggrDiskTypes.get(info.getName())); info.setDiskSpeeds(aggrDiskSpeeds.get(info.getName())); aggrs.add(info); } } if (tag != null && !tag.isEmpty()) { elem = new NaElement("aggr-get-iter"); elem.addNewChild("tag", tag); } } while (tag != null && !tag.isEmpty()); } catch (Exception e) { String msg = "Failed to get Aggregate list info."; log.error(msg); throw new NetAppCException(msg, e); } return aggrs; } private String formatRPMs(int rpms) { if ((rpms % 1000) == 0) { return String.format("%dk", (rpms / 1000)); } else { return String.format("%.1fk", (rpms / 1000.0)); } } }