You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jclouds.apache.org by an...@apache.org on 2015/07/24 19:31:32 UTC
jclouds git commit: [SoftLayer] fix SoftLayerTemplateOptions
Repository: jclouds
Updated Branches:
refs/heads/master 2c578d7bc -> f5e1c4764
[SoftLayer] fix SoftLayerTemplateOptions
Project: http://git-wip-us.apache.org/repos/asf/jclouds/repo
Commit: http://git-wip-us.apache.org/repos/asf/jclouds/commit/f5e1c476
Tree: http://git-wip-us.apache.org/repos/asf/jclouds/tree/f5e1c476
Diff: http://git-wip-us.apache.org/repos/asf/jclouds/diff/f5e1c476
Branch: refs/heads/master
Commit: f5e1c476447227adfcd6185a56d608c429690a17
Parents: 2c578d7
Author: Andrea Turli <an...@gmail.com>
Authored: Fri Jul 24 16:27:20 2015 +0200
Committer: Andrea Turli <an...@gmail.com>
Committed: Fri Jul 24 19:31:13 2015 +0200
----------------------------------------------------------------------
.../softlayer/binders/VirtualGuestToJson.java | 69 ++--
.../options/SoftLayerTemplateOptions.java | 340 ++++++++++++-------
.../SoftLayerComputeServiceAdapter.java | 56 +--
.../binders/VirtualGuestToJsonTest.java | 4 +
.../SoftLayerComputeServiceContextLiveTest.java | 2 +
5 files changed, 295 insertions(+), 176 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/jclouds/blob/f5e1c476/providers/softlayer/src/main/java/org/jclouds/softlayer/binders/VirtualGuestToJson.java
----------------------------------------------------------------------
diff --git a/providers/softlayer/src/main/java/org/jclouds/softlayer/binders/VirtualGuestToJson.java b/providers/softlayer/src/main/java/org/jclouds/softlayer/binders/VirtualGuestToJson.java
index efdc680..983df04 100644
--- a/providers/softlayer/src/main/java/org/jclouds/softlayer/binders/VirtualGuestToJson.java
+++ b/providers/softlayer/src/main/java/org/jclouds/softlayer/binders/VirtualGuestToJson.java
@@ -16,19 +16,23 @@
*/
package org.jclouds.softlayer.binders;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Sets;
+import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.common.base.Preconditions.checkNotNull;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import javax.inject.Inject;
import org.jclouds.http.HttpRequest;
import org.jclouds.json.Json;
import org.jclouds.rest.Binder;
-import org.jclouds.softlayer.compute.strategy.SoftLayerComputeServiceAdapter;
import org.jclouds.softlayer.domain.SecuritySshKey;
import org.jclouds.softlayer.domain.VirtualGuest;
import org.jclouds.softlayer.domain.VirtualGuestBlockDevice;
+import org.jclouds.softlayer.domain.VirtualGuestNetworkComponent;
import org.jclouds.softlayer.domain.internal.BlockDevice;
import org.jclouds.softlayer.domain.internal.BlockDeviceTemplateGroup;
import org.jclouds.softlayer.domain.internal.Datacenter;
@@ -38,20 +42,18 @@ import org.jclouds.softlayer.domain.internal.PrimaryBackendNetworkComponent;
import org.jclouds.softlayer.domain.internal.PrimaryNetworkComponent;
import org.jclouds.softlayer.domain.internal.TemplateObject;
-import javax.inject.Inject;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import static com.google.common.base.Preconditions.checkArgument;
-import static com.google.common.base.Preconditions.checkNotNull;
+import com.google.common.base.Function;
+import com.google.common.collect.FluentIterable;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Sets;
/**
* Converts a VirtualGuest into a json string valid for creating a CCI via softlayer api
* The string is set into the payload of the HttpRequest
- *
+ *
*/
public class VirtualGuestToJson implements Binder {
@@ -88,7 +90,17 @@ public class VirtualGuestToJson implements Binder {
boolean localDisk = virtualGuest.isLocalDiskFlag();
String datacenterName = checkNotNull(virtualGuest.getDatacenter().getName(), "datacenterName");
- Set<NetworkComponent> networkComponents = createNetworkComponents(virtualGuest);
+ Set<VirtualGuestNetworkComponent> virtualGuestNetworkComponents = virtualGuest.getVirtualGuestNetworkComponents();
+ Set<NetworkComponent> networkComponents = Sets.newHashSet();
+ if (virtualGuestNetworkComponents != null) {
+ networkComponents = FluentIterable.from(virtualGuestNetworkComponents)
+ .transform(new Function<VirtualGuestNetworkComponent, NetworkComponent>() {
+ @Override
+ public NetworkComponent apply(VirtualGuestNetworkComponent virtualGuestNetworkComponent) {
+ return new NetworkComponent(virtualGuestNetworkComponent.getSpeed());
+ }
+ }).toSet();
+ }
templateObjectBuilder.hostname(hostname)
.domain(domain)
@@ -98,9 +110,11 @@ public class VirtualGuestToJson implements Binder {
.localDiskFlag(localDisk)
.dedicatedAccountHostOnlyFlag(virtualGuest.isDedicatedAccountHostOnly())
.privateNetworkOnlyFlag(virtualGuest.isPrivateNetworkOnly())
- .datacenter(new Datacenter(datacenterName))
- .networkComponents(networkComponents);
+ .datacenter(new Datacenter(datacenterName));
+ if (!networkComponents.isEmpty()) {
+ templateObjectBuilder.networkComponents(networkComponents);
+ }
if (virtualGuest.getOperatingSystem() != null) {
String operatingSystemReferenceCode = checkNotNull(virtualGuest.getOperatingSystem()
.getOperatingSystemReferenceCode(), "operatingSystemReferenceCode");
@@ -154,23 +168,6 @@ public class VirtualGuestToJson implements Binder {
return ImmutableList.copyOf(blockDevices);
}
- private Set<NetworkComponent> createNetworkComponents(VirtualGuest virtualGuest) {
- if (virtualGuest.getPrimaryNetworkComponent() == null && virtualGuest.getPrimaryBackendNetworkComponent() == null) {
- return null;
- }
- ImmutableSet.Builder networkComponents = ImmutableSet.builder();
- int maxSpeed = SoftLayerComputeServiceAdapter.DEFAULT_MAX_PORT_SPEED;
-
- if (virtualGuest.getPrimaryNetworkComponent() != null && virtualGuest.getPrimaryNetworkComponent().getMaxSpeed() > maxSpeed) {
- maxSpeed = virtualGuest.getPrimaryNetworkComponent().getMaxSpeed();
- }
- if (virtualGuest.getPrimaryBackendNetworkComponent() != null && virtualGuest.getPrimaryBackendNetworkComponent().getMaxSpeed() > maxSpeed) {
- maxSpeed = virtualGuest.getPrimaryBackendNetworkComponent().getMaxSpeed();
- }
- networkComponents.add(new NetworkComponent(maxSpeed));
- return networkComponents.build();
- }
-
public class BlockDevicesComparator implements Comparator<BlockDevice> {
@Override
http://git-wip-us.apache.org/repos/asf/jclouds/blob/f5e1c476/providers/softlayer/src/main/java/org/jclouds/softlayer/compute/options/SoftLayerTemplateOptions.java
----------------------------------------------------------------------
diff --git a/providers/softlayer/src/main/java/org/jclouds/softlayer/compute/options/SoftLayerTemplateOptions.java b/providers/softlayer/src/main/java/org/jclouds/softlayer/compute/options/SoftLayerTemplateOptions.java
index 51fd816..2ff3741 100644
--- a/providers/softlayer/src/main/java/org/jclouds/softlayer/compute/options/SoftLayerTemplateOptions.java
+++ b/providers/softlayer/src/main/java/org/jclouds/softlayer/compute/options/SoftLayerTemplateOptions.java
@@ -22,8 +22,10 @@ import java.util.List;
import java.util.Map;
import org.jclouds.compute.options.TemplateOptions;
+import org.jclouds.domain.LoginCredentials;
+import org.jclouds.javax.annotation.Nullable;
+import org.jclouds.scriptbuilder.domain.Statement;
-import com.google.common.base.Optional;
import com.google.common.collect.ImmutableList;
import com.google.common.net.InternetDomainName;
@@ -32,35 +34,35 @@ import com.google.common.net.InternetDomainName;
* {@link org.jclouds.compute.ComputeService#createNodesInGroup(String, int, TemplateOptions)} and
* {@link org.jclouds.compute.ComputeService#createNodesInGroup(String, int, TemplateOptions)}
* operations on the <em>gogrid</em> provider.
- *
+ *
* <h2>Usage</h2> The recommended way to instantiate a
* {@link SoftLayerTemplateOptions} object is to statically import
* {@code SoftLayerTemplateOptions.*} and invoke a static creation method
* followed by an instance mutator (if needed):
* <p>
- *
+ *
* <pre>
* import static org.jclouds.compute.options.SoftLayerTemplateOptions.Builder.*;
* ComputeService client = // get connection
* templateBuilder.options(inboundPorts(22, 80, 8080, 443));
* Set<? extends NodeMetadata> set = client.createNodesInGroup(tag, 2, templateBuilder.build());
* </pre>
- *
+ *
*/
public class SoftLayerTemplateOptions extends TemplateOptions implements Cloneable {
protected String domainName = "jclouds.org";
- protected Optional<List<Integer>> blockDevices = Optional.absent();
- protected Optional<String> diskType = Optional.absent();
- protected Optional<Integer> portSpeed = Optional.absent();
- protected Optional<String> userData = Optional.absent();
- protected Optional<Integer> primaryNetworkComponentNetworkVlanId = Optional.absent();
- protected Optional<Integer> primaryBackendNetworkComponentNetworkVlanId = Optional.absent();
- protected Optional<Boolean> hourlyBillingFlag = Optional.absent();
- protected Optional<Boolean> dedicatedAccountHostOnlyFlag = Optional.absent();
- protected Optional<Boolean> privateNetworkOnlyFlag = Optional.absent();
- protected Optional<String> postInstallScriptUri = Optional.absent();
- protected Optional<List<Integer>> sshKeys = Optional.absent();
+ protected List<Integer> blockDevices = ImmutableList.of();
+ protected String diskType;
+ protected Integer portSpeed;
+ protected String userData;
+ protected Integer primaryNetworkComponentNetworkVlanId;
+ protected Integer primaryBackendNetworkComponentNetworkVlanId;
+ protected Boolean hourlyBillingFlag;
+ protected Boolean dedicatedAccountHostOnlyFlag;
+ protected Boolean privateNetworkOnlyFlag;
+ protected String postInstallScriptUri;
+ protected List<Integer> sshKeys = ImmutableList.of();
@Override
public SoftLayerTemplateOptions clone() {
@@ -75,35 +77,19 @@ public class SoftLayerTemplateOptions extends TemplateOptions implements Cloneab
if (to instanceof SoftLayerTemplateOptions) {
SoftLayerTemplateOptions eTo = SoftLayerTemplateOptions.class.cast(to);
eTo.domainName(domainName);
- if (blockDevices.isPresent()) {
- eTo.blockDevices(blockDevices.get());
- }
- if (diskType.isPresent()) {
- eTo.diskType(diskType.get());
- }
- if (portSpeed.isPresent()) {
- eTo.portSpeed(portSpeed.get());
- }
- if (userData.isPresent()) {
- eTo.userData(userData.get());
- }
- if (primaryNetworkComponentNetworkVlanId.isPresent()) {
- eTo.primaryNetworkComponentNetworkVlanId(primaryNetworkComponentNetworkVlanId.get());
- }
- if (primaryBackendNetworkComponentNetworkVlanId.isPresent()) {
- eTo.primaryBackendNetworkComponentNetworkVlanId(primaryBackendNetworkComponentNetworkVlanId.get());
+ if (!blockDevices.isEmpty()) {
+ eTo.blockDevices(blockDevices);
}
- if (hourlyBillingFlag.isPresent()) {
- eTo.hourlyBillingFlag(hourlyBillingFlag.get());
- }
- if (dedicatedAccountHostOnlyFlag.isPresent()) {
- eTo.dedicatedAccountHostOnlyFlag(dedicatedAccountHostOnlyFlag.get());
- }
- if (privateNetworkOnlyFlag.isPresent()) {
- eTo.privateNetworkOnlyFlag(privateNetworkOnlyFlag.get());
- }
- if (sshKeys.isPresent()) {
- eTo.sshKeys(sshKeys.get());
+ eTo.diskType(diskType);
+ eTo.portSpeed(portSpeed);
+ eTo.userData(userData);
+ eTo.primaryNetworkComponentNetworkVlanId(primaryNetworkComponentNetworkVlanId);
+ eTo.primaryBackendNetworkComponentNetworkVlanId(primaryBackendNetworkComponentNetworkVlanId);
+ eTo.hourlyBillingFlag(hourlyBillingFlag);
+ eTo.dedicatedAccountHostOnlyFlag(dedicatedAccountHostOnlyFlag);
+ eTo.privateNetworkOnlyFlag(privateNetworkOnlyFlag);
+ if (!sshKeys.isEmpty()) {
+ eTo.sshKeys(sshKeys);
}
}
}
@@ -111,7 +97,7 @@ public class SoftLayerTemplateOptions extends TemplateOptions implements Cloneab
/**
* will replace the default domain used when ordering virtual guests. Note
* this needs to contain a public suffix!
- *
+ *
* @see org.jclouds.softlayer.features.VirtualGuestApi#createVirtualGuest(org.jclouds.softlayer.domain.VirtualGuest)
* @see InternetDomainName#hasPublicSuffix
*/
@@ -126,7 +112,7 @@ public class SoftLayerTemplateOptions extends TemplateOptions implements Cloneab
public SoftLayerTemplateOptions blockDevices(Iterable<Integer> capacities) {
for (Integer capacity : checkNotNull(capacities, "capacities"))
checkNotNull(capacity, "all block devices must be non-empty");
- this.blockDevices = Optional.<List<Integer>> of(ImmutableList.copyOf(capacities));
+ this.blockDevices = ImmutableList.copyOf(capacities);
return this;
}
@@ -134,61 +120,55 @@ public class SoftLayerTemplateOptions extends TemplateOptions implements Cloneab
return blockDevices(ImmutableList.copyOf(checkNotNull(capacities, "capacities")));
}
- public SoftLayerTemplateOptions diskType(String diskType) {
- checkNotNull(diskType, "diskType was null");
- this.diskType = Optional.of(diskType);
+ public SoftLayerTemplateOptions diskType(@Nullable String diskType) {
+ this.diskType = diskType;
return this;
}
- public SoftLayerTemplateOptions portSpeed(Integer portSpeed) {
- checkNotNull(portSpeed, "portSpeed was null");
- this.portSpeed = Optional.of(portSpeed);
+ public SoftLayerTemplateOptions portSpeed(@Nullable Integer portSpeed) {
+ this.portSpeed = portSpeed;
return this;
}
- public SoftLayerTemplateOptions userData(String userData) {
- checkNotNull(userData, "userData was null");
- this.userData = Optional.of(userData);
+ public SoftLayerTemplateOptions userData(@Nullable String userData) {
+ this.userData = userData;
return this;
}
- public SoftLayerTemplateOptions primaryNetworkComponentNetworkVlanId(Integer primaryNetworkComponentNetworkVlanId) {
- checkNotNull(primaryNetworkComponentNetworkVlanId, "primaryNetworkComponentNetworkVlanId was null");
- this.primaryNetworkComponentNetworkVlanId = Optional.of(primaryNetworkComponentNetworkVlanId);
+ public SoftLayerTemplateOptions primaryNetworkComponentNetworkVlanId(@Nullable Integer primaryNetworkComponentNetworkVlanId) {
+ this.primaryNetworkComponentNetworkVlanId = primaryNetworkComponentNetworkVlanId;
return this;
}
- public SoftLayerTemplateOptions primaryBackendNetworkComponentNetworkVlanId(Integer primaryBackendNetworkComponentNetworkVlanId) {
- checkNotNull(primaryBackendNetworkComponentNetworkVlanId, "primaryBackendNetworkComponentNetworkVlanId was null");
- this.primaryBackendNetworkComponentNetworkVlanId = Optional.of(primaryBackendNetworkComponentNetworkVlanId);
+ public SoftLayerTemplateOptions primaryBackendNetworkComponentNetworkVlanId(@Nullable Integer primaryBackendNetworkComponentNetworkVlanId) {
+ this.primaryBackendNetworkComponentNetworkVlanId = primaryBackendNetworkComponentNetworkVlanId;
return this;
}
- public SoftLayerTemplateOptions hourlyBillingFlag(boolean hourlyBillingFlag) {
- this.hourlyBillingFlag = Optional.of(hourlyBillingFlag);
+ public SoftLayerTemplateOptions hourlyBillingFlag(@Nullable Boolean hourlyBillingFlag) {
+ this.hourlyBillingFlag = hourlyBillingFlag;
return this;
}
- public SoftLayerTemplateOptions dedicatedAccountHostOnlyFlag(boolean dedicatedAccountHostOnlyFlag) {
- this.dedicatedAccountHostOnlyFlag = Optional.of(dedicatedAccountHostOnlyFlag);
+ public SoftLayerTemplateOptions dedicatedAccountHostOnlyFlag(@Nullable Boolean dedicatedAccountHostOnlyFlag) {
+ this.dedicatedAccountHostOnlyFlag = dedicatedAccountHostOnlyFlag;
return this;
}
- public SoftLayerTemplateOptions privateNetworkOnlyFlag(boolean privateNetworkOnlyFlag) {
- this.privateNetworkOnlyFlag = Optional.of(privateNetworkOnlyFlag);
+ public SoftLayerTemplateOptions privateNetworkOnlyFlag(@Nullable Boolean privateNetworkOnlyFlag) {
+ this.privateNetworkOnlyFlag = privateNetworkOnlyFlag;
return this;
}
- public SoftLayerTemplateOptions postInstallScriptUri(String postInstallScriptUri) {
- checkNotNull(postInstallScriptUri, "postInstallScriptUri was null");
- this.postInstallScriptUri = Optional.of(postInstallScriptUri);
+ public SoftLayerTemplateOptions postInstallScriptUri(@Nullable String postInstallScriptUri) {
+ this.postInstallScriptUri = postInstallScriptUri;
return this;
}
public SoftLayerTemplateOptions sshKeys(Iterable<Integer> sshKeys) {
for (Integer sshKey : checkNotNull(sshKeys, "sshKeys"))
checkNotNull(sshKey, "sshKeys must be non-empty");
- this.sshKeys = Optional.<List<Integer>> of(ImmutableList.copyOf(sshKeys));
+ this.sshKeys = ImmutableList.copyOf(sshKeys);
return this;
}
@@ -200,38 +180,36 @@ public class SoftLayerTemplateOptions extends TemplateOptions implements Cloneab
return domainName;
}
- public Optional<List<Integer>> getBlockDevices() {
+ public List<Integer> getBlockDevices() {
return blockDevices;
}
- public Optional<String> getDiskType() {
+ public String getDiskType() {
return diskType;
}
- public Optional<Integer> getPortSpeed() {
+ public Integer getPortSpeed() {
return portSpeed;
}
- public Optional<String> getUserData() { return userData; }
+ public String getUserData() { return userData; }
- public Optional<Integer> getPrimaryNetworkComponentNetworkVlanId() { return primaryNetworkComponentNetworkVlanId; }
+ public Integer getPrimaryNetworkComponentNetworkVlanId() { return primaryNetworkComponentNetworkVlanId; }
- public Optional<Integer> getPrimaryBackendNetworkComponentNetworkVlanId() { return primaryBackendNetworkComponentNetworkVlanId; }
+ public Integer getPrimaryBackendNetworkComponentNetworkVlanId() { return primaryBackendNetworkComponentNetworkVlanId; }
- public Optional<Boolean> isHourlyBillingFlag() { return hourlyBillingFlag; }
+ public Boolean isHourlyBillingFlag() { return hourlyBillingFlag; }
- public Optional<Boolean> isDedicatedAccountHostOnlyFlag() { return dedicatedAccountHostOnlyFlag; }
+ public Boolean isDedicatedAccountHostOnlyFlag() { return dedicatedAccountHostOnlyFlag; }
- public Optional<Boolean> isPrivateNetworkOnlyFlag() { return privateNetworkOnlyFlag; }
+ public Boolean isPrivateNetworkOnlyFlag() { return privateNetworkOnlyFlag; }
- public Optional<String> getPostInstallScriptUri() { return postInstallScriptUri; }
+ public String getPostInstallScriptUri() { return postInstallScriptUri; }
- public Optional<List<Integer>> getSshKeys() {
+ public List<Integer> getSshKeys() {
return sshKeys;
}
- public static final SoftLayerTemplateOptions NONE = new SoftLayerTemplateOptions();
-
public static class Builder {
/**
@@ -239,7 +217,7 @@ public class SoftLayerTemplateOptions extends TemplateOptions implements Cloneab
*/
public static SoftLayerTemplateOptions domainName(String domainName) {
SoftLayerTemplateOptions options = new SoftLayerTemplateOptions();
- return SoftLayerTemplateOptions.class.cast(options.domainName(domainName));
+ return options.domainName(domainName);
}
/**
@@ -247,12 +225,12 @@ public class SoftLayerTemplateOptions extends TemplateOptions implements Cloneab
*/
public static SoftLayerTemplateOptions blockDevices(Integer... capacities) {
SoftLayerTemplateOptions options = new SoftLayerTemplateOptions();
- return SoftLayerTemplateOptions.class.cast(options.blockDevices(capacities));
+ return options.blockDevices(capacities);
}
public static SoftLayerTemplateOptions blockDevices(Iterable<Integer> capacities) {
SoftLayerTemplateOptions options = new SoftLayerTemplateOptions();
- return SoftLayerTemplateOptions.class.cast(options.blockDevices(capacities));
+ return options.blockDevices(capacities);
}
/**
@@ -260,7 +238,7 @@ public class SoftLayerTemplateOptions extends TemplateOptions implements Cloneab
*/
public static SoftLayerTemplateOptions diskType(String diskType) {
SoftLayerTemplateOptions options = new SoftLayerTemplateOptions();
- return SoftLayerTemplateOptions.class.cast(options.diskType(diskType));
+ return options.diskType(diskType);
}
/**
@@ -268,7 +246,7 @@ public class SoftLayerTemplateOptions extends TemplateOptions implements Cloneab
*/
public static SoftLayerTemplateOptions portSpeed(Integer portSpeed) {
SoftLayerTemplateOptions options = new SoftLayerTemplateOptions();
- return SoftLayerTemplateOptions.class.cast(options.portSpeed(portSpeed));
+ return options.portSpeed(portSpeed);
}
/**
@@ -276,7 +254,7 @@ public class SoftLayerTemplateOptions extends TemplateOptions implements Cloneab
*/
public static SoftLayerTemplateOptions userData(String userData) {
SoftLayerTemplateOptions options = new SoftLayerTemplateOptions();
- return SoftLayerTemplateOptions.class.cast(options.userData(userData));
+ return options.userData(userData);
}
/**
@@ -284,7 +262,7 @@ public class SoftLayerTemplateOptions extends TemplateOptions implements Cloneab
*/
public static SoftLayerTemplateOptions primaryNetworkComponentNetworkVlanId(Integer primaryNetworkComponentNetworkVlanId) {
SoftLayerTemplateOptions options = new SoftLayerTemplateOptions();
- return SoftLayerTemplateOptions.class.cast(options.primaryNetworkComponentNetworkVlanId(primaryNetworkComponentNetworkVlanId));
+ return options.primaryNetworkComponentNetworkVlanId(primaryNetworkComponentNetworkVlanId);
}
/**
@@ -292,7 +270,7 @@ public class SoftLayerTemplateOptions extends TemplateOptions implements Cloneab
*/
public static SoftLayerTemplateOptions primaryBackendNetworkComponentNetworkVlanId(Integer primaryBackendNetworkComponentNetworkVlanId) {
SoftLayerTemplateOptions options = new SoftLayerTemplateOptions();
- return SoftLayerTemplateOptions.class.cast(options.primaryBackendNetworkComponentNetworkVlanId(primaryBackendNetworkComponentNetworkVlanId));
+ return options.primaryBackendNetworkComponentNetworkVlanId(primaryBackendNetworkComponentNetworkVlanId);
}
/**
@@ -300,7 +278,7 @@ public class SoftLayerTemplateOptions extends TemplateOptions implements Cloneab
*/
public static SoftLayerTemplateOptions hourlyBillingFlag(boolean hourlyBillingFlag) {
SoftLayerTemplateOptions options = new SoftLayerTemplateOptions();
- return SoftLayerTemplateOptions.class.cast(options.hourlyBillingFlag(hourlyBillingFlag));
+ return options.hourlyBillingFlag(hourlyBillingFlag);
}
/**
@@ -308,7 +286,7 @@ public class SoftLayerTemplateOptions extends TemplateOptions implements Cloneab
*/
public static SoftLayerTemplateOptions dedicatedAccountHostOnlyFlag(boolean dedicatedAccountHostOnlyFlag) {
SoftLayerTemplateOptions options = new SoftLayerTemplateOptions();
- return SoftLayerTemplateOptions.class.cast(options.dedicatedAccountHostOnlyFlag(dedicatedAccountHostOnlyFlag));
+ return options.dedicatedAccountHostOnlyFlag(dedicatedAccountHostOnlyFlag);
}
/**
@@ -316,7 +294,7 @@ public class SoftLayerTemplateOptions extends TemplateOptions implements Cloneab
*/
public static SoftLayerTemplateOptions privateNetworkOnlyFlag(boolean privateNetworkOnlyFlag) {
SoftLayerTemplateOptions options = new SoftLayerTemplateOptions();
- return SoftLayerTemplateOptions.class.cast(options.privateNetworkOnlyFlag(privateNetworkOnlyFlag));
+ return options.privateNetworkOnlyFlag(privateNetworkOnlyFlag);
}
/**
@@ -324,7 +302,7 @@ public class SoftLayerTemplateOptions extends TemplateOptions implements Cloneab
*/
public static SoftLayerTemplateOptions postInstallScriptUri(String postInstallScriptUri) {
SoftLayerTemplateOptions options = new SoftLayerTemplateOptions();
- return SoftLayerTemplateOptions.class.cast(options.postInstallScriptUri(postInstallScriptUri));
+ return options.postInstallScriptUri(postInstallScriptUri);
}
/**
@@ -332,22 +310,20 @@ public class SoftLayerTemplateOptions extends TemplateOptions implements Cloneab
*/
public static SoftLayerTemplateOptions sshKeys(Integer... sshKeys) {
SoftLayerTemplateOptions options = new SoftLayerTemplateOptions();
- return SoftLayerTemplateOptions.class.cast(options.sshKeys(sshKeys));
+ return options.sshKeys(sshKeys);
}
public static SoftLayerTemplateOptions sshKeys(Iterable<Integer> sshKeys) {
SoftLayerTemplateOptions options = new SoftLayerTemplateOptions();
- return SoftLayerTemplateOptions.class.cast(options.blockDevices(sshKeys));
+ return options.blockDevices(sshKeys);
}
- // methods that only facilitate returning the correct object type
-
/**
* @see TemplateOptions#inboundPorts(int...)
*/
public static SoftLayerTemplateOptions inboundPorts(int... ports) {
SoftLayerTemplateOptions options = new SoftLayerTemplateOptions();
- return SoftLayerTemplateOptions.class.cast(options.inboundPorts(ports));
+ return options.inboundPorts(ports);
}
/**
@@ -355,23 +331,31 @@ public class SoftLayerTemplateOptions extends TemplateOptions implements Cloneab
*/
public static SoftLayerTemplateOptions blockOnPort(int port, int seconds) {
SoftLayerTemplateOptions options = new SoftLayerTemplateOptions();
- return SoftLayerTemplateOptions.class.cast(options.blockOnPort(port, seconds));
+ return options.blockOnPort(port, seconds);
}
/**
- * @see TemplateOptions#userMetadata(Map)
+ * @see TemplateOptions#installPrivateKey(String)
*/
- public static SoftLayerTemplateOptions userMetadata(Map<String, String> userMetadata) {
+ public static SoftLayerTemplateOptions installPrivateKey(String rsaKey) {
SoftLayerTemplateOptions options = new SoftLayerTemplateOptions();
- return SoftLayerTemplateOptions.class.cast(options.userMetadata(userMetadata));
+ return options.installPrivateKey(rsaKey);
}
/**
- * @see TemplateOptions#userMetadata(String, String)
+ * @see TemplateOptions#authorizePublicKey(String)
*/
- public static SoftLayerTemplateOptions userMetadata(String key, String value) {
+ public static SoftLayerTemplateOptions authorizePublicKey(String rsaKey) {
SoftLayerTemplateOptions options = new SoftLayerTemplateOptions();
- return SoftLayerTemplateOptions.class.cast(options.userMetadata(key, value));
+ return options.authorizePublicKey(rsaKey);
+ }
+
+ /**
+ * @see TemplateOptions#userMetadata(Map)
+ */
+ public static SoftLayerTemplateOptions userMetadata(Map<String, String> userMetadata) {
+ SoftLayerTemplateOptions options = new SoftLayerTemplateOptions();
+ return options.userMetadata(userMetadata);
}
/**
@@ -379,7 +363,7 @@ public class SoftLayerTemplateOptions extends TemplateOptions implements Cloneab
*/
public static SoftLayerTemplateOptions nodeNames(Iterable<String> nodeNames) {
SoftLayerTemplateOptions options = new SoftLayerTemplateOptions();
- return SoftLayerTemplateOptions.class.cast(options.nodeNames(nodeNames));
+ return options.nodeNames(nodeNames);
}
/**
@@ -387,14 +371,62 @@ public class SoftLayerTemplateOptions extends TemplateOptions implements Cloneab
*/
public static SoftLayerTemplateOptions networks(Iterable<String> networks) {
SoftLayerTemplateOptions options = new SoftLayerTemplateOptions();
- return SoftLayerTemplateOptions.class.cast(options.networks(networks));
+ return options.networks(networks);
}
- }
+ /**
+ * @see TemplateOptions#overrideLoginUser(String)
+ */
+ public static SoftLayerTemplateOptions overrideLoginUser(String user) {
+ SoftLayerTemplateOptions options = new SoftLayerTemplateOptions();
+ return options.overrideLoginUser(user);
+ }
+
+ /**
+ * @see TemplateOptions#overrideLoginPassword(String)
+ */
+ public static SoftLayerTemplateOptions overrideLoginPassword(String password) {
+ SoftLayerTemplateOptions options = new SoftLayerTemplateOptions();
+ return options.overrideLoginPassword(password);
+ }
+
+ /**
+ * @see TemplateOptions#overrideLoginPrivateKey(String)
+ */
+ public static SoftLayerTemplateOptions overrideLoginPrivateKey(String privateKey) {
+ SoftLayerTemplateOptions options = new SoftLayerTemplateOptions();
+ return options.overrideLoginPrivateKey(privateKey);
+ }
+
+ /**
+ * @see TemplateOptions#overrideAuthenticateSudo(boolean)
+ */
+ public static SoftLayerTemplateOptions overrideAuthenticateSudo(boolean authenticateSudo) {
+ SoftLayerTemplateOptions options = new SoftLayerTemplateOptions();
+ return options.overrideAuthenticateSudo(authenticateSudo);
+ }
+
+ /**
+ * @see TemplateOptions#overrideLoginCredentials(LoginCredentials)
+ */
+ public static SoftLayerTemplateOptions overrideLoginCredentials(LoginCredentials credentials) {
+ SoftLayerTemplateOptions options = new SoftLayerTemplateOptions();
+ return options.overrideLoginCredentials(credentials);
+ }
+
+ /**
+ * @see TemplateOptions#blockUntilRunning(boolean)
+ */
+ public static SoftLayerTemplateOptions blockUntilRunning(boolean blockUntilRunning) {
+ SoftLayerTemplateOptions options = new SoftLayerTemplateOptions();
+ return options.blockUntilRunning(blockUntilRunning);
+ }
+
+ }
// methods that only facilitate returning the correct object type
/**
- * @see TemplateOptions#blockOnPort(int, int)
+ * {@inheritDoc}
*/
@Override
public SoftLayerTemplateOptions blockOnPort(int port, int seconds) {
@@ -402,7 +434,7 @@ public class SoftLayerTemplateOptions extends TemplateOptions implements Cloneab
}
/**
- * @see TemplateOptions#inboundPorts(int...)
+ * {@inheritDoc}
*/
@Override
public SoftLayerTemplateOptions inboundPorts(int... ports) {
@@ -410,7 +442,7 @@ public class SoftLayerTemplateOptions extends TemplateOptions implements Cloneab
}
/**
- * @see TemplateOptions#authorizePublicKey(String)
+ * {@inheritDoc}
*/
@Override
public SoftLayerTemplateOptions authorizePublicKey(String publicKey) {
@@ -418,7 +450,7 @@ public class SoftLayerTemplateOptions extends TemplateOptions implements Cloneab
}
/**
- * @see TemplateOptions#installPrivateKey(String)
+ * {@inheritDoc}
*/
@Override
public SoftLayerTemplateOptions installPrivateKey(String privateKey) {
@@ -429,6 +461,86 @@ public class SoftLayerTemplateOptions extends TemplateOptions implements Cloneab
* {@inheritDoc}
*/
@Override
+ public SoftLayerTemplateOptions blockUntilRunning(boolean blockUntilRunning) {
+ return SoftLayerTemplateOptions.class.cast(super.blockUntilRunning(blockUntilRunning));
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public SoftLayerTemplateOptions dontAuthorizePublicKey() {
+ return SoftLayerTemplateOptions.class.cast(super.dontAuthorizePublicKey());
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public SoftLayerTemplateOptions nameTask(String name) {
+ return SoftLayerTemplateOptions.class.cast(super.nameTask(name));
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public SoftLayerTemplateOptions runAsRoot(boolean runAsRoot) {
+ return SoftLayerTemplateOptions.class.cast(super.runAsRoot(runAsRoot));
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public SoftLayerTemplateOptions runScript(Statement script) {
+ return SoftLayerTemplateOptions.class.cast(super.runScript(script));
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public SoftLayerTemplateOptions overrideLoginCredentials(LoginCredentials overridingCredentials) {
+ return SoftLayerTemplateOptions.class.cast(super.overrideLoginCredentials(overridingCredentials));
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public SoftLayerTemplateOptions overrideLoginPassword(String password) {
+ return SoftLayerTemplateOptions.class.cast(super.overrideLoginPassword(password));
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public SoftLayerTemplateOptions overrideLoginPrivateKey(String privateKey) {
+ return SoftLayerTemplateOptions.class.cast(super.overrideLoginPrivateKey(privateKey));
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public SoftLayerTemplateOptions overrideLoginUser(String loginUser) {
+ return SoftLayerTemplateOptions.class.cast(super.overrideLoginUser(loginUser));
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public SoftLayerTemplateOptions overrideAuthenticateSudo(boolean authenticateSudo) {
+ return SoftLayerTemplateOptions.class.cast(super.overrideAuthenticateSudo(authenticateSudo));
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
public SoftLayerTemplateOptions userMetadata(Map<String, String> userMetadata) {
return SoftLayerTemplateOptions.class.cast(super.userMetadata(userMetadata));
}
http://git-wip-us.apache.org/repos/asf/jclouds/blob/f5e1c476/providers/softlayer/src/main/java/org/jclouds/softlayer/compute/strategy/SoftLayerComputeServiceAdapter.java
----------------------------------------------------------------------
diff --git a/providers/softlayer/src/main/java/org/jclouds/softlayer/compute/strategy/SoftLayerComputeServiceAdapter.java b/providers/softlayer/src/main/java/org/jclouds/softlayer/compute/strategy/SoftLayerComputeServiceAdapter.java
index 35e7615..21567f7 100644
--- a/providers/softlayer/src/main/java/org/jclouds/softlayer/compute/strategy/SoftLayerComputeServiceAdapter.java
+++ b/providers/softlayer/src/main/java/org/jclouds/softlayer/compute/strategy/SoftLayerComputeServiceAdapter.java
@@ -30,7 +30,6 @@ import static org.jclouds.compute.util.ComputeServiceUtils.getSpace;
import static org.jclouds.softlayer.reference.SoftLayerConstants.PROPERTY_SOFTLAYER_VIRTUALGUEST_ACTIVE_TRANSACTIONS_DELAY;
import static org.jclouds.softlayer.reference.SoftLayerConstants.PROPERTY_SOFTLAYER_VIRTUALGUEST_LOGIN_DETAILS_DELAY;
import static org.jclouds.util.Predicates2.retry;
-
import java.util.Comparator;
import java.util.List;
import java.util.Map;
@@ -82,6 +81,7 @@ import com.google.common.base.Supplier;
import com.google.common.collect.ComparisonChain;
import com.google.common.collect.FluentIterable;
import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
import com.google.common.collect.ImmutableSet.Builder;
import com.google.common.collect.ImmutableSortedSet;
import com.google.common.collect.Sets;
@@ -99,7 +99,6 @@ public class SoftLayerComputeServiceAdapter implements
private static final int USER_META_NOTES_MAX_LENGTH = 1000;
private static final String BOOTABLE_DEVICE = "0";
public static final String DEFAULT_DISK_TYPE = "LOCAL";
- public static final int DEFAULT_MAX_PORT_SPEED = 100;
@Resource
@Named(ComputeServiceConstants.COMPUTE_LOGGER)
@@ -136,9 +135,12 @@ public class SoftLayerComputeServiceAdapter implements
SoftLayerTemplateOptions templateOptions = template.getOptions().as(SoftLayerTemplateOptions.class);
String domainName = templateOptions.getDomainName();
- String diskType = templateOptions.getDiskType().or(DEFAULT_DISK_TYPE);
- boolean hourlyBillingFlag = templateOptions.isHourlyBillingFlag().or(true);
- int maxPortSpeed = templateOptions.getPortSpeed().or(DEFAULT_MAX_PORT_SPEED);
+ String diskType = templateOptions.getDiskType() == null ? DEFAULT_DISK_TYPE : templateOptions.getDiskType();
+ boolean hourlyBillingFlag = templateOptions.isHourlyBillingFlag() == null ? true : templateOptions.isHourlyBillingFlag();
+ Integer portSpeed = templateOptions.getPortSpeed();
+ Set<VirtualGuestNetworkComponent> networkComponents = portSpeed != null ?
+ ImmutableSet.of(VirtualGuestNetworkComponent.builder().speed(portSpeed).build()) :
+ ImmutableSet.<VirtualGuestNetworkComponent>of();
final Datacenter datacenter = Datacenter.builder().name(template.getLocation().getId()).build();
final String imageId = template.getImage().getId();
int cores = (int) template.getHardware().getProcessors().get(0).getCores();
@@ -151,10 +153,12 @@ public class SoftLayerComputeServiceAdapter implements
.startCpus(cores)
.maxMemory(template.getHardware().getRam())
.datacenter(datacenter)
- .localDiskFlag(isLocalDisk(diskType));
+ .localDiskFlag(isLocalDisk(diskType))
+ .networkComponents(networkComponents);
+
// set operating system or blockDeviceTemplateGroup
Optional<OperatingSystem> optionalOperatingSystem = tryExtractOperatingSystemFrom(imageId);
- if (optionalOperatingSystem.isPresent()) {
+ if (optionalOperatingSystem != null) {
virtualGuestBuilder.operatingSystem(optionalOperatingSystem.get());
// the imageId specified is an id of a public/private/flex image
} else {
@@ -163,47 +167,47 @@ public class SoftLayerComputeServiceAdapter implements
virtualGuestBuilder.blockDeviceTemplateGroup(blockDeviceTemplateGroup).build();
}
// set multi-disks
- if (templateOptions.getBlockDevices().isPresent()) {
- List<VirtualGuestBlockDevice> blockDevices = getBlockDevices(templateOptions.getBlockDevices().get(), diskType);
+ if (!templateOptions.getBlockDevices().isEmpty()) {
+ List<VirtualGuestBlockDevice> blockDevices = getBlockDevices(templateOptions.getBlockDevices(), diskType);
virtualGuestBuilder.blockDevices(blockDevices);
}
// set dedicatedAccountHostOnlyFlag
- if (templateOptions.isDedicatedAccountHostOnlyFlag().isPresent()) {
- virtualGuestBuilder.dedicatedAccountHostOnly(templateOptions.isDedicatedAccountHostOnlyFlag().get());
+ if (templateOptions.isDedicatedAccountHostOnlyFlag() != null) {
+ virtualGuestBuilder.dedicatedAccountHostOnly(templateOptions.isDedicatedAccountHostOnlyFlag());
}
// set privateNetworkOnlyFlag
- if (templateOptions.isPrivateNetworkOnlyFlag().isPresent()) {
- virtualGuestBuilder.privateNetworkOnlyFlag(templateOptions.isPrivateNetworkOnlyFlag().get());
+ if (templateOptions.isPrivateNetworkOnlyFlag() != null) {
+ virtualGuestBuilder.privateNetworkOnlyFlag(templateOptions.isPrivateNetworkOnlyFlag());
}
// set primaryNetworkComponent.networkVlan.id
- if (templateOptions.getPrimaryNetworkComponentNetworkVlanId().isPresent()) {
- int primaryNetworkComponentNetworkVlanId = templateOptions.getPrimaryNetworkComponentNetworkVlanId().get();
+ if (templateOptions.getPrimaryNetworkComponentNetworkVlanId() != null) {
+ int primaryNetworkComponentNetworkVlanId = templateOptions.getPrimaryNetworkComponentNetworkVlanId();
virtualGuestBuilder.primaryNetworkComponent(
VirtualGuestNetworkComponent.builder()
.networkVlan(NetworkVlan.builder().id(primaryNetworkComponentNetworkVlanId).build())
- .speed(maxPortSpeed).build());
+ .build());
}
// set primaryBackendNetworkComponent.networkVlan.id
- if (templateOptions.getPrimaryBackendNetworkComponentNetworkVlanId().isPresent()) {
- int primaryBackendNetworkComponentNetworkVlanId = templateOptions.getPrimaryBackendNetworkComponentNetworkVlanId().get();
+ if (templateOptions.getPrimaryBackendNetworkComponentNetworkVlanId() != null) {
+ int primaryBackendNetworkComponentNetworkVlanId = templateOptions.getPrimaryBackendNetworkComponentNetworkVlanId();
virtualGuestBuilder.primaryBackendNetworkComponent(
VirtualGuestNetworkComponent.builder()
.networkVlan(NetworkVlan.builder().id(primaryBackendNetworkComponentNetworkVlanId).build())
- .speed(maxPortSpeed).build());
+ .build());
}
// set postInstallScriptUri
- if (templateOptions.getPostInstallScriptUri().isPresent()) {
+ if (templateOptions.getPostInstallScriptUri() != null) {
// Specifies the uri location of the script to be downloaded and run after installation is complete.
- virtualGuestBuilder.postInstallScriptUri(templateOptions.getPostInstallScriptUri().get());
+ virtualGuestBuilder.postInstallScriptUri(templateOptions.getPostInstallScriptUri());
}
// set userData
- if (templateOptions.getUserData().isPresent()) {
- virtualGuestBuilder.virtualGuestAttribute(VirtualGuestAttribute.builder().value(templateOptions.getUserData().get()).build());
+ if (templateOptions.getUserData() != null) {
+ virtualGuestBuilder.virtualGuestAttribute(VirtualGuestAttribute.builder().value(templateOptions.getUserData()).build());
}
// set sshKeys
- if (templateOptions.getSshKeys().isPresent()) {
+ if (!templateOptions.getSshKeys().isEmpty()) {
Set<SecuritySshKey> sshKeys = Sets.newHashSet();
- for (int sshKeyId : templateOptions.getSshKeys().get()) {
+ for (int sshKeyId : templateOptions.getSshKeys()) {
sshKeys.add(SecuritySshKey.builder().id(sshKeyId).build());
}
virtualGuestBuilder.sshKeys(sshKeys);
@@ -215,7 +219,7 @@ public class SoftLayerComputeServiceAdapter implements
logger.trace("<< VirtualGuest(%s)", result.getId());
// tags
- if (templateOptions.getTags() != null) {
+ if (!templateOptions.getTags().isEmpty()) {
api.getVirtualGuestApi().setTags(result.getId(), templateOptions.getTags());
}
http://git-wip-us.apache.org/repos/asf/jclouds/blob/f5e1c476/providers/softlayer/src/test/java/org/jclouds/softlayer/binders/VirtualGuestToJsonTest.java
----------------------------------------------------------------------
diff --git a/providers/softlayer/src/test/java/org/jclouds/softlayer/binders/VirtualGuestToJsonTest.java b/providers/softlayer/src/test/java/org/jclouds/softlayer/binders/VirtualGuestToJsonTest.java
index 8a9d8b3..3ff4179 100644
--- a/providers/softlayer/src/test/java/org/jclouds/softlayer/binders/VirtualGuestToJsonTest.java
+++ b/providers/softlayer/src/test/java/org/jclouds/softlayer/binders/VirtualGuestToJsonTest.java
@@ -25,9 +25,11 @@ import org.jclouds.softlayer.domain.Datacenter;
import org.jclouds.softlayer.domain.OperatingSystem;
import org.jclouds.softlayer.domain.VirtualGuest;
import org.jclouds.softlayer.domain.VirtualGuestBlockDeviceTemplateGroup;
+import org.jclouds.softlayer.domain.VirtualGuestNetworkComponent;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
+import com.google.common.collect.ImmutableSet;
import com.google.gson.Gson;
@Test(groups = "unit", testName = "VirtualGuestToJsonTest")
@@ -56,6 +58,7 @@ public class VirtualGuestToJsonTest {
.operatingSystemReferenceCode("UBUNTU_12_64")
.build())
.localDiskFlag(true)
+ .networkComponents(ImmutableSet.<VirtualGuestNetworkComponent>of())
.build();
request = binder.bindToRequest(request, virtualGuestWithOS);
@@ -80,6 +83,7 @@ public class VirtualGuestToJsonTest {
.globalIdentifier("ffaafa98-4b4a-4fa7-b9f7-b1bad5ec50f0")
.build())
.localDiskFlag(true)
+ .networkComponents(ImmutableSet.<VirtualGuestNetworkComponent>of())
.build();
request = binder.bindToRequest(request, virtualGuestWithVirtualGuestBlockDeviceTemplateGroup);
http://git-wip-us.apache.org/repos/asf/jclouds/blob/f5e1c476/providers/softlayer/src/test/java/org/jclouds/softlayer/compute/SoftLayerComputeServiceContextLiveTest.java
----------------------------------------------------------------------
diff --git a/providers/softlayer/src/test/java/org/jclouds/softlayer/compute/SoftLayerComputeServiceContextLiveTest.java b/providers/softlayer/src/test/java/org/jclouds/softlayer/compute/SoftLayerComputeServiceContextLiveTest.java
index f5c29d6..e75902a 100644
--- a/providers/softlayer/src/test/java/org/jclouds/softlayer/compute/SoftLayerComputeServiceContextLiveTest.java
+++ b/providers/softlayer/src/test/java/org/jclouds/softlayer/compute/SoftLayerComputeServiceContextLiveTest.java
@@ -67,9 +67,11 @@ public class SoftLayerComputeServiceContextLiveTest extends BaseComputeServiceCo
// test passing custom options
SoftLayerTemplateOptions options = template.getOptions().as(SoftLayerTemplateOptions.class);
options.domainName("live.org");
+ options.portSpeed(100);
//tags
options.tags(ImmutableList.of("jclouds"));
+
Set<? extends NodeMetadata> nodes = context.getComputeService().createNodesInGroup(name, numNodes, template);
assertEquals(numNodes, nodes.size(), "wrong number of nodes");
for (NodeMetadata node : nodes) {