-
Notifications
You must be signed in to change notification settings - Fork 34
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Change VM customization to use a YAML output file instead of XML.
As part of the virt-v2v migration, we inspect the OS type and disk paths. Until now, this has been done with the XML output file. Due to the change to YAML format, this process needs to be adapted as well. Since we cannot use external libraries in the virt-v2v directory, it was implemented using bufio. Signed-off-by: Bella Khizgiyaev <[email protected]>
- Loading branch information
Showing
2 changed files
with
71 additions
and
97 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,97 +1,73 @@ | ||
package main | ||
|
||
import ( | ||
"encoding/xml" | ||
"bufio" | ||
"fmt" | ||
"os" | ||
"strings" | ||
) | ||
|
||
type OvaVmconfig struct { | ||
XMLName xml.Name `xml:"domain"` | ||
Name string `xml:"name"` | ||
OS OS `xml:"os"` | ||
Metadata Metadata `xml:"metadata"` | ||
Devices Devices `xml:"devices"` | ||
type VmConfig struct { | ||
OSInfo string | ||
DiskPaths []string | ||
} | ||
|
||
type OS struct { | ||
Type OSType `xml:"type"` | ||
Loader Loader `xml:"loader"` | ||
Nvram Nvram `xml:"nvram"` | ||
} | ||
|
||
type Metadata struct { | ||
LibOsInfo LibOsInfo `xml:"libosinfo"` | ||
} | ||
|
||
type Devices struct { | ||
Disks []Disk `xml:"disk"` | ||
} | ||
type Disk struct { | ||
Source Source `xml:"source"` | ||
} | ||
type Source struct { | ||
File string `xml:"file,attr"` | ||
} | ||
|
||
type LibOsInfo struct { | ||
V2VOS V2VOS `xml:"os"` | ||
} | ||
|
||
type V2VOS struct { | ||
ID string `xml:"id,attr"` | ||
} | ||
// ReadYAMLFile reads the YAML file and extracts the HostDisk paths and osinfo label. | ||
func GetVmConfigYaml(filePath string) (*VmConfig, error) { | ||
file, err := os.Open(filePath) | ||
if err != nil { | ||
return nil, fmt.Errorf("error opening YAML file: %w", err) | ||
} | ||
defer file.Close() | ||
|
||
type OSType struct { | ||
Arch string `xml:"arch,attr"` | ||
Machine string `xml:"machine,attr"` | ||
Content string `xml:",chardata"` | ||
} | ||
config := &VmConfig{} | ||
scanner := bufio.NewScanner(file) | ||
var inLabels, inVolumes bool | ||
for scanner.Scan() { | ||
line := strings.TrimSpace(scanner.Text()) | ||
|
||
type Loader struct { | ||
Readonly string `xml:"readonly,attr"` | ||
Type string `xml:"type,attr"` | ||
Secure string `xml:"secure,attr"` | ||
Path string `xml:",chardata"` | ||
} | ||
if line == "" || strings.HasPrefix(line, "#") { | ||
continue | ||
} | ||
|
||
type Nvram struct { | ||
Template string `xml:"template,attr"` | ||
} | ||
if strings.HasPrefix(line, "labels:") { | ||
inLabels = true | ||
continue | ||
} | ||
|
||
// ReadXMLFile reads the content of an XML []byte from the given file path. | ||
// | ||
// Arguments: | ||
// - filePath (string): The path to the XML file. | ||
// | ||
// Returns: | ||
// - []byte: The content of the XML file. | ||
// - error: An error if the file cannot be read, or nil if successful. | ||
func ReadXMLFile(filePath string) ([]byte, error) { | ||
if filePath == "" { | ||
return nil, fmt.Errorf("XML file path is empty") | ||
} | ||
if inLabels { | ||
if strings.HasPrefix(line, "libguestfs.org/osinfo:") { | ||
config.OSInfo = strings.TrimSpace(strings.TrimPrefix(line, "libguestfs.org/osinfo:")) | ||
} | ||
if !strings.HasPrefix(line, "libguestfs.org/") { | ||
inLabels = false | ||
} | ||
} | ||
|
||
xmlData, err := os.ReadFile(filePath) | ||
if err != nil { | ||
return nil, fmt.Errorf("error reading XML file: %w", err) | ||
if strings.Contains(line, "volumes:") { | ||
inVolumes = true | ||
continue | ||
} | ||
if inVolumes { | ||
if strings.Contains(line, "hostDisk:") { | ||
scanner.Scan() | ||
pathLine := strings.TrimSpace(scanner.Text()) | ||
if strings.HasPrefix(pathLine, "path:") { | ||
pathValue := strings.TrimSpace(strings.TrimPrefix(pathLine, "path:")) | ||
if pathValue != "" { | ||
config.DiskPaths = append(config.DiskPaths, pathValue) | ||
} | ||
} | ||
} | ||
if strings.Contains(line, "- name:") { | ||
inVolumes = false | ||
} | ||
} | ||
} | ||
|
||
return xmlData, nil | ||
} | ||
|
||
func GetDomainFromXml(xmlFilePath string) (*OvaVmconfig, error) { | ||
xmlData, err := ReadXMLFile(xmlFilePath) | ||
if err != nil { | ||
fmt.Printf("Error read XML: %v\n", err) | ||
return nil, err | ||
if err := scanner.Err(); err != nil { | ||
return nil, fmt.Errorf("error reading YAML file: %w", err) | ||
} | ||
|
||
var xmlConf OvaVmconfig | ||
err = xml.Unmarshal(xmlData, &xmlConf) | ||
if err != nil { | ||
fmt.Printf("Error unmarshalling XML: %v\n", err) | ||
return nil, err | ||
} | ||
return &xmlConf, nil | ||
return config, nil | ||
} |