use of com.sequenceiq.freeipa.service.freeipa.user.model.UmsUsersState in project cloudbreak by hortonworks.
the class UserSyncForEnvService method startAsyncSyncsForStacks.
private Map<String, Future<SyncStatusDetail>> startAsyncSyncsForStacks(String operationId, String accountId, List<Stack> stacks, UserSyncRequestFilter userSyncFilter, UserSyncOptions options, Set<String> environmentCrns) {
if (userSyncFilter.getDeletedWorkloadUser().isEmpty()) {
UserSyncLogEvent logRetrieveUmsEvent = options.isFullSync() ? RETRIEVE_FULL_UMS_STATE : RETRIEVE_PARTIAL_UMS_STATE;
LOGGER.debug("Starting {} for environments {} ...", logRetrieveUmsEvent, environmentCrns);
Map<String, UmsUsersState> envToUmsStateMap = umsUsersStateProviderDispatcher.getEnvToUmsUsersStateMap(accountId, environmentCrns, userSyncFilter.getUserCrnFilter(), userSyncFilter.getMachineUserCrnFilter(), MDCUtils.getRequestId());
LOGGER.debug("Finished {}.", logRetrieveUmsEvent);
UmsEventGenerationIds umsEventGenerationIds = options.isFullSync() ? umsEventGenerationIdsProvider.getEventGenerationIds(accountId, MDCUtils.getRequestId()) : null;
return stacks.stream().collect(Collectors.toMap(Stack::getEnvironmentCrn, stack -> asyncSynchronizeStack(stack, envToUmsStateMap.get(stack.getEnvironmentCrn()), umsEventGenerationIds, options, operationId, accountId)));
} else {
String deletedWorkloadUser = userSyncFilter.getDeletedWorkloadUser().get();
return stacks.stream().collect(Collectors.toMap(Stack::getEnvironmentCrn, stack -> asyncSynchronizeStackForDeleteUser(stack, deletedWorkloadUser)));
}
}
use of com.sequenceiq.freeipa.service.freeipa.user.model.UmsUsersState in project cloudbreak by hortonworks.
the class ActorHandler method handleActor.
public void handleActor(EnvironmentAccessRights environmentAccessRights, FmsUser fmsUser, String actorCrn, Supplier<Collection<String>> groupCrnMembershipSupplier, Supplier<Collection<String>> wagMembershipSupplier, Supplier<WorkloadCredential> workloadCredentialSupplier, List<UserManagementProto.CloudIdentity> cloudIdentityList) {
if (environmentAccessRights.hasEnvironmentAccessRight()) {
String workloadUsername = fmsUser.getName();
// Retrieve all information from UMS before modifying to the UmsUsersState or UsersState. This is so that
// we don't partially modify the state if the member has been deleted after we started the sync
Collection<String> groupCrnsForMember = groupCrnMembershipSupplier.get();
Collection<String> workloadAdministrationGroupsForMember = wagMembershipSupplier.get();
WorkloadCredential workloadCredential = workloadCredentialSupplier.get();
groupCrnsForMember.forEach(gcrn -> {
FmsGroup group = crnToFmsGroup.get(gcrn);
// the group and group membership will be updated on the next sync
if (group != null) {
usersStateBuilder.addMemberToGroup(group.getName(), workloadUsername);
} else {
LOGGER.warn("{} is a member of unexpected group {}. Group must have been added after UMS state calculation started", workloadUsername, gcrn);
}
});
workloadAdministrationGroupsForMember.stream().filter(wagName -> !wagNamesForOtherEnvironments.contains(wagName)).forEach(wagName -> {
usersStateBuilder.addGroup(fmsGroupConverter.nameToGroup(wagName));
usersStateBuilder.addMemberToGroup(wagName, workloadUsername);
});
addMemberToInternalTrackingGroup(usersStateBuilder, workloadUsername);
if (environmentAccessRights.hasAdminFreeIpaRight()) {
usersStateBuilder.addMemberToGroup(UserSyncConstants.ADMINS_GROUP, workloadUsername);
}
umsUsersStateBuilder.addWorkloadCredentials(workloadUsername, workloadCredential);
umsUsersStateBuilder.addUserCloudIdentities(workloadUsername, cloudIdentityList);
usersStateBuilder.addUserMetadata(workloadUsername, new UserMetadata(actorCrn, workloadCredential.getVersion()));
usersStateBuilder.addUser(fmsUser);
}
}
use of com.sequenceiq.freeipa.service.freeipa.user.model.UmsUsersState in project cloudbreak by hortonworks.
the class UserSyncServiceTest method testFilteredSyncRetrievesFilteredIpaState.
@Test
void testFilteredSyncRetrievesFilteredIpaState() throws Exception {
UmsUsersState umsUsersState = mock(UmsUsersState.class);
ImmutableSet<String> workloadUsers = mock(ImmutableSet.class);
when(umsUsersState.getRequestedWorkloadUsernames()).thenReturn(workloadUsers);
underTest.getIpaUserState(freeIpaClient, umsUsersState, false);
verify(freeIpaUsersStateProvider).getFilteredFreeIpaState(any(), eq(workloadUsers));
}
use of com.sequenceiq.freeipa.service.freeipa.user.model.UmsUsersState in project cloudbreak by hortonworks.
the class UserSyncService method internalSynchronizeUsers.
private void internalSynchronizeUsers(String operationId, String accountId, List<Stack> stacks, UserSyncRequestFilter userSyncFilter, UserSyncOptions options) {
tryWithOperationCleanup(operationId, accountId, () -> {
Set<String> environmentCrns = stacks.stream().map(Stack::getEnvironmentCrn).collect(Collectors.toSet());
Optional<String> requestId = MDCUtils.getRequestId();
UmsEventGenerationIds umsEventGenerationIds = options.isFullSync() ? umsEventGenerationIdsProvider.getEventGenerationIds(accountId, requestId) : null;
LogEvent logUserSyncEvent = options.isFullSync() ? LogEvent.FULL_USER_SYNC : LogEvent.PARTIAL_USER_SYNC;
LOGGER.info("Starting {} for environments {} with operationId {} ...", logUserSyncEvent, environmentCrns, operationId);
Map<String, Future<SyncStatusDetail>> statusFutures;
if (userSyncFilter.getDeletedWorkloadUser().isEmpty()) {
LogEvent logRetrieveUmsEvent = options.isFullSync() ? LogEvent.RETRIEVE_FULL_UMS_STATE : LogEvent.RETRIEVE_PARTIAL_UMS_STATE;
LOGGER.debug("Starting {} for environments {} ...", logRetrieveUmsEvent, environmentCrns);
Map<String, UmsUsersState> envToUmsStateMap = umsUsersStateProviderDispatcher.getEnvToUmsUsersStateMap(accountId, environmentCrns, userSyncFilter.getUserCrnFilter(), userSyncFilter.getMachineUserCrnFilter(), requestId);
LOGGER.debug("Finished {}.", logRetrieveUmsEvent);
statusFutures = stacks.stream().collect(Collectors.toMap(Stack::getEnvironmentCrn, stack -> asyncSynchronizeStack(stack, envToUmsStateMap.get(stack.getEnvironmentCrn()), umsEventGenerationIds, options, operationId, accountId)));
} else {
String deletedWorkloadUser = userSyncFilter.getDeletedWorkloadUser().get();
statusFutures = stacks.stream().collect(Collectors.toMap(Stack::getEnvironmentCrn, stack -> asyncSynchronizeStackForDeleteUser(stack, deletedWorkloadUser)));
}
List<SuccessDetails> success = new ArrayList<>();
List<FailureDetails> failure = new ArrayList<>();
statusFutures.forEach((envCrn, statusFuture) -> {
try {
SyncStatusDetail statusDetail = statusFuture.get();
switch(statusDetail.getStatus()) {
case COMPLETED:
success.add(new SuccessDetails(envCrn));
break;
case FAILED:
failure.add(createFailureDetails(envCrn, statusDetail.getDetails(), statusDetail.getWarnings()));
break;
default:
failure.add(createFailureDetails(envCrn, "Unexpected status: " + statusDetail.getStatus(), statusDetail.getWarnings()));
break;
}
} catch (InterruptedException | ExecutionException e) {
LOGGER.error("Sync is interrupted for env: {}", envCrn, e);
failure.add(new FailureDetails(envCrn, e.getLocalizedMessage()));
}
});
operationService.completeOperation(accountId, operationId, success, failure);
LOGGER.info("Finished {} for environments {} with operationId {}.", logUserSyncEvent, environmentCrns, operationId);
});
}
use of com.sequenceiq.freeipa.service.freeipa.user.model.UmsUsersState in project cloudbreak by hortonworks.
the class UserSyncService method compareUmsAndFreeIpa.
private UsersStateDifference compareUmsAndFreeIpa(UmsUsersState umsUsersState, UserSyncOptions options, FreeIpaClient freeIpaClient) throws FreeIpaClientException {
LogEvent logEvent = options.isFullSync() ? LogEvent.RETRIEVE_FULL_IPA_STATE : LogEvent.RETRIEVE_PARTIAL_IPA_STATE;
LOGGER.debug("Starting {} ...", logEvent);
UsersState ipaUsersState = getIpaUserState(freeIpaClient, umsUsersState, options.isFullSync());
LOGGER.debug("Finished {}, found {} users and {} groups.", logEvent, ipaUsersState.getUsers().size(), ipaUsersState.getGroups().size());
LOGGER.debug("Starting {} ...", LogEvent.CALCULATE_UMS_IPA_DIFFERENCE);
UsersStateDifference usersStateDifference = UsersStateDifference.fromUmsAndIpaUsersStates(umsUsersState, ipaUsersState, options);
LOGGER.debug("Finished {}.", LogEvent.CALCULATE_UMS_IPA_DIFFERENCE);
return usersStateDifference;
}
Aggregations