/* * Copyright (c) 2015 EMC Corporation * All Rights Reserved */ package com.emc.storageos.api.mapper.functions; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; import org.apache.commons.lang.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.emc.storageos.api.mapper.VirtualArrayMapper; 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.Network; import com.emc.storageos.db.client.model.StoragePort.TransportType; import com.emc.storageos.model.EndpointAliasRestRep; import com.emc.storageos.model.varray.NetworkRestRep; import com.emc.storageos.util.NetworkUtil; import com.google.common.base.Function; public class MapNetwork implements Function<Network, NetworkRestRep> { private static final Logger logger = LoggerFactory.getLogger(MapNetwork.class); private static final MapNetwork INSTANCE = new MapNetwork(); private static final String REMOTE_PORT_NAME = "remotePortName"; private static final String REMOTE_PORT_ALIAS = "remotePortAlias"; public static MapNetwork getInstance() { return INSTANCE; } private MapNetwork() { } @Override public NetworkRestRep apply(Network resource) { return VirtualArrayMapper.map(resource); } /** * Map <code>Network</code> to <code>NetworkRestRep</code> object. Since <code>remote_port_alias</code> is not readily available, it * must be read from corresponded <code>FCEndpoint</code>. * * @param network * @param dbClient * @return */ public static NetworkRestRep toNetworkRestRep(Network network, DbClient dbClient) { NetworkRestRep networkRestRep = MapNetwork.getInstance().apply(network); List<EndpointAliasRestRep> endpoints = networkRestRep.getEndpointsDiscovered(); if (endpoints.isEmpty() || !network.getDiscovered() || !network.getTransportType().equalsIgnoreCase(TransportType.FC.name())) { return networkRestRep; } try { String fabricWwn = NetworkUtil.getNetworkWwn(network); if (fabricWwn != null && !fabricWwn.isEmpty()) { Map<String, EndpointAliasRestRep> aliasMap = new HashMap<String, EndpointAliasRestRep>(); for (EndpointAliasRestRep endpointAliasRestRep : endpoints) { aliasMap.put(endpointAliasRestRep.getName(), endpointAliasRestRep); } URIQueryResultList uriList = new URIQueryResultList(); dbClient.queryByConstraint(AlternateIdConstraint.Factory. getFCEndpointByFabricWwnConstraint(NetworkUtil.getNetworkWwn(network)), uriList); Set<String> fields = new HashSet<String>(); fields.add(REMOTE_PORT_NAME); fields.add(REMOTE_PORT_ALIAS); Iterator<FCEndpoint> iterator = dbClient.queryIterativeObjectFields(FCEndpoint.class, fields, uriList); while (iterator.hasNext()) { FCEndpoint fc = iterator.next(); if (fc != null && !StringUtils.isEmpty(fc.getRemotePortAlias())) { String portWWN = fc.getRemotePortName(); EndpointAliasRestRep restRep = aliasMap.get(portWWN); if (restRep != null) { logger.debug("Found alias {} for WWN {} in network {}", new Object[] { fc.getRemotePortAlias(), portWWN, networkRestRep.getId() }); restRep.setAlias(fc.getRemotePortAlias()); } } } } } catch (Exception ex) { logger.error("Unable to display alias information because an error encountered while getting" + " alias information for network " + networkRestRep.getId(), ex); } return networkRestRep; } }