Skip to content

Commit abb3459

Browse files
authored
mgmt compute, support beginCreate with context for VirtualMachine (#45597)
* code * add context to co-related resources * changelog.md * fix * assets.json * checkstyle * address comments * verify PUT count * recording
1 parent f38ba08 commit abb3459

File tree

6 files changed

+89
-4
lines changed

6 files changed

+89
-4
lines changed

sdk/resourcemanager/azure-resourcemanager-compute/CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44

55
### Features Added
66

7+
- Supported `beginCreate(Context)` in `VirtualMachine`.
8+
79
### Breaking Changes
810

911
### Bugs Fixed

sdk/resourcemanager/azure-resourcemanager-compute/assets.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,5 @@
22
"AssetsRepo": "Azure/azure-sdk-assets",
33
"AssetsRepoPrefixPath": "java",
44
"TagPrefix": "java/resourcemanager/azure-resourcemanager-compute",
5-
"Tag": "java/resourcemanager/azure-resourcemanager-compute_db05ab8f85"
5+
"Tag": "java/resourcemanager/azure-resourcemanager-compute_6e783cad01"
66
}

sdk/resourcemanager/azure-resourcemanager-compute/pom.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,8 @@
5353
--add-opens com.azure.resourcemanager.resources/com.azure.resourcemanager.resources=ALL-UNNAMED
5454
--add-opens com.azure.resourcemanager.resources/com.azure.resourcemanager.resources.fluentcore.arm=ALL-UNNAMED
5555
--add-opens com.azure.resourcemanager.storage/com.azure.resourcemanager.storage=ALL-UNNAMED
56+
--add-opens com.azure.core/com.azure.core.http=com.azure.resourcemanager.compute
57+
--add-opens com.azure.core/com.azure.core.http.policy=com.azure.resourcemanager.compute
5658

5759
--add-opens com.azure.core/com.azure.core.implementation.util=ALL-UNNAMED
5860
</javaModulesSurefireArgLine>

sdk/resourcemanager/azure-resourcemanager-compute/src/main/java/com/azure/resourcemanager/compute/implementation/VirtualMachineImpl.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import com.azure.core.management.serializer.SerializerFactory;
1111
import com.azure.core.util.Context;
1212
import com.azure.core.util.CoreUtils;
13+
import com.azure.core.util.FluxUtil;
1314
import com.azure.core.util.logging.ClientLogger;
1415
import com.azure.core.util.serializer.SerializerAdapter;
1516
import com.azure.core.util.serializer.SerializerEncoding;
@@ -2089,23 +2090,29 @@ private Mono<VirtualMachine> prepareCreateResourceAsync() {
20892090
}
20902091

20912092
public Accepted<VirtualMachine> beginCreate() {
2093+
return beginCreate(Context.NONE);
2094+
}
2095+
2096+
public Accepted<VirtualMachine> beginCreate(Context context) {
20922097
return AcceptedImpl.<VirtualMachine, VirtualMachineInner>newAccepted(logger,
20932098
this.manager().serviceClient().getHttpPipeline(), this.manager().serviceClient().getDefaultPollInterval(),
20942099
() -> this.manager()
20952100
.serviceClient()
20962101
.getVirtualMachines()
20972102
.createOrUpdateWithResponseAsync(resourceGroupName(), vmName, innerModel(), null, null)
2103+
.contextWrite(c -> c.putAll(FluxUtil.toReactorContext(context).readOnly()))
20982104
.block(),
20992105
inner -> new VirtualMachineImpl(inner.name(), inner, this.manager(), this.storageManager,
21002106
this.networkManager, this.authorizationManager),
21012107
VirtualMachineInner.class, () -> {
21022108
Flux<Indexable> dependencyTasksAsync
2103-
= taskGroup().invokeDependencyAsync(taskGroup().newInvocationContext());
2109+
= taskGroup().invokeDependencyAsync(taskGroup().newInvocationContext())
2110+
.contextWrite(c -> c.putAll(FluxUtil.toReactorContext(context).readOnly()));
21042111
dependencyTasksAsync.blockLast();
21052112

21062113
// same as createResourceAsync
21072114
prepareCreateResourceAsync().block();
2108-
}, this::reset, Context.NONE);
2115+
}, this::reset, context);
21092116
}
21102117

21112118
@Override

sdk/resourcemanager/azure-resourcemanager-compute/src/main/java/com/azure/resourcemanager/compute/models/VirtualMachine.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import com.azure.core.annotation.Fluent;
77
import com.azure.core.http.rest.PagedIterable;
88
import com.azure.core.management.Region;
9+
import com.azure.core.util.Context;
910
import com.azure.resourcemanager.authorization.models.BuiltInRole;
1011
import com.azure.resourcemanager.compute.ComputeManager;
1112
import com.azure.resourcemanager.compute.fluent.models.VirtualMachineInner;
@@ -2190,6 +2191,18 @@ interface WithCreate extends Creatable<VirtualMachine>, Resource.DefinitionWithT
21902191
* @return the accepted create operation
21912192
*/
21922193
Accepted<VirtualMachine> beginCreate();
2194+
2195+
/**
2196+
* Begins creating the virtual machine resource.
2197+
*
2198+
* Virtual machine extensions can only be created after the completion of virtual machine.
2199+
* Therefore, the configuration of virtual machine extensions is not compatible with this operation.
2200+
* Please use {@link WithCreate#create(Context)} if virtual machine extensions is configured.
2201+
*
2202+
* @param context the {@link Context} of the request
2203+
* @return the accepted create operation
2204+
*/
2205+
Accepted<VirtualMachine> beginCreate(Context context);
21932206
}
21942207
}
21952208

sdk/resourcemanager/azure-resourcemanager-compute/src/test/java/com/azure/resourcemanager/compute/VirtualMachineOperationsTests.java

Lines changed: 62 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,10 @@
33

44
package com.azure.resourcemanager.compute;
55

6+
import com.azure.core.http.HttpMethod;
67
import com.azure.core.http.HttpPipeline;
8+
import com.azure.core.http.HttpPipelineBuilder;
9+
import com.azure.core.http.policy.HttpPipelinePolicy;
710
import com.azure.core.http.rest.PagedIterable;
811
import com.azure.core.http.rest.PagedResponse;
912
import com.azure.core.http.rest.Response;
@@ -40,8 +43,8 @@
4043
import com.azure.resourcemanager.compute.models.RunCommandInputParameter;
4144
import com.azure.resourcemanager.compute.models.RunCommandResult;
4245
import com.azure.resourcemanager.compute.models.SecurityTypes;
43-
import com.azure.resourcemanager.compute.models.StorageAccountTypes;
4446
import com.azure.resourcemanager.compute.models.Sku;
47+
import com.azure.resourcemanager.compute.models.StorageAccountTypes;
4548
import com.azure.resourcemanager.compute.models.UpgradeMode;
4649
import com.azure.resourcemanager.compute.models.VirtualMachine;
4750
import com.azure.resourcemanager.compute.models.VirtualMachineDiskOptions;
@@ -74,6 +77,7 @@
7477
import com.azure.resourcemanager.resources.models.ResourceGroup;
7578
import com.azure.resourcemanager.storage.models.StorageAccount;
7679
import com.azure.resourcemanager.storage.models.StorageAccountSkuType;
80+
import com.azure.resourcemanager.test.utils.TestIdentifierProvider;
7781
import com.azure.security.keyvault.keys.models.KeyType;
7882
import org.junit.jupiter.api.Assertions;
7983
import org.junit.jupiter.api.Disabled;
@@ -89,6 +93,7 @@
8993
import java.util.Locale;
9094
import java.util.Map;
9195
import java.util.Set;
96+
import java.util.UUID;
9297
import java.util.concurrent.atomic.AtomicInteger;
9398

9499
public class VirtualMachineOperationsTests extends ComputeManagementTest {
@@ -105,11 +110,13 @@ public class VirtualMachineOperationsTests extends ComputeManagementTest {
105110
private final String availabilitySetName = "availset1";
106111
private final String availabilitySetName2 = "availset2";
107112
private final ProximityPlacementGroupType proxGroupType = ProximityPlacementGroupType.STANDARD;
113+
private AzureProfile profile;
108114

109115
@Override
110116
protected void initializeClients(HttpPipeline httpPipeline, AzureProfile profile) {
111117
rgName = generateRandomResourceName("javacsmrg", 15);
112118
rgName2 = generateRandomResourceName("javacsmrg2", 15);
119+
this.profile = profile;
113120
super.initializeClients(httpPipeline, profile);
114121
}
115122

@@ -2303,7 +2310,61 @@ public void canCreateDiskWithShares() {
23032310
Assertions.assertEquals(2, disk.virtualMachineIds().size());
23042311
}
23052312

2313+
@Test
2314+
public void canBeginCreateWithContext() {
2315+
final String vmName = generateRandomResourceName("jvm", 15);
2316+
final String correlationId = UUID.randomUUID().toString();
2317+
final String correlationKey = "x-ms-correlation-id";
2318+
final String publicIpDnsLabel = generateRandomResourceName("pip", 20);
2319+
final AtomicInteger createCounter = new AtomicInteger(0);
2320+
HttpPipelinePolicy verificationPolicy = (context, next) -> {
2321+
if (context.getHttpRequest().getHttpMethod() == HttpMethod.PUT) {
2322+
// verify that all co-related resource creation requests will have the Context information
2323+
Object correlationData = context.getContext().getData(correlationKey).get();
2324+
Assertions.assertEquals(correlationId, correlationData);
2325+
createCounter.incrementAndGet();
2326+
}
2327+
return next.process();
2328+
};
2329+
ComputeManager localComputeManager = buildComputeManager(computeManager.httpPipeline(), verificationPolicy);
2330+
2331+
Accepted<VirtualMachine> accepted = localComputeManager.virtualMachines()
2332+
.define(vmName)
2333+
.withRegion(region)
2334+
.withNewResourceGroup(rgName)
2335+
.withNewPrimaryNetwork("10.0.0.0/28")
2336+
.withPrimaryPrivateIPAddressDynamic()
2337+
.withNewPrimaryPublicIPAddress(publicIpDnsLabel)
2338+
.withPopularLinuxImage(KnownLinuxVirtualMachineImage.UBUNTU_SERVER_20_04_LTS)
2339+
.withRootUsername("Foo12")
2340+
.withSsh(sshPublicKey())
2341+
.withSize(VirtualMachineSizeTypes.STANDARD_B1S)
2342+
.beginCreate(new Context(correlationKey, correlationId));
2343+
accepted.getFinalResult();
2344+
2345+
// resourceGroup + network + neworkInterface + publicIp + VM = 5
2346+
Assertions.assertEquals(5, createCounter.get());
2347+
}
2348+
23062349
// *********************************** helper methods ***********************************
2350+
private ComputeManager buildComputeManager(HttpPipeline httpPipeline, HttpPipelinePolicy policy) {
2351+
List<HttpPipelinePolicy> pipelinePolicies = new ArrayList<>();
2352+
for (int i = 0; i < httpPipeline.getPolicyCount(); i++) {
2353+
pipelinePolicies.add(httpPipeline.getPolicy(i));
2354+
}
2355+
2356+
pipelinePolicies.add(policy);
2357+
2358+
HttpPipeline newPipeline = new HttpPipelineBuilder().httpClient(httpPipeline.getHttpClient())
2359+
.policies(pipelinePolicies.toArray(new HttpPipelinePolicy[0]))
2360+
.tracer(httpPipeline.getTracer())
2361+
.build();
2362+
ComputeManager manager = ComputeManager.authenticate(newPipeline, profile);
2363+
ResourceManagerUtils.InternalRuntimeContext internalContext = new ResourceManagerUtils.InternalRuntimeContext();
2364+
internalContext.setIdentifierFunction(name -> new TestIdentifierProvider(testResourceNamer));
2365+
setInternalContext(internalContext, manager);
2366+
return manager;
2367+
}
23072368

23082369
private CreatablesInfo prepareCreatableVirtualMachines(Region region, String vmNamePrefix, String networkNamePrefix,
23092370
String publicIpNamePrefix, int vmCount) {

0 commit comments

Comments
 (0)