Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Change created virt-v2v conversion output to -o kubeVirt #778

Closed
wants to merge 11 commits into from
Prev Previous commit
Next Next commit
change mtv to use virt-v2v kubevirt changes
Signed-off-by: Bella Khizgiyaev <bkhizgiy@redhat.com>
  • Loading branch information
bkhizgiy committed Sep 2, 2024
commit aa22f8b879adc81c29f847de997a01846d21e6c3
2 changes: 1 addition & 1 deletion pkg/controller/plan/BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -22,10 +22,10 @@ go_library(
"//pkg/controller/base",
"//pkg/controller/plan/adapter",
"//pkg/controller/plan/adapter/base",
"//pkg/controller/plan/adapter/ova",
"//pkg/controller/plan/context",
"//pkg/controller/plan/handler",
"//pkg/controller/plan/scheduler",
"//pkg/controller/plan/util",
"//pkg/controller/provider/web",
"//pkg/controller/provider/web/vsphere",
"//pkg/controller/validation",
Expand Down
3 changes: 0 additions & 3 deletions pkg/controller/plan/adapter/ova/BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ go_library(
"builder.go",
"client.go",
"destinationclient.go",
"kubevirtvmparser.go",
"validator.go",
],
importpath = "github.com/konveyor/forklift-controller/pkg/controller/plan/adapter/ova",
Expand All @@ -27,9 +26,7 @@ go_library(
"//pkg/lib/error",
"//pkg/lib/inventory/web",
"//pkg/lib/itinerary",
"//pkg/lib/logging",
"//vendor/github.com/go-logr/logr",
"//vendor/gopkg.in/yaml.v2:yaml_v2",
"//vendor/k8s.io/api/core/v1:core",
"//vendor/k8s.io/apimachinery/pkg/api/resource",
"//vendor/k8s.io/utils/ptr",
Expand Down
43 changes: 0 additions & 43 deletions pkg/controller/plan/adapter/ova/kubevirtvmparser.go

This file was deleted.

4 changes: 4 additions & 0 deletions pkg/controller/plan/util/BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test")
go_library(
name = "util",
srcs = [
"kubevirtvmparser.go",
"openstack.go",
"ovirt.go",
"utils.go",
Expand All @@ -13,7 +14,10 @@ go_library(
"//pkg/apis/forklift/v1beta1",
"//pkg/controller/provider/web/openstack",
"//pkg/controller/provider/web/ovirt",
"//pkg/lib/error",
"//pkg/lib/logging",
"//pkg/settings",
"//vendor/gopkg.in/yaml.v2:yaml_v2",
"//vendor/k8s.io/api/core/v1:core",
"//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:meta",
],
Expand Down
133 changes: 133 additions & 0 deletions pkg/controller/plan/util/kubevirtvmparser.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,133 @@
package util

import (
"fmt"
"strings"

liberr "github.com/konveyor/forklift-controller/pkg/lib/error"
"github.com/konveyor/forklift-controller/pkg/lib/logging"
"gopkg.in/yaml.v2"
)

const (
// Name.
Name = "virt-v2v-parser"
)

// Package logger.
var log = logging.WithName(Name)

// Map of osinfo ids to vmware guest ids.
var osV2VMap = map[string]string{
"centos6": "centos6_64Guest",
"centos7": "centos7_64Guest",
"centos8": "centos8_64Guest",
"centos9": "centos9_64Guest",
"rhel7": "rhel7_64Guest",
"rhel8": "rhel8_64Guest",
"rhel9": "rhel9_64Guest",
"rocky": "rockylinux_64Guest",
"sles10": "sles10_64Guest",
"sles11": "sles11_64Guest",
"sles12": "sles12_64Guest",
"sles15": "sles15_64Guest",
"sles16": "sles16_64Guest",
"opensuse": "opensuse64Guest",
"debian4": "debian4_64Guest",
"debian5": "debian5_64Guest",
"debian6": "debian6_64Guest",
"debian7": "debian7_64Guest",
"debian8": "debian8_64Guest",
"debian9": "debian9_64Guest",
"debian10": "debian10_64Guest",
"debian11": "debian11_64Guest",
"debian12": "debian12_64Guest",
"ubuntu": "ubuntu64Guest",
"fedora": "fedora64Guest",
"win7": "windows7Server64Guest",
"win8": "windows8Server64Guest",
"win10": "windows9Server64Guest",
"win11": "windows11_64Guest",
"win12": "windows12_64Guest",
"win2k19": "windows2019srv_64Guest",
"win2k22": "windows2022srvNext_64Guest",
}

type VirtualMachine struct {
ApiVersion string `yaml:"apiVersion"`
Kind string `yaml:"kind"`
Metadata Metadata `yaml:"metadata"`
Spec Spec `yaml:"spec"`
}

type Metadata struct {
Name string `yaml:"name"`
Labels map[string]string `yaml:"labels"`
}

type Spec struct {
Domain Domain `yaml:"domain"`
}

type Domain struct {
OS OS `yaml:"os"`
}

type OS struct {
Firmware string `yaml:"firmware"`
}

type Bios struct{}

type EFI struct {
SecureBoot bool `yaml:"secureBoot"`
}

func GetFirmwareFromYaml(yamlData []byte) (firmware string, err error) {
var vm VirtualMachine
if err = yaml.Unmarshal(yamlData, &vm); err != nil {
return
}

if vm.Spec.Domain.OS.Firmware != "" {
return
}
err = liberr.New("Firmware type was not detected")
return
}

func GetOperationSystemFromYaml(yamlData []byte) (os string, err error) {
var vm VirtualMachine
if err = yaml.Unmarshal(yamlData, &vm); err != nil {
return
}

labels := vm.Metadata.Labels
if osinfo, ok := labels["libguestfs.org/osinfo"]; ok {
return mapOs(osinfo), nil

}
return
}

func mapOs(labelOS string) (os string) {
distro := strings.SplitN(labelOS, ".", 2)[0]

switch {
case strings.HasPrefix(distro, "rocky"):
distro = "rocky"
case strings.HasPrefix(distro, "opensuse"):
distro = "opensuse"
case strings.HasPrefix(distro, "ubuntu"):
distro = "ubuntu"
case strings.HasPrefix(distro, "fedora"):
distro = "fedora"
}

os, ok := osV2VMap[os]
if !ok {
log.Info(fmt.Sprintf("Received %s, mapped to: %s", labelOS, os))
os = "otherGuest64"
}
return
}
90 changes: 25 additions & 65 deletions virt-v2v/cold/entrypoint.go
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package main

import (
"bufio"
"context"
_ "embed"
"encoding/json"
Expand All @@ -11,8 +10,8 @@ import (
"os"
"os/exec"
"path/filepath"
"regexp"
"strconv"
"strings"
)

const (
Expand All @@ -25,10 +24,6 @@ const (
LUKSDIR = "/etc/luks"
)

var UEFI_RE = regexp.MustCompile(`(?i)UEFI\s+bootloader?`)
var firmware = "bios"
var nameChanged bool

var (
yamlFilePath string
server *http.Server
Expand All @@ -37,6 +32,9 @@ var (
const LETTERS = "abcdefghijklmnopqrstuvwxyz"
const LETTERS_LENGTH = len(LETTERS)

var firmware = "bios"
var nameChanged bool

func main() {
source := os.Getenv("V2V_source")
if source == vSphere {
Expand All @@ -63,18 +61,18 @@ func main() {
}

var err error
xmlFilePath, err = getXMLFile(DIR, "xml")
yamlFilePath, err = getYamlFile(DIR, "yaml")
if err != nil {
fmt.Println("Error getting XML file:", err)
fmt.Println("Error getting YAML file:", err)
os.Exit(1)
}

err = customizeVM(source, xmlFilePath)
err = customizeVM(source, yamlFilePath)
if err != nil {
fmt.Println("Warning customizing the VM failed:", err)
}

http.HandleFunc("/ovf", ovfHandler)
http.HandleFunc("/vm", vmHandler)
http.HandleFunc("/shutdown", shutdownHandler)
server = &http.Server{Addr: ":8080"}

Expand Down Expand Up @@ -202,6 +200,7 @@ func buildCommand() []string {
}

virtV2vArgs = append(virtV2vArgs, "-os", DIR)

//Disks on filesystem storage.
if err := LinkDisks(FS, 15); err != nil {
os.Exit(1)
Expand Down Expand Up @@ -345,71 +344,33 @@ func LinkDisks(diskKind string, num int) (err error) {
return
}

func executeVirtV2v(args []string, source string) (err error) {
virtV2vCmd := exec.Command(args[0], args[1:]...)
virtV2vStdoutPipe, err := virtV2vCmd.StdoutPipe()
if err != nil {
fmt.Printf("Error setting up stdout pipe: %v\n", err)
return
}
teeOut := io.TeeReader(virtV2vStdoutPipe, os.Stdout)

var teeErr io.Reader
if source == OVA {
virtV2vStderrPipe, err := virtV2vCmd.StderrPipe()
if err != nil {
fmt.Printf("Error setting up stdout pipe: %v\n", err)
return err
}
teeErr = io.TeeReader(virtV2vStderrPipe, os.Stderr)
} else {
virtV2vCmd.Stderr = os.Stderr
}

fmt.Println("exec ", virtV2vCmd)
if err = virtV2vCmd.Start(); err != nil {
fmt.Printf("Error executing command: %v\n", err)
return
}
func executeVirtV2v(args []string) error {
v2vCmd := exec.Command("virt-v2v", args...)
monitorCmd := exec.Command("/usr/local/bin/virt-v2v-monitor")
monitorCmd.Stdout = os.Stdout
monitorCmd.Stderr = os.Stderr

virtV2vMonitorCmd := exec.Command("/usr/local/bin/virt-v2v-monitor")
virtV2vMonitorCmd.Stdin = teeOut
virtV2vMonitorCmd.Stdout = os.Stdout
virtV2vMonitorCmd.Stderr = os.Stderr
var writer *io.PipeWriter
monitorCmd.Stdin, writer = io.Pipe()
v2vCmd.Stdout = writer
v2vCmd.Stderr = writer
defer writer.Close()

if err = virtV2vMonitorCmd.Start(); err != nil {
if err := monitorCmd.Start(); err != nil {
fmt.Printf("Error executing monitor command: %v\n", err)
return err
}

if source == OVA {
scanner := bufio.NewScanner(teeErr)
const maxCapacity = 1024 * 1024
buf := make([]byte, 0, 64*1024)
scanner.Buffer(buf, maxCapacity)

for scanner.Scan() {
line := scanner.Bytes()
if match := UEFI_RE.FindSubmatch(line); match != nil {
fmt.Println("UEFI firmware detected")
firmware = "efi"
}
}

if err = scanner.Err(); err != nil {
fmt.Println("Output query failed:", err)
return err
}
}

if err = virtV2vCmd.Wait(); err != nil {
fmt.Printf("Error waiting for virt-v2v to finish: %v\n", err)
return
fmt.Println("exec:", v2vCmd)
if err := v2vCmd.Run(); err != nil {
fmt.Printf("Error executing v2v command: %v\n", err)
return err
}

// virt-v2v is done, we can close the pipe to virt-v2v-monitor
writer.Close()

if err := monitorCmd.Wait(); err != nil {
fmt.Printf("Error waiting for virt-v2v-monitor to finish: %v\n", err)
return err
}
Expand Down Expand Up @@ -450,7 +411,6 @@ func vmHandler(w http.ResponseWriter, r *http.Request) {
}
}


func shutdownHandler(w http.ResponseWriter, r *http.Request) {
fmt.Println("Shutdown request received. Shutting down server.")
w.WriteHeader(http.StatusNoContent)
Expand Down