diff --git a/compute/src/test/java/org/jclouds/compute/BaseComputeServiceLiveTest.java b/compute/src/test/java/org/jclouds/compute/BaseComputeServiceLiveTest.java index 5d6ef48aaa..df8f61eedf 100644 --- a/compute/src/test/java/org/jclouds/compute/BaseComputeServiceLiveTest.java +++ b/compute/src/test/java/org/jclouds/compute/BaseComputeServiceLiveTest.java @@ -67,7 +67,7 @@ import com.google.inject.Injector; import com.google.inject.Module; /** - * + * * @author Adrian Cole */ @Test(groups = "live", enabled = true, sequential = true, testName = "compute.ComputeServiceLiveTest") @@ -92,7 +92,7 @@ public abstract class BaseComputeServiceLiveTest { public void setupClient() throws InterruptedException, ExecutionException, TimeoutException, IOException { if (tag == null) - tag = checkNotNull(service, "service"); + tag = checkNotNull(service, "service") + "alex"; user = checkNotNull(System.getProperty("jclouds.test.user"), "jclouds.test.user"); password = checkNotNull(System.getProperty("jclouds.test.key"), "jclouds.test.key"); String secretKeyFile; @@ -134,17 +134,7 @@ public abstract class BaseComputeServiceLiveTest { .getOptions() .installPrivateKey(keyPair.get("private")) .authorizePublicKey(keyPair.get("public")) - .runScript( - new StringBuilder()// - .append("echo nameserver 208.67.222.222 >> /etc/resolv.conf\n")// - .append("cp /etc/apt/sources.list /etc/apt/sources.list.old\n")// - .append( - "sed 's~us.archive.ubuntu.com~mirror.anl.gov/pub~g' /etc/apt/sources.list.old >/etc/apt/sources.list\n")// - .append("apt-get update\n")// - .append("apt-get install -f -y --force-yes openjdk-6-jdk\n")// - .append("wget -qO/usr/bin/runurl run.alestic.com/runurl\n")// - .append("chmod 755 /usr/bin/runurl\n")// - .toString().getBytes()); + .runScript(buildScript().getBytes()); nodes = Sets.newTreeSet(client.runNodesWithTag(tag, 2, template).values()); assertEquals(nodes.size(), 2); checkNodes(); @@ -179,6 +169,20 @@ public abstract class BaseComputeServiceLiveTest { protected abstract Template buildTemplate(TemplateBuilder templateBuilder); + protected String buildScript() { + return + new StringBuilder()// + .append("echo nameserver 208.67.222.222 >> /etc/resolv.conf\n")// + .append("cp /etc/apt/sources.list /etc/apt/sources.list.old\n")// + .append( + "sed 's~us.archive.ubuntu.com~mirror.anl.gov/pub~g' /etc/apt/sources.list.old >/etc/apt/sources.list\n")// + .append("apt-get update\n")// + .append("apt-get install -f -y --force-yes openjdk-6-jdk\n")// + .append("wget -qO/usr/bin/runurl run.alestic.com/runurl\n")// + .append("chmod 755 /usr/bin/runurl\n")// + .toString(); + } + @Test(enabled = true, dependsOnMethods = "testCreate") public void testGet() throws Exception { Set metadataSet = Sets.newHashSet(client.getNodesWithTag(tag) @@ -261,7 +265,7 @@ public abstract class BaseComputeServiceLiveTest { } } - private void doCheckKey(NodeMetadata node) throws IOException { + protected void doCheckKey(NodeMetadata node) throws IOException { InetSocketAddress socket = new InetSocketAddress(Iterables.get(node.getPublicAddresses(), 0), 22); socketTester.apply(socket); // TODO add transitionTo option that accepts a socket conection diff --git a/gogrid/src/main/java/org/jclouds/gogrid/config/GoGridComputeServiceContextModule.java b/gogrid/src/main/java/org/jclouds/gogrid/config/GoGridComputeServiceContextModule.java index 65f06f0fa8..8ead906c71 100644 --- a/gogrid/src/main/java/org/jclouds/gogrid/config/GoGridComputeServiceContextModule.java +++ b/gogrid/src/main/java/org/jclouds/gogrid/config/GoGridComputeServiceContextModule.java @@ -18,9 +18,7 @@ */ package org.jclouds.gogrid.config; -import com.google.common.base.Function; -import com.google.common.base.Predicate; -import com.google.common.base.Predicates; +import com.google.common.base.*; import com.google.common.collect.*; import com.google.inject.Provides; import com.google.inject.TypeLiteral; @@ -40,10 +38,8 @@ import org.jclouds.domain.LocationScope; import org.jclouds.domain.internal.LocationImpl; import org.jclouds.gogrid.GoGridAsyncClient; import org.jclouds.gogrid.GoGridClient; -import org.jclouds.gogrid.domain.Ip; -import org.jclouds.gogrid.domain.PowerCommand; -import org.jclouds.gogrid.domain.Server; -import org.jclouds.gogrid.domain.ServerImage; +import org.jclouds.gogrid.domain.*; +import org.jclouds.gogrid.options.GetIpListOptions; import org.jclouds.gogrid.predicates.ServerLatestJobCompleted; import org.jclouds.gogrid.util.GoGridUtils; import org.jclouds.logging.Logger; @@ -57,6 +53,7 @@ import javax.inject.Named; import javax.inject.Singleton; import java.net.InetAddress; import java.net.UnknownHostException; +import java.security.SecureRandom; import java.util.Map; import java.util.Set; import java.util.concurrent.ExecutionException; @@ -97,6 +94,7 @@ public class GoGridComputeServiceContextModule extends GoGridContextModule { private final Function sizeToRam; private final Function serverToNodeMetadata; private RetryablePredicate serverLatestJobCompleted; + private RetryablePredicate serverLatestJobCompletedShort; @Inject protected GoGridAddNodeWithTagStrategy(GoGridClient client, @@ -108,18 +106,36 @@ public class GoGridComputeServiceContextModule extends GoGridContextModule { this.serverLatestJobCompleted = new RetryablePredicate( new ServerLatestJobCompleted(client.getJobServices()), 800, 20, TimeUnit.SECONDS); + this.serverLatestJobCompletedShort = new RetryablePredicate( + new ServerLatestJobCompleted(client.getJobServices()), + 60, 20, TimeUnit.SECONDS); } @Override public NodeMetadata execute(String tag, String name, Template template) { - Set availableIps = client.getIpServices().getUnassignedIpList(); - Ip availableIp = Iterables.getLast(availableIps); - Server addedServer = client.getServerServices().addServer(name, checkNotNull(template.getImage().getId()), - sizeToRam.apply(template.getSize()), availableIp.getIp()); + Server addedServer = null; + boolean notStarted = true; + int numOfRetries = 20; + // lock-free consumption of a shared resource: IP address pool + while(notStarted) { // TODO: replace with Predicate-based thread collision avoidance for simplicity + Set availableIps = + client.getIpServices().getIpList(new GetIpListOptions().onlyUnassigned().onlyWithType(IpType.PUBLIC)); + if(availableIps.size() == 0) throw new RuntimeException("No public IPs available on this account."); + int ipIndex = new SecureRandom().nextInt(availableIps.size()); + Ip availableIp = Iterables.get(availableIps, ipIndex); + try { + addedServer = client.getServerServices().addServer(name, checkNotNull(template.getImage().getId()), + sizeToRam.apply(template.getSize()), availableIp.getIp()); + notStarted = false; + } catch(Exception e) { + if(--numOfRetries == 0) Throwables.propagate(e); + notStarted = true; + } + } serverLatestJobCompleted.apply(addedServer); client.getServerServices().power(addedServer.getName(), PowerCommand.START); - serverLatestJobCompleted.apply(addedServer); + serverLatestJobCompletedShort.apply(addedServer); addedServer = Iterables.getOnlyElement( client.getServerServices().getServersByName(addedServer.getName()) @@ -132,6 +148,7 @@ public class GoGridComputeServiceContextModule extends GoGridContextModule { public static class GoGridRebootNodeStrategy implements RebootNodeStrategy { private final GoGridClient client; private RetryablePredicate serverLatestJobCompleted; + private RetryablePredicate serverLatestJobCompletedShort; @Inject protected GoGridRebootNodeStrategy(GoGridClient client) { @@ -139,6 +156,9 @@ public class GoGridComputeServiceContextModule extends GoGridContextModule { this.serverLatestJobCompleted = new RetryablePredicate( new ServerLatestJobCompleted(client.getJobServices()), 800, 20, TimeUnit.SECONDS); + this.serverLatestJobCompletedShort = new RetryablePredicate( + new ServerLatestJobCompleted(client.getJobServices()), + 60, 20, TimeUnit.SECONDS); } @Override @@ -148,7 +168,7 @@ public class GoGridComputeServiceContextModule extends GoGridContextModule { client.getServerServices().power(server.getName(), PowerCommand.RESTART); serverLatestJobCompleted.apply(server); client.getServerServices().power(server.getName(), PowerCommand.START); - return serverLatestJobCompleted.apply(server); + return serverLatestJobCompletedShort.apply(server); } } @@ -290,7 +310,7 @@ public class GoGridComputeServiceContextModule extends GoGridContextModule { @Override public NodeMetadata apply(Server from) { String locationId = "Unavailable"; - String tag = from.getName(); + String tag = CharMatcher.JAVA_LETTER.retainFrom(from.getName()); Credentials creds = client.getServerServices().getServerCredentialsList().get(from.getName()); Set ipSet = ImmutableSet.of(stringIpToInetAddress.apply(from.getIp().getIp())); @@ -407,9 +427,9 @@ public class GoGridComputeServiceContextModule extends GoGridContextModule { Set allImages = sync.getImageServices().getImageList(); for (ServerImage from : allImages) { OsFamily os = null; - Architecture arch = (from.getDescription().indexOf("64") == -1 && - from.getOs().getName().indexOf("64") == -1) ? Architecture.X86_32 - : Architecture.X86_64; + Architecture arch = (from.getOs().getName().indexOf("64") == -1 && + from.getDescription().indexOf("64") == -1) ? + Architecture.X86_32 : Architecture.X86_64; String osDescription; String version = ""; diff --git a/gogrid/src/main/java/org/jclouds/gogrid/functions/ParseServerNameToCredentialsMapFromJsonResponse.java b/gogrid/src/main/java/org/jclouds/gogrid/functions/ParseServerNameToCredentialsMapFromJsonResponse.java index 0d73f45554..6fef66a6bd 100644 --- a/gogrid/src/main/java/org/jclouds/gogrid/functions/ParseServerNameToCredentialsMapFromJsonResponse.java +++ b/gogrid/src/main/java/org/jclouds/gogrid/functions/ParseServerNameToCredentialsMapFromJsonResponse.java @@ -110,7 +110,7 @@ public class ParseServerNameToCredentialsMapFromJsonResponse extends ParseJson> /etc/resolv.conf\n")// + .append("echo \"[jdkrepo]\" >> /etc/yum.repos.d/CentOS-Base.repo\n") + .append("echo \"name=jdkrepository\" >> /etc/yum.repos.d/CentOS-Base.repo\n") + .append("echo \"baseurl=http://ec2-us-east-mirror.rightscale.com/epel/5/i386/\" >> /etc/yum.repos.d/CentOS-Base.repo\n") + .append("echo \"enabled=1\" >> /etc/yum.repos.d/CentOS-Base.repo\n") + .append("yum -y install java-1.6.0-openjdk\n") + .append("echo \"export PATH=\\\"/usr/lib/jvm/jre-1.6.0-openjdk/bin/:\\$PATH\\\"\" >> /root/.bashrc\n") + .toString(); + } - @Override - protected JschSshClientModule getSshModule() { - return new JschSshClientModule(); - } + protected Template buildTemplate(TemplateBuilder templateBuilder) { + return templateBuilder.osFamily(CENTOS).imageId("GSI-f8979644-e646-4711-ad58-d98a5fa3612c").smallest().build(); + } - public void testAssignability() throws Exception { - @SuppressWarnings("unused") - RestContext goGridContext = new ComputeServiceContextFactory() - .createContext(service, user, password).getProviderSpecificContext(); - } + @Override + protected JschSshClientModule getSshModule() { + return new JschSshClientModule(); + } - @Test(enabled = false) - public void endToEndComputeServiceTest() { - ComputeService service = context.getComputeService(); - Template t = service.templateBuilder().minRam(1024).imageId( - "GSI-6890f8b6-c8fb-4ac1-bc33-2563eb4e29d2").build(); + public void testAssignability() throws Exception { + @SuppressWarnings("unused") + RestContext goGridContext = new ComputeServiceContextFactory() + .createContext(service, user, password).getProviderSpecificContext(); + } - assertEquals(t.getImage().getId(), "GSI-6890f8b6-c8fb-4ac1-bc33-2563eb4e29d2"); - service.runNodesWithTag("testTag", 1, t); + @Test(enabled = false) + public void endToEndComputeServiceTest() { + ComputeService service = context.getComputeService(); + Template t = service.templateBuilder().minRam(1024).imageId( + "GSI-6890f8b6-c8fb-4ac1-bc33-2563eb4e29d2").build(); - Map nodes = service.getNodes(); - assertEquals(nodes.size(), 1); + assertEquals(t.getImage().getId(), "GSI-6890f8b6-c8fb-4ac1-bc33-2563eb4e29d2"); + service.runNodesWithTag("testTag", 1, t); - NodeMetadata nodeMetadata = service.getNodeMetadata(Iterables.getOnlyElement(nodes.values())); - assertEquals(nodeMetadata.getPublicAddresses().size(), 1, - "There must be 1 public address for the node"); - assertTrue(nodeMetadata.getName().startsWith("testTag")); - service.rebootNode(nodeMetadata); // blocks until finished + Map nodes = service.getNodes(); + assertEquals(nodes.size(), 1); - assertEquals(service.getNodeMetadata(nodeMetadata).getState(), NodeState.RUNNING); - service.destroyNode(nodeMetadata); - } + NodeMetadata nodeMetadata = service.getNodeMetadata(Iterables.getOnlyElement(nodes.values())); + assertEquals(nodeMetadata.getPublicAddresses().size(), 1, + "There must be 1 public address for the node"); + assertTrue(nodeMetadata.getName().startsWith("testTag")); + service.rebootNode(nodeMetadata); // blocks until finished + + assertEquals(service.getNodeMetadata(nodeMetadata).getState(), NodeState.RUNNING); + service.destroyNode(nodeMetadata); + } } diff --git a/gogrid/src/test/java/org/jclouds/gogrid/functions/ParseServerNameToCredentialsMapFromJsonResponseTest.java b/gogrid/src/test/java/org/jclouds/gogrid/functions/ParseServerNameToCredentialsMapFromJsonResponseTest.java new file mode 100644 index 0000000000..1c206c28fc --- /dev/null +++ b/gogrid/src/test/java/org/jclouds/gogrid/functions/ParseServerNameToCredentialsMapFromJsonResponseTest.java @@ -0,0 +1,80 @@ +/** + * + * Copyright (C) 2010 Cloud Conscious, LLC. + * + * ==================================================================== + * Licensed 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.gogrid.functions; + +import com.google.common.collect.Maps; +import com.google.gson.Gson; +import com.google.inject.Guice; +import com.google.inject.Injector; +import com.google.inject.Provides; +import org.jclouds.Constants; +import org.jclouds.domain.Credentials; +import org.jclouds.gogrid.config.GoGridContextModule; +import org.jclouds.gogrid.domain.IpState; +import org.jclouds.gogrid.domain.ServerImageState; +import org.jclouds.gogrid.domain.ServerImageType; +import org.jclouds.gogrid.functions.internal.CustomDeserializers; +import org.jclouds.http.functions.config.ParserModule; +import org.testng.annotations.Test; +import static org.testng.Assert.*; + +import javax.inject.Singleton; +import java.io.InputStream; +import java.net.UnknownHostException; +import java.util.Map; + +/** + * @author Oleksiy Yarmula + */ +@Test(groups = "unit", testName = "gogrid.ParseServerNameToCredentialsMapFromJsonResponseTest") +public class ParseServerNameToCredentialsMapFromJsonResponseTest { + + @Test + public void testApplyInputStreamDetails() throws UnknownHostException { + InputStream is = getClass().getResourceAsStream("/test_credentials_list.json"); + + ParseServerNameToCredentialsMapFromJsonResponse parser = new ParseServerNameToCredentialsMapFromJsonResponse(i + .getInstance(Gson.class)); + Map response = parser.apply(is); + assertEquals(response.size(), 6); + } + + + Injector i = Guice.createInjector(new ParserModule() { + @Override + protected void configure() { + bind(DateAdapter.class).to(GoGridContextModule.DateSecondsAdapter.class); + super.configure(); + } + + + @Provides + @Singleton + @com.google.inject.name.Named(Constants.PROPERTY_GSON_ADAPTERS) + public Map provideCustomAdapterBindings() { + Map bindings = Maps.newHashMap(); + bindings.put(IpState.class, new CustomDeserializers.IpStateAdapter()); + bindings.put(ServerImageType.class, new CustomDeserializers.ServerImageTypeAdapter()); + bindings.put(ServerImageState.class, new CustomDeserializers.ServerImageStateAdapter()); + bindings.put(ServerImageState.class, new CustomDeserializers.ServerImageStateAdapter()); + return bindings; + } + }); + +} diff --git a/gogrid/src/test/resources/test_credentials_list.json b/gogrid/src/test/resources/test_credentials_list.json new file mode 100644 index 0000000000..12cf0fec3f --- /dev/null +++ b/gogrid/src/test/resources/test_credentials_list.json @@ -0,0 +1,600 @@ +{ + "list": [ + { + "password": "dig44sos", + "object": "password", + "username": "root", + "server": { + "object": "server", + "isSandbox": false, + "type": { + "object": "option", + "description": "Web or Application Server", + "name": "Web Server", + "id": 1 + }, + "os": { + "object": "option", + "description": "CentOS 5.3 (64-bit)", + "name": "CentOS 5.3 (64-bit)", + "id": 17 + }, + "image": { + "type": { + "object": "option", + "description": "Web or Application Server", + "name": "Web Server", + "id": 1 + }, + "owner": { + "object": "customer", + "name": "Gear6", + "id": 26443 + }, + "updatedTime": 1265675466171, + "isActive": true, + "id": 2500, + "createdTime": 1265412834154, + "isPublic": true, + "billingtokens": [ + { + "price": 0, + "name": "CentOS 5.3 64bit", + "id": 47 + }, + { + "price": 60, + "name": "Gear 6 Paid Version", + "id": 76 + } + ], + "object": "serverimage", + "friendlyName": "gear6-memcache-server-2.3.6.2-x86_64", + "os": { + "object": "option", + "description": "CentOS 5.3 (64-bit)", + "name": "CentOS 5.3 (64-bit)", + "id": 17 + }, + "price": 60, + "description": "Gear6 Memcache Server 2.3.6.2 (64 bit)", + "state": { + "object": "option", + "description": "Image is available for adds", + "name": "Available", + "id": 2 + }, + "location": "26443/GSI-7f498260-2b8a-43ef-aa77-5b403f8f739a.img", + "name": "GSI-7f498260-2b8a-43ef-aa77-5b403f8f739a" + }, + "state": { + "object": "option", + "description": "Server is in active state.", + "name": "On", + "id": 1 + }, + "ram": { + "object": "option", + "description": "Server with 512MB RAM", + "name": "512MB", + "id": 1 + }, + "name": "gogrid-19", + "ip": { + "object": "ip", + "public": true, + "subnet": "204.51.240.176/255.255.255.240", + "state": { + "object": "option", + "description": "IP is reserved or in use", + "name": "Assigned", + "id": 2 + }, + "ip": "204.51.240.189", + "id": 1313090 + }, + "id": 77332 + }, + "id": 82647, + "applicationtype": "os" + }, + { + "password": "job96qat", + "object": "password", + "username": "root", + "server": { + "object": "server", + "isSandbox": false, + "type": { + "object": "option", + "description": "Web or Application Server", + "name": "Web Server", + "id": 1 + }, + "os": { + "object": "option", + "description": "CentOS 5.3 (64-bit)", + "name": "CentOS 5.3 (64-bit)", + "id": 17 + }, + "image": { + "type": { + "object": "option", + "description": "Web or Application Server", + "name": "Web Server", + "id": 1 + }, + "owner": { + "object": "customer", + "name": "Gear6", + "id": 26443 + }, + "updatedTime": 1265675466171, + "isActive": true, + "id": 2500, + "createdTime": 1265412834154, + "isPublic": true, + "billingtokens": [ + { + "price": 0, + "name": "CentOS 5.3 64bit", + "id": 47 + }, + { + "price": 60, + "name": "Gear 6 Paid Version", + "id": 76 + } + ], + "object": "serverimage", + "friendlyName": "gear6-memcache-server-2.3.6.2-x86_64", + "os": { + "object": "option", + "description": "CentOS 5.3 (64-bit)", + "name": "CentOS 5.3 (64-bit)", + "id": 17 + }, + "price": 60, + "description": "Gear6 Memcache Server 2.3.6.2 (64 bit)", + "state": { + "object": "option", + "description": "Image is available for adds", + "name": "Available", + "id": 2 + }, + "location": "26443/GSI-7f498260-2b8a-43ef-aa77-5b403f8f739a.img", + "name": "GSI-7f498260-2b8a-43ef-aa77-5b403f8f739a" + }, + "state": { + "object": "option", + "description": "Server is in active state.", + "name": "On", + "id": 1 + }, + "ram": { + "object": "option", + "description": "Server with 512MB RAM", + "name": "512MB", + "id": 1 + }, + "name": "gogrid-5288", + "ip": { + "object": "ip", + "public": true, + "subnet": "204.51.240.176/255.255.255.240", + "state": { + "object": "option", + "description": "IP is reserved or in use", + "name": "Assigned", + "id": 2 + }, + "ip": "204.51.240.186", + "id": 1313087 + }, + "id": 77335 + }, + "id": 82653, + "applicationtype": "os" + }, + { + "password": "fif70cij", + "object": "password", + "username": "root", + "server": { + "object": "server", + "isSandbox": false, + "type": { + "object": "option", + "description": "Web or Application Server", + "name": "Web Server", + "id": 1 + }, + "os": { + "object": "option", + "description": "CentOS 5.3 (64-bit)", + "name": "CentOS 5.3 (64-bit)", + "id": 17 + }, + "image": { + "type": { + "object": "option", + "description": "Web or Application Server", + "name": "Web Server", + "id": 1 + }, + "owner": { + "object": "customer", + "name": "Gear6", + "id": 26443 + }, + "updatedTime": 1265675466171, + "isActive": true, + "id": 2500, + "createdTime": 1265412834154, + "isPublic": true, + "billingtokens": [ + { + "price": 0, + "name": "CentOS 5.3 64bit", + "id": 47 + }, + { + "price": 60, + "name": "Gear 6 Paid Version", + "id": 76 + } + ], + "object": "serverimage", + "friendlyName": "gear6-memcache-server-2.3.6.2-x86_64", + "os": { + "object": "option", + "description": "CentOS 5.3 (64-bit)", + "name": "CentOS 5.3 (64-bit)", + "id": 17 + }, + "price": 60, + "description": "Gear6 Memcache Server 2.3.6.2 (64 bit)", + "state": { + "object": "option", + "description": "Image is available for adds", + "name": "Available", + "id": 2 + }, + "location": "26443/GSI-7f498260-2b8a-43ef-aa77-5b403f8f739a.img", + "name": "GSI-7f498260-2b8a-43ef-aa77-5b403f8f739a" + }, + "state": { + "object": "option", + "description": "Server is in active state.", + "name": "On", + "id": 1 + }, + "ram": { + "object": "option", + "description": "Server with 512MB RAM", + "name": "512MB", + "id": 1 + }, + "name": "gogrid-7210", + "ip": { + "object": "ip", + "public": true, + "subnet": "204.51.240.176/255.255.255.240", + "state": { + "object": "option", + "description": "IP is reserved or in use", + "name": "Assigned", + "id": 2 + }, + "ip": "204.51.240.188", + "id": 1313089 + }, + "id": 77333 + }, + "id": 82651, + "applicationtype": "os" + }, + { + "password": "vam61doz", + "object": "password", + "username": "root", + "server": { + "object": "server", + "isSandbox": false, + "type": { + "object": "option", + "description": "Web or Application Server", + "name": "Web Server", + "id": 1 + }, + "os": { + "object": "option", + "description": "CentOS 5.3 (64-bit)", + "name": "CentOS 5.3 (64-bit)", + "id": 17 + }, + "image": { + "type": { + "object": "option", + "description": "Web or Application Server", + "name": "Web Server", + "id": 1 + }, + "owner": { + "object": "customer", + "name": "Gear6", + "id": 26443 + }, + "updatedTime": 1265675466171, + "isActive": true, + "id": 2500, + "createdTime": 1265412834154, + "isPublic": true, + "billingtokens": [ + { + "price": 0, + "name": "CentOS 5.3 64bit", + "id": 47 + }, + { + "price": 60, + "name": "Gear 6 Paid Version", + "id": 76 + } + ], + "object": "serverimage", + "friendlyName": "gear6-memcache-server-2.3.6.2-x86_64", + "os": { + "object": "option", + "description": "CentOS 5.3 (64-bit)", + "name": "CentOS 5.3 (64-bit)", + "id": 17 + }, + "price": 60, + "description": "Gear6 Memcache Server 2.3.6.2 (64 bit)", + "state": { + "object": "option", + "description": "Image is available for adds", + "name": "Available", + "id": 2 + }, + "location": "26443/GSI-7f498260-2b8a-43ef-aa77-5b403f8f739a.img", + "name": "GSI-7f498260-2b8a-43ef-aa77-5b403f8f739a" + }, + "state": { + "object": "option", + "description": "Server is in active state.", + "name": "On", + "id": 1 + }, + "ram": { + "object": "option", + "description": "Server with 512MB RAM", + "name": "512MB", + "id": 1 + }, + "name": "gogrid-7461", + "ip": { + "object": "ip", + "public": true, + "subnet": "204.51.240.176/255.255.255.240", + "state": { + "object": "option", + "description": "IP is reserved or in use", + "name": "Assigned", + "id": 2 + }, + "ip": "204.51.240.187", + "id": 1313088 + }, + "id": 77334 + }, + "id": 82652, + "applicationtype": "os" + }, + { + "password": "cun86xef", + "object": "password", + "username": "root", + "server": { + "object": "server", + "isSandbox": false, + "type": { + "object": "option", + "description": "Web or Application Server", + "name": "Web Server", + "id": 1 + }, + "os": { + "object": "option", + "description": "CentOS 5.3 (64-bit)", + "name": "CentOS 5.3 (64-bit)", + "id": 17 + }, + "image": { + "type": { + "object": "option", + "description": "Web or Application Server", + "name": "Web Server", + "id": 1 + }, + "owner": { + "object": "customer", + "name": "Gear6", + "id": 26443 + }, + "updatedTime": 1265675466171, + "isActive": true, + "id": 2500, + "createdTime": 1265412834154, + "isPublic": true, + "billingtokens": [ + { + "price": 0, + "name": "CentOS 5.3 64bit", + "id": 47 + }, + { + "price": 60, + "name": "Gear 6 Paid Version", + "id": 76 + } + ], + "object": "serverimage", + "friendlyName": "gear6-memcache-server-2.3.6.2-x86_64", + "os": { + "object": "option", + "description": "CentOS 5.3 (64-bit)", + "name": "CentOS 5.3 (64-bit)", + "id": 17 + }, + "price": 60, + "description": "Gear6 Memcache Server 2.3.6.2 (64 bit)", + "state": { + "object": "option", + "description": "Image is available for adds", + "name": "Available", + "id": 2 + }, + "location": "26443/GSI-7f498260-2b8a-43ef-aa77-5b403f8f739a.img", + "name": "GSI-7f498260-2b8a-43ef-aa77-5b403f8f739a" + }, + "state": { + "object": "option", + "description": "Server is in active state.", + "name": "On", + "id": 1 + }, + "ram": { + "object": "option", + "description": "Server with 512MB RAM", + "name": "512MB", + "id": 1 + }, + "name": "gogridalex-200", + "ip": { + "object": "ip", + "public": true, + "subnet": "204.51.240.176/255.255.255.240", + "state": { + "object": "option", + "description": "IP is reserved or in use", + "name": "Assigned", + "id": 2 + }, + "ip": "204.51.240.179", + "id": 1313080 + }, + "id": 77410 + }, + "id": 82730, + "applicationtype": "os" + }, + { + "password": "nun63wav", + "object": "password", + "username": "root", + "server": { + "object": "server", + "isSandbox": false, + "type": { + "object": "option", + "description": "Web or Application Server", + "name": "Web Server", + "id": 1 + }, + "os": { + "object": "option", + "description": "CentOS 5.3 (64-bit)", + "name": "CentOS 5.3 (64-bit)", + "id": 17 + }, + "image": { + "type": { + "object": "option", + "description": "Web or Application Server", + "name": "Web Server", + "id": 1 + }, + "owner": { + "object": "customer", + "name": "Gear6", + "id": 26443 + }, + "updatedTime": 1265675466171, + "isActive": true, + "id": 2500, + "createdTime": 1265412834154, + "isPublic": true, + "billingtokens": [ + { + "price": 0, + "name": "CentOS 5.3 64bit", + "id": 47 + }, + { + "price": 60, + "name": "Gear 6 Paid Version", + "id": 76 + } + ], + "object": "serverimage", + "friendlyName": "gear6-memcache-server-2.3.6.2-x86_64", + "os": { + "object": "option", + "description": "CentOS 5.3 (64-bit)", + "name": "CentOS 5.3 (64-bit)", + "id": 17 + }, + "price": 60, + "description": "Gear6 Memcache Server 2.3.6.2 (64 bit)", + "state": { + "object": "option", + "description": "Image is available for adds", + "name": "Available", + "id": 2 + }, + "location": "26443/GSI-7f498260-2b8a-43ef-aa77-5b403f8f739a.img", + "name": "GSI-7f498260-2b8a-43ef-aa77-5b403f8f739a" + }, + "state": { + "object": "option", + "description": "Server is in active state.", + "name": "On", + "id": 1 + }, + "ram": { + "object": "option", + "description": "Server with 512MB RAM", + "name": "512MB", + "id": 1 + }, + "name": "gogridalex-201", + "ip": { + "object": "ip", + "public": true, + "subnet": "204.51.240.176/255.255.255.240", + "state": { + "object": "option", + "description": "IP is reserved or in use", + "name": "Assigned", + "id": 2 + }, + "ip": "204.51.240.185", + "id": 1313086 + }, + "id": 77411 + }, + "id": 82731, + "applicationtype": "os" + } + ], + "summary": { + "total": 6, + "start": 0, + "numpages": 0, + "returned": 6 + }, + "status": "success", + "method": "/support/password/list" +} \ No newline at end of file