// 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 org.apache.cloudstack.network.contrail.management; import static org.junit.Assert.assertNotNull; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.List; import java.util.UUID; import javax.inject.Inject; import org.apache.log4j.Logger; import org.mockito.Matchers; import org.mockito.Mockito; import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.BaseCmd; import org.apache.cloudstack.api.command.admin.vlan.CreateVlanIpRangeCmd; import com.cloud.agent.AgentManager; import com.cloud.agent.api.PlugNicAnswer; import com.cloud.agent.api.UnPlugNicAnswer; import com.cloud.agent.manager.Commands; import com.cloud.configuration.ConfigurationManager; import com.cloud.configuration.ConfigurationService; import com.cloud.dc.DataCenter; import com.cloud.dc.DataCenter.NetworkType; import com.cloud.dc.DataCenterVO; import com.cloud.dc.dao.DataCenterDao; import com.cloud.domain.Domain; import com.cloud.exception.AgentUnavailableException; import com.cloud.exception.InvalidParameterValueException; import com.cloud.exception.OperationTimedoutException; import com.cloud.host.Host.Type; import com.cloud.host.HostVO; import com.cloud.host.Status; import com.cloud.host.dao.HostDao; import com.cloud.hypervisor.Hypervisor.HypervisorType; import com.cloud.network.Network; import com.cloud.network.Network.Provider; import com.cloud.network.NetworkService; import com.cloud.network.Networks.TrafficType; import com.cloud.network.PhysicalNetwork; import com.cloud.network.PhysicalNetwork.BroadcastDomainRange; import com.cloud.network.PhysicalNetworkServiceProvider; import com.cloud.network.PhysicalNetworkTrafficType; import com.cloud.network.dao.NetworkDao; import com.cloud.network.dao.NetworkVO; import com.cloud.network.dao.PhysicalNetworkDao; import com.cloud.network.dao.PhysicalNetworkVO; import com.cloud.offering.ServiceOffering; import com.cloud.resource.ResourceState; import com.cloud.service.ServiceOfferingVO; import com.cloud.service.dao.ServiceOfferingDao; import com.cloud.storage.Storage.StoragePoolType; import com.cloud.storage.VMTemplateVO; import com.cloud.storage.dao.VMTemplateDao; import com.cloud.user.Account; import com.cloud.user.AccountManager; import com.cloud.user.User; import com.cloud.uservm.UserVm; import com.cloud.utils.Pair; import com.cloud.utils.component.ComponentContext; import com.cloud.vm.NicProfile; import com.cloud.vm.UserVmVO; import com.cloud.vm.VirtualMachineManager; import com.cloud.vm.dao.UserVmDao; public class ManagementServerMock { private static final Logger s_logger = Logger.getLogger(ManagementServerMock.class); @Inject private AccountManager _accountMgr; @Inject private ConfigurationService _configService; @Inject private DataCenterDao _zoneDao; @Inject private NetworkService _networkService; @Inject private NetworkDao _networksDao; @Inject private PhysicalNetworkDao _physicalNetworkDao; @Inject private UserVmDao _userVmDao; @Inject private ServiceOfferingDao _serviceOfferingDao; @Inject private VMTemplateDao _vmTemplateDao; @Inject private HostDao _hostDao; @Inject public AgentManager _agentMgr; @Inject public VirtualMachineManager _vmMgr; private DataCenterVO _zone; private PhysicalNetwork _znet; private long _hostId = -1L; // TODO: Use the name parameter to retrieve the @Parameter annotation. static void setParameter(BaseCmd cmd, String name, BaseCmd.CommandType fieldType, Object value) { Class<?> cls = cmd.getClass(); Field field; try { field = cls.getDeclaredField(name); } catch (Exception ex) { s_logger.warn("class: " + cls.getName() + "\t" + ex); return; } field.setAccessible(true); switch (fieldType) { case STRING: try { field.set(cmd, value); } catch (Exception ex) { s_logger.warn(ex); return; } break; case UUID: if (value.equals("-1")) { try { field.setLong(cmd, -1L); } catch (Exception ex) { s_logger.warn(ex); return; } } break; case LONG: try { field.set(cmd, value); } catch (Exception ex) { s_logger.warn(ex); return; } break; default: try { field.set(cmd, value); } catch (Exception ex) { s_logger.warn(ex); return; } break; } } private void createHost() { HostVO host = new HostVO(_hostId, "aa01", Type.BaremetalDhcp, "192.168.1.1", "255.255.255.0", null, null, null, null, null, null, null, null, null, null, UUID.randomUUID().toString(), Status.Up, "1.0", null, null, _zone.getId(), null, 0, 0, "aa", 0, StoragePoolType.NetworkFilesystem); host.setResourceState(ResourceState.Enabled); _hostDao.persist(host); _hostId = host.getId(); } private void createPublicVlanIpRange() { CreateVlanIpRangeCmd cmd = new CreateVlanIpRangeCmd(); BaseCmd proxy = ComponentContext.inject(cmd); Long public_net_id = null; List<NetworkVO> nets = _networksDao.listByZoneAndTrafficType(_zone.getId(), TrafficType.Public); if (nets != null && !nets.isEmpty()) { NetworkVO public_net = nets.get(0); public_net_id = public_net.getId(); } else { s_logger.debug("no public network found in the zone: " + _zone.getId()); } Account system = _accountMgr.getSystemAccount(); setParameter(cmd, "accountName", BaseCmd.CommandType.STRING, system.getAccountName()); setParameter(cmd, "domainId", BaseCmd.CommandType.LONG, Domain.ROOT_DOMAIN); setParameter(cmd, "startIp", BaseCmd.CommandType.STRING, "10.84.60.200"); setParameter(cmd, "endIp", BaseCmd.CommandType.STRING, "10.84.60.250"); setParameter(cmd, ApiConstants.GATEWAY, BaseCmd.CommandType.STRING, "10.84.60.254"); setParameter(cmd, ApiConstants.NETMASK, BaseCmd.CommandType.STRING, "255.255.255.0"); setParameter(cmd, "networkID", BaseCmd.CommandType.LONG, public_net_id); setParameter(cmd, "zoneId", BaseCmd.CommandType.LONG, _zone.getId()); setParameter(cmd, "vlan", BaseCmd.CommandType.STRING, "untagged"); s_logger.debug("createPublicVlanIpRange execute : zone id: " + _zone.getId() + ", public net id: " + public_net_id); try { _configService.createVlanAndPublicIpRange(cmd); } catch (Exception e) { s_logger.debug("createPublicVlanIpRange: " + e); } } public UserVm createVM(String name, Network network) { VMTemplateVO tmpl = getVMTemplate(); assertNotNull(tmpl); ServiceOffering small = getServiceByName("Small Instance"); assertNotNull(small); Answer<?> callback = new Answer<Object>() { @Override public Object answer(InvocationOnMock invocation) { Object[] args = invocation.getArguments(); Commands cmds = (Commands)args[1]; if (cmds == null) { return null; } PlugNicAnswer reply = new PlugNicAnswer(null, true, "PlugNic"); com.cloud.agent.api.Answer[] answers = {reply}; cmds.setAnswers(answers); return null; } }; try { Mockito.when(_agentMgr.send(Matchers.anyLong(), Matchers.any(Commands.class))).thenAnswer(callback); } catch (AgentUnavailableException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (OperationTimedoutException e) { // TODO Auto-generated catch block e.printStackTrace(); } long id = _userVmDao.getNextInSequence(Long.class, "id"); UserVmVO vm = new UserVmVO(id, name, name, tmpl.getId(), HypervisorType.XenServer, tmpl.getGuestOSId(), false, false, _zone.getDomainId(), Account.ACCOUNT_ID_SYSTEM, 1, small.getId(), null, name, null); vm.setState(com.cloud.vm.VirtualMachine.State.Running); vm.setHostId(_hostId); vm.setDataCenterId(network.getDataCenterId()); _userVmDao.persist(vm); NicProfile profile = new NicProfile(); try { _vmMgr.addVmToNetwork(vm, network, profile); } catch (Exception ex) { // TODO Auto-generated catch block //ex.printStackTrace(); } return vm; } private void deleteHost() { _hostDao.remove(_hostId); } public void deleteVM(UserVm vm, Network network) { Answer<?> callback = new Answer<Object>() { @Override public Object answer(InvocationOnMock invocation) { Object[] args = invocation.getArguments(); Commands cmds = (Commands)args[1]; if (cmds == null) { return null; } UnPlugNicAnswer reply = new UnPlugNicAnswer(null, true, "PlugNic"); com.cloud.agent.api.Answer[] answers = {reply}; cmds.setAnswers(answers); return null; } }; try { Mockito.when(_agentMgr.send(Matchers.anyLong(), Matchers.any(Commands.class))).thenAnswer(callback); } catch (AgentUnavailableException e) { e.printStackTrace(); } catch (OperationTimedoutException e) { e.printStackTrace(); } _userVmDao.remove(vm.getId()); } public void initialize(boolean oneShot) { locateZone(); locatePhysicalNetwork(); createHost(); if (oneShot) { createPublicVlanIpRange(); } } private VMTemplateVO getVMTemplate() { List<VMTemplateVO> tmpl_list = _vmTemplateDao.listDefaultBuiltinTemplates(); for (VMTemplateVO tmpl : tmpl_list) { if (tmpl.getHypervisorType() == HypervisorType.XenServer) { return tmpl; } } return null; } private ServiceOffering getServiceByName(String name) { List<ServiceOfferingVO> service_list = _serviceOfferingDao.findPublicServiceOfferings(); for (ServiceOfferingVO service : service_list) { if (service.getName().equals(name)) { return service; } } return null; } public DataCenter getZone() { return _zone; } private void locatePhysicalNetwork() { // mandatory: name, zone-id try { long id = _networkService.findPhysicalNetworkId(_zone.getId(), "znet", TrafficType.Guest); _znet = _networkService.getPhysicalNetwork(id); List<PhysicalNetworkVO> nets = _physicalNetworkDao.listByZoneAndTrafficType(_zone.getId(), TrafficType.Public); if (nets == null || nets.isEmpty()) { _networkService.addTrafficTypeToPhysicalNetwork(_znet.getId(), TrafficType.Public.toString(), "vlan", null, null, null, null, null, null, null); } } catch (InvalidParameterValueException e) { List<String> isolationMethods = new ArrayList<String>(); isolationMethods.add("L3VPN"); _znet = _networkService.createPhysicalNetwork(_zone.getId(), null, null, isolationMethods, BroadcastDomainRange.ZONE.toString(), _zone.getDomainId(), null, "znet"); List<PhysicalNetworkVO> nets = _physicalNetworkDao.listByZoneAndTrafficType(_zone.getId(), TrafficType.Public); if (nets == null || nets.isEmpty()) { _networkService.addTrafficTypeToPhysicalNetwork(_znet.getId(), TrafficType.Public.toString(), "vlan", null, null, null, null, null, null, null); } } if (_znet.getState() != PhysicalNetwork.State.Enabled) { _znet = _networkService.updatePhysicalNetwork(_znet.getId(), null, null, null, PhysicalNetwork.State.Enabled.toString()); } // Ensure that the physical network supports Guest traffic. Pair<List<? extends PhysicalNetworkTrafficType>, Integer> trafficTypes = _networkService.listTrafficTypes(_znet.getId()); boolean found = false; for (PhysicalNetworkTrafficType ttype : trafficTypes.first()) { if (ttype.getTrafficType() == TrafficType.Guest) { found = true; } } if (!found) { _networkService.addTrafficTypeToPhysicalNetwork(_znet.getId(), TrafficType.Guest.toString(), "vlan", null, null, null, null, null, null, null); } Pair<List<? extends PhysicalNetworkServiceProvider>, Integer> providers = _networkService.listNetworkServiceProviders(_znet.getId(), Provider.JuniperContrailRouter.getName(), null, null, null); if (providers.second() == 0) { s_logger.debug("Add " + Provider.JuniperContrailRouter.getName() + " to network " + _znet.getName()); PhysicalNetworkServiceProvider provider = _networkService.addProviderToPhysicalNetwork(_znet.getId(), Provider.JuniperContrailRouter.getName(), null, null); _networkService.updateNetworkServiceProvider(provider.getId(), PhysicalNetworkServiceProvider.State.Enabled.toString(), null); } else { PhysicalNetworkServiceProvider provider = providers.first().get(0); if (provider.getState() != PhysicalNetworkServiceProvider.State.Enabled) { _networkService.updateNetworkServiceProvider(provider.getId(), PhysicalNetworkServiceProvider.State.Enabled.toString(), null); } } providers = _networkService.listNetworkServiceProviders(_znet.getId(), null, PhysicalNetworkServiceProvider.State.Enabled.toString(), null, null); s_logger.debug(_znet.getName() + " has " + providers.second().toString() + " Enabled providers"); for (PhysicalNetworkServiceProvider provider : providers.first()) { if (provider.getProviderName().equals(Provider.JuniperContrailRouter.getName())) { continue; } s_logger.debug("Disabling " + provider.getProviderName()); _networkService.updateNetworkServiceProvider(provider.getId(), PhysicalNetworkServiceProvider.State.Disabled.toString(), null); } } private void locateZone() { _zone = _zoneDao.findByName("default"); if (_zone == null) { ConfigurationManager mgr = (ConfigurationManager)_configService; _zone = mgr.createZone(User.UID_SYSTEM, "default", "8.8.8.8", null, "8.8.4.4", null, null /* cidr */, "ROOT", Domain.ROOT_DOMAIN, NetworkType.Advanced, null, null /* networkDomain */, false, false, null, null); } } public void shutdown() { deleteHost(); } }