From 31b9fd86cb993cd9a1fab3664d298a28d51f1e09 Mon Sep 17 00:00:00 2001 From: Jacob Riddle Date: Thu, 7 Jul 2022 16:57:43 +0000 Subject: [PATCH 1/3] adding support for VLANs (#192) updating tests to auto-generate instances updating linodego to v1.8.1 to make use of new features --- go.mod | 6 +- go.sum | 24 ++-- provider/linode/linode_discover.go | 41 +++---- provider/linode/linode_discover_test.go | 143 +++++++++++++++++++++++- 4 files changed, 176 insertions(+), 38 deletions(-) diff --git a/go.mod b/go.mod index 510efa99..781012cf 100644 --- a/go.mod +++ b/go.mod @@ -10,7 +10,6 @@ require ( github.com/aws/aws-sdk-go v1.25.41 github.com/denverdino/aliyungo v0.0.0-20170926055100-d3308649c661 github.com/digitalocean/godo v1.7.5 - github.com/dnaeon/go-vcr v1.0.1 // indirect github.com/google/go-querystring v0.0.0-20170111101155-53e6ce116135 // indirect github.com/googleapis/gnostic v0.2.0 // indirect github.com/gophercloud/gophercloud v0.1.0 @@ -20,7 +19,7 @@ require ( github.com/imdario/mergo v0.3.6 // indirect github.com/jarcoal/httpmock v0.0.0-20180424175123-9c70cfe4a1da // indirect github.com/joyent/triton-go v0.0.0-20180628001255-830d2b111e62 - github.com/linode/linodego v0.7.1 + github.com/linode/linodego v1.8.1 github.com/mitchellh/go-homedir v1.1.0 github.com/nicolai86/scaleway-sdk v1.10.2-0.20180628010248-798f60e20bb2 github.com/packethost/packngo v0.1.1-0.20180711074735-b9cb5096f54c @@ -29,14 +28,13 @@ require ( github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 // indirect github.com/sirupsen/logrus v1.0.6 // indirect github.com/softlayer/softlayer-go v0.0.0-20180806151055-260589d94c7d - github.com/stretchr/testify v1.4.0 + github.com/stretchr/testify v1.7.1 github.com/tencentcloud/tencentcloud-sdk-go v1.0.162 github.com/vmware/govmomi v0.18.0 golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45 google.golang.org/api v0.4.0 gopkg.in/airbrake/gobrake.v2 v2.0.9 // indirect gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2 // indirect - gopkg.in/resty.v1 v1.12.0 // indirect k8s.io/api v0.18.2 k8s.io/apimachinery v0.18.2 k8s.io/client-go v0.18.2 diff --git a/go.sum b/go.sum index 5e516ced..18ea8673 100644 --- a/go.sum +++ b/go.sum @@ -56,8 +56,6 @@ github.com/digitalocean/godo v1.7.5 h1:JOQbAO6QT1GGjor0doT0mXefX2FgUDPOpYh2RaXA+ github.com/digitalocean/godo v1.7.5/go.mod h1:h6faOIcZ8lWIwNQ+DN7b3CgX4Kwby5T+nbpNqkUIozU= github.com/dimchansky/utfbom v1.1.0 h1:FcM3g+nofKgUteL8dm/UpdRXNC9KmADgTpLKsu0TRo4= github.com/dimchansky/utfbom v1.1.0/go.mod h1:rO41eb7gLfo8SF1jd9F8HplJm1Fewwi4mQvIirEdv+8= -github.com/dnaeon/go-vcr v1.0.1 h1:r8L/HqC0Hje5AXMu1ooW8oyQyOFv4GxqpL0nRP7SLLY= -github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E= github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= @@ -72,6 +70,8 @@ github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+ github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9/go.mod h1:W3Z9FmVs9qj+KR4zFKmDPGiLdk1D9Rlm7cyMvf57TTg= github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501/go.mod h1:J8+jY1nAiCcj+friV/PDoE1/3eeccG9LYBs0tYvLOWc= github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87/go.mod h1:DXUve3Dpr1UfpPtxFw+EFuQ41HhCWZfha5jSVRG7C7I= +github.com/go-resty/resty/v2 v2.1.1-0.20191201195748-d7b97669fe48 h1:JVrqSeQfdhYRFk24TvhTZWU0q8lfCojxZQFi3Ou7+uY= +github.com/go-resty/resty/v2 v2.1.1-0.20191201195748-d7b97669fe48/go.mod h1:dZGr0i9PLlaaTD4H/hoZIDjQ+r6xq8mgbRzHZf7f2J8= github.com/gogo/protobuf v1.3.1 h1:DqDEcV5aeaTmdFBePNpYsp3FlcVH/2ISVVM9Qf8PSls= github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58= @@ -86,8 +86,9 @@ github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5y github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/go-cmp v0.3.0 h1:crn/baboCvb5fXaQ0IJ1SGTsTVrWpDsCWC8EGETZijY= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.5.7 h1:81/ik6ipDQS2aGcBfIN5dHDB36BwrStyeAQquSYCV4o= +github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= github.com/google/go-querystring v0.0.0-20170111101155-53e6ce116135 h1:zLTLjkaOFEFIOxY5BWLFLwh+cL8vOBW4XJ2aqLE/Tf0= github.com/google/go-querystring v0.0.0-20170111101155-53e6ce116135/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -137,8 +138,8 @@ github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORN github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/linode/linodego v0.7.1 h1:4WZmMpSA2NRwlPZcc0+4Gyn7rr99Evk9bnr0B3gXRKE= -github.com/linode/linodego v0.7.1/go.mod h1:ga11n3ivecUrPCHN0rANxKmfWBJVkOXfLMZinAbj2sY= +github.com/linode/linodego v1.8.1 h1:BcS5lT4KQobPSytzteNWPs+a1UltThHpF2YBG6HOgxI= +github.com/linode/linodego v1.8.1/go.mod h1:h6AuFR/JpqwwM/vkj7s8KV3iGN8/jxn+zc437F8SZ8w= github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/miekg/dns v1.0.14 h1:9jZdLNd/P4+SfEJ0TNyxYpsK8N4GtfylBLqtbYN1sbA= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= @@ -182,8 +183,9 @@ github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.7.1 h1:5TQK59W5E3v0r2duFAb7P95B6hEeOyEnHRa8MjYSMTY= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/tencentcloud/tencentcloud-sdk-go v1.0.162 h1:8fDzz4GuVg4skjY2B0nMN7h6uN61EDVkuLyI2+qGHhI= github.com/tencentcloud/tencentcloud-sdk-go v1.0.162/go.mod h1:asUz5BPXxgoPGaRgZaVm1iGcUAuHyYUo1nXqKa83cvI= github.com/vmware/govmomi v0.18.0 h1:f7QxSmP7meCtoAmiKZogvVbLInT+CZx6Px6K5rYsJZo= @@ -206,11 +208,11 @@ golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73r golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191004110552-13f9640d40b9 h1:rjwSpXsdiK0dV8/Naq3kAw9ymfAeJIyd0upUIElB+lI= golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -245,6 +247,8 @@ golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGm golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/api v0.4.0 h1:KKgc1aqhV8wDPbDzlDtpvyjZFY3vjz85FP7p4wcQUyI= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= @@ -268,14 +272,16 @@ gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2 h1:OAj3g0cR6Dx/R07QgQe8wkA9RNj gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= -gopkg.in/resty.v1 v1.12.0 h1:CuXP0Pjfw9rOuY6EP+UvtNvt5DSqHpIxILZKT/quCZI= -gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= +gopkg.in/ini.v1 v1.66.6 h1:LATuAqN/shcYAOkv3wl2L4rkaKqkcgTBQjOyYDvcPKI= +gopkg.in/ini.v1 v1.66.6/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= k8s.io/api v0.18.2 h1:wG5g5ZmSVgm5B+eHMIbI9EGATS2L8Z72rda19RIEgY8= diff --git a/provider/linode/linode_discover.go b/provider/linode/linode_discover.go index 7322dab3..47f3a2f6 100644 --- a/provider/linode/linode_discover.go +++ b/provider/linode/linode_discover.go @@ -3,7 +3,6 @@ package linode import ( "context" - "encoding/json" "fmt" "io/ioutil" "log" @@ -14,11 +13,6 @@ import ( "golang.org/x/oauth2" ) -type Filter struct { - Region string `json:"region,omitempty"` - Tag string `json:"tags,omitempty"` -} - type Provider struct { userAgent string } @@ -33,6 +27,7 @@ func (p *Provider) Help() string { api_token: The Linode API token to use region: The Linode region to filter on tag_name: The tag name to filter on + vlan_label: The label of a attached VLAN address_type: "private_v4", "public_v4", "private_v6" or "public_v6". (default: "private_v4") Variables can also be provided by environment variables: @@ -49,41 +44,47 @@ func (p *Provider) Addrs(args map[string]string, l *log.Logger) ([]string, error l = log.New(ioutil.Discard, "", 0) } - addressType := args["address_type"] region := args["region"] tagName := args["tag_name"] + vlanLabel := args["vlan_label"] + addressType := args["address_type"] apiToken := argsOrEnv(args, "api_token", "LINODE_TOKEN") - l.Printf("[DEBUG] discover-linode: Using address_type=%s region=%s tag_name=%s", addressType, region, tagName) + l.Printf("[DEBUG] discover-linode: Using region=%s tag_name=%s vlan_label=%s address_type=%s", region, tagName, vlanLabel, addressType) client := getLinodeClient(p.userAgent, apiToken) - filters := Filter{ - Region: "", - Tag: "", - } - + filters := linodego.Filter{} if region != "" { - filters.Region = region + filters.AddField(linodego.Eq, "region", region) } if tagName != "" { - filters.Tag = tagName + filters.AddField(linodego.Eq, "tags", tagName) + } + jsonFilters, err := filters.MarshalJSON() + if err != nil { + return nil, fmt.Errorf("discover-linode: Cannont convert fields to a JSON Filter: %s", err) } - - jsonFilters, _ := json.Marshal(filters) filterOpt := linodego.ListOptions{Filter: string(jsonFilters)} - linodes, err := client.ListInstances(context.Background(), &filterOpt) + ctx := context.Background() + linodes, err := client.ListInstances(ctx, &filterOpt) if err != nil { return nil, fmt.Errorf("discover-linode: Fetching Linode instances failed: %s", err) } var addrs []string for _, linode := range linodes { - addr, err := client.GetInstanceIPAddresses(context.Background(), linode.ID) + addr, err := client.GetInstanceIPAddresses(ctx, linode.ID) if err != nil { return nil, fmt.Errorf("discover-linode: Fetching Linode IP address for instance %v failed: %s", linode.ID, err) } - + if vlanLabel != "" { + vlanIPAM, err := client.GetVLANIPAMAddress(ctx, linode.ID, vlanLabel) + if err != nil { + return nil, err + } + addrs = append(addrs, vlanIPAM) + } switch addressType { case "public_v4": if len(addr.IPv4.Public) == 0 { diff --git a/provider/linode/linode_discover_test.go b/provider/linode/linode_discover_test.go index fafa01fa..c305b246 100644 --- a/provider/linode/linode_discover_test.go +++ b/provider/linode/linode_discover_test.go @@ -1,18 +1,33 @@ package linode_test import ( + "context" "log" + "net/http" "os" "testing" discover "github.com/hashicorp/go-discover" "github.com/hashicorp/go-discover/provider/linode" + "github.com/linode/linodego" + "golang.org/x/oauth2" ) var _ discover.Provider = (*linode.Provider)(nil) var _ discover.ProviderWithUserAgent = (*linode.Provider)(nil) func TestAddrsTaggedDefault(t *testing.T) { + opts := linodego.InstanceCreateOptions{} + opts.Label = "go-discover-test-default" + opts.Tags = []string{"gd-tag1"} + opts.Region = "us-southeast" + opts.PrivateIP = true + + _, destroy, err := buildInstance(t, opts) + if err != nil { + t.Fatal(err) + } + defer destroy() args := discover.Config{ "provider": "linode", "api_token": os.Getenv("LINODE_TOKEN"), @@ -32,12 +47,23 @@ func TestAddrsTaggedDefault(t *testing.T) { t.Fatal(err) } - if len(addrs) != 2 { + if len(addrs) != 1 { t.Fatalf("bad: %v", addrs) } } func TestAddrsTaggedPublicV6(t *testing.T) { + opts := linodego.InstanceCreateOptions{} + opts.Label = "go-discover-test-public-v6" + opts.Tags = []string{"gd-tag1"} + opts.Region = "us-southeast" + + _, destroy, err := buildInstance(t, opts) + if err != nil { + t.Fatal(err) + } + defer destroy() + args := discover.Config{ "provider": "linode", "api_token": os.Getenv("LINODE_TOKEN"), @@ -58,12 +84,23 @@ func TestAddrsTaggedPublicV6(t *testing.T) { t.Fatal(err) } - if len(addrs) != 2 { + if len(addrs) != 1 { t.Fatalf("bad: %v", addrs) } } func TestAddrsTaggedPublicV4(t *testing.T) { + opts := linodego.InstanceCreateOptions{} + opts.Label = "go-discover-test-public-v4" + opts.Tags = []string{"gd-tag1"} + opts.Region = "us-southeast" + + _, destroy, err := buildInstance(t, opts) + if err != nil { + t.Fatal(err) + } + defer destroy() + args := discover.Config{ "provider": "linode", "api_token": os.Getenv("LINODE_TOKEN"), @@ -84,17 +121,29 @@ func TestAddrsTaggedPublicV4(t *testing.T) { t.Fatal(err) } - if len(addrs) != 2 { + if len(addrs) != 1 { t.Fatalf("bad: %v", addrs) } } func TestAddrsTaggedRegion(t *testing.T) { + opts := linodego.InstanceCreateOptions{} + opts.Label = "go-discover-test-tagged-region" + opts.Tags = []string{"gd-tag1"} + opts.Region = "us-southeast" + opts.PrivateIP = true + + _, destroy, err := buildInstance(t, opts) + if err != nil { + t.Fatal(err) + } + defer destroy() + args := discover.Config{ + "region": "us-southeast", "provider": "linode", - "api_token": os.Getenv("LINODE_TOKEN"), "tag_name": "gd-tag1", - "region": "us-east", + "api_token": os.Getenv("LINODE_TOKEN"), } if args["api_token"] == "" { @@ -114,3 +163,87 @@ func TestAddrsTaggedRegion(t *testing.T) { t.Fatalf("bad: %v", addrs) } } + +func TestAddrsTaggedVLAN(t *testing.T) { + opts := linodego.InstanceCreateOptions{} + opts.Interfaces = []linodego.InstanceConfigInterface{ + { + Label: "go-discover-test-vlan", + Purpose: linodego.InterfacePurposeVLAN, + IPAMAddress: "10.0.0.1/24", + }, + } + opts.Label = "go-discover-test-vlan" + opts.Tags = []string{"gd-tag1"} + opts.Region = "us-southeast" + opts.Image = "linode/alpine3.16" + opts.RootPass = "supercoolpasspleasedontsteal" + + _, destroy, err := buildInstance(t, opts) + if err != nil { + t.Fatal(err) + } + defer destroy() + + args := discover.Config{ + "region": "us-southeast", + "provider": "linode", + "tag_name": "gd-tag1", + "vlan_label": "go-discover-test-vlan", + "api_token": os.Getenv("LINODE_TOKEN"), + } + + if args["api_token"] == "" { + t.Skip("Linode credentials missing") + } + + p := &linode.Provider{} + + l := log.New(os.Stderr, "", log.LstdFlags) + addrs, err := p.Addrs(args, l) + + if err != nil { + t.Fatal(err) + } + + if len(addrs) != 1 { + t.Fatalf("bad: %v", addrs) + } +} + +func buildInstance(t *testing.T, opts linodego.InstanceCreateOptions) (*linodego.Instance, func(), error) { + t.Helper() + client := getLinodeClient(t) + + falseBoot := true + opts.Type = "g6-nanode-1" + opts.Booted = &falseBoot + instance, err := client.CreateInstance(context.Background(), opts) + if err != nil { + return nil, nil, err + } + + teardown := func() { + if terr := client.DeleteInstance(context.Background(), instance.ID); terr != nil { + t.Errorf("Error deleting test Instance: %s", terr) + } + } + + return instance, teardown, nil +} + +func getLinodeClient(t *testing.T) *linodego.Client { + t.Helper() + apiToken := os.Getenv("LINODE_API_TOKEN") + if apiToken == "" { + t.Fatal("failed to get $LINODE_API_TOKEN") + } + tokenSource := oauth2.StaticTokenSource(&oauth2.Token{AccessToken: apiToken}) + oauth2Client := &http.Client{ + Transport: &oauth2.Transport{ + Source: tokenSource, + }, + } + client := linodego.NewClient(oauth2Client) + return &client +} From 23c9dcf36df49dcababf9ec195399576465558a0 Mon Sep 17 00:00:00 2001 From: Jacob Riddle Date: Fri, 8 Jul 2022 16:20:12 +0000 Subject: [PATCH 2/3] using standardized token --- provider/linode/linode_discover_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/provider/linode/linode_discover_test.go b/provider/linode/linode_discover_test.go index c305b246..1e4a9aef 100644 --- a/provider/linode/linode_discover_test.go +++ b/provider/linode/linode_discover_test.go @@ -234,9 +234,9 @@ func buildInstance(t *testing.T, opts linodego.InstanceCreateOptions) (*linodego func getLinodeClient(t *testing.T) *linodego.Client { t.Helper() - apiToken := os.Getenv("LINODE_API_TOKEN") + apiToken := os.Getenv("LINODE_TOKEN") if apiToken == "" { - t.Fatal("failed to get $LINODE_API_TOKEN") + t.Fatal("failed to get $LINODE_TOKEN") } tokenSource := oauth2.StaticTokenSource(&oauth2.Token{AccessToken: apiToken}) oauth2Client := &http.Client{ From d87df40c45e2e91cd53d25b2fa68431ea32c890a Mon Sep 17 00:00:00 2001 From: Jacob Riddle Date: Mon, 9 Jan 2023 16:48:28 +0000 Subject: [PATCH 3/3] update go mod --- go.mod | 2 +- go.sum | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/go.mod b/go.mod index ca66097f..919487bb 100644 --- a/go.mod +++ b/go.mod @@ -28,7 +28,7 @@ require ( github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 // indirect github.com/sirupsen/logrus v1.0.6 // indirect github.com/softlayer/softlayer-go v0.0.0-20180806151055-260589d94c7d - github.com/stretchr/testify v1.4.0 + github.com/stretchr/testify v1.7.1 github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.480 github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm v1.0.480 github.com/vmware/govmomi v0.18.0 diff --git a/go.sum b/go.sum index 0f952656..3bb6bbc4 100644 --- a/go.sum +++ b/go.sum @@ -184,6 +184,8 @@ github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.7.1 h1:5TQK59W5E3v0r2duFAb7P95B6hEeOyEnHRa8MjYSMTY= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.480 h1:Dwnfdrk3KXpYRH9Kwrk9sHpZSOmrE7P9LBoNsYUJKR4= github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.480/go.mod h1:7sCQWVkxcsR38nffDW057DRGk8mUjK1Ing/EFOK8s8Y= github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm v1.0.480 h1:YEDZmv2ABU8QvwXEVTOQgVEQzDOByhz73vdjL6sERkE=