0
0
mirror of https://github.com/bpg/terraform-provider-proxmox.git synced 2025-06-30 18:42:58 +00:00

fix: ip initialization issue for cloned containers

This commit is contained in:
Dan Petersen 2021-02-14 03:43:12 +01:00
parent 9e6fe3be8e
commit 0102fb1fe3
2 changed files with 168 additions and 84 deletions

View File

@ -1,3 +1,9 @@
## v0.4.3
BUG FIXES:
* resource/virtual_environment_container: Fix IP initialization issue for cloned containers
## v0.4.2
BUG FIXES:

View File

@ -702,24 +702,6 @@ func resourceVirtualEnvironmentContainerCreateClone(d *schema.ResourceData, m in
updateBody.Hostname = &initializationHostname
}
initializationUserAccount := initializationBlock[mkResourceVirtualEnvironmentContainerInitializationUserAccount].([]interface{})
if len(initializationUserAccount) > 0 {
initializationUserAccountBlock := initializationUserAccount[0].(map[string]interface{})
keys := initializationUserAccountBlock[mkResourceVirtualEnvironmentContainerInitializationUserAccountKeys].([]interface{})
if len(keys) > 0 {
initializationUserAccountKeys := make(proxmox.VirtualEnvironmentContainerCustomSSHKeys, len(keys))
for ki, kv := range keys {
initializationUserAccountKeys[ki] = kv.(string)
}
updateBody.SSHKeys = &initializationUserAccountKeys
} else {
updateBody.Delete = append(updateBody.Delete, "ssh-public-keys")
}
initializationIPConfig := initializationBlock[mkResourceVirtualEnvironmentContainerInitializationIPConfig].([]interface{})
for _, c := range initializationIPConfig {
@ -749,6 +731,24 @@ func resourceVirtualEnvironmentContainerCreateClone(d *schema.ResourceData, m in
}
}
initializationUserAccount := initializationBlock[mkResourceVirtualEnvironmentContainerInitializationUserAccount].([]interface{})
if len(initializationUserAccount) > 0 {
initializationUserAccountBlock := initializationUserAccount[0].(map[string]interface{})
keys := initializationUserAccountBlock[mkResourceVirtualEnvironmentContainerInitializationUserAccountKeys].([]interface{})
if len(keys) > 0 {
initializationUserAccountKeys := make(proxmox.VirtualEnvironmentContainerCustomSSHKeys, len(keys))
for ki, kv := range keys {
initializationUserAccountKeys[ki] = kv.(string)
}
updateBody.SSHKeys = &initializationUserAccountKeys
} else {
updateBody.Delete = append(updateBody.Delete, "ssh-public-keys")
}
initializationUserAccountPassword := initializationUserAccountBlock[mkResourceVirtualEnvironmentContainerInitializationUserAccountPassword].(string)
if initializationUserAccountPassword != dvResourceVirtualEnvironmentContainerInitializationUserAccountPassword {
@ -773,7 +773,14 @@ func resourceVirtualEnvironmentContainerCreateClone(d *schema.ResourceData, m in
networkInterface := d.Get(mkResourceVirtualEnvironmentContainerNetworkInterface).([]interface{})
if len(networkInterface) > 0 {
if len(networkInterface) == 0 {
networkInterface, err = resourceVirtualEnvironmentContainerGetExistingNetworkInterface(veClient, nodeName, vmID)
if err != nil {
return err
}
}
networkInterfaceArray := make(proxmox.VirtualEnvironmentContainerCustomNetworkInterfaceArray, len(networkInterface))
for ni, nv := range networkInterface {
@ -839,7 +846,6 @@ func resourceVirtualEnvironmentContainerCreateClone(d *schema.ResourceData, m in
for i := len(updateBody.NetworkInterfaces); i < maxResourceVirtualEnvironmentContainerNetworkInterfaces; i++ {
updateBody.Delete = append(updateBody.Delete, fmt.Sprintf("net%d", i))
}
}
operatingSystem := d.Get(mkResourceVirtualEnvironmentContainerOperatingSystem).([]interface{})
@ -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",
@ -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
@ -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{})
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 {