@@ -18,7 +18,6 @@ package thin
1818
1919import (
2020 "context"
21-
2221 . "github.com/onsi/ginkgo/v2"
2322 . "github.com/onsi/gomega"
2423
@@ -265,6 +264,117 @@ var _ = Describe("ThinEngine Health Check", Label("pkg.ddc.thin.health_check_tes
265264 Expect (err ).To (HaveOccurred ())
266265 })
267266 })
267+
268+ Context ("when a fuse-only runtime is healthy" , func () {
269+ var (
270+ client client.Client
271+ engine ThinEngine
272+ )
273+
274+ BeforeEach (func () {
275+ healthyFuse := & appsv1.DaemonSet {
276+ ObjectMeta : metav1.ObjectMeta {
277+ Name : healthCheckTestSpark + "-fuse" ,
278+ Namespace : healthCheckTestNamespace ,
279+ },
280+ Status : appsv1.DaemonSetStatus {
281+ NumberUnavailable : 0 ,
282+ NumberReady : 1 ,
283+ NumberAvailable : 1 ,
284+ },
285+ }
286+ runtimeObj := & datav1alpha1.ThinRuntime {
287+ ObjectMeta : metav1.ObjectMeta {
288+ Name : healthCheckTestSpark ,
289+ Namespace : healthCheckTestNamespace ,
290+ },
291+ Spec : datav1alpha1.ThinRuntimeSpec {},
292+ Status : datav1alpha1.RuntimeStatus {
293+ CacheStates : map [common.CacheStateName ]string {common .Cached : "true" },
294+ },
295+ }
296+ datasetObj := & datav1alpha1.Dataset {
297+ ObjectMeta : metav1.ObjectMeta {
298+ Name : healthCheckTestSpark ,
299+ Namespace : healthCheckTestNamespace ,
300+ },
301+ Status : datav1alpha1.DatasetStatus {},
302+ }
303+
304+ client = fake .NewFakeClientWithScheme (testScheme , healthyFuse , runtimeObj , datasetObj )
305+ engine = ThinEngine {
306+ Client : client ,
307+ Log : fake .NullLogger (),
308+ namespace : healthCheckTestNamespace ,
309+ name : healthCheckTestSpark ,
310+ runtime : runtimeObj ,
311+ }
312+ })
313+
314+ JustBeforeEach (func () {
315+ runtimeInfo , err := base .BuildRuntimeInfo (engine .name , engine .namespace , common .ThinRuntime )
316+ Expect (err ).NotTo (HaveOccurred ())
317+ engine .Helper = ctrl .BuildHelper (runtimeInfo , client , engine .Log )
318+ })
319+
320+ It ("skips worker checks and updates the dataset to bound" , func () {
321+ err := engine .CheckRuntimeHealthy ()
322+ Expect (err ).NotTo (HaveOccurred ())
323+
324+ updatedRuntime , err := engine .getRuntime ()
325+ Expect (err ).NotTo (HaveOccurred ())
326+ Expect (updatedRuntime .Status .FuseNumberReady ).To (Equal (int32 (1 )))
327+ Expect (updatedRuntime .Status .FuseNumberAvailable ).To (Equal (int32 (1 )))
328+
329+ updatedDataset , err := utils .GetDataset (client , healthCheckTestSpark , healthCheckTestNamespace )
330+ Expect (err ).NotTo (HaveOccurred ())
331+ Expect (updatedDataset .Status .Phase ).To (Equal (datav1alpha1 .BoundDatasetPhase ))
332+ })
333+ })
334+
335+ Context ("when checking a fuse-only runtime without a fuse daemonset" , func () {
336+ var (
337+ client client.Client
338+ engine ThinEngine
339+ )
340+
341+ BeforeEach (func () {
342+ runtimeObj := & datav1alpha1.ThinRuntime {
343+ ObjectMeta : metav1.ObjectMeta {
344+ Name : healthCheckTestSpark ,
345+ Namespace : healthCheckTestNamespace ,
346+ },
347+ Spec : datav1alpha1.ThinRuntimeSpec {},
348+ }
349+ datasetObj := & datav1alpha1.Dataset {
350+ ObjectMeta : metav1.ObjectMeta {
351+ Name : healthCheckTestSpark ,
352+ Namespace : healthCheckTestNamespace ,
353+ },
354+ }
355+
356+ client = fake .NewFakeClientWithScheme (testScheme , runtimeObj , datasetObj )
357+ engine = ThinEngine {
358+ Client : client ,
359+ Log : fake .NullLogger (),
360+ namespace : healthCheckTestNamespace ,
361+ name : healthCheckTestSpark ,
362+ runtime : runtimeObj ,
363+ }
364+ })
365+
366+ JustBeforeEach (func () {
367+ runtimeInfo , err := base .BuildRuntimeInfo (engine .name , engine .namespace , common .ThinRuntime )
368+ Expect (err ).NotTo (HaveOccurred ())
369+ engine .Helper = ctrl .BuildHelper (runtimeInfo , client , engine .Log )
370+ })
371+
372+ It ("returns the fuse check error" , func () {
373+ err := engine .CheckRuntimeHealthy ()
374+ Expect (err ).To (HaveOccurred ())
375+ })
376+ })
377+
268378 })
269379
270380 Describe ("checkFuseHealthy" , func () {
@@ -419,4 +529,81 @@ var _ = Describe("ThinEngine Health Check", Label("pkg.ddc.thin.health_check_tes
419529 })
420530 })
421531 })
532+
533+ Describe ("CheckAndUpdateRuntimeStatus" , func () {
534+ It ("initializes fuse-only runtime status and strips mount options" , func () {
535+ dataset := & datav1alpha1.Dataset {
536+ ObjectMeta : metav1.ObjectMeta {
537+ Name : healthCheckTestSpark ,
538+ Namespace : healthCheckTestNamespace ,
539+ },
540+ Status : datav1alpha1.DatasetStatus {
541+ Mounts : []datav1alpha1.Mount {{
542+ MountPoint : "s3://bucket/data" ,
543+ Options : map [string ]string {"endpoint" : "test" },
544+ EncryptOptions : []datav1alpha1.EncryptOption {{
545+ Name : "secret" ,
546+ }},
547+ }},
548+ },
549+ }
550+
551+ runtimeObj := & datav1alpha1.ThinRuntime {
552+ ObjectMeta : metav1.ObjectMeta {
553+ Name : healthCheckTestSpark ,
554+ Namespace : healthCheckTestNamespace ,
555+ CreationTimestamp : metav1 .Now (),
556+ },
557+ Spec : datav1alpha1.ThinRuntimeSpec {
558+ Fuse : datav1alpha1.ThinFuseSpec {},
559+ },
560+ Status : datav1alpha1.RuntimeStatus {
561+ FusePhase : datav1alpha1 .RuntimePhaseNone ,
562+ },
563+ }
564+
565+ client := fake .NewFakeClientWithScheme (testScheme , dataset , runtimeObj )
566+ engine := ThinEngine {
567+ Client : client ,
568+ Log : fake .NullLogger (),
569+ name : healthCheckTestSpark ,
570+ namespace : healthCheckTestNamespace ,
571+ runtime : runtimeObj ,
572+ }
573+
574+ ready , err := engine .CheckAndUpdateRuntimeStatus ()
575+
576+ Expect (err ).NotTo (HaveOccurred ())
577+ Expect (ready ).To (BeTrue ())
578+
579+ updatedRuntime , err := engine .getRuntime ()
580+ Expect (err ).NotTo (HaveOccurred ())
581+ Expect (updatedRuntime .Status .FusePhase ).To (Equal (datav1alpha1 .RuntimePhaseReady ))
582+ Expect (updatedRuntime .Status .ValueFileConfigmap ).To (Equal (engine .getHelmValuesConfigMapName ()))
583+ Expect (updatedRuntime .Status .SetupDuration ).NotTo (BeEmpty ())
584+ Expect (updatedRuntime .Status .CacheStates ).To (HaveKeyWithValue (common .Cached , "N/A" ))
585+ Expect (updatedRuntime .Status .Mounts ).To (HaveLen (1 ))
586+ Expect (updatedRuntime .Status .Mounts [0 ].Options ).To (BeNil ())
587+ Expect (updatedRuntime .Status .Mounts [0 ].EncryptOptions ).To (BeNil ())
588+
589+ _ , cond := utils .GetRuntimeCondition (updatedRuntime .Status .Conditions , datav1alpha1 .RuntimeFusesInitialized )
590+ Expect (cond ).NotTo (BeNil ())
591+ })
592+ })
593+
594+ Describe ("ThinEngine.getDataSetFileNum" , func () {
595+ It ("returns an empty count when no running fuse pod can be found" , func () {
596+ engine := & ThinEngine {
597+ Client : fake .NewFakeClientWithScheme (testScheme ),
598+ Log : fake .NullLogger (),
599+ name : healthCheckTestName ,
600+ namespace : healthCheckTestNamespace ,
601+ }
602+
603+ count , err := engine .getDataSetFileNum ()
604+
605+ Expect (err ).To (HaveOccurred ())
606+ Expect (count ).To (BeEmpty ())
607+ })
608+ })
422609})
0 commit comments