Skip to content

Commit

Permalink
241: Add ipv6 optional field to NicConfiguration
Browse files Browse the repository at this point in the history
  • Loading branch information
Kapustin Aleksandr committed Aug 6, 2023
1 parent 3981a70 commit 0d9bba5
Show file tree
Hide file tree
Showing 3 changed files with 178 additions and 59 deletions.
51 changes: 37 additions & 14 deletions vm.go
Original file line number Diff line number Diff line change
Expand Up @@ -457,25 +457,29 @@ func (ip IP) IsIPv6() bool {
type NicConfiguration interface {
Name() string
IP() IP
IPV6() *IP
}

// BuildableNicConfiguration is a buildable version of NicConfiguration.
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,
}
}

Expand All @@ -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
Expand All @@ -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
Expand All @@ -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.
Expand Down
26 changes: 17 additions & 9 deletions vm_create.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
160 changes: 124 additions & 36 deletions vm_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -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) {
Expand Down

0 comments on commit 0d9bba5

Please sign in to comment.