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 }
|