github.com/kaisenlinux/docker@v0.0.0-20230510090727-ea55db55fac7/swarmkit/api/genericresource/validate.go (about)

     1  package genericresource
     2  
     3  import (
     4  	"fmt"
     5  
     6  	"github.com/docker/swarmkit/api"
     7  )
     8  
     9  // ValidateTask validates that the task only uses integers
    10  // for generic resources
    11  func ValidateTask(resources *api.Resources) error {
    12  	for _, v := range resources.Generic {
    13  		if v.GetDiscreteResourceSpec() != nil {
    14  			continue
    15  		}
    16  
    17  		return fmt.Errorf("invalid argument for resource %s", Kind(v))
    18  	}
    19  
    20  	return nil
    21  }
    22  
    23  // HasEnough returns true if node can satisfy the task's GenericResource request
    24  func HasEnough(nodeRes []*api.GenericResource, taskRes *api.GenericResource) (bool, error) {
    25  	t := taskRes.GetDiscreteResourceSpec()
    26  	if t == nil {
    27  		return false, fmt.Errorf("task should only hold Discrete type")
    28  	}
    29  
    30  	if nodeRes == nil {
    31  		return false, nil
    32  	}
    33  
    34  	nrs := GetResource(t.Kind, nodeRes)
    35  	if len(nrs) == 0 {
    36  		return false, nil
    37  	}
    38  
    39  	switch nr := nrs[0].Resource.(type) {
    40  	case *api.GenericResource_DiscreteResourceSpec:
    41  		if t.Value > nr.DiscreteResourceSpec.Value {
    42  			return false, nil
    43  		}
    44  	case *api.GenericResource_NamedResourceSpec:
    45  		if t.Value > int64(len(nrs)) {
    46  			return false, nil
    47  		}
    48  	}
    49  
    50  	return true, nil
    51  }
    52  
    53  // HasResource checks if there is enough "res" in the "resources" argument
    54  func HasResource(res *api.GenericResource, resources []*api.GenericResource) bool {
    55  	for _, r := range resources {
    56  		if Kind(res) != Kind(r) {
    57  			continue
    58  		}
    59  
    60  		switch rtype := r.Resource.(type) {
    61  		case *api.GenericResource_DiscreteResourceSpec:
    62  			if res.GetDiscreteResourceSpec() == nil {
    63  				return false
    64  			}
    65  
    66  			if res.GetDiscreteResourceSpec().Value < rtype.DiscreteResourceSpec.Value {
    67  				return false
    68  			}
    69  
    70  			return true
    71  		case *api.GenericResource_NamedResourceSpec:
    72  			if res.GetNamedResourceSpec() == nil {
    73  				return false
    74  			}
    75  
    76  			if res.GetNamedResourceSpec().Value != rtype.NamedResourceSpec.Value {
    77  				continue
    78  			}
    79  
    80  			return true
    81  		}
    82  	}
    83  
    84  	return false
    85  }