This is an automated email from the ASF dual-hosted git repository.
ccondit pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/yunikorn-k8shim.git
The following commit(s) were added to refs/heads/master by this push:
new 096eb611 [YUNIKORN-2083] Shim: Handle missing applicationID cleanly in
standard mode (#708)
096eb611 is described below
commit 096eb611d28a78dfa8fa8144b8e60c218adee5d7
Author: Craig Condit <[email protected]>
AuthorDate: Thu Nov 2 11:43:51 2023 -0500
[YUNIKORN-2083] Shim: Handle missing applicationID cleanly in standard mode
(#708)
If a Pod with schedulerName: yunikorn is encountered with missing
applicationID
metadata, generate an applicationID using the same algorithm as the
admission
controller would have. This allows these Pods to be scheduled successfully.
Closes: #708
---
pkg/appmgmt/general/general_test.go | 6 ++--
pkg/appmgmt/general/metadata_test.go | 51 ++++++++++++++++++----------------
pkg/cache/context.go | 4 ---
pkg/cache/context_test.go | 4 ++-
pkg/cache/task.go | 10 ++-----
pkg/common/utils/utils.go | 49 +++++++++++++++++++++++---------
pkg/common/utils/utils_test.go | 54 ++++++++++++++++++++++++++----------
pkg/conf/schedulerconf.go | 43 ++++++++++++++++++----------
pkg/shim/scheduler.go | 2 +-
9 files changed, 139 insertions(+), 84 deletions(-)
diff --git a/pkg/appmgmt/general/general_test.go
b/pkg/appmgmt/general/general_test.go
index 504c2a6f..4cdfad97 100644
--- a/pkg/appmgmt/general/general_test.go
+++ b/pkg/appmgmt/general/general_test.go
@@ -591,9 +591,9 @@ func TestListApplication(t *testing.T) {
// Application 4
{
description: "running in default queue and
namespace01, without label and annotation",
- applicationID: appName[3],
+ applicationID: "yunikorn-namespace01-autogen",
input: podCase[4].InjectPod(),
- expectedOutput: false,
+ expectedOutput: true,
},
// Application 5
{
@@ -615,7 +615,7 @@ func TestListApplication(t *testing.T) {
am := NewManager(mockedAPIProvider, NewPodEventHandler(amProtocol,
true))
pods, err := am.ListPods()
assert.NilError(t, err)
- assert.Equal(t, len(pods), 3)
+ assert.Equal(t, len(pods), 4)
for _, pod := range pods {
name := utils.GetApplicationIDFromPod(pod)
expected := expectOutput[name]
diff --git a/pkg/appmgmt/general/metadata_test.go
b/pkg/appmgmt/general/metadata_test.go
index 39ea41a6..70c35a70 100644
--- a/pkg/appmgmt/general/metadata_test.go
+++ b/pkg/appmgmt/general/metadata_test.go
@@ -27,6 +27,8 @@ import (
apis "k8s.io/apimachinery/pkg/apis/meta/v1"
"github.com/apache/yunikorn-k8shim/pkg/common/constants"
+ "github.com/apache/yunikorn-k8shim/pkg/common/utils"
+ "github.com/apache/yunikorn-k8shim/pkg/conf"
)
func TestGetTaskMetadata(t *testing.T) {
@@ -80,10 +82,18 @@ func TestGetTaskMetadata(t *testing.T) {
}
task, ok = getTaskMetadata(&pod)
- assert.Equal(t, ok, false)
+ assert.Equal(t, ok, true)
+ assert.Equal(t, task.ApplicationID, "yunikorn-default-autogen")
+ assert.Equal(t, task.TaskID, "UID-POD-00001")
+ assert.Equal(t, task.TaskGroupName, "")
}
func TestGetAppMetadata(t *testing.T) { //nolint:funlen
+ defer utils.SetPluginMode(false)
+ defer func() { conf.GetSchedulerConf().GenerateUniqueAppIds = false }()
+ utils.SetPluginMode(false)
+ conf.GetSchedulerConf().GenerateUniqueAppIds = false
+
pod := v1.Pod{
TypeMeta: apis.TypeMeta{
Kind: "Pod",
@@ -136,10 +146,10 @@ func TestGetAppMetadata(t *testing.T) { //nolint:funlen
Namespace: "app-namespace-01",
UID: "UID-POD-00001",
Labels: map[string]string{
- "applicationId": "app00002",
- "queue": "root.b",
+ "applicationId": "app00002",
+ "queue": "root.b",
constants.DomainYuniKorn + "user": "testuser",
- "disableStateAware": "true",
+ "disableStateAware": "true",
},
Annotations: map[string]string{
constants.AnnotationSchedulingPolicyParam:
"gangSchedulingStyle=Hard",
@@ -200,8 +210,8 @@ func TestGetAppMetadata(t *testing.T) { //nolint:funlen
Namespace: "app-namespace-01",
UID: "UID-POD-00001",
Labels: map[string]string{
- "applicationId": "app00002",
- "queue": "root.b",
+ "applicationId": "app00002",
+ "queue": "root.b",
constants.DomainYuniKorn + "user": "testuser",
},
Annotations: map[string]string{
@@ -238,26 +248,19 @@ func TestGetAppMetadata(t *testing.T) { //nolint:funlen
},
}
+ utils.SetPluginMode(false)
app, ok = getAppMetadata(&pod, false)
- assert.Equal(t, ok, false)
- pod = v1.Pod{
- TypeMeta: apis.TypeMeta{
- Kind: "Pod",
- APIVersion: "v1",
- },
- ObjectMeta: apis.ObjectMeta{
- Name: "pod00002",
- Namespace: "app-namespace-01",
- UID: "UID-POD-00001",
- },
- Spec: v1.PodSpec{
- SchedulerName: constants.SchedulerName,
- },
- Status: v1.PodStatus{
- Phase: v1.PodPending,
- },
- }
+ conf.GetSchedulerConf().GenerateUniqueAppIds = true
+ assert.Equal(t, ok, true)
+ assert.Equal(t, app.ApplicationID, "yunikorn-app-namespace-01-autogen")
+
+ utils.SetPluginMode(false)
+ conf.GetSchedulerConf().GenerateUniqueAppIds = true
+ app, ok = getAppMetadata(&pod, false)
+ assert.Equal(t, ok, true)
+ assert.Equal(t, app.ApplicationID, "app-namespace-01-UID-POD-00001")
+ utils.SetPluginMode(true)
app, ok = getAppMetadata(&pod, false)
assert.Equal(t, ok, false)
}
diff --git a/pkg/cache/context.go b/pkg/cache/context.go
index f452c6ab..cfb2596d 100644
--- a/pkg/cache/context.go
+++ b/pkg/cache/context.go
@@ -133,10 +133,6 @@ func (ctx *Context) IsPluginMode() bool {
return ctx.pluginMode
}
-func (ctx *Context) SetPluginMode(pluginMode bool) {
- ctx.pluginMode = pluginMode
-}
-
func (ctx *Context) addNode(obj interface{}) {
ctx.lock.Lock()
defer ctx.lock.Unlock()
diff --git a/pkg/cache/context_test.go b/pkg/cache/context_test.go
index a97aced1..866da69d 100644
--- a/pkg/cache/context_test.go
+++ b/pkg/cache/context_test.go
@@ -1473,8 +1473,10 @@ func TestAddApplicationsWithTags(t *testing.T) {
}
func TestPendingPodAllocations(t *testing.T) {
+ utils.SetPluginMode(true)
+ defer utils.SetPluginMode(false)
+
context := initContextForTest()
- context.SetPluginMode(true)
node1 := v1.Node{
ObjectMeta: apis.ObjectMeta{
diff --git a/pkg/cache/task.go b/pkg/cache/task.go
index 90bc493b..32286125 100644
--- a/pkg/cache/task.go
+++ b/pkg/cache/task.go
@@ -55,7 +55,6 @@ type Task struct {
taskGroupName string
placeholder bool
terminationType string
- pluginMode bool
originator bool
schedulingState interfaces.TaskSchedulingState
sm *fsm.FSM
@@ -88,10 +87,6 @@ func NewFromTaskMeta(tid string, app *Application, ctx
*Context, metadata interf
func createTaskInternal(tid string, app *Application, resource *si.Resource,
pod *v1.Pod, placeholder bool, taskGroupName string, ctx *Context,
originator bool) *Task {
- var pluginMode bool
- if ctx != nil {
- pluginMode = ctx.IsPluginMode()
- }
task := &Task{
taskID: tid,
alias: fmt.Sprintf("%s/%s", pod.Namespace, pod.Name),
@@ -103,7 +98,6 @@ func createTaskInternal(tid string, app *Application,
resource *si.Resource,
createTime: pod.GetCreationTimestamp().Time,
placeholder: placeholder,
taskGroupName: taskGroupName,
- pluginMode: pluginMode,
originator: originator,
context: ctx,
sm: newTaskState(),
@@ -344,7 +338,7 @@ func (task *Task) postTaskAllocated() {
defer task.lock.Unlock()
// plugin mode means we delegate this work to the default
scheduler
- if task.pluginMode {
+ if utils.IsPluginMode() {
log.Log(log.ShimCacheTask).Debug("allocating pod",
zap.String("podName", task.pod.Name),
zap.String("podUID", string(task.pod.UID)))
@@ -423,7 +417,7 @@ func (task *Task) beforeTaskAllocated(eventSrc string,
allocUUID string, nodeID
}
func (task *Task) postTaskBound() {
- if task.pluginMode {
+ if utils.IsPluginMode() {
// When the pod is actively scheduled by YuniKorn, it can be
moved to the default-scheduler's
// UnschedulablePods structure. If the pod does not change, the
pod will stay in the UnschedulablePods
// structure for podMaxInUnschedulablePodsDuration (default 5
minutes). Here we update the pod
diff --git a/pkg/common/utils/utils.go b/pkg/common/utils/utils.go
index dc627ab8..962c03d1 100644
--- a/pkg/common/utils/utils.go
+++ b/pkg/common/utils/utils.go
@@ -43,6 +43,16 @@ import (
const userInfoKey = siCommon.DomainYuniKorn + "user.info"
+var pluginMode bool
+
+func SetPluginMode(value bool) {
+ pluginMode = value
+}
+
+func IsPluginMode() bool {
+ return pluginMode
+}
+
func Convert2Pod(obj interface{}) (*v1.Pod, error) {
pod, ok := obj.(*v1.Pod)
if !ok {
@@ -116,35 +126,48 @@ func GenerateApplicationID(namespace string,
generateUniqueAppIds bool, podUID s
return fmt.Sprintf("%.63s", generatedID)
}
-// GetApplicationIDFromPod returns the applicationID (if present) from a Pod
or an empty string if not present.
-// If an applicationID is present, the Pod is managed by YuniKorn. Otherwise,
it is managed by an external scheduler.
+// GetApplicationIDFromPod returns the Application for a Pod. If a Pod is
marked as schedulable by YuniKorn but is
+// missing an ApplicationID, one will be generated here (if YuniKorn is
running in standard mode) or an empty string
+// will be returned (if YuniKorn is running in plugin mode).
+// If an Application ID is returned, the Pod is managed by YuniKorn.
Otherwise, it is managed by an external scheduler.
func GetApplicationIDFromPod(pod *v1.Pod) string {
// SchedulerName needs to match
if strings.Compare(pod.Spec.SchedulerName, constants.SchedulerName) !=
0 {
return ""
}
- // if pod was tagged with ignore-application, return
- if value := GetPodAnnotationValue(pod,
constants.AnnotationIgnoreApplication); value != "" {
- ignore, err := strconv.ParseBool(value)
- if err != nil {
- log.Log(log.ShimUtils).Warn("Failed to parse annotation
"+constants.AnnotationIgnoreApplication, zap.Error(err))
- } else if ignore {
- return ""
+
+ // If pod was tagged with ignore-application and plugin mode is active,
return
+ if pluginMode {
+ if value := GetPodAnnotationValue(pod,
constants.AnnotationIgnoreApplication); value != "" {
+ ignore, err := strconv.ParseBool(value)
+ if err != nil {
+ log.Log(log.ShimUtils).Warn("Failed to parse
annotation "+constants.AnnotationIgnoreApplication, zap.Error(err))
+ } else if ignore {
+ return ""
+ }
}
}
- // application ID can be defined in annotations
+
+ // Application ID can be defined in annotation
if value := GetPodAnnotationValue(pod,
constants.AnnotationApplicationID); value != "" {
return value
}
+ // Application ID can be defined in label
if value := GetPodLabelValue(pod, constants.LabelApplicationID); value
!= "" {
return value
}
- // application ID can be defined in labels
+ // Spark can also define application ID
if value := GetPodLabelValue(pod, constants.SparkLabelAppID); value !=
"" {
return value
}
- // no application ID found, this is not a YuniKorn-managed Pod
- return ""
+
+ // If plugin mode, interpret missing Application ID as a non-YuniKorn
pod
+ if pluginMode {
+ return ""
+ }
+
+ // Standard deployment mode, so we need a valid Application ID to
proceed. Generate one now.
+ return GenerateApplicationID(pod.Namespace,
conf.GetSchedulerConf().GenerateUniqueAppIds, string(pod.UID))
}
// compare the existing pod condition with the given one, return true if the
pod condition remains not changed.
diff --git a/pkg/common/utils/utils_test.go b/pkg/common/utils/utils_test.go
index 712d36b1..7f1332ef 100644
--- a/pkg/common/utils/utils_test.go
+++ b/pkg/common/utils/utils_test.go
@@ -498,33 +498,52 @@ func TestPodUnderCondition(t *testing.T) {
}
func TestGetApplicationIDFromPod(t *testing.T) {
+ defer SetPluginMode(false)
+ defer func() { conf.GetSchedulerConf().GenerateUniqueAppIds = false }()
+
appIDInLabel := "labelAppID"
appIDInAnnotation := "annotationAppID"
appIDInSelector := "selectorAppID"
sparkIDInAnnotation := "sparkAnnotationAppID"
testCases := []struct {
- name string
- pod *v1.Pod
- expectedAppID string
+ name string
+ pod *v1.Pod
+ expectedAppID string
+ expectedAppIDPluginMode string
+ generateUniqueAppIds bool
}{
{"AppID defined in label", &v1.Pod{
ObjectMeta: metav1.ObjectMeta{
Labels:
map[string]string{constants.LabelApplicationID: appIDInLabel},
},
Spec: v1.PodSpec{SchedulerName:
constants.SchedulerName},
- }, appIDInLabel},
+ }, appIDInLabel, appIDInLabel, false},
+ {"No AppID defined", &v1.Pod{
+ ObjectMeta: metav1.ObjectMeta{
+ Namespace: "testns",
+ UID: "podUid",
+ },
+ Spec: v1.PodSpec{SchedulerName:
constants.SchedulerName},
+ }, "yunikorn-testns-autogen", "", false},
+ {"No AppID defined but generateUnique", &v1.Pod{
+ ObjectMeta: metav1.ObjectMeta{
+ Namespace: "testns",
+ UID: "podUid",
+ },
+ Spec: v1.PodSpec{SchedulerName:
constants.SchedulerName},
+ }, "testns-podUid", "", true},
{"Non-yunikorn schedulerName", &v1.Pod{
ObjectMeta: metav1.ObjectMeta{
Labels:
map[string]string{constants.LabelApplicationID: appIDInLabel},
},
Spec: v1.PodSpec{SchedulerName: "default"},
- }, ""},
+ }, "", "", false},
{"AppID defined in annotation", &v1.Pod{
ObjectMeta: metav1.ObjectMeta{
Annotations:
map[string]string{constants.AnnotationApplicationID: appIDInAnnotation},
},
Spec: v1.PodSpec{SchedulerName:
constants.SchedulerName},
- }, appIDInAnnotation},
+ }, appIDInAnnotation, appIDInAnnotation, false},
{"AppID defined but ignore-application set", &v1.Pod{
ObjectMeta: metav1.ObjectMeta{
Annotations: map[string]string{
@@ -533,7 +552,7 @@ func TestGetApplicationIDFromPod(t *testing.T) {
},
},
Spec: v1.PodSpec{SchedulerName:
constants.SchedulerName},
- }, ""},
+ }, appIDInAnnotation, "", false},
{"AppID defined and ignore-application invalid", &v1.Pod{
ObjectMeta: metav1.ObjectMeta{
Annotations: map[string]string{
@@ -542,48 +561,53 @@ func TestGetApplicationIDFromPod(t *testing.T) {
},
},
Spec: v1.PodSpec{SchedulerName:
constants.SchedulerName},
- }, appIDInAnnotation},
+ }, appIDInAnnotation, appIDInAnnotation, false},
{"AppID defined in label and annotation", &v1.Pod{
ObjectMeta: metav1.ObjectMeta{
Annotations:
map[string]string{constants.AnnotationApplicationID: appIDInAnnotation},
Labels:
map[string]string{constants.LabelApplicationID: appIDInLabel},
},
Spec: v1.PodSpec{SchedulerName:
constants.SchedulerName},
- }, appIDInAnnotation},
+ }, appIDInAnnotation, appIDInAnnotation, false},
{"Spark AppID defined in spark app selector", &v1.Pod{
ObjectMeta: metav1.ObjectMeta{
Labels:
map[string]string{constants.SparkLabelAppID: appIDInSelector},
},
Spec: v1.PodSpec{SchedulerName:
constants.SchedulerName},
- }, appIDInSelector},
+ }, appIDInSelector, appIDInSelector, false},
{"Spark AppID defined in spark app selector and annotation",
&v1.Pod{
ObjectMeta: metav1.ObjectMeta{
Labels:
map[string]string{constants.SparkLabelAppID: appIDInSelector},
Annotations:
map[string]string{constants.AnnotationApplicationID: sparkIDInAnnotation},
},
Spec: v1.PodSpec{SchedulerName:
constants.SchedulerName},
- }, sparkIDInAnnotation},
+ }, sparkIDInAnnotation, sparkIDInAnnotation, false},
{"Spark AppID defined in spark app selector and annotation",
&v1.Pod{
ObjectMeta: metav1.ObjectMeta{
Labels:
map[string]string{constants.SparkLabelAppID: appIDInSelector,
constants.LabelApplicationID: appIDInLabel},
Annotations:
map[string]string{constants.AnnotationApplicationID: sparkIDInAnnotation},
},
Spec: v1.PodSpec{SchedulerName:
constants.SchedulerName},
- }, sparkIDInAnnotation},
- {"No AppID defined", &v1.Pod{}, ""},
+ }, sparkIDInAnnotation, sparkIDInAnnotation, false},
+ {"No AppID defined", &v1.Pod{}, "", "", false},
{"Spark AppID defined in spark app selector and label", &v1.Pod{
ObjectMeta: metav1.ObjectMeta{
Labels:
map[string]string{constants.SparkLabelAppID: appIDInSelector,
constants.LabelApplicationID: appIDInLabel},
},
Spec: v1.PodSpec{SchedulerName:
constants.SchedulerName},
- }, appIDInLabel},
+ }, appIDInLabel, appIDInLabel, false},
}
for _, tc := range testCases {
t.Run(tc.name, func(t *testing.T) {
+ conf.GetSchedulerConf().GenerateUniqueAppIds =
tc.generateUniqueAppIds
+ SetPluginMode(false)
appID := GetApplicationIDFromPod(tc.pod)
- assert.Equal(t, appID, tc.expectedAppID)
+ assert.Equal(t, appID, tc.expectedAppID, "Wrong appID
(standard mode)")
+ SetPluginMode(true)
+ appID2 := GetApplicationIDFromPod(tc.pod)
+ assert.Equal(t, appID2, tc.expectedAppIDPluginMode,
"Wrong appID (plugin mode)")
})
}
}
diff --git a/pkg/conf/schedulerconf.go b/pkg/conf/schedulerconf.go
index f156ed16..21fc3b8d 100644
--- a/pkg/conf/schedulerconf.go
+++ b/pkg/conf/schedulerconf.go
@@ -52,9 +52,10 @@ const (
EnvNamespace = "NAMESPACE"
// prefixes
- PrefixService = "service."
- PrefixLog = "log."
- PrefixKubernetes = "kubernetes."
+ PrefixService = "service."
+ PrefixLog = "log."
+ PrefixKubernetes = "kubernetes."
+ PrefixAdmissionController = "admissionController."
// service
CMSvcClusterID = PrefixService + "clusterId"
@@ -73,19 +74,24 @@ const (
CMKubeQPS = PrefixKubernetes + "qps"
CMKubeBurst = PrefixKubernetes + "burst"
+ // admissioncontroller
+ PrefixAMFiltering = PrefixAdmissionController +
"filtering."
+ AMFilteringGenerateUniqueAppIds = PrefixAMFiltering +
"generateUniqueAppId"
+
// defaults
- DefaultNamespace = "default"
- DefaultClusterID = "mycluster"
- DefaultPolicyGroup = "queues"
- DefaultSchedulingInterval = time.Second
- DefaultVolumeBindTimeout = 10 * time.Second
- DefaultEventChannelCapacity = 1024 * 1024
- DefaultDispatchTimeout = 300 * time.Second
- DefaultOperatorPlugins = "general"
- DefaultDisableGangScheduling = false
- DefaultEnableConfigHotRefresh = true
- DefaultKubeQPS = 1000
- DefaultKubeBurst = 1000
+ DefaultNamespace = "default"
+ DefaultClusterID = "mycluster"
+ DefaultPolicyGroup = "queues"
+ DefaultSchedulingInterval = time.Second
+ DefaultVolumeBindTimeout = 10 * time.Second
+ DefaultEventChannelCapacity = 1024 * 1024
+ DefaultDispatchTimeout = 300 * time.Second
+ DefaultOperatorPlugins = "general"
+ DefaultDisableGangScheduling = false
+ DefaultEnableConfigHotRefresh = true
+ DefaultKubeQPS = 1000
+ DefaultKubeBurst = 1000
+ DefaultAMFilteringGenerateUniqueAppIds = false
)
var (
@@ -124,6 +130,7 @@ type SchedulerConf struct {
PlaceHolderImage string `json:"placeHolderImage"`
InstanceTypeNodeLabelKey string `json:"instanceTypeNodeLabelKey"`
Namespace string `json:"namespace"`
+ GenerateUniqueAppIds bool `json:"generateUniqueAppIds"`
sync.RWMutex
}
@@ -151,6 +158,7 @@ func (conf *SchedulerConf) Clone() *SchedulerConf {
PlaceHolderImage: conf.PlaceHolderImage,
InstanceTypeNodeLabelKey: conf.InstanceTypeNodeLabelKey,
Namespace: conf.Namespace,
+ GenerateUniqueAppIds: conf.GenerateUniqueAppIds,
}
}
@@ -208,6 +216,7 @@ func handleNonReloadableConfig(old *SchedulerConf, new
*SchedulerConf) {
checkNonReloadableBool(CMSvcDisableGangScheduling,
&old.DisableGangScheduling, &new.DisableGangScheduling)
checkNonReloadableString(CMSvcPlaceholderImage, &old.PlaceHolderImage,
&new.PlaceHolderImage)
checkNonReloadableString(CMSvcNodeInstanceTypeNodeLabelKey,
&old.InstanceTypeNodeLabelKey, &new.InstanceTypeNodeLabelKey)
+ checkNonReloadableBool(AMFilteringGenerateUniqueAppIds,
&old.GenerateUniqueAppIds, &new.GenerateUniqueAppIds)
}
const warningNonReloadable = "ignoring non-reloadable configuration change
(restart required to update)"
@@ -337,6 +346,7 @@ func CreateDefaultConfig() *SchedulerConf {
UserLabelKey: constants.DefaultUserLabel,
PlaceHolderImage: constants.PlaceholderContainerImage,
InstanceTypeNodeLabelKey:
constants.DefaultNodeInstanceTypeNodeLabelKey,
+ GenerateUniqueAppIds:
DefaultAMFilteringGenerateUniqueAppIds,
}
}
@@ -367,6 +377,9 @@ func parseConfig(config map[string]string, prev
*SchedulerConf) (*SchedulerConf,
parser.intVar(&conf.KubeQPS, CMKubeQPS)
parser.intVar(&conf.KubeBurst, CMKubeBurst)
+ // admission controller
+ parser.boolVar(&conf.GenerateUniqueAppIds,
AMFilteringGenerateUniqueAppIds)
+
if len(parser.errors) > 0 {
return nil, parser.errors
}
diff --git a/pkg/shim/scheduler.go b/pkg/shim/scheduler.go
index 9916eaae..c7c41870 100644
--- a/pkg/shim/scheduler.go
+++ b/pkg/shim/scheduler.go
@@ -73,7 +73,7 @@ func NewShimScheduler(scheduler api.SchedulerAPI, configs
*conf.SchedulerConf, b
func NewShimSchedulerForPlugin(scheduler api.SchedulerAPI, informerFactory
informers.SharedInformerFactory, configs *conf.SchedulerConf,
bootstrapConfigMaps []*v1.ConfigMap) *KubernetesShim {
apiFactory := client.NewAPIFactory(scheduler, informerFactory, configs,
false)
context := cache.NewContextWithBootstrapConfigMaps(apiFactory,
bootstrapConfigMaps)
- context.SetPluginMode(true)
+ utils.SetPluginMode(true)
rmCallback := callback.NewAsyncRMCallback(context)
appManager := appmgmt.NewAMService(context, apiFactory)
return newShimSchedulerInternal(context, apiFactory, appManager,
rmCallback)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]