package org.ovirt.engine.ui.uicommonweb.models.gluster;
import java.util.ArrayList;
import java.util.List;
import org.ovirt.engine.core.common.businessentities.VDS;
import org.ovirt.engine.core.common.businessentities.gluster.StorageDevice;
import org.ovirt.engine.ui.uicommonweb.dataprovider.AsyncDataProvider;
import org.ovirt.engine.ui.uicommonweb.models.EntityModel;
import org.ovirt.engine.ui.uicommonweb.models.ListModel;
import org.ovirt.engine.ui.uicommonweb.models.Model;
import org.ovirt.engine.ui.uicommonweb.validation.IValidation;
import org.ovirt.engine.ui.uicommonweb.validation.NotEmptyValidation;
public class ReplaceBrickModel extends Model {
ListModel<VDS> servers;
EntityModel<String> brickDirectory;
ListModel<String> bricksFromServer;
EntityModel<Boolean> showBricksList;
public ReplaceBrickModel() {
setServers(new ListModel<VDS>());
setBrickDirectory(new EntityModel<String>());
setBricksFromServer(new ListModel<String>());
setShowBricksList(new EntityModel<Boolean>());
init();
}
private void init() {
getShowBricksList().setEntity(true);
getBrickDirectory().setIsAvailable(false);
getShowBricksList().getEntityChangedEvent().addListener((ev, sender, args) -> {
if (getShowBricksList().getEntity()) {
// Show the brick list and hide the text box for entering brick dir
getBricksFromServer().setIsAvailable(true);
getBrickDirectory().setIsAvailable(false);
updateBricksFromHost();
} else {
// Hide the brick list and show the text box for entering brick dir
getBricksFromServer().setIsAvailable(false);
getBrickDirectory().setIsAvailable(true);
}
});
getServers().getSelectedItemChangedEvent().addListener((ev, sender, args) -> {
if (getShowBricksList().getEntity()) {
updateBricksFromHost();
}
});
}
private void updateBricksFromHost() {
VDS selectedServer = getServers().getSelectedItem();
if (selectedServer != null) {
AsyncDataProvider.getInstance().getUnusedBricksFromServer(new AsyncQuery<>(bricks -> {
List<String> lvNames = new ArrayList<>();
for (StorageDevice brick : bricks) {
String mountPoint = brick.getMountPoint();
if (mountPoint != null && !mountPoint.isEmpty()) {
// Gluster requires a directory under the mount point, not the mount point itself as
// a brick directory. So adding a directory with name of the brick under the mount
// point.
lvNames.add(mountPoint + mountPoint.substring(mountPoint.lastIndexOf("/"))); //$NON-NLS-1$
}
}
getBricksFromServer().setItems(lvNames);
}), selectedServer.getId());
}
}
public void setIsBrickProvisioningSupported(boolean isBrickProvisioningSupported) {
getShowBricksList().setIsAvailable(isBrickProvisioningSupported);
getShowBricksList().setEntity(isBrickProvisioningSupported);
}
public ListModel<VDS> getServers() {
return servers;
}
public void setServers(ListModel<VDS> servers) {
this.servers = servers;
}
public EntityModel<String> getBrickDirectory() {
return brickDirectory;
}
public void setBrickDirectory(EntityModel<String> brickDirectory) {
this.brickDirectory = brickDirectory;
}
public ListModel<String> getBricksFromServer() {
return bricksFromServer;
}
public void setBricksFromServer(ListModel<String> bricksFromServer) {
this.bricksFromServer = bricksFromServer;
}
public EntityModel<Boolean> getShowBricksList() {
return showBricksList;
}
public void setShowBricksList(EntityModel<Boolean> showBricksList) {
this.showBricksList = showBricksList;
}
public boolean validate() {
if (getShowBricksList().getEntity()) {
getBrickDirectory().setEntity(getBricksFromServer().getSelectedItem());
}
getBrickDirectory().validateEntity(new IValidation[] { new NotEmptyValidation() });
return getServers().getIsValid() && getBrickDirectory().getIsValid();
}
}