Kubernetes Mesos integration
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
This commit is contained in:
106
contrib/mesos/pkg/scheduler/constraint/constraint.go
Normal file
106
contrib/mesos/pkg/scheduler/constraint/constraint.go
Normal file
@@ -0,0 +1,106 @@
|
||||
/*
|
||||
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 constraint
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
)
|
||||
|
||||
type OperatorType int
|
||||
|
||||
const (
|
||||
UniqueOperator OperatorType = iota
|
||||
LikeOperator
|
||||
ClusterOperator
|
||||
GroupByOperator
|
||||
UnlikeOperator
|
||||
)
|
||||
|
||||
var (
|
||||
labels = []string{
|
||||
"UNIQUE",
|
||||
"LIKE",
|
||||
"CLUSTER",
|
||||
"GROUP_BY",
|
||||
"UNLIKE",
|
||||
}
|
||||
|
||||
labelToType map[string]OperatorType
|
||||
)
|
||||
|
||||
func init() {
|
||||
labelToType = make(map[string]OperatorType)
|
||||
for i, s := range labels {
|
||||
labelToType[s] = OperatorType(i)
|
||||
}
|
||||
}
|
||||
|
||||
func (t OperatorType) String() string {
|
||||
switch t {
|
||||
case UniqueOperator, LikeOperator, ClusterOperator, GroupByOperator, UnlikeOperator:
|
||||
return labels[int(t)]
|
||||
default:
|
||||
panic(fmt.Sprintf("unrecognized operator type: %d", int(t)))
|
||||
}
|
||||
}
|
||||
|
||||
func parseOperatorType(s string) (OperatorType, error) {
|
||||
t, found := labelToType[s]
|
||||
if !found {
|
||||
return UniqueOperator, fmt.Errorf("unrecognized operator %q", s)
|
||||
}
|
||||
return t, nil
|
||||
}
|
||||
|
||||
type Constraint struct {
|
||||
Field string // required
|
||||
Operator OperatorType // required
|
||||
Value string // optional
|
||||
}
|
||||
|
||||
func (c *Constraint) MarshalJSON() ([]byte, error) {
|
||||
var a []string
|
||||
if c != nil {
|
||||
if c.Value != "" {
|
||||
a = append(a, c.Field, c.Operator.String(), c.Value)
|
||||
} else {
|
||||
a = append(a, c.Field, c.Operator.String())
|
||||
}
|
||||
}
|
||||
return json.Marshal(a)
|
||||
}
|
||||
|
||||
func (c *Constraint) UnmarshalJSON(buf []byte) (err error) {
|
||||
var a []string
|
||||
if err = json.Unmarshal(buf, &a); err != nil {
|
||||
return err
|
||||
}
|
||||
switch x := len(a); {
|
||||
case x < 2:
|
||||
err = fmt.Errorf("not enough arguments to form constraint")
|
||||
case x > 3:
|
||||
err = fmt.Errorf("too many arguments to form constraint")
|
||||
case x == 3:
|
||||
c.Value = a[2]
|
||||
fallthrough
|
||||
case x == 2:
|
||||
c.Field = a[0]
|
||||
c.Operator, err = parseOperatorType(a[1])
|
||||
}
|
||||
return err
|
||||
}
|
Reference in New Issue
Block a user