예제 #1
0
class IAReqInstanceAlloc(IARequestBase):
    """An instance allocation request.

  """
    # pylint: disable=E1101
    MODE = constants.IALLOCATOR_MODE_ALLOC
    REQ_PARAMS = [
        _INST_NAME,
        ("memory", ht.TNonNegativeInt),
        ("spindle_use", ht.TNonNegativeInt),
        ("disks", ht.TListOf(ht.TDict)),
        ("disk_template", ht.TString),
        ("group_name", ht.TMaybe(ht.TNonEmptyString)),
        ("os", ht.TString),
        ("tags", _STRING_LIST),
        ("nics", ht.TListOf(ht.TDict)),
        ("vcpus", ht.TInt),
        ("hypervisor", ht.TString),
        ("node_whitelist", ht.TMaybeListOf(ht.TNonEmptyString)),
    ]
    REQ_RESULT = ht.TList

    def RequiredNodes(self):
        """Calculates the required nodes based on the disk_template.

    """
        if self.disk_template in constants.DTS_INT_MIRROR:
            return 2
        else:
            return 1

    def GetRequest(self, cfg):
        """Requests a new instance.

    The checks for the completeness of the opcode must have already been
    done.

    """
        for d in self.disks:
            d[constants.IDISK_TYPE] = self.disk_template
        disk_space = gmi.ComputeDiskSize(self.disks)

        return {
            "name": self.name,
            "disk_template": self.disk_template,
            "group_name": self.group_name,
            "tags": self.tags,
            "os": self.os,
            "vcpus": self.vcpus,
            "memory": self.memory,
            "spindle_use": self.spindle_use,
            "disks": self.disks,
            "disk_space_total": disk_space,
            "nics": self.nics,
            "required_nodes": self.RequiredNodes(),
            "hypervisor": self.hypervisor,
        }

    def ValidateResult(self, ia, result):
        """Validates an single instance allocation request.

    """
        IARequestBase.ValidateResult(self, ia, result)

        if ia.success and len(result) != self.RequiredNodes():
            raise errors.ResultValidationError(
                "iallocator returned invalid number"
                " of nodes (%s), required %s" %
                (len(result), self.RequiredNodes()))
예제 #2
0
from ganeti import ht
from ganeti import locking
from ganeti.masterd import iallocator
from ganeti import netutils
from ganeti import objects
from ganeti import pathutils
from ganeti import utils
from ganeti.cmdlib.common import AnnotateDiskParams, \
  ComputeIPolicyInstanceViolation, CheckDiskTemplateEnabled, \
  ComputeIPolicySpecViolation

#: Type description for changes as returned by L{ApplyContainerMods}'s
#: callbacks
_TApplyContModsCbChanges = \
  ht.TMaybeListOf(ht.TAnd(ht.TIsLength(2), ht.TItems([
    ht.TNonEmptyString,
    ht.TAny,
    ])))


def BuildInstanceHookEnv(name, primary_node_name, secondary_node_names,
                         os_type, status, minmem, maxmem, vcpus, nics,
                         disk_template, disks, bep, hvp, hypervisor_name,
                         tags):
    """Builds instance related env variables for hooks

  This builds the hook environment from individual variables.

  @type name: string
  @param name: the name of the instance
  @type primary_node_name: string
  @param primary_node_name: the name of the instance's primary node