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

com.netflix.eureka2.testkit.embedded.cluster.EmbeddedEurekaCluster Maven / Gradle / Ivy

The newest version!
package com.netflix.eureka2.testkit.embedded.cluster;

import java.util.ArrayList;
import java.util.List;

import com.netflix.eureka2.interests.ChangeNotification;
import com.netflix.eureka2.interests.ChangeNotification.Kind;
import com.netflix.eureka2.registry.InstanceInfo;
import com.netflix.eureka2.server.registry.EurekaServerRegistry;
import com.netflix.eureka2.testkit.embedded.server.EmbeddedEurekaServer;
import rx.Observable;
import rx.subjects.PublishSubject;

/**
 * @author Tomasz Bak
 */
public abstract class EmbeddedEurekaCluster {

    private final String clusterVip;

    protected final List servers = new ArrayList<>();

    private final List> clusterAddresses = new ArrayList<>();
    private final PublishSubject> clusterAddressUpdates = PublishSubject.create();

    protected EmbeddedEurekaCluster(String clusterVip) {
        this.clusterVip = clusterVip;
    }

    public int scaleUpByOne(S newServer, A newAddress) {
        servers.add(newServer);
        addServerAddress(newAddress);
        return servers.size() - 1;
    }

    public abstract int scaleUpByOne();

    public int scaleUpBy(int count) {
        for (int i = 0; i < count; i++) {
            scaleUpByOne();
        }
        return servers.size() - 1;
    }

    public void scaleDownByOne() {
        scaleDownByOne(servers.size() - 1);
    }

    public void scaleDownByOne(int idx) {
        removeServerAddress(idx);
        S server = servers.remove(idx);
        server.shutdown();
    }

    public void scaleDownBy(int count) {
        for (int i = 0; i < count; i++) {
            scaleDownByOne();
        }
    }

    public void startUp(int idx) {
        S server = servers.get(idx);
        if (server != null) {
            server.start();
        }
    }

    public void bringDown(int idx) {
        S server = servers.get(idx);
        if (server != null) {
            server.shutdown();
        }
    }

    public void shutdown() {
        for (S server : servers) {
            server.shutdown();
        }
    }

    public String getVip() {
        return clusterVip;
    }

    public S getServer(int idx) {
        return servers.get(idx);
    }

    public EurekaServerRegistry getEurekaServerRegistry(int idx) {
        return servers.get(idx).getEurekaServerRegistry();
    }

    public abstract R clusterReport();

    protected Observable> clusterChangeObservable() {
        return Observable.from(clusterAddresses).concatWith(clusterAddressUpdates);
    }

    private void addServerAddress(A serverAddress) {
        clusterAddresses.add(new ChangeNotification(Kind.Add, serverAddress));
        clusterAddressUpdates.onNext(new ChangeNotification(Kind.Add, serverAddress));
    }

    private void removeServerAddress(int idx) {
        ChangeNotification addChange = clusterAddresses.remove(idx);
        clusterAddressUpdates.onNext(new ChangeNotification(Kind.Delete, addChange.getData()));
    }
}