package com.sequenceiq.cloudbreak.service.network;
import static com.sequenceiq.cloudbreak.api.model.ExposedService.ACCUMULO_MASTER;
import static com.sequenceiq.cloudbreak.api.model.ExposedService.ACCUMULO_TSERVER;
import static com.sequenceiq.cloudbreak.api.model.ExposedService.AMBARI;
import static com.sequenceiq.cloudbreak.api.model.ExposedService.ATLAS;
import static com.sequenceiq.cloudbreak.api.model.ExposedService.CONSUL;
import static com.sequenceiq.cloudbreak.api.model.ExposedService.CONTAINER_LOGS;
import static com.sequenceiq.cloudbreak.api.model.ExposedService.DRUID_SUPERSET;
import static com.sequenceiq.cloudbreak.api.model.ExposedService.ELASTIC_SEARCH;
import static com.sequenceiq.cloudbreak.api.model.ExposedService.FALCON;
import static com.sequenceiq.cloudbreak.api.model.ExposedService.HBASE_MASTER;
import static com.sequenceiq.cloudbreak.api.model.ExposedService.HBASE_MASTER_WEB;
import static com.sequenceiq.cloudbreak.api.model.ExposedService.HBASE_REGION;
import static com.sequenceiq.cloudbreak.api.model.ExposedService.HBASE_REGION_INFO;
import static com.sequenceiq.cloudbreak.api.model.ExposedService.HIVE_METASTORE;
import static com.sequenceiq.cloudbreak.api.model.ExposedService.HIVE_SERVER;
import static com.sequenceiq.cloudbreak.api.model.ExposedService.HIVE_SERVER_HTTP;
import static com.sequenceiq.cloudbreak.api.model.ExposedService.HTTPS;
import static com.sequenceiq.cloudbreak.api.model.ExposedService.JOB_HISTORY_SERVER;
import static com.sequenceiq.cloudbreak.api.model.ExposedService.KIBANA;
import static com.sequenceiq.cloudbreak.api.model.ExposedService.KNOX_GW;
import static com.sequenceiq.cloudbreak.api.model.ExposedService.NAMENODE;
import static com.sequenceiq.cloudbreak.api.model.ExposedService.OOZIE;
import static com.sequenceiq.cloudbreak.api.model.ExposedService.RANGER;
import static com.sequenceiq.cloudbreak.api.model.ExposedService.RESOURCEMANAGER_IPC;
import static com.sequenceiq.cloudbreak.api.model.ExposedService.RESOURCEMANAGER_SCHEDULER;
import static com.sequenceiq.cloudbreak.api.model.ExposedService.RESOURCEMANAGER_WEB;
import static com.sequenceiq.cloudbreak.api.model.ExposedService.SHIPYARD;
import static com.sequenceiq.cloudbreak.api.model.ExposedService.SPARK_HISTORY_SERVER;
import static com.sequenceiq.cloudbreak.api.model.ExposedService.SSH;
import static com.sequenceiq.cloudbreak.api.model.ExposedService.STORM;
import static com.sequenceiq.cloudbreak.api.model.ExposedService.SWARM;
import static com.sequenceiq.cloudbreak.api.model.ExposedService.ZEPPELIN_UI;
import static com.sequenceiq.cloudbreak.api.model.ExposedService.ZEPPELIN_WEB_SOCKET;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import com.google.common.base.Optional;
import com.sequenceiq.cloudbreak.api.model.ExposedService;
import com.sequenceiq.cloudbreak.api.model.Port;
import com.sequenceiq.cloudbreak.api.model.EndpointRule;
import com.sequenceiq.cloudbreak.domain.InstanceGroup;
import com.sequenceiq.cloudbreak.domain.SecurityRule;
import com.sequenceiq.cloudbreak.domain.Stack;
public final class NetworkUtils {
private static List<Port> ports = new ArrayList<>();
static {
ports.add(new Port(SSH, "22", "tcp"));
ports.add(new Port(HTTPS, "443", "tcp"));
ports.add(new Port(AMBARI, "8080", "tcp"));
ports.add(new Port(CONSUL, "8500", "tcp"));
ports.add(new Port(NAMENODE, "50070", "tcp"));
ports.add(new Port(RESOURCEMANAGER_WEB, "8088", "tcp"));
ports.add(new Port(RESOURCEMANAGER_SCHEDULER, "8030", "tcp"));
ports.add(new Port(RESOURCEMANAGER_IPC, "8050", "tcp"));
ports.add(new Port(JOB_HISTORY_SERVER, "19888", "tcp"));
ports.add(new Port(HBASE_MASTER_WEB, "16010", "tcp"));
ports.add(new Port(HBASE_MASTER, "60000", "tcp"));
ports.add(new Port(HBASE_REGION, "16020", "tcp"));
ports.add(new Port(HBASE_REGION_INFO, "16030", "tcp"));
ports.add(new Port(HIVE_METASTORE, "9083", "tcp"));
ports.add(new Port(HIVE_SERVER, "10000", "tcp"));
ports.add(new Port(HIVE_SERVER_HTTP, "10001", "tcp"));
ports.add(new Port(ACCUMULO_MASTER, "9999", "tcp"));
ports.add(new Port(ACCUMULO_TSERVER, "9997", "tcp"));
ports.add(new Port(ATLAS, "21000", "tcp"));
ports.add(new Port(KNOX_GW, "8443", "tcp"));
ports.add(new Port(FALCON, "15000", "tcp"));
ports.add(new Port(STORM, "8744", "tcp"));
ports.add(new Port(OOZIE, "11000", "tcp"));
ports.add(new Port(SPARK_HISTORY_SERVER, "18080", "tcp"));
ports.add(new Port(CONTAINER_LOGS, "8042", "tcp"));
ports.add(new Port(ZEPPELIN_WEB_SOCKET, "9996", "tcp"));
ports.add(new Port(ZEPPELIN_UI, "9995", "tcp"));
ports.add(new Port(RANGER, "6080", "tcp"));
ports.add(new Port(KIBANA, "3080", "tcp"));
ports.add(new Port(ELASTIC_SEARCH, "9200", "tcp"));
ports.add(new Port(SWARM, "3376", "tcp"));
ports.add(new Port(SHIPYARD, "7070", "tcp"));
ports.add(new Port(DRUID_SUPERSET, "9088", "tcp"));
}
private NetworkUtils() {
throw new IllegalStateException();
}
public static List<Port> getPortsWithoutAclRules() {
return ports;
}
public static List<Port> getPorts(Optional<Stack> stack) {
List<Port> result = new ArrayList<>();
if (stack.isPresent()) {
Stack stackInstance = stack.get();
List<EndpointRule> aclRules = createACLRules(stackInstance);
for (InstanceGroup instanceGroup : stackInstance.getInstanceGroups()) {
for (SecurityRule rule : instanceGroup.getSecurityGroup().getSecurityRules()) {
for (String portNumber : rule.getPorts()) {
Port port = getPortByPortNumberAndProtocol(portNumber, rule.getProtocol());
if (port != null) {
result.add(new Port(port.getExposedService(), portNumber, portNumber, rule.getProtocol(), aclRules));
}
}
}
}
} else {
result.addAll(ports);
}
return result;
}
private static List<EndpointRule> createACLRules(Stack stack) {
List<EndpointRule> rules = new LinkedList<>();
for (InstanceGroup instanceGroup : stack.getInstanceGroups()) {
for (SecurityRule rule : instanceGroup.getSecurityGroup().getSecurityRules()) {
rules.add(new EndpointRule(EndpointRule.Action.PERMIT.getText(), rule.getCidr()));
}
}
EndpointRule internalRule = new EndpointRule(EndpointRule.Action.PERMIT.toString(), stack.getNetwork().getSubnetCIDR());
rules.add(internalRule);
rules.add(EndpointRule.DENY_RULE);
return rules;
}
private static Port getPortByPortNumberAndProtocol(String portNumber, String protocol) {
for (Port port : ports) {
if (portNumber.equals(port.getPort()) && protocol.equals(port.getProtocol())) {
return port;
}
}
return null;
}
public static Port getPortByServiceName(ExposedService exposedService) {
for (Port port : ports) {
if (port.getExposedService().equals(exposedService)) {
return port;
}
}
return null;
}
}