/*
* Copyright (c) 2015 EMC Corporation
* All Rights Reserved
*/
package util;
import com.emc.storageos.model.EndpointAliasRestRep;
import com.emc.storageos.model.NamedRelatedResourceRep;
import com.emc.storageos.model.StringHashMapEntry;
import com.emc.storageos.model.host.InitiatorRestRep;
import com.emc.storageos.model.host.IpInterfaceRestRep;
import com.emc.storageos.model.ports.StoragePortRestRep;
import com.emc.storageos.model.varray.NetworkCreate;
import com.emc.storageos.model.varray.NetworkEndpointParam;
import com.emc.storageos.model.varray.NetworkRestRep;
import com.emc.storageos.model.varray.NetworkUpdate;
import com.emc.vipr.client.core.filters.NetworkVirtualArrayFilter;
import com.emc.vipr.client.core.filters.ResourceFilter;
import com.emc.vipr.client.core.util.CachedResources;
import com.emc.vipr.client.exceptions.ViPRHttpException;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.common.collect.Sets;
import models.BlockProtocols;
import models.FileProtocols;
import models.TransportProtocols;
import org.apache.commons.lang.StringUtils;
import java.net.URI;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;
import static com.emc.vipr.client.core.util.ResourceUtils.mapNames;
import static com.emc.vipr.client.core.util.ResourceUtils.refIds;
import static com.emc.vipr.client.core.util.ResourceUtils.uri;
import static util.BourneUtil.getViprClient;
public class NetworkUtils {
public static CachedResources<NetworkRestRep> createCache() {
return new CachedResources<NetworkRestRep>(getViprClient().networks());
}
public static NetworkRestRep getNetwork(String id) {
return getNetwork(uri(id));
}
public static NetworkRestRep getNetwork(URI id) {
try {
return getViprClient().networks().get(id);
} catch (ViPRHttpException e) {
if (e.getHttpCode() == 404) {
return null;
}
throw e;
}
}
public static List<NetworkRestRep> getNetworks() {
return getViprClient().networks().getAll();
}
public static List<NetworkRestRep> getNetworks(List<URI> ids) {
return getViprClient().networks().getByIds(ids);
}
public static Map<URI, String> getNetworkNames() {
return mapNames(getViprClient().networks().list());
}
public static Map<URI, String> getNetworkNamesByVirtualArray(String virtualArrayId) {
return mapNames(getViprClient().networks().listByVirtualArray(uri(virtualArrayId)));
}
public static List<NetworkRestRep> getNetworksByVirtualArray(String virtualArrayId) {
return getViprClient().networks().getByVirtualArray(uri(virtualArrayId));
}
public static List<NetworkRestRep> getNetworksAssignableToVirtualArray(String virtualArrayId) {
return getViprClient().networks().getAll(new NetworkVirtualArrayFilter(uri(virtualArrayId)).not());
}
public static List<IpInterfaceRestRep> getIpInterfaces(URI networkId) {
return getViprClient().ipInterfaces().getByNetwork(networkId);
}
public static List<InitiatorRestRep> getInitiators(URI networkId) {
return getViprClient().initiators().getByNetwork(networkId);
}
public static List<IpInterfaceRestRep> getEligibleIpInterfaces(URI networkId) {
final Set<URI> idsInNetwork = Sets.newHashSet();
if (networkId != null) {
List<NamedRelatedResourceRep> refs = getViprClient().ipInterfaces().listByNetwork(networkId);
idsInNetwork.addAll(refIds(refs));
}
List<URI> allIds = getViprClient().ipInterfaces().listBulkIds();
return getViprClient().ipInterfaces().getByIds(allIds, new ResourceFilter<IpInterfaceRestRep>() {
private Set<String> loopbacks = Sets.newHashSet("127.0.0.1", "::1", "0:0:0:0:0:0:0:1");
@Override
public boolean acceptId(URI id) {
// Allow any IP interfaces not in the network
return !idsInNetwork.contains(id);
}
@Override
public boolean accept(IpInterfaceRestRep item) {
// Skip any loopback interfaces
return !loopbacks.contains(item.getIpAddress());
}
});
}
public static Set<String> getSupportedProtocols(NetworkRestRep network) {
Set<String> protocols = Sets.newHashSet();
if (TransportProtocols.isFc(network.getTransportType())) {
protocols.add(BlockProtocols.FC);
}
else if (TransportProtocols.isIp(network.getTransportType())) {
protocols.add(BlockProtocols.iSCSI);
protocols.add(BlockProtocols.RBD);
protocols.add(FileProtocols.CIFS);
protocols.add(FileProtocols.NFS);
protocols.add(FileProtocols.NFSV4);
}
else if (TransportProtocols.isEthernet(network.getTransportType())) {
protocols.add(BlockProtocols.FCoE);
} else if (TransportProtocols.isScaleIO(network.getTransportType())) {
protocols.add(BlockProtocols.ScaleIO);
}
return protocols;
}
public static List<InitiatorRestRep> getEligibleInitiators(URI networkId, final Set<String> protocols) {
if (protocols.isEmpty()) {
return Lists.newArrayList();
}
final Set<URI> idsInNetwork = Sets.newHashSet();
if (networkId != null) {
List<NamedRelatedResourceRep> refs = getViprClient().initiators().listByNetwork(networkId);
idsInNetwork.addAll(refIds(refs));
}
List<URI> allIds = getViprClient().initiators().listBulkIds();
return getViprClient().initiators().getByIds(allIds, new ResourceFilter<InitiatorRestRep>() {
@Override
public boolean acceptId(URI id) {
// Allow any initiators not in the network
return !idsInNetwork.contains(id);
}
@Override
public boolean accept(InitiatorRestRep item) {
// Allow initiators with the supported protocols
return protocols.contains(item.getProtocol());
}
});
}
public static Set<String> getDiscoveredEndpoints(NetworkRestRep networks) {
Set<String> endpoints = Sets.newHashSet();
for (StringHashMapEntry entry : networks.getEndpointsDiscovered()) {
if ("true".equals(entry.getValue())) {
endpoints.add(entry.getName());
}
}
return endpoints;
}
public static Map<String, String> getAliases(NetworkRestRep networks) {
Map<String, String> aliases = Maps.newHashMap();
for (EndpointAliasRestRep endpoint : networks.getEndpointsDiscovered()) {
aliases.put(endpoint.getName(), endpoint.getAlias());
}
return aliases;
}
public static List<String> getEndPoints(StoragePortRestRep port) {
String endPointId = StringUtils.substringBefore(port.getPortEndPointId(), ",");
if (StringUtils.isNotBlank(endPointId)) {
return Arrays.asList(port.getPortNetworkId(), endPointId);
}
else {
return Arrays.asList(port.getPortNetworkId());
}
}
public static String getEndPoint(IpInterfaceRestRep ipInterface) {
return ipInterface.getIpAddress();
}
public static String getEndPoint(InitiatorRestRep initiator) {
return initiator.getInitiatorPort();
}
public static NetworkRestRep create(NetworkCreate param) {
return getViprClient().networks().create(param);
}
public static NetworkRestRep update(String id, NetworkUpdate param) {
return update(uri(id), param);
}
public static NetworkRestRep update(URI id, NetworkUpdate param) {
return getViprClient().networks().update(id, param);
}
public static void deactivate(URI id) {
deactivate(id, false);
}
public static void deactivate(URI id, boolean force) {
getViprClient().networks().deactivate(id, force);
}
public static void register(URI id) {
getViprClient().networks().register(id);
}
public static void deregister(URI id) {
getViprClient().networks().deregister(id);
}
public static NetworkRestRep addEndpoints(String networkId, Collection<String> endpoints) {
NetworkEndpointParam param = new NetworkEndpointParam();
param.setOp("add");
param.setEndpoints(Lists.newArrayList(endpoints));
return getViprClient().networks().updateEndpoints(uri(networkId), param);
}
public static NetworkRestRep removeEndpoints(String networkId, Collection<String> endpoints) {
NetworkEndpointParam param = new NetworkEndpointParam();
param.setOp("remove");
param.setEndpoints(Lists.newArrayList(endpoints));
return getViprClient().networks().updateEndpoints(uri(networkId), param);
}
public static List<String> getHostEndpoints(Collection<String> ids) {
List<String> endpoints = Lists.newArrayList();
for (String id : ids) {
if (isIpInterfaceId(id)) {
IpInterfaceRestRep ipInterface = getViprClient().ipInterfaces().get(uri(id));
if (ipInterface != null) {
endpoints.add(ipInterface.getIpAddress());
}
}
else if (isInitiatorId(id)) {
InitiatorRestRep initiator = getViprClient().initiators().get(uri(id));
if (initiator != null) {
endpoints.add(initiator.getInitiatorPort());
}
}
else if (!isId(id) && StringUtils.isNotBlank(id)) {
endpoints.add(id);
}
}
return endpoints;
}
public static List<String> getStoragePortEndpoints(Collection<String> ids) {
List<String> endpoints = Lists.newArrayList();
for (String id : ids) {
if (isStoragePortId(id)) {
endpoints.add(id);
}
}
return endpoints;
}
private static boolean isId(String id) {
return StringUtils.startsWith(id, "urn:");
}
private static boolean isIpInterfaceId(String id) {
return isId(id) && StringUtils.contains(id, "IpInterface");
}
private static boolean isInitiatorId(String id) {
return isId(id) && StringUtils.contains(id, "Initiator");
}
private static boolean isStoragePortId(String id) {
return isId(id) && StringUtils.contains(id, "StoragePort");
}
}