mirror of https://github.com/apache/jclouds.git
Adds nova extension names and an example test
This commit is contained in:
parent
962de83e86
commit
7d73a0392a
|
@ -17,8 +17,16 @@
|
|||
|
||||
package org.jclouds.openstack.nova.v2_0.extensions;
|
||||
|
||||
import com.google.common.annotations.Beta;
|
||||
import com.google.common.collect.FluentIterable;
|
||||
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.javax.annotation.Nullable;
|
||||
import org.jclouds.openstack.keystone.v2_0.filters.AuthenticateRequest;
|
||||
|
@ -31,21 +39,14 @@ import org.jclouds.rest.annotations.PayloadParam;
|
|||
import org.jclouds.rest.annotations.RequestFilters;
|
||||
import org.jclouds.rest.annotations.SelectJson;
|
||||
|
||||
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 com.google.common.annotations.Beta;
|
||||
import com.google.common.collect.FluentIterable;
|
||||
|
||||
/**
|
||||
* Provides access to the OpenStack Compute (Nova) Attach Interfaces API.
|
||||
*/
|
||||
@Beta
|
||||
@Extension(of = ServiceType.COMPUTE, namespace = ExtensionNamespaces.ATTACH_INTERFACES)
|
||||
@Extension(of = ServiceType.COMPUTE, namespace = ExtensionNamespaces.ATTACH_INTERFACES, name = ExtensionNames.ATTACH_INTERFACES)
|
||||
@RequestFilters(AuthenticateRequest.class)
|
||||
@Consumes(MediaType.APPLICATION_JSON)
|
||||
@Path("/servers")
|
||||
|
@ -53,7 +54,7 @@ public interface AttachInterfaceApi {
|
|||
|
||||
/**
|
||||
* Returns list of port interfaces for given server
|
||||
*
|
||||
*
|
||||
* @param serverId
|
||||
* The Server ID
|
||||
* @return list of port interfaces for given server
|
||||
|
@ -67,7 +68,7 @@ public interface AttachInterfaceApi {
|
|||
|
||||
/**
|
||||
* Returns information about a specified port interface for given server
|
||||
*
|
||||
*
|
||||
* @param serverId
|
||||
* The Server ID
|
||||
* @param attachmentId
|
||||
|
@ -84,7 +85,7 @@ public interface AttachInterfaceApi {
|
|||
|
||||
/**
|
||||
* Creates a new port interface and associate with the given port
|
||||
*
|
||||
*
|
||||
* @param portId
|
||||
* The port ID
|
||||
* @return newly created port interface
|
||||
|
|
|
@ -16,8 +16,12 @@
|
|||
*/
|
||||
package org.jclouds.openstack.nova.v2_0.extensions;
|
||||
|
||||
import com.google.common.annotations.Beta;
|
||||
import com.google.common.collect.FluentIterable;
|
||||
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.EmptyFluentIterableOnNotFoundOr404;
|
||||
import org.jclouds.openstack.keystone.v2_0.filters.AuthenticateRequest;
|
||||
import org.jclouds.openstack.nova.v2_0.domain.regionscoped.AvailabilityZone;
|
||||
|
@ -28,17 +32,14 @@ import org.jclouds.rest.annotations.Fallback;
|
|||
import org.jclouds.rest.annotations.RequestFilters;
|
||||
import org.jclouds.rest.annotations.SelectJson;
|
||||
|
||||
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 com.google.common.annotations.Beta;
|
||||
import com.google.common.collect.FluentIterable;
|
||||
|
||||
/**
|
||||
* Provides access to the OpenStack Compute (Nova) Availability Zone Extension API.
|
||||
*/
|
||||
@Beta
|
||||
@Extension(of = ServiceType.COMPUTE, namespace = ExtensionNamespaces.AVAILABILITY_ZONE)
|
||||
@Extension(of = ServiceType.COMPUTE, namespace = ExtensionNamespaces.AVAILABILITY_ZONE, name = ExtensionNames.AVAILABILITY_ZONE)
|
||||
@RequestFilters(AuthenticateRequest.class)
|
||||
@Consumes(MediaType.APPLICATION_JSON)
|
||||
@Path("/os-availability-zone")
|
||||
|
|
|
@ -44,7 +44,7 @@ import com.google.common.annotations.Beta;
|
|||
*
|
||||
*/
|
||||
@Beta
|
||||
@Extension(of = ServiceType.COMPUTE, namespace = ExtensionNamespaces.CONSOLES)
|
||||
@Extension(of = ServiceType.COMPUTE, namespace = ExtensionNamespaces.CONSOLES, name = ExtensionNames.CONSOLES)
|
||||
@RequestFilters(AuthenticateRequest.class)
|
||||
@Consumes(MediaType.APPLICATION_JSON)
|
||||
public interface ConsolesApi {
|
||||
|
|
|
@ -0,0 +1,43 @@
|
|||
/*
|
||||
* 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.openstack.nova.v2_0.extensions;
|
||||
|
||||
/**
|
||||
* OpenStack Nova Extension Namespaces
|
||||
*/
|
||||
public final class ExtensionNames {
|
||||
public static final String FLOATING_IPS = "FloatingIps";
|
||||
public static final String ATTACH_INTERFACES = "AttachInterfaces";
|
||||
public static final String AVAILABILITY_ZONE = "AvailabilityZone";
|
||||
public static final String CONSOLES = "Consoles";
|
||||
public static final String FLAVOR_EXTRA_SPECS = "FlavorExtraSpecs";
|
||||
public static final String HOST_ADMINISTRATION = "Hosts";
|
||||
public static final String HOST_AGGREGATE = "Aggregates";
|
||||
public static final String HYPERVISORS = "Hypervisors";
|
||||
public static final String KEYPAIRS = "Keypairs";
|
||||
public static final String QUOTAS = "Quotas";
|
||||
public static final String SECURITY_GROUPS = "SecurityGroups";
|
||||
public static final String SERVER_ADMIN = "AdminActions";
|
||||
public static final String VIRTUAL_INTERFACES = "VirtualInterfaces";
|
||||
public static final String SIMPLE_TENANT_USAGE = "SimpleTenantUsage";
|
||||
public static final String VOLUME_ATTACHMENT = "VolumeAttachmentUpdate";
|
||||
public static final String FLOATING_IP_POOLS = "FloatingIpPools";
|
||||
|
||||
private ExtensionNames() {
|
||||
throw new AssertionError("intentionally unimplemented");
|
||||
}
|
||||
}
|
|
@ -53,7 +53,7 @@ import com.google.common.annotations.Beta;
|
|||
* @see org.jclouds.openstack.nova.v2_0.features.FlavorApi
|
||||
*/
|
||||
@Beta
|
||||
@Extension(of = ServiceType.COMPUTE, namespace = ExtensionNamespaces.FLAVOR_EXTRA_SPECS)
|
||||
@Extension(of = ServiceType.COMPUTE, namespace = ExtensionNamespaces.FLAVOR_EXTRA_SPECS, name = ExtensionNames.FLAVOR_EXTRA_SPECS)
|
||||
@RequestFilters(AuthenticateRequest.class)
|
||||
@Consumes(MediaType.APPLICATION_JSON)
|
||||
@Path("/flavors")
|
||||
|
|
|
@ -46,7 +46,7 @@ import com.google.common.collect.FluentIterable;
|
|||
* Provides access to the OpenStack Compute (Nova) Floating IP extension API.
|
||||
*/
|
||||
@Beta
|
||||
@Extension(of = ServiceType.COMPUTE, namespace = ExtensionNamespaces.FLOATING_IPS)
|
||||
@Extension(of = ServiceType.COMPUTE, namespace = ExtensionNamespaces.FLOATING_IPS, name = ExtensionNames.FLOATING_IPS)
|
||||
@RequestFilters(AuthenticateRequest.class)
|
||||
@Consumes(MediaType.APPLICATION_JSON)
|
||||
public interface FloatingIPApi {
|
||||
|
|
|
@ -16,8 +16,11 @@
|
|||
*/
|
||||
package org.jclouds.openstack.nova.v2_0.extensions;
|
||||
|
||||
import com.google.common.annotations.Beta;
|
||||
import com.google.common.collect.FluentIterable;
|
||||
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.openstack.keystone.v2_0.filters.AuthenticateRequest;
|
||||
import org.jclouds.openstack.nova.v2_0.domain.FloatingIPPool;
|
||||
|
@ -27,13 +30,11 @@ import org.jclouds.rest.annotations.Fallback;
|
|||
import org.jclouds.rest.annotations.RequestFilters;
|
||||
import org.jclouds.rest.annotations.SelectJson;
|
||||
|
||||
import javax.ws.rs.Consumes;
|
||||
import javax.ws.rs.GET;
|
||||
import javax.ws.rs.Path;
|
||||
import javax.ws.rs.core.MediaType;
|
||||
import com.google.common.annotations.Beta;
|
||||
import com.google.common.collect.FluentIterable;
|
||||
|
||||
@Beta
|
||||
@Extension(of = ServiceType.COMPUTE, namespace = ExtensionNamespaces.FLOATING_IP_POOLS)
|
||||
@Extension(of = ServiceType.COMPUTE, namespace = ExtensionNamespaces.FLOATING_IP_POOLS, name = ExtensionNames.FLOATING_IP_POOLS)
|
||||
@Consumes(MediaType.APPLICATION_JSON)
|
||||
@Path("/os-floating-ip-pools")
|
||||
@RequestFilters(AuthenticateRequest.class)
|
||||
|
|
|
@ -51,7 +51,7 @@ import com.google.common.collect.FluentIterable;
|
|||
* Provides access to OpenStack Compute (Nova) Host Administration extension API.
|
||||
*/
|
||||
@Beta
|
||||
@Extension(of = ServiceType.COMPUTE, namespace = ExtensionNamespaces.HOSTS)
|
||||
@Extension(of = ServiceType.COMPUTE, namespace = ExtensionNamespaces.HOSTS, name = ExtensionNames.HOST_ADMINISTRATION)
|
||||
@RequestFilters(AuthenticateRequest.class)
|
||||
@Consumes(MediaType.APPLICATION_JSON)
|
||||
@Path("/os-hosts")
|
||||
|
|
|
@ -49,7 +49,7 @@ import com.google.common.collect.FluentIterable;
|
|||
* Provide access to the OpenStack Compute (Nova) Host Aggregates extension API.
|
||||
*/
|
||||
@Beta
|
||||
@Extension(of = ServiceType.COMPUTE, namespace = ExtensionNamespaces.AGGREGATES)
|
||||
@Extension(of = ServiceType.COMPUTE, namespace = ExtensionNamespaces.AGGREGATES, name = ExtensionNames.HOST_AGGREGATE)
|
||||
@RequestFilters(AuthenticateRequest.class)
|
||||
@Consumes(MediaType.APPLICATION_JSON)
|
||||
@Path("/os-aggregates")
|
||||
|
|
|
@ -16,8 +16,12 @@
|
|||
*/
|
||||
package org.jclouds.openstack.nova.v2_0.extensions;
|
||||
|
||||
import com.google.common.annotations.Beta;
|
||||
import com.google.common.collect.FluentIterable;
|
||||
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.EmptyFluentIterableOnNotFoundOr404;
|
||||
import org.jclouds.openstack.keystone.v2_0.filters.AuthenticateRequest;
|
||||
import org.jclouds.openstack.nova.v2_0.domain.regionscoped.Hypervisor;
|
||||
|
@ -28,17 +32,14 @@ import org.jclouds.rest.annotations.Fallback;
|
|||
import org.jclouds.rest.annotations.RequestFilters;
|
||||
import org.jclouds.rest.annotations.SelectJson;
|
||||
|
||||
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 com.google.common.annotations.Beta;
|
||||
import com.google.common.collect.FluentIterable;
|
||||
|
||||
/**
|
||||
* Provides access to the OpenStack Compute (Nova) Hypervisor Extension API.
|
||||
*/
|
||||
@Beta
|
||||
@Extension(of = ServiceType.COMPUTE, namespace = ExtensionNamespaces.HYPERVISORS)
|
||||
@Extension(of = ServiceType.COMPUTE, namespace = ExtensionNamespaces.HYPERVISORS, name = ExtensionNames.HYPERVISORS)
|
||||
@RequestFilters(AuthenticateRequest.class)
|
||||
@Consumes(MediaType.APPLICATION_JSON)
|
||||
@Path("/os-hypervisors")
|
||||
|
|
|
@ -51,7 +51,7 @@ import com.google.common.collect.FluentIterable;
|
|||
* Provides access to the OpenStack Compute (Nova) Key Pair Extension API.
|
||||
*/
|
||||
@Beta
|
||||
@Extension(of = ServiceType.COMPUTE, namespace = ExtensionNamespaces.KEYPAIRS)
|
||||
@Extension(of = ServiceType.COMPUTE, namespace = ExtensionNamespaces.KEYPAIRS, name = ExtensionNames.KEYPAIRS)
|
||||
@RequestFilters(AuthenticateRequest.class)
|
||||
@Consumes(MediaType.APPLICATION_JSON)
|
||||
@Path("/os-keypairs")
|
||||
|
|
|
@ -51,7 +51,7 @@ import com.google.common.annotations.Beta;
|
|||
*
|
||||
*/
|
||||
@Beta
|
||||
@Extension(of = ServiceType.COMPUTE, namespace = ExtensionNamespaces.QUOTAS)
|
||||
@Extension(of = ServiceType.COMPUTE, namespace = ExtensionNamespaces.QUOTAS, name = ExtensionNames.QUOTAS)
|
||||
@RequestFilters(AuthenticateRequest.class)
|
||||
@Consumes(MediaType.APPLICATION_JSON)
|
||||
@Path("/os-quota-sets")
|
||||
|
|
|
@ -51,7 +51,7 @@ import com.google.common.collect.FluentIterable;
|
|||
* Provides access to the OpenStack Compute (Nova) Security Group extension API.
|
||||
*/
|
||||
@Beta
|
||||
@Extension(of = ServiceType.COMPUTE, namespace = ExtensionNamespaces.SECURITY_GROUPS)
|
||||
@Extension(of = ServiceType.COMPUTE, namespace = ExtensionNamespaces.SECURITY_GROUPS, name = ExtensionNames.SECURITY_GROUPS)
|
||||
@RequestFilters(AuthenticateRequest.class)
|
||||
@Consumes(MediaType.APPLICATION_JSON)
|
||||
public interface SecurityGroupApi {
|
||||
|
|
|
@ -50,7 +50,7 @@ import com.google.common.annotations.Beta;
|
|||
*
|
||||
*/
|
||||
@Beta
|
||||
@Extension(of = ServiceType.COMPUTE, namespace = ExtensionNamespaces.ADMIN_ACTIONS)
|
||||
@Extension(of = ServiceType.COMPUTE, namespace = ExtensionNamespaces.ADMIN_ACTIONS, name = ExtensionNames.SERVER_ADMIN)
|
||||
@RequestFilters(AuthenticateRequest.class)
|
||||
@Consumes(MediaType.APPLICATION_JSON)
|
||||
@Path("/servers/{id}/action")
|
||||
|
|
|
@ -41,7 +41,7 @@ import com.google.common.collect.FluentIterable;
|
|||
* Provides access to the OpenStack Compute (Nova) Simple Tenant Usage extension API.
|
||||
*/
|
||||
@Beta
|
||||
@Extension(of = ServiceType.COMPUTE, namespace = ExtensionNamespaces.SIMPLE_TENANT_USAGE)
|
||||
@Extension(of = ServiceType.COMPUTE, namespace = ExtensionNamespaces.SIMPLE_TENANT_USAGE, name = ExtensionNames.SIMPLE_TENANT_USAGE)
|
||||
@RequestFilters(AuthenticateRequest.class)
|
||||
@Consumes(MediaType.APPLICATION_JSON)
|
||||
@Path("/os-simple-tenant-usage")
|
||||
|
|
|
@ -39,7 +39,7 @@ import com.google.common.collect.FluentIterable;
|
|||
* Provides access to the OpenStack Compute (Nova) Virtual Interface (VIFs) extension API.
|
||||
*/
|
||||
@Beta
|
||||
@Extension(of = ServiceType.COMPUTE, namespace = ExtensionNamespaces.VIRTUAL_INTERFACES)
|
||||
@Extension(of = ServiceType.COMPUTE, namespace = ExtensionNamespaces.VIRTUAL_INTERFACES, name = ExtensionNames.VIRTUAL_INTERFACES)
|
||||
@RequestFilters(AuthenticateRequest.class)
|
||||
@Consumes(MediaType.APPLICATION_JSON)
|
||||
@Path("/servers")
|
||||
|
|
|
@ -48,7 +48,7 @@ import com.google.common.collect.FluentIterable;
|
|||
* This API strictly handles attaching Volumes to Servers. To create and manage Volumes you need to use the Cinder API.
|
||||
* @see org.jclouds.openstack.cinder.v1.features.VolumeApi
|
||||
*/
|
||||
@Extension(of = ServiceType.COMPUTE, namespace = ExtensionNamespaces.VOLUME_ATTACHMENTS)
|
||||
@Extension(of = ServiceType.COMPUTE, namespace = ExtensionNamespaces.VOLUME_ATTACHMENTS, name = ExtensionNames.VOLUME_ATTACHMENT)
|
||||
@RequestFilters(AuthenticateRequest.class)
|
||||
@Consumes(MediaType.APPLICATION_JSON)
|
||||
@Path("/servers")
|
||||
|
|
|
@ -58,6 +58,17 @@ public class FloatingIPApiExpectTest extends BaseNovaApiExpectTest {
|
|||
|
||||
}
|
||||
|
||||
public void testNamespaceMissingNameFallback() throws Exception {
|
||||
|
||||
NovaApi apiWhenExtensionNotInList = requestsSendResponses(keystoneAuthWithUsernameAndPasswordAndTenantName,
|
||||
responseWithKeystoneAccess, extensionsOfNovaRequest, unmatchedExtensionsOfNovaResponseWithNoNamespace);
|
||||
|
||||
assertEquals(apiWhenExtensionNotInList.getConfiguredRegions(), ImmutableSet.of("az-1.region-a.geo-1", "az-2.region-a.geo-1", "az-3.region-a.geo-1"));
|
||||
|
||||
assertTrue(apiWhenExtensionNotInList.getFloatingIPApi("az-1.region-a.geo-1").isPresent());
|
||||
|
||||
}
|
||||
|
||||
public void testListFloatingIPsWhenResponseIs2xx() throws Exception {
|
||||
HttpRequest list = HttpRequest
|
||||
.builder()
|
||||
|
|
|
@ -35,6 +35,7 @@ public class BaseNovaExpectTest<T> extends BaseRestApiExpectTest<T> {
|
|||
protected HttpRequest extensionsOfNovaRequest;
|
||||
protected HttpResponse extensionsOfNovaResponse;
|
||||
protected HttpResponse unmatchedExtensionsOfNovaResponse;
|
||||
protected HttpResponse unmatchedExtensionsOfNovaResponseWithNoNamespace;
|
||||
protected HttpRequest keystoneAuthWithAccessKeyAndSecretKeyAndTenantId;
|
||||
protected String identityWithTenantId;
|
||||
|
||||
|
@ -48,13 +49,13 @@ public class BaseNovaExpectTest<T> extends BaseRestApiExpectTest<T> {
|
|||
credential);
|
||||
keystoneAuthWithAccessKeyAndSecretKeyAndTenantId = KeystoneFixture.INSTANCE.initialAuthWithAccessKeyAndSecretKeyAndTenantId(identity,
|
||||
credential);
|
||||
|
||||
|
||||
authToken = KeystoneFixture.INSTANCE.getAuthToken();
|
||||
responseWithKeystoneAccess = KeystoneFixture.INSTANCE.responseWithAccess();
|
||||
// now, createContext arg will need tenant prefix
|
||||
identityWithTenantId = KeystoneFixture.INSTANCE.getTenantId() + ":" + identity;
|
||||
identity = KeystoneFixture.INSTANCE.getTenantName() + ":" + identity;
|
||||
|
||||
|
||||
extensionsOfNovaRequest = HttpRequest.builder().method("GET")
|
||||
// NOTE THIS IS NOVA, NOT KEYSTONE
|
||||
.endpoint("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v2/3456/extensions")
|
||||
|
@ -63,16 +64,19 @@ public class BaseNovaExpectTest<T> extends BaseRestApiExpectTest<T> {
|
|||
|
||||
extensionsOfNovaResponse = HttpResponse.builder().statusCode(200)
|
||||
.payload(payloadFromResource("/extension_list_full.json")).build();
|
||||
|
||||
|
||||
unmatchedExtensionsOfNovaResponse = HttpResponse.builder().statusCode(200)
|
||||
.payload(payloadFromResource("/extension_list.json")).build();
|
||||
|
||||
unmatchedExtensionsOfNovaResponseWithNoNamespace = HttpResponse.builder().statusCode(200)
|
||||
.payload(payloadFromResource("/extension_list_full_no_namespaces.json")).build();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected HttpRequestComparisonType compareHttpRequestAsType(HttpRequest input) {
|
||||
return HttpRequestComparisonType.JSON;
|
||||
}
|
||||
|
||||
|
||||
protected HttpRequest.Builder<?> authenticatedGET() {
|
||||
return HttpRequest.builder()
|
||||
.method("GET")
|
||||
|
|
|
@ -0,0 +1,316 @@
|
|||
{
|
||||
"extensions": [
|
||||
{
|
||||
"updated": "2011-09-27T00:00:00+00:00",
|
||||
"name": "DiskConfig",
|
||||
"links": [],
|
||||
"namespace": "http://fake.org",
|
||||
"alias": "OS-DCF",
|
||||
"description": "Disk Management Extension"
|
||||
},
|
||||
{
|
||||
"updated": "2011-06-29T00:00:00+00:00",
|
||||
"name": "Hosts",
|
||||
"links": [],
|
||||
"namespace": "http://fake.org",
|
||||
"alias": "os-hosts",
|
||||
"description": "Admin-only host administration"
|
||||
},
|
||||
{
|
||||
"updated": "2011-07-19T00:00:00+00:00",
|
||||
"name": "SchedulerHints",
|
||||
"links": [],
|
||||
"namespace": "http://fake.org",
|
||||
"alias": "os-scheduler-hints",
|
||||
"description": "Pass arbitrary key/value pairs to the scheduler"
|
||||
},
|
||||
{
|
||||
"updated": "2011-08-08T00:00:00+00:00",
|
||||
"name": "Quotas",
|
||||
"links": [],
|
||||
"namespace": "http://fake.org",
|
||||
"alias": "os-quota-sets",
|
||||
"description": "Quotas management support"
|
||||
},
|
||||
{
|
||||
"updated": "2011-12-23T00:00:00+00:00",
|
||||
"name": "Floating_ip_dns",
|
||||
"links": [],
|
||||
"namespace": "http://fake.org",
|
||||
"alias": "os-floating-ip-dns",
|
||||
"description": "Floating IP DNS support"
|
||||
},
|
||||
{
|
||||
"updated": "2011-09-14T00:00:00+00:00",
|
||||
"name": "FlavorExtraData",
|
||||
"links": [],
|
||||
"namespace": "http://fake.org",
|
||||
"alias": "OS-FLV-EXT-DATA",
|
||||
"description": "Provide additional data for flavors"
|
||||
},
|
||||
{
|
||||
"updated": "2011-06-23T00:00:00+00:00",
|
||||
"name": "FlavorExtraSpecs",
|
||||
"links": [],
|
||||
"namespace": "http://fake.org",
|
||||
"alias": "os-flavor-extra-specs",
|
||||
"description": "Instance type (flavor) extra specs"
|
||||
},
|
||||
{
|
||||
"updated": "2011-08-17T00:00:00+00:00",
|
||||
"name": "VirtualInterfaces",
|
||||
"links": [],
|
||||
"namespace": "http://fake.org",
|
||||
"alias": "virtual_interfaces",
|
||||
"description": "Virtual interface support"
|
||||
},
|
||||
{
|
||||
"updated": "2011-12-23T00:00:00+00:00",
|
||||
"name": "Accounts",
|
||||
"links": [],
|
||||
"namespace": "http://fake.org",
|
||||
"alias": "os-accounts",
|
||||
"description": "Admin-only access to accounts"
|
||||
},
|
||||
{
|
||||
"updated": "2011-03-25T00:00:00+00:00",
|
||||
"name": "Volumes",
|
||||
"links": [],
|
||||
"namespace": "http://fake.org",
|
||||
"alias": "os-volumes",
|
||||
"description": "Volumes support"
|
||||
},
|
||||
{
|
||||
"updated": "2011-11-03T00:00:00+00:00",
|
||||
"name": "ExtendedStatus",
|
||||
"links": [],
|
||||
"namespace": "http://fake.org",
|
||||
"alias": "OS-EXT-STS",
|
||||
"description": "Extended Status support"
|
||||
},
|
||||
{
|
||||
"updated": "2011-12-23T00:00:00+00:00",
|
||||
"name": "Consoles",
|
||||
"links": [],
|
||||
"namespace": "http://fake.org",
|
||||
"alias": "os-consoles",
|
||||
"description": "Interactive Console support."
|
||||
},
|
||||
{
|
||||
"updated": "2011-07-21T00:00:00+00:00",
|
||||
"name": "SecurityGroups",
|
||||
"links": [],
|
||||
"namespace": "http://fake.org",
|
||||
"alias": "security_groups",
|
||||
"description": "Security group support"
|
||||
},
|
||||
{
|
||||
"updated": "2012-01-12T00:00:00+00:00",
|
||||
"name": "Aggregates",
|
||||
"links": [],
|
||||
"namespace": "http://fake.org",
|
||||
"alias": "os-aggregates",
|
||||
"description": "Admin-only aggregate administration"
|
||||
},
|
||||
{
|
||||
"updated": "2011-07-19T00:00:00+00:00",
|
||||
"name": "Createserverext",
|
||||
"links": [],
|
||||
"namespace": "http://fake.org",
|
||||
"alias": "os-create-server-ext",
|
||||
"description": "Extended support to the Create Server v1.1 API"
|
||||
},
|
||||
{
|
||||
"updated": "2011-09-01T00:00:00+00:00",
|
||||
"name": "DeferredDelete",
|
||||
"links": [],
|
||||
"namespace": "http://fake.org",
|
||||
"alias": "os-deferred-delete",
|
||||
"description": "Instance deferred delete"
|
||||
},
|
||||
{
|
||||
"updated": "2011-12-21T00:00:00+00:00",
|
||||
"name": "ServerDiagnostics",
|
||||
"links": [],
|
||||
"namespace": "http://fake.org",
|
||||
"alias": "os-server-diagnostics",
|
||||
"description": "Allow Admins to view server diagnostics through server action"
|
||||
},
|
||||
{
|
||||
"updated": "2011-12-23T00:00:00+00:00",
|
||||
"name": "Networks",
|
||||
"links": [],
|
||||
"namespace": "http://fake.org",
|
||||
"alias": "os-networks",
|
||||
"description": "Admin-only Network Management Extension"
|
||||
},
|
||||
{
|
||||
"updated": "2011-11-03T00:00:00+00:00",
|
||||
"name": "ExtendedServerAttributes",
|
||||
"links": [],
|
||||
"namespace": "http://fake.org",
|
||||
"alias": "OS-EXT-SRV-ATTR",
|
||||
"description": "Extended Server Attributes support."
|
||||
},
|
||||
{
|
||||
"updated": "2011-08-08T00:00:00+00:00",
|
||||
"name": "Keypairs",
|
||||
"links": [],
|
||||
"namespace": "http://fake.org",
|
||||
"alias": "os-keypairs",
|
||||
"description": "Keypair Support"
|
||||
},
|
||||
{
|
||||
"updated": "2011-08-24T00:00:00+00:00",
|
||||
"name": "VolumeTypes",
|
||||
"links": [],
|
||||
"namespace": "http://fake.org",
|
||||
"alias": "os-volume-types",
|
||||
"description": "Volume types support"
|
||||
},
|
||||
{
|
||||
"updated": "2011-08-19T00:00:00+00:00",
|
||||
"name": "SimpleTenantUsage",
|
||||
"links": [],
|
||||
"namespace": "http://fake.org",
|
||||
"alias": "os-simple-tenant-usage",
|
||||
"description": "Simple tenant usage extension"
|
||||
},
|
||||
{
|
||||
"updated": "2012-01-04T00:00:00+00:00",
|
||||
"name": "Floating_ip_pools",
|
||||
"links": [],
|
||||
"namespace": "http://fake.org",
|
||||
"alias": "os-floating-ip-pools",
|
||||
"description": "Floating IPs support"
|
||||
},
|
||||
{
|
||||
"updated": "2012-01-23T00:00:00+00:00",
|
||||
"name": "ServerStartStop",
|
||||
"links": [],
|
||||
"namespace": "http://fake.org",
|
||||
"alias": "os-server-start-stop",
|
||||
"description": "Start/Stop instance compute API support"
|
||||
},
|
||||
{
|
||||
"updated": "2012-01-19T00:00:00+00:00",
|
||||
"name": "Certificates",
|
||||
"links": [],
|
||||
"namespace": "http://fake.org",
|
||||
"alias": "os-certificates",
|
||||
"description": "Certificates support"
|
||||
},
|
||||
{
|
||||
"updated": "2011-08-18T00:00:00+00:00",
|
||||
"name": "Rescue",
|
||||
"links": [],
|
||||
"namespace": "http://fake.org",
|
||||
"alias": "os-rescue",
|
||||
"description": "Instance rescue mode"
|
||||
},
|
||||
{
|
||||
"updated": "2012-01-19T00:00:00+00:00",
|
||||
"name": "FlavorManage",
|
||||
"links": [],
|
||||
"namespace": "http://fake.org",
|
||||
"alias": "os-flavor-manage",
|
||||
"description": "\n Flavor create/delete API support\n "
|
||||
},
|
||||
{
|
||||
"updated": "2011-12-16T00:00:00+00:00",
|
||||
"name": "Cloudpipe",
|
||||
"links": [],
|
||||
"namespace": "http://fake.org",
|
||||
"alias": "os-cloudpipe",
|
||||
"description": "Adds actions to create cloudpipe instances.\n\n When running with the Vlan network mode, you need a mechanism to route\n from the public Internet to your vlans. This mechanism is known as a\n cloudpipe.\n\n At the time of creating this class, only OpenVPN is supported. Support for\n a SSH Bastion host is forthcoming.\n "
|
||||
},
|
||||
{
|
||||
"updated": "2011-06-09T00:00:00+00:00",
|
||||
"name": "Multinic",
|
||||
"links": [],
|
||||
"namespace": "http://fake.org",
|
||||
"alias": "NMN",
|
||||
"description": "Multiple network support"
|
||||
},
|
||||
{
|
||||
"updated": "2011-08-08T00:00:00+00:00",
|
||||
"name": "Users",
|
||||
"links": [],
|
||||
"namespace": "http://fake.org",
|
||||
"alias": "os-users",
|
||||
"description": "Allow admins to acces user information"
|
||||
},
|
||||
{
|
||||
"updated": "2011-09-20T00:00:00+00:00",
|
||||
"name": "AdminActions",
|
||||
"links": [],
|
||||
"namespace": "http://fake.org",
|
||||
"alias": "os-admin-actions",
|
||||
"description": "Enable admin-only server actions\n\n Actions include: pause,unpause, suspend, resume, migrate,\n resetNetwork, injectNetworkInfo, lock, unlock, createBackup\n "
|
||||
},
|
||||
{
|
||||
"updated": "2011-12-21T00:00:00+00:00",
|
||||
"name": "ServerActionList",
|
||||
"links": [],
|
||||
"namespace": "http://fake.org",
|
||||
"alias": "os-server-action-list",
|
||||
"description": "Allow Admins to view pending server actions"
|
||||
},
|
||||
{
|
||||
"updated": "2011-12-08T00:00:00+00:00",
|
||||
"name": "Console_output",
|
||||
"links": [],
|
||||
"namespace": "http://fake.org",
|
||||
"alias": "os-console-output",
|
||||
"description": "Console log output support, with tailing ability."
|
||||
},
|
||||
{
|
||||
"updated": "2011-06-16T00:00:00+00:00",
|
||||
"name": "FloatingIps",
|
||||
"links": [],
|
||||
"namespace": "http://fake.org",
|
||||
"alias": "os-floating-ips",
|
||||
"description": "Floating IPs support"
|
||||
},
|
||||
{
|
||||
"updated": "2012-12-21T00:00:00+00:00",
|
||||
"name": "AvailabilityZone",
|
||||
"links": [],
|
||||
"namespace": "http://fake.org",
|
||||
"alias": "os-availability-zone",
|
||||
"description": "1. Add availability_zone to the Create Server v1.1 API.\n 2. Add availability zones describing.\n "
|
||||
},
|
||||
{
|
||||
"updated": "2013-07-08T00:00:00+00:00",
|
||||
"name": "BlockDeviceMappingV2Boot",
|
||||
"links": [],
|
||||
"namespace": "http://fake.org",
|
||||
"alias": "os-block-device-mapping-v2-boot",
|
||||
"description": "Allow boot with the new BDM data format."
|
||||
},
|
||||
{
|
||||
"alias": "os-volume-attachment-update",
|
||||
"description": "Support for updating a volume attachment.",
|
||||
"links": [],
|
||||
"name": "VolumeAttachmentUpdate",
|
||||
"namespace": "http://fake.org",
|
||||
"updated": "2013-06-20T00:00:00Z"
|
||||
},
|
||||
{
|
||||
"updated": "2012-07-22T00:00:00Z",
|
||||
"name": "AttachInterfaces",
|
||||
"links": [],
|
||||
"namespace": "http://fake.org",
|
||||
"alias": "os-attach-interfaces",
|
||||
"description": "Attach interface support."
|
||||
},
|
||||
{
|
||||
"updated": "2012-06-21T00:00:00Z",
|
||||
"name": "Hypervisors",
|
||||
"links": [],
|
||||
"namespace": "http://fake.org",
|
||||
"alias": "os-hypervisors",
|
||||
"description": "Admin-only hypervisor administration."
|
||||
}
|
||||
]
|
||||
}
|
Loading…
Reference in New Issue