Skip to content

Commit

Permalink
Merge pull request #1518 from dsyer/loadbalancer
Browse files Browse the repository at this point in the history
Create LoadBalancer by hand instead of via annotation
  • Loading branch information
k8s-ci-robot committed Feb 7, 2021
2 parents 4681f03 + a630003 commit 284e6cd
Show file tree
Hide file tree
Showing 11 changed files with 53 additions and 213 deletions.
Expand Up @@ -12,15 +12,20 @@
*/
package io.kubernetes.client.examples;

import io.kubernetes.client.extended.network.LoadBalancer;
import io.kubernetes.client.informer.SharedInformerFactory;
import io.kubernetes.client.spring.extended.network.annotation.KubernetesEndpointsLoadBalanced;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import io.kubernetes.client.extended.network.EndpointsLoadBalancer;
import io.kubernetes.client.extended.network.LoadBalancer;
import io.kubernetes.client.extended.network.RoundRobinLoadBalanceStrategy;
import io.kubernetes.client.informer.SharedInformerFactory;
import io.kubernetes.client.informer.cache.Lister;
import io.kubernetes.client.openapi.models.V1Endpoints;
import io.kubernetes.client.spring.extended.network.endpoints.InformerEndpointsGetter;

@SpringBootApplication
public class SpringLoadBalancerExample {

Expand All @@ -44,14 +49,23 @@ public CommandLineRunner loadBalancerCommandLineRunner(
}

@Bean
public MyService myService() {
return new MyService();
public MyService myService(Lister<V1Endpoints> lister) {
return new MyService(lister);
}
}

public static class MyService {

@KubernetesEndpointsLoadBalanced(namespace = "default", name = "kubernetes")
private LoadBalancer defaultKubernetesLoadBalancer;

public MyService(Lister<V1Endpoints> lister) {
InformerEndpointsGetter getter = new InformerEndpointsGetter(lister);
RoundRobinLoadBalanceStrategy strategy = new RoundRobinLoadBalanceStrategy();
defaultKubernetesLoadBalancer = new EndpointsLoadBalancer(
() -> getter.get("default", "kubernetes"),
strategy
);
}

}
}

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

Expand Up @@ -14,11 +14,14 @@

import io.kubernetes.client.informer.cache.Lister;
import io.kubernetes.client.openapi.models.V1Endpoints;
import org.springframework.beans.factory.annotation.Autowired;

public class InformerEndpointsGetter implements EndpointsGetter {

@Autowired private Lister<V1Endpoints> endpointsLister;
private final Lister<V1Endpoints> endpointsLister;

public InformerEndpointsGetter(Lister<V1Endpoints> lister) {
this.endpointsLister = lister;
}

@Override
public V1Endpoints get(String namespace, String name) {
Expand Down
Expand Up @@ -20,14 +20,17 @@
import io.kubernetes.client.openapi.apis.CoreV1Api;
import io.kubernetes.client.openapi.models.V1Endpoints;
import java.time.Duration;
import org.springframework.beans.factory.annotation.Autowired;

public class PollingEndpointsGetter implements EndpointsGetter {

private static final Cache<NamespaceName, V1Endpoints> lastObservedEndpoints =
Caffeine.newBuilder().expireAfterWrite(Duration.ofMinutes(5)).build();

@Autowired private ApiClient apiClient;
private final ApiClient apiClient;

public PollingEndpointsGetter(ApiClient apiClient) {
this.apiClient = apiClient;
}

@Override
public V1Endpoints get(String namespace, String name) {
Expand Down
1 change: 0 additions & 1 deletion spring/src/main/resources/META-INF/spring.factories
@@ -1,5 +1,4 @@
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
io.kubernetes.client.spring.extended.controller.config.KubernetesInformerAutoConfiguration, \
io.kubernetes.client.spring.extended.controller.config.KubernetesReconcilerAutoConfiguration, \
io.kubernetes.client.spring.extended.network.config.KubernetesLoadBalancerAutoConfiguration, \
io.kubernetes.client.spring.extended.manifests.config.KubernetesManifestsAutoConfiguration
Expand Up @@ -99,8 +99,6 @@ static class TestSharedInformerFactory extends SharedInformerFactory {}

@Autowired private Lister<V1ConfigMap> configMapLister;

@Autowired private ApiClient apiClient;

@Test
public void testInformerInjection() throws InterruptedException {
assertNotNull(podInformer);
Expand Down
Expand Up @@ -12,10 +12,14 @@
*/
package io.kubernetes.client.spring.extended.network;

import static org.junit.Assert.*;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertThrows;

import io.kubernetes.client.extended.network.EndpointsLoadBalancer;
import io.kubernetes.client.extended.network.LoadBalanceStrategy;
import io.kubernetes.client.extended.network.LoadBalancer;
import io.kubernetes.client.extended.network.RoundRobinLoadBalanceStrategy;
import io.kubernetes.client.extended.network.exception.NoAvailableAddressException;
import io.kubernetes.client.informer.cache.Cache;
import io.kubernetes.client.informer.cache.Lister;
Expand All @@ -24,8 +28,8 @@
import io.kubernetes.client.openapi.models.V1EndpointSubset;
import io.kubernetes.client.openapi.models.V1Endpoints;
import io.kubernetes.client.openapi.models.V1ObjectMeta;
import io.kubernetes.client.spring.extended.network.annotation.KubernetesEndpointsLoadBalanced;
import io.kubernetes.client.spring.extended.network.endpoints.EndpointsGetter;
import io.kubernetes.client.spring.extended.network.endpoints.InformerEndpointsGetter;
import java.util.List;
import org.junit.Test;
import org.junit.runner.RunWith;
Expand Down Expand Up @@ -53,28 +57,32 @@ public Lister<V1Endpoints> endpointsLister(Cache<V1Endpoints> endpointsCache) {
}

@Bean
public MyBean myBean() {
return new MyBean();
public MyBean myBean(Lister<V1Endpoints> lister) {
return new MyBean(new MyEndpointGetter(), new MyStrategy(), lister);
}
}

static class MyBean {
@KubernetesEndpointsLoadBalanced(namespace = "default", name = "no-such")

public MyBean(
MyEndpointGetter myEndpointGetter, MyStrategy myStrategy, Lister<V1Endpoints> lister) {
InformerEndpointsGetter getter = new InformerEndpointsGetter(lister);
RoundRobinLoadBalanceStrategy strategy = new RoundRobinLoadBalanceStrategy();
noSuchLoadBalancer =
new EndpointsLoadBalancer(() -> getter.get("default", "no-such"), strategy);
fooLoadBalancer = new EndpointsLoadBalancer(() -> getter.get("default", "foo"), strategy);
customStrategyLoadBalancer =
new EndpointsLoadBalancer(() -> getter.get("default", "foo"), myStrategy);
customEndpointGetterLoadBalancer =
new EndpointsLoadBalancer(() -> myEndpointGetter.get("default", "foo"), strategy);
}

private LoadBalancer noSuchLoadBalancer;

@KubernetesEndpointsLoadBalanced(namespace = "default", name = "foo")
private LoadBalancer fooLoadBalancer;

@KubernetesEndpointsLoadBalanced(
namespace = "default",
name = "foo",
strategy = MyStrategy.class)
private LoadBalancer customStrategyLoadBalancer;

@KubernetesEndpointsLoadBalanced(
namespace = "default",
name = "foo",
endpointsGetter = MyEndpointGetter.class)
private LoadBalancer customEndpointGetterLoadBalancer;
}

Expand Down Expand Up @@ -109,6 +117,7 @@ public V1Endpoints get(String namespace, String name) {
new V1EndpointSubset()
.addAddressesItem(new V1EndpointAddress().ip("127.0.0.1"))
.addPortsItem(new V1EndpointPort().port(8080)));

@Autowired private MyBean myBean;

@Autowired private Cache<V1Endpoints> endpointsCache;
Expand Down
Expand Up @@ -12,12 +12,7 @@
*/
package io.kubernetes.client.spring.extended.network;

import io.kubernetes.client.spring.extended.network.config.KubernetesLoadBalancerAutoConfiguration;
import org.springframework.boot.SpringBootConfiguration;
import org.springframework.boot.autoconfigure.ImportAutoConfiguration;

@SpringBootConfiguration
@ImportAutoConfiguration({
KubernetesLoadBalancerAutoConfiguration.class,
})
public class TestApplication {}

0 comments on commit 284e6cd

Please sign in to comment.