@@ -23,6 +23,7 @@ import (
2323 "strings"
2424 "time"
2525
26+ apierrors "k8s.io/apimachinery/pkg/api/errors"
2627 "k8s.io/apimachinery/pkg/types"
2728 "k8s.io/apimachinery/pkg/util/validation"
2829 "k8s.io/apimachinery/pkg/util/validation/field"
@@ -110,14 +111,27 @@ func (r *RuntimeReconciler) ReconcileInternal(ctx cruntime.ReconcileRequestConte
110111 return utils .RequeueIfError (err )
111112 }
112113
114+ var datasetPolicy string
115+ if annotations := objectMeta .GetAnnotations (); annotations != nil {
116+ datasetPolicy = annotations [common .AnnotationDatasetPolicy ]
117+ }
118+
113119 // 5.Get the dataset
114120 dataset , err := r .GetDataset (ctx )
115121 if err != nil {
116- // r.Recorder.Eventf(ctx.Dataset, corev1.EventTypeWarning, common.ErrorProcessRuntimeReason, "Process Runtime error %v", err)
117122 if utils .IgnoreNotFound (err ) == nil {
118- ctx .Log .Info ("The dataset is not found" , "dataset" , ctx .NamespacedName )
119- dataset = nil
120- // return ctrl.Result{}, nil
123+ if datasetPolicy == common .DatasetPolicyAutoCreate {
124+ ctx .Log .Info ("The dataset is not found, auto-creating according to policy" , "dataset" , ctx .NamespacedName )
125+ dataset , err = r .ensureDatasetForRuntime (ctx , objectMeta )
126+ if err != nil {
127+ ctx .Log .Error (err , "Failed to auto-create the dataset" )
128+ r .Recorder .Eventf (runtime , corev1 .EventTypeWarning , common .ErrorCreateDataset , "Failed to auto-create dataset: %v" , err )
129+ return utils .RequeueAfterInterval (5 * time .Second )
130+ }
131+ } else {
132+ ctx .Log .Info ("The dataset is not found" , "dataset" , ctx .NamespacedName )
133+ dataset = nil
134+ }
121135 } else {
122136 ctx .Log .Error (err , "Failed to get the ddc dataset" )
123137 return utils .RequeueIfError (errors .Wrap (err , "Unable to get dataset" ))
@@ -172,7 +186,11 @@ func (r *RuntimeReconciler) ReconcileInternal(ctx cruntime.ReconcileRequestConte
172186 }
173187 } else {
174188 // If dataset is nil, need to wait because the user may have not created dataset
175- ctx .Log .Info ("No dataset can be bound to the runtime, waiting." )
189+ if datasetPolicy == common .DatasetPolicyAutoCreate {
190+ ctx .Log .Info ("No dataset is available for the runtime after auto-create, waiting." , "dataset" , ctx .NamespacedName )
191+ } else {
192+ ctx .Log .Info ("No dataset can be bound to the runtime, waiting." )
193+ }
176194 r .Recorder .Event (runtime , corev1 .EventTypeWarning , common .ErrorProcessRuntimeReason , "No dataset can be bound to the runtime, waiting." )
177195 return utils .RequeueAfterInterval (time .Duration (5 * time .Second ))
178196 }
@@ -380,6 +398,46 @@ func (r *RuntimeReconciler) GetDataset(ctx cruntime.ReconcileRequestContext) (*d
380398 return & dataset , nil
381399}
382400
401+ func (r * RuntimeReconciler ) ensureDatasetForRuntime (ctx cruntime.ReconcileRequestContext , objectMeta metav1.Object ) (* datav1alpha1.Dataset , error ) {
402+ runtime := ctx .Runtime
403+ if runtime == nil {
404+ return nil , fmt .Errorf ("runtime is nil" )
405+ }
406+
407+ dataset := & datav1alpha1.Dataset {
408+ TypeMeta : metav1.TypeMeta {
409+ Kind : datav1alpha1 .Datasetkind ,
410+ APIVersion : datav1alpha1 .GroupVersion .Group + "/" + datav1alpha1 .GroupVersion .Version ,
411+ },
412+ ObjectMeta : metav1.ObjectMeta {
413+ Name : objectMeta .GetName (),
414+ Namespace : objectMeta .GetNamespace (),
415+ },
416+ }
417+
418+ annotations := map [string ]string {}
419+ if src := objectMeta .GetAnnotations (); len (src ) > 0 {
420+ for k , v := range src {
421+ annotations [k ] = v
422+ }
423+ }
424+ annotations [common .AnnotationDatasetPolicy ] = common .DatasetPolicyAutoCreate
425+ dataset .ObjectMeta .Annotations = annotations
426+
427+ err := r .Create (ctx , dataset )
428+ if err != nil && ! apierrors .IsAlreadyExists (err ) {
429+ return nil , err
430+ }
431+
432+ if err := r .Get (ctx , ctx .NamespacedName , dataset ); err != nil {
433+ return nil , err
434+ }
435+
436+ r .Recorder .Eventf (runtime , corev1 .EventTypeNormal , common .Succeed , "Auto-created Dataset %s for Runtime" , dataset .Name )
437+
438+ return dataset , nil
439+ }
440+
383441func (r * RuntimeReconciler ) CheckIfReferenceDatasetIsSupported (ctx cruntime.ReconcileRequestContext ) (bool , string ) {
384442 mounted := base .GetPhysicalDatasetFromMounts (ctx .Dataset .Spec .Mounts )
385443
0 commit comments