
This commit includes the fundamental components of the Kubernetes Mesos integration: * Kubernetes-Mesos scheduler * Kubernetes-Mesos executor * Supporting libs Dependencies and upstream changes are included in a separate commit for easy review. After this initial upstream, there'll be two PRs following. * km (hypercube) and k8sm-controller-manager #9265 * Static pods support #9077 Fixes applied: - Precise metrics subsystems definitions - mesosphere/kubernetes-mesos#331 - https://github.com/GoogleCloudPlatform/kubernetes/pull/8882#discussion_r31875232 - https://github.com/GoogleCloudPlatform/kubernetes/pull/8882#discussion_r31875240 - Improve comments and add clarifications - Fixes https://github.com/GoogleCloudPlatform/kubernetes/pull/8882#discussion-diff-31875208 - Fixes https://github.com/GoogleCloudPlatform/kubernetes/pull/8882#discussion-diff-31875226 - Fixes https://github.com/GoogleCloudPlatform/kubernetes/pull/8882#discussion-diff-31875227 - Fixes https://github.com/GoogleCloudPlatform/kubernetes/pull/8882#discussion-diff-31875228 - Fixes https://github.com/GoogleCloudPlatform/kubernetes/pull/8882#discussion-diff-31875239 - Fixes https://github.com/GoogleCloudPlatform/kubernetes/pull/8882#discussion-diff-31875243 - Fixes https://github.com/GoogleCloudPlatform/kubernetes/pull/8882#discussion-diff-31875234 - Fixes https://github.com/GoogleCloudPlatform/kubernetes/pull/8882#discussion-diff-31875256 - Fixes https://github.com/GoogleCloudPlatform/kubernetes/pull/8882#discussion-diff-31875255 - Fixes https://github.com/GoogleCloudPlatform/kubernetes/pull/8882#discussion-diff-31875251 - Clarify which Schedule function is actually called - Fixes https://github.com/GoogleCloudPlatform/kubernetes/pull/8882#discussion-diff-31875246
89 lines
2.7 KiB
Go
89 lines
2.7 KiB
Go
/*
|
|
Copyright 2015 The Kubernetes Authors All rights reserved.
|
|
|
|
Licensed under the Apache License, Version 2.0 (the "License");
|
|
you may not use this file except in compliance with the License.
|
|
You may obtain a copy of the License at
|
|
|
|
http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
Unless required by applicable law or agreed to in writing, software
|
|
distributed under the License is distributed on an "AS IS" BASIS,
|
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
See the License for the specific language governing permissions and
|
|
limitations under the License.
|
|
*/
|
|
|
|
package service
|
|
|
|
import (
|
|
"bytes"
|
|
"fmt"
|
|
"hash/crc64"
|
|
"sort"
|
|
"strconv"
|
|
|
|
mesos "github.com/mesos/mesos-go/mesosproto"
|
|
)
|
|
|
|
// compute a hashcode for ExecutorInfo that may be used as a reasonable litmus test
|
|
// with respect to compatibility across HA schedulers. the intent is that an HA scheduler
|
|
// should fail-fast if it doesn't pass this test, rather than generating (potentially many)
|
|
// errors at run-time because a Mesos master decides that the ExecutorInfo generated by a
|
|
// secondary scheduler doesn't match that of the primary scheduler.
|
|
//
|
|
// see https://github.com/apache/mesos/blob/0.22.0/src/common/type_utils.cpp#L110
|
|
func hashExecutorInfo(info *mesos.ExecutorInfo) uint64 {
|
|
// !!! we specifically do NOT include:
|
|
// - Framework ID because it's a value that's initialized too late for us to use
|
|
// - Executor ID because it's a value that includes a copy of this hash
|
|
buf := &bytes.Buffer{}
|
|
buf.WriteString(info.GetName())
|
|
buf.WriteString(info.GetSource())
|
|
buf.Write(info.Data)
|
|
|
|
if info.Command != nil {
|
|
buf.WriteString(info.Command.GetValue())
|
|
buf.WriteString(info.Command.GetUser())
|
|
buf.WriteString(strconv.FormatBool(info.Command.GetShell()))
|
|
if sz := len(info.Command.Arguments); sz > 0 {
|
|
x := make([]string, sz)
|
|
copy(x, info.Command.Arguments)
|
|
sort.Strings(x)
|
|
for _, item := range x {
|
|
buf.WriteString(item)
|
|
}
|
|
}
|
|
if vars := info.Command.Environment.GetVariables(); vars != nil && len(vars) > 0 {
|
|
names := []string{}
|
|
e := make(map[string]string)
|
|
|
|
for _, v := range vars {
|
|
if name := v.GetName(); name != "" {
|
|
names = append(names, name)
|
|
e[name] = v.GetValue()
|
|
}
|
|
}
|
|
sort.Strings(names)
|
|
for _, n := range names {
|
|
buf.WriteString(n)
|
|
buf.WriteString("=")
|
|
buf.WriteString(e[n])
|
|
}
|
|
}
|
|
if uris := info.Command.GetUris(); len(uris) > 0 {
|
|
su := []string{}
|
|
for _, uri := range uris {
|
|
su = append(su, fmt.Sprintf("%s%t%t", uri.GetValue(), uri.GetExecutable(), uri.GetExtract()))
|
|
}
|
|
sort.Strings(su)
|
|
for _, uri := range su {
|
|
buf.WriteString(uri)
|
|
}
|
|
}
|
|
//TODO(jdef) add support for Resources and Container
|
|
}
|
|
table := crc64.MakeTable(crc64.ECMA)
|
|
return crc64.Checksum(buf.Bytes(), table)
|
|
}
|