Add remaining features to support the abstraction

- add DeviceApi with Mock and Live Test
- add FacilityApi with Mock and Live Test
- add OperatingSystemApi with Mock and Live Test
- add SshKeyApi with Mock and Live Test
- fix Device domain object
- refactor deviceApi.create and sshKeyApi.create as they actually return an object instead of a URI now
- add mock and live tests for device api actions
This commit is contained in:
Andrea Turli 2017-01-18 19:13:28 +01:00
parent a7f97ac2ad
commit 49f1d0760e
52 changed files with 5129 additions and 23 deletions

View File

@ -18,7 +18,14 @@ package org.jclouds.packet;
import java.io.Closeable;
import javax.ws.rs.PathParam;
import org.jclouds.packet.features.DeviceApi;
import org.jclouds.packet.features.FacilityApi;
import org.jclouds.packet.features.OperatingSystemApi;
import org.jclouds.packet.features.PlanApi;
import org.jclouds.packet.features.ProjectApi;
import org.jclouds.packet.features.SshKeyApi;
import org.jclouds.rest.annotations.Delegate;
/**
@ -37,4 +44,43 @@ public interface PacketApi extends Closeable {
@Delegate
ProjectApi projectApi();
/**
* This Packet API provides all of the devices
*
* @see <a href="https://www.packet.net/help/api/#page:devices">docs</a>
*/
@Delegate
DeviceApi deviceApi(@PathParam("projectId") String projectId);
/**
* This Packet API provides all of the facilities
*
* @see <a href="https://www.packet.net/help/api/#page:devices,header:devices-operating-systems">docs</a>
*/
@Delegate
FacilityApi facilityApi();
/**
* This Packet API provides all of the plans
*
* @see <a href="https://www.packet.net/help/api/#page:devices,header:devices-plans">docs</a>
*/
@Delegate
PlanApi planApi();
/**
* This Packet API provides all of the operating systems
*
* @see <a href="https://www.packet.net/help/api/#page:devices,header:devices-operating-systems">docs</a>
*/
@Delegate
OperatingSystemApi operatingSystemApi();
/**
* This Packet API provides all of the operating systems
*
* @see <a href="https://www.packet.net/help/api/#page:ssh-keys">docs</a>
*/
@Delegate
SshKeyApi sshKeyApi();
}

View File

@ -25,7 +25,7 @@ import org.jclouds.location.suppliers.implicit.FirstRegion;
import org.jclouds.packet.PacketApi;
import org.jclouds.packet.domain.Href;
import org.jclouds.packet.domain.options.ListOptions;
import org.jclouds.packet.functions.LinkToListOptions;
import org.jclouds.packet.functions.HrefToListOptions;
import org.jclouds.packet.handlers.PacketErrorHandler;
import org.jclouds.rest.ConfiguresHttpApi;
import org.jclouds.rest.config.HttpApiModule;
@ -42,7 +42,7 @@ public class PacketHttpApiModule extends HttpApiModule<PacketApi> {
super.configure();
bind(ImplicitLocationSupplier.class).to(FirstRegion.class).in(Scopes.SINGLETON);
bind(new TypeLiteral<Function<Href, ListOptions>>() {
}).to(LinkToListOptions.class);
}).to(HrefToListOptions.class);
}
@Override

View File

@ -18,6 +18,8 @@ package org.jclouds.packet.domain;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.jclouds.javax.annotation.Nullable;
import org.jclouds.json.SerializedNames;
@ -27,6 +29,8 @@ import com.google.common.base.Enums;
import com.google.common.base.Joiner;
import com.google.common.base.Optional;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import static com.google.common.base.Preconditions.checkArgument;
@ -60,15 +64,19 @@ public abstract class Device {
public abstract OperatingSystem operatingSystem();
public abstract Facility facility();
public abstract Href project();
public abstract List<Href> sshKeys();
public abstract Href projectLite();
public abstract List<Object> volumes();
public abstract List<IpAddress> ipAddresses();
public abstract List<ProvisioningEvent> provisioningEvents();
public abstract Plan plan();
public abstract String rootPassword();
public abstract String userdata();
public abstract String href();
@SerializedNames({"id", "short_id", "hostname", "description", "state", "tags", "billing_cycle", "user", "iqn", "locked", "bonding_mode", "created_at", "updated_at", "operating_system", "facility", "project", "project_lite", "volumes", "ip_addresses", "plan", "root_password", "userdata", "href"})
@SerializedNames({"id", "short_id", "hostname", "description", "state", "tags", "billing_cycle", "user", "iqn",
"locked", "bonding_mode", "created_at", "updated_at", "operating_system", "facility", "project", "ssh_keys",
"project_lite", "volumes", "ip_addresses", "provisioning_events", "plan", "root_password", "userdata", "href"})
public static Device create(String id,
String shortId,
String hostname,
@ -85,9 +93,11 @@ public abstract class Device {
OperatingSystem operatingSystem,
Facility facility,
Href project,
List<Href> sshKeys,
Href projectLite,
List<Object> volumes,
List<IpAddress> ipAddresses,
List<ProvisioningEvent> provisioningEvents,
Plan plan,
String rootPassword,
String userdata,
@ -95,14 +105,80 @@ public abstract class Device {
) {
return new AutoValue_Device(id, shortId, hostname, description, state,
tags == null ? ImmutableList.<String> of() : ImmutableList.copyOf(tags),
billingCycle, user, iqn, locked, bondingMode, createdAt, updatedAt, operatingSystem, facility, project, projectLite,
billingCycle, user, iqn, locked, bondingMode, createdAt, updatedAt, operatingSystem, facility, project,
sshKeys == null ? ImmutableList.<Href> of() : ImmutableList.copyOf(sshKeys),
projectLite,
volumes == null ? ImmutableList.of() : ImmutableList.copyOf(volumes),
ipAddresses == null ? ImmutableList.<IpAddress>of() : ImmutableList.copyOf(ipAddresses),
plan, rootPassword, userdata, href
provisioningEvents == null ? ImmutableList.<ProvisioningEvent> of() : ImmutableList.copyOf(provisioningEvents),
plan,
rootPassword, userdata, href
);
}
Device() {
}
@AutoValue
public abstract static class CreateDevice {
public abstract String hostname();
public abstract String plan();
public abstract String billingCycle();
public abstract String facility();
public abstract Map<String, String> features();
public abstract String operatingSystem();
public abstract Boolean locked();
public abstract String userdata();
public abstract Set<String> tags();
@SerializedNames({"hostname", "plan", "billing_cycle", "facility", "features", "operating_system",
"locked", "userdata", "tags" })
private static CreateDevice create(final String hostname, final String plan, final String billingCycle,
final String facility, final Map<String, String> features, final String operatingSystem,
final Boolean locked, final String userdata,
final Set<String> tags) {
return builder()
.hostname(hostname)
.plan(plan)
.billingCycle(billingCycle)
.facility(facility)
.features(features)
.operatingSystem(operatingSystem)
.locked(locked)
.userdata(userdata)
.tags(tags)
.build();
}
public static Builder builder() {
return new AutoValue_Device_CreateDevice.Builder();
}
@AutoValue.Builder
public abstract static class Builder {
public abstract Builder hostname(String hostname);
public abstract Builder plan(String plan);
public abstract Builder billingCycle(String billingCycle);
public abstract Builder facility(String facility);
public abstract Builder features(Map<String, String> features);
public abstract Builder operatingSystem(String operatingSystem);
public abstract Builder locked(Boolean locked);
public abstract Builder userdata(String userdata);
public abstract Builder tags(Set<String> tags);
abstract Map<String, String> features();
abstract Set<String> tags();
abstract CreateDevice autoBuild();
public CreateDevice build() {
return tags(tags() != null ? ImmutableSet.copyOf(tags()) : ImmutableSet.<String> of())
.features(features() != null ? ImmutableMap.copyOf(features()) : ImmutableMap.<String, String> of())
.autoBuild();
}
}
}
}

View File

@ -0,0 +1,52 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF 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.packet.domain;
import java.util.Date;
import java.util.List;
import org.jclouds.javax.annotation.Nullable;
import org.jclouds.json.SerializedNames;
import com.google.auto.value.AutoValue;
import com.google.common.collect.ImmutableList;
@AutoValue
public abstract class ProvisioningEvent {
@Nullable
public abstract String id();
public abstract String type();
public abstract String body();
@Nullable
public abstract Date createdAt();
public abstract List<Href> relationships();
public abstract String interpolated();
@Nullable
public abstract String href();
@SerializedNames({"id", "type", "body", "created_at", "relationships", "interpolated", "href"})
public static ProvisioningEvent create(String id, String type, String body, Date createdAt,
List<Href> relationships, String interpolated, String href) {
return new AutoValue_ProvisioningEvent(id, type, body, createdAt,
relationships == null ? ImmutableList.<Href> of() : ImmutableList.copyOf(relationships),
interpolated,
href);
}
ProvisioningEvent() {}
}

View File

@ -0,0 +1,148 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF 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.packet.features;
import java.beans.ConstructorProperties;
import java.util.List;
import javax.inject.Inject;
import javax.inject.Named;
import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import org.jclouds.Fallbacks;
import org.jclouds.Fallbacks.NullOnNotFoundOr404;
import org.jclouds.Fallbacks.VoidOnNotFoundOr404;
import org.jclouds.collect.IterableWithMarker;
import org.jclouds.collect.PagedIterable;
import org.jclouds.collect.internal.Arg0ToPagedIterable;
import org.jclouds.http.functions.ParseJson;
import org.jclouds.javax.annotation.Nullable;
import org.jclouds.json.Json;
import org.jclouds.packet.PacketApi;
import org.jclouds.packet.domain.ActionType;
import org.jclouds.packet.domain.Device;
import org.jclouds.packet.domain.Href;
import org.jclouds.packet.domain.internal.PaginatedCollection;
import org.jclouds.packet.domain.options.ListOptions;
import org.jclouds.packet.filters.AddApiVersionToRequest;
import org.jclouds.packet.filters.AddXAuthTokenToRequest;
import org.jclouds.rest.annotations.BinderParam;
import org.jclouds.rest.annotations.Fallback;
import org.jclouds.rest.annotations.MapBinder;
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("/projects/{projectId}/devices")
@Consumes(MediaType.APPLICATION_JSON)
@RequestFilters({AddXAuthTokenToRequest.class, AddApiVersionToRequest.class})
public interface DeviceApi {
@Named("device:list")
@GET
@ResponseParser(ParseDevices.class)
@Transform(ParseDevices.ToPagedIterable.class)
@Fallback(Fallbacks.EmptyPagedIterableOnNotFoundOr404.class)
PagedIterable<Device> list();
@Named("device:list")
@GET
@ResponseParser(ParseDevices.class)
@Fallback(Fallbacks.EmptyIterableWithMarkerOnNotFoundOr404.class)
IterableWithMarker<Device> list(ListOptions options);
final class ParseDevices extends ParseJson<ParseDevices.Devices> {
@Inject
ParseDevices(Json json) {
super(json, TypeLiteral.get(Devices.class));
}
private static class Devices extends PaginatedCollection<Device> {
@ConstructorProperties({"devices", "meta"})
public Devices(List<Device> items, Meta meta) {
super(items, meta);
}
}
public static class ToPagedIterable extends Arg0ToPagedIterable.FromCaller<Device, ToPagedIterable> {
private final PacketApi api;
private final Function<Href, ListOptions> hrefToOptions;
@Inject
ToPagedIterable(PacketApi api, Function<Href, ListOptions> hrefToOptions) {
this.api = api;
this.hrefToOptions = hrefToOptions;
}
@Override
protected Function<Object, IterableWithMarker<Device>> markerToNextForArg0(Optional<Object> arg0) {
String projectId = arg0.get().toString();
final DeviceApi deviceApi = api.deviceApi(projectId);
return new Function<Object, IterableWithMarker<Device>>() {
@SuppressWarnings("unchecked")
@Override
public IterableWithMarker<Device> apply(Object input) {
ListOptions listOptions = hrefToOptions.apply(Href.class.cast(input));
return IterableWithMarker.class.cast(deviceApi.list(listOptions));
}
};
}
}
}
@Named("device:create")
@POST
@Produces(MediaType.APPLICATION_JSON)
Device create(@BinderParam(BindToJsonPayload.class) Device.CreateDevice device);
@Named("device:get")
@GET
@Path("/{id}")
@Fallback(NullOnNotFoundOr404.class)
@Nullable
Device get(@PathParam("id") String id);
@Named("device:delete")
@DELETE
@Path("/{id}")
@Fallback(VoidOnNotFoundOr404.class)
void delete(@PathParam("id") String id);
@Named("device:actions")
@POST
@Path("/{id}/actions")
@MapBinder(BindToJsonPayload.class)
void actions(@PathParam("id") String id, @PayloadParam("type") ActionType type);
}

View File

@ -0,0 +1,94 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF 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.packet.features;
import java.beans.ConstructorProperties;
import java.util.List;
import javax.inject.Inject;
import javax.inject.Named;
import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.core.MediaType;
import org.jclouds.Fallbacks;
import org.jclouds.collect.IterableWithMarker;
import org.jclouds.collect.PagedIterable;
import org.jclouds.http.functions.ParseJson;
import org.jclouds.json.Json;
import org.jclouds.packet.PacketApi;
import org.jclouds.packet.domain.Facility;
import org.jclouds.packet.domain.Href;
import org.jclouds.packet.domain.internal.PaginatedCollection;
import org.jclouds.packet.domain.options.ListOptions;
import org.jclouds.packet.filters.AddApiVersionToRequest;
import org.jclouds.packet.filters.AddXAuthTokenToRequest;
import org.jclouds.packet.functions.BaseToPagedIterable;
import org.jclouds.rest.annotations.Fallback;
import org.jclouds.rest.annotations.RequestFilters;
import org.jclouds.rest.annotations.ResponseParser;
import org.jclouds.rest.annotations.Transform;
import com.google.common.base.Function;
import com.google.common.base.Optional;
import com.google.inject.TypeLiteral;
@Path("/facilities")
@Consumes(MediaType.APPLICATION_JSON)
@RequestFilters({ AddXAuthTokenToRequest.class, AddApiVersionToRequest.class} )
public interface FacilityApi {
@Named("facility:list")
@GET
@ResponseParser(ParseFacilities.class)
@Transform(ParseFacilities.ToPagedIterable.class)
@Fallback(Fallbacks.EmptyPagedIterableOnNotFoundOr404.class)
PagedIterable<Facility> list();
@Named("facility:list")
@GET
@ResponseParser(ParseFacilities.class)
@Fallback(Fallbacks.EmptyIterableWithMarkerOnNotFoundOr404.class)
IterableWithMarker<Facility> list(ListOptions options);
final class ParseFacilities extends ParseJson<ParseFacilities.Facilities> {
@Inject
ParseFacilities(Json json) {
super(json, TypeLiteral.get(Facilities.class));
}
private static class Facilities extends PaginatedCollection<Facility> {
@ConstructorProperties({ "facilities", "meta" })
public Facilities(List<Facility> items, Meta meta) {
super(items, meta);
}
}
private static class ToPagedIterable extends BaseToPagedIterable<Facility, ListOptions> {
@Inject ToPagedIterable(PacketApi api, Function<Href, ListOptions> hrefToOptions) {
super(api, hrefToOptions);
}
@Override
protected IterableWithMarker<Facility> fetchPageUsingOptions(ListOptions options, Optional<Object> arg0) {
return api.facilityApi().list(options);
}
}
}
}

View File

@ -0,0 +1,94 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF 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.packet.features;
import java.beans.ConstructorProperties;
import java.util.List;
import javax.inject.Inject;
import javax.inject.Named;
import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.core.MediaType;
import org.jclouds.Fallbacks;
import org.jclouds.collect.IterableWithMarker;
import org.jclouds.collect.PagedIterable;
import org.jclouds.http.functions.ParseJson;
import org.jclouds.json.Json;
import org.jclouds.packet.PacketApi;
import org.jclouds.packet.domain.Href;
import org.jclouds.packet.domain.OperatingSystem;
import org.jclouds.packet.domain.internal.PaginatedCollection;
import org.jclouds.packet.domain.options.ListOptions;
import org.jclouds.packet.filters.AddApiVersionToRequest;
import org.jclouds.packet.filters.AddXAuthTokenToRequest;
import org.jclouds.packet.functions.BaseToPagedIterable;
import org.jclouds.rest.annotations.Fallback;
import org.jclouds.rest.annotations.RequestFilters;
import org.jclouds.rest.annotations.ResponseParser;
import org.jclouds.rest.annotations.Transform;
import com.google.common.base.Function;
import com.google.common.base.Optional;
import com.google.inject.TypeLiteral;
@Path("/operating-systems")
@Consumes(MediaType.APPLICATION_JSON)
@RequestFilters({ AddXAuthTokenToRequest.class, AddApiVersionToRequest.class} )
public interface OperatingSystemApi {
@Named("operatingsystem:list")
@GET
@ResponseParser(ParseOperatingSystems.class)
@Transform(ParseOperatingSystems.ToPagedIterable.class)
@Fallback(Fallbacks.EmptyPagedIterableOnNotFoundOr404.class)
PagedIterable<OperatingSystem> list();
@Named("operatingsystem:list")
@GET
@ResponseParser(ParseOperatingSystems.class)
@Fallback(Fallbacks.EmptyIterableWithMarkerOnNotFoundOr404.class)
IterableWithMarker<OperatingSystem> list(ListOptions options);
final class ParseOperatingSystems extends ParseJson<ParseOperatingSystems.OperatingSystems> {
@Inject
ParseOperatingSystems(Json json) {
super(json, TypeLiteral.get(ParseOperatingSystems.OperatingSystems.class));
}
private static class OperatingSystems extends PaginatedCollection<OperatingSystem> {
@ConstructorProperties({ "operating_systems", "meta" })
public OperatingSystems(List<OperatingSystem> items, Meta meta) {
super(items, meta);
}
}
private static class ToPagedIterable extends BaseToPagedIterable<OperatingSystem, ListOptions> {
@Inject ToPagedIterable(PacketApi api, Function<Href, ListOptions> hrefToOptions) {
super(api, hrefToOptions);
}
@Override
protected IterableWithMarker<OperatingSystem> fetchPageUsingOptions(ListOptions options, Optional<Object> arg0) {
return api.operatingSystemApi().list(options);
}
}
}
}

View File

@ -0,0 +1,94 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF 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.packet.features;
import java.beans.ConstructorProperties;
import java.util.List;
import javax.inject.Inject;
import javax.inject.Named;
import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.core.MediaType;
import org.jclouds.Fallbacks;
import org.jclouds.collect.IterableWithMarker;
import org.jclouds.collect.PagedIterable;
import org.jclouds.http.functions.ParseJson;
import org.jclouds.json.Json;
import org.jclouds.packet.PacketApi;
import org.jclouds.packet.domain.Href;
import org.jclouds.packet.domain.Plan;
import org.jclouds.packet.domain.internal.PaginatedCollection;
import org.jclouds.packet.domain.options.ListOptions;
import org.jclouds.packet.filters.AddApiVersionToRequest;
import org.jclouds.packet.filters.AddXAuthTokenToRequest;
import org.jclouds.packet.functions.BaseToPagedIterable;
import org.jclouds.rest.annotations.Fallback;
import org.jclouds.rest.annotations.RequestFilters;
import org.jclouds.rest.annotations.ResponseParser;
import org.jclouds.rest.annotations.Transform;
import com.google.common.base.Function;
import com.google.common.base.Optional;
import com.google.inject.TypeLiteral;
@Path("/plans")
@Consumes(MediaType.APPLICATION_JSON)
@RequestFilters({ AddXAuthTokenToRequest.class, AddApiVersionToRequest.class} )
public interface PlanApi {
@Named("plan:list")
@GET
@ResponseParser(ParsePlans.class)
@Transform(ParsePlans.ToPagedIterable.class)
@Fallback(Fallbacks.EmptyPagedIterableOnNotFoundOr404.class)
PagedIterable<Plan> list();
@Named("plan:list")
@GET
@ResponseParser(ParsePlans.class)
@Fallback(Fallbacks.EmptyIterableWithMarkerOnNotFoundOr404.class)
IterableWithMarker<Plan> list(ListOptions options);
final class ParsePlans extends ParseJson<ParsePlans.Plans> {
@Inject
ParsePlans(Json json) {
super(json, TypeLiteral.get(ParsePlans.Plans.class));
}
private static class Plans extends PaginatedCollection<Plan> {
@ConstructorProperties({ "plans", "meta" })
public Plans(List<Plan> items, Meta meta) {
super(items, meta);
}
}
private static class ToPagedIterable extends BaseToPagedIterable<Plan, ListOptions> {
@Inject ToPagedIterable(PacketApi api, Function<Href, ListOptions> hrefToOptions) {
super(api, hrefToOptions);
}
@Override
protected IterableWithMarker<Plan> fetchPageUsingOptions(ListOptions options, Optional<Object> arg0) {
return api.planApi().list(options);
}
}
}
}

View File

@ -53,7 +53,6 @@ import com.google.inject.TypeLiteral;
@RequestFilters({ AddXAuthTokenToRequest.class, AddApiVersionToRequest.class} )
public interface ProjectApi {
@Named("project:list")
@GET
@ResponseParser(ParseProjects.class)
@ -81,8 +80,8 @@ public interface ProjectApi {
}
private static class ToPagedIterable extends BaseToPagedIterable<Project, ListOptions> {
@Inject ToPagedIterable(PacketApi api, Function<Href, ListOptions> linkToOptions) {
super(api, linkToOptions);
@Inject ToPagedIterable(PacketApi api, Function<Href, ListOptions> hrefToOptions) {
super(api, hrefToOptions);
}
@Override
@ -91,4 +90,5 @@ public interface ProjectApi {
}
}
}
}

View File

@ -0,0 +1,122 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF 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.packet.features;
import java.beans.ConstructorProperties;
import java.util.List;
import javax.inject.Inject;
import javax.inject.Named;
import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import org.jclouds.Fallbacks;
import org.jclouds.Fallbacks.NullOnNotFoundOr404;
import org.jclouds.Fallbacks.VoidOnNotFoundOr404;
import org.jclouds.collect.IterableWithMarker;
import org.jclouds.collect.PagedIterable;
import org.jclouds.http.functions.ParseJson;
import org.jclouds.javax.annotation.Nullable;
import org.jclouds.json.Json;
import org.jclouds.packet.PacketApi;
import org.jclouds.packet.domain.Href;
import org.jclouds.packet.domain.SshKey;
import org.jclouds.packet.domain.internal.PaginatedCollection;
import org.jclouds.packet.domain.options.ListOptions;
import org.jclouds.packet.filters.AddApiVersionToRequest;
import org.jclouds.packet.filters.AddXAuthTokenToRequest;
import org.jclouds.packet.functions.BaseToPagedIterable;
import org.jclouds.rest.annotations.Fallback;
import org.jclouds.rest.annotations.MapBinder;
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")
@GET
@ResponseParser(ParseSshKeys.class)
@Transform(ParseSshKeys.ToPagedIterable.class)
@Fallback(Fallbacks.EmptyPagedIterableOnNotFoundOr404.class)
PagedIterable<SshKey> list();
@Named("sshkey:list")
@GET
@ResponseParser(ParseSshKeys.class)
@Fallback(Fallbacks.EmptyIterableWithMarkerOnNotFoundOr404.class)
IterableWithMarker<SshKey> list(ListOptions options);
final class ParseSshKeys extends ParseJson<ParseSshKeys.SshKeys> {
@Inject
ParseSshKeys(Json json) {
super(json, TypeLiteral.get(ParseSshKeys.SshKeys.class));
}
private static class SshKeys extends PaginatedCollection<SshKey> {
@ConstructorProperties({ "ssh_keys", "meta" })
public SshKeys(List<SshKey> items, Meta meta) {
super(items, meta);
}
}
private static class ToPagedIterable extends BaseToPagedIterable<SshKey, ListOptions> {
@Inject ToPagedIterable(PacketApi api, Function<Href, ListOptions> hrefToOptions) {
super(api, hrefToOptions);
}
@Override
protected IterableWithMarker<SshKey> fetchPageUsingOptions(ListOptions options, Optional<Object> arg0) {
return api.sshKeyApi().list(options);
}
}
}
@Named("sshkey:create")
@POST
@Produces(MediaType.APPLICATION_JSON)
@MapBinder(BindToJsonPayload.class)
SshKey create(@PayloadParam("label") String label, @PayloadParam("key") String key);
@Named("sshkey:get")
@GET
@Path("/{id}")
@Fallback(NullOnNotFoundOr404.class)
@Nullable
SshKey get(@PathParam("id") String id);
@Named("sshkey:delete")
@DELETE
@Path("/{id}")
@Fallback(VoidOnNotFoundOr404.class)
void delete(@PathParam("id") String id);
}

View File

@ -35,12 +35,12 @@ import com.google.common.base.Optional;
*/
public abstract class BaseToPagedIterable<T, O extends ListOptions> extends
Arg0ToPagedIterable<T, BaseToPagedIterable<T, O>> {
private final Function<Href, O> linkToOptions;
private final Function<Href, O> hrefToOptions;
protected final PacketApi api;
@Inject protected BaseToPagedIterable(PacketApi api, Function<Href, O> linkToOptions) {
@Inject protected BaseToPagedIterable(PacketApi api, Function<Href, O> hrefToOptions) {
this.api = api;
this.linkToOptions = linkToOptions;
this.hrefToOptions = hrefToOptions;
}
protected abstract IterableWithMarker<T> fetchPageUsingOptions(O options, Optional<Object> arg0);
@ -50,7 +50,7 @@ public abstract class BaseToPagedIterable<T, O extends ListOptions> extends
return new Function<Object, IterableWithMarker<T>>() {
@Override
public IterableWithMarker<T> apply(Object input) {
O nextOptions = linkToOptions.apply(Href.class.cast(input));
O nextOptions = hrefToOptions.apply(Href.class.cast(input));
return fetchPageUsingOptions(nextOptions, arg0);
}
};

View File

@ -35,7 +35,7 @@ import static org.jclouds.packet.domain.options.ListOptions.PER_PAGE_PARAM;
* Transforms an href returned by the API into a {@link ListOptions} that can be
* used to perform a request to get another page of a paginated list.
*/
public class LinkToListOptions implements Function<Href, ListOptions> {
public class HrefToListOptions implements Function<Href, ListOptions> {
@Override
public ListOptions apply(Href input) {

View File

@ -0,0 +1,138 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF 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.packet.features;
import java.util.Map;
import java.util.concurrent.atomic.AtomicInteger;
import org.jclouds.packet.compute.internal.BasePacketApiLiveTest;
import org.jclouds.packet.domain.ActionType;
import org.jclouds.packet.domain.BillingCycle;
import org.jclouds.packet.domain.Device;
import org.jclouds.packet.domain.SshKey;
import org.jclouds.ssh.SshKeys;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
import com.google.common.base.Predicate;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Iterables;
import static org.jclouds.packet.domain.options.ListOptions.Builder.page;
import static org.testng.Assert.assertNotNull;
import static org.testng.Assert.assertNull;
import static org.testng.Assert.assertTrue;
import static org.testng.util.Strings.isNullOrEmpty;
@Test(groups = "live", testName = "DeviceApiLiveTest")
public class DeviceApiLiveTest extends BasePacketApiLiveTest {
private SshKey sshKey;
private String deviceId;
@BeforeClass
public void setupDevice() {
Map<String, String> keyPair = SshKeys.generate();
sshKey = api.sshKeyApi().create(prefix + "-device-livetest", keyPair.get("public"));
}
@AfterClass(alwaysRun = true)
public void tearDown() {
if (sshKey != null) {
api.sshKeyApi().delete(sshKey.id());
}
}
public void testCreate() {
Device deviceCreated = api().create(
Device.CreateDevice.builder()
.hostname(prefix + "-device-livetest")
.plan("baremetal_0")
.billingCycle(BillingCycle.HOURLY.value())
.facility("ewr1")
.features(ImmutableMap.<String, String>of())
.operatingSystem("ubuntu_16_04")
.locked(false)
.userdata("")
.tags(ImmutableSet.<String> of())
.build()
);
deviceId = deviceCreated.id();
assertNodeRunning(deviceId);
Device device = api().get(deviceId);
assertNotNull(device, "Device must not be null");
}
@Test(groups = "live", dependsOnMethods = "testCreate")
public void testReboot() {
api().actions(deviceId, ActionType.REBOOT);
assertNodeRunning(deviceId);
}
@Test(groups = "live", dependsOnMethods = "testReboot")
public void testPowerOff() {
api().actions(deviceId, ActionType.POWER_OFF);
assertNodeTerminated(deviceId);
}
@Test(groups = "live", dependsOnMethods = "testPowerOff")
public void testPowerOn() {
api().actions(deviceId, ActionType.POWER_ON);
assertNodeRunning(deviceId);
}
@Test(dependsOnMethods = "testCreate")
public void testList() {
final AtomicInteger found = new AtomicInteger(0);
assertTrue(Iterables.all(api().list().concat(), new Predicate<Device>() {
@Override
public boolean apply(Device input) {
found.incrementAndGet();
return !isNullOrEmpty(input.id());
}
}), "All devices must have the 'id' field populated");
assertTrue(found.get() > 0, "Expected some devices to be returned");
}
@Test(dependsOnMethods = "testCreate")
public void testListOnePage() {
final AtomicInteger found = new AtomicInteger(0);
assertTrue(api().list(page(1).perPage(5)).allMatch(new Predicate<Device>() {
@Override
public boolean apply(Device input) {
found.incrementAndGet();
return !isNullOrEmpty(input.id());
}
}), "All devices must have the 'id' field populated");
assertTrue(found.get() > 0, "Expected some devices to be returned");
}
@Test(dependsOnMethods = "testList", alwaysRun = true)
public void testDelete() throws InterruptedException {
if (deviceId != null) {
api().delete(deviceId);
assertNodeTerminated(deviceId);
assertNull(api().get(deviceId));
}
}
private DeviceApi api() {
return api.deviceApi(identity);
}
}

View File

@ -0,0 +1,184 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF 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.packet.features;
import org.jclouds.packet.compute.internal.BasePacketApiMockTest;
import org.jclouds.packet.domain.ActionType;
import org.jclouds.packet.domain.BillingCycle;
import org.jclouds.packet.domain.Device;
import org.jclouds.packet.domain.Device.CreateDevice;
import org.testng.annotations.Test;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import static com.google.common.collect.Iterables.isEmpty;
import static com.google.common.collect.Iterables.size;
import static org.jclouds.packet.domain.options.ListOptions.Builder.page;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertNull;
import static org.testng.Assert.assertTrue;
@Test(groups = "unit", testName = "DeviceApiMockTest", singleThreaded = true)
public class DeviceApiMockTest extends BasePacketApiMockTest {
public void testListDevices() throws InterruptedException {
server.enqueue(jsonResponse("/devices-first.json"));
server.enqueue(jsonResponse("/devices-last.json"));
Iterable<Device> devices = api.deviceApi("93907f48-adfe-43ed-ad89-0e6e83721a54").list().concat();
assertEquals(size(devices), 7); // Force the PagedIterable to advance
assertEquals(server.getRequestCount(), 2);
assertSent(server, "GET", "/projects/93907f48-adfe-43ed-ad89-0e6e83721a54/devices");
assertSent(server, "GET", "/projects/93907f48-adfe-43ed-ad89-0e6e83721a54/devices?page=2");
}
public void testListDevicesReturns404() throws InterruptedException {
server.enqueue(response404());
Iterable<Device> devices = api.deviceApi("93907f48-adfe-43ed-ad89-0e6e83721a54").list().concat();
assertTrue(isEmpty(devices));
assertEquals(server.getRequestCount(), 1);
assertSent(server, "GET", "/projects/93907f48-adfe-43ed-ad89-0e6e83721a54/devices");
}
public void testListDevicesWithOptions() throws InterruptedException {
server.enqueue(jsonResponse("/devices-first.json"));
Iterable<Device> devices = api.deviceApi("93907f48-adfe-43ed-ad89-0e6e83721a54").list(page(1).perPage(5));
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");
}
public void testGetDevice() throws InterruptedException {
server.enqueue(jsonResponse("/device.json"));
Device device = api.deviceApi("93907f48-adfe-43ed-ad89-0e6e83721a54").get("1");
assertEquals(device, objectFromResource("/device.json", Device.class));
assertEquals(server.getRequestCount(), 1);
assertSent(server, "GET", "/projects/93907f48-adfe-43ed-ad89-0e6e83721a54/devices/1");
}
public void testGetDeviceReturns404() throws InterruptedException {
server.enqueue(response404());
Device device = api.deviceApi("93907f48-adfe-43ed-ad89-0e6e83721a54").get("1");
assertNull(device);
assertEquals(server.getRequestCount(), 1);
assertSent(server, "GET", "/projects/93907f48-adfe-43ed-ad89-0e6e83721a54/devices/1");
}
public void testCreateDevice() throws InterruptedException {
server.enqueue(jsonResponse("/device-create-res.json"));
Device device = api.deviceApi("93907f48-adfe-43ed-ad89-0e6e83721a54").create(
CreateDevice.builder()
.hostname("jclouds-device-livetest")
.plan("baremetal_0")
.billingCycle(BillingCycle.HOURLY.value())
.facility("ewr1")
.features(ImmutableMap.<String, String>of())
.operatingSystem("ubuntu_16_04")
.locked(false)
.userdata("")
.tags(ImmutableSet.<String> of())
.build()
);
assertEquals(device, objectFromResource("/device-create-res.json", Device.class));
assertEquals(server.getRequestCount(), 1);
assertSent(server, "POST", "/projects/93907f48-adfe-43ed-ad89-0e6e83721a54/devices", stringFromResource("/device-create-req.json"));
}
public void testDeleteDevice() throws InterruptedException {
server.enqueue(response204());
api.deviceApi("93907f48-adfe-43ed-ad89-0e6e83721a54").delete("1");
assertEquals(server.getRequestCount(), 1);
assertSent(server, "DELETE", "/projects/93907f48-adfe-43ed-ad89-0e6e83721a54/devices/1");
}
public void testDeleteDeviceReturns404() throws InterruptedException {
server.enqueue(response404());
api.deviceApi("93907f48-adfe-43ed-ad89-0e6e83721a54").delete("1");
assertEquals(server.getRequestCount(), 1);
assertSent(server, "DELETE", "/projects/93907f48-adfe-43ed-ad89-0e6e83721a54/devices/1");
}
public void testActionPowerOn() throws InterruptedException {
server.enqueue(jsonResponse("/power-on.json"));
api.deviceApi("93907f48-adfe-43ed-ad89-0e6e83721a54").actions("deviceId", ActionType.POWER_ON);
assertEquals(server.getRequestCount(), 1);
assertSent(server, "POST", "/projects/93907f48-adfe-43ed-ad89-0e6e83721a54/devices/deviceId/actions");
}
public void testActionPowerOff() throws InterruptedException {
server.enqueue(jsonResponse("/power-off.json"));
api.deviceApi("93907f48-adfe-43ed-ad89-0e6e83721a54").actions("deviceId", ActionType.POWER_OFF);
assertEquals(server.getRequestCount(), 1);
assertSent(server, "POST", "/projects/93907f48-adfe-43ed-ad89-0e6e83721a54/devices/deviceId/actions");
}
public void testActionReboot() throws InterruptedException {
server.enqueue(jsonResponse("/reboot.json"));
api.deviceApi("93907f48-adfe-43ed-ad89-0e6e83721a54").actions("deviceId", ActionType.REBOOT);
assertEquals(server.getRequestCount(), 1);
assertSent(server, "POST", "/projects/93907f48-adfe-43ed-ad89-0e6e83721a54/devices/deviceId/actions");
}
public void testActionRescue() throws InterruptedException {
server.enqueue(jsonResponse("/rescue.json"));
api.deviceApi("93907f48-adfe-43ed-ad89-0e6e83721a54").actions("deviceId", ActionType.RESCUE);
assertEquals(server.getRequestCount(), 1);
assertSent(server, "POST", "/projects/93907f48-adfe-43ed-ad89-0e6e83721a54/devices/deviceId/actions");
}
}

View File

@ -0,0 +1,62 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF 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.packet.features;
import java.util.concurrent.atomic.AtomicInteger;
import org.jclouds.packet.compute.internal.BasePacketApiMockTest;
import org.jclouds.packet.domain.Facility;
import org.testng.annotations.Test;
import com.google.common.base.Predicate;
import com.google.common.collect.Iterables;
import static org.jclouds.packet.domain.options.ListOptions.Builder.page;
import static org.testng.Assert.assertTrue;
import static org.testng.util.Strings.isNullOrEmpty;
@Test(groups = "live", testName = "FacilityApiLiveTest")
public class FacilityApiLiveTest extends BasePacketApiMockTest {
public void testList() {
final AtomicInteger found = new AtomicInteger(0);
assertTrue(Iterables.all(api().list().concat(), new Predicate<Facility>() {
@Override
public boolean apply(Facility input) {
found.incrementAndGet();
return !isNullOrEmpty(input.id());
}
}), "All facilities must have the 'id' field populated");
assertTrue(found.get() > 0, "Expected some facilities to be returned");
}
public void testListOnePage() {
final AtomicInteger found = new AtomicInteger(0);
assertTrue(api().list(page(1).perPage(5)).allMatch(new Predicate<Facility>() {
@Override
public boolean apply(Facility input) {
found.incrementAndGet();
return !isNullOrEmpty(input.id());
}
}), "All facilities must have the 'id' field populated");
assertTrue(found.get() > 0, "Expected some facilities to be returned");
}
private FacilityApi api() {
return api.facilityApi();
}
}

View File

@ -0,0 +1,78 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF 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.packet.features;
import org.jclouds.packet.compute.internal.BasePacketApiMockTest;
import org.jclouds.packet.domain.Facility;
import org.testng.annotations.Test;
import static com.google.common.collect.Iterables.isEmpty;
import static com.google.common.collect.Iterables.size;
import static org.jclouds.packet.domain.options.ListOptions.Builder.page;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertTrue;
@Test(groups = "unit", testName = "FacilityApiMockTest", singleThreaded = true)
public class FacilityApiMockTest extends BasePacketApiMockTest {
public void testListFacilities() throws InterruptedException {
server.enqueue(jsonResponse("/facilities-first.json"));
server.enqueue(jsonResponse("/facilities-last.json"));
Iterable<Facility> facilities = api.facilityApi().list().concat();
assertEquals(size(facilities), 3); // Force the PagedIterable to advance
assertEquals(server.getRequestCount(), 2);
assertSent(server, "GET", "/facilities");
assertSent(server, "GET", "/facilities?page=2");
}
public void testListFacilitiesReturns404() throws InterruptedException {
server.enqueue(response404());
Iterable<Facility> facilities = api.facilityApi().list().concat();
assertTrue(isEmpty(facilities));
assertEquals(server.getRequestCount(), 1);
assertSent(server, "GET", "/facilities");
}
public void testListFacilitiesWithOptions() throws InterruptedException {
server.enqueue(jsonResponse("/facilities-first.json"));
Iterable<Facility> actions = api.facilityApi().list(page(1).perPage(2));
assertEquals(size(actions), 2);
assertEquals(server.getRequestCount(), 1);
assertSent(server, "GET", "/facilities?page=1&per_page=2");
}
public void testListFacilitiesWithOptionsReturns404() throws InterruptedException {
server.enqueue(response404());
Iterable<Facility> actions = api.facilityApi().list(page(1).perPage(2));
assertTrue(isEmpty(actions));
assertEquals(server.getRequestCount(), 1);
assertSent(server, "GET", "/facilities?page=1&per_page=2");
}
}

View File

@ -0,0 +1,62 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF 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.packet.features;
import java.util.concurrent.atomic.AtomicInteger;
import org.jclouds.packet.compute.internal.BasePacketApiLiveTest;
import org.jclouds.packet.domain.OperatingSystem;
import org.testng.annotations.Test;
import com.google.common.base.Predicate;
import com.google.common.collect.Iterables;
import static org.jclouds.packet.domain.options.ListOptions.Builder.page;
import static org.testng.Assert.assertTrue;
import static org.testng.util.Strings.isNullOrEmpty;
@Test(groups = "live", testName = "OperatingSystemApiLiveTest")
public class OperatingSystemApiLiveTest extends BasePacketApiLiveTest {
public void testList() {
final AtomicInteger found = new AtomicInteger(0);
assertTrue(Iterables.all(api().list().concat(), new Predicate<OperatingSystem>() {
@Override
public boolean apply(OperatingSystem input) {
found.incrementAndGet();
return !isNullOrEmpty(input.id());
}
}), "All operating systems must have the 'id' field populated");
assertTrue(found.get() > 0, "Expected some operating systems to be returned");
}
public void testListOnePage() {
final AtomicInteger found = new AtomicInteger(0);
assertTrue(api().list(page(1).perPage(5)).allMatch(new Predicate<OperatingSystem>() {
@Override
public boolean apply(OperatingSystem input) {
found.incrementAndGet();
return !isNullOrEmpty(input.id());
}
}), "All operating systems must have the 'id' field populated");
assertTrue(found.get() > 0, "Expected some operating systems to be returned");
}
private OperatingSystemApi api() {
return api.operatingSystemApi();
}
}

View File

@ -0,0 +1,78 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF 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.packet.features;
import org.jclouds.packet.compute.internal.BasePacketApiMockTest;
import org.jclouds.packet.domain.OperatingSystem;
import org.testng.annotations.Test;
import static com.google.common.collect.Iterables.isEmpty;
import static com.google.common.collect.Iterables.size;
import static org.jclouds.packet.domain.options.ListOptions.Builder.page;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertTrue;
@Test(groups = "unit", testName = "OperatingSystemApiMockTest", singleThreaded = true)
public class OperatingSystemApiMockTest extends BasePacketApiMockTest {
public void testListOperatingSystems() throws InterruptedException {
server.enqueue(jsonResponse("/operatingSystems-first.json"));
server.enqueue(jsonResponse("/operatingSystems-last.json"));
Iterable<OperatingSystem> operatingSystems = api.operatingSystemApi().list().concat();
assertEquals(size(operatingSystems), 14); // Force the PagedIterable to advance
assertEquals(server.getRequestCount(), 2);
assertSent(server, "GET", "/operating-systems");
assertSent(server, "GET", "/operating-systems?page=2");
}
public void testListOperatingSystemsReturns404() throws InterruptedException {
server.enqueue(response404());
Iterable<OperatingSystem> operatingSystems = api.operatingSystemApi().list().concat();
assertTrue(isEmpty(operatingSystems));
assertEquals(server.getRequestCount(), 1);
assertSent(server, "GET", "/operating-systems");
}
public void testListOperatingSystemsWithOptions() throws InterruptedException {
server.enqueue(jsonResponse("/operatingSystems-first.json"));
Iterable<OperatingSystem> operatingSystems = api.operatingSystemApi().list(page(1).perPage(5));
assertEquals(size(operatingSystems), 7);
assertEquals(server.getRequestCount(), 1);
assertSent(server, "GET", "/operating-systems?page=1&per_page=5");
}
public void testListOperatingSystemsWithOptionsReturns404() throws InterruptedException {
server.enqueue(response404());
Iterable<OperatingSystem> operatingSystems = api.operatingSystemApi().list(page(1).perPage(5));
assertTrue(isEmpty(operatingSystems));
assertEquals(server.getRequestCount(), 1);
assertSent(server, "GET", "/operating-systems?page=1&per_page=5");
}
}

View File

@ -0,0 +1,62 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF 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.packet.features;
import java.util.concurrent.atomic.AtomicInteger;
import org.jclouds.packet.compute.internal.BasePacketApiLiveTest;
import org.jclouds.packet.domain.Plan;
import org.testng.annotations.Test;
import com.google.common.base.Predicate;
import com.google.common.collect.Iterables;
import static org.jclouds.packet.domain.options.ListOptions.Builder.page;
import static org.testng.Assert.assertTrue;
import static org.testng.util.Strings.isNullOrEmpty;
@Test(groups = "live", testName = "PlanApiLiveTest")
public class PlanApiLiveTest extends BasePacketApiLiveTest {
public void testList() {
final AtomicInteger found = new AtomicInteger(0);
assertTrue(Iterables.all(api().list().concat(), new Predicate<Plan>() {
@Override
public boolean apply(Plan input) {
found.incrementAndGet();
return !isNullOrEmpty(input.id());
}
}), "All plans must have the 'id' field populated");
assertTrue(found.get() > 0, "Expected some plans to be returned");
}
public void testListOnePage() {
final AtomicInteger found = new AtomicInteger(0);
assertTrue(api().list(page(1).perPage(5)).allMatch(new Predicate<Plan>() {
@Override
public boolean apply(Plan input) {
found.incrementAndGet();
return !isNullOrEmpty(input.id());
}
}), "All plans must have the 'id' field populated");
assertTrue(found.get() > 0, "Expected some plans to be returned");
}
private PlanApi api() {
return api.planApi();
}
}

View File

@ -0,0 +1,78 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF 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.packet.features;
import org.jclouds.packet.compute.internal.BasePacketApiMockTest;
import org.jclouds.packet.domain.Plan;
import org.testng.annotations.Test;
import static com.google.common.collect.Iterables.isEmpty;
import static com.google.common.collect.Iterables.size;
import static org.jclouds.packet.domain.options.ListOptions.Builder.page;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertTrue;
@Test(groups = "unit", testName = "PlanApiMockTest", singleThreaded = true)
public class PlanApiMockTest extends BasePacketApiMockTest {
public void testListPlans() throws InterruptedException {
server.enqueue(jsonResponse("/plans-first.json"));
server.enqueue(jsonResponse("/plans-last.json"));
Iterable<Plan> plans = api.planApi().list().concat();
assertEquals(size(plans), 7); // Force the PagedIterable to advance
assertEquals(server.getRequestCount(), 2);
assertSent(server, "GET", "/plans");
assertSent(server, "GET", "/plans?page=2");
}
public void testListPlansReturns404() throws InterruptedException {
server.enqueue(response404());
Iterable<Plan> plans = api.planApi().list().concat();
assertTrue(isEmpty(plans));
assertEquals(server.getRequestCount(), 1);
assertSent(server, "GET", "/plans");
}
public void testListPlansWithOptions() throws InterruptedException {
server.enqueue(jsonResponse("/plans-first.json"));
Iterable<Plan> plans = api.planApi().list(page(1).perPage(5));
assertEquals(size(plans), 4);
assertEquals(server.getRequestCount(), 1);
assertSent(server, "GET", "/plans?page=1&per_page=5");
}
public void testListPlansWithOptionsReturns404() throws InterruptedException {
server.enqueue(response404());
Iterable<Plan> plans = api.planApi().list(page(1).perPage(5));
assertTrue(isEmpty(plans));
assertEquals(server.getRequestCount(), 1);
assertSent(server, "GET", "/plans?page=1&per_page=5");
}
}

View File

@ -32,7 +32,7 @@ import static org.testng.util.Strings.isNullOrEmpty;
@Test(groups = "live", testName = "ProjectApiLiveTest")
public class ProjectApiLiveTest extends BasePacketApiLiveTest {
public void testListProjects() {
public void testList() {
final AtomicInteger found = new AtomicInteger(0);
assertTrue(Iterables.all(api().list().concat(), new Predicate<Project>() {
@Override
@ -43,8 +43,8 @@ public class ProjectApiLiveTest extends BasePacketApiLiveTest {
}), "All projects must have the 'id' field populated");
assertTrue(found.get() > 0, "Expected some projects to be returned");
}
public void testListActionsOnePage() {
public void testListOnePage() {
final AtomicInteger found = new AtomicInteger(0);
assertTrue(api().list(page(1).perPage(5)).allMatch(new Predicate<Project>() {
@Override
@ -55,7 +55,6 @@ public class ProjectApiLiveTest extends BasePacketApiLiveTest {
}), "All projects must have the 'id' field populated");
assertTrue(found.get() > 0, "Expected some projects to be returned");
}
private ProjectApi api() {
return api.projectApi();

View File

@ -74,6 +74,5 @@ public class ProjectApiMockTest extends BasePacketApiMockTest {
assertEquals(server.getRequestCount(), 1);
assertSent(server, "GET", "/projects?page=1&per_page=5");
}
}

View File

@ -0,0 +1,83 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF 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.packet.features;
import java.util.Map;
import java.util.concurrent.atomic.AtomicInteger;
import org.jclouds.packet.compute.internal.BasePacketApiLiveTest;
import org.jclouds.packet.domain.SshKey;
import org.jclouds.ssh.SshKeys;
import org.testng.annotations.Test;
import com.google.common.base.Predicate;
import com.google.common.collect.Iterables;
import static org.jclouds.packet.domain.options.ListOptions.Builder.page;
import static org.testng.Assert.assertTrue;
import static org.testng.util.Strings.isNullOrEmpty;
@Test(groups = "live", testName = "SshKeyApiLiveTest")
public class SshKeyApiLiveTest extends BasePacketApiLiveTest {
private SshKey sshKey;
public void testCreate() {
Map<String, String> keyPair = SshKeys.generate();
sshKey = api.sshKeyApi().create(prefix + "-sshkey-livetest", keyPair.get("public"));
}
@Test(dependsOnMethods = "testCreate")
public void testGet() {
api.sshKeyApi().get(sshKey.id());
}
@Test(dependsOnMethods = "testCreate")
public void testList() {
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");
}
@Test(dependsOnMethods = "testCreate")
public void testListOnePage() {
final AtomicInteger found = new AtomicInteger(0);
assertTrue(api().list(page(1).perPage(5)).allMatch(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");
}
@Test(dependsOnMethods = "testList", alwaysRun = true)
public void testDelete() throws InterruptedException {
api.sshKeyApi().delete(sshKey.id());
}
private SshKeyApi api() {
return api.sshKeyApi();
}
}

View File

@ -0,0 +1,134 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF 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.packet.features;
import org.jclouds.packet.compute.internal.BasePacketApiMockTest;
import org.jclouds.packet.domain.SshKey;
import org.testng.annotations.Test;
import static com.google.common.collect.Iterables.isEmpty;
import static com.google.common.collect.Iterables.size;
import static org.jclouds.packet.domain.options.ListOptions.Builder.page;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertNull;
import static org.testng.Assert.assertTrue;
@Test(groups = "unit", testName = "SshKeyApiMockTest", singleThreaded = true)
public class SshKeyApiMockTest extends BasePacketApiMockTest {
public void testListSshKeys() throws InterruptedException {
server.enqueue(jsonResponse("/sshKeys-first.json"));
server.enqueue(jsonResponse("/sshKeys-last.json"));
Iterable<SshKey> sshkeys = api.sshKeyApi().list().concat();
assertEquals(size(sshkeys), 8); // Force the PagedIterable to advance
assertEquals(server.getRequestCount(), 2);
assertSent(server, "GET", "/ssh-keys");
assertSent(server, "GET", "/ssh-keys?page=2");
}
public void testListSshKeysReturns404() throws InterruptedException {
server.enqueue(response404());
Iterable<SshKey> sshkeys = api.sshKeyApi().list().concat();
assertTrue(isEmpty(sshkeys));
assertEquals(server.getRequestCount(), 1);
assertSent(server, "GET", "/ssh-keys");
}
public void testListSshKeysWithOptions() throws InterruptedException {
server.enqueue(jsonResponse("/sshKeys-first.json"));
Iterable<SshKey> actions = api.sshKeyApi().list(page(1).perPage(5));
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");
}
public void testGetSshKey() throws InterruptedException {
server.enqueue(jsonResponse("/ssh-key.json"));
SshKey sshKey = api.sshKeyApi().get("1");
assertEquals(sshKey, objectFromResource("/ssh-key.json", SshKey.class));
assertEquals(server.getRequestCount(), 1);
assertSent(server, "GET", "/ssh-keys/1");
}
public void testGetSshKeyReturns404() throws InterruptedException {
server.enqueue(response404());
SshKey sshKey = api.sshKeyApi().get("1");
assertNull(sshKey);
assertEquals(server.getRequestCount(), 1);
assertSent(server, "GET", "/ssh-keys/1");
}
public void testCreateSshKey() throws InterruptedException {
server.enqueue(jsonResponse("/ssh-key-create-res.json"));
SshKey sshKey = api.sshKeyApi().create(
"jclouds-ssh-key-livetest",
"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCdgcoNzH4hCc0j3b4MuG503L/J54uyFvwCAOu8vSsYuLpJ4AEyEOv+T0SfdF605fK6GYXA16Rxk3lrPt7mfKGNtXR0Ripbv7Zc6PvCRorwgj/cjh/45miozjrkXAiHD1GFZycfbi4YsoWAqZj7W4mwtctmhrYM0FPdya2XoRpVy89N+A5Xo4Xtd6EZn6JGEKQM5+kF2aL3ggy0od/DqjuEVYwZoyTe1RgUTXZSU/Woh7WMhsRHbqd3eYz4s6ac8n8IJPGKtUaQeqUtH7OK6NRYXVypUrkqNlwdNYZAwrjXg/x5T3D+bo11LENASRt9OJ2OkmRSTqRxBeDkhnVauWK/"
);
assertEquals(sshKey, objectFromResource("/ssh-key-create-res.json", SshKey.class));
assertEquals(server.getRequestCount(), 1);
assertSent(server, "POST", "/ssh-keys", stringFromResource("/ssh-key-create-req.json"));
}
public void testDeleteSshKey() throws InterruptedException {
server.enqueue(response204());
api.sshKeyApi().delete("1");
assertEquals(server.getRequestCount(), 1);
assertSent(server, "DELETE", "/ssh-keys/1");
}
public void testDeleteSshKeyReturns404() throws InterruptedException {
server.enqueue(response404());
api.sshKeyApi().delete("1");
assertEquals(server.getRequestCount(), 1);
assertSent(server, "DELETE", "/ssh-keys/1");
}
}

View File

@ -29,11 +29,11 @@ import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertFalse;
import static org.testng.Assert.assertNotNull;
@Test(groups = "unit", testName = "LinkToListOptionsTest")
public class LinkToListOptionsTest {
@Test(groups = "unit", testName = "HrefToListOptionsTest")
public class HrefToListOptionsTest {
public void testNoOptions() {
LinkToListOptions function = new LinkToListOptions();
HrefToListOptions function = new HrefToListOptions();
ListOptions options = function.apply(Href.create("https://api.packet.net/projects"));
assertNotNull(options);
@ -44,7 +44,7 @@ public class LinkToListOptionsTest {
}
public void testWithOptions() {
LinkToListOptions function = new LinkToListOptions();
HrefToListOptions function = new HrefToListOptions();
ListOptions options = function.apply(Href.create("https://api.packet.net/projects?page=2&per_page=5"));
assertNotNull(options);

View File

@ -0,0 +1,11 @@
{
"hostname": "jclouds-device-livetest",
"plan": "baremetal_0",
"billing_cycle": "hourly",
"facility": "ewr1",
"features": {},
"operating_system": "ubuntu_16_04",
"locked": false,
"userdata": "",
"tags": []
}

View File

@ -0,0 +1,211 @@
{
"id": "3238ce59-fe02-4b9b-92c1-915ef4f3fb9e",
"short_id": "3238ce59",
"hostname": "andrea-device-livetest",
"description": null,
"state": "queued",
"tags": [],
"billing_cycle": "hourly",
"user": "root",
"iqn": "iqn.2017-01.net.packet:device.3238ce59",
"locked": false,
"bonding_mode": 5,
"created_at": "2017-01-20T14:15:28Z",
"updated_at": "2017-01-20T14:15:29Z",
"provisioning_percentage": 10.0,
"operating_system": {
"id": "1b9b78e3-de68-466e-ba00-f2123e89c112",
"slug": "ubuntu_16_04",
"name": "Ubuntu 16.04 LTS",
"distro": "ubuntu",
"version": "16.04",
"provisionable_on": [
"baremetal_0",
"baremetal_1",
"baremetal_2",
"baremetal_2a",
"baremetal_3",
"baremetal_hua"
]
},
"facility": {
"id": "e1e9c52e-a0bc-4117-b996-0fc94843ea09",
"name": "Parsippany, NJ",
"code": "ewr1",
"features": [
"baremetal",
"storage"
],
"address": null
},
"project": {
"href": "/projects/93907f48-adfe-43ed-ad89-0e6e83721a54"
},
"ssh_keys": [
{
"href": "/ssh-keys/a3d8bebe-574f-427d-80ee-bc2ba17f7074"
},
{
"href": "/ssh-keys/a8d6cc17-7d9d-4fb9-8190-afdb301b67df"
},
{
"href": "/ssh-keys/084a5dec-30be-415a-8937-9c615932e459"
},
{
"href": "/ssh-keys/eacfb002-45e1-4047-a0d5-cd9d8bab19ed"
},
{
"href": "/ssh-keys/f82b69d7-8c7e-4a38-9283-ecdbcaba56aa"
},
{
"href": "/ssh-keys/da5d6c21-2e8c-43ac-820f-ff41bd4e6ebc"
}
],
"project_lite": {
"href": "/projects/93907f48-adfe-43ed-ad89-0e6e83721a54"
},
"volumes": [],
"ip_addresses": [],
"provisioning_events": [
{
"id": "32a4da09-37dd-446b-99ef-9f64c1eb0097",
"type": "provisioning.101",
"body": "Provisioning started",
"created_at": "2017-01-20T14:15:29Z",
"relationships": [
{
"href": "#5062a5fe-19ea-4b41-864c-e5f4dcb02fa0"
}
],
"interpolated": "Provisioning started",
"href": "/events/32a4da09-37dd-446b-99ef-9f64c1eb0097"
},
{
"id": null,
"type": "provisioning.102",
"body": "Network configured",
"created_at": null,
"relationships": [],
"interpolated": "Network configured"
},
{
"id": null,
"type": "provisioning.103",
"body": "Configuration written, restarting device",
"created_at": null,
"relationships": [],
"interpolated": "Configuration written, restarting device"
},
{
"id": null,
"type": "provisioning.104",
"body": "Connected to magic install system",
"created_at": null,
"relationships": [],
"interpolated": "Connected to magic install system"
},
{
"id": null,
"type": "provisioning.105",
"body": "Server partitions created",
"created_at": null,
"relationships": [],
"interpolated": "Server partitions created"
},
{
"id": null,
"type": "provisioning.106",
"body": "Operating system packages installed",
"created_at": null,
"relationships": [],
"interpolated": "Operating system packages installed"
},
{
"id": null,
"type": "provisioning.107",
"body": "Server networking interfaces configured",
"created_at": null,
"relationships": [],
"interpolated": "Server networking interfaces configured"
},
{
"id": null,
"type": "provisioning.108",
"body": "Cloud-init packages installed and configured",
"created_at": null,
"relationships": [],
"interpolated": "Cloud-init packages installed and configured"
},
{
"id": null,
"type": "provisioning.109",
"body": "Installation finished, rebooting server",
"created_at": null,
"relationships": [],
"interpolated": "Installation finished, rebooting server"
},
{
"id": null,
"type": "provisioning.109",
"body": "Installation finished, rebooting server",
"created_at": null,
"relationships": [],
"interpolated": "Installation finished, rebooting server"
}
],
"plan": {
"id": "e69c0169-4726-46ea-98f1-939c9e8a3607",
"slug": "baremetal_0",
"name": "Type 0",
"description": "Our Type 0 configuration is a general use \"cloud killer\" server, with a Intel Atom 2.4Ghz processor and 8GB of RAM.",
"line": "baremetal",
"specs": {
"cpus": [
{
"count": 1,
"type": "Intel Atom C2550 @ 2.4Ghz"
}
],
"memory": {
"total": "8GB"
},
"drives": [
{
"count": 1,
"size": "80GB",
"type": "SSD"
}
],
"nics": [
{
"count": 2,
"type": "1Gbps"
}
],
"features": {
"raid": false,
"txt": true
}
},
"available_in": [
{
"href": "/facilities/2b70eb8f-fa18-47c0-aba7-222a842362fd"
},
{
"href": "/facilities/8e6470b3-b75e-47d1-bb93-45b225750975"
},
{
"href": "/facilities/8ea03255-89f9-4e62-9d3f-8817db82ceed"
},
{
"href": "/facilities/e1e9c52e-a0bc-4117-b996-0fc94843ea09"
}
],
"pricing": {
"hour": 0.05
}
},
"userdata": "",
"root_password": "$n4hwka3!i",
"href": "/devices/3238ce59-fe02-4b9b-92c1-915ef4f3fb9e"
}

View File

@ -0,0 +1,278 @@
{
"id": "98e22032-579e-4c04-bb12-05cc6a3864c8",
"short_id": "98e22032",
"hostname": "test",
"description": null,
"state": "provisioning",
"tags": [],
"billing_cycle": "hourly",
"user": "root",
"iqn": "iqn.2017-01.net.packet:device.98e22032",
"locked": false,
"bonding_mode": 5,
"created_at": "2017-01-03T09:47:59Z",
"updated_at": "2017-01-03T09:50:13Z",
"provisioning_percentage": 50,
"operating_system": {
"id": "68bad60d-f5a7-45c2-ad09-573edaad3a3c",
"slug": "centos_7",
"name": "Centos 7",
"distro": "centos",
"version": "7",
"provisionable_on": [
"baremetal_0",
"baremetal_1",
"baremetal_2",
"baremetal_3"
]
},
"facility": {
"id": "e1e9c52e-a0bc-4117-b996-0fc94843ea09",
"name": "Parsippany, NJ",
"code": "ewr1",
"features": [
"baremetal",
"storage"
],
"address": null
},
"project": {
"href": "/projects/93907f48-adfe-43ed-ad89-0e6e83721a54"
},
"ssh_keys": [
{
"href": "/ssh-keys/084a5dec-30be-415a-8937-9c615932e459"
},
{
"href": "/ssh-keys/a8d6cc17-7d9d-4fb9-8190-afdb301b67df"
},
{
"href": "/ssh-keys/a3d8bebe-574f-427d-80ee-bc2ba17f7074"
},
{
"href": "/ssh-keys/eacfb002-45e1-4047-a0d5-cd9d8bab19ed"
},
{
"href": "/ssh-keys/bba63e41-b12c-493a-81d4-e52f50f247ed"
}
],
"project_lite": {
"href": "/projects/93907f48-adfe-43ed-ad89-0e6e83721a54"
},
"volumes": [],
"ip_addresses": [
{
"id": "5d0262c7-1727-411c-94c4-9e6f15490dd3",
"address_family": 4,
"netmask": "255.255.255.254",
"created_at": "2017-01-03T09:47:59Z",
"public": true,
"cidr": 31,
"management": true,
"manageable": true,
"assigned_to": {
"href": "/devices/98e22032-579e-4c04-bb12-05cc6a3864c8"
},
"network": "147.75.106.80",
"address": "147.75.106.81",
"gateway": "147.75.106.80",
"href": "/ips/5d0262c7-1727-411c-94c4-9e6f15490dd3"
},
{
"id": "f7d0e65c-eb3b-42bd-af9b-ad3a736d8d43",
"address_family": 6,
"netmask": "ffff:ffff:ffff:ffff:ffff:ffff:ffff:fffe",
"created_at": "2017-01-03T09:47:59Z",
"public": true,
"cidr": 127,
"management": true,
"manageable": true,
"assigned_to": {
"href": "/devices/98e22032-579e-4c04-bb12-05cc6a3864c8"
},
"network": "2604:1380:2:9800::",
"address": "2604:1380:2:9800::1",
"gateway": "2604:1380:2:9800::",
"href": "/ips/f7d0e65c-eb3b-42bd-af9b-ad3a736d8d43"
},
{
"id": "a3d00b4e-d74f-4ac2-8bc9-91065d815b41",
"address_family": 4,
"netmask": "255.255.255.254",
"created_at": "2017-01-03T09:47:59Z",
"public": false,
"cidr": 31,
"management": true,
"manageable": true,
"assigned_to": {
"href": "/devices/98e22032-579e-4c04-bb12-05cc6a3864c8"
},
"network": "10.99.214.0",
"address": "10.99.214.1",
"gateway": "10.99.214.0",
"href": "/ips/a3d00b4e-d74f-4ac2-8bc9-91065d815b41"
}
],
"provisioning_events": [
{
"id": "bd62123b-afed-4e54-b1b9-89e219ba9cf0",
"type": "provisioning.101",
"body": "Provisioning started",
"created_at": "2017-01-03T09:47:59Z",
"relationships": [
{
"href": "#81909921-255e-413c-883a-c58d14c801ae"
}
],
"interpolated": "Provisioning started",
"href": "/events/bd62123b-afed-4e54-b1b9-89e219ba9cf0"
},
{
"id": "14b4a9e6-be90-40ee-be48-b272f855e39c",
"type": "provisioning.102",
"body": "Network configured with addresses 147.75.106.81, 2604:1380:2:9800::1, and 10.99.214.1",
"created_at": "2017-01-03T09:48:46Z",
"relationships": [
{
"href": "#28588657-b8bf-44a1-98d3-27f8e04b660a"
}
],
"interpolated": "Network configured with addresses 147.75.106.81, 2604:1380:2:9800::1, and 10.99.214.1",
"href": "/events/14b4a9e6-be90-40ee-be48-b272f855e39c"
},
{
"id": "57e3cadb-f9aa-4c73-be54-3c83e6cf462e",
"type": "provisioning.103",
"body": "Configuration written, restarting device",
"created_at": "2017-01-03T09:48:57Z",
"relationships": [
{
"href": "#25a7e807-f4aa-4f36-83cd-8347baeb26bc"
}
],
"interpolated": "Configuration written, restarting device",
"href": "/events/57e3cadb-f9aa-4c73-be54-3c83e6cf462e"
},
{
"id": "b8322996-f57e-4c87-96cc-a16f33a0c305",
"type": "provisioning.104",
"body": "Connected to magic install system",
"created_at": "2017-01-03T09:50:13Z",
"relationships": [
{
"href": "#a4825d20-f7f2-426a-88db-38696bd3dfd6"
}
],
"interpolated": "Connected to magic install system",
"href": "/events/b8322996-f57e-4c87-96cc-a16f33a0c305"
},
{
"id": "f00a00a9-7c59-420d-bdcf-2c0993303cf6",
"type": "provisioning.105",
"body": "Server partitions created",
"created_at": "2017-01-03T09:50:13Z",
"relationships": [
{
"href": "#6140659b-5e3d-4686-be8f-8879b6d3e27f"
}
],
"interpolated": "Server partitions created",
"href": "/events/f00a00a9-7c59-420d-bdcf-2c0993303cf6"
},
{
"id": null,
"type": "provisioning.106",
"body": "Operating system packages installed",
"created_at": null,
"relationships": [],
"interpolated": "Operating system packages installed"
},
{
"id": null,
"type": "provisioning.107",
"body": "Server networking interfaces configured",
"created_at": null,
"relationships": [],
"interpolated": "Server networking interfaces configured"
},
{
"id": null,
"type": "provisioning.108",
"body": "Cloud-init packages installed and configured",
"created_at": null,
"relationships": [],
"interpolated": "Cloud-init packages installed and configured"
},
{
"id": null,
"type": "provisioning.109",
"body": "Installation finished, rebooting server",
"created_at": null,
"relationships": [],
"interpolated": "Installation finished, rebooting server"
},
{
"id": null,
"type": "provisioning.109",
"body": "Installation finished, rebooting server",
"created_at": null,
"relationships": [],
"interpolated": "Installation finished, rebooting server"
}
],
"plan": {
"id": "e69c0169-4726-46ea-98f1-939c9e8a3607",
"slug": "baremetal_0",
"name": "Type 0",
"description": "Our Type 0 configuration is a general use \"cloud killer\" server, with a Intel Atom 2.4Ghz processor and 8GB of RAM.",
"line": "baremetal",
"specs": {
"cpus": [
{
"count": 1,
"type": "Intel Atom C2550 @ 2.4Ghz"
}
],
"memory": {
"total": "8GB"
},
"drives": [
{
"count": 1,
"size": "80GB",
"type": "SSD"
}
],
"nics": [
{
"count": 2,
"type": "1Gbps"
}
],
"features": {
"raid": false,
"txt": true
}
},
"available_in": [
{
"href": "/facilities/2b70eb8f-fa18-47c0-aba7-222a842362fd"
},
{
"href": "/facilities/8e6470b3-b75e-47d1-bb93-45b225750975"
},
{
"href": "/facilities/8ea03255-89f9-4e62-9d3f-8817db82ceed"
},
{
"href": "/facilities/e1e9c52e-a0bc-4117-b996-0fc94843ea09"
}
],
"pricing": {
"hour": 0.05
}
},
"userdata": "",
"root_password": ",q4*a8(eny",
"href": "/devices/98e22032-579e-4c04-bb12-05cc6a3864c8"
}

View File

@ -0,0 +1,910 @@
{
"devices": [
{
"id": "5bd27259-8b71-48f7-879d-c4e695cb2f31",
"short_id": "5bd27259",
"hostname": "andrea-device-livetest",
"description": null,
"state": "active",
"tags": [],
"billing_cycle": "hourly",
"user": "root",
"iqn": "iqn.2017-01.net.packet:device.5bd27259",
"locked": false,
"bonding_mode": 5,
"created_at": "2017-01-18T17:12:29Z",
"updated_at": "2017-01-18T17:16:29Z",
"operating_system": {
"id": "1b9b78e3-de68-466e-ba00-f2123e89c112",
"slug": "ubuntu_16_04",
"name": "Ubuntu 16.04 LTS",
"distro": "ubuntu",
"version": "16.04",
"provisionable_on": [
"baremetal_0",
"baremetal_1",
"baremetal_2",
"baremetal_2a",
"baremetal_3",
"baremetal_hua"
]
},
"facility": {
"id": "e1e9c52e-a0bc-4117-b996-0fc94843ea09",
"name": "Parsippany, NJ",
"code": "ewr1",
"features": [
"baremetal",
"storage"
],
"address": null
},
"project": {
"href": "/projects/93907f48-adfe-43ed-ad89-0e6e83721a54"
},
"ssh_keys": [
{
"href": "/ssh-keys/a3d8bebe-574f-427d-80ee-bc2ba17f7074"
},
{
"href": "/ssh-keys/a8d6cc17-7d9d-4fb9-8190-afdb301b67df"
},
{
"href": "/ssh-keys/084a5dec-30be-415a-8937-9c615932e459"
},
{
"href": "/ssh-keys/eacfb002-45e1-4047-a0d5-cd9d8bab19ed"
},
{
"href": "/ssh-keys/f82b69d7-8c7e-4a38-9283-ecdbcaba56aa"
},
{
"href": "/ssh-keys/cf9db551-ec79-4c16-a776-97cdbcb3cec4"
}
],
"project_lite": {
"href": "/projects/93907f48-adfe-43ed-ad89-0e6e83721a54"
},
"volumes": [],
"ip_addresses": [
{
"id": "cbff502b-12ca-4986-b683-2cb4e119ae40",
"address_family": 4,
"netmask": "255.255.255.254",
"created_at": "2017-01-18T17:12:30Z",
"public": true,
"cidr": 31,
"management": true,
"manageable": true,
"enabled": true,
"assigned_to": {
"href": "/devices/5bd27259-8b71-48f7-879d-c4e695cb2f31"
},
"network": "147.75.197.54",
"address": "147.75.197.55",
"gateway": "147.75.197.54",
"href": "/ips/cbff502b-12ca-4986-b683-2cb4e119ae40"
},
{
"id": "d5cec621-18c1-4e02-8f71-8dd46370c3e5",
"address_family": 6,
"netmask": "ffff:ffff:ffff:ffff:ffff:ffff:ffff:fffe",
"created_at": "2017-01-18T17:12:30Z",
"public": true,
"cidr": 127,
"management": true,
"manageable": true,
"enabled": true,
"assigned_to": {
"href": "/devices/5bd27259-8b71-48f7-879d-c4e695cb2f31"
},
"network": "2604:1380:2:9800::",
"address": "2604:1380:2:9800::1",
"gateway": "2604:1380:2:9800::",
"href": "/ips/d5cec621-18c1-4e02-8f71-8dd46370c3e5"
},
{
"id": "6d206311-1f88-454d-9cf2-afca79f51fa3",
"address_family": 4,
"netmask": "255.255.255.254",
"created_at": "2017-01-18T17:12:30Z",
"public": false,
"cidr": 31,
"management": true,
"manageable": true,
"enabled": true,
"assigned_to": {
"href": "/devices/5bd27259-8b71-48f7-879d-c4e695cb2f31"
},
"network": "10.99.214.0",
"address": "10.99.214.1",
"gateway": "10.99.214.0",
"href": "/ips/6d206311-1f88-454d-9cf2-afca79f51fa3"
}
],
"plan": {
"id": "e69c0169-4726-46ea-98f1-939c9e8a3607",
"slug": "baremetal_0",
"name": "Type 0",
"description": "Our Type 0 configuration is a general use \"cloud killer\" server, with a Intel Atom 2.4Ghz processor and 8GB of RAM.",
"line": "baremetal",
"specs": {
"cpus": [
{
"count": 1,
"type": "Intel Atom C2550 @ 2.4Ghz"
}
],
"memory": {
"total": "8GB"
},
"drives": [
{
"count": 1,
"size": "80GB",
"type": "SSD"
}
],
"nics": [
{
"count": 2,
"type": "1Gbps"
}
],
"features": {
"raid": false,
"txt": true
}
},
"available_in": [
{
"href": "/facilities/2b70eb8f-fa18-47c0-aba7-222a842362fd"
},
{
"href": "/facilities/8e6470b3-b75e-47d1-bb93-45b225750975"
},
{
"href": "/facilities/8ea03255-89f9-4e62-9d3f-8817db82ceed"
},
{
"href": "/facilities/e1e9c52e-a0bc-4117-b996-0fc94843ea09"
}
],
"pricing": {
"hour": 0.05
}
},
"userdata": "",
"root_password": "soaz0#a=cd",
"href": "/devices/5bd27259-8b71-48f7-879d-c4e695cb2f31"
},
{
"id": "5bd27259-8b71-48f7-879d-c4e695cb2f32",
"short_id": "5bd27259",
"hostname": "andrea-device-livetest",
"description": null,
"state": "active",
"tags": [],
"billing_cycle": "hourly",
"user": "root",
"iqn": "iqn.2017-01.net.packet:device.5bd27259",
"locked": false,
"bonding_mode": 5,
"created_at": "2017-01-18T17:12:29Z",
"updated_at": "2017-01-18T17:16:29Z",
"operating_system": {
"id": "1b9b78e3-de68-466e-ba00-f2123e89c112",
"slug": "ubuntu_16_04",
"name": "Ubuntu 16.04 LTS",
"distro": "ubuntu",
"version": "16.04",
"provisionable_on": [
"baremetal_0",
"baremetal_1",
"baremetal_2",
"baremetal_2a",
"baremetal_3",
"baremetal_hua"
]
},
"facility": {
"id": "e1e9c52e-a0bc-4117-b996-0fc94843ea09",
"name": "Parsippany, NJ",
"code": "ewr1",
"features": [
"baremetal",
"storage"
],
"address": null
},
"project": {
"href": "/projects/93907f48-adfe-43ed-ad89-0e6e83721a54"
},
"ssh_keys": [
{
"href": "/ssh-keys/a3d8bebe-574f-427d-80ee-bc2ba17f7074"
},
{
"href": "/ssh-keys/a8d6cc17-7d9d-4fb9-8190-afdb301b67df"
},
{
"href": "/ssh-keys/084a5dec-30be-415a-8937-9c615932e459"
},
{
"href": "/ssh-keys/eacfb002-45e1-4047-a0d5-cd9d8bab19ed"
},
{
"href": "/ssh-keys/f82b69d7-8c7e-4a38-9283-ecdbcaba56aa"
},
{
"href": "/ssh-keys/cf9db551-ec79-4c16-a776-97cdbcb3cec4"
}
],
"project_lite": {
"href": "/projects/93907f48-adfe-43ed-ad89-0e6e83721a54"
},
"volumes": [],
"ip_addresses": [
{
"id": "cbff502b-12ca-4986-b683-2cb4e119ae40",
"address_family": 4,
"netmask": "255.255.255.254",
"created_at": "2017-01-18T17:12:30Z",
"public": true,
"cidr": 31,
"management": true,
"manageable": true,
"enabled": true,
"assigned_to": {
"href": "/devices/5bd27259-8b71-48f7-879d-c4e695cb2f31"
},
"network": "147.75.197.54",
"address": "147.75.197.55",
"gateway": "147.75.197.54",
"href": "/ips/cbff502b-12ca-4986-b683-2cb4e119ae40"
},
{
"id": "d5cec621-18c1-4e02-8f71-8dd46370c3e5",
"address_family": 6,
"netmask": "ffff:ffff:ffff:ffff:ffff:ffff:ffff:fffe",
"created_at": "2017-01-18T17:12:30Z",
"public": true,
"cidr": 127,
"management": true,
"manageable": true,
"enabled": true,
"assigned_to": {
"href": "/devices/5bd27259-8b71-48f7-879d-c4e695cb2f31"
},
"network": "2604:1380:2:9800::",
"address": "2604:1380:2:9800::1",
"gateway": "2604:1380:2:9800::",
"href": "/ips/d5cec621-18c1-4e02-8f71-8dd46370c3e5"
},
{
"id": "6d206311-1f88-454d-9cf2-afca79f51fa3",
"address_family": 4,
"netmask": "255.255.255.254",
"created_at": "2017-01-18T17:12:30Z",
"public": false,
"cidr": 31,
"management": true,
"manageable": true,
"enabled": true,
"assigned_to": {
"href": "/devices/5bd27259-8b71-48f7-879d-c4e695cb2f31"
},
"network": "10.99.214.0",
"address": "10.99.214.1",
"gateway": "10.99.214.0",
"href": "/ips/6d206311-1f88-454d-9cf2-afca79f51fa3"
}
],
"plan": {
"id": "e69c0169-4726-46ea-98f1-939c9e8a3607",
"slug": "baremetal_0",
"name": "Type 0",
"description": "Our Type 0 configuration is a general use \"cloud killer\" server, with a Intel Atom 2.4Ghz processor and 8GB of RAM.",
"line": "baremetal",
"specs": {
"cpus": [
{
"count": 1,
"type": "Intel Atom C2550 @ 2.4Ghz"
}
],
"memory": {
"total": "8GB"
},
"drives": [
{
"count": 1,
"size": "80GB",
"type": "SSD"
}
],
"nics": [
{
"count": 2,
"type": "1Gbps"
}
],
"features": {
"raid": false,
"txt": true
}
},
"available_in": [
{
"href": "/facilities/2b70eb8f-fa18-47c0-aba7-222a842362fd"
},
{
"href": "/facilities/8e6470b3-b75e-47d1-bb93-45b225750975"
},
{
"href": "/facilities/8ea03255-89f9-4e62-9d3f-8817db82ceed"
},
{
"href": "/facilities/e1e9c52e-a0bc-4117-b996-0fc94843ea09"
}
],
"pricing": {
"hour": 0.05
}
},
"userdata": "",
"root_password": "soaz0#a=cd",
"href": "/devices/5bd27259-8b71-48f7-879d-c4e695cb2f31"
},
{
"id": "5bd27259-8b71-48f7-879d-c4e695cb2f33",
"short_id": "5bd27259",
"hostname": "andrea-device-livetest",
"description": null,
"state": "active",
"tags": [],
"billing_cycle": "hourly",
"user": "root",
"iqn": "iqn.2017-01.net.packet:device.5bd27259",
"locked": false,
"bonding_mode": 5,
"created_at": "2017-01-18T17:12:29Z",
"updated_at": "2017-01-18T17:16:29Z",
"operating_system": {
"id": "1b9b78e3-de68-466e-ba00-f2123e89c112",
"slug": "ubuntu_16_04",
"name": "Ubuntu 16.04 LTS",
"distro": "ubuntu",
"version": "16.04",
"provisionable_on": [
"baremetal_0",
"baremetal_1",
"baremetal_2",
"baremetal_2a",
"baremetal_3",
"baremetal_hua"
]
},
"facility": {
"id": "e1e9c52e-a0bc-4117-b996-0fc94843ea09",
"name": "Parsippany, NJ",
"code": "ewr1",
"features": [
"baremetal",
"storage"
],
"address": null
},
"project": {
"href": "/projects/93907f48-adfe-43ed-ad89-0e6e83721a54"
},
"ssh_keys": [
{
"href": "/ssh-keys/a3d8bebe-574f-427d-80ee-bc2ba17f7074"
},
{
"href": "/ssh-keys/a8d6cc17-7d9d-4fb9-8190-afdb301b67df"
},
{
"href": "/ssh-keys/084a5dec-30be-415a-8937-9c615932e459"
},
{
"href": "/ssh-keys/eacfb002-45e1-4047-a0d5-cd9d8bab19ed"
},
{
"href": "/ssh-keys/f82b69d7-8c7e-4a38-9283-ecdbcaba56aa"
},
{
"href": "/ssh-keys/cf9db551-ec79-4c16-a776-97cdbcb3cec4"
}
],
"project_lite": {
"href": "/projects/93907f48-adfe-43ed-ad89-0e6e83721a54"
},
"volumes": [],
"ip_addresses": [
{
"id": "cbff502b-12ca-4986-b683-2cb4e119ae40",
"address_family": 4,
"netmask": "255.255.255.254",
"created_at": "2017-01-18T17:12:30Z",
"public": true,
"cidr": 31,
"management": true,
"manageable": true,
"enabled": true,
"assigned_to": {
"href": "/devices/5bd27259-8b71-48f7-879d-c4e695cb2f31"
},
"network": "147.75.197.54",
"address": "147.75.197.55",
"gateway": "147.75.197.54",
"href": "/ips/cbff502b-12ca-4986-b683-2cb4e119ae40"
},
{
"id": "d5cec621-18c1-4e02-8f71-8dd46370c3e5",
"address_family": 6,
"netmask": "ffff:ffff:ffff:ffff:ffff:ffff:ffff:fffe",
"created_at": "2017-01-18T17:12:30Z",
"public": true,
"cidr": 127,
"management": true,
"manageable": true,
"enabled": true,
"assigned_to": {
"href": "/devices/5bd27259-8b71-48f7-879d-c4e695cb2f31"
},
"network": "2604:1380:2:9800::",
"address": "2604:1380:2:9800::1",
"gateway": "2604:1380:2:9800::",
"href": "/ips/d5cec621-18c1-4e02-8f71-8dd46370c3e5"
},
{
"id": "6d206311-1f88-454d-9cf2-afca79f51fa3",
"address_family": 4,
"netmask": "255.255.255.254",
"created_at": "2017-01-18T17:12:30Z",
"public": false,
"cidr": 31,
"management": true,
"manageable": true,
"enabled": true,
"assigned_to": {
"href": "/devices/5bd27259-8b71-48f7-879d-c4e695cb2f31"
},
"network": "10.99.214.0",
"address": "10.99.214.1",
"gateway": "10.99.214.0",
"href": "/ips/6d206311-1f88-454d-9cf2-afca79f51fa3"
}
],
"plan": {
"id": "e69c0169-4726-46ea-98f1-939c9e8a3607",
"slug": "baremetal_0",
"name": "Type 0",
"description": "Our Type 0 configuration is a general use \"cloud killer\" server, with a Intel Atom 2.4Ghz processor and 8GB of RAM.",
"line": "baremetal",
"specs": {
"cpus": [
{
"count": 1,
"type": "Intel Atom C2550 @ 2.4Ghz"
}
],
"memory": {
"total": "8GB"
},
"drives": [
{
"count": 1,
"size": "80GB",
"type": "SSD"
}
],
"nics": [
{
"count": 2,
"type": "1Gbps"
}
],
"features": {
"raid": false,
"txt": true
}
},
"available_in": [
{
"href": "/facilities/2b70eb8f-fa18-47c0-aba7-222a842362fd"
},
{
"href": "/facilities/8e6470b3-b75e-47d1-bb93-45b225750975"
},
{
"href": "/facilities/8ea03255-89f9-4e62-9d3f-8817db82ceed"
},
{
"href": "/facilities/e1e9c52e-a0bc-4117-b996-0fc94843ea09"
}
],
"pricing": {
"hour": 0.05
}
},
"userdata": "",
"root_password": "soaz0#a=cd",
"href": "/devices/5bd27259-8b71-48f7-879d-c4e695cb2f31"
},
{
"id": "5bd27259-8b71-48f7-879d-c4e695cb2f34",
"short_id": "5bd27259",
"hostname": "andrea-device-livetest",
"description": null,
"state": "active",
"tags": [],
"billing_cycle": "hourly",
"user": "root",
"iqn": "iqn.2017-01.net.packet:device.5bd27259",
"locked": false,
"bonding_mode": 5,
"created_at": "2017-01-18T17:12:29Z",
"updated_at": "2017-01-18T17:16:29Z",
"operating_system": {
"id": "1b9b78e3-de68-466e-ba00-f2123e89c112",
"slug": "ubuntu_16_04",
"name": "Ubuntu 16.04 LTS",
"distro": "ubuntu",
"version": "16.04",
"provisionable_on": [
"baremetal_0",
"baremetal_1",
"baremetal_2",
"baremetal_2a",
"baremetal_3",
"baremetal_hua"
]
},
"facility": {
"id": "e1e9c52e-a0bc-4117-b996-0fc94843ea09",
"name": "Parsippany, NJ",
"code": "ewr1",
"features": [
"baremetal",
"storage"
],
"address": null
},
"project": {
"href": "/projects/93907f48-adfe-43ed-ad89-0e6e83721a54"
},
"ssh_keys": [
{
"href": "/ssh-keys/a3d8bebe-574f-427d-80ee-bc2ba17f7074"
},
{
"href": "/ssh-keys/a8d6cc17-7d9d-4fb9-8190-afdb301b67df"
},
{
"href": "/ssh-keys/084a5dec-30be-415a-8937-9c615932e459"
},
{
"href": "/ssh-keys/eacfb002-45e1-4047-a0d5-cd9d8bab19ed"
},
{
"href": "/ssh-keys/f82b69d7-8c7e-4a38-9283-ecdbcaba56aa"
},
{
"href": "/ssh-keys/cf9db551-ec79-4c16-a776-97cdbcb3cec4"
}
],
"project_lite": {
"href": "/projects/93907f48-adfe-43ed-ad89-0e6e83721a54"
},
"volumes": [],
"ip_addresses": [
{
"id": "cbff502b-12ca-4986-b683-2cb4e119ae40",
"address_family": 4,
"netmask": "255.255.255.254",
"created_at": "2017-01-18T17:12:30Z",
"public": true,
"cidr": 31,
"management": true,
"manageable": true,
"enabled": true,
"assigned_to": {
"href": "/devices/5bd27259-8b71-48f7-879d-c4e695cb2f31"
},
"network": "147.75.197.54",
"address": "147.75.197.55",
"gateway": "147.75.197.54",
"href": "/ips/cbff502b-12ca-4986-b683-2cb4e119ae40"
},
{
"id": "d5cec621-18c1-4e02-8f71-8dd46370c3e5",
"address_family": 6,
"netmask": "ffff:ffff:ffff:ffff:ffff:ffff:ffff:fffe",
"created_at": "2017-01-18T17:12:30Z",
"public": true,
"cidr": 127,
"management": true,
"manageable": true,
"enabled": true,
"assigned_to": {
"href": "/devices/5bd27259-8b71-48f7-879d-c4e695cb2f31"
},
"network": "2604:1380:2:9800::",
"address": "2604:1380:2:9800::1",
"gateway": "2604:1380:2:9800::",
"href": "/ips/d5cec621-18c1-4e02-8f71-8dd46370c3e5"
},
{
"id": "6d206311-1f88-454d-9cf2-afca79f51fa3",
"address_family": 4,
"netmask": "255.255.255.254",
"created_at": "2017-01-18T17:12:30Z",
"public": false,
"cidr": 31,
"management": true,
"manageable": true,
"enabled": true,
"assigned_to": {
"href": "/devices/5bd27259-8b71-48f7-879d-c4e695cb2f31"
},
"network": "10.99.214.0",
"address": "10.99.214.1",
"gateway": "10.99.214.0",
"href": "/ips/6d206311-1f88-454d-9cf2-afca79f51fa3"
}
],
"plan": {
"id": "e69c0169-4726-46ea-98f1-939c9e8a3607",
"slug": "baremetal_0",
"name": "Type 0",
"description": "Our Type 0 configuration is a general use \"cloud killer\" server, with a Intel Atom 2.4Ghz processor and 8GB of RAM.",
"line": "baremetal",
"specs": {
"cpus": [
{
"count": 1,
"type": "Intel Atom C2550 @ 2.4Ghz"
}
],
"memory": {
"total": "8GB"
},
"drives": [
{
"count": 1,
"size": "80GB",
"type": "SSD"
}
],
"nics": [
{
"count": 2,
"type": "1Gbps"
}
],
"features": {
"raid": false,
"txt": true
}
},
"available_in": [
{
"href": "/facilities/2b70eb8f-fa18-47c0-aba7-222a842362fd"
},
{
"href": "/facilities/8e6470b3-b75e-47d1-bb93-45b225750975"
},
{
"href": "/facilities/8ea03255-89f9-4e62-9d3f-8817db82ceed"
},
{
"href": "/facilities/e1e9c52e-a0bc-4117-b996-0fc94843ea09"
}
],
"pricing": {
"hour": 0.05
}
},
"userdata": "",
"root_password": "soaz0#a=cd",
"href": "/devices/5bd27259-8b71-48f7-879d-c4e695cb2f31"
},
{
"id": "5bd27259-8b71-48f7-879d-c4e695cb2f35",
"short_id": "5bd27259",
"hostname": "andrea-device-livetest",
"description": null,
"state": "active",
"tags": [],
"billing_cycle": "hourly",
"user": "root",
"iqn": "iqn.2017-01.net.packet:device.5bd27259",
"locked": false,
"bonding_mode": 5,
"created_at": "2017-01-18T17:12:29Z",
"updated_at": "2017-01-18T17:16:29Z",
"operating_system": {
"id": "1b9b78e3-de68-466e-ba00-f2123e89c112",
"slug": "ubuntu_16_04",
"name": "Ubuntu 16.04 LTS",
"distro": "ubuntu",
"version": "16.04",
"provisionable_on": [
"baremetal_0",
"baremetal_1",
"baremetal_2",
"baremetal_2a",
"baremetal_3",
"baremetal_hua"
]
},
"facility": {
"id": "e1e9c52e-a0bc-4117-b996-0fc94843ea09",
"name": "Parsippany, NJ",
"code": "ewr1",
"features": [
"baremetal",
"storage"
],
"address": null
},
"project": {
"href": "/projects/93907f48-adfe-43ed-ad89-0e6e83721a54"
},
"ssh_keys": [
{
"href": "/ssh-keys/a3d8bebe-574f-427d-80ee-bc2ba17f7074"
},
{
"href": "/ssh-keys/a8d6cc17-7d9d-4fb9-8190-afdb301b67df"
},
{
"href": "/ssh-keys/084a5dec-30be-415a-8937-9c615932e459"
},
{
"href": "/ssh-keys/eacfb002-45e1-4047-a0d5-cd9d8bab19ed"
},
{
"href": "/ssh-keys/f82b69d7-8c7e-4a38-9283-ecdbcaba56aa"
},
{
"href": "/ssh-keys/cf9db551-ec79-4c16-a776-97cdbcb3cec4"
}
],
"project_lite": {
"href": "/projects/93907f48-adfe-43ed-ad89-0e6e83721a54"
},
"volumes": [],
"ip_addresses": [
{
"id": "cbff502b-12ca-4986-b683-2cb4e119ae40",
"address_family": 4,
"netmask": "255.255.255.254",
"created_at": "2017-01-18T17:12:30Z",
"public": true,
"cidr": 31,
"management": true,
"manageable": true,
"enabled": true,
"assigned_to": {
"href": "/devices/5bd27259-8b71-48f7-879d-c4e695cb2f31"
},
"network": "147.75.197.54",
"address": "147.75.197.55",
"gateway": "147.75.197.54",
"href": "/ips/cbff502b-12ca-4986-b683-2cb4e119ae40"
},
{
"id": "d5cec621-18c1-4e02-8f71-8dd46370c3e5",
"address_family": 6,
"netmask": "ffff:ffff:ffff:ffff:ffff:ffff:ffff:fffe",
"created_at": "2017-01-18T17:12:30Z",
"public": true,
"cidr": 127,
"management": true,
"manageable": true,
"enabled": true,
"assigned_to": {
"href": "/devices/5bd27259-8b71-48f7-879d-c4e695cb2f31"
},
"network": "2604:1380:2:9800::",
"address": "2604:1380:2:9800::1",
"gateway": "2604:1380:2:9800::",
"href": "/ips/d5cec621-18c1-4e02-8f71-8dd46370c3e5"
},
{
"id": "6d206311-1f88-454d-9cf2-afca79f51fa3",
"address_family": 4,
"netmask": "255.255.255.254",
"created_at": "2017-01-18T17:12:30Z",
"public": false,
"cidr": 31,
"management": true,
"manageable": true,
"enabled": true,
"assigned_to": {
"href": "/devices/5bd27259-8b71-48f7-879d-c4e695cb2f31"
},
"network": "10.99.214.0",
"address": "10.99.214.1",
"gateway": "10.99.214.0",
"href": "/ips/6d206311-1f88-454d-9cf2-afca79f51fa3"
}
],
"plan": {
"id": "e69c0169-4726-46ea-98f1-939c9e8a3607",
"slug": "baremetal_0",
"name": "Type 0",
"description": "Our Type 0 configuration is a general use \"cloud killer\" server, with a Intel Atom 2.4Ghz processor and 8GB of RAM.",
"line": "baremetal",
"specs": {
"cpus": [
{
"count": 1,
"type": "Intel Atom C2550 @ 2.4Ghz"
}
],
"memory": {
"total": "8GB"
},
"drives": [
{
"count": 1,
"size": "80GB",
"type": "SSD"
}
],
"nics": [
{
"count": 2,
"type": "1Gbps"
}
],
"features": {
"raid": false,
"txt": true
}
},
"available_in": [
{
"href": "/facilities/2b70eb8f-fa18-47c0-aba7-222a842362fd"
},
{
"href": "/facilities/8e6470b3-b75e-47d1-bb93-45b225750975"
},
{
"href": "/facilities/8ea03255-89f9-4e62-9d3f-8817db82ceed"
},
{
"href": "/facilities/e1e9c52e-a0bc-4117-b996-0fc94843ea09"
}
],
"pricing": {
"hour": 0.05
}
},
"userdata": "",
"root_password": "soaz0#a=cd",
"href": "/devices/5bd27259-8b71-48f7-879d-c4e695cb2f31"
}
],
"meta": {
"first": {
"href": "/projects/93907f48-adfe-43ed-ad89-0e6e83721a54/devices?page=1"
},
"previous": null,
"self": {
"href": "/projects/93907f48-adfe-43ed-ad89-0e6e83721a54/devices?page=1"
},
"next": {
"href": "/projects/93907f48-adfe-43ed-ad89-0e6e83721a54/devices?page=2"
},
"last": {
"href": "/projects/93907f48-adfe-43ed-ad89-0e6e83721a54/devices?page=2"
},
"total": 7
}
}

View File

@ -0,0 +1,376 @@
{
"devices": [
{
"id": "5bd27259-8b71-48f7-879d-c4e695cb2f36",
"short_id": "5bd27259",
"hostname": "andrea-device-livetest",
"description": null,
"state": "active",
"tags": [],
"billing_cycle": "hourly",
"user": "root",
"iqn": "iqn.2017-01.net.packet:device.5bd27259",
"locked": false,
"bonding_mode": 5,
"created_at": "2017-01-18T17:12:29Z",
"updated_at": "2017-01-18T17:16:29Z",
"operating_system": {
"id": "1b9b78e3-de68-466e-ba00-f2123e89c112",
"slug": "ubuntu_16_04",
"name": "Ubuntu 16.04 LTS",
"distro": "ubuntu",
"version": "16.04",
"provisionable_on": [
"baremetal_0",
"baremetal_1",
"baremetal_2",
"baremetal_2a",
"baremetal_3",
"baremetal_hua"
]
},
"facility": {
"id": "e1e9c52e-a0bc-4117-b996-0fc94843ea09",
"name": "Parsippany, NJ",
"code": "ewr1",
"features": [
"baremetal",
"storage"
],
"address": null
},
"project": {
"href": "/projects/93907f48-adfe-43ed-ad89-0e6e83721a54"
},
"ssh_keys": [
{
"href": "/ssh-keys/a3d8bebe-574f-427d-80ee-bc2ba17f7074"
},
{
"href": "/ssh-keys/a8d6cc17-7d9d-4fb9-8190-afdb301b67df"
},
{
"href": "/ssh-keys/084a5dec-30be-415a-8937-9c615932e459"
},
{
"href": "/ssh-keys/eacfb002-45e1-4047-a0d5-cd9d8bab19ed"
},
{
"href": "/ssh-keys/f82b69d7-8c7e-4a38-9283-ecdbcaba56aa"
},
{
"href": "/ssh-keys/cf9db551-ec79-4c16-a776-97cdbcb3cec4"
}
],
"project_lite": {
"href": "/projects/93907f48-adfe-43ed-ad89-0e6e83721a54"
},
"volumes": [],
"ip_addresses": [
{
"id": "cbff502b-12ca-4986-b683-2cb4e119ae40",
"address_family": 4,
"netmask": "255.255.255.254",
"created_at": "2017-01-18T17:12:30Z",
"public": true,
"cidr": 31,
"management": true,
"manageable": true,
"enabled": true,
"assigned_to": {
"href": "/devices/5bd27259-8b71-48f7-879d-c4e695cb2f31"
},
"network": "147.75.197.54",
"address": "147.75.197.55",
"gateway": "147.75.197.54",
"href": "/ips/cbff502b-12ca-4986-b683-2cb4e119ae40"
},
{
"id": "d5cec621-18c1-4e02-8f71-8dd46370c3e5",
"address_family": 6,
"netmask": "ffff:ffff:ffff:ffff:ffff:ffff:ffff:fffe",
"created_at": "2017-01-18T17:12:30Z",
"public": true,
"cidr": 127,
"management": true,
"manageable": true,
"enabled": true,
"assigned_to": {
"href": "/devices/5bd27259-8b71-48f7-879d-c4e695cb2f31"
},
"network": "2604:1380:2:9800::",
"address": "2604:1380:2:9800::1",
"gateway": "2604:1380:2:9800::",
"href": "/ips/d5cec621-18c1-4e02-8f71-8dd46370c3e5"
},
{
"id": "6d206311-1f88-454d-9cf2-afca79f51fa3",
"address_family": 4,
"netmask": "255.255.255.254",
"created_at": "2017-01-18T17:12:30Z",
"public": false,
"cidr": 31,
"management": true,
"manageable": true,
"enabled": true,
"assigned_to": {
"href": "/devices/5bd27259-8b71-48f7-879d-c4e695cb2f31"
},
"network": "10.99.214.0",
"address": "10.99.214.1",
"gateway": "10.99.214.0",
"href": "/ips/6d206311-1f88-454d-9cf2-afca79f51fa3"
}
],
"plan": {
"id": "e69c0169-4726-46ea-98f1-939c9e8a3607",
"slug": "baremetal_0",
"name": "Type 0",
"description": "Our Type 0 configuration is a general use \"cloud killer\" server, with a Intel Atom 2.4Ghz processor and 8GB of RAM.",
"line": "baremetal",
"specs": {
"cpus": [
{
"count": 1,
"type": "Intel Atom C2550 @ 2.4Ghz"
}
],
"memory": {
"total": "8GB"
},
"drives": [
{
"count": 1,
"size": "80GB",
"type": "SSD"
}
],
"nics": [
{
"count": 2,
"type": "1Gbps"
}
],
"features": {
"raid": false,
"txt": true
}
},
"available_in": [
{
"href": "/facilities/2b70eb8f-fa18-47c0-aba7-222a842362fd"
},
{
"href": "/facilities/8e6470b3-b75e-47d1-bb93-45b225750975"
},
{
"href": "/facilities/8ea03255-89f9-4e62-9d3f-8817db82ceed"
},
{
"href": "/facilities/e1e9c52e-a0bc-4117-b996-0fc94843ea09"
}
],
"pricing": {
"hour": 0.05
}
},
"userdata": "",
"root_password": "soaz0#a=cd",
"href": "/devices/5bd27259-8b71-48f7-879d-c4e695cb2f31"
},
{
"id": "5bd27259-8b71-48f7-879d-c4e695cb2f37",
"short_id": "5bd27259",
"hostname": "andrea-device-livetest",
"description": null,
"state": "active",
"tags": [],
"billing_cycle": "hourly",
"user": "root",
"iqn": "iqn.2017-01.net.packet:device.5bd27259",
"locked": false,
"bonding_mode": 5,
"created_at": "2017-01-18T17:12:29Z",
"updated_at": "2017-01-18T17:16:29Z",
"operating_system": {
"id": "1b9b78e3-de68-466e-ba00-f2123e89c112",
"slug": "ubuntu_16_04",
"name": "Ubuntu 16.04 LTS",
"distro": "ubuntu",
"version": "16.04",
"provisionable_on": [
"baremetal_0",
"baremetal_1",
"baremetal_2",
"baremetal_2a",
"baremetal_3",
"baremetal_hua"
]
},
"facility": {
"id": "e1e9c52e-a0bc-4117-b996-0fc94843ea09",
"name": "Parsippany, NJ",
"code": "ewr1",
"features": [
"baremetal",
"storage"
],
"address": null
},
"project": {
"href": "/projects/93907f48-adfe-43ed-ad89-0e6e83721a54"
},
"ssh_keys": [
{
"href": "/ssh-keys/a3d8bebe-574f-427d-80ee-bc2ba17f7074"
},
{
"href": "/ssh-keys/a8d6cc17-7d9d-4fb9-8190-afdb301b67df"
},
{
"href": "/ssh-keys/084a5dec-30be-415a-8937-9c615932e459"
},
{
"href": "/ssh-keys/eacfb002-45e1-4047-a0d5-cd9d8bab19ed"
},
{
"href": "/ssh-keys/f82b69d7-8c7e-4a38-9283-ecdbcaba56aa"
},
{
"href": "/ssh-keys/cf9db551-ec79-4c16-a776-97cdbcb3cec4"
}
],
"project_lite": {
"href": "/projects/93907f48-adfe-43ed-ad89-0e6e83721a54"
},
"volumes": [],
"ip_addresses": [
{
"id": "cbff502b-12ca-4986-b683-2cb4e119ae40",
"address_family": 4,
"netmask": "255.255.255.254",
"created_at": "2017-01-18T17:12:30Z",
"public": true,
"cidr": 31,
"management": true,
"manageable": true,
"enabled": true,
"assigned_to": {
"href": "/devices/5bd27259-8b71-48f7-879d-c4e695cb2f31"
},
"network": "147.75.197.54",
"address": "147.75.197.55",
"gateway": "147.75.197.54",
"href": "/ips/cbff502b-12ca-4986-b683-2cb4e119ae40"
},
{
"id": "d5cec621-18c1-4e02-8f71-8dd46370c3e5",
"address_family": 6,
"netmask": "ffff:ffff:ffff:ffff:ffff:ffff:ffff:fffe",
"created_at": "2017-01-18T17:12:30Z",
"public": true,
"cidr": 127,
"management": true,
"manageable": true,
"enabled": true,
"assigned_to": {
"href": "/devices/5bd27259-8b71-48f7-879d-c4e695cb2f31"
},
"network": "2604:1380:2:9800::",
"address": "2604:1380:2:9800::1",
"gateway": "2604:1380:2:9800::",
"href": "/ips/d5cec621-18c1-4e02-8f71-8dd46370c3e5"
},
{
"id": "6d206311-1f88-454d-9cf2-afca79f51fa3",
"address_family": 4,
"netmask": "255.255.255.254",
"created_at": "2017-01-18T17:12:30Z",
"public": false,
"cidr": 31,
"management": true,
"manageable": true,
"enabled": true,
"assigned_to": {
"href": "/devices/5bd27259-8b71-48f7-879d-c4e695cb2f31"
},
"network": "10.99.214.0",
"address": "10.99.214.1",
"gateway": "10.99.214.0",
"href": "/ips/6d206311-1f88-454d-9cf2-afca79f51fa3"
}
],
"plan": {
"id": "e69c0169-4726-46ea-98f1-939c9e8a3607",
"slug": "baremetal_0",
"name": "Type 0",
"description": "Our Type 0 configuration is a general use \"cloud killer\" server, with a Intel Atom 2.4Ghz processor and 8GB of RAM.",
"line": "baremetal",
"specs": {
"cpus": [
{
"count": 1,
"type": "Intel Atom C2550 @ 2.4Ghz"
}
],
"memory": {
"total": "8GB"
},
"drives": [
{
"count": 1,
"size": "80GB",
"type": "SSD"
}
],
"nics": [
{
"count": 2,
"type": "1Gbps"
}
],
"features": {
"raid": false,
"txt": true
}
},
"available_in": [
{
"href": "/facilities/2b70eb8f-fa18-47c0-aba7-222a842362fd"
},
{
"href": "/facilities/8e6470b3-b75e-47d1-bb93-45b225750975"
},
{
"href": "/facilities/8ea03255-89f9-4e62-9d3f-8817db82ceed"
},
{
"href": "/facilities/e1e9c52e-a0bc-4117-b996-0fc94843ea09"
}
],
"pricing": {
"hour": 0.05
}
},
"userdata": "",
"root_password": "soaz0#a=cd",
"href": "/devices/5bd27259-8b71-48f7-879d-c4e695cb2f31"
}
],
"meta": {
"first": {
"href": "/projects/93907f48-adfe-43ed-ad89-0e6e83721a54/devices?page=1"
},
"previous": {
"href": "/projects/93907f48-adfe-43ed-ad89-0e6e83721a54/devices?page=1"
},
"self": {
"href": "/projects/93907f48-adfe-43ed-ad89-0e6e83721a54/devices?page=2"
},
"next": null,
"last": {
"href": "/projects/93907f48-adfe-43ed-ad89-0e6e83721a54/devices?page=2"
},
"total": 7
}
}

View File

@ -0,0 +1,282 @@
{
"devices": [
{
"id": "98e22032-579e-4c04-bb12-05cc6a3864c8",
"short_id": "98e22032",
"hostname": "test",
"description": null,
"state": "provisioning",
"tags": [],
"billing_cycle": "hourly",
"user": "root",
"iqn": "iqn.2017-01.net.packet:device.98e22032",
"locked": false,
"bonding_mode": 5,
"created_at": "2017-01-03T09:47:59Z",
"updated_at": "2017-01-03T09:50:13Z",
"provisioning_percentage": 50,
"operating_system": {
"id": "68bad60d-f5a7-45c2-ad09-573edaad3a3c",
"slug": "centos_7",
"name": "Centos 7",
"distro": "centos",
"version": "7",
"provisionable_on": [
"baremetal_0",
"baremetal_1",
"baremetal_2",
"baremetal_3"
]
},
"facility": {
"id": "e1e9c52e-a0bc-4117-b996-0fc94843ea09",
"name": "Parsippany, NJ",
"code": "ewr1",
"features": [
"baremetal",
"storage"
],
"address": null
},
"project": {
"href": "/projects/93907f48-adfe-43ed-ad89-0e6e83721a54"
},
"ssh_keys": [
{
"href": "/ssh-keys/084a5dec-30be-415a-8937-9c615932e459"
},
{
"href": "/ssh-keys/a8d6cc17-7d9d-4fb9-8190-afdb301b67df"
},
{
"href": "/ssh-keys/a3d8bebe-574f-427d-80ee-bc2ba17f7074"
},
{
"href": "/ssh-keys/eacfb002-45e1-4047-a0d5-cd9d8bab19ed"
},
{
"href": "/ssh-keys/bba63e41-b12c-493a-81d4-e52f50f247ed"
}
],
"project_lite": {
"href": "/projects/93907f48-adfe-43ed-ad89-0e6e83721a54"
},
"volumes": [],
"ip_addresses": [
{
"id": "5d0262c7-1727-411c-94c4-9e6f15490dd3",
"address_family": 4,
"netmask": "255.255.255.254",
"created_at": "2017-01-03T09:47:59Z",
"public": true,
"cidr": 31,
"management": true,
"manageable": true,
"assigned_to": {
"href": "/devices/98e22032-579e-4c04-bb12-05cc6a3864c8"
},
"network": "147.75.106.80",
"address": "147.75.106.81",
"gateway": "147.75.106.80",
"href": "/ips/5d0262c7-1727-411c-94c4-9e6f15490dd3"
},
{
"id": "f7d0e65c-eb3b-42bd-af9b-ad3a736d8d43",
"address_family": 6,
"netmask": "ffff:ffff:ffff:ffff:ffff:ffff:ffff:fffe",
"created_at": "2017-01-03T09:47:59Z",
"public": true,
"cidr": 127,
"management": true,
"manageable": true,
"assigned_to": {
"href": "/devices/98e22032-579e-4c04-bb12-05cc6a3864c8"
},
"network": "2604:1380:2:9800::",
"address": "2604:1380:2:9800::1",
"gateway": "2604:1380:2:9800::",
"href": "/ips/f7d0e65c-eb3b-42bd-af9b-ad3a736d8d43"
},
{
"id": "a3d00b4e-d74f-4ac2-8bc9-91065d815b41",
"address_family": 4,
"netmask": "255.255.255.254",
"created_at": "2017-01-03T09:47:59Z",
"public": false,
"cidr": 31,
"management": true,
"manageable": true,
"assigned_to": {
"href": "/devices/98e22032-579e-4c04-bb12-05cc6a3864c8"
},
"network": "10.99.214.0",
"address": "10.99.214.1",
"gateway": "10.99.214.0",
"href": "/ips/a3d00b4e-d74f-4ac2-8bc9-91065d815b41"
}
],
"provisioning_events": [
{
"id": "bd62123b-afed-4e54-b1b9-89e219ba9cf0",
"type": "provisioning.101",
"body": "Provisioning started",
"created_at": "2017-01-03T09:47:59Z",
"relationships": [
{
"href": "#81909921-255e-413c-883a-c58d14c801ae"
}
],
"interpolated": "Provisioning started",
"href": "/events/bd62123b-afed-4e54-b1b9-89e219ba9cf0"
},
{
"id": "14b4a9e6-be90-40ee-be48-b272f855e39c",
"type": "provisioning.102",
"body": "Network configured with addresses 147.75.106.81, 2604:1380:2:9800::1, and 10.99.214.1",
"created_at": "2017-01-03T09:48:46Z",
"relationships": [
{
"href": "#28588657-b8bf-44a1-98d3-27f8e04b660a"
}
],
"interpolated": "Network configured with addresses 147.75.106.81, 2604:1380:2:9800::1, and 10.99.214.1",
"href": "/events/14b4a9e6-be90-40ee-be48-b272f855e39c"
},
{
"id": "57e3cadb-f9aa-4c73-be54-3c83e6cf462e",
"type": "provisioning.103",
"body": "Configuration written, restarting device",
"created_at": "2017-01-03T09:48:57Z",
"relationships": [
{
"href": "#25a7e807-f4aa-4f36-83cd-8347baeb26bc"
}
],
"interpolated": "Configuration written, restarting device",
"href": "/events/57e3cadb-f9aa-4c73-be54-3c83e6cf462e"
},
{
"id": "b8322996-f57e-4c87-96cc-a16f33a0c305",
"type": "provisioning.104",
"body": "Connected to magic install system",
"created_at": "2017-01-03T09:50:13Z",
"relationships": [
{
"href": "#a4825d20-f7f2-426a-88db-38696bd3dfd6"
}
],
"interpolated": "Connected to magic install system",
"href": "/events/b8322996-f57e-4c87-96cc-a16f33a0c305"
},
{
"id": "f00a00a9-7c59-420d-bdcf-2c0993303cf6",
"type": "provisioning.105",
"body": "Server partitions created",
"created_at": "2017-01-03T09:50:13Z",
"relationships": [
{
"href": "#6140659b-5e3d-4686-be8f-8879b6d3e27f"
}
],
"interpolated": "Server partitions created",
"href": "/events/f00a00a9-7c59-420d-bdcf-2c0993303cf6"
},
{
"id": null,
"type": "provisioning.106",
"body": "Operating system packages installed",
"created_at": null,
"relationships": [],
"interpolated": "Operating system packages installed"
},
{
"id": null,
"type": "provisioning.107",
"body": "Server networking interfaces configured",
"created_at": null,
"relationships": [],
"interpolated": "Server networking interfaces configured"
},
{
"id": null,
"type": "provisioning.108",
"body": "Cloud-init packages installed and configured",
"created_at": null,
"relationships": [],
"interpolated": "Cloud-init packages installed and configured"
},
{
"id": null,
"type": "provisioning.109",
"body": "Installation finished, rebooting server",
"created_at": null,
"relationships": [],
"interpolated": "Installation finished, rebooting server"
},
{
"id": null,
"type": "provisioning.109",
"body": "Installation finished, rebooting server",
"created_at": null,
"relationships": [],
"interpolated": "Installation finished, rebooting server"
}
],
"plan": {
"id": "e69c0169-4726-46ea-98f1-939c9e8a3607",
"slug": "baremetal_0",
"name": "Type 0",
"description": "Our Type 0 configuration is a general use \"cloud killer\" server, with a Intel Atom 2.4Ghz processor and 8GB of RAM.",
"line": "baremetal",
"specs": {
"cpus": [
{
"count": 1,
"type": "Intel Atom C2550 @ 2.4Ghz"
}
],
"memory": {
"total": "8GB"
},
"drives": [
{
"count": 1,
"size": "80GB",
"type": "SSD"
}
],
"nics": [
{
"count": 2,
"type": "1Gbps"
}
],
"features": {
"raid": false,
"txt": true
}
},
"available_in": [
{
"href": "/facilities/2b70eb8f-fa18-47c0-aba7-222a842362fd"
},
{
"href": "/facilities/8e6470b3-b75e-47d1-bb93-45b225750975"
},
{
"href": "/facilities/8ea03255-89f9-4e62-9d3f-8817db82ceed"
},
{
"href": "/facilities/e1e9c52e-a0bc-4117-b996-0fc94843ea09"
}
],
"pricing": {
"hour": 0.05
}
},
"userdata": "",
"root_password": ",q4*a8(eny",
"href": "/devices/98e22032-579e-4c04-bb12-05cc6a3864c8"
}
]
}

View File

@ -0,0 +1,39 @@
{
"facilities": [
{
"id": "e1e9c52e-a0bc-4117-b996-0fc94843ea09",
"name": "Parsippany, NJ",
"code": "ewr1",
"features": [
"baremetal",
"storage"
],
"address": null
},
{
"id": "8e6470b3-b75e-47d1-bb93-45b225750975",
"name": "Amsterdam, NL",
"code": "ams1",
"features": [
"storage"
],
"address": null
}
],
"meta": {
"first": {
"href": "/facilities?page=1"
},
"previous": null,
"self": {
"href": "/facilities?page=1"
},
"next": {
"href": "/facilities?page=2"
},
"last": {
"href": "/facilities?page=2"
},
"total": 3
}
}

View File

@ -0,0 +1,27 @@
{
"facilities": [
{
"id": "2b70eb8f-fa18-47c0-aba7-222a842362fd",
"name": "Sunnyvale, CA",
"code": "sjc1",
"features": [],
"address": null
}
],
"meta": {
"first": {
"href": "/facilities?page=1"
},
"previous": {
"href": "/facilities?page=1"
},
"self": {
"href": "/facilities?page=2"
},
"next": null,
"last": {
"href": "/facilities?page=2"
},
"total": 3
}
}

View File

@ -0,0 +1,30 @@
{
"facilities": [
{
"id": "e1e9c52e-a0bc-4117-b996-0fc94843ea09",
"name": "Parsippany, NJ",
"code": "ewr1",
"features": [
"baremetal",
"storage"
],
"address": null
},
{
"id": "8e6470b3-b75e-47d1-bb93-45b225750975",
"name": "Amsterdam, NL",
"code": "ams1",
"features": [
"storage"
],
"address": null
},
{
"id": "2b70eb8f-fa18-47c0-aba7-222a842362fd",
"name": "Sunnyvale, CA",
"code": "sjc1",
"features": [],
"address": null
}
]
}

View File

@ -0,0 +1,96 @@
{
"operating_systems": [
{
"id": "06e21644-a769-11e6-80f5-76304dec7eb7",
"slug": "alpine_3",
"name": "Alpine 3",
"distro": "alpine",
"version": "3",
"provisionable_on": []
},
{
"id": "06e21978-a769-11e6-80f5-76304dec7eb7",
"slug": "centos_6",
"name": "CentOS 6",
"distro": "centos",
"version": "6",
"provisionable_on": []
},
{
"id": "68bad60d-f5a7-45c2-ad09-573edaad3a3c",
"slug": "centos_7",
"name": "Centos 7",
"distro": "centos",
"version": "7",
"provisionable_on": [
"baremetal_0",
"baremetal_1",
"baremetal_2",
"baremetal_3"
]
},
{
"id": "06e21ce8-a769-11e6-80f5-76304dec7eb7",
"slug": "coreos_alpha",
"name": "CoreOS Alpha",
"distro": "coreos",
"version": "alpha",
"provisionable_on": [
"baremetal_0",
"baremetal_1",
"baremetal_2",
"baremetal_3"
]
},
{
"id": "6345f310-0bb0-4b59-b051-954fed05183a",
"slug": "coreos_beta",
"name": "CoreOS Beta",
"distro": "coreos",
"version": "beta",
"provisionable_on": [
"baremetal_0",
"baremetal_1",
"baremetal_2",
"baremetal_3"
]
},
{
"id": "d61c3912-8422-4daf-835e-854efa0062e4",
"slug": "coreos_stable",
"name": "CoreOS Stable",
"distro": "coreos",
"version": "stable",
"provisionable_on": [
"baremetal_0",
"baremetal_1",
"baremetal_2",
"baremetal_3"
]
},
{
"id": "06e21e78-a769-11e6-80f5-76304dec7eb7",
"slug": "debian_7",
"name": "Debian 7",
"distro": "debian",
"version": "7",
"provisionable_on": []
}
],
"meta": {
"first": {
"href": "/operating-systems?page=1"
},
"previous": null,
"self": {
"href": "/operating-systems?page=1"
},
"next": {
"href": "/operating-systems?page=2"
},
"last": {
"href": "/operating-systems?page=2"
},
"total": 14
}
}

View File

@ -0,0 +1,106 @@
{
"operating_systems": [
{
"id": "88239019-abc7-41e8-9a4d-cd334da97ff1",
"slug": "debian_8",
"name": "Debian 8",
"distro": "debian",
"version": "8",
"provisionable_on": [
"baremetal_0",
"baremetal_1",
"baremetal_2",
"baremetal_3"
]
},
{
"id": "06e21ffe-a769-11e6-80f5-76304dec7eb7",
"slug": "deprovision",
"name": "Deprovision",
"distro": "centos",
"version": "",
"provisionable_on": []
},
{
"id": "06e22198-a769-11e6-80f5-76304dec7eb7",
"slug": "freebsd_10_3",
"name": "FreeBSD 10.3",
"distro": "freebsd",
"version": "10.3",
"provisionable_on": [
"baremetal_0",
"baremetal_1",
"baremetal_2",
"baremetal_3"
]
},
{
"id": "06e22328-a769-11e6-80f5-76304dec7eb7",
"slug": "rancher",
"name": "RancherOS",
"distro": "rancher",
"version": "latest",
"provisionable_on": [
"baremetal_0",
"baremetal_1",
"baremetal_2",
"baremetal_3"
]
},
{
"id": "06e224b8-a769-11e6-80f5-76304dec7eb7",
"slug": "ubuntu_14_04",
"name": "Ubuntu 14.04 LTS",
"distro": "ubuntu",
"version": "14.04",
"provisionable_on": [
"baremetal_0",
"baremetal_1",
"baremetal_2",
"baremetal_3"
]
},
{
"id": "1b9b78e3-de68-466e-ba00-f2123e89c112",
"slug": "ubuntu_16_04",
"name": "Ubuntu 16.04 LTS",
"distro": "ubuntu",
"version": "16.04",
"provisionable_on": [
"baremetal_0",
"baremetal_1",
"baremetal_2",
"baremetal_2a",
"baremetal_3"
]
},
{
"id": "06e22972-a769-11e6-80f5-76304dec7eb7",
"slug": "windows_2012_rc2",
"name": "Windows 2012 RC2",
"distro": "windows",
"version": "2012 RC2",
"provisionable_on": [
"baremetal_1",
"baremetal_2",
"baremetal_3"
]
}
],
"meta": {
"first": {
"href": "/operating-systems?page=1"
},
"previous": {
"href": "/operating-systems?page=1"
},
"self": {
"href": "/operating-systems?page=2"
},
"next": null,
"last": {
"href": "/operating-systems?page=2"
},
"total": 14
}
}

View File

@ -0,0 +1,166 @@
{
"operating_systems": [
{
"id": "06e21644-a769-11e6-80f5-76304dec7eb7",
"slug": "alpine_3",
"name": "Alpine 3",
"distro": "alpine",
"version": "3",
"provisionable_on": []
},
{
"id": "06e21978-a769-11e6-80f5-76304dec7eb7",
"slug": "centos_6",
"name": "CentOS 6",
"distro": "centos",
"version": "6",
"provisionable_on": []
},
{
"id": "68bad60d-f5a7-45c2-ad09-573edaad3a3c",
"slug": "centos_7",
"name": "Centos 7",
"distro": "centos",
"version": "7",
"provisionable_on": [
"baremetal_0",
"baremetal_1",
"baremetal_2",
"baremetal_3"
]
},
{
"id": "06e21ce8-a769-11e6-80f5-76304dec7eb7",
"slug": "coreos_alpha",
"name": "CoreOS Alpha",
"distro": "coreos",
"version": "alpha",
"provisionable_on": [
"baremetal_0",
"baremetal_1",
"baremetal_2",
"baremetal_3"
]
},
{
"id": "6345f310-0bb0-4b59-b051-954fed05183a",
"slug": "coreos_beta",
"name": "CoreOS Beta",
"distro": "coreos",
"version": "beta",
"provisionable_on": [
"baremetal_0",
"baremetal_1",
"baremetal_2",
"baremetal_3"
]
},
{
"id": "d61c3912-8422-4daf-835e-854efa0062e4",
"slug": "coreos_stable",
"name": "CoreOS Stable",
"distro": "coreos",
"version": "stable",
"provisionable_on": [
"baremetal_0",
"baremetal_1",
"baremetal_2",
"baremetal_3"
]
},
{
"id": "06e21e78-a769-11e6-80f5-76304dec7eb7",
"slug": "debian_7",
"name": "Debian 7",
"distro": "debian",
"version": "7",
"provisionable_on": []
},
{
"id": "88239019-abc7-41e8-9a4d-cd334da97ff1",
"slug": "debian_8",
"name": "Debian 8",
"distro": "debian",
"version": "8",
"provisionable_on": [
"baremetal_0",
"baremetal_1",
"baremetal_2",
"baremetal_3"
]
},
{
"id": "06e21ffe-a769-11e6-80f5-76304dec7eb7",
"slug": "deprovision",
"name": "Deprovision",
"distro": "centos",
"version": "",
"provisionable_on": []
},
{
"id": "06e22198-a769-11e6-80f5-76304dec7eb7",
"slug": "freebsd_10_3",
"name": "FreeBSD 10.3",
"distro": "freebsd",
"version": "10.3",
"provisionable_on": [
"baremetal_0",
"baremetal_1",
"baremetal_2",
"baremetal_3"
]
},
{
"id": "06e22328-a769-11e6-80f5-76304dec7eb7",
"slug": "rancher",
"name": "RancherOS",
"distro": "rancher",
"version": "latest",
"provisionable_on": [
"baremetal_0",
"baremetal_1",
"baremetal_2",
"baremetal_3"
]
},
{
"id": "06e224b8-a769-11e6-80f5-76304dec7eb7",
"slug": "ubuntu_14_04",
"name": "Ubuntu 14.04 LTS",
"distro": "ubuntu",
"version": "14.04",
"provisionable_on": [
"baremetal_0",
"baremetal_1",
"baremetal_2",
"baremetal_3"
]
},
{
"id": "1b9b78e3-de68-466e-ba00-f2123e89c112",
"slug": "ubuntu_16_04",
"name": "Ubuntu 16.04 LTS",
"distro": "ubuntu",
"version": "16.04",
"provisionable_on": [
"baremetal_0",
"baremetal_1",
"baremetal_2",
"baremetal_2a",
"baremetal_3"
]
},
{
"id": "06e22972-a769-11e6-80f5-76304dec7eb7",
"slug": "windows_2012_rc2",
"name": "Windows 2012 RC2",
"distro": "windows",
"version": "2012 RC2",
"provisionable_on": [
"baremetal_1",
"baremetal_2",
"baremetal_3"
]
}
]
}

View File

@ -0,0 +1,222 @@
{
"plans": [
{
"id": "e69c0169-4726-46ea-98f1-939c9e8a3607",
"slug": "baremetal_0",
"name": "Type 0",
"description": "Our Type 0 configuration is a general use \"cloud killer\" server, with a Intel Atom 2.4Ghz processor and 8GB of RAM.",
"line": "baremetal",
"specs": {
"cpus": [
{
"count": 1,
"type": "Intel Atom C2550 @ 2.4Ghz"
}
],
"memory": {
"total": "8GB"
},
"drives": [
{
"count": 1,
"size": "80GB",
"type": "SSD"
}
],
"nics": [
{
"count": 2,
"type": "1Gbps"
}
],
"features": {
"raid": false,
"txt": true
}
},
"available_in": [
{
"href": "/facilities/2b70eb8f-fa18-47c0-aba7-222a842362fd"
},
{
"href": "/facilities/8e6470b3-b75e-47d1-bb93-45b225750975"
},
{
"href": "/facilities/8ea03255-89f9-4e62-9d3f-8817db82ceed"
},
{
"href": "/facilities/e1e9c52e-a0bc-4117-b996-0fc94843ea09"
}
],
"pricing": {
"hour": 0.05
}
},
{
"id": "6d1f1ffa-7912-4b78-b50d-88cc7c8ab40f",
"slug": "baremetal_1",
"name": "Type 1",
"description": "Our Type 1 configuration is a zippy general use server, with an Intel E3-1240 v3 processor and 32GB of RAM.",
"line": "baremetal",
"specs": {
"cpus": [
{
"count": 1,
"type": "Intel E3-1240 v3"
}
],
"memory": {
"total": "32GB"
},
"drives": [
{
"count": 2,
"size": "120GB",
"type": "SSD"
}
],
"nics": [
{
"count": 2,
"type": "1Gbps"
}
],
"features": {
"raid": true,
"txt": true
}
},
"available_in": [
{
"href": "/facilities/2b70eb8f-fa18-47c0-aba7-222a842362fd"
},
{
"href": "/facilities/8e6470b3-b75e-47d1-bb93-45b225750975"
},
{
"href": "/facilities/8ea03255-89f9-4e62-9d3f-8817db82ceed"
},
{
"href": "/facilities/e1e9c52e-a0bc-4117-b996-0fc94843ea09"
}
],
"pricing": {
"hour": 0.4
}
},
{
"id": "a3729923-fdc4-4e85-a972-aafbad3695db",
"slug": "baremetal_2",
"name": "Type 2",
"description": "Our Type 2 configuration is the perfect all purpose virtualization server, with dual E5-2650 v4 processors, 256 GB of DDR4 RAM, and six SSDs totaling 2.8 TB of storage.",
"line": "baremetal",
"specs": {
"cpus": [
{
"count": 2,
"type": "Intel Xeon E5-2650 v4 @2.2GHz"
}
],
"memory": {
"total": "256GB"
},
"drives": [
{
"count": 6,
"size": "480GB",
"type": "SSD"
}
],
"nics": [
{
"count": 2,
"type": "10Gbps"
}
],
"features": {
"raid": true,
"txt": true
}
},
"available_in": [
{
"href": "/facilities/2b70eb8f-fa18-47c0-aba7-222a842362fd"
},
{
"href": "/facilities/8ea03255-89f9-4e62-9d3f-8817db82ceed"
},
{
"href": "/facilities/e1e9c52e-a0bc-4117-b996-0fc94843ea09"
}
],
"pricing": {
"hour": 1.25
}
},
{
"id": "3bc8a214-b807-4058-ad4a-6925f2411155",
"slug": "baremetal_2a",
"name": "Type 2A",
"description": "Our Type 2A configuration is a 96-core dual socket ARM 64 beast based on Cavium ThunderX chips",
"line": "baremetal",
"specs": {
"cpus": [
{
"count": 2,
"type": "Cavium ThunderX CN8890 @2GHz"
}
],
"memory": {
"total": "128GB"
},
"drives": [
{
"count": 1,
"size": "512GB",
"type": "SSD"
}
],
"nics": [
{
"count": 2,
"type": "10Gbps"
}
],
"features": {}
},
"available_in": [
{
"href": "/facilities/2b70eb8f-fa18-47c0-aba7-222a842362fd"
},
{
"href": "/facilities/8e6470b3-b75e-47d1-bb93-45b225750975"
},
{
"href": "/facilities/8ea03255-89f9-4e62-9d3f-8817db82ceed"
},
{
"href": "/facilities/e1e9c52e-a0bc-4117-b996-0fc94843ea09"
}
],
"pricing": {
"hour": 0.5
}
}
],
"meta": {
"first": {
"href": "/plans?page=1"
},
"previous": null,
"self": {
"href": "/plans?page=1"
},
"next": {
"href": "/plans?page=2"
},
"last": {
"href": "/plans?page=2"
},
"total": 7
}
}

View File

@ -0,0 +1,98 @@
{
"plans": [
{
"id": "741f3afb-bb2f-4694-93a0-fcbad7cd5e78",
"slug": "baremetal_3",
"name": "Type 3",
"description": "Our Type 3 configuration is a high core, high IO server, with dual Intel E5-2640 v3 processors, 128GB of DDR4 RAM and ultra fast NVME flash drives.",
"line": "baremetal",
"specs": {
"cpus": [
{
"count": 2,
"type": "Intel E5-2640 v3"
}
],
"memory": {
"total": "128GB"
},
"drives": [
{
"count": 2,
"size": "120GB",
"type": "SSD"
},
{
"count": 1,
"size": "1.6TB",
"type": "NVME"
}
],
"nics": [
{
"count": 2,
"type": "10Gbps"
}
],
"features": {
"raid": true,
"txt": true
}
},
"available_in": [
{
"href": "/facilities/2b70eb8f-fa18-47c0-aba7-222a842362fd"
},
{
"href": "/facilities/8e6470b3-b75e-47d1-bb93-45b225750975"
},
{
"href": "/facilities/e1e9c52e-a0bc-4117-b996-0fc94843ea09"
}
],
"pricing": {
"hour": 1.75
}
},
{
"id": "87728148-3155-4992-a730-8d1e6aca8a32",
"slug": "storage_1",
"name": "Standard",
"description": "TBD",
"line": "storage",
"specs": {},
"available_in": [],
"pricing": {
"hour": 0.000104
}
},
{
"id": "d6570cfb-38fa-4467-92b3-e45d059bb249",
"slug": "storage_2",
"name": "Performance",
"description": "TBD",
"line": "storage",
"specs": {},
"available_in": [],
"pricing": {
"hour": 0.000223
}
}
],
"meta": {
"first": {
"href": "/plans?page=1"
},
"previous": {
"href": "/plans?page=1"
},
"self": {
"href": "/plans?page=2"
},
"next": null,
"last": {
"href": "/plans?page=2"
},
"total": 7
}
}

View File

@ -0,0 +1,284 @@
{
"plans": [
{
"id": "e69c0169-4726-46ea-98f1-939c9e8a3607",
"slug": "baremetal_0",
"name": "Type 0",
"description": "Our Type 0 configuration is a general use \"cloud killer\" server, with a Intel Atom 2.4Ghz processor and 8GB of RAM.",
"line": "baremetal",
"specs": {
"cpus": [
{
"count": 1,
"type": "Intel Atom C2550 @ 2.4Ghz"
}
],
"memory": {
"total": "8GB"
},
"drives": [
{
"count": 1,
"size": "80GB",
"type": "SSD"
}
],
"nics": [
{
"count": 2,
"type": "1Gbps"
}
],
"features": {
"raid": false,
"txt": true
}
},
"available_in": [
{
"href": "/facilities/2b70eb8f-fa18-47c0-aba7-222a842362fd"
},
{
"href": "/facilities/8e6470b3-b75e-47d1-bb93-45b225750975"
},
{
"href": "/facilities/8ea03255-89f9-4e62-9d3f-8817db82ceed"
},
{
"href": "/facilities/e1e9c52e-a0bc-4117-b996-0fc94843ea09"
}
],
"pricing": {
"hour": 0.05
}
},
{
"id": "6d1f1ffa-7912-4b78-b50d-88cc7c8ab40f",
"slug": "baremetal_1",
"name": "Type 1",
"description": "Our Type 1 configuration is a zippy general use server, with an Intel E3-1240 v3 processor and 32GB of RAM.",
"line": "baremetal",
"specs": {
"cpus": [
{
"count": 1,
"type": "Intel E3-1240 v3"
}
],
"memory": {
"total": "32GB"
},
"drives": [
{
"count": 2,
"size": "120GB",
"type": "SSD"
}
],
"nics": [
{
"count": 2,
"type": "1Gbps"
}
],
"features": {
"raid": true,
"txt": true
}
},
"available_in": [
{
"href": "/facilities/2b70eb8f-fa18-47c0-aba7-222a842362fd"
},
{
"href": "/facilities/8e6470b3-b75e-47d1-bb93-45b225750975"
},
{
"href": "/facilities/8ea03255-89f9-4e62-9d3f-8817db82ceed"
},
{
"href": "/facilities/e1e9c52e-a0bc-4117-b996-0fc94843ea09"
}
],
"pricing": {
"hour": 0.4
}
},
{
"id": "a3729923-fdc4-4e85-a972-aafbad3695db",
"slug": "baremetal_2",
"name": "Type 2",
"description": "Our Type 2 configuration is the perfect all purpose virtualization server, with dual E5-2650 v4 processors, 256 GB of DDR4 RAM, and six SSDs totaling 2.8 TB of storage.",
"line": "baremetal",
"specs": {
"cpus": [
{
"count": 2,
"type": "Intel Xeon E5-2650 v4 @2.2GHz"
}
],
"memory": {
"total": "256GB"
},
"drives": [
{
"count": 6,
"size": "480GB",
"type": "SSD"
}
],
"nics": [
{
"count": 2,
"type": "10Gbps"
}
],
"features": {
"raid": true,
"txt": true
}
},
"available_in": [
{
"href": "/facilities/2b70eb8f-fa18-47c0-aba7-222a842362fd"
},
{
"href": "/facilities/8ea03255-89f9-4e62-9d3f-8817db82ceed"
},
{
"href": "/facilities/e1e9c52e-a0bc-4117-b996-0fc94843ea09"
}
],
"pricing": {
"hour": 1.25
}
},
{
"id": "3bc8a214-b807-4058-ad4a-6925f2411155",
"slug": "baremetal_2a",
"name": "Type 2A",
"description": "Our Type 2A configuration is a 96-core dual socket ARM 64 beast based on Cavium ThunderX chips",
"line": "baremetal",
"specs": {
"cpus": [
{
"count": 2,
"type": "Cavium ThunderX CN8890 @2GHz"
}
],
"memory": {
"total": "128GB"
},
"drives": [
{
"count": 1,
"size": "512GB",
"type": "SSD"
}
],
"nics": [
{
"count": 2,
"type": "10Gbps"
}
],
"features": {}
},
"available_in": [
{
"href": "/facilities/2b70eb8f-fa18-47c0-aba7-222a842362fd"
},
{
"href": "/facilities/8e6470b3-b75e-47d1-bb93-45b225750975"
},
{
"href": "/facilities/8ea03255-89f9-4e62-9d3f-8817db82ceed"
},
{
"href": "/facilities/e1e9c52e-a0bc-4117-b996-0fc94843ea09"
}
],
"pricing": {
"hour": 0.5
}
},
{
"id": "741f3afb-bb2f-4694-93a0-fcbad7cd5e78",
"slug": "baremetal_3",
"name": "Type 3",
"description": "Our Type 3 configuration is a high core, high IO server, with dual Intel E5-2640 v3 processors, 128GB of DDR4 RAM and ultra fast NVME flash drives.",
"line": "baremetal",
"specs": {
"cpus": [
{
"count": 2,
"type": "Intel E5-2640 v3"
}
],
"memory": {
"total": "128GB"
},
"drives": [
{
"count": 2,
"size": "120GB",
"type": "SSD"
},
{
"count": 1,
"size": "1.6TB",
"type": "NVME"
}
],
"nics": [
{
"count": 2,
"type": "10Gbps"
}
],
"features": {
"raid": true,
"txt": true
}
},
"available_in": [
{
"href": "/facilities/2b70eb8f-fa18-47c0-aba7-222a842362fd"
},
{
"href": "/facilities/8e6470b3-b75e-47d1-bb93-45b225750975"
},
{
"href": "/facilities/e1e9c52e-a0bc-4117-b996-0fc94843ea09"
}
],
"pricing": {
"hour": 1.75
}
},
{
"id": "87728148-3155-4992-a730-8d1e6aca8a32",
"slug": "storage_1",
"name": "Standard",
"description": "TBD",
"line": "storage",
"specs": {},
"available_in": [],
"pricing": {
"hour": 0.000104
}
},
{
"id": "d6570cfb-38fa-4467-92b3-e45d059bb249",
"slug": "storage_2",
"name": "Performance",
"description": "TBD",
"line": "storage",
"specs": {},
"available_in": [],
"pricing": {
"hour": 0.000223
}
}
]
}

View File

@ -0,0 +1,3 @@
{
"type": "power_off"
}

View File

@ -0,0 +1,3 @@
{
"type": "power_on"
}

View File

@ -1 +1,77 @@
{"projects":[{"id":"93907f48-adfe-43ed-ad89-0e6e83721a54","name":"Cloudsoft CCS Testing","created_at":"2016-09-15T08:50:58Z","updated_at":"2017-01-05T09:36:53Z","max_devices":{"baremetal_0":null,"baremetal_1":null,"baremetal_2":null,"baremetal_3":null,"baremetal_2a":null,"storage_1":null,"storage_2":null},"members":[{"href":"/users/1140617d-262d-4502-a3d6-771d83c930da"},{"href":"/users/343345fe-18b3-46a3-9b9c-e4a2fe88ccbd"},{"href":"/users/73b0442e-cc4b-42a0-8d3a-c8dfb8a4ff2e"},{"href":"/users/ad711bc3-6333-449a-a405-23ca81f38c00"}],"memberships":[{"href":"/memberships/914facae-547f-46fc-93e8-860eb53d9bf6"},{"href":"/memberships/1ce7c9d9-d11f-47f2-b5a6-d1221338ad69"},{"href":"/memberships/e25c4478-9e44-465a-a9d7-bffc7a83300d"},{"href":"/memberships/8a00c05b-3ddc-41c3-8dd7-4a3d5984ecec"}],"invitations":[],"payment_method":{"href":"/payment-methods/b2bb4ee0-506b-4c01-b17d-ba41d5c430c5"},"devices":[{"href":"/devices/4942a6c7-55c6-42cc-a06b-cccd6f2fa5df"}],"ssh_keys":[{"href":"/ssh-keys/070e3282-5b6a-4f75-8f18-a4e7488eafaa"}],"volumes":[],"href":"/projects/93907f48-adfe-43ed-ad89-0e6e83721a54"}],"meta":{"first":{"href":"/projects?page=1"},"previous":null,"self":{"href":"/projects?page=1"},"next":null,"last":{"href":"/projects?page=1"},"total":1}}
{
"projects": [
{
"id": "93907f48-adfe-43ed-ad89-0e6e83721a54",
"name": "Cloudsoft CCS Testing",
"created_at": "2016-09-15T08:50:58Z",
"updated_at": "2017-01-05T09:36:53Z",
"max_devices": {
"baremetal_0": null,
"baremetal_1": null,
"baremetal_2": null,
"baremetal_3": null,
"baremetal_2a": null,
"storage_1": null,
"storage_2": null
},
"members": [
{
"href": "/users/1140617d-262d-4502-a3d6-771d83c930da"
},
{
"href": "/users/343345fe-18b3-46a3-9b9c-e4a2fe88ccbd"
},
{
"href": "/users/73b0442e-cc4b-42a0-8d3a-c8dfb8a4ff2e"
},
{
"href": "/users/ad711bc3-6333-449a-a405-23ca81f38c00"
}
],
"memberships": [
{
"href": "/memberships/914facae-547f-46fc-93e8-860eb53d9bf6"
},
{
"href": "/memberships/1ce7c9d9-d11f-47f2-b5a6-d1221338ad69"
},
{
"href": "/memberships/e25c4478-9e44-465a-a9d7-bffc7a83300d"
},
{
"href": "/memberships/8a00c05b-3ddc-41c3-8dd7-4a3d5984ecec"
}
],
"invitations": [],
"payment_method": {
"href": "/payment-methods/b2bb4ee0-506b-4c01-b17d-ba41d5c430c5"
},
"devices": [
{
"href": "/devices/4942a6c7-55c6-42cc-a06b-cccd6f2fa5df"
}
],
"ssh_keys": [
{
"href": "/ssh-keys/070e3282-5b6a-4f75-8f18-a4e7488eafaa"
}
],
"volumes": [],
"href": "/projects/93907f48-adfe-43ed-ad89-0e6e83721a54"
}
],
"meta": {
"first": {
"href": "/projects?page=1"
},
"previous": null,
"self": {
"href": "/projects?page=1"
},
"next": null,
"last": {
"href": "/projects?page=1"
},
"total": 1
}
}

View File

@ -0,0 +1,3 @@
{
"type": "reboot"
}

View File

@ -0,0 +1,3 @@
{
"type": "rescue"
}

View File

@ -0,0 +1,4 @@
{
"label": "jclouds-ssh-key-livetest",
"key": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCdgcoNzH4hCc0j3b4MuG503L/J54uyFvwCAOu8vSsYuLpJ4AEyEOv+T0SfdF605fK6GYXA16Rxk3lrPt7mfKGNtXR0Ripbv7Zc6PvCRorwgj/cjh/45miozjrkXAiHD1GFZycfbi4YsoWAqZj7W4mwtctmhrYM0FPdya2XoRpVy89N+A5Xo4Xtd6EZn6JGEKQM5+kF2aL3ggy0od/DqjuEVYwZoyTe1RgUTXZSU/Woh7WMhsRHbqd3eYz4s6ac8n8IJPGKtUaQeqUtH7OK6NRYXVypUrkqNlwdNYZAwrjXg/x5T3D+bo11LENASRt9OJ2OkmRSTqRxBeDkhnVauWK/"
}

View File

@ -0,0 +1,12 @@
{
"id": "da5d6c21-2e8c-43ac-820f-ff41bd4e6ebc",
"label": "andrea-device-livetest",
"key": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCdgcoNzH4hCc0j3b4MuG503L/J54uyFvwCAOu8vSsYuLpJ4AEyEOv+T0SfdF605fK6GYXA16Rxk3lrPt7mfKGNtXR0Ripbv7Zc6PvCRorwgj/cjh/45miozjrkXAiHD1GFZycfbi4YsoWAqZj7W4mwtctmhrYM0FPdya2XoRpVy89N+A5Xo4Xtd6EZn6JGEKQM5+kF2aL3ggy0od/DqjuEVYwZoyTe1RgUTXZSU/Woh7WMhsRHbqd3eYz4s6ac8n8IJPGKtUaQeqUtH7OK6NRYXVypUrkqNlwdNYZAwrjXg/x5T3D+bo11LENASRt9OJ2OkmRSTqRxBeDkhnVauWK/",
"fingerprint": "60:b0:5a:23:42:b8:53:19:d0:32:f1:4d:a8:7c:9b:71",
"created_at": "2017-01-20T14:15:26Z",
"updated_at": "2017-01-20T14:15:26Z",
"owner": {
"href": "/users/ad711bc3-6333-449a-a405-23ca81f38c00"
},
"href": "/ssh-keys/da5d6c21-2e8c-43ac-820f-ff41bd4e6ebc"
}

View File

@ -0,0 +1,12 @@
{
"id": "bba63e41-b12c-493a-81d4-e52f50f247ed",
"label": "test",
"key": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDNnvPZ25wZK19grrbal6R5JP1hLRBUuNh86KxZVMAFkGd5ouVSgO9dFajHZ45Q4mbaTkdOiqf7otMLDzkaztEa7oLK7Jso0Y0LOi+nT4gf38rvbEF5mq069G9b9XqlNleaGnpLuTN54iEK8c4TWZxIJqgelHEHhjp7V1asmilBbpZDmwA5cTt9vGJIhqA/BptKH3folZKeAQjRa1ZRSwSQUnk9rBKn4PKSRDojVa9A9jKt4qboJh5q7ZjtE8z+665F/4TgLzElTXUA8+uUFGpuynMSmQEt301e18dXAl+vBr8fMiThcoVVbdVdqdjXsw75fMXPAgqhjrw8k3+0/4P9 andrea@bigmac.local",
"fingerprint": "88:8a:7d:0f:db:fb:f4:2a:63:2e:d3:4b:1f:7f:0b:12",
"created_at": "2017-01-03T09:42:54Z",
"updated_at": "2017-01-03T09:42:54Z",
"owner": {
"href": "/users/ad711bc3-6333-449a-a405-23ca81f38c00"
},
"href": "/ssh-keys/bba63e41-b12c-493a-81d4-e52f50f247ed"
}

View File

@ -0,0 +1,80 @@
{
"ssh_keys": [
{
"id": "bba63e41-b12c-493a-81d4-e52f50f247e1",
"label": "test",
"key": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDNnvPZ25wZK19grrbal6R5JP1hLRBUuNh86KxZVMAFkGd5ouVSgO9dFajHZ45Q4mbaTkdOiqf7otMLDzkaztEa7oLK7Jso0Y0LOi+nT4gf38rvbEF5mq069G9b9XqlNleaGnpLuTN54iEK8c4TWZxIJqgelHEHhjp7V1asmilBbpZDmwA5cTt9vGJIhqA/BptKH3folZKeAQjRa1ZRSwSQUnk9rBKn4PKSRDojVa9A9jKt4qboJh5q7ZjtE8z+665F/4TgLzElTXUA8+uUFGpuynMSmQEt301e18dXAl+vBr8fMiThcoVVbdVdqdjXsw75fMXPAgqhjrw8k3+0/4P9 andrea@bigmac.local",
"fingerprint": "88:8a:7d:0f:db:fb:f4:2a:63:2e:d3:4b:1f:7f:0b:12",
"created_at": "2017-01-03T09:42:54Z",
"updated_at": "2017-01-03T09:42:54Z",
"owner": {
"href": "/users/ad711bc3-6333-449a-a405-23ca81f38c00"
},
"href": "/ssh-keys/bba63e41-b12c-493a-81d4-e52f50f247ed"
},
{
"id": "bba63e41-b12c-493a-81d4-e52f50f247e2",
"label": "test",
"key": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDNnvPZ25wZK19grrbal6R5JP1hLRBUuNh86KxZVMAFkGd5ouVSgO9dFajHZ45Q4mbaTkdOiqf7otMLDzkaztEa7oLK7Jso0Y0LOi+nT4gf38rvbEF5mq069G9b9XqlNleaGnpLuTN54iEK8c4TWZxIJqgelHEHhjp7V1asmilBbpZDmwA5cTt9vGJIhqA/BptKH3folZKeAQjRa1ZRSwSQUnk9rBKn4PKSRDojVa9A9jKt4qboJh5q7ZjtE8z+665F/4TgLzElTXUA8+uUFGpuynMSmQEt301e18dXAl+vBr8fMiThcoVVbdVdqdjXsw75fMXPAgqhjrw8k3+0/4P9 andrea@bigmac.local",
"fingerprint": "88:8a:7d:0f:db:fb:f4:2a:63:2e:d3:4b:1f:7f:0b:12",
"created_at": "2017-01-03T09:42:54Z",
"updated_at": "2017-01-03T09:42:54Z",
"owner": {
"href": "/users/ad711bc3-6333-449a-a405-23ca81f38c00"
},
"href": "/ssh-keys/bba63e41-b12c-493a-81d4-e52f50f247ed"
},
{
"id": "bba63e41-b12c-493a-81d4-e52f50f247e3",
"label": "test",
"key": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDNnvPZ25wZK19grrbal6R5JP1hLRBUuNh86KxZVMAFkGd5ouVSgO9dFajHZ45Q4mbaTkdOiqf7otMLDzkaztEa7oLK7Jso0Y0LOi+nT4gf38rvbEF5mq069G9b9XqlNleaGnpLuTN54iEK8c4TWZxIJqgelHEHhjp7V1asmilBbpZDmwA5cTt9vGJIhqA/BptKH3folZKeAQjRa1ZRSwSQUnk9rBKn4PKSRDojVa9A9jKt4qboJh5q7ZjtE8z+665F/4TgLzElTXUA8+uUFGpuynMSmQEt301e18dXAl+vBr8fMiThcoVVbdVdqdjXsw75fMXPAgqhjrw8k3+0/4P9 andrea@bigmac.local",
"fingerprint": "88:8a:7d:0f:db:fb:f4:2a:63:2e:d3:4b:1f:7f:0b:12",
"created_at": "2017-01-03T09:42:54Z",
"updated_at": "2017-01-03T09:42:54Z",
"owner": {
"href": "/users/ad711bc3-6333-449a-a405-23ca81f38c00"
},
"href": "/ssh-keys/bba63e41-b12c-493a-81d4-e52f50f247ed"
},
{
"id": "bba63e41-b12c-493a-81d4-e52f50f247e4",
"label": "test",
"key": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDNnvPZ25wZK19grrbal6R5JP1hLRBUuNh86KxZVMAFkGd5ouVSgO9dFajHZ45Q4mbaTkdOiqf7otMLDzkaztEa7oLK7Jso0Y0LOi+nT4gf38rvbEF5mq069G9b9XqlNleaGnpLuTN54iEK8c4TWZxIJqgelHEHhjp7V1asmilBbpZDmwA5cTt9vGJIhqA/BptKH3folZKeAQjRa1ZRSwSQUnk9rBKn4PKSRDojVa9A9jKt4qboJh5q7ZjtE8z+665F/4TgLzElTXUA8+uUFGpuynMSmQEt301e18dXAl+vBr8fMiThcoVVbdVdqdjXsw75fMXPAgqhjrw8k3+0/4P9 andrea@bigmac.local",
"fingerprint": "88:8a:7d:0f:db:fb:f4:2a:63:2e:d3:4b:1f:7f:0b:12",
"created_at": "2017-01-03T09:42:54Z",
"updated_at": "2017-01-03T09:42:54Z",
"owner": {
"href": "/users/ad711bc3-6333-449a-a405-23ca81f38c00"
},
"href": "/ssh-keys/bba63e41-b12c-493a-81d4-e52f50f247ed"
},
{
"id": "bba63e41-b12c-493a-81d4-e52f50f247e5",
"label": "test",
"key": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDNnvPZ25wZK19grrbal6R5JP1hLRBUuNh86KxZVMAFkGd5ouVSgO9dFajHZ45Q4mbaTkdOiqf7otMLDzkaztEa7oLK7Jso0Y0LOi+nT4gf38rvbEF5mq069G9b9XqlNleaGnpLuTN54iEK8c4TWZxIJqgelHEHhjp7V1asmilBbpZDmwA5cTt9vGJIhqA/BptKH3folZKeAQjRa1ZRSwSQUnk9rBKn4PKSRDojVa9A9jKt4qboJh5q7ZjtE8z+665F/4TgLzElTXUA8+uUFGpuynMSmQEt301e18dXAl+vBr8fMiThcoVVbdVdqdjXsw75fMXPAgqhjrw8k3+0/4P9 andrea@bigmac.local",
"fingerprint": "88:8a:7d:0f:db:fb:f4:2a:63:2e:d3:4b:1f:7f:0b:12",
"created_at": "2017-01-03T09:42:54Z",
"updated_at": "2017-01-03T09:42:54Z",
"owner": {
"href": "/users/ad711bc3-6333-449a-a405-23ca81f38c00"
},
"href": "/ssh-keys/bba63e41-b12c-493a-81d4-e52f50f247ed"
}
],
"meta": {
"first": {
"href": "/ssh-keys?page=1"
},
"previous": null,
"self": {
"href": "/ssh-keys?page=1"
},
"next": {
"href": "/ssh-keys?page=2"
},
"last": {
"href": "/ssh-keys?page=2"
},
"total": 8
}
}

View File

@ -0,0 +1,56 @@
{
"ssh_keys": [
{
"id": "bba63e41-b12c-493a-81d4-e52f50f247e6",
"label": "test",
"key": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDNnvPZ25wZK19grrbal6R5JP1hLRBUuNh86KxZVMAFkGd5ouVSgO9dFajHZ45Q4mbaTkdOiqf7otMLDzkaztEa7oLK7Jso0Y0LOi+nT4gf38rvbEF5mq069G9b9XqlNleaGnpLuTN54iEK8c4TWZxIJqgelHEHhjp7V1asmilBbpZDmwA5cTt9vGJIhqA/BptKH3folZKeAQjRa1ZRSwSQUnk9rBKn4PKSRDojVa9A9jKt4qboJh5q7ZjtE8z+665F/4TgLzElTXUA8+uUFGpuynMSmQEt301e18dXAl+vBr8fMiThcoVVbdVdqdjXsw75fMXPAgqhjrw8k3+0/4P9 andrea@bigmac.local",
"fingerprint": "88:8a:7d:0f:db:fb:f4:2a:63:2e:d3:4b:1f:7f:0b:12",
"created_at": "2017-01-03T09:42:54Z",
"updated_at": "2017-01-03T09:42:54Z",
"owner": {
"href": "/users/ad711bc3-6333-449a-a405-23ca81f38c00"
},
"href": "/ssh-keys/bba63e41-b12c-493a-81d4-e52f50f247ed"
},
{
"id": "bba63e41-b12c-493a-81d4-e52f50f247e7",
"label": "test",
"key": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDNnvPZ25wZK19grrbal6R5JP1hLRBUuNh86KxZVMAFkGd5ouVSgO9dFajHZ45Q4mbaTkdOiqf7otMLDzkaztEa7oLK7Jso0Y0LOi+nT4gf38rvbEF5mq069G9b9XqlNleaGnpLuTN54iEK8c4TWZxIJqgelHEHhjp7V1asmilBbpZDmwA5cTt9vGJIhqA/BptKH3folZKeAQjRa1ZRSwSQUnk9rBKn4PKSRDojVa9A9jKt4qboJh5q7ZjtE8z+665F/4TgLzElTXUA8+uUFGpuynMSmQEt301e18dXAl+vBr8fMiThcoVVbdVdqdjXsw75fMXPAgqhjrw8k3+0/4P9 andrea@bigmac.local",
"fingerprint": "88:8a:7d:0f:db:fb:f4:2a:63:2e:d3:4b:1f:7f:0b:12",
"created_at": "2017-01-03T09:42:54Z",
"updated_at": "2017-01-03T09:42:54Z",
"owner": {
"href": "/users/ad711bc3-6333-449a-a405-23ca81f38c00"
},
"href": "/ssh-keys/bba63e41-b12c-493a-81d4-e52f50f247ed"
},
{
"id": "bba63e41-b12c-493a-81d4-e52f50f247e8",
"label": "test",
"key": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDNnvPZ25wZK19grrbal6R5JP1hLRBUuNh86KxZVMAFkGd5ouVSgO9dFajHZ45Q4mbaTkdOiqf7otMLDzkaztEa7oLK7Jso0Y0LOi+nT4gf38rvbEF5mq069G9b9XqlNleaGnpLuTN54iEK8c4TWZxIJqgelHEHhjp7V1asmilBbpZDmwA5cTt9vGJIhqA/BptKH3folZKeAQjRa1ZRSwSQUnk9rBKn4PKSRDojVa9A9jKt4qboJh5q7ZjtE8z+665F/4TgLzElTXUA8+uUFGpuynMSmQEt301e18dXAl+vBr8fMiThcoVVbdVdqdjXsw75fMXPAgqhjrw8k3+0/4P9 andrea@bigmac.local",
"fingerprint": "88:8a:7d:0f:db:fb:f4:2a:63:2e:d3:4b:1f:7f:0b:12",
"created_at": "2017-01-03T09:42:54Z",
"updated_at": "2017-01-03T09:42:54Z",
"owner": {
"href": "/users/ad711bc3-6333-449a-a405-23ca81f38c00"
},
"href": "/ssh-keys/bba63e41-b12c-493a-81d4-e52f50f247ed"
}
],
"meta": {
"first": {
"href": "/ssh-keys?page=1"
},
"previous": {
"href": "/ssh-keys?page=1"
},
"self": {
"href": "/ssh-keys?page=2"
},
"next": null,
"last": {
"href": "/ssh-keys?page=2"
},
"total": 8
}
}

View File

@ -0,0 +1,16 @@
{
"ssh_keys": [
{
"id": "bba63e41-b12c-493a-81d4-e52f50f247ed",
"label": "test",
"key": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDNnvPZ25wZK19grrbal6R5JP1hLRBUuNh86KxZVMAFkGd5ouVSgO9dFajHZ45Q4mbaTkdOiqf7otMLDzkaztEa7oLK7Jso0Y0LOi+nT4gf38rvbEF5mq069G9b9XqlNleaGnpLuTN54iEK8c4TWZxIJqgelHEHhjp7V1asmilBbpZDmwA5cTt9vGJIhqA/BptKH3folZKeAQjRa1ZRSwSQUnk9rBKn4PKSRDojVa9A9jKt4qboJh5q7ZjtE8z+665F/4TgLzElTXUA8+uUFGpuynMSmQEt301e18dXAl+vBr8fMiThcoVVbdVdqdjXsw75fMXPAgqhjrw8k3+0/4P9 andrea@bigmac.local",
"fingerprint": "88:8a:7d:0f:db:fb:f4:2a:63:2e:d3:4b:1f:7f:0b:12",
"created_at": "2017-01-03T09:42:54Z",
"updated_at": "2017-01-03T09:42:54Z",
"owner": {
"href": "/users/ad711bc3-6333-449a-a405-23ca81f38c00"
},
"href": "/ssh-keys/bba63e41-b12c-493a-81d4-e52f50f247ed"
}
]
}

View File

@ -0,0 +1,19 @@
{
"id": "faaaec30-be0c-4b6d-b1a7-1bf6e494a333",
"first_name": "Melissa",
"last_name": "Smith",
"full_name": "Melissa Smith",
"email": "melissa@example.com",
"max_projects": 1,
"two_factor_auth": "sms",
"timezone": "America/New_York",
"phone_number": "555-555-5555",
"created_at": "2014-04-14T02:15:15Z",
"updated_at": "2014-04-14T02:15:15Z",
"timezone": "America/New_York",
"emails": [
{ "href": "/emails/7e407a6a-4f96-4da0-8c48-5665352ebf06" }
],
"avatar_url": "https://www.gravatar.com/avatar/d248bbb3a03ed?d=https://app.packet.net/client-portal/assets/images/default_gravatar.png",
"href": "/users/faaaec30-be0c-4b6d-b1a7-1bf6e494a333"
}