com.microsoft.azuretools.docker.ui.wizards.createhost.AzureNewDockerConfigPage.java Source code

Java tutorial

Introduction

Here is the source code for com.microsoft.azuretools.docker.ui.wizards.createhost.AzureNewDockerConfigPage.java

Source

/**
 * Copyright (c) Microsoft Corporation
 * 
 * All rights reserved. 
 * 
 * MIT License
 * 
 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files 
 * (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, 
 * publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, 
 * subject to the following conditions:
 * 
 * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
 * 
 * THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR 
 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH 
 * THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */
package com.microsoft.azuretools.docker.ui.wizards.createhost;

import com.microsoft.azure.PagedList;
import com.microsoft.azure.docker.AzureDockerHostsManager;
import com.microsoft.azure.docker.model.AzureDockerSubscription;
import com.microsoft.azure.docker.model.AzureDockerVnet;
import com.microsoft.azure.docker.model.DockerHost;
import com.microsoft.azure.docker.model.KnownDockerVirtualMachineImage;
import com.microsoft.azure.docker.model.KnownDockerVirtualMachineSizes;
import com.microsoft.azure.docker.ops.utils.AzureDockerUtils;
import com.microsoft.azure.docker.ops.utils.AzureDockerValidationUtils;
import com.microsoft.azure.management.Azure;
import com.microsoft.azure.management.compute.VirtualMachineSize;
import com.microsoft.azure.management.resources.fluentcore.arm.Region;
import com.microsoft.azuretools.core.Activator;
import com.microsoft.tooling.msservices.components.DefaultLoader;

import java.net.URL;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.logging.Logger;

import org.eclipse.core.resources.IProject;
import org.eclipse.jface.dialogs.IMessageProvider;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ComboViewer;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Link;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.TabFolder;
import org.eclipse.swt.widgets.TabItem;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.forms.HyperlinkSettings;
import org.eclipse.ui.forms.IMessageManager;
import org.eclipse.ui.forms.ManagedForm;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.ui.forms.widgets.ScrolledForm;

public class AzureNewDockerConfigPage extends WizardPage {
    private static final Logger log = Logger.getLogger(AzureNewDockerConfigPage.class.getName());

    private Text dockerHostNameTextField;
    private ComboViewer dockerSubscriptionComboViewer;
    private Combo dockerSubscriptionCombo;
    private Text dockerSubscriptionIdTextField;
    private Combo dockerLocationComboBox;

    private TabFolder hostDetailsTabFolder;
    private TabItem vmKindTableItem;
    private Composite vmKindComposite;
    private Combo dockerHostOSTypeComboBox;
    private Combo dockerHostVMSizeComboBox;
    private Button dockerHostVMPreferredSizesCheckBox;

    private TabItem rgTableItem;
    private Button dockerHostNewRGRadioButton;
    private Text dockerHostRGTextField;
    private Button dockerHostSelectRGRadioButton;
    private Combo dockerHostSelectRGComboBox;

    private TabItem networkTableItem;
    private Button dockerHostNewVNetRadioButton;
    private Text dockerHostNewVNetNameTextField;
    private Text dockerHostNewVNetAddrSpaceTextField;
    private Button dockerHostSelectVNetRadioButton;
    private Combo dockerHostSelectVnetComboBox;
    private Combo dockerHostSelectSubnetComboBox;

    private TabItem storageTableItem;
    private Button dockerHostNewStorageRadioButton;
    private Text dockerNewStorageTextField;
    private Button dockerHostSelectStorageRadioButton;
    private Combo dockerSelectStorageComboBox;

    private String preferredLocation;
    private final String SELECT_REGION = "<select region>";

    private AzureNewDockerWizard wizard;
    private AzureDockerHostsManager dockerManager;
    private DockerHost newHost;
    private IProject project;

    private final FormToolkit formToolkit = new FormToolkit(Display.getDefault());
    private ManagedForm managedForm;
    private ScrolledForm errMsgForm;
    private IMessageManager errDispatcher;

    /**
     * Create the wizard.
     */
    public AzureNewDockerConfigPage(AzureNewDockerWizard wizard) {
        super("Create Docker Host", "Configure the new virtual machine",
                Activator.getImageDescriptor("icons/large/Azure.png"));
        //      setTitle("Configure the new virtual machine");
        //      setDescription("");

        this.wizard = wizard;
        this.dockerManager = wizard.getDockerManager();
        this.newHost = wizard.getDockerHost();
        this.project = wizard.getProject();

        preferredLocation = null;
    }

    /**
     * Create contents of the wizard.
     * @param parent
     */
    public void createControl(Composite parent) {
        Composite mainContainer = new Composite(parent, SWT.NONE);
        setControl(mainContainer);
        mainContainer.setLayout(new GridLayout(3, false));

        Label lblName = new Label(mainContainer, SWT.NONE);
        GridData gd_lblName = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1);
        gd_lblName.horizontalIndent = 5;
        lblName.setLayoutData(gd_lblName);
        lblName.setText("Name:");

        dockerHostNameTextField = new Text(mainContainer, SWT.BORDER);
        GridData gd_dockerHostNameTextField = new GridData(SWT.LEFT, SWT.CENTER, false, false, 2, 1);
        gd_dockerHostNameTextField.horizontalIndent = 3;
        gd_dockerHostNameTextField.widthHint = 200;
        dockerHostNameTextField.setLayoutData(gd_dockerHostNameTextField);

        Label lblNewLabel = new Label(mainContainer, SWT.NONE);
        GridData gd_lblNewLabel = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1);
        gd_lblNewLabel.horizontalIndent = 5;
        lblNewLabel.setLayoutData(gd_lblNewLabel);
        lblNewLabel.setText("Subscription:");

        dockerSubscriptionComboViewer = new ComboViewer(mainContainer, SWT.READ_ONLY);
        dockerSubscriptionCombo = dockerSubscriptionComboViewer.getCombo();
        dockerSubscriptionCombo.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
        new Label(mainContainer, SWT.NONE);

        Label lblId = new Label(mainContainer, SWT.NONE);
        GridData gd_lblId = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1);
        gd_lblId.horizontalIndent = 5;
        lblId.setLayoutData(gd_lblId);
        lblId.setText("Id:");

        dockerSubscriptionIdTextField = new Text(mainContainer, SWT.NONE);
        GridData gd_dockerSubscriptionIdTextField = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1);
        gd_dockerSubscriptionIdTextField.horizontalIndent = 3;
        gd_dockerSubscriptionIdTextField.widthHint = 300;
        dockerSubscriptionIdTextField.setLayoutData(gd_dockerSubscriptionIdTextField);
        dockerSubscriptionIdTextField.setEditable(false);
        dockerSubscriptionIdTextField.setBackground(mainContainer.getBackground());
        new Label(mainContainer, SWT.NONE);

        Label lblRegion = new Label(mainContainer, SWT.NONE);
        GridData gd_lblRegion = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1);
        gd_lblRegion.horizontalIndent = 5;
        lblRegion.setLayoutData(gd_lblRegion);
        lblRegion.setText("Region:");

        dockerLocationComboBox = new Combo(mainContainer, SWT.READ_ONLY);
        GridData gd_dockerLocationComboBox = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1);
        gd_dockerLocationComboBox.widthHint = 200;
        dockerLocationComboBox.setLayoutData(gd_dockerLocationComboBox);
        new Label(mainContainer, SWT.NONE);

        hostDetailsTabFolder = new TabFolder(mainContainer, SWT.NONE);
        GridData gd_hostDetailsTabFolder = new GridData(SWT.FILL, SWT.TOP, true, false, 3, 1);
        gd_hostDetailsTabFolder.heightHint = 128;
        hostDetailsTabFolder.setLayoutData(gd_hostDetailsTabFolder);

        vmKindTableItem = new TabItem(hostDetailsTabFolder, SWT.NONE);
        vmKindTableItem.setText("OS and Size");

        vmKindComposite = new Composite(hostDetailsTabFolder, SWT.NONE);
        vmKindTableItem.setControl(vmKindComposite);
        vmKindComposite.setLayout(new GridLayout(3, false));

        Label lblNewLabel_1 = new Label(vmKindComposite, SWT.NONE);
        lblNewLabel_1.setText("Host OS:");

        dockerHostOSTypeComboBox = new Combo(vmKindComposite, SWT.READ_ONLY);
        GridData gd_dockerHostOSTypeComboBox = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1);
        gd_dockerHostOSTypeComboBox.widthHint = 200;
        dockerHostOSTypeComboBox.setLayoutData(gd_dockerHostOSTypeComboBox);
        new Label(vmKindComposite, SWT.NONE);

        Label lblSize = new Label(vmKindComposite, SWT.NONE);
        lblSize.setText("Size:");

        dockerHostVMSizeComboBox = new Combo(vmKindComposite, SWT.READ_ONLY);
        GridData gd_dockerHostVMSizeComboBox = new GridData(SWT.LEFT, SWT.CENTER, true, false, 1, 1);
        gd_dockerHostVMSizeComboBox.widthHint = 200;
        dockerHostVMSizeComboBox.setLayoutData(gd_dockerHostVMSizeComboBox);

        Link dockerPricingHyperlink = new Link(vmKindComposite, SWT.NONE);
        dockerPricingHyperlink.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                try {
                    PlatformUI.getWorkbench().getBrowserSupport().getExternalBrowser().openURL(
                            new URL("https://azure.microsoft.com/en-us/pricing/details/virtual-machines/linux/"));
                } catch (Exception ex) {
                    DefaultLoader.getUIHelper().logError(ex.getMessage(), ex);
                }
            }
        });
        dockerPricingHyperlink.setText("<a>Pricing</a>");
        GridData gd_dockerPricingHyperlink = new GridData(SWT.LEFT, SWT.CENTER, true, false, 1, 2);
        dockerPricingHyperlink.setLayoutData(gd_dockerPricingHyperlink);

        dockerHostVMPreferredSizesCheckBox = new Button(vmKindComposite, SWT.CHECK);
        dockerHostVMPreferredSizesCheckBox.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 3, 1));
        dockerHostVMPreferredSizesCheckBox.setText("Show preferred sizes only");

        rgTableItem = new TabItem(hostDetailsTabFolder, SWT.NONE);
        rgTableItem.setText("Resource Group");

        Composite rgComposite = new Composite(hostDetailsTabFolder, SWT.NONE);
        rgTableItem.setControl(rgComposite);
        rgComposite.setLayout(new GridLayout(2, false));

        dockerHostNewRGRadioButton = new Button(rgComposite, SWT.RADIO);
        dockerHostNewRGRadioButton.setText("New resource group:");

        dockerHostRGTextField = new Text(rgComposite, SWT.BORDER);
        GridData gd_dockerHostRGTextField = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1);
        gd_dockerHostRGTextField.horizontalIndent = 3;
        gd_dockerHostRGTextField.widthHint = 200;
        dockerHostRGTextField.setLayoutData(gd_dockerHostRGTextField);

        dockerHostSelectRGRadioButton = new Button(rgComposite, SWT.RADIO);
        dockerHostSelectRGRadioButton.setText("Existing resource group:");

        dockerHostSelectRGComboBox = new Combo(rgComposite, SWT.READ_ONLY);
        GridData gd_dockerHostSelectRGComboBox = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1);
        gd_dockerHostSelectRGComboBox.widthHint = 220;
        dockerHostSelectRGComboBox.setLayoutData(gd_dockerHostSelectRGComboBox);

        networkTableItem = new TabItem(hostDetailsTabFolder, SWT.NONE);
        networkTableItem.setText("Network");

        Composite networkComposite = new Composite(hostDetailsTabFolder, SWT.NONE);
        networkTableItem.setControl(networkComposite);
        networkComposite.setLayout(new GridLayout(2, false));

        dockerHostNewVNetRadioButton = new Button(networkComposite, SWT.RADIO);
        dockerHostNewVNetRadioButton.setText("New virtual network");

        dockerHostNewVNetNameTextField = new Text(networkComposite, SWT.BORDER);
        GridData gd_dockerHostNewVNetNameTextField = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1);
        gd_dockerHostNewVNetNameTextField.horizontalIndent = 3;
        gd_dockerHostNewVNetNameTextField.widthHint = 200;
        dockerHostNewVNetNameTextField.setLayoutData(gd_dockerHostNewVNetNameTextField);

        Label lblAddressSpacecdir = new Label(networkComposite, SWT.NONE);
        GridData gd_lblAddressSpacecdir = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1);
        gd_lblAddressSpacecdir.horizontalIndent = 18;
        lblAddressSpacecdir.setLayoutData(gd_lblAddressSpacecdir);
        lblAddressSpacecdir.setText("Address space (CDIR):");

        dockerHostNewVNetAddrSpaceTextField = new Text(networkComposite, SWT.BORDER);
        GridData gd_dockerHostNewVNetAddrSpaceTextField = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1);
        gd_dockerHostNewVNetAddrSpaceTextField.horizontalIndent = 3;
        gd_dockerHostNewVNetAddrSpaceTextField.widthHint = 200;
        dockerHostNewVNetAddrSpaceTextField.setLayoutData(gd_dockerHostNewVNetAddrSpaceTextField);

        dockerHostSelectVNetRadioButton = new Button(networkComposite, SWT.RADIO);
        dockerHostSelectVNetRadioButton.setText("Existing virtual network:");

        dockerHostSelectVnetComboBox = new Combo(networkComposite, SWT.READ_ONLY);
        GridData gd_dockerHostSelectVnetComboBox = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1);
        gd_dockerHostSelectVnetComboBox.widthHint = 220;
        dockerHostSelectVnetComboBox.setLayoutData(gd_dockerHostSelectVnetComboBox);

        Label lblSubnet = new Label(networkComposite, SWT.NONE);
        GridData gd_lblSubnet = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1);
        gd_lblSubnet.horizontalIndent = 18;
        lblSubnet.setLayoutData(gd_lblSubnet);
        lblSubnet.setText("Subnet:");

        dockerHostSelectSubnetComboBox = new Combo(networkComposite, SWT.READ_ONLY);
        GridData gd_dockerHostSelectSubnetComboBox = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1);
        gd_dockerHostSelectSubnetComboBox.widthHint = 220;
        dockerHostSelectSubnetComboBox.setLayoutData(gd_dockerHostSelectSubnetComboBox);

        storageTableItem = new TabItem(hostDetailsTabFolder, SWT.NONE);
        storageTableItem.setText("Storage");

        Composite storageComposite = new Composite(hostDetailsTabFolder, SWT.NONE);
        storageTableItem.setControl(storageComposite);
        storageComposite.setLayout(new GridLayout(2, false));

        dockerHostNewStorageRadioButton = new Button(storageComposite, SWT.RADIO);
        dockerHostNewStorageRadioButton.setText("New storage account:");

        dockerNewStorageTextField = new Text(storageComposite, SWT.BORDER);
        GridData gd_dockerNewStorageTextField = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1);
        gd_dockerNewStorageTextField.horizontalIndent = 3;
        gd_dockerNewStorageTextField.widthHint = 200;
        dockerNewStorageTextField.setLayoutData(gd_dockerNewStorageTextField);

        dockerHostSelectStorageRadioButton = new Button(storageComposite, SWT.RADIO);
        dockerHostSelectStorageRadioButton.setText("Existing storage account:");

        dockerSelectStorageComboBox = new Combo(storageComposite, SWT.READ_ONLY);
        GridData gd_dockerSelectStorageComboBox = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1);
        gd_dockerSelectStorageComboBox.widthHint = 220;
        dockerSelectStorageComboBox.setLayoutData(gd_dockerSelectStorageComboBox);

        FormToolkit toolkit = new FormToolkit(mainContainer.getDisplay());
        toolkit.getHyperlinkGroup().setHyperlinkUnderlineMode(HyperlinkSettings.UNDERLINE_HOVER);
        managedForm = new ManagedForm(mainContainer);
        errMsgForm = managedForm.getForm();
        errMsgForm.setVisible(false);
        //      errMsgForm.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, true, 2, 1));
        //      errMsgForm.setBackground(mainContainer.getBackground());
        errDispatcher = managedForm.getMessageManager();

        initUIMainContainer(mainContainer);
    }

    private void initUIMainContainer(Composite mainContainer) {
        updateHostNameTextField(mainContainer);
        updateDockerSubscriptionComboBox(mainContainer);

        updateDockerHostVMSize(mainContainer);
        updateDockerLocationGroup(mainContainer);
        updateDockerHostOSTypeComboBox(mainContainer);
        updateDockerHostRGGroup(mainContainer);
        updateDockerHostVnetGroup(mainContainer);
        updateDockerHostStorageGroup(mainContainer);
    }

    private void updateHostNameTextField(Composite mainContainer) {
        dockerHostNameTextField.setText(newHost.name);
        dockerHostNameTextField.setToolTipText(AzureDockerValidationUtils.getDockerHostNameTip());
        dockerHostNameTextField.addModifyListener(new ModifyListener() {
            @Override
            public void modifyText(ModifyEvent event) {
                if (AzureDockerValidationUtils.validateDockerHostName(((Text) event.getSource()).getText())) {
                    errDispatcher.removeMessage("dockerHostNameTextField", dockerHostNameTextField);
                    setErrorMessage(null);
                    setPageComplete(doValidate());
                } else {
                    errDispatcher.addMessage("dockerHostNameTextField",
                            AzureDockerValidationUtils.getDockerHostNameTip(), null, IMessageProvider.ERROR,
                            dockerHostNameTextField);
                    setErrorMessage("Invalid virtual machine name");
                    setPageComplete(false);
                }
            }
        });
    }

    private void updateDockerSubscriptionComboBox(Composite mainContainer) {
        dockerSubscriptionComboViewer.addSelectionChangedListener(new ISelectionChangedListener() {
            @Override
            public void selectionChanged(SelectionChangedEvent event) {
                IStructuredSelection selection = (IStructuredSelection) event.getSelection();
                if (selection.size() > 0) {
                    AzureDockerSubscription currentSubscription = (AzureDockerSubscription) selection
                            .getFirstElement();
                    dockerSubscriptionIdTextField
                            .setText(currentSubscription != null ? currentSubscription.id : "");
                    errDispatcher.removeMessage("dockerSubscriptionCombo", dockerSubscriptionCombo);
                    updateDockerLocationComboBox(mainContainer, currentSubscription);
                    updateDockerHostSelectRGComboBox(mainContainer, currentSubscription);
                    String region = (String) dockerLocationComboBox.getText();
                    Region regionObj = Region.findByLabelOrName(region);
                    updateDockerSelectVnetComboBox(mainContainer, currentSubscription,
                            regionObj != null ? regionObj.name() : region);
                    updateDockerSelectStorageComboBox(mainContainer, currentSubscription);
                    setPageComplete(doValidate());
                } else {
                    errDispatcher.addMessage("dockerSubscriptionCombo", "No active subscriptions found", null,
                            IMessageProvider.ERROR, dockerSubscriptionCombo);
                    setPageComplete(false);
                }
            }
        });
        dockerSubscriptionComboViewer.setContentProvider(ArrayContentProvider.getInstance());
        dockerSubscriptionComboViewer.setInput(dockerManager.getSubscriptionsList());

        if (dockerManager.getSubscriptionsList() != null && dockerManager.getSubscriptionsList().size() > 0) {
            dockerSubscriptionCombo.select(0);
            dockerSubscriptionIdTextField.setText(
                    ((AzureDockerSubscription) ((StructuredSelection) dockerSubscriptionComboViewer.getSelection())
                            .getFirstElement()).id);
        }
    }

    private void updateDockerLocationGroup(Composite mainContainer) {
        AzureDockerSubscription currentSubscription = getCurrentSubscription();
        dockerLocationComboBox.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                String region = dockerLocationComboBox.getText();
                if (!region.equals(SELECT_REGION)) {
                    Region regionObj = Region.findByLabelOrName(region);
                    String selectedRegion = regionObj != null ? regionObj.name() : region;
                    if (preferredLocation == null && selectedRegion != null) {
                        // remove the SELECT_REGION entry (first entry in the
                        // list)
                        dockerLocationComboBox.remove(SELECT_REGION);
                    }
                    preferredLocation = selectedRegion;
                    updateDockerSelectVnetComboBox(mainContainer, currentSubscription, selectedRegion);
                    setPageComplete(doValidate());
                } else {
                    updateDockerSelectVnetComboBox(mainContainer, currentSubscription, null);
                    setPageComplete(false);
                }
                updateDockerHostVMSizeComboBox(mainContainer, dockerHostVMPreferredSizesCheckBox.getSelection());
            }
        });
        updateDockerLocationComboBox(mainContainer, currentSubscription);
    }

    private void updateDockerLocationComboBox(Composite mainContainer,
            AzureDockerSubscription currentSubscription) {
        if (currentSubscription != null && currentSubscription.locations != null) {
            dockerLocationComboBox.removeAll();
            if (currentSubscription.locations.size() > 0) {
                String previousSelection = preferredLocation;
                preferredLocation = null;
                for (String region : currentSubscription.locations) {
                    Region regionObj = Region.findByLabelOrName(region);
                    dockerLocationComboBox.add(regionObj != null ? regionObj.label() : region);
                    if ((previousSelection != null && region.equals(previousSelection))
                            || (newHost.hostVM.region != null && region.equals(newHost.hostVM.region))) {
                        preferredLocation = region;
                        dockerLocationComboBox.select(dockerLocationComboBox.getItemCount() - 1);
                    }
                }
                if (preferredLocation == null) {
                    dockerLocationComboBox.add(SELECT_REGION, 0);
                    dockerLocationComboBox.select(0);
                    setPageComplete(false);
                }
            }
            updateDockerHostVMSizeComboBox(mainContainer, dockerHostVMPreferredSizesCheckBox.getSelection());
        }
    }

    private void updateDockerHostOSTypeComboBox(Composite mainContainer) {
        int index = 0;
        for (KnownDockerVirtualMachineImage knownDockerVirtualMachineImage : KnownDockerVirtualMachineImage
                .values()) {
            String vmImage = knownDockerVirtualMachineImage.name();
            dockerHostOSTypeComboBox.add(vmImage);
            if (vmImage.equals(newHost.hostOSType.name()))
                dockerHostOSTypeComboBox.select(index);
            index++;
        }
    }

    private void updateDockerHostVMSize(Composite mainContainer) {
        dockerHostVMPreferredSizesCheckBox.setSelection(true);
        dockerHostVMPreferredSizesCheckBox.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                updateDockerHostVMSizeComboBox(mainContainer, dockerHostVMPreferredSizesCheckBox.getSelection());
                setPageComplete(doValidate());
            }
        });

        dockerHostVMSizeComboBox.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                updateDockerSelectStorageComboBox(mainContainer, getCurrentSubscription());
                setPageComplete(doValidate());
            }
        });
        updateDockerHostVMSizeComboBox(mainContainer, true);
    }

    private void updateDockerHostVMSizeComboBox(Composite mainContainer, boolean preferredSizesOnly) {
        dockerHostVMSizeComboBox.deselectAll();
        dockerHostVMSizeComboBox.removeAll();
        dockerHostVMSizeComboBox.redraw();
        if (preferredSizesOnly) {
            int index = 0;
            for (KnownDockerVirtualMachineSizes knownDockerVirtualMachineSize : KnownDockerVirtualMachineSizes
                    .values()) {
                dockerHostVMSizeComboBox.add(knownDockerVirtualMachineSize.name());
                if (newHost.hostVM.vmSize.equals(knownDockerVirtualMachineSize.name())) {
                    dockerHostVMSizeComboBox.select(index);
                }
                index++;
            }
            if (index == 0 || !newHost.hostVM.vmSize.equals((String) dockerHostVMSizeComboBox.getText())) {
                dockerHostVMSizeComboBox.add(newHost.hostVM.vmSize, 0);
                dockerHostVMSizeComboBox.select(0);
            }
            updateDockerSelectStorageComboBox(mainContainer, getCurrentSubscription());
        } else {
            dockerHostVMSizeComboBox.add("<Loading...>", 0);
            dockerHostVMSizeComboBox.select(0);
            dockerHostVMSizeComboBox.redraw();
            Azure azureClient = getCurrentSubscription().azureClient;
            DefaultLoader.getIdeHelper().runInBackground(null, "Loading VM sizes...", false, true, "",
                    new Runnable() {
                        @Override
                        public void run() {
                            PagedList<VirtualMachineSize> sizes = null;
                            try {
                                sizes = azureClient.virtualMachines().sizes().listByRegion(preferredLocation);
                                Collections.sort(sizes, new Comparator<VirtualMachineSize>() {
                                    @Override
                                    public int compare(VirtualMachineSize size1, VirtualMachineSize size2) {
                                        if (size1.name().contains("Basic") && size2.name().contains("Basic")) {
                                            return size1.name().compareTo(size2.name());
                                        } else if (size1.name().contains("Basic")) {
                                            return -1;
                                        } else if (size2.name().contains("Basic")) {
                                            return 1;
                                        }

                                        int coreCompare = Integer.valueOf(size1.numberOfCores())
                                                .compareTo(size2.numberOfCores());

                                        if (coreCompare == 0) {
                                            return Integer.valueOf(size1.memoryInMB())
                                                    .compareTo(size2.memoryInMB());
                                        } else {
                                            return coreCompare;
                                        }
                                    }
                                });
                            } catch (Exception notHandled) {
                            }
                            PagedList<VirtualMachineSize> sortedSizes = sizes;

                            DefaultLoader.getIdeHelper().invokeAndWait(new Runnable() {
                                @Override
                                public void run() {
                                    dockerHostVMSizeComboBox.deselectAll();
                                    dockerHostVMSizeComboBox.removeAll();
                                    if (sortedSizes != null) {
                                        int index = 0;
                                        for (VirtualMachineSize vmSize : sortedSizes) {
                                            dockerHostVMSizeComboBox.add(vmSize.name());
                                            if (vmSize.name().equals(newHost.hostVM.vmSize))
                                                dockerHostVMSizeComboBox.select(index);
                                            index++;
                                        }
                                    }
                                    if (sortedSizes.size() != 0 && !newHost.hostVM.vmSize
                                            .equals((String) dockerHostVMSizeComboBox.getText())) {
                                        dockerHostVMSizeComboBox.add(newHost.hostVM.vmSize, 0);
                                        dockerHostVMSizeComboBox.select(0);
                                    }
                                    updateDockerSelectStorageComboBox(mainContainer, getCurrentSubscription());
                                    dockerHostVMSizeComboBox.redraw();
                                }
                            });
                        }
                    });
        }
    }

    private void updateDockerHostRGGroup(Composite mainContainer) {
        dockerHostNewRGRadioButton.setSelection(true);
        dockerHostNewRGRadioButton.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                dockerHostRGTextField.setEnabled(true);
                dockerHostSelectRGComboBox.setEnabled(false);
                setPageComplete(doValidate());
            }
        });
        dockerHostSelectRGRadioButton.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                dockerHostRGTextField.setEnabled(false);
                dockerHostSelectRGComboBox.setEnabled(true);
                setPageComplete(doValidate());
            }
        });
        dockerHostRGTextField.setText(newHost.hostVM.resourceGroupName);
        dockerHostRGTextField.setToolTipText(AzureDockerValidationUtils.getDockerHostResourceGroupNameTip());
        dockerHostRGTextField.addModifyListener(new ModifyListener() {
            public void modifyText(ModifyEvent event) {
                if (AzureDockerValidationUtils
                        .validateDockerHostResourceGroupName(((Text) event.getSource()).getText())) {
                    errDispatcher.removeMessage("dockerHostRGTextField", dockerHostRGTextField);
                    setErrorMessage(null);
                    setPageComplete(doValidate());
                } else {
                    errDispatcher.addMessage("dockerHostRGTextField",
                            AzureDockerValidationUtils.getDockerHostResourceGroupNameTip(), null,
                            IMessageProvider.ERROR, dockerHostRGTextField);
                    setErrorMessage("Invalid resource group name");
                    setPageComplete(false);
                }
            }
        });

        updateDockerHostSelectRGComboBox(mainContainer, getCurrentSubscription());
    }

    private void updateDockerHostSelectRGComboBox(Composite mainContainer,
            AzureDockerSubscription currentSubscription) {
        dockerHostSelectRGComboBox.deselectAll();
        dockerHostSelectRGComboBox.removeAll();
        for (String rgName : dockerManager.getResourceGroups(currentSubscription)) {
            dockerHostSelectRGComboBox.add(rgName);
        }
        if (dockerHostSelectRGComboBox.getItemCount() > 0) {
            dockerHostSelectRGComboBox.select(0);
        }
        dockerHostSelectRGComboBox.redraw();
    }

    private void updateDockerHostVnetGroup(Composite mainContainer) {
        dockerHostNewVNetRadioButton.setSelection(true);
        dockerHostNewVNetRadioButton.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                dockerHostNewVNetNameTextField.setEnabled(true);
                dockerHostNewVNetAddrSpaceTextField.setEnabled(true);
                dockerHostSelectVnetComboBox.setEnabled(false);
                dockerHostSelectSubnetComboBox.setEnabled(false);
                setPageComplete(doValidate());
            }
        });
        dockerHostNewVNetNameTextField.setToolTipText(AzureDockerValidationUtils.getDockerVnetNameTip());
        dockerHostNewVNetNameTextField.setText(newHost.hostVM.vnetName);
        dockerHostNewVNetNameTextField.addModifyListener(new ModifyListener() {
            public void modifyText(ModifyEvent event) {
                if (AzureDockerValidationUtils.validateDockerVnetName(((Text) event.getSource()).getText())) {
                    errDispatcher.removeMessage("dockerHostNewVNetNameTextField", dockerHostNewVNetNameTextField);
                    setErrorMessage(null);
                    setPageComplete(doValidate());
                } else {
                    errDispatcher.addMessage("dockerHostNewVNetNameTextField",
                            AzureDockerValidationUtils.getDockerVnetNameTip(), null, IMessageProvider.ERROR,
                            dockerHostNewVNetNameTextField);
                    setErrorMessage("Invalid network name");
                    setPageComplete(false);
                }
            }
        });
        dockerHostNewVNetAddrSpaceTextField.setToolTipText(AzureDockerValidationUtils.getDockerVnetAddrspaceTip());
        dockerHostNewVNetAddrSpaceTextField.setText(newHost.hostVM.vnetAddressSpace);
        dockerHostNewVNetAddrSpaceTextField.addModifyListener(new ModifyListener() {
            public void modifyText(ModifyEvent event) {
                if (AzureDockerValidationUtils.validateDockerVnetAddrSpace(((Text) event.getSource()).getText())) {
                    errDispatcher.removeMessage("dockerHostNewVNetAddrSpaceTextField",
                            dockerHostNewVNetAddrSpaceTextField);
                    setErrorMessage(null);
                    setPageComplete(doValidate());
                } else {
                    errDispatcher.addMessage("dockerHostNewVNetAddrSpaceTextField",
                            AzureDockerValidationUtils.getDockerVnetAddrspaceTip(), null, IMessageProvider.ERROR,
                            dockerHostNewVNetAddrSpaceTextField);
                    setErrorMessage("Invalid address space");
                    setPageComplete(false);
                }
            }
        });
        dockerHostSelectVNetRadioButton.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                dockerHostNewVNetNameTextField.setEnabled(false);
                dockerHostNewVNetAddrSpaceTextField.setEnabled(false);
                dockerHostSelectVnetComboBox.setEnabled(true);
                dockerHostSelectSubnetComboBox.setEnabled(true);
                setPageComplete(doValidate());
            }
        });
        dockerHostSelectVnetComboBox.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                updateDockerSelectSubnetComboBox(mainContainer, (AzureDockerVnet) dockerHostSelectVnetComboBox
                        .getData(dockerHostSelectVnetComboBox.getText()));
                setPageComplete(doValidate());
            }
        });
        dockerHostSelectSubnetComboBox.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                setPageComplete(doValidate());
            }
        });

        dockerHostSelectVnetComboBox.setEnabled(false);
        dockerHostSelectSubnetComboBox.setEnabled(false);
        String region = (String) dockerLocationComboBox.getText();
        Region regionObj = Region.findByLabelOrName(region);
        updateDockerSelectVnetComboBox(mainContainer, getCurrentSubscription(),
                regionObj != null ? regionObj.name() : region);
    }

    private void updateDockerSelectVnetComboBox(Composite mainContainer,
            AzureDockerSubscription currentSubscription, String region) {
        dockerHostSelectVnetComboBox.deselectAll();
        dockerHostSelectVnetComboBox.removeAll();
        if (currentSubscription != null && region != null) {
            List<AzureDockerVnet> dockerVnets = dockerManager.getNetworksAndSubnets(currentSubscription);
            for (AzureDockerVnet vnet : dockerVnets) {
                if (region != null && vnet.region.equals(region)) {
                    dockerHostSelectVnetComboBox.add(vnet.name);
                    dockerHostSelectVnetComboBox.setData(vnet.name, vnet);
                }
            }
        }
        dockerHostSelectVnetComboBox.redraw();
        if (dockerHostSelectVnetComboBox.getItemCount() > 0) {
            dockerHostSelectVnetComboBox.select(0);
            updateDockerSelectSubnetComboBox(mainContainer,
                    (AzureDockerVnet) dockerHostSelectVnetComboBox.getData(dockerHostSelectVnetComboBox.getText()));
        } else {
            updateDockerSelectSubnetComboBox(mainContainer, null);
        }
    }

    private void updateDockerSelectSubnetComboBox(Composite mainContainer, AzureDockerVnet vnet) {
        dockerHostSelectSubnetComboBox.deselectAll();
        dockerHostSelectSubnetComboBox.removeAll();
        if (vnet != null) {
            for (String subnetName : vnet.subnets) {
                dockerHostSelectSubnetComboBox.add(subnetName);
            }
        }
        if (dockerHostSelectSubnetComboBox.getItemCount() > 0) {
            dockerHostSelectSubnetComboBox.select(0);
        }
        dockerHostSelectSubnetComboBox.redraw();
    }

    private void updateDockerHostStorageGroup(Composite mainContainer) {
        dockerHostNewStorageRadioButton.setSelection(true);
        dockerHostNewStorageRadioButton.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                dockerNewStorageTextField.setEnabled(true);
                dockerSelectStorageComboBox.setEnabled(false);
                setPageComplete(doValidate());
            }
        });
        dockerHostSelectStorageRadioButton.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                dockerNewStorageTextField.setEnabled(false);
                dockerSelectStorageComboBox.setEnabled(true);
                setPageComplete(doValidate());
            }
        });
        dockerNewStorageTextField.setText(newHost.hostVM.storageAccountName);
        dockerNewStorageTextField.setToolTipText(AzureDockerValidationUtils.getDockerHostStorageNameTip());
        dockerNewStorageTextField.addModifyListener(new ModifyListener() {
            public void modifyText(ModifyEvent event) {
                if (AzureDockerValidationUtils
                        .validateDockerHostStorageName(((Text) event.getSource()).getText())) {
                    errDispatcher.removeMessage("dockerNewStorageTextField", dockerNewStorageTextField);
                    setErrorMessage(null);
                    setPageComplete(doValidate());
                } else {
                    errDispatcher.addMessage("dockerNewStorageTextField",
                            AzureDockerValidationUtils.getDockerHostStorageNameTip(), null, IMessageProvider.ERROR,
                            dockerNewStorageTextField);
                    setErrorMessage("Invalid storage account name");
                    setPageComplete(false);
                }
            }
        });
        dockerSelectStorageComboBox.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                setPageComplete(doValidate());
            }
        });
        dockerSelectStorageComboBox.setEnabled(false);

        updateDockerSelectStorageComboBox(mainContainer, getCurrentSubscription());
    }

    private void updateDockerSelectStorageComboBox(Composite mainContainer,
            AzureDockerSubscription currentSubscription) {
        dockerSelectStorageComboBox.deselectAll();
        dockerSelectStorageComboBox.removeAll();
        String vmImageSize = (String) dockerHostVMSizeComboBox.getText();
        if (vmImageSize != null) {
            List<String> storageAccountsList = dockerManager.getAvailableStorageAccounts(currentSubscription.id,
                    "Standard");
            if (vmImageSize.contains("_D"))
                storageAccountsList
                        .addAll(dockerManager.getAvailableStorageAccounts(currentSubscription.id, "Premium"));
            for (String storageAccName : storageAccountsList) {
                dockerSelectStorageComboBox.add(storageAccName);
            }
        }
        if (dockerSelectStorageComboBox.getItemCount() > 0) {
            dockerSelectStorageComboBox.select(0);
        }
        dockerSelectStorageComboBox.redraw();
    }

    //   @Override
    //   public IWizardPage getNextPage() {
    //      return null;
    ////      return super.getNextPage();
    //   }
    //   @Override
    //   public boolean isPageComplete() {
    ////      if(doValidate()) {
    //         return super.isPageComplete();
    ////      } else {
    ////         return false;
    ////      }
    //   }
    //   
    //   @Override
    //   public boolean canFlipToNextPage() {
    //      getWizard().getContainer().updateButtons();
    ////      setPageComplete(false);
    //      return ;
    //   }
    private boolean validateDockerHostName() {
        // Docker virtual machine name
        String hostName = dockerHostNameTextField.getText();
        if (hostName == null || hostName.isEmpty()
                || !AzureDockerValidationUtils.validateDockerHostName(hostName)) {
            String errMsg = "Invalid virtual machine name";
            errDispatcher.addMessage("dockerHostNameTextField", AzureDockerValidationUtils.getDockerHostNameTip(),
                    null, IMessageProvider.ERROR, dockerHostNameTextField);
            setErrorMessage(errMsg);
            return false;
        } else {
            newHost.name = hostName;
            newHost.hostVM.name = hostName;
            newHost.certVault.hostName = hostName;
            newHost.hostVM.publicIpName = hostName + "-pip";
            errDispatcher.removeMessage("dockerHostNameTextField", dockerHostNameTextField);
            setErrorMessage(null);
            return true;
        }
    }

    private boolean validateDockerSubscription() {
        // Subscription
        AzureDockerSubscription currentSubscription = getCurrentSubscription();
        if (currentSubscription == null || currentSubscription.id == null || currentSubscription.id.isEmpty()) {
            String errMsg = "Subscription not found";
            errDispatcher.addMessage("dockerSelectStorageComboBox", errMsg, null, IMessageProvider.ERROR,
                    dockerSelectStorageComboBox);
            setErrorMessage(errMsg);
            return false;
        } else {
            newHost.sid = currentSubscription.id;
            errDispatcher.removeMessage("dockerSelectStorageComboBox", dockerSelectStorageComboBox);
            setErrorMessage(null);
            return true;
        }
    }

    private boolean validateDockerLocation() {
        // Location/region
        String region = (String) dockerLocationComboBox.getText();
        if (preferredLocation == null || region == null || region.isEmpty() || region.equals(SELECT_REGION)) {
            String errMsg = "Region not found";
            errDispatcher.addMessage("dockerLocationComboBox", errMsg, null, IMessageProvider.ERROR,
                    dockerLocationComboBox);
            setErrorMessage(errMsg);
            return false;
        } else {
            newHost.hostVM.region = preferredLocation;
            newHost.hostVM.dnsName = String.format("%s.%s.cloudapp.azure.com", newHost.hostVM.name,
                    newHost.hostVM.region);
            newHost.apiUrl = newHost.hostVM.dnsName;
            errDispatcher.removeMessage("dockerLocationComboBox", dockerLocationComboBox);
            setErrorMessage(null);
            return true;
        }
    }

    private boolean validateDockerOSType() {
        // OS type
        KnownDockerVirtualMachineImage osType = KnownDockerVirtualMachineImage
                .valueOf(dockerHostOSTypeComboBox.getText());
        if (osType == null) {
            hostDetailsTabFolder.setSelection(0);
            String errMsg = "OS type not set";
            errDispatcher.addMessage("dockerHostOSTypeComboBox", errMsg, null, IMessageProvider.ERROR,
                    dockerHostOSTypeComboBox);
            setErrorMessage(errMsg);
            return false;
        } else {
            newHost.hostOSType = DockerHost.DockerHostOSType.valueOf(osType.toString());
            newHost.hostVM.osHost = osType.getAzureOSHost();
            errDispatcher.removeMessage("dockerHostOSTypeComboBox", dockerHostOSTypeComboBox);
            setErrorMessage(null);
            return true;
        }
    }

    private boolean validateDockerVMSize() {
        // Docker virtual machine size
        String vmSize = (String) dockerHostVMSizeComboBox.getText();
        if (vmSize == null || vmSize.isEmpty()) {
            hostDetailsTabFolder.setSelection(0);
            String errMsg = "Virtual machine size not set";
            errDispatcher.addMessage("dockerHostVMSizeComboBox", errMsg, null, IMessageProvider.ERROR,
                    dockerHostVMSizeComboBox);
            setErrorMessage(errMsg);
            return false;
        } else {
            newHost.hostVM.vmSize = vmSize;
            errDispatcher.removeMessage("dockerHostVMSizeComboBox", dockerHostVMSizeComboBox);
            setErrorMessage(null);
            return true;
        }
    }

    private boolean validateDockerRG() {
        // Docker resource group name
        if (dockerHostNewRGRadioButton.getSelection()) {
            // New resource group
            String rgName = dockerHostRGTextField.getText();
            if (rgName == null || rgName.isEmpty()
                    || !AzureDockerValidationUtils.validateDockerHostResourceGroupName(rgName)) {
                hostDetailsTabFolder.setSelection(1);
                errDispatcher.addMessage("dockerHostRGTextField",
                        AzureDockerValidationUtils.getDockerHostResourceGroupNameTip(), null,
                        IMessageProvider.ERROR, dockerHostRGTextField);
                setErrorMessage("Invalid resource group name");
                return false;
            } else {
                errDispatcher.removeMessage("dockerHostRGTextField", dockerHostRGTextField);
                setErrorMessage(null);
                newHost.hostVM.resourceGroupName = rgName;
                return true;
            }
        } else {
            // Existing resource group
            String rgName = (String) dockerHostSelectRGComboBox.getText();
            if (rgName == null || rgName.isEmpty()) {
                hostDetailsTabFolder.setSelection(1);
                String errMsg = "Resource group not set";
                errDispatcher.addMessage("dockerHostSelectRGComboBox", errMsg, null, IMessageProvider.ERROR,
                        dockerHostSelectRGComboBox);
                setErrorMessage(errMsg);
                return false;
            } else {
                // Add "@" to mark this as an existing resource group
                newHost.hostVM.resourceGroupName = rgName + "@";
                errDispatcher.removeMessage("dockerHostSelectRGComboBox", dockerHostSelectRGComboBox);
                setErrorMessage(null);
                return true;
            }
        }
    }

    private boolean validateDockerVnet() {
        // Docker virtual network name
        if (dockerHostNewVNetRadioButton.getSelection()) {
            // New virtual network
            String vnetName = dockerHostNewVNetNameTextField.getText();
            if (vnetName == null || vnetName.isEmpty()
                    || !AzureDockerValidationUtils.validateDockerVnetName(vnetName)) {
                hostDetailsTabFolder.setSelection(2);
                errDispatcher.addMessage("dockerHostNewVNetNameTextField",
                        AzureDockerValidationUtils.getDockerVnetNameTip(), null, IMessageProvider.ERROR,
                        dockerHostNewVNetNameTextField);
                setErrorMessage("Invalid network name");
                return false;
            } else {
                errDispatcher.removeMessage("dockerHostNewVNetNameTextField", dockerHostNewVNetNameTextField);
                setErrorMessage(null);

                String vnetAddrSpace = dockerHostNewVNetAddrSpaceTextField.getText();
                if (vnetAddrSpace == null || vnetAddrSpace.isEmpty()
                        || !AzureDockerValidationUtils.validateDockerVnetAddrSpace(vnetAddrSpace)) {
                    hostDetailsTabFolder.setSelection(2);
                    errDispatcher.addMessage("dockerHostNewVNetAddrSpaceTextField",
                            AzureDockerValidationUtils.getDockerVnetAddrspaceTip(), null, IMessageProvider.ERROR,
                            dockerHostNewVNetAddrSpaceTextField);
                    setErrorMessage("Invalid address space");
                    return false;
                } else {
                    errDispatcher.removeMessage("dockerHostNewVNetAddrSpaceTextField",
                            dockerHostNewVNetAddrSpaceTextField);
                    setErrorMessage(null);
                    newHost.hostVM.vnetName = vnetName;
                    newHost.hostVM.vnetAddressSpace = vnetAddrSpace;
                    newHost.hostVM.subnetName = "subnet1";
                    return true;
                }
            }
        } else {
            // Existing virtual network and subnet
            AzureDockerVnet vnet = (AzureDockerVnet) dockerHostSelectVnetComboBox
                    .getData(dockerHostSelectVnetComboBox.getText());
            if (vnet == null || vnet.name == null || vnet.name.isEmpty()) {
                hostDetailsTabFolder.setSelection(2);
                String errMsg = "Network not set";
                errDispatcher.addMessage("dockerHostSelectVnetComboBox", errMsg, null, IMessageProvider.ERROR,
                        dockerHostSelectVnetComboBox);
                setErrorMessage(errMsg);
                return false;
            } else {
                errDispatcher.removeMessage("dockerHostSelectVnetComboBox", dockerHostSelectVnetComboBox);
                setErrorMessage(null);
                String subnet = (String) dockerHostSelectSubnetComboBox.getText();
                if (subnet == null || subnet.isEmpty()) {
                    hostDetailsTabFolder.setSelection(2);
                    errDispatcher.addMessage("dockerHostSelectSubnetComboBox",
                            AzureDockerValidationUtils.getDockerVnetAddrspaceTip(), null, IMessageProvider.ERROR,
                            dockerHostSelectSubnetComboBox);
                    setErrorMessage("Subnet not set");
                    return false;
                } else {
                    errDispatcher.removeMessage("dockerHostSelectSubnetComboBox", dockerHostSelectSubnetComboBox);
                    setErrorMessage(null);
                    // Add "@resourceGroupName" to mark this as an existing virtual
                    // network
                    newHost.hostVM.vnetName = vnet.name + "@" + vnet.resourceGroup;
                    newHost.hostVM.vnetAddressSpace = vnet.addrSpace;
                    newHost.hostVM.subnetName = subnet;
                    return true;
                }
            }
        }
    }

    private boolean validateDockerStorage() {
        // Docker storage account
        String vmSize = (String) dockerHostVMSizeComboBox.getText();
        String storageName;
        if (dockerHostNewStorageRadioButton.getSelection()) {
            // New storage account
            storageName = dockerNewStorageTextField.getText();
            if (storageName == null || storageName.isEmpty() || vmSize == null || vmSize.isEmpty()
                    || !AzureDockerValidationUtils.validateDockerHostStorageName(storageName,
                            getCurrentSubscription())) {
                hostDetailsTabFolder.setSelection(3);
                errDispatcher.addMessage("dockerNewStorageTextField",
                        AzureDockerValidationUtils.getDockerHostStorageNameTip(), null, IMessageProvider.ERROR,
                        dockerNewStorageTextField);
                setErrorMessage("Invalid storage account name");
                return false;
            } else {
                errDispatcher.removeMessage("dockerNewStorageTextField", dockerNewStorageTextField);
                setErrorMessage(null);
                newHost.hostVM.storageAccountName = storageName;
                newHost.hostVM.storageAccountType = AzureDockerUtils.getStorageTypeForVMSize(vmSize);
                return true;
            }
        } else {
            // Existing resource group
            storageName = (String) dockerSelectStorageComboBox.getText();
            if (storageName == null || storageName.isEmpty() || vmSize == null || vmSize.isEmpty()) {
                hostDetailsTabFolder.setSelection(3);
                String errMsg = "Storage account not set";
                errDispatcher.addMessage("dockerSelectStorageComboBox", errMsg, null, IMessageProvider.ERROR,
                        dockerSelectStorageComboBox);
                setErrorMessage(errMsg);
                return false;
            } else {
                errDispatcher.removeMessage("dockerSelectStorageComboBox", dockerSelectStorageComboBox);
                setErrorMessage(null);
                // Add "@" to mark this as an existing storage account
                newHost.hostVM.storageAccountName = storageName + "@";
                newHost.hostVM.storageAccountType = AzureDockerUtils.getStorageTypeForVMSize(vmSize);
                return true;
            }
        }
    }

    public boolean doValidate() {
        return validateDockerHostName() && validateDockerSubscription() && validateDockerLocation()
                && validateDockerOSType() && validateDockerVMSize() && validateDockerRG() && validateDockerVnet()
                && validateDockerStorage();
    }

    private AzureDockerSubscription getCurrentSubscription() {
        return (AzureDockerSubscription) ((StructuredSelection) dockerSubscriptionComboViewer.getSelection())
                .getFirstElement();
    }
}