diff --git a/cloud.spec b/cloud.spec index 931b2b1d1fb..03e6228744d 100644 --- a/cloud.spec +++ b/cloud.spec @@ -218,14 +218,19 @@ Requires: jpackage-utils Requires: %{name}-daemonize Requires: /sbin/service Requires: /sbin/chkconfig + +%if 0%{?rhel} >= 6 +Requires: cloud-kvm +%else Requires: kvm +%endif + %if 0%{?fedora} >= 12 Requires: qemu-cloud-system-x86 Requires: qemu-cloud-img %endif %if 0%{?rhel} >= 6 -Requires: cloud-qemu-kvm Requires: cloud-qemu-img %endif diff --git a/deps/.project b/deps/.project new file mode 100644 index 00000000000..2d10b0c4b06 --- /dev/null +++ b/deps/.project @@ -0,0 +1,11 @@ + + + deps + + + + + + + + diff --git a/server/src/com/cloud/api/doc/ApiXmlDocWriter.java b/server/src/com/cloud/api/doc/ApiXmlDocWriter.java index 95ed8945228..c96dae3c6dc 100644 --- a/server/src/com/cloud/api/doc/ApiXmlDocWriter.java +++ b/server/src/com/cloud/api/doc/ApiXmlDocWriter.java @@ -201,10 +201,10 @@ public class ApiXmlDocWriter { regularUserSorted.close(); //gzip directory with xml doc - zipDir(dirName + "xmldoc.zip", xmlDocDir); + //zipDir(dirName + "xmldoc.zip", xmlDocDir); //Delete directory - deleteDir(new File(xmlDocDir)); + //deleteDir(new File(xmlDocDir)); } catch (Exception ex) { ex.printStackTrace(); diff --git a/server/src/com/cloud/network/element/VirtualRouterElement.java b/server/src/com/cloud/network/element/VirtualRouterElement.java index 0e59a7363cc..d641635b3b4 100644 --- a/server/src/com/cloud/network/element/VirtualRouterElement.java +++ b/server/src/com/cloud/network/element/VirtualRouterElement.java @@ -32,25 +32,26 @@ import com.cloud.deploy.DeployDestination; import com.cloud.exception.ConcurrentOperationException; import com.cloud.exception.InsufficientCapacityException; import com.cloud.exception.ResourceUnavailableException; +import com.cloud.host.Host; import com.cloud.network.LoadBalancerVO; import com.cloud.network.Network; -import com.cloud.network.Network.Capability; -import com.cloud.network.Network.GuestIpType; -import com.cloud.network.Network.Provider; -import com.cloud.network.Network.Service; import com.cloud.network.NetworkManager; import com.cloud.network.PublicIpAddress; import com.cloud.network.RemoteAccessVpn; import com.cloud.network.VpnUser; +import com.cloud.network.Network.Capability; +import com.cloud.network.Network.GuestIpType; +import com.cloud.network.Network.Provider; +import com.cloud.network.Network.Service; import com.cloud.network.dao.LoadBalancerDao; import com.cloud.network.dao.NetworkDao; import com.cloud.network.lb.LoadBalancingRule; -import com.cloud.network.lb.LoadBalancingRule.LbDestination; import com.cloud.network.lb.LoadBalancingRulesManager; +import com.cloud.network.lb.LoadBalancingRule.LbDestination; import com.cloud.network.router.VirtualNetworkApplianceManager; import com.cloud.network.rules.FirewallRule; -import com.cloud.network.rules.FirewallRule.Purpose; import com.cloud.network.rules.PortForwardingRule; +import com.cloud.network.rules.FirewallRule.Purpose; import com.cloud.network.vpn.RemoteAccessVpnElement; import com.cloud.offering.NetworkOffering; import com.cloud.offerings.dao.NetworkOfferingDao; @@ -63,8 +64,8 @@ import com.cloud.vm.NicProfile; import com.cloud.vm.ReservationContext; import com.cloud.vm.UserVmManager; import com.cloud.vm.VirtualMachine; -import com.cloud.vm.VirtualMachine.State; import com.cloud.vm.VirtualMachineProfile; +import com.cloud.vm.VirtualMachine.State; import com.cloud.vm.dao.DomainRouterDao; import com.cloud.vm.dao.UserVmDao; @@ -96,6 +97,7 @@ public class VirtualRouterElement extends AdapterBase implements NetworkElement, if (!canHandle(guestConfig.getGuestType(), dest.getDataCenter())) { return false; } + _routerMgr.deployVirtualRouter(guestConfig, dest, context.getAccount()); return true; @@ -111,6 +113,30 @@ public class VirtualRouterElement extends AdapterBase implements NetworkElement, @SuppressWarnings("unchecked") VirtualMachineProfile uservm = (VirtualMachineProfile)vm; + DomainRouterVO router = _routerDao.findById(uservm.getVirtualMachine().getDomainRouterId()); + if(router != null) { + State state = router.getState(); + if ( state == State.Starting ) { + // wait 300 seconds + for ( int i = 0; i < 300; ) { + try { + Thread.sleep(2000); + } catch (Exception e) { + } + i += 2; + + state = router.getState(); + if ( state != State.Starting ) { + break; + } + } + } + + // TODO: need to find a better exception to throw! + if(state != State.Running) + throw new ResourceUnavailableException("Virtual router is not available", Host.class, router.getHostId()); + } + return _routerMgr.addVirtualMachineIntoNetwork(config, nic, uservm, dest, context, false) != null; } else { return false; diff --git a/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java b/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java index e2697ca5a18..db30258a9df 100644 --- a/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java +++ b/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java @@ -72,10 +72,9 @@ import com.cloud.configuration.ConfigurationManager; import com.cloud.configuration.dao.ConfigurationDao; import com.cloud.configuration.dao.ResourceLimitDao; import com.cloud.dc.DataCenter; -import com.cloud.dc.DataCenter.NetworkType; import com.cloud.dc.DataCenterVO; import com.cloud.dc.HostPodVO; -import com.cloud.dc.Vlan; +import com.cloud.dc.DataCenter.NetworkType; import com.cloud.dc.dao.AccountVlanMapDao; import com.cloud.dc.dao.DataCenterDao; import com.cloud.dc.dao.HostPodDao; @@ -105,18 +104,18 @@ import com.cloud.network.IPAddressVO; import com.cloud.network.IpAddress; import com.cloud.network.LoadBalancerVO; import com.cloud.network.Network; -import com.cloud.network.Network.GuestIpType; import com.cloud.network.NetworkManager; import com.cloud.network.NetworkVO; -import com.cloud.network.Networks.BroadcastDomainType; -import com.cloud.network.Networks.IsolationType; -import com.cloud.network.Networks.TrafficType; import com.cloud.network.PublicIpAddress; import com.cloud.network.RemoteAccessVpn; import com.cloud.network.SshKeysDistriMonitor; import com.cloud.network.VirtualNetworkApplianceService; import com.cloud.network.VpnUser; import com.cloud.network.VpnUserVO; +import com.cloud.network.Network.GuestIpType; +import com.cloud.network.Networks.BroadcastDomainType; +import com.cloud.network.Networks.IsolationType; +import com.cloud.network.Networks.TrafficType; import com.cloud.network.addr.PublicIp; import com.cloud.network.dao.FirewallRulesDao; import com.cloud.network.dao.IPAddressDao; @@ -127,8 +126,8 @@ import com.cloud.network.dao.NetworkRuleConfigDao; import com.cloud.network.dao.RemoteAccessVpnDao; import com.cloud.network.dao.VpnUserDao; import com.cloud.network.lb.LoadBalancingRule; -import com.cloud.network.lb.LoadBalancingRule.LbDestination; import com.cloud.network.lb.LoadBalancingRulesManager; +import com.cloud.network.lb.LoadBalancingRule.LbDestination; import com.cloud.network.ovs.GreTunnelException; import com.cloud.network.ovs.OvsNetworkManager; import com.cloud.network.router.VirtualRouter.Role; @@ -177,11 +176,11 @@ import com.cloud.vm.ReservationContext; import com.cloud.vm.UserVmVO; import com.cloud.vm.VMInstanceVO; import com.cloud.vm.VirtualMachine; -import com.cloud.vm.VirtualMachine.State; import com.cloud.vm.VirtualMachineGuru; import com.cloud.vm.VirtualMachineManager; import com.cloud.vm.VirtualMachineName; import com.cloud.vm.VirtualMachineProfile; +import com.cloud.vm.VirtualMachine.State; import com.cloud.vm.dao.DomainRouterDao; import com.cloud.vm.dao.NicDao; import com.cloud.vm.dao.UserVmDao; @@ -1034,24 +1033,9 @@ public class VirtualNetworkApplianceManagerImpl implements VirtualNetworkApplian } else { EventUtils.saveEvent(User.UID_SYSTEM, owner.getAccountId(), EventVO.LEVEL_ERROR, EventTypes.EVENT_ROUTER_CREATE, "router creation failed", startEventId); } - - } - State state = router.getState(); - - if ( state == State.Starting ) { - // wait 300 seconds - for ( int i = 0; i < 300; ) { - try { - Thread.sleep(2); - } catch (Exception e) { - } - i += 2; - state = router.getState(); - if ( state != State.Starting ) { - break; - } - } } + + State state = router.getState(); if (state != State.Starting && state != State.Running) { long startEventId = EventUtils.saveStartedEvent(User.UID_SYSTEM, owner.getId(), EventTypes.EVENT_ROUTER_START, "Starting router : " +router.getName()); router = this.start(router, _accountService.getSystemUser(), _accountService.getSystemAccount()); @@ -1061,11 +1045,8 @@ public class VirtualNetworkApplianceManagerImpl implements VirtualNetworkApplian EventUtils.saveEvent(User.UID_SYSTEM, owner.getAccountId(), EventVO.LEVEL_ERROR, EventTypes.EVENT_ROUTER_START, "failed to start router", startEventId); } } - state = router.getState(); - if ( state == State.Running ) { - return router; - } - throw new CloudRuntimeException(router.getName() + " is not running , it is in " + state); + + return router; } @Override diff --git a/server/src/com/cloud/vm/dao/UserVmDaoImpl.java b/server/src/com/cloud/vm/dao/UserVmDaoImpl.java index 41170718b4c..c3fcd3c9d39 100755 --- a/server/src/com/cloud/vm/dao/UserVmDaoImpl.java +++ b/server/src/com/cloud/vm/dao/UserVmDaoImpl.java @@ -62,6 +62,7 @@ public class UserVmDaoImpl extends GenericDaoBase implements Use protected final SearchBuilder DestroySearch; protected SearchBuilder AccountDataCenterVirtualSearch; + protected SearchBuilder UserVmSearch; protected final Attribute _updateTimeAttr; protected final UserVmDetailsDaoImpl _detailsDao = ComponentLocator.inject(UserVmDetailsDaoImpl.class); @@ -323,18 +324,18 @@ public class UserVmDaoImpl extends GenericDaoBase implements Use @Override public List listByNetworkId(long networkId) { - if (AccountDataCenterVirtualSearch == null) { + if (UserVmSearch == null) { NicDao _nicDao = ComponentLocator.getLocator("management-server").getDao(NicDao.class); SearchBuilder nicSearch = _nicDao.createSearchBuilder(); nicSearch.and("networkId", nicSearch.entity().getNetworkId(), SearchCriteria.Op.EQ); nicSearch.and("ip4Address", nicSearch.entity().getIp4Address(), SearchCriteria.Op.NNULL); - AccountDataCenterVirtualSearch = createSearchBuilder(); - AccountDataCenterVirtualSearch.join("nicSearch", nicSearch, AccountDataCenterVirtualSearch.entity().getId(), nicSearch.entity().getInstanceId(), JoinBuilder.JoinType.INNER); - AccountDataCenterVirtualSearch.done(); + UserVmSearch = createSearchBuilder(); + UserVmSearch.join("nicSearch", nicSearch, UserVmSearch.entity().getId(), nicSearch.entity().getInstanceId(), JoinBuilder.JoinType.INNER); + UserVmSearch.done(); } - SearchCriteria sc = AccountDataCenterVirtualSearch.create(); + SearchCriteria sc = UserVmSearch.create(); sc.setJoinParameters("nicSearch", "networkId", networkId); return listBy(sc); diff --git a/ui/scripts/cloud.core.instance.js b/ui/scripts/cloud.core.instance.js index a1a1530301d..6769f01ed59 100644 --- a/ui/scripts/cloud.core.instance.js +++ b/ui/scripts/cloud.core.instance.js @@ -174,12 +174,9 @@ function bindStartVMButton() { inProcessText: "Starting Instance....", asyncJobResponse: "startvirtualmachineresponse", afterActionSeccessFn: function(json, $midmenuItem1, id) { - var jsonObj = json.queryasyncjobresultresponse.jobresult.virtualmachine; - - vmToMidmenu(jsonObj, $midmenuItem1); - if( ($("#right_panel_content #tab_content_details").length > 0) - && ($("#right_panel_content #tab_content_details").data("jsonObj") != null ) - && (jsonObj.id == $("#right_panel_content #tab_content_details").data("jsonObj").id)) + var jsonObj = json.queryasyncjobresultresponse.jobresult.virtualmachine; + vmToMidmenu(jsonObj, $midmenuItem1); + if(jsonObj.id.toString() == $("#right_panel_content #tab_content_details").find("#id").text()) vmToRightPanel($midmenuItem1); } } @@ -225,10 +222,8 @@ function bindStopVMButton() { afterActionSeccessFn: function(json, $midmenuItem1, id) { var jsonObj = json.queryasyncjobresultresponse.jobresult.virtualmachine; vmToMidmenu(jsonObj, $midmenuItem1); - if( ($("#right_panel_content #tab_content_details").length > 0) - && ($("#right_panel_content #tab_content_details").data("jsonObj") != null ) - && (jsonObj.id == $("#right_panel_content #tab_content_details").data("jsonObj").id)) - vmToRightPanel($midmenuItem1); + if(jsonObj.id.toString() == $("#right_panel_content #tab_content_details").find("#id").text()) + vmToRightPanel($midmenuItem1); } } @@ -273,10 +268,8 @@ function bindRebootVMButton() { afterActionSeccessFn: function(json, $midmenuItem1, id) { var jsonObj = json.queryasyncjobresultresponse.jobresult.virtualmachine; vmToMidmenu(jsonObj, $midmenuItem1); - if( ($("#right_panel_content #tab_content_details").length > 0) - && ($("#right_panel_content #tab_content_details").data("jsonObj") != null ) - && (jsonObj.id == $("#right_panel_content #tab_content_details").data("jsonObj").id)) - vmToRightPanel($midmenuItem1); + if(jsonObj.id.toString() == $("#right_panel_content #tab_content_details").find("#id").text()) + vmToRightPanel($midmenuItem1); } } @@ -321,10 +314,8 @@ function bindDestroyVMButton() { afterActionSeccessFn: function(json, $midmenuItem1, id) { var jsonObj = json.queryasyncjobresultresponse.jobresult.virtualmachine; vmToMidmenu(jsonObj, $midmenuItem1); - if( ($("#right_panel_content #tab_content_details").length > 0) - && ($("#right_panel_content #tab_content_details").data("jsonObj") != null ) - && (jsonObj.id == $("#right_panel_content #tab_content_details").data("jsonObj").id)) - vmToRightPanel($midmenuItem1); + if(jsonObj.id.toString() == $("#right_panel_content #tab_content_details").find("#id").text()) + vmToRightPanel($midmenuItem1); } } diff --git a/ui/scripts/cloud.core.js b/ui/scripts/cloud.core.js index 216ba58839b..18f6a38acda 100644 --- a/ui/scripts/cloud.core.js +++ b/ui/scripts/cloud.core.js @@ -399,14 +399,14 @@ function doActionToMidMenu(id, apiInfo, apiCommand) { $("body").stopTime(timerKey); $midmenuItem1.find("#content").removeClass("inaction"); $midmenuItem1.find("#spinning_wheel").hide(); - hideDetailsTabActionSpinningWheel(id, inProcessText); + hideDetailsTabActionSpinningWheel(id, inProcessText, $midmenuItem1); if (result.jobstatus == 1) { // Succeeded $midmenuItem1.find("#info_icon").removeClass("error").show(); $midmenuItem1.data("afterActionInfo", (label + " action succeeded.")); afterActionSeccessFn(json, $midmenuItem1, id); - } else if (result.jobstatus == 2) { // Failed - $midmenuItem1.find("#info_icon").addClass("error").show(); - $midmenuItem1.data("afterActionInfo", (label + " action failed. Reason: " + fromdb(result.jobresult.errortext))); + } else if (result.jobstatus == 2) { // Failed + var errorMsg = label + " action failed. Reason: " + fromdb(result.jobresult.errortext); + handleErrorInMidMenu2(errorMsg, $midmenuItem1, id, inProcessText); } } }, @@ -438,7 +438,7 @@ function doActionToMidMenu(id, apiInfo, apiCommand) { $midmenuItem1.find("#spinning_wheel").hide(); $midmenuItem1.find("#info_icon").removeClass("error").show(); $midmenuItem1.data("afterActionInfo", (label + " action succeeded.")); - hideDetailsTabActionSpinningWheel(id, inProcessText); + hideDetailsTabActionSpinningWheel(id, inProcessText, $midmenuItem1); afterActionSeccessFn(json, $midmenuItem1, id); }, error: function(XMLHttpResponse) { @@ -449,29 +449,34 @@ function doActionToMidMenu(id, apiInfo, apiCommand) { //Sync job (end) ***** } -function handleErrorInMidMenu(XMLHttpResponse, $midmenuItem1, id, inProcessText) { - $midmenuItem1.find("#content").removeClass("inaction"); - $midmenuItem1.find("#spinning_wheel").hide(); - $midmenuItem1.find("#info_icon").addClass("error").show(); - $midmenuItem1.find("#first_row").text("Action failed"); - hideDetailsTabActionSpinningWheel(id, inProcessText); - +function handleErrorInMidMenu(XMLHttpResponse, $midmenuItem1, id, inProcessText) { var errorMsg = ""; if(XMLHttpResponse.responseText != null & XMLHttpResponse.responseText.length > 0) { errorMsg = parseXMLHttpResponse(XMLHttpResponse); } + handleErrorInMidMenu2(errorMsg, $midmenuItem1, id, inProcessText); +} + +function handleErrorInMidMenu2(errorMsg, $midmenuItem1, id, inProcessText) { + $midmenuItem1.find("#content").removeClass("inaction"); + $midmenuItem1.find("#spinning_wheel").hide(); + $midmenuItem1.find("#info_icon").addClass("error").show(); + //$midmenuItem1.find("#first_row").text("Action failed"); + $midmenuItem1.data("afterActionInfo", errorMsg); + hideDetailsTabActionSpinningWheel(id, inProcessText, $midmenuItem1); + if(errorMsg.length > 0) $midmenuItem1.find("#second_row").text(fromdb(errorMsg)); else $midmenuItem1.find("#second_row").html(" "); } -function hideDetailsTabActionSpinningWheel(id, inProcessText) { +function hideDetailsTabActionSpinningWheel(id, inProcessText, $midmenuItem1) { var $detailsTab = $("#right_panel_content #tab_content_details"); var jsonObj = $detailsTab.data("jsonObj"); var $spinningWheel = $detailsTab.find("#spinning_wheel"); - if(jsonObj != null && ("id" in jsonObj) && jsonObj.id == id && ($spinningWheel.find("#description").text() == inProcessText)) { - $spinningWheel.hide(); + if((id == $detailsTab.find("#id").text()) && (inProcessText == $spinningWheel.find("#description").text())) { + copyActionInfoFromMidMenuToRightPanel($midmenuItem1); } } @@ -506,14 +511,17 @@ function copyActionInfoFromMidMenuToRightPanel($midmenuItem1) { } var $midMenuSpinningWheel = $midmenuItem1.find("#spinning_wheel"); - if($midMenuSpinningWheel.css("display") != "none") { - var $detailsTabSpinningWheel = $("#right_panel_content #tab_content_details").find("#spinning_wheel"); + var $detailsTabSpinningWheel = $("#right_panel_content #tab_content_details").find("#spinning_wheel"); + if($midMenuSpinningWheel.css("display") != "none") { if($detailsTabSpinningWheel.css("display") == "none") { var inProcessText = $midMenuSpinningWheel.data("inProcessText"); $detailsTabSpinningWheel.find("#description").text(inProcessText); $detailsTabSpinningWheel.show(); } } + else { + $detailsTabSpinningWheel.hide(); + } } //***** actions for middle menu (end) ************************************************************************** diff --git a/utils/.classpath b/utils/.classpath index a2f59b44764..e1b97740fe8 100644 --- a/utils/.classpath +++ b/utils/.classpath @@ -1,13 +1,16 @@ - - - - - - - - - - - - - + + + + + + + + + + + + + + + +