From b0b3f16daea0f2a50cb4448de7cc9dacc9afce04 Mon Sep 17 00:00:00 2001 From: frank Date: Fri, 29 Jul 2011 11:22:24 -0700 Subject: [PATCH] Two things: Load non-routing resource in ClusteredAgentManager includes External DHCP, PxeServer, ExternalFirewall, ExternalLoadBalancer Bug 9887 - baremetal: support for image operation (create template from guest disk) (edit) changes in line with UI --- api/src/com/cloud/api/ResponseGenerator.java | 4 +++ .../cloud/api/commands/CreateTemplateCmd.java | 35 ++++++++++++++----- .../manager/ClusteredAgentManagerImpl.java | 2 ++ .../src/com/cloud/api/ApiResponseHelper.java | 14 +++++++- server/src/com/cloud/host/dao/HostDao.java | 2 ++ .../src/com/cloud/host/dao/HostDaoImpl.java | 35 +++++++++++++++---- ui/jsp/instance.jsp | 10 +----- ui/scripts/cloud.core.instance.js | 5 +-- 8 files changed, 77 insertions(+), 30 deletions(-) mode change 100644 => 100755 api/src/com/cloud/api/ResponseGenerator.java mode change 100644 => 100755 server/src/com/cloud/agent/manager/ClusteredAgentManagerImpl.java mode change 100644 => 100755 server/src/com/cloud/host/dao/HostDao.java mode change 100644 => 100755 server/src/com/cloud/host/dao/HostDaoImpl.java mode change 100644 => 100755 ui/jsp/instance.jsp mode change 100644 => 100755 ui/scripts/cloud.core.instance.js diff --git a/api/src/com/cloud/api/ResponseGenerator.java b/api/src/com/cloud/api/ResponseGenerator.java old mode 100644 new mode 100755 index f0cabb417f4..a0fa8aa8621 --- a/api/src/com/cloud/api/ResponseGenerator.java +++ b/api/src/com/cloud/api/ResponseGenerator.java @@ -155,6 +155,8 @@ public interface ResponseGenerator { Account findAccountByNameDomain(String accountName, Long domainId); VirtualMachineTemplate findTemplateById(Long templateId); + + Host findHostById(Long hostId); List createTemplateResponses(long templateId, Long zoneId, boolean readyOnly); List createTemplateResponses(long templateId, long zoneId, boolean readyOnly); @@ -196,4 +198,6 @@ public interface ResponseGenerator { List createIsoResponses(long isoId, Long zoneId, boolean readyOnly); List createIsoResponses(VirtualMachineTemplate iso, long zoneId, boolean readyOnly); + List createTemplateResponses(long templateId, Long vmId); + } diff --git a/api/src/com/cloud/api/commands/CreateTemplateCmd.java b/api/src/com/cloud/api/commands/CreateTemplateCmd.java index d0a5dcf18c6..aeabfb21c52 100755 --- a/api/src/com/cloud/api/commands/CreateTemplateCmd.java +++ b/api/src/com/cloud/api/commands/CreateTemplateCmd.java @@ -187,29 +187,46 @@ public class CreateTemplateCmd extends BaseAsyncCreateCmd { return AsyncJob.Type.Template; } + private boolean isBareMetal() { + return (this.getVmId() != null && this.getUrl() != null); + } + @Override public void create() throws ResourceAllocationException { - VirtualMachineTemplate template = null; - template = _userVmService.createPrivateTemplateRecord(this); + if (isBareMetal()) { + _bareMetalVmService.createPrivateTemplateRecord(this); + /*Baremetal creates template record after taking image proceeded, use vmId as entity id here*/ + this.setEntityId(vmId); + } else { + VirtualMachineTemplate template = null; + template = _userVmService.createPrivateTemplateRecord(this); - if (template != null) { - this.setEntityId(template.getId()); - } else { - throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "Failed to create a template"); - } + if (template != null) { + this.setEntityId(template.getId()); + } else { + throw new ServerApiException(BaseCmd.INTERNAL_ERROR, + "Failed to create a template"); + } + } } @Override public void execute() { UserContext.current().setEventDetails("Template Id: "+getEntityId()+((getSnapshotId() == null) ? " from volume Id: " + getVolumeId() : " from snapshot Id: " + getSnapshotId())); VirtualMachineTemplate template = null; - if (vmId != null && url != null) { + if (isBareMetal()) { template = _bareMetalVmService.createPrivateTemplate(this); } else { template = _userVmService.createPrivateTemplate(this); } + if (template != null){ - List templateResponses = _responseGenerator.createTemplateResponses(template.getId(), snapshotId, volumeId, false); + List templateResponses; + if (isBareMetal()) { + templateResponses = _responseGenerator.createTemplateResponses(template.getId(), vmId); + } else { + templateResponses = _responseGenerator.createTemplateResponses(template.getId(), snapshotId, volumeId, false); + } TemplateResponse response = new TemplateResponse(); if (templateResponses != null && !templateResponses.isEmpty()) { response = templateResponses.get(0); diff --git a/server/src/com/cloud/agent/manager/ClusteredAgentManagerImpl.java b/server/src/com/cloud/agent/manager/ClusteredAgentManagerImpl.java old mode 100644 new mode 100755 index 900f8433075..4ae669e4a0c --- a/server/src/com/cloud/agent/manager/ClusteredAgentManagerImpl.java +++ b/server/src/com/cloud/agent/manager/ClusteredAgentManagerImpl.java @@ -156,6 +156,8 @@ public class ClusteredAgentManagerImpl extends AgentManagerImpl implements Clust // for agents that are self-managed, threshold to be considered as disconnected is 3 ping intervals long cutSeconds = (System.currentTimeMillis() >> 10) - (_pingInterval * 3); List hosts = _hostDao.findAndUpdateDirectAgentToLoad(cutSeconds, _loadSize, _nodeId); + List appliances = _hostDao.findAndUpdateApplianceToLoad(cutSeconds, _nodeId); + hosts.addAll(appliances); if (hosts != null && hosts.size() > 0) { s_logger.debug("Found " + hosts.size() + " unmanaged direct hosts, processing connect for them..."); diff --git a/server/src/com/cloud/api/ApiResponseHelper.java b/server/src/com/cloud/api/ApiResponseHelper.java index fbc57cd3b8f..13c83c6b06b 100755 --- a/server/src/com/cloud/api/ApiResponseHelper.java +++ b/server/src/com/cloud/api/ApiResponseHelper.java @@ -1211,6 +1211,11 @@ public class ApiResponseHelper implements ResponseGenerator { return vmResponse; } + @Override + public Host findHostById(Long hostId) { + return ApiDBUtils.findHostById(hostId); + } + @Override public User findUserById(Long userId) { return ApiDBUtils.findUserById(userId); @@ -1621,7 +1626,6 @@ public class ApiResponseHelper implements ResponseGenerator { @Override public List createTemplateResponses(long templateId, Long snapshotId, Long volumeId, boolean readyOnly) { - Long zoneId = null; VolumeVO volume = null; if (snapshotId != null) { Snapshot snapshot = ApiDBUtils.findSnapshotById(snapshotId); @@ -1631,6 +1635,14 @@ public class ApiResponseHelper implements ResponseGenerator { } return createTemplateResponses(templateId, volume.getDataCenterId(), readyOnly); } + + @Override + public List createTemplateResponses(long templateId, Long vmId) { + UserVm vm = findUserVmById(vmId); + Long hostId = (vm.getHostId() == null ? vm.getLastHostId() : vm.getHostId()); + Host host = findHostById(hostId); + return createTemplateResponses(templateId, host.getDataCenterId(), true); + } @Override public EventResponse createEventResponse(Event event) { diff --git a/server/src/com/cloud/host/dao/HostDao.java b/server/src/com/cloud/host/dao/HostDao.java old mode 100644 new mode 100755 index 30d1592346c..3d69b3cf2d9 --- a/server/src/com/cloud/host/dao/HostDao.java +++ b/server/src/com/cloud/host/dao/HostDao.java @@ -186,4 +186,6 @@ public interface HostDao extends GenericDao { List listSecondaryStorageVM(long dcId); List listAllRoutingAgents(); + + List findAndUpdateApplianceToLoad(long lastPingSecondsAfter, long managementServerId); } diff --git a/server/src/com/cloud/host/dao/HostDaoImpl.java b/server/src/com/cloud/host/dao/HostDaoImpl.java old mode 100644 new mode 100755 index 4284568249a..0afc4df832e --- a/server/src/com/cloud/host/dao/HostDaoImpl.java +++ b/server/src/com/cloud/host/dao/HostDaoImpl.java @@ -89,7 +89,7 @@ public class HostDaoImpl extends GenericDaoBase implements HostDao protected final SearchBuilder SequenceSearch; protected final SearchBuilder DirectlyConnectedSearch; protected final SearchBuilder UnmanagedDirectConnectSearch; - protected final SearchBuilder UnmanagedExternalNetworkApplianceSearch; + protected final SearchBuilder UnmanagedApplianceSearch; protected final SearchBuilder MaintenanceCountSearch; protected final SearchBuilder ClusterSearch; protected final SearchBuilder ConsoleProxyHostSearch; @@ -99,6 +99,7 @@ public class HostDaoImpl extends GenericDaoBase implements HostDao protected final SearchBuilder ManagedDirectConnectSearch; protected final SearchBuilder ManagedRoutingServersSearch; protected final SearchBuilder SecondaryStorageVMSearch; + protected final GenericSearchBuilder HostsInStatusSearch; protected final GenericSearchBuilder CountRoutingByDc; @@ -255,12 +256,12 @@ public class HostDaoImpl extends GenericDaoBase implements HostDao DirectConnectSearch.cp(); DirectConnectSearch.done(); - UnmanagedExternalNetworkApplianceSearch = createSearchBuilder(); - UnmanagedExternalNetworkApplianceSearch.and("resource", UnmanagedExternalNetworkApplianceSearch.entity().getResource(), SearchCriteria.Op.NNULL); - UnmanagedExternalNetworkApplianceSearch.and("server", UnmanagedExternalNetworkApplianceSearch.entity().getManagementServerId(), SearchCriteria.Op.NULL); - UnmanagedExternalNetworkApplianceSearch.and("types", UnmanagedExternalNetworkApplianceSearch.entity().getType(), SearchCriteria.Op.IN); - UnmanagedExternalNetworkApplianceSearch.and("lastPinged", UnmanagedExternalNetworkApplianceSearch.entity().getLastPinged(), SearchCriteria.Op.LTEQ); - UnmanagedExternalNetworkApplianceSearch.done(); + UnmanagedApplianceSearch = createSearchBuilder(); + UnmanagedApplianceSearch.and("resource", UnmanagedApplianceSearch.entity().getResource(), SearchCriteria.Op.NNULL); + UnmanagedApplianceSearch.and("server", UnmanagedApplianceSearch.entity().getManagementServerId(), SearchCriteria.Op.NULL); + UnmanagedApplianceSearch.and("types", UnmanagedApplianceSearch.entity().getType(), SearchCriteria.Op.IN); + UnmanagedApplianceSearch.and("lastPinged", UnmanagedApplianceSearch.entity().getLastPinged(), SearchCriteria.Op.LTEQ); + UnmanagedApplianceSearch.done(); AvailHypevisorInZone = createSearchBuilder(); AvailHypevisorInZone.and("zoneId", AvailHypevisorInZone.entity().getDataCenterId(), SearchCriteria.Op.EQ); @@ -398,6 +399,26 @@ public class HostDaoImpl extends GenericDaoBase implements HostDao return hosts; } + + @Override @DB + public List findAndUpdateApplianceToLoad(long lastPingSecondsAfter, long managementServerId) { + Transaction txn = Transaction.currentTxn(); + + txn.start(); + SearchCriteria sc = UnmanagedApplianceSearch.create(); + sc.setParameters("lastPinged", lastPingSecondsAfter); + sc.setParameters("types", Type.ExternalDhcp, Type.ExternalFirewall, Type.ExternalLoadBalancer, Type.PxeServer); + List hosts = lockRows(sc, null, true); + + for (HostVO host : hosts) { + host.setManagementServerId(managementServerId); + update(host.getId(), host); + } + + txn.commit(); + + return hosts; + } @Override public void markHostsAsDisconnected(long msId) { diff --git a/ui/jsp/instance.jsp b/ui/jsp/instance.jsp old mode 100644 new mode 100755 index f2fea01e732..9b0038a0852 --- a/ui/jsp/instance.jsp +++ b/ui/jsp/instance.jsp @@ -1448,15 +1448,7 @@ dictionary = { - -
  • - - -
  • +
  • diff --git a/ui/scripts/cloud.core.instance.js b/ui/scripts/cloud.core.instance.js old mode 100644 new mode 100755 index 00affbef8c0..367d8824219 --- a/ui/scripts/cloud.core.instance.js +++ b/ui/scripts/cloud.core.instance.js @@ -2549,10 +2549,7 @@ function doCreateTemplateFromVM($actionLink, $detailsTab, $midmenuItem1) { var isPublic = $thisDialog.find("#create_template_public").val(); array1.push("&isPublic="+isPublic); - - var password = $thisDialog.find("#create_template_password").val(); - array1.push("&passwordEnabled="+password); - + var imageDirectory = $thisDialog.find("#image_directory").val(); array1.push("&url="+todb(imageDirectory));