def satisfied_by_node(self, node: "Node") -> SatisfiedResult:
        reasons: List[str] = []
        xor_result: Optional[SatisfiedResult] = None

        for n, c in enumerate(self.constraints):
            expr_result = c.satisfied_by_node(node)

            if expr_result:
                # true ^ true == false

                if xor_result:
                    msg = "Multiple expressions evaluated as true. See below:\n\t{}\n\t{}".format(
                        xor_result.message, expr_result.message)
                    return SatisfiedResult(
                        "XORFailed",
                        self,
                        node,
                        [msg] + reasons,
                    )
                # assign the first true expression as the final result
                xor_result = expr_result
            elif hasattr(expr_result, "reasons"):
                # if this does end up failing for all expressions, keep
                # track of the set of reasons
                reasons.extend(expr_result.reasons)

        if xor_result:
            return xor_result

        return SatisfiedResult("CompoundFailure", self, node, reasons)
示例#2
0
    def satisfied_by_node(self, node: Node) -> SatisfiedResult:

        if node.memory / node.vcpu_count > 8:
            return SatisfiedResult("success", self, node)

        return SatisfiedResult(
            "failed", self, node, reasons=["Not enough memory per core"],
        )
 def satisfied_by_node(self, node: "Node") -> SatisfiedResult:
     if self.resource_name not in node.resources:
         return SatisfiedResult(
             "MissingResourceForAlias",
             self,
             node,
             reasons=[
                 "{} does not have resource {}".format(
                     node, self.resource_name)
             ],
         )
     return SatisfiedResult("success", self, node)
    def satisfied_by_node(self, node: "Node") -> SatisfiedResult:
        # TODO clean up
        if node.assignments or node.closed:

            if self.job_exclusive or self.assignment_id not in node.assignments:
                msg = "[name={} hostname={}] already has an exclusive job: {}".format(
                    node.name, node.hostname, node.assignments)
                return SatisfiedResult(
                    "ExclusiveRequirementFailed",
                    self,
                    node,
                    [msg],
                )
        return SatisfiedResult("success", self, node)
 def satisfied_by_node(self, node: "Node") -> SatisfiedResult:
     if node.placement_group:
         return SatisfiedResult(
             "success",
             self,
             node,
         )
     msg = "Node[name={} hostname={}] is not in a placement group".format(
         node.name, node.hostname)
     return SatisfiedResult(
         "NotInAPlacementGroup",
         self,
         node,
         [msg],
     )
示例#6
0
    def satisfied_by_node(self, node: Node) -> SatisfiedResult:
        user_list = node.resources.get("owner")
        if user_list is None:
            user_list = self.user_list

        if self.user in user_list:
            return SatisfiedResult("success", self, node)
        msg = "{} does not include user {} in its user list {}".format(
            node, self.user, self.user_list)
        return SatisfiedResult(
            "InvalidUser",
            self,
            node,
            reasons=[msg],
        )
示例#7
0
    def satisfied_by_node(self, node: Node) -> SatisfiedResult:
        project_list = node.resources.get("project")
        if project_list is None:
            project_list = self.project_list

        if self.project in project_list:
            return SatisfiedResult("success", self, node)

        msg = "{} does not include project {} in its project list {}".format(
            node, self.project, project_list)
        return SatisfiedResult(
            "InvalidUser",
            self,
            node,
            reasons=[msg],
        )
示例#8
0
    def satisfied_by_node(self, node: Node) -> SatisfiedResult:
        xproject_list = node.resources.get("xproject")
        if xproject_list is None:
            xproject_list = self.xproject_list

        # it is not excluded
        if self.project not in xproject_list:
            return SatisfiedResult("success", self, node)

        msg = "{} has project {} in its xproject list {}".format(
            node, self.project, xproject_list)
        return SatisfiedResult(
            "ExcludedProject",
            self,
            node,
            reasons=[msg],
        )
示例#9
0
    def satisfied_by_node(self, node: Node) -> SatisfiedResult:
        xuser_list = node.resources.get("xowner")
        if xuser_list is None:
            xuser_list = self.xuser_list

        # it is not excluded
        if self.user not in xuser_list:
            return SatisfiedResult("success", self, node)

        msg = "{} has user {} in its xuser list {}".format(
            node, self.user, xuser_list)
        return SatisfiedResult(
            "ExcludedUser",
            self,
            node,
            reasons=[msg],
        )
示例#10
0
    def satisfied_by_node(self, node: "Node") -> SatisfiedResult:

        for c in self.constraints:
            result = c.satisfied_by_node(node)
            if not result:
                return result

        return SatisfiedResult("success", self, node)
示例#11
0
    def satisfied_by_node(self, node: "Node") -> SatisfiedResult:
        reasons: List[str] = []
        for n, c in enumerate(self.constraints):
            result = c.satisfied_by_node(node)

            if result:
                return SatisfiedResult(
                    "success",
                    self,
                    node,
                    score=len(self.constraints) - n,
                )

            if hasattr(result, "reasons"):
                reasons.extend(result.reasons)

        return SatisfiedResult("CompoundFailure", self, node, reasons)
示例#12
0
    def satisfied_by_node(self, node: "Node") -> SatisfiedResult:
        err_msg = self._satisfied(node)

        if err_msg:
            return SatisfiedResult(
                "InvalidOption",
                self,
                node,
                [err_msg],
            )

        # our score is our inverted index - i.e. the first element is the highest score
        target = getattr(node, self.attr)
        score = len(self.values) - self.values.index(target)
        return SatisfiedResult(
            "success",
            self,
            node,
            score=score,
        )
示例#13
0
    def satisfied_by_node(self, node: "Node") -> SatisfiedResult:

        if self.attr not in node.available:
            # TODO log
            msg = "Resource[name={}] is not defined for Node[name={}]".format(
                self.attr, node.name)
            return SatisfiedResult(
                "UndefinedResource",
                self,
                node,
                [msg],
            )

        try:
            if node.available[self.attr] >= self.value:
                return SatisfiedResult(
                    "success",
                    self,
                    node,
                )
        except TypeError as e:
            logging.warning(
                "For attribute %s: Could not evaluate %s >= %s because they are different types: %s",
                self.attr,
                node.available[self.attr],
                self.value,
                e,
            )

        msg = "Resource[name={} value={}] < Node[name={} value={}]".format(
            self.attr,
            self.value,
            node.name,
            node.available[self.attr],
        )
        return SatisfiedResult(
            "InsufficientResource",
            self,
            node,
            reasons=[msg],
        )
示例#14
0
    def satisfied_by_node(self, node: "Node") -> SatisfiedResult:
        if self.attr not in node.available:
            return SatisfiedResult(
                "UndefinedResource",
                self,
                node,
                [
                    "Resource[name={}] not defined for Node[name={} hostname={}]"
                    .format(self.attr, node.name, node.hostname)
                ],
            )
        target = node.available[self.attr]

        if target not in self.values:
            if len(self.values) > 1:
                msg = "Resource[name={} value={}] is not one of the options {} for node[name={} attr={}]".format(
                    self.attr,
                    target,
                    self.values,
                    node.name,
                    self.attr,
                )
            else:
                msg = "Resource[name={} value={}] != node[name={} {}={}]".format(
                    self.attr, target, node.name, self.attr, self.values[0])

            return SatisfiedResult(
                "InvalidOption",
                self,
                node,
                [msg],
            )
        # so we want
        score = len(self.values) - self.values.index(target) + 1
        return SatisfiedResult(
            "success",
            self,
            node,
            score=score,
        )
示例#15
0
    def satisfied_by_node(self, node: "Node") -> SatisfiedResult:

        if node._allocated:
            return SatisfiedResult("AlreadyAllocated", self, node)

        return SatisfiedResult("success", self, node)
示例#16
0
    def satisfied_by_node(self, node: "Node") -> SatisfiedResult:

        result = self.condition.satisfied_by_node(node)
        # TODO ugly
        status = "success" if not result else "not(success)"
        return SatisfiedResult(status, self, node, [str(self)])
 def satisfied_by_node(self, node: Node) -> SatisfiedResult:
     return SatisfiedResult("success")
示例#18
0
 def satisfied_by_node(self, node: "Node") -> SatisfiedResult:
     return SatisfiedResult("Never", self, node, reasons=[self.message])