mirror of https://github.com/apache/jclouds.git
Merge pull request #80 from jsonking/master
Issue 158: Started createNodeWithGroupEncodedIntoNameThenStoreCredentials. Fixed an objectMask and entered rest of metadata
This commit is contained in:
commit
1649c15ac7
|
@ -54,7 +54,7 @@ public class SoftLayerProviderMetadata extends BaseProviderMetadata {
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public String getName() {
|
public String getName() {
|
||||||
return "//TODO SoftLayer";
|
return "SoftLayer";
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -62,7 +62,7 @@ public class SoftLayerProviderMetadata extends BaseProviderMetadata {
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public String getIdentityName() {
|
public String getIdentityName() {
|
||||||
return "//TODO";
|
return "API Username";
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -70,7 +70,7 @@ public class SoftLayerProviderMetadata extends BaseProviderMetadata {
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public String getCredentialName() {
|
public String getCredentialName() {
|
||||||
return "//TODO";
|
return "API Key";
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -78,7 +78,7 @@ public class SoftLayerProviderMetadata extends BaseProviderMetadata {
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public URI getHomepage() {
|
public URI getHomepage() {
|
||||||
return URI.create("//TODO");
|
return URI.create("http://www.softlayer.com");
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -86,7 +86,7 @@ public class SoftLayerProviderMetadata extends BaseProviderMetadata {
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public URI getConsole() {
|
public URI getConsole() {
|
||||||
return URI.create("//TODO");
|
return URI.create("https://manage.softlayer.com");
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* {@inheritDoc}
|
* {@inheritDoc}
|
||||||
|
|
|
@ -19,6 +19,7 @@
|
||||||
package org.jclouds.softlayer.compute.strategy;
|
package org.jclouds.softlayer.compute.strategy;
|
||||||
|
|
||||||
import com.google.common.base.Predicates;
|
import com.google.common.base.Predicates;
|
||||||
|
import com.google.common.base.Splitter;
|
||||||
import com.google.common.collect.ImmutableSet;
|
import com.google.common.collect.ImmutableSet;
|
||||||
import com.google.common.collect.Iterables;
|
import com.google.common.collect.Iterables;
|
||||||
import com.google.common.collect.Maps;
|
import com.google.common.collect.Maps;
|
||||||
|
@ -54,7 +55,6 @@ public class SoftLayerComputeServiceAdapter implements
|
||||||
ComputeServiceAdapter<VirtualGuest, Set<ProductItem>, ProductItem, Datacenter> {
|
ComputeServiceAdapter<VirtualGuest, Set<ProductItem>, ProductItem, Datacenter> {
|
||||||
|
|
||||||
public static final String SAN_DESCRIPTION_REGEX=".*GB \\(SAN\\).*";
|
public static final String SAN_DESCRIPTION_REGEX=".*GB \\(SAN\\).*";
|
||||||
//TODO: Better to pass this in as a property like virtualGuestPackageName?
|
|
||||||
private static final Float BOOT_VOLUME_CAPACITY = 100F;
|
private static final Float BOOT_VOLUME_CAPACITY = 100F;
|
||||||
|
|
||||||
private final SoftLayerClient client;
|
private final SoftLayerClient client;
|
||||||
|
@ -68,18 +68,82 @@ public class SoftLayerComputeServiceAdapter implements
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public VirtualGuest createNodeWithGroupEncodedIntoNameThenStoreCredentials(String tag, String name,
|
public VirtualGuest createNodeWithGroupEncodedIntoNameThenStoreCredentials(String group, String name,
|
||||||
Template template, Map<String, Credentials> credentialStore) {
|
Template template, Map<String, Credentials> credentialStore) {
|
||||||
VirtualGuest from = null; // from testCancelAndPlaceOrder()
|
|
||||||
// use name for hostname as possible
|
Iterable<VirtualGuest> existing = findVirtualGuests(name,group);
|
||||||
// you can ignore group, unless it is valid to set as domain
|
if(!Iterables.isEmpty(existing)) {
|
||||||
// get the cpu, mem, datacenter from the template ids
|
throw new IllegalStateException(
|
||||||
// make sure you store the credentials so that later functions can use them
|
"VirtualGuest(s) already exist with hostname:"+name+", group:"+group+". Existing:"+existing);
|
||||||
// credentialStore.put("node#"+ from.getId() + "", new Credentials(from.loginUser (might be root),
|
}
|
||||||
// from.password));
|
|
||||||
return from;
|
VirtualGuest newGuest = VirtualGuest.builder()
|
||||||
|
.domain(group)
|
||||||
|
.hostname(name)
|
||||||
|
.build();
|
||||||
|
|
||||||
|
ProductOrder order = ProductOrder.builder()
|
||||||
|
.packageId(getProductPackage().getId())
|
||||||
|
.location(template.getLocation().getId())
|
||||||
|
.quantity(1)
|
||||||
|
.useHourlyPricing(true)
|
||||||
|
.prices(getPrices(template))
|
||||||
|
.virtualGuest(newGuest)
|
||||||
|
.build();
|
||||||
|
|
||||||
|
client.getVirtualGuestClient().orderVirtualGuest(order);
|
||||||
|
|
||||||
|
|
||||||
|
VirtualGuest result = Iterables.getOnlyElement(findVirtualGuests(name, group));
|
||||||
|
Credentials credentials = new Credentials(null,null);
|
||||||
|
|
||||||
|
// This information is not always available.
|
||||||
|
OperatingSystem os = result.getOperatingSystem();
|
||||||
|
if(os!=null) {
|
||||||
|
Set<Password> passwords = os.getPasswords();
|
||||||
|
if(passwords.size()>0) {
|
||||||
|
Password pw = Iterables.get(passwords,0);
|
||||||
|
credentials = new Credentials(pw.getUsername(),pw.getPassword());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
credentialStore.put("node#"+result.getId(),credentials);
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private Iterable<VirtualGuest> findVirtualGuests(String hostname,String domain) {
|
||||||
|
checkNotNull(hostname,"hostname");
|
||||||
|
checkNotNull(domain,"domain");
|
||||||
|
|
||||||
|
Set<VirtualGuest> result = Sets.newLinkedHashSet();
|
||||||
|
|
||||||
|
for( VirtualGuest guest : client.getVirtualGuestClient().listVirtualGuests()) {
|
||||||
|
if ( guest.getHostname().equals(hostname) && guest.getDomain().equals(domain)) {
|
||||||
|
result.add(guest);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Iterable<ProductItemPrice> getPrices(Template template) {
|
||||||
|
Set<ProductItemPrice> result = Sets.newLinkedHashSet();
|
||||||
|
|
||||||
|
int imageId = Integer.parseInt(template.getImage().getId());
|
||||||
|
result.add(ProductItemPrice.builder().id(imageId).build());
|
||||||
|
|
||||||
|
Iterable<String> hardwareIds = Splitter.on(",").split(template.getHardware().getId());
|
||||||
|
for(String hardwareId: hardwareIds) {
|
||||||
|
int id = Integer.parseInt(hardwareId);
|
||||||
|
result.add(ProductItemPrice.builder().id(id).build());
|
||||||
|
}
|
||||||
|
|
||||||
|
result.addAll(SoftLayerConstants.DEFAULT_VIRTUAL_GUEST_PRICES);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Iterable<Set<ProductItem>> listHardwareProfiles() {
|
public Iterable<Set<ProductItem>> listHardwareProfiles() {
|
||||||
ProductPackage productPackage = getProductPackage();
|
ProductPackage productPackage = getProductPackage();
|
||||||
|
|
|
@ -0,0 +1,137 @@
|
||||||
|
/**
|
||||||
|
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. jclouds licenses this file
|
||||||
|
* to you under the Apache License, Version 2.0 (the
|
||||||
|
* "License"); you may not use this file except in compliance
|
||||||
|
* with the License. You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing,
|
||||||
|
* software distributed under the License is distributed on an
|
||||||
|
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
* KIND, either express or implied. See the License for the
|
||||||
|
* specific language governing permissions and limitations
|
||||||
|
* under the License.
|
||||||
|
*/
|
||||||
|
package org.jclouds.softlayer.domain;
|
||||||
|
|
||||||
|
import com.google.common.collect.ImmutableSet;
|
||||||
|
import com.google.common.collect.Sets;
|
||||||
|
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import static com.google.common.base.Preconditions.checkNotNull;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Extends the SoftLayer_Software_Component data type to include operating system specific properties.
|
||||||
|
*
|
||||||
|
* @author Jason King
|
||||||
|
* @see <a href=
|
||||||
|
* "http://sldn.softlayer.com/reference/datatypes/SoftLayer_Software_Component_OperatingSystem"
|
||||||
|
* />
|
||||||
|
*/
|
||||||
|
public class OperatingSystem implements Comparable<OperatingSystem> {
|
||||||
|
|
||||||
|
// There are other properties
|
||||||
|
|
||||||
|
public static Builder builder() {
|
||||||
|
return new Builder();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class Builder {
|
||||||
|
private int id = -1;
|
||||||
|
private Set<Password> passwords = Sets.newLinkedHashSet();
|
||||||
|
|
||||||
|
public Builder id(int id) {
|
||||||
|
this.id = id;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder password(Password password) {
|
||||||
|
this.passwords.add(checkNotNull(password, "password"));
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder passwords(Iterable<Password> passwords) {
|
||||||
|
this.passwords = ImmutableSet.<Password> copyOf(checkNotNull(passwords, "passwords"));
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public OperatingSystem build() {
|
||||||
|
return new OperatingSystem(id, passwords);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Builder fromOperatingSystem(OperatingSystem in) {
|
||||||
|
return OperatingSystem.builder()
|
||||||
|
.id(in.getId())
|
||||||
|
.passwords(in.getPasswords());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private int id = -1;
|
||||||
|
private Set<Password> passwords = Sets.newLinkedHashSet();
|
||||||
|
|
||||||
|
// for deserializer
|
||||||
|
OperatingSystem() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public OperatingSystem(int id,Iterable<Password> passwords) {
|
||||||
|
this.id = id;
|
||||||
|
this.passwords = ImmutableSet.<Password> copyOf(checkNotNull(passwords, "passwords"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int compareTo(OperatingSystem arg0) {
|
||||||
|
return new Integer(id).compareTo(arg0.getId());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return An ID number identifying this Software Component (Software Installation)
|
||||||
|
*/
|
||||||
|
public int getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @return Username/Password pairs used for access to this Software Installation.
|
||||||
|
*/
|
||||||
|
public Set<Password> getPasswords() {
|
||||||
|
return passwords;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder toBuilder() {
|
||||||
|
return Builder.fromOperatingSystem(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
final int prime = 31;
|
||||||
|
int result = 1;
|
||||||
|
result = prime * result + (id ^ (id >>> 32));
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object obj) {
|
||||||
|
if (this == obj)
|
||||||
|
return true;
|
||||||
|
if (obj == null)
|
||||||
|
return false;
|
||||||
|
if (getClass() != obj.getClass())
|
||||||
|
return false;
|
||||||
|
OperatingSystem other = (OperatingSystem) obj;
|
||||||
|
if (id != other.id)
|
||||||
|
return false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return "OperatingSystem [id=" + id + ", passwords=" + passwords + "]";
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,141 @@
|
||||||
|
/**
|
||||||
|
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. jclouds licenses this file
|
||||||
|
* to you under the Apache License, Version 2.0 (the
|
||||||
|
* "License"); you may not use this file except in compliance
|
||||||
|
* with the License. You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing,
|
||||||
|
* software distributed under the License is distributed on an
|
||||||
|
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
* KIND, either express or implied. See the License for the
|
||||||
|
* specific language governing permissions and limitations
|
||||||
|
* under the License.
|
||||||
|
*/
|
||||||
|
package org.jclouds.softlayer.domain;
|
||||||
|
|
||||||
|
import static com.google.common.base.Preconditions.checkNotNull;
|
||||||
|
import static com.google.common.base.Strings.emptyToNull;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Contains a password for a specific software component instance
|
||||||
|
*
|
||||||
|
* @author Jason King
|
||||||
|
* @see <a href= "http://sldn.softlayer.com/reference/datatypes/SoftLayer_Software_Component_Password"
|
||||||
|
* />
|
||||||
|
*/
|
||||||
|
public class Password implements Comparable<Password> {
|
||||||
|
public static Builder builder() {
|
||||||
|
return new Builder();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class Builder {
|
||||||
|
private int id = -1;
|
||||||
|
private String username;
|
||||||
|
private String password;
|
||||||
|
|
||||||
|
public Builder id(int id) {
|
||||||
|
this.id = id;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder username(String username) {
|
||||||
|
this.username = username;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder password(String password) {
|
||||||
|
this.password = password;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Password build() {
|
||||||
|
return new Password(id, username, password);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Builder fromPassword(Password in) {
|
||||||
|
return Password.builder().id(in.getId())
|
||||||
|
.username(in.getUsername())
|
||||||
|
.password(in.getPassword());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private int id = -1;
|
||||||
|
private String username;
|
||||||
|
private String password;
|
||||||
|
|
||||||
|
// for deserializer
|
||||||
|
Password() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public Password(int id, String username, String password) {
|
||||||
|
this.id = id;
|
||||||
|
this.username = checkNotNull(emptyToNull(username),"username cannot be null or empty:"+username);
|
||||||
|
this.password = password;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int compareTo(Password arg0) {
|
||||||
|
return new Integer(id).compareTo(arg0.getId());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return An id number for this specific username/password pair.
|
||||||
|
*/
|
||||||
|
public int getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return The username part of the username/password pair.
|
||||||
|
*/
|
||||||
|
public String getUsername() {
|
||||||
|
return username;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return The password part of the username/password pair.
|
||||||
|
*/
|
||||||
|
public String getPassword() {
|
||||||
|
return password;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder toBuilder() {
|
||||||
|
return Builder.fromPassword(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
final int prime = 31;
|
||||||
|
int result = 1;
|
||||||
|
result = prime * result + (id ^ (id >>> 32));
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object obj) {
|
||||||
|
if (this == obj)
|
||||||
|
return true;
|
||||||
|
if (obj == null)
|
||||||
|
return false;
|
||||||
|
if (getClass() != obj.getClass())
|
||||||
|
return false;
|
||||||
|
Password other = (Password) obj;
|
||||||
|
if (id != other.id)
|
||||||
|
return false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return "Password [id=" + id + ", username=" + username + ", password=**********]";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -31,6 +31,17 @@ import com.google.gson.annotations.SerializedName;
|
||||||
* interaction. <br/>
|
* interaction. <br/>
|
||||||
* A guest, also known as a virtual server or CloudLayer Computing Instance, represents an
|
* A guest, also known as a virtual server or CloudLayer Computing Instance, represents an
|
||||||
* allocation of resources on a virtual host.
|
* allocation of resources on a virtual host.
|
||||||
|
*
|
||||||
|
* The hostname and domain must be alphanumeric strings that may be separated by periods '.'.
|
||||||
|
* The only other allowable special character is the dash '-'.
|
||||||
|
* However the special characters '.' and '-' may not be consecutive.
|
||||||
|
* Each alphanumeric string separated by a period is considered a label.
|
||||||
|
* Labels must begin and end with an alphanumeric character.
|
||||||
|
* Each label cannot be soley comprised of digits and must be between 1-63 characters in length.
|
||||||
|
* The last label, the TLD (top level domain) must be between 2-6 alphabetic characters.
|
||||||
|
* The domain portion must consist of least one label followed by a period '.' then ending with the TLD label.
|
||||||
|
* Combining the hostname, followed by a period '.', followed by the domain gives the FQDN (fully qualified domain name),
|
||||||
|
* which may not exceed 253 characters in total length.
|
||||||
*
|
*
|
||||||
* @author Adrian Cole
|
* @author Adrian Cole
|
||||||
* @see <a href=
|
* @see <a href=
|
||||||
|
@ -64,6 +75,7 @@ public class VirtualGuest implements Comparable<VirtualGuest> {
|
||||||
private String primaryBackendIpAddress;
|
private String primaryBackendIpAddress;
|
||||||
private String primaryIpAddress;
|
private String primaryIpAddress;
|
||||||
private BillingItemVirtualGuest billingItem;
|
private BillingItemVirtualGuest billingItem;
|
||||||
|
private OperatingSystem operatingSystem;
|
||||||
|
|
||||||
public Builder id(int id) {
|
public Builder id(int id) {
|
||||||
this.id = id;
|
this.id = id;
|
||||||
|
@ -170,12 +182,17 @@ public class VirtualGuest implements Comparable<VirtualGuest> {
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Builder operatingSystem(OperatingSystem operatingSystem) {
|
||||||
|
this.operatingSystem = operatingSystem;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
public VirtualGuest build() {
|
public VirtualGuest build() {
|
||||||
return new VirtualGuest(accountId, createDate, dedicatedAccountHostOnly, domain,
|
return new VirtualGuest(accountId, createDate, dedicatedAccountHostOnly, domain,
|
||||||
fullyQualifiedDomainName, hostname, id, lastVerifiedDate, maxCpu,
|
fullyQualifiedDomainName, hostname, id, lastVerifiedDate, maxCpu,
|
||||||
maxCpuUnits, maxMemory, metricPollDate, modifyDate, notes,
|
maxCpuUnits, maxMemory, metricPollDate, modifyDate, notes,
|
||||||
privateNetworkOnly, startCpus, statusId, uuid, primaryBackendIpAddress,
|
privateNetworkOnly, startCpus, statusId, uuid, primaryBackendIpAddress,
|
||||||
primaryIpAddress,billingItem);
|
primaryIpAddress,billingItem,operatingSystem);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Builder fromVirtualGuest(VirtualGuest in) {
|
public static Builder fromVirtualGuest(VirtualGuest in) {
|
||||||
|
@ -200,7 +217,9 @@ public class VirtualGuest implements Comparable<VirtualGuest> {
|
||||||
.uuid(in.getUuid())
|
.uuid(in.getUuid())
|
||||||
.primaryBackendIpAddress(in.getPrimaryBackendIpAddress())
|
.primaryBackendIpAddress(in.getPrimaryBackendIpAddress())
|
||||||
.primaryIpAddress(in.getPrimaryIpAddress())
|
.primaryIpAddress(in.getPrimaryIpAddress())
|
||||||
.billingItem(in.getBillingItem());
|
.billingItem(in.getBillingItem())
|
||||||
|
.operatingSystem(in.getOperatingSystem());
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -252,6 +271,7 @@ public class VirtualGuest implements Comparable<VirtualGuest> {
|
||||||
private String primaryIpAddress;
|
private String primaryIpAddress;
|
||||||
|
|
||||||
private BillingItemVirtualGuest billingItem;
|
private BillingItemVirtualGuest billingItem;
|
||||||
|
private OperatingSystem operatingSystem;
|
||||||
|
|
||||||
// for deserializer
|
// for deserializer
|
||||||
VirtualGuest() {
|
VirtualGuest() {
|
||||||
|
@ -262,7 +282,7 @@ public class VirtualGuest implements Comparable<VirtualGuest> {
|
||||||
String fullyQualifiedDomainName, String hostname, int id, Date lastVerifiedDate, int maxCpu,
|
String fullyQualifiedDomainName, String hostname, int id, Date lastVerifiedDate, int maxCpu,
|
||||||
String maxCpuUnits, int maxMemory, Date metricPollDate, Date modifyDate, String notes,
|
String maxCpuUnits, int maxMemory, Date metricPollDate, Date modifyDate, String notes,
|
||||||
boolean privateNetworkOnly, int startCpus, int statusId, String uuid, String primaryBackendIpAddress,
|
boolean privateNetworkOnly, int startCpus, int statusId, String uuid, String primaryBackendIpAddress,
|
||||||
String primaryIpAddress,BillingItemVirtualGuest billingItem) {
|
String primaryIpAddress,BillingItemVirtualGuest billingItem, OperatingSystem operatingSystem) {
|
||||||
this.accountId = accountId;
|
this.accountId = accountId;
|
||||||
this.createDate = createDate;
|
this.createDate = createDate;
|
||||||
this.dedicatedAccountHostOnly = dedicatedAccountHostOnly;
|
this.dedicatedAccountHostOnly = dedicatedAccountHostOnly;
|
||||||
|
@ -284,6 +304,7 @@ public class VirtualGuest implements Comparable<VirtualGuest> {
|
||||||
this.primaryBackendIpAddress = primaryBackendIpAddress;
|
this.primaryBackendIpAddress = primaryBackendIpAddress;
|
||||||
this.primaryIpAddress = primaryIpAddress;
|
this.primaryIpAddress = primaryIpAddress;
|
||||||
this.billingItem = billingItem;
|
this.billingItem = billingItem;
|
||||||
|
this.operatingSystem = operatingSystem;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -441,6 +462,13 @@ public class VirtualGuest implements Comparable<VirtualGuest> {
|
||||||
return billingItem;
|
return billingItem;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return A guest's operating system.
|
||||||
|
*/
|
||||||
|
public OperatingSystem getOperatingSystem() {
|
||||||
|
return operatingSystem;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int hashCode() {
|
public int hashCode() {
|
||||||
final int prime = 31;
|
final int prime = 31;
|
||||||
|
@ -466,6 +494,7 @@ public class VirtualGuest implements Comparable<VirtualGuest> {
|
||||||
result = prime * result + statusId;
|
result = prime * result + statusId;
|
||||||
result = prime * result + ((uuid == null) ? 0 : uuid.hashCode());
|
result = prime * result + ((uuid == null) ? 0 : uuid.hashCode());
|
||||||
result = prime * result + ((billingItem == null) ? 0 : billingItem.hashCode());
|
result = prime * result + ((billingItem == null) ? 0 : billingItem.hashCode());
|
||||||
|
result = prime * result + ((operatingSystem == null) ? 0 : operatingSystem.hashCode());
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -559,6 +588,11 @@ public class VirtualGuest implements Comparable<VirtualGuest> {
|
||||||
return false;
|
return false;
|
||||||
} else if (!billingItem.equals(other.billingItem))
|
} else if (!billingItem.equals(other.billingItem))
|
||||||
return false;
|
return false;
|
||||||
|
if (operatingSystem == null) {
|
||||||
|
if (other.operatingSystem != null)
|
||||||
|
return false;
|
||||||
|
} else if (!operatingSystem.equals(other.operatingSystem))
|
||||||
|
return false;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -571,7 +605,7 @@ public class VirtualGuest implements Comparable<VirtualGuest> {
|
||||||
+ ", metricPollDate=" + metricPollDate + ", modifyDate=" + modifyDate + ", notes=" + notes
|
+ ", metricPollDate=" + metricPollDate + ", modifyDate=" + modifyDate + ", notes=" + notes
|
||||||
+ ", primaryBackendIpAddress=" + primaryBackendIpAddress + ", primaryIpAddress=" + primaryIpAddress
|
+ ", primaryBackendIpAddress=" + primaryBackendIpAddress + ", primaryIpAddress=" + primaryIpAddress
|
||||||
+ ", privateNetworkOnly=" + privateNetworkOnly + ", startCpus=" + startCpus + ", statusId=" + statusId
|
+ ", privateNetworkOnly=" + privateNetworkOnly + ", startCpus=" + startCpus + ", statusId=" + statusId
|
||||||
+ ", uuid=" + uuid + ", billingItem="+billingItem+"]";
|
+ ", uuid=" + uuid + ", billingItem="+billingItem+", operatingSystem="+operatingSystem+"]";
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -47,6 +47,7 @@ import java.util.Set;
|
||||||
@RequestFilters(BasicAuthentication.class)
|
@RequestFilters(BasicAuthentication.class)
|
||||||
@Path("/v{jclouds.api-version}")
|
@Path("/v{jclouds.api-version}")
|
||||||
public interface VirtualGuestAsyncClient {
|
public interface VirtualGuestAsyncClient {
|
||||||
|
public static String LIST_GUEST_MASK = "virtualGuests.powerState;virtualGuests.networkVlans;virtualGuests.operatingSystem.passwords;virtualGuests.datacenter;virtualGuests.billingItem";
|
||||||
public static String GUEST_MASK = "powerState;networkVlans;operatingSystem.passwords;datacenter;virtualGuests.billingItem";
|
public static String GUEST_MASK = "powerState;networkVlans;operatingSystem.passwords;datacenter;virtualGuests.billingItem";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -54,7 +55,7 @@ public interface VirtualGuestAsyncClient {
|
||||||
*/
|
*/
|
||||||
@GET
|
@GET
|
||||||
@Path("/SoftLayer_Account/VirtualGuests.json")
|
@Path("/SoftLayer_Account/VirtualGuests.json")
|
||||||
@QueryParams(keys = "objectMask", values = GUEST_MASK)
|
@QueryParams(keys = "objectMask", values = LIST_GUEST_MASK)
|
||||||
@Consumes(MediaType.APPLICATION_JSON)
|
@Consumes(MediaType.APPLICATION_JSON)
|
||||||
@ExceptionParser(ReturnEmptySetOnNotFoundOr404.class)
|
@ExceptionParser(ReturnEmptySetOnNotFoundOr404.class)
|
||||||
ListenableFuture<Set<VirtualGuest>> listVirtualGuests();
|
ListenableFuture<Set<VirtualGuest>> listVirtualGuests();
|
||||||
|
|
|
@ -64,9 +64,12 @@ public class SoftLayerComputeServiceAdapterLiveTest extends BaseSoftLayerClientL
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testCreateNodeWithGroupEncodedIntoNameThenStoreCredentials() {
|
public void testCreateNodeWithGroupEncodedIntoNameThenStoreCredentials() {
|
||||||
String group = "foo";
|
String group = "jclouds.org";
|
||||||
String name = "foo-ef4";
|
String name = "foo-ef4";
|
||||||
Template template = computeContext.getComputeService().templateBuilder().build();
|
Template template = computeContext.getComputeService().templateBuilder()
|
||||||
|
.locationId("3") // the default (singapore) doesn't work.
|
||||||
|
.build();
|
||||||
|
|
||||||
Map<String, Credentials> credentialStore = Maps.newLinkedHashMap();
|
Map<String, Credentials> credentialStore = Maps.newLinkedHashMap();
|
||||||
guest = adapter.createNodeWithGroupEncodedIntoNameThenStoreCredentials(group, name, template, credentialStore);
|
guest = adapter.createNodeWithGroupEncodedIntoNameThenStoreCredentials(group, name, template, credentialStore);
|
||||||
assertEquals(guest.getHostname(), name);
|
assertEquals(guest.getHostname(), name);
|
||||||
|
|
|
@ -47,7 +47,7 @@ public class VirtualGuestAsyncClientTest extends BaseSoftLayerAsyncClientTest<Vi
|
||||||
|
|
||||||
assertRequestLineEquals(
|
assertRequestLineEquals(
|
||||||
httpRequest,
|
httpRequest,
|
||||||
"GET https://api.softlayer.com/rest/v3/SoftLayer_Account/VirtualGuests.json?objectMask=powerState%3BnetworkVlans%3BoperatingSystem.passwords%3Bdatacenter%3BvirtualGuests.billingItem HTTP/1.1");
|
"GET https://api.softlayer.com/rest/v3/SoftLayer_Account/VirtualGuests.json?objectMask=virtualGuests.powerState%3BvirtualGuests.networkVlans%3BvirtualGuests.operatingSystem.passwords%3BvirtualGuests.datacenter%3BvirtualGuests.billingItem HTTP/1.1");
|
||||||
assertNonPayloadHeadersEqual(httpRequest, "Accept: application/json\n");
|
assertNonPayloadHeadersEqual(httpRequest, "Accept: application/json\n");
|
||||||
assertPayloadEquals(httpRequest, null, null, false);
|
assertPayloadEquals(httpRequest, null, null, false);
|
||||||
|
|
||||||
|
@ -57,7 +57,7 @@ public class VirtualGuestAsyncClientTest extends BaseSoftLayerAsyncClientTest<Vi
|
||||||
|
|
||||||
assertRequestLineEquals(
|
assertRequestLineEquals(
|
||||||
httpRequest,
|
httpRequest,
|
||||||
"GET https://api.softlayer.com/rest/v3/SoftLayer_Account/VirtualGuests.json?objectMask=powerState%3BnetworkVlans%3BoperatingSystem.passwords%3Bdatacenter%3BvirtualGuests.billingItem HTTP/1.1");
|
"GET https://api.softlayer.com/rest/v3/SoftLayer_Account/VirtualGuests.json?objectMask=virtualGuests.powerState%3BvirtualGuests.networkVlans%3BvirtualGuests.operatingSystem.passwords%3BvirtualGuests.datacenter%3BvirtualGuests.billingItem HTTP/1.1");
|
||||||
// for example, using basic authentication, we should get "only one"
|
// for example, using basic authentication, we should get "only one"
|
||||||
// header
|
// header
|
||||||
assertNonPayloadHeadersEqual(httpRequest,
|
assertNonPayloadHeadersEqual(httpRequest,
|
||||||
|
|
Loading…
Reference in New Issue