package io.cattle.platform.hazelcast.factory;
import io.cattle.platform.archaius.util.ArchaiusUtil;
import io.cattle.platform.hazelcast.dao.HazelcastDao;
import io.cattle.platform.hazelcast.membership.DBDiscovery;
import io.cattle.platform.hazelcast.membership.DBDiscoveryFactory;
import java.util.Arrays;
import javax.inject.Inject;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.hazelcast.config.Config;
import com.hazelcast.config.DiscoveryConfig;
import com.hazelcast.config.DiscoveryStrategyConfig;
import com.hazelcast.config.GroupConfig;
import com.hazelcast.config.JoinConfig;
import com.hazelcast.config.NetworkConfig;
import com.hazelcast.core.Hazelcast;
import com.hazelcast.core.HazelcastInstance;
import com.netflix.config.DynamicBooleanProperty;
import com.netflix.config.DynamicStringProperty;
public class HazelcastFactory {
private static final DynamicStringProperty NAME = ArchaiusUtil.getString("hazelcast.group.name");
private static final DynamicStringProperty PASS = ArchaiusUtil.getString("hazelcast.group.password");
private static final DynamicBooleanProperty JMX = ArchaiusUtil.getBoolean("hazelcast.jmx");
private static final DynamicStringProperty LOGGING = ArchaiusUtil.getString("hazelcast.logging.type");
private static final Logger log = LoggerFactory.getLogger(HazelcastFactory.class);
HazelcastDao hazelcastDao;
@Inject
DBDiscoveryFactory dbDiscoveryFactory;
@Inject
DBDiscovery dbDiscovery;
public HazelcastInstance newInstance() {
String name = NAME.get();
String password = PASS.get();
if (StringUtils.isBlank(name)) {
name = hazelcastDao.getGroupName();
}
if (StringUtils.isBlank(password)) {
password = hazelcastDao.getGroupPassword();
}
Config config = new Config();
if (JMX.get()) {
config.setProperty("hazelcast.jmx", "true");
}
config.setProperty("hazelcast.logging.type", LOGGING.get());
config.setProperty("hazelcast.discovery.enabled", "true");
GroupConfig groupConfig = new GroupConfig();
groupConfig.setName(name);
groupConfig.setPassword(password);
config.setGroupConfig(groupConfig);
DiscoveryStrategyConfig dsc = new DiscoveryStrategyConfig(dbDiscoveryFactory);
DiscoveryConfig dc = new DiscoveryConfig();
dc.setDiscoveryStrategyConfigs(Arrays.asList(dsc));
JoinConfig joinConfig = new JoinConfig();
joinConfig.setDiscoveryConfig(dc);
joinConfig.getTcpIpConfig().setEnabled(false);
joinConfig.getMulticastConfig().setEnabled(false);
joinConfig.getAwsConfig().setEnabled(false);
NetworkConfig nc = new NetworkConfig();
nc.setPort(DBDiscovery.DEFAULT_PORT.get());
nc.setJoin(joinConfig);
nc.setPublicAddress(dbDiscovery.getLocalConfig().getAdvertiseAddress());
config.setNetworkConfig(nc);
HazelcastInstance hi = Hazelcast.newHazelcastInstance(config);
while (!hi.getPartitionService().isClusterSafe()) {
log.info("Waiting for cluster to be in a steady state");
try {
Thread.sleep(2000L);
} catch (InterruptedException e) {
throw new IllegalStateException("Waiting for cluster to be in a steady state", e);
}
}
return hi;
}
public HazelcastDao getHazelcastDao() {
return hazelcastDao;
}
@Inject
public void setHazelcastDao(HazelcastDao hazelcastDao) {
this.hazelcastDao = hazelcastDao;
}
}