blob: db06c88cff495930a6c7a456d3e13471590f736c [file] [log] [blame]
// 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();
}
}