123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111 |
- package genericresource
- import (
- "github.com/docker/swarmkit/api"
- )
- // NewSet creates a set object
- func NewSet(key string, vals ...string) []*api.GenericResource {
- rs := make([]*api.GenericResource, 0, len(vals))
- for _, v := range vals {
- rs = append(rs, NewString(key, v))
- }
- return rs
- }
- // NewString creates a String resource
- func NewString(key, val string) *api.GenericResource {
- return &api.GenericResource{
- Resource: &api.GenericResource_NamedResourceSpec{
- NamedResourceSpec: &api.NamedGenericResource{
- Kind: key,
- Value: val,
- },
- },
- }
- }
- // NewDiscrete creates a Discrete resource
- func NewDiscrete(key string, val int64) *api.GenericResource {
- return &api.GenericResource{
- Resource: &api.GenericResource_DiscreteResourceSpec{
- DiscreteResourceSpec: &api.DiscreteGenericResource{
- Kind: key,
- Value: val,
- },
- },
- }
- }
- // GetResource returns resources from the "resources" parameter matching the kind key
- func GetResource(kind string, resources []*api.GenericResource) []*api.GenericResource {
- var res []*api.GenericResource
- for _, r := range resources {
- if Kind(r) != kind {
- continue
- }
- res = append(res, r)
- }
- return res
- }
- // ConsumeNodeResources removes "res" from nodeAvailableResources
- func ConsumeNodeResources(nodeAvailableResources *[]*api.GenericResource, res []*api.GenericResource) {
- if nodeAvailableResources == nil {
- return
- }
- w := 0
- loop:
- for _, na := range *nodeAvailableResources {
- for _, r := range res {
- if Kind(na) != Kind(r) {
- continue
- }
- if remove(na, r) {
- continue loop
- }
- // If this wasn't the right element then
- // we need to continue
- }
- (*nodeAvailableResources)[w] = na
- w++
- }
- *nodeAvailableResources = (*nodeAvailableResources)[:w]
- }
- // Returns true if the element is to be removed from the list
- func remove(na, r *api.GenericResource) bool {
- switch tr := r.Resource.(type) {
- case *api.GenericResource_DiscreteResourceSpec:
- if na.GetDiscreteResourceSpec() == nil {
- return false // Type change, ignore
- }
- na.GetDiscreteResourceSpec().Value -= tr.DiscreteResourceSpec.Value
- if na.GetDiscreteResourceSpec().Value <= 0 {
- return true
- }
- case *api.GenericResource_NamedResourceSpec:
- if na.GetNamedResourceSpec() == nil {
- return false // Type change, ignore
- }
- if tr.NamedResourceSpec.Value != na.GetNamedResourceSpec().Value {
- return false // not the right item, ignore
- }
- return true
- }
- return false
- }
|