mirror of https://github.com/apache/jclouds.git
[azurecompute-arm] performance improvements misc
- improve cleanup performances: by using resourceGroupApi.resources
This commit is contained in:
parent
9519021564
commit
ae9d4b366f
|
@ -16,12 +16,6 @@
|
|||
*/
|
||||
package org.jclouds.azurecompute.arm.compute.strategy;
|
||||
|
||||
import static com.google.common.base.Predicates.notNull;
|
||||
import static com.google.common.collect.Iterables.filter;
|
||||
import static com.google.common.collect.Iterables.transform;
|
||||
import static org.jclouds.azurecompute.arm.config.AzureComputeProperties.TIMEOUT_RESOURCE_DELETED;
|
||||
import static org.jclouds.util.Closeables2.closeQuietly;
|
||||
|
||||
import java.net.URI;
|
||||
import java.util.List;
|
||||
|
||||
|
@ -53,6 +47,12 @@ import com.google.common.cache.LoadingCache;
|
|||
import com.google.common.collect.Iterables;
|
||||
import com.google.common.collect.Lists;
|
||||
|
||||
import static com.google.common.base.Predicates.notNull;
|
||||
import static com.google.common.collect.Iterables.filter;
|
||||
import static com.google.common.collect.Iterables.transform;
|
||||
import static org.jclouds.azurecompute.arm.config.AzureComputeProperties.TIMEOUT_RESOURCE_DELETED;
|
||||
import static org.jclouds.util.Closeables2.closeQuietly;
|
||||
|
||||
@Singleton
|
||||
public class CleanupResources {
|
||||
|
||||
|
@ -165,10 +165,7 @@ public class CleanupResources {
|
|||
|
||||
public boolean deleteResourceGroupIfEmpty(String group) {
|
||||
boolean deleted = false;
|
||||
if (api.getVirtualMachineApi(group).list().isEmpty() && api.getStorageAccountApi(group).list().isEmpty()
|
||||
&& api.getNetworkInterfaceCardApi(group).list().isEmpty()
|
||||
&& api.getPublicIPAddressApi(group).list().isEmpty()
|
||||
&& api.getNetworkSecurityGroupApi(group).list().isEmpty()) {
|
||||
if (api.getResourceGroupApi().resources(group).isEmpty()) {
|
||||
logger.debug(">> the resource group %s is empty. Deleting...", group);
|
||||
deleted = resourceDeleted.apply(api.getResourceGroupApi().delete(group));
|
||||
}
|
||||
|
|
|
@ -0,0 +1,72 @@
|
|||
/*
|
||||
* 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.azurecompute.arm.domain;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
import org.jclouds.javax.annotation.Nullable;
|
||||
import org.jclouds.json.SerializedNames;
|
||||
|
||||
import com.google.auto.value.AutoValue;
|
||||
import com.google.common.collect.ImmutableMap;
|
||||
|
||||
@AutoValue
|
||||
public abstract class Resource {
|
||||
|
||||
@AutoValue
|
||||
public abstract static class Identity {
|
||||
|
||||
public abstract String principalId();
|
||||
public abstract String tenantId();
|
||||
public abstract String type();
|
||||
|
||||
@SerializedNames({"principalId", "tenantId", "type" })
|
||||
public static Identity create(String principalId, String tenantId, String type) {
|
||||
return new AutoValue_Resource_Identity(principalId, tenantId, type);
|
||||
}
|
||||
}
|
||||
|
||||
@AutoValue
|
||||
public abstract static class ResourceProperties{
|
||||
@Nullable
|
||||
public abstract String provisioningState();
|
||||
|
||||
@SerializedNames({"provisioningState"})
|
||||
public static ResourceProperties create(final String provisioningState) {
|
||||
return new AutoValue_Resource_ResourceProperties(provisioningState);
|
||||
}
|
||||
}
|
||||
|
||||
public abstract String id();
|
||||
public abstract String name();
|
||||
public abstract String type();
|
||||
public abstract String location();
|
||||
@Nullable public abstract Map<String, String> tags();
|
||||
@Nullable public abstract Identity identity();
|
||||
@Nullable public abstract SKU sku();
|
||||
@Nullable public abstract String managedBy();
|
||||
@Nullable public abstract String kind();
|
||||
@Nullable public abstract Plan plan();
|
||||
@Nullable public abstract ResourceProperties properties();
|
||||
|
||||
@SerializedNames({"id", "name", "type", "location", "tags", "identity", "sku", "managedBy", "kind", "plan", "properties"})
|
||||
public static Resource create(String id, String name, String type, String location, Map<String, String> tags,
|
||||
Identity identity, SKU sku, String managedBy, String kind, Plan plan, ResourceProperties properties) {
|
||||
return new AutoValue_Resource(id, name, type, location, tags == null ? null : ImmutableMap.copyOf(tags),
|
||||
identity, sku, managedBy, kind, plan, properties);
|
||||
}
|
||||
}
|
|
@ -15,6 +15,7 @@
|
|||
* limitations under the License.
|
||||
*/
|
||||
package org.jclouds.azurecompute.arm.features;
|
||||
|
||||
import java.io.Closeable;
|
||||
import java.net.URI;
|
||||
import java.util.List;
|
||||
|
@ -32,6 +33,7 @@ import javax.ws.rs.core.MediaType;
|
|||
|
||||
import org.jclouds.Fallbacks.EmptyListOnNotFoundOr404;
|
||||
import org.jclouds.Fallbacks.NullOnNotFoundOr404;
|
||||
import org.jclouds.azurecompute.arm.domain.Resource;
|
||||
import org.jclouds.azurecompute.arm.domain.ResourceGroup;
|
||||
import org.jclouds.azurecompute.arm.filters.ApiVersionFilter;
|
||||
import org.jclouds.azurecompute.arm.functions.URIParser;
|
||||
|
@ -76,6 +78,13 @@ public interface ResourceGroupApi extends Closeable{
|
|||
@Nullable
|
||||
ResourceGroup get(@PathParam("name") String name);
|
||||
|
||||
@Named("resourcegroup:resources")
|
||||
@GET
|
||||
@Path("/{name}/resources")
|
||||
@SelectJson("value")
|
||||
@Fallback(EmptyListOnNotFoundOr404.class)
|
||||
List<Resource> resources(@PathParam("name") String name);
|
||||
|
||||
@Named("resourcegroup:update")
|
||||
@PATCH
|
||||
@Produces(MediaType.APPLICATION_JSON)
|
||||
|
|
|
@ -19,6 +19,7 @@ package org.jclouds.azurecompute.arm.features;
|
|||
import java.net.URI;
|
||||
import java.util.List;
|
||||
|
||||
import org.jclouds.azurecompute.arm.domain.Resource;
|
||||
import org.jclouds.azurecompute.arm.domain.ResourceGroup;
|
||||
import org.jclouds.azurecompute.arm.internal.BaseAzureComputeApiLiveTest;
|
||||
import org.testng.annotations.AfterClass;
|
||||
|
@ -42,6 +43,15 @@ public class ResourceGroupApiLiveTest extends BaseAzureComputeApiLiveTest {
|
|||
return api.getResourceGroupApi();
|
||||
}
|
||||
|
||||
@Test(dependsOnMethods = "testCreate")
|
||||
public void testResources() {
|
||||
List<Resource> resources = api().resources(RESOURCE_GROUP_NAME);
|
||||
assertTrue(resources.isEmpty());
|
||||
for (Resource resource : resources) {
|
||||
assertNotNull(resource);
|
||||
}
|
||||
}
|
||||
|
||||
@Test(dependsOnMethods = "testCreate")
|
||||
public void testList() {
|
||||
final List<ResourceGroup> resourceGroups = api().list();
|
||||
|
@ -66,7 +76,6 @@ public class ResourceGroupApiLiveTest extends BaseAzureComputeApiLiveTest {
|
|||
}
|
||||
|
||||
public void testCreate() {
|
||||
|
||||
final ResourceGroup resourceGroup = api().create(RESOURCE_GROUP_NAME, LOCATION, null);
|
||||
assertEquals(resourceGroup.name(), RESOURCE_GROUP_NAME);
|
||||
assertEquals(resourceGroup.location(), LOCATION);
|
||||
|
|
|
@ -16,20 +16,22 @@
|
|||
*/
|
||||
package org.jclouds.azurecompute.arm.features;
|
||||
|
||||
import static com.google.common.collect.Iterables.isEmpty;
|
||||
import static com.google.common.collect.Iterables.size;
|
||||
import static org.testng.Assert.assertNotNull;
|
||||
|
||||
import java.net.URI;
|
||||
import java.util.List;
|
||||
import com.google.common.collect.ImmutableMap;
|
||||
|
||||
import org.jclouds.azurecompute.arm.domain.Resource;
|
||||
import org.jclouds.azurecompute.arm.domain.ResourceGroup;
|
||||
import org.jclouds.azurecompute.arm.internal.BaseAzureComputeApiMockTest;
|
||||
import org.testng.annotations.Test;
|
||||
import static org.testng.Assert.assertTrue;
|
||||
import static org.testng.Assert.assertNull;
|
||||
|
||||
import com.google.common.collect.ImmutableMap;
|
||||
|
||||
import static com.google.common.collect.Iterables.isEmpty;
|
||||
import static com.google.common.collect.Iterables.size;
|
||||
import static org.testng.Assert.assertEquals;
|
||||
import static org.testng.Assert.assertNotNull;
|
||||
import static org.testng.Assert.assertNull;
|
||||
import static org.testng.Assert.assertTrue;
|
||||
|
||||
@Test(groups = "unit", testName = "ResourceGroupApiMockTest", singleThreaded = true)
|
||||
public class ResourceGroupApiMockTest extends BaseAzureComputeApiMockTest {
|
||||
|
@ -147,4 +149,25 @@ public class ResourceGroupApiMockTest extends BaseAzureComputeApiMockTest {
|
|||
assertSent(server, "DELETE", requestUrl + "/jcloudstest" + version);
|
||||
}
|
||||
|
||||
public void testListResourceGroupResources() throws InterruptedException {
|
||||
server.enqueue(jsonResponse("/resourcegroup-resources.json"));
|
||||
|
||||
List<Resource> resources = api.getResourceGroupApi().resources("jcloudstest");
|
||||
|
||||
assertEquals(size(resources), 6);
|
||||
|
||||
assertSent(server, "GET", requestUrl + "/jcloudstest/resources" + version);
|
||||
}
|
||||
|
||||
public void testListResourceGroupResourcesReturns404() throws InterruptedException {
|
||||
server.enqueue(response404());
|
||||
|
||||
List<Resource> resources = api.getResourceGroupApi().resources("jcloudstest");
|
||||
|
||||
assertTrue(isEmpty(resources));
|
||||
|
||||
assertEquals(server.getRequestCount(), 1);
|
||||
assertSent(server, "GET", requestUrl + "/jcloudstest/resources" + version);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -0,0 +1,46 @@
|
|||
{
|
||||
"value": [
|
||||
{
|
||||
"id": "/subscriptions/610bba05-d7a7-4567-96af-48ecbd09453b/resourceGroups/test/providers/Microsoft.Compute/virtualMachines/test",
|
||||
"name": "test",
|
||||
"type": "Microsoft.Compute/virtualMachines",
|
||||
"location": "northeurope"
|
||||
},
|
||||
{
|
||||
"id": "/subscriptions/610bba05-d7a7-4567-96af-48ecbd09453b/resourceGroups/test/providers/Microsoft.Network/networkInterfaces/test641",
|
||||
"name": "test641",
|
||||
"type": "Microsoft.Network/networkInterfaces",
|
||||
"location": "northeurope"
|
||||
},
|
||||
{
|
||||
"id": "/subscriptions/610bba05-d7a7-4567-96af-48ecbd09453b/resourceGroups/test/providers/Microsoft.Network/networkSecurityGroups/test-nsg",
|
||||
"name": "test-nsg",
|
||||
"type": "Microsoft.Network/networkSecurityGroups",
|
||||
"location": "northeurope"
|
||||
},
|
||||
{
|
||||
"id": "/subscriptions/610bba05-d7a7-4567-96af-48ecbd09453b/resourceGroups/test/providers/Microsoft.Network/publicIPAddresses/test-ip",
|
||||
"name": "test-ip",
|
||||
"type": "Microsoft.Network/publicIPAddresses",
|
||||
"location": "northeurope"
|
||||
},
|
||||
{
|
||||
"id": "/subscriptions/610bba05-d7a7-4567-96af-48ecbd09453b/resourceGroups/test/providers/Microsoft.Network/virtualNetworks/test-vnet",
|
||||
"name": "test-vnet",
|
||||
"type": "Microsoft.Network/virtualNetworks",
|
||||
"location": "northeurope"
|
||||
},
|
||||
{
|
||||
"id": "/subscriptions/610bba05-d7a7-4567-96af-48ecbd09453b/resourceGroups/test/providers/Microsoft.Storage/storageAccounts/testjclo",
|
||||
"name": "testjclo",
|
||||
"type": "Microsoft.Storage/storageAccounts",
|
||||
"sku": {
|
||||
"name": "Premium_LRS",
|
||||
"tier": "Premium"
|
||||
},
|
||||
"kind": "Storage",
|
||||
"location": "northeurope",
|
||||
"tags": {}
|
||||
}
|
||||
]
|
||||
}
|
Loading…
Reference in New Issue