// NewExecutorResourceProcurer returns a Procurement procuring executor resources // If a given offer has no executor IDs set, the given prototype executor resources are considered for procurement. // If a given offer has one executor ID set, only pod resources are being procured. // An offer with more than one executor ID implies an invariant violation and the first executor ID is being considered. func NewExecutorResourceProcurer(rs []*mesos.Resource, registry executorinfo.Registry) Procurement { return ProcurementFunc(func(t *T, _ *api.Node, ps *ProcureState) error { eids := len(ps.offer.GetExecutorIds()) switch { case eids == 0: wantedCpus := resources.Sum(resources.Filter(rs, resources.IsScalar, resources.HasName("cpus"))) wantedMem := resources.Sum(resources.Filter(rs, resources.IsScalar, resources.HasName("mem"))) procuredCpu, remaining := procureScalarResources("cpus", wantedCpus, t.FrameworkRoles, ps.offer.GetResources()) if procuredCpu == nil { return fmt.Errorf("not enough cpu resources for executor: want=%v", wantedCpus) } procuredMem, remaining := procureScalarResources("mem", wantedMem, t.FrameworkRoles, remaining) if procuredMem == nil { return fmt.Errorf("not enough mem resources for executor: want=%v", wantedMem) } ps.offer.Resources = remaining ps.spec.Executor = registry.New(ps.offer.GetHostname(), append(procuredCpu, procuredMem...)) return nil case eids == 1: e, err := registry.Get(ps.offer.GetHostname()) if err != nil { return err } ps.spec.Executor = e return nil default: // offers with more than 1 ExecutorId should be rejected by the // framework long before they arrive here. return fmt.Errorf("got offer with more than 1 executor id: %v", ps.offer.GetExecutorIds()) } }) }