Alexander Wels has uploaded a new change for review.

Change subject: webadmin: cluster guide me datacenter
......................................................................

webadmin: cluster guide me datacenter

- Added add data center button to popup view when the cluster
  has no data center associated with it.
- Added popup window to select the data center to associate with
  the cluster. This popup contains a list of available data centers
  filtered by the following rules:
  - Data center compatibility level <= Cluster compatibility level
  - Date center with local data and no assigned cluster.
- Fixed issue where this patch would not allow new VMs to be created.

Change-Id: Ifaafdd5593d3721b9e6a8b466b2ac186b18bd6ff
Bug-Url: https://bugzilla.redhat.com/show_bug.cgi?id=1136414
Signed-off-by: Alexander Wels <aw...@redhat.com>
---
M 
frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/editor/EntityModelCellTable.java
M 
frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/clusters/ClusterGuideModel.java
M 
frontend/webadmin/modules/uicompat/src/main/java/org/ovirt/engine/ui/uicompat/UIConstants.java
M 
frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/gin/PresenterModule.java
A 
frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/presenter/popup/cluster/AddDataCenterClusterPopupPresenterWidget.java
M 
frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/presenter/popup/guide/GuidePopupPresenterWidget.java
A 
frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/cluster/AddDataCenterClusterPopupView.java
A 
frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/cluster/AddDataCenterClusterPopupView.ui.xml
8 files changed, 441 insertions(+), 174 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/86/41486/1

diff --git 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/editor/EntityModelCellTable.java
 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/editor/EntityModelCellTable.java
index b14a121..e466551 100644
--- 
a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/editor/EntityModelCellTable.java
+++ 
b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/editor/EntityModelCellTable.java
@@ -227,13 +227,13 @@
                 for (EntityModel entity : (List<EntityModel>) 
getListModel().getItems()) {
                     entity.setIsSelected(false);
                 }
-                getListModel().setSelectedItems(null);
 
                 // Set "IsSelected"
                 SelectionModel<? super EntityModel> selectionModel = 
EntityModelCellTable.this.getSelectionModel();
                 if (selectionModel instanceof SingleSelectionModel) {
                     EntityModel selectedObject =
                             ((SingleSelectionModel<EntityModel>) 
selectionModel).getSelectedObject();
+                    clearCurrentSelectedItems();
                     if (selectedObject != null) {
                         selectedObject.setIsSelected(true);
                         getListModel().setSelectedItem(selectedObject);
@@ -244,9 +244,15 @@
                         entity.setIsSelected(true);
                         selectedItems.add(entity);
                     }
+                    clearCurrentSelectedItems();
                     getListModel().setSelectedItems(selectedItems);
                 }
             }
+
+            private void clearCurrentSelectedItems() {
+                getListModel().setSelectedItems(null);
+                getListModel().setSelectedItem(null);
+            }
         });
     }
 
diff --git 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/clusters/ClusterGuideModel.java
 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/clusters/ClusterGuideModel.java
index cb1c671..635836e 100644
--- 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/clusters/ClusterGuideModel.java
+++ 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/clusters/ClusterGuideModel.java
@@ -5,7 +5,9 @@
 import java.util.List;
 
 import com.google.gwt.user.client.Timer;
+
 import org.ovirt.engine.core.common.action.ChangeVDSClusterParameters;
+import 
org.ovirt.engine.core.common.action.ManagementNetworkOnClusterOperationParameters;
 import org.ovirt.engine.core.common.action.VdcActionParametersBase;
 import org.ovirt.engine.core.common.action.VdcActionType;
 import org.ovirt.engine.core.common.action.VdcReturnValueBase;
@@ -42,27 +44,33 @@
 import org.ovirt.engine.ui.uicompat.IFrontendActionAsyncCallback;
 import org.ovirt.engine.ui.uicompat.IFrontendMultipleActionAsyncCallback;
 
-@SuppressWarnings("unused")
-public class ClusterGuideModel extends GuideModel
-{
+public class ClusterGuideModel extends GuideModel {
 
-    public final String ClusterConfigureHostsAction = 
ConstantsManager.getInstance()
-            .getConstants()
-            .configureHostClusterGuide();
-    public final String ClusterAddAnotherHostAction = 
ConstantsManager.getInstance()
-            .getConstants()
-            .addAnotherHostClusterGuide();
-    public final String SelectHostsAction = 
ConstantsManager.getInstance().getConstants().selectHostsClusterGuide();
+    //Action command names
+    private static final String ADD_DATA_CENTER = "AddDataCenter"; 
//$NON-NLS-1$
+    private static final String CANCEL_CONFIRM_WITH_FOCUS = 
"CancelConfirmWithFocus"; //$NON-NLS-1$
+    private static final String CANCEL_CONFIRM = "CancelConfirm"; //$NON-NLS-1$
+    private static final String CANCEL = "Cancel"; //$NON-NLS-1$
+    private static final String ON_SELECT_HOST = "OnSelectHost"; //$NON-NLS-1$
+    private static final String SELECT_HOST = "SelectHost"; //$NON-NLS-1$
+    private static final String ON_ADD_HOST = "OnAddHost"; //$NON-NLS-1$
+    private static final String ON_CONFIRM_PM_HOST = "OnConfirmPMHost"; 
//$NON-NLS-1$
+    private static final String ADD_HOST = "AddHost"; //$NON-NLS-1$
+    private static final String ON_ADD_DATACENTER = "OnAddDataCenter"; 
//$NON-NLS-1$
+
+    //Pop-up and button titles.
+    private final String clusterConfigureHostsActionTitle =
+            
ConstantsManager.getInstance().getConstants().configureHostClusterGuide();
+    private final String clusterAddAnotherHostActionTitle =
+            
ConstantsManager.getInstance().getConstants().addAnotherHostClusterGuide();
+    private final String selectHostsActionTitle =
+            
ConstantsManager.getInstance().getConstants().selectHostsClusterGuide();
+    private final String addDataCenterTitle = 
ConstantsManager.getInstance().getConstants().addDataCenter();
+    private final String noAvailableActions = 
ConstantsManager.getInstance().getConstants().guidePopupNoActionsLabel();
 
     @Override
-    public VDSGroup getEntity()
-    {
+    public VDSGroup getEntity() {
         return (VDSGroup) ((super.getEntity() instanceof VDSGroup) ? 
super.getEntity() : null);
-    }
-
-    public void setEntity(VDSGroup value)
-    {
-        super.setEntity(value);
     }
 
     @Override
@@ -90,16 +98,16 @@
                     }
                 }), getEntity().getName());
 
-        AsyncDataProvider.getInstance().getHostList(new AsyncQuery(this,
-                                                                   new 
INewAsyncCallback() {
-                                                                       
@Override
-                                                                       public 
void onSuccess(Object target, Object returnValue) {
-                                                                           
ClusterGuideModel clusterGuideModel = (ClusterGuideModel) target;
-                                                                           
ArrayList<VDS> hosts = (ArrayList<VDS>) returnValue;
-                                                                           
clusterGuideModel.allHosts = hosts;
-                                                                           
clusterGuideModel.updateOptionsNonLocalFS();
-                                                                       }
-                                                                   }));
+        AsyncDataProvider.getInstance().getHostList(new AsyncQuery(this, new 
INewAsyncCallback() {
+                @Override
+                public void onSuccess(Object target, Object returnValue) {
+                    ClusterGuideModel clusterGuideModel = (ClusterGuideModel) 
target;
+                    ArrayList<VDS> hosts = (ArrayList<VDS>) returnValue;
+                    clusterGuideModel.allHosts = hosts;
+                    clusterGuideModel.updateOptionsNonLocalFS();
+                }
+            }
+        ));
         if (getEntity().supportsGlusterService()) {
             AsyncDataProvider.getInstance().isAnyHostUpInCluster(new 
AsyncQuery(this,
                     new INewAsyncCallback() {
@@ -136,26 +144,21 @@
             return;
         }
         // Add host action.
-        UICommand addHostAction = new UICommand("AddHost", this); //$NON-NLS-1$
+        UICommand addHostAction = new UICommand(ADD_HOST, this);
 
-        if (hosts.size() > 1)
-        {
+        if (hosts.size() > 1) {
             hosts.remove(0);
         }
 
-        if (hosts.isEmpty())
-        {
-            addHostAction.setTitle(ClusterConfigureHostsAction);
+        if (hosts.isEmpty()) {
+            addHostAction.setTitle(clusterConfigureHostsActionTitle);
             getCompulsoryActions().add(addHostAction);
-        }
-        else if (isAnyUpHostInCluster())
-        {
-            addHostAction.setTitle(ClusterAddAnotherHostAction);
+        } else if (isAnyUpHostInCluster()) {
+            addHostAction.setTitle(clusterAddAnotherHostActionTitle);
             getOptionalActions().add(addHostAction);
         }
 
-        if (getEntity().getStoragePoolId() == null)
-        {
+        if (getEntity().getStoragePoolId() == null) {
             
addHostAction.getExecuteProhibitionReasons().add(ConstantsManager.getInstance()
                     .getConstants()
                     .theClusterIsntAttachedToADcClusterGuide());
@@ -164,29 +167,23 @@
         }
 
         ArrayList<VDS> availableHosts = new ArrayList<VDS>();
-        for (VDS vds : allHosts)
-        {
+        for (VDS vds : allHosts) {
             if (!getEntity().getId().equals(vds.getVdsGroupId())
                     && (vds.getStatus() == VDSStatus.Maintenance || 
vds.getStatus() == VDSStatus.PendingApproval)
-                    && vds.getSupportedClusterVersionsSet() != null &&
-                    
vds.getSupportedClusterVersionsSet().contains(getEntity().getCompatibilityVersion()))
-            {
+                    && vds.getSupportedClusterVersionsSet() != null
+                    && 
vds.getSupportedClusterVersionsSet().contains(getEntity().getCompatibilityVersion()))
 {
                 availableHosts.add(vds);
             }
         }
         // Select host action.
-        UICommand selectHostAction = new UICommand("SelectHost", this); 
//$NON-NLS-1$
+        UICommand selectHostAction = new UICommand(SELECT_HOST, this);
 
-        if (availableHosts.size() > 0)
-        {
-            if (hosts.isEmpty())
-            {
-                selectHostAction.setTitle(SelectHostsAction);
+        if (availableHosts.size() > 0) {
+            if (hosts.isEmpty()) {
+                selectHostAction.setTitle(selectHostsActionTitle);
                 getCompulsoryActions().add(selectHostAction);
-            }
-            else if (isAnyUpHostInCluster())
-            {
-                selectHostAction.setTitle(SelectHostsAction);
+            } else if (isAnyUpHostInCluster()) {
+                selectHostAction.setTitle(selectHostsActionTitle);
                 getOptionalActions().add(selectHostAction);
             }
         }
@@ -196,13 +193,12 @@
 
     private void updateOptionsLocalFS() {
 
-        UICommand addHostAction = new UICommand("AddHost", this); //$NON-NLS-1$
-        addHostAction.setTitle(ClusterAddAnotherHostAction);
-        UICommand selectHost = new UICommand("SelectHost", this); //$NON-NLS-1$
-        selectHost.setTitle(SelectHostsAction);
+        UICommand addHostAction = new UICommand(ADD_HOST, this);
+        addHostAction.setTitle(clusterAddAnotherHostActionTitle);
+        UICommand selectHost = new UICommand(SELECT_HOST, this);
+        selectHost.setTitle(selectHostsActionTitle);
 
-        if (localStorageHost != null)
-        {
+        if (localStorageHost != null) {
             String hasHostReason =
                 ConstantsManager.getInstance()
                     .getConstants()
@@ -223,34 +219,100 @@
         stopProgress();
     }
 
-    private void updateOptions()
-    {
+    private void updateOptions() {
         getCompulsoryActions().clear();
         getOptionalActions().clear();
 
-        if (getEntity() != null && getEntity().getStoragePoolId() != null)
-        {
-            startProgress(null);
+        if (getEntity() == null) {
+            return;
+        }
+        startProgress(null);
+        if (getEntity().getStoragePoolId() != null) {
+            //Datacenter associated with this cluster.
+            AsyncDataProvider.getInstance().getDataCenterById(new 
AsyncQuery(this, new INewAsyncCallback() {
+                    @Override
+                    public void onSuccess(Object target, Object returnValue) {
+                        ClusterGuideModel model = (ClusterGuideModel) target;
+                        model.dataCenter = (StoragePool) returnValue;
 
-            AsyncDataProvider.getInstance().getDataCenterById(new 
AsyncQuery(this,
-                    new INewAsyncCallback() {
-                        @Override
-                        public void onSuccess(Object target, Object 
returnValue) {
-                            ClusterGuideModel model = (ClusterGuideModel) 
target;
-                            model.dataCenter = (StoragePool) returnValue;
-
-                            if (model.dataCenter == null
-                                    || !model.dataCenter.isLocal())
-                            {
-                                model.updateOptionsNonLocalFSData();
-                            }
-                            else
-                            {
-                                model.updateOptionsLocalFSData();
+                        if (model.dataCenter == null
+                                || !model.dataCenter.isLocal()) {
+                            model.updateOptionsNonLocalFSData();
+                        } else {
+                            model.updateOptionsLocalFSData();
+                        }
+                    }
+                }), getEntity().getStoragePoolId());
+        } else {
+            //No data-center associated with this cluster.
+            AsyncDataProvider.getInstance().getDataCenterList(new 
AsyncQuery(this, new INewAsyncCallback() {
+                    @Override
+                    public void onSuccess(Object target, Object returnValue) {
+                        ClusterGuideModel model = (ClusterGuideModel) target;
+                        @SuppressWarnings("unchecked")
+                        List<StoragePool> dataCenters = 
(ArrayList<StoragePool>) returnValue;
+                        final List<StoragePool> localDataCenters = new 
ArrayList<StoragePool>();
+                        boolean enableButton = false;
+                        for (StoragePool dataCenter: dataCenters) {
+                            //Find at least one compatible data-center, so we 
can show the button.
+                            if 
(model.getEntity().getCompatibilityVersion().compareTo(
+                                    dataCenter.getCompatibilityVersion()) >= 0 
) {
+                                if (dataCenter.isLocal()) {
+                                    //Check if there are any clusters 
associated with this data-center already.
+                                    localDataCenters.add(dataCenter);
+                                } else {
+                                    enableButton = true;
+                                    break;
+                                }
                             }
                         }
-                    }), getEntity().getStoragePoolId());
+                        if (enableButton || localDataCenters.isEmpty()) {
+                            
model.updateOptionsRequiredAddDataCenter(enableButton);
+                        } else {
+                            
model.updateOptionsRequiredAddDataCenter(localDataCenters);
+                        }
+                    }
+                }
+            ));
         }
+    }
+
+    protected void updateOptionsRequiredAddDataCenter(final List<StoragePool> 
localDataCenters) {
+        AsyncDataProvider.getInstance().getClusterList(new AsyncQuery(this,
+            new INewAsyncCallback() {
+                @Override
+                public void onSuccess(Object target, Object returnValue) {
+                    ClusterGuideModel model = (ClusterGuideModel) target;
+                    List<StoragePool> localDataCenterWithCluster = new 
ArrayList<StoragePool>();
+                    @SuppressWarnings("unchecked")
+                    List<VDSGroup> clusters = (List<VDSGroup>) returnValue;
+                    for (StoragePool dataCenter: localDataCenters) {
+                        for (VDSGroup cluster: clusters) {
+                            if (cluster.getStoragePoolId() != null &&
+                                    
cluster.getStoragePoolId().equals(dataCenter.getId())) {
+                                localDataCenterWithCluster.add(dataCenter);
+                                break;
+                            }
+                        }
+                    }
+                    localDataCenters.removeAll(localDataCenterWithCluster);
+                    
model.updateOptionsRequiredAddDataCenter(!localDataCenters.isEmpty());
+                }
+            })
+        );
+    }
+
+    protected void updateOptionsRequiredAddDataCenter(boolean enableButton) {
+        if (enableButton) {
+            // Add data-center action.
+            UICommand addDataCenterAction = new UICommand(ADD_DATA_CENTER, 
this);
+            addDataCenterAction.setTitle(addDataCenterTitle);
+            addDataCenterAction.setIsAvailable(enableButton);
+            getOptionalActions().add(addDataCenterAction);
+        } else {
+            setNote(new EntityModel<String>(noAvailableActions));
+        }
+        stopProgress();
     }
 
     private boolean isUpHostCheckCompleted() {
@@ -275,8 +337,7 @@
         isAnyHostUpInCluster = null;
     }
 
-    public void selectHost()
-    {
+    public void selectHost() {
         final ArrayList<VDSGroup> clusters = new ArrayList<VDSGroup>();
         clusters.add(getEntity());
 
@@ -311,26 +372,20 @@
                 }), getEntity().getStoragePoolId());
     }
 
-    public void onSelectHost()
-    {
-
+    public void onSelectHost() {
         MoveHost model = (MoveHost) getWindow();
 
-        if (model.getProgress() != null)
-        {
+        if (model.getProgress() != null) {
             return;
         }
 
-        if (!model.validate())
-        {
+        if (!model.validate()) {
             return;
         }
 
         model.setSelectedHosts(new ArrayList<MoveHostData>());
-        for (EntityModel a : Linq.<EntityModel> cast(model.getItems()))
-        {
-            if (a.getIsSelected())
-            {
+        for (EntityModel a : Linq.<EntityModel> cast(model.getItems())) {
+            if (a.getIsSelected()) {
                 model.getSelectedHosts().add((MoveHostData) a);
             }
         }
@@ -338,14 +393,11 @@
         VDSGroup cluster = (VDSGroup) model.getCluster().getSelectedItem();
 
         final List<VdcActionParametersBase> parameterList = new ArrayList<>();
-        for (MoveHostData hostData : model.getSelectedHosts())
-        {
+        for (MoveHostData hostData : model.getSelectedHosts()) {
             VDS host = hostData.getEntity();
             // Try to change host's cluster as neccessary.
-            if (host.getVdsGroupId() != null && 
!host.getVdsGroupId().equals(cluster.getId()))
-            {
+            if (host.getVdsGroupId() != null && 
!host.getVdsGroupId().equals(cluster.getId())) {
                 parameterList.add(new 
ChangeVDSClusterParameters(cluster.getId(), host.getId()));
-
             }
         }
         model.startProgress(null);
@@ -358,16 +410,13 @@
                         List<MoveHostData> hosts = ((MoveHost) 
clusterGuideModel.getWindow()).getSelectedHosts();
                         List<VdcReturnValueBase> retVals = 
result.getReturnValue();
                         final List<VdcActionParametersBase> 
activateVdsParameterList = new ArrayList<>();
-                        if (retVals != null && hosts.size() == retVals.size())
-                        {
+                        if (retVals != null && hosts.size() == retVals.size()) 
{
                             int i = 0;
 
-                            for (MoveHostData selectedHostData : hosts)
-                            {
+                            for (MoveHostData selectedHostData : hosts) {
                                 VDS selectedHost= selectedHostData.getEntity();
                                 if (selectedHost.getStatus() == 
VDSStatus.PendingApproval && retVals.get(i) != null
-                                        && retVals.get(i).getSucceeded())
-                                {
+                                        && retVals.get(i).getSucceeded()) {
                                     
Frontend.getInstance().runAction(VdcActionType.ApproveVds,
                                             new 
ApproveVdsParameters(selectedHost.getId()));
                                 } else if (selectedHostData.getActivateHost()) 
{
@@ -396,8 +445,79 @@
                 this);
     }
 
-    public void addHost()
-    {
+    private void addDataCenter() {
+        AsyncDataProvider.getInstance().getDataCenterList(new AsyncQuery(this, 
new INewAsyncCallback() {
+            @Override
+            public void onSuccess(Object target, Object returnValue) {
+                ClusterGuideModel guideModel = (ClusterGuideModel) target;
+                @SuppressWarnings("unchecked")
+                List<StoragePool> allDataCenters = (List<StoragePool>) 
returnValue;
+                List<EntityModel<StoragePool>> filteredDataCenters = new 
ArrayList<EntityModel<StoragePool>>();
+                List<StoragePool> localDataCenters = new 
ArrayList<StoragePool>();
+                for (StoragePool dataCenter: allDataCenters) {
+                    //Find at least one compatible data-center, so we can show 
the button.
+                    if 
(guideModel.getEntity().getCompatibilityVersion().compareTo(
+                            dataCenter.getCompatibilityVersion()) >= 0) {
+                        if (dataCenter.isLocal()) {
+                            //Check if there are any clusters associated with 
this data-center already.
+                            localDataCenters.add(dataCenter);
+                        } else {
+                            filteredDataCenters.add(new 
EntityModel<StoragePool>(dataCenter));
+                        }
+                    }
+                }
+                if (localDataCenters.isEmpty()) {
+                    displayAddDataCenter(filteredDataCenters);
+                } else {
+                    verifyLocalDataCenterNoCluster(filteredDataCenters, 
localDataCenters);
+                }
+            }
+
+        }
+    ));
+
+    }
+
+    private void verifyLocalDataCenterNoCluster(final 
List<EntityModel<StoragePool>> filteredDataCenters,
+            final List<StoragePool> localDataCenters) {
+        AsyncDataProvider.getInstance().getClusterList(new AsyncQuery(this, 
new INewAsyncCallback() {
+                @Override
+                public void onSuccess(Object target, Object returnValue) {
+                    List<StoragePool> localDataCenterWithCluster = new 
ArrayList<StoragePool>();
+                    @SuppressWarnings("unchecked")
+                    List<VDSGroup> clusters = (List<VDSGroup>) returnValue;
+                    for (StoragePool dataCenter: localDataCenters) {
+                        for (VDSGroup cluster: clusters) {
+                            if (cluster.getStoragePoolId() != null &&
+                                    
cluster.getStoragePoolId().equals(dataCenter.getId())) {
+                                localDataCenterWithCluster.add(dataCenter);
+                                break;
+                            }
+                        }
+                    }
+                    localDataCenters.removeAll(localDataCenterWithCluster);
+                    for (StoragePool dataCenter: localDataCenters) {
+                        filteredDataCenters.add(new 
EntityModel<StoragePool>(dataCenter));
+                    }
+                    displayAddDataCenter(filteredDataCenters);
+                }
+            })
+        );
+    }
+
+    private void displayAddDataCenter(List<EntityModel<StoragePool>> 
dataCenters) {
+        ListModel<EntityModel<StoragePool>> dataCentersModel = new 
ListModel<EntityModel<StoragePool>>();
+        dataCentersModel.setItems(dataCenters);
+        dataCentersModel.setTitle(addDataCenterTitle);
+        dataCentersModel.setHashName("add_datacenter"); //$NON-NLS-1$
+        setWindow(dataCentersModel);
+        UICommand tempVar = 
UICommand.createDefaultOkUiCommand(ON_ADD_DATACENTER, ClusterGuideModel.this);
+        dataCentersModel.getCommands().add(tempVar);
+        UICommand tempVar2 = UICommand.createCancelUiCommand(CANCEL, 
ClusterGuideModel.this);
+        dataCentersModel.getCommands().add(tempVar2);
+    }
+
+    public void addHost() {
         HostModel model = new NewHostModel();
         setWindow(model);
         
model.setTitle(ConstantsManager.getInstance().getConstants().newHostTitle());
@@ -411,28 +531,26 @@
         model.getCluster().setIsChangeable(false);
 
         AsyncDataProvider.getInstance().getDataCenterList(new AsyncQuery(this,
-                                                                         new 
INewAsyncCallback() {
-                                                                             
@Override
-                                                                             
public void onSuccess(Object target, Object returnValue) {
-                                                                               
  ClusterGuideModel clusterGuideModel = (ClusterGuideModel) target;
-                                                                               
  HostModel model = (HostModel) clusterGuideModel.getWindow();
+             new INewAsyncCallback() {
+                 @Override
+                 public void onSuccess(Object target, Object returnValue) {
+                     ClusterGuideModel clusterGuideModel = (ClusterGuideModel) 
target;
+                     HostModel model = (HostModel) 
clusterGuideModel.getWindow();
 
-                                                                               
  ArrayList<StoragePool> dataCenters = (ArrayList<StoragePool>) returnValue;
-                                                                               
  model.getDataCenter().setItems(dataCenters);
-                                                                               
  if (getEntity().getStoragePoolId() != null) {
-                                                                               
      model.getDataCenter().setSelectedItem(Linq.firstOrDefault(dataCenters,
-                                                                               
                                                                new 
Linq.DataCenterPredicate(clusterGuideModel.getEntity()
-                                                                               
                                                                                
                     .getStoragePoolId())));
-                                                                               
  }
-                                                                               
  model.getDataCenter().setIsChangeable(
-                                                                               
          false);
+                     ArrayList<StoragePool> dataCenters = 
(ArrayList<StoragePool>) returnValue;
+                     model.getDataCenter().setItems(dataCenters);
+                     if (getEntity().getStoragePoolId() != null) {
+                         
model.getDataCenter().setSelectedItem(Linq.firstOrDefault(dataCenters,
+                               new 
Linq.DataCenterPredicate(clusterGuideModel.getEntity().getStoragePoolId())));
+                     }
+                     model.getDataCenter().setIsChangeable(false);
 
-                                                                               
  UICommand tempVar = UICommand.createDefaultOkUiCommand("OnConfirmPMHost", 
clusterGuideModel); //$NON-NLS-1$
-                                                                               
  model.getCommands().add(tempVar);
-                                                                               
  UICommand tempVar2 = UICommand.createCancelUiCommand("Cancel", 
clusterGuideModel); //$NON-NLS-1$
-                                                                               
  model.getCommands().add(tempVar2);
-                                                                             }
-                                                                         }));
+                     UICommand tempVar = 
UICommand.createDefaultOkUiCommand("OnConfirmPMHost", clusterGuideModel); 
//$NON-NLS-1$
+                     model.getCommands().add(tempVar);
+                     UICommand tempVar2 = 
UICommand.createCancelUiCommand("Cancel", clusterGuideModel); //$NON-NLS-1$
+                     model.getCommands().add(tempVar2);
+                 }
+             }));
 
         ListModel<VDSGroup> clusterModel = model.getCluster();
         if (clusterModel.getSelectedItem() != null) {
@@ -449,18 +567,15 @@
         }
     }
 
-    public void onConfirmPMHost()
-    {
+    public void onConfirmPMHost() {
         HostModel model = (HostModel) getWindow();
 
-        if (!model.validate())
-        {
+        if (!model.validate()) {
             return;
         }
 
         if (!model.getIsPm().getEntity()
-                && ApplicationModeHelper.getUiMode() != 
ApplicationMode.GlusterOnly)
-        {
+                && ApplicationModeHelper.getUiMode() != 
ApplicationMode.GlusterOnly) {
             ConfirmationModel confirmModel = new ConfirmationModel();
             setConfirmWindow(confirmModel);
             
confirmModel.setTitle(ConstantsManager.getInstance().getConstants().powerManagementConfigurationTitle());
@@ -472,26 +587,53 @@
             confirmModel.getCommands().add(tempVar);
             UICommand tempVar2 = 
UICommand.createCancelUiCommand("CancelConfirmWithFocus", this); //$NON-NLS-1$
             confirmModel.getCommands().add(tempVar2);
-        }
-        else
-        {
+        } else {
             onAddHost();
         }
     }
 
-    public void onAddHost()
-    {
+    public void onAddDataCenter() {
+
+        @SuppressWarnings("unchecked")
+        ListModel<EntityModel<StoragePool>> dataCentersModel = 
(ListModel<EntityModel<StoragePool>>)getWindow();
+        EntityModel<StoragePool> dataCenter = 
dataCentersModel.getSelectedItem();
+
+        if (dataCenter != null) {
+            VDSGroup cluster = getEntity();
+            cluster.setStoragePoolId(dataCenter.getEntity().getId());
+            dataCentersModel.startProgress(null);
+
+            Frontend.getInstance().runAction(VdcActionType.UpdateVdsGroup, new 
ManagementNetworkOnClusterOperationParameters(cluster),
+                new IFrontendActionAsyncCallback() {
+                    @Override
+                    public void executed(FrontendActionAsyncResult result) {
+
+                        if (result.getReturnValue() != null && 
result.getReturnValue().getSucceeded()) {
+                            //Succeeded, close this window.
+                            ClusterGuideModel guideModel = (ClusterGuideModel) 
result.getState();
+                            guideModel.postAction();
+                        }
+                        //Close popup window.
+                        setWindow(null);
+
+                    }
+                },
+            this);
+        } else {
+            setWindow(null);
+        }
+    }
+
+    public void onAddHost() {
         cancelConfirm();
 
         HostModel model = (HostModel) getWindow();
 
-        if (model.getProgress() != null)
-        {
+        if (model.getProgress() != null) {
             return;
         }
 
-        if (!model.validate())
-        {
+        if (!model.validate()) {
             return;
         }
 
@@ -567,39 +709,33 @@
         return agents;
     }
 
-    public void postOnAddHost(VdcReturnValueBase returnValue)
-    {
+    public void postOnAddHost(VdcReturnValueBase returnValue) {
         HostModel model = (HostModel) getWindow();
 
         model.stopProgress();
 
-        if (returnValue != null && returnValue.getSucceeded())
-        {
+        if (returnValue != null && returnValue.getSucceeded()) {
             cancel();
             postAction();
         }
     }
 
     @Override
-    protected void postAction()
-    {
+    protected void postAction() {
         resetData();
         updateOptions();
     }
 
-    protected void cancel()
-    {
+    protected void cancel() {
         resetData();
         setWindow(null);
     }
 
-    public void cancelConfirm()
-    {
+    public void cancelConfirm() {
         setConfirmWindow(null);
     }
 
-    public void cancelConfirmWithFocus()
-    {
+    public void cancelConfirmWithFocus() {
         setConfirmWindow(null);
 
         HostModel hostModel = (HostModel) getWindow();
@@ -607,41 +743,38 @@
     }
 
     @Override
-    public void executeCommand(UICommand command)
-    {
+    public void executeCommand(UICommand command) {
         super.executeCommand(command);
 
-        if ("AddHost".equals(command.getName())) //$NON-NLS-1$
-        {
+        if (ADD_HOST.equals(command.getName())) {
             addHost();
         }
-        if ("OnConfirmPMHost".equals(command.getName())) //$NON-NLS-1$
-        {
+        if (ON_CONFIRM_PM_HOST.equals(command.getName())) {
             onConfirmPMHost();
         }
-        if ("OnAddHost".equals(command.getName())) //$NON-NLS-1$
-        {
+        if (ON_ADD_HOST.equals(command.getName())) {
             onAddHost();
         }
-        if ("SelectHost".equals(command.getName())) //$NON-NLS-1$
-        {
+        if (SELECT_HOST.equals(command.getName())) {
             selectHost();
         }
-        if ("OnSelectHost".equals(command.getName())) //$NON-NLS-1$
-        {
+        if (ON_SELECT_HOST.equals(command.getName())) {
             onSelectHost();
         }
-        if ("Cancel".equals(command.getName())) //$NON-NLS-1$
-        {
+        if (CANCEL.equals(command.getName())) {
             cancel();
         }
-        if ("CancelConfirm".equals(command.getName())) //$NON-NLS-1$
-        {
+        if (CANCEL_CONFIRM.equals(command.getName())) {
             cancelConfirm();
         }
-        if ("CancelConfirmWithFocus".equals(command.getName())) //$NON-NLS-1$
-        {
+        if (CANCEL_CONFIRM_WITH_FOCUS.equals(command.getName())) {
             cancelConfirmWithFocus();
         }
+        if (ADD_DATA_CENTER.equals(command.getName())) {
+            addDataCenter();
+        }
+        if (ON_ADD_DATACENTER.equals(command.getName())) {
+            onAddDataCenter();
+        }
     }
 }
diff --git 
a/frontend/webadmin/modules/uicompat/src/main/java/org/ovirt/engine/ui/uicompat/UIConstants.java
 
b/frontend/webadmin/modules/uicompat/src/main/java/org/ovirt/engine/ui/uicompat/UIConstants.java
index 2634b86..a2ebe3e 100644
--- 
a/frontend/webadmin/modules/uicompat/src/main/java/org/ovirt/engine/ui/uicompat/UIConstants.java
+++ 
b/frontend/webadmin/modules/uicompat/src/main/java/org/ovirt/engine/ui/uicompat/UIConstants.java
@@ -1,5 +1,6 @@
 package org.ovirt.engine.ui.uicompat;
 
+import com.google.gwt.i18n.client.Constants;
 import org.ovirt.engine.core.common.businessentities.VmPool;
 
 import com.google.gwt.i18n.client.Constants;
@@ -1077,6 +1078,12 @@
     @DefaultStringValue("Configure Host")
     String configureHostClusterGuide();
 
+    @DefaultStringValue("No actions available on cluster.")
+    String guidePopupNoActionsLabel();
+
+    @DefaultStringValue("Attach Cluster to Data Center")
+    String addDataCenter();
+
     @DefaultStringValue("Add another Host")
     String addAnotherHostClusterGuide();
 
diff --git 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/gin/PresenterModule.java
 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/gin/PresenterModule.java
index 670bba6..c6cd185 100644
--- 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/gin/PresenterModule.java
+++ 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/gin/PresenterModule.java
@@ -22,6 +22,7 @@
 import 
org.ovirt.engine.ui.webadmin.section.main.presenter.popup.StorageQosPopupPresenterWidget;
 import 
org.ovirt.engine.ui.webadmin.section.main.presenter.popup.SystemPermissionsRemoveConfirmationPopupPresenterWidget;
 import 
org.ovirt.engine.ui.webadmin.section.main.presenter.popup.bookmark.BookmarkPopupPresenterWidget;
+import 
org.ovirt.engine.ui.webadmin.section.main.presenter.popup.cluster.AddDataCenterClusterPopupPresenterWidget;
 import 
org.ovirt.engine.ui.webadmin.section.main.presenter.popup.cluster.ClusterManageNetworkPopupPresenterWidget;
 import 
org.ovirt.engine.ui.webadmin.section.main.presenter.popup.cluster.ClusterPopupPresenterWidget;
 import 
org.ovirt.engine.ui.webadmin.section.main.presenter.popup.cluster.GlusterHookContentPopupPresenterWidget;
@@ -282,6 +283,7 @@
 import 
org.ovirt.engine.ui.webadmin.section.main.view.popup.PermissionsPopupView;
 import 
org.ovirt.engine.ui.webadmin.section.main.view.popup.SystemPermissionsRemoveConfirmationPopupView;
 import 
org.ovirt.engine.ui.webadmin.section.main.view.popup.bookmark.BookmarkPopupView;
+import 
org.ovirt.engine.ui.webadmin.section.main.view.popup.cluster.AddDataCenterClusterPopupView;
 import 
org.ovirt.engine.ui.webadmin.section.main.view.popup.cluster.ClusterManageNetworkPopupView;
 import 
org.ovirt.engine.ui.webadmin.section.main.view.popup.cluster.ClusterPopupView;
 import 
org.ovirt.engine.ui.webadmin.section.main.view.popup.cluster.GlusterHookContentPopupView;
@@ -1275,6 +1277,11 @@
         bindPresenterWidget(VolumeProfileStatisticsPopupPresenterWidget.class,
                 VolumeProfileStatisticsPopupPresenterWidget.ViewDef.class,
                 VolumeProfileStatisticsPopupView.class);
+
+        bindPresenterWidget(AddDataCenterClusterPopupPresenterWidget.class,
+                AddDataCenterClusterPopupPresenterWidget.ViewDef.class,
+                AddDataCenterClusterPopupView.class);
+
         // Host
         bindPresenterWidget(HostPopupPresenterWidget.class,
                 HostPopupPresenterWidget.ViewDef.class,
diff --git 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/presenter/popup/cluster/AddDataCenterClusterPopupPresenterWidget.java
 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/presenter/popup/cluster/AddDataCenterClusterPopupPresenterWidget.java
new file mode 100644
index 0000000..e455d08
--- /dev/null
+++ 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/presenter/popup/cluster/AddDataCenterClusterPopupPresenterWidget.java
@@ -0,0 +1,21 @@
+package org.ovirt.engine.ui.webadmin.section.main.presenter.popup.cluster;
+
+import org.ovirt.engine.core.common.businessentities.StoragePool;
+import 
org.ovirt.engine.ui.common.presenter.AbstractModelBoundPopupPresenterWidget;
+import org.ovirt.engine.ui.uicommonweb.models.EntityModel;
+import org.ovirt.engine.ui.uicommonweb.models.ListModel;
+
+import com.google.gwt.event.shared.EventBus;
+import com.google.inject.Inject;
+
+public class AddDataCenterClusterPopupPresenterWidget extends 
AbstractModelBoundPopupPresenterWidget
+    <ListModel<EntityModel<StoragePool>>, 
AddDataCenterClusterPopupPresenterWidget.ViewDef> {
+
+    public interface ViewDef extends 
AbstractModelBoundPopupPresenterWidget.ViewDef<ListModel<EntityModel<StoragePool>>>
 {
+    }
+
+    @Inject
+    public AddDataCenterClusterPopupPresenterWidget(EventBus eventBus, ViewDef 
view) {
+        super(eventBus, view);
+    }
+}
diff --git 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/presenter/popup/guide/GuidePopupPresenterWidget.java
 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/presenter/popup/guide/GuidePopupPresenterWidget.java
index e4926ad..ed626fc 100644
--- 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/presenter/popup/guide/GuidePopupPresenterWidget.java
+++ 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/presenter/popup/guide/GuidePopupPresenterWidget.java
@@ -6,6 +6,7 @@
 import org.ovirt.engine.ui.uicommonweb.models.ConfirmationModel;
 import org.ovirt.engine.ui.uicommonweb.models.GuideModel;
 import org.ovirt.engine.ui.uicommonweb.models.Model;
+import 
org.ovirt.engine.ui.webadmin.section.main.presenter.popup.cluster.AddDataCenterClusterPopupPresenterWidget;
 import 
org.ovirt.engine.ui.webadmin.section.main.presenter.popup.cluster.ClusterPopupPresenterWidget;
 import 
org.ovirt.engine.ui.webadmin.section.main.presenter.popup.datacenter.FindMultiStoragePopupPresenterWidget;
 import 
org.ovirt.engine.ui.webadmin.section.main.presenter.popup.datacenter.FindSingleStoragePopupPresenterWidget;
@@ -35,6 +36,7 @@
     private final Provider<FindSingleStoragePopupPresenterWidget> 
singleStoragePopupProvider;
     private final Provider<FindMultiStoragePopupPresenterWidget> 
multiStoragePopupProvider;
     private final Provider<StorageForceCreatePopupPresenterWidget> 
forceCreateConfirmPopupProvider;
+    private final Provider<AddDataCenterClusterPopupPresenterWidget> 
addDatacenterClusterPopupProvider;
 
     @Inject
     public GuidePopupPresenterWidget(EventBus eventBus, ViewDef view,
@@ -48,7 +50,8 @@
             Provider<VmDiskAttachPopupPresenterWidget> 
vmDiskAttachPopupPopupProvider,
             Provider<MoveHostPopupPresenterWidget> moveHostPopupProvider,
             Provider<FindSingleStoragePopupPresenterWidget> 
singleStoragePopupProvider,
-            Provider<FindMultiStoragePopupPresenterWidget> 
multiStoragePopupProvider) {
+            Provider<FindMultiStoragePopupPresenterWidget> 
multiStoragePopupProvider,
+            Provider<AddDataCenterClusterPopupPresenterWidget> 
addDatacenterClusterPopupProvider) {
         super(eventBus, view, defaultConfirmPopupProvider);
         this.forceCreateConfirmPopupProvider = forceCreateConfirmPopupProvider;
         this.clusterPopupProvider = clusterPopupProvider;
@@ -60,6 +63,7 @@
         this.moveHostPopupProvider = moveHostPopupProvider;
         this.singleStoragePopupProvider = singleStoragePopupProvider;
         this.multiStoragePopupProvider = multiStoragePopupProvider;
+        this.addDatacenterClusterPopupProvider = 
addDatacenterClusterPopupProvider;
     }
 
     @Override
@@ -89,6 +93,8 @@
             return vmDiskPopupPopupProvider.get();
         } else if (lastExecutedCommandName.equals("AttachDisk")) { 
//$NON-NLS-1$
             return vmDiskAttachPopupPopupProvider.get();
+        } else if (lastExecutedCommandName.equals("AddDataCenter")) { 
//$NON-NLS-1$
+            return addDatacenterClusterPopupProvider.get();
         } else {
             return super.getModelPopup(source, lastExecutedCommand, 
windowModel);
         }
diff --git 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/cluster/AddDataCenterClusterPopupView.java
 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/cluster/AddDataCenterClusterPopupView.java
new file mode 100644
index 0000000..b831e2c
--- /dev/null
+++ 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/cluster/AddDataCenterClusterPopupView.java
@@ -0,0 +1,69 @@
+package org.ovirt.engine.ui.webadmin.section.main.view.popup.cluster;
+
+import org.ovirt.engine.core.common.businessentities.StoragePool;
+import org.ovirt.engine.ui.common.view.popup.AbstractModelBoundPopupView;
+import org.ovirt.engine.ui.common.widget.dialog.SimpleDialogPanel;
+import org.ovirt.engine.ui.common.widget.editor.EntityModelCellTable;
+import 
org.ovirt.engine.ui.common.widget.table.column.AbstractEntityModelTextColumn;
+import org.ovirt.engine.ui.uicommonweb.models.EntityModel;
+import org.ovirt.engine.ui.uicommonweb.models.ListModel;
+import org.ovirt.engine.ui.webadmin.ApplicationConstants;
+import org.ovirt.engine.ui.webadmin.gin.AssetProvider;
+import 
org.ovirt.engine.ui.webadmin.section.main.presenter.popup.cluster.AddDataCenterClusterPopupPresenterWidget;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.editor.client.SimpleBeanEditorDriver;
+import com.google.gwt.event.shared.EventBus;
+import com.google.gwt.uibinder.client.UiBinder;
+import com.google.gwt.uibinder.client.UiField;
+import com.google.inject.Inject;
+
+public class AddDataCenterClusterPopupView extends 
AbstractModelBoundPopupView<ListModel<EntityModel<StoragePool>>>
+    implements AddDataCenterClusterPopupPresenterWidget.ViewDef {
+
+    interface ViewUiBinder extends UiBinder<SimpleDialogPanel, 
AddDataCenterClusterPopupView> {
+        ViewUiBinder uiBinder = GWT.create(ViewUiBinder.class);
+    }
+
+    interface Driver extends 
SimpleBeanEditorDriver<ListModel<EntityModel<StoragePool>>, 
AddDataCenterClusterPopupView> {
+    }
+    private static final ApplicationConstants constants = 
AssetProvider.getConstants();
+
+    @UiField(provided = true)
+    EntityModelCellTable<ListModel<EntityModel<StoragePool>>> dataCentersTable;
+
+    @Inject
+    public AddDataCenterClusterPopupView(EventBus eventBus) {
+        super(eventBus);
+        dataCentersTable = new 
EntityModelCellTable<ListModel<EntityModel<StoragePool>>>(false, false);
+        initWidget(ViewUiBinder.uiBinder.createAndBindUi(this));
+        initTableColumns();
+    }
+
+    private void initTableColumns() {
+        dataCentersTable.addColumn(new 
AbstractEntityModelTextColumn<StoragePool>() {
+            @Override
+            public String getText(StoragePool entity) {
+                return entity.getName();
+            }
+        }, constants.dataCenter());
+
+        dataCentersTable.addColumn(new 
AbstractEntityModelTextColumn<StoragePool>() {
+            @Override
+            public String getText(StoragePool entity) {
+                return entity.getCompatibilityVersion().getValue();
+            }
+        }, constants.comptVersDc());
+    }
+
+    @Override
+    public void edit(ListModel<EntityModel<StoragePool>> object) {
+        dataCentersTable.asEditor().edit(object);
+    }
+
+    @Override
+    public ListModel<EntityModel<StoragePool>> flush() {
+        return dataCentersTable.asEditor().flush();
+    }
+
+}
diff --git 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/cluster/AddDataCenterClusterPopupView.ui.xml
 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/cluster/AddDataCenterClusterPopupView.ui.xml
new file mode 100644
index 0000000..5f4adc6
--- /dev/null
+++ 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/cluster/AddDataCenterClusterPopupView.ui.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent";>
+<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder"
+    xmlns:g="urn:import:com.google.gwt.user.client.ui" 
xmlns:d="urn:import:org.ovirt.engine.ui.common.widget.dialog"
+    xmlns:e="urn:import:org.ovirt.engine.ui.common.widget.editor">
+
+    <ui:style>
+    </ui:style>
+
+    <d:SimpleDialogPanel width="400px" height="250px">
+        <d:content>
+            <g:ScrollPanel>
+                <e:EntityModelCellTable ui:field="dataCentersTable"/>
+            </g:ScrollPanel>
+        </d:content>
+    </d:SimpleDialogPanel>
+
+</ui:UiBinder>
\ No newline at end of file


-- 
To view, visit https://gerrit.ovirt.org/41486
To unsubscribe, visit https://gerrit.ovirt.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: Ifaafdd5593d3721b9e6a8b466b2ac186b18bd6ff
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-engine
Gerrit-Branch: master
Gerrit-Owner: Alexander Wels <aw...@redhat.com>
_______________________________________________
Engine-patches mailing list
Engine-patches@ovirt.org
http://lists.ovirt.org/mailman/listinfo/engine-patches

Reply via email to