diff --git a/src/rest/openapi.yaml b/src/rest/openapi.yaml index 96f014fbeb9..0a90bf85eb2 100644 --- a/src/rest/openapi.yaml +++ b/src/rest/openapi.yaml @@ -1494,6 +1494,19 @@ paths: description: Invalid request body. "500": $ref: "#/components/responses/InternalServerError" + delete: + tags: + - node + summary: Delete the pending operational dataset + description: |- + Clears the pending operational dataset, canceling any scheduled network + configuration changes (e.g. a pending channel migration) before they + take effect. + responses: + "200": + description: Successfully deleted the pending operational dataset. + "500": + $ref: "#/components/responses/InternalServerError" /node/commissioner/state: get: tags: diff --git a/src/rest/rest_web_server.cpp b/src/rest/rest_web_server.cpp index 29ee6b506be..3ef80128e6f 100644 --- a/src/rest/rest_web_server.cpp +++ b/src/rest/rest_web_server.cpp @@ -154,6 +154,7 @@ RestWebServer::RestWebServer(Host::RcpHost &aHost) mServer.Options(OT_REST_RESOURCE_PATH_NODE_DATASET_ACTIVE, MakeHandler(&RestWebServer::DatasetActive)); mServer.Get(OT_REST_RESOURCE_PATH_NODE_DATASET_PENDING, MakeHandler(&RestWebServer::DatasetPending)); mServer.Put(OT_REST_RESOURCE_PATH_NODE_DATASET_PENDING, MakeHandler(&RestWebServer::DatasetPending)); + mServer.Delete(OT_REST_RESOURCE_PATH_NODE_DATASET_PENDING, MakeHandler(&RestWebServer::DatasetPending)); mServer.Options(OT_REST_RESOURCE_PATH_NODE_DATASET_PENDING, MakeHandler(&RestWebServer::DatasetPending)); mServer.Get(OT_REST_RESOURCE_PATH_NODE_COMMISSIONER_STATE, MakeHandler(&RestWebServer::CommissionerState)); mServer.Put(OT_REST_RESOURCE_PATH_NODE_COMMISSIONER_STATE, MakeHandler(&RestWebServer::CommissionerState)); @@ -756,6 +757,28 @@ void RestWebServer::SetDataset(DatasetType aDatasetType, const Request &aRequest } } +void RestWebServer::DeletePendingDataset(Response &aResponse) const +{ + otbrError error = OTBR_ERROR_NONE; + + SuccessOrExit(error = RunInMainLoop([this]() { + otOperationalDatasetTlvs datasetTlvs; + + datasetTlvs.mLength = 0; + VerifyOrReturn(otDatasetSetPendingTlvs(GetInstance(), &datasetTlvs) == OT_ERROR_NONE, + OTBR_ERROR_REST); + return OTBR_ERROR_NONE; + })); + + aResponse.status = StatusCode::OK_200; + +exit: + if (error != OTBR_ERROR_NONE) + { + ErrorHandler(aResponse, StatusCode::InternalServerError_500); + } +} + void RestWebServer::Dataset(DatasetType aDatasetType, const Request &aRequest, Response &aResponse) const { switch (GetMethod(aRequest)) @@ -766,6 +789,16 @@ void RestWebServer::Dataset(DatasetType aDatasetType, const Request &aRequest, R case HttpMethod::kPut: SetDataset(aDatasetType, aRequest, aResponse); break; + case HttpMethod::kDelete: + if (aDatasetType == DatasetType::kPending) + { + DeletePendingDataset(aResponse); + } + else + { + ErrorHandler(aResponse, StatusCode::MethodNotAllowed_405); + } + break; case HttpMethod::kOptions: aResponse.status = StatusCode::OK_200; break; diff --git a/src/rest/rest_web_server.hpp b/src/rest/rest_web_server.hpp index ba32672fc64..61a24713d00 100644 --- a/src/rest/rest_web_server.hpp +++ b/src/rest/rest_web_server.hpp @@ -130,6 +130,7 @@ class RestWebServer : public std::enable_shared_from_this void GetDataRloc(Response &aResponse) const; void GetDataset(DatasetType aDatasetType, const Request &aRequest, Response &aResponse) const; void SetDataset(DatasetType aDatasetType, const Request &aRequest, Response &aResponse) const; + void DeletePendingDataset(Response &aResponse) const; void GetCommissionerState(Response &aResponse) const; void SetCommissionerState(const Request &aRequest, Response &aResponse) const; void GetJoiners(Response &aResponse) const;