Skip to content

Commit

Permalink
feat(lb): add support for private network in lb resource (scaleway#917)
Browse files Browse the repository at this point in the history
* feat(lb-pn): add private network to lb

* feat(lb-pn): remote lb private network

* feat(lb-pn): add static_config test

* feat(lb-pn): update all lb cassettes

* feat(lb-pn): update all lb cassettes

* feat(lb-pn): set zone schema

* Update scaleway/resource_lb.go

Co-authored-by: Rémy Léone <remy.leone@gmail.com>

* feat(lb-pn): add wait private network state, update for private networks, test update

* feat(lb-pn): add wait private network state, update for private networks, test update

* feat(lb): update selector

* feat(lb-pn): remove trailing number

* feat(lb-pn): simplify static config check helper

Co-authored-by: Rémy Léone <remy.leone@gmail.com>
  • Loading branch information
Monitob and remyleone authored Nov 15, 2021
1 parent 86face9 commit 81cf050
Show file tree
Hide file tree
Showing 21 changed files with 7,840 additions and 5,395 deletions.
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ require (
github.com/hashicorp/go-cty v1.4.1-0.20200414143053-d3edf31b6320
github.com/hashicorp/go-retryablehttp v0.7.0
github.com/hashicorp/terraform-plugin-sdk/v2 v2.8.0
github.com/scaleway/scaleway-sdk-go v1.0.0-beta.7.0.20211005125957-db499d89a262
github.com/scaleway/scaleway-sdk-go v1.0.0-beta.7.0.20211109132617-29e472beb5cd
github.com/stretchr/testify v1.7.0
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1

Expand Down
4 changes: 2 additions & 2 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -284,8 +284,8 @@ github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZN
github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
github.com/scaleway/scaleway-sdk-go v1.0.0-beta.7.0.20211005125957-db499d89a262 h1:ioN4zmp/4AoCJ/BbuwmkpH+bnSSntgWMUN1PkQ46/nI=
github.com/scaleway/scaleway-sdk-go v1.0.0-beta.7.0.20211005125957-db499d89a262/go.mod h1:NnxccdAsg2lS0ng/kfLVLemUQR50FCM/cdZv2gqKDhw=
github.com/scaleway/scaleway-sdk-go v1.0.0-beta.7.0.20211109132617-29e472beb5cd h1:/jejlYKHj9/rSQbONniMDA2aZEDvGdDK0+1PFGT9b8Y=
github.com/scaleway/scaleway-sdk-go v1.0.0-beta.7.0.20211109132617-29e472beb5cd/go.mod h1:fCa7OJZ/9DRTnOKmxvT6pn+LPWUptQAmHF/SBJUGEcg=
github.com/sebdah/goldie v1.0.0/go.mod h1:jXP4hmWywNEwZzhMuv2ccnqTSFpuq8iyQhtQdkkZBH4=
github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo=
github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM=
Expand Down
115 changes: 115 additions & 0 deletions scaleway/helpers_lb.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package scaleway
import (
"context"
"fmt"
"reflect"
"strings"
"time"

Expand Down Expand Up @@ -83,6 +84,120 @@ func flattenLbACLAction(action *lb.ACLAction) interface{} {
}
}

func expandPrivateNetworks(data interface{}, lbID string) ([]*lb.ZonedAPIAttachPrivateNetworkRequest, error) {
if data == nil {
return nil, nil
}

var res []*lb.ZonedAPIAttachPrivateNetworkRequest
for _, pn := range data.([]interface{}) {
r := pn.(map[string]interface{})
zonePN, pnID, err := parseZonedID(r["private_network_id"].(string))
if err != nil {
return nil, err
}
pnRequest := &lb.ZonedAPIAttachPrivateNetworkRequest{
PrivateNetworkID: pnID,
Zone: zonePN,
LBID: lbID,
}

staticConfig := r["static_config"]
if len(staticConfig.([]interface{})) > 0 {
pnRequest.StaticConfig = expandLbPrivateNetworkStaticConfig(staticConfig)
} else {
pnRequest.DHCPConfig = expandLbPrivateNetworkDHCPConfig(r["dhcp_config"])
}

res = append(res, pnRequest)
}

return res, nil
}

func isPrivateNetworkEqual(A, B interface{}) bool {
// Find out the diff Private Network or not
if _, ok := A.(*lb.PrivateNetwork); ok {
if _, ok := B.(*lb.PrivateNetwork); ok {
if A.(*lb.PrivateNetwork).PrivateNetworkID == B.(*lb.PrivateNetwork).PrivateNetworkID {
// if both has dhcp config should not update
if A.(*lb.PrivateNetwork).DHCPConfig != nil && B.(*lb.PrivateNetwork).DHCPConfig != nil {
return true
}
// check static config
aConfig := A.(*lb.PrivateNetwork).StaticConfig
bConfig := B.(*lb.PrivateNetwork).StaticConfig
if aConfig != nil && bConfig != nil {
// check if static config is different
return reflect.DeepEqual(aConfig.IPAddress, bConfig.IPAddress)
}
}
}
}
return false
}

func newPrivateNetwork(raw map[string]interface{}) *lb.PrivateNetwork {
_, pnID, _ := parseZonedID(raw["private_network_id"].(string))

pn := &lb.PrivateNetwork{PrivateNetworkID: pnID}
staticConfig := raw["static_config"]
if len(staticConfig.([]interface{})) > 0 {
pn.StaticConfig = expandLbPrivateNetworkStaticConfig(staticConfig)
} else {
pn.DHCPConfig = expandLbPrivateNetworkDHCPConfig(raw["dhcp_config"])
}

return pn
}
func privateNetworksToDetach(pns []*lb.PrivateNetwork, updates interface{}) (map[string]bool, error) {
actions := make(map[string]bool, len(pns))
configs := make(map[string]*lb.PrivateNetwork, len(pns))
// set detached all as default
for _, pn := range pns {
actions[pn.PrivateNetworkID] = true
configs[pn.PrivateNetworkID] = pn
}
//check if private network still exist or is different
for _, pn := range updates.([]interface{}) {
r := pn.(map[string]interface{})
_, pnID, err := parseZonedID(r["private_network_id"].(string))
if err != nil {
return nil, err
}
if _, exist := actions[pnID]; exist {
// check if config are equal
actions[pnID] = !isPrivateNetworkEqual(configs[pnID], newPrivateNetwork(r))
}
}
return actions, nil
}

func flattenPrivateNetworkConfigs(resList *lb.ListLBPrivateNetworksResponse) interface{} {
if len(resList.PrivateNetwork) == 0 || resList == nil {
return nil
}

pnConfigs := resList.PrivateNetwork
pnI := []map[string]interface{}(nil)
var dhcpConfigExist bool
for _, pn := range pnConfigs {
if pn.DHCPConfig != nil {
dhcpConfigExist = true
}
pnZonedID := newZonedIDString(pn.LB.Zone, pn.PrivateNetworkID)
pnI = append(pnI, map[string]interface{}{
"private_network_id": pnZonedID,
"dhcp_config": dhcpConfigExist,
"status": pn.Status,
"zone": pn.LB.Zone,
"static_config": flattenLbPrivateNetworkStaticConfig(pn.StaticConfig),
})
}

return pnI
}

func expandLbACLAction(raw interface{}) *lb.ACLAction {
if raw == nil || len(raw.([]interface{})) != 1 {
return nil
Expand Down
53 changes: 53 additions & 0 deletions scaleway/helpers_lb_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
package scaleway

import (
"testing"

"github.com/scaleway/scaleway-sdk-go/api/lb/v1"
"github.com/stretchr/testify/assert"
)

func TestIsEqualPrivateNetwork(t *testing.T) {
tests := []struct {
name string
A *lb.PrivateNetwork
B *lb.PrivateNetwork
expected bool
}{
{
name: "isEqualDHCP",
A: &lb.PrivateNetwork{PrivateNetworkID: "6ba7b810-9dad-11d1-80b4-00c04fd430c8", DHCPConfig: &lb.PrivateNetworkDHCPConfig{}},
B: &lb.PrivateNetwork{PrivateNetworkID: "6ba7b810-9dad-11d1-80b4-00c04fd430c8", DHCPConfig: &lb.PrivateNetworkDHCPConfig{}},
expected: true,
},
{
name: "isEqualStatic",
A: &lb.PrivateNetwork{PrivateNetworkID: "6ba7b810-9dad-11d1-80b4-00c04fd430c8", StaticConfig: &lb.PrivateNetworkStaticConfig{IPAddress: []string{"172.16.0.100", "172.16.0.101"}}},
B: &lb.PrivateNetwork{PrivateNetworkID: "6ba7b810-9dad-11d1-80b4-00c04fd430c8", StaticConfig: &lb.PrivateNetworkStaticConfig{IPAddress: []string{"172.16.0.100", "172.16.0.101"}}},
expected: true,
},
{
name: "areNotEqualStatic",
A: &lb.PrivateNetwork{PrivateNetworkID: "6ba7b810-9dad-11d1-80b4-00c04fd430c8", StaticConfig: &lb.PrivateNetworkStaticConfig{IPAddress: []string{"172.16.0.100", "172.16.0.101"}}},
B: &lb.PrivateNetwork{PrivateNetworkID: "6ba7b810-9dad-11d1-80b4-00c04fd430c8", StaticConfig: &lb.PrivateNetworkStaticConfig{IPAddress: []string{"172.16.0.101", "172.16.0.101"}}},
expected: false,
},
{
name: "areNotEqualDHCPToStatic",
A: &lb.PrivateNetwork{PrivateNetworkID: "6ba7b810-9dad-11d1-80b4-00c04fd430c8", DHCPConfig: &lb.PrivateNetworkDHCPConfig{}},
B: &lb.PrivateNetwork{PrivateNetworkID: "6ba7b810-9dad-11d1-80b4-00c04fd430c8", StaticConfig: &lb.PrivateNetworkStaticConfig{IPAddress: []string{"172.16.0.101", "172.16.0.101"}}},
expected: false,
},
{
name: "areNotEqualDHCPToStatic",
A: &lb.PrivateNetwork{PrivateNetworkID: "6ba7b810-9dad-11d1-80b4-00c04fd430c8", StaticConfig: &lb.PrivateNetworkStaticConfig{IPAddress: []string{"172.16.0.101", "172.16.0.101"}}},
B: &lb.PrivateNetwork{PrivateNetworkID: "6ba7b810-9dad-11d1-80b4-00c04fd430c8", DHCPConfig: &lb.PrivateNetworkDHCPConfig{}},
expected: false,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
assert.Equal(t, tt.expected, isPrivateNetworkEqual(tt.A, tt.B))
})
}
}
1 change: 0 additions & 1 deletion scaleway/provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,6 @@ func Provider(config *ProviderConfig) plugin.ProviderFunc {
"scaleway_lb_backend": resourceScalewayLbBackend(),
"scaleway_lb_certificate": resourceScalewayLbCertificate(),
"scaleway_lb_frontend": resourceScalewayLbFrontend(),
"scaleway_lb_private_network": resourceScalewayLbPrivateNetwork(),
"scaleway_lb_route": resourceScalewayLbRoute(),
"scaleway_registry_namespace": resourceScalewayRegistryNamespace(),
"scaleway_rdb_acl": resourceScalewayRdbACL(),
Expand Down
Loading

0 comments on commit 81cf050

Please sign in to comment.