Revision 76431533 lib/hypervisor/hv_kvm.py
b/lib/hypervisor/hv_kvm.py | ||
---|---|---|
37 | 37 |
from ganeti import errors |
38 | 38 |
from ganeti import serializer |
39 | 39 |
from ganeti import objects |
40 |
from ganeti import uidpool |
|
41 |
from ganeti import ssconf |
|
40 | 42 |
from ganeti.hypervisor import hv_base |
41 | 43 |
|
42 | 44 |
|
... | ... | |
559 | 561 |
kvm_nics = [objects.NIC.FromDict(snic) for snic in serialized_nics] |
560 | 562 |
return (kvm_cmd, kvm_nics, hvparams) |
561 | 563 |
|
564 |
def _RunKVMCmd(self, name, kvm_cmd): |
|
565 |
"""Run the KVM cmd and check for errors |
|
566 |
|
|
567 |
@type name: string |
|
568 |
@param name: instance name |
|
569 |
@type kvm_cmd: list of strings |
|
570 |
@param kvm_cmd: runcmd input for kvm |
|
571 |
|
|
572 |
""" |
|
573 |
result = utils.RunCmd(kvm_cmd) |
|
574 |
if result.failed: |
|
575 |
raise errors.HypervisorError("Failed to start instance %s: %s (%s)" % |
|
576 |
(name, result.fail_reason, result.output)) |
|
577 |
if not self._InstancePidAlive(name)[2]: |
|
578 |
raise errors.HypervisorError("Failed to start instance %s" % name) |
|
579 |
|
|
562 | 580 |
def _ExecuteKVMRuntime(self, instance, kvm_runtime, incoming=None): |
563 | 581 |
"""Execute a KVM cmd, after completing it with some last minute data |
564 | 582 |
|
... | ... | |
607 | 625 |
raise errors.HypervisorError("Failed to open VNC password file %s: %s" |
608 | 626 |
% (vnc_pwd_file, err)) |
609 | 627 |
|
610 |
result = utils.RunCmd(kvm_cmd) |
|
611 |
if result.failed: |
|
612 |
raise errors.HypervisorError("Failed to start instance %s: %s (%s)" % |
|
613 |
(name, result.fail_reason, result.output)) |
|
614 |
|
|
615 |
if not self._InstancePidAlive(name)[2]: |
|
616 |
raise errors.HypervisorError("Failed to start instance %s" % name) |
|
628 |
if security_model == constants.HT_SM_POOL: |
|
629 |
ss = ssconf.SimpleStore() |
|
630 |
uid_pool = uidpool.ParseUidPool(ss.GetUidPool(), separator="\n") |
|
631 |
all_uids = set(uidpool.ExpandUidPool(uid_pool)) |
|
632 |
uid = uidpool.RequestUnusedUid(all_uids) |
|
633 |
try: |
|
634 |
username = pwd.getpwuid(uid.GetUid()).pw_name |
|
635 |
kvm_cmd.extend(["-runas", username]) |
|
636 |
self._RunKVMCmd(name, kvm_cmd) |
|
637 |
except: |
|
638 |
uidpool.ReleaseUid(uid) |
|
639 |
raise |
|
640 |
else: |
|
641 |
uid.Unlock() |
|
642 |
utils.WriteFile(self._InstanceUidFile(name), data=str(uid)) |
|
643 |
else: |
|
644 |
self._RunKVMCmd(name, kvm_cmd) |
|
617 | 645 |
|
618 | 646 |
if vnc_pwd: |
619 | 647 |
change_cmd = 'change vnc password %s' % vnc_pwd |
... | ... | |
892 | 920 |
if hvparams[constants.HV_SECURITY_DOMAIN]: |
893 | 921 |
raise errors.HypervisorError("Cannot have a security domain when the" |
894 | 922 |
" security model is 'none' or 'pool'") |
895 |
if security_model == constants.HT_SM_POOL: |
|
896 |
raise errors.HypervisorError("Security model pool is not supported yet") |
|
897 | 923 |
|
898 | 924 |
@classmethod |
899 | 925 |
def ValidateParameters(cls, hvparams): |
Also available in: Unified diff