diff --git a/api/src/com/cloud/network/NetworkModel.java b/api/src/com/cloud/network/NetworkModel.java index f53cfbd2ef2..bd3acbefbdc 100644 --- a/api/src/com/cloud/network/NetworkModel.java +++ b/api/src/com/cloud/network/NetworkModel.java @@ -241,5 +241,7 @@ public interface NetworkModel { Set getAvailableIps(Network network, String requestedIp); String getDomainNetworkDomain(long domainId, long zoneId); + + PublicIpAddress getSourceNatIpAddressForGuestNetwork(Account owner, Network guestNetwork); } \ No newline at end of file diff --git a/server/src/com/cloud/network/NetworkModelImpl.java b/server/src/com/cloud/network/NetworkModelImpl.java index 8dee11ecc3d..dcd3c25668d 100644 --- a/server/src/com/cloud/network/NetworkModelImpl.java +++ b/server/src/com/cloud/network/NetworkModelImpl.java @@ -1833,4 +1833,25 @@ public class NetworkModelImpl implements NetworkModel, Manager{ public String getName() { return _name; } + + @Override + public PublicIpAddress getSourceNatIpAddressForGuestNetwork(Account owner, Network guestNetwork) { + List addrs = listPublicIpsAssignedToGuestNtwk(owner.getId(), guestNetwork.getId(), true); + + IPAddressVO sourceNatIp = null; + if (addrs.isEmpty()) { + return null; + } else { + for (IpAddress addr : addrs) { + if (addr.isSourceNat()) { + sourceNatIp = _ipAddressDao.findById(addr.getId()); + return new PublicIp(sourceNatIp, _vlanDao.findById(sourceNatIp.getVlanId()), + NetUtils.createSequenceBasedMacAddress(sourceNatIp.getMacAddress())); + } + } + + } + + return null; + } } \ No newline at end of file diff --git a/server/test/com/cloud/network/MockNetworkModelImpl.java b/server/test/com/cloud/network/MockNetworkModelImpl.java index 76e7171788e..e1113a4aee4 100644 --- a/server/test/com/cloud/network/MockNetworkModelImpl.java +++ b/server/test/com/cloud/network/MockNetworkModelImpl.java @@ -795,4 +795,13 @@ public class MockNetworkModelImpl implements NetworkModel, Manager { return null; } + /* (non-Javadoc) + * @see com.cloud.network.NetworkModel#getSourceNatIpAddressForGuestNetwork(com.cloud.user.Account, com.cloud.network.Network) + */ + @Override + public PublicIpAddress getSourceNatIpAddressForGuestNetwork(Account owner, Network guestNetwork) { + // TODO Auto-generated method stub + return null; + } + } diff --git a/server/test/com/cloud/network/NetworkModelTest.java b/server/test/com/cloud/network/NetworkModelTest.java new file mode 100644 index 00000000000..52b3187e50c --- /dev/null +++ b/server/test/com/cloud/network/NetworkModelTest.java @@ -0,0 +1,88 @@ +// 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.network; + +import static org.mockito.Matchers.any; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; +import static org.mockito.Matchers.*; + +import java.util.ArrayList; +import java.util.List; + +import junit.framework.Assert; + +import org.junit.Before; +import org.junit.Test; + +import com.cloud.dc.VlanVO; +import com.cloud.dc.dao.VlanDao; +import com.cloud.network.dao.IPAddressDao; +import com.cloud.user.Account; +import com.cloud.utils.db.Filter; +import com.cloud.utils.db.SearchBuilder; +import com.cloud.utils.db.SearchCriteria; +import com.cloud.utils.net.Ip; + +public class NetworkModelTest { + @Before + public void setUp() { + + } + + @Test + public void testGetSourceNatIpAddressForGuestNetwork() { + NetworkModelImpl modelImpl = new NetworkModelImpl(); + IPAddressDao ipAddressDao = mock(IPAddressDao.class); + modelImpl._ipAddressDao = ipAddressDao; + List fakeList = new ArrayList(); + IPAddressVO fakeIp = new IPAddressVO(new Ip("75.75.75.75"), 1, 0xaabbccddeeffL, 10, false); + fakeList.add(fakeIp); + SearchBuilder fakeSearch = mock(SearchBuilder.class); + modelImpl.IpAddressSearch = fakeSearch; + VlanDao fakeVlanDao = mock(VlanDao.class); + when (fakeVlanDao.findById(anyLong())).thenReturn(mock(VlanVO.class)); + modelImpl._vlanDao = fakeVlanDao; + when(fakeSearch.create()).thenReturn(mock(SearchCriteria.class)); + when( + ipAddressDao.search( + any(SearchCriteria.class), + (Filter)org.mockito.Matchers.isNull() + ) + ).thenReturn(fakeList); + when ( + ipAddressDao.findById(anyLong()) + ).thenReturn(fakeIp); + Account fakeAccount = mock(Account.class); + when(fakeAccount.getId()).thenReturn(1L); + Network fakeNetwork = mock(Network.class); + when(fakeNetwork.getId()).thenReturn(1L); + PublicIpAddress answer = modelImpl.getSourceNatIpAddressForGuestNetwork(fakeAccount, fakeNetwork); + Assert.assertNull(answer); + IPAddressVO fakeIp2 = new IPAddressVO(new Ip("76.75.75.75"), 1, 0xaabb10ddeeffL, 10, true); + fakeList.add(fakeIp2); + when ( + ipAddressDao.findById(anyLong()) + ).thenReturn(fakeIp2); + answer = modelImpl.getSourceNatIpAddressForGuestNetwork(fakeAccount, fakeNetwork); + Assert.assertNotNull(answer); + Assert.assertEquals(answer.getAddress().addr(), "76.75.75.75"); + + } + +}