use of com.emc.storageos.vnxe.models.Health in project coprhd-controller by CoprHD.
the class VNXUnityCommunicationInterface method discoverStoragePools.
/**
* Returns the list of storage pools for the specified VNX Unity storage
* system.
*
* @param system
* storage system information.
* @param client
* VNX Unity service client
* @param supportedProtocols
* calculated supportedProtocols for the array
* @return Map of New and Existing known storage pools.
* @throws VNXeException
*/
private Map<String, List<StoragePool>> discoverStoragePools(StorageSystem system, VNXeApiClient client, StringSet supportedProtocols, List<StoragePool> poolsToMatchWithVpool) throws VNXeException {
Map<String, List<StoragePool>> storagePools = new HashMap<String, List<StoragePool>>();
List<StoragePool> newPools = new ArrayList<StoragePool>();
List<StoragePool> existingPools = new ArrayList<StoragePool>();
_logger.info("Start storage pool discovery for storage system {}", system.getId());
try {
List<VNXePool> pools = client.getPools();
for (VNXePool vnxePool : pools) {
StoragePool pool = null;
URIQueryResultList results = new URIQueryResultList();
String poolNativeGuid = NativeGUIDGenerator.generateNativeGuid(system, vnxePool.getId(), NativeGUIDGenerator.POOL);
_dbClient.queryByConstraint(AlternateIdConstraint.Factory.getStoragePoolByNativeGuidConstraint(poolNativeGuid), results);
boolean isModified = false;
Iterator<URI> it = results.iterator();
if (it.hasNext()) {
StoragePool tmpPool = _dbClient.queryObject(StoragePool.class, it.next());
if (tmpPool.getStorageDevice().equals(system.getId())) {
pool = tmpPool;
_logger.info("Found StoragePool {} at {}", pool.getPoolName(), poolNativeGuid);
}
}
if (pool == null) {
pool = new StoragePool();
pool.setId(URIUtil.createId(StoragePool.class));
pool.setLabel(poolNativeGuid);
pool.setNativeGuid(poolNativeGuid);
pool.setPoolServiceType(PoolServiceType.block_file.toString());
pool.setStorageDevice(system.getId());
pool.setNativeId(vnxePool.getId());
pool.setPoolName(vnxePool.getName());
pool.setCompatibilityStatus(DiscoveredDataObject.CompatibilityStatus.COMPATIBLE.name());
pool.setDiscoveryStatus(DiscoveredDataObject.DiscoveryStatus.VISIBLE.name());
// Supported resource type indicates what type of file
// systems are supported.
pool.setSupportedResourceTypes(StoragePool.SupportedResourceTypes.THIN_AND_THICK.toString());
pool.setPoolClassName(StoragePool.PoolClassNames.VNXe_Pool.name());
pool.setPoolServiceType(StoragePool.PoolServiceType.block_file.name());
pool.setRegistrationStatus(RegistrationStatus.REGISTERED.toString());
_logger.info("Creating new storage pool using NativeGuid : {}", poolNativeGuid);
newPools.add(pool);
} else {
// update pool attributes
_logger.info("updating the pool: {}", poolNativeGuid);
if (ImplicitPoolMatcher.checkPoolPropertiesChanged(pool.getProtocols(), supportedProtocols)) {
isModified = true;
}
existingPools.add(pool);
}
Health poolHealth = vnxePool.getHealth();
if (poolHealth != null) {
int value = poolHealth.getValue();
if (value == Health.HealthEnum.OK.getValue() || value == Health.HealthEnum.OK_BUT.getValue()) {
pool.setOperationalStatus(StoragePool.PoolOperationalStatus.READY.name());
} else {
pool.setOperationalStatus(StoragePool.PoolOperationalStatus.NOTREADY.name());
}
}
pool.setProtocols(supportedProtocols);
StringSet raidLevels = new StringSet();
RaidTypeEnum raid = vnxePool.getRaidTypeEnum();
if (raid != null) {
raidLevels.add(vnxePool.getRaidTypeEnum().name());
pool.setSupportedRaidLevels(raidLevels);
}
pool.setAutoTieringEnabled(getPoolAutoTieringEnabled(vnxePool, system));
List<PoolTier> poolTiers = vnxePool.getTiers();
StringSet driveTypes = new StringSet();
String diskTechnologyType = null;
if (poolTiers != null) {
for (PoolTier poolTier : poolTiers) {
List<RaidGroup> raidGroups = poolTier.getRaidGroups();
if (raidGroups != null) {
for (RaidGroup raidGroup : raidGroups) {
VNXeBase diskGroup = raidGroup.getDiskGroup();
if (diskGroup != null) {
DiskGroup diskgroupObj = client.getDiskGroup(diskGroup.getId());
diskTechnologyType = diskgroupObj.getDiskTechnologyEnum().name();
mapDiskTypeAndAddToStringSet(diskTechnologyType, driveTypes);
}
}
}
}
}
// Get drive types from disks
List<Disk> disks = client.getDisksForPool(vnxePool.getId());
if (disks != null) {
for (Disk disk : disks) {
if (disk.getDiskTechnologyEnum() != null) {
diskTechnologyType = disk.getDiskTechnologyEnum().name();
mapDiskTypeAndAddToStringSet(diskTechnologyType, driveTypes);
}
}
}
pool.setSupportedDriveTypes(driveTypes);
double size = vnxePool.getSizeTotal();
if (size > 0) {
// Convert to kb
pool.setTotalCapacity(VNXeUtils.convertDoubleSizeToViPRLong(size));
}
long free = VNXeUtils.convertDoubleSizeToViPRLong(vnxePool.getSizeFree());
if (free > 0) {
pool.setFreeCapacity(free);
pool.setMaximumThinVolumeSize(free);
pool.setMaximumThickVolumeSize(free);
}
long subscribed = VNXeUtils.convertDoubleSizeToViPRLong(vnxePool.getSizeSubscribed());
pool.setSubscribedCapacity(subscribed);
if (isModified || ImplicitPoolMatcher.checkPoolPropertiesChanged(pool.getCompatibilityStatus(), DiscoveredDataObject.CompatibilityStatus.COMPATIBLE.name()) || ImplicitPoolMatcher.checkPoolPropertiesChanged(pool.getDiscoveryStatus(), DiscoveryStatus.VISIBLE.name())) {
poolsToMatchWithVpool.add(pool);
}
pool.setDiscoveryStatus(DiscoveryStatus.VISIBLE.name());
pool.setCompatibilityStatus(DiscoveredDataObject.CompatibilityStatus.COMPATIBLE.name());
}
} catch (VNXeException e) {
_logger.error("Discovery of storage pools failed for storage system {} for {}", system.getId(), e.getMessage());
throw e;
}
for (StoragePool newPool : newPools) {
_logger.info("New Storage Pool : " + newPool);
_logger.info("New Storage Pool : {} : {}", newPool.getNativeGuid(), newPool.getId());
}
for (StoragePool pool : existingPools) {
_logger.info("Old Storage Pool : " + pool);
_logger.info("Old Storage Pool : {} : {}", pool.getNativeGuid(), pool.getId());
}
storagePools.put(NEW, newPools);
storagePools.put(EXISTING, existingPools);
_logger.info("Number of pools found {} : ", storagePools.size());
_logger.info("Storage pool discovery for storage system {} complete", system.getId());
return storagePools;
}
use of com.emc.storageos.vnxe.models.Health in project coprhd-controller by CoprHD.
the class VNXUnityCommunicationInterface method discoverIscsiPorts.
/**
* Discover iscsiPorts
*
* @param system
* @param client
* @param spIdMap
* storage processors VNXeId and ViPR URI map
* @return
* @throws VNXeException
*/
private HashMap<String, List<StoragePort>> discoverIscsiPorts(StorageSystem system, VNXeApiClient client, Map<String, URI> spIdMap) throws VNXeException {
HashMap<String, List<StoragePort>> storagePorts = new HashMap<String, List<StoragePort>>();
List<StoragePort> newStoragePorts = new ArrayList<StoragePort>();
List<StoragePort> existingStoragePorts = new ArrayList<StoragePort>();
_logger.info("Start iSCSI storage port discovery for storage system {}", system.getId());
// Retrieve the list of iscsi ports
List<VNXeIscsiNode> ports = client.getAllIscsiPorts();
if (ports == null || ports.isEmpty()) {
_logger.info("No iSCSI ports found for the system: {} ", system.getId());
return storagePorts;
}
_logger.info("Number iSCSI ports found: {}", ports.size());
// Create the list of storage ports.
for (VNXeIscsiNode node : ports) {
StoragePort port = null;
VNXeEthernetPort eport = node.getEthernetPort();
if (eport == null) {
_logger.info("No ethernet port found for the iscsi node: {}", node.getId());
continue;
}
VNXeBase spId = eport.getStorageProcessor();
if (spId == null) {
_logger.info("No storage processor info for the iscsi node: {}", node.getId());
continue;
}
String spIdStr = spId.getId();
URI haDomainUri = spIdMap.get(spIdStr);
if (haDomainUri == null) {
_logger.info("The sp {} has not been discovered.", spIdStr);
continue;
}
// Check if storage port was already discovered
String portNativeGuid = NativeGUIDGenerator.generateNativeGuid(system, node.getName(), NativeGUIDGenerator.PORT);
URIQueryResultList results = new URIQueryResultList();
_dbClient.queryByConstraint(AlternateIdConstraint.Factory.getStoragePortByNativeGuidConstraint(portNativeGuid), results);
Iterator<URI> it = results.iterator();
if (it.hasNext()) {
_logger.info("cross verifying for duplicate port");
StoragePort tmpPort = _dbClient.queryObject(StoragePort.class, it.next());
_logger.info(String.format("Actual StorageDevice %s : PortGroup found for port %s - Actual PortGroup %s", system.getId(), tmpPort.getPortNetworkId(), tmpPort.getPortGroup()));
if (tmpPort.getStorageDevice().equals(system.getId()) && tmpPort.getPortGroup().equals(spIdStr)) {
port = tmpPort;
_logger.info("found duplicate iscsi port {}", node.getName());
}
}
// If iscsi port was not previously discovered, add new storage port
if (port == null) {
port = new StoragePort();
port.setId(URIUtil.createId(StoragePort.class));
port.setLabel(portNativeGuid);
port.setTransportType("IP");
port.setNativeGuid(portNativeGuid);
port.setStorageDevice(system.getId());
port.setRegistrationStatus(RegistrationStatus.REGISTERED.toString());
port.setPortName(eport.getId());
port.setPortNetworkId(node.getName());
port.setPortGroup(spIdStr);
port.setStorageHADomain(haDomainUri);
VNXeIscsiPortal portal = node.getIscsiPortal();
if (portal != null) {
port.setIpAddress(portal.getIpAddress());
}
_logger.info("Creating new storage port using NativeGuid : {}, IQN:", portNativeGuid, node.getName());
newStoragePorts.add(port);
} else {
existingStoragePorts.add(port);
}
Health health = node.getEthernetPort().getHealth();
if (health != null && health.getValue() == Health.HealthEnum.OK.getValue()) {
port.setOperationalStatus(StoragePort.OperationalStatus.OK.name());
} else {
port.setOperationalStatus(StoragePort.OperationalStatus.NOT_OK.name());
}
port.setDiscoveryStatus(DiscoveryStatus.VISIBLE.name());
port.setCompatibilityStatus(DiscoveredDataObject.CompatibilityStatus.COMPATIBLE.name());
}
_logger.info("iSCSI port discovery for storage system {} complete", system.getId());
storagePorts.put(NEW, newStoragePorts);
storagePorts.put(EXISTING, existingStoragePorts);
return storagePorts;
}
use of com.emc.storageos.vnxe.models.Health in project coprhd-controller by CoprHD.
the class VNXUnityCommunicationInterface method discoverFcPorts.
/**
* Discover fcPorts
*
* @param system
* @param client
* @param spIdMap
* storage processors VNXeId and ViPR URI map
* @return
* @throws VNXeException
*/
private HashMap<String, List<StoragePort>> discoverFcPorts(StorageSystem system, VNXeApiClient client, Map<String, URI> spIdMap) throws VNXeException {
HashMap<String, List<StoragePort>> storagePorts = new HashMap<String, List<StoragePort>>();
List<StoragePort> newStoragePorts = new ArrayList<StoragePort>();
List<StoragePort> existingStoragePorts = new ArrayList<StoragePort>();
_logger.info("Start FC storage port discovery for storage system {}", system.getId());
// Retrieve the list of iscsi ports
List<VNXeFCPort> ports = client.getAllFcPorts();
if (ports == null || ports.isEmpty()) {
_logger.info("No FC ports found for the system: {} ", system.getId());
storagePorts.put(NEW, newStoragePorts);
storagePorts.put(EXISTING, existingStoragePorts);
return storagePorts;
}
// Create the list of storage ports.
for (VNXeFCPort fcPort : ports) {
StoragePort port = null;
VNXeBase spId = fcPort.getStorageProcessor();
if (spId == null) {
_logger.info("No storage processor info for the fcPort: {}", fcPort.getId());
continue;
}
String spIdStr = spId.getId();
URI haDomainUri = spIdMap.get(spIdStr);
if (haDomainUri == null) {
_logger.info("The sp {} has not been discovered.", spIdStr);
continue;
}
// Check if storage port was already discovered
String portNativeGuid = NativeGUIDGenerator.generateNativeGuid(system, fcPort.getWwn(), NativeGUIDGenerator.PORT);
URIQueryResultList results = new URIQueryResultList();
_dbClient.queryByConstraint(AlternateIdConstraint.Factory.getStoragePortByNativeGuidConstraint(portNativeGuid), results);
Iterator<URI> it = results.iterator();
if (it.hasNext()) {
_logger.debug("cross verifying for duplicate port");
StoragePort tmpPort = _dbClient.queryObject(StoragePort.class, it.next());
_logger.info(String.format("Actual StorageDevice %s : PortGroup found for port %s - Actual PortGroup %s", system.getId(), tmpPort.getPortNetworkId(), tmpPort.getPortGroup()));
if (tmpPort.getStorageDevice().equals(system.getId()) && tmpPort.getPortGroup().equals(spIdStr)) {
port = tmpPort;
_logger.debug("found duplicate fc port {}", fcPort.getWwn());
}
}
// port
if (port == null) {
port = new StoragePort();
port.setId(URIUtil.createId(StoragePort.class));
port.setLabel(portNativeGuid);
port.setTransportType("FC");
port.setNativeGuid(portNativeGuid);
port.setStorageDevice(system.getId());
port.setRegistrationStatus(RegistrationStatus.REGISTERED.toString());
port.setPortName(fcPort.getId());
port.setPortNetworkId(fcPort.getPortWwn());
port.setPortGroup(spIdStr);
port.setStorageHADomain(haDomainUri);
_logger.info("Creating new storage port using NativeGuid : {}, WWN:", portNativeGuid, fcPort.getWwn());
newStoragePorts.add(port);
} else {
existingStoragePorts.add(port);
}
Health portHealth = fcPort.getHealth();
if (portHealth != null) {
int healthValue = portHealth.getValue();
if (healthValue == Health.HealthEnum.OK.getValue()) {
port.setOperationalStatus(StoragePort.OperationalStatus.OK.name());
} else {
port.setOperationalStatus(StoragePort.OperationalStatus.NOT_OK.name());
}
}
port.setDiscoveryStatus(DiscoveryStatus.VISIBLE.name());
port.setCompatibilityStatus(DiscoveredDataObject.CompatibilityStatus.COMPATIBLE.name());
}
_logger.info("FC port discovery for storage system {} complete", system.getId());
storagePorts.put(NEW, newStoragePorts);
storagePorts.put(EXISTING, existingStoragePorts);
return storagePorts;
}
Aggregations