mirror of https://github.com/apache/jclouds.git
fixed parsing on smartcloud
This commit is contained in:
parent
5b8ee87a4d
commit
1435f9b00b
|
@ -0,0 +1,51 @@
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Copyright (C) 2011 Cloud Conscious, LLC. <info@cloudconscious.com>
|
||||||
|
*
|
||||||
|
* ====================================================================
|
||||||
|
* 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.http.functions;
|
||||||
|
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import javax.inject.Inject;
|
||||||
|
import javax.inject.Singleton;
|
||||||
|
|
||||||
|
import org.jclouds.http.HttpResponse;
|
||||||
|
|
||||||
|
import com.google.common.base.Function;
|
||||||
|
import com.google.common.collect.Iterables;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Adrian Cole
|
||||||
|
*/
|
||||||
|
@Singleton
|
||||||
|
public class UnwrapOnlyJsonValueInSet<T> implements Function<HttpResponse, T> {
|
||||||
|
|
||||||
|
private final UnwrapOnlyJsonValue<Set<T>> json;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
UnwrapOnlyJsonValueInSet(UnwrapOnlyJsonValue<Set<T>> json) {
|
||||||
|
this.json = json;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public T apply(HttpResponse arg0) {
|
||||||
|
Set<T> set = json.apply(arg0);
|
||||||
|
if (set == null || set.size() == 0)
|
||||||
|
return null;
|
||||||
|
return Iterables.getOnlyElement(set);
|
||||||
|
}
|
||||||
|
}
|
|
@ -82,6 +82,7 @@ import org.jclouds.http.functions.ReturnInputStream;
|
||||||
import org.jclouds.http.functions.ReturnStringIf2xx;
|
import org.jclouds.http.functions.ReturnStringIf2xx;
|
||||||
import org.jclouds.http.functions.ReturnTrueIf2xx;
|
import org.jclouds.http.functions.ReturnTrueIf2xx;
|
||||||
import org.jclouds.http.functions.UnwrapOnlyJsonValue;
|
import org.jclouds.http.functions.UnwrapOnlyJsonValue;
|
||||||
|
import org.jclouds.http.functions.UnwrapOnlyJsonValueInSet;
|
||||||
import org.jclouds.http.functions.UnwrapOnlyNestedJsonValue;
|
import org.jclouds.http.functions.UnwrapOnlyNestedJsonValue;
|
||||||
import org.jclouds.http.functions.UnwrapOnlyNestedJsonValueInSet;
|
import org.jclouds.http.functions.UnwrapOnlyNestedJsonValueInSet;
|
||||||
import org.jclouds.http.functions.ParseSax.HandlerWithResult;
|
import org.jclouds.http.functions.ParseSax.HandlerWithResult;
|
||||||
|
@ -787,6 +788,8 @@ public class RestAnnotationProcessor<T> {
|
||||||
parserType = Types.newParameterizedType(UnwrapOnlyJsonValue.class, returnVal);
|
parserType = Types.newParameterizedType(UnwrapOnlyJsonValue.class, returnVal);
|
||||||
else if (depth == 2 && edgeCollection == Map.class)
|
else if (depth == 2 && edgeCollection == Map.class)
|
||||||
parserType = Types.newParameterizedType(UnwrapOnlyNestedJsonValue.class, returnVal);
|
parserType = Types.newParameterizedType(UnwrapOnlyNestedJsonValue.class, returnVal);
|
||||||
|
else if (depth == 2 && edgeCollection == Set.class)
|
||||||
|
parserType = Types.newParameterizedType(UnwrapOnlyJsonValueInSet.class, returnVal);
|
||||||
else if (depth == 3 && edgeCollection == Set.class)
|
else if (depth == 3 && edgeCollection == Set.class)
|
||||||
parserType = Types.newParameterizedType(UnwrapOnlyNestedJsonValueInSet.class, returnVal);
|
parserType = Types.newParameterizedType(UnwrapOnlyNestedJsonValueInSet.class, returnVal);
|
||||||
else
|
else
|
||||||
|
|
|
@ -97,6 +97,7 @@ import org.jclouds.http.functions.ReturnInputStream;
|
||||||
import org.jclouds.http.functions.ReturnStringIf2xx;
|
import org.jclouds.http.functions.ReturnStringIf2xx;
|
||||||
import org.jclouds.http.functions.ReturnTrueIf2xx;
|
import org.jclouds.http.functions.ReturnTrueIf2xx;
|
||||||
import org.jclouds.http.functions.UnwrapOnlyJsonValue;
|
import org.jclouds.http.functions.UnwrapOnlyJsonValue;
|
||||||
|
import org.jclouds.http.functions.UnwrapOnlyJsonValueInSet;
|
||||||
import org.jclouds.http.functions.UnwrapOnlyNestedJsonValue;
|
import org.jclouds.http.functions.UnwrapOnlyNestedJsonValue;
|
||||||
import org.jclouds.http.functions.UnwrapOnlyNestedJsonValueInSet;
|
import org.jclouds.http.functions.UnwrapOnlyNestedJsonValueInSet;
|
||||||
import org.jclouds.http.internal.PayloadEnclosingImpl;
|
import org.jclouds.http.internal.PayloadEnclosingImpl;
|
||||||
|
@ -834,6 +835,12 @@ public class RestAnnotationProcessorTest extends BaseRestClientTest {
|
||||||
@Consumes(MediaType.APPLICATION_JSON)
|
@Consumes(MediaType.APPLICATION_JSON)
|
||||||
ListenableFuture<Long> testUnwrapDepth2Long();
|
ListenableFuture<Long> testUnwrapDepth2Long();
|
||||||
|
|
||||||
|
@GET
|
||||||
|
@Path("/")
|
||||||
|
@Unwrap(depth = 2, edgeCollection = Set.class)
|
||||||
|
@Consumes(MediaType.APPLICATION_JSON)
|
||||||
|
ListenableFuture<String> testUnwrapDepth2Set();
|
||||||
|
|
||||||
@GET
|
@GET
|
||||||
@Path("/")
|
@Path("/")
|
||||||
@Unwrap(depth = 3, edgeCollection = Set.class)
|
@Unwrap(depth = 3, edgeCollection = Set.class)
|
||||||
|
@ -1033,6 +1040,23 @@ public class RestAnnotationProcessorTest extends BaseRestClientTest {
|
||||||
.<String> of());
|
.<String> of());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
public void testUnwrapDepth2Set() throws SecurityException, NoSuchMethodException, IOException {
|
||||||
|
Method method = TestPut.class.getMethod("testUnwrapDepth2Set");
|
||||||
|
HttpRequest request = factory(TestPut.class).createRequest(method);
|
||||||
|
|
||||||
|
assertResponseParserClassEquals(method, request, UnwrapOnlyJsonValueInSet.class);
|
||||||
|
// now test that it works!
|
||||||
|
|
||||||
|
Function<HttpResponse, Map<String, String>> parser = (Function<HttpResponse, Map<String, String>>) RestAnnotationProcessor
|
||||||
|
.createResponseParser(parserFactory, injector, method, request);
|
||||||
|
|
||||||
|
assertEquals(parser.apply(new HttpResponse(200, "ok",
|
||||||
|
newStringPayload("{\"runit\":[\"0.7.0\"]}"))), "0.7.0");
|
||||||
|
|
||||||
|
assertEquals(parser.apply(new HttpResponse(200, "ok", newStringPayload("{\"runit\":[]}"))), null);
|
||||||
|
}
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
public void testUnwrapDepth2Long() throws SecurityException, NoSuchMethodException, IOException {
|
public void testUnwrapDepth2Long() throws SecurityException, NoSuchMethodException, IOException {
|
||||||
Method method = TestPut.class.getMethod("testUnwrapDepth2Long");
|
Method method = TestPut.class.getMethod("testUnwrapDepth2Long");
|
||||||
|
|
|
@ -181,6 +181,7 @@ public interface IBMSmartCloudAsyncClient {
|
||||||
@POST
|
@POST
|
||||||
@Path(IBMSmartCloudAsyncClient.VERSION + "/instances")
|
@Path(IBMSmartCloudAsyncClient.VERSION + "/instances")
|
||||||
@Consumes(MediaType.APPLICATION_JSON)
|
@Consumes(MediaType.APPLICATION_JSON)
|
||||||
|
@Unwrap(depth = 2, edgeCollection = Set.class)
|
||||||
ListenableFuture<Instance> createInstanceInLocation(@FormParam("location") String location,
|
ListenableFuture<Instance> createInstanceInLocation(@FormParam("location") String location,
|
||||||
@FormParam("name") String name, @FormParam("imageID") String imageID,
|
@FormParam("name") String name, @FormParam("imageID") String imageID,
|
||||||
@FormParam("instanceType") String instanceType, CreateInstanceOptions... options);
|
@FormParam("instanceType") String instanceType, CreateInstanceOptions... options);
|
||||||
|
|
|
@ -21,6 +21,7 @@ package org.jclouds.ibm.smartcloud;
|
||||||
import static org.jclouds.Constants.PROPERTY_API_VERSION;
|
import static org.jclouds.Constants.PROPERTY_API_VERSION;
|
||||||
import static org.jclouds.Constants.PROPERTY_ENDPOINT;
|
import static org.jclouds.Constants.PROPERTY_ENDPOINT;
|
||||||
import static org.jclouds.Constants.PROPERTY_ISO3166_CODES;
|
import static org.jclouds.Constants.PROPERTY_ISO3166_CODES;
|
||||||
|
import static org.jclouds.Constants.PROPERTY_SESSION_INTERVAL;
|
||||||
import static org.jclouds.compute.reference.ComputeServiceConstants.PROPERTY_TIMEOUT_NODE_RUNNING;
|
import static org.jclouds.compute.reference.ComputeServiceConstants.PROPERTY_TIMEOUT_NODE_RUNNING;
|
||||||
import static org.jclouds.location.reference.LocationConstants.ISO3166_CODES;
|
import static org.jclouds.location.reference.LocationConstants.ISO3166_CODES;
|
||||||
import static org.jclouds.location.reference.LocationConstants.PROPERTY_ZONE;
|
import static org.jclouds.location.reference.LocationConstants.PROPERTY_ZONE;
|
||||||
|
@ -50,6 +51,7 @@ public class IBMSmartCloudPropertiesBuilder extends PropertiesBuilder {
|
||||||
properties.setProperty(PROPERTY_API_VERSION, IBMSmartCloudAsyncClient.VERSION);
|
properties.setProperty(PROPERTY_API_VERSION, IBMSmartCloudAsyncClient.VERSION);
|
||||||
properties.setProperty(PROPERTY_ENDPOINT, "https://www-147.ibm.com/computecloud/enterprise/api/rest");
|
properties.setProperty(PROPERTY_ENDPOINT, "https://www-147.ibm.com/computecloud/enterprise/api/rest");
|
||||||
properties.setProperty(PROPERTY_TIMEOUT_NODE_RUNNING, (15 * 60 * 1000) + "");
|
properties.setProperty(PROPERTY_TIMEOUT_NODE_RUNNING, (15 * 60 * 1000) + "");
|
||||||
|
properties.setProperty(PROPERTY_SESSION_INTERVAL, 60 * 5 + "");
|
||||||
return properties;
|
return properties;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -82,7 +82,7 @@ public class Address implements Comparable<Address> {
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getIP() {
|
public String getIP() {
|
||||||
return "".equals(ip.trim()) ? null : ip;
|
return "".equals(ip.trim()) ? null : ip.trim();
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getId() {
|
public String getId() {
|
||||||
|
|
|
@ -74,11 +74,11 @@ public class IP {
|
||||||
|
|
||||||
// TODO custom parser to do this once
|
// TODO custom parser to do this once
|
||||||
public String getHostname() {
|
public String getHostname() {
|
||||||
return "".equals(hostname.trim()) ? null : hostname;
|
return "".equals(hostname.trim()) ? null : hostname.trim();
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getIP() {
|
public String getIP() {
|
||||||
return "".equals(ip.trim()) ? null : ip;
|
return "".equals(ip.trim()) ? null : ip.trim();
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getType() {
|
public int getType() {
|
||||||
|
|
|
@ -31,6 +31,7 @@ import org.jclouds.http.functions.ParseJson;
|
||||||
import org.jclouds.http.functions.ParseSax;
|
import org.jclouds.http.functions.ParseSax;
|
||||||
import org.jclouds.http.functions.ReleasePayloadAndReturn;
|
import org.jclouds.http.functions.ReleasePayloadAndReturn;
|
||||||
import org.jclouds.http.functions.UnwrapOnlyJsonValue;
|
import org.jclouds.http.functions.UnwrapOnlyJsonValue;
|
||||||
|
import org.jclouds.http.functions.UnwrapOnlyJsonValueInSet;
|
||||||
import org.jclouds.ibm.smartcloud.domain.Image;
|
import org.jclouds.ibm.smartcloud.domain.Image;
|
||||||
import org.jclouds.ibm.smartcloud.options.CreateInstanceOptions;
|
import org.jclouds.ibm.smartcloud.options.CreateInstanceOptions;
|
||||||
import org.jclouds.ibm.smartcloud.options.RestartInstanceOptions;
|
import org.jclouds.ibm.smartcloud.options.RestartInstanceOptions;
|
||||||
|
@ -470,7 +471,7 @@ public class IBMSmartCloudAsyncClientTest extends RestClientTest<IBMSmartCloudAs
|
||||||
assertPayloadEquals(httpRequest, "location=1&imageID=22&name=name&instanceType=instanceType",
|
assertPayloadEquals(httpRequest, "location=1&imageID=22&name=name&instanceType=instanceType",
|
||||||
"application/x-www-form-urlencoded", false);
|
"application/x-www-form-urlencoded", false);
|
||||||
|
|
||||||
assertResponseParserClassEquals(method, httpRequest, ParseJson.class);
|
assertResponseParserClassEquals(method, httpRequest, UnwrapOnlyJsonValueInSet.class);
|
||||||
assertSaxResponseParserClassEquals(method, null);
|
assertSaxResponseParserClassEquals(method, null);
|
||||||
assertExceptionParserClassEquals(method, null);
|
assertExceptionParserClassEquals(method, null);
|
||||||
|
|
||||||
|
@ -495,7 +496,7 @@ public class IBMSmartCloudAsyncClientTest extends RestClientTest<IBMSmartCloudAs
|
||||||
"location=location&imageID=22&name=name&instanceType=instanceType&ip=1&publicKey=MOO&volumeID=2&oss.storage.id.0.mnt=%2Fmnt&insight_admin_password=myPassword1&db2_admin_password=myPassword2&report_user_password=myPassword3",
|
"location=location&imageID=22&name=name&instanceType=instanceType&ip=1&publicKey=MOO&volumeID=2&oss.storage.id.0.mnt=%2Fmnt&insight_admin_password=myPassword1&db2_admin_password=myPassword2&report_user_password=myPassword3",
|
||||||
"application/x-www-form-urlencoded", false);
|
"application/x-www-form-urlencoded", false);
|
||||||
|
|
||||||
assertResponseParserClassEquals(method, httpRequest, ParseJson.class);
|
assertResponseParserClassEquals(method, httpRequest, UnwrapOnlyJsonValueInSet.class);
|
||||||
assertSaxResponseParserClassEquals(method, null);
|
assertSaxResponseParserClassEquals(method, null);
|
||||||
assertExceptionParserClassEquals(method, null);
|
assertExceptionParserClassEquals(method, null);
|
||||||
|
|
||||||
|
|
|
@ -38,7 +38,7 @@ import com.google.common.collect.Iterables;
|
||||||
*
|
*
|
||||||
* @author Adrian Cole
|
* @author Adrian Cole
|
||||||
*/
|
*/
|
||||||
@Test(groups = "live", testName = "IBMSmartCloudClientLiveTest")
|
@Test(groups = "live", testName = "ReadOnlyIBMSmartCloudClientLiveTest")
|
||||||
public class ReadOnlyIBMSmartCloudClientLiveTest extends BaseIBMSmartCloudClientLiveTest {
|
public class ReadOnlyIBMSmartCloudClientLiveTest extends BaseIBMSmartCloudClientLiveTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|
|
@ -0,0 +1,62 @@
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Copyright (C) 2011 Cloud Conscious, LLC. <info@cloudconscious.com>
|
||||||
|
*
|
||||||
|
* ====================================================================
|
||||||
|
* 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.ibm.smartcloud.parse;
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import org.jclouds.ibm.smartcloud.config.IBMSmartCloudParserModule;
|
||||||
|
import org.jclouds.ibm.smartcloud.domain.Instance;
|
||||||
|
import org.jclouds.ibm.smartcloud.domain.Instance.Software;
|
||||||
|
import org.jclouds.ibm.smartcloud.domain.Instance.Status;
|
||||||
|
import org.jclouds.json.BaseItemParserTest;
|
||||||
|
import org.jclouds.json.config.GsonModule;
|
||||||
|
import org.jclouds.rest.annotations.Unwrap;
|
||||||
|
import org.testng.annotations.Test;
|
||||||
|
|
||||||
|
import com.google.common.collect.ImmutableSet;
|
||||||
|
import com.google.inject.Guice;
|
||||||
|
import com.google.inject.Injector;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Adrian Cole
|
||||||
|
*/
|
||||||
|
@Test(groups = "unit", testName = "GetInstanceTest")
|
||||||
|
public class NewInstanceTest extends BaseItemParserTest<Instance> {
|
||||||
|
|
||||||
|
protected Injector injector() {
|
||||||
|
return Guice.createInjector(new GsonModule(), new IBMSmartCloudParserModule());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String resource() {
|
||||||
|
return "/new_instance.json";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Unwrap(depth = 2, edgeCollection = Set.class)
|
||||||
|
public Instance expected() {
|
||||||
|
return Instance.builder().launchTime(new Date(1305359078796l)).software(
|
||||||
|
ImmutableSet.of(new Software("SUSE Linux Enterprise Server", "OS", "11 SP1"))).requestId("80904")
|
||||||
|
.keyName("adriancole").name("adriancole").instanceType("COP32.1/2048/60").status(Status.NEW).owner(
|
||||||
|
"adrian@cloudconscious.com").location("101").imageId("20015393").requestName("adriancole").id(
|
||||||
|
"80604").expirationTime(new Date(1368431087355l)).build();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,24 @@
|
||||||
|
{
|
||||||
|
"instances": [{
|
||||||
|
"launchTime": 1305359078796,
|
||||||
|
"software": [{
|
||||||
|
"version": "11 SP1",
|
||||||
|
"type": "OS",
|
||||||
|
"name": "SUSE Linux Enterprise Server"
|
||||||
|
}],
|
||||||
|
"requestId": "80904",
|
||||||
|
"keyName": "adriancole",
|
||||||
|
"name": "adriancole",
|
||||||
|
"instanceType": "COP32.1/2048/60",
|
||||||
|
"status": 0,
|
||||||
|
"owner": "adrian@cloudconscious.com",
|
||||||
|
"location": "101",
|
||||||
|
"imageId": "20015393",
|
||||||
|
"productCodes": [],
|
||||||
|
"volumes": [],
|
||||||
|
"requestName": "adriancole",
|
||||||
|
"id": "80604",
|
||||||
|
"secondaryIP": [],
|
||||||
|
"expirationTime": 1368431087355
|
||||||
|
}]
|
||||||
|
}
|
Loading…
Reference in New Issue