Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
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
246 changes: 242 additions & 4 deletions sdk/deviceupdate/azure-iot-deviceupdate/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,14 +1,252 @@
# Release History

## 1.1.0-beta.1 (Unreleased)
## 1.1.0-beta.1 (2026-07-08)

### Features Added

### Breaking Changes
* `models.StepType` was added

### Bugs Fixed
* `models.DeviceClass` was added

### Other Changes
* `models.OperationStatus` was added

* `models.DeviceHealth` was added

* `models.DeviceClassSubgroupDeploymentState` was added

* `models.DeviceUpdateAgentId` was added

* `models.UpdateId` was added

* `models.DeviceClassSubgroupDeploymentStatus` was added

* `models.Step` was added

* `models.ImportType` was added

* `models.LogCollectionOperationDetailedStatus` was added

* `models.UpdateFile` was added

* `models.DeviceDeploymentState` was added

* `models.LogCollection` was added

* `models.Error` was added

* `models.PatchBody` was added

* `models.UpdateOperation` was added

* `models.Group` was added

* `models.UpdateFileDownloadHandler` was added

* `models.InstallResult` was added

* `models.StepResult` was added

* `models.DeploymentStatus` was added

* `models.HealthCheck` was added

* `models.FileImportMetadata` was added

* `models.InnerError` was added

* `models.GroupType` was added

* `models.CloudInitiatedRollbackPolicyFailure` was added

* `models.UpdateCompliance` was added

* `models.Deployment` was added

* `models.ImportUpdateInputItem` was added

* `models.DownloadSecurity` was added

* `models.UpdateFileBase` was added

* `models.Device` was added

* `models.DeviceOperation` was added

* `models.UpdateInfo` was added

* `models.DeploymentDeviceState` was added

* `models.DeviceClassSubgroupUpdatableDevices` was added

* `models.LogCollectionOperationDeviceStatus` was added

* `models.HealthCheckResult` was added

* `models.Update` was added

* `models.DeviceHealthState` was added

* `models.Instructions` was added

* `models.Compatibility` was added

* `models.DeviceClassSubgroup` was added

* `models.ContractModel` was added

* `models.CloudInitiatedRollbackPolicy` was added

* `models.DeviceClassProperties` was added

* `models.DeploymentState` was added

* `models.ImportManifestMetadata` was added

#### `DeviceUpdateClient` was modified

* `getUpdate(java.lang.String,java.lang.String,java.lang.String)` was added
* `getOperationStatus(java.lang.String,java.lang.String)` was added
* `listUpdates()` was added
* `listFiles(java.lang.String,java.lang.String,java.lang.String)` was added
* `getOperationStatus(java.lang.String)` was added
* `listVersions(java.lang.String,java.lang.String,java.lang.String)` was added
* `listVersions(java.lang.String,java.lang.String)` was added
* `beginImportUpdate(java.util.List)` was added
* `getFile(java.lang.String,java.lang.String,java.lang.String,java.lang.String,java.lang.String)` was added
* `listNames(java.lang.String)` was added
* `beginDeleteUpdate(java.lang.String,java.lang.String,java.lang.String)` was added
* `getUpdate(java.lang.String,java.lang.String,java.lang.String,java.lang.String)` was added
* `listOperationStatuses(java.lang.String,java.lang.Integer)` was added
* `listOperationStatuses()` was added
* `listUpdates(java.lang.String,java.lang.String)` was added
* `getFile(java.lang.String,java.lang.String,java.lang.String,java.lang.String)` was added
* `listProviders()` was added

#### `DeviceManagementAsyncClient` was modified

* `getDeviceClassSubgroupDeploymentStatus(java.lang.String,java.lang.String,java.lang.String)` was added
* `getDeploymentForDeviceClassSubgroup(java.lang.String,java.lang.String,java.lang.String)` was added
* `listDeviceStatesForDeviceClassSubgroupDeployment(java.lang.String,java.lang.String,java.lang.String,java.lang.String)` was added
* `startLogCollection(java.lang.String,models.LogCollection)` was added
* `listDeviceClasses(java.lang.String)` was added
* `updateDeviceClass(java.lang.String,models.PatchBody)` was added
* `deleteGroup(java.lang.String)` was added
* `getDeviceModule(java.lang.String,java.lang.String)` was added
* `getUpdateComplianceForGroup(java.lang.String)` was added
* `getOperationStatus(java.lang.String)` was added
* `listBestUpdatesForGroup(java.lang.String)` was added
* `deleteDeviceClassSubgroup(java.lang.String,java.lang.String)` was added
* `getBestUpdatesForDeviceClassSubgroup(java.lang.String,java.lang.String)` was added
* `listDevices()` was added
* `getOperationStatus(java.lang.String,java.lang.String)` was added
* `listDeviceClassSubgroupsForGroup(java.lang.String,java.lang.String)` was added
* `listGroups()` was added
* `listDeploymentsForGroup(java.lang.String)` was added
* `getUpdateCompliance()` was added
* `listDeviceClasses()` was added
* `getGroup(java.lang.String)` was added
* `beginImportDevices(models.ImportType)` was added
* `listDeploymentsForGroup(java.lang.String,java.lang.String)` was added
* `deleteDeployment(java.lang.String,java.lang.String)` was added
* `listDeviceStatesForDeviceClassSubgroupDeployment(java.lang.String,java.lang.String,java.lang.String)` was added
* `listDeploymentsForDeviceClassSubgroup(java.lang.String,java.lang.String)` was added
* `getDeployment(java.lang.String,java.lang.String)` was added
* `listHealthOfDevices(java.lang.String)` was added
* `listDeviceClassSubgroupsForGroup(java.lang.String)` was added
* `listOperationStatuses()` was added
* `retryDeployment(java.lang.String,java.lang.String,java.lang.String)` was added
* `listDevices(java.lang.String)` was added
* `listLogCollections()` was added
* `listInstallableUpdatesForDeviceClass(java.lang.String)` was added
* `getLogCollectionDetailedStatus(java.lang.String)` was added
* `listGroups(java.lang.String)` was added
* `getDevice(java.lang.String)` was added
* `listDeploymentsForDeviceClassSubgroup(java.lang.String,java.lang.String,java.lang.String)` was added
* `getDeviceClassSubgroup(java.lang.String,java.lang.String)` was added
* `getLogCollection(java.lang.String)` was added
* `listOperationStatuses(java.lang.String,java.lang.Integer)` was added
* `getDeploymentStatus(java.lang.String,java.lang.String)` was added
* `getDeviceClass(java.lang.String)` was added
* `createOrUpdateDeployment(java.lang.String,java.lang.String,models.Deployment)` was added
* `getDeviceClassSubgroupUpdateCompliance(java.lang.String,java.lang.String)` was added
* `stopDeployment(java.lang.String,java.lang.String,java.lang.String)` was added
* `deleteDeploymentForDeviceClassSubgroup(java.lang.String,java.lang.String,java.lang.String)` was added
* `deleteDeviceClass(java.lang.String)` was added

#### `DeviceManagementClient` was modified

* `listDeploymentsForDeviceClassSubgroup(java.lang.String,java.lang.String,java.lang.String)` was added
* `listDeviceClasses(java.lang.String)` was added
* `listDeviceClassSubgroupsForGroup(java.lang.String)` was added
* `listLogCollections()` was added
* `listBestUpdatesForGroup(java.lang.String)` was added
* `getDeviceModule(java.lang.String,java.lang.String)` was added
* `getDevice(java.lang.String)` was added
* `listHealthOfDevices(java.lang.String)` was added
* `getLogCollectionDetailedStatus(java.lang.String)` was added
* `updateDeviceClass(java.lang.String,models.PatchBody)` was added
* `listDeploymentsForGroup(java.lang.String,java.lang.String)` was added
* `listDeviceStatesForDeviceClassSubgroupDeployment(java.lang.String,java.lang.String,java.lang.String)` was added
* `deleteDeploymentForDeviceClassSubgroup(java.lang.String,java.lang.String,java.lang.String)` was added
* `getUpdateComplianceForGroup(java.lang.String)` was added
* `deleteDeviceClassSubgroup(java.lang.String,java.lang.String)` was added
* `retryDeployment(java.lang.String,java.lang.String,java.lang.String)` was added
* `deleteGroup(java.lang.String)` was added
* `stopDeployment(java.lang.String,java.lang.String,java.lang.String)` was added
* `getGroup(java.lang.String)` was added
* `getUpdateCompliance()` was added
* `listDevices(java.lang.String)` was added
* `listInstallableUpdatesForDeviceClass(java.lang.String)` was added
* `listDeviceClassSubgroupsForGroup(java.lang.String,java.lang.String)` was added
* `listOperationStatuses()` was added
* `getBestUpdatesForDeviceClassSubgroup(java.lang.String,java.lang.String)` was added
* `createOrUpdateDeployment(java.lang.String,java.lang.String,models.Deployment)` was added
* `listDevices()` was added
* `getDeploymentStatus(java.lang.String,java.lang.String)` was added
* `listDeploymentsForGroup(java.lang.String)` was added
* `listGroups()` was added
* `getDeployment(java.lang.String,java.lang.String)` was added
* `getDeviceClassSubgroup(java.lang.String,java.lang.String)` was added
* `deleteDeviceClass(java.lang.String)` was added
* `getDeviceClassSubgroupUpdateCompliance(java.lang.String,java.lang.String)` was added
* `startLogCollection(java.lang.String,models.LogCollection)` was added
* `listOperationStatuses(java.lang.String,java.lang.Integer)` was added
* `deleteDeployment(java.lang.String,java.lang.String)` was added
* `listDeploymentsForDeviceClassSubgroup(java.lang.String,java.lang.String)` was added
* `getDeviceClassSubgroupDeploymentStatus(java.lang.String,java.lang.String,java.lang.String)` was added
* `beginImportDevices(models.ImportType)` was added
* `getOperationStatus(java.lang.String,java.lang.String)` was added
* `getOperationStatus(java.lang.String)` was added
* `listDeviceStatesForDeviceClassSubgroupDeployment(java.lang.String,java.lang.String,java.lang.String,java.lang.String)` was added
* `getLogCollection(java.lang.String)` was added
* `listGroups(java.lang.String)` was added
* `getDeploymentForDeviceClassSubgroup(java.lang.String,java.lang.String,java.lang.String)` was added
* `listDeviceClasses()` was added
* `getDeviceClass(java.lang.String)` was added

#### `DeviceUpdateServiceVersion` was modified

* `V2026_06_01` was added

#### `DeviceUpdateAsyncClient` was modified

* `beginDeleteUpdate(java.lang.String,java.lang.String,java.lang.String)` was added
* `getOperationStatus(java.lang.String)` was added
* `getUpdate(java.lang.String,java.lang.String,java.lang.String)` was added
* `listProviders()` was added
* `listFiles(java.lang.String,java.lang.String,java.lang.String)` was added
* `listVersions(java.lang.String,java.lang.String,java.lang.String)` was added
* `getFile(java.lang.String,java.lang.String,java.lang.String,java.lang.String)` was added
* `getUpdate(java.lang.String,java.lang.String,java.lang.String,java.lang.String)` was added
* `listOperationStatuses(java.lang.String,java.lang.Integer)` was added
* `listNames(java.lang.String)` was added
* `listOperationStatuses()` was added
* `beginImportUpdate(java.util.List)` was added
* `listUpdates()` was added
* `listVersions(java.lang.String,java.lang.String)` was added
* `getOperationStatus(java.lang.String,java.lang.String)` was added
* `getFile(java.lang.String,java.lang.String,java.lang.String,java.lang.String,java.lang.String)` was added
* `listUpdates(java.lang.String,java.lang.String)` was added

## 1.0.33 (2026-05-05)

Expand Down
2 changes: 1 addition & 1 deletion sdk/deviceupdate/azure-iot-deviceupdate/assets.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,5 @@
"AssetsRepo": "Azure/azure-sdk-assets",
"AssetsRepoPrefixPath": "java",
"TagPrefix": "java/deviceupdate/azure-iot-deviceupdate",
"Tag": "java/deviceupdate/azure-iot-deviceupdate_e6c0b7421b"
"Tag": "java/deviceupdate/azure-iot-deviceupdate_4a925a77df"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.

import com.azure.autorest.customization.ClassCustomization;
import com.azure.autorest.customization.Customization;
import com.azure.autorest.customization.LibraryCustomization;
import com.github.javaparser.StaticJavaParser;
import org.slf4j.Logger;

/**
* Customization that preserves backward compatibility of the {@code beginDeleteUpdate} long-running
* operation's protocol overloads.
*
* <p>The prior GA library ({@code azure-iot-deviceupdate} 1.0.x) shipped these protocol LRO overloads
* with a final-result type of {@code BinaryData}. After migrating to TypeSpec, the emitter derives the
* final-result type as {@code Void} (the delete operation has an empty {@code 204} response), which is a
* binary breaking change: {@code SyncPoller<BinaryData, BinaryData>} became {@code SyncPoller<BinaryData, Void>}
* (and the async {@code PollerFlux} equivalent).</p>
*
* <p>This cannot be expressed in {@code client.tsp}/{@code tspconfig.yaml}, so this customization restores the
* final-result type to {@code BinaryData} on the public sync/async clients and on the underlying implementation
* client (both the method return type and the poller's final-result {@link com.azure.core.util.serializer.TypeReference}).</p>
*/
public class DeviceUpdateCustomization extends Customization {

private static final String ROOT_PACKAGE = "com.azure.iot.deviceupdate";
private static final String IMPL_PACKAGE = "com.azure.iot.deviceupdate.implementation";

@Override
public void customize(LibraryCustomization libraryCustomization, Logger logger) {
logger.info("Restoring 'beginDeleteUpdate' protocol overload final-result type to BinaryData for backward compatibility.");

// Public clients: only the method return type needs to change; the body simply delegates to the
// implementation client, whose return type is retyped below.
restoreBinaryDataFinalResult(libraryCustomization.getClass(ROOT_PACKAGE, "DeviceUpdateClient"),
"beginDeleteUpdate", false);
restoreBinaryDataFinalResult(libraryCustomization.getClass(ROOT_PACKAGE, "DeviceUpdateAsyncClient"),
"beginDeleteUpdate", false);

// Implementation client: retype the method and rewrite the poller's final-result TypeReference.
ClassCustomization impl = libraryCustomization.getClass(IMPL_PACKAGE, "DeviceUpdateClientImpl");
restoreBinaryDataFinalResult(impl, "beginDeleteUpdate", true);
restoreBinaryDataFinalResult(impl, "beginDeleteUpdateAsync", true);
}

/**
* Retypes the protocol overload of {@code methodName} from {@code <BinaryData, Void>} back to
* {@code <BinaryData, BinaryData>}. Only the protocol overload (whose return type is exactly
* {@code SyncPoller<BinaryData, Void>} or {@code PollerFlux<BinaryData, Void>}) is affected; the model
* convenience overloads ({@code <UpdateOperation, Void>}) are left untouched.
*
* @param classCustomization the class to customize.
* @param methodName the method name to retype.
* @param rewriteFinalResultTypeReference when {@code true}, also rewrites
* {@code TypeReference.createInstance(Void.class)} to {@code TypeReference.createInstance(BinaryData.class)}
* in the method body (needed for the implementation client that constructs the poller).
*/
private static void restoreBinaryDataFinalResult(ClassCustomization classCustomization, String methodName,
boolean rewriteFinalResultTypeReference) {
classCustomization.customizeAst(ast -> ast.getClassByName(classCustomization.getClassName())
.ifPresent(clazz -> clazz.getMethodsByName(methodName).forEach(method -> {
String returnType = method.getTypeAsString().replace(" ", "");
if (!returnType.equals("SyncPoller<BinaryData,Void>")
&& !returnType.equals("PollerFlux<BinaryData,Void>")) {
return;
}

method.setType(StaticJavaParser.parseType(method.getTypeAsString().replace("Void", "BinaryData")));

if (rewriteFinalResultTypeReference) {
method.getBody().ifPresent(body -> method.setBody(StaticJavaParser.parseBlock(
body.toString().replace("TypeReference.createInstance(Void.class)",
"TypeReference.createInstance(BinaryData.class)"))));
}
})));
}
}
Loading
Loading