package org.ovirt.engine.ui.uicommonweb.models.hosts; import org.ovirt.engine.core.common.businessentities.network.HostNetworkQos; import org.ovirt.engine.core.common.businessentities.network.Ipv4BootProtocol; import org.ovirt.engine.core.common.businessentities.network.Ipv6BootProtocol; import org.ovirt.engine.core.common.businessentities.network.Network; import org.ovirt.engine.core.common.businessentities.network.NetworkAttachment; import org.ovirt.engine.core.common.businessentities.network.VdsNetworkInterface; import org.ovirt.engine.ui.uicommonweb.models.EntityModel; import org.ovirt.engine.ui.uicommonweb.models.HasValidatedTabs; import org.ovirt.engine.ui.uicommonweb.models.Model; import org.ovirt.engine.ui.uicommonweb.models.TabName; import org.ovirt.engine.ui.uicommonweb.models.datacenters.qos.HostNetworkQosParametersModel; import org.ovirt.engine.ui.uicommonweb.models.vms.key_value.KeyValueModel; import org.ovirt.engine.ui.uicommonweb.validation.IValidation; import org.ovirt.engine.ui.uicommonweb.validation.IntegerValidation; import org.ovirt.engine.ui.uicommonweb.validation.Ipv4AddressValidation; import org.ovirt.engine.ui.uicommonweb.validation.Ipv6AddressValidation; import org.ovirt.engine.ui.uicommonweb.validation.NotEmptyValidation; import org.ovirt.engine.ui.uicommonweb.validation.SubnetMaskValidation; import org.ovirt.engine.ui.uicompat.ConstantsManager; import org.ovirt.engine.ui.uicompat.Event; import org.ovirt.engine.ui.uicompat.EventArgs; import org.ovirt.engine.ui.uicompat.PropertyChangedEventArgs; public class NetworkAttachmentModel extends Model implements HasValidatedTabs { private Network network; private VdsNetworkInterface nic; private NetworkAttachment networkAttachment; private HostNetworkQos networkQos; private EntityModel<String> ipv4Address; private EntityModel<String> ipv4Subnet; private EntityModel<String> ipv4Gateway; private Ipv4BootProtocol ipv4BootProtocol = Ipv4BootProtocol.values()[0]; private EntityModel<String> ipv6Address; private EntityModel<Integer> ipv6Prefix; private EntityModel<String> ipv6Gateway; private Ipv6BootProtocol ipv6BootProtocol = Ipv6BootProtocol.values()[0]; private boolean bootProtocolsAvailable; private EntityModel<Boolean> isToSync; private HostNetworkQosParametersModel qosModel; private KeyValueModel customPropertiesModel; private EntityModel<Boolean> qosOverridden; public NetworkAttachmentModel(Network network, VdsNetworkInterface nic, NetworkAttachment networkAttachment, HostNetworkQos networkQos) { this.network = network; this.nic = nic; this.networkAttachment = networkAttachment; this.networkQos = networkQos; verifyInput(network, nic, networkAttachment); setIpv4Address(new EntityModel<String>()); setIpv4Subnet(new EntityModel<String>()); setIpv4Gateway(new EntityModel<String>()); setIpv6Address(new EntityModel<String>()); setIpv6Prefix(new EntityModel<Integer>()); setIpv6Gateway(new EntityModel<String>()); setQosOverridden(new EntityModel<Boolean>()); setQosModel(new HostNetworkQosParametersModel()); setCustomPropertiesModel(new KeyValueModel()); setIsToSync(new EntityModel<Boolean>()); setBootProtocolsAvailable(true); getIpv4Gateway().setIsAvailable(false); getIpv4Address().setIsChangeable(false); getIpv4Subnet().setIsChangeable(false); getIpv4Gateway().setIsChangeable(false); getIpv6Gateway().setIsAvailable(false); getIpv6Address().setIsChangeable(false); getIpv6Prefix().setIsChangeable(false); getIpv6Gateway().setIsChangeable(false); getQosOverridden().setIsAvailable(false); getQosModel().setIsAvailable(false); getCustomPropertiesModel().setIsAvailable(false); getQosOverridden().getEntityChangedEvent().addListener(this); getIsToSync().getEntityChangedEvent().addListener(this); setTitle(); } private void verifyInput(Network network, VdsNetworkInterface nic, NetworkAttachment networkAttachment) { boolean unmanaged = networkAttachment == null && nic != null; boolean newAttachment = networkAttachment != null && networkAttachment.getId() == null && network != null; boolean existingAttachment = networkAttachment != null && networkAttachment.getId() != null && network != null && nic != null; assert unmanaged || newAttachment || existingAttachment : "the input of the ctor is wrong"; //$NON-NLS-1$ } public void syncWith(InterfacePropertiesAccessor interfacePropertiesAccessor) { setIpv4BootProtocol(interfacePropertiesAccessor.getIpv4BootProtocol()); getIpv4Address().setEntity(interfacePropertiesAccessor.getIpv4Address()); getIpv4Subnet().setEntity(interfacePropertiesAccessor.getIpv4Netmask()); getIpv4Gateway().setEntity(interfacePropertiesAccessor.getIpv4Gateway()); setIpv6BootProtocol(interfacePropertiesAccessor.getIpv6BootProtocol()); getIpv6Address().setEntity(interfacePropertiesAccessor.getIpv6Address()); getIpv6Prefix().setEntity(interfacePropertiesAccessor.getIpv6Prefix()); getIpv6Gateway().setEntity(interfacePropertiesAccessor.getIpv6Gateway()); getQosModel().init(interfacePropertiesAccessor.getHostNetworkQos()); getCustomPropertiesModel().deserialize(KeyValueModel.convertProperties(interfacePropertiesAccessor.getCustomProperties())); } public EntityModel<String> getIpv4Address() { return ipv4Address; } private void setIpv4Address(EntityModel<String> value) { ipv4Address = value; } public EntityModel<String> getIpv4Subnet() { return ipv4Subnet; } private void setIpv4Subnet(EntityModel<String> value) { ipv4Subnet = value; } public EntityModel<String> getIpv4Gateway() { return ipv4Gateway; } private void setIpv4Gateway(EntityModel<String> value) { ipv4Gateway = value; } public EntityModel<String> getIpv6Address() { return ipv6Address; } private void setIpv6Address(EntityModel<String> value) { ipv6Address = value; } public EntityModel<Integer> getIpv6Prefix() { return ipv6Prefix; } private void setIpv6Prefix(EntityModel<Integer> value) { ipv6Prefix = value; } public EntityModel<String> getIpv6Gateway() { return ipv6Gateway; } private void setIpv6Gateway(EntityModel<String> value) { ipv6Gateway = value; } public Ipv4BootProtocol getIpv4BootProtocol() { return ipv4BootProtocol; } public void setIpv4BootProtocol(Ipv4BootProtocol value) { if (ipv4BootProtocol != value) { ipv4BootProtocol = value; ipv4BootProtocolChanged(); onPropertyChanged(new PropertyChangedEventArgs("Ipv4BootProtocol")); //$NON-NLS-1$ } } public Ipv6BootProtocol getIpv6BootProtocol() { return ipv6BootProtocol; } public void setIpv6BootProtocol(Ipv6BootProtocol value) { if (ipv6BootProtocol != value) { ipv6BootProtocol = value; ipv6BootProtocolChanged(); onPropertyChanged(new PropertyChangedEventArgs("Ipv6BootProtocol")); //$NON-NLS-1$ } } public boolean getBootProtocolsAvailable() { return bootProtocolsAvailable; } public void setBootProtocolsAvailable(boolean value) { if (bootProtocolsAvailable != value) { bootProtocolsAvailable = value; updateCanSpecifyIpv4(); updateCanSpecifyIpv6(); onPropertyChanged(new PropertyChangedEventArgs("BootProtocolsAvailable")); //$NON-NLS-1$ } } public boolean getIsStaticIpv4Address() { return getIpv4BootProtocol() == Ipv4BootProtocol.STATIC_IP; } public boolean getIsStaticIpv6Address() { return getIpv6BootProtocol() == Ipv6BootProtocol.STATIC_IP; } public EntityModel<Boolean> getIsToSync() { return isToSync; } public void setIsToSync(EntityModel<Boolean> isToSync) { this.isToSync = isToSync; } public EntityModel<Boolean> getQosOverridden() { return qosOverridden; } public void setQosOverridden(EntityModel<Boolean> qosOverridden) { this.qosOverridden = qosOverridden; } public HostNetworkQosParametersModel getQosModel() { return qosModel; } private void setQosModel(HostNetworkQosParametersModel qosModel) { this.qosModel = qosModel; } public KeyValueModel getCustomPropertiesModel() { return customPropertiesModel; } private void setCustomPropertiesModel(KeyValueModel customProperties) { this.customPropertiesModel = customProperties; } @Override public void eventRaised(Event ev, Object sender, EventArgs args) { super.eventRaised(ev, sender, args); if (sender == getQosOverridden()) { qosOverriddenChanged(); } if (sender == getIsToSync()) { isToSyncChanged(); } } private void qosOverriddenChanged() { if (getQosOverridden().getIsChangable()) { updateQosChangeability(); if (!getQosOverridden().getEntity()) { getQosModel().init(networkQos); } } } private void updateQosChangeability() { getQosModel().setIsChangeable(getQosOverridden().getIsAvailable() && getQosOverridden().getIsChangable() && Boolean.TRUE.equals(getQosOverridden().getEntity())); } private void initValues() { if (networkAttachment == null) { return; } boolean newAttachment = networkAttachment.getId() == null; // If the 'ReportedConfigurations' of the attachment is 'null' it means the attachment wasn't reported from the // engine (all the attachments reported from the engine have // 'ReportedConfigurations'). So it means this network is for sure in sync, since the ui already modified it and // created new instance of the attachment for it (an out-of-sync network cannot be modified). boolean attachmentNotReportedByTheEngine = networkAttachment.getReportedConfigurations() == null; boolean syncedNetwork = attachmentNotReportedByTheEngine || networkAttachment.getReportedConfigurations().isNetworkInSync(); boolean syncRequestedByUser = !syncedNetwork && Boolean.TRUE.equals(getIsToSync().getEntity()); if (newAttachment || syncedNetwork || syncRequestedByUser) { syncWith(new InterfacePropertiesAccessor.FromNetworkAttachmentForModel(networkAttachment, networkQos, nic)); } else { syncWith(new InterfacePropertiesAccessor.FromNic(nic)); } } private void ipv4BootProtocolChanged() { updateCanSpecifyIpv4(); getIpv4Address().setIsValid(true); getIpv4Subnet().setIsValid(true); getIpv4Gateway().setIsValid(true); } private void ipv6BootProtocolChanged() { updateCanSpecifyIpv6(); getIpv6Address().setIsValid(true); getIpv6Prefix().setIsValid(true); getIpv6Gateway().setIsValid(true); } private void updateCanSpecifyIpv4() { boolean isChangeable = bootProtocolsAvailable && getIsStaticIpv4Address(); getIpv4Address().setIsChangeable(isChangeable); getIpv4Subnet().setIsChangeable(isChangeable); getIpv4Gateway().setIsChangeable(isChangeable); } private void updateCanSpecifyIpv6() { boolean isChangeable = bootProtocolsAvailable && getIsStaticIpv6Address(); getIpv6Address().setIsChangeable(isChangeable); getIpv6Prefix().setIsChangeable(isChangeable); getIpv6Gateway().setIsChangeable(isChangeable); } public boolean validate() { getIpv4Address().setIsValid(true); getIpv4Subnet().setIsValid(true); getIpv4Gateway().setIsValid(true); if (getIsStaticIpv4Address()) { getIpv4Address().validateEntity(new IValidation[] { new NotEmptyValidation(), new Ipv4AddressValidation() }); getIpv4Subnet().validateEntity(new IValidation[] { new NotEmptyValidation(), new SubnetMaskValidation(true) }); getIpv4Gateway().validateEntity(new IValidation[] { new Ipv4AddressValidation(true) }); } getIpv6Address().setIsValid(true); getIpv6Prefix().setIsValid(true); getIpv6Gateway().setIsValid(true); if (getIsStaticIpv6Address()) { getIpv6Address().validateEntity(new IValidation[] { new NotEmptyValidation(), new Ipv6AddressValidation() }); getIpv6Prefix() .validateEntity(new IValidation[] { new NotEmptyValidation(), new IntegerValidation(0, 128) }); getIpv6Gateway().validateEntity(new IValidation[] { new Ipv6AddressValidation(true) }); } getQosModel().validate(); getCustomPropertiesModel().validate(); setValidTab(TabName.IPV4_TAB, getIpv4Address().getIsValid() && getIpv4Gateway().getIsValid() && getIpv4Subnet().getIsValid()); setValidTab(TabName.IPV6_TAB, getIpv6Address().getIsValid() && getIpv6Gateway().getIsValid() && getIpv6Prefix().getIsValid()); setValidTab(TabName.QOS_TAB, getQosModel().getIsValid()); setValidTab(TabName.CUSTOM_PROPERTIES_TAB, getCustomPropertiesModel().getIsValid()); return allTabsValid(); } private void isToSyncChanged() { // The widget has to be available in order to update its values setBootProtocolsAvailable(true); initValues(); Boolean isEditingEnabled = !getIsToSync().getIsChangable() || getIsToSync().getEntity(); setBootProtocolsAvailable(isEditingEnabled); getQosOverridden().setIsChangeable(isEditingEnabled); updateQosChangeability(); getCustomPropertiesModel().setIsChangeable(isEditingEnabled); } public Network getNetwork() { return network; } protected Model setTitle() { return setTitle(ConstantsManager.getInstance() .getMessages() .editNetworkTitle(network.getName())); } }