@Override public NodeMetadata apply(VirtualMachine virtualMachine) { NodeMetadataBuilder builder = new NodeMetadataBuilder(); builder.id(fromResourceGroupAndName(extractResourceGroup(virtualMachine.id()), virtualMachine.name()) .slashEncode()); builder.providerId(virtualMachine.id()); builder.name(virtualMachine.name()); builder.hostname(virtualMachine.name()); builder.publicAddresses(getPublicIpAddresses(virtualMachine.properties().networkProfile().networkInterfaces())); builder.privateAddresses(getPrivateIpAddresses(virtualMachine.properties().networkProfile().networkInterfaces())); if (virtualMachine.tags() != null) { addMetadataAndParseTagsFromCommaDelimitedValue(builder, virtualMachine.tags()); groupFromMetadata = virtualMachine.tags().get(GROUP_KEY); .name())); String locationName = virtualMachine.location(); builder.location(getLocation(locations, locationName)); Optional<? extends Image> image = findImage(virtualMachine.properties().storageProfile(), locationName); logger.info(">> image with id %s for virtualmachine %s was not found. " + "This might be because the image that was used to create the virtualmachine has a new id.", virtualMachine.id(), virtualMachine.id()); builder.hardware(getHardware(fromLocationAndName(virtualMachine.location(), virtualMachine.properties() .hardwareProfile().vmSize())));
private VirtualMachine getVM(Plan plan) { VirtualMachineProperties properties = getVMWithManagedDisksProperties(); VirtualMachine machine = VirtualMachine.create("/subscriptions/SUBSCRIPTIONID/" + "" + "resourceGroups/groupname/providers/Microsoft.Compute/virtualMachines/windowsmachine", "windowsmachine", "Microsoft.Compute/virtualMachines", "westus", ImmutableMap.of("foo", "bar"), properties, plan); return machine; }
@Override public StatusAndBackendStatus apply(VirtualMachine virtualMachine) { String resourceGroup = extractResourceGroup(virtualMachine.id()); ProvisioningState provisioningState = virtualMachine.properties().provisioningState(); NodeMetadata.Status status = PROVISIONINGSTATE_TO_NODESTATUS.apply(provisioningState); String backendStatus = provisioningState.name(); if (ProvisioningState.SUCCEEDED.equals(provisioningState)) { // If the provisioning succeeded, we need to query the *real* status of // the VM VirtualMachineInstance instanceDetails = api.getVirtualMachineApi(resourceGroup).getInstanceDetails( virtualMachine.name()); if (instanceDetails != null && instanceDetails.powerState() != null) { status = POWERSTATE_TO_NODESTATUS.apply(instanceDetails.powerState()); backendStatus = Joiner.on(',').join(transform(instanceDetails.statuses(), new Function<Status, String>() { @Override public String apply(Status input) { return input.code(); } })); } else { status = NodeMetadata.Status.PENDING; } } return StatusAndBackendStatus.create(status, backendStatus); } }
@Test(dependsOnMethods = "testStart") public void testUpdate() { VirtualMachine vm = api().get(vmName); VirtualMachineProperties oldProperties = vm.properties(); StorageProfile oldStorageProfile = oldProperties.storageProfile(); DataDisk newDataDisk = DataDisk.builder() .name(vmName + "new-data-disk") .diskSizeGB("1") .lun(1) .createOption(DataDisk.DiskCreateOptionTypes.EMPTY) .build(); List<DataDisk> oldDataDisks = oldStorageProfile.dataDisks(); assertEquals(oldDataDisks.size(), 1); ImmutableList<DataDisk> newDataDisks = ImmutableList.<DataDisk> builder().addAll(oldDataDisks).add(newDataDisk).build(); StorageProfile newStorageProfile = oldStorageProfile.toBuilder().dataDisks(newDataDisks).build(); VirtualMachineProperties newProperties = oldProperties.toBuilder().storageProfile(newStorageProfile).build(); VirtualMachine newVm = vm.toBuilder().properties(newProperties).build(); vm = api().createOrUpdate(vmName, newVm.location(), newVm.properties(), newVm.tags(), newVm.plan()); assertEquals(vm.properties().storageProfile().dataDisks().size(), oldDataDisks.size() + 1); }
public boolean cleanupManagedDisks(VirtualMachine virtualMachine) { Map<String, URI> deleteJobs = new HashMap<String, URI>(); OSDisk osDisk = virtualMachine.properties().storageProfile().osDisk(); deleteManagedDisk(osDisk.managedDiskParameters(), deleteJobs); for (DataDisk dataDisk : virtualMachine.properties().storageProfile().dataDisks()) { deleteManagedDisk(dataDisk.managedDiskParameters(), deleteJobs); } Set<String> nonDeletedDisks = filterValues(deleteJobs, not(resourceDeleted)).keySet(); if (!nonDeletedDisks.isEmpty()) { logger.warn(">> could not delete disks: %s", Joiner.on(',').join(nonDeletedDisks)); } return nonDeletedDisks.isEmpty(); }
@Override public boolean apply(VirtualMachine input) { return regionIds.get().contains(input.location()); } }));
@Override public ListenableFuture<Image> createImage(ImageTemplate template) { final CloneImageTemplate cloneTemplate = (CloneImageTemplate) template; final ResourceGroupAndName resourceGroupAndName = fromSlashEncoded(cloneTemplate.getSourceNodeId()); final String resourceGroupName = resourceGroupAndName.resourceGroup(); final String vmName = resourceGroupAndName.name(); final VirtualMachine vm = api.getVirtualMachineApi(resourceGroupName).get(vmName); final IdReference vmIdRef = IdReference.create(vm.id()); logger.debug(">> stopping node %s...", cloneTemplate.getSourceNodeId()); api.getVirtualMachineApi(resourceGroupName).stop(vmName); checkState(nodeSuspendedPredicate.create(resourceGroupName).apply(vmName), "Node %s was not suspended within the configured time limit", cloneTemplate.getSourceNodeId()); return userExecutor.submit(new Callable<Image>() { @Override public Image call() throws Exception { logger.debug(">> generalizing virtal machine %s...", vmName); api.getVirtualMachineApi(resourceGroupName).generalize(vmName); org.jclouds.azurecompute.arm.domain.Image imageFromVM = api.getVirtualMachineImageApi(resourceGroupName) .createOrUpdate(cloneTemplate.getName(), vm.location(), ImageProperties.builder().sourceVirtualMachine(vmIdRef).build()); checkState(imageAvailablePredicate.create(resourceGroupName).apply(imageFromVM.name()), "Image for node %s was not created within the configured time limit", cloneTemplate.getName()); return compose(vmImageToImage, customImagetoVmImage).apply(imageFromVM); } }); }
@SerializedNames({"id", "name", "type", "location", "tags", "properties", "plan"}) public static VirtualMachine create(final String id, final String name, final String type, final String location, @Nullable final Map<String, String> tags, VirtualMachineProperties properties, @Nullable Plan plan) { return builder().id(id).name(name).type(type).location(location).tags(tags).properties(properties).plan(plan) .build(); }
@Override public StatusAndBackendStatus apply(VirtualMachine virtualMachine) { String resourceGroup = extractResourceGroup(virtualMachine.id()); ProvisioningState provisioningState = virtualMachine.properties().provisioningState(); NodeMetadata.Status status = PROVISIONINGSTATE_TO_NODESTATUS.apply(provisioningState); String backendStatus = provisioningState.name(); if (ProvisioningState.SUCCEEDED.equals(provisioningState)) { // If the provisioning succeeded, we need to query the *real* status of // the VM VirtualMachineInstance instanceDetails = api.getVirtualMachineApi(resourceGroup).getInstanceDetails( virtualMachine.name()); if (instanceDetails != null && instanceDetails.powerState() != null) { status = POWERSTATE_TO_NODESTATUS.apply(instanceDetails.powerState()); backendStatus = Joiner.on(',').join(transform(instanceDetails.statuses(), new Function<Status, String>() { @Override public String apply(Status input) { return input.code(); } })); } else { status = NodeMetadata.Status.PENDING; } } return StatusAndBackendStatus.create(status, backendStatus); } }
public boolean cleanupManagedDisks(VirtualMachine virtualMachine) { Map<String, URI> deleteJobs = new HashMap<String, URI>(); OSDisk osDisk = virtualMachine.properties().storageProfile().osDisk(); deleteManagedDisk(osDisk.managedDiskParameters(), deleteJobs); for (DataDisk dataDisk : virtualMachine.properties().storageProfile().dataDisks()) { deleteManagedDisk(dataDisk.managedDiskParameters(), deleteJobs); } Set<String> nonDeletedDisks = filterValues(deleteJobs, not(resourceDeleted)).keySet(); if (!nonDeletedDisks.isEmpty()) { logger.warn(">> could not delete disks: %s", Joiner.on(',').join(nonDeletedDisks)); } return nonDeletedDisks.isEmpty(); }
private boolean deleteVirtualMachine(String group, VirtualMachine virtualMachine) { return resourceDeleted.apply(api.getVirtualMachineApi(group).delete(virtualMachine.name())); }
@Override public boolean apply(VirtualMachine input) { return regionIds.get().isEmpty() || regionIds.get().contains(input.location()); } }));
@Override public ListenableFuture<Image> createImage(ImageTemplate template) { final CloneImageTemplate cloneTemplate = (CloneImageTemplate) template; final ResourceGroupAndName resourceGroupAndName = fromSlashEncoded(cloneTemplate.getSourceNodeId()); final String resourceGroupName = resourceGroupAndName.resourceGroup(); final String vmName = resourceGroupAndName.name(); final VirtualMachine vm = api.getVirtualMachineApi(resourceGroupName).get(vmName); final IdReference vmIdRef = IdReference.create(vm.id()); logger.debug(">> stopping node %s...", cloneTemplate.getSourceNodeId()); api.getVirtualMachineApi(resourceGroupName).stop(vmName); checkState(nodeSuspendedPredicate.create(resourceGroupName).apply(vmName), "Node %s was not suspended within the configured time limit", cloneTemplate.getSourceNodeId()); return userExecutor.submit(new Callable<Image>() { @Override public Image call() throws Exception { logger.debug(">> generalizing virtal machine %s...", vmName); api.getVirtualMachineApi(resourceGroupName).generalize(vmName); org.jclouds.azurecompute.arm.domain.Image imageFromVM = api.getVirtualMachineImageApi(resourceGroupName) .createOrUpdate(cloneTemplate.getName(), vm.location(), ImageProperties.builder().sourceVirtualMachine(vmIdRef).build()); checkState(imageAvailablePredicate.create(resourceGroupName).apply(imageFromVM.name()), "Image for node %s was not created within the configured time limit", cloneTemplate.getName()); return compose(vmImageToImage, customImagetoVmImage).apply(imageFromVM); } }); }
@SerializedNames({"id", "name", "type", "location", "tags", "properties", "plan"}) public static VirtualMachine create(final String id, final String name, final String type, final String location, @Nullable final Map<String, String> tags, VirtualMachineProperties properties, @Nullable Plan plan) { return builder().id(id).name(name).type(type).location(location).tags(tags).properties(properties).plan(plan) .build(); }
@Override public NodeMetadata apply(VirtualMachine virtualMachine) { NodeMetadataBuilder builder = new NodeMetadataBuilder(); builder.id(fromResourceGroupAndName(extractResourceGroup(virtualMachine.id()), virtualMachine.name()) .slashEncode()); builder.providerId(virtualMachine.id()); builder.name(virtualMachine.name()); builder.hostname(virtualMachine.name()); builder.publicAddresses(getPublicIpAddresses(virtualMachine.properties().networkProfile().networkInterfaces())); builder.privateAddresses(getPrivateIpAddresses(virtualMachine.properties().networkProfile().networkInterfaces())); if (virtualMachine.tags() != null) { addMetadataAndParseTagsFromCommaDelimitedValue(builder, virtualMachine.tags()); groupFromMetadata = virtualMachine.tags().get(GROUP_KEY); .name())); String locationName = virtualMachine.location(); builder.location(getLocation(locations, locationName)); Optional<? extends Image> image = findImage(virtualMachine.properties().storageProfile(), locationName); logger.info(">> image with id %s for virtualmachine %s was not found. " + "This might be because the image that was used to create the virtualmachine has a new id.", virtualMachine.id(), virtualMachine.id()); builder.hardware(getHardware(fromLocationAndName(virtualMachine.location(), virtualMachine.properties() .hardwareProfile().vmSize())));
@Test public void testPendingWhenInstanceNotFound() { AzureComputeApi api = createMock(AzureComputeApi.class); VirtualMachineApi vmApi = createMock(VirtualMachineApi.class); VirtualMachine vm = createMock(VirtualMachine.class); VirtualMachineProperties props = createMock(VirtualMachineProperties.class); expect(vm.id()).andReturn("/resourceGroups/test/virtualMachines/vm"); expect(vm.properties()).andReturn(props); expect(vm.name()).andReturn("vm"); expect(props.provisioningState()).andReturn(ProvisioningState.SUCCEEDED); expect(api.getVirtualMachineApi("test")).andReturn(vmApi); expect(vmApi.getInstanceDetails("vm")).andReturn(null); replay(props, vm, vmApi, api); assertEquals(new VirtualMachineToStatus(api).apply(vm).status(), NodeMetadata.Status.PENDING); verify(props, vm, vmApi, api); }
private void waitUntilReady(String vmName) { boolean ready = retry(new Predicate<String>() { @Override public boolean apply(String name) { return !api().get(name).properties().provisioningState().equals(VirtualMachineProperties.ProvisioningState.CREATING); } }, 60 * 20 * 1000).apply(vmName); assertTrue(ready, "createOrUpdate operation did not complete in the configured timeout"); VirtualMachineProperties.ProvisioningState status = api().get(vmName).properties().provisioningState(); // Cannot be creating anymore. Should be succeeded or running but not failed. assertThat(status).isNotEqualTo(VirtualMachineProperties.ProvisioningState.CREATING); assertThat(status).isNotEqualTo(VirtualMachineProperties.ProvisioningState.FAILED); }
private boolean deleteVirtualMachine(String group, VirtualMachine virtualMachine) { return resourceDeleted.apply(api.getVirtualMachineApi(group).delete(virtualMachine.name())); }
@Override public Image call() throws Exception { logger.debug(">> generalizing virtal machine %s...", vmName); api.getVirtualMachineApi(resourceGroupName).generalize(vmName); org.jclouds.azurecompute.arm.domain.Image imageFromVM = api.getVirtualMachineImageApi(resourceGroupName) .createOrUpdate(cloneTemplate.getName(), vm.location(), ImageProperties.builder().sourceVirtualMachine(vmIdRef).build()); checkState(imageAvailablePredicate.create(resourceGroupName).apply(imageFromVM.name()), "Image for node %s was not created within the configured time limit", cloneTemplate.getName()); return compose(vmImageToImage, customImagetoVmImage).apply(imageFromVM); } });