Advertise, not parsing response
This commit is contained in:
Meutel 2017-06-11 20:16:32 +02:00
commit beb6fdd353
9 changed files with 353 additions and 0 deletions

5
.gitignore vendored Normal file
View File

@ -0,0 +1,5 @@
target
*.iml
*.swp
*~
.idea

5
module.conf Normal file
View File

@ -0,0 +1,5 @@
org.jboss.msc
org.wildfly.swarm.topology:runtime
org.wildfly.swarm.topology
org.jboss.as.network
io.vertx

89
pom.xml Normal file
View File

@ -0,0 +1,89 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>net.meutel.swarm</groupId>
<artifactId>topology-etcd</artifactId>
<version>1.0-SNAPSHOT</version>
<name>Topology etcd</name>
<description>Wildfly Swarm topology implementation with etcd</description>
<properties>
<version.swarm>2017.6.0</version.swarm>
<version.swarm.fraction-plugin>55</version.swarm.fraction-plugin>
<version.vertx>3.3.3</version.vertx>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.wildfly.swarm</groupId>
<artifactId>bom-all</artifactId>
<version>${version.swarm}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>io.vertx</groupId>
<artifactId>vertx-core</artifactId>
<version>${version.vertx}</version>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>javax.inject</groupId>
<artifactId>javax.inject</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.enterprise</groupId>
<artifactId>cdi-api</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.wildfly.swarm</groupId>
<artifactId>topology</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.wildfly.swarm</groupId>
<artifactId>msc</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.wildfly.core</groupId>
<artifactId>wildfly-network</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>io.vertx</groupId>
<artifactId>vertx-core</artifactId>
</dependency>
</dependencies>
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.wildfly.swarm</groupId>
<artifactId>wildfly-swarm-fraction-plugin</artifactId>
<version>${version.swarm.fraction-plugin}</version>
<executions>
<execution>
<phase>process-classes</phase>
<goals>
<goal>process</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>

View File

@ -0,0 +1,47 @@
package net.meutel.swarm.etcd;
import org.wildfly.swarm.config.runtime.AttributeDocumentation;
import org.wildfly.swarm.spi.api.Defaultable;
import org.wildfly.swarm.spi.api.Fraction;
import org.wildfly.swarm.spi.api.annotations.Configurable;
import java.net.MalformedURLException;
import java.net.URL;
/**
* Fraction Etcd Topology.
*/
@Configurable("net.meutel.etcd")
public class EtcdTopologyFraction implements Fraction<EtcdTopologyFraction> {
private static final URL DEFAULT_URL;
@AttributeDocumentation("Etcd URL")
private Defaultable<URL> url = Defaultable.url(DEFAULT_URL);
static {
URL tmp = null;
try {
tmp = new URL("http://localhost:2379");
} catch (MalformedURLException e) {
throw new RuntimeException(e);
}
DEFAULT_URL = tmp;
}
public EtcdTopologyFraction() {
this(DEFAULT_URL);
}
public EtcdTopologyFraction(URL url) {
this.url.set(url);
}
public EtcdTopologyFraction(String url) throws MalformedURLException {
this.url.set(new URL(url));
}
public URL url() {
return this.url.get();
}
}

View File

@ -0,0 +1,74 @@
package net.meutel.swarm.etcd.runtime;
import io.vertx.core.Vertx;
import io.vertx.core.http.HttpClient;
import io.vertx.core.http.HttpClientOptions;
import io.vertx.core.http.HttpClientResponse;
import org.jboss.msc.service.*;
import java.net.URL;
/**
* Etcd Client.
*/
public class EtcdClient implements Service<EtcdClient> {
public static final ServiceName SERVICE_NAME = ServiceName.of("net", "meutel", "swarm","topology", "etcd", "client");
HttpClient httpClient;
URL url;
public EtcdClient(URL url) {
this.url = url;
}
public void createInDir(String dir, String value) {
String body = "value=" + value;
// String body = "nimp";
System.out.println(" - createInDir: " + body);
this.httpClient.post("/v2/keys/" + dir, this::parseResponse)
.exceptionHandler(throwable -> {
System.err.println("EtcdClient error");
throwable.printStackTrace();
})
// .setChunked(true)
.putHeader("Content-Length", String.valueOf(body.length()))
.putHeader("Content-Type", "application/x-www-form-urlencoded")
.write(body)
.end();
}
private void parseResponse(HttpClientResponse resp) {
int st = resp.statusCode();
if (st < 200 || (st >= 300 && st < 400)) {
System.err.println("Unexpected status: " + st);
} else if (st >= 400 && st < 500) {
System.err.println("Request error: " + st+ " (" + resp.statusMessage() + ")");
} else if (st >= 500) {
System.err.println("Etcd error: " + st+ " (" + resp.statusMessage() + ")");
}
resp.handler(buffer -> System.out.print(" = " + buffer));
}
@Override
public void start(StartContext startContext) throws StartException {
System.out.println("Starting EtcdClient for " + this.url);
this.httpClient = Vertx.vertx()
.createHttpClient(new HttpClientOptions()
.setLogActivity(true)
.setDefaultHost(this.url.getHost())
.setDefaultPort(this.url.getPort())
.setConnectTimeout(1000)
.setMaxPoolSize(10));
}
@Override
public void stop(StopContext stopContext) {
}
@Override
public EtcdClient getValue() throws IllegalStateException, IllegalArgumentException {
return this;
}
}

View File

@ -0,0 +1,32 @@
package net.meutel.swarm.etcd.runtime;
import net.meutel.swarm.etcd.EtcdTopologyFraction;
import org.jboss.msc.service.ServiceActivator;
import org.jboss.msc.service.ServiceActivatorContext;
import org.jboss.msc.service.ServiceRegistryException;
import org.jboss.msc.service.ServiceTarget;
import org.wildfly.swarm.topology.runtime.TopologyManager;
import org.wildfly.swarm.topology.runtime.TopologyManagerActivator;
import javax.enterprise.context.ApplicationScoped;
import javax.enterprise.inject.Any;
import javax.inject.Inject;
/**
* EtcdClient MSC activator.
*/
@ApplicationScoped
public class EtcdClientActivator implements ServiceActivator {
@Inject
@Any
EtcdTopologyFraction fraction;
public void activate(ServiceActivatorContext context) throws ServiceRegistryException {
System.out.println("Activate Etcd client");
ServiceTarget target = context.getServiceTarget();
EtcdClient client = new EtcdClient(fraction.url());
target.addService(EtcdClient.SERVICE_NAME, client)
.install();
}
}

View File

@ -0,0 +1,64 @@
package net.meutel.swarm.etcd.runtime;
import org.jboss.as.network.SocketBinding;
import org.jboss.msc.inject.Injector;
import org.jboss.msc.service.Service;
import org.jboss.msc.service.StartContext;
import org.jboss.msc.service.StartException;
import org.jboss.msc.service.StopContext;
import org.jboss.msc.value.InjectedValue;
import org.wildfly.swarm.topology.TopologyConnector;
import org.wildfly.swarm.topology.runtime.Registration;
import org.wildfly.swarm.topology.runtime.TopologyManager;
import java.net.URL;
/**
* Topology connector for etcd.
*/
public class EtcdTopologyConnector implements Service<EtcdTopologyConnector>, TopologyConnector {
private static String TOPOLOGY_SOURCE_KEY = "etcd";
private EtcdClient client;
private InjectedValue<TopologyManager> topologyManagerInjector = new InjectedValue<>();
private InjectedValue<EtcdClient> clientInjector = new InjectedValue<>();
public Injector<EtcdClient> getClientInjector() {
return this.clientInjector;
}
public EtcdTopologyConnector getValue() throws IllegalStateException, IllegalArgumentException {
return this;
}
public Injector<TopologyManager> getTopologyManagerInjector() {
return this.topologyManagerInjector;
}
public void start(StartContext startContext) throws StartException {
System.out.println("Starting EtcdTopology");
this.client = this.clientInjector.getValue();
}
public void stop(StopContext stopContext) {
this.client = null;
}
public synchronized void advertise(String name, SocketBinding binding, String... tags) throws Exception {
Registration registration = new Registration(TOPOLOGY_SOURCE_KEY, name, binding.getAddress().getHostAddress(), binding.getAbsolutePort(), tags);
System.out.println("registration: " + registration);
this.topologyManagerInjector.getValue().register(registration);
URL url = new URL("http", registration.getAddress(), registration.getPort(),"");
System.out.println("URL for service " + name + ": " + url);
client.createInDir(name, url.toExternalForm());
}
public synchronized void unadvertise(String name, SocketBinding binding) throws Exception {
}
}

View File

@ -0,0 +1,26 @@
package net.meutel.swarm.etcd.runtime;
import org.jboss.msc.service.*;
import org.wildfly.swarm.topology.runtime.TopologyManager;
import org.wildfly.swarm.topology.runtime.TopologyManagerActivator;
import javax.enterprise.context.ApplicationScoped;
/**
* Etcd Topology MSC activator.
*/
@ApplicationScoped
public class EtcdTopologyConnectorActivator implements ServiceActivator {
public void activate(ServiceActivatorContext context) throws ServiceRegistryException {
System.out.println("Activate Etcd topology");
ServiceTarget target = context.getServiceTarget();
EtcdTopologyConnector connector = new EtcdTopologyConnector();
target.addService(TopologyManagerActivator.CONNECTOR_SERVICE_NAME, connector)
.addDependency(TopologyManagerActivator.SERVICE_NAME, TopologyManager.class, connector.getTopologyManagerInjector())
.addDependency(EtcdClient.SERVICE_NAME, EtcdClient.class, connector.getClientInjector())
.install();
}
}

View File

@ -0,0 +1,11 @@
<module xmlns="urn:jboss:module:1.3" name="io.vertx">
<resources>
<artifact name="io.vertx:vertx-core:${version.vertx}"/>
<artifact name="io.netty:netty-all:4.1.1.Final"/>
</resources>
<dependencies>
<module name="javax.api"/>
<module name="sun.jdk"/>
<module name="org.javassist" optional="true"/>
</dependencies>
</module>