diff --git a/vm.go b/vm.go index ea745c2..8d8f90c 100644 --- a/vm.go +++ b/vm.go @@ -457,6 +457,7 @@ func (ip IP) IsIPv6() bool { type NicConfiguration interface { Name() string IP() IP + IPV6() *IP } // BuildableNicConfiguration is a buildable version of NicConfiguration. @@ -464,18 +465,21 @@ type BuildableNicConfiguration interface { NicConfiguration WithName(name string) BuildableNicConfiguration WithIP(ip IP) BuildableNicConfiguration + WithIPV6(ip IP) BuildableNicConfiguration } type nicConfiguration struct { name string ip IP + ipv6 *IP } // NewNicConfiguration creates a new NicConfiguration from the specified parameters. -func NewNicConfiguration(name string, ip IP) NicConfiguration { +func NewNicConfiguration(name string, ip IP) BuildableNicConfiguration { return &nicConfiguration{ name: name, ip: ip, + ipv6: nil, } } @@ -487,6 +491,10 @@ func (i *nicConfiguration) IP() IP { return i.ip } +func (i *nicConfiguration) IPV6() *IP { + return i.ipv6 +} + func (i *nicConfiguration) WithName(name string) BuildableNicConfiguration { i.name = name return i @@ -497,6 +505,11 @@ func (i *nicConfiguration) WithIP(ip IP) BuildableNicConfiguration { return i } +func (i *nicConfiguration) WithIPV6(ip IP) BuildableNicConfiguration { + i.ipv6 = &ip + return i +} + // convertSDKInitialization converts the initialization of a VM. We keep the error return in case we need it later // as errors may happen as we extend this function and we don't want to touch other functions. func convertSDKInitialization(sdkObject *ovirtsdk.Vm) (*initialization, error) { //nolint:unparam @@ -523,23 +536,33 @@ func convertSDKInitialization(sdkObject *ovirtsdk.Vm) (*initialization, error) { } func convertSDKNicConfiguration(sdkObject *ovirtsdk.NicConfiguration) NicConfiguration { - - ipv4, ok := sdkObject.Ip() - if ok { - return NewNicConfiguration(sdkObject.MustName(), IP{ + ipv4 := sdkObject.MustIp() + nicConfiguration := NewNicConfiguration( + sdkObject.MustName(), IP{ Address: ipv4.MustAddress(), Gateway: ipv4.MustGateway(), Netmask: ipv4.MustNetmask(), Version: IPVERSION_V4, - }) - } - ipv6 := sdkObject.MustIpv6() - return NewNicConfiguration(sdkObject.MustName(), IP{ - Address: ipv6.MustAddress(), - Gateway: ipv6.MustGateway(), - Netmask: ipv6.MustNetmask(), - Version: IPVERSION_V6, - }) + }, + ) + + ipv6, ok := sdkObject.Ipv6() + if ok { + // SdkObject can be like this: + // {ipv6{addres: nil, gateway: nil, netmask: nil, version: nil},} + address, _ := ipv6.Address() + gateway, _ := ipv6.Gateway() + netmask, _ := ipv6.Netmask() + nicConfiguration = nicConfiguration.WithIPV6( + IP{ + Address: address, + Gateway: gateway, + Netmask: netmask, + Version: IPVERSION_V6, + }, + ) + } + return nicConfiguration } // VM is the implementation of the virtual machine in oVirt. diff --git a/vm_create.go b/vm_create.go index d1a39c6..877ab3d 100644 --- a/vm_create.go +++ b/vm_create.go @@ -79,21 +79,29 @@ func vmBuilderInitialization(params OptionalVMParameters, builder *ovirtsdk.VmBu initBuilder.HostName(init.HostName()) } if nicConf := init.NicConfiguration(); nicConf != nil { - ipBuilder := ovirtsdk.NewIpBuilder(). - Address(nicConf.IP().Address). - Gateway(nicConf.IP().Gateway). - Netmask(nicConf.IP().Netmask) - ipBuilder.Version(ovirtsdk.IPVERSION_V4) - if nicConf.IP().IsIPv6() { - ipBuilder.Version(ovirtsdk.IPVERSION_V6) - } nicBuilder := ovirtsdk.NewNicConfigurationBuilder() nicBuilder.BootProtocol(ovirtsdk.BOOTPROTOCOL_STATIC) nicBuilder.OnBoot(true) - nicBuilder.Ip(ipBuilder.MustBuild()) nicBuilder.Name(nicConf.Name()) + ipBuilder := ovirtsdk.NewIpBuilder(). + Address(nicConf.IP().Address). + Gateway(nicConf.IP().Gateway). + Netmask(nicConf.IP().Netmask). + Version(ovirtsdk.IPVERSION_V4) + nicBuilder.Ip(ipBuilder.MustBuild()) + + if nicConf.IPV6() != nil { + ipV6Builder := ovirtsdk.NewIpBuilder(). + Address(nicConf.IPV6().Address). + Gateway(nicConf.IPV6().Gateway). + Netmask(nicConf.IPV6().Netmask). + Version(ovirtsdk.IPVERSION_V6) + nicBuilder.Ipv6(ipV6Builder.MustBuild()) + + } + initBuilder.NicConfigurationsOfAny(nicBuilder.MustBuild()) } builder.InitializationBuilder(initBuilder) diff --git a/vm_test.go b/vm_test.go index d453b81..cdd946d 100644 --- a/vm_test.go +++ b/vm_test.go @@ -210,9 +210,107 @@ func TestVMCreationFromTemplateChangedCPUValues(t *testing.T) { } } -func TestVMCreationWithInit(t *testing.T) { +func assertNIC(t *testing.T, nic, shouldBe ovirtclient.NicConfiguration) { + if nic == nil { + t.Fatalf( + "got Unexpected output from the NicConfiguration (%s) init field ", + nic, + ) + } + + if nic.Name() != shouldBe.Name() { + t.Fatalf( + "got Unexpected output from the NicConfiguration.Name (%s) init field ", + nic.Name(), + ) + } + + if nic.IP().Address != shouldBe.IP().Address { + t.Fatalf( + "got Unexpected output from the NicConfiguration.IP.Address (%s) init field ", + nic.IP().Address, + ) + } + if nic.IP().Gateway != shouldBe.IP().Gateway { + t.Fatalf( + "got Unexpected output from the NicConfiguration.IP.Gateway (%s) init field ", + nic.IP().Gateway, + ) + } + if nic.IP().Netmask != shouldBe.IP().Netmask { + t.Fatalf( + "got Unexpected output from the NicConfiguration.IP.Netmask (%s) init field ", + nic.IP().Netmask, + ) + } + + if shouldBe.IPV6() != nil { + if nic.IPV6().Address != shouldBe.IPV6().Address { + t.Fatalf( + "got Unexpected output from the NicConfiguration.IPV6.Address (%s) init field ", + nic.IPV6().Address, + ) + } + if nic.IPV6().Gateway != shouldBe.IPV6().Gateway { + t.Fatalf( + "got Unexpected output from the NicConfiguration.IPV6.Gateway (%s) init field ", + nic.IPV6().Gateway, + ) + } + if nic.IPV6().Netmask != shouldBe.IPV6().Netmask { + t.Fatalf( + "got Unexpected output from the NicConfiguration.IPV6.Netmask (%s) init field ", + nic.IPV6().Netmask, + ) + } + + } +} + +func TestVMCreationWithInit(t *testing.T) { //nolint:funlen t.Parallel() helper := getHelper(t) + + testCases := []struct { + name string + customScript string + hostName string + nicConfiguration ovirtclient.NicConfiguration + }{ + { + "only custom script and hostname", + "script-test", + "test-vm", + nil, + }, + { + "with ipv4 nic configuration", + "script-test", + "test-vm", + ovirtclient.NewNicConfiguration("custom-nic", ovirtclient.IP{ + Version: ovirtclient.IPVERSION_V4, + Address: "192.168.178.15", + Gateway: "192.168.19.1", + Netmask: "255.255.255.0", + })}, + { + "with ipv6 nic configuration", + "script-test", + "test-vm", + ovirtclient.NewNicConfiguration("custom-nic", ovirtclient.IP{ + Version: ovirtclient.IPVERSION_V4, + Address: "192.168.178.15", + Gateway: "192.168.19.1", + Netmask: "255.255.255.0", + }).WithIPV6(ovirtclient.IP{ + Version: ovirtclient.IPVERSION_V6, + Address: "fe80::bfb6:1c6c:f541:1aa564", + Gateway: "fe80::", + Netmask: "64", + }), + }, + } + vm1 := assertCanCreateVM( t, helper, @@ -221,48 +319,38 @@ func TestVMCreationWithInit(t *testing.T) { ) tpl := assertCanCreateTemplate(t, helper, vm1) - init := ovirtclient.NewInitialization("script-test", "test-vm").WithNicConfiguration( - ovirtclient.NewNicConfiguration("custom-nic", ovirtclient.IP{ - Version: ovirtclient.IPVERSION_V4, - Address: "192.168.178.15", - Gateway: "192.168.19.1", - Netmask: "255.255.255.0", - }), - ) + for _, testCase := range testCases { + t.Run(testCase.name, func(t *testing.T) { + init := ovirtclient.NewInitialization(testCase.customScript, testCase.hostName) + if testCase.nicConfiguration != nil { + init = init.WithNicConfiguration(testCase.nicConfiguration) + } - vm2 := assertCanCreateVMFromTemplate( - t, - helper, - fmt.Sprintf("test-%s", helper.GenerateRandomID(5)), - tpl.ID(), - ovirtclient.CreateVMParams().MustWithInitialization(init), - ) + vm2 := assertCanCreateVMFromTemplate( + t, + helper, + fmt.Sprintf("test-%s", helper.GenerateRandomID(5)), + tpl.ID(), + ovirtclient.CreateVMParams().MustWithInitialization(init), + ) - if vm2.Initialization().CustomScript() != "script-test" { - t.Fatalf("got Unexpected output from the CustomScript (%s) init field ", vm2.Initialization().CustomScript()) - } + if vm2.Initialization().CustomScript() != testCase.customScript { + t.Fatalf("got Unexpected output from the CustomScript (%s) init field ", vm2.Initialization().CustomScript()) + } - if vm2.Initialization().HostName() != "test-vm" { - t.Fatalf("got Unexpected output from the HostName (%s) init field ", vm2.Initialization().HostName()) - } + if vm2.Initialization().HostName() != testCase.hostName { + t.Fatalf("got Unexpected output from the HostName (%s) init field ", vm2.Initialization().HostName()) + } - if vm2.Initialization().NicConfiguration() == nil { - t.Fatalf("got Unexpected output from the NicConfiguration (%s) init field ", vm2.Initialization().NicConfiguration()) - } + if testCase.nicConfiguration != nil { + nic := vm2.Initialization().NicConfiguration() + assertNIC(t, nic, testCase.nicConfiguration) + } - if vm2.Initialization().NicConfiguration().Name() != "custom-nic" { - t.Fatalf("got Unexpected output from the NicConfiguration.Name (%s) init field ", vm2.Initialization().NicConfiguration().Name()) + }, + ) } - if vm2.Initialization().NicConfiguration().IP().Address != "192.168.178.15" { - t.Fatalf("got Unexpected output from the NicConfiguration.IP.Address (%s) init field ", vm2.Initialization().NicConfiguration().IP().Address) - } - if vm2.Initialization().NicConfiguration().IP().Gateway != "192.168.19.1" { - t.Fatalf("got Unexpected output from the NicConfiguration.IP.Gateway (%s) init field ", vm2.Initialization().NicConfiguration().IP().Gateway) - } - if vm2.Initialization().NicConfiguration().IP().Netmask != "255.255.255.0" { - t.Fatalf("got Unexpected output from the NicConfiguration.IP.Netmask (%s) init field ", vm2.Initialization().NicConfiguration().IP().Netmask) - } } func TestVMCreationWithDescription(t *testing.T) {