API Explorer
API Explorer
Introduction
What's New
Appliance Management
Application Data Management
Asset Management
Asset Metadata
Authentication and Authorization
Cloud Disaster Recovery
Compliance
Copy Management
Credentials Management
Discovery
File Level Restore
Installation
Inventory Source Management
Kubernetes Data Management
Licenses Management
Location Management
Log Management
Monitoring
Protection Policies
Recovery and Reuse Management
Remote Service
Search Clusters
Secrets Manager
Server Disaster Recovery
Storage Management
Telemetry Setting
Upgrade
User Security Management
Virtual Machine Data Management
Whitelist Management

Copy deletion

This tutorial describes how to delete a copy. This API enables you to delete a specified copy with the following conditions:

  • Without retention lock, or with retention lock but expired
  • Not in restoring or exporting state
  • Not cloud-tiering or cloud-recalling in progress

WARNING: Incautiously deleting a copy may result in unexpected data loss. Ensure that you understand what you are deleting.

NOTE: Once copy deletion request is issued, the copy is assumed to be deleted and unavailable for use. Even if the copy deletion failed, it should not be considered a restorable copy.

The following API is used:

DELETE /api/v2/copies/{id}

Login

Use the login API to retrieve the access token. For more details, see the tutorial for authentication and authorization.

Get asset copies

Retrieve a list of all the copies for the specified asset.

URI Operation Description Return Codes
/api/v2/assets/{{assetId}}/copies GET Returns a list of copies/backups that belong to this asset 200 OK
404 Not Found
401 Not Authorized
curl --request GET \
  --url https://<your-ppdm-server>:8443/api/v2/assets/{{assetId}}/copies?pageSize=2 \
  --header 'content-type: application/json' \
  --header 'Authorization:  {{access_token}}'
  • access_token from the Login API call
  • assetId from the previous call

Sample response:

OK (200)

{
  "page" : {
    "size" : 1,
    "number" : 1,
    "totalPages" : 1,
    "totalElements" : 1
  },
  "content" : [ {
    "id" : "8cd274de-4687-5478-9cf2-477a9187966c",
    "createTime" : "2019-10-28T18:02:33.201Z",
    "storageSystemId" : "32b3aa41-9d14-4d18-8514-899401d1b18d",
    "size" : 435159040,
    "state" : null,
    "protectionCreated" : true,
    "copyType" : "FULL",
    "copyConsistency" : "CRASH_CONSISTENT",
    "retentionLock" : "ALL_COPIES_UNLOCKED",
    "retentionTime" : "2019-11-03T00:00:00Z",
    "retierTime" : null,
    "replicatedCopy" : false,
    "adhocBackup" : false,
    "partialCopy" : false,
    "partialCopyDescription" : null,
    "details" : {
      "arraySubType" : "DATADOMAINSYSTEM",
      "arraySerialNo" : "AUDVHSHKJAS67W",
      "vmBackup" : {
        "disks" : [ {
          "excluded" : false,
          "capacityInBytes" : 17179869184,
          "controller" : 0,
          "backupIndex" : 1,
          "provisioningType" : "THIN",
          "controllerType" : "SCSI",
          "unitNumber" : 0,
          "label" : "Hard disk 1",
          "key" : 2000
        } ],
        "backupId" : "eyJWZXJzaW9uIjoxLCJWaW1VVUlEIjoiN2M4NTRmMzgtN2FmYy00ZjU4LWE4OTYtMDFmZDE1ZGEwNzU3IiwiVm1VVUlEIjoiNTAyODU2OTctMGNkOC1kM2E4LTQ2YjItOTQ3NWVkMjMyYjAzIiwiVGltZSI6IjIwMTktMTAtMjhUMTg6MDA6NTYuNTYzODE1NjE4WiJ9Cg==",
        "protectionEngineType" : "VMDIRECT",
        "transportModeUsed" : "HOTADD",
        "syntheticFull" : false,
        "quiesceStatus" : "COPY",
        "diskBackupCount" : 1,
        "diskTotalCount" : 1,
        "partialCopy" : false
      },
      "storageClass" : "Protection"
    },
    "baseCopyId" : null,
    "logCount" : "0",
    "exportedCopyCount" : null,
    "location" : "LOCAL",
    "externalId" : null,
    "restoreTargetCompatibilities" : null
  }]
}
  • Any of the IDs inside the content can be used for copyId in subsequent calls.

If an asset is still actively protected by a nonexclusion purpose policy, it is not recommended to delete the last copy or a copy in the last copy chain since the last copy may depend on any subsequent new backup.
The user can use forceRemoveLatestBackup option to force delete the last copy or a copy in the last copy chain.
To check if a copy is the last copy, use “orderby=createTime DESC”. The first element should be the last copy.

/api/v2/assets/{{assetId}}/copies?orderby=createTime DESC

Delete copy

Delete the specified copy.

URI Operation Description Return Codes
/api/v2/copies/{{copyID}} DELETE Delete specified copy 200 OK
400 Valid Request
401 Request not allowed
403 Not Authorized
409 The copy could not be deleted due to a conflict with the current state of the resource.
curl --request DELETE \
  --url https://<your-ppdm-server>:8443/api/v2/copies/{{copyId}} \
  --header 'content-type: application/json' \

Sample response:

Accept (200)
{
   "copyIds" : [ "7319af3c-7fcd-5537-abde-a992d0b1b181" ]
}

Delete copy with cascade

Each copy for a Virtual Machine, File System, Exchange, Kubernetes, and Storage Group asset is a standalone copy. A single copy can be independently restorable.

A copy for SQL, Oracle, and SAP HANA asset may depend on other copies. For instance, an SQL differential copy depends on its FULL copy from a copy usability perspective. Single copy deletion may affect the usability of the other copy. If a FULL copy is deleted, the differential copy that depends on the deleted FULL copy is rendered useless. If some copies are dependent on the specified copy, the copy deletion API does not allow deleting a single copy.

Get copy in the same chain

/api/v2/assets/{{assetId}}/copies?filter=baseCopyId eq "{copyId}"

The {copyId} should be a FULL backup level copy ID. This ID can return all copies in the same copy dependency chain.

If the above request returns more than one copy, the copy delete request may return:

{
    "code": 409,
    "reason": "Deleting a copy failed because this copy is in a copy dependency chain.",
    "remediation": "Please send deletion request again with cascaded parameter as true if all the copies in its dependency chain need to be deleted.",
    "timestamp": 1591697501064,
    "path": "/api/v2/copies/c0b9f546-e05e-593a-b16f-a3deb1762c8e",
    "extendedInfo": null
}

If all copies that depend on the specified copies are confirmed for deletion, send the copy deletion request with cascadeDelete option:

curl --request DELETE \
  --url https://<your-ppdm-server>:8443/api/v2/copies/{{copyId}}?cascadeDelete=true \
  --header 'content-type: application/json' \

Before using cascadeDelete, ensure that the copy is not the last copy or a copy in the last copy chain. To verify, get the FULL copy by createTime sort and backup level filter:

/api/v2/assets/{{assetId}}/copies?orderby=createTime DESC&filter=copyType eq "FULL"

The first element is the latest FULL copy. Get all copies in the copy dependency chain:

/api/v2/assets/{{assetId}}/copies?orderby=createTime DESC&filter=baseCopyId eq "{copyId}"

Copies that are returned in the above copy query are not recommended to be deleted.

Using cascadeDelete option

curl --request DELETE \
  --url https://<your-ppdm-server>:8443/api/v2/copies/{{copyId}}?cascadeDelete=true \
  --header 'content-type: application/json' \

This request deletes all copies that depend on the specified copy. Sample response:

Accept (200)
{
    "copyIds": [
        "305574aa-97dd-52ad-883e-7f43fd4c2fc3",
        "d2ab7d57-bdd8-5b71-a561-c51a5ba30ce7",
        "b8b86b4a-24c9-5418-bba8-e0f1be97dadc",
        "325e7e13-5e51-59d8-9d19-bbc79a0e9680",
        "629d000b-ba72-53db-8e8e-ba262eb0491f",
        "b8f2fd01-c8bb-580d-a8cc-f907a33aaece",
        "e51a4157-44bf-510f-bdb6-cff0af79eed5"
    ],
		"activityId": "f62b5268-55c0-cec7-d001b08affe6"
}

Verify copy deletion result

To verify success of the copy deletion, get the copy by its ID:

curl --request GET \
  --url https://<your-ppdm-server>:8443/api/v2/copies/{{copyId}} \
  --header 'content-type: application/json' \

Sample response:

{
  "id": "305574aa-97dd-52ad-883e-7f43fd4c2fc3",
  "createTime": "2020-05-30T12:59:39Z",
  "storageSystemId": "e6373581-8a7a-4551-9832-a7ba4d016eb4",
  "size": 16931840,
  "state": "DELETED",
  "protectionCreated": true,
  "copyType": "FULL",
  "copyConsistency": "APPLICATION_CONSISTENT",
  "retentionLock": "ALL_COPIES_UNLOCKED",
  "retentionTime": "2020-05-31T12:59:29Z",
  "retierTime": null,
  "replicatedCopy": false,
  "adhocBackup": false,
  "partialCopy": false,
  "partialCopyDescription": null,
  "details": {
    "mssqlBackup": {
      "protectionEngineFlow": "APPDIRECT"
    },
    "storageClass": "Protection"
  },
  "baseCopyId": "305574aa-97dd-52ad-883e-7f43fd4c2fc3",
  "logCount": "0",
  "exportedCopyCount": null,
  "location": "LOCAL",
  "externalId": null,
  "restoreTargetCompatibilities": null,
  "backupTransactionId": "1590843580",
  "assetId": "50737611-b95d-58d0-99d1-8faf9f82ac1a",
  "metadataIndexingStatus": null
}
  • If the state is “DELETING”, the deletion is still in progress.
  • If the state is “DELETED”, the deletion completed and succeeded.
  • If the state is “DELETE_FAILED”, the deletion failed.

Delete copy with removeConfigurationOnly option

If copy deletion failed and the copy is in “DELETE_FAILED” state, you can retry copy deletion. But if the protection storage system is not available anymore, or the copy is manually deleted from the protection storage system without synchronizing with the PowerProtect Data Manager, the deletion retry does not delete the copy. To avoid daily copy deletion failure, use the removeConfigurationOnly option to remove the copy metadata from PowerProtect Data Manager. Do not use this option for other purposes (otherwise, the copy in the protection storage cannot be deleted from PowerProtect Data Manager):

curl --request DELETE \
  --url https://<your-ppdm-server>:8443/api/v2/copies/{{copyId}}?removeConfigurationOnly=true \
  --header 'content-type: application/json' \

If other copies are dependent on the specified copy, you must specify cascadeDelete to remove all copies that depend on the specified copy:

curl --request DELETE \
  --url https://<your-ppdm-server>:8443/api/v2/copies/{{copyId}}?removeConfigurationOnly=true&cascadeDelete=true \
  --header 'content-type: application/json' \

Delete copy with forceRemoveLatestBackup option

The last protection or replication copy or copies in the last chain (for SQL, Oracle, SAP HANA) cannot be deleted by default. If you want to force delete the last copy or last chain, set forceRemoveLatestBackup option to true:

curl --request DELETE \
  --url https://<your-ppdm-server>:8443/api/v2/copies/{{copyId}}?forceRemoveLatestBackup=true \
  --header 'content-type: application/json' \

The following copies or chain are not taken as last copies and can be deleted without forceRemoveLatestBackup:

  • The copies taken before the asset is assigned to the current policy
  • Cloud tier or Cloud DR latest copies can be deleted as expected
  • The asset is unassigned from policy or assigned to an excluded policy