blob: bed2dcb73ae230c13640d8c1ceb9994131b79434 [file] [log] [blame]
/*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.karaf.cellar.kubernetes;
import io.fabric8.kubernetes.api.model.Pod;
import io.fabric8.kubernetes.api.model.PodList;
import io.fabric8.kubernetes.client.Config;
import io.fabric8.kubernetes.client.ConfigBuilder;
import io.fabric8.kubernetes.client.DefaultKubernetesClient;
import io.fabric8.kubernetes.client.KubernetesClient;
import okhttp3.TlsVersion;
import org.apache.karaf.cellar.core.discovery.DiscoveryService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
/**
* Discovery service that uses the Kubernetes API to discover Cellar nodes.
*/
public class KubernetesDiscoveryService implements DiscoveryService {
private static final Logger LOGGER = LoggerFactory.getLogger(KubernetesDiscoveryService.class);
private String kubernetesMaster;
private String kubernetesApiVersion;
private boolean kubernetesTrustCertificates;
private boolean kubernetesDisableHostnameVerification;
private String kubernetesCertsCaFile;
private String kubernetesCertsCaData;
private String kubernetesCertsClientFile;
private String kubernetesCertsClientData;
private String kubernetesCertsClientKeyFile;
private String kubernetesCertsClientKeyData;
private String kubernetesCertsClientKeyAlgo;
private String kubernetesCertsClientKeyPassphrase;
private String kubernetesAuthBasicUsername;
private String kubernetesAuthBasicPassword;
private String kubernetesOauthToken;
private int kubernetesWatchReconnectInterval;
private int kubernetesWatchReconnectLimit;
private String kubernetesUserAgent;
private String kubernetesTlsVersion;
private String kubernetesTruststoreFile;
private String kubernetesTruststorePassphrase;
private String kubernetesKeystoreFile;
private String kubernetesKeystorePassphrase;
private String kubernetesPodLabelKey;
private String kubernetesPodLabelValue;
private KubernetesClient kubernetesClient;
public KubernetesDiscoveryService() {
LOGGER.debug("CELLAR KUBERNETES: create discovery service");
}
Config createConfig() {
return new ConfigBuilder()
.withMasterUrl(kubernetesMaster)
.withApiVersion(kubernetesApiVersion)
.withTrustCerts(kubernetesTrustCertificates)
.withDisableHostnameVerification(kubernetesDisableHostnameVerification)
.withCaCertFile(kubernetesCertsCaFile)
.withCaCertData(kubernetesCertsCaData)
.withClientCertFile(kubernetesCertsClientFile)
.withClientCertData(kubernetesCertsClientData)
.withClientKeyFile(kubernetesCertsClientKeyFile)
.withClientKeyData(kubernetesCertsClientKeyData)
.withClientKeyAlgo(kubernetesCertsClientKeyAlgo)
.withClientKeyPassphrase(kubernetesCertsClientKeyPassphrase)
.withUsername(kubernetesAuthBasicUsername)
.withPassword(kubernetesAuthBasicPassword)
.withOauthToken(kubernetesOauthToken)
.withWatchReconnectInterval(kubernetesWatchReconnectInterval)
.withWatchReconnectLimit(kubernetesWatchReconnectLimit)
.withUserAgent(kubernetesUserAgent)
.withTlsVersions(TlsVersion.forJavaName(kubernetesTlsVersion))
.withTrustStoreFile(kubernetesTruststoreFile)
.withTrustStorePassphrase(kubernetesTruststorePassphrase)
.withKeyStoreFile(kubernetesKeystoreFile)
.withKeyStorePassphrase(kubernetesKeystorePassphrase)
.build();
}
public void init() {
try {
LOGGER.debug("CELLAR KUBERNETES: query API at {} ...", kubernetesMaster);
Config config = createConfig();
kubernetesClient = new DefaultKubernetesClient(config);
LOGGER.debug("CELLAR KUBERNETES: discovery service initialized");
} catch (Exception e) {
LOGGER.error("CELLAR KUBERNETES: can't init discovery service", e);
}
}
public void destroy() {
LOGGER.debug("CELLAR KUBERNETES: destroy discovery service");
}
public void update(Map<String, Object> properties) {
LOGGER.debug("CELLAR KUBERNETES: update properties");
}
@Override
public Set<String> discoverMembers() {
LOGGER.debug("CELLAR KUBERNETES: query pods with labeled with [{}={}]", kubernetesPodLabelKey, kubernetesPodLabelValue);
Set<String> members = new HashSet<String>();
try {
PodList podList = kubernetesClient.pods().list();
for (Pod pod : podList.getItems()) {
String value = pod.getMetadata().getLabels().get(kubernetesPodLabelKey);
if (value != null && !value.isEmpty() && value.equals(kubernetesPodLabelValue)) {
members.add(pod.getStatus().getPodIP());
}
}
} catch (Exception e) {
LOGGER.error("CELLAR KUBERNETES: can't get pods", e);
}
return members;
}
@Override
public void signIn() {
// nothing to do for Kubernetes
}
@Override
public void refresh() {
// nothing to do for Kubernetes
}
@Override
public void signOut() {
// nothing to do for Kubernetes
}
void setKubernetesClient(KubernetesClient kubernetesClient) {
this.kubernetesClient = kubernetesClient;
}
public String getKubernetesPodLabelKey() {
return kubernetesPodLabelKey;
}
public void setKubernetesPodLabelKey(String kubernetesPodLabelKey) {
this.kubernetesPodLabelKey = kubernetesPodLabelKey;
}
public String getKubernetesPodLabelValue() {
return kubernetesPodLabelValue;
}
public void setKubernetesPodLabelValue(String kubernetesPodLabelValue) {
this.kubernetesPodLabelValue = kubernetesPodLabelValue;
}
public String getKubernetesMaster() {
return kubernetesMaster;
}
public void setKubernetesMaster(String kubernetesMaster) {
this.kubernetesMaster = kubernetesMaster;
}
public String getKubernetesApiVersion() {
return kubernetesApiVersion;
}
public void setKubernetesApiVersion(String kubernetesApiVersion) {
this.kubernetesApiVersion = kubernetesApiVersion;
}
public boolean isKubernetesTrustCertificates() {
return kubernetesTrustCertificates;
}
public void setKubernetesTrustCertificates(String kubernetesTrustCertificates) {
if (kubernetesTrustCertificates != null) {
this.kubernetesTrustCertificates = Boolean.parseBoolean(kubernetesTrustCertificates);
}
}
public boolean isKubernetesDisableHostnameVerification() {
return kubernetesDisableHostnameVerification;
}
public void setKubernetesDisableHostnameVerification(String kubernetesDisableHostnameVerification) {
if (kubernetesDisableHostnameVerification != null) {
this.kubernetesDisableHostnameVerification = Boolean.parseBoolean(kubernetesDisableHostnameVerification);
}
}
public String getKubernetesCertsCaFile() {
return kubernetesCertsCaFile;
}
public void setKubernetesCertsCaFile(String kubernetesCertsCaFile) {
this.kubernetesCertsCaFile = kubernetesCertsCaFile;
}
public String getKubernetesCertsCaData() {
return kubernetesCertsCaData;
}
public void setKubernetesCertsCaData(String kubernetesCertsCaData) {
this.kubernetesCertsCaData = kubernetesCertsCaData;
}
public String getKubernetesCertsClientFile() {
return kubernetesCertsClientFile;
}
public void setKubernetesCertsClientFile(String kubernetesCertsClientFile) {
this.kubernetesCertsClientFile = kubernetesCertsClientFile;
}
public String getKubernetesCertsClientData() {
return kubernetesCertsClientData;
}
public void setKubernetesCertsClientData(String kubernetesCertsClientData) {
this.kubernetesCertsClientData = kubernetesCertsClientData;
}
public String getKubernetesCertsClientKeyFile() {
return kubernetesCertsClientKeyFile;
}
public void setKubernetesCertsClientKeyFile(String kubernetesCertsClientKeyFile) {
this.kubernetesCertsClientKeyFile = kubernetesCertsClientKeyFile;
}
public String getKubernetesCertsClientKeyData() {
return kubernetesCertsClientKeyData;
}
public void setKubernetesCertsClientKeyData(String kubernetesCertsClientKeyData) {
this.kubernetesCertsClientKeyData = kubernetesCertsClientKeyData;
}
public String getKubernetesCertsClientKeyAlgo() {
return kubernetesCertsClientKeyAlgo;
}
public void setKubernetesCertsClientKeyAlgo(String kubernetesCertsClientKeyAlgo) {
this.kubernetesCertsClientKeyAlgo = kubernetesCertsClientKeyAlgo;
}
public String getKubernetesCertsClientKeyPassphrase() {
return kubernetesCertsClientKeyPassphrase;
}
public void setKubernetesCertsClientKeyPassphrase(String kubernetesCertsClientKeyPassphrase) {
this.kubernetesCertsClientKeyPassphrase = kubernetesCertsClientKeyPassphrase;
}
public String getKubernetesAuthBasicUsername() {
return kubernetesAuthBasicUsername;
}
public void setKubernetesAuthBasicUsername(String kubernetesAuthBasicUsername) {
this.kubernetesAuthBasicUsername = kubernetesAuthBasicUsername;
}
public String getKubernetesAuthBasicPassword() {
return kubernetesAuthBasicPassword;
}
public void setKubernetesAuthBasicPassword(String kubernetesAuthBasicPassword) {
this.kubernetesAuthBasicPassword = kubernetesAuthBasicPassword;
}
public String getKubernetesOauthToken() {
return kubernetesOauthToken;
}
public void setKubernetesOauthToken(String kubernetesOauthToken) {
this.kubernetesOauthToken = kubernetesOauthToken;
}
public int getKubernetesWatchReconnectInterval() {
return kubernetesWatchReconnectInterval;
}
public void setKubernetesWatchReconnectInterval(String kubernetesWatchReconnectInterval) {
if (kubernetesWatchReconnectInterval != null) {
this.kubernetesWatchReconnectInterval = Integer.parseInt(kubernetesWatchReconnectInterval);
}
}
public int getKubernetesWatchReconnectLimit() {
return kubernetesWatchReconnectLimit;
}
public void setKubernetesWatchReconnectLimit(String kubernetesWatchReconnectLimit) {
if (kubernetesWatchReconnectLimit != null) {
this.kubernetesWatchReconnectLimit = Integer.parseInt(kubernetesWatchReconnectLimit);
}
}
public String getKubernetesUserAgent() {
return kubernetesUserAgent;
}
public void setKubernetesUserAgent(String kubernetesUserAgent) {
this.kubernetesUserAgent = kubernetesUserAgent;
}
public String getKubernetesTlsVersion() {
return kubernetesTlsVersion;
}
public void setKubernetesTlsVersion(String kubernetesTlsVersion) {
this.kubernetesTlsVersion = kubernetesTlsVersion;
}
public String getKubernetesTruststoreFile() {
return kubernetesTruststoreFile;
}
public void setKubernetesTruststoreFile(String kubernetesTruststoreFile) {
this.kubernetesTruststoreFile = kubernetesTruststoreFile;
}
public String getKubernetesTruststorePassphrase() {
return kubernetesTruststorePassphrase;
}
public void setKubernetesTruststorePassphrase(String kubernetesTruststorePassphrase) {
this.kubernetesTruststorePassphrase = kubernetesTruststorePassphrase;
}
public String getKubernetesKeystoreFile() {
return kubernetesKeystoreFile;
}
public void setKubernetesKeystoreFile(String kubernetesKeystoreFile) {
this.kubernetesKeystoreFile = kubernetesKeystoreFile;
}
public String getKubernetesKeystorePassphrase() {
return kubernetesKeystorePassphrase;
}
public void setKubernetesKeystorePassphrase(String kubernetesKeystorePassphrase) {
this.kubernetesKeystorePassphrase = kubernetesKeystorePassphrase;
}
}