All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.instaclustr.cassandra.service.kubernetes.KubernetesCqlSession Maven / Gradle / Ivy

package com.instaclustr.cassandra.service.kubernetes;

import static java.util.Objects.requireNonNull;

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.UnknownHostException;
import java.util.Properties;
import java.util.function.Supplier;

import com.datastax.oss.driver.api.core.CqlSession;
import com.datastax.oss.driver.api.core.CqlSessionBuilder;
import com.datastax.oss.driver.api.core.config.DriverConfig;
import com.datastax.oss.driver.api.core.config.DriverConfigLoader;
import com.datastax.oss.driver.internal.core.config.typesafe.DefaultDriverConfigLoader;
import com.datastax.oss.driver.internal.core.config.typesafe.TypesafeDriverConfig;
import com.google.inject.Inject;
import com.instaclustr.cassandra.service.CassandraConfigReader;
import com.instaclustr.cassandra.service.CqlSessionService;
import com.instaclustr.kubernetes.KubernetesHelper;
import com.instaclustr.operations.FunctionWithEx;
import com.typesafe.config.Config;
import com.typesafe.config.ConfigFactory;
import edu.umd.cs.findbugs.annotations.NonNull;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class KubernetesCqlSession implements CqlSessionService {

    private static final Logger logger = LoggerFactory.getLogger(KubernetesCqlSession.class);

    private final DriverConfigLoader loader;

    @Inject
    public KubernetesCqlSession(final @Kubernetes DriverConfigLoader loader) {
        this.loader = loader;
    }

    @Override
    public CqlSession getCqlSession() {
        return createCqlSession();
    }

    @Override
    public  T doWithCqlSession(FunctionWithEx func) throws Exception {
        try (final CqlSession session = createCqlSession()) {
            return func.apply(session);
        }
    }

    protected CqlSession createCqlSession() {

        final CqlSessionBuilder builder = CqlSession.builder().withConfigLoader(loader);

        if (KubernetesHelper.isRunningInKubernetes()) {
            try {
                builder.addContactPoint(new InetSocketAddress(InetAddress.getLocalHost().getHostName(), 9042));
                builder.withLocalDatacenter(CassandraKubernetesHelper.getLocalDataCenter());

                return builder.build();
            } catch (final UnknownHostException ex) {
                throw new IllegalStateException("Unable to resolve hostname of the local host.", ex);
            }
        } else {
            return builder.build();
        }
    }

    public static final class KubernetesDriverConfigLoader extends DefaultDriverConfigLoader {

        private final Supplier configSupplier;

        @Inject
        public KubernetesDriverConfigLoader(final @Kubernetes CassandraConfigReader cassandraConfigReader) {
            this.configSupplier = () -> {
                ConfigFactory.invalidateCaches();
                Config config =
                    ConfigFactory.defaultOverrides()
                        .withFallback(ConfigFactory.parseReader(requireNonNull(cassandraConfigReader.getSecretReader())))
                        .withFallback(ConfigFactory.parseReader(requireNonNull(cassandraConfigReader.getConfigMapReader())))
                        .withFallback(ConfigFactory.defaultReference())
                        .resolve();
                return config.getConfig(DefaultDriverConfigLoader.DEFAULT_ROOT_PATH);
            };
        }

        @NonNull
        @Override
        public DriverConfig getInitialConfig() {
            return new TypesafeDriverConfig(getConfigSupplier().get());
        }

        @NonNull
        @Override
        public Supplier getConfigSupplier() {
            return configSupplier;
        }
    }

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy