mirror of https://github.com/apache/jclouds.git
Use a custom parser for the CIDR list
This commit is contained in:
parent
ef8438d59a
commit
b5bba81d05
|
@ -28,6 +28,7 @@ import javax.inject.Singleton;
|
||||||
|
|
||||||
import org.jclouds.cloudstack.domain.Account;
|
import org.jclouds.cloudstack.domain.Account;
|
||||||
import org.jclouds.cloudstack.domain.Account.State;
|
import org.jclouds.cloudstack.domain.Account.State;
|
||||||
|
import org.jclouds.cloudstack.domain.FirewallRule;
|
||||||
import org.jclouds.cloudstack.domain.LoadBalancerRule;
|
import org.jclouds.cloudstack.domain.LoadBalancerRule;
|
||||||
import org.jclouds.cloudstack.domain.PortForwardingRule;
|
import org.jclouds.cloudstack.domain.PortForwardingRule;
|
||||||
import org.jclouds.cloudstack.domain.User;
|
import org.jclouds.cloudstack.domain.User;
|
||||||
|
@ -46,20 +47,21 @@ import com.google.inject.TypeLiteral;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Configures the cloudstack parsers.
|
* Configures the cloudstack parsers.
|
||||||
*
|
*
|
||||||
* @author Adrian Cole
|
* @author Adrian Cole, Andrei Savu
|
||||||
*/
|
*/
|
||||||
public class CloudStackParserModule extends AbstractModule {
|
public class CloudStackParserModule extends AbstractModule {
|
||||||
|
|
||||||
public static class PortForwardingRuleAdaptor implements JsonSerializer<PortForwardingRule>, JsonDeserializer<PortForwardingRule> {
|
@Singleton
|
||||||
|
public static class PortForwardingRuleAdapter implements JsonSerializer<PortForwardingRule>, JsonDeserializer<PortForwardingRule> {
|
||||||
|
|
||||||
public JsonElement serialize(PortForwardingRule src, Type typeOfSrc, JsonSerializationContext context) {
|
public JsonElement serialize(PortForwardingRule src, Type typeOfSrc, JsonSerializationContext context) {
|
||||||
return context.serialize(src);
|
return context.serialize(src);
|
||||||
}
|
}
|
||||||
|
|
||||||
public PortForwardingRule deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
|
public PortForwardingRule deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
|
||||||
throws JsonParseException {
|
throws JsonParseException {
|
||||||
return apply(context.<PortForwardingRuleInternal> deserialize(json, PortForwardingRuleInternal.class));
|
return apply(context.<PortForwardingRuleInternal>deserialize(json, PortForwardingRuleInternal.class));
|
||||||
}
|
}
|
||||||
|
|
||||||
public PortForwardingRule apply(PortForwardingRuleInternal in) {
|
public PortForwardingRule apply(PortForwardingRuleInternal in) {
|
||||||
|
@ -104,6 +106,52 @@ public class CloudStackParserModule extends AbstractModule {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Singleton
|
||||||
|
public static class FirewallRuleAdapter implements JsonSerializer<FirewallRule>, JsonDeserializer<FirewallRule> {
|
||||||
|
|
||||||
|
public JsonElement serialize(FirewallRule src, Type typeOfSrc, JsonSerializationContext context) {
|
||||||
|
return context.serialize(src);
|
||||||
|
}
|
||||||
|
|
||||||
|
public FirewallRule deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
|
||||||
|
throws JsonParseException {
|
||||||
|
return apply(context.<FirewallRuleInternal>deserialize(json, FirewallRuleInternal.class));
|
||||||
|
}
|
||||||
|
|
||||||
|
public FirewallRule apply(FirewallRuleInternal in) {
|
||||||
|
Set<String> cidrSet;
|
||||||
|
if (in.CIDRs != null) {
|
||||||
|
String[] elements = in.CIDRs.split(",");
|
||||||
|
cidrSet = Sets.newTreeSet(Arrays.asList(elements));
|
||||||
|
} else {
|
||||||
|
cidrSet = Collections.emptySet();
|
||||||
|
}
|
||||||
|
return FirewallRule.builder().id(in.id).CIDRs(cidrSet).startPort(in.startPort).endPort(in.endPort)
|
||||||
|
.icmpCode(in.icmpCode).icmpType(in.icmpType).ipAddress(in.ipAddress).ipAddressId(in.ipAddressId)
|
||||||
|
.protocol(in.protocol).state(in.state).build();
|
||||||
|
}
|
||||||
|
|
||||||
|
static final class FirewallRuleInternal {
|
||||||
|
private long id;
|
||||||
|
@SerializedName("cidrlist")
|
||||||
|
private String CIDRs;
|
||||||
|
@SerializedName("startport")
|
||||||
|
private int startPort;
|
||||||
|
@SerializedName("endport")
|
||||||
|
private int endPort;
|
||||||
|
@SerializedName("icmpcode")
|
||||||
|
private String icmpCode;
|
||||||
|
@SerializedName("icmptype")
|
||||||
|
private String icmpType;
|
||||||
|
@SerializedName("ipaddress")
|
||||||
|
private String ipAddress;
|
||||||
|
@SerializedName("ipaddressid")
|
||||||
|
private long ipAddressId;
|
||||||
|
private FirewallRule.Protocol protocol;
|
||||||
|
private String state;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Singleton
|
@Singleton
|
||||||
public static class LoadBalancerRuleAdapter implements JsonSerializer<LoadBalancerRule>, JsonDeserializer<LoadBalancerRule> {
|
public static class LoadBalancerRuleAdapter implements JsonSerializer<LoadBalancerRule>, JsonDeserializer<LoadBalancerRule> {
|
||||||
|
|
||||||
|
@ -112,8 +160,8 @@ public class CloudStackParserModule extends AbstractModule {
|
||||||
}
|
}
|
||||||
|
|
||||||
public LoadBalancerRule deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
|
public LoadBalancerRule deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
|
||||||
throws JsonParseException {
|
throws JsonParseException {
|
||||||
return apply(context.<LoadBalancerRuleInternal> deserialize(json, LoadBalancerRuleInternal.class));
|
return apply(context.<LoadBalancerRuleInternal>deserialize(json, LoadBalancerRuleInternal.class));
|
||||||
}
|
}
|
||||||
|
|
||||||
public LoadBalancerRule apply(LoadBalancerRuleInternal in) {
|
public LoadBalancerRule apply(LoadBalancerRuleInternal in) {
|
||||||
|
@ -157,22 +205,22 @@ public class CloudStackParserModule extends AbstractModule {
|
||||||
}
|
}
|
||||||
|
|
||||||
public Account deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
|
public Account deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
|
||||||
throws JsonParseException {
|
throws JsonParseException {
|
||||||
return apply(context.<AccountInternal> deserialize(json, AccountInternal.class));
|
return apply(context.<AccountInternal>deserialize(json, AccountInternal.class));
|
||||||
}
|
}
|
||||||
|
|
||||||
public Account apply(AccountInternal in) {
|
public Account apply(AccountInternal in) {
|
||||||
return Account.builder().id(in.id).type(in.type).domain(in.domain).domainId(in.domainId)
|
return Account.builder().id(in.id).type(in.type).domain(in.domain).domainId(in.domainId)
|
||||||
.IPsAvailable(nullIfUnlimited(in.IPsAvailable)).IPLimit(nullIfUnlimited(in.IPLimit)).IPs(in.IPs)
|
.IPsAvailable(nullIfUnlimited(in.IPsAvailable)).IPLimit(nullIfUnlimited(in.IPLimit)).IPs(in.IPs)
|
||||||
.cleanupRequired(in.cleanupRequired).name(in.name).receivedBytes(in.receivedBytes)
|
.cleanupRequired(in.cleanupRequired).name(in.name).receivedBytes(in.receivedBytes)
|
||||||
.sentBytes(in.sentBytes).snapshotsAvailable(nullIfUnlimited(in.snapshotsAvailable))
|
.sentBytes(in.sentBytes).snapshotsAvailable(nullIfUnlimited(in.snapshotsAvailable))
|
||||||
.snapshotLimit(nullIfUnlimited(in.snapshotLimit)).snapshots(in.snapshots).state(in.state)
|
.snapshotLimit(nullIfUnlimited(in.snapshotLimit)).snapshots(in.snapshots).state(in.state)
|
||||||
.templatesAvailable(nullIfUnlimited(in.templatesAvailable))
|
.templatesAvailable(nullIfUnlimited(in.templatesAvailable))
|
||||||
.templateLimit(nullIfUnlimited(in.templateLimit)).templates(in.templates)
|
.templateLimit(nullIfUnlimited(in.templateLimit)).templates(in.templates)
|
||||||
.VMsAvailable(nullIfUnlimited(in.VMsAvailable)).VMLimit(nullIfUnlimited(in.VMLimit))
|
.VMsAvailable(nullIfUnlimited(in.VMsAvailable)).VMLimit(nullIfUnlimited(in.VMLimit))
|
||||||
.VMsRunning(in.VMsRunning).VMsStopped(in.VMsStopped).VMs(in.VMs)
|
.VMsRunning(in.VMsRunning).VMsStopped(in.VMsStopped).VMs(in.VMs)
|
||||||
.volumesAvailable(nullIfUnlimited(in.volumesAvailable)).volumeLimit(nullIfUnlimited(in.volumeLimit))
|
.volumesAvailable(nullIfUnlimited(in.volumesAvailable)).volumeLimit(nullIfUnlimited(in.volumeLimit))
|
||||||
.volumes(in.volumes).users(in.users).build();
|
.volumes(in.volumes).users(in.users).build();
|
||||||
}
|
}
|
||||||
|
|
||||||
static final class AccountInternal {
|
static final class AccountInternal {
|
||||||
|
@ -237,10 +285,11 @@ public class CloudStackParserModule extends AbstractModule {
|
||||||
@Override
|
@Override
|
||||||
protected void configure() {
|
protected void configure() {
|
||||||
bind(new TypeLiteral<Map<Type, Object>>() {
|
bind(new TypeLiteral<Map<Type, Object>>() {
|
||||||
}).toInstance(ImmutableMap.<Type, Object> of(
|
}).toInstance(ImmutableMap.<Type, Object>of(
|
||||||
Account.class, new BreakGenericSetAdapter(),
|
Account.class, new BreakGenericSetAdapter(),
|
||||||
LoadBalancerRule.class, new LoadBalancerRuleAdapter(),
|
LoadBalancerRule.class, new LoadBalancerRuleAdapter(),
|
||||||
PortForwardingRule.class, new PortForwardingRuleAdaptor()
|
PortForwardingRule.class, new PortForwardingRuleAdapter(),
|
||||||
|
FirewallRule.class, new FirewallRuleAdapter()
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -18,8 +18,11 @@
|
||||||
*/
|
*/
|
||||||
package org.jclouds.cloudstack.domain;
|
package org.jclouds.cloudstack.domain;
|
||||||
|
|
||||||
|
import com.google.common.collect.ImmutableSet;
|
||||||
import com.google.gson.annotations.SerializedName;
|
import com.google.gson.annotations.SerializedName;
|
||||||
|
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Andrei Savu
|
* @author Andrei Savu
|
||||||
*/
|
*/
|
||||||
|
@ -51,7 +54,7 @@ public class FirewallRule implements Comparable<FirewallRule> {
|
||||||
|
|
||||||
public static class Builder {
|
public static class Builder {
|
||||||
private long id;
|
private long id;
|
||||||
private String CIDRs;
|
private Set<String> CIDRs;
|
||||||
|
|
||||||
private int startPort;
|
private int startPort;
|
||||||
private int endPort;
|
private int endPort;
|
||||||
|
@ -70,8 +73,8 @@ public class FirewallRule implements Comparable<FirewallRule> {
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Builder CIDRs(String CIDRs) {
|
public Builder CIDRs(Set<String> CIDRs) {
|
||||||
this.CIDRs = CIDRs;
|
this.CIDRs = ImmutableSet.copyOf(CIDRs);
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -123,7 +126,7 @@ public class FirewallRule implements Comparable<FirewallRule> {
|
||||||
|
|
||||||
private long id;
|
private long id;
|
||||||
@SerializedName("cidrlist")
|
@SerializedName("cidrlist")
|
||||||
private String CIDRs;
|
private Set<String> CIDRs;
|
||||||
@SerializedName("startport")
|
@SerializedName("startport")
|
||||||
private int startPort;
|
private int startPort;
|
||||||
@SerializedName("endport")
|
@SerializedName("endport")
|
||||||
|
@ -139,11 +142,11 @@ public class FirewallRule implements Comparable<FirewallRule> {
|
||||||
private Protocol protocol;
|
private Protocol protocol;
|
||||||
private String state;
|
private String state;
|
||||||
|
|
||||||
public FirewallRule(long id, String CIDRs, int startPort, int endPort,
|
public FirewallRule(long id, Set<String> CIDRs, int startPort, int endPort,
|
||||||
String icmpCode, String icmpType, String ipAddress, long ipAddressId,
|
String icmpCode, String icmpType, String ipAddress, long ipAddressId,
|
||||||
Protocol protocol, String state) {
|
Protocol protocol, String state) {
|
||||||
this.id = id;
|
this.id = id;
|
||||||
this.CIDRs = CIDRs;
|
this.CIDRs = ImmutableSet.copyOf(CIDRs);
|
||||||
this.startPort = startPort;
|
this.startPort = startPort;
|
||||||
this.endPort = endPort;
|
this.endPort = endPort;
|
||||||
this.icmpCode = icmpCode;
|
this.icmpCode = icmpCode;
|
||||||
|
@ -163,7 +166,7 @@ public class FirewallRule implements Comparable<FirewallRule> {
|
||||||
return id;
|
return id;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getCIDRs() {
|
public Set<String> getCIDRs() {
|
||||||
return CIDRs;
|
return CIDRs;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -20,8 +20,6 @@ package org.jclouds.cloudstack.domain;
|
||||||
|
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
import com.google.common.base.Joiner;
|
|
||||||
import com.google.common.base.Splitter;
|
|
||||||
import com.google.common.collect.ImmutableSet;
|
import com.google.common.collect.ImmutableSet;
|
||||||
import com.google.gson.annotations.SerializedName;
|
import com.google.gson.annotations.SerializedName;
|
||||||
|
|
||||||
|
|
|
@ -41,7 +41,7 @@ public class CreateFirewallRuleOptions extends BaseHttpRequestOptions {
|
||||||
* the list of CIDRs to forward traffic from
|
* the list of CIDRs to forward traffic from
|
||||||
*/
|
*/
|
||||||
public CreateFirewallRuleOptions CIDRs(Set<String> CIDRs) {
|
public CreateFirewallRuleOptions CIDRs(Set<String> CIDRs) {
|
||||||
this.queryParameters.replaceValues("id", ImmutableSet.of(Joiner.on(",").join(CIDRs)));
|
this.queryParameters.replaceValues("cidrlist", ImmutableSet.of(Joiner.on(",").join(CIDRs)));
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -62,14 +62,15 @@ public class FirewallClientExpectTest extends BaseCloudStackRestClientExpectTest
|
||||||
.build())
|
.build())
|
||||||
.getFirewallClient();
|
.getFirewallClient();
|
||||||
|
|
||||||
|
Set<String> CIDRs = ImmutableSet.of("0.0.0.0/0");
|
||||||
assertEquals(client.listFirewallRules(),
|
assertEquals(client.listFirewallRules(),
|
||||||
ImmutableSet.of(
|
ImmutableSet.of(
|
||||||
FirewallRule.builder().id(2017).protocol(FirewallRule.Protocol.TCP).startPort(30)
|
FirewallRule.builder().id(2017).protocol(FirewallRule.Protocol.TCP).startPort(30)
|
||||||
.endPort(35).ipAddressId(2).ipAddress("10.27.27.51").state("Active").CIDRs("0.0.0.0/0").build(),
|
.endPort(35).ipAddressId(2).ipAddress("10.27.27.51").state("Active").CIDRs(CIDRs).build(),
|
||||||
FirewallRule.builder().id(2016).protocol(FirewallRule.Protocol.TCP).startPort(22)
|
FirewallRule.builder().id(2016).protocol(FirewallRule.Protocol.TCP).startPort(22)
|
||||||
.endPort(22).ipAddressId(2).ipAddress("10.27.27.51").state("Active").CIDRs("0.0.0.0/0").build(),
|
.endPort(22).ipAddressId(2).ipAddress("10.27.27.51").state("Active").CIDRs(CIDRs).build(),
|
||||||
FirewallRule.builder().id(10).protocol(FirewallRule.Protocol.TCP).startPort(22)
|
FirewallRule.builder().id(10).protocol(FirewallRule.Protocol.TCP).startPort(22)
|
||||||
.endPort(22).ipAddressId(8).ipAddress("10.27.27.57").state("Active").CIDRs("0.0.0.0/0").build()
|
.endPort(22).ipAddressId(8).ipAddress("10.27.27.57").state("Active").CIDRs(CIDRs).build()
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -113,7 +114,8 @@ public class FirewallClientExpectTest extends BaseCloudStackRestClientExpectTest
|
||||||
|
|
||||||
assertEquals(client.getFirewallRule(2017),
|
assertEquals(client.getFirewallRule(2017),
|
||||||
FirewallRule.builder().id(2017).protocol(FirewallRule.Protocol.TCP).startPort(30)
|
FirewallRule.builder().id(2017).protocol(FirewallRule.Protocol.TCP).startPort(30)
|
||||||
.endPort(35).ipAddressId(2).ipAddress("10.27.27.51").state("Active").CIDRs("0.0.0.0/0").build()
|
.endPort(35).ipAddressId(2).ipAddress("10.27.27.51").state("Active")
|
||||||
|
.CIDRs(ImmutableSet.of("0.0.0.0/0")).build()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -58,13 +58,14 @@ public class ListFirewallRulesResponseTest extends BaseSetParserTest<FirewallRul
|
||||||
@Override
|
@Override
|
||||||
@SelectJson("firewallrule")
|
@SelectJson("firewallrule")
|
||||||
public Set<FirewallRule> expected() {
|
public Set<FirewallRule> expected() {
|
||||||
|
Set<String> CIDRs = ImmutableSet.of("0.0.0.0/0");
|
||||||
return ImmutableSet.of(
|
return ImmutableSet.of(
|
||||||
FirewallRule.builder().id(2017).protocol(FirewallRule.Protocol.TCP).startPort(30)
|
FirewallRule.builder().id(2017).protocol(FirewallRule.Protocol.TCP).startPort(30)
|
||||||
.endPort(35).ipAddressId(2).ipAddress("10.27.27.51").state("Active").CIDRs("0.0.0.0/0").build(),
|
.endPort(35).ipAddressId(2).ipAddress("10.27.27.51").state("Active").CIDRs(CIDRs).build(),
|
||||||
FirewallRule.builder().id(2016).protocol(FirewallRule.Protocol.TCP).startPort(22)
|
FirewallRule.builder().id(2016).protocol(FirewallRule.Protocol.TCP).startPort(22)
|
||||||
.endPort(22).ipAddressId(2).ipAddress("10.27.27.51").state("Active").CIDRs("0.0.0.0/0").build(),
|
.endPort(22).ipAddressId(2).ipAddress("10.27.27.51").state("Active").CIDRs(CIDRs).build(),
|
||||||
FirewallRule.builder().id(10).protocol(FirewallRule.Protocol.TCP).startPort(22)
|
FirewallRule.builder().id(10).protocol(FirewallRule.Protocol.TCP).startPort(22)
|
||||||
.endPort(22).ipAddressId(8).ipAddress("10.27.27.57").state("Active").CIDRs("0.0.0.0/0").build()
|
.endPort(22).ipAddressId(8).ipAddress("10.27.27.57").state("Active").CIDRs(CIDRs).build()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue