use of org.ovirt.engine.core.common.action.gluster.SetUpMountBrokerParameters in project ovirt-engine by oVirt.
the class AddBricksToGlusterVolumeCommand method postAddBrickHandleGeoRepCase.
private void postAddBrickHandleGeoRepCase(final List<GlusterBrickEntity> bricksList, final Set<Guid> newServerIds) {
// newServerIds is the set of ids of the servers that were not part of the volume before this attempt of brick
// addition.
final GlusterVolumeEntity volume = getGlusterVolume();
List<GlusterGeoRepSession> sessions = new ArrayList<>();
// Get all sessions for which the volume is a master
List<GlusterGeoRepSession> geoRepSessionsForVolumeAsMaster = glusterGeoRepDao.getGeoRepSessions(volume.getId());
if (geoRepSessionsForVolumeAsMaster != null && !geoRepSessionsForVolumeAsMaster.isEmpty()) {
sessions.addAll(geoRepSessionsForVolumeAsMaster);
}
// Get session for which the volume is a slave
GlusterGeoRepSession geoRepSessionForVolumeAsSlave = glusterGeoRepDao.getGeoRepSessionBySlaveVolume(volume.getId());
if (geoRepSessionForVolumeAsSlave != null) {
sessions.add(geoRepSessionForVolumeAsSlave);
}
// If this volume is empty, nothing to do.
if (sessions.isEmpty()) {
return;
}
List<Callable<Boolean>> perSessionCallables = new ArrayList<>();
for (final GlusterGeoRepSession currentSession : sessions) {
perSessionCallables.add(() -> {
// Ids of servers on which steps like mount broker setup and/or passwordless ssh need to be done.
Set<Guid> serverIdsToPrep = new HashSet<>(newServerIds);
// Assume current volume as master volume of current session
GlusterVolumeEntity masterVolume = volume;
boolean succeeded = true;
addCustomValue(GlusterConstants.VOLUME_NAME, currentSession.getMasterVolumeName());
addCustomValue(GlusterConstants.GEO_REP_SLAVE_VOLUME_NAME, currentSession.getSlaveVolumeName());
addCustomValue(GlusterConstants.GEO_REP_USER, currentSession.getUserName());
if (currentSession.getMasterVolumeId().equals(volume.getId())) {
/*
* If the volume is master, and there are any new servers, serverIdsToPrep is a set of all slave
* servers. This is bcoz the new server's keys also need to be updated to all slave servers.
*/
serverIdsToPrep = getSlaveNodesSet(currentSession);
} else {
// If its slave and non-root session, do partial mount broker setup
if (!currentSession.getUserName().equalsIgnoreCase("root")) {
succeeded = evaluateReturnValue(errorType, backend.runInternalAction(ActionType.SetupGlusterGeoRepMountBrokerInternal, new SetUpMountBrokerParameters(volume.getClusterId(), serverIdsToPrep, volume.getName(), currentSession.getUserName())));
if (succeeded) {
auditLogDirector.log(this, AuditLogType.GLUSTER_SETUP_GEOREP_MOUNT_BROKER);
}
}
/*
* If the assumption that current volume is master, is invalid, which will be known here, update
* master volume correctly.
*/
masterVolume = glusterVolumeDao.getById(currentSession.getMasterVolumeId());
}
if (succeeded) {
succeeded = evaluateReturnValue(errorType, runInternalAction(ActionType.SetUpPasswordLessSSHInternal, new SetUpPasswordLessSSHParameters(masterVolume.getClusterId(), serverIdsToPrep, currentSession.getUserName())));
}
if (succeeded) {
auditLogDirector.log(this, AuditLogType.SET_UP_PASSWORDLESS_SSH);
succeeded = evaluateReturnValue(errorType, runVdsCommand(VDSCommandType.CreateGlusterVolumeGeoRepSession, new GlusterVolumeGeoRepSessionVDSParameters(glusterUtil.getRandomUpServer(masterVolume.getClusterId()).getId(), currentSession.getMasterVolumeName(), currentSession.getSlaveHostName(), currentSession.getSlaveVolumeName(), currentSession.getUserName(), true)));
}
if (currentSession.getStatus() == GeoRepSessionStatus.ACTIVE || currentSession.getStatus() == GeoRepSessionStatus.INITIALIZING) {
succeeded = evaluateReturnValue(errorType, runInternalAction(ActionType.StartGlusterVolumeGeoRep, new GlusterVolumeGeoRepSessionParameters(currentSession.getMasterVolumeId(), currentSession.getId(), true)));
}
return succeeded;
});
}
ThreadPoolUtil.invokeAll(perSessionCallables);
}
Aggregations