diff --git a/images/agent/src/internal/controller/llv/reconciler.go b/images/agent/src/internal/controller/llv/reconciler.go index c736fb1e..5532246e 100644 --- a/images/agent/src/internal/controller/llv/reconciler.go +++ b/images/agent/src/internal/controller/llv/reconciler.go @@ -21,6 +21,7 @@ import ( "errors" "fmt" "reflect" + "strconv" "strings" "sync" "time" @@ -610,13 +611,18 @@ func (r *Reconciler) deleteLVIfNeeded(ctx context.Context, vgName string, llv *v r.log.Error(err, fmt.Sprintf("[deleteLVIfNeeded] can't find pool map for LV %s in VG %s", llv.Spec.ActualLVNameOnTheNode, vgName)) return true, err } - if lv.Data.ThinID == nil { + if lv.Data.ThinID == "" { err = fmt.Errorf("missing deviceId for thin volume %s", llv.Spec.ActualLVNameOnTheNode) return true, err } - ranges, err := utils.ThinVolumeUsedRanges(ctx, r.log, superblock, utils.LVMThinDeviceID(*lv.Data.ThinID)) + thinID, err := strconv.Atoi(lv.Data.ThinID) if err != nil { - err = fmt.Errorf("finding used ranges for deviceId %d in thin pool %s", lv.Data.ThinID, lv.Data.PoolName) + err = fmt.Errorf("deviceId %s is not a number", lv.Data.ThinID) + return true, err + } + ranges, err := utils.ThinVolumeUsedRanges(ctx, r.log, superblock, utils.LVMThinDeviceID(thinID)) + if err != nil { + err = fmt.Errorf("finding used ranges for deviceId %d in thin pool %s", thinID, lv.Data.PoolName) return true, err } usedRanges = &ranges diff --git a/images/agent/src/internal/type.go b/images/agent/src/internal/type.go index cb7b42ba..e2263dcc 100644 --- a/images/agent/src/internal/type.go +++ b/images/agent/src/internal/type.go @@ -157,7 +157,7 @@ type LVData struct { CopyPercent string `json:"copy_percent"` ConvertLv string `json:"convert_lv"` LvTags string `json:"lv_tags"` - ThinID *uint64 `json:"thin_id,omitempty"` + ThinID string `json:"thin_id"` MetadataLv string `json:"metadata_lv"` LVDmPath string `json:"lv_dm_path"` } diff --git a/images/agent/src/internal/utils/commands_test.go b/images/agent/src/internal/utils/commands_test.go index 98e447d5..4cfacb95 100644 --- a/images/agent/src/internal/utils/commands_test.go +++ b/images/agent/src/internal/utils/commands_test.go @@ -285,5 +285,33 @@ func TestCommands(t *testing.T) { assert.Equal(t, string(pv.LVAttr[0]), "t") } }) + + t.Run("Unmarshal_LV_Empty_ThinDeviceID", func(t *testing.T) { + // TODO: Cleanup + js := ` { + "report": [ + { + "lv": [ + {"lv_name":"[lvol0_pmspare]", "vg_name":"vg-1", "lv_attr":"ewi-------", "lv_size":"4194304", "pool_lv":"", "origin":"", "data_percent":"", "metadata_percent":"", "move_pv":"", "mirror_log":"", "copy_percent":"", "convert_lv":"", "vg_uuid":"QVh4uj-O6Wa-6TT8-XdU7-xCQu-M4gR-x9IY36", "lv_tags":"", "thin_id":"2", "metadata_lv":"", "lv_dm_path":"/dev/mapper/vg--1-lvol0_pmspare"}, + {"lv_name":"thin-1", "vg_name":"vg-1", "lv_attr":"twi-a-tz--", "lv_size":"104857600", "pool_lv":"", "origin":"", "data_percent":"0.00", "metadata_percent":"10.84", "move_pv":"", "mirror_log":"", "copy_percent":"", "convert_lv":"", "vg_uuid":"QVh4uj-O6Wa-6TT8-XdU7-xCQu-M4gR-x9IY36", "lv_tags":"", "thin_id":"", "metadata_lv":"[thin-1_tmeta]", "lv_dm_path":"/dev/mapper/vg--1-thin--1"}, + {"lv_name":"[thin-1_tdata]", "vg_name":"vg-1", "lv_attr":"Twi-ao----", "lv_size":"104857600", "pool_lv":"", "origin":"", "data_percent":"", "metadata_percent":"", "move_pv":"", "mirror_log":"", "copy_percent":"", "convert_lv":"", "vg_uuid":"QVh4uj-O6Wa-6TT8-XdU7-xCQu-M4gR-x9IY36", "lv_tags":"", "thin_id":"", "metadata_lv":"", "lv_dm_path":"/dev/mapper/vg--1-thin--1_tdata"}, + {"lv_name":"[thin-1_tmeta]", "vg_name":"vg-1", "lv_attr":"ewi-ao----", "lv_size":"4194304", "pool_lv":"", "origin":"", "data_percent":"", "metadata_percent":"", "move_pv":"", "mirror_log":"", "copy_percent":"", "convert_lv":"", "vg_uuid":"QVh4uj-O6Wa-6TT8-XdU7-xCQu-M4gR-x9IY36", "lv_tags":"", "thin_id":"", "metadata_lv":"", "lv_dm_path":"/dev/mapper/vg--1-thin--1_tmeta"}, + {"lv_name":"thin-5", "vg_name":"vg-1", "lv_attr":"twi-a-tz--", "lv_size":"54525952", "pool_lv":"", "origin":"", "data_percent":"0.00", "metadata_percent":"10.84", "move_pv":"", "mirror_log":"", "copy_percent":"", "convert_lv":"", "vg_uuid":"QVh4uj-O6Wa-6TT8-XdU7-xCQu-M4gR-x9IY36", "lv_tags":"", "thin_id":"", "metadata_lv":"[thin-5_tmeta]", "lv_dm_path":"/dev/mapper/vg--1-thin--5"}, + {"lv_name":"[thin-5_tdata]", "vg_name":"vg-1", "lv_attr":"Twi-ao----", "lv_size":"54525952", "pool_lv":"", "origin":"", "data_percent":"", "metadata_percent":"", "move_pv":"", "mirror_log":"", "copy_percent":"", "convert_lv":"", "vg_uuid":"QVh4uj-O6Wa-6TT8-XdU7-xCQu-M4gR-x9IY36", "lv_tags":"", "thin_id":"", "metadata_lv":"", "lv_dm_path":"/dev/mapper/vg--1-thin--5_tdata"}, + {"lv_name":"[thin-5_tmeta]", "vg_name":"vg-1", "lv_attr":"ewi-ao----", "lv_size":"4194304", "pool_lv":"", "origin":"", "data_percent":"", "metadata_percent":"", "move_pv":"", "mirror_log":"", "copy_percent":"", "convert_lv":"", "vg_uuid":"QVh4uj-O6Wa-6TT8-XdU7-xCQu-M4gR-x9IY36", "lv_tags":"", "thin_id":"", "metadata_lv":"", "lv_dm_path":"/dev/mapper/vg--1-thin--5_tmeta"} + ] + } + ] + , + "log": [ + ] + } +` + + pvs, err := unmarshalLVs([]byte(js)) + if assert.NoError(t, err) { + assert.Equal(t, "vg-1", pvs[0].VGName) + } + }) }) }