Skip to content

Commit 8fed3ae

Browse files
authored
Merge pull request #63 from dmatch01/generalize-appwrapper-items
Generalize appwrapper items
2 parents e9bb87a + 8c71619 commit 8fed3ae

File tree

25 files changed

+1923
-18
lines changed

25 files changed

+1923
-18
lines changed

pkg/apis/controller/v1alpha1/appwrapper.go

Lines changed: 43 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -57,13 +57,21 @@ type AppWrapperSpec struct {
5757
// SchedSpec specifies the parameters for scheduling.
5858
SchedSpec SchedulingSpecTemplate `json:"schedulingSpec,omitempty" protobuf:"bytes,2,opt,name=schedulingSpec"`
5959
}
60+
// a collection of AppWrapperResource
61+
type AppWrapperResourceList struct {
62+
metav1.TypeMeta `json:",inline"`
63+
metav1.ListMeta `json:"metadata"`
64+
Items []AppWrapperResource
65+
GenericItems[]AppWrapperGenericResource
66+
}
6067

6168
// AppWrapperService is App Wrapper service definition
6269
type AppWrapperService struct {
6370
Spec v1.ServiceSpec `json:"spec"`
6471
}
6572

6673
// AppWrapperResource is App Wrapper aggregation resource
74+
//todo: To be depricated
6775
type AppWrapperResource struct {
6876
metav1.TypeMeta `json:",inline"`
6977
metav1.ObjectMeta `json:"metadata"`
@@ -88,13 +96,43 @@ type AppWrapperResource struct {
8896
//The template for the resource; it is now a raw text because we don't know for what resource
8997
//it should be instantiated
9098
Template runtime.RawExtension `json:"template"`
99+
91100
}
92101

93-
// a collection of AppWrapperResource
94-
type AppWrapperResourceList struct {
95-
metav1.TypeMeta `json:",inline"`
96-
metav1.ListMeta `json:"metadata"`
97-
Items []AppWrapperResource
102+
// AppWrapperResource is App Wrapper aggregation resource
103+
type AppWrapperGenericResource struct {
104+
metav1.TypeMeta `json:",inline"`
105+
metav1.ObjectMeta `json:"metadata"`
106+
// Replicas is the number of desired replicas
107+
DesiredAvailable int32 `json:"replicas,omitempty" protobuf:"bytes,2,opt,name=desiredavailable"`
108+
109+
// The minimal available pods to run for this AppWrapper; the default value is nil
110+
MinAvailable *int32 `json:"minavailable,omitempty" protobuf:"bytes,3,opt,name=minavailable"`
111+
112+
// The number of allocated replicas from this resource type
113+
Allocated int32 `json:"allocated"`
114+
115+
// The priority of this resource
116+
Priority float64 `json:"priority"`
117+
118+
// The increasing rate of priority value for this resource
119+
PrioritySlope float64 `json:"priorityslope"`
120+
121+
//The template for the resource; it is now a raw text because we don't know for what resource
122+
//it should be instantiated
123+
GenericTemplate runtime.RawExtension `json:"generictemplate"`
124+
125+
//Optional section that specifies resource requirements for non-standard k8s resources, follows same format as that
126+
// of standard k8s resources
127+
CustomPodResources []CustomPodResourceTemplate `json:"custompodresources,omitempty"`
128+
}
129+
130+
type CustomPodResourceTemplate struct {
131+
Replicas int `json:"replicas"`
132+
//todo: replace with
133+
//Containers []Container Contain v1.ResourceRequirements
134+
Requests v1.ResourceList `json:"requests"`
135+
Limits v1.ResourceList `json:"limits"`
98136
}
99137

100138
// App Wrapper resources type

pkg/apis/controller/v1alpha1/zz_generated.deepcopy.go

Lines changed: 71 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pkg/controller/queuejob/queuejob_controller_ex.go

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ import (
4242
"k8s.io/apimachinery/pkg/runtime/serializer/json"
4343

4444
"github.com/IBM/multi-cluster-app-dispatcher/pkg/controller/queuejobresources"
45+
"github.com/IBM/multi-cluster-app-dispatcher/pkg/controller/queuejobresources/genericresource"
4546
resconfigmap "github.com/IBM/multi-cluster-app-dispatcher/pkg/controller/queuejobresources/configmap" // ConfigMap
4647
resdeployment "github.com/IBM/multi-cluster-app-dispatcher/pkg/controller/queuejobresources/deployment"
4748
resnamespace "github.com/IBM/multi-cluster-app-dispatcher/pkg/controller/queuejobresources/namespace" // NP
@@ -89,6 +90,9 @@ type XController struct {
8990
// controllers for these resources
9091
qjobResControls map[arbv1.ResourceType]queuejobresources.Interface
9192

93+
// Captures all available resources in the cluster
94+
genericresources *genericresource.GenericResources
95+
9296
clients *kubernetes.Clientset
9397
arbclients *clientset.Clientset
9498

@@ -193,6 +197,8 @@ func NewJobController(config *rest.Config, serverOption *options.ServerOption) *
193197
}
194198
cc.metricsAdapter = adapter.New(config, cc.cache)
195199

200+
cc.genericresources = genericresource.NewAppWrapperGenericResource(config)
201+
196202
cc.qjobResControls = map[arbv1.ResourceType]queuejobresources.Interface{}
197203
RegisterAllQueueJobResourceTypes(&cc.qjobRegisteredResources)
198204

@@ -447,12 +453,18 @@ func GetPodTemplate(qjobRes *arbv1.AppWrapperResource) (*v1.PodTemplateSpec, err
447453
}
448454

449455
func (qjm *XController) GetAggregatedResources(cqj *arbv1.AppWrapper) *clusterstateapi.Resource {
456+
//todo: deprecate resource controllers
450457
allocated := clusterstateapi.EmptyResource()
451458
for _, resctrl := range qjm.qjobResControls {
452459
qjv := resctrl.GetAggregatedResources(cqj)
453460
allocated = allocated.Add(qjv)
454461
}
455462

463+
for _, genericItem := range cqj.Spec.AggrResources.GenericItems {
464+
qjv, _ := genericresource.GetResources(&genericItem)
465+
allocated = allocated.Add(qjv)
466+
}
467+
456468
return allocated
457469
}
458470

@@ -483,6 +495,11 @@ func (qjm *XController) getAggregatedAvailableResourcesPriority(targetpr float64
483495
qjv := resctrl.GetAggregatedResources(value)
484496
preemptable = preemptable.Add(qjv)
485497
}
498+
for _, genericItem := range value.Spec.AggrResources.GenericItems {
499+
qjv, _ := genericresource.GetResources(&genericItem)
500+
preemptable = preemptable.Add(qjv)
501+
}
502+
486503
continue
487504
} else if value.Status.State == arbv1.AppWrapperStateEnqueued {
488505
// Don't count the resources that can run but not yet realized (job orchestration pending or partially running).
@@ -491,6 +508,11 @@ func (qjm *XController) getAggregatedAvailableResourcesPriority(targetpr float64
491508
pending = pending.Add(qjv)
492509
glog.V(10).Infof("[getAggAvaiResPri] Subtract all resources %+v in resctrlType=%T for job %s which can-run is set to: %v but state is still pending.", qjv, resctrl, value.Name, value.Status.CanRun)
493510
}
511+
for _, genericItem := range value.Spec.AggrResources.GenericItems {
512+
qjv, _ := genericresource.GetResources(&genericItem)
513+
pending = pending.Add(qjv)
514+
glog.V(10).Infof("[getAggAvaiResPri] Subtract all resources %+v in resctrlType=%T for job %s which can-run is set to: %v but state is still pending.", qjv, genericItem, value.Name, value.Status.CanRun)
515+
}
494516
continue
495517
} else if value.Status.State == arbv1.AppWrapperStateActive {
496518
if value.Status.Pending > 0 {
@@ -500,6 +522,11 @@ func (qjm *XController) getAggregatedAvailableResourcesPriority(targetpr float64
500522
pending = pending.Add(qjv)
501523
glog.V(10).Infof("[getAggAvaiResPri] Subtract all resources %+v in resctrlType=%T for job %s which can-run is set to: %v and status set to: %s but %v pod(s) are pending.", qjv, resctrl, value.Name, value.Status.CanRun, value.Status.State, value.Status.Pending)
502524
}
525+
for _, genericItem := range value.Spec.AggrResources.GenericItems {
526+
qjv, _ := genericresource.GetResources(&genericItem)
527+
pending = pending.Add(qjv)
528+
glog.V(10).Infof("[getAggAvaiResPri] Subtract all resources %+v in resctrlType=%T for job %s which can-run is set to: %v and status set to: %s but %v pod(s) are pending.", qjv, genericItem, value.Name, value.Status.CanRun, value.Status.State, value.Status.Pending)
529+
}
503530
} else {
504531
// TODO: Hack to handle race condition when Running jobs have not yet updated the pod counts
505532
// This hack uses the golang struct implied behavior of defining the object without a value. In this case
@@ -510,6 +537,11 @@ func (qjm *XController) getAggregatedAvailableResourcesPriority(targetpr float64
510537
pending = pending.Add(qjv)
511538
glog.V(10).Infof("[getAggAvaiResPri] Subtract all resources %+v in resctrlType=%T for job %s which can-run is set to: %v and status set to: %s but no pod counts in the state have been defined.", qjv, resctrl, value.Name, value.Status.CanRun, value.Status.State)
512539
}
540+
for _, genericItem := range value.Spec.AggrResources.GenericItems {
541+
qjv, _ := genericresource.GetResources(&genericItem)
542+
pending = pending.Add(qjv)
543+
glog.V(10).Infof("[getAggAvaiResPri] Subtract all resources %+v in resctrlType=%T for job %s which can-run is set to: %v and status set to: %s but no pod counts in the state have been defined.", qjv, genericItem, value.Name, value.Status.CanRun, value.Status.State)
544+
}
513545
}
514546
}
515547
continue
@@ -1116,6 +1148,16 @@ func (cc *XController) manageQueueJob(qj *arbv1.AppWrapper) error {
11161148
break
11171149
}
11181150
}
1151+
// Handle generic resources
1152+
for _, ar := range qj.Spec.AggrResources.GenericItems {
1153+
glog.V(10).Infof("[worker-manageQJ] before dispatch Generic.SyncQueueJob %s &qj=%p Version=%s Status=%+v", qj.Name, qj, qj.ResourceVersion, qj.Status)
1154+
_, err00 := cc.genericresources.SyncQueueJob(qj, &ar)
1155+
if err00 != nil {
1156+
glog.Errorf("[worker-manageQJ] Error dispatching job=%s Status=%+v err=%+v", qj.Name, qj.Status, err00)
1157+
dispatched = false
1158+
}
1159+
}
1160+
11191161
if dispatched { // set QueueJobStateRunning if all resources are successfully dispatched
11201162
qj.Status.QueueJobState = arbv1.QueueJobStateDispatched
11211163
glog.V(4).Infof("[worker-manageQJ] %s 4Delay=%.6f seconds AllResourceDispatchedToEtcd Version=%s Status=%+v",

0 commit comments

Comments
 (0)