scheduler: implement role awareness
This commit is contained in:
@@ -17,6 +17,7 @@ limitations under the License.
|
||||
package executor
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"strings"
|
||||
@@ -33,6 +34,7 @@ import (
|
||||
"k8s.io/kubernetes/contrib/mesos/pkg/executor/messages"
|
||||
"k8s.io/kubernetes/contrib/mesos/pkg/node"
|
||||
"k8s.io/kubernetes/contrib/mesos/pkg/podutil"
|
||||
"k8s.io/kubernetes/contrib/mesos/pkg/scheduler/executorinfo"
|
||||
"k8s.io/kubernetes/contrib/mesos/pkg/scheduler/meta"
|
||||
"k8s.io/kubernetes/pkg/api"
|
||||
unversionedapi "k8s.io/kubernetes/pkg/api/unversioned"
|
||||
@@ -223,13 +225,21 @@ func (k *Executor) sendPodsSnapshot() bool {
|
||||
}
|
||||
|
||||
// Registered is called when the executor is successfully registered with the slave.
|
||||
func (k *Executor) Registered(driver bindings.ExecutorDriver,
|
||||
executorInfo *mesos.ExecutorInfo, frameworkInfo *mesos.FrameworkInfo, slaveInfo *mesos.SlaveInfo) {
|
||||
func (k *Executor) Registered(
|
||||
driver bindings.ExecutorDriver,
|
||||
executorInfo *mesos.ExecutorInfo,
|
||||
frameworkInfo *mesos.FrameworkInfo,
|
||||
slaveInfo *mesos.SlaveInfo,
|
||||
) {
|
||||
if k.isDone() {
|
||||
return
|
||||
}
|
||||
log.Infof("Executor %v of framework %v registered with slave %v\n",
|
||||
executorInfo, frameworkInfo, slaveInfo)
|
||||
|
||||
log.Infof(
|
||||
"Executor %v of framework %v registered with slave %v\n",
|
||||
executorInfo, frameworkInfo, slaveInfo,
|
||||
)
|
||||
|
||||
if !(&k.state).transition(disconnectedState, connectedState) {
|
||||
log.Errorf("failed to register/transition to a connected state")
|
||||
}
|
||||
@@ -241,8 +251,22 @@ func (k *Executor) Registered(driver bindings.ExecutorDriver,
|
||||
}
|
||||
}
|
||||
|
||||
annotations, err := executorInfoToAnnotations(executorInfo)
|
||||
if err != nil {
|
||||
log.Errorf(
|
||||
"cannot get node annotations from executor info %v error %v",
|
||||
executorInfo, err,
|
||||
)
|
||||
}
|
||||
|
||||
if slaveInfo != nil {
|
||||
_, err := node.CreateOrUpdate(k.client, slaveInfo.GetHostname(), node.SlaveAttributesToLabels(slaveInfo.Attributes))
|
||||
_, err := node.CreateOrUpdate(
|
||||
k.client,
|
||||
slaveInfo.GetHostname(),
|
||||
node.SlaveAttributesToLabels(slaveInfo.Attributes),
|
||||
annotations,
|
||||
)
|
||||
|
||||
if err != nil {
|
||||
log.Errorf("cannot update node labels: %v", err)
|
||||
}
|
||||
@@ -270,7 +294,13 @@ func (k *Executor) Reregistered(driver bindings.ExecutorDriver, slaveInfo *mesos
|
||||
}
|
||||
|
||||
if slaveInfo != nil {
|
||||
_, err := node.CreateOrUpdate(k.client, slaveInfo.GetHostname(), node.SlaveAttributesToLabels(slaveInfo.Attributes))
|
||||
_, err := node.CreateOrUpdate(
|
||||
k.client,
|
||||
slaveInfo.GetHostname(),
|
||||
node.SlaveAttributesToLabels(slaveInfo.Attributes),
|
||||
nil, // don't change annotations
|
||||
)
|
||||
|
||||
if err != nil {
|
||||
log.Errorf("cannot update node labels: %v", err)
|
||||
}
|
||||
@@ -988,3 +1018,20 @@ func nodeInfo(si *mesos.SlaveInfo, ei *mesos.ExecutorInfo) NodeInfo {
|
||||
}
|
||||
return ni
|
||||
}
|
||||
|
||||
func executorInfoToAnnotations(ei *mesos.ExecutorInfo) (annotations map[string]string, err error) {
|
||||
annotations = map[string]string{}
|
||||
if ei == nil {
|
||||
return
|
||||
}
|
||||
|
||||
var buf bytes.Buffer
|
||||
if err = executorinfo.EncodeResources(&buf, ei.GetResources()); err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
annotations[meta.ExecutorIdKey] = ei.GetExecutorId().GetValue()
|
||||
annotations[meta.ExecutorResourcesKey] = buf.String()
|
||||
|
||||
return
|
||||
}
|
||||
|
Reference in New Issue
Block a user