blob: e6e792e8f8765744cb5ef79c0fb19931c45facc1 [file] [log] [blame]
package org.apache.karaf.cellar.kubernetes;
import io.fabric8.kubernetes.api.model.DoneablePod;
import io.fabric8.kubernetes.api.model.ObjectMeta;
import io.fabric8.kubernetes.api.model.Pod;
import io.fabric8.kubernetes.api.model.PodList;
import io.fabric8.kubernetes.api.model.PodStatus;
import io.fabric8.kubernetes.client.Config;
import io.fabric8.kubernetes.client.KubernetesClient;
import io.fabric8.kubernetes.client.dsl.MixedOperation;
import io.fabric8.kubernetes.client.dsl.PodResource;
import okhttp3.TlsVersion;
import org.junit.Before;
import org.junit.Test;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import static org.easymock.EasyMock.expect;
import static org.easymock.EasyMock.mock;
import static org.easymock.EasyMock.replay;
import static org.easymock.EasyMock.reset;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
public class KubernetesDiscoveryServiceTest {
static final String EXPECTED_KUBERNETES_MASTER = "http://master/";
static final String EXPECTED_KUBERNETES_API_VERSION = "api version";
static final String EXPECTED_KUBERNETES_TRUST_CERTIFICATES = "true";
static final String EXPECTED_KUBERNETES_DISABLE_HOSTNAME_VERIFICATION = "true";
static final String EXPECTED_KUBERNETES_CERTS_CA_FILE = "certs ca file";
static final String EXPECTED_KUBERNETES_CERTS_CA_DATA = "certs ca data";
static final String EXPECTED_KUBERNETES_CERTS_CLIENT_FILE = "certs client file";
static final String EXPECTED_KUBERNETES_CERTS_CLIENT_DATA = "certs client data";
static final String EXPECTED_KUBERNETES_CERTS_CLIENT_KEY_FILE = "certs client key file";
static final String EXPECTED_KUBERNETES_CERTS_CLIENT_KEY_DATA = "certs client key data";
static final String EXPECTED_KUBERNETES_CERTS_CLIENT_KEY_ALGO = "certs client key algo";
static final String EXPECTED_KUBERNETES_CERTS_CLIENT_KEY_PASSPHRASE = "certs client key passphrase";
static final String EXPECTED_KUBERNETES_AUTH_BASIC_USERNAME = "auth basic username";
static final String EXPECTED_KUBERNETES_AUTH_BASIC_PASSWORD = "auth basic password";
static final String EXPECTED_KUBERNETES_OAUTH_TOKEN = "oauth token";
static final String EXPECTED_KUBERNETES_WATCH_RECONNECT_INTERVAL = "10";
static final String EXPECTED_KUBERNETES_WATCH_RECONNECT_LIMIT = "20";
static final String EXPECTED_KUBERNETES_USER_AGENT = "user agent";
static final String EXPECTED_KUBERNETES_TLS_VERSION = "TLSv1.3";
static final String EXPECTED_KUBERNETES_TRUSTSTORE_FILE = "truststore file";
static final String EXPECTED_KUBERNETES_TRUSTSTORE_PASSPHRASE = "truststore passphrase";
static final String EXPECTED_KUBERNETES_KEYSTORE_FILE = "keystore file";
static final String EXPECTED_KUBERNETES_KEYSTORE_PASSPHRASE = "keystore passphrase";
static final String EXPECTED_KUBERNETES_POD_LABEL_KEY = "pod label key";
static final String EXPECTED_KUBERNETES_POD_LABEL_VALUE = "pod label value";
static final String EXPECTED_POD_ID = "192.168.0.1";
private KubernetesClient kubernetesClient = mock(KubernetesClient.class);
private final MixedOperation<Pod, PodList, DoneablePod, PodResource<Pod, DoneablePod>> pods = mock(MixedOperation.class);
private final PodList podList = new PodList();
private final KubernetesDiscoveryService service = new KubernetesDiscoveryService();
private final Pod pod = new Pod();
private final ObjectMeta metadata = new ObjectMeta();
private final PodStatus status = new PodStatus();
private final List<Pod> items = Arrays.asList(pod);
private final Map<String, String> labels = new HashMap<>();
@Before
public void setup() {
labels.put(EXPECTED_KUBERNETES_POD_LABEL_KEY, EXPECTED_KUBERNETES_POD_LABEL_VALUE);
service.setKubernetesPodLabelKey(EXPECTED_KUBERNETES_POD_LABEL_KEY);
service.setKubernetesPodLabelValue(EXPECTED_KUBERNETES_POD_LABEL_VALUE);
service.setKubernetesClient(kubernetesClient);
expect(kubernetesClient.pods()).andReturn(pods);
expect(pods.list()).andReturn(podList);
podList.setItems(items);
pod.setMetadata(metadata);
pod.setStatus(status);
metadata.setLabels(labels);
status.setPodIP(EXPECTED_POD_ID);
replay(kubernetesClient, pods);
}
@Test
public void createConfig() {
service.setKubernetesMaster(EXPECTED_KUBERNETES_MASTER);
service.setKubernetesApiVersion(EXPECTED_KUBERNETES_API_VERSION);
service.setKubernetesTrustCertificates(EXPECTED_KUBERNETES_TRUST_CERTIFICATES);
service.setKubernetesDisableHostnameVerification(EXPECTED_KUBERNETES_DISABLE_HOSTNAME_VERIFICATION);
service.setKubernetesCertsCaFile(EXPECTED_KUBERNETES_CERTS_CA_FILE);
service.setKubernetesCertsCaData(EXPECTED_KUBERNETES_CERTS_CA_DATA);
service.setKubernetesCertsClientFile(EXPECTED_KUBERNETES_CERTS_CLIENT_FILE);
service.setKubernetesCertsClientData(EXPECTED_KUBERNETES_CERTS_CLIENT_DATA);
service.setKubernetesCertsClientKeyFile(EXPECTED_KUBERNETES_CERTS_CLIENT_KEY_FILE);
service.setKubernetesCertsClientKeyData(EXPECTED_KUBERNETES_CERTS_CLIENT_KEY_DATA);
service.setKubernetesCertsClientKeyAlgo(EXPECTED_KUBERNETES_CERTS_CLIENT_KEY_ALGO);
service.setKubernetesCertsClientKeyPassphrase(EXPECTED_KUBERNETES_CERTS_CLIENT_KEY_PASSPHRASE);
service.setKubernetesAuthBasicUsername(EXPECTED_KUBERNETES_AUTH_BASIC_USERNAME);
service.setKubernetesAuthBasicPassword(EXPECTED_KUBERNETES_AUTH_BASIC_PASSWORD);
service.setKubernetesOauthToken(EXPECTED_KUBERNETES_OAUTH_TOKEN);
service.setKubernetesWatchReconnectInterval(EXPECTED_KUBERNETES_WATCH_RECONNECT_INTERVAL);
service.setKubernetesWatchReconnectLimit(EXPECTED_KUBERNETES_WATCH_RECONNECT_LIMIT);
service.setKubernetesUserAgent(EXPECTED_KUBERNETES_USER_AGENT);
service.setKubernetesTlsVersion(EXPECTED_KUBERNETES_TLS_VERSION);
service.setKubernetesTruststoreFile(EXPECTED_KUBERNETES_TRUSTSTORE_FILE);
service.setKubernetesTruststorePassphrase(EXPECTED_KUBERNETES_TRUSTSTORE_PASSPHRASE);
service.setKubernetesKeystoreFile(EXPECTED_KUBERNETES_KEYSTORE_FILE);
service.setKubernetesKeystorePassphrase(EXPECTED_KUBERNETES_KEYSTORE_PASSPHRASE);
Config config = service.createConfig();
assertEquals(EXPECTED_KUBERNETES_MASTER, config.getMasterUrl());
assertEquals(EXPECTED_KUBERNETES_API_VERSION, config.getApiVersion());
assertTrue(config.isTrustCerts());
assertTrue(config.isDisableHostnameVerification());
assertEquals(EXPECTED_KUBERNETES_CERTS_CA_FILE, config.getCaCertFile());
assertEquals(EXPECTED_KUBERNETES_CERTS_CA_DATA, config.getCaCertData());
assertEquals(EXPECTED_KUBERNETES_CERTS_CLIENT_FILE, config.getClientCertFile());
assertEquals(EXPECTED_KUBERNETES_CERTS_CLIENT_DATA, config.getClientCertData());
assertEquals(EXPECTED_KUBERNETES_CERTS_CLIENT_KEY_FILE, config.getClientKeyFile());
assertEquals(EXPECTED_KUBERNETES_CERTS_CLIENT_KEY_DATA, config.getClientKeyData());
assertEquals(EXPECTED_KUBERNETES_CERTS_CLIENT_KEY_ALGO, config.getClientKeyAlgo());
assertEquals(EXPECTED_KUBERNETES_CERTS_CLIENT_KEY_PASSPHRASE, config.getClientKeyPassphrase());
assertEquals(EXPECTED_KUBERNETES_AUTH_BASIC_USERNAME, config.getUsername());
assertEquals(EXPECTED_KUBERNETES_AUTH_BASIC_PASSWORD, config.getPassword());
assertEquals(EXPECTED_KUBERNETES_OAUTH_TOKEN, config.getOauthToken());
assertEquals(Integer.parseInt(EXPECTED_KUBERNETES_WATCH_RECONNECT_INTERVAL), config.getWatchReconnectInterval());
assertEquals(Integer.parseInt(EXPECTED_KUBERNETES_WATCH_RECONNECT_LIMIT), config.getWatchReconnectLimit());
assertEquals(EXPECTED_KUBERNETES_USER_AGENT, config.getUserAgent());
TlsVersion[] tlsVersions = config.getTlsVersions();
assertEquals(1, tlsVersions.length);
assertEquals(TlsVersion.TLS_1_3, tlsVersions[0]);
assertEquals(EXPECTED_KUBERNETES_TRUSTSTORE_FILE, config.getTrustStoreFile());
assertEquals(EXPECTED_KUBERNETES_TRUSTSTORE_PASSPHRASE, config.getTrustStorePassphrase());
assertEquals(EXPECTED_KUBERNETES_KEYSTORE_FILE, config.getKeyStoreFile());
assertEquals(EXPECTED_KUBERNETES_KEYSTORE_PASSPHRASE, config.getKeyStorePassphrase());
}
@Test
public void discoverMembers() {
Set<String> memberIps = service.discoverMembers();
assertEquals(1, memberIps.size());
assertEquals(EXPECTED_POD_ID, memberIps.iterator().next());
}
@Test
public void discoverMembersUnexpectedPodLabelKey() {
service.setKubernetesPodLabelKey("unexpected");
assertTrue(service.discoverMembers().isEmpty());
}
@Test
public void discoverMembersUnexpectedPodLabelValue() {
service.setKubernetesPodLabelValue("unexpected");
assertTrue(service.discoverMembers().isEmpty());
}
@Test
public void discoverMembersLogException() {
reset(kubernetesClient);
expect(kubernetesClient.pods()).andThrow(new RuntimeException("Test exception"));
replay(kubernetesClient);
// Should return empty set because exception was caught and logged
assertTrue(service.discoverMembers().isEmpty());
}
}