1010import software .amazon .awssdk .services .redshiftserverless .model .GetNamespaceResponse ;
1111import software .amazon .awssdk .services .redshiftserverless .model .GetWorkgroupRequest ;
1212import software .amazon .awssdk .services .redshiftserverless .model .GetWorkgroupResponse ;
13+ import software .amazon .awssdk .services .redshiftserverless .model .ListTagsForResourceRequest ;
14+ import software .amazon .awssdk .services .redshiftserverless .model .ListTagsForResourceResponse ;
1315import software .amazon .awssdk .services .redshiftserverless .model .Namespace ;
1416import software .amazon .awssdk .services .redshiftserverless .model .NamespaceStatus ;
1517import software .amazon .awssdk .services .redshiftserverless .model .WorkgroupStatus ;
@@ -38,7 +40,7 @@ public abstract class BaseHandlerStd extends BaseHandler<CallbackContext> {
3840 protected Logger logger ;
3941
4042 public static final String BUSY_WORKGROUP_RETRY_EXCEPTION_MESSAGE =
41- "There is an operation running on the existing workgroup " ;
43+ "There is an operation in progress " ;
4244
4345 // This is for delete workgroup operation. We need AdminWF to finish the operation completely
4446 // This is needed for CTV2 to work
@@ -54,7 +56,7 @@ protected static boolean isRetriableWorkgroupException(ConflictException excepti
5456 .build ();
5557
5658 protected static final Constant PREOPERATION_BACKOFF_STRATEGY = Constant .of ()
57- .timeout (Duration .ofMinutes (5L ))
59+ .timeout (Duration .ofMinutes (60L ))
5860 .delay (Duration .ofSeconds (5L ))
5961 .build ();
6062
@@ -130,14 +132,40 @@ protected UpdateWorkgroupResponse updateWorkgroup(final UpdateWorkgroupRequest a
130132
131133 }
132134
135+ // Since there are source to target operations on the cluster
136+ // We will receive operation in progress in such cases.
137+ // This needs to be handled on CFN side as this will break contract tests
133138 protected DeleteWorkgroupResponse deleteWorkgroup (final DeleteWorkgroupRequest awsRequest ,
134- final ProxyClient <RedshiftServerlessClient > proxyClient ) {
135-
136- DeleteWorkgroupResponse awsResponse = proxyClient .injectCredentialsAndInvokeV2 (
137- awsRequest , proxyClient .client ()::deleteWorkgroup );
138-
139- logger .log (String .format ("Workgroup : %s has successfully been deleted." , awsResponse .workgroup ().workgroupName ()));
140- logger .log (awsResponse .toString ());
139+ final ProxyClient <RedshiftServerlessClient > proxyClient ) throws ConflictException {
140+ boolean operationInProgress = false ;
141+ int max_retries = 5 ;
142+ int current_retry = 0 ;
143+ DeleteWorkgroupResponse awsResponse = null ;
144+
145+ do {
146+ try {
147+ awsResponse = proxyClient .injectCredentialsAndInvokeV2 (awsRequest , proxyClient .client ()::deleteWorkgroup );
148+ logger .log (String .format ("Workgroup : %s has successfully been deleted." , awsResponse .workgroup ().workgroupName ()));
149+ logger .log (awsResponse .toString ());
150+ operationInProgress = false ;
151+ } catch (ConflictException e ) {
152+ Pattern pattern = Pattern .compile (".*There is an operation in progress.*" , Pattern .CASE_INSENSITIVE );
153+ if (pattern .matcher (e .getMessage ()).matches ()) {
154+ logger .log ("There is an operation in progress during delete. We will wait and retry in 60 secs" );
155+ operationInProgress = true ;
156+ current_retry = current_retry + 1 ;
157+ // Since there are source to target operations on the cluster
158+ try {
159+ Thread .sleep (60000 );
160+ } catch (InterruptedException ex ) {
161+ Thread .currentThread ().interrupt ();
162+ }
163+ } else {
164+ // We need to explicitly catch operation in progress or reraise other conflict exceptions
165+ throw e ;
166+ }
167+ }
168+ } while ((current_retry < max_retries ) && operationInProgress );
141169
142170 return awsResponse ;
143171 }
@@ -205,6 +233,15 @@ protected boolean isWorkgroupDeleted(final Object awsRequest,
205233 return false ;
206234 }
207235
236+ protected ListTagsForResourceResponse readTags (final ListTagsForResourceRequest awsRequest ,
237+ final ProxyClient <RedshiftServerlessClient > proxyClient ) {
238+ ListTagsForResourceResponse awsResponse ;
239+ awsResponse = proxyClient .injectCredentialsAndInvokeV2 (awsRequest , proxyClient .client ()::listTagsForResource );
240+
241+ logger .log (String .format ("%s's tags have successfully been read." , ResourceModel .TYPE_NAME ));
242+ return awsResponse ;
243+ }
244+
208245 protected ProgressEvent <ResourceModel , CallbackContext > defaultWorkgroupErrorHandler (final Object awsRequest ,
209246 final Exception exception ,
210247 final ProxyClient <RedshiftServerlessClient > client ,
0 commit comments