Hi David,

The test cases for this feature are added in the AddIpToVmNicTest.java file.
In review board after your comments uploaded a new patch (r2) with the test 
cases added.
Please let me know If I miss any thing.

Thanks,
Jayapal


> -----Original Message-----
> From: David Nalley [mailto:da...@gnsa.us]
> Sent: Monday, March 04, 2013 11:11 AM
> To: cloudstack-dev@incubator.apache.org
> Cc: cloudstack-comm...@incubator.apache.org
> Subject: Re: [1/2] CLOUDSTACK-24: mipn feature for isolated and vpc
> networks
>
> Abhi, Jayapal:
>
> Where are tests for this feature?
> I asked about the tests on February 10 on the review itself, Chip asked about
> tests on Feb 11th on the review as well. The patch has subsequently had
> three revisions, yet nary a response to either my Chip's questions or adding
> tests to the patch itself.
> Why was this committed sans tests?
>
> --David
>
> On Mon, Mar 4, 2013 at 12:32 AM,  <aprat...@apache.org> wrote:
> > http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/aedb8
> > c47/server/src/com/cloud/network/rules/RulesManagerImpl.java
> > ----------------------------------------------------------------------
> > diff --git a/server/src/com/cloud/network/rules/RulesManagerImpl.java
> > b/server/src/com/cloud/network/rules/RulesManagerImpl.java
> > index 614d308..29ed5f3 100755
> > --- a/server/src/com/cloud/network/rules/RulesManagerImpl.java
> > +++ b/server/src/com/cloud/network/rules/RulesManagerImpl.java
> > @@ -78,10 +78,13 @@ import com.cloud.utils.db.Transaction;  import
> > com.cloud.utils.exception.CloudRuntimeException;
> >  import com.cloud.utils.net.Ip;
> >  import com.cloud.vm.Nic;
> > +import com.cloud.vm.NicSecondaryIp;
> >  import com.cloud.vm.UserVmVO;
> >  import com.cloud.vm.VirtualMachine;
> >  import com.cloud.vm.VirtualMachine.Type;  import
> > com.cloud.vm.dao.NicDao;
> > +import com.cloud.vm.dao.NicSecondaryIpDao;
> > +import com.cloud.vm.dao.NicSecondaryIpVO;
> >  import com.cloud.vm.dao.UserVmDao;
> >
> >  @Component
> > @@ -123,6 +126,8 @@ public class RulesManagerImpl extends
> ManagerBase implements RulesManager, Rules
> >      ResourceTagDao _resourceTagDao;
> >      @Inject
> >      VpcManager _vpcMgr;
> > +    @Inject
> > +    NicSecondaryIpDao _nicSecondaryDao;
> >
> >      @Override
> >      public void checkIpAndUserVm(IpAddress ipAddress, UserVm userVm,
> > Account caller) { @@ -172,7 +177,7 @@ public class RulesManagerImpl
> extends ManagerBase implements RulesManager, Rules
> >      @Override
> >      @DB
> >      @ActionEvent(eventType = EventTypes.EVENT_NET_RULE_ADD,
> eventDescription = "creating forwarding rule", create = true)
> > -    public PortForwardingRule
> createPortForwardingRule(PortForwardingRule rule, Long vmId, boolean
> openFirewall)
> > +    public PortForwardingRule
> > + createPortForwardingRule(PortForwardingRule rule, Long vmId, Ip
> > + vmIp, boolean openFirewall)
> >              throws NetworkRuleConflictException {
> >          UserContext ctx = UserContext.current();
> >          Account caller = ctx.getCaller(); @@ -192,6 +197,7 @@ public
> > class RulesManagerImpl extends ManagerBase implements RulesManager,
> Rules
> >          Network network = _networkModel.getNetwork(networkId);
> >          //associate ip address to network (if needed)
> >          boolean performedIpAssoc = false;
> > +        Nic guestNic;
> >          if (ipAddress.getAssociatedWithNetworkId() == null) {
> >              boolean assignToVpcNtwk =  network.getVpcId() != null
> >                      && ipAddress.getVpcId() != null &&
> > ipAddress.getVpcId().longValue() == network.getVpcId(); @@ -244,13
> > +250,26 @@ public class RulesManagerImpl extends ManagerBase
> > implements RulesManager, Rules
> >
> >              // Verify that vm has nic in the network
> >              Ip dstIp = rule.getDestinationIpAddress();
> > -            Nic guestNic = _networkModel.getNicInNetwork(vmId, networkId);
> > +            guestNic = _networkModel.getNicInNetwork(vmId,
> > + networkId);
> >              if (guestNic == null || guestNic.getIp4Address() == null) {
> >                  throw new InvalidParameterValueException("Vm doesn't belong
> to network associated with ipAddress");
> >              } else {
> >                  dstIp = new Ip(guestNic.getIp4Address());
> >              }
> >
> > +            if (vmIp != null) {
> > +                //vm ip is passed so it can be primary or secondary ip 
> > addreess.
> > +                if (!dstIp.equals(vmIp)) {
> > +                    //the vm ip is secondary ip to the nic.
> > +                    // is vmIp is secondary ip or not
> > +                    NicSecondaryIp secondaryIp =
> _nicSecondaryDao.findByIp4AddressAndNicId(vmIp.toString(),
> guestNic.getId());
> > +                    if (secondaryIp == null) {
> > +                        throw new InvalidParameterValueException("IP 
> > Address is
> not in the VM nic's network ");
> > +                    }
> > +                    dstIp = vmIp;
> > +                }
> > +            }
> > +
> >              //if start port and end port are passed in, and they are not 
> > equal to
> each other, perform the validation
> >              boolean validatePortRange = false;
> >              if (rule.getSourcePortStart().intValue() !=
> > rule.getSourcePortEnd().intValue()
> > @@ -350,8 +369,8 @@ public class RulesManagerImpl extends
> ManagerBase implements RulesManager, Rules
> >              throw new InvalidParameterValueException("Can't create ip
> forwarding rules for the network where elasticIP service is enabled");
> >          }
> >
> > -        String dstIp =
> _networkModel.getIpInNetwork(ipAddress.getAssociatedWithVmId(),
> networkId);
> > -
> > +        //String dstIp =
> _networkModel.getIpInNetwork(ipAddress.getAssociatedWithVmId(),
> networkId);
> > +        String dstIp = ipAddress.getVmIp();
> >          Transaction txn = Transaction.currentTxn();
> >          txn.start();
> >
> > @@ -397,14 +416,13 @@ public class RulesManagerImpl extends
> > ManagerBase implements RulesManager, Rules
> >
> >      @Override
> >      @ActionEvent(eventType = EventTypes.EVENT_ENABLE_STATIC_NAT,
> eventDescription = "enabling static nat")
> > -    public boolean enableStaticNat(long ipId, long vmId, long networkId,
> boolean isSystemVm)
> > +    public boolean enableStaticNat(long ipId, long vmId, long
> > + networkId, boolean isSystemVm, String vmGuestIp)
> >              throws NetworkRuleConflictException,
> ResourceUnavailableException {
> >          UserContext ctx = UserContext.current();
> >          Account caller = ctx.getCaller();
> >          UserContext.current().setEventDetails("Ip Id: " + ipId);
> >
> >          // Verify input parameters
> > -
> >          IPAddressVO ipAddress = _ipAddressDao.findById(ipId);
> >          if (ipAddress == null) {
> >              throw new InvalidParameterValueException("Unable to find
> > ip address by id " + ipId); @@ -414,6 +432,10 @@ public class
> RulesManagerImpl extends ManagerBase implements RulesManager, Rules
> >          boolean performedIpAssoc = false;
> >          boolean isOneToOneNat = ipAddress.isOneToOneNat();
> >          Long associatedWithVmId = ipAddress.getAssociatedWithVmId();
> > +        Nic guestNic;
> > +        NicSecondaryIpVO nicSecIp = null;
> > +        String dstIp = null;
> > +
> >          try {
> >              Network network = _networkModel.getNetwork(networkId);
> >              if (network == null) {
> > @@ -421,11 +443,11 @@ public class RulesManagerImpl extends
> ManagerBase implements RulesManager, Rules
> >              }
> >
> >              // Check that vm has a nic in the network
> > -            Nic guestNic = _networkModel.getNicInNetwork(vmId, networkId);
> > +            guestNic = _networkModel.getNicInNetwork(vmId,
> > + networkId);
> >              if (guestNic == null) {
> >                  throw new InvalidParameterValueException("Vm doesn't belong
> to the network with specified id");
> >              }
> > -
> > +            dstIp = guestNic.getIp4Address();
> >
> >              if
> (!_networkModel.areServicesSupportedInNetwork(network.getId(),
> Service.StaticNat)) {
> >                  throw new InvalidParameterValueException("Unable to
> > create static nat rule; StaticNat service is not " + @@ -466,13 +488,36 @@
> public class RulesManagerImpl extends ManagerBase implements
> RulesManager, Rules
> >                  // Check permissions
> >                  checkIpAndUserVm(ipAddress, vm, caller);
> >
> > +                //is static nat is for vm secondary ip
> > +                //dstIp = guestNic.getIp4Address();
> > +                if (vmGuestIp != null) {
> > +                    //dstIp = guestNic.getIp4Address();
> > +
> > +                    if (!dstIp.equals(vmGuestIp)) {
> > +                        //check whether the secondary ip set to the vm or 
> > not
> > +                        boolean secondaryIpSet =
> _networkMgr.isSecondaryIpSetForNic(guestNic.getId());
> > +                        if (!secondaryIpSet) {
> > +                            throw new InvalidParameterValueException("VM 
> > ip " +
> vmGuestIp + " address not belongs to the vm");
> > +                        }
> > +                        //check the ip belongs to the vm or not
> > +                        nicSecIp =
> _nicSecondaryDao.findByIp4AddressAndNicId(vmGuestIp, guestNic.getId());
> > +                        if (nicSecIp == null) {
> > +                            throw new InvalidParameterValueException("VM 
> > ip " +
> vmGuestIp + " address not belongs to the vm");
> > +                        }
> > +                        dstIp = nicSecIp.getIp4Address();
> > +                         // Set public ip column with the vm ip
> > +                    }
> > +                }
> > +
> >                  // Verify ip address parameter
> > -                isIpReadyForStaticNat(vmId, ipAddress, caller,
> ctx.getCallerUserId());
> > +                // checking vm id is not sufficient, check for the vm ip
> > +                isIpReadyForStaticNat(vmId, ipAddress, dstIp, caller,
> > + ctx.getCallerUserId());
> >              }
> >
> >              ipAddress.setOneToOneNat(true);
> >              ipAddress.setAssociatedWithVmId(vmId);
> >
> > +            ipAddress.setVmIp(dstIp);
> >              if (_ipAddressDao.update(ipAddress.getId(), ipAddress)) {
> >                  // enable static nat on the backend
> >                  s_logger.trace("Enabling static nat for ip address "
> > + ipAddress + " and vm id=" + vmId + " on the backend"); @@ -483,6 +528,7
> @@ public class RulesManagerImpl extends ManagerBase implements
> RulesManager, Rules
> >                      s_logger.warn("Failed to enable static nat rule for ip 
> > address " +
> ipId + " on the backend");
> >                      ipAddress.setOneToOneNat(isOneToOneNat);
> >
> > ipAddress.setAssociatedWithVmId(associatedWithVmId);
> > +                    ipAddress.setVmIp(null);
> >                      _ipAddressDao.update(ipAddress.getId(), ipAddress);
> >                  }
> >              } else {
> > @@ -490,16 +536,17 @@ public class RulesManagerImpl extends
> > ManagerBase implements RulesManager, Rules
> >
> >              }
> >          } finally {
> > -            if (performedIpAssoc) {
> > -                //if the rule is the last one for the ip address assigned 
> > to VPC,
> unassign it from the network
> > -                IpAddress ip = _ipAddressDao.findById(ipAddress.getId());
> > -                _vpcMgr.unassignIPFromVpcNetwork(ip.getId(), networkId);
> > +                if (performedIpAssoc) {
> > +                    //if the rule is the last one for the ip address 
> > assigned to VPC,
> unassign it from the network
> > +                    IpAddress ip = 
> > _ipAddressDao.findById(ipAddress.getId());
> > +                    _vpcMgr.unassignIPFromVpcNetwork(ip.getId(),
> > + networkId);
> >              }
> >          }
> >          return false;
> >      }
> >
> > -    protected void isIpReadyForStaticNat(long vmId, IPAddressVO
> ipAddress, Account caller, long callerUserId)
> > +    protected void isIpReadyForStaticNat(long vmId, IPAddressVO
> ipAddress,
> > +            String vmIp, Account caller, long callerUserId)
> >              throws NetworkRuleConflictException,
> ResourceUnavailableException {
> >          if (ipAddress.isSourceNat()) {
> >              throw new InvalidParameterValueException("Can't enable
> > static, ip address " + ipAddress + " is a sourceNat ip address"); @@ -519,7
> +566,8 @@ public class RulesManagerImpl extends ManagerBase
> implements RulesManager, Rules
> >              throw new NetworkRuleConflictException("Failed to enable static
> for the ip address " + ipAddress + " and vm id=" + vmId + " as it's already
> assigned to antoher vm");
> >          }
> >
> > -        IPAddressVO oldIP = _ipAddressDao.findByAssociatedVmId(vmId);
> > +        //check wether the vm ip is alreday associated with any public ip
> address
> > +        IPAddressVO oldIP =
> > + _ipAddressDao.findByAssociatedVmIdAndVmIp(vmId, vmIp);
> >
> >          if (oldIP != null) {
> >              // If elasticIP functionality is supported in the
> > network, we always have to disable static nat on the old @@ -538,9 +586,9
> @@ public class RulesManagerImpl extends ManagerBase implements
> RulesManager, Rules
> >              if (!reassignStaticNat) {
> >                  throw new InvalidParameterValueException("Failed to enable
> static nat for the ip address id=" + ipAddress.getId() + " as vm id=" + vmId 
> + "
> is already associated with ip id=" + oldIP.getId());
> >              }
> > -            // unassign old static nat rule
> > -            s_logger.debug("Disassociating static nat for ip " + oldIP);
> > -            if (!disableStaticNat(oldIP.getId(), caller, callerUserId, 
> > true)) {
> > +        // unassign old static nat rule
> > +        s_logger.debug("Disassociating static nat for ip " + oldIP);
> > +        if (!disableStaticNat(oldIP.getId(), caller, callerUserId,
> > + true)) {
> >                  throw new CloudRuntimeException("Failed to disable old 
> > static nat
> rule for vm id=" + vmId + " and ip " + oldIP);
> >              }
> >          }
> > @@ -890,8 +938,8 @@ public class RulesManagerImpl extends
> ManagerBase implements RulesManager, Rules
> >          List<StaticNat> staticNats = new ArrayList<StaticNat>();
> >          for (IPAddressVO ip : ips) {
> >              // Get nic IP4 address
> > -            String dstIp =
> _networkModel.getIpInNetwork(ip.getAssociatedWithVmId(), networkId);
> > -            StaticNatImpl staticNat = new
> StaticNatImpl(ip.getAllocatedToAccountId(), ip.getAllocatedInDomainId(),
> networkId, ip.getId(), dstIp, false);
> > +            //String dstIp =
> _networkModel.getIpInNetwork(ip.getAssociatedWithVmId(), networkId);
> > +            StaticNatImpl staticNat = new
> > + StaticNatImpl(ip.getAllocatedToAccountId(),
> > + ip.getAllocatedInDomainId(), networkId, ip.getId(), ip.getVmIp(),
> > + false);
> >              staticNats.add(staticNat);
> >          }
> >
> > @@ -1209,6 +1257,7 @@ public class RulesManagerImpl extends
> ManagerBase implements RulesManager, Rules
> >              boolean isIpSystem = ipAddress.getSystem();
> >              ipAddress.setOneToOneNat(false);
> >              ipAddress.setAssociatedWithVmId(null);
> > +            ipAddress.setVmIp(null);
> >              if (isIpSystem && !releaseIpIfElastic) {
> >                  ipAddress.setSystem(false);
> >              }
> > @@ -1248,11 +1297,11 @@ public class RulesManagerImpl extends
> ManagerBase implements RulesManager, Rules
> >              throw ex;
> >          }
> >
> > -        String dstIp;
> > -        if (forRevoke) {
> > -            dstIp =
> _networkModel.getIpInNetworkIncludingRemoved(ip.getAssociatedWithV
> mId(), rule.getNetworkId());
> > -        } else {
> > -            dstIp =
> _networkModel.getIpInNetwork(ip.getAssociatedWithVmId(),
> rule.getNetworkId());
> > +        String dstIp = ip.getVmIp();
> > +        if (dstIp == null) {
> > +            InvalidParameterValueException ex = new
> InvalidParameterValueException("VM ip address of the specified public ip is
> not set ");
> > +            ex.addProxyObject(ruleVO, rule.getId(), "ruleId");
> > +            throw ex;
> >          }
> >
> >          return new StaticNatRuleImpl(ruleVO, dstIp); @@ -1333,12
> > +1382,16 @@ public class RulesManagerImpl extends ManagerBase
> > implements RulesManager, Rules
> >
> >          // create new static nat rule
> >          // Get nic IP4 address
> > +        Nic guestNic = _networkModel.getNicInNetwork(vm.getId(),
> networkId);
> > +        if (guestNic == null) {
> > +            throw new InvalidParameterValueException("Vm doesn't belong to
> the network with specified id");
> > +        }
> >
> >          String dstIp;
> > -        if (forRevoke) {
> > -            dstIp =
> _networkModel.getIpInNetworkIncludingRemoved(sourceIp.getAssociated
> WithVmId(), networkId);
> > -        } else {
> > -            dstIp =
> _networkModel.getIpInNetwork(sourceIp.getAssociatedWithVmId(),
> networkId);
> > +
> > +        dstIp = sourceIp.getVmIp();
> > +        if (dstIp == null) {
> > +            throw new InvalidParameterValueException("Vm ip is not
> > + set as dnat ip for this public ip");
> >          }
> >
> >          StaticNatImpl staticNat = new
> > StaticNatImpl(sourceIp.getAllocatedToAccountId(),
> > sourceIp.getAllocatedInDomainId(),
> > @@ -1373,7 +1426,7 @@ public class RulesManagerImpl extends
> > ManagerBase implements RulesManager, Rules
> >
> >                  boolean isSystemVM = (vm.getType() == Type.ConsoleProxy ||
> vm.getType() == Type.SecondaryStorageVm);
> >                  try {
> > -                    success = enableStaticNat(ip.getId(), vm.getId(),
> guestNetwork.getId(), isSystemVM);
> > +                    success = enableStaticNat(ip.getId(), vm.getId(),
> > + guestNetwork.getId(), isSystemVM, null);
> >                  } catch (NetworkRuleConflictException ex) {
> >                      s_logger.warn("Failed to enable static nat as a part 
> > of enabling
> elasticIp and staticNat for vm " +
> >                              vm + " in guest network " + guestNetwork
> > + " due to exception ", ex);
> >
> > http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/aedb8
> >
> c47/server/src/com/cloud/network/rules/dao/PortForwardingRulesDao.java
> > ----------------------------------------------------------------------
> > diff --git
> > a/server/src/com/cloud/network/rules/dao/PortForwardingRulesDao.java
> > b/server/src/com/cloud/network/rules/dao/PortForwardingRulesDao.java
> > index 91f08e7..682a941 100644
> > ---
> > a/server/src/com/cloud/network/rules/dao/PortForwardingRulesDao.java
> > +++
> b/server/src/com/cloud/network/rules/dao/PortForwardingRulesDao.ja
> > +++ va
> > @@ -41,5 +41,7 @@ public interface PortForwardingRulesDao extends
> GenericDao<PortForwardingRuleVO,
> >      List<PortForwardingRuleVO> listByNetwork(long networkId);
> >
> >      List<PortForwardingRuleVO> listByAccount(long accountId);
> > +
> > +    List<PortForwardingRuleVO> listByDestIpAddr(String ip4Address);
> >
> >  }
> >
> > http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/aedb8
> >
> c47/server/src/com/cloud/network/rules/dao/PortForwardingRulesDaoImpl
> .
> > java
> > ----------------------------------------------------------------------
> > diff --git
> >
> a/server/src/com/cloud/network/rules/dao/PortForwardingRulesDaoImpl.ja
> > va
> >
> b/server/src/com/cloud/network/rules/dao/PortForwardingRulesDaoImpl.ja
> > va
> > index 5406ab6..1d2e991 100644
> > ---
> >
> a/server/src/com/cloud/network/rules/dao/PortForwardingRulesDaoImpl.ja
> > va
> > +++
> b/server/src/com/cloud/network/rules/dao/PortForwardingRulesDaoImp
> > +++ l.java
> > @@ -32,6 +32,7 @@ import com.cloud.utils.db.GenericDaoBase;
> >  import com.cloud.utils.db.SearchBuilder;  import
> > com.cloud.utils.db.SearchCriteria;
> >  import com.cloud.utils.db.SearchCriteria.Op;
> > +import com.cloud.vm.dao.NicSecondaryIpVO;
> >
> >  @Component
> >  @Local(value=PortForwardingRulesDao.class)
> > @@ -55,6 +56,7 @@ public class PortForwardingRulesDaoImpl extends
> GenericDaoBase<PortForwardingRul
> >          AllFieldsSearch.and("networkId",
> AllFieldsSearch.entity().getNetworkId(), Op.EQ);
> >          AllFieldsSearch.and("vmId",
> AllFieldsSearch.entity().getVirtualMachineId(), Op.EQ);
> >          AllFieldsSearch.and("purpose",
> > AllFieldsSearch.entity().getPurpose(), Op.EQ);
> > +        AllFieldsSearch.and("dstIp",
> > + AllFieldsSearch.entity().getDestinationIpAddress(), Op.EQ);
> >          AllFieldsSearch.done();
> >
> >          ApplicationSearch = createSearchBuilder(); @@ -149,5 +151,11
> > @@ public class PortForwardingRulesDaoImpl extends
> > GenericDaoBase<PortForwardingRul
> >
> >          return listBy(sc);
> >      }
> > +    @Override
> > +    public List<PortForwardingRuleVO> listByDestIpAddr(String ip4Address)
> {
> > +        SearchCriteria<PortForwardingRuleVO> sc = AllFieldsSearch.create();
> > +        sc.setParameters("address", ip4Address);
> > +        return listBy(sc);
> > +    }
> >
> >  }
> >
> > http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/aedb8
> > c47/server/src/com/cloud/server/ManagementServerImpl.java
> > ----------------------------------------------------------------------
> > diff --git a/server/src/com/cloud/server/ManagementServerImpl.java
> > b/server/src/com/cloud/server/ManagementServerImpl.java
> > index e80d48c..95b2973 100755
> > --- a/server/src/com/cloud/server/ManagementServerImpl.java
> > +++ b/server/src/com/cloud/server/ManagementServerImpl.java
> > @@ -2165,6 +2165,9 @@ public class ManagementServerImpl extends
> ManagerBase implements ManagementServe
> >          cmdList.add(CreateVMSnapshotCmd.class);
> >          cmdList.add(RevertToSnapshotCmd.class);
> >          cmdList.add(DeleteVMSnapshotCmd.class);
> > +        cmdList.add(AddIpToVmNicCmd.class);
> > +        cmdList.add(RemoveIpFromVmNicCmd.class);
> > +        cmdList.add(ListNicsCmd.class);
> >          return cmdList;
> >      }
> >
> >
> > http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/aedb8
> > c47/server/src/com/cloud/vm/NicVO.java
> > ----------------------------------------------------------------------
> > diff --git a/server/src/com/cloud/vm/NicVO.java
> > b/server/src/com/cloud/vm/NicVO.java
> > index 8e2edda..987596c 100644
> > --- a/server/src/com/cloud/vm/NicVO.java
> > +++ b/server/src/com/cloud/vm/NicVO.java
> > @@ -122,6 +122,9 @@ public class NicVO implements Nic {
> >      @Column(name = "uuid")
> >      String uuid = UUID.randomUUID().toString();
> >
> > +    @Column(name = "secondary_ip")
> > +    boolean secondaryIp;
> > +
> >      public NicVO(String reserver, Long instanceId, long configurationId,
> VirtualMachine.Type vmType) {
> >          this.reserver = reserver;
> >          this.instanceId = instanceId; @@ -349,4 +352,12 @@ public
> > class NicVO implements Nic {
> >         public void setIp6Cidr(String ip6Cidr) {
> >                 this.ip6Cidr = ip6Cidr;
> >         }
> > +
> > +    public boolean getSecondaryIp() {
> > +        return secondaryIp;
> > +    }
> > +
> > +    public void setSecondaryIp(boolean secondaryIp) {
> > +        this.secondaryIp = secondaryIp;
> > +    }
> >  }
> >
> > http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/aedb8
> > c47/server/src/com/cloud/vm/UserVmManagerImpl.java
> > ----------------------------------------------------------------------
> > diff --git a/server/src/com/cloud/vm/UserVmManagerImpl.java
> > b/server/src/com/cloud/vm/UserVmManagerImpl.java
> > index ce53c45..ca9c13f 100755
> > --- a/server/src/com/cloud/vm/UserVmManagerImpl.java
> > +++ b/server/src/com/cloud/vm/UserVmManagerImpl.java
> > @@ -360,6 +360,7 @@ public class UserVmManagerImpl extends
> ManagerBase implements UserVmManager, Use
> >      protected ProjectManager _projectMgr;
> >      @Inject
> >      protected ResourceManager _resourceMgr;
> > +
> >      @Inject
> >      protected NetworkServiceMapDao _ntwkSrvcDao;
> >      @Inject
> > @@ -1359,6 +1360,13 @@ public class UserVmManagerImpl extends
> ManagerBase implements UserVmManager, Use
> >                      + " as a part of vm id=" + vmId
> >                      + " expunge because resource is unavailable", e);
> >          }
> > +        //remove vm secondary ip addresses
> > +        if (_networkMgr.removeVmSecondaryIps(vmId)) {
> > +            s_logger.debug("Removed vm " + vmId + " secondary ip address of
> the VM Nics as a part of expunge process");
> > +        } else {
> > +            success = false;
> > +            s_logger.warn("Fail to remove secondary ip address  of vm " + 
> > vmId
> + " Nics as a part of expunge process");
> > +        }
> >
> >          return success;
> >      }
> >
> > http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/aedb8
> > c47/server/src/com/cloud/vm/dao/NicDao.java
> > ----------------------------------------------------------------------
> > diff --git a/server/src/com/cloud/vm/dao/NicDao.java
> > b/server/src/com/cloud/vm/dao/NicDao.java
> > index 762048b..794bacc 100644
> > --- a/server/src/com/cloud/vm/dao/NicDao.java
> > +++ b/server/src/com/cloud/vm/dao/NicDao.java
> > @@ -58,4 +58,6 @@ public interface NicDao extends GenericDao<NicVO,
> Long> {
> >      NicVO findByNetworkIdInstanceIdAndBroadcastUri(long networkId,
> > long instanceId, String broadcastUri);
> >
> >      NicVO findByIp4AddressAndNetworkIdAndInstanceId(long networkId,
> > long instanceId, String ip4Address);
> > +
> > +    List<NicVO> listByVmIdAndNicId(Long vmId, Long nicId);
> >  }
> >
> > http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/aedb8
> > c47/server/src/com/cloud/vm/dao/NicDaoImpl.java
> > ----------------------------------------------------------------------
> > diff --git a/server/src/com/cloud/vm/dao/NicDaoImpl.java
> > b/server/src/com/cloud/vm/dao/NicDaoImpl.java
> > index 5cf152f..4491174 100644
> > --- a/server/src/com/cloud/vm/dao/NicDaoImpl.java
> > +++ b/server/src/com/cloud/vm/dao/NicDaoImpl.java
> > @@ -53,8 +53,10 @@ public class NicDaoImpl extends
> GenericDaoBase<NicVO, Long> implements NicDao {
> >          AllFieldsSearch.and("address",
> AllFieldsSearch.entity().getIp4Address(), Op.EQ);
> >          AllFieldsSearch.and("isDefault", 
> > AllFieldsSearch.entity().isDefaultNic(),
> Op.EQ);
> >          AllFieldsSearch.and("broadcastUri",
> > AllFieldsSearch.entity().getBroadcastUri(), Op.EQ);
> > +        AllFieldsSearch.and("secondaryip",
> AllFieldsSearch.entity().getSecondaryIp(), Op.EQ);
> > +        AllFieldsSearch.and("nicid",
> > + AllFieldsSearch.entity().getId(), Op.EQ);
> >          AllFieldsSearch.done();
> > -
> > +
> >          IpSearch = createSearchBuilder(String.class);
> >          IpSearch.select(null, Func.DISTINCT,
> IpSearch.entity().getIp4Address());
> >          IpSearch.and("network", IpSearch.entity().getNetworkId(),
> > Op.EQ); @@ -202,4 +204,12 @@ public class NicDaoImpl extends
> GenericDaoBase<NicVO, Long> implements NicDao {
> >          sc.setParameters("address", ip4Address);
> >          return findOneBy(sc);
> >      }
> > +
> > +    @Override
> > +    public List<NicVO> listByVmIdAndNicId(Long vmId, Long nicId) {
> > +        SearchCriteria<NicVO> sc = AllFieldsSearch.create();
> > +        sc.setParameters("instance", vmId);
> > +        sc.setParameters("nicid", nicId);
> > +        return listBy(sc);
> > +    }
> >  }
> >
> > http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/aedb8
> > c47/server/src/com/cloud/vm/dao/NicSecondaryIpDao.java
> > ----------------------------------------------------------------------
> > diff --git a/server/src/com/cloud/vm/dao/NicSecondaryIpDao.java
> > b/server/src/com/cloud/vm/dao/NicSecondaryIpDao.java
> > new file mode 100644
> > index 0000000..da96df4
> > --- /dev/null
> > +++ b/server/src/com/cloud/vm/dao/NicSecondaryIpDao.java
> > @@ -0,0 +1,53 @@
> > +// Licensed to the Apache Software Foundation (ASF) under one // or
> > +more contributor license agreements.  See the NOTICE file //
> > +distributed with this work for additional information // regarding
> > +copyright ownership.  The ASF licenses this file // to you under the
> > +Apache License, Version 2.0 (the // "License"); you may not use this
> > +file except in compliance // with the License.  You may obtain a copy
> > +of the License at //
> > +//   http://www.apache.org/licenses/LICENSE-2.0
> > +//
> > +// Unless required by applicable law or agreed to in writing, //
> > +software distributed under the License is distributed on an // "AS
> > +IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY // KIND,
> either
> > +express or implied.  See the License for the // specific language
> > +governing permissions and limitations // under the License.
> > +package com.cloud.vm.dao;
> > +
> > +import java.util.List;
> > +import com.cloud.utils.db.GenericDao;
> > +
> > +public interface NicSecondaryIpDao extends
> GenericDao<NicSecondaryIpVO, Long> {
> > +    List<NicSecondaryIpVO> listByVmId(long instanceId);
> > +
> > +    List<String> listSecondaryIpAddressInNetwork(long networkConfigId);
> > +    List<NicSecondaryIpVO> listByNetworkId(long networkId);
> > +
> > +    NicSecondaryIpVO findByInstanceIdAndNetworkId(long networkId,
> > + long instanceId);
> > +
> > +    //    void removeNicsForInstance(long instanceId);
> > +    //    void removeSecondaryIpForNic(long nicId);
> > +
> > +    NicSecondaryIpVO findByIp4AddressAndNetworkId(String ip4Address,
> > + long networkId);
> > +
> > +    /**
> > +     * @param networkId
> > +     * @param instanceId
> > +     * @return
> > +     */
> > +
> > +    List<NicSecondaryIpVO> getSecondaryIpAddressesForVm(long vmId);
> > +
> > +    List<NicSecondaryIpVO> listByNicId(long nicId);
> > +
> > +    List<NicSecondaryIpVO> listByNicIdAndVmid(long nicId, long vmId);
> > +
> > +    NicSecondaryIpVO findByIp4AddressAndNicId(String ip4Address, long
> > + nicId);
> > +
> > +    NicSecondaryIpVO findByIp4AddressAndNetworkIdAndInstanceId(long
> networkId,
> > +            Long vmId, String vmIp);
> > +
> > +    List<String> getSecondaryIpAddressesForNic(long nicId); }
> >
> > http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/aedb8
> > c47/server/src/com/cloud/vm/dao/NicSecondaryIpDaoImpl.java
> > ----------------------------------------------------------------------
> > diff --git a/server/src/com/cloud/vm/dao/NicSecondaryIpDaoImpl.java
> > b/server/src/com/cloud/vm/dao/NicSecondaryIpDaoImpl.java
> > new file mode 100644
> > index 0000000..3befaf7
> > --- /dev/null
> > +++ b/server/src/com/cloud/vm/dao/NicSecondaryIpDaoImpl.java
> > @@ -0,0 +1,138 @@
> > +// Licensed to the Apache Software Foundation (ASF) under one // or
> > +more contributor license agreements.  See the NOTICE file //
> > +distributed with this work for additional information // regarding
> > +copyright ownership.  The ASF licenses this file // to you under the
> > +Apache License, Version 2.0 (the // "License"); you may not use this
> > +file except in compliance // with the License.  You may obtain a copy
> > +of the License at //
> > +//   http://www.apache.org/licenses/LICENSE-2.0
> > +//
> > +// Unless required by applicable law or agreed to in writing, //
> > +software distributed under the License is distributed on an // "AS
> > +IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY // KIND,
> either
> > +express or implied.  See the License for the // specific language
> > +governing permissions and limitations // under the License.
> > +package com.cloud.vm.dao;
> > +
> > +import java.util.ArrayList;
> > +import java.util.List;
> > +
> > +import javax.ejb.Local;
> > +
> > +import org.springframework.stereotype.Component;
> > +
> > +import com.cloud.utils.db.GenericDaoBase;
> > +import com.cloud.utils.db.GenericSearchBuilder;
> > +import com.cloud.utils.db.SearchBuilder; import
> > +com.cloud.utils.db.SearchCriteria;
> > +import com.cloud.utils.db.SearchCriteria.Func;
> > +import com.cloud.utils.db.SearchCriteria.Op;
> > +
> > +@Component
> > +@Local(value=NicSecondaryIpDao.class)
> > +public class NicSecondaryIpDaoImpl extends
> GenericDaoBase<NicSecondaryIpVO, Long> implements NicSecondaryIpDao
> {
> > +    private final SearchBuilder<NicSecondaryIpVO> AllFieldsSearch;
> > +    private final GenericSearchBuilder<NicSecondaryIpVO, String>
> > +IpSearch;
> > +
> > +    protected NicSecondaryIpDaoImpl() {
> > +        super();
> > +        AllFieldsSearch = createSearchBuilder();
> > +        AllFieldsSearch.and("instanceId", 
> > AllFieldsSearch.entity().getVmId(),
> Op.EQ);
> > +        AllFieldsSearch.and("network",
> AllFieldsSearch.entity().getNetworkId(), Op.EQ);
> > +        AllFieldsSearch.and("address",
> AllFieldsSearch.entity().getIp4Address(), Op.EQ);
> > +        AllFieldsSearch.and("nicId", AllFieldsSearch.entity().getNicId(),
> Op.EQ);
> > +        AllFieldsSearch.done();
> > +
> > +        IpSearch = createSearchBuilder(String.class);
> > +        IpSearch.select(null, Func.DISTINCT,
> IpSearch.entity().getIp4Address());
> > +        IpSearch.and("network", IpSearch.entity().getNetworkId(), Op.EQ);
> > +        IpSearch.and("address", IpSearch.entity().getIp4Address(),
> Op.NNULL);
> > +        IpSearch.done();
> > +    }
> > +
> > +    @Override
> > +    public List<NicSecondaryIpVO> listByVmId(long instanceId) {
> > +        SearchCriteria<NicSecondaryIpVO> sc = AllFieldsSearch.create();
> > +        sc.setParameters("instanceId", instanceId);
> > +        return listBy(sc);
> > +    }
> > +
> > +    @Override
> > +    public List<NicSecondaryIpVO> listByNicId(long nicId) {
> > +        SearchCriteria<NicSecondaryIpVO> sc = AllFieldsSearch.create();
> > +        sc.setParameters("nicId", nicId);
> > +        return listBy(sc);
> > +    }
> > +
> > +    @Override
> > +    public List<String> listSecondaryIpAddressInNetwork(long networkId) {
> > +        SearchCriteria<String> sc = IpSearch.create();
> > +        sc.setParameters("network", networkId);
> > +        return customSearch(sc, null);
> > +    }
> > +
> > +    @Override
> > +    public List<NicSecondaryIpVO> listByNetworkId(long networkId) {
> > +        SearchCriteria<NicSecondaryIpVO> sc = AllFieldsSearch.create();
> > +        sc.setParameters("network", networkId);
> > +        return listBy(sc);
> > +    }
> > +
> > +    @Override
> > +    public List<NicSecondaryIpVO> listByNicIdAndVmid(long nicId, long
> vmId) {
> > +        SearchCriteria<NicSecondaryIpVO> sc = AllFieldsSearch.create();
> > +        sc.setParameters("nicId", nicId);
> > +        sc.setParameters("instanceId", vmId);
> > +        return listBy(sc);
> > +    }
> > +
> > +    @Override
> > +    public List<NicSecondaryIpVO> getSecondaryIpAddressesForVm(long
> vmId) {
> > +        SearchCriteria<NicSecondaryIpVO> sc = AllFieldsSearch.create();
> > +        sc.setParameters("instanceId", vmId);
> > +        return listBy(sc);
> > +    }
> > +
> > +    @Override
> > +    public List<String> getSecondaryIpAddressesForNic(long nicId) {
> > +        SearchCriteria<NicSecondaryIpVO> sc = AllFieldsSearch.create();
> > +        sc.setParameters("nicId", nicId);
> > +        List<NicSecondaryIpVO> results = search(sc, null);
> > +        List<String> ips = new ArrayList<String>(results.size());
> > +        for (NicSecondaryIpVO result : results) {
> > +            ips.add(result.getIp4Address());
> > +        }
> > +        return ips;
> > +    }
> > +
> > +    @Override
> > +    public NicSecondaryIpVO findByInstanceIdAndNetworkId(long
> networkId, long instanceId) {
> > +        // TODO Auto-generated method stub
> > +        return null;
> > +    }
> > +
> > +    @Override
> > +    public NicSecondaryIpVO findByIp4AddressAndNetworkId(String
> ip4Address, long networkId) {
> > +        // TODO Auto-generated method stub
> > +        return null;
> > +    }
> > +    @Override
> > +    public NicSecondaryIpVO findByIp4AddressAndNicId(String ip4Address,
> long nicId) {
> > +        SearchCriteria<NicSecondaryIpVO> sc = AllFieldsSearch.create();
> > +        sc.setParameters("address", ip4Address);
> > +        sc.setParameters("nicId", nicId);
> > +        return findOneBy(sc);
> > +    }
> > +
> > +    @Override
> > +    public NicSecondaryIpVO
> findByIp4AddressAndNetworkIdAndInstanceId(
> > +            long networkId, Long vmId, String vmIp) {
> > +        SearchCriteria<NicSecondaryIpVO> sc = AllFieldsSearch.create();
> > +        sc.setParameters("network", networkId);
> > +        sc.setParameters("instanceId", vmId);
> > +        sc.setParameters("address", vmIp);
> > +        return findOneBy(sc);
> > +    }
> > +}
> >
> > http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/aedb8
> > c47/server/src/com/cloud/vm/dao/NicSecondaryIpVO.java
> > ----------------------------------------------------------------------
> > diff --git a/server/src/com/cloud/vm/dao/NicSecondaryIpVO.java
> > b/server/src/com/cloud/vm/dao/NicSecondaryIpVO.java
> > new file mode 100644
> > index 0000000..770e188
> > --- /dev/null
> > +++ b/server/src/com/cloud/vm/dao/NicSecondaryIpVO.java
> > @@ -0,0 +1,160 @@
> > +// Licensed to the Apache Software Foundation (ASF) under one // or
> > +more contributor license agreements.  See the NOTICE file //
> > +distributed with this work for additional information // regarding
> > +copyright ownership.  The ASF licenses this file // to you under the
> > +Apache License, Version 2.0 (the // "License"); you may not use this
> > +file except in compliance // with the License.  You may obtain a copy
> > +of the License at //
> > +//   http://www.apache.org/licenses/LICENSE-2.0
> > +//
> > +// Unless required by applicable law or agreed to in writing, //
> > +software distributed under the License is distributed on an // "AS
> > +IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY // KIND,
> either
> > +express or implied.  See the License for the // specific language
> > +governing permissions and limitations // under the License.
> > +package com.cloud.vm.dao;
> > +
> > +import java.util.Date;
> > +import java.util.UUID;
> > +
> > +import javax.persistence.Column;
> > +import javax.persistence.Entity;
> > +import javax.persistence.GeneratedValue; import
> > +javax.persistence.GenerationType;
> > +import javax.persistence.Id;
> > +import javax.persistence.Table;
> > +
> > +import com.cloud.utils.db.GenericDao; import
> > +com.cloud.vm.NicSecondaryIp;
> > +
> > +@Entity
> > +@Table(name = "nic_secondary_ips")
> > +public class NicSecondaryIpVO implements NicSecondaryIp {
> > +
> > +    public NicSecondaryIpVO(Long nicId, String ipaddr, Long vmId,
> > +            Long accountId, Long domainId, Long networkId) {
> > +        this.nicId = nicId;
> > +        this.vmId = vmId;
> > +        this.ip4Address = ipaddr;
> > +        this.accountId = accountId;
> > +        this.domainId = domainId;
> > +        this.networkId = networkId;
> > +    }
> > +
> > +    protected NicSecondaryIpVO() {
> > +    }
> > +
> > +    @Id
> > +    @GeneratedValue(strategy = GenerationType.IDENTITY)
> > +    @Column(name = "id")
> > +    long id;
> > +
> > +    @Column(name = "nicId")
> > +    long nicId;
> > +
> > +    @Column(name="domain_id", updatable=false)
> > +    long domainId;
> > +
> > +    @Column(name="account_id", updatable=false)
> > +    private Long accountId;
> > +
> > +    @Column(name = "ip4_address")
> > +    String ip4Address;
> > +
> > +    @Column(name = "ip6_address")
> > +    String ip6Address;
> > +
> > +    @Column(name = "network_id")
> > +    long networkId;
> > +
> > +    @Column(name = GenericDao.CREATED_COLUMN)
> > +    Date created;
> > +
> > +    @Column(name = "uuid")
> > +    String uuid = UUID.randomUUID().toString();
> > +
> > +    @Column(name = "vmId")
> > +    Long vmId;
> > +
> > +    public long getId() {
> > +        return id;
> > +    }
> > +
> > +    public void setId(long id) {
> > +        this.id = id;
> > +    }
> > +
> > +    public long getNicId() {
> > +        return nicId;
> > +    }
> > +
> > +    public void setNicId(long nicId) {
> > +        this.nicId = nicId;
> > +    }
> > +
> > +    public long getDomainId() {
> > +        return domainId;
> > +    }
> > +
> > +    public void setDomainId(Long domainId) {
> > +        this.domainId = domainId;
> > +    }
> > +
> > +    public long getAccountId() {
> > +        return accountId;
> > +    }
> > +
> > +    public void setAccountId(Long accountId) {
> > +        this.accountId = accountId;
> > +    }
> > +
> > +    public String getIp4Address() {
> > +        return ip4Address;
> > +    }
> > +
> > +    public void setIp4Address(String ip4Address) {
> > +        this.ip4Address = ip4Address;
> > +    }
> > +
> > +    public String getIp6Address() {
> > +        return ip6Address;
> > +    }
> > +
> > +    public void setIp6Address(String ip6Address) {
> > +        this.ip6Address = ip6Address;
> > +    }
> > +
> > +    public long getNetworkId() {
> > +        return networkId;
> > +    }
> > +
> > +    public void setNetworkId(long networkId) {
> > +        this.networkId = networkId;
> > +    }
> > +
> > +    public Date getCreated() {
> > +        return created;
> > +    }
> > +
> > +    public void setCreated(Date created) {
> > +        this.created = created;
> > +    }
> > +
> > +    public String getUuid() {
> > +        return uuid;
> > +    }
> > +
> > +    public void setUuid(String uuid) {
> > +        this.uuid = uuid;
> > +    }
> > +
> > +    public long getVmId() {
> > +        return vmId;
> > +    }
> > +
> > +    public void setVmId(Long vmId) {
> > +        this.vmId = vmId;
> > +    }
> > +}
> >
> > http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/aedb8
> > c47/server/test/com/cloud/network/MockNetworkManagerImpl.java
> > ----------------------------------------------------------------------
> > diff --git
> a/server/test/com/cloud/network/MockNetworkManagerImpl.java
> > b/server/test/com/cloud/network/MockNetworkManagerImpl.java
> > index 3568da5..8004310 100755
> > --- a/server/test/com/cloud/network/MockNetworkManagerImpl.java
> > +++ b/server/test/com/cloud/network/MockNetworkManagerImpl.java
> > @@ -29,6 +29,7 @@ import
> > org.apache.cloudstack.api.command.user.network.CreateNetworkCmd;
> >  import
> > org.apache.cloudstack.api.command.user.network.ListNetworksCmd;
> >  import
> > org.apache.cloudstack.api.command.user.network.RestartNetworkCmd;
> >  import org.springframework.stereotype.Component;
> > +import org.apache.cloudstack.api.command.user.vm.ListNicsCmd;
> >
> >  import com.cloud.dc.DataCenter;
> >  import com.cloud.dc.Vlan.VlanType;
> > @@ -64,6 +65,7 @@ import com.cloud.utils.component.Manager;
> >  import com.cloud.utils.component.ManagerBase;
> >  import com.cloud.vm.Nic;
> >  import com.cloud.vm.NicProfile;
> > +import com.cloud.vm.NicSecondaryIp;
> >  import com.cloud.vm.ReservationContext;  import
> > com.cloud.vm.VMInstanceVO;  import com.cloud.vm.VirtualMachine; @@
> > -824,4 +826,49 @@ public class MockNetworkManagerImpl extends
> ManagerBase implements NetworkManage
> >          // TODO Auto-generated method stub
> >          return null;
> >      }
> > +
> > +    @Override
> > +    public boolean isSecondaryIpSetForNic(long nicId) {
> > +        // TODO Auto-generated method stub
> > +        return false;
> > +    }
> > +
> > +    @Override
> > +    public boolean releaseSecondaryIpFromNic(long ipAddressId) {
> > +        // TODO Auto-generated method stub
> > +        return false;
> > +    }
> > +
> > +    @Override
> > +    public String allocateSecondaryGuestIP(Account account, long zoneId,
> > +            Long nicId, Long networkId, String ipaddress) {
> > +        // TODO Auto-generated method stub
> > +        return null;
> > +    }
> > +
> > +    @Override
> > +    public String allocateGuestIP(Account ipOwner, boolean isSystem,
> > +            long zoneId, Long networkId, String requestedIp)
> > +            throws InsufficientAddressCapacityException {
> > +        // TODO Auto-generated method stub
> > +        return null;
> > +    }
> > +
> > +    @Override
> > +    public boolean removeVmSecondaryIps(long vmId) {
> > +        // TODO Auto-generated method stub
> > +        return false;
> > +    }
> > +
> > +    @Override
> > +    public List<? extends Nic> listVmNics(Long vmId, Long nicId) {
> > +        // TODO Auto-generated method stub
> > +        return null;
> > +    }
> > +
> > +    @Override
> > +    public List<? extends Nic> listNics(ListNicsCmd listNicsCmd) {
> > +        // TODO Auto-generated method stub
> > +        return null;
> > +    }
> >  }
> >
> > http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/aedb8
> > c47/server/test/com/cloud/network/MockRulesManagerImpl.java
> > ----------------------------------------------------------------------
> > diff --git a/server/test/com/cloud/network/MockRulesManagerImpl.java
> > b/server/test/com/cloud/network/MockRulesManagerImpl.java
> > index ba3dd41..e5a6894 100644
> > --- a/server/test/com/cloud/network/MockRulesManagerImpl.java
> > +++ b/server/test/com/cloud/network/MockRulesManagerImpl.java
> > @@ -39,6 +39,7 @@ import com.cloud.uservm.UserVm;  import
> > com.cloud.utils.Pair;  import com.cloud.utils.component.Manager;
> >  import com.cloud.utils.component.ManagerBase;
> > +import com.cloud.utils.net.Ip;
> >  import com.cloud.vm.VirtualMachine;
> >
> >  @Local(value = {RulesManager.class, RulesService.class}) @@ -54,14
> > +55,6 @@ public class MockRulesManagerImpl extends ManagerBase
> implements RulesManager, R
> >         }
> >
> >         @Override
> > -       public PortForwardingRule
> createPortForwardingRule(PortForwardingRule rule,
> > -                       Long vmId, boolean openFirewall)
> > -                       throws NetworkRuleConflictException {
> > -               // TODO Auto-generated method stub
> > -               return null;
> > -       }
> > -
> > -       @Override
> >         public boolean revokePortForwardingRule(long ruleId, boolean apply) 
> > {
> >                 // TODO Auto-generated method stub
> >                 return false;
> > @@ -83,7 +76,7 @@ public class MockRulesManagerImpl extends
> > ManagerBase implements RulesManager, R
> >
> >         @Override
> >         public boolean enableStaticNat(long ipAddressId, long vmId, long
> networkId,
> > -                       boolean isSystemVm) throws 
> > NetworkRuleConflictException,
> > +                       boolean isSystemVm, String ipAddr) throws
> > + NetworkRuleConflictException,
> >                         ResourceUnavailableException {
> >                 // TODO Auto-generated method stub
> >                 return false;
> > @@ -310,4 +303,12 @@ public class MockRulesManagerImpl extends
> ManagerBase implements RulesManager, R
> >                 return "MockRulesManagerImpl";
> >         }
> >
> > +    @Override
> > +    public PortForwardingRule
> createPortForwardingRule(PortForwardingRule rule,
> > +            Long vmId, Ip vmIp, boolean openFirewall)
> > +            throws NetworkRuleConflictException {
> > +        // TODO Auto-generated method stub
> > +        return null;
> > +    }
> > +
> >  }
> >
> > http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/aedb8
> > c47/server/test/com/cloud/vpc/MockNetworkManagerImpl.java
> > ----------------------------------------------------------------------
> > diff --git a/server/test/com/cloud/vpc/MockNetworkManagerImpl.java
> > b/server/test/com/cloud/vpc/MockNetworkManagerImpl.java
> > index 828a555..63ef874 100644
> > --- a/server/test/com/cloud/vpc/MockNetworkManagerImpl.java
> > +++ b/server/test/com/cloud/vpc/MockNetworkManagerImpl.java
> > @@ -29,6 +29,7 @@ import
> >
> org.apache.cloudstack.api.command.admin.usage.ListTrafficTypeImplement
> > ors  import
> > org.apache.cloudstack.api.command.user.network.CreateNetworkCmd;
> >  import
> > org.apache.cloudstack.api.command.user.network.ListNetworksCmd;
> >  import
> > org.apache.cloudstack.api.command.user.network.RestartNetworkCmd;
> > +import org.apache.cloudstack.api.command.user.vm.ListNicsCmd;
> >  import org.apache.log4j.Logger;
> >  import org.springframework.stereotype.Component;
> >
> > @@ -80,6 +81,7 @@ import com.cloud.utils.component.Manager;
> >  import com.cloud.utils.component.ManagerBase;
> >  import com.cloud.vm.Nic;
> >  import com.cloud.vm.NicProfile;
> > +import com.cloud.vm.NicSecondaryIp;
> >  import com.cloud.vm.ReservationContext;  import
> > com.cloud.vm.VMInstanceVO;  import com.cloud.vm.VirtualMachine; @@
> > -1317,4 +1319,75 @@ public class MockNetworkManagerImpl extends
> ManagerBase implements NetworkManage
> >          // TODO Auto-generated method stub
> >          return null;
> >      }
> > +
> > +
> > +
> > +
> > +
> > +    @Override
> > +    public boolean isSecondaryIpSetForNic(long nicId) {
> > +        // TODO Auto-generated method stub
> > +        return false;
> > +    }
> > +
> > +    @Override
> > +    public String allocateSecondaryGuestIP(Account account, long zoneId,
> > +            Long nicId, Long networkId, String ipaddress) {
> > +        // TODO Auto-generated method stub
> > +        return null;
> > +    }
> > +
> > +
> > +
> > +
> > +
> > +
> > +
> > +    @Override
> > +    public boolean releaseSecondaryIpFromNic(long ipAddressId) {
> > +        // TODO Auto-generated method stub
> > +        return false;
> > +    }
> > +
> > +
> > +
> > +
> > +
> > +    @Override
> > +    public String allocateGuestIP(Account ipOwner, boolean isSystem,
> > +            long zoneId, Long networkId, String requestedIp)
> > +            throws InsufficientAddressCapacityException {
> > +        // TODO Auto-generated method stub
> > +        return null;
> > +    }
> > +
> > +
> > +
> > +
> > +
> > +    @Override
> > +    public boolean removeVmSecondaryIps(long vmId) {
> > +        // TODO Auto-generated method stub
> > +        return false;
> > +    }
> > +
> > +
> > +
> > +
> > +
> > +    @Override
> > +    public List<? extends Nic> listVmNics(Long vmId, Long nicId) {
> > +        // TODO Auto-generated method stub
> > +        return null;
> > +    }
> > +
> > +
> > +
> > +
> > +
> > +    @Override
> > +    public List<? extends Nic> listNics(ListNicsCmd listNicsCmd) {
> > +        // TODO Auto-generated method stub
> > +        return null;
> > +    }
> >  }
> >
> > http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/aedb8
> > c47/setup/db/db/schema-410to420.sql
> > ----------------------------------------------------------------------
> > diff --git a/setup/db/db/schema-410to420.sql
> > b/setup/db/db/schema-410to420.sql index 4349bd0..6f68e12 100644
> > --- a/setup/db/db/schema-410to420.sql
> > +++ b/setup/db/db/schema-410to420.sql
> > @@ -112,3 +112,24 @@ INSERT IGNORE INTO `cloud`.`configuration`
> VALUES
> > ('Advanced', 'DEFAULT', 'UserV
> >
> >  -- Re-enable foreign key checking, at the end of the upgrade path
> > SET foreign_key_checks = 1;
> > +
> > +
> > +CREATE TABLE nic_secondary_ips (
> > +  `id` bigint unsigned NOT NULL UNIQUE AUTO_INCREMENT,
> > +  `uuid` varchar(40),
> > +  `vmId` bigint unsigned COMMENT 'vm instance id',
> > +  `nicId` bigint unsigned NOT NULL,
> > +  `ip4_address` char(40) COMMENT 'ip4 address',
> > +  `ip6_address` char(40) COMMENT 'ip6 address',
> > +  `network_id` bigint unsigned NOT NULL COMMENT 'network
> > +configuration id',
> > +  `created` datetime NOT NULL COMMENT 'date created',
> > +  `account_id` bigint unsigned NOT NULL COMMENT 'owner.  foreign key
> to   account table',
> > +  `domain_id` bigint unsigned NOT NULL COMMENT 'the domain that the
> owner belongs to',
> > +   PRIMARY KEY (`id`),
> > +   CONSTRAINT `fk_nic_secondary_ip__vmId` FOREIGN KEY
> `fk_nic_secondary_ip__vmId`(`vmId`) REFERENCES `vm_instance`(`id`) ON
> DELETE CASCADE,
> > +   CONSTRAINT `fk_nic_secondary_ip__networks_id` FOREIGN KEY
> `fk_nic_secondary_ip__networks_id`(`network_id`) REFERENCES
> `networks`(`id`),
> > +   CONSTRAINT `uc_nic_secondary_ip__uuid` UNIQUE (`uuid`)
> > +) ENGINE=InnoDB DEFAULT CHARSET=utf8;
> > +
> > +ALTER TABLE `cloud`.`nics` ADD COLUMN secondary_ip SMALLINT
> DEFAULT
> > +'0' COMMENT 'secondary ips configured for the nic'; ALTER TABLE
> > +`cloud`.`user_ip_address` ADD COLUMN dnat_vmip VARCHAR(40);
> >

Reply via email to