package org.ovirt.engine.ui.uicommonweb.models.vms; import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import java.util.SortedMap; import java.util.TreeMap; import org.ovirt.engine.core.common.TimeZoneType; import org.ovirt.engine.core.common.businessentities.VmBase; import org.ovirt.engine.core.common.businessentities.VmInit; import org.ovirt.engine.core.common.businessentities.VmInitNetwork; import org.ovirt.engine.core.common.businessentities.network.Ipv4BootProtocol; import org.ovirt.engine.core.common.businessentities.network.Ipv6BootProtocol; import org.ovirt.engine.core.compat.StringHelper; import org.ovirt.engine.ui.uicommonweb.Linq; import org.ovirt.engine.ui.uicommonweb.UICommand; import org.ovirt.engine.ui.uicommonweb.dataprovider.AsyncDataProvider; import org.ovirt.engine.ui.uicommonweb.models.EntityModel; import org.ovirt.engine.ui.uicommonweb.models.HasEntity; import org.ovirt.engine.ui.uicommonweb.models.ListModel; import org.ovirt.engine.ui.uicommonweb.models.Model; import org.ovirt.engine.ui.uicommonweb.validation.HostAddressValidation; import org.ovirt.engine.ui.uicommonweb.validation.HostnameValidation; import org.ovirt.engine.ui.uicommonweb.validation.IValidation; import org.ovirt.engine.ui.uicommonweb.validation.IntegerValidation; import org.ovirt.engine.ui.uicommonweb.validation.IpAddressValidation; import org.ovirt.engine.ui.uicommonweb.validation.Ipv4AddressValidation; import org.ovirt.engine.ui.uicommonweb.validation.Ipv6AddressValidation; import org.ovirt.engine.ui.uicommonweb.validation.LengthValidation; import org.ovirt.engine.ui.uicommonweb.validation.MatchFieldsValidator; import org.ovirt.engine.ui.uicommonweb.validation.NotEmptyValidation; import org.ovirt.engine.ui.uicommonweb.validation.SubnetMaskValidation; import org.ovirt.engine.ui.uicommonweb.validation.VmInitNetworkNameValidation; import org.ovirt.engine.ui.uicompat.ConstantsManager; import org.ovirt.engine.ui.uicompat.Event; import org.ovirt.engine.ui.uicompat.EventArgs; public class VmInitModel extends Model { private static final String dnsServerListMessage; private static final String newNetworkText; static { dnsServerListMessage = ConstantsManager.getInstance().getConstants().cloudInitDnsServerListMessage(); newNetworkText = ""; //$NON-NLS-1$ } private ListModel<Map.Entry<String, String>> windowsSysprepTimeZone; private EntityModel<Boolean> windowsSysprepTimeZoneEnabled; private EntityModel<String> windowsHostname; private EntityModel<String> sysprepOrgName; private ListModel<String> sysprepDomain; private EntityModel<String> hostname; private EntityModel<String> inputLocale; private EntityModel<String> uiLanguage; private EntityModel<String> systemLocale; private EntityModel<String> userLocale; private EntityModel<String> userName; private EntityModel<String> activeDirectoryOU; private EntityModel<String> customScript; private EntityModel<String> sysprepScript; private EntityModel<String> authorizedKeys; private EntityModel<Boolean> regenerateKeysEnabled; private EntityModel<Boolean> timeZoneEnabled; private ListModel<Map.Entry<String, String>> timeZoneList; private EntityModel<String> cloudInitRootPassword; private EntityModel<String> cloudInitRootPasswordVerification; private EntityModel<Boolean> cloudInitPasswordSet; private EntityModel<String> sysprepAdminPassword; private EntityModel<String> sysprepAdminPasswordVerification; private EntityModel<Boolean> sysprepPasswordSet; private EntityModel<Boolean> networkEnabled; private EntityModel<String> networkSelectedName; private ListModel<String> networkList; private UICommand addNetworkCommand; private UICommand removeNetworkCommand; private ListModel<Ipv4BootProtocol> ipv4BootProtocolList; private EntityModel<String> networkIpAddress; private EntityModel<String> networkNetmask; private EntityModel<String> networkGateway; private ListModel<Ipv6BootProtocol> ipv6BootProtocolList; private EntityModel<String> networkIpv6Address; private EntityModel<Integer> networkIpv6Prefix; private EntityModel<String> networkIpv6Gateway; private EntityModel<Boolean> networkStartOnBoot; private EntityModel<String> dnsServers; private EntityModel<String> dnsSearchDomains; private EntityModel<Boolean> attachmentEnabled; private EntityModel<? extends Object> attachmentSelectedPath; private ListModel<? extends Object> attachmentList; private UICommand addAttachmentCommand; private UICommand removeAttachmentCommand; private ListModel attachmentType; private EntityModel<? extends Object> attachmentContent; private boolean isWindowsOS = false; private SortedMap<String, VmInitNetwork> networkMap; private Set<String> startOnBootNetworkNames; private String lastSelectedNetworkName; private String currentDomain = null; /** * Do not automatically change guest's hostname when the user already did manually */ private boolean canAutoSetHostname = true; private boolean disableOnHostnameChanged = false; public VmInitModel() { setWindowsSysprepTimeZone(new ListModel<Map.Entry<String, String>>()); setWindowsSysprepTimeZoneEnabled(new EntityModel<Boolean>()); setWindowsHostname(new EntityModel<String>()); setSysprepOrgName(new EntityModel<String>()); setSysprepDomain(new ListModel<String>()); setInputLocale(new EntityModel<String>()); setUiLanguage(new EntityModel<String>()); setSystemLocale(new EntityModel<String>()); setUserLocale(new EntityModel<String>()); setSysprepScript(new EntityModel<String>()); setActiveDirectoryOU(new EntityModel<String>()); setHostname(new EntityModel<String>()); setAuthorizedKeys(new EntityModel<String>()); setCustomScript(new EntityModel<String>()); setRegenerateKeysEnabled(new EntityModel<Boolean>()); setTimeZoneEnabled(new EntityModel<Boolean>()); setTimeZoneList(new ListModel<Map.Entry<String, String>>()); setUserName(new EntityModel<String>()); setCloudInitRootPassword(new EntityModel<String>()); setCloudInitRootPasswordVerification(new EntityModel<String>()); setCloudInitPasswordSet(new EntityModel<Boolean>()); getCloudInitPasswordSet().getEntityChangedEvent().addListener(this); setSysprepAdminPassword(new EntityModel<String>()); setSysprepAdminPasswordVerification(new EntityModel<String>()); setSysprepPasswordSet(new EntityModel<Boolean>()); getSysprepPasswordSet().getEntityChangedEvent().addListener(this); setNetworkEnabled(new EntityModel<Boolean>()); setNetworkSelectedName(new EntityModel<String>()); setNetworkList(new ListModel<String>()); setIpv4BootProtocolList(new ListModel<Ipv4BootProtocol>()); setNetworkIpAddress(new EntityModel<String>()); setNetworkNetmask(new EntityModel<String>()); setNetworkGateway(new EntityModel<String>()); setIpv6BootProtocolList(new ListModel<Ipv6BootProtocol>()); setNetworkIpv6Address(new EntityModel<String>()); setNetworkIpv6Prefix(new EntityModel<Integer>()); setNetworkIpv6Gateway(new EntityModel<String>()); setNetworkStartOnBoot(new EntityModel<Boolean>()); setDnsServers(new EntityModel<String>()); setDnsSearchDomains(new EntityModel<String>()); setAddNetworkCommand(new UICommand("addNetwork", this)); //$NON-NLS-1$ setRemoveNetworkCommand(new UICommand("removeNetwork", this)); //$NON-NLS-1$ networkMap = new TreeMap<>(); startOnBootNetworkNames = new HashSet<>(); lastSelectedNetworkName = null; getNetworkList().setItems(new ArrayList<>(networkMap.keySet())); getNetworkList().setSelectedItem(lastSelectedNetworkName); getNetworkList().getSelectedItemChangedEvent().addListener(this); getNetworkSelectedName().getEntityChangedEvent().addListener(this); setAttachmentEnabled(new EntityModel<Boolean>()); setAttachmentSelectedPath(new EntityModel()); setAttachmentList(new ListModel()); setAttachmentType(new ListModel()); setAttachmentContent(new EntityModel()); setAddAttachmentCommand(new UICommand("addAttachment", this)); //$NON-NLS-1$ setRemoveAttachmentCommand(new UICommand("removeAttachment", this)); //$NON-NLS-1$ getAttachmentList().getSelectedItemChangedEvent().addListener(this); getAttachmentSelectedPath().getEntityChangedEvent().addListener(this); } public void init(final VmBase vm) { getWindowsSysprepTimeZoneEnabled().setEntity(false); getRegenerateKeysEnabled().setEntity(false); getTimeZoneEnabled().setEntity(false); getNetworkEnabled().setEntity(false); getAttachmentEnabled().setEntity(false); getCloudInitPasswordSet().setEntity(false); getCloudInitPasswordSet().setIsChangeable(false); getSysprepPasswordSet().setEntity(false); getSysprepPasswordSet().setIsChangeable(false); getWindowsHostname().setEntity(""); getSysprepOrgName().setEntity(""); getInputLocale().setEntity(""); getUiLanguage().setEntity(""); getSystemLocale().setEntity(""); getUserLocale().setEntity(""); getSysprepScript().setEntity(""); getHostname().setEntity(""); getUserName().setEntity(""); getCloudInitRootPassword().setEntity(""); getCloudInitRootPasswordVerification().setEntity(""); getSysprepAdminPassword().setEntity(""); getSysprepAdminPasswordVerification().setEntity(""); getAuthorizedKeys().setEntity(""); getRegenerateKeysEnabled().setEntity(false); getCustomScript().setEntity(""); getActiveDirectoryOU().setEntity(""); Map<String, String> timezones = TimeZoneType.GENERAL_TIMEZONE.getTimeZoneList(); getTimeZoneList().setItems(timezones.entrySet()); getTimeZoneList().setSelectedItem(Linq.firstOrNull(timezones.entrySet(), item -> item.getValue().startsWith("(GMT) Greenwich"))); //$NON-NLS-1$ Map<String, String> windowsTimezones = TimeZoneType.WINDOWS_TIMEZONE.getTimeZoneList(); getWindowsSysprepTimeZone().setItems(windowsTimezones.entrySet()); getWindowsSysprepTimeZone().setSelectedItem(Linq.firstOrNull(windowsTimezones.entrySet(), item -> item.getValue().startsWith("(GMT) Greenwich"))); //$NON-NLS-1$ isWindowsOS = vm != null ? AsyncDataProvider.getInstance().isWindowsOsType(vm.getOsId()) : true; getIpv4BootProtocolList().setItems(Arrays.asList(Ipv4BootProtocol.values())); getIpv4BootProtocolList().setSelectedItem(Ipv4BootProtocol.NONE); getIpv6BootProtocolList().setItems(Arrays.asList(Ipv6BootProtocol.values())); getIpv6BootProtocolList().setSelectedItem(Ipv6BootProtocol.NONE); VmInit vmInit = (vm != null) ? vm.getVmInit() : null; if (vmInit != null) { if (!StringHelper.isNullOrEmpty(vmInit.getHostname())) { getHostname().setEntity(vmInit.getHostname()); getWindowsHostname().setEntity(vmInit.getHostname()); } if (!StringHelper.isNullOrEmpty(vmInit.getOrgName())) { getSysprepOrgName().setEntity(vmInit.getOrgName()); } updateSysprepDomain(vmInit.getDomain()); if (!StringHelper.isNullOrEmpty(vmInit.getInputLocale())) { getInputLocale().setEntity(vmInit.getInputLocale()); } if (!StringHelper.isNullOrEmpty(vmInit.getUiLanguage())) { getUiLanguage().setEntity(vmInit.getUiLanguage()); } if (!StringHelper.isNullOrEmpty(vmInit.getSystemLocale())) { getSystemLocale().setEntity(vmInit.getSystemLocale()); } if (!StringHelper.isNullOrEmpty(vmInit.getUserLocale())) { getUserLocale().setEntity(vmInit.getUserLocale()); } final String tz = vmInit.getTimeZone(); if (!StringHelper.isNullOrEmpty(tz)) { if (AsyncDataProvider.getInstance().isWindowsOsType(vm.getOsId())) { getWindowsSysprepTimeZoneEnabled().setEntity(true); selectTimeZone(getWindowsSysprepTimeZone(), windowsTimezones, tz); } else { getTimeZoneEnabled().setEntity(true); selectTimeZone(getTimeZoneList(), timezones, tz); } } if (!StringHelper.isNullOrEmpty(vmInit.getUserName())) { getUserName().setEntity(vmInit.getUserName()); } if (!StringHelper.isNullOrEmpty(vmInit.getRootPassword())) { getCloudInitRootPassword().setEntity(vmInit.getRootPassword()); getCloudInitRootPasswordVerification().setEntity(vmInit.getRootPassword()); getSysprepAdminPassword().setEntity(vmInit.getRootPassword()); getSysprepAdminPasswordVerification().setEntity(vmInit.getRootPassword()); } getCloudInitPasswordSet().setEntity(vmInit.isPasswordAlreadyStored()); getCloudInitPasswordSet().setIsChangeable(vmInit.isPasswordAlreadyStored()); getSysprepPasswordSet().setEntity(vmInit.isPasswordAlreadyStored()); getSysprepPasswordSet().setIsChangeable(vmInit.isPasswordAlreadyStored()); if (!StringHelper.isNullOrEmpty(vmInit.getAuthorizedKeys())) { getAuthorizedKeys().setEntity(vmInit.getAuthorizedKeys()); } if (vmInit.getRegenerateKeys() != null) { getRegenerateKeysEnabled().setEntity(vmInit.getRegenerateKeys()); } if (!StringHelper.isNullOrEmpty(vmInit.getCustomScript())) { if (isWindowsOS) { getSysprepScript().setEntity(vmInit.getCustomScript()); } else { getCustomScript().setEntity(vmInit.getCustomScript()); } } if (!StringHelper.isNullOrEmpty(vmInit.getActiveDirectoryOU())) { getActiveDirectoryOU().setEntity(vmInit.getActiveDirectoryOU()); } initNetworks(vmInit); } addHostnameListeners(); } private void initNetworks(VmInit vmInit) { if (vmInit.getDnsServers() != null) { getDnsServers().setEntity(vmInit.getDnsServers()); } if (vmInit.getDnsSearch() != null) { getDnsSearchDomains().setEntity(vmInit.getDnsSearch()); } if (vmInit.getNetworks() == null || vmInit.getNetworks().size() == 0) { return; } networkMap = new TreeMap<>(); startOnBootNetworkNames = new HashSet<>(); lastSelectedNetworkName = null; for (VmInitNetwork network : vmInit.getNetworks()) { if (network.getName() == null) { continue; } networkMap.put(network.getName(), network); if (network.getStartOnBoot() != null && network.getStartOnBoot()) { startOnBootNetworkNames.add(network.getName()); } } if (networkMap.size() != 0) { lastSelectedNetworkName = networkMap.keySet().iterator().next(); getNetworkEnabled().setEntity(true); } else { getNetworkEnabled().setEntity(false); } // update silently - do not listen to events getNetworkList().getSelectedItemChangedEvent().removeListener(this); getNetworkList().setItems(new ArrayList<>(networkMap.keySet())); getNetworkList().setSelectedItem(lastSelectedNetworkName); getNetworkList().getSelectedItemChangedEvent().addListener(this); getNetworkSelectedName().getEntityChangedEvent().removeListener(this); getNetworkSelectedName().setEntity(getNetworkList().getSelectedItem()); getNetworkSelectedName().getEntityChangedEvent().addListener(this); updateNetworkDisplay(); } private void selectTimeZone(ListModel<Map.Entry<String, String>> specificTimeZoneModel, Map<String, String> timezones, final String tz) { specificTimeZoneModel.setSelectedItem(Linq.firstOrNull(timezones.entrySet(), item -> item.getKey().equals(tz))); } public boolean validate() { getHostname().setIsValid(true); getWindowsHostname().setIsValid(true); getSysprepAdminPassword().setIsValid(true); getSysprepAdminPasswordVerification().setIsValid(true); getCloudInitRootPassword().setIsValid(true); getCloudInitRootPasswordVerification().setIsValid(true); if (this.isWindowsOS) { if (getSysprepPasswordEnabled()) { getSysprepAdminPassword().validateEntity(new IValidation[] { new NotEmptyValidation(), new MatchFieldsValidator(getSysprepAdminPassword().getEntity(), getSysprepAdminPasswordVerification().getEntity()) }); } } else { if (getRootPasswordEnabled()) { getCloudInitRootPassword().validateEntity(new IValidation[] { new NotEmptyValidation(), new MatchFieldsValidator(getCloudInitRootPassword().getEntity(), getCloudInitRootPasswordVerification().getEntity()) }); } } if (getHostnameEnabled()) { if (this.isWindowsOS) { getWindowsHostname().validateEntity(new IValidation[] { new HostnameValidation(), new LengthValidation(AsyncDataProvider.getInstance().getMaxVmNameLengthSysprep())}); } else { getHostname().validateEntity(new IValidation[] { new HostnameValidation(), new LengthValidation(AsyncDataProvider.getInstance().getMaxVmNameLength())}); } } getSysprepDomain().setIsValid(true); if (getDomainEnabled()) { getSysprepDomain().setIsValid(new HostAddressValidation().validate(getSysprepDomain().getSelectedItem()).getSuccess()); } getAuthorizedKeys().setIsValid(true); getTimeZoneList().setIsValid(true); if (getTimeZoneEnabled().getEntity()) { getTimeZoneList().validateSelectedItem(new IValidation[] { new NotEmptyValidation() }); } boolean networkIsValid = true; getNetworkList().setIsValid(true); getNetworkIpAddress().setIsValid(true); getNetworkNetmask().setIsValid(true); getNetworkGateway().setIsValid(true); getNetworkIpv6Address().setIsValid(true); getNetworkIpv6Prefix().setIsValid(true); getNetworkIpv6Gateway().setIsValid(true); boolean dnsIsValid = true; getDnsServers().setIsValid(true); getDnsSearchDomains().setIsValid(true); if (getNetworkEnabled().getEntity()) { saveNetworkFields(); for (Map.Entry<String, VmInitNetwork> entry : networkMap.entrySet()) { String name = entry.getKey(); VmInitNetwork vmInitNetwork = entry.getValue(); if (vmInitNetwork.getBootProtocol() == Ipv4BootProtocol.STATIC_IP) { if (!validateHidden(getNetworkList(), name, null, new IValidation[] { new VmInitNetworkNameValidation(), new NotEmptyValidation()}) || !validateHidden(getNetworkIpAddress(), vmInitNetwork.getIp(), null, new IValidation[] { new Ipv4AddressValidation() }) || !validateHidden(getNetworkNetmask(), vmInitNetwork.getNetmask(), null, new IValidation[] { new SubnetMaskValidation() }) || !validateHidden(getNetworkGateway(), vmInitNetwork.getGateway(), null, new IValidation[] { new Ipv4AddressValidation(true) })) { getNetworkList().setSelectedItem(name); networkIsValid = false; break; } } if (vmInitNetwork.getIpv6BootProtocol() == Ipv6BootProtocol.STATIC_IP) { if (!validateHidden(getNetworkList(), name, null, new IValidation[] { new VmInitNetworkNameValidation(), new NotEmptyValidation()}) || !validateHidden(getNetworkIpv6Address(), vmInitNetwork.getIpv6Address(), null, new IValidation[] { new Ipv6AddressValidation() }) || !validateHidden(getNetworkIpv6Prefix(), vmInitNetwork.getIpv6Prefix(), null, new IValidation[] { new IntegerValidation(0, 128) }) || !validateHidden(getNetworkIpv6Gateway(), vmInitNetwork.getIpv6Gateway(), null, new IValidation[] { new Ipv6AddressValidation(true) })) { getNetworkList().setSelectedItem(name); networkIsValid = false; break; } } } if (!networkMap.isEmpty()) { if (getDnsServers().getEntity() != null) { for (String server : tokenizeString(getDnsServers().getEntity())) { if (!validateHidden(getDnsServers(), server, dnsServerListMessage, new IValidation[] { new IpAddressValidation() })) { dnsIsValid = false; break; } } } if (getDnsSearchDomains().getEntity() != null) { for (String domain : tokenizeString(getDnsSearchDomains().getEntity())) { if (!validateHidden(getDnsSearchDomains(), domain, null, new IValidation[] { new HostnameValidation() })) { dnsIsValid = false; break; } } } } } return getHostname().getIsValid() && getWindowsHostname().getIsValid() && getSysprepDomain().getIsValid() && getAuthorizedKeys().getIsValid() && getTimeZoneList().getIsValid() && getCloudInitRootPassword().getIsValid() && getSysprepAdminPassword().getIsValid() && networkIsValid && dnsIsValid; } /* Validate a shared display element, without having to display each shared value */ private <T> boolean validateHidden(Model entity, final T value, final String message, final IValidation[] validations) { EntityModel<T> tmp = new EntityModel<>(value); tmp.setIsValid(true); tmp.validateEntity(validations); if (!tmp.getIsValid()) { if (message != null) { List<String> reasons = new ArrayList<>(); reasons.add(message); entity.setInvalidityReasons(reasons); } else { entity.setInvalidityReasons(tmp.getInvalidityReasons()); } entity.setIsValid(false); } else { entity.setIsValid(true); } return tmp.getIsValid(); } public VmInit buildCloudInitParameters(UnitVmModel model) { if (model.getVmInitEnabled().getEntity() || model.getSysprepEnabled().getEntity()) { return buildModelSpecificParameters(model.getIsWindowsOS()); } else { return null; } } public VmInit buildCloudInitParameters(RunOnceModel model) { if (model.getIsSysprepEnabled().getEntity() || model.getIsCloudInitEnabled().getEntity()) { return buildModelSpecificParameters(model.getIsWindowsOS()); } else { return null; } } private VmInit buildModelSpecificParameters(boolean isWindows) { VmInit vmInit = buildCloudInitParameters(); if (isWindows && getWindowsSysprepTimeZoneEnabled().getEntity()) { Map.Entry<String, String> entry = getWindowsSysprepTimeZone().getSelectedItem(); vmInit.setTimeZone(entry.getKey()); } else if (!isWindows && getTimeZoneEnabled().getEntity()) { Map.Entry<String, String> entry = getTimeZoneList().getSelectedItem(); vmInit.setTimeZone(entry.getKey()); } if (isWindows) { vmInit.setDomain(getSysprepDomain().getSelectedItem()); } return vmInit; } public VmInit buildCloudInitParameters() { VmInit vmInit = new VmInit(); if (getHostnameEnabled()) { vmInit.setHostname(isWindowsOS ? getWindowsHostname().getEntity() : getHostname().getEntity()); } if (isWindowsOS) { vmInit.setInputLocale(getInputLocale().getEntity()); vmInit.setUiLanguage(getUiLanguage().getEntity()); vmInit.setSystemLocale(getSystemLocale().getEntity()); vmInit.setUserLocale(getUserLocale().getEntity()); vmInit.setCustomScript(getSysprepScript().getEntity()); vmInit.setActiveDirectoryOU(getActiveDirectoryOU().getEntity()); if (getSysprepPasswordEnabled()) { vmInit.setRootPassword(getSysprepAdminPassword().getEntity()); } vmInit.setPasswordAlreadyStored(getSysprepPasswordSet().getEntity()); vmInit.setOrgName(getSysprepOrgName().getEntity()); } else { vmInit.setCustomScript(getCustomScript().getEntity()); if (getRootPasswordEnabled()) { vmInit.setRootPassword(getCloudInitRootPassword().getEntity()); } vmInit.setPasswordAlreadyStored(getCloudInitPasswordSet().getEntity()); } vmInit.setUserName(getUserName().getEntity()); vmInit.setAuthorizedKeys(getAuthorizedKeys().getEntity()); if (getRegenerateKeysEnabled().getEntity()) { vmInit.setRegenerateKeys(Boolean.TRUE); } if (getNetworkEnabled().getEntity()) { saveNetworkFields(); if (!networkMap.isEmpty()) { for (Map.Entry<String, VmInitNetwork> entry : networkMap.entrySet()) { VmInitNetwork vmInitNetwork = entry.getValue(); if (vmInitNetwork.getBootProtocol() != Ipv4BootProtocol.STATIC_IP) { vmInitNetwork.setIp(null); vmInitNetwork.setNetmask(null); vmInitNetwork.setGateway(null); } if (vmInitNetwork.getIpv6BootProtocol() != Ipv6BootProtocol.STATIC_IP) { vmInitNetwork.setIpv6Address(null); vmInitNetwork.setIpv6Prefix(null); vmInitNetwork.setIpv6Gateway(null); } vmInitNetwork.setStartOnBoot(startOnBootNetworkNames.contains(entry.getKey())); vmInitNetwork.setName(entry.getKey()); } vmInit.setNetworks(new ArrayList<>(networkMap.values())); } } vmInit.setDnsServers(getDnsServers().getEntity()); vmInit.setDnsSearch(getDnsSearchDomains().getEntity()); return vmInit; } private List<String> tokenizeString(String spaceDelimitedString) { if (spaceDelimitedString != null) { return new ArrayList<>(Arrays.asList(spaceDelimitedString.split("\\s+"))); //$NON-NLS-1$ } else { return null; } } @Override public void eventRaised(Event<? extends EventArgs> ev, Object sender, EventArgs args) { super.eventRaised(ev, sender, args); if (ev.matchesDefinition(ListModel.selectedItemChangedEventDefinition)) { if (sender == getNetworkList()) { networkList_SelectedItemChanged(); } } else if (ev.matchesDefinition(HasEntity.entityChangedEventDefinition)) { if (sender == getNetworkSelectedName()) { networkSelectedName_SelectionChanged(); } else if (sender == getCloudInitPasswordSet()) { cloudInitPasswordSetChanged(); } else if (sender == getSysprepPasswordSet()) { sysprepPasswordSetChanged(); } else if (sender == getHostname()) { disableAutoSetHostname(); } else if (sender == getWindowsHostname()) { disableAutoSetHostname(); } } } private void cloudInitPasswordSetChanged() { Boolean passwordChangable = !getCloudInitPasswordSet().getEntity(); getCloudInitRootPassword().setIsChangeable(passwordChangable); getCloudInitRootPasswordVerification().setIsChangeable(passwordChangable); } private void sysprepPasswordSetChanged() { Boolean passwordChangable = !getSysprepPasswordSet().getEntity(); getSysprepAdminPassword().setIsChangeable(passwordChangable); getSysprepAdminPasswordVerification().setIsChangeable(passwordChangable); } @Override public void executeCommand(UICommand command) { super.executeCommand(command); if (command.equals(getAddNetworkCommand())) { addNetwork(); } else if (command.equals(getRemoveNetworkCommand())) { removeNetwork(); } } /* === Network === */ private void networkList_SelectedItemChanged() { saveNetworkFields(); // The networkSelectedName EntityChangedEvent is really only // to catch user updates; don't trigger it programmatically. // Suppressing events locally works better than setEntity(, false). getNetworkSelectedName().getEntityChangedEvent().removeListener(this); getNetworkSelectedName().setEntity(getNetworkList().getSelectedItem()); getNetworkSelectedName().getEntityChangedEvent().addListener(this); updateNetworkDisplay(); // lastSelectedNetworkName can be used throughout update process to see prior name lastSelectedNetworkName = getNetworkList().getSelectedItem(); } private void networkSelectedName_SelectionChanged() { String oldName = getNetworkList().getSelectedItem(); String newName = getNetworkSelectedName().getEntity(); if (oldName != null && newName != null && !newName.trim().equals(oldName)) { VmInitNetwork vmInitNetwork = networkMap.get(oldName); newName = newName.trim(); if (newName.isEmpty() || networkMap.containsKey(newName)) { getNetworkSelectedName().setEntity(oldName); } else { networkMap.remove(oldName); networkMap.put(newName, vmInitNetwork); getNetworkList().setItems(new ArrayList<>(networkMap.keySet())); getNetworkList().setSelectedItem(newName); } } } private void addNetwork() { if (!networkMap.containsKey(newNetworkText)) { networkMap.put(newNetworkText, new VmInitNetwork()); getNetworkList().setItems(new ArrayList<>(networkMap.keySet())); } getNetworkList().setSelectedItem(newNetworkText); } private void removeNetwork() { networkMap.remove(getNetworkList().getSelectedItem()); getNetworkList().setItems(new ArrayList<>(networkMap.keySet())); getNetworkList().setSelectedItem(Linq.firstOrNull(networkMap.keySet())); } /* Save displayed network properties */ private void saveNetworkFields() { if (lastSelectedNetworkName != null) { VmInitNetwork vmInitNetwork = networkMap.get(lastSelectedNetworkName); if (vmInitNetwork != null) { vmInitNetwork.setBootProtocol(getIpv4BootProtocolList().getSelectedItem()); vmInitNetwork.setIp(getNetworkIpAddress().getEntity()); vmInitNetwork.setNetmask(getNetworkNetmask().getEntity()); vmInitNetwork.setGateway(getNetworkGateway().getEntity()); vmInitNetwork.setIpv6BootProtocol(getIpv6BootProtocolList().getSelectedItem()); vmInitNetwork.setIpv6Address(getNetworkIpv6Address().getEntity()); vmInitNetwork.setIpv6Prefix(getNetworkIpv6Prefix().getEntity()); vmInitNetwork.setIpv6Gateway(getNetworkIpv6Gateway().getEntity()); if (getNetworkStartOnBoot().getEntity() != null && getNetworkStartOnBoot().getEntity()) { startOnBootNetworkNames.add(lastSelectedNetworkName); } else { startOnBootNetworkNames.remove(lastSelectedNetworkName); } } } } /* Update displayed network properties to reflect currently-selected item */ private void updateNetworkDisplay() { String networkName = null; VmInitNetwork vmInitNetwork = null; if (getNetworkList().getSelectedItem() != null) { networkName = getNetworkList().getSelectedItem(); vmInitNetwork = networkMap.get(networkName); } final Ipv4BootProtocol ipv4bootProtocol = vmInitNetwork == null || vmInitNetwork.getBootProtocol() == null ? Ipv4BootProtocol.NONE : vmInitNetwork.getBootProtocol(); getIpv4BootProtocolList().setSelectedItem(ipv4bootProtocol); final Ipv6BootProtocol ipv6bootProtocol = vmInitNetwork == null || vmInitNetwork.getIpv6BootProtocol() == null ? Ipv6BootProtocol.NONE : vmInitNetwork.getIpv6BootProtocol(); getIpv6BootProtocolList().setSelectedItem(ipv6bootProtocol); getNetworkIpAddress().setEntity(vmInitNetwork == null ? null : vmInitNetwork.getIp()); getNetworkNetmask().setEntity(vmInitNetwork == null ? null : vmInitNetwork.getNetmask()); getNetworkGateway().setEntity(vmInitNetwork == null ? null : vmInitNetwork.getGateway()); getNetworkIpv6Address().setEntity(vmInitNetwork == null ? null : vmInitNetwork.getIpv6Address()); getNetworkIpv6Prefix().setEntity(vmInitNetwork == null ? null : vmInitNetwork.getIpv6Prefix()); getNetworkIpv6Gateway().setEntity(vmInitNetwork == null ? null : vmInitNetwork.getIpv6Gateway()); getNetworkStartOnBoot().setEntity(networkName == null ? null : startOnBootNetworkNames.contains(networkName)); } public void osTypeChanged(Integer selectedItem) { isWindowsOS = AsyncDataProvider.getInstance().isWindowsOsType(selectedItem); } protected void updateSysprepDomain(String domain) { // Can't use domain since onSuccess is async call and it have // a different stack call. currentDomain = domain; AsyncDataProvider.getInstance().getAuthzExtensionsNames(new AsyncQuery<>(domains -> { getSysprepDomain().setItems(domains); if (!StringHelper.isNullOrEmpty(currentDomain)) { if (!domains.contains(currentDomain)) { domains.add(currentDomain); } getSysprepDomain().setSelectedItem(currentDomain); } })); } public void autoSetHostname(String hostName) { if (canAutoSetHostname) { disableOnHostnameChanged = true; getWindowsHostname().setEntity(hostName); getHostname().setEntity(hostName); disableOnHostnameChanged = false; } } public void disableAutoSetHostname() { if (!disableOnHostnameChanged) { canAutoSetHostname = false; } } private void addHostnameListeners() { getHostname().getEntityChangedEvent().addListener(this); getWindowsHostname().getEntityChangedEvent().addListener(this); } public boolean getHostnameEnabled() { if (isWindowsOS) { return !StringHelper.isNullOrEmpty(getWindowsHostname().getEntity()); } else { return !StringHelper.isNullOrEmpty(getHostname().getEntity()); } } public boolean getDomainEnabled() { if (isWindowsOS) { return !StringHelper.isNullOrEmpty(getSysprepDomain().getSelectedItem()); } return false; } public ListModel<Map.Entry<String, String>> getWindowsSysprepTimeZone() { return windowsSysprepTimeZone; } public void setWindowsSysprepTimeZone(ListModel<Map.Entry<String, String>> windowsSysprepTimeZone) { this.windowsSysprepTimeZone = windowsSysprepTimeZone; } public EntityModel<Boolean> getWindowsSysprepTimeZoneEnabled() { return windowsSysprepTimeZoneEnabled; } public void setWindowsSysprepTimeZoneEnabled(EntityModel<Boolean> windowsSysprepTimeZoneEnabled) { this.windowsSysprepTimeZoneEnabled = windowsSysprepTimeZoneEnabled; } public EntityModel<String> getWindowsHostname() { return windowsHostname; } private void setWindowsHostname(EntityModel<String> value) { windowsHostname = value; } public EntityModel<String> getSysprepOrgName() { return sysprepOrgName; } private void setSysprepOrgName(EntityModel<String> value) { sysprepOrgName = value; } public EntityModel<String> getHostname() { return hostname; } private void setHostname(EntityModel<String> value) { hostname = value; } public ListModel<String> getSysprepDomain() { return sysprepDomain; } private void setSysprepDomain(ListModel<String> value) { sysprepDomain = value; } public EntityModel<String> getInputLocale() { return inputLocale; } private void setInputLocale(EntityModel<String> value) { inputLocale = value; } public EntityModel<String> getUiLanguage() { return uiLanguage; } private void setUiLanguage(EntityModel<String> value) { uiLanguage = value; } public EntityModel<String> getSystemLocale() { return systemLocale; } private void setSystemLocale(EntityModel<String> value) { systemLocale = value; } public EntityModel<String> getUserLocale() { return userLocale; } private void setUserLocale(EntityModel<String> value) { userLocale = value; } public EntityModel<String> getUserName() { return userName; } private void setUserName(EntityModel<String> value) { userName = value; } public EntityModel<String> getActiveDirectoryOU() { return activeDirectoryOU; } private void setActiveDirectoryOU(EntityModel<String> value) { activeDirectoryOU = value; } public EntityModel<String> getCustomScript() { return customScript; } private void setCustomScript(EntityModel<String> value) { customScript = value; } public EntityModel<String> getSysprepScript() { return sysprepScript; } private void setSysprepScript(EntityModel<String> value) { sysprepScript = value; } public boolean getAuthorizedKeysEnabled() { return !StringHelper.isNullOrEmpty(getCloudInitRootPassword().getEntity()); } public EntityModel<String> getAuthorizedKeys() { return authorizedKeys; } private void setAuthorizedKeys(EntityModel<String> value) { authorizedKeys = value; } public EntityModel<Boolean> getRegenerateKeysEnabled() { return regenerateKeysEnabled; } private void setRegenerateKeysEnabled(EntityModel<Boolean> value) { regenerateKeysEnabled = value; } public EntityModel<Boolean> getTimeZoneEnabled() { return timeZoneEnabled; } private void setTimeZoneEnabled(EntityModel<Boolean> value) { timeZoneEnabled = value; } public ListModel<Map.Entry<String, String>> getTimeZoneList() { return timeZoneList; } private void setTimeZoneList(ListModel<Map.Entry<String, String>> value) { timeZoneList = value; } public boolean getSysprepPasswordEnabled() { return !StringHelper.isNullOrEmpty(getSysprepAdminPassword().getEntity()); } public boolean getRootPasswordEnabled() { return !StringHelper.isNullOrEmpty(getCloudInitRootPassword().getEntity()); } public EntityModel<String> getCloudInitRootPassword() { return cloudInitRootPassword; } private void setCloudInitRootPassword(EntityModel<String> value) { cloudInitRootPassword = value; } public EntityModel<String> getCloudInitRootPasswordVerification() { return cloudInitRootPasswordVerification; } private void setCloudInitRootPasswordVerification(EntityModel<String> value) { cloudInitRootPasswordVerification = value; } public EntityModel<Boolean> getCloudInitPasswordSet() { return cloudInitPasswordSet; } private void setCloudInitPasswordSet(EntityModel<Boolean> value) { cloudInitPasswordSet = value; } public EntityModel<String> getSysprepAdminPassword() { return sysprepAdminPassword; } private void setSysprepAdminPassword(EntityModel<String> value) { sysprepAdminPassword = value; } public EntityModel<String> getSysprepAdminPasswordVerification() { return sysprepAdminPasswordVerification; } private void setSysprepAdminPasswordVerification(EntityModel<String> value) { sysprepAdminPasswordVerification = value; } public EntityModel<Boolean> getSysprepPasswordSet() { return sysprepPasswordSet; } private void setSysprepPasswordSet(EntityModel<Boolean> value) { sysprepPasswordSet = value; } public EntityModel<Boolean> getNetworkEnabled() { return networkEnabled; } private void setNetworkEnabled(EntityModel<Boolean> value) { networkEnabled = value; } public EntityModel<String> getNetworkSelectedName() { return networkSelectedName; } private void setNetworkSelectedName(EntityModel<String> value) { networkSelectedName = value; } public ListModel<String> getNetworkList() { return networkList; } private void setNetworkList(ListModel<String> value) { networkList = value; } public UICommand getAddNetworkCommand() { return addNetworkCommand; } private void setAddNetworkCommand(UICommand value) { addNetworkCommand = value; } public UICommand getRemoveNetworkCommand() { return removeNetworkCommand; } private void setRemoveNetworkCommand(UICommand value) { removeNetworkCommand = value; } public ListModel<Ipv4BootProtocol> getIpv4BootProtocolList() { return ipv4BootProtocolList; } private void setIpv4BootProtocolList(ListModel<Ipv4BootProtocol> value) { ipv4BootProtocolList = value; } public EntityModel<String> getNetworkIpAddress() { return networkIpAddress; } private void setNetworkIpAddress(EntityModel<String> value) { networkIpAddress = value; } public EntityModel<String> getNetworkNetmask() { return networkNetmask; } private void setNetworkNetmask(EntityModel<String> value) { networkNetmask = value; } public EntityModel<String> getNetworkGateway() { return networkGateway; } private void setNetworkGateway(EntityModel<String> value) { networkGateway = value; } public EntityModel<Boolean> getNetworkStartOnBoot() { return networkStartOnBoot; } private void setNetworkStartOnBoot(EntityModel<Boolean> value) { networkStartOnBoot = value; } public EntityModel<String> getDnsServers() { return dnsServers; } public void setDnsServers(EntityModel<String> dnsServers) { this.dnsServers = dnsServers; } public EntityModel<String> getDnsSearchDomains() { return dnsSearchDomains; } public void setDnsSearchDomains(EntityModel<String> dnsSearchDomains) { this.dnsSearchDomains = dnsSearchDomains; } public EntityModel<Boolean> getAttachmentEnabled() { return attachmentEnabled; } private void setAttachmentEnabled(EntityModel<Boolean> value) { attachmentEnabled = value; } public EntityModel getAttachmentSelectedPath() { return attachmentSelectedPath; } private void setAttachmentSelectedPath(EntityModel value) { attachmentSelectedPath = value; } public ListModel getAttachmentList() { return attachmentList; } private void setAttachmentList(ListModel value) { attachmentList = value; } public UICommand getAddAttachmentCommand() { return addAttachmentCommand; } private void setAddAttachmentCommand(UICommand value) { addAttachmentCommand = value; } public UICommand getRemoveAttachmentCommand() { return removeAttachmentCommand; } private void setRemoveAttachmentCommand(UICommand value) { removeAttachmentCommand = value; } public ListModel getAttachmentType() { return attachmentType; } private void setAttachmentType(ListModel value) { attachmentType = value; } public EntityModel getAttachmentContent() { return attachmentContent; } private void setAttachmentContent(EntityModel value) { attachmentContent = value; } public ListModel<Ipv6BootProtocol> getIpv6BootProtocolList() { return ipv6BootProtocolList; } public void setIpv6BootProtocolList(ListModel<Ipv6BootProtocol> ipv6BootProtocolList) { this.ipv6BootProtocolList = ipv6BootProtocolList; } public EntityModel<String> getNetworkIpv6Address() { return networkIpv6Address; } public void setNetworkIpv6Address(EntityModel<String> networkIpv6Address) { this.networkIpv6Address = networkIpv6Address; } public EntityModel<Integer> getNetworkIpv6Prefix() { return networkIpv6Prefix; } public void setNetworkIpv6Prefix(EntityModel<Integer> networkIpv6Prefix) { this.networkIpv6Prefix = networkIpv6Prefix; } public EntityModel<String> getNetworkIpv6Gateway() { return networkIpv6Gateway; } public void setNetworkIpv6Gateway(EntityModel<String> networkIpv6Gateway) { this.networkIpv6Gateway = networkIpv6Gateway; } public SortedMap<String, VmInitNetwork> getNetworkMap() { return networkMap; } public void setNetworkMap(SortedMap<String, VmInitNetwork> networkMap) { this.networkMap = networkMap; } }