package com.cloud.async.executor;
import java.util.List;
import org.apache.log4j.Logger;
import com.cloud.api.BaseCmd;
import com.cloud.async.AsyncJobManager;
import com.cloud.async.AsyncJobResult;
import com.cloud.async.AsyncJobVO;
import com.cloud.async.BaseAsyncJobExecutor;
import com.cloud.network.FirewallRuleVO;
import com.cloud.network.IPAddressVO;
import com.cloud.serializer.GsonHelper;
import com.cloud.server.Criteria;
import com.cloud.server.ManagementServer;
import com.cloud.vm.DomainRouterVO;
import com.cloud.vm.UserVmVO;
import com.google.gson.Gson;
public class UpdatePortForwardingRuleExecutor extends BaseAsyncJobExecutor {
public static final Logger s_logger = Logger.getLogger(UpdatePortForwardingRuleExecutor.class.getName());
@Override
public boolean execute() {
if (getSyncSource() == null) {
Gson gson = GsonHelper.getBuilder().create();
AsyncJobManager asyncMgr = getAsyncJobMgr();
AsyncJobVO job = getJob();
CreateOrUpdateRuleParam param = gson.fromJson(job.getCmdInfo(), CreateOrUpdateRuleParam.class);
ManagementServer ms = asyncMgr.getExecutorContext().getManagementServer();
IPAddressVO ipAddr = ms.findIPAddressById(param.getAddress());
DomainRouterVO router = ms.findDomainRouterBy(ipAddr.getAccountId(), ipAddr.getDataCenterId());
asyncMgr.syncAsyncJobExecution(job.getId(), "Router", router.getId()); // synchronize on the router
// always true if it does not have sync-source
return true;
} else {
Gson gson = GsonHelper.getBuilder().create();
AsyncJobManager asyncMgr = getAsyncJobMgr();
AsyncJobVO job = getJob();
CreateOrUpdateRuleParam param = gson.fromJson(job.getCmdInfo(), CreateOrUpdateRuleParam.class);
ManagementServer ms = asyncMgr.getExecutorContext().getManagementServer();
try {
FirewallRuleVO fwRule = ms.updatePortForwardingRule(param.getUserId(), param.getAddress(), param.getPrivateIpAddress(), param.getPort(), param.getPrivatePort(), param.getProtocol());
if (fwRule != null) {
getAsyncJobMgr().completeAsyncJob(job.getId(), AsyncJobResult.STATUS_SUCCEEDED, 0, composeResultObject(ms, fwRule));
} else {
getAsyncJobMgr().completeAsyncJob(job.getId(), AsyncJobResult.STATUS_FAILED, BaseCmd.INTERNAL_ERROR, "Internal error updating forwarding rule for address " + param.getAddress());
}
} catch (Exception ex) {
s_logger.error("Unhandled exception updating port forwarding rule", ex);
getAsyncJobMgr().completeAsyncJob(job.getId(), AsyncJobResult.STATUS_FAILED, BaseCmd.INTERNAL_ERROR, "Internal error updating forwarding rule for address " + param.getAddress());
}
return true;
}
}
private UpdatePortForwardingRuleResultObject composeResultObject(ManagementServer ms, FirewallRuleVO firewallRule) {
UpdatePortForwardingRuleResultObject resultObject = new UpdatePortForwardingRuleResultObject();
IPAddressVO ipAddressVO = ms.findIPAddressById(firewallRule.getPublicIpAddress());
Criteria c = new Criteria();
c.addCriteria(Criteria.ACCOUNTID, new Object[] {ipAddressVO.getAccountId()});
c.addCriteria(Criteria.DATACENTERID, ipAddressVO.getDataCenterId());
c.addCriteria(Criteria.IPADDRESS, firewallRule.getPrivateIpAddress());
List<UserVmVO> userVMs = ms.searchForUserVMs(c);
if ((userVMs != null) && (userVMs.size() > 0)) {
UserVmVO userVM = userVMs.get(0);
resultObject.setVirtualMachineId(userVM.getId());
resultObject.setVirtualMachineName(userVM.getName());
resultObject.setVirtualMachineDisplayName(userVM.getDisplayName());
}
resultObject.setId(firewallRule.getId());
resultObject.setPublicIp(firewallRule.getPublicIpAddress());
resultObject.setPrivateIp(firewallRule.getPrivateIpAddress());
resultObject.setPublicPort(firewallRule.getPublicPort());
resultObject.setPrivatePort(firewallRule.getPrivatePort());
resultObject.setProtocol(firewallRule.getProtocol());
return resultObject;
}
}