/*
* Copyright (c) 2012-2015 iWave Software LLC
* All Rights Reserved
*/
package com.emc.sa.asset.providers;
import java.net.URI;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.commons.lang.StringUtils;
import com.emc.sa.asset.AssetOptionsContext;
import com.emc.sa.asset.AssetOptionsUtils;
import com.emc.sa.asset.BaseAssetOptionsProvider;
import com.emc.storageos.model.DiscoveredSystemObjectRestRep;
import com.emc.storageos.model.host.HostRestRep;
import com.emc.storageos.model.host.cluster.ClusterRestRep;
import com.emc.vipr.client.core.util.ResourceUtils;
import com.emc.vipr.model.catalog.AssetOption;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
public class BaseHostProvider extends BaseAssetOptionsProvider {
private static final String DISCOVERY_ERROR = "ERROR";
private static final String DISCOVERY_NOT_CONNECTED = "NOTCONNECTED";
protected String getDiscoveryError(DiscoveredSystemObjectRestRep system) {
if (DISCOVERY_ERROR.equals(system.getDiscoveryJobStatus())) {
return getMessage("discovery.failed");
} else if (DISCOVERY_NOT_CONNECTED.equals(system.getDiscoveryJobStatus())) {
return getMessage("discovery.notConnected");
}
// No error
return null;
}
protected String getClusterName(AssetOptionsContext ctx, HostRestRep host) {
return getClusterName(ctx, host, null);
}
protected String getClusterName(AssetOptionsContext ctx, HostRestRep host, Map<URI, String> clusters) {
if (host.getCluster() != null) {
if (clusters != null) {
return clusters.get(host.getCluster().getId());
} else {
ClusterRestRep cluster = api(ctx).clusters().get(host.getCluster());
if (cluster != null) {
return cluster.getName();
}
}
}
return null;
}
protected List<AssetOption> createHostOptions(AssetOptionsContext ctx, Collection<HostRestRep> hosts) {
return createHostOptions(ctx, hosts, null);
}
protected List<AssetOption> createHostOptions(AssetOptionsContext ctx, Collection<HostRestRep> hosts,
Map<URI, String> clusters) {
List<AssetOption> options = Lists.newArrayList();
for (HostRestRep value : hosts) {
options.add(createHostOption(ctx, value, clusters));
}
AssetOptionsUtils.sortOptionsByLabel(options);
return options;
}
protected List<AssetOption> createFileHostOptions(AssetOptionsContext ctx, Collection<HostRestRep> hosts) {
List<AssetOption> options = Lists.newArrayList();
for (HostRestRep value : hosts) {
options.add(createFileHostOption(ctx, value));
}
AssetOptionsUtils.sortOptionsByLabel(options);
return options;
}
protected AssetOption createHostOption(AssetOptionsContext ctx, HostRestRep host) {
return createHostOption(ctx, host, null);
}
protected AssetOption createHostOption(AssetOptionsContext ctx, HostRestRep host, Map<URI, String> clusters) {
String discoveryMessage = getDiscoveryError(host);
String clusterName = getClusterName(ctx, host, clusters);
String label = host.getName();
if (StringUtils.isNotBlank(clusterName)) {
label = getMessage("host.memberOfCluster", host.getName(), clusterName);
}
if (discoveryMessage != null) {
label = getMessage("host.withDiscovery", host.getName(), discoveryMessage);
}
return new AssetOption(host.getId(), label);
}
protected AssetOption createFileHostOption(AssetOptionsContext ctx, HostRestRep host) {
String clusterName = getClusterName(ctx, host);
String label = host.getName();
if (StringUtils.isNotBlank(clusterName)) {
label = getMessage("host.memberOfCluster", host.getName(), clusterName);
}
return new AssetOption(host.getId(), label);
}
protected List<ClusterRestRep> getClusters(AssetOptionsContext context, List<HostRestRep> hosts) {
Set<URI> clusterIds = Sets.newHashSet();
for (HostRestRep host : hosts) {
URI clusterId = ResourceUtils.id(host.getCluster());
if (clusterId != null) {
clusterIds.add(clusterId);
}
}
return api(context).clusters().getByIds(clusterIds, null);
}
protected Map<URI, String> getClustersMap(AssetOptionsContext context, List<HostRestRep> hosts) {
Set<URI> clusterIds = Sets.newHashSet();
for (HostRestRep host : hosts) {
URI clusterId = ResourceUtils.id(host.getCluster());
if (clusterId != null) {
clusterIds.add(clusterId);
}
}
Collection<ClusterRestRep> clusters = api(context).clusters().getByIds(clusterIds, null);
Map<URI, String> clusterMap = new HashMap<URI, String>();
for (ClusterRestRep cluster : clusters) {
clusterMap.put(cluster.getId(), cluster.getName());
}
return clusterMap;
}
protected List<AssetOption> createClusterOptions(AssetOptionsContext ctx, Collection<ClusterRestRep> clusters) {
List<AssetOption> options = Lists.newArrayList();
for (ClusterRestRep value : clusters) {
options.add(createClusterOption(ctx, value));
}
AssetOptionsUtils.sortOptionsByLabel(options);
return options;
}
protected AssetOption createClusterOption(AssetOptionsContext ctx, ClusterRestRep cluster) {
String label = cluster.getName();
return new AssetOption(cluster.getId(), label);
}
protected List<AssetOption> getHostOrClusterOptions(AssetOptionsContext context, List<HostRestRep> hosts,
String storageType) {
if (BlockProvider.isExclusiveStorage(storageType)) {
Map<URI, String> clusters = getClustersMap(context, hosts);
return createHostOptions(context, hosts, clusters);
} else {
List<ClusterRestRep> clusters = getClusters(context, hosts);
return createClusterOptions(context, clusters);
}
}
}