@@ -1751,36 +1751,12 @@ public UserVm updateNicIpForVirtualMachine(UpdateVmNicIpCmd cmd) {
17511751 throw new InvalidParameterValueException ("Allocating ip to guest nic " + nicVO .getUuid () + " failed, please choose another ip" );
17521752 }
17531753
1754- if (_networkModel .areServicesSupportedInNetwork (network .getId (), Service .StaticNat )) {
1755- List <IPAddressVO > publicIps = _ipAddressDao .listByAssociatedVmId (vm .getId ());
1756- for (IPAddressVO publicIp : publicIps ) {
1757- if (nicVO .getIPv4Address ().equals (publicIp .getVmIp () ) && publicIp .getAssociatedWithNetworkId () == network .getId ()) {
1758- publicIp .setVmIp (ipaddr );
1759- _ipAddressDao .persist (publicIp );
1760- }
1761- }
1762- }
1763- if (_networkModel .areServicesSupportedInNetwork (network .getId (), Service .Lb )) {
1764- List <LoadBalancerVMMapVO > loadBalancerVMMaps = _loadBalancerVMMapDao .listByInstanceId (vm .getId ());
1765- for (LoadBalancerVMMapVO map : loadBalancerVMMaps ) {
1766- long lbId = map .getLoadBalancerId ();
1767- FirewallRuleVO rule = _rulesDao .findById (lbId );
1768- if (nicVO .getIPv4Address ().equals (map .getInstanceIp ()) && network .getId () == rule .getNetworkId ()) {
1769- map .setInstanceIp (ipaddr );
1770- _loadBalancerVMMapDao .persist (map );
1771- }
1772- }
1773- }
1774- if (_networkModel .areServicesSupportedInNetwork (network .getId (), Service .PortForwarding )) {
1775- List <PortForwardingRuleVO > firewallRules = _portForwardingDao .listByVm (vm .getId ());
1776- for (PortForwardingRuleVO firewallRule : firewallRules ) {
1777- FirewallRuleVO rule = _rulesDao .findById (firewallRule .getId ());
1778- if (nicVO .getIPv4Address ().equals (firewallRule .getDestinationIpAddress ().toString ()) && network .getId () == rule .getNetworkId ()) {
1779- firewallRule .setDestinationIpAddress (new Ip (ipaddr ));
1780- _portForwardingDao .persist (firewallRule );
1781- }
1782- }
1754+ if (nicVO .getIPv4Address () != null ) {
1755+ updatePublicIpDnatVmIp (vm .getId (), network .getId (), nicVO .getIPv4Address (), ipaddr );
1756+ updateLoadBalancerRulesVmIp (vm .getId (), network .getId (), nicVO .getIPv4Address (), ipaddr );
1757+ updatePortForwardingRulesVmIp (vm .getId (), network .getId (), nicVO .getIPv4Address (), ipaddr );
17831758 }
1759+
17841760 } else if (dc .getNetworkType () == NetworkType .Basic || network .getGuestType () == Network .GuestType .Shared ) {
17851761 //handle the basic networks here
17861762 //for basic zone, need to provide the podId to ensure proper ip alloation
@@ -1828,6 +1804,45 @@ public void doInTransactionWithoutResult(TransactionStatus status) {
18281804 return vm ;
18291805 }
18301806
1807+ private void updatePublicIpDnatVmIp (long vmId , long networkId , String oldIp , String newIp ) {
1808+ if (_networkModel .areServicesSupportedInNetwork (networkId , Service .StaticNat )) {
1809+ List <IPAddressVO > publicIps = _ipAddressDao .listByAssociatedVmId (vmId );
1810+ for (IPAddressVO publicIp : publicIps ) {
1811+ if (oldIp .equals (publicIp .getVmIp ()) && publicIp .getAssociatedWithNetworkId () == networkId ) {
1812+ publicIp .setVmIp (newIp );
1813+ _ipAddressDao .persist (publicIp );
1814+ }
1815+ }
1816+ }
1817+ }
1818+
1819+ private void updateLoadBalancerRulesVmIp (long vmId , long networkId , String oldIp , String newIp ) {
1820+ if (_networkModel .areServicesSupportedInNetwork (networkId , Service .Lb )) {
1821+ List <LoadBalancerVMMapVO > loadBalancerVMMaps = _loadBalancerVMMapDao .listByInstanceId (vmId );
1822+ for (LoadBalancerVMMapVO map : loadBalancerVMMaps ) {
1823+ long lbId = map .getLoadBalancerId ();
1824+ FirewallRuleVO rule = _rulesDao .findById (lbId );
1825+ if (oldIp .equals (map .getInstanceIp ()) && networkId == rule .getNetworkId ()) {
1826+ map .setInstanceIp (newIp );
1827+ _loadBalancerVMMapDao .persist (map );
1828+ }
1829+ }
1830+ }
1831+ }
1832+
1833+ private void updatePortForwardingRulesVmIp (long vmId , long networkId , String oldIp , String newIp ) {
1834+ if (_networkModel .areServicesSupportedInNetwork (networkId , Service .PortForwarding )) {
1835+ List <PortForwardingRuleVO > firewallRules = _portForwardingDao .listByVm (vmId );
1836+ for (PortForwardingRuleVO firewallRule : firewallRules ) {
1837+ FirewallRuleVO rule = _rulesDao .findById (firewallRule .getId ());
1838+ if (oldIp .equals (firewallRule .getDestinationIpAddress ().toString ()) && networkId == rule .getNetworkId ()) {
1839+ firewallRule .setDestinationIpAddress (new Ip (newIp ));
1840+ _portForwardingDao .persist (firewallRule );
1841+ }
1842+ }
1843+ }
1844+ }
1845+
18311846 @ Override
18321847 @ ActionEvent (eventType = EventTypes .EVENT_VM_UPGRADE , eventDescription = "Upgrading VM" , async = true )
18331848 public UserVm upgradeVirtualMachine (ScaleVMCmd cmd ) throws ResourceUnavailableException , ConcurrentOperationException , ManagementServerException ,
0 commit comments