From 880142286eb776bcd7e9a491c0af8aebff8e6d7f Mon Sep 17 00:00:00 2001 From: zhengya Date: Thu, 9 May 2024 18:20:02 +0800 Subject: [PATCH] [CONTROLLER/RECORDER] supports updating vif vm --- server/controller/recorder/cache/diff_base.go | 8 +++++++ .../recorder/cache/tool_data_set.go | 21 +++++++++++++++++++ .../controller/recorder/updater/vinterface.go | 19 +++++++++++++++++ 3 files changed, 48 insertions(+) diff --git a/server/controller/recorder/cache/diff_base.go b/server/controller/recorder/cache/diff_base.go index aa545a7007c..f574f9fc249 100644 --- a/server/controller/recorder/cache/diff_base.go +++ b/server/controller/recorder/cache/diff_base.go @@ -20,6 +20,7 @@ import ( "time" cloudmodel "github.com/deepflowio/deepflow/server/controller/cloud/model" + "github.com/deepflowio/deepflow/server/controller/common" "github.com/deepflowio/deepflow/server/controller/db/mysql" . "github.com/deepflowio/deepflow/server/controller/recorder/common" ) @@ -348,6 +349,10 @@ func (b *DiffBaseDataSet) addVInterface(dbItem *mysql.VInterface, seq int, toolD if dbItem.NetworkID != 0 { networkLcuuid, _ = toolDataSet.GetNetworkLcuuidByID(dbItem.NetworkID) } + var deviceLcuuid string + if dbItem.DeviceType == common.VIF_DEVICE_TYPE_VM { + deviceLcuuid, _ = toolDataSet.GetVMLcuuidByID(dbItem.DeviceID) + } b.VInterfaces[dbItem.Lcuuid] = &VInterface{ DiffBase: DiffBase{ Sequence: seq, @@ -356,6 +361,7 @@ func (b *DiffBaseDataSet) addVInterface(dbItem *mysql.VInterface, seq int, toolD Name: dbItem.Name, Type: dbItem.Type, TapMac: dbItem.TapMac, + DeviceLcuuid: deviceLcuuid, NetworkLcuuid: networkLcuuid, RegionLcuuid: dbItem.Region, SubDomainLcuuid: dbItem.SubDomain, @@ -1179,6 +1185,7 @@ type VInterface struct { Name string `json:"name"` Type int `json:"type"` TapMac string `json:"tap_mac"` + DeviceLcuuid string `json:"device_lcuuid"` NetworkLcuuid string `json:"network_lcuuid"` RegionLcuuid string `json:"region_lcuuid"` SubDomainLcuuid string `json:"sub_domain_lcuuid"` @@ -1188,6 +1195,7 @@ func (v *VInterface) Update(cloudItem *cloudmodel.VInterface) { v.Name = cloudItem.Name v.Type = cloudItem.Type v.TapMac = cloudItem.TapMac + v.DeviceLcuuid = cloudItem.DeviceLcuuid v.NetworkLcuuid = cloudItem.NetworkLcuuid v.RegionLcuuid = cloudItem.RegionLcuuid log.Info(updateDiffBase(RESOURCE_TYPE_VINTERFACE_EN, v)) diff --git a/server/controller/recorder/cache/tool_data_set.go b/server/controller/recorder/cache/tool_data_set.go index 5cd4c2d03cf..5900034d2fe 100644 --- a/server/controller/recorder/cache/tool_data_set.go +++ b/server/controller/recorder/cache/tool_data_set.go @@ -41,6 +41,7 @@ type ToolDataSet struct { hostLcuuidToID map[string]int vmLcuuidToID map[string]int + vmIDToLcuuid map[int]string vpcLcuuidToID map[string]int vpcIDToLcuuid map[int]string @@ -121,6 +122,7 @@ func NewToolDataSet() ToolDataSet { hostLcuuidToID: make(map[string]int), vmLcuuidToID: make(map[string]int), + vmIDToLcuuid: make(map[int]string), vpcLcuuidToID: make(map[string]int), vpcIDToLcuuid: make(map[int]string), @@ -268,6 +270,7 @@ func (t *ToolDataSet) updateHost(cloudItem *cloudmodel.Host) { func (t *ToolDataSet) addVM(item *mysql.VM) { t.vmLcuuidToID[item.Lcuuid] = item.ID + t.vmIDToLcuuid[item.ID] = item.Lcuuid t.vmIDToInfo[item.ID] = &vmInfo{ Name: item.Name, VPCID: item.VPCID, @@ -312,6 +315,7 @@ func (t *ToolDataSet) updateVM(cloudItem *cloudmodel.VM) { func (t *ToolDataSet) deleteVM(lcuuid string) { id, _ := t.GetVMIDByLcuuid(lcuuid) + delete(t.vmIDToLcuuid, id) delete(t.vmIDToIPNetworkIDMap, id) delete(t.vmLcuuidToID, lcuuid) delete(t.vmIDToInfo, id) @@ -1116,6 +1120,23 @@ func (t *ToolDataSet) GetVPCLcuuidByID(id int) (string, bool) { } } +func (t *ToolDataSet) GetVMLcuuidByID(id int) (string, bool) { + lcuuid, exists := t.vmIDToLcuuid[id] + if exists { + return lcuuid, true + } + log.Warning(cacheLcuuidByIDNotFound(RESOURCE_TYPE_VM_EN, id)) + var vm mysql.VM + result := mysql.Db.Where("lcuuid = ?", id).Find(&vm) + if result.RowsAffected == 1 { + t.addVM(&vm) + return vm.Lcuuid, true + } else { + log.Error(dbResourceByIDNotFound(RESOURCE_TYPE_VM_EN, id)) + return lcuuid, false + } +} + func (t *ToolDataSet) GetNetworkIDByLcuuid(lcuuid string) (int, bool) { if lcuuid == PUBLIC_NETWORK_LCUUID { return t.publicNetworkID, true diff --git a/server/controller/recorder/updater/vinterface.go b/server/controller/recorder/updater/vinterface.go index 94c94bf8f59..1f362bbe6fc 100644 --- a/server/controller/recorder/updater/vinterface.go +++ b/server/controller/recorder/updater/vinterface.go @@ -20,6 +20,7 @@ import ( "strings" cloudmodel "github.com/deepflowio/deepflow/server/controller/cloud/model" + ctrlrcommon "github.com/deepflowio/deepflow/server/controller/common" "github.com/deepflowio/deepflow/server/controller/db/mysql" "github.com/deepflowio/deepflow/server/controller/recorder/cache" "github.com/deepflowio/deepflow/server/controller/recorder/common" @@ -118,6 +119,24 @@ func (i *VInterface) generateUpdateInfo(diffBase *cache.VInterface, cloudItem *c updateInfo["subnetid"] = networkID } } + if cloudItem.DeviceType == ctrlrcommon.VIF_DEVICE_TYPE_VM { + if diffBase.DeviceLcuuid != cloudItem.DeviceLcuuid { + vmID, exists := i.cache.ToolDataSet.GetVMIDByLcuuid(cloudItem.DeviceLcuuid) + if !exists { + if i.domainToolDataSet != nil { + vmID, exists = i.domainToolDataSet.GetVMIDByLcuuid(cloudItem.DeviceLcuuid) + } + if !exists { + log.Errorf(resourceAForResourceBNotFound( + common.RESOURCE_TYPE_VM_EN, cloudItem.DeviceLcuuid, + common.RESOURCE_TYPE_VINTERFACE_EN, cloudItem.Lcuuid, + )) + return nil, false + } + } + updateInfo["deviceid"] = vmID + } + } if diffBase.Name != cloudItem.Name { updateInfo["name"] = cloudItem.Name }