CopyObjectTask.groovy
001 /*
002  * SPDX-License-Identifier: Apache-2.0
003  *
004  * Copyright 2019-2022 Andres Almiray.
005  *
006  * Licensed under the Apache License, Version 2.0 (the "License");
007  * you may not use this file except in compliance with the License.
008  * You may obtain a copy of the License at
009  *
010  *     http://www.apache.org/licenses/LICENSE-2.0
011  *
012  * Unless required by applicable law or agreed to in writing, software
013  * distributed under the License is distributed on an "AS IS" BASIS,
014  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015  * See the License for the specific language governing permissions and
016  * limitations under the License.
017  */
018 package org.kordamp.gradle.plugin.oci.tasks.object
019 
020 import com.oracle.bmc.objectstorage.ObjectStorageClient
021 import com.oracle.bmc.objectstorage.model.CopyObjectDetails
022 import com.oracle.bmc.objectstorage.model.WorkRequest
023 import com.oracle.bmc.objectstorage.model.WorkRequestLogEntry
024 import com.oracle.bmc.objectstorage.requests.CopyObjectRequest
025 import com.oracle.bmc.objectstorage.requests.GetWorkRequestRequest
026 import com.oracle.bmc.objectstorage.requests.ListWorkRequestLogsRequest
027 import com.oracle.bmc.objectstorage.responses.CopyObjectResponse
028 import groovy.transform.CompileStatic
029 import org.kordamp.gradle.plugin.oci.tasks.AbstractOCITask
030 import org.kordamp.gradle.plugin.oci.tasks.interfaces.OCITask
031 import org.kordamp.gradle.plugin.oci.tasks.traits.BucketNameAwareTrait
032 import org.kordamp.gradle.plugin.oci.tasks.traits.DestinationObjectNameAwareTrait
033 import org.kordamp.gradle.plugin.oci.tasks.traits.NamespaceNameAwareTrait
034 import org.kordamp.gradle.plugin.oci.tasks.traits.ObjectNameAwareTrait
035 import org.kordamp.gradle.plugin.oci.tasks.traits.OptionalDestinationBucketNameAwareTrait
036 import org.kordamp.gradle.plugin.oci.tasks.traits.OptionalDestinationNamespaceNameAwareTrait
037 import org.kordamp.gradle.plugin.oci.tasks.traits.OptionalDestinationRegionAwareTrait
038 import org.kordamp.jipsy.annotations.TypeProviderFor
039 
040 import static org.kordamp.gradle.plugin.oci.tasks.object.HeadObjectTask.headObject
041 
042 /**
043  @author Andres Almiray
044  @since 0.3.0
045  */
046 @CompileStatic
047 @TypeProviderFor(OCITask)
048 class CopyObjectTask extends AbstractOCITask implements NamespaceNameAwareTrait,
049     BucketNameAwareTrait,
050     ObjectNameAwareTrait,
051     OptionalDestinationRegionAwareTrait,
052     OptionalDestinationNamespaceNameAwareTrait,
053     OptionalDestinationBucketNameAwareTrait,
054     DestinationObjectNameAwareTrait {
055     static final String TASK_DESCRIPTION = 'Copies an Object.'
056 
057     @Override
058     protected void doExecuteTask() {
059         validateNamespaceName()
060         validateBucketName()
061         validateObjectName()
062         validateDestinationObjectName()
063 
064         // TODO: check if destination exists
065 
066         ObjectStorageClient client = createObjectStorageClient()
067 
068         String _destinationRegion = getResolvedDestinationRegion().orNull ?: getRegion().get()
069         String _destinationNamespace = getResolvedDestinationNamespaceName().orNull ?: getResolvedNamespaceName().get()
070         String _destinationBucket = getResolvedDestinationBucketName().orNull ?: getResolvedBucketName().get()
071 
072         CopyObjectDetails.Builder details = CopyObjectDetails.builder()
073             .sourceObjectName(getResolvedObjectName().get())
074             .destinationRegion(_destinationRegion)
075             .destinationNamespace(_destinationNamespace)
076             .destinationBucket(_destinationBucket)
077             .destinationObjectName(getResolvedDestinationObjectName().get())
078 
079         CopyObjectResponse response = client.copyObject(CopyObjectRequest.builder()
080             .namespaceName(getResolvedNamespaceName().get())
081             .bucketName(getResolvedBucketName().get())
082             .copyObjectDetails(details.build())
083             .build())
084 
085         println("Waiting for copy to finish.")
086         WorkRequest workRequest = client.waiters
087             .forWorkRequest(GetWorkRequestRequest.builder()
088                 .workRequestId(response.getOpcWorkRequestId())
089                 .build())
090             .execute().
091             workRequest
092         println("Work request is in ${state(workRequest.status.name())} state.")
093 
094         println("Verifying that the object has been copied.")
095         switch (workRequest.status) {
096             case WorkRequest.Status.Completed:
097                 client.setRegion(_destinationRegion)
098 
099                 headObject(this,
100                     createObjectStorageClient(),
101                     _destinationNamespace,
102                     _destinationBucket,
103                     getResolvedDestinationObjectName().get())
104                 break
105             default:
106                 List<WorkRequestLogEntry> entries = client.listWorkRequestLogs(ListWorkRequestLogsRequest.builder()
107                     .workRequestId(workRequest.id)
108                     .build())
109                     .items
110                 for (WorkRequestLogEntry entry : entries) {
111                     println("[${console.cyan(format(entry.timestamp))}] $entry.message")
112                 }
113                 break
114         }
115     }
116 }