mirror of
https://github.com/bpg/terraform-provider-proxmox.git
synced 2025-07-01 19:12:59 +00:00
fix: ip initialization issue for cloned containers
This commit is contained in:
parent
9e6fe3be8e
commit
0102fb1fe3
@ -1,3 +1,9 @@
|
|||||||
|
## v0.4.3
|
||||||
|
|
||||||
|
BUG FIXES:
|
||||||
|
|
||||||
|
* resource/virtual_environment_container: Fix IP initialization issue for cloned containers
|
||||||
|
|
||||||
## v0.4.2
|
## v0.4.2
|
||||||
|
|
||||||
BUG FIXES:
|
BUG FIXES:
|
||||||
|
@ -702,6 +702,35 @@ func resourceVirtualEnvironmentContainerCreateClone(d *schema.ResourceData, m in
|
|||||||
updateBody.Hostname = &initializationHostname
|
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{})
|
initializationUserAccount := initializationBlock[mkResourceVirtualEnvironmentContainerInitializationUserAccount].([]interface{})
|
||||||
|
|
||||||
if len(initializationUserAccount) > 0 {
|
if len(initializationUserAccount) > 0 {
|
||||||
@ -720,35 +749,6 @@ func resourceVirtualEnvironmentContainerCreateClone(d *schema.ResourceData, m in
|
|||||||
updateBody.Delete = append(updateBody.Delete, "ssh-public-keys")
|
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)
|
initializationUserAccountPassword := initializationUserAccountBlock[mkResourceVirtualEnvironmentContainerInitializationUserAccountPassword].(string)
|
||||||
|
|
||||||
if initializationUserAccountPassword != dvResourceVirtualEnvironmentContainerInitializationUserAccountPassword {
|
if initializationUserAccountPassword != dvResourceVirtualEnvironmentContainerInitializationUserAccountPassword {
|
||||||
@ -773,74 +773,80 @@ func resourceVirtualEnvironmentContainerCreateClone(d *schema.ResourceData, m in
|
|||||||
|
|
||||||
networkInterface := d.Get(mkResourceVirtualEnvironmentContainerNetworkInterface).([]interface{})
|
networkInterface := d.Get(mkResourceVirtualEnvironmentContainerNetworkInterface).([]interface{})
|
||||||
|
|
||||||
if len(networkInterface) > 0 {
|
if len(networkInterface) == 0 {
|
||||||
networkInterfaceArray := make(proxmox.VirtualEnvironmentContainerCustomNetworkInterfaceArray, len(networkInterface))
|
networkInterface, err = resourceVirtualEnvironmentContainerGetExistingNetworkInterface(veClient, nodeName, vmID)
|
||||||
|
|
||||||
for ni, nv := range networkInterface {
|
if err != nil {
|
||||||
networkInterfaceMap := nv.(map[string]interface{})
|
return err
|
||||||
networkInterfaceObject := proxmox.VirtualEnvironmentContainerCustomNetworkInterface{}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
bridge := networkInterfaceMap[mkResourceVirtualEnvironmentContainerNetworkInterfaceBridge].(string)
|
networkInterfaceArray := make(proxmox.VirtualEnvironmentContainerCustomNetworkInterfaceArray, len(networkInterface))
|
||||||
enabled := networkInterfaceMap[mkResourceVirtualEnvironmentContainerNetworkInterfaceEnabled].(bool)
|
|
||||||
macAddress := networkInterfaceMap[mkResourceVirtualEnvironmentContainerNetworkInterfaceMACAddress].(string)
|
|
||||||
name := networkInterfaceMap[mkResourceVirtualEnvironmentContainerNetworkInterfaceName].(string)
|
|
||||||
rateLimit := networkInterfaceMap[mkResourceVirtualEnvironmentContainerNetworkInterfaceRateLimit].(float64)
|
|
||||||
vlanID := networkInterfaceMap[mkResourceVirtualEnvironmentContainerNetworkInterfaceVLANID].(int)
|
|
||||||
|
|
||||||
if bridge != "" {
|
for ni, nv := range networkInterface {
|
||||||
networkInterfaceObject.Bridge = &bridge
|
networkInterfaceMap := nv.(map[string]interface{})
|
||||||
}
|
networkInterfaceObject := proxmox.VirtualEnvironmentContainerCustomNetworkInterface{}
|
||||||
|
|
||||||
networkInterfaceObject.Enabled = enabled
|
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 len(initializationIPConfigIPv4Address) > ni {
|
if bridge != "" {
|
||||||
if initializationIPConfigIPv4Address[ni] != "" {
|
networkInterfaceObject.Bridge = &bridge
|
||||||
networkInterfaceObject.IPv4Address = &initializationIPConfigIPv4Address[ni]
|
|
||||||
}
|
|
||||||
|
|
||||||
if initializationIPConfigIPv4Gateway[ni] != "" {
|
|
||||||
networkInterfaceObject.IPv4Gateway = &initializationIPConfigIPv4Gateway[ni]
|
|
||||||
}
|
|
||||||
|
|
||||||
if initializationIPConfigIPv6Address[ni] != "" {
|
|
||||||
networkInterfaceObject.IPv6Address = &initializationIPConfigIPv6Address[ni]
|
|
||||||
}
|
|
||||||
|
|
||||||
if initializationIPConfigIPv6Gateway[ni] != "" {
|
|
||||||
networkInterfaceObject.IPv6Gateway = &initializationIPConfigIPv6Gateway[ni]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if macAddress != "" {
|
|
||||||
networkInterfaceObject.MACAddress = &macAddress
|
|
||||||
}
|
|
||||||
|
|
||||||
networkInterfaceObject.Name = name
|
|
||||||
|
|
||||||
if rateLimit != 0 {
|
|
||||||
networkInterfaceObject.RateLimit = &rateLimit
|
|
||||||
}
|
|
||||||
|
|
||||||
if vlanID != 0 {
|
|
||||||
networkInterfaceObject.Tag = &vlanID
|
|
||||||
}
|
|
||||||
|
|
||||||
networkInterfaceArray[ni] = networkInterfaceObject
|
|
||||||
}
|
}
|
||||||
|
|
||||||
updateBody.NetworkInterfaces = networkInterfaceArray
|
networkInterfaceObject.Enabled = enabled
|
||||||
|
|
||||||
for i := 0; i < len(updateBody.NetworkInterfaces); i++ {
|
if len(initializationIPConfigIPv4Address) > ni {
|
||||||
if !updateBody.NetworkInterfaces[i].Enabled {
|
if initializationIPConfigIPv4Address[ni] != "" {
|
||||||
updateBody.Delete = append(updateBody.Delete, fmt.Sprintf("net%d", i))
|
networkInterfaceObject.IPv4Address = &initializationIPConfigIPv4Address[ni]
|
||||||
|
}
|
||||||
|
|
||||||
|
if initializationIPConfigIPv4Gateway[ni] != "" {
|
||||||
|
networkInterfaceObject.IPv4Gateway = &initializationIPConfigIPv4Gateway[ni]
|
||||||
|
}
|
||||||
|
|
||||||
|
if initializationIPConfigIPv6Address[ni] != "" {
|
||||||
|
networkInterfaceObject.IPv6Address = &initializationIPConfigIPv6Address[ni]
|
||||||
|
}
|
||||||
|
|
||||||
|
if initializationIPConfigIPv6Gateway[ni] != "" {
|
||||||
|
networkInterfaceObject.IPv6Gateway = &initializationIPConfigIPv6Gateway[ni]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for i := len(updateBody.NetworkInterfaces); i < maxResourceVirtualEnvironmentContainerNetworkInterfaces; i++ {
|
if macAddress != "" {
|
||||||
|
networkInterfaceObject.MACAddress = &macAddress
|
||||||
|
}
|
||||||
|
|
||||||
|
networkInterfaceObject.Name = name
|
||||||
|
|
||||||
|
if rateLimit != 0 {
|
||||||
|
networkInterfaceObject.RateLimit = &rateLimit
|
||||||
|
}
|
||||||
|
|
||||||
|
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))
|
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{})
|
operatingSystem := d.Get(mkResourceVirtualEnvironmentContainerOperatingSystem).([]interface{})
|
||||||
|
|
||||||
if len(operatingSystem) > 0 {
|
if len(operatingSystem) > 0 {
|
||||||
@ -1192,6 +1198,66 @@ func resourceVirtualEnvironmentContainerGetCPUArchitectureValidator() schema.Sch
|
|||||||
}, false)
|
}, 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 {
|
func resourceVirtualEnvironmentContainerGetOperatingSystemTypeValidator() schema.SchemaValidateFunc {
|
||||||
return validation.StringInSlice([]string{
|
return validation.StringInSlice([]string{
|
||||||
"alpine",
|
"alpine",
|
||||||
@ -1621,6 +1687,9 @@ func resourceVirtualEnvironmentContainerUpdate(d *schema.ResourceData, m interfa
|
|||||||
rebootRequired := false
|
rebootRequired := false
|
||||||
resource := resourceVirtualEnvironmentContainer()
|
resource := resourceVirtualEnvironmentContainer()
|
||||||
|
|
||||||
|
// Retrieve the clone argument as the update logic varies for clones.
|
||||||
|
clone := d.Get(mkResourceVirtualEnvironmentVMClone).([]interface{})
|
||||||
|
|
||||||
// Prepare the new primitive values.
|
// Prepare the new primitive values.
|
||||||
description := d.Get(mkResourceVirtualEnvironmentContainerDescription).(string)
|
description := d.Get(mkResourceVirtualEnvironmentContainerDescription).(string)
|
||||||
updateBody.Description = &description
|
updateBody.Description = &description
|
||||||
@ -1746,8 +1815,17 @@ func resourceVirtualEnvironmentContainerUpdate(d *schema.ResourceData, m interfa
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Prepare the new network interface configuration.
|
// 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))
|
networkInterfaceArray := make(proxmox.VirtualEnvironmentContainerCustomNetworkInterfaceArray, len(networkInterface))
|
||||||
|
|
||||||
for ni, nv := range networkInterface {
|
for ni, nv := range networkInterface {
|
||||||
|
Loading…
Reference in New Issue
Block a user