diff options
Diffstat (limited to 'catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/version/GroupMembersUpdateOperation.java')
-rw-r--r-- | catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/version/GroupMembersUpdateOperation.java | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/version/GroupMembersUpdateOperation.java b/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/version/GroupMembersUpdateOperation.java new file mode 100644 index 0000000000..df98a7f707 --- /dev/null +++ b/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/version/GroupMembersUpdateOperation.java @@ -0,0 +1,66 @@ +package org.openecomp.sdc.be.components.impl.version; + +import org.apache.commons.collections.MapUtils; +import org.openecomp.sdc.be.dao.api.ActionStatus; +import org.openecomp.sdc.be.impl.ComponentsUtils; +import org.openecomp.sdc.be.model.Component; +import org.openecomp.sdc.be.model.ComponentInstance; +import org.openecomp.sdc.be.model.GroupDefinition; +import org.openecomp.sdc.be.model.jsontitan.operations.GroupsOperation; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.List; +import java.util.Map; + +import static org.apache.commons.collections.CollectionUtils.isEmpty; +@org.springframework.stereotype.Component +public class GroupMembersUpdateOperation implements PostChangeVersionOperation { + + private static final Logger log = LoggerFactory.getLogger(GroupMembersUpdateOperation.class); + private final GroupsOperation groupsOperation; + private final ComponentsUtils componentsUtils; + + public GroupMembersUpdateOperation(GroupsOperation groupsOperation, ComponentsUtils componentsUtils) { + this.groupsOperation = groupsOperation; + this.componentsUtils = componentsUtils; + } + + @Override + public ActionStatus onChangeVersion(Component container, ComponentInstance prevVersion, ComponentInstance newVersion) { + return updateGroupMembersOnChangeVersion(container, prevVersion, newVersion); + } + + private ActionStatus updateGroupMembersOnChangeVersion(Component container, ComponentInstance prevVersion, ComponentInstance newVersion) { + log.debug("#updateGroupMembersOnChangeVersion - replacing all group members for component instance {} with new component instance.", prevVersion.getUniqueId(), newVersion.getUniqueId()); + if (isEmpty(container.getGroups())) { + log.debug("#updateGroupMembersOnChangeVersion - container {} has no groups.", container.getUniqueId()); + return ActionStatus.OK; + } + List<GroupDefinition> groupsWithPrevInstAsMember = container.resolveGroupsByMember(prevVersion.getUniqueId()); + if (isEmpty(groupsWithPrevInstAsMember)) { + log.debug("#updateGroupMembersOnChangeVersion - container {} has no groups with component instance {} as member.", container.getUniqueId(), prevVersion.getUniqueId()); + return ActionStatus.OK; + } + replacePrevInstanceMemberWithNewInstance(prevVersion, newVersion, groupsWithPrevInstAsMember); + return updateGroups(container, groupsWithPrevInstAsMember); + } + + private ActionStatus updateGroups(Component container, List<GroupDefinition> groupsToUpdate) { + log.debug("#updateGroups - updating {} groups for container {}", groupsToUpdate.size(), container.getUniqueId()); + return groupsOperation.updateGroups(container, groupsToUpdate) + .either(groupsUpdated -> ActionStatus.OK, + err -> componentsUtils.convertFromStorageResponse(err, container.getComponentType())); + } + + private void replacePrevInstanceMemberWithNewInstance(ComponentInstance prevVersion, ComponentInstance newVersion, List<GroupDefinition> groupsWithPrevInstAsMember) { + groupsWithPrevInstAsMember.forEach(grp -> replacePrevInstanceMemberWithNewInstance(grp, prevVersion.getUniqueId(), newVersion.getUniqueId())); + } + + private void replacePrevInstanceMemberWithNewInstance(GroupDefinition groupDefinition, String prevInstanceId, String newInstanceId) { + Map<String, String> membersNameToId = groupDefinition.getMembers(); + String prevInstanceMemberName = MapUtils.invertMap(membersNameToId).get(prevInstanceId).toString(); + membersNameToId.replace(prevInstanceMemberName, newInstanceId); + } + +} |