1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178
|
package integration
import (
"context"
"fmt"
"log"
"reflect"
"strings"
"testing"
"github.com/google/go-cmp/cmp"
. "github.com/linode/linodego"
)
var testIPv6RangeCreateOptions = IPv6RangeCreateOptions{
PrefixLength: 64,
}
func TestIPv6Range_Instance_List(t *testing.T) {
client, ipRange, inst, err := setupIPv6RangeInstance(t, []ipv6RangeModifier{}, "fixtures/TestIPv6Range_Instance_List")
if err != nil {
t.Fatal(err)
}
filter := Filter{}
filter.AddField(Eq, "region", inst.Region)
filterStr, err := filter.MarshalJSON()
if err != nil {
log.Fatal(err)
}
result, err := client.ListIPv6Ranges(context.Background(), &ListOptions{Filter: string(filterStr)})
if err != nil {
t.Errorf("Error listing IPv6 Ranges, expected struct, got error %v", err)
}
for _, r := range result {
if r.RouteTarget == ipRange.RouteTarget && fmt.Sprintf("%s/%d", r.Range, r.Prefix) == ipRange.Range {
// Ensure GET returns the correct details
rangeView, err := client.GetIPv6Range(context.Background(), r.Range)
if err != nil {
t.Errorf("failed to get ipv6 range: %s", err)
}
rangeCommonFields := []IPv6Range{
{Range: r.Range, Prefix: r.Prefix, Region: r.Region},
{Range: rangeView.Range, Prefix: rangeView.Prefix, Region: rangeView.Region},
}
if !reflect.DeepEqual(rangeCommonFields[0], rangeCommonFields[1]) {
t.Errorf("ipv6 range view does not match result from list: %s", cmp.Diff(rangeCommonFields[0], rangeCommonFields[1]))
}
return
}
}
t.Errorf("failed to find ipv6 range with matching range")
}
func TestIPv6Range_Share(t *testing.T) {
client, ipRange, origInst, err := setupIPv6RangeInstance(t, []ipv6RangeModifier{}, "fixtures/TestIPv6Range_Share")
if err != nil {
t.Fatal(err)
}
inst, err := createInstance(t, client, true, func(client *Client, inst *InstanceCreateOptions) {
inst.Label = "go-ins-test-share6"
inst.Region = origInst.Region
})
if err != nil {
t.Fatal(err)
}
t.Cleanup(func() {
if err := client.DeleteInstance(context.Background(), inst.ID); err != nil {
if t != nil {
t.Errorf("Error deleting test Instance: %s", err)
}
}
})
// Share the ip with the new instance
err = client.ShareIPAddresses(context.Background(), IPAddressesShareOptions{
LinodeID: origInst.ID,
IPs: []string{
strings.TrimSuffix(ipRange.Range, "/64"),
},
})
if err != nil {
t.Fatal(err)
}
err = client.ShareIPAddresses(context.Background(), IPAddressesShareOptions{
LinodeID: inst.ID,
IPs: []string{
strings.TrimSuffix(ipRange.Range, "/64"),
},
})
if err != nil {
t.Fatal(err)
}
ips, err := client.GetInstanceIPAddresses(context.Background(), inst.ID)
if err != nil {
t.Fatal(err)
}
if len(ips.IPv6.Global) < 1 {
t.Fatal("invalid number of global ipv6 addresses")
}
if ips.IPv6.Global[0].Range != strings.TrimSuffix(ipRange.Range, "/64") {
t.Fatal("ipv6 address does not match")
}
}
type ipv6RangeModifier func(options *IPv6RangeCreateOptions)
func createIPv6Range(t *testing.T, client *Client, ipv6RangeModifiers ...ipv6RangeModifier) (*IPv6Range, error) {
t.Helper()
createOpts := testIPv6RangeCreateOptions
for _, modifier := range ipv6RangeModifiers {
modifier(&createOpts)
}
ipRange, err := client.CreateIPv6Range(context.Background(), createOpts)
if err != nil {
t.Errorf("failed to create ipv6 range: %s", err)
}
t.Cleanup(func() {
rangeSegments := strings.Split(ipRange.Range, "/")
if err := client.DeleteIPv6Range(context.Background(),
strings.Join(rangeSegments[:len(rangeSegments)-1], "/")); err != nil {
t.Errorf("failed to delete ipv6 range: %s", err)
}
})
return ipRange, nil
}
func setupIPv6RangeInstance(t *testing.T, ipv6RangeModifiers []ipv6RangeModifier, fixturesYaml string) (*Client, *IPv6Range, *Instance, error) {
t.Helper()
client, fixtureTeardown := createTestClient(t, fixturesYaml)
t.Cleanup(fixtureTeardown)
instance, err := createInstance(t, client, true, func(client *Client, inst *InstanceCreateOptions) {
inst.Label = "go-ins-test-range6"
// This should stay hard-coded until IPv6 sharing has a
// corresponding capability.
inst.Region = "eu-west"
})
if err != nil {
t.Fatal(err)
}
t.Cleanup(func() {
if err := client.DeleteInstance(context.Background(), instance.ID); err != nil {
if t != nil {
t.Errorf("Error deleting test Instance: %s", err)
}
}
})
ipv6RangeModifiers = append(ipv6RangeModifiers, func(options *IPv6RangeCreateOptions) {
options.LinodeID = instance.ID
})
ipRange, err := createIPv6Range(t, client, ipv6RangeModifiers...)
return client, ipRange, instance, err
}
|