Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

mgmt doc on LRO beginCreate/beginDelete #12899

Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Next Next commit
support beginCreate beginDelete for GenericResource
  • Loading branch information
weidongxu-microsoft committed Jul 8, 2020
commit 64cd62bcb66caf5d7d6eef507ea03ac40d76a340
Original file line number Diff line number Diff line change
Expand Up @@ -269,13 +269,11 @@ protected <T extends Indexable> T taskResult(String key) {
}
}

@SuppressWarnings("unchecked")
protected Function<InnerModelT, FluentModelT> innerToFluentMap(final FluentModelImplT fluentModelImplT) {
return new Function<InnerModelT, FluentModelT>() {
@Override
public FluentModelT apply(InnerModelT innerModel) {
fluentModelImplT.setInner(innerModel);
return (FluentModelT) fluentModelImplT;
}
return innerModel -> {
fluentModelImplT.setInner(innerModel);
return (FluentModelT) fluentModelImplT;
};
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,6 @@ public void deleteById(String id) {
deleteByIdAsync(id).block();
}


@Override
public Mono<Void> deleteByIdAsync(String id) {
return deleteByResourceGroupAsync(ResourceUtils.groupFromResourceId(id), ResourceUtils.nameFromResourceId(id));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,11 @@

package com.azure.resourcemanager.resources.implementation;

import com.azure.core.http.rest.Response;
import com.azure.core.util.logging.ClientLogger;
import com.azure.resourcemanager.resources.ResourceManager;
import com.azure.resourcemanager.resources.fluentcore.model.Accepted;
import com.azure.resourcemanager.resources.fluentcore.model.implementation.AcceptedImpl;
import com.azure.resourcemanager.resources.models.GenericResource;
import com.azure.resourcemanager.resources.models.Plan;
import com.azure.resourcemanager.resources.fluentcore.arm.ResourceUtils;
Expand All @@ -12,8 +16,11 @@
import com.azure.resourcemanager.resources.fluent.inner.GenericResourceInner;
import com.azure.resourcemanager.resources.ResourceManagementClient;
import com.azure.resourcemanager.resources.fluent.ResourcesClient;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

import java.nio.ByteBuffer;

/**
* The implementation for GenericResource and its nested interfaces.
*/
Expand All @@ -28,6 +35,9 @@ final class GenericResourceImpl
GenericResource.Definition,
GenericResource.UpdateStages.WithApiVersion,
GenericResource.Update {

private final ClientLogger logger = new ClientLogger(GenericResourceImpl.class);

private String resourceProviderNamespace;
private String parentResourcePath;
private String resourceType;
Expand Down Expand Up @@ -140,33 +150,44 @@ public GenericResourceImpl withApiVersion(String apiVersion) {
return this;
}

// CreateUpdateTaskGroup.ResourceCreator implementation
@Override
public Mono<GenericResource> createResourceAsync() {
final GenericResourceImpl self = this;
Mono<String> observable = null;
if (apiVersion != null) {
observable = Mono.just(apiVersion);
public Accepted<GenericResource> beginCreate() {
String apiVersion = this.getApiVersionAsync().block();

String name = this.name();
if (!isInCreateMode()) {
name = ResourceUtils.nameFromResourceId(inner().id());
}

Response<Flux<ByteBuffer>> activationResponse = this.manager().inner().getResources()
.createOrUpdateWithResponseAsync(
resourceGroupName(),
resourceProviderNamespace,
parentResourcePath(),
resourceType,
name,
apiVersion,
inner()).block();
if (activationResponse == null) {
throw logger.logExceptionAsError(new NullPointerException());
} else {
final ResourceManagementClient serviceClient = this.manager().inner();
observable = this.manager().providers().getByNameAsync(resourceProviderNamespace)
.flatMap(provider -> {
String id;
if (!isInCreateMode()) {
id = inner().id();
} else {
id = ResourceUtils.constructResourceId(
serviceClient.getSubscriptionId(),
resourceGroupName(),
resourceProviderNamespace(),
resourceType(),
this.name(),
parentResourcePath());
}
self.apiVersion = ResourceUtils.defaultApiVersion(id, provider);
return Mono.just(self.apiVersion);
});
Accepted<GenericResource> accepted = new AcceptedImpl<GenericResourceInner, GenericResource>(
activationResponse,
this.manager().inner().getSerializerAdapter(),
this.manager().inner().getHttpPipeline(),
GenericResourceInner.class,
GenericResourceInner.class,
inner -> new GenericResourceImpl(inner.id(), inner, this.manager()));

setInner(accepted.getAcceptedResult().getValue().inner());
return accepted;
}
}

// CreateUpdateTaskGroup.ResourceCreator implementation
@Override
public Mono<GenericResource> createResourceAsync() {
Mono<String> observable = this.getApiVersionAsync();
final ResourcesClient resourceClient = this.manager().inner().getResources();
return observable
.flatMap(api -> {
Expand All @@ -183,7 +204,34 @@ public Mono<GenericResource> createResourceAsync() {
api,
inner())
.subscribeOn(SdkContext.getReactorScheduler())
.map(innerToFluentMap(self));
.map(innerToFluentMap(this));
});
}

private Mono<String> getApiVersionAsync() {
Mono<String> apiVersion;
if (this.apiVersion != null) {
apiVersion = Mono.just(this.apiVersion);
} else {
final ResourceManagementClient serviceClient = this.manager().inner();
apiVersion = this.manager().providers().getByNameAsync(resourceProviderNamespace)
.flatMap(provider -> {
String id;
if (!isInCreateMode()) {
id = inner().id();
} else {
id = ResourceUtils.constructResourceId(
serviceClient.getSubscriptionId(),
resourceGroupName(),
resourceProviderNamespace(),
resourceType(),
this.name(),
parentResourcePath());
}
this.apiVersion = ResourceUtils.defaultApiVersion(id, provider);
return Mono.just(this.apiVersion);
});
}
return apiVersion;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,11 @@

import com.azure.core.http.rest.PagedFlux;
import com.azure.core.http.rest.PagedIterable;
import com.azure.core.http.rest.Response;
import com.azure.core.util.logging.ClientLogger;
import com.azure.resourcemanager.resources.ResourceManager;
import com.azure.resourcemanager.resources.fluentcore.model.Accepted;
import com.azure.resourcemanager.resources.fluentcore.model.implementation.AcceptedImpl;
import com.azure.resourcemanager.resources.models.GenericResource;
import com.azure.resourcemanager.resources.models.GenericResources;
import com.azure.resourcemanager.resources.models.ResourceGroup;
Expand All @@ -17,9 +20,12 @@
import com.azure.resourcemanager.resources.fluentcore.utils.Utils;
import com.azure.resourcemanager.resources.fluent.inner.GenericResourceInner;
import com.azure.resourcemanager.resources.fluent.ResourcesClient;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

import java.nio.ByteBuffer;
import java.util.List;
import java.util.function.Function;

/**
* Implementation of the {@link GenericResources}.
Expand Down Expand Up @@ -179,7 +185,6 @@ public Mono<Void> deleteAsync(String resourceGroupName, String resourceProviderN
parentResourcePath, resourceType, resourceName, apiVersion);
}


@Override
protected GenericResourceImpl wrapModel(String id) {
return new GenericResourceImpl(id, new GenericResourceInner(), this.manager())
Expand Down Expand Up @@ -222,6 +227,24 @@ public Mono<Void> deleteByIdAsync(final String id) {
.flatMap(apiVersion -> inner.deleteByIdAsync(id, apiVersion));
}

@Override
public Accepted<Void> beginDeleteById(String id) {
String apiVersion = getApiVersionFromId(id).block();

Response<Flux<ByteBuffer>> activationResponse = this.inner()
.deleteByIdWithResponseAsync(id, apiVersion).block();
if (activationResponse == null) {
throw logger.logExceptionAsError(new NullPointerException());
} else {
return new AcceptedImpl<Void, Void>(activationResponse,
manager().inner().getSerializerAdapter(),
manager().inner().getHttpPipeline(),
Void.class,
Void.class,
Function.identity());
}
}

private Mono<String> getApiVersionFromId(final String id) {
return this.manager().providers().getByNameAsync(ResourceUtils.resourceProviderFromResourceId(id))
.map(provider -> ResourceUtils.defaultApiVersion(id, provider));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import com.azure.core.annotation.Fluent;
import com.azure.resourcemanager.resources.fluentcore.arm.models.GroupableResource;
import com.azure.resourcemanager.resources.fluentcore.arm.models.Resource;
import com.azure.resourcemanager.resources.fluentcore.model.Accepted;
import com.azure.resourcemanager.resources.fluentcore.model.Appliable;
import com.azure.resourcemanager.resources.fluentcore.model.Creatable;
import com.azure.resourcemanager.resources.fluentcore.model.Refreshable;
Expand Down Expand Up @@ -181,6 +182,13 @@ interface WithCreate extends
* @return the next stage of generic resource definition
*/
WithCreate withProperties(Object properties);

/**
* Begins creating the Azure resource.
*
* @return the accepted create operation
*/
Accepted<GenericResource> beginCreate();
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
import com.azure.resourcemanager.resources.fluentcore.collection.SupportsDeletingById;
import com.azure.resourcemanager.resources.fluentcore.collection.SupportsListing;
import com.azure.resourcemanager.resources.ResourceManager;
import com.azure.resourcemanager.resources.fluentcore.model.Accepted;
import reactor.core.publisher.Mono;

import java.util.List;
Expand Down Expand Up @@ -136,4 +137,12 @@ void delete(String resourceGroupName, String resourceProviderNamespace,
*/
Mono<Void> deleteAsync(String resourceGroupName, String resourceProviderNamespace,
String parentResourcePath, String resourceType, String resourceName, String apiVersion);

/**
* Begins deleting a resource from Azure, identifying it by its resource ID.
*
* @param id the resource ID of the resource to delete
* @return the accepted deleting operation
*/
Accepted<Void> beginDeleteById(String id);
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,14 @@

import com.azure.core.http.HttpPipeline;
import com.azure.core.http.rest.PagedIterable;
import com.azure.core.util.polling.LongRunningOperationStatus;
import com.azure.core.util.polling.PollResponse;
import com.azure.resourcemanager.resources.fluent.inner.GenericResourceExpandedInner;
import com.azure.resourcemanager.resources.fluentcore.arm.Region;
import com.azure.resourcemanager.resources.fluentcore.arm.ResourceUtils;
import com.azure.resourcemanager.resources.fluentcore.model.Accepted;
import com.azure.resourcemanager.resources.fluentcore.profile.AzureProfile;
import com.azure.resourcemanager.resources.fluentcore.utils.SdkContext;
import com.azure.resourcemanager.resources.models.GenericResource;
import com.azure.resourcemanager.resources.models.GenericResources;
import com.azure.resourcemanager.resources.models.ResourceGroups;
Expand All @@ -15,6 +21,7 @@
import org.junit.jupiter.api.Test;

import java.util.Arrays;
import java.util.Optional;

public class GenericResourcesTests extends ResourceManagerTestBase {
private ResourceGroups resourceGroups;
Expand Down Expand Up @@ -87,4 +94,51 @@ public void canCreateUpdateMoveResource() throws Exception {
Assertions.assertFalse(genericResources.checkExistence(newRgName, resource.resourceProviderNamespace(), resource.parentResourcePath(), resource.resourceType(), resource.name(), resource.apiVersion()));
Assertions.assertFalse(genericResources.checkExistenceById(resource.id()));
}

@Test
public void canCreateDeleteResourceSyncPoll() throws Exception {
final String resourceName = "rs" + testId;
// Create
Accepted<GenericResource> acceptedResource = genericResources.define(resourceName)
.withRegion(Region.US_SOUTH_CENTRAL)
.withExistingResourceGroup(rgName)
.withResourceType("sites")
.withProviderNamespace("Microsoft.Web")
.withoutPlan()
.withParentResourcePath("")
.withProperties(new ObjectMapper().readTree("{\"SiteMode\":\"Limited\",\"ComputeMode\":\"Shared\"}"))
.beginCreate();

LongRunningOperationStatus pollStatus = acceptedResource.getAcceptedResult().getStatus();
int delayInMills = acceptedResource.getAcceptedResult().getRetryAfter() == null
? 0
: (int) acceptedResource.getAcceptedResult().getRetryAfter().toMillis();
while (!pollStatus.isComplete()) {
SdkContext.sleep(delayInMills);

PollResponse<Void> pollResponse = acceptedResource.getSyncPoller().poll();
pollStatus = pollResponse.getStatus();
delayInMills = pollResponse.getRetryAfter() == null
? 10000
: (int) pollResponse.getRetryAfter().toMillis();
}
Assertions.assertEquals(LongRunningOperationStatus.SUCCESSFULLY_COMPLETED, pollStatus);
GenericResource resource = acceptedResource.getFinalResult();
Assertions.assertNotNull(resource.id());
Assertions.assertEquals(resourceName, ResourceUtils.nameFromResourceId(resource.id()));

PagedIterable<GenericResourceExpandedInner> resources =
genericResources.manager().inner().getResources()
.listByResourceGroup(rgName, null, "provisioningState", null);
Optional<GenericResourceExpandedInner> resourceOpt
= resources.stream().filter(r -> resourceName.equals(r.name())).findFirst();
Assertions.assertTrue(resourceOpt.isPresent());
Assertions.assertEquals("Succeeded", resourceOpt.get().provisioningState());

Accepted<Void> acceptedDelete = genericResources.beginDeleteById(resource.id());
acceptedDelete.getFinalResult();
PagedIterable<GenericResource> resourcesAfterDelete = genericResources.listByResourceGroup(rgName);
boolean deleted = resourcesAfterDelete.stream().noneMatch(r -> resourceName.equals(r.name()));
Assertions.assertTrue(deleted);
}
}
Loading