/* * Copyright (c) 2015 EMC Corporation * All Rights Reserved */ package com.emc.storageos.api.mapper.functions; import java.net.URI; import org.apache.commons.lang.StringUtils; import com.emc.storageos.api.mapper.SystemsMapper; import com.emc.storageos.db.client.DbClient; import com.emc.storageos.db.client.constraint.AlternateIdConstraint; import com.emc.storageos.db.client.constraint.URIQueryResultList; import com.emc.storageos.db.client.model.FCEndpoint; import com.emc.storageos.db.client.model.StorageHADomain; import com.emc.storageos.db.client.model.StoragePort; import com.emc.storageos.model.ports.StoragePortRestRep; import com.google.common.base.Function; public class MapStoragePort implements Function<StoragePort, StoragePortRestRep> { public static final MapStoragePort instance = new MapStoragePort(); // The DB client is required to query the FCEndpoint private DbClient dbClient; public static MapStoragePort getInstance(DbClient dbClient) { instance.setDbClient(dbClient); return instance; } private MapStoragePort() { } private void setDbClient(DbClient dbClient) { this.dbClient = dbClient; } @Override public StoragePortRestRep apply(StoragePort resource) { StoragePortRestRep storagePortRestRep = SystemsMapper.map(resource); applyAliasToStoragePortRestRep(storagePortRestRep); applyAdapterNameToStoragePortRestRep(storagePortRestRep, resource); return storagePortRestRep; } /** * Translate <code>StoragePort</code> object to <code>StoragePortRestRep</code> * * @param storagePort * @return */ public StoragePortRestRep toStoragePortRestRep(StoragePort storagePort) { return apply(storagePort); } /** * Convenient method to map wwn alias to its corresponded port wwn id * * @param storagePortRestRep */ private void applyAliasToStoragePortRestRep(StoragePortRestRep storagePortRestRep) { if (dbClient == null) { return; } URIQueryResultList uriList = new URIQueryResultList(); dbClient.queryByConstraint(AlternateIdConstraint.Factory. getFCEndpointRemotePortNameConstraint(storagePortRestRep.getPortNetworkId()), uriList); for (URI uri : uriList) { FCEndpoint ep = dbClient.queryObject(FCEndpoint.class, uri); if (ep != null && !StringUtils.isEmpty(ep.getRemotePortAlias())) { storagePortRestRep.setPortAlias(ep.getRemotePortAlias()); } } } /** * Adds StorageHADomain name into StoragePortRestRep object, * if the StoragePort's HADomain is not set, then StoragePort's * PortGroup value will be assigned to StoragePortRestRep * adapterName attribute * StoragePort is not set for Isilon and DataDomain devices. * * @param storagePortRestRep * @param resource */ private void applyAdapterNameToStoragePortRestRep(StoragePortRestRep storagePortRestRep, StoragePort resource) { if (dbClient == null) { return; } if (resource != null && resource.getStorageHADomain() != null) { StorageHADomain tempObj = dbClient.queryObject( StorageHADomain.class, resource.getStorageHADomain()); if (tempObj.getAdapterName() != null && !StringUtils.isEmpty(tempObj.getAdapterName())) { storagePortRestRep.setAdapterName(tempObj.getAdapterName()); } else { storagePortRestRep.setAdapterName(resource.getPortGroup()); } } else if (resource.getStorageHADomain() == null) { /** * When StoragePort's StorageHADomain value is not set * assign StoragePort's PortGroup value to adapter-name */ storagePortRestRep.setAdapterName(resource.getPortGroup()); } } }