Search in sources :

Example 1 with LibvirtVmDef

use of com.cloud.hypervisor.kvm.resource.LibvirtVmDef in project cloudstack by apache.

the class LibvirtStartCommandWrapper method execute.

@Override
public Answer execute(final StartCommand command, final LibvirtComputingResource libvirtComputingResource) {
    final VirtualMachineTO vmSpec = command.getVirtualMachine();
    vmSpec.setVncAddr(command.getHostIp());
    final String vmName = vmSpec.getName();
    LibvirtVMDef vm = null;
    DomainState state = DomainState.VIR_DOMAIN_SHUTOFF;
    final KVMStoragePoolManager storagePoolMgr = libvirtComputingResource.getStoragePoolMgr();
    final LibvirtUtilitiesHelper libvirtUtilitiesHelper = libvirtComputingResource.getLibvirtUtilitiesHelper();
    Connect conn = null;
    try {
        vm = libvirtComputingResource.createVMFromSpec(vmSpec);
        conn = libvirtUtilitiesHelper.getConnectionByType(vm.getHvsType());
        Long remainingMem = getFreeMemory(conn, libvirtComputingResource);
        if (remainingMem == null) {
            return new StartAnswer(command, "failed to get free memory");
        } else if (remainingMem < vmSpec.getMinRam()) {
            return new StartAnswer(command, "Not enough memory on the host, remaining: " + remainingMem + ", asking: " + vmSpec.getMinRam());
        }
        final NicTO[] nics = vmSpec.getNics();
        for (final NicTO nic : nics) {
            if (vmSpec.getType() != VirtualMachine.Type.User) {
                nic.setPxeDisable(true);
            }
        }
        libvirtComputingResource.createVbd(conn, vmSpec, vmName, vm);
        if (!storagePoolMgr.connectPhysicalDisksViaVmSpec(vmSpec)) {
            return new StartAnswer(command, "Failed to connect physical disks to host");
        }
        libvirtComputingResource.createVifs(vmSpec, vm);
        s_logger.debug("starting " + vmName + ": " + vm.toString());
        libvirtComputingResource.startVM(conn, vmName, vm.toString());
        for (final NicTO nic : nics) {
            if (nic.isSecurityGroupEnabled() || nic.getIsolationUri() != null && nic.getIsolationUri().getScheme().equalsIgnoreCase(IsolationType.Ec2.toString())) {
                if (vmSpec.getType() != VirtualMachine.Type.User) {
                    libvirtComputingResource.configureDefaultNetworkRulesForSystemVm(conn, vmName);
                    break;
                } else {
                    final List<String> nicSecIps = nic.getNicSecIps();
                    String secIpsStr;
                    final StringBuilder sb = new StringBuilder();
                    if (nicSecIps != null) {
                        for (final String ip : nicSecIps) {
                            sb.append(ip).append(":");
                        }
                        secIpsStr = sb.toString();
                    } else {
                        secIpsStr = "0:";
                    }
                    libvirtComputingResource.defaultNetworkRules(conn, vmName, nic, vmSpec.getId(), secIpsStr);
                }
            }
        }
        // pass cmdline info to system vms
        if (vmSpec.getType() != VirtualMachine.Type.User) {
            //wait and try passCmdLine for 5 minutes at most for CLOUDSTACK-2823
            String controlIp = null;
            for (final NicTO nic : nics) {
                if (nic.getType() == TrafficType.Control) {
                    controlIp = nic.getIp();
                    break;
                }
            }
            for (int count = 0; count < 30; count++) {
                libvirtComputingResource.passCmdLine(vmName, vmSpec.getBootArgs());
                //check router is up?
                final VirtualRoutingResource virtRouterResource = libvirtComputingResource.getVirtRouterResource();
                final boolean result = virtRouterResource.connect(controlIp, 1, 5000);
                if (result) {
                    break;
                }
            }
        }
        state = DomainState.VIR_DOMAIN_RUNNING;
        return new StartAnswer(command);
    } catch (final LibvirtException e) {
        s_logger.warn("LibvirtException ", e);
        if (conn != null) {
            libvirtComputingResource.handleVmStartFailure(conn, vmName, vm);
        }
        return new StartAnswer(command, e.getMessage());
    } catch (final InternalErrorException e) {
        s_logger.warn("InternalErrorException ", e);
        if (conn != null) {
            libvirtComputingResource.handleVmStartFailure(conn, vmName, vm);
        }
        return new StartAnswer(command, e.getMessage());
    } catch (final URISyntaxException e) {
        s_logger.warn("URISyntaxException ", e);
        if (conn != null) {
            libvirtComputingResource.handleVmStartFailure(conn, vmName, vm);
        }
        return new StartAnswer(command, e.getMessage());
    } finally {
        if (state != DomainState.VIR_DOMAIN_RUNNING) {
            storagePoolMgr.disconnectPhysicalDisksViaVmSpec(vmSpec);
        }
    }
}
Also used : KVMStoragePoolManager(com.cloud.hypervisor.kvm.storage.KVMStoragePoolManager) StartAnswer(com.cloud.agent.api.StartAnswer) LibvirtException(org.libvirt.LibvirtException) Connect(org.libvirt.Connect) VirtualRoutingResource(com.cloud.agent.resource.virtualnetwork.VirtualRoutingResource) InternalErrorException(com.cloud.exception.InternalErrorException) URISyntaxException(java.net.URISyntaxException) VirtualMachineTO(com.cloud.agent.api.to.VirtualMachineTO) LibvirtVMDef(com.cloud.hypervisor.kvm.resource.LibvirtVMDef) DomainState(org.libvirt.DomainInfo.DomainState) NicTO(com.cloud.agent.api.to.NicTO)

Aggregations

StartAnswer (com.cloud.agent.api.StartAnswer)1 NicTO (com.cloud.agent.api.to.NicTO)1 VirtualMachineTO (com.cloud.agent.api.to.VirtualMachineTO)1 VirtualRoutingResource (com.cloud.agent.resource.virtualnetwork.VirtualRoutingResource)1 InternalErrorException (com.cloud.exception.InternalErrorException)1 LibvirtVMDef (com.cloud.hypervisor.kvm.resource.LibvirtVMDef)1 KVMStoragePoolManager (com.cloud.hypervisor.kvm.storage.KVMStoragePoolManager)1 URISyntaxException (java.net.URISyntaxException)1 Connect (org.libvirt.Connect)1 DomainState (org.libvirt.DomainInfo.DomainState)1 LibvirtException (org.libvirt.LibvirtException)1