/* * Copyright (c) 2015 EMC Corporation * All Rights Reserved */ package com.emc.storageos.api.mapper; import static com.emc.storageos.api.mapper.DbObjectMapper.mapDataObjectFields; import static com.emc.storageos.api.mapper.DbObjectMapper.mapDiscoveredDataObjectFields; import static com.emc.storageos.api.mapper.DbObjectMapper.mapDiscoveredSystemObjectFields; import static com.emc.storageos.api.mapper.DbObjectMapper.toNamedRelatedResource; import static com.emc.storageos.api.mapper.DbObjectMapper.toRelatedResource; import java.net.URI; import java.net.URISyntaxException; import java.text.DecimalFormat; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Set; import com.emc.storageos.api.service.impl.resource.utils.CapacityUtils; import com.emc.storageos.api.service.impl.response.RestLinkFactory; import com.emc.storageos.coordinator.client.service.CoordinatorClient; import com.emc.storageos.db.client.DbClient; import com.emc.storageos.db.client.model.DecommissionedResource; import com.emc.storageos.db.client.model.NasCifsServer; import com.emc.storageos.db.client.model.ObjectNamespace; import com.emc.storageos.db.client.model.ObjectUserSecretKey; import com.emc.storageos.db.client.model.PhysicalNAS; import com.emc.storageos.db.client.model.RemoteDirectorGroup; import com.emc.storageos.db.client.model.StoragePool; import com.emc.storageos.db.client.model.StoragePort; import com.emc.storageos.db.client.model.StorageProvider; import com.emc.storageos.db.client.model.StorageSystem; import com.emc.storageos.db.client.model.StorageSystemType; import com.emc.storageos.db.client.model.VirtualNAS; import com.emc.storageos.model.ResourceTypeEnum; import com.emc.storageos.model.RestLinkRep; import com.emc.storageos.model.adapters.StringMapAdapter; import com.emc.storageos.model.object.ObjectNamespaceRestRep; import com.emc.storageos.model.object.ObjectUserSecretKeyAddRestRep; import com.emc.storageos.model.object.ObjectUserSecretKeysRestRep; import com.emc.storageos.model.pools.StoragePoolRestRep; import com.emc.storageos.model.ports.StoragePortRestRep; import com.emc.storageos.model.rdfgroup.RDFGroupRestRep; import com.emc.storageos.model.smis.SMISProviderRestRep; import com.emc.storageos.model.smis.StorageProviderRestRep; import com.emc.storageos.model.storagesystem.type.StorageSystemTypeRestRep; import com.emc.storageos.model.systems.StorageSystemRestRep; import com.emc.storageos.model.varray.DecommissionedResourceRep; import com.emc.storageos.model.vnas.VirtualNASRestRep; import com.emc.storageos.volumecontroller.impl.ControllerUtils; import com.emc.storageos.volumecontroller.impl.plugins.metering.smis.processor.MetricsKeys; import com.emc.storageos.volumecontroller.impl.utils.attrmatchers.CapacityMatcher; public class SystemsMapper { private static final String MINUS_ONE_LONG = "-1"; private static final Long GBsINKB = 1048576L; @Deprecated public static SMISProviderRestRep mapStorageProviderToSMISRep(StorageProvider from) { if (from == null) { return null; } SMISProviderRestRep to = new SMISProviderRestRep(); mapDataObjectFields(from, to); // Workaround to generate /vdc/smis-providers uri for self link instead // of type base URI generation. try { to.setLink(new RestLinkRep("self", RestLinkFactory.simpleServiceLink(ResourceTypeEnum.SMIS_PROVIDER, from.getId()))); } catch (URISyntaxException e) { // impossible to get exception here. } to.setIPAddress(from.getIPAddress()); to.setPortNumber(from.getPortNumber()); if (from.getStorageSystems() != null) { for (String system : from.getStorageSystems()) { to.getStorageSystems().add(toRelatedResource(ResourceTypeEnum.STORAGE_SYSTEM, URI.create(system))); } } to.setDescription(from.getDescription()); to.setManufacturer(from.getManufacturer()); to.setVersionString(from.getVersionString()); to.setProviderID(from.getProviderID()); to.setConnectionStatus(from.getConnectionStatus()); to.setUserName(from.getUserName()); to.setUseSSL(from.getUseSSL()); to.setScanStatus(from.getScanStatus()); to.setLastScanStatusMessage(from.getLastScanStatusMessage()); to.setLastScanTime(from.getLastScanTime()); to.setNextScanTime(from.getNextScanTime()); to.setSuccessScanTime(from.getSuccessScanTime()); to.setCompatibilityStatus(from.getCompatibilityStatus()); to.setRegistrationStatus(from.getRegistrationStatus()); return to; } public static StorageProviderRestRep map(StorageProvider from) { if (from == null) { return null; } StorageProviderRestRep to = new StorageProviderRestRep(); mapDataObjectFields(from, to); to.setIPAddress(from.getIPAddress()); to.setPortNumber(from.getPortNumber()); if (from.getStorageSystems() != null) { for (String system : from.getStorageSystems()) { to.getStorageSystems().add(toRelatedResource(ResourceTypeEnum.STORAGE_SYSTEM, URI.create(system))); } } to.setInterface(from.getInterfaceType()); to.setDescription(from.getDescription()); to.setManufacturer(from.getManufacturer()); to.setVersionString(from.getVersionString()); to.setProviderID(from.getProviderID()); to.setConnectionStatus(from.getConnectionStatus()); to.setUserName(from.getUserName()); to.setUseSSL(from.getUseSSL()); to.setScanStatus(from.getScanStatus()); to.setLastScanStatusMessage(from.getLastScanStatusMessage()); to.setLastScanTime(from.getLastScanTime()); to.setNextScanTime(from.getNextScanTime()); to.setSuccessScanTime(from.getSuccessScanTime()); to.setCompatibilityStatus(from.getCompatibilityStatus()); to.setRegistrationStatus(from.getRegistrationStatus()); to.setSecondaryUsername(from.getSecondaryUsername()); to.setElementManagerURL(from.getElementManagerURL()); to.setSecondaryURL(from.getSecondaryURL()); return to; } public static RDFGroupRestRep map(RemoteDirectorGroup from, List<URI> volumeURIList) { if (from == null) { return null; } RDFGroupRestRep to = new RDFGroupRestRep(); mapDiscoveredDataObjectFields(from, to); to.setActive(from.getActive()); to.setConnectivityStatus(from.getConnectivityStatus()); to.setSupportedCopyMode(from.getSupportedCopyMode()); to.setCopyState(from.getCopyState()); to.setRemoteGroupId(from.getRemoteGroupId()); to.setRemotePort(from.getRemotePort()); to.setSourceGroupId(from.getSourceGroupId()); to.setSourcePort(from.getSourcePort()); to.setSourceReplicationGroupName(from.getSourceReplicationGroupName()); to.setSupported(from.getSupported()); to.setTargetReplicationGroupName(from.getTargetReplicationGroupName()); to.setSourceStorageSystemUri(from.getSourceStorageSystemUri()); to.setRemoteStorageSystemUri(from.getRemoteStorageSystemUri()); to.setVolumes(volumeURIList); return to; } public static VirtualNASRestRep map(VirtualNAS from, DbClient dbClient) { if (from == null) { return null; } VirtualNASRestRep to = new VirtualNASRestRep(); mapDiscoveredDataObjectFields(from, to); to.setAssignedVirtualArrays(from.getAssignedVirtualArrays()); to.setBaseDirPath(from.getBaseDirPath()); to.setCompatibilityStatus(from.getCompatibilityStatus()); to.setConnectedVirtualArrays(from.getConnectedVirtualArrays()); to.setDiscoveryStatus(from.getDiscoveryStatus()); to.setNasName(from.getNasName()); to.setName(from.getNasName()); to.setNasState(from.getNasState()); to.setNasTag(from.getNAStag()); if (from.getParentNasUri() != null) { PhysicalNAS pNAS = dbClient.queryObject(PhysicalNAS.class, from.getParentNasUri()); // Self link will be empty as there is no Resource Type available // for PhysicalNAS to.setParentNASURI(toNamedRelatedResource(pNAS, pNAS.getNasName())); } to.setAssociatedProjects(from.getAssociatedProjects()); to.setProtocols(from.getProtocols()); to.setRegistrationStatus(from.getRegistrationStatus()); Set<String> cifsServers = new HashSet<String>(); Set<String> cifsDomains = new HashSet<String>(); if (from.getCifsServersMap() != null && !from.getCifsServersMap().isEmpty()) { Set<Entry<String, NasCifsServer>> nasCifsServers = from.getCifsServersMap().entrySet(); for (Entry<String, NasCifsServer> nasCifsServer : nasCifsServers) { String serverDomain = nasCifsServer.getKey(); NasCifsServer cifsServer = nasCifsServer.getValue(); if (cifsServer.getDomain() != null) { serverDomain = serverDomain + " = " + cifsServer.getDomain(); cifsDomains.add(cifsServer.getDomain()); } cifsServers.add(serverDomain); } if (cifsServers != null && !cifsServers.isEmpty()) { to.setCifsServers(cifsServers); to.setStorageDomain(cifsDomains); } } for (String port : from.getStoragePorts()) { to.getStoragePorts().add(toRelatedResource(ResourceTypeEnum.STORAGE_PORT, URI.create(port))); } to.setTaggedVirtualArrays(from.getTaggedVirtualArrays()); to.setStorageDeviceURI(toRelatedResource(ResourceTypeEnum.STORAGE_SYSTEM, from.getStorageDeviceURI())); DecimalFormat df = new DecimalFormat("0.00"); // Set the metrics!!! Double maxStorageCapacity = MetricsKeys.getDouble(MetricsKeys.maxStorageCapacity, from.getMetrics()) / GBsINKB; to.setMaxStorageCapacity(df.format(maxStorageCapacity)); to.setMaxStorageObjects(MetricsKeys.getLong(MetricsKeys.maxStorageObjects, from.getMetrics()).toString()); to.setStorageObjects(MetricsKeys.getLong(MetricsKeys.storageObjects, from.getMetrics()).toString()); Double usedStorageCapacity = MetricsKeys.getDouble(MetricsKeys.usedStorageCapacity, from.getMetrics()) / GBsINKB; to.setUsedStorageCapacity(df.format(usedStorageCapacity)); Double percentLoad = MetricsKeys.getDoubleOrNull(MetricsKeys.percentLoad, from.getMetrics()); if (percentLoad != null) { to.setPercentLoad(df.format(percentLoad)); } to.setIsOverloaded(MetricsKeys.getBoolean(MetricsKeys.overLoaded, from.getMetrics())); Double percentBusy = MetricsKeys.getDoubleOrNull(MetricsKeys.emaPercentBusy, from.getMetrics()); if (percentBusy != null) { to.setAvgEmaPercentagebusy(df.format(percentBusy)); } percentBusy = MetricsKeys.getDoubleOrNull(MetricsKeys.avgPortPercentBusy, from.getMetrics()); if (percentBusy != null) { to.setAvgPercentagebusy(df.format(percentBusy)); } return to; } public static StoragePoolRestRep map(StoragePool from, Map<String, Long> capacityMetrics, boolean isBlockStoragePool, CoordinatorClient coordinatorClient) { if (from == null) { return null; } StoragePoolRestRep to = new StoragePoolRestRep(); mapDiscoveredDataObjectFields(from, to); to.setProtocols(from.getProtocols()); to.setControllerParams(new StringMapAdapter().marshal(from.getControllerParams())); to.setOperationalStatus(from.getOperationalStatus()); to.setTotalCapacity(capacityMetrics.get(CapacityUtils.StorageMetrics.USABLE.toString())); to.setFreeCapacity(capacityMetrics.get(CapacityUtils.StorageMetrics.FREE.toString())); to.setUsedCapacity(capacityMetrics.get(CapacityUtils.StorageMetrics.USED.toString())); to.setPercentUsed(capacityMetrics.get(CapacityUtils.StorageMetrics.PERCENT_USED.toString())); if ((null != capacityMetrics.get(CapacityUtils.StorageMetrics.SUBSCRIBED.toString()) && !(capacityMetrics .get(CapacityUtils.StorageMetrics.SUBSCRIBED.toString()).toString().equals(MINUS_ONE_LONG)))) { to.setSubscribedCapacity(capacityMetrics.get(CapacityUtils.StorageMetrics.SUBSCRIBED.toString())); to.setPercentSubscribed(capacityMetrics.get(CapacityUtils.StorageMetrics.PERCENT_SUBSCRIBED.toString())); } to.setMaximumThinVolumeSize(CapacityUtils.convertKBToGB(from.getMaximumThinVolumeSize())); to.setMinimumThinVolumeSize(CapacityUtils.convertKBToGB(from.getMinimumThinVolumeSize())); to.setMaximumThickVolumeSize(CapacityUtils.convertKBToGB(from.getMaximumThickVolumeSize())); to.setMinimumThickVolumeSize(CapacityUtils.convertKBToGB(from.getMinimumThickVolumeSize())); to.setMaxResources(from.getMaxResources()); to.setAssignedVirtualArrays(from.getAssignedVirtualArrays()); to.setConnectedVirtualArrays(from.getConnectedVirtualArrays()); to.setTaggedVirtualArrays(from.getTaggedVirtualArrays()); to.setRaidLevels(from.getSupportedRaidLevels()); to.setThinVolumePreAllocationSupported(from.getThinVolumePreAllocationSupported()); to.setAutoTieringSupported(from.getAutoTieringEnabled()); to.setDriveTypes(from.getSupportedDriveTypes()); to.setCopyTypes(from.getSupportedCopyTypes()); to.setTierUtilizationPercentage(new StringMapAdapter().marshal(from.getTierUtilizationPercentage())); to.setPoolName(from.getPoolName()); to.setPoolServiceType(from.getPoolServiceType()); to.setLongTermRetention(from.getLongTermRetention()); to.setSupportedResourceTypes(from.getSupportedResourceTypes()); to.setStorageSystem(toRelatedResource(ResourceTypeEnum.STORAGE_SYSTEM, from.getStorageDevice())); to.setRegistrationStatus(from.getRegistrationStatus()); to.setCompatibilityStatus(from.getCompatibilityStatus()); to.setDiscoveryStatus(from.getDiscoveryStatus()); to.setDataCenters(from.getDataCenters()); to.setCompressionEnabled(from.getCompressionEnabled()); to.setMaxPoolUtilizationPercentage( (from.getMaxPoolUtilizationPercentage() != null) ? from.getMaxPoolUtilizationPercentage() : Integer.valueOf(ControllerUtils.getPropertyValueFromCoordinator(coordinatorClient, CapacityMatcher.MAX_POOL_UTILIZATION_PERCENTAGE))); if (null != from.getSupportedResourceTypes() && !from.getSupportedResourceTypes().equals(StoragePool.SupportedResourceTypes.THICK_ONLY.name())) { to.setMaxThinPoolSubscriptionPercentage( (from.getMaxThinPoolSubscriptionPercentage() != null) ? from.getMaxThinPoolSubscriptionPercentage() : Integer.valueOf(ControllerUtils.getPropertyValueFromCoordinator(coordinatorClient, CapacityMatcher.MAX_THIN_POOL_SUBSCRIPTION_PERCENTAGE))); } return to; } public static StoragePortRestRep map(StoragePort from) { if (from == null) { return null; } StoragePortRestRep to = new StoragePortRestRep(); mapDiscoveredDataObjectFields(from, to); to.setPortName(from.getPortName()); to.setIpAddress(from.getIpAddress()); to.setTcpPortNumber(from.getTcpPortNumber()); to.setPortNetworkId(from.getPortNetworkId()); to.setPortEndPointId(from.getPortEndPointID()); to.setTransportType(from.getTransportType()); to.setNetwork(toRelatedResource(ResourceTypeEnum.NETWORK, from.getNetwork())); to.setStorageDevice(toRelatedResource(ResourceTypeEnum.STORAGE_SYSTEM, from.getStorageDevice())); to.setPortSpeed(from.getPortSpeed()); to.setPortType(from.getPortType()); to.setPortGroup(from.getPortGroup()); to.setAvgBandwidth(from.getAvgBandwidth()); to.setStaticLoad(from.getStaticLoad()); to.setRegistrationStatus(from.getRegistrationStatus()); to.setCompatibilityStatus(from.getCompatibilityStatus()); to.setOperationalStatus(from.getOperationalStatus()); to.setAssignedVirtualArrays(from.getAssignedVirtualArrays()); to.setConnectedVirtualArrays(from.getConnectedVirtualArrays()); to.setTaggedVirtualArrays(from.getTaggedVirtualArrays()); to.setDiscoveryStatus(from.getDiscoveryStatus()); // Port metrics. Double percentBusy = MetricsKeys.getDoubleOrNull(MetricsKeys.avgPortPercentBusy, from.getMetrics()); if (percentBusy != null) { to.setPortPercentBusy(percentBusy); } percentBusy = MetricsKeys.getDoubleOrNull(MetricsKeys.avgCpuPercentBusy, from.getMetrics()); if (percentBusy != null) { to.setCpuPercentBusy(percentBusy); } to.setAllocationMetric(MetricsKeys.getDouble(MetricsKeys.portMetric, from.getMetrics())); to.setVolumeLoad(MetricsKeys.getLong(MetricsKeys.volumeCount, from.getMetrics())); to.setInitiatorLoad(MetricsKeys.getLong(MetricsKeys.initiatorCount, from.getMetrics())); to.setAllocationDisqualified(MetricsKeys.getBoolean(MetricsKeys.allocationDisqualified, from.getMetrics())); return to; } public static ObjectNamespaceRestRep map(ObjectNamespace from) { if (from == null) { return null; } ObjectNamespaceRestRep to = new ObjectNamespaceRestRep(); to.setNsName(from.getNsName()); to.setNativeId(from.getNativeId()); to.setMapped(from.getMapped()); to.setTenant(from.getTenant()); to.setStorageDevice(from.getStorageDevice()); return to; } public static ObjectUserSecretKeysRestRep map(ObjectUserSecretKey from) { if (from == null) { return null; } ObjectUserSecretKeysRestRep to = new ObjectUserSecretKeysRestRep(); to.setSecret_key_1(from.getSecret_key_1()); to.setSecret_key_1_expiry_timestamp(from.getSecret_key_1_expiry_timestamp()); to.setSecret_key_2(from.getSecret_key_2()); to.setSecret_key_2_expiry_timestamp(from.getSecret_key_2_expiry_timestamp()); return to; } public static ObjectUserSecretKeyAddRestRep map(ObjectUserSecretKey from, boolean b) { if (from == null) { return null; } ObjectUserSecretKeyAddRestRep to = new ObjectUserSecretKeyAddRestRep(); to.setSecret_key(from.getSecret_key_1()); to.setSecret_key_expiry_timestamp(from.getSecret_key_1_expiry_timestamp()); return to; } public static StorageSystemRestRep map(StorageSystem from) { if (from == null) { return null; } StorageSystemRestRep to = new StorageSystemRestRep(); mapDiscoveredSystemObjectFields(from, to); to.setSerialNumber(from.getSerialNumber()); to.setMajorVersion(from.getMajorVersion()); to.setMinorVersion(from.getMinorVersion()); to.setIpAddress(from.getIpAddress()); to.setSecondaryIPs(from.getSecondaryIPs()); to.setPortNumber(from.getPortNumber()); to.setSmisProviderIP(from.getSmisProviderIP()); to.setSmisPortNumber(from.getSmisPortNumber()); to.setSmisUseSSL(from.getSmisUseSSL()); to.setSmisUserName(from.getSmisUserName()); to.setExportMasks(new StringMapAdapter().marshal(from.getExportMasks())); to.setProtocols(from.getProtocols()); to.setReachableStatus(from.getReachableStatus()); to.setFirmwareVersion(from.getFirmwareVersion()); to.setSupportsSoftLimit(from.getSupportSoftLimit()); to.setSupportsNotificationLimit(from.getSupportNotificationLimit()); to.setActiveProvider(toRelatedResource(ResourceTypeEnum.SMIS_PROVIDER, from.getActiveProviderURI())); if (from.getProviders() != null) { for (String provider : from.getProviders()) { to.getProviders().add(toRelatedResource(ResourceTypeEnum.SMIS_PROVIDER, URI.create(provider))); } } to.setUsername(from.getUsername()); to.setModel(from.getModel()); to.setSupportedProvisioningType(from.getSupportedProvisioningType()); to.setSupportedAsynchronousActions(from.getSupportedAsynchronousActions()); to.setMaxResources(from.getMaxResources()); to.setRemotelyConnectedTo(from.getRemotelyConnectedTo()); to.setSupportedReplicationTypes(from.getSupportedReplicationTypes()); to.setAveragePortMetrics(from.getAveragePortMetrics()); to.setArrayAffinityJobStatus(from.getArrayAffinityStatus()); to.setLastArrayAffinityStatusMessage(from.getLastArrayAffinityStatusMessage()); to.setLastArrayAffinityRunTime(from.getLastArrayAffinityRunTime()); to.setNextArrayAffinityRunTime(from.getNextArrayAffinityRunTime()); to.setSuccessArrayAffinityTime(from.getSuccessArrayAffinityTime()); return to; } public static DecommissionedResourceRep map(DecommissionedResource from) { if (from == null) { return null; } DecommissionedResourceRep to = new DecommissionedResourceRep(); to.setDecommissionedId(from.getDecommissionedId().toString()); to.setNativeGuid(from.getNativeGuid()); to.setType(from.getType()); to.setUser(from.getUser()); return to; } public static StorageSystemTypeRestRep map(StorageSystemType from, StorageSystemTypeRestRep to) { if (from == null) { return null; } to.setStorageTypeName(from.getStorageTypeName()); to.setMetaType(from.getMetaType()); to.setIsSmiProvider(from.getIsSmiProvider()); to.setStorageTypeId(from.getStorageTypeId()); to.setStorageTypeDispName(from.getStorageTypeDispName()); to.setIsDefaultSsl(from.getIsDefaultSsl()); to.setIsDefaultMDM(from.getIsDefaultMDM()); to.setIsOnlyMDM(from.getIsOnlyMDM()); to.setIsElementMgr(from.getIsElementMgr()); to.setNonSslPort(from.getNonSslPort()); to.setSslPort(from.getSslPort()); to.setDriverClassName(from.getDriverClassName()); to.setIsSecretKey(from.getIsSecretKey()); to.setSupportAutoTierPolicy(from.getSupportAutoTierPolicy()); if (from.getManagedBy() != null) { to.setManagedBy(from.getManagedBy()); } if (from.getIsNative() != null) { to.setNative(from.getIsNative()); } return to; } public static StorageSystemTypeRestRep map(StorageSystemType from) { if (from == null) { return null; } StorageSystemTypeRestRep to = new StorageSystemTypeRestRep(); to.setStorageTypeName(from.getStorageTypeName()); to.setMetaType(from.getMetaType()); to.setIsSmiProvider(from.getIsSmiProvider()); to.setStorageTypeId(from.getStorageTypeId()); to.setStorageTypeDispName(from.getStorageTypeDispName()); to.setIsDefaultSsl(from.getIsDefaultSsl()); to.setIsDefaultMDM(from.getIsDefaultMDM()); to.setIsOnlyMDM(from.getIsOnlyMDM()); to.setIsElementMgr(from.getIsElementMgr()); to.setNonSslPort(from.getNonSslPort()); to.setSslPort(from.getSslPort()); to.setDriverClassName(from.getDriverClassName()); to.setIsSecretKey(from.getIsSecretKey()); to.setSupportAutoTierPolicy(from.getSupportAutoTierPolicy()); if (from.getManagedBy() != null) { to.setManagedBy(from.getManagedBy()); } if (from.getIsNative() != null) { to.setNative(from.getIsNative()); } return to; } }