Skip to content

Commit

Permalink
[Controller] parse kvm support run.xml
Browse files Browse the repository at this point in the history
  • Loading branch information
askyrie committed Apr 10, 2024
1 parent 78adfae commit 4723e63
Show file tree
Hide file tree
Showing 4 changed files with 51 additions and 13 deletions.
57 changes: 46 additions & 11 deletions server/controller/genesis/common/utils.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,10 +28,14 @@ import (
"strconv"
"strings"

"github.com/deepflowio/deepflow/server/controller/common"
"github.com/op/go-logging"
"gopkg.in/yaml.v3"

"github.com/deepflowio/deepflow/server/controller/common"
)

var log = logging.MustGetLogger("genesis.common")

type VifInfo struct {
MaskLen uint32
Address string
Expand Down Expand Up @@ -111,14 +115,22 @@ type KVMDomain struct {
Type string `xml:"type,attr"`
UUID string `xml:"uuid"`
Name string `xml:"name"`
Label string `xml:"label"`
Title string `xml:"title"`
MetaData KVMMetaData `xml:"metadata"`
Devices KVMDevices `xml:"devices"`
}
type KVMDomains struct {
type ETCDomains struct {
Domains []KVMDomain `xml:"domain"`
}

type DomStatus struct {
Domains KVMDomain `xml:"domain"`
}

type RUNDomains struct {
DomStatus []DomStatus `xml:"domstatus"`
}

type XMLVPC struct {
UUID string
Name string
Expand Down Expand Up @@ -349,32 +361,55 @@ func ParseVMStates(s string) (map[string]int, error) {
return vmToState, nil
}

func ParseVMXml(s string) ([]XMLVM, error) {
func ParseVMXml(s, namePrefer string) ([]XMLVM, error) {
var vms []XMLVM
if s == "" {
return vms, nil
}

// ns := "http://openstack.org/xmlns/libvirt/nova/1.0"

var domains KVMDomains
err := xml.Unmarshal([]byte(s), &domains)
var domains []KVMDomain
var etcDomains ETCDomains
err := xml.Unmarshal([]byte(s), &etcDomains)
if err != nil {
return vms, err
}
for _, domain := range domains.Domains {
if len(etcDomains.Domains) != 0 {
domains = etcDomains.Domains
} else {
var runDomains RUNDomains
err := xml.Unmarshal([]byte(s), &runDomains)
if err != nil {
return vms, err
}
for _, d := range runDomains.DomStatus {
domains = append(domains, d.Domains)
}
}
for _, domain := range domains {
var vm XMLVM
if domain.UUID == "" {
log.Warning("vm uuid not found in xml")
continue
}
vm.UUID = domain.UUID
if domain.Name == "" {
log.Warning("vm uuid not found in xml")
continue
}
vm.UUID = domain.UUID
vm.Label = domain.Name
vm.Name = domain.MetaData.Instance.Name
switch namePrefer {
case "uuid":
vm.Name = domain.UUID
case "name":
vm.Name = domain.Name
case "title":
vm.Name = domain.Title
default:
vm.Name = domain.MetaData.Instance.Name
}
if vm.Name == "" {
vm.Name = vm.Label
vm.Name = domain.Name
}
if domain.MetaData.Instance.Owner.Project.UUID != "" {
uuid := domain.MetaData.Instance.Owner.Project.UUID
Expand Down
2 changes: 1 addition & 1 deletion server/controller/genesis/common/utils_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -236,7 +236,7 @@ func TestParseVMStates(t *testing.T) {
func TestParseVMXml(t *testing.T) {
XMLStr := `<domains>\n<domain type='kvm'>\n <name>instance-00000064</name>\n <uuid>a51e6527-bd5e-42c2-81be-fee17d814706</uuid>\n <metadata>\n <nova:instance xmlns:nova="http://openstack.org/xmlns/libvirt/nova/1.0">\n <nova:name>test-vm-liqian</nova:name>\n <nova:owner>\n <nova:user uuid="417a8402bfc64f4abb67f68a8a0fdcff">bangongfuwu</nova:user>\n <nova:project uuid="7e39057dbe2042e4b3b188678f22648e">NSLS</nova:project>\n </nova:owner>\n </nova:instance>\n </metadata>\n <devices>\n <interface type='bridge'>\n <mac address='fa:16:3e:59:b5:10'/>\n <source bridge='qbr155abd89-91'/>\n <target dev='tap155abd89-91'/>\n <model type='virtio'/>\n <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>\n </interface>\n </devices>\n</domain>\n<!--\nWARNING: THIS IS AN AUTO-GENERATED FILE. CHANGES TO IT ARE LIKELY TO BE\nOVERWRITTEN AND LOST. Changes to this xml configuration should be made using:\n virsh edit instance-00000065\nor other application using the libvirt API.\n-->\n<domain type='kvm'>\n <name>instance-00000065</name>\n <uuid>75e9bb32-09c8-48e9-93bc-0330686702f3</uuid>\n <metadata>\n <nova:instance xmlns:nova="http://openstack.org/xmlns/libvirt/nova/1.0">\n <nova:name>lbq-vm-vxlan-1</nova:name>\n <nova:owner>\n <nova:user uuid="417a8402bfc64f4abb67f68a8a0fdcff">bangongfuwu</nova:user>\n <nova:project uuid="7e39057dbe2042e4b3b188678f22648e">NSLS</nova:project>\n </nova:owner>\n </nova:instance>\n </metadata>\n <devices>\n <interface type='bridge'>\n <mac address='fa:16:3e:38:a5:48'/>\n <source bridge='qbr717a30a1-db'/>\n <target dev='tap717a30a1-db'/>\n <model type='virtio'/>\n <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>\n </interface>\n <interface type='bridge'>\n <mac address='fa:16:3e:8f:78:2b'/>\n <source bridge='qbr27e9b93c-93'/>\n <target dev='tap27e9b93c-93'/>\n <model type='virtio'/>\n <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>\n </interface>\n </devices>\n</domain>\n</domains>\n`
Convey("TestParseVMXml", t, func() {
xmls, _ := ParseVMXml(XMLStr)
xmls, _ := ParseVMXml(XMLStr, "")
Convey("ParseVMXml items should be equal", func() {
So(len(xmls), ShouldEqual, 2)
So(xmls[0].UUID, ShouldEqual, "a51e6527-bd5e-42c2-81be-fee17d814706")
Expand Down
1 change: 1 addition & 0 deletions server/controller/genesis/config/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,4 +27,5 @@ type GenesisConfig struct {
MultiNSMode bool `default:"false" yaml:"multi_ns_mode"`
SingleVPCMode bool `default:"false" yaml:"single_vpc_mode"`
IgnoreNICRegex string `default:"^(kube-ipvs)" yaml:"ignore_nic_regex"`
ParseKVMNamePrefer string `default:"" yaml:"parse_kvm_name_prefer"` // support: uuid,name,title
}
4 changes: 3 additions & 1 deletion server/controller/genesis/updater.go
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ type GenesisSyncRpcUpdater struct {
excludeIPRanges []netaddr.IPPrefix
multiNSMode bool
singleVPCMode bool
parseKVMNamePrefer string
ignoreNICRegex *regexp.Regexp
genesisSyncDataByPeer map[uint32]GenesisSyncDataOperation
}
Expand Down Expand Up @@ -119,6 +120,7 @@ func NewGenesisSyncRpcUpdater(storage *SyncStorage, queue queue.QueueReader, cfg
excludeIPRanges: excludeIPRanges,
multiNSMode: cfg.MultiNSMode,
singleVPCMode: cfg.SingleVPCMode,
parseKVMNamePrefer: cfg.ParseKVMNamePrefer,
ignoreNICRegex: ignoreNICRegex,
genesisSyncDataByPeer: map[uint32]GenesisSyncDataOperation{},
}
Expand Down Expand Up @@ -621,7 +623,7 @@ func (v *GenesisSyncRpcUpdater) ParseKVMPlatformInfo(info VIFRPCMessage, peer st
if err != nil {
log.Warning("parse vm states failed: " + err.Error())
}
xmlVMs, err := genesiscommon.ParseVMXml(rawVM)
xmlVMs, err := genesiscommon.ParseVMXml(rawVM, v.parseKVMNamePrefer)
if err != nil {
log.Warning("parse vm xml failed: " + err.Error())
}
Expand Down

0 comments on commit 4723e63

Please sign in to comment.