Skip to content

Commit

Permalink
Merge pull request #76 from danitso/release/v0.4.3
Browse files Browse the repository at this point in the history
Release/v0.4.3
  • Loading branch information
danitso-dp authored Feb 17, 2021
2 parents 9e6fe3b + c39464b commit 0ee3f79
Show file tree
Hide file tree
Showing 3 changed files with 160 additions and 77 deletions.
6 changes: 6 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
## v0.4.3

BUG FIXES:

* resource/virtual_environment_container: Fix IP initialization issue

## v0.4.2

BUG FIXES:
Expand Down
3 changes: 1 addition & 2 deletions docs/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,8 +32,7 @@ The Proxmox provider offers a flexible means of providing credentials for authen

### Static credentials

Warning: Hard-coding credentials into any Terraform configuration is not recommended, and risks secret leakage should this file ever be committed to a public version control system.
{: .label .label-red }
> Warning: Hard-coding credentials into any Terraform configuration is not recommended, and risks secret leakage should this file ever be committed to a public version control system.
Static credentials can be provided by adding a `username` and `password` in-line in the Proxmox provider block:

Expand Down
228 changes: 153 additions & 75 deletions proxmoxtf/resource_virtual_environment_container.go
Original file line number Diff line number Diff line change
Expand Up @@ -702,6 +702,35 @@ func resourceVirtualEnvironmentContainerCreateClone(d *schema.ResourceData, m in
updateBody.Hostname = &initializationHostname
}

initializationIPConfig := initializationBlock[mkResourceVirtualEnvironmentContainerInitializationIPConfig].([]interface{})

for _, c := range initializationIPConfig {
configBlock := c.(map[string]interface{})
ipv4 := configBlock[mkResourceVirtualEnvironmentContainerInitializationIPConfigIPv4].([]interface{})

if len(ipv4) > 0 {
ipv4Block := ipv4[0].(map[string]interface{})

initializationIPConfigIPv4Address = append(initializationIPConfigIPv4Address, ipv4Block[mkResourceVirtualEnvironmentContainerInitializationIPConfigIPv4Address].(string))
initializationIPConfigIPv4Gateway = append(initializationIPConfigIPv4Gateway, ipv4Block[mkResourceVirtualEnvironmentContainerInitializationIPConfigIPv4Gateway].(string))
} else {
initializationIPConfigIPv4Address = append(initializationIPConfigIPv4Address, "")
initializationIPConfigIPv4Gateway = append(initializationIPConfigIPv4Gateway, "")
}

ipv6 := configBlock[mkResourceVirtualEnvironmentContainerInitializationIPConfigIPv6].([]interface{})

if len(ipv6) > 0 {
ipv6Block := ipv6[0].(map[string]interface{})

initializationIPConfigIPv6Address = append(initializationIPConfigIPv6Address, ipv6Block[mkResourceVirtualEnvironmentContainerInitializationIPConfigIPv6Address].(string))
initializationIPConfigIPv6Gateway = append(initializationIPConfigIPv6Gateway, ipv6Block[mkResourceVirtualEnvironmentContainerInitializationIPConfigIPv6Gateway].(string))
} else {
initializationIPConfigIPv6Address = append(initializationIPConfigIPv6Address, "")
initializationIPConfigIPv6Gateway = append(initializationIPConfigIPv6Gateway, "")
}
}

initializationUserAccount := initializationBlock[mkResourceVirtualEnvironmentContainerInitializationUserAccount].([]interface{})

if len(initializationUserAccount) > 0 {
Expand All @@ -720,35 +749,6 @@ func resourceVirtualEnvironmentContainerCreateClone(d *schema.ResourceData, m in
updateBody.Delete = append(updateBody.Delete, "ssh-public-keys")
}

initializationIPConfig := initializationBlock[mkResourceVirtualEnvironmentContainerInitializationIPConfig].([]interface{})

for _, c := range initializationIPConfig {
configBlock := c.(map[string]interface{})
ipv4 := configBlock[mkResourceVirtualEnvironmentContainerInitializationIPConfigIPv4].([]interface{})

if len(ipv4) > 0 {
ipv4Block := ipv4[0].(map[string]interface{})

initializationIPConfigIPv4Address = append(initializationIPConfigIPv4Address, ipv4Block[mkResourceVirtualEnvironmentContainerInitializationIPConfigIPv4Address].(string))
initializationIPConfigIPv4Gateway = append(initializationIPConfigIPv4Gateway, ipv4Block[mkResourceVirtualEnvironmentContainerInitializationIPConfigIPv4Gateway].(string))
} else {
initializationIPConfigIPv4Address = append(initializationIPConfigIPv4Address, "")
initializationIPConfigIPv4Gateway = append(initializationIPConfigIPv4Gateway, "")
}

ipv6 := configBlock[mkResourceVirtualEnvironmentContainerInitializationIPConfigIPv6].([]interface{})

if len(ipv6) > 0 {
ipv6Block := ipv6[0].(map[string]interface{})

initializationIPConfigIPv6Address = append(initializationIPConfigIPv6Address, ipv6Block[mkResourceVirtualEnvironmentContainerInitializationIPConfigIPv6Address].(string))
initializationIPConfigIPv6Gateway = append(initializationIPConfigIPv6Gateway, ipv6Block[mkResourceVirtualEnvironmentContainerInitializationIPConfigIPv6Gateway].(string))
} else {
initializationIPConfigIPv6Address = append(initializationIPConfigIPv6Address, "")
initializationIPConfigIPv6Gateway = append(initializationIPConfigIPv6Gateway, "")
}
}

initializationUserAccountPassword := initializationUserAccountBlock[mkResourceVirtualEnvironmentContainerInitializationUserAccountPassword].(string)

if initializationUserAccountPassword != dvResourceVirtualEnvironmentContainerInitializationUserAccountPassword {
Expand All @@ -773,74 +773,80 @@ func resourceVirtualEnvironmentContainerCreateClone(d *schema.ResourceData, m in

networkInterface := d.Get(mkResourceVirtualEnvironmentContainerNetworkInterface).([]interface{})

if len(networkInterface) > 0 {
networkInterfaceArray := make(proxmox.VirtualEnvironmentContainerCustomNetworkInterfaceArray, len(networkInterface))

for ni, nv := range networkInterface {
networkInterfaceMap := nv.(map[string]interface{})
networkInterfaceObject := proxmox.VirtualEnvironmentContainerCustomNetworkInterface{}
if len(networkInterface) == 0 {
networkInterface, err = resourceVirtualEnvironmentContainerGetExistingNetworkInterface(veClient, nodeName, vmID)

bridge := networkInterfaceMap[mkResourceVirtualEnvironmentContainerNetworkInterfaceBridge].(string)
enabled := networkInterfaceMap[mkResourceVirtualEnvironmentContainerNetworkInterfaceEnabled].(bool)
macAddress := networkInterfaceMap[mkResourceVirtualEnvironmentContainerNetworkInterfaceMACAddress].(string)
name := networkInterfaceMap[mkResourceVirtualEnvironmentContainerNetworkInterfaceName].(string)
rateLimit := networkInterfaceMap[mkResourceVirtualEnvironmentContainerNetworkInterfaceRateLimit].(float64)
vlanID := networkInterfaceMap[mkResourceVirtualEnvironmentContainerNetworkInterfaceVLANID].(int)
if err != nil {
return err
}
}

if bridge != "" {
networkInterfaceObject.Bridge = &bridge
}
networkInterfaceArray := make(proxmox.VirtualEnvironmentContainerCustomNetworkInterfaceArray, len(networkInterface))

networkInterfaceObject.Enabled = enabled
for ni, nv := range networkInterface {
networkInterfaceMap := nv.(map[string]interface{})
networkInterfaceObject := proxmox.VirtualEnvironmentContainerCustomNetworkInterface{}

if len(initializationIPConfigIPv4Address) > ni {
if initializationIPConfigIPv4Address[ni] != "" {
networkInterfaceObject.IPv4Address = &initializationIPConfigIPv4Address[ni]
}
bridge := networkInterfaceMap[mkResourceVirtualEnvironmentContainerNetworkInterfaceBridge].(string)
enabled := networkInterfaceMap[mkResourceVirtualEnvironmentContainerNetworkInterfaceEnabled].(bool)
macAddress := networkInterfaceMap[mkResourceVirtualEnvironmentContainerNetworkInterfaceMACAddress].(string)
name := networkInterfaceMap[mkResourceVirtualEnvironmentContainerNetworkInterfaceName].(string)
rateLimit := networkInterfaceMap[mkResourceVirtualEnvironmentContainerNetworkInterfaceRateLimit].(float64)
vlanID := networkInterfaceMap[mkResourceVirtualEnvironmentContainerNetworkInterfaceVLANID].(int)

if initializationIPConfigIPv4Gateway[ni] != "" {
networkInterfaceObject.IPv4Gateway = &initializationIPConfigIPv4Gateway[ni]
}
if bridge != "" {
networkInterfaceObject.Bridge = &bridge
}

if initializationIPConfigIPv6Address[ni] != "" {
networkInterfaceObject.IPv6Address = &initializationIPConfigIPv6Address[ni]
}
networkInterfaceObject.Enabled = enabled

if initializationIPConfigIPv6Gateway[ni] != "" {
networkInterfaceObject.IPv6Gateway = &initializationIPConfigIPv6Gateway[ni]
}
if len(initializationIPConfigIPv4Address) > ni {
if initializationIPConfigIPv4Address[ni] != "" {
networkInterfaceObject.IPv4Address = &initializationIPConfigIPv4Address[ni]
}

if macAddress != "" {
networkInterfaceObject.MACAddress = &macAddress
if initializationIPConfigIPv4Gateway[ni] != "" {
networkInterfaceObject.IPv4Gateway = &initializationIPConfigIPv4Gateway[ni]
}

networkInterfaceObject.Name = name

if rateLimit != 0 {
networkInterfaceObject.RateLimit = &rateLimit
if initializationIPConfigIPv6Address[ni] != "" {
networkInterfaceObject.IPv6Address = &initializationIPConfigIPv6Address[ni]
}

if vlanID != 0 {
networkInterfaceObject.Tag = &vlanID
if initializationIPConfigIPv6Gateway[ni] != "" {
networkInterfaceObject.IPv6Gateway = &initializationIPConfigIPv6Gateway[ni]
}
}

networkInterfaceArray[ni] = networkInterfaceObject
if macAddress != "" {
networkInterfaceObject.MACAddress = &macAddress
}

updateBody.NetworkInterfaces = networkInterfaceArray
networkInterfaceObject.Name = name

for i := 0; i < len(updateBody.NetworkInterfaces); i++ {
if !updateBody.NetworkInterfaces[i].Enabled {
updateBody.Delete = append(updateBody.Delete, fmt.Sprintf("net%d", i))
}
if rateLimit != 0 {
networkInterfaceObject.RateLimit = &rateLimit
}

for i := len(updateBody.NetworkInterfaces); i < maxResourceVirtualEnvironmentContainerNetworkInterfaces; i++ {
if vlanID != 0 {
networkInterfaceObject.Tag = &vlanID
}

networkInterfaceArray[ni] = networkInterfaceObject
}

updateBody.NetworkInterfaces = networkInterfaceArray

for i := 0; i < len(updateBody.NetworkInterfaces); i++ {
if !updateBody.NetworkInterfaces[i].Enabled {
updateBody.Delete = append(updateBody.Delete, fmt.Sprintf("net%d", i))
}
}

for i := len(updateBody.NetworkInterfaces); i < maxResourceVirtualEnvironmentContainerNetworkInterfaces; i++ {
updateBody.Delete = append(updateBody.Delete, fmt.Sprintf("net%d", i))
}

operatingSystem := d.Get(mkResourceVirtualEnvironmentContainerOperatingSystem).([]interface{})

if len(operatingSystem) > 0 {
Expand Down Expand Up @@ -1192,6 +1198,66 @@ func resourceVirtualEnvironmentContainerGetCPUArchitectureValidator() schema.Sch
}, false)
}

func resourceVirtualEnvironmentContainerGetExistingNetworkInterface(client *proxmox.VirtualEnvironmentClient, nodeName string, vmID int) ([]interface{}, error) {
containerInfo, err := client.GetContainer(nodeName, vmID)

if err != nil {
return []interface{}{}, err
}

networkInterfaces := []interface{}{}
networkInterfaceArray := []*proxmox.VirtualEnvironmentContainerCustomNetworkInterface{
containerInfo.NetworkInterface0,
containerInfo.NetworkInterface1,
containerInfo.NetworkInterface2,
containerInfo.NetworkInterface3,
containerInfo.NetworkInterface4,
containerInfo.NetworkInterface5,
containerInfo.NetworkInterface6,
containerInfo.NetworkInterface7,
}

for _, nv := range networkInterfaceArray {
if nv == nil {
continue
}

networkInterface := map[string]interface{}{}

if nv.Bridge != nil {
networkInterface[mkResourceVirtualEnvironmentContainerNetworkInterfaceBridge] = *nv.Bridge
} else {
networkInterface[mkResourceVirtualEnvironmentContainerNetworkInterfaceBridge] = ""
}

networkInterface[mkResourceVirtualEnvironmentContainerNetworkInterfaceEnabled] = true

if nv.MACAddress != nil {
networkInterface[mkResourceVirtualEnvironmentContainerNetworkInterfaceMACAddress] = *nv.MACAddress
} else {
networkInterface[mkResourceVirtualEnvironmentContainerNetworkInterfaceMACAddress] = ""
}

networkInterface[mkResourceVirtualEnvironmentContainerNetworkInterfaceName] = nv.Name

if nv.RateLimit != nil {
networkInterface[mkResourceVirtualEnvironmentContainerNetworkInterfaceRateLimit] = *nv.RateLimit
} else {
networkInterface[mkResourceVirtualEnvironmentContainerNetworkInterfaceRateLimit] = float64(0)
}

if nv.Tag != nil {
networkInterface[mkResourceVirtualEnvironmentContainerNetworkInterfaceVLANID] = *nv.Tag
} else {
networkInterface[mkResourceVirtualEnvironmentContainerNetworkInterfaceVLANID] = 0
}

networkInterfaces = append(networkInterfaces, networkInterface)
}

return networkInterfaces, nil
}

func resourceVirtualEnvironmentContainerGetOperatingSystemTypeValidator() schema.SchemaValidateFunc {
return validation.StringInSlice([]string{
"alpine",
Expand Down Expand Up @@ -1621,6 +1687,9 @@ func resourceVirtualEnvironmentContainerUpdate(d *schema.ResourceData, m interfa
rebootRequired := false
resource := resourceVirtualEnvironmentContainer()

// Retrieve the clone argument as the update logic varies for clones.
clone := d.Get(mkResourceVirtualEnvironmentVMClone).([]interface{})

// Prepare the new primitive values.
description := d.Get(mkResourceVirtualEnvironmentContainerDescription).(string)
updateBody.Description = &description
Expand Down Expand Up @@ -1746,8 +1815,17 @@ func resourceVirtualEnvironmentContainerUpdate(d *schema.ResourceData, m interfa
}

// Prepare the new network interface configuration.
if d.HasChange(mkResourceVirtualEnvironmentContainerNetworkInterface) {
networkInterface := d.Get(mkResourceVirtualEnvironmentContainerNetworkInterface).([]interface{})
networkInterface := d.Get(mkResourceVirtualEnvironmentContainerNetworkInterface).([]interface{})

if len(networkInterface) == 0 && len(clone) > 0 {
networkInterface, err = resourceVirtualEnvironmentContainerGetExistingNetworkInterface(veClient, nodeName, vmID)

if err != nil {
return err
}
}

if d.HasChange(mkResourceVirtualEnvironmentContainerInitialization) || d.HasChange(mkResourceVirtualEnvironmentContainerNetworkInterface) {
networkInterfaceArray := make(proxmox.VirtualEnvironmentContainerCustomNetworkInterfaceArray, len(networkInterface))

for ni, nv := range networkInterface {
Expand Down

0 comments on commit 0ee3f79

Please sign in to comment.