package org.ovirt.engine.core.bll.network;
import static org.hamcrest.Matchers.hasEntry;
import static org.junit.Assert.assertThat;
import static org.mockito.ArgumentMatchers.same;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.doThrow;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import java.util.Map;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.Captor;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
import org.ovirt.engine.core.bll.provider.ProviderProxyFactory;
import org.ovirt.engine.core.bll.provider.network.NetworkProviderProxy;
import org.ovirt.engine.core.common.AuditLogType;
import org.ovirt.engine.core.common.businessentities.Provider;
import org.ovirt.engine.core.common.businessentities.network.Network;
import org.ovirt.engine.core.common.businessentities.network.ProviderNetwork;
import org.ovirt.engine.core.common.businessentities.network.VmNic;
import org.ovirt.engine.core.common.errors.EngineException;
import org.ovirt.engine.core.compat.Guid;
import org.ovirt.engine.core.dal.dbbroker.auditloghandling.AuditLogDirector;
import org.ovirt.engine.core.dal.dbbroker.auditloghandling.AuditLogableBase;
import org.ovirt.engine.core.dao.provider.ProviderDao;
import org.ovirt.engine.core.di.InjectorRule;
@RunWith(MockitoJUnitRunner.class)
public class ExternalNetworkManagerTest {
private static final Guid NIC_ID = Guid.newGuid();
private static final String NIC_NAME = "nic name";
private static final Guid PROVIDER_ID = Guid.newGuid();
private static final String PROVIDER_NAME = "provider name";
@Rule
public InjectorRule injectorRule = new InjectorRule();
@Mock
private AuditLogDirector auditLogDirector;
@Mock
private ProviderDao providerDao;
@Mock
private ProviderProxyFactory providerProxyFactory;
@Mock
private NetworkProviderProxy networkProviderProxy;
@Captor
private ArgumentCaptor<AuditLogableBase> auditLogableBaseCaptor;
private ExternalNetworkManager underTest;
private VmNic nic;
private Network network;
private ProviderNetwork providerNetwork;
private Provider provider;
@Before
public void setUp() {
nic = new VmNic();
network = createNetwork();
underTest = spy(new ExternalNetworkManager(nic, network));
injectorRule.bind(ProviderDao.class, providerDao);
injectorRule.bind(AuditLogDirector.class, auditLogDirector);
provider = new Provider<>();
when(providerDao.get(PROVIDER_ID)).thenReturn(provider);
doReturn(providerProxyFactory).when(underTest).getProviderProxyFactory();
when(providerProxyFactory.create(provider)).thenReturn(networkProviderProxy);
}
private Network createNetwork() {
final Network network = new Network();
providerNetwork = new ProviderNetwork();
providerNetwork.setProviderId(PROVIDER_ID);
network.setProvidedBy(providerNetwork);
return network;
}
@Test
public void testDeallocateIfExternalPositive() {
underTest.deallocateIfExternal();
verify(networkProviderProxy).deallocate(nic);
}
@Test
public void testDeallocateIfExternalThrowException() {
nic.setName(NIC_NAME);
nic.setId(NIC_ID);
provider.setName(PROVIDER_NAME);
doThrow(new EngineException()).when(networkProviderProxy).deallocate(nic);
underTest.deallocateIfExternal();
verify(auditLogDirector).log(
auditLogableBaseCaptor.capture(),
same(AuditLogType.REMOVE_PORT_FROM_EXTERNAL_PROVIDER_FAILED));
final Map<String, String> capturedCustomValues = auditLogableBaseCaptor.getValue().getCustomValues();
assertThat(capturedCustomValues, hasEntry("nicname", NIC_NAME));
assertThat(capturedCustomValues, hasEntry("nicid", NIC_ID.toString()));
assertThat(capturedCustomValues, hasEntry("providername", PROVIDER_NAME));
}
}