nacx requested changes on this pull request.
Thanks @andreaturli! This is taking shape! :)
> + * 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.packet.compute.utils;
+
+import java.net.URI;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+public class URIs {
+
+ public static String toId(URI uri) {
+ checkNotNull(uri, "uri");
+ String path = uri.getPath();
+ return path.substring(path.lastIndexOf('/') + 1);
What about URIs Just like `http://packet.net`? Let's better validate the input to propagate
an appropriate error and add a unit test class for this.
> + @Override
+ protected IterableWithMarker<Device> fetchPageUsingOptions(ListOptions
options, Optional<Object> arg0) {
+ return api.deviceApi((String) arg0.get()).list(options);
+ }
+ }
+ }
+
+ @Named("device:create")
+ @POST
+ @Produces(MediaType.APPLICATION_JSON)
+ @MapBinder(BindToJsonPayload.class)
+ @ResponseParser(URIParser.class)
+ URI create(@PayloadParam("hostname") String hostname, @PayloadParam("plan") String plan,
+ @PayloadParam("billing_cycle") String billingCycle, @PayloadParam("facility")
String facility,
+ @PayloadParam("features") Map<String, String> features, @PayloadParam("operating_system")
String operatingSystem,
+ @PayloadParam("locked") boolean locked, @PayloadParam("userdata") String userdata,
@PayloadParam("tags") Set<String> tags);
For methods with such an amount of parameters, consider creating an object instead.
> + @ConstructorProperties({ "devices", "meta" })
+ public Devices(List<Device> items, Meta meta) {
+ super(items, meta);
+ }
+ }
+
+ private static class ToPagedIterable extends BaseToPagedIterable<Device, ListOptions>
{
+
+ @Inject ToPagedIterable(PacketApi api, Function<Href, ListOptions> linkToOptions)
{
+ super(api, linkToOptions);
+ }
+
+ @Override
+ protected List<Object> getArgs(GeneratedHttpRequest request) {
+ return request.getCaller().get().getArgs();
+ }
Do we need to override this?
> +import org.jclouds.rest.annotations.PayloadParam;
+import org.jclouds.rest.annotations.RequestFilters;
+import org.jclouds.rest.annotations.ResponseParser;
+import org.jclouds.rest.annotations.Transform;
+import org.jclouds.rest.binders.BindToJsonPayload;
+
+import com.google.common.base.Function;
+import com.google.common.base.Optional;
+import com.google.inject.TypeLiteral;
+
+@Path("/ssh-keys")
+@Consumes(MediaType.APPLICATION_JSON)
+@RequestFilters({ AddXAuthTokenToRequest.class, AddApiVersionToRequest.class} )
+public interface SshKeyApi {
+
+ @Named("sshKey:list")
Use lowercase naming like in the other apis.
> + protected List<Object> getArgs(GeneratedHttpRequest request) {
+ return request.getCaller().get().getArgs();
+ }
+
+ @Override
+ protected IterableWithMarker<Device> fetchPageUsingOptions(ListOptions
options, Optional<Object> arg0) {
+ return api.deviceApi((String) arg0.get()).list(options);
+ }
+ }
+ }
+
+ @Named("device:create")
+ @POST
+ @Produces(MediaType.APPLICATION_JSON)
+ @MapBinder(BindToJsonPayload.class)
+ @ResponseParser(URIParser.class)
Use the existing [ParseURIFromListOrLocationHeaderIf20x](https://github.com/jclouds/jclouds/blob/master/core/src/main/java/org/jclouds/http/functions/ParseURIFromListOrLocationHeaderIf20x.java)
instead?
> + assertEquals(size(devices), 5);
+ assertEquals(server.getRequestCount(), 1);
+
+ assertSent(server, "GET", "/projects/93907f48-adfe-43ed-ad89-0e6e83721a54/devices?page=1&per_page=5");
+ }
+
+ public void testListDevicesWithOptionsReturns404() throws InterruptedException {
+ server.enqueue(response404());
+
+ Iterable<Device> actions = api.deviceApi("93907f48-adfe-43ed-ad89-0e6e83721a54").list(page(1).perPage(5));
+
+ assertTrue(isEmpty(actions));
+
+ assertEquals(server.getRequestCount(), 1);
+ assertSent(server, "GET", "/projects/93907f48-adfe-43ed-ad89-0e6e83721a54/devices?page=1&per_page=5");
+ }
Add the mock tests for the remaining methods in the DeviceApi.
> +import static org.testng.util.Strings.isNullOrEmpty;
+
+@Test(groups = "live", testName = "SshKeyApiLiveTest")
+public class SshKeyApiLiveTest extends BasePacketApiLiveTest {
+
+ public void testListSshKeys() {
+ final AtomicInteger found = new AtomicInteger(0);
+ assertTrue(Iterables.all(api().list().concat(), new Predicate<SshKey>() {
+ @Override
+ public boolean apply(SshKey input) {
+ found.incrementAndGet();
+ return !isNullOrEmpty(input.id());
+ }
+ }), "All ssh keys must have the 'id' field populated");
+ assertTrue(found.get() > 0, "Expected some ssh keys to be returned");
+ }
Add the live tests for the create, get and delete operations.
> + assertEquals(size(actions), 5);
+ assertEquals(server.getRequestCount(), 1);
+
+ assertSent(server, "GET", "/ssh-keys?page=1&per_page=5");
+ }
+
+ public void testListSshKeysWithOptionsReturns404() throws InterruptedException {
+ server.enqueue(response404());
+
+ Iterable<SshKey> actions = api.sshKeyApi().list(page(1).perPage(5));
+
+ assertTrue(isEmpty(actions));
+
+ assertEquals(server.getRequestCount(), 1);
+ assertSent(server, "GET", "/ssh-keys?page=1&per_page=5");
+ }
Add the tests for the remaining methods in the api.
--
You are receiving this because you are subscribed to this thread.
Reply to this email directly or view it on GitHub:
https://github.com/jclouds/jclouds-labs/pull/345#pullrequestreview-17313562
|