diff --git a/.github/actions/run-eden-test/action.yml b/.github/actions/run-eden-test/action.yml index c9393c14f..30c03f3c3 100644 --- a/.github/actions/run-eden-test/action.yml +++ b/.github/actions/run-eden-test/action.yml @@ -56,13 +56,68 @@ runs: - name: Setup Environment uses: ./eden/.github/actions/setup-environment with: - file_system: ${{ inputs.file_system }} - tpm_enabled: ${{ inputs.tpm_enabled }} - eve_image: ${{ inputs.eve_image }} - eve_log_level: ${{ inputs.eve_log_level }} eve_artifact_name: ${{ inputs.eve_artifact_name }} artifact_run_id: ${{ inputs.artifact_run_id }} - require_virtualization: ${{ inputs.require_virtualization }} + - name: Configure + run: | + ./eden config add default + require_virt="${{ inputs.require_virtualization }}" + if [[ "$require_virt" == "true" ]]; then + if ! lscpu | grep -oEq "vmx|svm"; then + echo "Missing required HW-assisted virtualization support" + exit 1 + fi + ./eden config set default --key=eve.accel --value=true + else + ./eden config set default --key=eve.accel --value=false + ./eden config set default --key=eve.firmware --value="$(pwd)/firmware/OVMF_CODE.fd $(pwd)/firmware/OVMF_VARS.fd" + fi + ./dist/bin/eden+ports.sh 2223:2223 2224:2224 5912:5902 5911:5901 8027:8027 8028:8028 8029:8029 8030:8030 8031:8031 + ./eden config set default --key=eve.tpm --value=${{ inputs.tpm_enabled }} + ./eden config set default --key=eve.cpu --value=2 + shell: bash + working-directory: "./eden" + - name: Setup eve version + run: | + image=${{ inputs.eve_image }} + if [[ -n "$image" && "$image" == *:* ]]; then + echo "Setting up eve image ${image}" + eve_pr_registry=$(echo "$image" | cut -d ':' -f 1) + eve_pr=$(echo "$image" | cut -d ':' -f 2 | cut -d "-" -f1) + # this will be empty if there is no rc in the tag + eve_rc=$(echo "$image" | cut -d ':' -f 2 | grep -Eo "\-rc[0-9]+" || printf "") + ./eden config set default --key=eve.registry --value="$eve_pr_registry" + ./eden config set default --key=eve.tag --value="$eve_pr$eve_rc" + else + echo "Skipping setting up eve image ${image}" + fi + shell: bash + working-directory: "./eden" + - name: Set eve log level + run: ./eden config set default --key=eve.log-level --value=${{ inputs.eve_log_level }} + shell: bash + working-directory: "./eden" + - name: Setup ext4 + if: inputs.file_system == 'ext4' + run: ./eden setup -v debug + shell: bash + working-directory: "./eden" + - name: Setup zfs + if: inputs.file_system == 'zfs' + run: | + ./eden config set default --key=eve.disks --value=4 + ./eden config set default --key=eve.disk --value=4096 + ./eden setup -v debug --grub-options='set_global dom0_extra_args "$dom0_extra_args eve_install_zfs_with_raid_level "' + shell: bash + working-directory: "./eden" + + - name: Start and Onboard + run: | + ./eden start -v debug + ./eden eve onboard -v debug + shell: bash + working-directory: "./eden" + - name: Run tests run: EDEN_TEST_STOP=n ./eden test ./tests/workflow -s ${{ inputs.suite }} -v debug shell: bash diff --git a/.github/actions/run-neoeden-test/action.yml b/.github/actions/run-neoeden-test/action.yml index b6db6b767..2bcf9944f 100644 --- a/.github/actions/run-neoeden-test/action.yml +++ b/.github/actions/run-neoeden-test/action.yml @@ -55,20 +55,20 @@ runs: - name: Setup Environment uses: ./eden/.github/actions/setup-environment with: - file_system: ${{ inputs.file_system }} - tpm_enabled: ${{ inputs.tpm_enabled }} - eve_image: ${{ inputs.eve_image }} - eve_log_level: ${{ inputs.eve_log_level }} eve_artifact_name: ${{ inputs.eve_artifact_name }} artifact_run_id: ${{ inputs.artifact_run_id }} - require_virtualization: ${{ inputs.require_virtualization }} - name: Run neoeden test suite - run: go test -timeout 30m shell: bash working-directory: ${{ inputs.test_suite }} env: AZIOT_ID_SCOPE: ${{ inputs.aziot_id_scope }} AZIOT_CONNECTION_STRING: ${{ inputs.aziot_connection_string }} + run: | + go test \ + -filesystem="${{ inputs.file_system }}" \ + -eve-image="${{ inputs.eve_image }}" \ + -eve-log-level="${{ inputs.eve_log_level }}" \ + -timeout 30m - name: Collect info if: failure() uses: ./eden/.github/actions/collect-info @@ -76,7 +76,7 @@ runs: if: always() uses: ./eden/.github/actions/publish-logs with: - report_name: eden-report-${{ inputs.suite }}-tpm-${{ inputs.tpm_enabled }}-${{ inputs.file_system }} + report_name: eden-report-${{ inputs.test_suite }}-tpm-${{ inputs.tpm_enabled }}-${{ inputs.file_system }} - name: Clean up after test if: always() run: | diff --git a/.github/actions/setup-environment/action.yml b/.github/actions/setup-environment/action.yml index 22ada7fd2..c4e10b072 100644 --- a/.github/actions/setup-environment/action.yml +++ b/.github/actions/setup-environment/action.yml @@ -1,31 +1,17 @@ name: 'Setup environment to run eden tests' -description: 'Setup building dependencies, build and configure eden' +description: 'Setup building dependencies' inputs: - file_system: - required: true - type: string - tpm_enabled: - required: true - type: bool - eve_image: - type: string - eve_log_level: - type: string - required: false - default: 'info' eve_artifact_name: type: string artifact_run_id: type: string - require_virtualization: - type: bool - + runs: using: 'composite' steps: - name: Setup go - uses: actions/setup-go@v3 + uses: actions/setup-go@v5 with: go-version: '1.22' - name: Check @@ -51,25 +37,6 @@ runs: make build-tests shell: bash working-directory: "./eden" - - name: Configure - run: | - ./eden config add default - require_virt="${{ inputs.require_virtualization }}" - if [[ "$require_virt" == "true" ]]; then - if ! lscpu | grep -oEq "vmx|svm"; then - echo "Missing required HW-assisted virtualization support" - exit 1 - fi - ./eden config set default --key=eve.accel --value=true - else - ./eden config set default --key=eve.accel --value=false - ./eden config set default --key=eve.firmware --value="$(pwd)/firmware/OVMF_CODE.fd $(pwd)/firmware/OVMF_VARS.fd" - fi - ./dist/bin/eden+ports.sh 2223:2223 2224:2224 5912:5902 5911:5901 8027:8027 8028:8028 8029:8029 8030:8030 8031:8031 - ./eden config set default --key=eve.tpm --value=${{ inputs.tpm_enabled }} - ./eden config set default --key=eve.cpu --value=2 - shell: bash - working-directory: "./eden" - name: Download artifact if specified if: inputs.eve_artifact_name != '' uses: actions/download-artifact@v4 @@ -84,43 +51,3 @@ runs: docker load -q -i artifacts/${{ inputs.eve_artifact_name }}.tar docker image ls shell: bash - - name: Setup eve version - run: | - image=${{ inputs.eve_image }} - if [[ -n "$image" && "$image" == *:* ]]; then - echo "Setting up eve image ${image}" - eve_pr_registry=$(echo "$image" | cut -d ':' -f 1) - eve_pr=$(echo "$image" | cut -d ':' -f 2 | cut -d "-" -f1) - # this will be empty if there is no rc in the tag - eve_rc=$(echo "$image" | cut -d ':' -f 2 | grep -Eo "\-rc[0-9]+" || printf "") - ./eden config set default --key=eve.registry --value="$eve_pr_registry" - ./eden config set default --key=eve.tag --value="$eve_pr$eve_rc" - else - echo "Skipping setting up eve image ${image}" - fi - shell: bash - working-directory: "./eden" - - name: Set eve log level - run: ./eden config set default --key=eve.log-level --value=${{ inputs.eve_log_level }} - shell: bash - working-directory: "./eden" - - name: Setup ext4 - if: inputs.file_system == 'ext4' - run: ./eden setup -v debug - shell: bash - working-directory: "./eden" - - name: Setup zfs - if: inputs.file_system == 'zfs' - run: | - ./eden config set default --key=eve.disks --value=4 - ./eden config set default --key=eve.disk --value=4096 - ./eden setup -v debug --grub-options='set_global dom0_extra_args "$dom0_extra_args eve_install_zfs_with_raid_level "' - shell: bash - working-directory: "./eden" - - - name: Start and Onboard - run: | - ./eden start -v debug - ./eden eve onboard -v debug - shell: bash - working-directory: "./eden" diff --git a/.github/workflows/eden.yml b/.github/workflows/eden.yml index 12596967d..989d82d75 100644 --- a/.github/workflows/eden.yml +++ b/.github/workflows/eden.yml @@ -20,6 +20,6 @@ jobs: uses: ./.github/workflows/test.yml with: eve_image: "lfedge/eve:15.8.0" - eve_kubevirt_image: "lfedge/eve:0.0.0-master-75241279-kubevirt-amd64" + eve_kubevirt_image: "lfedge/eve:0.0.0-master-75241279" eden_version: ${{ github.event.pull_request.head.sha }} secrets: inherit diff --git a/.github/workflows/eden_setup.yml b/.github/workflows/eden_setup.yml index 7f9ffd114..e840eadf8 100644 --- a/.github/workflows/eden_setup.yml +++ b/.github/workflows/eden_setup.yml @@ -24,7 +24,7 @@ jobs: - name: Set up QEMU uses: docker/setup-qemu-action@v3 - name: setup go - uses: actions/setup-go@v3 + uses: actions/setup-go@v5 with: go-version: '1.22' - name: Login to DockerHub (Pull) @@ -56,7 +56,7 @@ jobs: - name: Set up QEMU uses: docker/setup-qemu-action@v3 - name: setup go - uses: actions/setup-go@v3 + uses: actions/setup-go@v5 with: go-version: '1.22' - name: Login to DockerHub (Pull) diff --git a/.github/workflows/unit.yml b/.github/workflows/unit.yml index 3ab0c2969..07ff23643 100644 --- a/.github/workflows/unit.yml +++ b/.github/workflows/unit.yml @@ -11,7 +11,7 @@ jobs: - name: get eden uses: actions/checkout@v4.1.1 - name: setup go - uses: actions/setup-go@v3 + uses: actions/setup-go@v5 with: go-version: '1.22' - name: run tests diff --git a/cmd/edenConfig.go b/cmd/edenConfig.go index ccbf83fb9..64bc4615c 100644 --- a/cmd/edenConfig.go +++ b/cmd/edenConfig.go @@ -15,10 +15,11 @@ func newConfigCmd(configName, verbosity *string) *cobra.Command { if err != nil { log.Fatal(err) } - cfg, err := openevec.GetDefaultConfig(currentPath) - if err != nil { + builder := openevec.GetDefaultConfig(currentPath) + if len(builder.Err) > 0 { log.Fatalf("Failed to generate default config %v\n", err) } + cfg := builder.Args var configCmd = &cobra.Command{ Use: "config", Short: "work with config", diff --git a/cmd/edenSetup.go b/cmd/edenSetup.go index 1538a63c4..026b03e07 100644 --- a/cmd/edenSetup.go +++ b/cmd/edenSetup.go @@ -14,7 +14,6 @@ import ( func newSetupCmd(configName, verbosity *string) *cobra.Command { cfg := &openevec.EdenSetupArgs{} var configDir, softSerial, zedControlURL, ipxeOverride string - var grubOptions []string var netboot, installer bool var setupCmd = &cobra.Command{ @@ -23,7 +22,7 @@ func newSetupCmd(configName, verbosity *string) *cobra.Command { Long: `Setup harness.`, PersistentPreRunE: preRunViperLoadFunction(cfg, configName, verbosity), Run: func(cmd *cobra.Command, args []string) { - if err := openEVEC.SetupEden(*configName, configDir, softSerial, zedControlURL, ipxeOverride, grubOptions, netboot, installer); err != nil { + if err := openEVEC.SetupEden(*configName, configDir, softSerial, zedControlURL, ipxeOverride, netboot, installer); err != nil { log.Fatalf("Setup eden failed: %s", err) } @@ -42,7 +41,7 @@ func newSetupCmd(configName, verbosity *string) *cobra.Command { setupCmd.Flags().StringVar(&softSerial, "soft-serial", "", "Use provided serial instead of hardware one, please use chars and numbers here") setupCmd.Flags().StringVar(&zedControlURL, "zedcontrol", "", "Use provided zedcontrol domain instead of adam (as example: zedcloud.alpha.zededa.net)") setupCmd.Flags().StringVar(&ipxeOverride, "ipxe-override", "", "override lines inside ipxe, please use || as delimiter") - setupCmd.Flags().StringArrayVar(&grubOptions, "grub-options", []string{}, "append lines to grub options") + setupCmd.Flags().StringArrayVar(&cfg.Eve.GrubOptions, "grub-options", []string{}, "append lines to grub options") setupCmd.Flags().StringVarP(&cfg.Eden.CertsDir, "certs-dist", "o", cfg.Eden.CertsDir, "directory with certs") setupCmd.Flags().StringVarP(&cfg.Adam.CertsDomain, "domain", "d", defaults.DefaultDomain, "FQDN for certificates") diff --git a/pkg/evetestkit/framework.go b/pkg/evetestkit/framework.go new file mode 100644 index 000000000..1d876ea79 --- /dev/null +++ b/pkg/evetestkit/framework.go @@ -0,0 +1,57 @@ +package evetestkit + +import ( + "errors" + "flag" + "fmt" + "path/filepath" + + "github.com/lf-edge/eden/pkg/defaults" + "github.com/lf-edge/eden/pkg/openevec" +) + +// SetupTestSuite initializes the test environment for a test suite +// Call this from TestMain in each test package +func SetupTestSuite(projectName string, configPath string, opts ...openevec.ConfigOption) (*EveNode, func(), error) { + flag.Parse() + + builder := openevec.GetDefaultConfig(configPath) + + if len(builder.Err) > 0 { + return nil, nil, errors.Join(builder.Err...) + } + + for _, opt := range opts { + opt(builder) + } + + cfg := builder.Args + + if err := openevec.ConfigAdd(cfg, cfg.ConfigName, "", false); err != nil { + return nil, nil, err + } + + evec := openevec.CreateOpenEVEC(cfg) + configDir := filepath.Join(configPath, "eve-config-dir") + if err := evec.SetupEden("config", configDir, "", "", "", false, false); err != nil { + return nil, nil, fmt.Errorf("Failed to setup Eden: %v", err) + } + if err := evec.StartEden(defaults.DefaultVBoxVMName, "", ""); err != nil { + return nil, nil, fmt.Errorf("Start eden failed: %s", err) + } + if err := evec.OnboardEve(cfg.Eve.CertsUUID); err != nil { + return nil, nil, fmt.Errorf("Eve onboard failed: %s", err) + } + + node, err := InitializeTestFromConfig( + projectName, cfg, WithControllerVerbosity("debug")) + if err != nil { + return nil, nil, fmt.Errorf("Failed to initialize test: %v", err) + } + + cleanup := func() { + fmt.Printf("Cleaning up test suite: %s", projectName) + } + + return node, cleanup, nil +} diff --git a/pkg/openevec/config.go b/pkg/openevec/config.go index e69c8b5c6..71cbc23c7 100644 --- a/pkg/openevec/config.go +++ b/pkg/openevec/config.go @@ -129,21 +129,22 @@ type EveConfig struct { Serial string `mapstructure:"serial" cobraflag:"eve-serial"` Accel bool `mapstructure:"accel" cobraflag:"eve-accel"` - Pid string `mapstructure:"pid" cobraflag:"eve-pid" resolvepath:""` - Log string `mapstructure:"log" cobraflag:"eve-log" resolvepath:""` - TelnetPort int `mapstructure:"telnet-port" cobraflag:"eve-telnet-port"` - Remote bool `mapstructure:"remote"` - RemoteAddr string `mapstructure:"remote-addr"` - ModelFile string `mapstructure:"devmodelfile" cobraflag:"devmodel-file"` - Cert string `mapstructure:"cert" resolvepath:""` - DeviceCert string `mapstructure:"device-cert" resolvepath:""` - Name string `mapstructure:"name"` - RemoteLogLevel string `mapstructure:"remote-log-level"` - LogLevel string `mapstructure:"log-level"` - Disks int `mapstructure:"disks"` - BootstrapFile string `mapstructure:"bootstrap-file" cobraflag:"eve-bootstrap-file"` - UsbNetConfFile string `mapstructure:"usbnetconf-file" cobraflag:"eve-usbnetconf-file"` - TPM bool `mapstructure:"tpm" cobraflag:"tpm"` + Pid string `mapstructure:"pid" cobraflag:"eve-pid" resolvepath:""` + Log string `mapstructure:"log" cobraflag:"eve-log" resolvepath:""` + TelnetPort int `mapstructure:"telnet-port" cobraflag:"eve-telnet-port"` + Remote bool `mapstructure:"remote"` + RemoteAddr string `mapstructure:"remote-addr"` + ModelFile string `mapstructure:"devmodelfile" cobraflag:"devmodel-file"` + Cert string `mapstructure:"cert" resolvepath:""` + DeviceCert string `mapstructure:"device-cert" resolvepath:""` + Name string `mapstructure:"name"` + RemoteLogLevel string `mapstructure:"remote-log-level"` + LogLevel string `mapstructure:"log-level"` + Disks int `mapstructure:"disks"` + BootstrapFile string `mapstructure:"bootstrap-file" cobraflag:"eve-bootstrap-file"` + UsbNetConfFile string `mapstructure:"usbnetconf-file" cobraflag:"eve-usbnetconf-file"` + TPM bool `mapstructure:"tpm" cobraflag:"tpm"` + GrubOptions []string `mapstructure:"grub-options" cobraflag:"grub-options"` } type RegistryConfig struct { diff --git a/pkg/openevec/defaults.go b/pkg/openevec/defaults.go index 4cd1dc735..e0ee902f6 100644 --- a/pkg/openevec/defaults.go +++ b/pkg/openevec/defaults.go @@ -1,9 +1,12 @@ package openevec import ( + "bytes" "fmt" "net" + "os/exec" "path/filepath" + "regexp" "runtime" "strconv" "strings" @@ -14,10 +17,20 @@ import ( uuid "github.com/satori/go.uuid" ) -func GetDefaultConfig(projectRootPath string) (*EdenSetupArgs, error) { +type ConfigOption func(*EdenSetupArgsBuilder) + +// Builder to propagate error +type EdenSetupArgsBuilder struct { + Args *EdenSetupArgs + Err []error +} + +func GetDefaultConfig(projectRootPath string) *EdenSetupArgsBuilder { + res := &EdenSetupArgsBuilder{nil, make([]error, 0)} ipv4, ipv6, err := utils.GetIPForDockerAccess() if err != nil { - return nil, err + res.Err = append(res.Err, err) + return res } var ip string if ipv4 != nil { @@ -28,12 +41,14 @@ func GetDefaultConfig(projectRootPath string) (*EdenSetupArgs, error) { edenDir, err := utils.DefaultEdenDir() if err != nil { - return nil, err + res.Err = append(res.Err, err) + return res } id, err := uuid.NewV4() if err != nil { - return nil, err + res.Err = append(res.Err, err) + return res } imageDist := filepath.Join(projectRootPath, defaults.DefaultDist, fmt.Sprintf("%s-%s", defaults.DefaultContext, defaults.DefaultImageDist)) @@ -215,7 +230,116 @@ func GetDefaultConfig(projectRootPath string) (*EdenSetupArgs, error) { EdenDir: edenDir, } - return defaultEdenConfig, nil + res.Args = defaultEdenConfig + + return res +} + +func hasVirtSupport() (bool, error) { + cmd := exec.Command("lscpu") + var out bytes.Buffer + cmd.Stdout = &out + err := cmd.Run() + if err != nil { + return false, fmt.Errorf("Failed to run lscpu: %v", err) + } + return strings.Contains(out.String(), "vmx") || strings.Contains(out.String(), "svm"), nil +} + +// Enabling Acclelerator requires you to specify firmware +func WithAccelerator(enabled bool, firmware []string) ConfigOption { + return func(builder *EdenSetupArgsBuilder) { + if enabled { + virtSupport, err := hasVirtSupport() + if err != nil { + builder.Err = append(builder.Err, err) + } else if !virtSupport { + builder.Err = append(builder.Err, fmt.Errorf("Missing required HW-assisted virtualization support")) + } + builder.Args.Eve.Accel = true + } else { + builder.Args.Eve.Accel = false + if len(firmware) > 0 { + builder.Args.Eve.QemuFirmware = firmware + } + } + } +} + +// parseEveImage parses an EVE image reference into registry and cleaned tag. +// It strips all trailing suffixes after a "-rcX" or "master-" pattern. +func ParseDockerImage(image string) (eveRegistry, eveTag string) { + if image == "" || !strings.Contains(image, ":") { + fmt.Printf("Skipping setting up eve image %s\n", image) + return "", "" + } + + fmt.Printf("Setting up eve image %s\n", image) + + parts := strings.SplitN(image, ":", 2) + eveRegistry = parts[0] + tag := parts[1] + + // Patterns + reRC := regexp.MustCompile(`^.*-rc[0-9]+`) + reMasterSha := regexp.MustCompile(`^.*-master-[0-9a-fA-F]+`) + + switch { + case reRC.MatchString(tag): + // Keep everything up to and including the -rcN + tag = reRC.FindString(tag) + case reMasterSha.MatchString(tag): + // Keep everything up to and including master- + tag = reMasterSha.FindString(tag) + default: + // No rc or master-sha pattern; leave tag unchanged + } + + eveTag = tag + return eveRegistry, eveTag +} + +func WithEVEImage(image string) ConfigOption { + return func(builder *EdenSetupArgsBuilder) { + registry, tag := ParseDockerImage(image) + builder.Args.Eve.Registry = registry + builder.Args.Eve.Tag = tag + } +} + +func WithLogLevel(level string) ConfigOption { + return func(builder *EdenSetupArgsBuilder) { + if level == "" { + builder.Args.Eve.LogLevel = defaults.DefaultEveLogLevel + } else { + builder.Args.Eve.LogLevel = level + } + } +} + +func WithFilesystem(fs string) ConfigOption { + return func(builder *EdenSetupArgsBuilder) { + switch fs { + case "zfs": + builder.Args.Eve.Disks = 4 + builder.Args.Eve.ImageSizeMB = 4096 + builder.Args.Eve.GrubOptions = []string{ + "set_global dom0_extra_args \"$dom0_extra_args eve_install_zfs_with_raid_level \"", + } + default: + // assuming ext4, no need to setup anything extra + } + } +} + +func WithHypervisor(hv string) ConfigOption { + return func(builder *EdenSetupArgsBuilder) { + if hv == "" { + builder.Args.Eve.HV = defaults.DefaultEVEHV + } else { + builder.Args.Eve.HV = hv + } + } } func GetDefaultPodConfig() *PodConfig { diff --git a/pkg/openevec/eden.go b/pkg/openevec/eden.go index 419a9128c..c9b2912b1 100644 --- a/pkg/openevec/eden.go +++ b/pkg/openevec/eden.go @@ -34,7 +34,7 @@ import ( "golang.org/x/term" ) -func (openEVEC *OpenEVEC) SetupEden(configName, configDir, softSerial, zedControlURL, ipxeOverride string, grubOptions []string, netboot, installer bool) error { +func (openEVEC *OpenEVEC) SetupEden(configName, configDir, softSerial, zedControlURL, ipxeOverride string, netboot, installer bool) error { cfg := *openEVEC.cfg @@ -53,7 +53,7 @@ func (openEVEC *OpenEVEC) SetupEden(configName, configDir, softSerial, zedContro } if cfg.Eve.CustomInstaller.Path == "" { - if err := setupConfigDir(cfg, configDir, softSerial, zedControlURL, grubOptions); err != nil { + if err := setupConfigDir(cfg, configDir, softSerial, zedControlURL, cfg.Eve.GrubOptions); err != nil { return fmt.Errorf("cannot setup ConfigDir: %w", err) } } diff --git a/tests/kubevirt/kubevirt_test.go b/tests/kubevirt/kubevirt_test.go index ec2bb96e8..5e377b793 100644 --- a/tests/kubevirt/kubevirt_test.go +++ b/tests/kubevirt/kubevirt_test.go @@ -1,16 +1,15 @@ package kubevirt_test import ( + "flag" "os" "path/filepath" "strings" "testing" "time" - "github.com/lf-edge/eden/pkg/defaults" tk "github.com/lf-edge/eden/pkg/evetestkit" "github.com/lf-edge/eden/pkg/openevec" - "github.com/lf-edge/eden/pkg/utils" log "github.com/sirupsen/logrus" ) @@ -19,8 +18,17 @@ const k3sNodeReadyStatusCmd = "eve exec kube /usr/bin/kubectl get node -o jsonpa const hvTypeKubevirt = "kubevirt" var eveNode *tk.EveNode +var ( + // Global flags - parsed once across all test packages + fileSystem = flag.String("filesystem", "ext4", "File system type (ext4, zfs)") + eveImage = flag.String("eve-image", "", "Path to EVE OS image") + eveLogLevel = flag.String("eve-log-level", "info", "EVE log level (debug, info, warn, error)") + requireVirt = flag.Bool("require-virt", false, "Require HW-assisted virtualization support") +) func TestMain(m *testing.M) { + flag.Parse() + log.Println("Kubevirt Test Suite started") defer log.Println("Kubevirt Suite finished") @@ -30,32 +38,18 @@ func TestMain(m *testing.M) { } twoLevelsUp := filepath.Dir(filepath.Dir(currentPath)) - configPath := utils.GetConfig("default") - cfg, err := openevec.LoadConfig(configPath) - if err != nil { - log.Fatalf("Failed to get config %v\n", err) - } - - if cfg.Eve.HV != hvTypeKubevirt { - log.Fatalf("Incorrect eve.hv value %s, test only supports kubevirt", cfg.Eve.HV) - } - - evec := openevec.CreateOpenEVEC(cfg) - configDir := filepath.Join(twoLevelsUp, "eve-config-dir") - if err := evec.SetupEden("config", configDir, "", "", "", []string{}, false, false); err != nil { - log.Fatalf("Failed to setup Eden: %v", err) - } - if err := evec.StartEden(defaults.DefaultVBoxVMName, "", ""); err != nil { - log.Fatalf("Start eden failed: %s", err) - } - if err := evec.OnboardEve(cfg.Eve.CertsUUID); err != nil { - log.Fatalf("Eve onboard failed: %s", err) - } - - node, err := tk.InitializeTestFromConfig(projectName, cfg, tk.WithControllerVerbosity("debug")) + node, cleanup, err := tk.SetupTestSuite( + projectName, + twoLevelsUp, + openevec.WithAccelerator(*requireVirt, []string{}), + openevec.WithEVEImage(*eveImage), + openevec.WithFilesystem(*fileSystem), + openevec.WithHypervisor(hvTypeKubevirt), + ) if err != nil { - log.Fatalf("Failed to initialize test: %v", err) + log.Fatal(err) } + defer cleanup() eveNode = node res := m.Run() diff --git a/tests/sec/sec_test.go b/tests/sec/sec_test.go index 440ecea00..5193e161e 100644 --- a/tests/sec/sec_test.go +++ b/tests/sec/sec_test.go @@ -1,12 +1,12 @@ package sec_test import ( + "flag" "os" "path/filepath" "strings" "testing" - "github.com/lf-edge/eden/pkg/defaults" tk "github.com/lf-edge/eden/pkg/evetestkit" "github.com/lf-edge/eden/pkg/openevec" log "github.com/sirupsen/logrus" @@ -16,8 +16,17 @@ const projectName = "security-test" const appArmorStatus = "/sys/module/apparmor/parameters/enabled" var eveNode *tk.EveNode +var ( + // Global flags - parsed once across all test packages + fileSystem = flag.String("filesystem", "ext4", "File system type (ext4, zfs)") + eveImage = flag.String("eve-image", "", "Path to EVE OS image") + eveLogLevel = flag.String("eve-log-level", "info", "EVE log level (debug, info, warn, error)") + requireVirt = flag.Bool("require-virt", false, "Require HW-assisted virtualization support") +) func TestMain(m *testing.M) { + flag.Parse() + log.Println("Security Test Suite started") defer log.Println("Security Test Suite finished") @@ -27,31 +36,17 @@ func TestMain(m *testing.M) { } twoLevelsUp := filepath.Dir(filepath.Dir(currentPath)) - cfg, err := openevec.GetDefaultConfig(twoLevelsUp) + node, cleanup, err := tk.SetupTestSuite( + projectName, + twoLevelsUp, + openevec.WithAccelerator(*requireVirt, []string{}), + openevec.WithEVEImage(*eveImage), + openevec.WithFilesystem(*fileSystem), + ) if err != nil { - log.Fatalf("Failed to generate default config %v\n", err) - } - - if err = openevec.ConfigAdd(cfg, cfg.ConfigName, "", false); err != nil { log.Fatal(err) } - - evec := openevec.CreateOpenEVEC(cfg) - configDir := filepath.Join(twoLevelsUp, "eve-config-dir") - if err := evec.SetupEden("config", configDir, "", "", "", []string{}, false, false); err != nil { - log.Fatalf("Failed to setup Eden: %v", err) - } - if err := evec.StartEden(defaults.DefaultVBoxVMName, "", ""); err != nil { - log.Fatalf("Start eden failed: %s", err) - } - if err := evec.OnboardEve(cfg.Eve.CertsUUID); err != nil { - log.Fatalf("Eve onboard failed: %s", err) - } - - node, err := tk.InitializeTestFromConfig(projectName, cfg, tk.WithControllerVerbosity("debug")) - if err != nil { - log.Fatalf("Failed to initialize test: %v", err) - } + defer cleanup() eveNode = node res := m.Run()