package io.mycat.server.config.loader.zkloader;
import org.apache.curator.framework.CuratorFramework;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.yaml.snakeyaml.Yaml;
import java.io.InputStream;
import java.util.Arrays;
import java.util.Map;
import io.mycat.locator.ZookeeperServiceLocator;
import io.mycat.server.config.ConfigException;
import io.mycat.server.config.cluster.MycatClusterConfig;
import io.mycat.server.config.loader.ConfigLoader;
import io.mycat.server.config.node.CharsetConfig;
import io.mycat.server.config.node.DataHostConfig;
import io.mycat.server.config.node.DataNodeConfig;
import io.mycat.server.config.node.HostIndexConfig;
import io.mycat.server.config.node.QuarantineConfig;
import io.mycat.server.config.node.RuleConfig;
import io.mycat.server.config.node.SchemaConfig;
import io.mycat.server.config.node.SequenceConfig;
import io.mycat.server.config.node.SystemConfig;
import io.mycat.server.config.node.UserConfig;
public class ZookeeperLoader implements ConfigLoader {
private static final Logger LOGGER = LoggerFactory.getLogger(ZookeeperLoader.class);
private static final String ZK_CONFIG_FILE_NAME = "/zk.yaml";
private SystemConfig systemConfig;
private Map<String, UserConfig> userConfigs;
private Map<String, DataNodeConfig> dataNodeConfigs;
private Map<String, DataHostConfig> dataHostConfigs;
private Map<String, RuleConfig> ruleConfigs;
private Map<String, SchemaConfig> schemaConfigs;
public ZookeeperLoader() {
super();
}
public void initConfig() {
final ZkConfig zkConfig = loadZkConfig();
final CuratorFramework zkConnection = ZookeeperServiceLocator.createConnection(zkConfig.getZkURL());
final String myClusterId = zkConfig.getClusterID();
//system config
ZkSystemConfigLoader zkSystemLoader = new ZkSystemConfigLoader(myClusterId);
//user config
ZkUserConfigLoader zkUserConfigLoader = new ZkUserConfigLoader(myClusterId);
//data host and data node config
ZkDataNodeConfigLoader dataNodeConfigLoader = new ZkDataNodeConfigLoader(myClusterId
, new ZkDataHostConfigLoader(myClusterId));
//rule config
ZkRuleConfigLoader ruleConfigLoader = new ZkRuleConfigLoader(myClusterId);
// composed ZkDataHostConfigLoader,ZkDataNodeConfigLoader and ZkRuleConfigLoader
ZkSchemaConfigLoader zkSchemaConfigLoader = new ZkSchemaConfigLoader(myClusterId,
dataNodeConfigLoader, ruleConfigLoader);
Arrays.asList(zkSystemLoader, zkUserConfigLoader, zkSchemaConfigLoader)
.stream()
.forEach(loader -> loader.fetchConfig(zkConnection));
this.systemConfig = zkSystemLoader.getSystemConfig();
this.userConfigs = zkUserConfigLoader.getUserConfig();
this.dataHostConfigs = dataNodeConfigLoader.getDataHostConfigs();
this.dataNodeConfigs = dataNodeConfigLoader.getDataNodeConfigs();
this.schemaConfigs = zkSchemaConfigLoader.getSchemaConfigs();
}
private ZkConfig loadZkConfig() {
LOGGER.trace("load file with name :" + ZK_CONFIG_FILE_NAME);
InputStream configIS = getClass().getResourceAsStream(ZK_CONFIG_FILE_NAME);
if (configIS == null) {
throw new ConfigException("can't find zk properties file : " + ZK_CONFIG_FILE_NAME);
}
return new Yaml().loadAs(configIS, ZkConfig.class);
}
@Override
public SchemaConfig getSchemaConfig(String schema) {
return null;
}
@Override
public Map<String, SchemaConfig> getSchemaConfigs() {
return null;
}
@Override
public Map<String, DataNodeConfig> getDataNodeConfigs() {
return this.dataNodeConfigs;
}
@Override
public Map<String, DataHostConfig> getDataHostConfigs() {
return this.dataHostConfigs;
}
@Override
public Map<String, RuleConfig> getTableRuleConfigs() {
return this.ruleConfigs;
}
@Override
public SystemConfig getSystemConfig() {
return this.systemConfig;
}
@Override
public UserConfig getUserConfig(String user) {
return this.userConfigs.get(user);
}
@Override
public Map<String, UserConfig> getUserConfigs() {
return this.userConfigs;
}
@Override
public QuarantineConfig getQuarantineConfigs() {
return null;
}
@Override
public MycatClusterConfig getClusterConfigs() {
return null;
}
@Override
public CharsetConfig getCharsetConfigs() {
return null;
}
@Override
public HostIndexConfig getHostIndexConfig() {
return null;
}
@Override
public SequenceConfig getSequenceConfig() {
return null;
}
}