44import com .fasterxml .jackson .core .JsonProcessingException ;
55import com .fasterxml .jackson .core .type .TypeReference ;
66import com .fasterxml .jackson .databind .ObjectMapper ;
7+ import com .google .gson .Gson ;
8+ import com .google .gson .GsonBuilder ;
79import software .amazon .awssdk .awscore .AwsRequest ;
810import software .amazon .awssdk .services .redshift .model .DeleteResourcePolicyRequest ;
911import software .amazon .awssdk .services .redshift .model .GetResourcePolicyRequest ;
1921import software .amazon .awssdk .services .redshiftserverless .model .CreateSnapshotCopyConfigurationRequest ;
2022import software .amazon .awssdk .services .redshiftserverless .model .UpdateSnapshotCopyConfigurationRequest ;
2123import software .amazon .awssdk .services .redshiftserverless .model .DeleteSnapshotCopyConfigurationRequest ;
24+ import software .amazon .awssdk .services .redshiftserverless .model .ListTagsForResourceRequest ;
25+ import software .amazon .awssdk .services .redshiftserverless .model .ListTagsForResourceResponse ;
26+ import software .amazon .awssdk .services .redshiftserverless .model .TagResourceRequest ;
27+ import software .amazon .awssdk .services .redshiftserverless .model .UntagResourceRequest ;
2228import software .amazon .cloudformation .proxy .Logger ;
2329
2430import java .io .IOException ;
3844 */
3945
4046public class Translator {
47+ private static final Gson GSON = new GsonBuilder ().create ();
4148
4249 /**
4350 * Request to create a resource
@@ -54,22 +61,13 @@ static CreateNamespaceRequest translateToCreateRequest(final ResourceModel model
5461 .defaultIamRoleArn (model .getDefaultIamRoleArn ())
5562 .iamRoles (model .getIamRoles ())
5663 .logExportsWithStrings (model .getLogExports ())
57- .tags (translateTagsToSdk (model .getTags ()))
64+ .tags (translateToSdkTags (model .getTags ()))
5865 .manageAdminPassword (model .getManageAdminPassword ())
5966 .adminPasswordSecretKmsKeyId (model .getAdminPasswordSecretKmsKeyId ())
6067 .redshiftIdcApplicationArn (model .getRedshiftIdcApplicationArn ())
6168 .build ();
6269 }
6370
64- static List <software .amazon .awssdk .services .redshiftserverless .model .Tag > translateTagsToSdk (final List <software .amazon .redshiftserverless .namespace .Tag > tags ) {
65- return Optional .ofNullable (tags ).orElse (Collections .emptyList ())
66- .stream ()
67- .map (tag -> software .amazon .awssdk .services .redshiftserverless .model .Tag .builder ()
68- .key (tag .getKey ())
69- .value (tag .getValue ()).build ())
70- .collect (Collectors .toList ());
71- }
72-
7371 /*
7472 This function is to return the iam role in the same format as input iam roles.
7573 Instead of modifying the schema for backward compatibitlity we use regex to extract the iam role.
@@ -264,6 +262,90 @@ static AwsRequest untagResourceRequest(final ResourceModel model, final Set<Stri
264262 return awsRequest ;
265263 }
266264
265+ /**
266+ * Request to read tags for a resource
267+ *
268+ * @param model resource model
269+ * @return awsRequest the aws service request to update tags of a resource
270+ */
271+ static ListTagsForResourceRequest translateToReadTagsRequest (final ResourceModel model ) {
272+ return ListTagsForResourceRequest .builder ()
273+ .resourceArn (model .getNamespace ().getNamespaceArn ())
274+ .build ();
275+ }
276+
277+ /**
278+ * Translates resource object from sdk into a resource model
279+ *
280+ * @param awsResponse the aws service describe resource response
281+ * @param model the resource model contained the current resource info
282+ * @return awsRequest the aws service request to update tags of a resource
283+ */
284+ static ResourceModel translateFromReadTagsResponse (final ListTagsForResourceResponse awsResponse ,
285+ final ResourceModel model ) {
286+ return model .toBuilder ()
287+ .tags (translateToModelTags (awsResponse .tags ()))
288+ .build ();
289+ }
290+
291+ /**
292+ * Request to update tags for a resource
293+ *
294+ * @param desiredResourceState the resource model request to update tags
295+ * @param currentResourceState the resource model request to delete tags
296+ * @return awsRequest the aws service request to update tags of a resource
297+ */
298+ static UpdateTagsRequest translateToUpdateTagsRequest (final ResourceModel desiredResourceState ,
299+ final ResourceModel currentResourceState ) {
300+ String resourceArn = currentResourceState .getNamespace ().getNamespaceArn ();
301+
302+ List <Tag > toBeCreatedTags = desiredResourceState .getTags () == null ? Collections .emptyList () : desiredResourceState .getTags ()
303+ .stream ()
304+ .filter (tag -> currentResourceState .getTags () == null || !currentResourceState .getTags ().contains (tag ))
305+ .collect (Collectors .toList ());
306+
307+ List <Tag > toBeDeletedTags = currentResourceState .getTags () == null ? Collections .emptyList () : currentResourceState .getTags ()
308+ .stream ()
309+ .filter (tag -> desiredResourceState .getTags () == null || !desiredResourceState .getTags ().contains (tag ))
310+ .collect (Collectors .toList ());
311+
312+ return UpdateTagsRequest .builder ()
313+ .createNewTagsRequest (TagResourceRequest .builder ()
314+ .tags (translateToSdkTags (toBeCreatedTags ))
315+ .resourceArn (resourceArn )
316+ .build ())
317+ .deleteOldTagsRequest (UntagResourceRequest .builder ()
318+ .tagKeys (toBeDeletedTags
319+ .stream ()
320+ .map (Tag ::getKey )
321+ .collect (Collectors .toList ()))
322+ .resourceArn (resourceArn )
323+ .build ())
324+ .build ();
325+ }
326+
327+ private static software .amazon .awssdk .services .redshiftserverless .model .Tag translateToSdkTag (Tag tag ) {
328+ return GSON .fromJson (GSON .toJson (tag ), software .amazon .awssdk .services .redshiftserverless .model .Tag .class );
329+ }
330+
331+ private static List <software .amazon .awssdk .services .redshiftserverless .model .Tag > translateToSdkTags (final List <Tag > tags ) {
332+ return tags == null ? null : tags
333+ .stream ()
334+ .map (Translator ::translateToSdkTag )
335+ .collect (Collectors .toList ());
336+ }
337+
338+ private static Tag translateToModelTag (software .amazon .awssdk .services .redshiftserverless .model .Tag tag ) {
339+ return GSON .fromJson (GSON .toJson (tag ), Tag .class );
340+ }
341+
342+ private static List <Tag > translateToModelTags (Collection <software .amazon .awssdk .services .redshiftserverless .model .Tag > tags ) {
343+ return tags == null ? null : tags
344+ .stream ()
345+ .map (Translator ::translateToModelTag )
346+ .collect (Collectors .toList ());
347+ }
348+
267349 private static Namespace translateToModelNamespace (
268350 software .amazon .awssdk .services .redshiftserverless .model .Namespace namespace ) {
269351
0 commit comments